diff --git a/app/controllers/ephemera_boxes_controller.rb b/app/controllers/ephemera_boxes_controller.rb index 600a3b8678..a3188a5244 100644 --- a/app/controllers/ephemera_boxes_controller.rb +++ b/app/controllers/ephemera_boxes_controller.rb @@ -10,6 +10,15 @@ class EphemeraBoxesController < BaseResourceController before_action :load_collections, only: [:new, :edit] before_action :cache_project, only: :destroy + def folders + authorize! :read, resource + render json: { data: datatables_folders } + end + + def datatables_folders + FolderDataSource.new(resource: resource.decorate, helper: self).data + end + def attach_drive edit end diff --git a/app/controllers/ephemera_projects_controller.rb b/app/controllers/ephemera_projects_controller.rb index dd02a14c3f..40e1e8046c 100644 --- a/app/controllers/ephemera_projects_controller.rb +++ b/app/controllers/ephemera_projects_controller.rb @@ -14,6 +14,14 @@ def index render 'index' end + def folders + render json: { data: datatables_folders } + end + + def datatables_folders + FolderDataSource.new(resource: resource.decorate, helper: self).data + end + def manifest @resource = find_resource(params[:id]) respond_to do |f| diff --git a/app/models/folder_data_source.rb b/app/models/folder_data_source.rb new file mode 100644 index 0000000000..eb6dc6bc07 --- /dev/null +++ b/app/models/folder_data_source.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +class FolderDataSource + attr_reader :resource, :helper + delegate :folders, to: :resource + def initialize(resource:, helper:) + @resource = resource + @helper = helper + end + + def data + @data ||= folders.map do |folder| + { + folder_number: folder.folder_number, + workflow_state: folder.rendered_state, + title: folder.title, + barcode: folder.barcode, + genre: folder.genre.try(:label) || folder.genre, + actions: helper.render_to_string(partial: "catalog/folder_actions", locals: { resource: resource, folder: folder }, formats: [:html]) + } + end + end +end diff --git a/app/views/catalog/_folder_actions.html.erb b/app/views/catalog/_folder_actions.html.erb new file mode 100644 index 0000000000..462ecbc293 --- /dev/null +++ b/app/views/catalog/_folder_actions.html.erb @@ -0,0 +1,5 @@ + + <% folder_url = parent_solr_document_path("#{resource.id}", "#{folder.id}") %> + <%= link_to 'View', folder_url, class: 'btn btn-default' %> + <%= link_to 'Edit', main_app.polymorphic_path([:edit, folder]), class: 'btn btn-default' %> + diff --git a/app/views/catalog/_members_ephemera_box.html.erb b/app/views/catalog/_members_ephemera_box.html.erb index 9c29baf432..f33668235f 100644 --- a/app/views/catalog/_members_ephemera_box.html.erb +++ b/app/views/catalog/_members_ephemera_box.html.erb @@ -2,38 +2,21 @@ <%# DataTable looks for certain data attributes on initialization # https://datatables.net/examples/advanced_init/html5-data-options.html # here we sort descending by folder number %> - +
<% if decorated_resource.is_a?(EphemeraBox) %> - + <% end %> - - - - - + + + + + - <% unless decorated_resource.folders.empty? %> - <% decorated_resource.folders.each do |folder| %> - <% folder_url = parent_solr_document_path("#{resource.id}", "#{folder.id}") %> - - <% if decorated_resource.is_a?(EphemeraBox) %> - - <% end %> - - - - - - - <% end %> - <% else %> + <% if decorated_resource.folders.empty? %> <% end %> diff --git a/config/routes.rb b/config/routes.rb index 5a3116be80..062779e61a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -94,6 +94,9 @@ resources :ephemera_projects do resources :templates, only: [:new, :create, :destroy] resources :ephemera_fields + member do + get :folders, defaults: { format: :json } + end member do get :manifest, defaults: { format: :json } end @@ -106,6 +109,9 @@ member do get :attach_drive end + member do + get :folders, defaults: { format: :json } + end end resources :ephemera_folders do diff --git a/spec/controllers/ephemera_boxes_controller_spec.rb b/spec/controllers/ephemera_boxes_controller_spec.rb index b0ba0deb6d..35b7eab4e0 100644 --- a/spec/controllers/ephemera_boxes_controller_spec.rb +++ b/spec/controllers/ephemera_boxes_controller_spec.rb @@ -27,6 +27,38 @@ end end + describe "folders" do + context "when not logged in" do + let(:user) { nil } + it "redirects CanCan::AccessDenied error to login" do + box = FactoryBot.create_for_repository(:private_ephemera_box) + get :folders, params: { id: box.id } + expect(response).to redirect_to('/users/auth/cas') + end + end + context "when they have permission" do + let(:user) { FactoryBot.create(:admin) } + render_views + it "renders a JSON list of a project's folders" do + folder = FactoryBot.create_for_repository(:ephemera_folder) + box = FactoryBot.create_for_repository(:ephemera_box, member_ids: folder.id) + + get :folders, params: { id: box.id.to_s, formats: :json } + + json = JSON.parse(response.body) + expect(json["data"].length).to eq 1 + expect(json["data"][0]["folder_number"]).to eq folder.folder_number.first + expect(json["data"][0]["workflow_state"]).to eq "Needs QA" + expect(json["data"][0]["title"]).to eq folder.title + expect(json["data"][0]["barcode"]).to eq folder.barcode.first + expect(json["data"][0]["genre"]).to eq folder.genre.first + expect(json["data"][0]["actions"]).to have_link "View", href: "/catalog/parent/#{box.id}/#{folder.id}" + expect(json["data"][0]["actions"]).to have_link "Edit", href: "/concern/ephemera_folders/#{folder.id}/edit" + expect(json["data"][0]["actions"]).not_to have_link "Delete" + end + end + end + describe "create" do let(:user) { FactoryBot.create(:admin) } let(:valid_params) do diff --git a/spec/controllers/ephemera_projects_controller_spec.rb b/spec/controllers/ephemera_projects_controller_spec.rb index 19075c02ac..6686ec2b0b 100644 --- a/spec/controllers/ephemera_projects_controller_spec.rb +++ b/spec/controllers/ephemera_projects_controller_spec.rb @@ -98,6 +98,28 @@ end end + describe "folders" do + context "when they have permission" do + let(:user) { FactoryBot.create(:admin) } + render_views + it "renders a JSON list of a project's folders" do + folder = FactoryBot.create_for_repository(:ephemera_folder) + project = FactoryBot.create_for_repository(:ephemera_project, member_ids: folder.id) + + get :folders, params: { id: project.id.to_s, formats: :json } + + json = JSON.parse(response.body) + expect(json["data"].length).to eq 1 + expect(json["data"][0]["folder_number"]).to eq folder.folder_number.first + expect(json["data"][0]["workflow_state"]).to eq "Needs QA" + expect(json["data"][0]["title"]).to eq folder.title + expect(json["data"][0]["barcode"]).to eq folder.barcode.first + expect(json["data"][0]["genre"]).to eq folder.genre.first + expect(json["data"][0]["actions"]).not_to be_blank + end + end + end + describe "destroy" do let(:user) { FactoryBot.create(:admin) } context "access control" do diff --git a/spec/views/catalog/_members_ephemera_box.html.erb_spec.rb b/spec/views/catalog/_members_ephemera_box.html.erb_spec.rb index 3e4913ace8..42ce070b85 100644 --- a/spec/views/catalog/_members_ephemera_box.html.erb_spec.rb +++ b/spec/views/catalog/_members_ephemera_box.html.erb_spec.rb @@ -15,16 +15,7 @@ it 'shows them' do expect(rendered).to have_selector 'h2', text: 'Folders' expect(rendered).to have_selector 'th', text: 'Folder Number' - expect(rendered).to have_selector 'td.folder_number', text: "one" - expect(rendered).to have_link "one", href: "/catalog/parent/#{parent.id}/#{child.id}" - expect(rendered).not_to have_selector 'td.folder_number', text: "[\"one\"]" - expect(rendered).to have_selector 'td.barcode', text: child.barcode.first - expect(rendered).not_to have_selector 'td.barcode', text: "[\"#{child.barcode.first}\"]" - expect(rendered).to have_selector 'td.genre', text: child.genre.first - expect(rendered).not_to have_selector 'td.genre', text: "[\"#{child.genre.first}\"]" - expect(rendered).to have_link "View", href: "/catalog/parent/#{parent.id}/#{child.id}" - expect(rendered).to have_link "Edit", href: "/concern/ephemera_folders/#{child.id}/edit" - expect(rendered).not_to have_link "Delete", href: "/concern/ephemera_folders/#{child.id}" + expect(rendered).to have_selector "table.datatable[data-ajax='/concern/ephemera_boxes/#{parent.id}/folders']" end end context "when it's a project with folders" do @@ -40,10 +31,7 @@ it 'shows them' do expect(rendered).to have_selector 'h2', text: 'Folders' expect(rendered).not_to have_selector 'th', text: 'Folder Number' - expect(rendered).to have_selector 'td', text: 'test folder' - expect(rendered).to have_link "View", href: "/catalog/parent/#{parent.id}/#{child.id}" - expect(rendered).to have_link "Edit", href: "/concern/ephemera_folders/#{child.id}/edit" - expect(rendered).not_to have_link "Delete", href: "/concern/ephemera_folders/#{child.id}" + expect(rendered).to have_selector "table.datatable[data-ajax='/concern/ephemera_projects/#{parent.id}/folders']" end end end diff --git a/spec/views/catalog/_members_ephemera_project.html.erb_spec.rb b/spec/views/catalog/_members_ephemera_project.html.erb_spec.rb index 484d524568..9f3485b033 100644 --- a/spec/views/catalog/_members_ephemera_project.html.erb_spec.rb +++ b/spec/views/catalog/_members_ephemera_project.html.erb_spec.rb @@ -23,11 +23,6 @@ expect(rendered).to have_link 'Edit', href: edit_ephemera_box_path(child.id) expect(rendered).to have_selector 'h2', text: 'Folders' - expect(rendered).to have_selector 'span.label-info', text: 'Needs QA' - expect(rendered).to have_selector 'td', text: 'test folder' - expect(rendered).to have_selector 'td', text: '12345678901234' - expect(rendered).to have_link 'View', href: parent_solr_document_path(parent.id, child_folder.id) - expect(rendered).to have_link 'Edit', href: edit_ephemera_folder_path(child_folder.id) end end context "when it's a project with templates" do
Folder NumberFolder NumberWorkflow StateTitleBarcodeGenreActionsWorkflow StateTitleBarcodeGenreActions
<%= link_to folder.folder_number, folder_url %><%= folder.rendered_state %><%= folder.header %><%= folder.barcode %><%= folder.genre %> - <%= link_to 'View', folder_url, class: 'btn btn-default' %> - <%= link_to 'Edit', main_app.polymorphic_path([:edit, folder]), class: 'btn btn-default' %> -
This work has no folders attached. Click "Attach Folder" to attach folders.