hyrax 3.0.2 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +22 -0
  3. data/.dassie/Gemfile +10 -5
  4. data/.dassie/config/initializers/hyrax.rb +5 -0
  5. data/.dockerignore +3 -0
  6. data/.env +0 -1
  7. data/.rubocop.yml +4 -0
  8. data/CONTAINERS.md +1 -1
  9. data/Dockerfile +12 -6
  10. data/Gemfile +21 -27
  11. data/app/actors/hyrax/actors/base_actor.rb +1 -1
  12. data/app/actors/hyrax/actors/create_with_remote_files_actor.rb +85 -63
  13. data/app/actors/hyrax/actors/create_with_remote_files_ordered_members_actor.rb +7 -42
  14. data/app/controllers/concerns/hyrax/collections_controller_behavior.rb +20 -8
  15. data/app/controllers/concerns/hyrax/embargoes_controller_behavior.rb +21 -9
  16. data/app/controllers/concerns/hyrax/leases_controller_behavior.rb +14 -5
  17. data/app/controllers/concerns/hyrax/works_controller_behavior.rb +22 -3
  18. data/app/controllers/hyrax/admin/workflows_controller.rb +8 -2
  19. data/app/controllers/hyrax/dashboard/collection_members_controller.rb +13 -9
  20. data/app/controllers/hyrax/dashboard/collections_controller.rb +12 -10
  21. data/app/controllers/hyrax/file_sets_controller.rb +49 -13
  22. data/app/controllers/hyrax/permissions_controller.rb +3 -4
  23. data/app/controllers/hyrax/workflow_actions_controller.rb +3 -1
  24. data/app/forms/hyrax/forms/collection_form.rb +7 -3
  25. data/app/forms/hyrax/forms/dashboard/nest_collection_form.rb +24 -2
  26. data/app/forms/hyrax/forms/file_set_form.rb +46 -0
  27. data/app/forms/hyrax/forms/permission.rb +23 -0
  28. data/app/forms/hyrax/forms/permission_template_form.rb +8 -2
  29. data/app/forms/hyrax/forms/resource_form.rb +10 -17
  30. data/app/forms/hyrax/forms/work_form.rb +5 -2
  31. data/app/helpers/hyrax/batch_edits_helper.rb +3 -1
  32. data/app/helpers/hyrax/collections_helper.rb +88 -2
  33. data/app/helpers/hyrax/dashboard_helper_behavior.rb +3 -7
  34. data/app/helpers/hyrax/file_set_helper.rb +25 -6
  35. data/app/helpers/hyrax/work_form_helper.rb +53 -0
  36. data/app/indexers/hyrax/administrative_set_indexer.rb +18 -0
  37. data/app/indexers/hyrax/valkyrie_indexer.rb +3 -3
  38. data/app/inputs/controlled_vocabulary_input.rb +2 -5
  39. data/app/jobs/attach_files_to_work_job.rb +19 -10
  40. data/app/jobs/attach_files_to_work_with_ordered_members_job.rb +6 -5
  41. data/app/jobs/inherit_permissions_job.rb +9 -5
  42. data/app/models/admin_set.rb +6 -25
  43. data/app/models/concerns/hyrax/ability.rb +3 -1
  44. data/app/models/concerns/hyrax/collection_behavior.rb +17 -44
  45. data/app/models/concerns/hyrax/file_set/characterization.rb +18 -12
  46. data/app/models/concerns/hyrax/solr_document_behavior.rb +9 -52
  47. data/app/models/concerns/hyrax/suppressible.rb +5 -0
  48. data/app/models/concerns/hyrax/user.rb +9 -3
  49. data/app/models/hyrax/file_set.rb +6 -0
  50. data/app/models/hyrax/pcdm_collection.rb +1 -0
  51. data/app/models/hyrax/permission_template.rb +98 -12
  52. data/app/models/hyrax/virus_scanner.rb +27 -18
  53. data/app/models/sipity/agent.rb +1 -0
  54. data/app/models/sipity/entity.rb +30 -8
  55. data/app/models/sipity/workflow.rb +1 -0
  56. data/app/models/sipity.rb +42 -0
  57. data/app/presenters/hyrax/admin_set_options_presenter.rb +2 -10
  58. data/app/presenters/hyrax/admin_set_presenter.rb +5 -1
  59. data/app/presenters/hyrax/admin_set_selection_presenter.rb +116 -0
  60. data/app/presenters/hyrax/collection_presenter.rb +31 -6
  61. data/app/presenters/hyrax/file_set_presenter.rb +6 -1
  62. data/app/presenters/hyrax/file_usage.rb +3 -2
  63. data/app/presenters/hyrax/stats_usage_presenter.rb +2 -1
  64. data/app/presenters/hyrax/trophy_presenter.rb +33 -4
  65. data/app/presenters/hyrax/user_profile_presenter.rb +11 -1
  66. data/app/presenters/hyrax/version_list_presenter.rb +19 -0
  67. data/app/presenters/hyrax/version_presenter.rb +3 -2
  68. data/app/presenters/hyrax/work_show_presenter.rb +25 -4
  69. data/app/presenters/hyrax/work_usage.rb +5 -3
  70. data/app/renderers/hyrax/renderers/attribute_renderer.rb +10 -2
  71. data/app/search_builders/hyrax/admin_set_search_builder.rb +1 -1
  72. data/app/search_builders/hyrax/my/collections_search_builder.rb +1 -1
  73. data/app/services/hyrax/admin_set_create_service.rb +3 -1
  74. data/app/services/hyrax/collections/collection_member_search_service.rb +72 -0
  75. data/app/services/hyrax/collections/collection_member_service.rb +112 -27
  76. data/app/services/hyrax/collections/migration_service.rb +4 -2
  77. data/app/services/hyrax/collections/nested_collection_persistence_service.rb +12 -13
  78. data/app/services/hyrax/collections/nested_collection_query_service.rb +2 -0
  79. data/app/services/hyrax/collections/permissions_create_service.rb +6 -4
  80. data/app/services/hyrax/contextual_path.rb +23 -0
  81. data/app/services/hyrax/custom_queries/find_file_metadata.rb +7 -5
  82. data/app/services/hyrax/custom_queries/navigators/parent_collections_navigator.rb +46 -0
  83. data/app/services/hyrax/edit_permissions_service.rb +27 -20
  84. data/app/services/hyrax/find_objects_via_solr_service.rb +11 -7
  85. data/app/services/hyrax/multiple_membership_checker.rb +51 -31
  86. data/app/services/hyrax/resource_status.rb +7 -0
  87. data/app/services/hyrax/search_service.rb +4 -2
  88. data/app/services/hyrax/solr_query_builder_service.rb +29 -6
  89. data/app/services/hyrax/solr_query_service.rb +224 -0
  90. data/app/services/hyrax/solr_service.rb +8 -1
  91. data/app/services/hyrax/statistics/depositors/summary.rb +2 -1
  92. data/app/services/hyrax/work_uploads_handler.rb +17 -2
  93. data/app/services/hyrax/workflow/actionable_objects.rb +70 -0
  94. data/app/services/hyrax/workflow/object_in_workflow_decorator.rb +31 -0
  95. data/app/services/hyrax/workflow/status_list_service.rb +43 -13
  96. data/app/views/hyrax/base/_form_relationships.html.erb +1 -2
  97. data/app/views/hyrax/base/_form_rendering.html.erb +1 -1
  98. data/app/views/hyrax/base/_form_representative.html.erb +1 -1
  99. data/app/views/hyrax/base/_form_thumbnail.html.erb +1 -1
  100. data/app/views/hyrax/base/_guts4form.html.erb +2 -2
  101. data/app/views/hyrax/base/_representative_media.html.erb +1 -1
  102. data/app/views/hyrax/base/_show_actions.html.erb +1 -1
  103. data/app/views/hyrax/dashboard/collections/_form.html.erb +3 -3
  104. data/app/views/hyrax/dashboard/collections/_list_collections.html.erb +1 -1
  105. data/app/views/hyrax/dashboard/collections/edit.html.erb +4 -2
  106. data/app/views/hyrax/dashboard/collections/new.html.erb +4 -2
  107. data/app/views/hyrax/dashboard/collections/show.html.erb +1 -1
  108. data/app/views/hyrax/file_sets/edit.html.erb +1 -1
  109. data/app/views/hyrax/file_sets/media_display/_audio.html.erb +1 -1
  110. data/app/views/hyrax/file_sets/media_display/_default.html.erb +1 -1
  111. data/app/views/hyrax/file_sets/media_display/_image.html.erb +1 -1
  112. data/app/views/hyrax/file_sets/media_display/_office_document.html.erb +1 -1
  113. data/app/views/hyrax/file_sets/media_display/_pdf.html.erb +1 -1
  114. data/app/views/hyrax/file_sets/media_display/_video.html.erb +1 -1
  115. data/app/views/hyrax/file_sets/show.html.erb +1 -1
  116. data/app/views/hyrax/my/_admin_set_action_menu.html.erb +0 -11
  117. data/app/views/hyrax/my/_collection_action_menu.html.erb +1 -2
  118. data/app/views/hyrax/my/collections/_list_collections.html.erb +1 -1
  119. data/app/views/hyrax/my/collections/_modal_add_subcollection.html.erb +3 -5
  120. data/bin/solrcloud-assign-configset.sh +8 -5
  121. data/bin/solrcloud-upload-configset.sh +4 -2
  122. data/chart/hyrax/Chart.yaml +3 -3
  123. data/chart/hyrax/README.md +47 -1
  124. data/chart/hyrax/templates/_helpers.tpl +1 -1
  125. data/chart/hyrax/templates/configmap-env.yaml +1 -3
  126. data/chart/hyrax/templates/deployment-worker.yaml +6 -3
  127. data/chart/hyrax/templates/deployment.yaml +8 -3
  128. data/chart/hyrax/values.yaml +12 -0
  129. data/config/brakeman.ignore +2 -2
  130. data/config/locales/hyrax.de.yml +1 -1
  131. data/config/locales/hyrax.en.yml +1 -1
  132. data/config/locales/hyrax.es.yml +1 -1
  133. data/config/locales/hyrax.fr.yml +1 -1
  134. data/config/locales/hyrax.it.yml +1 -1
  135. data/config/locales/hyrax.pt-BR.yml +1 -1
  136. data/config/locales/hyrax.zh.yml +1 -1
  137. data/docker-compose.yml +1 -0
  138. data/documentation/developing-your-hyrax-based-app.md +1 -1
  139. data/documentation/legacyREADME.md +1 -1
  140. data/lib/generators/hyrax/templates/config/initializers/hyrax.rb +5 -0
  141. data/lib/hyrax/active_fedora_dummy_model.rb +62 -0
  142. data/lib/hyrax/configuration.rb +8 -0
  143. data/lib/hyrax/engine.rb +1 -0
  144. data/lib/hyrax/errors.rb +2 -0
  145. data/lib/hyrax/specs/capybara.rb +3 -1
  146. data/lib/hyrax/specs/shared_specs/valkyrie_storage_versions.rb +9 -0
  147. data/lib/hyrax/transactions/container.rb +21 -0
  148. data/lib/hyrax/transactions/file_set_destroy.rb +21 -0
  149. data/lib/hyrax/transactions/steps/add_file_sets.rb +3 -2
  150. data/lib/hyrax/transactions/steps/add_to_parent.rb +36 -0
  151. data/lib/hyrax/transactions/steps/remove_file_set_from_work.rb +47 -0
  152. data/lib/hyrax/transactions/work_create.rb +2 -1
  153. data/lib/hyrax/valkyrie_can_can_adapter.rb +1 -0
  154. data/lib/hyrax/version.rb +1 -1
  155. data/lib/hyrax.rb +9 -0
  156. data/lib/tasks/collection_type_global_id.rake +1 -1
  157. data/lib/tasks/regenerate_derivatives.rake +12 -0
  158. data/lib/wings/orm_converter.rb +18 -2
  159. data/lib/wings/setup.rb +1 -0
  160. data/lib/wings/valkyrie/storage.rb +56 -1
  161. data/template.rb +1 -1
  162. metadata +17 -2
@@ -28,6 +28,7 @@ module Hyrax
28
28
  :to_s, to: :solr_document
29
29
 
30
30
  delegate(*Hyrax::CollectionType.settings_attributes, to: :collection_type, prefix: :collection_type_is)
31
+ alias nestable? collection_type_is_nestable?
31
32
 
32
33
  def collection_type
33
34
  @collection_type ||= Hyrax::CollectionType.find_by_gid!(collection_type_gid)
@@ -77,19 +78,36 @@ module Hyrax
77
78
  end
78
79
 
79
80
  def total_items
80
- Hyrax::SolrService.new.count("member_of_collection_ids_ssim:#{id}")
81
+ field_pairs = { "member_of_collection_ids_ssim" => id.to_s }
82
+ SolrQueryService.new
83
+ .with_field_pairs(field_pairs: field_pairs)
84
+ .count
81
85
  end
82
86
 
83
87
  def total_viewable_items
84
- ActiveFedora::Base.where("member_of_collection_ids_ssim:#{id}").accessible_by(current_ability).count
88
+ field_pairs = { "member_of_collection_ids_ssim" => id.to_s }
89
+ SolrQueryService.new
90
+ .with_field_pairs(field_pairs: field_pairs)
91
+ .accessible_by(ability: current_ability)
92
+ .count
85
93
  end
