hyrax 5.0.0.rc1 → 5.0.0.rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (431) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +25 -4
  3. data/.dassie/.env +5 -1
  4. data/.dassie/Gemfile +27 -42
  5. data/.dassie/Gemfile.dassie +2 -0
  6. data/.dassie/app/assets/config/manifest.js +2 -0
  7. data/.dassie/app/assets/stylesheets/hyrax.scss +1 -0
  8. data/.dassie/app/listeners/hyrax_listener.rb +81 -0
  9. data/.dassie/config/environments/test.rb +0 -5
  10. data/.dassie/config/initializers/hyrax.rb +5 -0
  11. data/.dassie/config/initializers/publisher.rb +3 -0
  12. data/.dassie/config/initializers/riiif.rb +82 -11
  13. data/.dassie/config/metadata/collection_resource.yaml +3 -0
  14. data/.dassie/config/metadata/monograph.yaml +8 -0
  15. data/.dassie/config/metadata/sample_metadata.yaml +1 -0
  16. data/.dassie/config/redis.yml +2 -0
  17. data/.dassie/db/migrate/20230725222727_create_hyrax_counter_metrics.hyrax.rb +14 -0
  18. data/.dassie/db/migrate/20230803165135_change_work_id_to_string.rb +5 -0
  19. data/.dassie/db/migrate/20230808102105_add_indices_to_hyrax_counter_metrics.hyrax.rb +8 -0
  20. data/.dassie/db/migrate/20230821153635_add_fields_to_counter_metric.rb +8 -0
  21. data/.dassie/db/schema.rb +20 -1
  22. data/.dockerignore +2 -1
  23. data/.gitignore +5 -1
  24. data/.koppie/.env +10 -4
  25. data/.koppie/Gemfile +10 -12
  26. data/.koppie/Gemfile.koppie +2 -0
  27. data/.koppie/Rakefile +0 -2
  28. data/.koppie/app/listeners/hyrax_listener.rb +81 -0
  29. data/.koppie/app/models/ability.rb +1 -5
  30. data/.koppie/app/models/collection.rb +1 -1
  31. data/.koppie/app/models/user.rb +0 -2
  32. data/.koppie/config/analytics.yml +5 -5
  33. data/.koppie/config/application.rb +2 -1
  34. data/.koppie/config/arkivo.yml +6 -0
  35. data/.koppie/config/blacklight.yml +2 -2
  36. data/.koppie/config/features.yml +2 -0
  37. data/.koppie/config/initializers/1_valkyrie.rb +29 -6
  38. data/.koppie/config/initializers/arkivo_constraint.rb +12 -0
  39. data/.koppie/config/initializers/hyrax.rb +2 -2
  40. data/.koppie/config/initializers/publisher.rb +3 -0
  41. data/.koppie/config/initializers/riiif.rb +84 -11
  42. data/.koppie/config/metadata/collection_resource.yaml +19 -1
  43. data/.koppie/config/metadata/generic_work.yaml +2 -0
  44. data/.koppie/config/metadata/monograph.yaml +10 -0
  45. data/.koppie/config/metadata/sample_metadata.yaml +4 -0
  46. data/.koppie/config/role_map.yml +3 -25
  47. data/.koppie/config/routes.rb +1 -2
  48. data/.koppie/config/solr.yml +1 -1
  49. data/.koppie/config/valkyrie_index.yml +4 -10
  50. data/.koppie/config/zotero.yml +6 -0
  51. data/.koppie/db/migrate/20230725222727_create_hyrax_counter_metrics.hyrax.rb +14 -0
  52. data/.koppie/db/migrate/20230803165135_change_work_id_to_string.rb +5 -0
  53. data/.koppie/db/schema.rb +12 -1
  54. data/CONTAINERS.md +39 -4
  55. data/Dockerfile +25 -13
  56. data/Gemfile +8 -24
  57. data/Gemfile.dassie +2 -0
  58. data/Gemfile.koppie +2 -0
  59. data/README.md +2 -1
  60. data/Rakefile +0 -11
  61. data/app/actors/hyrax/actors/base_actor.rb +6 -3
  62. data/app/actors/hyrax/actors/embargo_actor.rb +3 -6
  63. data/app/actors/hyrax/actors/file_actor.rb +1 -1
  64. data/app/actors/hyrax/actors/lease_actor.rb +3 -6
  65. data/app/assets/javascripts/hyrax/batch_select_all.js +1 -1
  66. data/app/assets/javascripts/hyrax/file_manager/member.es6 +1 -1
  67. data/app/assets/javascripts/hyrax/save_work/uploaded_files.es6 +10 -2
  68. data/app/assets/stylesheets/hyrax/_file-listing.scss +0 -2
  69. data/app/assets/stylesheets/hyrax/_work-show.scss +19 -3
  70. data/app/assets/stylesheets/hyrax/sidebar.scss +29 -1
  71. data/app/controllers/concerns/hyrax/collections_controller_behavior.rb +1 -1
  72. data/app/controllers/concerns/hyrax/embargoes_controller_behavior.rb +7 -1
  73. data/app/controllers/concerns/hyrax/leases_controller_behavior.rb +7 -1
  74. data/app/controllers/concerns/hyrax/local_file_downloads_controller_behavior.rb +12 -19
  75. data/app/controllers/concerns/hyrax/stream_file_downloads_controller_behavior.rb +54 -0
  76. data/app/controllers/concerns/hyrax/valkyrie_downloads_controller_behavior.rb +52 -18
  77. data/app/controllers/concerns/hyrax/works_controller_behavior.rb +69 -23
  78. data/app/controllers/hyrax/admin/admin_sets_controller.rb +2 -2
  79. data/app/controllers/hyrax/admin/analytics/work_reports_controller.rb +5 -5
  80. data/app/controllers/hyrax/api/items_controller.rb +2 -3
  81. data/app/controllers/hyrax/batch_edits_controller.rb +6 -6
  82. data/app/controllers/hyrax/batch_uploads_controller.rb +5 -1
  83. data/app/controllers/hyrax/dashboard/collections_controller.rb +6 -3
  84. data/app/controllers/hyrax/downloads_controller.rb +1 -0
  85. data/app/controllers/hyrax/file_sets_controller.rb +51 -7
  86. data/app/controllers/hyrax/my/collections_controller.rb +3 -1
  87. data/app/controllers/hyrax/single_use_links_viewer_controller.rb +16 -2
  88. data/app/forms/concerns/hyrax/basic_metadata_form_fields_behavior.rb +39 -0
  89. data/app/forms/concerns/hyrax/contained_in_works_behavior.rb +24 -0
  90. data/app/forms/concerns/hyrax/deposit_agreement_behavior.rb +12 -0
  91. data/app/forms/concerns/hyrax/leaseability_behavior.rb +49 -0
  92. data/app/forms/concerns/hyrax/permission_behavior.rb +20 -0
  93. data/app/forms/hyrax/forms/administrative_set_form.rb +1 -5
  94. data/app/forms/hyrax/forms/collection_form.rb +16 -12
  95. data/app/forms/hyrax/forms/dashboard/nest_collection_form.rb +0 -34
  96. data/app/forms/hyrax/forms/file_set_form.rb +7 -2
  97. data/app/forms/hyrax/forms/pcdm_collection_form.rb +1 -5
  98. data/app/forms/hyrax/forms/pcdm_object_form.rb +13 -1
  99. data/app/forms/hyrax/forms/permission_template_form.rb +0 -7
  100. data/app/forms/hyrax/forms/resource_batch_edit_form.rb +55 -22
  101. data/app/forms/hyrax/forms/resource_form.rb +31 -114
  102. data/app/forms/hyrax/forms.rb +52 -0
  103. data/app/helpers/hyrax/dashboard_helper_behavior.rb +13 -0
  104. data/app/helpers/hyrax/hyrax_helper_behavior.rb +2 -0
  105. data/app/indexers/concerns/hyrax/location_indexer.rb +25 -0
  106. data/app/indexers/{hyrax → concerns/hyrax}/permission_indexer.rb +2 -2
  107. data/app/indexers/{hyrax → concerns/hyrax}/visibility_indexer.rb +1 -1
  108. data/app/indexers/hyrax/administrative_set_indexer.rb +5 -17
  109. data/app/indexers/hyrax/indexers/administrative_set_indexer.rb +25 -0
  110. data/app/indexers/hyrax/indexers/file_set_indexer.rb +144 -0
  111. data/app/indexers/hyrax/indexers/pcdm_collection_indexer.rb +27 -0
  112. data/app/indexers/hyrax/indexers/pcdm_object_indexer.rb +72 -0
  113. data/app/indexers/hyrax/indexers/resource_indexer.rb +86 -0
  114. data/app/indexers/hyrax/indexers.rb +54 -0
  115. data/app/indexers/hyrax/pcdm_collection_indexer.rb +5 -26
  116. data/app/indexers/hyrax/valkyrie_collection_indexer.rb +6 -4
  117. data/app/indexers/hyrax/valkyrie_file_set_indexer.rb +5 -141
  118. data/app/indexers/hyrax/valkyrie_indexer.rb +8 -112
  119. data/app/indexers/hyrax/valkyrie_work_indexer.rb +5 -63
  120. data/app/indexers/hyrax/work_indexer.rb +1 -0
  121. data/app/inputs/controlled_vocabulary_input.rb +1 -1
  122. data/app/jobs/characterize_job.rb +1 -1
  123. data/app/jobs/create_work_job.rb +37 -4
  124. data/app/jobs/valkyrie_characterization_job.rb +9 -0
  125. data/app/jobs/valkyrie_ingest_job.rb +1 -3
  126. data/app/models/admin_set.rb +20 -1
  127. data/app/models/collection.rb +5 -0
  128. data/app/models/collection_branding_info.rb +2 -9
  129. data/app/models/concerns/hyrax/ability/admin_set_ability.rb +13 -28
  130. data/app/models/concerns/hyrax/ability/collection_ability.rb +26 -28
  131. data/app/models/concerns/hyrax/ability/resource_ability.rb +19 -0
  132. data/app/models/concerns/hyrax/ability.rb +12 -9
  133. data/app/models/concerns/hyrax/collection_behavior.rb +12 -12
  134. data/app/models/concerns/hyrax/solr_document_behavior.rb +33 -6
  135. data/app/models/concerns/hyrax/work_behavior.rb +4 -0
  136. data/app/models/featured_work.rb +12 -4
  137. data/app/models/file_set.rb +5 -0
  138. data/app/models/hyrax/administrative_set.rb +1 -1
  139. data/app/models/hyrax/change_set.rb +2 -2
  140. data/app/models/hyrax/counter_metric.rb +7 -0
  141. data/app/models/hyrax/file_metadata.rb +37 -9
  142. data/app/models/hyrax/file_set.rb +77 -24
  143. data/app/models/hyrax/group.rb +9 -38
  144. data/app/models/hyrax/group_behavior.rb +58 -0
  145. data/app/models/hyrax/model_registry.rb +111 -0
  146. data/app/models/hyrax/orcid_validator.rb +0 -6
  147. data/app/models/hyrax/pcdm_collection.rb +1 -7
  148. data/app/models/hyrax/resource.rb +66 -8
  149. data/app/models/hyrax/statistic.rb +1 -1
  150. data/app/models/hyrax/work.rb +3 -12
  151. data/app/presenters/hyrax/collapsable_section_presenter.rb +7 -3
  152. data/app/presenters/hyrax/collection_presenter.rb +0 -17
  153. data/app/presenters/hyrax/embargo_presenter.rb +4 -0
  154. data/app/presenters/hyrax/file_set_presenter.rb +8 -6
  155. data/app/presenters/hyrax/lease_presenter.rb +4 -0
  156. data/app/presenters/hyrax/menu_presenter.rb +14 -2
  157. data/app/presenters/hyrax/pcdm_member_presenter_factory.rb +7 -5
  158. data/app/presenters/hyrax/version_list_presenter.rb +25 -14
  159. data/app/presenters/hyrax/version_presenter.rb +19 -4
  160. data/app/search_builders/hyrax/admin_set_search_builder.rb +1 -1
  161. data/app/search_builders/hyrax/catalog_search_builder.rb +2 -2
  162. data/app/search_builders/hyrax/dashboard/collections_search_builder.rb +5 -3
  163. data/app/search_builders/hyrax/exposed_models_relation.rb +1 -1
  164. data/app/search_builders/hyrax/file_set_search_builder.rb +1 -1
  165. data/app/search_builders/hyrax/filter_by_type.rb +3 -2
  166. data/app/search_builders/hyrax/member_with_files_search_builder.rb +1 -1
  167. data/app/search_builders/hyrax/my/collections_search_builder.rb +2 -2
  168. data/app/search_builders/hyrax/my/find_works_search_builder.rb +8 -3
  169. data/app/services/hyrax/access_control_list.rb +21 -4
  170. data/app/services/hyrax/action/create_valkyrie_work.rb +80 -0
  171. data/app/services/hyrax/admin_set_create_service.rb +7 -20
  172. data/app/services/hyrax/admin_set_service.rb +2 -2
  173. data/app/services/hyrax/characterization/valkyrie_characterization_service.rb +5 -0
  174. data/app/services/hyrax/collections/collection_member_search_service.rb +2 -0
  175. data/app/services/hyrax/collections/collection_member_service.rb +1 -1
  176. data/app/services/hyrax/collections/permissions_service.rb +27 -9
  177. data/app/services/hyrax/custom_queries/find_collections_by_type.rb +1 -1
  178. data/app/services/hyrax/custom_queries/find_file_metadata.rb +1 -1
  179. data/app/services/hyrax/custom_queries/navigators/find_files.rb +1 -1
  180. data/app/services/hyrax/custom_queries/navigators/parent_work_navigator.rb +1 -1
  181. data/app/services/hyrax/edit_permissions_service.rb +1 -1
  182. data/app/services/hyrax/embargo_manager.rb +44 -17
  183. data/app/services/hyrax/embargo_service.rb +12 -10
  184. data/app/services/hyrax/file_set_derivatives_service.rb +11 -11
  185. data/app/services/hyrax/file_set_file_service.rb +21 -10
  186. data/app/services/hyrax/fixity_check_failure_service.rb +1 -1
  187. data/app/services/hyrax/form_factory.rb +1 -1
  188. data/app/services/hyrax/identifier/dispatcher.rb +9 -2
  189. data/app/services/hyrax/lease_manager.rb +39 -16
  190. data/app/services/hyrax/lease_service.rb +12 -6
  191. data/app/services/hyrax/listeners/acl_index_listener.rb +1 -1
  192. data/app/services/hyrax/listeners/active_fedora_acl_index_listener.rb +1 -1
  193. data/app/services/hyrax/listeners/file_metadata_listener.rb +14 -6
  194. data/app/services/hyrax/listeners/member_cleanup_listener.rb +12 -24
  195. data/app/services/hyrax/listeners/metadata_index_listener.rb +11 -0
  196. data/app/services/hyrax/listeners/object_lifecycle_listener.rb +5 -1
  197. data/app/services/hyrax/listeners/trophy_cleanup_listener.rb +2 -1
  198. data/app/services/hyrax/listeners/workflow_listener.rb +13 -0
  199. data/app/services/hyrax/listeners.rb +2 -1
  200. data/app/services/hyrax/location_service.rb +3 -0
  201. data/app/services/hyrax/lock_manager.rb +1 -2
  202. data/app/services/hyrax/multiple_membership_checker.rb +1 -1
  203. data/app/services/hyrax/simple_schema_loader.rb +32 -1
  204. data/app/services/hyrax/solr_service.rb +19 -5
  205. data/app/services/hyrax/statistics/collections/over_time.rb +1 -1
  206. data/app/services/hyrax/statistics/query_service.rb +6 -0
  207. data/app/services/hyrax/valkyrie_persist_derivatives.rb +12 -5
  208. data/app/services/hyrax/valkyrie_upload.rb +13 -27
  209. data/app/services/hyrax/versioning_service.rb +29 -15
  210. data/app/services/hyrax/work_uploads_handler.rb +6 -5
  211. data/app/validators/hyrax/collection_membership_validator.rb +1 -1
  212. data/app/views/_user_util_links.html.erb +1 -1
  213. data/app/views/catalog/_search_form.html.erb +1 -1
  214. data/app/views/collections/edit_fields/_based_near.html.erb +11 -7
  215. data/app/views/hyrax/admin/admin_sets/_form_participants.html.erb +67 -67
  216. data/app/views/hyrax/admin/admin_sets/edit.html.erb +1 -1
  217. data/app/views/hyrax/admin/collection_types/_form_participants.html.erb +3 -1
  218. data/app/views/hyrax/admin/collection_types/index.html.erb +1 -1
  219. data/app/views/hyrax/base/_attribute_rows.html.erb +1 -0
  220. data/app/views/hyrax/base/_base_form_files_prepend.html.erb +4 -0
  221. data/app/views/hyrax/base/_file_manager_resource_form.html.erb +1 -1
  222. data/app/views/hyrax/base/_form_files.html.erb +65 -64
  223. data/app/views/hyrax/base/_form_visibility_component.html.erb +4 -4
  224. data/app/views/hyrax/base/_show_actions.html.erb +1 -1
  225. data/app/views/hyrax/base/_workflow_actions.html.erb +25 -23
  226. data/app/views/hyrax/base/show.html.erb +2 -3
  227. data/app/views/hyrax/base/show.json.jbuilder +2 -1
  228. data/app/views/hyrax/collections/_show_document_list_row.html.erb +1 -1
  229. data/app/views/hyrax/collections/show.html.erb +7 -9
  230. data/app/views/hyrax/dashboard/_sidebar.html.erb +4 -3
  231. data/app/views/hyrax/dashboard/collections/_form_share_table.html.erb +2 -2
  232. data/app/views/hyrax/dashboard/collections/_list_collections.html.erb +1 -1
  233. data/app/views/hyrax/dashboard/collections/_show_document_list_row.html.erb +1 -1
  234. data/app/views/hyrax/dashboard/collections/_sort_and_per_page.html.erb +3 -3
  235. data/app/views/hyrax/file_sets/_versioning.html.erb +5 -5
  236. data/app/views/hyrax/file_sets/media_display/_audio.html.erb +5 -5
  237. data/app/views/hyrax/file_sets/media_display/_default.html.erb +1 -1
  238. data/app/views/hyrax/file_sets/media_display/_video.html.erb +3 -3
  239. data/app/views/hyrax/my/_search_form.html.erb +1 -1
  240. data/app/views/hyrax/my/facet.html.erb +1 -1
  241. data/app/views/hyrax/notifications/_notifications.html.erb +1 -1
  242. data/app/views/hyrax/users/_vitals.html.erb +1 -1
  243. data/app/views/layouts/_head_tag_content.html.erb +1 -0
  244. data/app/views/shared/_footer.html.erb +1 -1
  245. data/bin/dev-entrypoint.sh +13 -0
  246. data/chart/hyrax/Chart.yaml +5 -5
  247. data/chart/hyrax/templates/_helpers.tpl +8 -0
  248. data/chart/hyrax/templates/configmap-env.yaml +1 -1
  249. data/chart/hyrax/values.yaml +12 -1
  250. data/config/initializers/file_length_patch.rb +10 -0
  251. data/config/initializers/listeners.rb +1 -1
  252. data/config/locales/hyrax.de.yml +5 -0
  253. data/config/locales/hyrax.en.yml +10 -0
  254. data/config/locales/hyrax.es.yml +5 -0
  255. data/config/locales/hyrax.fr.yml +5 -0
  256. data/config/locales/hyrax.it.yml +5 -0
  257. data/config/locales/hyrax.pt-BR.yml +5 -0
  258. data/config/locales/hyrax.zh.yml +5 -0
  259. data/config/metadata/basic_metadata.yaml +53 -0
  260. data/config/metadata/core_metadata.yaml +6 -0
  261. data/config/metadata/file_set_metadata.yaml +21 -0
  262. data/config/metadata/hyrax_internal_metadata.yaml +57 -0
  263. data/docker-compose-koppie.yml +26 -25
  264. data/docker-compose-sirenia.yml +202 -0
  265. data/docker-compose.yml +27 -24
  266. data/documentation/developing-your-hyrax-based-app.md +77 -60
  267. data/hyrax.gemspec +18 -12
  268. data/karma.conf.js +1 -1
  269. data/lib/generators/hyrax/collection_resource/templates/collection_indexer.rb.erb +1 -1
  270. data/lib/generators/hyrax/collection_resource/templates/collection_metadata.yaml +2 -0
  271. data/lib/generators/hyrax/config_generator.rb +12 -0
  272. data/lib/generators/hyrax/install_generator.rb +37 -7
  273. data/lib/generators/hyrax/listeners_generator.rb +18 -0
  274. data/lib/generators/hyrax/models_generator.rb +1 -10
  275. data/lib/generators/hyrax/riiif_generator.rb +6 -4
  276. data/lib/generators/hyrax/templates/.env +9 -0
  277. data/lib/generators/hyrax/templates/.lando.yml +50 -0
  278. data/lib/generators/hyrax/templates/app/listeners/hyrax_listener.rb +81 -0
  279. data/lib/generators/hyrax/templates/app/models/file_set.rb +1 -2
  280. data/lib/generators/hyrax/templates/config/initializers/1_valkyrie.rb +102 -0
  281. data/lib/generators/hyrax/templates/config/initializers/file_services.rb +6 -0
  282. data/lib/generators/hyrax/templates/config/initializers/hyrax.rb +41 -5
  283. data/lib/generators/hyrax/templates/config/initializers/publisher.rb +3 -0
  284. data/lib/generators/hyrax/templates/config/initializers/riiif.rb +90 -19
  285. data/lib/generators/hyrax/templates/config/locales/hyrax.de.yml +1 -1
  286. data/lib/generators/hyrax/templates/config/locales/hyrax.en.yml +1 -1
  287. data/lib/generators/hyrax/templates/config/locales/hyrax.es.yml +1 -1
  288. data/lib/generators/hyrax/templates/config/locales/hyrax.fr.yml +1 -1
  289. data/lib/generators/hyrax/templates/config/locales/hyrax.it.yml +1 -1
  290. data/lib/generators/hyrax/templates/config/locales/hyrax.pt-BR.yml +1 -1
  291. data/lib/generators/hyrax/templates/config/locales/hyrax.zh.yml +1 -1
  292. data/lib/generators/hyrax/templates/config/redis.yml +3 -6
  293. data/lib/generators/hyrax/templates/config/valkyrie_index.yml +4 -9
  294. data/lib/generators/hyrax/templates/db/migrate/20230725222727_create_hyrax_counter_metrics.rb.erb +14 -0
  295. data/lib/generators/hyrax/templates/db/migrate/20230803165135_change_work_id_to_string.rb.erb +5 -0
  296. data/lib/generators/hyrax/templates/db/migrate/20230808102105_add_indices_to_hyrax_counter_metrics.rb.erb +8 -0
  297. data/lib/generators/hyrax/templates/db/migrate/20230821153635_add_fields_to_counter_metric.rb.erb +8 -0
  298. data/lib/generators/hyrax/templates/db/seeds.rb +1 -1
  299. data/lib/generators/hyrax/work_resource/templates/form.rb.erb +1 -1
  300. data/lib/generators/hyrax/work_resource/templates/indexer.rb.erb +1 -1
  301. data/lib/generators/hyrax/work_resource/templates/metadata.yaml +2 -0
  302. data/lib/hyrax/configuration.rb +241 -55
  303. data/lib/hyrax/controlled_vocabularies/location.rb +7 -1
  304. data/lib/hyrax/engine.rb +0 -1
  305. data/lib/hyrax/form_fields.rb +6 -0
  306. data/lib/hyrax/indexer.rb +1 -1
  307. data/lib/hyrax/publisher.rb +9 -2
  308. data/lib/hyrax/redis_event_store.rb +7 -8
  309. data/lib/hyrax/resource_name.rb +4 -0
  310. data/lib/hyrax/resource_sync/change_list_writer.rb +1 -1
  311. data/lib/hyrax/resource_sync/resource_list_writer.rb +1 -1
  312. data/lib/hyrax/specs/capybara.rb +26 -42
  313. data/lib/hyrax/specs/shared_specs/hydra_works.rb +112 -27
  314. data/lib/hyrax/specs/shared_specs/indexers.rb +25 -7
  315. data/lib/hyrax/transactions/admin_set_destroy.rb +2 -1
  316. data/lib/hyrax/transactions/collection_destroy.rb +3 -2
  317. data/lib/hyrax/transactions/container.rb +47 -0
  318. data/lib/hyrax/transactions/file_metadata_destroy.rb +20 -0
  319. data/lib/hyrax/transactions/file_set_destroy.rb +3 -1
  320. data/lib/hyrax/transactions/file_set_update.rb +21 -0
  321. data/lib/hyrax/transactions/steps/add_to_parent.rb +2 -1
  322. data/lib/hyrax/transactions/steps/check_for_default_admin_set.rb +32 -0
  323. data/lib/hyrax/transactions/steps/check_for_empty_admin_set.rb +1 -1
  324. data/lib/hyrax/transactions/steps/delete_all_file_metadata.rb +46 -0
  325. data/lib/hyrax/transactions/steps/delete_all_file_sets.rb +46 -0
  326. data/lib/hyrax/transactions/steps/file_metadata_delete.rb +40 -0
  327. data/lib/hyrax/transactions/steps/remove_from_membership.rb +45 -0
  328. data/lib/hyrax/transactions/steps/save.rb +2 -1
  329. data/lib/hyrax/transactions/steps/set_user_as_creator.rb +1 -1
  330. data/lib/hyrax/transactions/steps/update_work_members.rb +2 -0
  331. data/lib/hyrax/transactions/work_destroy.rb +3 -2
  332. data/lib/hyrax/version.rb +1 -1
  333. data/lib/hyrax.rb +1 -0
  334. data/lib/tasks/collection_type_global_id.rake +9 -4
  335. data/lib/tasks/embargo_lease.rake +2 -0
  336. data/lib/valkyrie/indexing/solr/indexing_adapter.rb +22 -6
  337. data/lib/wings/active_fedora_converter/default_work.rb +4 -5
  338. data/lib/wings/active_fedora_converter/file_metadata_node.rb +1 -1
  339. data/lib/wings/active_fedora_converter.rb +6 -0
  340. data/lib/wings/attribute_transformer.rb +24 -17
  341. data/lib/wings/model_registry.rb +8 -0
  342. data/lib/wings/model_transformer.rb +19 -10
  343. data/lib/wings/orm_converter.rb +27 -18
  344. data/lib/wings/services/custom_queries/find_ids_by_model.rb +2 -2
  345. data/lib/wings/setup.rb +2 -2
  346. data/lib/wings/valkyrie/query_service.rb +5 -2
  347. data/lib/wings/valkyrie/storage.rb +8 -90
  348. data/lib/wings.rb +8 -0
  349. data/spec/factories/access_control.rb +12 -0
  350. data/spec/factories/admin_sets.rb +32 -0
  351. data/spec/factories/admin_sets_lw.rb +222 -0
  352. data/spec/factories/administrative_sets.rb +79 -0
  353. data/spec/factories/api_items.rb +92 -0
  354. data/spec/factories/collection_branding_infos.rb +12 -0
  355. data/spec/factories/collection_type_participants.rb +9 -0
  356. data/spec/factories/collection_types.rb +139 -0
  357. data/spec/factories/collections.rb +282 -0
  358. data/spec/factories/collections_factory.rb +107 -0
  359. data/spec/factories/content_blocks.rb +5 -0
  360. data/spec/factories/counter_metrics.rb +12 -0
  361. data/spec/factories/featured_works.rb +5 -0
  362. data/spec/factories/file_sets.rb +45 -0
  363. data/spec/factories/generic_works.rb +200 -0
  364. data/spec/factories/hyrax_collection.rb +92 -0
  365. data/spec/factories/hyrax_default_admin_set.rb +7 -0
  366. data/spec/factories/hyrax_embargo.rb +18 -0
  367. data/spec/factories/hyrax_file_metadata.rb +92 -0
  368. data/spec/factories/hyrax_file_set.rb +129 -0
  369. data/spec/factories/hyrax_lease.rb +18 -0
  370. data/spec/factories/hyrax_resource.rb +15 -0
  371. data/spec/factories/hyrax_work.rb +221 -0
  372. data/spec/factories/object_id.rb +7 -0
  373. data/spec/factories/operations.rb +22 -0
  374. data/spec/factories/permission.rb +7 -0
  375. data/spec/factories/permission_template_accesses.rb +17 -0
  376. data/spec/factories/permission_templates.rb +111 -0
  377. data/spec/factories/proxy_deposit_requests.rb +7 -0
  378. data/spec/factories/single_use_links.rb +14 -0
  379. data/spec/factories/sipity_entities.rb +17 -0
  380. data/spec/factories/uploaded_files.rb +11 -0
  381. data/spec/factories/users.rb +52 -0
  382. data/spec/factories/workflow_actions.rb +7 -0
  383. data/spec/factories/workflow_states.rb +7 -0
  384. data/spec/factories/workflows.rb +7 -0
  385. data/spec/support/book_resource.rb +36 -0
  386. data/spec/support/can_can_overrides.rb +43 -0
  387. data/spec/support/clean_solr.rb +7 -0
  388. data/spec/support/controller_level_helpers.rb +27 -0
  389. data/spec/support/factory_helpers.rb +94 -0
  390. data/spec/support/fakes/fake_actor.rb +22 -0
  391. data/spec/support/fakes/fake_authority.rb +14 -0
  392. data/spec/support/fakes/fake_search_builder_scope.rb +44 -0
  393. data/spec/support/fakes/indexing_adapter.rb +17 -0
  394. data/spec/support/fakes/test_hydra_group_service.rb +55 -0
  395. data/spec/support/features/batch_edit_actions.rb +37 -0
  396. data/spec/support/features/session_helpers.rb +15 -0
  397. data/spec/support/features/workflow.rb +10 -0
  398. data/spec/support/features.rb +11 -0
  399. data/spec/support/form_with_validations.rb +15 -0
  400. data/spec/support/input_support.rb +12 -0
  401. data/spec/support/logging_formatter.rb +67 -0
  402. data/spec/support/matchers/api_responses.rb +27 -0
  403. data/spec/support/matchers/collection_type_property_matchers.rb +30 -0
  404. data/spec/support/matchers/embargo.rb +9 -0
  405. data/spec/support/matchers/lease.rb +9 -0
  406. data/spec/support/matchers/match_valkyrie_ids_with_af_ids.rb +12 -0
  407. data/spec/support/matchers/pcdm_matchers.rb +34 -0
  408. data/spec/support/matchers/permission.rb +31 -0
  409. data/spec/support/matchers/response_matchers.rb +8 -0
  410. data/spec/support/optional_example.rb +17 -0
  411. data/spec/support/rake.rb +42 -0
  412. data/spec/support/selectors.rb +112 -0
  413. data/spec/support/shared_examples_for_collection_presenter.rb +44 -0
  414. data/spec/support/simple_work.rb +28 -0
  415. data/spec/support/spec_statistic.rb +24 -0
  416. data/spec/support/speedup.rb +7 -0
  417. data/spec/support/statistic_helper.rb +10 -0
  418. data/spec/support/valkyrie_indexing.rb +2 -0
  419. data/spec/support/wings_models.rb +9 -0
  420. data/tasks/hyrax_dev.rake +2 -33
  421. data/template.rb +1 -3
  422. metadata +184 -84
  423. data/.engine_cart.yml +0 -3
  424. data/app/indexers/hyrax/resource_indexer.rb +0 -15
  425. data/app/services/hyrax/characterization/model_wrapper.rb +0 -0
  426. data/app/services/hyrax/custom_queries/find_by_collection_type.rb +0 -0
  427. data/app/services/hyrax/query_service.rb +0 -0
  428. data/app/views/hyrax/users/_user_util_links_extra.html.erb +0 -0
  429. data/lib/hyrax/specs/disable_animations_in_test_environment.rb +0 -53
  430. data/lib/hyrax/specs/shared_specs/valkyrie_storage_versions.rb +0 -9
  431. /data/app/indexers/{hyrax → concerns/hyrax}/thumbnail_indexer.rb +0 -0
