sufia 7.3.0.rc1 → 7.3.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/README.md +11 -7
  4. data/app/actors/sufia/default_admin_set_actor.rb +9 -2
  5. data/app/assets/javascripts/sufia/batch_select_all.js +1 -1
  6. data/app/assets/stylesheets/sufia/_dashboard.scss +1 -1
  7. data/app/assets/stylesheets/sufia/_file-listing.scss +8 -1
  8. data/app/assets/stylesheets/sufia/_file_upload.scss +2 -0
  9. data/app/controllers/concerns/sufia/contact_form_controller_behavior.rb +1 -0
  10. data/app/controllers/pages_controller.rb +2 -0
  11. data/app/controllers/sufia/admin/features_controller.rb +6 -0
  12. data/app/services/sufia/workflow/complete_notification.rb +2 -17
  13. data/app/services/sufia/workflow/deposited_notification.rb +22 -0
  14. data/app/uploaders/sufia/uploaded_file_uploader.rb +8 -0
  15. data/app/views/batch_edits/_check_all.html.erb +1 -1
  16. data/app/views/catalog/_search_form.html.erb +1 -0
  17. data/app/views/curation_concerns/base/_attribute_rows.html.erb +0 -1
  18. data/app/views/curation_concerns/base/_relationships_parent_rows.html.erb +2 -0
  19. data/app/views/my/_batch_edits_actions.html.erb +6 -2
  20. data/app/views/my/_index_partials/_default_group.html.erb +1 -1
  21. data/app/views/sufia/admin/_sidebar.html.erb +1 -1
  22. data/app/views/sufia/admin/features/index.html.erb +13 -1
  23. data/app/views/users/_vitals.html.erb +2 -2
  24. data/config/locales/sufia.en.yml +5 -2
  25. data/lib/generators/sufia/templates/catalog_controller.rb +4 -0
  26. data/lib/generators/sufia/templates/config/locales/sufia.en.yml +1 -1
  27. data/lib/generators/sufia/templates/config/sufia.rb +2 -1
  28. data/lib/generators/sufia/templates/workflow.json.erb +9 -3
  29. data/lib/sufia/configuration.rb +5 -1
  30. data/lib/sufia/engine.rb +2 -2
  31. data/lib/sufia/version.rb +1 -1
  32. data/lib/tasks/migrate.rake +18 -0
  33. data/spec/actors/sufia/default_admin_set_actor_spec.rb +4 -2
  34. data/spec/controllers/curation_concerns/generic_works_controller_spec.rb +2 -2
  35. data/spec/features/batch_edit_spec.rb +1 -1
  36. data/spec/helpers/batch_edits_helper_spec.rb +12 -5
  37. data/spec/lib/sufia/configuration_spec.rb +1 -0
  38. data/spec/services/sufia/workflow/complete_notification_spec.rb +5 -27
  39. data/spec/services/sufia/workflow/deposited_notification_spec.rb +32 -0
  40. data/spec/spec_helper.rb +1 -1
  41. data/spec/test_app_templates/Gemfile.extra +0 -1
  42. data/spec/views/catalog/_search_form.html.erb_spec.rb +18 -0
  43. data/spec/views/curation_concerns/base/_relationships.html.erb_spec.rb +9 -1
  44. data/spec/views/sufia/admin/features/index.html.erb_spec.rb +14 -0
  45. data/sufia.gemspec +3 -3
  46. data/template.rb +1 -2
  47. metadata +17 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f8da2d85b23ab091afabbe8a3fc3f547fff86b94
4
- data.tar.gz: 149f28dc13a30a9141d30b3035c0afaa4cd087a6
3
+ metadata.gz: '009b9b30b853cbfba6072849c4ac71f9a0523b4d'
4
+ data.tar.gz: 0cc820c3c594a6cfb415f072eda5f00f7f59af51
5
5
  SHA512:
6
- metadata.gz: 7dfb177dad78057657aecbabcb3afc5f72d821ec24b98e6d6d2a87795f7e14c23c400e80b8818eac2252850d414d3b912c4ab354ee2dc28a2b15d0dd69e31f5a
7
- data.tar.gz: 6dd363cc82aabe925013a2e8bf2de2d2c77651dd29ac10c8cabd19bbac949dda976abfd9913a0c4c89e0dbbb8b4f5fa0a72d0c466add9b4d2f038d291d5d68dd
6
+ metadata.gz: 7e745682238c01ef3eb98b1642ced091da5ea8e39ba4fc22a437efe835dedd02cdeedbd662abdb66c9b4f3c28318951d19bf7824347f9958b528066d213c180b
7
+ data.tar.gz: 269da7a4d986f1f38963333ae3b3c8b541e20bcb3b9ad744fe57d622bcb21cf3f290f2ad1854e23504306418c759704ad66a9bf297a77fd5b8a437bbde727cf3
@@ -22,7 +22,7 @@ env:
22
22
  - NOKOGIRI_USE_SYSTEM_LIBRARIES=true
23
23
  matrix:
24
24
  - "RAILS_VERSION=4.2.7.1"
25
- - "RAILS_VERSION=5.0.0.1"
25
+ - "RAILS_VERSION=5.0.1"
26
26
  notifications:
27
27
  irc:
28
28
  channels:
