From 3bf639c447f60203142cafc55447b0a2ed32a389 Mon Sep 17 00:00:00 2001 From: Justin Coyne Date: Tue, 6 Sep 2016 17:50:16 -0500 Subject: [PATCH] Admin set show page for admins Fixes #2502 --- app/assets/stylesheets/sufia/admin.scss | 15 +++++++ .../sufia/admin/admin_sets_controller.rb | 43 +++++++++++++++++-- app/presenters/sufia/admin_set_presenter.rb | 4 ++ .../sufia/admin_set_member_search_builder.rb | 12 ++++++ .../sufia/single_admin_set_search_builder.rb | 9 ++++ .../admin_sets/_sort_and_per_page.html.erb | 3 ++ .../sufia/admin/admin_sets/show.html.erb | 38 ++++++++++++++++ config/locales/sufia.en.yml | 3 ++ .../sufia/admin/admin_sets_controller_spec.rb | 16 +++++++ spec/factories/generic_works.rb | 4 +- spec/factories/users.rb | 8 ++++ spec/features/admin_admin_set_spec.rb | 23 ++++++++++ .../single_admin_set_search_builder_spec.rb | 12 ++++++ 13 files changed, 185 insertions(+), 5 deletions(-) create mode 100644 app/presenters/sufia/admin_set_presenter.rb create mode 100644 app/search_builders/sufia/admin_set_member_search_builder.rb create mode 100644 app/search_builders/sufia/single_admin_set_search_builder.rb create mode 100644 app/views/sufia/admin/admin_sets/_sort_and_per_page.html.erb create mode 100644 app/views/sufia/admin/admin_sets/show.html.erb create mode 100644 spec/features/admin_admin_set_spec.rb create mode 100644 spec/search_builder/sufia/single_admin_set_search_builder_spec.rb diff --git a/app/assets/stylesheets/sufia/admin.scss b/app/assets/stylesheets/sufia/admin.scss index a57cddbe26..0e1e60a02a 100644 --- a/app/assets/stylesheets/sufia/admin.scss +++ b/app/assets/stylesheets/sufia/admin.scss @@ -31,6 +31,11 @@ $content-background-color: #f5f5f5 !default; margin: 0; margin-bottom: 15px; padding: 0; + + > .fa { + margin-left: 6px; + margin-right: 6px; + } } } @@ -38,11 +43,21 @@ $content-background-color: #f5f5f5 !default; float: left; width: 100%; + .panel-heading, .panel-footer, .panel-body { float: left; width: 100%; } + + .panel-title { + color: $title-text-color; + display: block; + float: left; + font-size: 16px; + font-weight: 400; + line-height: 30px; + } } .title-button { diff --git a/app/controllers/sufia/admin/admin_sets_controller.rb b/app/controllers/sufia/admin/admin_sets_controller.rb index 66fb4853cf..d48dd891db 100644 --- a/app/controllers/sufia/admin/admin_sets_controller.rb +++ b/app/controllers/sufia/admin/admin_sets_controller.rb @@ -1,7 +1,42 @@ module Sufia class Admin::AdminSetsController < ApplicationController + include CurationConcerns::CollectionsControllerBehavior load_and_authorize_resource layout 'admin' + self.presenter_class = Sufia::AdminSetPresenter + + def show + add_breadcrumb t(:'sufia.controls.home'), root_path + add_breadcrumb t(:'sufia.toolbar.admin.menu'), sufia.admin_path + add_breadcrumb t(:'sufia.admin.sidebar.admin_sets'), sufia.admin_admin_sets_path + add_breadcrumb 'View Set', request.path + super + end + + # Override the default prefixes so that we use the collection partals. + def _prefixes + @_prefixes ||= ["sufia/admin/admin_sets", "collections", 'catalog'] + end + + # Overriding the way that the search builder is initialized + def collections_search_builder + collections_search_builder_class.new(self, :read) + end + + # Used for the show action + def collection_search_builder_class + Sufia::SingleAdminSetSearchBuilder + end + + # Used for the index action + def collections_search_builder_class + CurationConcerns::AdminSetSearchBuilder + end + + # Used to get the members for the show action + def collection_member_search_builder_class + Sufia::AdminSetMemberSearchBuilder + end def index authorize! :manage, AdminSet @@ -33,10 +68,10 @@ def repository private def setup_create_form - add_breadcrumb 'Home', root_path - add_breadcrumb 'Repository Dashboard', sufia.admin_path - add_breadcrumb 'Administrative Sets', sufia.admin_admin_sets_path - add_breadcrumb 'New', sufia.new_admin_admin_set_path + add_breadcrumb t(:'sufia.controls.home'), root_path + add_breadcrumb t(:'sufia.toolbar.admin.menu'), sufia.admin_path + add_breadcrumb t(:'sufia.admin.sidebar.admin_sets'), sufia.admin_admin_sets_path + add_breadcrumb 'New', sufia.new_admin_admin_set_path @form = form_class.new(@admin_set) end diff --git a/app/presenters/sufia/admin_set_presenter.rb b/app/presenters/sufia/admin_set_presenter.rb new file mode 100644 index 0000000000..13f3e5015e --- /dev/null +++ b/app/presenters/sufia/admin_set_presenter.rb @@ -0,0 +1,4 @@ +module Sufia + class AdminSetPresenter < CollectionPresenter + end +end diff --git a/app/search_builders/sufia/admin_set_member_search_builder.rb b/app/search_builders/sufia/admin_set_member_search_builder.rb new file mode 100644 index 0000000000..9e5f39b60f --- /dev/null +++ b/app/search_builders/sufia/admin_set_member_search_builder.rb @@ -0,0 +1,12 @@ +module Sufia + # Builds a query to find the members of an admin set. + class AdminSetMemberSearchBuilder < ::SearchBuilder + self.default_processor_chain += [:in_admin_set] + + # include filters into the query to only include the collection memebers + def in_admin_set(solr_parameters) + solr_parameters[:fq] ||= [] + solr_parameters[:fq] << "{!term f=isPartOf_ssim}#{blacklight_params.fetch('id')}" + end + end +end diff --git a/app/search_builders/sufia/single_admin_set_search_builder.rb b/app/search_builders/sufia/single_admin_set_search_builder.rb new file mode 100644 index 0000000000..698a9ec283 --- /dev/null +++ b/app/search_builders/sufia/single_admin_set_search_builder.rb @@ -0,0 +1,9 @@ +module Sufia + class SingleAdminSetSearchBuilder < CurationConcerns::AdminSetSearchBuilder + include CurationConcerns::SingleResult + + def initialize(context) + super(context, :read) + end + end +end diff --git a/app/views/sufia/admin/admin_sets/_sort_and_per_page.html.erb b/app/views/sufia/admin/admin_sets/_sort_and_per_page.html.erb new file mode 100644 index 0000000000..d8e6834116 --- /dev/null +++ b/app/views/sufia/admin/admin_sets/_sort_and_per_page.html.erb @@ -0,0 +1,3 @@ +
+ <%= render partial: "paginate_compact", object: @response if show_pagination? %> +
diff --git a/app/views/sufia/admin/admin_sets/show.html.erb b/app/views/sufia/admin/admin_sets/show.html.erb new file mode 100644 index 0000000000..020f099f08 --- /dev/null +++ b/app/views/sufia/admin/admin_sets/show.html.erb @@ -0,0 +1,38 @@ +<% content_for :page_header do %> +

