From 2bd497f34629479fcb2a63e26ebf148f90e86d80 Mon Sep 17 00:00:00 2001 From: Weiwei Shi Date: Sun, 29 Mar 2015 00:39:50 -0600 Subject: [PATCH 1/3] modify the collection creation form --- .../collections_controller_behavior.rb | 65 ++----------------- .../hydranorth/forms/collection_edit_form.rb | 16 +++++ app/models/collection.rb | 1 + .../hydranorth/collections/metadata.rb | 10 +++ .../hydranorth/collection_presenter.rb | 40 ++++++++++++ app/views/collections/_license_modal.html.erb | 39 +++++++++++ .../records/edit_fields/_license.html.erb | 3 + config/locales/sufia.en.yml | 11 +++- 8 files changed, 124 insertions(+), 61 deletions(-) create mode 100644 app/forms/hydranorth/forms/collection_edit_form.rb create mode 100644 app/models/concerns/hydranorth/collections/metadata.rb create mode 100644 app/presenters/hydranorth/collection_presenter.rb create mode 100644 app/views/collections/_license_modal.html.erb create mode 100644 app/views/records/edit_fields/_license.html.erb diff --git a/app/controllers/concerns/hydranorth/collections_controller_behavior.rb b/app/controllers/concerns/hydranorth/collections_controller_behavior.rb index 9187c3aa..50ee0e43 100755 --- a/app/controllers/concerns/hydranorth/collections_controller_behavior.rb +++ b/app/controllers/concerns/hydranorth/collections_controller_behavior.rb @@ -3,30 +3,6 @@ module CollectionsControllerBehavior extend ActiveSupport::Concern include Sufia::CollectionsControllerBehavior - included do - include Blacklight::Catalog::SearchContext - include BlacklightAdvancedSearch::ParseBasicQ - include BlacklightAdvancedSearch::Controller - include Hydranorth::Breadcrumbs - - before_filter :filter_docs_with_read_access!, except: :show - before_filter :has_access?, except: :show - before_filter :build_breadcrumbs, only: [:edit, :show] - - self.solr_search_params_logic += [:add_access_controls_to_solr_params] - - layout "sufia-one-column" - end - - def new - super - form - end - - def edit - super - form - end def show if current_user.group_list == 'admin' @@ -39,49 +15,20 @@ def show protected - def presenter - @presenter ||= presenter_class.new(@collection) - end - def presenter_class - Sufia::CollectionPresenter + Hydranorth::CollectionPresenter end def collection_params - params.require(:collection).permit(:title, :description, :members, part_of: [], - contributor: [], creator: [], publisher: [], date_created: [], subject: [], - language: [], rights: [], resource_type: [], identifier: [], based_near: [], - tag: [], related_url: []) - end - - def query_collection_members - flash[:notice]=nil if flash[:notice] == "Select something first" - query = params[:cq] - - #merge in the user parameters and the attach the collection query - solr_params = (params.symbolize_keys).merge(q: query) - - # run the solr query to find the collections - (@response, @member_docs) = get_search_results(solr_params) - end - - def after_destroy(id) - respond_to do |format| - format.html { redirect_to sufia.dashboard_collections_path, notice: 'Collection was successfully deleted.' } - format.json { render json: {id: id}, status: :destroyed, location: @collection } - end - end - - def form - @form ||= form_class.new(@collection) + params.require(:collection).permit(:title, :description, :license, :members, part_of: [], + creator: [], date_created: [], subject: [], + rights: [], resource_type: [], identifier: []) + end def form_class - Sufia::Forms::CollectionEditForm + Hydranorth::Forms::CollectionEditForm end - def _prefixes - @_prefixes ||= super + ['catalog'] - end end end diff --git a/app/forms/hydranorth/forms/collection_edit_form.rb b/app/forms/hydranorth/forms/collection_edit_form.rb new file mode 100644 index 00000000..6668c8a4 --- /dev/null +++ b/app/forms/hydranorth/forms/collection_edit_form.rb @@ -0,0 +1,16 @@ +module Hydranorth + module Forms + class CollectionEditForm + include HydraEditor::Form + self.model_class = ::Collection + self.terms = [:title, :creator, :description, :license] + self.required_fields = [:title, :license ] + # Test to see if the given field is required + # @param [Symbol] key a field + # @return [Boolean] is it required or not + def required?(key) + model_class.validators_on(key).any?{|v| v.kind_of? ActiveModel::Validations::PresenceValidator} + end + end + end +end diff --git a/app/models/collection.rb b/app/models/collection.rb index 6bfbe4b5..050733b4 100644 --- a/app/models/collection.rb +++ b/app/models/collection.rb @@ -1,2 +1,3 @@ class Collection < Sufia::Collection + include Hydranorth::Collections::Metadata end diff --git a/app/models/concerns/hydranorth/collections/metadata.rb b/app/models/concerns/hydranorth/collections/metadata.rb new file mode 100644 index 00000000..ae0740ec --- /dev/null +++ b/app/models/concerns/hydranorth/collections/metadata.rb @@ -0,0 +1,10 @@ +module Hydranorth::Collections + module Metadata + extend ActiveSupport::Concern + included do + property :license, predicate: RDF::DC.license, multiple:false do |index| + index.as :stored_searchable + end + end + end +end diff --git a/app/presenters/hydranorth/collection_presenter.rb b/app/presenters/hydranorth/collection_presenter.rb new file mode 100644 index 00000000..3b222ac3 --- /dev/null +++ b/app/presenters/hydranorth/collection_presenter.rb @@ -0,0 +1,40 @@ +module Hydranorth + class CollectionPresenter + include Hydra::Presenter + include ActionView::Helpers::NumberHelper + + self.model_class = ::Collection + # Terms is the list of fields displayed by app/views/collections/_show_descriptions.html.erb + self.terms = [:title, :total_items, :size, :description, :creator, + :license, :date_created] + + # Depositor and permissions are not displayed in app/views/collections/_show_descriptions.html.erb + # so don't include them in `terms'. + # delegate :depositor, :permissions, to: :model + + def terms_with_values + terms.select { |t| self[t].present? } + end + + def [](key) + case key + when :size + size + when :total_items + total_items + else + super + end + end + + def size + number_to_human_size(model.bytes) + end + + def total_items + model.members.count + end + + end +end + diff --git a/app/views/collections/_license_modal.html.erb b/app/views/collections/_license_modal.html.erb new file mode 100644 index 00000000..7b7d537a --- /dev/null +++ b/app/views/collections/_license_modal.html.erb @@ -0,0 +1,39 @@ + diff --git a/app/views/records/edit_fields/_license.html.erb b/app/views/records/edit_fields/_license.html.erb new file mode 100644 index 00000000..3d1eab26 --- /dev/null +++ b/app/views/records/edit_fields/_license.html.erb @@ -0,0 +1,3 @@ + <%= f.input :license, as: :select_with_modal_help, collection: Sufia.config.cc_licenses, + input_html: { class: 'form-control', required: true }, include_blank: true %> + <%= render "collections/license_modal" %> diff --git a/config/locales/sufia.en.yml b/config/locales/sufia.en.yml index 8e0327d9..4d336bc6 100644 --- a/config/locales/sufia.en.yml +++ b/config/locales/sufia.en.yml @@ -175,10 +175,9 @@ en: is_version_of: "Citation for previous publication" source: "Source" collection: - description: "Abstract or Summary" + description: "Description" subject: "Subject/Keyword" date_created: "Date Created" - related_url: "Related URL" total_items: "Total Items" size: "Size" @@ -204,6 +203,11 @@ en: source: "Brief information about a physical item from which this item was derived." is_version_of: "If your item has been previously published, provide a citation" related_url: "must be a url - example: http://www.ualberta.ca" + collection: + title: "A name for the collection to aid in identifying it. <em>This is a required field</em>." + description: "Free-text notes about the collection. " + creator_html: "The person or group responsible for the file being uploaded. Usually this is the author of the content. Personal names should be entered with the last name first, e.g. "Smith, John." <em>This is a required field</em>." + resource_type_html: "Pre-defined categories to describe the type of file content included in the collection, such as "article" or "dataset."." aria_label: generic_file: @@ -212,6 +216,9 @@ en: description: "Usage information for abstract or summary" tag: "Usage information for keyword" rights: "Usage information for rights" + license: "Usage information for license" + collection: + license: "Usage information for license" hydranorth: dashboard: From cb01799f03f21eaa0ad31d77b669cc519d8a4bcf Mon Sep 17 00:00:00 2001 From: Weiwei Shi Date: Sun, 29 Mar 2015 18:00:17 -0600 Subject: [PATCH 2/3] add selenium test for the collection form in spec-views --- spec-views/collection_form_spec.rb | 67 ++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 spec-views/collection_form_spec.rb diff --git a/spec-views/collection_form_spec.rb b/spec-views/collection_form_spec.rb new file mode 100644 index 00000000..51e0ac78 --- /dev/null +++ b/spec-views/collection_form_spec.rb @@ -0,0 +1,67 @@ +require "json" +require "selenium-webdriver" +require "rspec" +require "./spec-views/helper.rb" +require "./spec-views/before.rb" +require "./spec-views/after.rb" +require "./spec-views/user.rb" +include RSpec::Expectations + +include Before +include After + +describe "Collection Creation Form" do + + setup + + teardown + + it "form is up and new collection is created" do + @driver.get(@base_url + "/") + @driver.find_element(:link, "Login").click + verify { (@driver.current_url).should == @base_url+"/users/sign_in"} + @driver.find_element(:id, "user_email").clear + @driver.find_element(:id, "user_email").send_keys @properties['admin']['name'] + @driver.find_element(:id, "user_password").clear + @driver.find_element(:id, "user_password").send_keys @properties['admin']['password'] + @driver.find_element(:name, "commit").click + @driver.get(@base_url + "/") + + @driver.find_element(:id, "dashboard_link").click + @driver.find_element(:id, "hydra-collection-add").click + + verify { @driver.current_url.should == @base_url+"/collections/new" } + verify { @driver.find_element(:xpath, "//label[@for = 'collection_title']/abbr[@title = 'required']").displayed? == true } + title = @driver.find_element(:id, "collection_title") + title.clear + title.send_keys("Test Collection from Selenium") + @driver.find_element(:id, "collection_creator").send_keys @properties['user1']['name'] + @driver.find_element(:id, "collection_description").send_keys "Test description for the test collection." + + select_license = @driver.find_element(:id, "collection_license") + option = Selenium::WebDriver::Support::Select.new(select_license) + option.select_by(:text, "Public Domain Mark 1.0") + verify { @driver.find_element(:xpath, "//label[@for = 'collection_license']/abbr[@title = 'required']").displayed? == true } + @driver.find_element(:id, "create_submit").click + + verify { @driver.current_url.should include @base_url + "/collections/" } + collection_id = @driver.current_url.match(/#{@base_url}\/collections\/(.*)$/)[1] + verify { (@driver.find_element(:class, "alert-success").text).should include "Collection was successfully created."} + verify { @driver.find_element(:css, "h1").text.should == "Test Collection from Selenium" } + verify { @driver.find_element(:class, "collection_description").text.should == "Test description for the test collection." } + verify { @driver.find_element(:xpath, "//span[@itemprop = 'creator']/span/a").text.should == @properties['user1']['name'] } + + verify { @driver.find_element(:xpath, "//span[@itemprop = 'total_items']").text.should == "0" } + verify { @driver.find_element(:xpath, "//dt[contains(text(), 'License')]/following-sibling::dd/a").text.should == "Public Domain Mark 1.0" } + @driver.find_element(:link, "My Collections").click + verify { @driver.current_url.should == @base_url + "/dashboard/collections" } + collection = @driver.find_element(:id, "document_"+collection_id) + collection.find_element(:id, "dropdownMenu_"+collection_id).click + delete = "//ul[@aria-labelledby = 'dropdownMenu_"+collection_id+"']//a[@title='Delete Collection']" + collection.find_element(:xpath, delete).click + @driver.switch_to.alert.accept + end + +end + + From 551713373d48aa94a305f640b4d652eaf4f86b71 Mon Sep 17 00:00:00 2001 From: Weiwei Shi Date: Sun, 29 Mar 2015 18:06:00 -0600 Subject: [PATCH 3/3] add aria-labels to collection form --- config/locales/sufia.en.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/locales/sufia.en.yml b/config/locales/sufia.en.yml index 4d336bc6..699368fb 100644 --- a/config/locales/sufia.en.yml +++ b/config/locales/sufia.en.yml @@ -214,10 +214,11 @@ en: default: "Usage information for %{title}" based_near: "Usage information for location" description: "Usage information for abstract or summary" - tag: "Usage information for keyword" + subject: "Usage information for keyword" rights: "Usage information for rights" license: "Usage information for license" collection: + default: "Usage information for %{title}" license: "Usage information for license" hydranorth: