hyrax 2.1.0.beta2 → 2.1.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (180) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODE_OF_CONDUCT.md +5 -5
  3. data/.github/CONTRIBUTING.md +2 -2
  4. data/.rubocop.yml +1 -0
  5. data/.rubocop_fixme.yml +2 -0
  6. data/Gemfile +1 -0
  7. data/README.md +3 -2
  8. data/app/actors/hyrax/actors/collections_membership_actor.rb +3 -0
  9. data/app/actors/hyrax/actors/create_with_remote_files_actor.rb +4 -3
  10. data/app/actors/hyrax/actors/default_admin_set_actor.rb +9 -6
  11. data/app/assets/javascripts/hyrax.js +3 -0
  12. data/app/assets/javascripts/hyrax/app.js.erb +14 -0
  13. data/app/assets/javascripts/hyrax/batch_edit.js +2 -1
  14. data/app/assets/javascripts/hyrax/collection_types.es6 +97 -36
  15. data/app/assets/javascripts/hyrax/collections.js +15 -49
  16. data/app/assets/javascripts/hyrax/collections_utils.es6 +116 -0
  17. data/app/assets/javascripts/hyrax/collections_v2.es6 +57 -0
  18. data/app/assets/javascripts/hyrax/content_blocks.js +1 -13
  19. data/app/assets/javascripts/hyrax/nav_safety.js +41 -0
  20. data/app/assets/javascripts/hyrax/turbolinks_events.js +3 -0
  21. data/app/assets/stylesheets/hyrax/_collection_types.scss +46 -2
  22. data/app/assets/stylesheets/hyrax/_work-show.scss +6 -9
  23. data/app/assets/stylesheets/hyrax/dashboard.scss +2 -0
  24. data/app/assets/stylesheets/hyrax/sidebar.scss +4 -0
  25. data/app/controllers/concerns/hyrax/works_controller_behavior.rb +10 -2
  26. data/app/controllers/hyrax/admin/admin_sets_controller.rb +2 -9
  27. data/app/controllers/hyrax/admin/collection_types_controller.rb +1 -1
  28. data/app/controllers/hyrax/batch_edits_controller.rb +30 -4
  29. data/app/controllers/hyrax/dashboard/collection_members_controller.rb +1 -0
  30. data/app/controllers/hyrax/dashboard/collections_controller.rb +4 -1
  31. data/app/controllers/hyrax/downloads_controller.rb +7 -1
  32. data/app/forms/hyrax/forms/admin/collection_type_form.rb +1 -1
  33. data/app/indexers/hyrax/repository_reindexer.rb +1 -1
  34. data/app/jobs/attach_files_to_work_job.rb +8 -4
  35. data/app/jobs/import_url_job.rb +11 -5
  36. data/app/models/admin_set.rb +25 -3
  37. data/app/models/concerns/hyrax/collection_behavior.rb +23 -11
  38. data/app/models/concerns/hyrax/collection_nesting.rb +22 -3
  39. data/app/models/hyrax/permission_template_access.rb +7 -4
  40. data/app/presenters/hyrax/admin_set_presenter.rb +21 -0
  41. data/app/presenters/hyrax/collection_presenter.rb +23 -1
  42. data/app/presenters/hyrax/dashboard/user_presenter.rb +4 -0
  43. data/app/presenters/hyrax/presents_attributes.rb +6 -2
  44. data/app/presenters/hyrax/work_show_presenter.rb +4 -0
  45. data/app/renderers/hyrax/renderers/attribute_renderer.rb +14 -0
  46. data/app/services/hyrax/adapters/nesting_index_adapter.rb +19 -39
  47. data/app/services/hyrax/admin_set_create_service.rb +1 -1
  48. data/app/services/hyrax/collection_types/create_service.rb +4 -0
  49. data/app/services/hyrax/collections/migration_service.rb +25 -2
  50. data/app/services/hyrax/collections/nested_collection_persistence_service.rb +8 -3
  51. data/app/services/hyrax/collections/nested_collection_query_service.rb +3 -3
  52. data/app/services/hyrax/default_middleware_stack.rb +3 -3
  53. data/app/services/hyrax/multiple_membership_checker.rb +4 -2
  54. data/app/views/catalog/_index_header_list_collection.html.erb +1 -1
  55. data/app/views/catalog/_search_form.html.erb +0 -4
  56. data/app/views/hyrax/admin/admin_sets/_show_actions.html.erb +27 -0
  57. data/app/views/hyrax/admin/admin_sets/show.html.erb +1 -25
  58. data/app/views/hyrax/admin/collection_types/_form.html.erb +17 -6
  59. data/app/views/hyrax/admin/collection_types/_form_appearance.html.erb +5 -0
  60. data/app/views/hyrax/admin/collection_types/_form_participant_table.html.erb +1 -1
  61. data/app/views/hyrax/admin/collection_types/_form_participants.html.erb +56 -52
  62. data/app/views/hyrax/admin/collection_types/edit.html.erb +9 -7
  63. data/app/views/hyrax/admin/collection_types/index.html.erb +1 -1
  64. data/app/views/hyrax/base/_attribute_rows.html.erb +15 -14
  65. data/app/views/hyrax/base/_form.html.erb +1 -0
  66. data/app/views/hyrax/base/_form_collections_error.html.erb +1 -0
  67. data/app/views/hyrax/base/_items.html.erb +3 -2
  68. data/app/views/hyrax/base/_metadata.html.erb +5 -7
  69. data/app/views/hyrax/base/_relationships.html.erb +3 -5
  70. data/app/views/hyrax/base/_relationships_parent_row.html.erb +4 -5
  71. data/app/views/hyrax/base/_relationships_parent_rows.html.erb +2 -1
  72. data/app/views/hyrax/base/_show_actions.html.erb +11 -1
  73. data/app/views/hyrax/batch_edits/edit.html.erb +57 -17
  74. data/app/views/hyrax/collections/_list_collections.html.erb +1 -1
  75. data/app/views/hyrax/collections/show.html.erb +1 -1
  76. data/app/views/hyrax/content_blocks/_form.html.erb +8 -7
  77. data/app/views/hyrax/dashboard/_index_partials/_current_proxy_rights.html.erb +17 -0
  78. data/app/views/hyrax/dashboard/collections/_collection_title.html.erb +1 -3
  79. data/app/views/hyrax/dashboard/collections/_default_group.html.erb +30 -0
  80. data/app/views/hyrax/dashboard/collections/_form_branding.html.erb +2 -2
  81. data/app/views/hyrax/dashboard/collections/_form_for_select_collection.html.erb +1 -1
  82. data/app/views/hyrax/dashboard/collections/_form_share.html.erb +2 -2
  83. data/app/views/hyrax/dashboard/collections/_list_collections.html.erb +13 -2
  84. data/app/views/hyrax/dashboard/show_user.html.erb +10 -9
  85. data/app/views/hyrax/my/collections/_list_collections.html.erb +10 -3
  86. data/app/views/hyrax/my/collections/_modal_add_subcollection.html.erb +1 -1
  87. data/app/views/hyrax/my/collections/_modal_add_to_collection.html.erb +1 -1
  88. data/app/views/hyrax/my/collections/_modal_delete_collections_deny.html.erb +14 -0
  89. data/app/views/hyrax/my/collections/index.html.erb +1 -0
  90. data/app/views/shared/_nav_safety_modal.html.erb +12 -0
  91. data/config/features.rb +4 -0
  92. data/config/initializers/samvera-nesting_indexer_initializer.rb +1 -0
  93. data/config/locales/hyrax.de.yml +26 -11
  94. data/config/locales/hyrax.en.yml +21 -6
  95. data/config/locales/hyrax.es.yml +17 -2
  96. data/config/locales/hyrax.fr.yml +17 -2
  97. data/config/locales/hyrax.it.yml +17 -2
  98. data/config/locales/hyrax.pt-BR.yml +17 -2
  99. data/config/locales/hyrax.zh.yml +17 -2
  100. data/config/locales/simple_form.en.yml +6 -27
  101. data/hyrax.gemspec +2 -2
  102. data/lib/generators/hyrax/assets_generator.rb +4 -0
  103. data/lib/generators/hyrax/install_generator.rb +10 -0
  104. data/lib/generators/hyrax/templates/app/assets/images/unauthorized.png +0 -0
  105. data/lib/generators/hyrax/templates/config/locales/hyrax.en.yml +6 -5
  106. data/lib/generators/hyrax/templates/config/tinymce.yml +12 -7
  107. data/lib/generators/hyrax/templates/db/migrate/20180406202557_add_badge_color_to_collection_types.rb.erb +5 -0
  108. data/lib/hyrax/configuration.rb +1 -1
  109. data/lib/hyrax/version.rb +1 -1
  110. data/spec/actors/hyrax/actors/collections_membership_actor_spec.rb +24 -0
  111. data/spec/actors/hyrax/actors/create_with_remote_files_actor_spec.rb +19 -1
  112. data/spec/actors/hyrax/actors/default_admin_set_actor_spec.rb +41 -8
  113. data/spec/actors/hyrax/actors/file_set_actor_spec.rb +4 -12
  114. data/spec/actors/hyrax/actors/generic_work_actor_spec.rb +3 -7
  115. data/spec/controllers/hyrax/admin/strategies_controller_spec.rb +13 -2
  116. data/spec/controllers/hyrax/batch_edits_controller_spec.rb +83 -8
  117. data/spec/controllers/hyrax/dashboard/collections_controller_spec.rb +3 -0
  118. data/spec/controllers/hyrax/downloads_controller_spec.rb +26 -5
  119. data/spec/controllers/hyrax/file_sets_controller_spec.rb +3 -6
  120. data/spec/controllers/hyrax/generic_works_controller_json_spec.rb +4 -4
  121. data/spec/controllers/hyrax/generic_works_controller_spec.rb +3 -23
  122. data/spec/controllers/hyrax/transfers_controller_spec.rb +1 -1
  123. data/spec/factories/admin_sets_lw.rb +215 -0
  124. data/spec/factories/collections.rb +10 -10
  125. data/spec/factory_tests/adminsets_factory_spec.rb +132 -0
  126. data/spec/factory_tests/collections_factory_spec.rb +3 -3
  127. data/spec/features/batch_create_spec.rb +5 -8
  128. data/spec/features/batch_edit_spec.rb +49 -2
  129. data/spec/features/collection_multi_membership_spec.rb +29 -14
  130. data/spec/features/collection_type_spec.rb +9 -2
  131. data/spec/features/create_work_admin_spec.rb +1 -1
  132. data/spec/features/create_work_spec.rb +1 -1
  133. data/spec/features/dashboard/collection_spec.rb +16 -12
  134. data/spec/features/edit_content_block_admin_spec.rb +29 -12
  135. data/spec/features/embargo_spec.rb +55 -0
  136. data/spec/features/proxy_spec.rb +3 -1
  137. data/spec/features/work_show_spec.rb +20 -4
  138. data/spec/forms/hyrax/forms/admin/collection_type_form_spec.rb +1 -0
  139. data/spec/indexers/hyrax/repository_reindexer_spec.rb +1 -1
  140. data/spec/jobs/attach_files_to_work_job_spec.rb +15 -3
  141. data/spec/jobs/batch_create_job_spec.rb +6 -6
  142. data/spec/jobs/create_work_job_spec.rb +1 -1
  143. data/spec/models/admin_set_spec.rb +10 -8
  144. data/spec/models/collection_spec.rb +1 -1
  145. data/spec/models/concerns/hyrax/collection_nesting_spec.rb +6 -3
  146. data/spec/models/flipflop_spec.rb +8 -0
  147. data/spec/models/hyrax/work_behavior_spec.rb +1 -1
  148. data/spec/presenters/hyrax/admin_set_presenter_spec.rb +70 -0
  149. data/spec/presenters/hyrax/collection_presenter_spec.rb +66 -0
  150. data/spec/renderers/hyrax/renderers/attribute_renderer_spec.rb +19 -0
  151. data/spec/services/hyrax/adapters/nesting_index_adapter_spec.rb +31 -21
  152. data/spec/services/hyrax/collection_types/create_service_spec.rb +7 -4
  153. data/spec/services/hyrax/collections/migration_service_spec.rb +204 -17
  154. data/spec/services/hyrax/collections/nested_collection_persistence_service_spec.rb +1 -1
  155. data/spec/services/hyrax/collections/permissions_create_service_spec.rb +1 -1
  156. data/spec/services/hyrax/collections/permissions_service_spec.rb +4 -0
  157. data/spec/services/hyrax/default_middleware_stack_spec.rb +1 -1
  158. data/spec/services/hyrax/multiple_membership_checker_spec.rb +4 -4
  159. data/spec/services/hyrax/workflow/grant_edit_to_depositor_spec.rb +1 -1
  160. data/spec/services/hyrax/workflow/grant_read_to_depositor_spec.rb +1 -1
  161. data/spec/services/hyrax/workflow/revoke_edit_from_depositor_spec.rb +1 -1
  162. data/spec/spec_helper.rb +35 -2
  163. data/spec/support/features/batch_edit_actions.rb +1 -1
  164. data/spec/support/selectors.rb +15 -0
  165. data/spec/views/hyrax/admin/admin_sets/_show_actions.html.erb_spec.rb +66 -0
  166. data/spec/views/hyrax/admin/admin_sets/show.html.erb_spec.rb +5 -34
  167. data/spec/views/hyrax/admin/collection_types/_form.html.erb_spec.rb +3 -1
  168. data/spec/views/hyrax/admin/collection_types/_form_appearance.html.erb_spec.rb +22 -0
  169. data/spec/views/hyrax/admin/collection_types/_form_participants.html.erb_spec.rb +11 -3
  170. data/spec/views/hyrax/base/_items.html.erb_spec.rb +46 -0
  171. data/spec/views/hyrax/base/_relationships.html.erb_spec.rb +1 -1
  172. data/spec/views/hyrax/base/_show_actions.html.erb_spec.rb +4 -2
  173. data/spec/views/hyrax/dashboard/collections/_default_group.html.erb_spec.rb +43 -0
  174. data/spec/views/hyrax/dashboard/collections/_list_collections.html.erb_spec.rb +51 -0
  175. data/spec/views/hyrax/dashboard/collections/show.html.erb_spec.rb +1 -0
  176. data/spec/views/hyrax/dashboard/show_user_spec.rb +5 -2
  177. data/spec/views/hyrax/my/collections/_list_collections.html.erb_spec.rb +2 -0
  178. data/template.rb +1 -1
  179. metadata +30 -13
  180. data/app/views/hyrax/content_blocks/_modal_content_block.html.erb +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: be1e8653f1cbe02d0084c4e9d5ad3ae86452030c