86
94
 
87
95
  def total_viewable_works
88
- ActiveFedora::Base.where("member_of_collection_ids_ssim:#{id} AND generic_type_sim:Work").accessible_by(current_ability).count
96
+ field_pairs = { "member_of_collection_ids_ssim" => id.to_s }
97
+ SolrQueryService.new
98
+ .with_field_pairs(field_pairs: field_pairs)
99
+ .with_generic_type(generic_type: "Work")
100
+ .accessible_by(ability: current_ability)
101
+ .count
89
102
  end
90
103
 
91
104
  def total_viewable_collections
92
- ActiveFedora::Base.where("member_of_collection_ids_ssim:#{id} AND generic_type_sim:Collection").accessible_by(current_ability).count
105
+ field_pairs = { "member_of_collection_ids_ssim" => id.to_s }
106
+ SolrQueryService.new
107
+ .with_field_pairs(field_pairs: field_pairs)
108
+ .with_generic_type(generic_type: "Collection")
109
+ .accessible_by(ability: current_ability)
110
+ .count
93
111
  end
94
112
 
95
113
  def collection_type_badge
@@ -154,14 +172,21 @@ module Hyrax
154
172
  create_work_presenter.first_model
155
173
  end
156
174
 
175
+ ##
176
+ # @deprecated this implementation requires an extra db round trip, had a
177
+ # buggy cacheing mechanism, and was largely duplicative of other code.
178
+ # all versions of this code are replaced by
179
+ # {CollectionsHelper#available_parent_collections_data}.
157
180
  def available_parent_collections(scope:)