Administrative Set

+<% end %> + + +
+
+
+
+

<%= @presenter.to_s %>

+
+ <%= link_to sufia.edit_admin_admin_set_path(@presenter), class: 'btn btn-primary' do %> + Edit + <% end %> +
+
+ +
+
+ +
+
+ <%= render 'collection_description', presenter: @presenter %> + <%= render 'show_descriptions' %> +
+
+ +
+

<%= t '.item_list_header' %>

+ <%= render 'sort_and_per_page', collection: @presenter %> + + <%= render_document_index @member_docs %> + + <%= render 'paginate' %> +
+
+
+
diff --git a/config/locales/sufia.en.yml b/config/locales/sufia.en.yml index 2eaa985c9f..784e7ae5ff 100644 --- a/config/locales/sufia.en.yml +++ b/config/locales/sufia.en.yml @@ -285,6 +285,9 @@ en: footer: copyright_html: "Copyright © 2016 Project Hydra Licensed under the Apache License, Version 2.0" admin: + admin_sets: + show: + item_list_header: "Works in This Set" sidebar: admin_sets: "Administrative Sets" settings: "Settings" diff --git a/spec/controllers/sufia/admin/admin_sets_controller_spec.rb b/spec/controllers/sufia/admin/admin_sets_controller_spec.rb index 26bbef1231..b93c3382bf 100644 --- a/spec/controllers/sufia/admin/admin_sets_controller_spec.rb +++ b/spec/controllers/sufia/admin/admin_sets_controller_spec.rb @@ -66,5 +66,21 @@ end end end + + describe "#show" do + context "when it's successful" do + let(:admin_set) { create(:admin_set, edit_users: [user]) } + before do + create(:work, :public, admin_set: admin_set) + end + + it 'defines a presenter' do + get :show, params: { id: admin_set } + expect(response).to be_success + expect(assigns[:presenter]).to be_kind_of Sufia::AdminSetPresenter + expect(assigns[:presenter].id).to eq admin_set.id + end + end + end end end diff --git a/spec/factories/generic_works.rb b/spec/factories/generic_works.rb index cf6a53c667..56940edcc0 100644 --- a/spec/factories/generic_works.rb +++ b/spec/factories/generic_works.rb @@ -11,7 +11,9 @@ work.apply_depositor_metadata(evaluator.user.user_key) end - factory :public_generic_work, aliases: [:public_work] do + factory :public_generic_work, aliases: [:public_work], traits: [:public] + + trait :public do visibility Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC end diff --git a/spec/factories/users.rb b/spec/factories/users.rb index ab9c6146f5..908ff5c218 100644 --- a/spec/factories/users.rb +++ b/spec/factories/users.rb @@ -21,6 +21,14 @@ User.batch_user.send_message(user, 'These files have been saved', 'Batch upload complete', false) end end + + factory :admin do + after(:build) do |user| + def user.groups + ['admin'] + end + end + end end end diff --git a/spec/features/admin_admin_set_spec.rb b/spec/features/admin_admin_set_spec.rb new file mode 100644 index 0000000000..7f8e87c123 --- /dev/null +++ b/spec/features/admin_admin_set_spec.rb @@ -0,0 +1,23 @@ +require 'spec_helper' + +RSpec.describe "The admin sets, through the admin dashboard" do + let(:user) { create :admin } + + before do + create(:admin_set, title: ["A completely unique name"], + description: ["A substantial description"]) + end + + scenario do + sign_in user + visit '/admin' + click_link "Administrative Sets" + + expect(page).to have_link "Create new administrative set" + + click_link "A completely unique name" + + expect(page).to have_content "A substantial description" + expect(page).to have_content "Works in This Set" + end +end diff --git a/spec/search_builder/sufia/single_admin_set_search_builder_spec.rb b/spec/search_builder/sufia/single_admin_set_search_builder_spec.rb new file mode 100644 index 0000000000..700c91c103 --- /dev/null +++ b/spec/search_builder/sufia/single_admin_set_search_builder_spec.rb @@ -0,0 +1,12 @@ +require 'spec_helper' + +RSpec.describe Sufia::SingleAdminSetSearchBuilder do + let(:ability) { instance_double(Ability, admin?: true) } + let(:context) { double(blacklight_config: CatalogController.blacklight_config, + current_ability: ability) } + let(:builder) { described_class.new(context) } + describe "#query" do + subject { builder.with(id: '123').query.fetch('fq') } + it { is_expected.to match_array ["", "_query_:\"{!field f=has_model_ssim}AdminSet\"", "_query_:\"{!field f=id}123\""] } + end +end