4
- data.tar.gz: 3195a5f77e3b68b97ad86b0d441340037f2c5617
3
+ metadata.gz: 7758e362b3ead3c21f48bf9cf6763565ea0304fb
4
+ data.tar.gz: 3788d88af39d4ab5b81a17bb94bf90d39e2852fa
5
5
  SHA512:
6
- metadata.gz: eca96b7e93e799c6540995b8607f0c696350e125030475c7e15ac567f1c048ed05a851f656b04c2a72c258e26d1c95cf08e52f79f87c1446269e055d626e8de4
7
- data.tar.gz: 155ac39bca91ca478e0856b27a6487ff9976e7dddee5b22a4ed6b3323f109e3dc1310bdd82fb529a542cb9603926d571df8e23b65f73c9a14323025ed502d159
6
+ metadata.gz: 4c1e3c4e80619330f7e5dd1d624a38296618d2dc40e371485d70039e52068af1dbb9593cea59a5aac0a6951b392b82800426d530a13825523517637ce9cac7e7
7
+ data.tar.gz: 02d3518cccfd2c631cda0e27b1dfa200bbbec739c184d211da2d9ec215f663d19f13623009bd5bc96fef967152244729acb9def82aa67d320543d44c12907636
@@ -22,15 +22,15 @@ mutual respect and reasoned argument.
22
22
  Community members work together to promote a respectful and safe