181
+ Deprecation.warn("#{self.class}#available_parent_collections is " \
182
+ "deprecated. Use available_parent_collections_data " \
183
+ "helper instead.")
158
184
  return @available_parents if @available_parents.present?
159
185
  collection = ::Collection.find(id)
160
186
  colls = Hyrax::Collections::NestedCollectionQueryService.available_parent_collections(child: collection, scope: scope, limit_to_id: nil)
161
187
  @available_parents = colls.map do |col|
162
188
  { "id" => col.id, "title_first" => col.title.first }
163
- end
164
- @available_parents.to_json
189
+ end.to_json
165
190
  end
166
191
 
167
192
  def subcollection_count=(total)
@@ -57,8 +57,13 @@ module Hyrax
57
57
  current_ability.can?(:read, id) ? first_title : 'File'
58
58
  end
59
59
 
60
+ ##
61
+ # @deprecated use `::Ability.can?(:edit, presenter)`. Hyrax views calling
62
+ # presenter {#editor} methods will continue to call them until Hyrax
63
+ # 4.0.0. The deprecation time horizon for the presenter methods themselves
64
+ # is 5.0.0.
60
65
  def editor?
61
- current_ability.can?(:edit, solr_document)
66
+ current_ability.can?(:edit, self)
62
67
  end
63
68
 
64
69
  def tweeter
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
- # Called by the stats controller, it finds cached file pageview data,
3
- # and prepares it for visualization in /app/views/stats/file.html.erb
4
2
  module Hyrax
3
+ ##
4
+ # Called by the stats controller, it finds cached file pageview data,
5
+ # and prepares it for visualization in /app/views/stats/file.html.erb
5
6
  class FileUsage < StatsUsagePresenter
6
7
  def initialize(id)
7
8
  self.model = ::FileSet.find(id)
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  module Hyrax
3
- # Methods used by both WorkUsage and FileUsage
3
+ ##
4
+ # @abstract methods used by both {WorkUsage} and {FileUsage}
4
5
  class StatsUsagePresenter
