hyrax 5.2.0 → 5.3.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 (527) hide show
  1. checksums.yaml +4 -4
  2. data/.dassie/.env +5 -1
  3. data/.dassie/Gemfile +4 -2
  4. data/.dassie/app/assets/images/bulkrax/removed.png +0 -0
  5. data/.dassie/app/assets/javascripts/application.js +2 -0
  6. data/.dassie/app/assets/stylesheets/application.css +1 -0
  7. data/.dassie/app/controllers/catalog_controller.rb +1 -0
  8. data/.dassie/app/forms/admin_set_resource_form.rb +6 -0
  9. data/.dassie/app/forms/collection_resource_form.rb +5 -2
  10. data/.dassie/app/forms/generic_work_resource_form.rb +5 -2
  11. data/.dassie/app/forms/monograph_form.rb +5 -3
  12. data/.dassie/app/indexers/admin_set_resource_indexer.rb +5 -0
  13. data/.dassie/app/indexers/collection_resource_indexer.rb +3 -3
  14. data/.dassie/app/indexers/generic_work_resource_indexer.rb +6 -3
  15. data/.dassie/app/indexers/monograph_indexer.rb +6 -2
  16. data/.dassie/app/models/ability.rb +8 -0
  17. data/.dassie/app/models/collection_resource.rb +4 -2
  18. data/.dassie/app/models/concerns/bulkrax/has_local_processing.rb +8 -0
  19. data/.dassie/app/models/generic_work_resource.rb +5 -2
  20. data/.dassie/app/models/monograph.rb +5 -2
  21. data/.dassie/app/views/blacklight_dynamic_sitemap/sitemap/show.xml.builder +22 -0
  22. data/.dassie/bin/importer +142 -0
  23. data/.dassie/bin/web +4 -0
  24. data/.dassie/config/browse_everything_providers.yml +1 -1
  25. data/.dassie/config/bulkrax_api.yml +86 -0
  26. data/.dassie/config/initializers/bulkrax.rb +92 -0
  27. data/.dassie/config/initializers/clamav.rb +2 -0
  28. data/.dassie/config/initializers/hyrax.rb +7 -1
  29. data/.dassie/config/initializers/riiif.rb +4 -80
  30. data/.dassie/config/initializers/wings.rb +1 -1
  31. data/.dassie/config/metadata_profiles/m3_profile.yaml +929 -0
  32. data/.dassie/config/puma.rb +4 -2
  33. data/.dassie/config/routes.rb +7 -0
  34. data/.dassie/config/sidekiq.yml +17 -0
  35. data/.dassie/config/uv/uv.html +63 -81
  36. data/.dassie/db/migrate/20240606205215_create_hyrax_flexible_schemas.rb +9 -0
  37. data/.dassie/db/migrate/20240606205216_add_contexts_to_hyrax_flexible_schemas.rb +5 -0
  38. data/.dassie/db/migrate/20250826142438_create_bulkrax_importers.bulkrax.rb +19 -0
  39. data/.dassie/db/migrate/20250826142439_create_bulkrax_importer_runs.bulkrax.rb +17 -0
  40. data/.dassie/db/migrate/20250826142440_create_bulkrax_entries.bulkrax.rb +17 -0
  41. data/.dassie/db/migrate/20250826142441_add_status_to_entry.bulkrax.rb +10 -0
  42. data/.dassie/db/migrate/20250826142442_add_collections_to_importer_runs.bulkrax.rb +7 -0
  43. data/.dassie/db/migrate/20250826142443_change_collection_ids_on_entries.bulkrax.rb +6 -0
  44. data/.dassie/db/migrate/20250826142444_create_bulkrax_exporters.bulkrax.rb +20 -0
  45. data/.dassie/db/migrate/20250826142445_create_bulkrax_exporter_runs.bulkrax.rb +15 -0
  46. data/.dassie/db/migrate/20250826142446_change_importer_and_exporter_to_polymorphic.bulkrax.rb +19 -0
  47. data/.dassie/db/migrate/20250826142447_add_total_collection_records_to_importer_runs.bulkrax.rb +6 -0
  48. data/.dassie/db/migrate/20250826142448_add_children_to_importer_runs.bulkrax.rb +7 -0
  49. data/.dassie/db/migrate/20250826142449_change_total_records_to_total_work_entries.bulkrax.rb +7 -0
  50. data/.dassie/db/migrate/20250826142450_change_entry_last_error.bulkrax.rb +20 -0
  51. data/.dassie/db/migrate/20250826142451_add_validate_only_to_bulkrax_importers.bulkrax.rb +6 -0
  52. data/.dassie/db/migrate/20250826142452_add_status_to_importers.bulkrax.rb +10 -0
  53. data/.dassie/db/migrate/20250826142453_remove_foreign_key_from_bulkrax_entries.bulkrax.rb +6 -0
  54. data/.dassie/db/migrate/20250826142454_add_status_to_exporters.bulkrax.rb +8 -0
  55. data/.dassie/db/migrate/20250826142455_add_invalid_record_to_importer_run.bulkrax.rb +6 -0
  56. data/.dassie/db/migrate/20250826142456_create_bulkrax_statuses.bulkrax.rb +19 -0
  57. data/.dassie/db/migrate/20250826142457_move_to_statuses.bulkrax.rb +31 -0
  58. data/.dassie/db/migrate/20250826142458_add_date_filter_and_status_to_bulkrax_exporters.bulkrax.rb +8 -0
  59. data/.dassie/db/migrate/20250826142459_add_workflow_status_to_bulkrax_exporter.bulkrax.rb +6 -0
  60. data/.dassie/db/migrate/20250826142460_remove_unused_last_error.bulkrax.rb +8 -0
  61. data/.dassie/db/migrate/20250826142461_increase_text_sizes.bulkrax.rb +13 -0
  62. data/.dassie/db/migrate/20250826142462_change_bulkrax_statuses_error_message_column_type_to_text.bulkrax.rb +6 -0
  63. data/.dassie/db/migrate/20250826142463_rename_children_counters_to_relationships.bulkrax.rb +7 -0
  64. data/.dassie/db/migrate/20250826142464_add_file_set_counters_to_importer_runs.bulkrax.rb +8 -0
  65. data/.dassie/db/migrate/20250826142465_add_import_attempts_to_entries.bulkrax.rb +6 -0
  66. data/.dassie/db/migrate/20250826142466_add_work_counters_to_importer_runs.bulkrax.rb +7 -0
  67. data/.dassie/db/migrate/20250826142467_create_bulkrax_pending_relationships.bulkrax.rb +14 -0
  68. data/.dassie/db/migrate/20250826142468_add_order_to_bulkrax_pending_relationships.bulkrax.rb +6 -0
  69. data/.dassie/db/migrate/20250826142469_add_include_thumbnails_to_bulkrax_exporters.bulkrax.rb +6 -0
  70. data/.dassie/db/migrate/20250826142470_add_generated_metadata_to_bulkrax_exporters.bulkrax.rb +6 -0
  71. data/.dassie/db/migrate/20250826142471_rename_bulkrax_importer_run_to_importer_run.bulkrax.rb +18 -0
  72. data/.dassie/db/migrate/20250826142472_add_indices_to_bulkrax.bulkrax.rb +26 -0
  73. data/.dassie/db/migrate/20250826142473_denormalize_status_message.bulkrax.rb +8 -0
  74. data/.dassie/db/migrate/20250826142474_update_identifier_index.bulkrax.rb +7 -0
  75. data/.dassie/db/migrate/20250826142475_add_index_to_metadata_bulkrax_identifier.bulkrax.rb +19 -0
  76. data/.dassie/db/migrate/20250826142476_add_file_name_to_uploaded_files.bulkrax.rb +6 -0
  77. data/.dassie/db/migrate/20250826142477_add_error_tracking_to_pending_relationships.bulkrax.rb +6 -0
  78. data/.dassie/db/migrate/20250826142478_add_last_imported_at_to_bulkrax_importers.bulkrax.rb +6 -0
  79. data/.dassie/db/migrate/20250826142479_add_next_import_at_to_bulkrax_importers.bulkrax.rb +6 -0
  80. data/.dassie/db/migrate/20250826142480_entry_error_denormalization.bulkrax.rb +8 -0
  81. data/.dassie/db/migrate/20250826142481_faster_first_entry.bulkrax.rb +8 -0
  82. data/.dassie/db/migrate/20260430000001_create_hyrax_redirect_paths.hyrax.rb +13 -0
  83. data/.dassie/db/migrate/20260521003627_add_additional_redirect_info.hyrax.rb +32 -0
  84. data/.dassie/db/schema.rb +154 -1
  85. data/.dassie/package.json +1 -1
  86. data/.dassie/rspec_split_configuration.json +835 -0
  87. data/.dassie/solr/conf/solrconfig.xml +21 -5
  88. data/.github/{ISSUE_TEMPLATE.md → ISSUE_TEMPLATE/issue_template.md} +5 -0
  89. data/.github/workflows/lint-build-test.yml +5 -1
  90. data/.github/workflows/release-charts.yml +48 -0
  91. data/.gitignore +6 -0
  92. data/.koppie/.env +5 -1
  93. data/.koppie/Gemfile +3 -1
  94. data/.koppie/app/assets/images/bulkrax/removed.png +0 -0
  95. data/.koppie/app/assets/javascripts/application.js +2 -0
  96. data/.koppie/app/assets/stylesheets/application.css +1 -0
  97. data/.koppie/app/controllers/catalog_controller.rb +1 -1
  98. data/.koppie/app/forms/collection_resource_form.rb +5 -2
  99. data/.koppie/app/forms/file_set_form.rb +5 -0
  100. data/.koppie/app/forms/generic_work_form.rb +5 -3
  101. data/.koppie/app/forms/monograph_form.rb +5 -3
  102. data/.koppie/app/indexers/collection_resource_indexer.rb +5 -2
  103. data/.koppie/app/indexers/file_set_indexer.rb +7 -0
  104. data/.koppie/app/indexers/generic_work_indexer.rb +6 -3
  105. data/.koppie/app/indexers/monograph_indexer.rb +6 -2
  106. data/.koppie/app/models/ability.rb +8 -0
  107. data/.koppie/app/models/collection_resource.rb +4 -2
  108. data/.koppie/app/models/concerns/bulkrax/has_local_processing.rb +8 -0
  109. data/.koppie/app/models/generic_work.rb +5 -2
  110. data/.koppie/app/models/monograph.rb +5 -2
  111. data/.koppie/app/views/blacklight_dynamic_sitemap/sitemap/show.xml.builder +22 -0
  112. data/.koppie/bin/importer +142 -0
  113. data/.koppie/bin/web +4 -0
  114. data/.koppie/config/browse_everything_providers.yml +2 -0
  115. data/.koppie/config/bulkrax_api.yml +86 -0
  116. data/.koppie/config/initializers/bulkrax.rb +92 -0
  117. data/.koppie/config/initializers/clamav.rb +2 -0
  118. data/.koppie/config/initializers/hyrax.rb +11 -3
  119. data/.koppie/config/initializers/riiif.rb +4 -82
  120. data/.koppie/config/metadata_profiles/m3_profile.yaml +930 -0
  121. data/.koppie/config/routes.rb +7 -0
  122. data/.koppie/config/sidekiq.yml +2 -0
  123. data/.koppie/config/uv/uv.html +63 -81
  124. data/.koppie/db/migrate/20240606205215_create_hyrax_flexible_schemas.rb +9 -0
  125. data/.koppie/db/migrate/20240606205216_add_contexts_to_hyrax_flexible_schemas.rb +5 -0
  126. data/.koppie/db/migrate/20250826142438_create_bulkrax_importers.bulkrax.rb +19 -0
  127. data/.koppie/db/migrate/20250826142439_create_bulkrax_importer_runs.bulkrax.rb +17 -0
  128. data/.koppie/db/migrate/20250826142440_create_bulkrax_entries.bulkrax.rb +17 -0
  129. data/.koppie/db/migrate/20250826142441_add_status_to_entry.bulkrax.rb +10 -0
  130. data/.koppie/db/migrate/20250826142442_add_collections_to_importer_runs.bulkrax.rb +7 -0
  131. data/.koppie/db/migrate/20250826142443_change_collection_ids_on_entries.bulkrax.rb +6 -0
  132. data/.koppie/db/migrate/20250826142444_create_bulkrax_exporters.bulkrax.rb +20 -0
  133. data/.koppie/db/migrate/20250826142445_create_bulkrax_exporter_runs.bulkrax.rb +15 -0
  134. data/.koppie/db/migrate/20250826142446_change_importer_and_exporter_to_polymorphic.bulkrax.rb +19 -0
  135. data/.koppie/db/migrate/20250826142447_add_total_collection_records_to_importer_runs.bulkrax.rb +6 -0
  136. data/.koppie/db/migrate/20250826142448_add_children_to_importer_runs.bulkrax.rb +7 -0
  137. data/.koppie/db/migrate/20250826142449_change_total_records_to_total_work_entries.bulkrax.rb +7 -0
  138. data/.koppie/db/migrate/20250826142450_change_entry_last_error.bulkrax.rb +20 -0
  139. data/.koppie/db/migrate/20250826142451_add_validate_only_to_bulkrax_importers.bulkrax.rb +6 -0
  140. data/.koppie/db/migrate/20250826142452_add_status_to_importers.bulkrax.rb +10 -0
  141. data/.koppie/db/migrate/20250826142453_remove_foreign_key_from_bulkrax_entries.bulkrax.rb +6 -0
  142. data/.koppie/db/migrate/20250826142454_add_status_to_exporters.bulkrax.rb +8 -0
  143. data/.koppie/db/migrate/20250826142455_add_invalid_record_to_importer_run.bulkrax.rb +6 -0
  144. data/.koppie/db/migrate/20250826142456_create_bulkrax_statuses.bulkrax.rb +19 -0
  145. data/.koppie/db/migrate/20250826142457_move_to_statuses.bulkrax.rb +31 -0
  146. data/.koppie/db/migrate/20250826142458_add_date_filter_and_status_to_bulkrax_exporters.bulkrax.rb +8 -0
  147. data/.koppie/db/migrate/20250826142459_add_workflow_status_to_bulkrax_exporter.bulkrax.rb +6 -0
  148. data/.koppie/db/migrate/20250826142460_remove_unused_last_error.bulkrax.rb +8 -0
  149. data/.koppie/db/migrate/20250826142461_increase_text_sizes.bulkrax.rb +13 -0
  150. data/.koppie/db/migrate/20250826142462_change_bulkrax_statuses_error_message_column_type_to_text.bulkrax.rb +6 -0
  151. data/.koppie/db/migrate/20250826142463_rename_children_counters_to_relationships.bulkrax.rb +7 -0
  152. data/.koppie/db/migrate/20250826142464_add_file_set_counters_to_importer_runs.bulkrax.rb +8 -0
  153. data/.koppie/db/migrate/20250826142465_add_import_attempts_to_entries.bulkrax.rb +6 -0
  154. data/.koppie/db/migrate/20250826142466_add_work_counters_to_importer_runs.bulkrax.rb +7 -0
  155. data/.koppie/db/migrate/20250826142467_create_bulkrax_pending_relationships.bulkrax.rb +14 -0
  156. data/.koppie/db/migrate/20250826142468_add_order_to_bulkrax_pending_relationships.bulkrax.rb +6 -0
  157. data/.koppie/db/migrate/20250826142469_add_include_thumbnails_to_bulkrax_exporters.bulkrax.rb +6 -0
  158. data/.koppie/db/migrate/20250826142470_add_generated_metadata_to_bulkrax_exporters.bulkrax.rb +6 -0
  159. data/.koppie/db/migrate/20250826142471_rename_bulkrax_importer_run_to_importer_run.bulkrax.rb +18 -0
  160. data/.koppie/db/migrate/20250826142472_add_indices_to_bulkrax.bulkrax.rb +26 -0
  161. data/.koppie/db/migrate/20250826142473_denormalize_status_message.bulkrax.rb +8 -0
  162. data/.koppie/db/migrate/20250826142474_update_identifier_index.bulkrax.rb +7 -0
  163. data/.koppie/db/migrate/20250826142475_add_index_to_metadata_bulkrax_identifier.bulkrax.rb +19 -0
  164. data/.koppie/db/migrate/20250826142476_add_file_name_to_uploaded_files.bulkrax.rb +6 -0
  165. data/.koppie/db/migrate/20250826142477_add_error_tracking_to_pending_relationships.bulkrax.rb +6 -0
  166. data/.koppie/db/migrate/20250826142478_add_last_imported_at_to_bulkrax_importers.bulkrax.rb +6 -0
  167. data/.koppie/db/migrate/20250826142479_add_next_import_at_to_bulkrax_importers.bulkrax.rb +6 -0
  168. data/.koppie/db/migrate/20250826142480_entry_error_denormalization.bulkrax.rb +8 -0
  169. data/.koppie/db/migrate/20250826142481_faster_first_entry.bulkrax.rb +8 -0
  170. data/.koppie/db/migrate/20260430000001_create_hyrax_redirect_paths.hyrax.rb +13 -0
  171. data/.koppie/db/migrate/20260521003627_add_additional_redirect_info.hyrax.rb +32 -0
  172. data/.koppie/db/schema.rb +154 -1
  173. data/.koppie/package.json +1 -1
  174. data/.koppie/rspec_split_configuration.json +835 -0
  175. data/.koppie/solr/conf/solrconfig.xml +0 -5
  176. data/.koppie/yarn.lock +5587 -752
  177. data/.rubocop.yml +1 -0
  178. data/CONTAINERS.md +2 -0
  179. data/Dockerfile +9 -22
  180. data/Gemfile +0 -1
  181. data/Gemfile.allinson +2 -0
  182. data/README.md +1 -2
  183. data/app/actors/hyrax/actors/file_actor.rb +2 -0
  184. data/app/actors/hyrax/actors/file_set_actor.rb +1 -1
  185. data/app/assets/javascripts/hyrax/app.js.erb +143 -10
  186. data/app/assets/javascripts/hyrax/collection_select.js +68 -0
  187. data/app/assets/javascripts/hyrax/copy_permalink_button.js +28 -0
  188. data/app/assets/javascripts/hyrax/redirects.js +45 -0
  189. data/app/assets/javascripts/hyrax/relationships/control.es6 +21 -1
  190. data/app/assets/javascripts/hyrax/select_work_type.es6 +7 -2
  191. data/app/assets/javascripts/hyrax.js +3 -1
  192. data/app/assets/stylesheets/hyrax/_file-show.scss +1 -0
  193. data/app/assets/stylesheets/hyrax/_viewer.scss +8 -0
  194. data/app/assets/stylesheets/hyrax/dashboard.scss +22 -1
  195. data/app/assets/stylesheets/hyrax/sidebar.scss +98 -3
  196. data/app/authorities/qa/authorities/collections.rb +9 -9
  197. data/app/controllers/concerns/hyrax/analytics_error_handling.rb +97 -0
  198. data/app/controllers/concerns/hyrax/collections_controller_behavior.rb +3 -1
  199. data/app/controllers/concerns/hyrax/ensure_migrated_behavior.rb +50 -0
  200. data/app/controllers/concerns/hyrax/flexible_catalog_behavior.rb +206 -0
  201. data/app/controllers/concerns/hyrax/flexible_schema_behavior.rb +17 -0
  202. data/app/controllers/concerns/hyrax/redirect_to_display_url.rb +54 -0
  203. data/app/controllers/concerns/hyrax/works_controller_behavior.rb +52 -10
  204. data/app/controllers/hyrax/admin/admin_sets_controller.rb +21 -13
  205. data/app/controllers/hyrax/admin/analytics/collection_reports_controller.rb +2 -0
  206. data/app/controllers/hyrax/admin/analytics/work_reports_controller.rb +1 -0
  207. data/app/controllers/hyrax/admin/metadata_profiles_controller.rb +66 -0
  208. data/app/controllers/hyrax/batch_uploads_controller.rb +2 -0
  209. data/app/controllers/hyrax/dashboard/collections_controller.rb +27 -6
  210. data/app/controllers/hyrax/dashboard/nest_collections_controller.rb +2 -1
  211. data/app/controllers/hyrax/dashboard_controller.rb +2 -1
  212. data/app/controllers/hyrax/file_sets_controller.rb +19 -1
  213. data/app/controllers/hyrax/homepage_controller.rb +7 -0
  214. data/app/controllers/hyrax/my/works_controller.rb +2 -21
  215. data/app/controllers/hyrax/permissions_controller.rb +4 -2
  216. data/app/controllers/hyrax/redirects_controller.rb +56 -0
  217. data/app/controllers/hyrax/single_use_links_viewer_controller.rb +2 -1
  218. data/app/controllers/hyrax/transcripts_controller.rb +31 -0
  219. data/app/controllers/hyrax/uploads_controller.rb +18 -9
  220. data/app/forms/concerns/hyrax/based_near_field_behavior.rb +77 -0
  221. data/app/forms/concerns/hyrax/flexible_form_behavior.rb +37 -0
  222. data/app/forms/concerns/hyrax/redirects_field_behavior.rb +95 -0
  223. data/app/forms/concerns/hyrax/transcripts_behavior.rb +40 -0
  224. data/app/forms/hyrax/forms/admin_set_form.rb +1 -1
  225. data/app/forms/hyrax/forms/administrative_set_form.rb +3 -0
  226. data/app/forms/hyrax/forms/batch_edit_form.rb +1 -3
  227. data/app/forms/hyrax/forms/batch_upload_form.rb +14 -0
  228. data/app/forms/hyrax/forms/file_set_edit_form.rb +1 -1
  229. data/app/forms/hyrax/forms/file_set_form.rb +6 -7
  230. data/app/forms/hyrax/forms/pcdm_collection_form.rb +17 -5
  231. data/app/forms/hyrax/forms/pcdm_object_form.rb +11 -3
  232. data/app/forms/hyrax/forms/resource_batch_edit_form.rb +8 -22
  233. data/app/forms/hyrax/forms/resource_form.rb +110 -10
  234. data/app/forms/hyrax/forms.rb +1 -0
  235. data/app/helpers/hyrax/attributes_helper.rb +109 -0
  236. data/app/helpers/hyrax/blacklight_override.rb +26 -0
  237. data/app/helpers/hyrax/collections_helper.rb +2 -0
  238. data/app/helpers/hyrax/file_set_form_helper.rb +24 -0
  239. data/app/helpers/hyrax/hyrax_helper_behavior.rb +51 -2
  240. data/app/helpers/hyrax/iiif_helper.rb +11 -1
  241. data/app/helpers/hyrax/permalink_helper.rb +37 -0
  242. data/app/helpers/hyrax/redirects_tab_helper.rb +29 -0
  243. data/app/helpers/hyrax/work_form_helper.rb +9 -5
  244. data/app/helpers/hyrax/works_helper.rb +14 -0
  245. data/app/indexers/concerns/hyrax/workflow_indexer.rb +30 -0
  246. data/app/indexers/hyrax/file_set_indexer.rb +1 -0
  247. data/app/indexers/hyrax/indexers/administrative_set_indexer.rb +2 -1
  248. data/app/indexers/hyrax/indexers/file_set_indexer.rb +6 -2
  249. data/app/indexers/hyrax/indexers/pcdm_collection_indexer.rb +11 -1
  250. data/app/indexers/hyrax/indexers/pcdm_object_indexer.rb +25 -4
  251. data/app/indexers/hyrax/indexers/redirects_indexer.rb +29 -0
  252. data/app/indexers/hyrax/indexers/resource_indexer.rb +4 -0
  253. data/app/indexers/hyrax/indexers.rb +2 -0
  254. data/app/inputs/controlled_vocabulary_input.rb +7 -1
  255. data/app/jobs/content_deposit_error_event_job.rb +14 -0
  256. data/app/jobs/create_work_job.rb +2 -0
  257. data/app/jobs/migrate_files_to_valkyrie_job.rb +7 -1
  258. data/app/models/batch_upload_item.rb +4 -0
  259. data/app/models/concerns/hyrax/ability/flexible_metadata_ability.rb +10 -0
  260. data/app/models/concerns/hyrax/ability.rb +3 -1
  261. data/app/models/concerns/hyrax/collection_behavior.rb +4 -0
  262. data/app/models/concerns/hyrax/file_set/transcripts.rb +16 -0
  263. data/app/models/concerns/hyrax/file_set_behavior.rb +9 -0
  264. data/app/models/concerns/hyrax/flexibility.rb +107 -0
  265. data/app/models/concerns/hyrax/redirects_normalization.rb +38 -0
  266. data/app/models/concerns/hyrax/solr_document/characterization.rb +1 -1
  267. data/app/models/concerns/hyrax/solr_document/metadata.rb +9 -0
  268. data/app/models/concerns/hyrax/solr_document/ordered_members.rb +4 -0
  269. data/app/models/concerns/hyrax/solr_document_behavior.rb +28 -6
  270. data/app/models/concerns/hyrax/suppressible.rb +1 -1
  271. data/app/models/concerns/hyrax/valkyrie_lazy_migration.rb +1 -1
  272. data/app/models/concerns/hyrax/with_embargoes_and_leases.rb +30 -0
  273. data/app/models/concerns/hyrax/work_behavior.rb +8 -0
  274. data/app/models/hyrax/administrative_set.rb +1 -1
  275. data/app/models/hyrax/change_set.rb +3 -1
  276. data/app/models/hyrax/embargo.rb +3 -1
  277. data/app/models/hyrax/file_set.rb +4 -2
  278. data/app/models/hyrax/flexible_schema.rb +219 -0
  279. data/app/models/hyrax/lease.rb +3 -1
  280. data/app/models/hyrax/pcdm_collection.rb +4 -1
  281. data/app/models/hyrax/redirect.rb +64 -0
  282. data/app/models/hyrax/redirect_path.rb +14 -0
  283. data/app/models/hyrax/resource.rb +22 -25
  284. data/app/models/hyrax/riiif/file.rb +43 -0
  285. data/app/models/hyrax/riiif/file_resolver.rb +65 -0
  286. data/app/models/hyrax/uploaded_file.rb +9 -0
  287. data/app/models/hyrax/virus_scanner.rb +16 -3
  288. data/app/models/hyrax/work.rb +4 -1
  289. data/app/models/job_io_wrapper.rb +12 -3
  290. data/app/models/user_mailbox.rb +3 -1
  291. data/app/presenters/hyrax/admin_set_presenter.rb +11 -0
  292. data/app/presenters/hyrax/annotates_content.rb +35 -0
  293. data/app/presenters/hyrax/collection_presenter.rb +5 -1
  294. data/app/presenters/hyrax/displays_content.rb +133 -0
  295. data/app/presenters/hyrax/displays_image.rb +11 -4
  296. data/app/presenters/hyrax/displays_transcripts.rb +59 -0
  297. data/app/presenters/hyrax/file_set_presenter.rb +8 -18
  298. data/app/presenters/hyrax/google_scholar_presenter.rb +39 -0
  299. data/app/presenters/hyrax/iiif_manifest_presenter.rb +22 -4
  300. data/app/presenters/hyrax/missing_method_behavior.rb +15 -0
  301. data/app/presenters/hyrax/pcdm_member_presenter_factory.rb +2 -4
  302. data/app/presenters/hyrax/work_show_presenter.rb +56 -14
  303. data/app/renderers/hyrax/renderers/attribute_renderer.rb +6 -2
  304. data/app/renderers/hyrax/renderers/license_attribute_renderer.rb +10 -10
  305. data/app/renderers/hyrax/renderers/redirects_label_attribute_renderer.rb +25 -0
  306. data/app/renderers/hyrax/renderers/rights_statement_attribute_renderer.rb +10 -11
  307. data/app/search_builders/hyrax/dashboard/nested_collections_search_builder.rb +1 -5
  308. data/app/search_builders/hyrax/filter_by_type.rb +1 -1
  309. data/app/services/hyrax/action/create_valkyrie_work.rb +3 -2
  310. data/app/services/hyrax/authority_rendering_helper.rb +28 -0
  311. data/app/services/hyrax/authority_service.rb +107 -0
  312. data/app/services/hyrax/callbacks.rb +2 -2
  313. data/app/services/hyrax/collections/nested_collection_query_service.rb +9 -3
  314. data/app/services/hyrax/collections_service.rb +17 -0
  315. data/app/services/hyrax/custom_queries/find_by_property_value.rb +89 -0
  316. data/app/services/hyrax/edit_permissions_service.rb +4 -4
  317. data/app/services/hyrax/file_set_type_service.rb +12 -4
  318. data/app/services/hyrax/flexible_schema_validator_service.rb +153 -0
  319. data/app/services/hyrax/flexible_schema_validators/class_validator.rb +123 -0
  320. data/app/services/hyrax/flexible_schema_validators/core_metadata_validator.rb +211 -0
  321. data/app/services/hyrax/flexible_schema_validators/existing_records_validator.rb +83 -0
  322. data/app/services/hyrax/flexible_schema_validators/redirects_validator.rb +116 -0
  323. data/app/services/hyrax/flexible_schema_validators/schema_validator.rb +34 -0
  324. data/app/services/hyrax/flexible_schema_validators/sort_properties_validator.rb +54 -0
  325. data/app/services/hyrax/license_service.rb +1 -1
  326. data/app/services/hyrax/listeners/metadata_index_listener.rb +11 -0
  327. data/app/services/hyrax/m3_profile_editor.rb +32 -0
  328. data/app/services/hyrax/m3_schema_loader.rb +119 -0
  329. data/app/services/hyrax/manifest_builder_service.rb +18 -24
  330. data/app/services/hyrax/permalink_path.rb +25 -0
  331. data/app/services/hyrax/qa_select_service.rb +9 -5
  332. data/app/services/hyrax/redirect_path_normalizer.rb +58 -0
  333. data/app/services/hyrax/redirects_lookup.rb +59 -0
  334. data/app/services/hyrax/resource_permissions_visibility_propagator.rb +54 -0
  335. data/app/services/hyrax/resource_types_service.rb +3 -20
  336. data/app/services/hyrax/rights_statement_service.rb +1 -1
  337. data/app/services/hyrax/schema_loader.rb +205 -0
  338. data/app/services/hyrax/search_service.rb +1 -1
  339. data/app/services/hyrax/simple_schema_loader.rb +28 -127
  340. data/app/services/hyrax/solr_service.rb +39 -2
  341. data/app/services/hyrax/tolerant_select_service.rb +5 -3
  342. data/app/services/hyrax/valkyrie_upload.rb +2 -2
  343. data/app/services/hyrax/visibility_propagator.rb +4 -1
  344. data/app/services/hyrax/work_uploads_handler.rb +17 -9
  345. data/app/services/hyrax/workflow/workflow_factory.rb +5 -4
  346. data/app/services/migrate_resource_service.rb +7 -1
  347. data/app/uploaders/hyrax/uploaded_file_uploader.rb +2 -2
  348. data/app/utils/hyrax/data_destroyers/collection_branding_destroyer.rb +1 -1
  349. data/app/utils/hyrax/required_data_seeder.rb +1 -0
  350. data/app/utils/hyrax/required_data_seeders/collection_type_seeder.rb +1 -1
  351. data/app/utils/hyrax/required_data_seeders/flexible_profile_seeder.rb +28 -0
  352. data/app/validators/hyrax/controlled_vocabulary_validator.rb +64 -0
  353. data/app/validators/hyrax/redirect_validator.rb +128 -0
  354. data/app/views/catalog/_thumbnail_list_default.html.erb +2 -2
  355. data/app/views/collections/edit_fields/_schema_version.html.erb +1 -0
  356. data/app/views/hyrax/admin/admin_sets/_form_metadata.html.erb +24 -2
  357. data/app/views/hyrax/admin/admin_sets/_show_document_list_row.html.erb +1 -1
  358. data/app/views/hyrax/admin/admin_sets/show.html.erb +1 -1
  359. data/app/views/hyrax/admin/analytics/_analytics_error.html.erb +42 -0
  360. data/app/views/hyrax/admin/analytics/collection_reports/index.html.erb +11 -9
  361. data/app/views/hyrax/admin/analytics/work_reports/index.html.erb +60 -57
  362. data/app/views/hyrax/admin/features/index.html.erb +1 -1
  363. data/app/views/hyrax/admin/metadata_profiles/_import_modal.html.erb +20 -0
  364. data/app/views/hyrax/admin/metadata_profiles/index.html.erb +54 -0
  365. data/app/views/hyrax/base/_attribute_rows.html.erb +4 -21
  366. data/app/views/hyrax/base/_citations.html.erb +1 -0
  367. data/app/views/hyrax/base/_currently_shared.html.erb +2 -1
  368. data/app/views/hyrax/base/_file_manager_thumbnail.html.erb +1 -1
  369. data/app/views/hyrax/base/_form_member_of_collections.html.erb +6 -6
  370. data/app/views/hyrax/base/_form_redirects.html.erb +125 -0
  371. data/app/views/hyrax/base/_form_share.html.erb +7 -2
  372. data/app/views/hyrax/base/_member.html.erb +1 -1
  373. data/app/views/hyrax/base/_social_media.html.erb +1 -1
  374. data/app/views/hyrax/base/iiif_viewers/_universal_viewer.html.erb +1 -1
  375. data/app/views/hyrax/base/show.html.erb +3 -0
  376. data/app/views/hyrax/collections/_default_group.html.erb +3 -0
  377. data/app/views/hyrax/collections/_list_collections.html.erb +3 -0
  378. data/app/views/hyrax/collections/_list_works.html.erb +1 -1
  379. data/app/views/hyrax/collections/_show_document_list_row.html.erb +1 -1
  380. data/app/views/hyrax/collections/show.html.erb +4 -0
  381. data/app/views/hyrax/dashboard/_sidebar.html.erb +4 -2
  382. data/app/views/hyrax/dashboard/collections/_button_for_update_collection.html.erb +2 -1
  383. data/app/views/hyrax/dashboard/collections/_default_group.html.erb +3 -0
  384. data/app/views/hyrax/dashboard/collections/_form.html.erb +17 -0
  385. data/app/views/hyrax/dashboard/collections/_form_for_select_collection.html.erb +7 -10
  386. data/app/views/hyrax/dashboard/collections/_list_collections.html.erb +3 -0
  387. data/app/views/hyrax/dashboard/collections/_list_works.html.erb +1 -1
  388. data/app/views/hyrax/dashboard/collections/_show_document_list_row.html.erb +1 -1
  389. data/app/views/hyrax/dashboard/profiles/_edit_primary.html.erb +1 -8
  390. data/app/views/hyrax/dashboard/profiles/_trophy_edit.html.erb +1 -1
  391. data/app/views/hyrax/dashboard/profiles/show.html.erb +5 -5
  392. data/app/views/hyrax/dashboard/sidebar/_metadata.html.erb +11 -0
  393. data/app/views/hyrax/dashboard/sidebar/_repository_content.html.erb +1 -0
  394. data/app/views/hyrax/dashboard/works/_default_group.html.erb +3 -0
  395. data/app/views/hyrax/dashboard/works/_list_works.html.erb +4 -2
  396. data/app/views/hyrax/file_sets/_form.html.erb +16 -3
  397. data/app/views/hyrax/file_sets/_metadata.html.erb +35 -0
  398. data/app/views/hyrax/file_sets/_valkyrie_form.html.erb +37 -0
  399. data/app/views/hyrax/file_sets/edit.html.erb +14 -8
  400. data/app/views/hyrax/file_sets/media_display/_audio.html.erb +4 -0
  401. data/app/views/hyrax/file_sets/media_display/_image.html.erb +2 -2
  402. data/app/views/hyrax/file_sets/media_display/_video.html.erb +4 -0
  403. data/app/views/hyrax/homepage/_explore_collections.html.erb +1 -1
  404. data/app/views/hyrax/homepage/_featured_fields.html.erb +1 -1
  405. data/app/views/hyrax/homepage/_recent_document.html.erb +1 -1
  406. data/app/views/hyrax/homepage/robots.text.erb +17 -0
  407. data/app/views/hyrax/my/collections/_default_group.html.erb +3 -0
  408. data/app/views/hyrax/my/collections/_list_collections.html.erb +3 -0
  409. data/app/views/hyrax/my/collections/_modal_add_subcollection.html.erb +2 -2
  410. data/app/views/hyrax/my/collections/_modal_add_to_collection.html.erb +2 -2
  411. data/app/views/hyrax/my/works/_default_group.html.erb +3 -0
  412. data/app/views/hyrax/my/works/_list_works.html.erb +5 -2
  413. data/app/views/hyrax/shared/_copy_permalink.html.erb +10 -0
  414. data/app/views/hyrax/users/_user_info.html.erb +1 -6
  415. data/app/views/layouts/_head_tag_content.html.erb +2 -0
  416. data/app/views/layouts/hyrax/dashboard.html.erb +2 -1
  417. data/app/views/records/edit_fields/_contexts.html.erb +1 -0
  418. data/app/views/records/edit_fields/_license.html.erb +17 -5
  419. data/app/views/records/edit_fields/_resource_type.html.erb +16 -2
  420. data/app/views/records/edit_fields/_rights_statement.html.erb +17 -5
  421. data/app/views/records/edit_fields/_schema_version.html.erb +1 -0
  422. data/app/views/records/edit_fields/_transcript_ids.html.erb +18 -0
  423. data/app/views/records/show_fields/_rights.html.erb +1 -1
  424. data/app/views/shared/_citations.html.erb +46 -31
  425. data/app/views/shared/_schema_version.html.erb +38 -0
  426. data/bin/dev-entrypoint.sh +14 -4
  427. data/chart/hyrax/Chart.yaml +4 -4
  428. data/chart/hyrax/templates/ingress.yaml +3 -0
  429. data/chart/hyrax/values.yaml +10 -8
  430. data/config/features.rb +27 -0
  431. data/config/initializers/blacklight_dynamic_sitemap.rb +43 -0
  432. data/config/initializers/deprecation_patch.rb +27 -0
  433. data/config/initializers/hydra_works.rb +3 -0
  434. data/config/initializers/i18n_extensions.rb +197 -0
  435. data/config/initializers/storage_adapter_initializer.rb +15 -9
  436. data/config/locales/hyrax.de.yml +172 -54
  437. data/config/locales/hyrax.en.yml +183 -66
  438. data/config/locales/hyrax.es.yml +174 -49
  439. data/config/locales/hyrax.fr.yml +169 -45
  440. data/config/locales/hyrax.it.yml +172 -48
  441. data/config/locales/hyrax.pt-BR.yml +172 -54
  442. data/config/locales/hyrax.zh.yml +145 -21
  443. data/config/metadata/basic_metadata.yaml +66 -0
  444. data/config/metadata/batch_edit_metadata.yaml +119 -0
  445. data/config/metadata/file_set_metadata.yaml +19 -0
  446. data/config/metadata/redirects.yaml +15 -0
  447. data/config/metadata_profiles/m3_json_schema.json +487 -0
  448. data/config/metadata_profiles/m3_profile.yaml +954 -0
  449. data/config/routes.rb +9 -0
  450. data/docker-compose-allinson.yml +176 -0
  451. data/docker-compose-dassie.yml +14 -6
  452. data/docker-compose-koppie.yml +18 -10
  453. data/docker-compose-sirenia.yml +20 -10
  454. data/documentation/copy_permalink.md +29 -0
  455. data/documentation/developing-your-hyrax-based-app.md +2 -2
  456. data/documentation/file-ingest-characterization.md +763 -0
  457. data/documentation/flexible_metadata.md +113 -0
  458. data/documentation/forms/field_behaviors.md +297 -0
  459. data/documentation/redirects.md +428 -0
  460. data/hyrax.gemspec +7 -2
  461. data/lib/freyja/metadata_adapter.rb +1 -1
  462. data/lib/freyja/persister.rb +25 -1
  463. data/lib/generators/hyrax/collection_resource/collection_resource_generator.rb +2 -2
  464. data/lib/generators/hyrax/collection_resource/templates/collection.rb.erb +5 -1
  465. data/lib/generators/hyrax/collection_resource/templates/collection_form.rb.erb +5 -1
  466. data/lib/generators/hyrax/collection_resource/templates/collection_indexer.rb.erb +6 -1
  467. data/lib/generators/hyrax/iiif_viewer/USAGE +22 -0
  468. data/lib/generators/hyrax/iiif_viewer/iiif_viewer_generator.rb +49 -0
  469. data/lib/generators/hyrax/iiif_viewer/templates/_clover.html.erb +7 -0
  470. data/lib/generators/hyrax/iiif_viewer/templates/clover/clover.css +3328 -0
  471. data/lib/generators/hyrax/iiif_viewer/templates/clover/clover.html +16 -0
  472. data/lib/generators/hyrax/iiif_viewer/templates/clover/clover.js +237 -0
  473. data/lib/generators/hyrax/install_generator.rb +25 -1
  474. data/lib/generators/hyrax/riiif_generator.rb +1 -1
  475. data/lib/generators/hyrax/templates/app/views/blacklight_dynamic_sitemap/sitemap/show.xml.builder +22 -0
  476. data/lib/generators/hyrax/templates/config/clamav.rb +2 -0
  477. data/lib/generators/hyrax/templates/config/initializers/riiif.rb +4 -80
  478. data/lib/generators/hyrax/templates/db/migrate/20240606205215_create_hyrax_flexible_schemas.rb.erb +9 -0
  479. data/lib/generators/hyrax/templates/db/migrate/20240606205216_add_contexts_to_hyrax_flexible_schemas.rb.erb +5 -0
  480. data/lib/generators/hyrax/templates/db/migrate/20260430000001_create_hyrax_redirect_paths.rb.erb +22 -0
  481. data/lib/generators/hyrax/templates/db/migrate/20260521003627_add_additional_redirect_info.rb.erb +39 -0
  482. data/lib/generators/hyrax/templates/package.json +1 -1
  483. data/lib/generators/hyrax/templates/uv.html +60 -82
  484. data/lib/generators/hyrax/work/templates/indexer.rb.erb +1 -1
  485. data/lib/generators/hyrax/work/templates/model.rb.erb +5 -1
  486. data/lib/generators/hyrax/work_resource/templates/form.rb.erb +5 -2
  487. data/lib/generators/hyrax/work_resource/templates/indexer.rb.erb +6 -2
  488. data/lib/generators/hyrax/work_resource/templates/work.rb.erb +5 -2
  489. data/lib/generators/hyrax/work_resource/work_resource_generator.rb +1 -0
  490. data/lib/hyrax/active_fedora_dummy_model.rb +6 -0
  491. data/lib/hyrax/configuration.rb +197 -3
  492. data/lib/hyrax/deprecation.rb +31 -0
  493. data/lib/hyrax/engine.rb +2 -0
  494. data/lib/hyrax/form_fields.rb +17 -5
  495. data/lib/hyrax/indexer.rb +31 -2
  496. data/lib/hyrax/resource_sync/resource_list_writer.rb +3 -0
  497. data/lib/hyrax/schema.rb +15 -4
  498. data/lib/hyrax/specs/shared_specs/factories/administrative_sets.rb +12 -0
  499. data/lib/hyrax/specs/shared_specs/factories/hyrax_embargo.rb +1 -1
  500. data/lib/hyrax/specs/shared_specs/factories/hyrax_file_set.rb +13 -0
  501. data/lib/hyrax/specs/shared_specs/factories/hyrax_lease.rb +5 -1
  502. data/lib/hyrax/specs/shared_specs/factories/hyrax_work.rb +14 -0
  503. data/lib/hyrax/specs/shared_specs/simple_work.rb +41 -0
  504. data/lib/hyrax/specs/shared_specs.rb +1 -0
  505. data/lib/hyrax/transactions/collection_create.rb +2 -1
  506. data/lib/hyrax/transactions/collection_destroy.rb +1 -0
  507. data/lib/hyrax/transactions/collection_update.rb +2 -1
  508. data/lib/hyrax/transactions/container.rb +28 -0
  509. data/lib/hyrax/transactions/steps/apply_permission_template_on_update.rb +65 -0
  510. data/lib/hyrax/transactions/steps/apply_workflow_on_admin_set_change.rb +97 -0
  511. data/lib/hyrax/transactions/steps/ensure_admin_set.rb +1 -1
  512. data/lib/hyrax/transactions/steps/remove_redirect_paths.rb +35 -0
  513. data/lib/hyrax/transactions/steps/save.rb +10 -0
  514. data/lib/hyrax/transactions/steps/set_default_admin_set.rb +1 -1
  515. data/lib/hyrax/transactions/steps/sync_redirect_paths.rb +141 -0
  516. data/lib/hyrax/transactions/work_create.rb +2 -1
  517. data/lib/hyrax/transactions/work_destroy.rb +1 -0
  518. data/lib/hyrax/transactions/work_update.rb +4 -1
  519. data/lib/hyrax/version.rb +1 -1
  520. data/lib/hyrax.rb +61 -0
  521. data/lib/tasks/m3_profile_cleanup.rake +35 -0
  522. data/template.rb +4 -1
  523. metadata +313 -19
  524. data/.dassie/public/robots.txt +0 -1
  525. data/.koppie/public/robots.txt +0 -1
  526. data/app/forms/concerns/hyrax/basic_metadata_form_fields_behavior.rb +0 -39
  527. data/app/views/catalog/_thumbnail_list_collection.html.erb +0 -4