data/.koppie/db/schema.rb CHANGED
@@ -10,7 +10,7 @@
10
10
  #
11
11
  # It's strongly recommended that you check this file into your version control system.
12
12
 
13
- ActiveRecord::Schema.define(version: 2021_12_07_172259) do
13
+ ActiveRecord::Schema.define(version: 2023_08_03_165135) do
14
14
 
15
15
  # These are extensions that must be enabled in order to support this database
16
16
  enable_extension "plpgsql"
@@ -140,6 +140,17 @@ ActiveRecord::Schema.define(version: 2021_12_07_172259) do
140
140
  t.index ["machine_id"], name: "index_hyrax_collection_types_on_machine_id", unique: true
141
141
  end
142
142
 
143
+ create_table "hyrax_counter_metrics", force: :cascade do |t|
144
+ t.string "worktype"
145
+ t.string "resource_type"
146
+ t.string "work_id"
147
+ t.date "date"
148
+ t.integer "total_item_investigations"
149
+ t.integer "total_item_requests"
150
+ t.datetime "created_at", precision: 6, null: false
151
+ t.datetime "updated_at", precision: 6, null: false
152
+ end
153
+
143
154
  create_table "hyrax_default_administrative_set", force: :cascade do |t|
144
155
  t.string "default_admin_set_id", null: false