5
6
  attr_accessor :id, :model
6
7
 
@@ -1,27 +1,56 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Hyrax
4
+ ##
5
+ # @api public
6
+ #
7
+ # Presents works in context as "trophied" for a given user.
8
+ #
9
+ # @example
10
+ # my_user = User.find(user_id)
11
+ #
12
+ # trophies = Hyrax::TrophyPresenter.find_by_user(my_user)
13
+ # trophies.each do |trophy|
14
+ # puts "Object name/title: #{trophy}"
15
+ # puts "Thumbnail path: #{trophy.thumbnail_path}"
16
+ # end
3
17
  class TrophyPresenter
4
18
  include ModelProxy
19
+
20
+ ##
21
+ # @param solr_document [::SolrDocument]
5
22
  def initialize(solr_document)
6
23
  @solr_document = solr_document
7
24
  end
8
25
 
26
+ ##
27
+ # @!attribute [r] SolrDocument
28
+ # @return [::SolrDocument]
9
29
  attr_reader :solr_document
10
30
 
11
31
  delegate :to_s, :thumbnail_path, to: :solr_document
12
32
 
33
+ ##
13
34
  # @param user [User] the user to find the TrophyPresentes for.
35
+ #
14
36
  # @return [Array<TrophyPresenter>] a list of all the trophy presenters for the user
15
37
  def self.find_by_user(user)
16
- work_ids = user.trophies.pluck(:work_id)
17
- query = Hyrax::SolrQueryBuilderService.construct_query_for_ids(work_ids)
18
- results = Hyrax::WorkRelation.new.search_with_conditions(query)
19
- results.map { |result| TrophyPresenter.new(document_model.new(result)) }
38
+ ids = user.trophies.pluck(:work_id)
39
+ return ids if ids.empty?
40
+
41
+ documents = Hyrax::SolrQueryService.new.with_ids(ids: ids).solr_documents
42
+
43
+ documents.map { |doc| new(doc) }
20
44
  rescue RSolr::Error::ConnectionRefused
21
45
  []
22
46
  end
23
47
 
48
+ ##
49
+ # @api private
50
+ # @deprecated use CatalogController.blacklight_config.document_model instead
24
51
  def self.document_model
52
+ Deprecation
53
+ .warn("Use CatalogController.blacklight_config.document_model instead.")
25
54
  CatalogController.blacklight_config.document_model
26
55
  end
27
56
  private_class_method :document_model
@@ -1,16 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
  module Hyrax
3
3
  class UserProfilePresenter
4
+ ##
5
+ # @param user [::User]
6
+ # @param ability [::Ability]
4
7
  def initialize(user, ability)
5
8
  @user = user
6
9
  @ability = ability
7
10
  end
8
11
 
12
+ ##
13
+ # @!attribute [r] ability
14
+ # @return [::Ability]
15
+ # @!attribute [r] user
16
+ # @return [::User]
9
17
  attr_reader :user, :ability
10
18
 
11
19
  delegate :name, to: :user
12
20
 
13
- # @return true if the presenter is for the logged in user
21
+ ##
22
+ # @return [Boolean] true if the presenter is for the logged in user
14
23
  def current_user?
15
24
  user == ability.current_user
16
25
  end
@@ -23,6 +32,7 @@ module Hyrax
23
32
  end
24
33
  end
25
34
 
35
+ ##
26
36
  # @return [Array<TrophyPresenter>] list of TrophyPresenters for this profile.
27
37
  def trophies
28
38
  @trophies ||= Hyrax::TrophyPresenter.find_by_user(user)
@@ -1,10 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
  module Hyrax
3
+ ##
4
+ # @api public
3
5
  class VersionListPresenter
6
+ include Enumerable
7
+
8
+ ##
9
+ # @param version_list [Array<#created>]
4
10
  def initialize(version_list)
5
11
  @raw_list = version_list
6
12
  end
7
13
 
14
+ ##
15
+ # @param [Object] an object representing the File Set
16
+ #
17
+ # @return [Enumerable<Hyrax::VersionPresenter>] an enumerable of presenters
18
+ # for the relevant file versions.
19
+ #
20
+ # @raise [ArgumentError] if we can't build an enu
21
+ def self.for(file_set:)
22
+ new(file_set.original_file&.versions&.all.to_a)
23
+ rescue NoMethodError
24
+ raise ArgumentError
25
+ end
26
+
8
27
  delegate :each, to: :wrapped_list