@@ -34,6 +34,8 @@ module Hyrax
34
34
  17. Install jquery-datatables
35
35
  18. Initializes the noid-rails database-backed minter
36
36
  19. Generates RIIIF image server implementation
37
+ 20. Adds show builder for blacklight_dynamic_sitemaps
38
+ 21. Removes the public/robots.txt in favor of a dynamic one
37
39
  """
38
40
 
39
41
  def run_required_generators
@@ -59,17 +61,31 @@ module Hyrax
59
61
  end
60
62
 
61
63
  # The engine routes have to come after the devise routes so that /users/sign_in will work
62
- def inject_routes
64
+ def inject_routes # rubocop:disable Metrics/MethodLength
63
65
  # Remove root route that was added by blacklight generator
64
66
  gsub_file 'config/routes.rb', /root (:to =>|to:) "catalog#index"/, ''
65
67
 
66
68
  inject_into_file 'config/routes.rb', after: /devise_for :users\s*\n/ do
67
69
  " mount Qa::Engine => '/authorities'\n"\
70
+ " mount BlacklightDynamicSitemap::Engine => '/'\n"\
68
71
  " mount Hyrax::Engine, at: '/'\n"\
69
72
  " resources :welcome, only: 'index'\n"\
70
73
  " root 'hyrax/homepage#index'\n"\
71
74
  " curation_concerns_basic_routes\n"\
72
75
  end
76
+
77
+ # Catch-all redirect resolver. Must be the last route in the host
78
+ # application so that every other route — engine mounts, host-specific
79
+ # routes, curation concerns — gets first crack at matching the request.
80
+ # Gated by Hyrax.config.redirects_active? at request time so the route is
81
+ # transparent when the redirects feature is off.
82
+ # See documentation/redirects.md.
83
+ inject_into_file 'config/routes.rb', before: /^end\s*\Z/ do
84
+ "\n # Catch-all redirect resolver — must be last. See documentation/redirects.md.\n"\
85
+ " get '*alias_path', to: 'hyrax/redirects#show',\n"\
86
+ " constraints: ->(_req) { Hyrax.config.redirects_active? },\n"\
87
+ " format: false\n"
88
+ end
73
89
  end
74
90
 
75
91
  # Add behaviors to the SolrDocument model
@@ -203,11 +219,19 @@ module Hyrax
203
219
  copy_file '.lando.yml'
204
220
  end
205
221
 
222
+ def remove_robots
223
+ remove_file 'public/robots.txt'
224
+ end
225
+
206
226
  def dotenv
207
227
  copy_file '.env'
208
228
  gem_group :development, :test do
209
229
  gem 'dotenv-rails', '~> 2.8'
210
230
  end
211
231
  end
232
+
233
+ def blacklight_dynamic_sitemap
234
+ copy_file 'app/views/blacklight_dynamic_sitemap/sitemap/show.xml.builder', 'app/views/blacklight_dynamic_sitemap/sitemap/show.xml.builder'
235
+ end
212
236
  end
213
237
  end
@@ -17,7 +17,7 @@ class Hyrax::RiiifGenerator < Rails::Generators::Base
17
17
  end
18
18
 
19
19
  def add_to_gemfile
20
- gem 'riiif', '~> 2.1'
20
+ gem 'riiif', '~> 2.8'
21
21
  end
22
22
 
23
23
  def copy_initializer
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ xml.instruct! :xml, version: '1.0', encoding: 'UTF-8'
4
+ xml.urlset(
5
+ 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
6
+ 'xsi:schemaLocation' => 'http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd',
7
+ 'xmlns' => 'http://www.sitemaps.org/schemas/sitemap/0.9'
8
+ ) do
9
+ config = BlacklightDynamicSitemap::Engine.config
10
+ @sitemap_entries.each do |doc|
11
+ solr_doc = SolrDocument.new(doc)
12
+
13
+ xml.url do
14
+ # Use Hyrax's routing logic: collections go through hyrax engine, works through main_app
15
+ url_parts = solr_doc.collection? ? [hyrax, solr_doc] : [main_app, solr_doc]
16
+ xml.loc(polymorphic_url(url_parts))
17
+
18
+ last_modified = doc[config.last_modified_field]
19
+ xml.lastmod(config.format_last_modified&.call(last_modified) || last_modified)
20
+ end
21
+ end
22
+ end
@@ -1,2 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  ClamAV.instance.loaddb if defined? ClamAV
3
+
4
+ Clamby.configure(daemonize: true, fdpass: true) if defined? Clamby
@@ -13,7 +13,7 @@ Rails.application.reloader.to_prepare do
13
13
  end
14
14
 
15
15
  if Hyrax.config.use_valkyrie?
16
- Riiif::Image.file_resolver = Hyrax::RiiifFileResolver.new
16
+ Riiif::Image.file_resolver = Hyrax::Riiif::FileResolver.new
17
17
  else
18
18
  Riiif::Image.file_resolver = Riiif::HttpFileResolver.new
19
19
 
@@ -30,83 +30,7 @@ Rails.application.reloader.to_prepare do
30
30
  Riiif.unauthorized_image = Rails.root.join('app', 'assets', 'images', 'us_404.svg')
31
31
 
32
32
  Riiif::Engine.config.cache_duration = 1.day
33
- end
34
-
35
- module Hyrax
36
- # Adds file locking to Riiif::File
37
- # @see RiiifFileResolver
38
- Rails.application.reloader.to_prepare do
39
- class RiiifFile < Riiif::File
40
- include ActiveSupport::Benchmarkable
41
-
42
- attr_reader :id
43
- def initialize(input_path, tempfile = nil, id:)
44
- super(input_path, tempfile)
45
- raise(ArgumentError, "must specify id") if id.blank?
46
- @id = id
47
- end
48
-
49
- # Wrap extract in a read lock and benchmark it
50
- def extract(transformation, image_info = nil)
51
- Riiif::Image.file_resolver.file_locks[id].with_read_lock do
52
- benchmark "RiiifFile extracted #{path} with #{transformation.to_params}", level: :debug do
53
- super
54
- end
55
- end
56
- end
57
-
58
- private
59
-
60
- def logger
61
- Hyrax.logger
62
- end
63
- end
64
- end
65
-
66
- class RiiifFileResolver
67
- include ActiveSupport::Benchmarkable
68
-
69
- # @param [String] id from iiif manifest
70
- # @return [Riiif::File]
71
- def find(id)
72
- path = nil
73
- file_locks[id].with_write_lock do
74
- path = build_path(id)
75
- path = build_path(id, force: true) unless File.exist?(path) # Ensures the file is locally available
76
- end
77
- RiiifFile.new(path, id: id)
78
- end
79
-
80
- # tracks individual file locks
81
- # @see RiiifFile
82
- # @return [Concurrent::Map<Concurrent::ReadWriteLock>]
83
- def file_locks
84
- @file_locks ||= Concurrent::Map.new do |k, v|
85
- k.compute_if_absent(v) { Concurrent::ReadWriteLock.new }
86
- end
87
- end
88
-
89
- private
90
-
91
- def build_path(id, force: false)
92
- Riiif::Image.cache.fetch("riiif:" + Digest::MD5.hexdigest("path:#{id}"),
93
- expires_in: Riiif::Image.expires_in,
94
- force: force) do
95
- load_file(id)
96
- end
97
- end
98
-
99
- def load_file(id)
100
- benchmark "RiiifFileResolver loaded #{id}", level: :debug do
101
- fs_id = id.sub(/\A([^\/]*)\/.*/, '\1')
102
- file_set = Hyrax.query_service.find_by(id: fs_id)
103
- file_metadata = Hyrax.custom_queries.find_original_file(file_set: file_set)
104
- file_metadata.file.disk_path.to_s # Stores a local copy in tmpdir
105
- end
106
- end
107
-
108
- def logger
109
- Hyrax.logger
110
- end
111
- end
33
+ # Defaults to using Imagemagick - Set use_vips to true in order to use vips. lib-vips is already installed as part of hyrax-base
34
+ # Must be using riiif 2.8 or newer
35
+ # Riiif::Engine.config.use_vips = false
112
36
  end
@@ -0,0 +1,9 @@
1
+ class CreateHyraxFlexibleSchemas < ActiveRecord::Migration<%= migration_version %>
2
+ def change
3
+ create_table :hyrax_flexible_schemas do |t|
4
+ t.text :profile
5
+
6
+ t.timestamps
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ class AddContextsToHyraxFlexibleSchemas < ActiveRecord::Migration<%= migration_version %>
2
+ def change
3
+ add_column :hyrax_flexible_schemas, :contexts, :text unless column_exists?(:hyrax_flexible_schemas, :contexts)
4
+ end
5
+ end
@@ -0,0 +1,22 @@
1
+ class CreateHyraxRedirectPaths < ActiveRecord::Migration<%= migration_version %>
2
+ def change
3
+ create_table :hyrax_redirect_paths do |t|
4
+ t.string :path, null: false
5
+ t.string :resource_id, null: false
6
+
7
+ t.timestamps
8
+ end
9
+
10
+ # Unique index on path enforces global uniqueness at the DB level (the hard
11
+ # guarantee under concurrent writes) and is the primary lookup index for
12
+ # validation. Whole-string equality only — paths are case-sensitive per
13
+ # RFC 3986, no LIKE patterns.
14
+ add_index :hyrax_redirect_paths, :path, unique: true
15
+
16
+ # Non-unique index supports the per-resource sync performed by
17
+ # Hyrax::Transactions::Steps::SyncRedirectPaths and
18
+ # Hyrax::Transactions::Steps::RemoveRedirectPaths, which delete all rows for
19
+ # a resource_id before reinserting (or on resource destroy).
20
+ add_index :hyrax_redirect_paths, :resource_id
21
+ end
22
+ end
@@ -0,0 +1,39 @@
1
+ class AddAdditionalRedirectInfo < ActiveRecord::Migration<%= migration_version %>
2
+ def up
3
+ drop_table :hyrax_redirect_paths if table_exists?(:hyrax_redirect_paths)
4
+
5
+ create_table :hyrax_redirect_paths do |t|
6
+ t.string :from_path, null: false
7
+ t.string :to_path, null: false
8
+ t.string :permalink_path, null: false
9
+ t.string :resource_id, null: false
10
+ t.boolean :is_display_url, null: false, default: false
11
+
12
+ t.timestamps
13
+ end
14
+
15
+ # Unique index on from_path enforces global uniqueness at the DB level
16
+ # (the hard guarantee under concurrent writes) and is the primary
17
+ # request-time lookup: the resolver finds rows by the visited alias.
18
+ add_index :hyrax_redirect_paths, :from_path, unique: true
19
+
20
+ # Non-unique index supports the per-resource sync performed by
21
+ # Hyrax::Transactions::Steps::SyncRedirectPaths and the per-resource
22
+ # cleanup performed by Hyrax::Transactions::Steps::RemoveRedirectPaths.
23
+ add_index :hyrax_redirect_paths, :resource_id
24
+ end
25
+
26
+ def down
27
+ drop_table :hyrax_redirect_paths
28
+
29
+ create_table :hyrax_redirect_paths do |t|
30
+ t.string :path, null: false
31
+ t.string :resource_id, null: false
32
+
33
+ t.timestamps
34
+ end
35
+
36
+ add_index :hyrax_redirect_paths, :path, unique: true
37
+ add_index :hyrax_redirect_paths, :resource_id
38
+ end
39
+ end
@@ -3,7 +3,7 @@
3
3
  "private": true,
4
4
  "repository": "git@github.com:samvera/hyrax.git",
5
5
  "dependencies": {
6
- "universalviewer": "^3.1.4"
6
+ "universalviewer": "^4.2.1"
7
7
  },
8
8
  "scripts": {
9
9
  "preinstall": "rm -rf ./public/uv",
@@ -1,87 +1,65 @@
1
-
2
1
  <!--
3
2
  This is what the embed iframe src links to. It doesn't need to communicate with the parent page, only fill the available space and look for #? parameters
4
3
  -->
5
4
 
6
- <html>
7
- <head>
8
- <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" />
9
- <link rel="icon" href="favicon.ico">
10
- <link rel="stylesheet" type="text/css" href="uv.css">
11
- <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
12
- <script type="text/javascript" src="lib/offline.js"></script>
13
- <script type="text/javascript" src="helpers.js"></script>
14
- <style>
15
- body {
16
- margin: 0;
17
- padding: 0;
18
- overflow: hidden;
19
- }
20
- </style>
21
- <script type="text/javascript">
22
- window.addEventListener('uvLoaded', function(e) {
23
- urlDataProvider = new UV.URLDataProvider(true);
24
- var formattedLocales;
25
- var locales = urlDataProvider.get('locales', '');
26
-
27
- if (locales) {
28
- var names = locales.split(',');
29
- formattedLocales = [];
30
-
31
- for (var i in names) {
32
- var nameparts = String(names[i]).split(':');
33
- formattedLocales[i] = {name: nameparts[0], label: nameparts[1]};
34
- }
35
-
36
- } else {
37
- formattedLocales = [
38
- {
39
- name: 'en-GB'
40
- }
41
- ]
42
- }
43
-
44
- uv = createUV('#uv', {
45
- root: '.',
46
- iiifResourceUri: urlDataProvider.get('manifest'),
47
- configUri: urlDataProvider.get('config'),
48
- collectionIndex: Number(urlDataProvider.get('c', 0)),
49
- manifestIndex: Number(urlDataProvider.get('m', 0)),
50
- sequenceIndex: Number(urlDataProvider.get('s', 0)),
51
- canvasIndex: Number(urlDataProvider.get('cv', 0)),
52
- rangeId: urlDataProvider.get('rid', 0),
53
- rotation: Number(urlDataProvider.get('r', 0)),
54
- xywh: urlDataProvider.get('xywh', ''),
55
- embedded: true,
56
- locales: formattedLocales
57
- }, urlDataProvider);
58
- }, false);
59
- </script>
60
- </head>
61
- <body>
62
-
63
- <div id="uv" class="uv"></div>
64
-
65
- <script>
66
- $(function() {
67
-
68
- var $UV = $('#uv');
69
-
70
- function resize() {
71
- var windowWidth = window.innerWidth;
72
- var windowHeight = window.innerHeight;
73
- $UV.width(windowWidth);
74
- $UV.height(windowHeight);
75
- }
76
-
77
- $(window).on('resize' ,function() {
78
- resize();
79
- });
80
-
81
- resize();
82
- });
83
-
84
- </script>
85
- <script type="text/javascript" src="uv.js"></script>
86
- </body>
5
+ <!DOCTYPE html>
6
+ <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
7
+ <head>
8
+ <meta
9
+ name="viewport"
10
+ content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"
11
+ />
12
+ <link rel="icon" href="favicon.ico" />
13
+ <link rel="stylesheet" type="text/css" href="uv.css" />
14
+ <script type="text/javascript" src="umd/UV.js"></script>
15
+ <style>
16
+ body {
17
+ margin: 0;
18
+ padding: 0;
19
+ overflow: hidden;
20
+ }
21
+ </style>
22
+ </head>
23
+ <body>
24
+ <div id="uv" class="uv"></div>
25
+
26
+ <script>
27
+ document.addEventListener("DOMContentLoaded", function() {
28
+ var urlAdapter = new UV.IIIFURLAdapter(true);
29
+
30
+ const data = urlAdapter.getInitialData({
31
+ embedded: true,
32
+ });
33
+
34
+ uv = UV.init("uv", data);
35
+
36
+
37
+ const configUrl = urlAdapter.get('config');
38
+ if (configUrl) {
39
+ uv.on("configure", function({ config, cb }) {
40
+ cb(
41
+ // new Promise(function (resolve) {
42
+ // fetch(configUrl).then(function (response) {
43
+ // resolve(response.json());
44
+ // });
45
+ // })
46
+ );
47
+ })
48
+ }
49
+
50
+ var $UV = document.getElementById("uv");
51
+
52
+ function resize() {
53
+ $UV.setAttribute("style", "width:" + window.innerWidth + "px");
54
+ $UV.setAttribute("style", "height:" + window.innerHeight + "px");
55
+ }
56
+
57
+ addEventListener("resize", function() {
58
+ resize();
59
+ });
60
+
61
+ resize();
62
+ });
63
+ </script>
64
+ </body>
87
65
  </html>
@@ -7,7 +7,7 @@ class <%= class_name %>Indexer < Hyrax::WorkIndexer
7
7
 
8
8
  # Fetch remote labels for based_near. You can remove this if you don't want
9
9
  # this behavior
10
- include Hyrax::IndexesLinkedMetadata
10
+ include Hyrax::IndexesLinkedMetadata if Hyrax.config.work_include_metadata?
11
11
 
12
12
  # Uncomment this block if you want to add custom indexing behavior:
13
13
  # def generate_solr_document
@@ -10,5 +10,9 @@ class <%= class_name %> < ActiveFedora::Base
10
10
 
11
11
  # This must be included at the end, because it finalizes the metadata
12
12
  # schema (by adding accepts_nested_attributes)
13
- include ::Hyrax::BasicMetadata
13
+ if Hyrax.config.work_include_metadata?
14
+ include ::Hyrax::Schema(:core_metadata) unless Hyrax.config.work_default_metadata?
15
+ include ::Hyrax::BasicMetadata
16
+ end
17
+
14
18
  end
@@ -6,8 +6,11 @@
6
6
  # @see https://github.com/samvera/hyrax/wiki/Hyrax-Valkyrie-Usage-Guide#forms
7
7
  # @see https://github.com/samvera/valkyrie/wiki/ChangeSets-and-Dirty-Tracking
8
8
  class <%= class_name %>Form < Hyrax::Forms::PcdmObjectForm(<%= class_name %>)
9
- include Hyrax::FormFields(:basic_metadata)
10
- include Hyrax::FormFields(:<%= file_name %>)
9
+ if Hyrax.config.work_include_metadata?
10
+ include Hyrax::FormFields(:basic_metadata)
11
+ include Hyrax::FormFields(:<%= file_name %>)
12
+ end
13
+ check_if_flexible(<%= class_name %>)
11
14
 
12
15
  # Define custom form fields using the Valkyrie::ChangeSet interface
13
16
  #
@@ -3,8 +3,12 @@
3
3
  # Generated via
4
4
  # `rails generate hyrax:work_resource <%= class_name %>`
5
5
  class <%= class_name %>Indexer < Hyrax::Indexers::PcdmObjectIndexer(<%= class_name %>)
6
- include Hyrax::Indexer(:basic_metadata)
7
- include Hyrax::Indexer(:<%= file_name %>)
6
+ if Hyrax.config.work_include_metadata?
7
+ include Hyrax::Indexer(:core_metadata)
8
+ include Hyrax::Indexer(:basic_metadata)
9
+ include Hyrax::Indexer(:<%= file_name %>)
10
+ end
11
+ check_if_flexible(<%= class_name %>)
8
12
 
9
13
  # Uncomment this block if you want to add custom indexing behavior:
10
14
  # def to_solr
@@ -3,6 +3,9 @@
3
3
  # Generated via
4
4
  # `rails generate hyrax:work_resource <%= class_name %>`
5
5
  class <%= class_name %> < Hyrax::Work
6
- include Hyrax::Schema(:basic_metadata)
7
- include Hyrax::Schema(:<%= file_name %>)
6
+ if Hyrax.config.work_include_metadata?
7
+ include Hyrax::Schema(:core_metadata) unless Hyrax.config.work_default_metadata?
8
+ include Hyrax::Schema(:basic_metadata)
9
+ include Hyrax::Schema(:<%= file_name %>)
10
+ end
8
11
  end
@@ -37,6 +37,7 @@ class Hyrax::WorkResourceGenerator < Rails::Generators::NamedBase
37
37
  end
38
38
 
39
39
  def create_metadata_config
40
+ return if Hyrax.config.work_include_metadata?
40
41
  template('metadata.yaml', File.join('config/metadata/', "#{file_name}.yaml"))
41
42
  return if attributes.blank?
42
43
  gsub_file File.join('config/metadata/', "#{file_name}.yaml"),
@@ -76,5 +76,11 @@ module Hyrax
76
76
  URI::GID.build app: GlobalID.app, model_name: model_name.name, model_id: @id
77
77
  end
78
78
  end
79
+
80
+ ##
81
+ # @api public
82
+ def name
83
+ @model.name
84
+ end
79
85
  end
80
86
  end