145
156
  t.datetime "created_at", null: false
data/CONTAINERS.md CHANGED
@@ -5,10 +5,11 @@ Our goal is to provide a practical, reusable reference environment for applicati
5
5
 
6
6
  The [Hyrax Engine Development](#hyrax-engine-development) is further along than the [Docker Image for Hyrax-based Applications](#docker-image-for-hyrax-based-applications) which is further along than [Deploying to Production](#deploying-to-production).
7
7
 
8
- There are two options for development environments to run:
8
+ There are three options for development environments to run:
9
9
 
10
10
  - [Dassie](#dassie-internal-test-app-with-activefedora) is the default internal test app that will run an ActiveFedora-based Hyrax web application using Fedora 4 as the backend storage. See [Troubleshooting Dassie](#troubleshooting-dassie) if you encounter any issues.
11
11
  - [Koppie](#koppie-internal-test-app-with-valkyrie-connector-to-postgres) is a newer internal test app that is a Valkyrie-based Hyrax web application that runs with PostGres as backend storage. It does not run ActiveFedora or use Fedora 4. See [Troubleshooting Koppie](#troubleshooting-koppie) if you encounter any issues.
12
+ - [Sirenia](#sirenia-internal-test-app-with-valkyrie-connector-to-fedora) is Koppie but with Valkyrie configured to use Fedora 6 metadata and storage adapters.
12
13
 
13
14
  <!-- NOTE: This title is referenced in the top-level README.md. Keep that in mind if you change it. -->
14
15
  ## Hyrax Engine Development
@@ -37,6 +38,7 @@ This starts containers for:
37
38
  - Redis
38
39
  - Memcached
39
40
  - SideKiq (for background jobs)
41
+ - Chrome (for feature tests)
40
42
 
41
43
  It also runs database migrations. This will also bring up a development application on `http://localhost:3000`.
42
44
 
@@ -71,8 +73,6 @@ Let's break down the above command:
71
73
 
72
74
  _**Note:**_ The `bundle exec rspec` portion of the command runs the whole test suite. See the [rspec command documentation](https://github.com/rspec/rspec-core#the-rspec-command) for how to refine your test runs.
73
75
 
74
- _**Note**: The `/app/samvera/hyrax-webapp` is analogous to the `.internal_test_app` that we generate as part of the Hyrax engine Continuous Integration._
75
-
76
76
  #### The Docker Container Named "app"
77
77
 
78
78
  As a developer, you may need to run commands against the Hyrax-based application and/or the Hyrax engine. Examples
@@ -149,6 +149,7 @@ This starts containers for:
149
149
  - Redis
150
150
  - Memcached
151
151
  - SideKiq (for background jobs)
152
+ - Chrome (for feature tests)
152
153
 
153
154
  It also runs database migrations. This will also bring up a development application on `http://localhost:3001`.
154
155
 
@@ -185,13 +186,47 @@ echo "FROM samveralabs/hyrax" > Dockerfile
185
186
 
186
187
  _This is for applications that mount Hyrax and is separate from the docker containers for Hyrax engine development._
187
188
 
189
+ ### Sirenia Internal Test App with Valkyrie Connector to Fedora
190
+
191
+ Sirenia uses the same image as koppie. If you have not already done so, follow the build instructions for koppie above.
192
+
193
+ Start Sirenia: `docker compose -f docker-compose-sirenia.yml up`
194
+
195
+ This starts containers for:
196
+
197
+ - a `hyrax` test application (`.sirenia`);
198
+ - Fedora
199
+ - Solr
200
+ - Postgresql
201
+ - Redis
202
+ - Memcached
203
+ - SideKiq (for background jobs)
204
+ - Chrome (for feature tests)
205
+
206
+ It also runs database migrations. This will also bring up a development application on `http://localhost:3002`.
207
+
208
+ To stop the containers for the Hyrax-based application, type <kbd>Ctrl</kbd>+<kbd>c</kbd>. To restart the containers run `docker compose -f docker-compose-sirenia.yml up`.
209
+
210
+ _**Note:** Starting and stopping Docker in this way will preserve your data between restarts._
211
+
212
+ Sirenia runs as a different project than Dassie and Koppie, so it should be possible to run both concurrently (assuming your workstation has enough RAM).
213
+
214
+ #### Run rails console on Sirenia
215
+
216
+ Currently Sirenia should not be used for running specs. See [Code Changes and Testing](#code-changes-and-testing) under Dassie instead until the specs can be updated for a valkyrie only environment.
217
+
218
+ ```sh
219
+ docker compose -f docker-compose-sirenia.yml up
220
+ docker compose -f docker-compose-sirenia.yml exec app bundle exec rails c
221
+ ```
222
+
188
223
  ### Maintaining
189
224
 
190
225
  We publish several Hyrax images to the [GitHub container registry][ghcr] under
191
226
  the [Samvera organization][samvera-packages]. To build them:
192
227
 
193
228
  ```sh
194
- export HYRAX_VERSION=v5.0.0.rc1 # or desired version
229
+ export HYRAX_VERSION=v5.0.0.rc3 # or desired version
195
230
  git checkout hyrax-$HYRAX_VERSION
196
231
 
197
232
  docker build --target hyrax-base --tag ghcr.io/samvera/hyrax/hyrax-base:$(git rev-parse HEAD) .
data/Dockerfile CHANGED
@@ -1,8 +1,5 @@
1
- ARG ALPINE_VERSION=3.18
2
- ARG RUBY_VERSION=3.2.2
3
-
4
- FROM ruby:$RUBY_VERSION-alpine$ALPINE_VERSION as builder
5
- RUN apk add build-base curl jemalloc
1
+ ARG ALPINE_VERSION=3.19
2
+ ARG RUBY_VERSION=3.2.3
6
3
 
7
4
  FROM ruby:$RUBY_VERSION-alpine$ALPINE_VERSION as hyrax-base
8
5
 
@@ -16,6 +13,14 @@ RUN apk --no-cache upgrade && \
16
13
  curl \
17
14
  gcompat \
18
15
  imagemagick \
16
+ imagemagick-heic \
17
+ imagemagick-jpeg \
18
+ imagemagick-jxl \
19
+ imagemagick-pdf \
20
+ imagemagick-svg \
21
+ imagemagick-tiff \
22
+ imagemagick-webp \
23
+ jemalloc \
19
24
  tzdata \
20
25
  nodejs \
21
26
  yarn \
@@ -33,13 +38,11 @@ USER app
33
38
  RUN mkdir -p /app/samvera/hyrax-webapp
34
39
  WORKDIR /app/samvera/hyrax-webapp
35
40
 
36
- COPY --chown=1001:101 ./bin /app/samvera
37
- ENV PATH="/app/samvera:$PATH"
38
- ENV RAILS_ROOT="/app/samvera/hyrax-webapp"
39
- ENV RAILS_SERVE_STATIC_FILES="1"
40
-
41
- COPY --from=builder /usr/lib/libjemalloc.so.2 /usr/local/lib/
42
- ENV LD_PRELOAD="/usr/local/lib/libjemalloc.so.2"
41
+ COPY --chown=1001:101 ./bin/*.sh /app/samvera/
42
+ ENV PATH="/app/samvera:$PATH" \
43
+ RAILS_ROOT="/app/samvera/hyrax-webapp" \
44
+ RAILS_SERVE_STATIC_FILES="1" \
45
+ LD_PRELOAD="/usr/local/lib/libjemalloc.so.2"
43
46
 
44
47
  ENTRYPOINT ["hyrax-entrypoint.sh"]
45
48
  CMD ["bundle", "exec", "puma", "-v", "-b", "tcp://0.0.0.0:3000"]
@@ -89,6 +92,13 @@ ONBUILD RUN RAILS_ENV=production SECRET_KEY_BASE=`bin/rake secret` DB_ADAPTER=nu
89
92
 
90
93
  FROM hyrax-base as hyrax-engine-dev
91
94
 
95
+ USER root
96
+ RUN apk --no-cache add bash \
97
+ ffmpeg \
98
+ mediainfo \
99
+ perl
100
+ USER app
101
+
92
102
  ARG APP_PATH=.dassie
93
103
  ARG BUNDLE_WITHOUT=
94
104
 
@@ -100,7 +110,9 @@ COPY --chown=1001:101 . /app/samvera/hyrax-engine
100
110
  RUN bundle -v && \
101
111
  bundle install --jobs "$(nproc)" && \
102
112
  cd $HYRAX_ENGINE_PATH && \
103
- bundle install --jobs "$(nproc)"
113
+ bundle install --jobs "$(nproc)" && \
114
+ yarn
115
+
104
116
  RUN RAILS_ENV=production SECRET_KEY_BASE='fakesecret1234' DB_ADAPTER=nulldb DATABASE_URL='postgresql://fake' bundle exec rake assets:precompile
105
117
 
106
118
 
data/Gemfile CHANGED
@@ -1,7 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
  source 'https://rubygems.org'
3
+
3
4
  # Please see hyrax.gemspec for dependency information.
4
- gemspec
5
+ # Install gems from test app
6
+ if ENV['RAILS_ROOT']
7
+ test_app_gemfile_path = File.expand_path('Gemfile', ENV['RAILS_ROOT'])
8
+ eval_gemfile test_app_gemfile_path
9
+ else
10
+ gemspec
11
+ end
5
12
 
6
13
  group :development, :test do
7
14
  gem 'benchmark-ips'
@@ -13,26 +20,3 @@ group :development, :test do
13
20
  gem 'ruby-prof', require: false
14
21
  gem "simplecov", require: false
15
22
  end
16
-
17
- test_app_path = ENV['RAILS_ROOT'] ||
18
- ENV.fetch('ENGINE_CART_DESTINATION', File.expand_path('.internal_test_app', File.dirname(__FILE__)))
19
- test_app_gemfile = File.expand_path('Gemfile', test_app_path)
20
-
21
- # rubocop:disable Bundler/DuplicatedGem
22
- if File.exist?(test_app_gemfile)
23
- begin
24
- Bundler.ui.info "[Hyrax] Including test application dependencies from #{test_app_gemfile}"
25
- eval_gemfile test_app_gemfile
26
- rescue Bundler::GemfileError => e
27
- Bundler.ui.warn '[Hyrax] Skipping Rails application dependencies:'
28
- Bundler.ui.warn e.message
29
- end
30
- elsif ENV['RAILS_VERSION'] == 'edge'
31
- gem 'rails', github: 'rails/rails', source: 'https://rubygems.org'
32
- ENV['ENGINE_CART_RAILS_OPTIONS'] = '--edge --skip-turbolinks'
33
- elsif ENV['RAILS_VERSION']
34
- gem 'rails', ENV['RAILS_VERSION'], source: 'https://rubygems.org'
35
- else
36
- Bundler.ui.warn '[Hyrax] Skipping all Rails dependency injection'
37
- end
38
- # rubocop:enable Bundler/DuplicatedGem
data/Gemfile.dassie ADDED
@@ -0,0 +1,2 @@
1
+ # Use dedicated lock files for dassie/koppie to avoid gem mismatches
2
+ eval_gemfile 'Gemfile'
data/Gemfile.koppie ADDED
@@ -0,0 +1,2 @@
1
+ # Use dedicated lock files for dassie/koppie to avoid gem mismatches
2
+ eval_gemfile 'Gemfile'
data/README.md CHANGED
@@ -50,7 +50,6 @@ More detailed documentation about Hyrax is available on the [Hyrax Github Wiki](
50
50
 
51
51
  Hyrax can also work running prerequisite dependencies separately. The following describe ways to do this:
52
52
  * [Developing Your Hyrax-based Application](./documentation/developing-your-hyrax-based-app.md)
53
- * [Development setup using Engine Cart and Solr Fedora wrapper](https://github.com/samvera/hyrax/wiki/Development-setup-using-Engine-Cart-and-Solr---Fedora-wrapper)
54
53
 
55
54
  ## Contribute
56
55
 
@@ -77,6 +76,8 @@ This software has been developed by and is brought to you by the Samvera communi
77
76
 
78
77
  ![Samvera Logo](./samvera-fall-TM3.svg)
79
78
 
79
+ This project is tested with Browserstack.
80
+
80
81
  ## License
81
82
 
82
83
  Hyrax is available under [the Apache 2.0 license](LICENSE).
data/Rakefile CHANGED
@@ -9,17 +9,6 @@ end
9
9
 
10
10
  Bundler::GemHelper.install_tasks
11
11
 
12
- task :setup_test_server do
13
- require 'engine_cart'
14
- EngineCart.load_application!
15
- end
16
-
17
12
  Dir.glob('tasks/*.rake').each { |r| import r }
18
13
 
19
14
  task default: :ci
20
-
21
- # Load the test app's rake tasks so they can be run from the app namespace (e.g. app:db:migrate)
22
- if File.exist?(File.expand_path(".internal_test_app/Rakefile", __dir__))
23
- APP_RAKEFILE = File.expand_path(".internal_test_app/Rakefile", __dir__)
24
- load 'rails/tasks/engine.rake'
25
- end
@@ -69,10 +69,13 @@ module Hyrax
69
69
  end
70
70
 
71
71
  def save(env, use_valkyrie: false)
72
- return env.curation_concern.save unless use_valkyrie
72
+ # NOTE: You must call env.curation_concern.save before you attempt to coerce the curation
73
+ # concern into a valkyrie resource.
74
+ is_valid = env.curation_concern.save
75
+ return is_valid unless use_valkyrie
73
76
 
74
77
  # don't run validations again on the converted object if they've already passed
75
- resource = valkyrie_save(resource: env.curation_concern.valkyrie_resource, is_valid: env.curation_concern.save)
78
+ resource = valkyrie_save(resource: env.curation_concern.valkyrie_resource, is_valid: is_valid)
76
79
 
77
80
  # we need to manually set the id and reload, because the actor stack requires
78
81
  # `env.curation_concern` to be the exact same instance throughout.
@@ -83,7 +86,7 @@ module Hyrax
83
86
  # for now, just hit the validation error again
84
87
  # later we should capture the _err.obj and pass it back
85
88
  # through the environment
86
- env.curation_concern.save
89
+ is_valid
87
90
  end
88
91
 
89
92
  def apply_save_data_to_curation_concern(env)
@@ -14,12 +14,9 @@ module Hyrax
14
14
  def destroy
15
15
  case work
16
16
  when Valkyrie::Resource
17
- embargo_manager = Hyrax::EmbargoManager.new(resource: work)
18
- return if embargo_manager.embargo.embargo_release_date.blank?
19
-
20
- embargo_manager.deactivate!
21
- work.embargo = Hyrax.persister.save(resource: embargo_manager.embargo)
22
- Hyrax::AccessControlList(work).save
17
+ Hyrax::EmbargoManager.deactivate_embargo_for(resource: work) &&
18
+ Hyrax.persister.save(resource: work.embargo) &&
19
+ Hyrax::AccessControlList(work).save
23
20
  else
24
21
  work.embargo_visibility! # If the embargo has lapsed, update the current visibility.
25
22
  work.deactivate_embargo!
@@ -80,7 +80,7 @@ module Hyrax
80
80
  :original_file
81
81
  when Hyrax::FileMetadata::Use::EXTRACTED_TEXT
82
82
  :extracted_file
83
- when Hyrax::FileMetadata::Use::THUMBNAIL
83
+ when Hyrax::FileMetadata::Use::THUMBNAIL_IMAGE
84
84
  :thumbnail_file
85
85
  else
86
86
  :original_file
@@ -14,12 +14,9 @@ module Hyrax
14
14
  def destroy
15
15
  case work
16
16
  when Valkyrie::Resource
17
- lease_manager = Hyrax::LeaseManager.new(resource: work)
18
- return if lease_manager.lease.lease_expiration_date.blank?
19
-
20
- lease_manager.deactivate!
21
- work.lease = Hyrax.persister.save(resource: lease_manager.lease)
22
- Hyrax::AccessControlList(work).save
17
+ Hyrax::LeaseManager.deactivate_lease_for(resource: work) &&
18
+ Hyrax.persister.save(resource: work.lease) &&
19
+ Hyrax::AccessControlList(work).save
23
20
  else
24
21
  work.lease_visibility! # If the lease has lapsed, update the current visibility.
25
22
  work.deactivate_lease!
@@ -41,7 +41,7 @@
41
41
  var checked = $("#check_all")[0]['checked'];
42
42
 
43
43
  // check each individual box
44
- $("input[type='checkbox'].batch_document_selector").each(function(index, value) {
44
+ $("input[type='checkbox'].batch_document_selector:not(.disabled)").each(function(index, value) {
45
45
  value['checked'] = checked;
46
46
  });
47
47
  toggleButtons();
@@ -10,7 +10,7 @@ export class InputTracker {
10
10
  this.notifier = notifier
11
11
  this.element.data("initial-value", this.element.val())
12
12
  this.element.data("tracker", this)
13
- this.element.trigger("change", this.value_changed)
13
+ this.element.on("change", this.value_changed)
14
14
  }
15
15
 
16
16
  reset() {
@@ -3,7 +3,15 @@ export class UploadedFiles {
3
3
  constructor(form, callback) {
4
4
  this.form = form
5
5
  this.element = $('#fileupload')
6
- this.element.on('fileuploadcompleted', callback)
6
+ this.uploadsInProgress = 0
7
+ this.element.on('fileuploadadded', (e, data) => {
8
+ this.uploadsInProgress += 1
9
+ callback(e, data)
10
+ })
11
+ this.element.on('fileuploadcompleted', (e, data) => {
12
+ this.uploadsInProgress -= 1
13
+ callback(e, data)
14
+ })
7
15
  this.element.on('fileuploaddestroyed', callback)
8
16
  }
9
17
 
@@ -13,7 +21,7 @@ export class UploadedFiles {
13
21
  }
14
22
 
15
23
  get inProgress() {
16
- return this.element.fileupload('active') > 0
24
+ return this.uploadsInProgress > 0;
17
25
  }
18
26
 
19
27
  get hasFiles() {
@@ -70,8 +70,6 @@ h4 .small {
70
70
  .batch-info {
71
71
 
72
72
  .sort-toggle {
73
- height: 5.1em;
74
-
75
73
  button {
76
74
  margin-left: 10px;
77
75
  }
@@ -116,6 +116,21 @@ ul.tabular {
116
116
  background: #fff;
117
117
  border-color: #e0e0e0;
118
118
 
119
+ & > .btn {
120
+ padding: 0;
121
+ border: 0;
122
+ }
123
+
124
+ .btn-primary {
125
+ margin-bottom: 1rem;
126
+ }
127
+
128
+ .workflow-comments {
129
+ label {
130
+ font-weight: bold;
131
+ }
132
+ }
133
+
119
134
  .card-header {
120
135
  background-color: #e6ab5f;
121
136
  color: #ffffff;
@@ -128,8 +143,9 @@ ul.tabular {
128
143
  .card-body {
129
144
  background-color: #f2f1eb;
130
145
  }
131
- }
132
146
 
133
- .workflow-actions {
134
- background-color: #f8f8f8;
147
+ .workflow-actions {
148
+ background-color: #f8f8f8;
149
+ padding: 1rem;
150
+ }
135
151
  }
@@ -56,6 +56,29 @@ $gutter-width: $grid-gutter-width/2;
56
56
  }
57
57
  }
58
58
 
59
+ &:not(.maximized) {
60
+ .sidebar-action-text,
61
+ a span + span,
62
+ h5 {
63
+ display: none;
64
+ }
65
+
66
+ .nav li {
67
+ text-align: center;
68
+ a {
69
+ padding-left: 0;
70
+ padding-right: 0;
71
+ }
72
+ .fa {
73
+ margin-right: 0;
74
+ }
75
+ }
76
+
77
+ .nav-item {
78
+ width: $drawer-small;
79
+ }
80
+ }
81
+
59
82
  .sidebar-toggle {
60
83
  cursor: pointer;
61
84
  background-color: $body-background-color;
@@ -114,9 +137,14 @@ $gutter-width: $grid-gutter-width/2;
114
137
  li {
115
138
  white-space: nowrap;
116
139
 
117
- > a:hover, > a:focus {
140
+ > a:focus {
141
+ color: $admin-sidebar-link-color;
142
+ }
143
+
144
+ > a:hover {
118
145
  text-decoration: none;
119
146
  background-color: $admin-sidebar-link-background-color;
147
+ color: $admin-sidebar-link-hover-color;
120
148
  }
121
149
  }
122
150
 
@@ -39,7 +39,7 @@ module Hyrax
39
39
 
40
40
  respond_to do |format|
41
41
  format.html
42
- format.json { render json: @curation_concern }
42
+ format.json { render 'hyrax/base/show' }
43
43
  end
44
44
  end
45
45
 
@@ -31,7 +31,13 @@ module Hyrax
31
31
  filter_docs_with_edit_access!
32
32
  copy_visibility = []
33
33
  copy_visibility = params[:embargoes].values.map { |h| h[:copy_visibility] } if params[:embargoes]
34
- resources = Hyrax.custom_queries.find_many_by_alternate_ids(alternate_ids: batch, use_valkyrie: Hyrax.config.use_valkyrie?)
34
+
35
+ resources = if Hyrax.config.use_valkyrie?
36
+ Hyrax.query_service.find_many_by_ids(ids: batch)
37
+ else
38
+ Hyrax.custom_queries.find_many_by_alternate_ids(alternate_ids: batch, use_valkyrie: false)
39
+ end
40
+
35
41
  resources.each do |resource|
36
42
  if Hyrax.config.use_valkyrie?
37
43
  EmbargoManager.new(resource: resource).release!
@@ -29,7 +29,13 @@ module Hyrax
29
29
  filter_docs_with_edit_access!
30
30
  copy_visibility = []
31
31
  copy_visibility = params[:leases].values.map { |h| h[:copy_visibility] } if params[:leases]
32
- resources = Hyrax.custom_queries.find_many_by_alternate_ids(alternate_ids: batch, use_valkyrie: Hyrax.config.use_valkyrie?)
32
+
33
+ resources = if Hyrax.config.use_valkyrie?
34
+ Hyrax.query_service.find_many_by_ids(ids: batch)
35
+ else
36
+ Hyrax.custom_queries.find_many_by_alternate_ids(alternate_ids: batch, use_valkyrie: false)
37
+ end
38
+
33
39
  resources.each do |resource|
34
40
  if Hyrax.config.use_valkyrie?
35
41
  LeaseManager.new(resource: resource).release!
@@ -6,9 +6,7 @@ module Hyrax
6
6
  # Handle the HTTP show request
7
7
  def send_local_content
8
8
  response.headers['Accept-Ranges'] = 'bytes'
9
- if request.head?
10
- local_content_head
11
- elsif request.headers['Range']
9
+ if request.headers['Range']
12
10
  send_range_for_local_file
13
11
  else
14
12
  send_local_file_contents
@@ -26,7 +24,11 @@ module Hyrax
26
24
  self.status = 206
27
25
  prepare_local_file_headers
28
26
  # For derivatives stored on the local file system
29
- send_data IO.binread(file, length, from), local_derivative_download_options.merge(status: status)
27
+ if request.head?
28
+ head status
29
+ else
30
+ send_data IO.binread(file, length, from), local_derivative_download_options.merge(status: status)
31
+ end
30
32
  end
31
33
 
32
34
  def send_local_file_contents
@@ -34,7 +36,11 @@ module Hyrax
34
36
  self.status = 200
35
37
  prepare_local_file_headers
36
38
  # For derivatives stored on the local file system
37
- send_file file, local_derivative_download_options
39
+ if request.head?
40
+ head status
41
+ else
42
+ send_file file, local_derivative_download_options
43
+ end
38
44
  end
39
45
 
40
46
  def local_file_size
@@ -54,16 +60,9 @@ module Hyrax
54
60
  File.mtime(file) if file.is_a? String
55
61
  end
56
62
 
57
- # Override
58
- # render an HTTP HEAD response
59
- def local_content_head
60
- response.headers['Content-Length'] = local_file_size.to_s
61
- head :ok, content_type: local_file_mime_type
62
- end
63
-
64
63
  # Override
65
64
  def prepare_local_file_headers
66
- send_file_headers! local_content_options
65
+ send_file_headers! local_derivative_download_options
67
66
  response.headers['Content-Type'] = local_file_mime_type
68
67
  response.headers['Content-Length'] ||= local_file_size.to_s
69
68
  # Prevent Rack::ETag from calculating a digest over body
@@ -73,12 +72,6 @@ module Hyrax
73
72
 
74
73
  private
75
74
 
76
- # Override the Hydra::Controller::DownloadBehavior#content_options so that
77
- # we have an attachement rather than 'inline'
78
- def local_content_options
79
- { type: local_file_mime_type, filename: local_file_name, disposition: 'attachment' }
80
- end
81
-
82
75
  # Override this method if you want to change the options sent when downloading
83
76
  # a derivative file
84
77
  def local_derivative_download_options
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+ module Hyrax
3
+ # Overrides Hydra::Controller:DownloadBehavior handing of HEAD requests to
4
+ # respond with same headers as a GET request would receive.
5
+ module StreamFileDownloadsControllerBehavior
6
+ protected
7
+
8
+ # Handle the HTTP show request
9
+ def send_content
10
+ response.headers['Accept-Ranges'] = 'bytes'
11
+ if request.headers['HTTP_RANGE']
12
+ send_range
13
+ else
14
+ send_file_contents
15
+ end
16
+ end
17
+
18
+ # rubocop:disable Metrics/AbcSize
19
+ def send_range
20
+ _, range = request.headers['HTTP_RANGE'].split('bytes=')
21
+ from, to = range.split('-').map(&:to_i)
22
+ to = file.size - 1 unless to
23
+ length = to - from + 1
24
+ response.headers['Content-Range'] = "bytes #{from}-#{to}/#{file.size}"
25
+ response.headers['Content-Length'] = length.to_s
26
+ self.status = 206
27
+ prepare_file_headers
28
+
29
+ if request.head?
30
+ head status
31
+ else
32
+ stream_body file.stream(request.headers['HTTP_RANGE'])
33
+ end
34
+ end
35
+ # rubocop:enable Metrics/AbcSize
36
+
37
+ def send_file_contents
38
+ return unless stale?(last_modified: file_last_modified, template: false)
39
+
40
+ self.status = 200
41
+ prepare_file_headers
42
+
43
+ if request.head?
44
+ head status
45
+ else
46
+ stream_body file.stream
47
+ end
48
+ end
49
+
50
+ def file_last_modified
51
+ file.modified_date
52
+ end
53
+ end
54
+ end