data/README.md CHANGED
@@ -26,9 +26,9 @@ Jump in: [![Slack Status](http://slack.projecthydra.org/badge.svg)](http://slack
26
26
  * [Derivatives](#derivatives)
27
27
  * [Environments](#environments)
28
28
  * [Ruby](#ruby)
29
- * [Creating a Sufia\-based app](#creating-a-sufia-based-app)
30
29
  * [Redis](#redis)
31
30
  * [Rails](#rails)
31
+ * [Creating a Sufia\-based app](#creating-a-sufia-based-app)
32
32
  * [Generate a primary work type](#generate-a-primary-work-type)
33
33
  * [Start servers](#start-servers)
34
34
  * [Managing a Sufia\-based app](#managing-a-sufia-based-app)
@@ -55,7 +55,7 @@ If you have questions or need help, please email [the Hydra community tech list]
55
55
  # Getting started
56
56
 
57
57
  This document contains instructions specific to setting up an app with __Sufia
58
- v7.2.0__. If you are looking for instructions on installing a different
58
+ v7.3.0__. If you are looking for instructions on installing a different
59
59
  version, be sure to select the appropriate branch or tag from the drop-down
60
60
  menu above.
61
61
 
@@ -105,8 +105,6 @@ First, you'll need a working Ruby installation. You can install this via your op
105
105
 
106
106
  We recommend either Ruby 2.3 or the latest 2.2 version.
107
107
 
108
- # Creating a Sufia-based app
109
-
110
108
  ## Redis
111
109
 
112
110
  [Redis](http://redis.io/) is a key-value store that Sufia uses to provide activity streams on repository objects and users, and to prevent race conditions as a global mutex when modifying order-persisting objects.
@@ -114,12 +112,18 @@ We recommend either Ruby 2.3 or the latest 2.2 version.
114
112
  Starting up Redis will depend on your operating system, and may in fact already be started on your system. You may want to consult the [Redis documentation](http://redis.io/documentation) for help doing this.
115
113
 
116
114
  ## Rails
117
-
118
- Generate a new Rails application. We recommend the latest Rails 5.0 or 4.2 release.
115
+ We recommend the latest Rails 5.0 release.
119
116
 
120
117
  ```
121
118
  # If you don't already have Rails at your disposal...
122
- gem install rails -v 5.0.0.1
119
+ gem install rails -v 5.0.1
120
+ ```
121
+
122
+ # Creating a Sufia-based app
123
+
124
+ Generate a new Rails application using the template.
125
+
126
+ ```
123
127
  rails new my_app -m https://raw.githubusercontent.com/projecthydra/sufia/master/template.rb
124
128
  ```
125
129
 
@@ -17,8 +17,15 @@ module Sufia
17
17
  private
18
18
 
19
19
  def ensure_admin_set_attribute!(attributes)
20
- return if attributes[:admin_set_id].present?
21
- attributes[:admin_set_id] = default_admin_set_id
20
+ if attributes[:admin_set_id].present?
21
+ ensure_permission_template!(admin_set_id: attributes[:admin_set_id])
22
+ else
23
+ attributes[:admin_set_id] = default_admin_set_id
24
+ end
25
+ end
26
+
27
+ def ensure_permission_template!(admin_set_id:)
28
+ Sufia::PermissionTemplate.find_or_create_by!(admin_set_id: admin_set_id)
22
29
  end
23
30
 
24
31
  DEFAULT_ID = 'admin_set/default'.freeze
@@ -56,7 +56,7 @@
56
56
  // state == true for on
57
57
  function select_page ( state) {
58
58
  // check everything on the current page on or off based on state
59
- $("#check_all").attr('checked', state);
59
+ $("#check_all").prop('checked', state);
60
60
  check_all_page();
61
61
  }
62
62
 
@@ -123,7 +123,7 @@ ul.collapsing > li > a {
123
123
  padding-left: 40px;
124
124
  }
125
125
 
126
- .collapse-toggle {
126
+ .admin-sidebar .collapse-toggle {
127
127
  margin-bottom: 0;
128
128
 
129
129
  &::after {
@@ -113,7 +113,14 @@ input.batch_document_selector {
113
113
 
114
114
  input#check_all {
115
115
  padding: 0;
116
- margin: 3px 3px 3px 10px;
116
+ margin: 3px 0 3px 10px;
117
+ }
118
+
119
+ .check-all {
120
+ white-space: nowrap;
121
+ .caret {
122
+ margin-left: 0;
123
+ }
117
124
  }
118
125
 
119
126
  .constraints-container {
@@ -18,3 +18,5 @@
18
18
  transition: background-color 0.1s ease-out;
19
19
  }
20
20
  }
21
+
22
+ .files .name span { word-break: break-all; }
@@ -3,6 +3,7 @@ module Sufia
3
3
  extend ActiveSupport::Concern
4
4
  included do
5
5
  before_action :build_contact_form
6
+ layout 'homepage'
6
7
  end
7
8
 
8
9
  def new
@@ -1,4 +1,6 @@
1
1
  class PagesController < ApplicationController
2
+ layout 'homepage'
3
+
2
4
  def show
3
5
  @page = ContentBlock.find_or_create_by(name: params[:id])
4
6
  end
@@ -2,11 +2,17 @@ module Sufia
2
2
  module Admin
3
3
  class FeaturesController < Flipflop::FeaturesController
4
4
  layout 'admin'
5
+
5
6
  before_action do
6
7
  authorize! :manage, Sufia::Feature
8
+ end
9
+
10
+ # overriding so we can have a layout https://github.com/voormedia/flipflop/issues/18
11
+ def index
7
12
  add_breadcrumb t(:'sufia.controls.home'), root_path
8
13
  add_breadcrumb t(:'sufia.toolbar.admin.menu'), sufia.admin_path
9
14
  add_breadcrumb t(:'sufia.admin.sidebar.settings'), sufia.admin_features_path
15
+ super
10
16
  end
11
17
  end
12
18
  end
@@ -1,22 +1,7 @@
1
1
  module Sufia
2
2
  module Workflow
3
- class CompleteNotification < AbstractNotification
4
- protected
5
-
6
- def subject
7
- 'Deposit has been approved'
8
- end
9
-
10
- def message
11
- "#{title} (#{work_id}) was approved by #{user.user_key}. #{comment}"
12
- end
13
-
14
- private
15
-
16
- def users_to_notify
17
- user_key = ActiveFedora::Base.find(work_id).depositor
18
- super << ::User.find_by(email: user_key)
19
- end
3
+ class CompleteNotification < DepositedNotification
4
+ deprecation_deprecate initialize: "use DepositedNotification.initialize instead"
20
5
  end
21
6
  end
22
7
  end
@@ -0,0 +1,22 @@
1
+ module Sufia
2
+ module Workflow
3
+ class DepositedNotification < AbstractNotification
4
+ protected
5
+
6
+ def subject
7
+ 'Deposit has been approved'
8
+ end
9
+
10
+ def message
11
+ "#{title} (#{work_id}) was approved by #{user.user_key}. #{comment}"
12
+ end
13
+
14
+ private
15
+
16
+ def users_to_notify
17
+ user_key = ActiveFedora::Base.find(work_id).depositor
18
+ super << ::User.find_by(email: user_key)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -6,10 +6,18 @@ module Sufia
6
6
  base_path + "#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
7
7
  end
8
8
 
9
+ def cache_dir
10
+ cache_path + "#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
11
+ end
12
+
9
13
  private
10
14
 
11
15
  def base_path
12
16
  Sufia.config.upload_path.call
13
17
  end
18
+
19
+ def cache_path
20
+ Sufia.config.cache_path.call
21
+ end
14
22
  end
15
23
  end
@@ -1,7 +1,7 @@
1
1
  <div class="dropdown batch_document_selector_all" >
2
2
  <%= check_box_tag 'check_all', 'yes', @all_checked, disabled: @disable_select_all %>
3
3
  <% if !@disable_select_all %>
4
- <a class="dropdown-toggle" data-toggle="dropdown" href="#"><span class="sr-only">Select to access selection options</span><span class="glyphicon glyphicon-cog"></span></a>
4
+ <a class="dropdown-toggle" data-toggle="dropdown" href="#"><span class="sr-only">Select to access selection options</span><span class="caret"></span></a>
5
5
  <ul class="dropdown-menu">
6
6
  <%= render "batch_edits_actions" %>
7
7
  </ul>
@@ -1,5 +1,6 @@
1
1
  <%= form_tag search_form_action, method: :get, id: "search-form-header", role: "search" do %>
2
2
  <%= render_hash_as_hidden_fields(search_state.params_for_search.except(:q, :search_field, :qt, :page, :utf8)) %>
3
+ <%= hidden_field_tag :search_field, 'all_fields' %>
3
4
  <div class="input-group">
4
5
 
5
6
  <label class="sr-only" for="search-field-header"><%= t("sufia.search.form.q.label") %></label>
@@ -1,6 +1,5 @@
1
1
  <%= presenter.attribute_to_html(:creator, render_as: :faceted) %>
2
2
  <%= presenter.attribute_to_html(:contributor, render_as: :faceted) %>
3
- <%= presenter.attribute_to_html(:admin_set, render_as: :faceted) %>
4
3
  <%= presenter.attribute_to_html(:subject, render_as: :faceted) %>
5
4
  <%= presenter.attribute_to_html(:publisher, render_as: :faceted) %>
6
5
  <%= presenter.attribute_to_html(:language, render_as: :faceted) %>
@@ -21,3 +21,5 @@
21
21
  <% end %>
22
22
  <% end %>
23
23
  <% end %>
24
+
25
+ <%= presenter.attribute_to_html(:admin_set, render_as: :faceted) %>
@@ -1,2 +1,6 @@
1
- <li data-behavior="batch-edit-select-none" data-state="on"><a href="#"><i class="glyphicon glyphicon-ok"></i> Select None</a></li>
2
- <li data-behavior="batch-edit-select-page" data-state="off"><a href="#"><i class=""></i> Select Current Page</a></li>
1
+ <li data-behavior="batch-edit-select-page" data-state="off">
2
+ <a href="#"><%= t("sufia.dashboard.my.action.select_all") %></a>
3
+ </li>
4
+ <li data-behavior="batch-edit-select-none" data-state="on">
5
+ <a href="#"><%= t("sufia.dashboard.my.action.select_none") %></a>
6
+ </li>
@@ -3,7 +3,7 @@
3
3
  <% unless params[:display_type] == 'list' %>
4
4
  <thead>
5
5
  <tr>
6
- <th><label for="check_all" class="sr-only"><%= t("sufia.dashboard.my.sr.check_all_label") %></label><%= render_check_all %></th>
6
+ <th class="check-all"><label for="check_all" class="sr-only"><%= t("sufia.dashboard.my.sr.check_all_label") %></label><%= render_check_all %></th>
7
7
  <th><%= t("sufia.dashboard.my.heading.title") %></th>
8
8
  <th class="sorts-dash"><i id="<%= CatalogController.uploaded_field %>" class="<%= params[:sort] == "#{CatalogController.uploaded_field} desc" ? 'caret' : params[:sort] == "#{CatalogController.uploaded_field} asc" ? 'caret up' : ''%>"></i><%= t("sufia.dashboard.my.heading.date_uploaded") %></th>
9
9
  <th><%= t("sufia.dashboard.my.heading.visibility") %></th>
@@ -1,4 +1,4 @@
1
- <ul class="nav nav-pills nav-stacked">
1
+ <ul class="admin-sidebar nav nav-pills nav-stacked">
2
2
  <li class="<%= 'active' if current_page? sufia.admin_stats_path %>">
3
3
  <%= link_to sufia.admin_stats_path do %>
4
4
  <span class="fa fa-bar-chart"></span> <%= t('sufia.admin.sidebar.statistics') %>
@@ -16,7 +16,18 @@
16
16
  </tr>
17
17
  </thead>
18
18
  <tbody>
19
- <% @feature_set.features.each do |feature| -%>
19
+ <% @feature_set.grouped_features.each do |group, features| -%>
20
+ <% if @feature_set.grouped? -%>
21
+ <tr class="group">
22
+ <td></td>
23
+ <td class="name" colspan="<%= 2 + @feature_set.strategies.size -%>">
24
+ <h2>
25
+ <%= t(group ? group.name : :default, scope: [:flipflop, :groups], default: group ? group.title : nil) -%>
26
+ </h2>
27
+ </td>
28
+ </tr>
29
+ <% end -%>
30
+ <% features.each do |feature| %>
20
31
  <tr data-feature="<%= feature.name.dasherize.parameterize %>">
21
32
  <td class="status">
22
33
  <span class="<%= @feature_set.status(feature) -%>"><%= @feature_set.status(feature) -%></span>
@@ -47,6 +58,7 @@
47
58
  </td>
48
59
  <% end -%>
49
60
  </tr>
61
+ <% end -%>
50
62
  <% end -%>
51
63
  </tbody>
52
64
  </table>
@@ -4,12 +4,12 @@
4
4
 
5
5
  <div class="list-group-item">
6
6
  <span class="badge"><%= number_of_collections(user) %></span>
7
- <span class="glyphicon glyphicon-folder-open"></span> <%= link_to_field('depositor', user.to_s, t("sufia.dashboard.stats.collections"), human_readable_type: "Collection") %>
7
+ <span class="glyphicon glyphicon-folder-open"></span> <%= link_to_field('depositor', user.to_s, t("sufia.dashboard.stats.collections"), generic_type: "Collection") %>
8
8
  </div>
9
9
 
10
10
  <div class="list-group-item">
11
11
  <span class="badge"><%= number_of_works(user) %></span>
12
- <span class="glyphicon glyphicon-upload"></span> <%= link_to_field('depositor', user.to_s, t("sufia.dashboard.stats.works"), human_readable_type: "Work") %>
12
+ <span class="glyphicon glyphicon-upload"></span> <%= link_to_field('depositor', user.to_s, t("sufia.dashboard.stats.works"), generic_type: "Work") %>
13
13
 
14
14
  <ul class="views-downloads-dashboard list-unstyled">
15
15
  <li><span class="badge badge-optional"><%= user.total_file_views %></span> <%= t("sufia.dashboard.stats.file_views").pluralize(user.total_file_views) %></li>
@@ -197,6 +197,8 @@ en:
197
197
  transfer: "Transfer Ownership of Work"
198
198
  work_confirmation: "Deleting a work from %{application_name} is permanent. Click OK to delete this work from %{application_name}, or Cancel to cancel this operation"
199
199
  collection_confirmation: "Deleting a collection from %{application_name} is permanent. Click OK to delete this collection from %{application_name}, or Cancel to cancel this operation"
200
+ select_all: "Select Current Page"
201
+ select_none: "Select None"
200
202
 
201
203
  messages:
202
204
  success:
@@ -240,7 +242,7 @@ en:
240
242
  works:
241
243
  create:
242
244
  header: "Add New %{type}"
243
- after_create_html: "Your files are being processed by %{application_name} in the background. The metadata and access controls you specified are being applied. Files will be marked <span class=\"label label-danger\" title=\"Private\">Private</span> until this process is complete (shouldn't take too long, hang in there!). You may need to refresh this page to see these updates."
245
+ after_create_html: "Your files are being processed by %{application_name} in the background. The metadata and access controls you specified are being applied. You may need to refresh this page to see these updates."
244
246
  edit:
245
247
  breadcrumb: 'Edit'
246
248
  form:
@@ -311,7 +313,7 @@ en:
311
313
  show:
312
314
  download: "Download the file"
313
315
  footer:
314
- copyright_html: "<strong>Copyright &copy; 2016 Project Hydra</strong> Licensed under the Apache License, Version 2.0"
316
+ copyright_html: "<strong>Copyright &copy; 2017 Project Hydra</strong> Licensed under the Apache License, Version 2.0"
315
317
  admin:
316
318
  admin_sets:
317
319
  edit:
@@ -504,6 +506,7 @@ en:
504
506
  search:
505
507
  fields:
506
508
  show:
509
+ admin_set: "In Admin Set:"
507
510
  based_near: Location
508
511
  contributor: Contributors
509
512
  keyword: Keyword
@@ -46,6 +46,10 @@ class CatalogController < ApplicationController
46
46
  config.add_facet_field solr_name("publisher", :facetable), label: "Publisher", limit: 5
47
47
  config.add_facet_field solr_name("file_format", :facetable), label: "File Format", limit: 5
48
48
 
49
+ # The generic_type isn't displayed on the facet list
50
+ # It's used to give a label to the filter that comes from the user profile
51
+ config.add_facet_field solr_name("generic_type", :facetable), label: "Type", if: false
52
+
49
53
  # Have BL send all facet field names to Solr, which has been the default
50
54
  # previously. Simply remove these lines if you'd rather use Solr request
51
55
  # handler defaults, or have no facets.
@@ -8,4 +8,4 @@ en:
8
8
  directory:
9
9
  suffix: "@example.org"
10
10
  footer:
11
- copyright_html: "<strong>Copyright &copy; 2016 Project Hydra</strong> Licensed under the Apache License, Version 2.0"
11
+ copyright_html: "<strong>Copyright &copy; 2017 Project Hydra</strong> Licensed under the Apache License, Version 2.0"
@@ -93,8 +93,9 @@ Sufia.config do |config|
93
93
  # config.banner_image = 'https://cloud.githubusercontent.com/assets/92044/18370978/88ecac20-75f6-11e6-8399-6536640ef695.jpg'
94
94
 
95
95
  # Temporary path to hold uploads before they are ingested into FCrepo.
96
- # This must be a lambda that returns a Pathname
96
+ # These must be lambdas that return a Pathname. Can be configured separately
97
97
  # config.upload_path = ->() { Rails.root + 'tmp' + 'uploads' }
98
+ # config.cache_path = ->() { Rails.root + 'tmp' + 'uploads' + 'cache' }
98
99
 
99
100
  # Location on local file system where derivatives will be stored.
100
101
  # If you use a multi-server architecture, this MUST be a shared volume.
@@ -21,7 +21,7 @@
21
21
  ]
22
22
  }, {
23
23
  "name": "request_changes",
24
- "from_states": [{"names": ["complete", "pending_review"], "roles": ["approving"]}],
24
+ "from_states": [{"names": ["deposited", "pending_review"], "roles": ["approving"]}],
25
25
  "transition_to": "changes_required",
26
26
  "notifications": [
27
27
  {
@@ -36,11 +36,11 @@
36
36
  }, {
37
37
  "name": "approve",
38
38
  "from_states": [{"names": ["pending_review"], "roles": ["approving"]}],
39
- "transition_to": "complete",
39
+ "transition_to": "deposited",
40
40
  "notifications": [
41
41
  {
42
42
  "notification_type": "email",
43
- "name": "Sufia::Workflow::CompleteNotification",
43
+ "name": "Sufia::Workflow::DepositedNotification",
44
44
  "to": ["approving"]
45
45
  }
46
46
  ],
@@ -58,6 +58,12 @@
58
58
  "to": ["approving"]
59
59
  }
60
60
  ]
61
+ }, {
62
+ "name": "comment_only",
63
+ "from_states": [
64
+ { "names": ["pending_review", "deposited"], "roles": ["approving"] },
65
+ { "names": ["changes_required"], "roles": ["depositing"] }
66
+ ]
61
67
  }
62
68
  ]
63
69
  }
@@ -84,12 +84,16 @@ module Sufia
84
84
  @audit_user_key ||= 'audituser@example.com'
85
85
  end
86
86
 
87
- # TODO: this is called working_path in curation_concerns
88
87
  attr_writer :upload_path
89
88
  def upload_path
90
89
  @upload_path ||= ->() { Rails.root + 'tmp' + 'uploads' }
91
90
  end
92
91
 
92
+ attr_writer :cache_path
93
+ def cache_path
94
+ @cache_path ||= ->() { Rails.root + 'tmp' + 'uploads' + 'cache' }
95
+ end
96
+
93
97
  # Should a button with "Share my work" show on the front page to all users (even those not logged in)?
94
98
  attr_writer :always_display_share_button
95
99
  def always_display_share_button
@@ -35,8 +35,8 @@ module Sufia
35
35
  end
36
36
 
37
37
  initializer 'configure' do
38
- # Set the path for the flipflop config:
39
- Flipflop::Engine.config_file = Sufia::Engine.root + "config/features.rb"
38
+ # Allow flipflop to load config/features.rb from the Hyrax gem:
39
+ Flipflop::FeatureLoader.current.append(self)
40
40
 
41
41
  Sufia.config.tap do |c|
42
42
  Hydra::Derivatives.ffmpeg_path = c.ffmpeg_path
@@ -1,3 +1,3 @@
1
1
  module Sufia
2
- VERSION = '7.3.0.rc1'.freeze
2
+ VERSION = '7.3.0.rc2'.freeze
3
3
  end
@@ -4,5 +4,23 @@ namespace :sufia do
4
4
  require 'sufia/move_all_works_to_admin_set'
5
5
  MoveAllWorksToAdminSet.run(AdminSet.find(Sufia::DefaultAdminSetActor::DEFAULT_ID))
6
6
  end
7
+
8
+ desc "Migrate data from 7.2.x to 7.3.0"
9
+ task from_7_2_x_to_7_3_0_release: :environment do
10
+ logger = Logger.new(STDOUT)
11
+ logger.level = Logger::DEBUG
12
+ logger.info(%(Starting migration to Sufia 7.3.0 in preparation for Hyrax 1.0.0))
13
+ Sipity::Workflow.transaction do
14
+ logger.info(%(Migrating "complete" state to "deposited" state for all "one_step_mediated_deposit" workflows. See https://github.com/projecthydra/sufia/commit/711bb49892aa54fe190a45434f6b2d0364d69c7a for changes))
15
+ Sipity::Workflow.where(name: 'one_step_mediated_deposit').each do |workflow|
16
+ workflow.workflow_states.where(name: 'complete').each do |state|
17
+ logger.info(%(Updating name for #{state.class} ID=#{state.id} from 'complete' to 'deposited'))
18
+ state.update!(name: 'deposited')
19
+ end
20
+ end
21
+ end
22
+
23
+ logger.info(%(Completed migration to Sufia 7.3.0))
24
+ end
7
25
  end
8
26
  end
@@ -34,9 +34,11 @@ RSpec.describe Sufia::DefaultAdminSetActor do
34
34
  context "when admin_set_id is provided" do
35
35
  let(:attributes) { { admin_set_id: admin_set.id } }
36
36
 
37
- it "uses the provided id and returns true" do
37
+ it "uses the provided id, ensures a permission template, and returns true" do
38
38
  expect(next_actor).to receive(:create).with(attributes).and_return(true)
39
- expect(actor.create(attributes)).to be true
39
+ expect do
40
+ expect(actor.create(attributes)).to be true
41
+ end.to change { Sufia::PermissionTemplate.count }.by(1)
40
42
  end
41
43
  end
42
44
  end
@@ -122,7 +122,7 @@ describe CurationConcerns::GenericWorksController do
122
122
  },
123
123
  uploaded_files: ['777', '888']
124
124
  }
125
- expect(flash[:notice]).to eq "Your files are being processed by Sufia in the background. The metadata and access controls you specified are being applied. Files will be marked <span class=\"label label-danger\" title=\"Private\">Private</span> until this process is complete (shouldn't take too long, hang in there!). You may need to refresh this page to see these updates."
125
+ expect(flash[:notice]).to eq "Your files are being processed by Sufia in the background. The metadata and access controls you specified are being applied. You may need to refresh this page to see these updates."
126
126
  expect(response).to redirect_to main_app.curation_concerns_generic_work_path(work)
127
127
  end
128
128
 
@@ -182,7 +182,7 @@ describe CurationConcerns::GenericWorksController do
182
182
  parent_id: work.id,
183
183
  generic_work: { title: ['First title'] }
184
184
  }
185
- expect(flash[:notice]).to eq "Your files are being processed by Sufia in the background. The metadata and access controls you specified are being applied. Files will be marked <span class=\"label label-danger\" title=\"Private\">Private</span> until this process is complete (shouldn't take too long, hang in there!). You may need to refresh this page to see these updates."
185
+ expect(flash[:notice]).to eq "Your files are being processed by Sufia in the background. The metadata and access controls you specified are being applied. You may need to refresh this page to see these updates."
186
186
  expect(response).to redirect_to main_app.curation_concerns_generic_work_path(work)
187
187
  end
188
188
  end
@@ -120,7 +120,7 @@ describe 'Batch management of works', type: :feature do
120
120
 
121
121
  def fill_in_field_wait(id)
122
122
  within "#form_#{id}" do
123
- expect(page).to have_content 'Changes Saved', wait: Capybara.default_max_wait_time * 4
123
+ expect(page).to have_content 'Changes Saved', wait: Capybara.default_max_wait_time * 5
124
124
  end
125
125
  end
126
126
 
@@ -1,5 +1,6 @@
1
1
  describe BatchEditsHelper, type: :helper do
2
2
  describe "#render_check_all" do
3
+ subject { helper.render_check_all }
3
4
  before do
4
5
  view.lookup_context.prefixes = ['my']
5
6
  end
@@ -7,28 +8,34 @@ describe BatchEditsHelper, type: :helper do
7
8
  context "with my works" do
8
9
  it "shows the check all dropdown" do
9
10
  allow(controller).to receive(:params).and_return(controller: "my/works")
10
- expect(helper.render_check_all).to have_css("span.glyphicon-cog")
11
+ expect(subject).to have_css("span.caret")
12
+ expect(subject).to have_content t("sufia.dashboard.my.action.select_all")
13
+ expect(subject).to have_content t("sufia.dashboard.my.action.select_none")
11
14
  end
12
15
  end
13
16
 
14
17
  context "with my shares" do
15
18
  it "shows the check all dropdown" do
16
19
  allow(controller).to receive(:params).and_return(controller: "my/shares")
17
- expect(helper.render_check_all).to have_css("span.glyphicon-cog")
20
+ expect(subject).to have_css("span.caret")
21
+ expect(subject).to have_content t("sufia.dashboard.my.action.select_all")
22
+ expect(subject).to have_content t("sufia.dashboard.my.action.select_none")
18
23
  end
19
24
  end
20
25
 
21
26
  context "with my highlights" do
22
27
  it "shows the check all dropdown" do
23
28
  allow(controller).to receive(:params).and_return(controller: "my/shares")
24
- expect(helper.render_check_all).to have_css("span.glyphicon-cog")
29
+ expect(subject).to have_css("span.caret")
30
+ expect(subject).to have_content t("sufia.dashboard.my.action.select_all")
31
+ expect(subject).to have_content t("sufia.dashboard.my.action.select_none")
25
32
  end
26
33
  end
27
34
 
28
35
  context "with my collections" do
29
36
  it "does not show the check all dropdown" do
30
37
  allow(controller).to receive(:params).and_return(controller: "my/collections")
31
- expect(helper.render_check_all).to be_nil
38
+ expect(subject).to be_nil
32
39
  end
33
40
  end
34
41
 
@@ -36,7 +43,7 @@ describe BatchEditsHelper, type: :helper do
36
43
  it "does not show the check all dropdown" do
37
44
  allow(helper).to receive(:params).and_return(controller: "foo")
38
45
  assign(:disable_select_all, true)
39
- expect(helper.render_check_all).to have_css("input[disabled=disabled]")
46
+ expect(subject).to have_css("input[disabled=disabled]")
40
47
  end
41
48
  end
42
49
  end
@@ -16,6 +16,7 @@ describe Sufia::Configuration do
16
16
  it { is_expected.to respond_to(:batch_user_key) }
17
17
  it { is_expected.to respond_to(:audit_user_key) }
18
18
  it { is_expected.to respond_to(:upload_path) }
19
+ it { is_expected.to respond_to(:cache_path) }
19
20
  it { is_expected.to respond_to(:always_display_share_button) }
20
21
  it { is_expected.to respond_to(:google_analytics_id) }
21
22
  it { is_expected.to respond_to(:analytic_start_date) }
@@ -1,32 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe Sufia::Workflow::CompleteNotification do
4
- let(:approver) { create(:user) }
5
- let(:depositor) { create(:user) }
6
- let(:to_user) { create(:user) }
7
- let(:cc_user) { create(:user) }
8
- let(:work) { create(:generic_work, user: depositor) }
9
- let(:entity) { create(:sipity_entity, proxy_for_global_id: work.to_global_id.to_s) }
10
- let(:comment) { double("comment", comment: 'A pleasant read') }
11
- let(:recipients) { { 'to' => [to_user], 'cc' => [cc_user] } }
12
-
13
- describe ".send_notification" do
14
- it 'sends a message to all users' do
15
- expect(approver).to receive(:send_message).once.and_call_original
16
-
17
- expect { described_class.send_notification(entity: entity, user: approver, comment: comment, recipients: recipients) }
18
- .to change { depositor.mailbox.inbox.count }.by(1)
19
- .and change { to_user.mailbox.inbox.count }.by(1)
20
- .and change { cc_user.mailbox.inbox.count }.by(1)
21
- end
22
- context 'without carbon-copied users' do
23
- let(:recipients) { { 'to' => [to_user] } }
24
- it 'sends a message to the to user(s)' do
25
- expect(approver).to receive(:send_message).once.and_call_original
26
- expect { described_class.send_notification(entity: entity, user: approver, comment: comment, recipients: recipients) }
27
- .to change { depositor.mailbox.inbox.count }.by(1)
28
- .and change { to_user.mailbox.inbox.count }.by(1)
29
- end
30
- end
4
+ let(:entity) { double(:sipity_entity, proxy_for_global_id: '1234', proxy_for: double(title: 'title')) }
5
+ let(:comment) { nil }
6
+ it 'is deprecated' do
7
+ expect(Deprecation).to receive(:warn).with(described_class, /^initialize is deprecated/, kind_of(Array))
8
+ described_class.new(entity, nil, double, {})
31
9
  end
32
10
  end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Sufia::Workflow::DepositedNotification do
4
+ let(:approver) { create(:user) }
5
+ let(:depositor) { create(:user) }
6
+ let(:to_user) { create(:user) }
7
+ let(:cc_user) { create(:user) }
8
+ let(:work) { create(:generic_work, user: depositor) }
9
+ let(:entity) { create(:sipity_entity, proxy_for_global_id: work.to_global_id.to_s) }
10
+ let(:comment) { double("comment", comment: 'A pleasant read') }
11
+ let(:recipients) { { 'to' => [to_user], 'cc' => [cc_user] } }
12
+
13
+ describe ".send_notification" do
14
+ it 'sends a message to all users' do
15
+ expect(approver).to receive(:send_message).once.and_call_original
16
+
17
+ expect { described_class.send_notification(entity: entity, user: approver, comment: comment, recipients: recipients) }
18
+ .to change { depositor.mailbox.inbox.count }.by(1)
19
+ .and change { to_user.mailbox.inbox.count }.by(1)
20
+ .and change { cc_user.mailbox.inbox.count }.by(1)
21
+ end
22
+ context 'without carbon-copied users' do
23
+ let(:recipients) { { 'to' => [to_user] } }
24
+ it 'sends a message to the to user(s)' do
25
+ expect(approver).to receive(:send_message).once.and_call_original
26
+ expect { described_class.send_notification(entity: entity, user: approver, comment: comment, recipients: recipients) }
27
+ .to change { depositor.mailbox.inbox.count }.by(1)
28
+ .and change { to_user.mailbox.inbox.count }.by(1)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -52,7 +52,7 @@ Capybara.default_max_wait_time = ENV['TRAVIS'] ? 30 : 15
52
52
  # Found in this thread: https://github.com/teampoltergeist/poltergeist/issues/375
53
53
  poltergeist_options = {
54
54
  js_errors: true,
55
- timeout: 30,
55
+ timeout: 60,
56
56
  logger: nil,
57
57
  phantomjs_logger: StringIO.new,
58
58
  phantomjs_options: [
@@ -1,5 +1,4 @@
1
1
  # Use this file to reference specific commits of gems.
2
- gem 'flipflop', git: 'https://github.com/jcoyne/flipflop.git', branch: 'hydra'
3
2
 
4
3
  group :development do
5
4
  gem 'better_errors'
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'catalog/_search_form.html.erb', type: :view do
4
+ before do
5
+ allow(view).to receive(:search_form_action).and_return("/catalog")
6
+ allow(view).to receive(:search_state).and_return(search_state)
7
+ allow(view).to receive(:current_search_parameters).and_return(nil)
8
+ allow(view).to receive(:current_user).and_return(nil)
9
+
10
+ render
11
+ end
12
+ let(:search_state) { double('SearchState', params_for_search: {}) }
13
+ let(:page) { Capybara::Node::Simple.new(rendered) }
14
+
15
+ it "has a hidden search_field input" do
16
+ expect(page).to have_selector("[name='search_field'][value='all_fields']", visible: false)
17
+ end
18
+ end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe 'curation_concerns/base/relationships', type: :view do
4
4
  let(:ability) { double }
5
- let(:solr_doc) { double(id: '123', human_readable_type: 'Work') }
5
+ let(:solr_doc) { double(id: '123', human_readable_type: 'Work', admin_set: nil) }
6
6
  let(:presenter) { Sufia::WorkShowPresenter.new(solr_doc, ability) }
7
7
  let(:generic_work) { GenericWork.new(id: '456', title: ['Containing work']) }
8
8
  let(:collection) { Collection.new(id: '345', title: ['Containing collection']) }
@@ -86,4 +86,12 @@ describe 'curation_concerns/base/relationships', type: :view do
86
86
  expect(page).not_to have_content "There are no Generic work relationships."
87
87
  end
88
88
  end
89
+
90
+ context 'with admin sets' do
91
+ it 'renders using attribute_to_html' do
92
+ allow(solr_doc).to receive(:member_of_collection_ids).and_return([])
93
+ expect(presenter).to receive(:attribute_to_html).with(:admin_set, render_as: :faceted)
94
+ render 'curation_concerns/base/relationships', presenter: presenter
95
+ end
96
+ end
89
97
  end
@@ -0,0 +1,14 @@
1
+ describe "sufia/admin/features/index.html.erb", type: :view do
2
+ let(:ability) { instance_double("Ability") }
3
+ let(:feature_set) do
4
+ Flipflop::FeaturesController::FeaturesPresenter.new(Flipflop::FeatureSet.current)
5
+ end
6
+ before do
7
+ allow(controller).to receive(:current_ability).and_return(ability)
8
+ assign(:feature_set, feature_set)
9
+ end
10
+ it "shows list of features" do
11
+ render
12
+ expect(rendered).to have_content('enabled')
13
+ end
14
+ end
@@ -6,7 +6,7 @@ require 'sufia/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.authors = ["Justin Coyne", 'Michael J. Giarlo', "Carolyn Cole", "Matt Zumwalt", 'Jeremy Friesen']
8
8
  spec.email = ["justin@curationexperts.com", 'leftwing@alumni.rutgers.edu', "jeremy.n.friesen@gmail.com"]
9
- spec.description = 'Sufia extends the robust Hydra framework to provide a user interface around common repository features and social features. Sufia offers self-deposit and proxy deposit workflows with plans to develop one or more mediated deposit workflows in 2016. Sufia delivers its rich and growing set of features via a modern, responsive UI'
9
+ spec.description = 'Sufia extends the robust Hydra framework to provide a user interface around common repository features and social features. Sufia offers self-deposit, proxy deposit, and configurable mediated deposit workflows. Sufia delivers its rich and growing set of features via a modern, responsive UI'
10
10
  spec.summary = "Sufia was originally extracted from ScholarSphere developed by Penn State University. It's now used and maintained by an active community of adopters."
11
11
  spec.homepage = "http://sufia.io/"
12
12
 
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.version = Sufia::VERSION
19
19
  spec.license = 'Apache2'
20
20
 
21
- spec.add_dependency 'curation_concerns', '~> 1.7.4'
21
+ spec.add_dependency 'curation_concerns', '~> 1.7.5'
22
22
  spec.add_dependency 'hydra-head', '>= 10.4.0'
23
23
  spec.add_dependency 'hydra-batch-edit', '~> 2.0'
24
24
  spec.add_dependency 'browse-everything', '>= 0.10.3'
@@ -44,7 +44,7 @@ Gem::Specification.new do |spec|
44
44
  spec.add_dependency 'flot-rails', '~> 0.0.6'
45
45
  spec.add_dependency 'almond-rails', '~> 0.0.1'
46
46
  spec.add_dependency 'qa', '~> 0.8' # questioning_authority
47
- spec.add_dependency 'flipflop', '~> 2.2'
47
+ spec.add_dependency 'flipflop', '~> 2.3'
48
48
  spec.add_dependency 'jquery-datatables-rails', '~> 3.4.0'
49
49
  spec.add_dependency 'rdf-rdfxml'
50
50
 
@@ -1,5 +1,4 @@
1
- gem 'sufia', '7.2.0'
2
- gem 'flipflop', github: 'jcoyne/flipflop', branch: 'hydra'
1
+ gem 'sufia', '7.3.0.rc1'
3
2
 
4
3
  run 'bundle install'
5
4
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sufia
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.3.0.rc1
4
+ version: 7.3.0.rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Coyne
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2017-02-09 00:00:00.000000000 Z
15
+ date: 2017-03-02 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: curation_concerns
@@ -20,14 +20,14 @@ dependencies:
20
20
  requirements:
21
21
  - - "~>"
22
22
  - !ruby/object:Gem::Version
23
- version: 1.7.4
23
+ version: 1.7.5
24
24
  type: :runtime
25
25
  prerelease: false
26
26
  version_requirements: !ruby/object:Gem::Requirement
27
27
  requirements:
28
28
  - - "~>"
29
29
  - !ruby/object:Gem::Version
30
- version: 1.7.4
30
+ version: 1.7.5
31
31
  - !ruby/object:Gem::Dependency
32
32
  name: hydra-head
33
33
  requirement: !ruby/object:Gem::Requirement
@@ -384,14 +384,14 @@ dependencies:
384
384
  requirements:
385
385
  - - "~>"
386
386
  - !ruby/object:Gem::Version
387
- version: '2.2'
387
+ version: '2.3'
388
388
  type: :runtime
389
389
  prerelease: false
390
390
  version_requirements: !ruby/object:Gem::Requirement
391
391
  requirements:
392
392
  - - "~>"
393
393
  - !ruby/object:Gem::Version
394
- version: '2.2'
394
+ version: '2.3'
395
395
  - !ruby/object:Gem::Dependency
396
396
  name: jquery-datatables-rails
397
397
  requirement: !ruby/object:Gem::Requirement
@@ -665,10 +665,9 @@ dependencies:
665
665
  - !ruby/object:Gem::Version
666
666
  version: '0'
667
667
  description: Sufia extends the robust Hydra framework to provide a user interface
668
- around common repository features and social features. Sufia offers self-deposit
669
- and proxy deposit workflows with plans to develop one or more mediated deposit workflows
670
- in 2016. Sufia delivers its rich and growing set of features via a modern, responsive
671
- UI
668
+ around common repository features and social features. Sufia offers self-deposit,
669
+ proxy deposit, and configurable mediated deposit workflows. Sufia delivers its rich
670
+ and growing set of features via a modern, responsive UI
672
671
  email:
673
672
  - justin@curationexperts.com
674
673
  - leftwing@alumni.rutgers.edu
@@ -1005,6 +1004,7 @@ files:
1005
1004
  - app/services/sufia/workflow/abstract_notification.rb
1006
1005
  - app/services/sufia/workflow/changes_required_notification.rb
1007
1006
  - app/services/sufia/workflow/complete_notification.rb
1007
+ - app/services/sufia/workflow/deposited_notification.rb
1008
1008
  - app/services/sufia/workflow/pending_review_notification.rb
1009
1009
  - app/services/sufia/workflow/workflow_by_admin_set_strategy.rb
1010
1010
  - app/uploaders/sufia/avatar_uploader.rb
@@ -1600,6 +1600,7 @@ files:
1600
1600
  - spec/services/sufia/user_stat_importer_spec.rb
1601
1601
  - spec/services/sufia/workflow/changes_required_notification_spec.rb
1602
1602
  - spec/services/sufia/workflow/complete_notification_spec.rb
1603
+ - spec/services/sufia/workflow/deposited_notification_spec.rb
1603
1604
  - spec/services/sufia/workflow/pending_review_notification_spec.rb
1604
1605
  - spec/services/sufia/workflow/workflow_by_admin_set_strategy_spec.rb
1605
1606
  - spec/spec_helper.rb
@@ -1619,6 +1620,7 @@ files:
1619
1620
  - spec/views/batch_edits/check_all_spec.rb
1620
1621
  - spec/views/batch_edits/edit.html.erb_spec.rb
1621
1622
  - spec/views/catalog/_index_list_default.html.erb_spec.rb
1623
+ - spec/views/catalog/_search_form.html.erb_spec.rb
1622
1624
  - spec/views/catalog/_thumbnail_list_collection.html.erb_spec.rb
1623
1625
  - spec/views/catalog/index.html.erb_spec.rb
1624
1626
  - spec/views/citations/work.html.erb_spec.rb
@@ -1671,6 +1673,7 @@ files:
1671
1673
  - spec/views/sufia/admin/admin_sets/_form_participants.html.erb_spec.rb
1672
1674
  - spec/views/sufia/admin/admin_sets/_form_visibility.html.erb_spec.rb
1673
1675
  - spec/views/sufia/admin/admin_sets/index.html.erb_spec.rb
1676
+ - spec/views/sufia/admin/features/index.html.erb_spec.rb
1674
1677
  - spec/views/sufia/admin/stats/show.html.erb_spec.rb
1675
1678
  - spec/views/sufia/batch_uploads/_form.html.erb_spec.rb
1676
1679
  - spec/views/sufia/homepage/_announcement.html.erb_spec.rb
@@ -1723,7 +1726,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1723
1726
  version: 1.3.1
1724
1727
  requirements: []
1725
1728
  rubyforge_project:
1726
- rubygems_version: 2.6.8
1729
+ rubygems_version: 2.6.10
1727
1730
  signing_key:
1728
1731
  specification_version: 4
1729
1732
  summary: Sufia was originally extracted from ScholarSphere developed by Penn State
@@ -1972,6 +1975,7 @@ test_files:
1972
1975
  - spec/services/sufia/user_stat_importer_spec.rb
1973
1976
  - spec/services/sufia/workflow/changes_required_notification_spec.rb
1974
1977
  - spec/services/sufia/workflow/complete_notification_spec.rb
1978
+ - spec/services/sufia/workflow/deposited_notification_spec.rb
1975
1979
  - spec/services/sufia/workflow/pending_review_notification_spec.rb
1976
1980
  - spec/services/sufia/workflow/workflow_by_admin_set_strategy_spec.rb
1977
1981
  - spec/spec_helper.rb
@@ -1991,6 +1995,7 @@ test_files:
1991
1995
  - spec/views/batch_edits/check_all_spec.rb
1992
1996
  - spec/views/batch_edits/edit.html.erb_spec.rb
1993
1997
  - spec/views/catalog/_index_list_default.html.erb_spec.rb
1998
+ - spec/views/catalog/_search_form.html.erb_spec.rb
1994
1999
  - spec/views/catalog/_thumbnail_list_collection.html.erb_spec.rb
1995
2000
  - spec/views/catalog/index.html.erb_spec.rb
1996
2001
  - spec/views/citations/work.html.erb_spec.rb
@@ -2043,6 +2048,7 @@ test_files:
2043
2048
  - spec/views/sufia/admin/admin_sets/_form_participants.html.erb_spec.rb
2044
2049
  - spec/views/sufia/admin/admin_sets/_form_visibility.html.erb_spec.rb
2045
2050
  - spec/views/sufia/admin/admin_sets/index.html.erb_spec.rb
2051
+ - spec/views/sufia/admin/features/index.html.erb_spec.rb
2046
2052
  - spec/views/sufia/admin/stats/show.html.erb_spec.rb
2047
2053
  - spec/views/sufia/batch_uploads/_form.html.erb_spec.rb
2048
2054
  - spec/views/sufia/homepage/_announcement.html.erb_spec.rb