Skip to content

Commit

Permalink
Generate terms and build permitted params for valkyrie ResourceBatchE…
Browse files Browse the repository at this point in the history
…ditForm dynamically. (#6289)

* Use dynamic terms for ResourceBatchEditForm.

* Build permitted params dynamically from the configured terms.

* Exclude terms from valkyrie batch edit.
  • Loading branch information
lsitu authored Sep 5, 2023
1 parent 7c2543d commit 3d5942a
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 58 deletions.
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

0 comments on commit 3d5942a

Please sign in to comment.