9
28
 
10
29
  private
@@ -20,8 +20,9 @@ module Hyrax
20
20
  end
21
21
 
22
22
  def committer
23
- vc = Hyrax::VersionCommitter.where(version_id: @version.uri)
24
- vc.empty? ? nil : vc.first.committer_login
23
+ Hyrax::VersionCommitter
24
+ .find_by(version_id: @version.uri)
25
+ &.committer_login
25
26
  end
26
27
  end
27
28
  end
@@ -132,8 +132,13 @@ module Hyrax
132
132
  graph.dump(:ttl)
133
133
  end
134
134
 
135
+ ##
136
+ # @deprecated use `::Ability.can?(:edit, presenter)`. Hyrax views calling
137
+ # presenter {#editor} methods will continue to call them until Hyrax
138
+ # 4.0.0. The deprecation time horizon for the presenter methods themselves
139
+ # is 5.0.0.
135
140
  def editor?
136
- current_ability.can?(:edit, solr_document)
141
+ current_ability.can?(:edit, self)
137
142
  end
138
143
 
139
144
  def tweeter
@@ -223,9 +228,25 @@ module Hyrax
223
228
  end
224
229
  end
225
230
 
226
- # determine if the user can add this work to a collection
227
- # @param collections [Array<::Collection>] list of collections to which this user can deposit
228
- # @return true if the user can deposit to at least one collection OR if the user can create a collection; otherwise, false
231
+ ##
232
+ # @return [Integer]
233
+ def member_count
234
+ @member_count ||= member_presenters.count
235
+ end
236
+
237
+ ##
238
+ # Given a set of collections, which the caller asserts the current ability
239
+ # can deposit to, decide whether to display actions to add this work to a
240
+ # collection.
241
+ #
242
+ # By default, this returns `true` if any collections are passed in OR the
243
+ # current ability can create a collection.
244
+ #
245
+ # @param collections [Enumerable<::Collection>, nil] list of collections to
246
+ # which the current ability can deposit
247
+ #
248
+ # @return [Boolean] a flag indicating whether to display collection deposit
249
+ # options.
229
250
  def show_deposit_for?(collections:)
230
251
  collections.present? || current_ability.can?(:create_any, ::Collection)
231
252
  end
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
- # class WorkUsage follows the model established by FileUsage
3
- # Called by the stats controller, it finds cached work pageview data,
4
- # and prepares it for visualization in /app/views/stats/work.html.erb
2
+
5
3
  module Hyrax
4
+ # Follows the model established by {FileUsage}.
5
+ #
6
+ # Called by the stats controller, it finds cached work pageview data,
7
+ # and prepares it for visualization in /app/views/stats/work.html.erb
6
8
  class WorkUsage < StatsUsagePresenter
7
9
  def initialize(id)
8
10
  self.model = Hyrax::WorkRelation.new.find(id)
@@ -11,12 +11,14 @@ module Hyrax
11
11
 
12
12
  attr_reader :field, :values, :options
13
13
 
14
+ ##
14
15
  # @param [Symbol] field
15
16
  # @param [Array] values
16
17
  # @param [Hash] options
17
18
  # @option options [String] :label The field label to render
18
19
  # @option options [String] :include_empty Do we render if if the values are empty?
19
20
  # @option options [String] :work_type Used for some I18n logic
21
+ # @option options [Boolean] :sort sort the values with +Array#sort+ if truthy
20
22
  def initialize(field, values, options = {})
21
23
  @field = field
22
24
  @values = values
@@ -31,7 +33,10 @@ module Hyrax
31
33
 
32
34
  attributes = microdata_object_attributes(field).merge(class: "attribute attribute-#{field}")
33
35
 
34
- markup += Array(values).map do |value|
36
+ values_array = Array(values)
37
+ values_array = values_array.sort if options[:sort]
38
+
39
+ markup += values_array.map do |value|
35
40
  "<li#{html_attributes(attributes)}>#{attribute_value_to_html(value.to_s)}</li>"
36
41
  end.join
37
42
 
@@ -48,7 +53,10 @@ module Hyrax
48
53
 