23
23
  community. In the event that someone’s conduct is causing offence or
24
24
  distress, Samvera has a detailed
25
- [Anti-Harassment Policy and Protocol](https://wiki.duraspace.org/display/hydra/Anti-Harassment+Policy)
25
+ [Anti-Harassment Policy and Protocol](https://wiki.duraspace.org/display/samvera/Anti-Harassment+Policy)
26
26
  which can be applied to address the problem. The first step in dealing
27
27
  with any serious misconduct is to contact a local meeting organizer,
28
28
  the
29
- [Samvera community helpers](https://wiki.duraspace.org/display/hydra/Hydra+Community+Helpers)
30
- ([email](mailto:helpers@projecthydra.org)), a community member you
29
+ [Samvera community helpers](https://wiki.duraspace.org/display/samvera/Samvera+Community+Helpers)
30
+ ([email](mailto:helpers@samvera.org)), a community member you
31
31
  trust, or the
32
- [Samvera Steering Group](https://wiki.duraspace.org/display/hydra/Samvera+Steering+Group+membership)
32
+ [Samvera Steering Group](https://wiki.duraspace.org/display/samvera/Samvera+Steering+Group+membership)
33
33
  immediately; at Samvera events, these people can be identified by
34
34
  distinctive name badges. The
35
- [Policy and Protocol](https://wiki.duraspace.org/display/hydra/Anti-Harassment+Policy)
35
+ [Policy and Protocol](https://wiki.duraspace.org/display/samvera/Anti-Harassment+Policy)
36
36
  should be consulted for fuller details.
@@ -18,7 +18,7 @@ All code contributors must have an Individual Contributor License Agreement
18
18
  an institution, the institution must have a Corporate Contributor License
19
19
  Agreement (cCLA) on file.
20
20
 
21
- https://wiki.duraspace.org/display/hydra/Hydra+Project+Intellectual+Property+Licensing+and+Ownership
21
+ https://wiki.duraspace.org/display/samvera/Samvera+Community+Intellectual+Property+Licensing+and+Ownership
22
22
 
23
23
  You should also add yourself to the `CONTRIBUTORS.md` file in the root of the project.
24
24
 
@@ -164,6 +164,6 @@ If you are uncertain, bring other contributors into the conversation by assignin
164
164
  # Additional Resources
165
165
 
166
166
  * [General GitHub documentation](http://help.github.com/)
167
- * [GitHub pull request documentation](http://help.github.com/send-pull-requests/)
167
+ * [GitHub pull request documentation](https://help.github.com/articles/about-pull-requests/)
168
168
  * [Pro Git](http://git-scm.com/book) is both a free and excellent book about Git.
169
169
  * [A Git Config for Contributing](http://ndlib.github.io/practices/my-typical-per-project-git-config/)
data/.rubocop.yml CHANGED
@@ -24,6 +24,7 @@ Metrics/BlockLength:
24
24
  - 'app/models/concerns/hyrax/content_block_behavior.rb'
25
25
  - 'app/services/hyrax/workflow/workflow_schema.rb'
26
26
  - 'config/initializers/simple_form.rb'
27
+ - 'config/features.rb'
27
28
  - 'config/routes.rb'
28
29
  - 'lib/generators/hyrax/templates/catalog_controller.rb'
29
30
  - 'lib/generators/hyrax/templates/config/initializers/simple_form_bootstrap.rb'
data/.rubocop_fixme.yml CHANGED
@@ -6,6 +6,7 @@ Metrics/ClassLength:
6
6
  Exclude:
7
7
  - 'app/controllers/hyrax/dashboard/collections_controller.rb'
8
8
  - 'app/controllers/hyrax/admin/admin_sets_controller.rb'
9
+ - 'app/controllers/hyrax/batch_edits_controller.rb'
9
10
  - 'app/controllers/hyrax/downloads_controller.rb'
10
11
  - 'app/controllers/hyrax/file_sets_controller.rb'
11
12
  - 'app/forms/hyrax/forms/permission_template_form.rb'
@@ -83,6 +84,7 @@ RSpec/ExampleLength:
83
84
  - 'spec/actors/hyrax/actors/file_set_actor_spec.rb'
84
85
  - 'spec/actors/hyrax/actors/generic_work_actor_spec.rb'
85
86
  - 'spec/controllers/hyrax/api/items_controller_spec.rb'
87
+ - 'spec/controllers/hyrax/batch_edits_controller_spec.rb'
86
88
  - 'spec/controllers/hyrax/batch_uploads_controller_spec.rb'
87
89
  - 'spec/controllers/hyrax/file_sets_controller_spec.rb'
88
90
  - 'spec/controllers/hyrax/generic_works_controller_spec.rb'
data/Gemfile CHANGED
@@ -5,6 +5,7 @@ gemspec
5
5
 
6
6
  group :development, :test do
7
7
  gem 'coveralls', require: false
8
+ gem 'i18n-tasks'
8
9
  gem 'pry' unless ENV['CI']
9
10
  gem 'pry-byebug' unless ENV['CI']
10
11
  gem "simplecov", require: false
data/README.md CHANGED
@@ -63,7 +63,7 @@ The Samvera community is here to help. Please see our [support guide](./.github/
63
63
  # Getting started
64
64
 
65
65
  This document contains instructions specific to setting up an app with __Hyrax
66
- v2.1.0.beta2__. If you are looking for instructions on installing a different
66
+ v2.1.0.rc1__. If you are looking for instructions on installing a different
67
67
  version, be sure to select the appropriate branch or tag from the drop-down
68
68
  menu above.
69
69
 
@@ -162,7 +162,7 @@ NOTE: The steps need to be done in order to create a new Hyrax based app.
162
162
  Generate a new Rails application using the template.
163
163
 
164
164
  ```
165
- rails _5.0.6_ new my_app -m https://raw.githubusercontent.com/samvera/hyrax/v2.1.0.beta2/template.rb
165
+ rails _5.0.6_ new my_app -m https://raw.githubusercontent.com/samvera/hyrax/v2.1.0.rc1/template.rb
166
166
  ```
167
167
 
168
168
  Generating a new Rails application using Hyrax's template above takes cares of a number of steps for you, including:
@@ -172,6 +172,7 @@ Generating a new Rails application using Hyrax's template above takes cares of a
172
172
  * Running Hyrax's install generator, to add a number of files that Hyrax requires within your Rails app, including e.g. database migrations
173
173
  * Loading all of Hyrax's database migrations into your application's database
174
174
  * Loading Hyrax's default workflows into your application's database
175
+ * Create default collection types (e.g. Admin Set, User Collection)
175
176
 
176
177
  ## Start servers
177
178
 
@@ -79,6 +79,7 @@ module Hyrax
79
79
  Deprecation.warn(self, ':member_of_collection_ids has been deprecated for removal in Hyrax 3.0. ' \
80
80
  'use :member_of_collections_attributes instead.')
81
81
 
82
+ collection_ids = [] if collection_ids.empty?
82
83
  other_collections = collections_without_edit_access(env)
83
84
 
84
85
  collections = ::Collection.find(collection_ids)
@@ -102,6 +103,8 @@ module Hyrax
102
103
  # along side the FileSets on the show page
103
104
  def add(env, id)
104
105
  collection = Collection.find(id)
106
+ collection.reindex_extent = Hyrax::Adapters::NestingIndexAdapter::LIMITED_REINDEX
107
+
105
108
  return unless env.current_ability.can?(:deposit, collection)
106
109
  env.curation_concern.member_of_collections << collection
107
110
  end
@@ -55,14 +55,15 @@ module Hyrax
55
55
  Rails.logger.error "User #{env.user.user_key} attempted to ingest file from url #{file_info[:url]}, which doesn't pass validation"
56
56
  return false
57
57
  end
58
- create_file_from_url(env, uri, file_info[:file_name])
58
+ auth_header = file_info.fetch(:auth_header, {})
59
+ create_file_from_url(env, uri, file_info[:file_name], auth_header)
59
60
  end
60
61
  true
61
62
  end
62
63
 
63
64
  # Generic utility for creating FileSet from a URL
64
65
  # Used in to import files using URLs from a file picker like browse_everything
65
- def create_file_from_url(env, uri, file_name)
66
+ def create_file_from_url(env, uri, file_name, auth_header = {})
66
67
  ::FileSet.new(import_url: uri.to_s, label: file_name) do |fs|
67
68
  actor = Hyrax::Actors::FileSetActor.new(fs, env.user)
68
69
  actor.create_metadata(visibility: env.curation_concern.visibility)
@@ -73,7 +74,7 @@ module Hyrax
73
74
  file_path = CGI.unescape(uri.path)
74
75
  IngestLocalFileJob.perform_later(fs, file_path, env.user)
75
76
  else
76
- ImportUrlJob.perform_later(fs, operation_for(user: actor.user))
77
+ ImportUrlJob.perform_later(fs, operation_for(user: actor.user), auth_header)
77
78
  end
78
79
  end
79
80
  end
@@ -10,24 +10,27 @@ module Hyrax
10
10
  # @param [Hyrax::Actors::Environment] env
11
11
  # @return [Boolean] true if create was successful
12
12
  def create(env)
13
- ensure_admin_set_attribute!(env.attributes)
13
+ ensure_admin_set_attribute!(env)
14
14
  next_actor.create(env)
15
15
  end
16
16
 
17
17
  # @param [Hyrax::Actors::Environment] env
18
18
  # @return [Boolean] true if update was successful
19
19
  def update(env)
20
- ensure_admin_set_attribute!(env.attributes)
20
+ ensure_admin_set_attribute!(env)
21
21
  next_actor.update(env)
22
22
  end
23
23
 
24
24
  private
25
25
 
26
- def ensure_admin_set_attribute!(attributes)
27
- if attributes[:admin_set_id].present?
28
- ensure_permission_template!(admin_set_id: attributes[:admin_set_id])
26
+ def ensure_admin_set_attribute!(env)
27
+ if env.attributes[:admin_set_id].present?
28
+ ensure_permission_template!(admin_set_id: env.attributes[:admin_set_id])
29
+ elsif env.curation_concern.admin_set_id.present?
30
+ env.attributes[:admin_set_id] = env.curation_concern.admin_set_id
31
+ ensure_permission_template!(admin_set_id: env.attributes[:admin_set_id])
29
32
  else
30
- attributes[:admin_set_id] = default_admin_set_id
33
+ env.attributes[:admin_set_id] = default_admin_set_id
31
34
  end
32
35
  end
33
36
 
@@ -54,6 +54,7 @@
54
54
  //= require hyrax/browse_everything
55
55
  //= require hyrax/search
56
56
  //= require hyrax/content_blocks
57
+ //= require hyrax/nav_safety
57
58
  //= require hyrax/ga_events
58
59
  //= require hyrax/select_submit
59
60
  //= require hyrax/tabs
@@ -86,7 +87,9 @@
86
87
  //= require hyrax/relationships
87
88
  //= require hyrax/select_work_type
88
89
  //= require hyrax/collections
90
+ //= require hyrax/collections_v2
89
91
  //= require hyrax/collection_types
92
+ //= require hyrax/collections_utils
90
93
  //= require hyrax/select_collection_type
91
94
  //= require hydra-editor/hydra-editor
92
95
  //= require nestable
@@ -13,8 +13,10 @@ Hyrax = {
13
13
  this.datatable();
14
14
  this.adminSetEditor();
15
15
  this.collectionEditor();
16
+ this.collectionsV2();
16
17
  this.collectionTypes();
17
18
  this.collectionTypeEditor();
19
+ this.collectionUtilities();
18
20
  this.adminStatisticsGraphs();
19
21
  this.tinyMCE();
20
22
  this.sortAndPerPage();
@@ -49,12 +51,24 @@ Hyrax = {
49
51
  var controls = new CollectionControls($('#collection_permissions'));
50
52
  },
51
53
 
54
+ // Collections v2 - collections related js should (over time) be moved here
55
+ // from 'collections.js' to take advantage of shared modules
56
+ collectionsV2: function() {
57
+ var CollectionsV2 = require('hyrax/collections_v2');
58
+ new CollectionsV2();
59
+ },
60
+
52
61
  // Collection types
53
62
  collectionTypes: function() {
54
63
  var CollectionTypes = require('hyrax/collection_types');
55
64
  var collection_types = new CollectionTypes($('.collection-types-wrapper'))
56
65
  },
57
66
 
67
+ collectionUtilities: function() {
68
+ var CollectionUtilities = require('hyrax/collections_utils');
69
+ new CollectionUtilities();
70
+ },
71
+
58
72
  // Pretty graphs on the dashboard page
59
73
  adminStatisticsGraphs: function() {
60
74
  var AdminGraphs = require('hyrax/admin/graphs');
@@ -159,7 +159,8 @@ function batch_edit_init () {
159
159
  setTimeout(ajaxManager.runNow(), 100);
160
160
  }
161
161
 
162
- $("#permissions_save").click(runSave);
162
+ $("#permissions_visibility_save").click(runSave);
163
+ $("#permissions_roles_save").click(runSave);
163
164
  $(".field-save").click(runSave);
164
165
  }
165
166
 
@@ -1,65 +1,126 @@
1
- export default class CollectionTypes {
1
+ import CollectionUtilities from 'hyrax/collections_utils';
2
2
 
3
+ export default class CollectionTypes {
3
4
  constructor(element) {
5
+ this.collectionUtilities = new CollectionUtilities();
6
+
4
7
  if (element.length > 0) {
5
- this.handleCollapseToggle()
6
- this.handleDelete()
8
+ this.handleCollapseToggle();
9
+ this.handleDelete();
10
+
11
+ // Edit Collection Type
12
+ this.setupAddParticipantsHandler();
13
+ this.participantsAddButtonDisabler();
7
14
  }
8
15
  }
9
16
 
17
+ setupAddParticipantsHandler() {
18
+ const { addParticipants } = this.collectionUtilities;
19
+ const wrapEl = '.form-add-participants-wrapper';
20
+ const url = '/admin/collection_type_participants?locale=en';
21
+
22
+ $('#participants')
23
+ .find('.add-participants-form input[type="submit"]')
24
+ .on(
25
+ 'click',
26
+ {
27
+ wrapEl,
28
+ // This is a callback (seems odd here because just passing in a string value),
29
+ // because other urls need to be calculated with an id or other param only truly
30
+ // known from when we know the clicked element's place in DOM.
31
+ urlFn: e => url
32
+ },
33
+ addParticipants.handleAddParticipants.bind(addParticipants)
34
+ );
35
+ }
36
+
10
37
  handleCollapseToggle() {
11
- let $collapseHeader = $('a.collapse-header')
12
- let $collapseHeaderSpan = $('a.collapse-header').find('span')
38
+ let $collapseHeader = $('a.collapse-header');
39
+ let $collapseHeaderSpan = $('a.collapse-header').find('span');
40
+ const collapseText = $collapseHeader.data('collapseText');
41
+ const expandText = $collapseHeader.data('expandText');
13
42
 
14
43
  // Toggle show/hide of collapsible content on bootstrap toggle events
15
44
  $('#collapseAbout').on('show.bs.collapse', () => {
16
- $collapseHeader.addClass('open')
17
- $collapseHeaderSpan.html('Less')
18
- })
45
+ $collapseHeader.addClass('open');
46
+ $collapseHeaderSpan.html(collapseText);
47
+ });
19
48
  $('#collapseAbout').on('hide.bs.collapse', () => {
20
- $collapseHeader.removeClass('open')
21
- $collapseHeaderSpan.html('More')
22
- })
49
+ $collapseHeader.removeClass('open');
50
+ $collapseHeaderSpan.html(expandText);
51
+ });
23
52
  }
24
53
 
25
54
  handleDelete() {
26
- let trData = null
55
+ let trData = null;
27
56
 
28
57
  // Click delete collections type button in the table row
29
- $('.delete-collection-type').on('click', (event) => {
30
- let dataset = event.target.dataset
31
- let collectionType = JSON.parse(dataset.collectionType) || null
32
- let hasCollections = dataset.hasCollections === 'true'
58
+ $('.delete-collection-type').on('click', event => {
59
+ let dataset = event.target.dataset;
60
+ let collectionType = JSON.parse(dataset.collectionType) || null;
61
+ let hasCollections = dataset.hasCollections === 'true';
33
62
  this.handleDelete_event_target = event.target;
34
63
  this.collectionType_id = collectionType.id;
35
64
 
36
65
  if (hasCollections === true) {
37
- $('.view-collections-of-this-type').attr('href',dataset.collectionTypeIndex)
38
- $('#deleteDenyModal').modal()
66
+ $('.view-collections-of-this-type').attr(
67
+ 'href',
68
+ dataset.collectionTypeIndex
69
+ );
70
+ $('#deleteDenyModal').modal();
39
71
  } else {
40
- $('#deleteModal').modal()
72
+ $('#deleteModal').modal();
41
73
  }
42
- })
74
+ });
43
75
 
44
76
  // Confirm delete collection type
45
- $('.confirm-delete-collection-type').on('click', (event) => {
46
- event.preventDefault();
47
- $.ajax({
48
- url: window.location.pathname + '/' + this.collectionType_id,
49
- type: 'DELETE',
50
- done: function(e) {
51
- $(this.handleDelete_event_target).parent('td').parent('tr').remove();
52
- let defaultButton = $(event.target).parent('div').find('.btn-default');
53
- defaultButton.trigger( 'click' );
54
- }
55
- })
56
- })
77
+ $('.confirm-delete-collection-type').on('click', event => {
78
+ event.preventDefault();
79
+ $.ajax({
80
+ url: window.location.pathname + '/' + this.collectionType_id,
81
+ type: 'DELETE',
82
+ done: function(e) {
83
+ $(this.handleDelete_event_target)
84
+ .parent('td')
85
+ .parent('tr')
86
+ .remove();
87
+ let defaultButton = $(event.target)
88
+ .parent('div')
89
+ .find('.btn-default');
90
+ defaultButton.trigger('click');
91
+ }
92
+ });
93
+ });
57
94
 
58
95
  // Confirm delete collection type
59
- $('.view-collections-of-this-type').on('click', (event) => {
60
- $('#deleteDenyModal').modal('hide')
61
- })
62
-
96
+ $('.view-collections-of-this-type').on('click', event => {
97
+ $('#deleteDenyModal').modal('hide');
98
+ });
63
99
  }
64
100
 
101
+ /**
102
+ * Set up enabling/disabling "Add" button for adding groups and/or users in
103
+ * Edit Collection Type > Participants tab
104
+ * @return {void}
105
+ */
106
+ participantsAddButtonDisabler() {
107
+ const { addParticipantsInputValidator } = this.collectionUtilities;
108
+ // Selector for the button to enable/disable
109
+ const buttonSelector = '.add-participants-form input[type="submit"]';
110
+ const inputsWrapper = '.form-add-participants-wrapper';
111
+
112
+ $('#participants')
113
+ .find(inputsWrapper)
114
+ .on(
115
+ 'change',
116
+ // custom data we need passed into the event handler
117
+ {
118
+ buttonSelector,
119
+ inputsWrapper
120
+ },
121
+ addParticipantsInputValidator.handleWrapperContentsChange.bind(
122
+ addParticipantsInputValidator
123
+ )
124
+ );
125
+ }
65
126
  }
@@ -240,27 +240,29 @@ Blacklight.onLoad(function () {
240
240
  };
241
241
  var $deleteWordingTarget = $('#selected-collections-delete-modal .pluralized');
242
242
 
243
- tableRows.each(function(i, row) {
244
- checkbox = $(row).find('td:first input[type=checkbox]');
245
- if (typeof checkbox[0] !== "undefined") {
246
- if (checkbox[0].checked) {
247
- numRowsSelected++;
248
- }
249
- }
250
- });
243
+ var canDeleteAll = true;
244
+ var selectedInputs = $('#documents table.collections-list-table tbody tr')
245
+ // Get all inputs in the table
246
+ .find('td:first input[type=checkbox]')
247
+ // Filter to those that are checked
248
+ .filter(function(i, checkbox) { return checkbox.checked; });
249
+
250
+ var cannotDeleteInputs = selectedInputs.filter(function(i, checkbox) { return checkbox.dataset.hasaccess === "false"; });
251
+ if(cannotDeleteInputs.length > 0) {
252
+ // TODO: Can we pass data to this modal to be more specific about which ones they cannot delete?
253
+ $('#collections-to-delete-deny-modal').modal('show');
254
+ return;
255
+ }
251
256
 
252
- if (numRowsSelected > 0) {
257
+ if (selectedInputs.length > 0) {
253
258
  // Collections are selected
254
259
  // Update singular / plural text in delete modal
255
- if (numRowsSelected > 1) {
260
+ if (selectedInputs.length > 1) {
256
261
  $deleteWordingTarget.text(deleteWording.plural);
257
262
  } else {
258
263
  $deleteWordingTarget.text(deleteWording.singular);
259
264
  }
260
265
  $('#selected-collections-delete-modal').modal('show');
261
- } else {
262
- // No collections are selected
263
- $('#collections-to-delete-deny-modal').modal('show');
264
266
  }
265
267
  });
266
268
 
@@ -317,40 +319,4 @@ Blacklight.onLoad(function () {
317
319
  $('#add-subcollection-modal-' + $(this).data('presenterId')).modal('show');
318
320
  });
319
321
 
320
-
321
- // Edit Collection: Sharing tab: Add Sharing section click handlers
322
- /*
323
- Notes:
324
- This is a workaround for a scoping issue with 'simple_form' and nested forms in the
325
- 'Edit Collections' partials. All tabs were wrapped in a 'simple_form'. Nested forms, for example inside a tab partial,
326
- have behaved erratically, so the pattern has been to remove nested form instances for relatively non-complex forms
327
- and replace with AJAX requests. For this instance of Add Sharing > Add user and Add group, seem more complex in how
328
- the form is built from '@form.permission_template', so since it's not working, but the form is already built, this
329
- code listens for a click event on the nested form submit button, prevents Default submit behavior, and manually makes
330
- the form post.
331
- */
332
- $('#participants').find('.edit-collection-add-sharing-button').on('click', function(e) {
333
- e.preventDefault();
334
- var $wrapEl = $(e.target).parents('.form-add-sharing-wrapper');
335
- if ($wrapEl.length === 0) {
336
- return;
337
- }
338
- var serialized = $wrapEl.find(':input').serialize(),
339
- url = '/dashboard/collections/' + $wrapEl.data('id') + '/permission_template?locale=en';
340
-
341
- if (serialized.length === 0) {
342
- return;
343
- }
344
-
345
- $.ajax({
346
- type: 'POST',
347
- url: url,
348
- data: serialized
349
- }).done(function(response) {
350
- // Success handler here, possibly show alert success if page didn't reload?
351
- }).fail(function(err) {
352
- console.error(err);
353
- });
354
-
355
- });
356
322
  });