diff --git a/app/assets/javascripts/hyrax/file_manager/sorting.es6 b/app/assets/javascripts/hyrax/file_manager/sorting.es6 index 55d8251c4d..19eae36fe3 100644 --- a/app/assets/javascripts/hyrax/file_manager/sorting.es6 +++ b/app/assets/javascripts/hyrax/file_manager/sorting.es6 @@ -4,6 +4,7 @@ export default class SortManager { this.sorting_info = {} this.initialize_sort() this.element.data("current-order", this.order) + this.sort_property = this.element.data("sort-property") this.save_manager = save_manager this.initialize_alpha_sort_button() } @@ -38,9 +39,9 @@ export default class SortManager { params() { let params = {} params[this.singular_class_name] = { - "version": this.version, - "ordered_member_ids": this.order + "version": this.version } + params[this.singular_class_name][this.sort_property] = this.order params["_method"] = "PATCH" return params } diff --git a/app/controllers/concerns/hyrax/works_controller_behavior.rb b/app/controllers/concerns/hyrax/works_controller_behavior.rb index 1b4b7b6b23..631e44501a 100644 --- a/app/controllers/concerns/hyrax/works_controller_behavior.rb +++ b/app/controllers/concerns/hyrax/works_controller_behavior.rb @@ -125,7 +125,7 @@ def destroy end def file_manager - @form = Forms::FileManagerForm.new(curation_concern, current_ability) + @form = presenter end def inspect_work diff --git a/app/forms/hyrax/forms/file_manager_form.rb b/app/forms/hyrax/forms/file_manager_form.rb deleted file mode 100644 index ef1fd33118..0000000000 --- a/app/forms/hyrax/forms/file_manager_form.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true -module Hyrax - module Forms - class FileManagerForm - include HydraEditor::Form - self.terms = [] - delegate :id, :thumbnail_id, :representative_id, :to_s, to: :model - attr_reader :current_ability, :request - - ## - # @param work [Object] a work with members - # @param ability [::Ability] the current ability - # @param member_factory [Class] the member_presenter factory object to use - # when constructing presenters - def initialize(work, ability, member_factory: MemberPresenterFactory) - super(work) - @current_ability = ability - @request = nil - @member_factory = member_factory - end - - def version - model.etag - end - - delegate :member_presenters, to: :member_presenter_factory - - private - - def member_presenter_factory - @member_factory.new(model, current_ability) - end - end - end -end diff --git a/app/presenters/hyrax/work_show_presenter.rb b/app/presenters/hyrax/work_show_presenter.rb index 8486859f10..3475bc63ac 100644 --- a/app/presenters/hyrax/work_show_presenter.rb +++ b/app/presenters/hyrax/work_show_presenter.rb @@ -252,6 +252,11 @@ def valid_child_concerns Hyrax::ChildTypes.for(parent: solr_document.hydra_model).to_a end + # @return [Boolean] + def valkyrie_presenter? + solr_document.hydra_model < Valkyrie::Resource + end + private # list of item ids to display is based on ordered_ids @@ -298,7 +303,7 @@ def presenter_factory_arguments def member_presenter_factory @member_presenter_factory ||= - if solr_document.hydra_model < Valkyrie::Resource + if valkyrie_presenter? PcdmMemberPresenterFactory.new(solr_document, current_ability) else self.class diff --git a/app/views/hyrax/base/_file_manager_members.html.erb b/app/views/hyrax/base/_file_manager_members.html.erb index 804c0f2b9d..43459f0f15 100644 --- a/app/views/hyrax/base/_file_manager_members.html.erb +++ b/app/views/hyrax/base/_file_manager_members.html.erb @@ -2,10 +2,10 @@ id: "sortable", class: "list-unstyled grid d-flex flex-wrap clearfix", data: { - id: @form.id, + id: @form.id.to_s, "class-name" => @form.model_name.plural, "singular-class-name" => @form.model_name.singular, - version: @form.version + "sort_property" => @form.valkyrie_presenter? ? "member_ids" : "ordered_member_ids" } do %> <% @form.member_presenters.each do |member| %> <%= render "file_manager_member", node: member %> diff --git a/app/views/hyrax/base/file_manager.html.erb b/app/views/hyrax/base/file_manager.html.erb index fe6b15af8a..64858709db 100644 --- a/app/views/hyrax/base/file_manager.html.erb +++ b/app/views/hyrax/base/file_manager.html.erb @@ -5,7 +5,7 @@ -<% if !@form.member_presenters.empty? %> +<% if !@form.member_presenters.blank? %>

<%= t('.toolbar') %>

diff --git a/app/views/hyrax/base/show.json.jbuilder b/app/views/hyrax/base/show.json.jbuilder index 04301e3a2d..1cd461209a 100644 --- a/app/views/hyrax/base/show.json.jbuilder +++ b/app/views/hyrax/base/show.json.jbuilder @@ -1,6 +1,6 @@ # frozen_string_literal: true -@curation_concern = Wings::ActiveFedoraConverter.convert(resource: @curation_concern) if - @curation_concern.is_a? Hyrax::Resource +@curation_concern = ::Wings::ActiveFedoraConverter.convert(resource: @curation_concern) if + @curation_concern.is_a?(Hyrax::Resource) && Object.const_defined?("Wings") json.extract! @curation_concern, *[:id] + @curation_concern.class.fields.reject { |f| [:has_model].include? f } json.version @curation_concern.try(:etag) diff --git a/spec/features/file_manager_spec.rb b/spec/features/file_manager_spec.rb new file mode 100644 index 0000000000..a001a1e3ee --- /dev/null +++ b/spec/features/file_manager_spec.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true +RSpec.describe "file manager" do + let(:user) { FactoryBot.create(:admin) } + let!(:work) do + FactoryBot.valkyrie_create(:monograph, :with_member_file_sets, :public, + title: ["Toothbrush"]) + end + let(:file_set) do + Hyrax.query_service.find_members(resource: work).first + end + before do + sign_in user + visit "/concern/monographs/#{work.id}/file_manager" + end + + it "looks like a file manager" do + # has a bulk edit header + expect(page.html).to include "

#{I18n.t('hyrax.file_manager.link_text')}

" + + # displays each file set's label + expect(page).to have_selector "input[name='file_set[title][]'][type='text'][value='#{file_set.title.first}']" + + # has a link to edit each file set + expect(page).to have_selector("a[href='/concern/parent/#{work.id}/file_sets/#{file_set.id}']") + + # has a link back to parent + expect(page).to have_link work.title.first, href: hyrax_monograph_path(id: work.id, locale: :en) + + # renders a form for each member + expect(page).to have_selector("#sortable form", count: work.member_ids.length) + + # Defines the order property + expect(page).to have_selector("#sortable[data-sort-property='member_ids']") + + # renders an input for titles + expect(page).to have_selector("input[name='file_set[title][]']") + + # renders a resource form for the entire resource + expect(page).to have_selector("form#resource-form") + + # renders a hidden field for the resource form thumbnail id + expect(page).to have_selector("#resource-form input[type=hidden][name='monograph[thumbnail_id]']", visible: false) + + # renders a thumbnail field for each member + expect(page).to have_selector("input[name='thumbnail_id']", count: work.member_ids.length) + + # renders a hidden field for the resource form representative id + expect(page).to have_selector("#resource-form input[type=hidden][name='monograph[representative_id]']", visible: false) + + # renders a representative field for each member + expect(page).to have_selector("input[name='representative_id']", count: work.member_ids.length) + end +end diff --git a/spec/forms/hyrax/forms/file_manager_form_spec.rb b/spec/forms/hyrax/forms/file_manager_form_spec.rb deleted file mode 100644 index 1beba864bd..0000000000 --- a/spec/forms/hyrax/forms/file_manager_form_spec.rb +++ /dev/null @@ -1,34 +0,0 @@ -# frozen_string_literal: true -RSpec.describe Hyrax::Forms::FileManagerForm do - subject(:form) { described_class.new(work, ability) } - let(:work) { FactoryBot.build(:generic_work) } - let(:ability) { :FAKE_ABILITY } - - describe "#member_presenters" do - context 'with a custom member presenter factory' do - subject(:form) { described_class.new(work, ability, member_factory: member_factory) } - - let(:member_factory) do - Class.new(Hyrax::MemberPresenterFactory) do - def member_presenters - [:some, :member, :presenters] - end - end - end - - it "is delegated to the MemberPresenterFactory" do - expect(form.member_presenters).to eq [:some, :member, :presenters] - end - end - - context 'with an AF::Base work' do - let(:work) { FactoryBot.create(:work_with_files) } - - it 'gives file set presenters' do - expect(form.member_presenters) - .to contain_exactly(an_instance_of(Hyrax::FileSetPresenter), - an_instance_of(Hyrax::FileSetPresenter)) - end - end - end -end diff --git a/spec/views/hyrax/base/file_manager.html.erb_spec.rb b/spec/views/hyrax/base/file_manager.html.erb_spec.rb deleted file mode 100644 index 8de5e32d87..0000000000 --- a/spec/views/hyrax/base/file_manager.html.erb_spec.rb +++ /dev/null @@ -1,88 +0,0 @@ -# frozen_string_literal: true -RSpec.describe "hyrax/base/file_manager.html.erb" do - let(:members) { [file_set, member] } - let(:file_set) { Hyrax::FileSetPresenter.new(solr_doc, nil) } - let(:member) { Hyrax::WorkShowPresenter.new(solr_doc_work, nil) } - let(:solr_doc) do - SolrDocument.new( - id: "test", - title_tesim: ["Test"], - thumbnail_path_ss: "/test/image/path.jpg", - label_tesim: ["file_name.tif"], - has_model_ssim: 'FileSet' - ) - end - let(:solr_doc_work) do - SolrDocument.new( - id: "work", - has_model_ssim: 'GenericWork', - title_tesim: ["Work"], - thumbnail_path_ss: "/test/image/path.jpg", - label_tesim: ["work"] - ) - end - - let(:parent) { stub_model(GenericWork, title: ["Test title"]) } - - let(:form) do - Hyrax::Forms::FileManagerForm.new(parent, nil) - end - - before do - allow(parent).to receive(:etag).and_return("123456") - allow(parent).to receive(:persisted?).and_return(true) - allow(parent).to receive(:id).and_return('resource') - - allow(form).to receive(:member_presenters).and_return([file_set, member]) - assign(:form, form) - # Blacklight nonsense - allow(view).to receive(:dom_class) { '' } - allow(view).to receive(:session_tracking_params).and_return({}) - allow(view).to receive(:curation_concern).and_return(parent) - allow(view).to receive(:contextual_path).with(anything, anything) do |x, y| - Hyrax::ContextualPath.new(x, y).show - end - render - end - - it "draws the page" do - # has a bulk edit header - expect(rendered).to include "

#{I18n.t('hyrax.file_manager.link_text')}

" - - # displays each file set's label - expect(rendered).to have_selector "input[name='file_set[title][]'][type='text'][value='#{file_set}']" - - # displays each file set's file name - expect(rendered).to have_content "file_name.tif" - - # has a link to edit each file set - expect(rendered).to have_selector('a[href="/concern/file_sets/test"]') - - # has a link back to parent - expect(rendered).to have_link "Test title", href: hyrax_generic_work_path(id: "resource") - - # has thumbnails for each resource - expect(rendered).to have_selector("img[src='/test/image/path.jpg']") - - # renders a form for each member - expect(rendered).to have_selector("#sortable form", count: members.length) - - # renders an input for titles - expect(rendered).to have_selector("input[name='file_set[title][]']") - - # renders a resource form for the entire resource - expect(rendered).to have_selector("form#resource-form") - - # renders a hidden field for the resource form thumbnail id - expect(rendered).to have_selector("#resource-form input[type=hidden][name='generic_work[thumbnail_id]']", visible: false) - - # renders a thumbnail field for each member - expect(rendered).to have_selector("input[name='thumbnail_id']", count: members.length) - - # renders a hidden field for the resource form representative id - expect(rendered).to have_selector("#resource-form input[type=hidden][name='generic_work[representative_id]']", visible: false) - - # renders a representative field for each member - expect(rendered).to have_selector("input[name='representative_id']", count: members.length) - end -end