Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Generate terms and build permitted params for valkyrie ResourceBatchEditForm dynamically. #6289

Merged
merged 3 commits into from
Sep 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 49 additions & 21 deletions app/forms/hyrax/forms/resource_batch_edit_form.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ class ResourceBatchEditForm < Hyrax::Forms::ResourceForm
self.required_fields = []
self.model_class = Hyrax.primary_work_type

# Terms that need to exclude from batch edit
class_attribute :terms_excluded
self.terms_excluded = [:abstract, :label, :source]

# Contains a list of titles of all the works in the batch
attr_accessor :names

Expand All @@ -17,38 +21,39 @@ def initialize(model, _current_ability, batch_document_ids)
@names = []
@batch_document_ids = batch_document_ids
if @batch_document_ids.present?
super(model.class.new(initialize_combined_fields))
combined_fields = model_attributes(model, initialize_combined_fields)
super(model.class.new(combined_fields))
else
super(model)
end
end

def terms
[:creator, :contributor, :description,
:keyword, :resource_type, :license, :publisher, :date_created,
:subject, :language, :identifier, :based_near,
:related_url]
self.class.terms
end

def self.terms
return Hyrax::Forms::BatchEditForm.terms if model_class < ActiveFedora::Base

terms_primary = definitions.select { |_, definition| definition[:primary] }
.keys.map(&:to_sym)
terms_secondary = definitions.select { |_, definition| definition[:display] && !definition[:primary] }
.keys.map(&:to_sym)

(terms_primary + terms_secondary) - terms_excluded
end

attr_reader :batch_document_ids

# Returns a list of parameters we accept from the form
# rubocop:disable Metrics/MethodLength
def self.build_permitted_params
[{ creator: [] },
{ contributor: [] },
{ description: [] },
{ keyword: [] },
{ resource_type: [] },
{ license: [] },
{ publisher: [] },
{ date_created: [] },
{ subject: [] },
{ language: [] },
{ identifier: [] },
{ based_near: [] },
{ related_url: [] },
{ permissions_attributes: [:type, :name, :access, :id, :_destroy] },
terms_permitted_params + additional_permitted_params
end

# Returns a list of parameters other than those terms for the form
# rubocop:disable Metrics/MethodLength
def self.additional_permitted_params
[{ permissions_attributes: [:type, :name, :access, :id, :_destroy] },
:on_behalf_of,
:version,
:add_works_to_collection,
Expand All @@ -63,6 +68,19 @@ def self.build_permitted_params
end
# rubocop:enable Metrics/MethodLength

# Returns a list of permitted parameters for the terms
# @param terms Array[Symbol]
# @return Array[Hash]
def self.terms_permitted_params
[].tap do |params|
terms.each do |term|
h = {}
h[term] = []
params << h
end
end
end

# @param name [Symbol]
# @return [Symbol]
# @note Added for ActiveModel compatibility.
Expand All @@ -80,11 +98,21 @@ def initialize_combined_fields
work = Hyrax.query_service.find_by(id: doc_id)
terms.each do |field|
combined_attributes[field] ||= []
combined_attributes[field] = (combined_attributes[field] + work[field].to_a).uniq
combined_attributes[field] = (combined_attributes[field] + Array.wrap(work[field])).uniq
end
names << work.to_s
end
end

# Model attributes for ActiveFedora compatibility
def model_attributes(model, attrs)
return attrs unless model.is_a? ActiveFedora::Base

attrs.keys.each do |k|
attrs[k] = Array.wrap(attrs[k]).first unless model.class.properties[k.to_s]&.multiple?
end
attrs
end
end
end
end
74 changes: 37 additions & 37 deletions spec/forms/hyrax/forms/resource_batch_edit_form_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,18 +43,18 @@

it do
is_expected.to include(:creator,
:contributor,
:description,
:keyword,
:resource_type,
:license,
:publisher,
:date_created,
:subject,
:language,
:identifier,
:based_near,
:related_url)
:contributor,
:description,
:keyword,
:resource_type,
:license,
:publisher,
:date_created,
:subject,
:language,
:identifier,
:based_near,
:related_url)
end
end

Expand All @@ -79,31 +79,31 @@
subject { described_class.build_permitted_params }

it do
is_expected.to eq [{ creator: [] },
{ contributor: [] },
{ description: [] },
{ keyword: [] },
{ resource_type: [] },
{ license: [] },
{ publisher: [] },
{ date_created: [] },
{ subject: [] },
{ language: [] },
{ identifier: [] },
{ based_near: [] },
{ related_url: [] },
{ permissions_attributes: [:type, :name, :access, :id, :_destroy] },
:on_behalf_of,
:version,
:add_works_to_collection,
:visibility_during_embargo,
:embargo_release_date,
:visibility_after_embargo,
:visibility_during_lease,
:lease_expiration_date,
:visibility_after_lease,
:visibility,
{ based_near_attributes: [:id, :_destroy] }]
is_expected.to include({ creator: [] },
{ contributor: [] },
{ description: [] },
{ keyword: [] },
{ resource_type: [] },
{ license: [] },
{ publisher: [] },
{ date_created: [] },
{ subject: [] },
{ language: [] },
{ identifier: [] },
{ based_near: [] },
{ related_url: [] },
{ permissions_attributes: [:type, :name, :access, :id, :_destroy] },
:on_behalf_of,
:version,
:add_works_to_collection,
:visibility_during_embargo,
:embargo_release_date,
:visibility_after_embargo,
:visibility_during_lease,
:lease_expiration_date,
:visibility_after_lease,
:visibility,
{ based_near_attributes: [:id, :_destroy] })
end
end
end