49
54
  attributes = microdata_object_attributes(field).merge(class: "attribute attribute-#{field}")
50
55
 
51
- markup += Array(values).map do |value|
56
+ values_array = Array(values)
57
+ values_array.sort! if options[:sort]
58
+
59
+ markup += values_array.map do |value|
52
60
  "<li#{html_attributes(attributes)}>#{attribute_value_to_html(value.to_s)}</li>"
53
61
  end.join
54
62
  markup += %(</ul></dd>)
@@ -14,7 +14,7 @@ module Hyrax
14
14
 
15
15
  # This overrides the models in FilterByType
16
16
  def models
17
- [::AdminSet]
17
+ [::AdminSet, Hyrax::AdministrativeSet]
18
18
  end
19
19
 
20
20
  # Overrides Hydra::AccessControlsEnforcement
@@ -21,6 +21,6 @@ class Hyrax::My::CollectionsSearchBuilder < ::Hyrax::CollectionSearchBuilder
21
21
  # This overrides the models in FilterByType
22
22
  # @return [Array<Class>] a list of classes to include
23
23
  def models
24
- [::AdminSet, ::Collection]
24
+ [::AdminSet, ::Collection, Hyrax::AdministrativeSet]
25
25
  end
26
26
  end
@@ -81,9 +81,11 @@ module Hyrax
81
81
  ::Ability.admin_group_name
82
82
  end
83
83
 
84
+ ##
85
+ # @return [PermissionTemplate]
84
86
  def create_permission_template
85
87
  permission_template = PermissionTemplate.create!(source_id: admin_set.id, access_grants_attributes: access_grants_attributes)
86
- admin_set.reset_access_controls!
88
+ permission_template.reset_access_controls_for(collection: admin_set)
87
89
  permission_template
88
90
  end
89
91
 
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+ module Hyrax
3
+ module Collections
4
+ ##
5
+ # Retrieves collection members
6
+ class CollectionMemberSearchService < Hyrax::SearchService
7
+ ##
8
+ # @param scope [#repository] Typically a controller object which responds to :repository
9
+ # @param [::Collection] collection
10
+ # @param [ActionController::Parameters] params the query params
11
+ # @param [ActionController::Parameters] user_params
12
+ # @param [::Ability] current_ability
13
+ # @param [Class] search_builder_class a {::SearchBuilder}
14
+ def initialize(scope:, collection:, params:, user_params: nil, current_ability: nil, search_builder_class: Hyrax::CollectionMemberSearchBuilder) # rubocop:disable Metrics/ParameterLists
15
+ super(
16
+ config: scope.blacklight_config,
17
+ user_params: user_params || params,
18
+ collection: collection,
19
+ scope: scope,
20
+ current_ability: current_ability || scope.current_ability,
21
+ search_builder_class: search_builder_class
22
+ )
23
+ end
24
+
25
+ ##
26
+ # @api public
27
+ #
28
+ # Collections which are members of the given collection
29
+ #
30
+ # @return [Blacklight::Solr::Response] (up to 50 solr documents)
31
+ def available_member_subcollections
32
+ response, _docs = search_results do |builder|
33
+ # To differentiate current page for works vs subcollections, we have to use a sub_collection_page
34
+ # param. Map this to the page param before querying for subcollections, if it's present
35
+ builder.page(user_params[:sub_collection_page])
36
+ builder.search_includes_models = :collections
37
+ builder
38
+ end
39
+ response
40
+ end
41
+
42
+ ##
43
+ # @api public
44
+ #
45
+ # Works which are members of the given collection
46
+ #
47
+ # @return [Blacklight::Solr::Response]
48
+ def available_member_works
49
+ response, _docs = search_results do |builder|
50
+ builder.search_includes_models = :works
51
+ builder
52
+ end
53
+ response
54
+ end
55
+
56
+ ##
57
+ # @api public
58
+ #
59
+ # Work ids of the works which are members of the given collection
60
+ #
61
+ # @return [Blacklight::Solr::Response]
62
+ def available_member_work_ids
63
+ response, _docs = search_results do |builder|
64
+ builder.search_includes_models = :works
65
+ builder.merge(fl: 'id')
66
+ builder
67
+ end
68
+ response
69
+ end
70
+ end
71
+ end
72
+ end