blacklight-spotlight 5.3.2 → 6.0.0.rc2

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 (211) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +41 -4
  3. data/Rakefile +1 -2
  4. data/app/assets/javascripts/spotlight/spotlight.esm.js +2168 -4560
  5. data/app/assets/javascripts/spotlight/spotlight.esm.js.map +1 -1
  6. data/app/assets/javascripts/spotlight/spotlight.js +2167 -4559
  7. data/app/assets/javascripts/spotlight/spotlight.js.map +1 -1
  8. data/app/assets/stylesheets/spotlight/_blacklight_overrides.scss +4 -0
  9. data/app/assets/stylesheets/spotlight/_browse.scss +0 -4
  10. data/app/assets/stylesheets/spotlight/{_collapse_toggle.scss → _collapse_toggle.css} +2 -2
  11. data/app/assets/stylesheets/spotlight/_exhibit_admin.scss +8 -0
  12. data/app/assets/stylesheets/spotlight/_exhibits_index.scss +2 -1
  13. data/app/assets/stylesheets/spotlight/_footer.scss +2 -2
  14. data/app/assets/stylesheets/spotlight/_header.scss +8 -8
  15. data/app/assets/stylesheets/spotlight/_pages.scss +1 -1
  16. data/app/assets/stylesheets/spotlight/_slideshow_block.scss +15 -0
  17. data/app/assets/stylesheets/spotlight/_spotlight.scss +1 -1
  18. data/app/assets/stylesheets/spotlight/_translations.scss +3 -3
  19. data/app/assets/stylesheets/spotlight/_uploaded_items_block.css +7 -0
  20. data/app/assets/stylesheets/spotlight/_variables.css +15 -0
  21. data/app/assets/stylesheets/spotlight/browse_group_categories_block.scss +0 -76
  22. data/app/components/blacklight/icons/pause_component.rb +15 -0
  23. data/app/components/blacklight/icons/play_arrow_component.rb +15 -0
  24. data/app/components/spotlight/analytics/dashboard_component.html.erb +1 -1
  25. data/app/components/spotlight/custom_field_form_group_component.rb +40 -0
  26. data/app/components/spotlight/document_admin_table_component.html.erb +2 -2
  27. data/app/components/spotlight/edit_sidecar_component.html.erb +18 -0
  28. data/app/components/spotlight/edit_sidecar_component.rb +41 -0
  29. data/app/components/spotlight/masthead_component.html.erb +18 -0
  30. data/app/components/spotlight/masthead_component.rb +46 -0
  31. data/app/components/spotlight/save_search_component.html.erb +1 -1
  32. data/app/components/spotlight/sidecar_form_field_component.html.erb +18 -0
  33. data/app/components/spotlight/sidecar_form_field_component.rb +71 -0
  34. data/app/components/spotlight/solr_document_legacy_embed_component.html.erb +0 -4
  35. data/app/components/spotlight/solr_document_legacy_embed_component.rb +2 -2
  36. data/app/components/spotlight/tag_selector_component.html.erb +1 -1
  37. data/app/components/spotlight/tag_selector_component.rb +3 -2
  38. data/app/components/spotlight/upload_field_form_group_component.rb +33 -0
  39. data/app/controllers/concerns/spotlight/controller.rb +15 -14
  40. data/app/controllers/concerns/spotlight/search_helper.rb +2 -5
  41. data/app/controllers/spotlight/browse_controller.rb +1 -6
  42. data/app/controllers/spotlight/catalog_controller.rb +2 -3
  43. data/app/controllers/spotlight/concerns/application_controller.rb +4 -6
  44. data/app/controllers/spotlight/exhibits_controller.rb +22 -10
  45. data/app/controllers/spotlight/lock_controller.rb +1 -1
  46. data/app/controllers/spotlight/pages_controller.rb +11 -11
  47. data/app/controllers/spotlight/resources/upload_controller.rb +1 -1
  48. data/app/controllers/spotlight/resources_controller.rb +1 -1
  49. data/app/controllers/spotlight/solr_controller.rb +5 -1
  50. data/app/helpers/spotlight/application_helper.rb +14 -26
  51. data/app/helpers/spotlight/crud_link_helpers.rb +0 -12
  52. data/app/helpers/spotlight/main_app_helpers.rb +2 -2
  53. data/app/javascript/spotlight/admin/add_another.js +37 -25
  54. data/app/javascript/spotlight/admin/add_image_selector.js +43 -26
  55. data/app/javascript/spotlight/admin/add_new_button.js +51 -36
  56. data/app/javascript/spotlight/admin/blacklight_configuration.js +76 -54
  57. data/app/javascript/spotlight/admin/block_mixins/autocompleteable.js +102 -101
  58. data/app/javascript/spotlight/admin/block_mixins/formable.js +91 -75
  59. data/app/javascript/spotlight/admin/block_mixins/plustextable.js +46 -48
  60. data/app/javascript/spotlight/admin/blocks/block.js +27 -28
  61. data/app/javascript/spotlight/admin/blocks/browse_block.js +14 -10
  62. data/app/javascript/spotlight/admin/blocks/browse_group_categories_block.js +14 -10
  63. data/app/javascript/spotlight/admin/blocks/pages_block.js +5 -4
  64. data/app/javascript/spotlight/admin/blocks/resources_block.js +61 -41
  65. data/app/javascript/spotlight/admin/blocks/search_result_block.js +24 -7
  66. data/app/javascript/spotlight/admin/blocks/solr_documents_base_block.js +103 -50
  67. data/app/javascript/spotlight/admin/blocks/solr_documents_carousel_block.js +50 -26
  68. data/app/javascript/spotlight/admin/blocks/solr_documents_features_block.js +47 -23
  69. data/app/javascript/spotlight/admin/blocks/uploaded_items_block.js +35 -19
  70. data/app/javascript/spotlight/admin/crop.js +146 -66
  71. data/app/javascript/spotlight/admin/croppable.js +5 -4
  72. data/app/javascript/spotlight/admin/croppable_modal.js +67 -32
  73. data/app/javascript/spotlight/admin/edit_in_place.js +69 -54
  74. data/app/javascript/spotlight/admin/exhibits.js +92 -45
  75. data/app/javascript/spotlight/admin/form_observer.js +92 -78
  76. data/app/javascript/spotlight/admin/multi_image_selector.js +201 -153
  77. data/app/javascript/spotlight/admin/pages.js +13 -7
  78. data/app/javascript/spotlight/admin/progress_monitor.js +65 -50
  79. data/app/javascript/spotlight/admin/readonly_checkbox.js +7 -3
  80. data/app/javascript/spotlight/admin/search_typeahead.js +20 -11
  81. data/app/javascript/spotlight/admin/select_related_input.js +23 -23
  82. data/app/javascript/spotlight/admin/serialize_json.js +120 -0
  83. data/app/javascript/spotlight/admin/sir-trevor/block_controls.js +24 -11
  84. data/app/javascript/spotlight/admin/sir-trevor/block_limits.js +9 -6
  85. data/app/javascript/spotlight/admin/sir-trevor/locales.js +2 -2
  86. data/app/javascript/spotlight/admin/spotlight_nestable.js +2 -5
  87. data/app/javascript/spotlight/admin/translation_progress.js +18 -13
  88. data/app/javascript/spotlight/admin/users.js +151 -64
  89. data/app/javascript/spotlight/user/carousel.js +104 -32
  90. data/app/javascript/spotlight/user/clear_form_button.js +24 -14
  91. data/app/javascript/spotlight/user/index.js +0 -2
  92. data/app/javascript/spotlight/user/zpr_links.js +99 -40
  93. data/app/jobs/concerns/spotlight/gather_documents.rb +1 -1
  94. data/app/jobs/spotlight/add_uploads_from_csv.rb +31 -8
  95. data/app/jobs/spotlight/cleanup_job_trackers_job.rb +5 -3
  96. data/app/models/concerns/spotlight/access_controls_enforcement_search_builder.rb +13 -2
  97. data/app/models/concerns/spotlight/browse_category_search_builder.rb +3 -3
  98. data/app/models/concerns/spotlight/exhibit_documents.rb +2 -2
  99. data/app/models/concerns/spotlight/sitemap.rb +2 -2
  100. data/app/models/concerns/spotlight/solr_document/finder.rb +2 -2
  101. data/app/models/concerns/spotlight/solr_document.rb +1 -47
  102. data/app/models/sir_trevor_rails/blocks/browse_block.rb +0 -4
  103. data/app/models/sir_trevor_rails/blocks/solr_documents_block.rb +2 -1
  104. data/app/models/spotlight/blacklight_configuration.rb +5 -3
  105. data/app/models/spotlight/contact_email.rb +2 -2
  106. data/app/models/spotlight/custom_field.rb +17 -0
  107. data/app/models/spotlight/exhibit.rb +28 -0
  108. data/app/models/spotlight/featured_image.rb +1 -1
  109. data/app/models/spotlight/field_metadata.rb +10 -5
  110. data/app/models/spotlight/job_tracker.rb +0 -18
  111. data/app/models/spotlight/main_navigation.rb +2 -2
  112. data/app/models/spotlight/page.rb +3 -3
  113. data/app/models/spotlight/resources/iiif_harvester.rb +7 -4
  114. data/app/models/spotlight/resources/iiif_manifest.rb +0 -4
  115. data/app/models/spotlight/resources/iiif_manifest_metadata.rb +1 -3
  116. data/app/models/spotlight/resources/iiif_service.rb +21 -6
  117. data/app/models/spotlight/resources/upload.rb +6 -0
  118. data/app/models/spotlight/search.rb +5 -9
  119. data/app/models/spotlight/solr_document_sidecar.rb +18 -0
  120. data/app/services/spotlight/bulk_updates_csv_template_service.rb +1 -1
  121. data/app/services/spotlight/etl/pipeline.rb +2 -2
  122. data/app/services/spotlight/etl/step.rb +2 -2
  123. data/app/views/catalog/_remove_tags.html.erb +2 -2
  124. data/app/views/layouts/spotlight/base.html.erb +3 -6
  125. data/app/views/layouts/spotlight/spotlight.html.erb +2 -2
  126. data/app/views/shared/_analytics.html.erb +4 -3
  127. data/app/views/shared/_masthead.html.erb +2 -18
  128. data/app/views/spotlight/about_pages/_empty.html.erb +1 -1
  129. data/app/views/spotlight/about_pages/_sidebar.html.erb +10 -8
  130. data/app/views/spotlight/browse/_search.html.erb +2 -2
  131. data/app/views/spotlight/browse/_search_box.html.erb +6 -14
  132. data/app/views/spotlight/browse/index.html.erb +1 -1
  133. data/app/views/spotlight/browse/show.html.erb +1 -1
  134. data/app/views/spotlight/catalog/_document_admin_table.html.erb +1 -1
  135. data/app/views/spotlight/catalog/_edit_default.html.erb +1 -1
  136. data/app/views/spotlight/catalog/edit.html.erb +1 -1
  137. data/app/views/spotlight/dashboards/_page.html.erb +1 -1
  138. data/app/views/spotlight/exhibits/_exhibit_card.html.erb +3 -1
  139. data/app/views/spotlight/exhibits/_export.html.erb +17 -1
  140. data/app/views/spotlight/exhibits/_form.html.erb +20 -4
  141. data/app/views/spotlight/exhibits/_missing_exhibits.html.erb +3 -3
  142. data/app/views/spotlight/exhibits/index.html.erb +21 -8
  143. data/app/views/spotlight/feature_pages/_empty.html.erb +1 -1
  144. data/app/views/spotlight/feature_pages/_sidebar.html.erb +17 -15
  145. data/app/views/spotlight/home_pages/_empty.html.erb +7 -7
  146. data/app/views/spotlight/pages/show.html.erb +1 -0
  147. data/app/views/spotlight/resources/upload/_form.html.erb +2 -2
  148. data/app/views/spotlight/sir_trevor/blocks/_browse_group_categories_block.html.erb +5 -16
  149. data/app/views/spotlight/sir_trevor/blocks/_embedded_document.html.erb +3 -5
  150. data/app/views/spotlight/sir_trevor/blocks/_link_to_search_block.html.erb +1 -1
  151. data/app/views/spotlight/sir_trevor/blocks/_solr_documents_carousel_block.html.erb +11 -2
  152. data/app/views/spotlight/sites/_exhibit.html.erb +1 -1
  153. data/config/i18n-tasks.yml +1 -1
  154. data/config/locales/spotlight.ar.yml +1 -2
  155. data/config/locales/spotlight.de.yml +1 -2
  156. data/config/locales/spotlight.en.yml +39 -10
  157. data/config/locales/spotlight.es.yml +1 -2
  158. data/config/locales/spotlight.fr.yml +1 -2
  159. data/config/locales/spotlight.it.yml +1 -2
  160. data/config/locales/spotlight.ja.yml +39 -0
  161. data/config/locales/spotlight.zh.yml +1 -2
  162. data/db/migrate/20261007133748_add_discovery_enabled_to_spotlight_exhibits.rb +5 -0
  163. data/lib/generators/spotlight/assets/importmap_generator.rb +2 -10
  164. data/lib/generators/spotlight/assets/propshaft_generator.rb +5 -4
  165. data/lib/generators/spotlight/install_generator.rb +2 -4
  166. data/lib/generators/spotlight/templates/catalog_controller.rb +0 -1
  167. data/lib/generators/spotlight/templates/config/initializers/spotlight_initializer.rb +26 -4
  168. data/lib/generators/spotlight/templates/solr/conf/schema.xml +4 -3
  169. data/lib/generators/spotlight/templates/solr/conf/solrconfig.xml +3 -8
  170. data/lib/migration/page_language.rb +0 -2
  171. data/lib/spotlight/engine.rb +28 -9
  172. data/lib/spotlight/search_state.rb +7 -11
  173. data/lib/spotlight/upload_field_config.rb +19 -1
  174. data/lib/spotlight/version.rb +1 -1
  175. data/lib/spotlight.rb +1 -1
  176. data/spec/support/features/capybara_wait_metadata_helper.rb +3 -1
  177. data/spec/support/features/test_features_helpers.rb +24 -1
  178. data/spec/support/iiif_manifest_fixtures.rb +33 -0
  179. data/spec/support/stub_dns_resolution.rb +12 -0
  180. metadata +50 -80
  181. data/app/assets/stylesheets/spotlight/_uploaded_items_block.scss +0 -7
  182. data/app/assets/stylesheets/spotlight/_variables.scss +0 -13
  183. data/app/components/blacklight/icons/arrow_alt_circle_left_component.rb +0 -15
  184. data/app/components/blacklight/icons/arrow_alt_circle_right_component.rb +0 -15
  185. data/app/components/blacklight/icons/info_component.rb +0 -15
  186. data/app/components/blacklight/icons/zoom_in_component.rb +0 -15
  187. data/app/components/blacklight/icons/zoom_out_component.rb +0 -15
  188. data/app/components/spotlight/icon_component.rb +0 -13
  189. data/app/javascript/spotlight/user/browse_group_categories.js +0 -54
  190. data/app/mailers/spotlight/invitation_mailer.rb +0 -21
  191. data/app/models/concerns/spotlight/resources/web.rb +0 -38
  192. data/app/services/spotlight/iiif_resource_resolver.rb +0 -78
  193. data/app/views/catalog/_image_default.html.erb +0 -6
  194. data/app/views/shared/_exhibit_navbar.html.erb +0 -2
  195. data/app/views/shared/_header_navbar.html.erb +0 -6
  196. data/app/views/spotlight/catalog/_admin_index_header_default.html.erb +0 -23
  197. data/app/views/spotlight/catalog/_admin_thumbnail_default.html.erb +0 -7
  198. data/app/views/spotlight/catalog/_curation_mode_toggle_default.html.erb +0 -1
  199. data/app/views/spotlight/catalog/_document_row.html.erb +0 -2
  200. data/app/views/spotlight/catalog/_edit_sidecar.html.erb +0 -24
  201. data/app/views/spotlight/catalog/_index_compact_default.html.erb +0 -21
  202. data/app/views/spotlight/custom_fields/form_group/_text.html.erb +0 -23
  203. data/app/views/spotlight/custom_fields/form_group/_vocab.html.erb +0 -23
  204. data/app/views/spotlight/invitation_mailer/exhibit_invitation_notification.html.erb +0 -12
  205. data/lib/generators/spotlight/templates/javascript/jquery-shim.js +0 -1
  206. data/vendor/assets/javascripts/tiny-slider.js +0 -3221
  207. data/vendor/assets/stylesheets/tiny-slider.css +0 -1
  208. /data/app/assets/stylesheets/spotlight/{_breadcrumbs.scss → _breadcrumbs.css} +0 -0
  209. /data/app/assets/stylesheets/spotlight/{_croppable.scss → _croppable.css} +0 -0
  210. /data/app/assets/stylesheets/spotlight/{_modals.scss → _modals.css} +0 -0
  211. /data/app/assets/stylesheets/spotlight/{_utilities.scss → _utilities.css} +0 -0
@@ -1,13 +1,14 @@
1
1
  import Iiif from "spotlight/admin/iiif"
2
2
  import Core from "spotlight/core"
3
+ import multiImageSelector from "spotlight/admin/multi_image_selector"
3
4
 
4
5
  SirTrevor.Blocks.SolrDocumentsBase = (function () {
5
6
  return Core.Block.Resources.extend({
6
7
  plustextable: true,
7
8
  autocomplete_url: function () {
8
- return this.$instance()
9
- .closest("form[data-autocomplete-exhibit-catalog-path]")
10
- .data("autocomplete-exhibit-catalog-path")
9
+ return this.instance().closest(
10
+ "form[data-autocomplete-exhibit-catalog-path]",
11
+ ).dataset.autocompleteExhibitCatalogPath
11
12
  },
12
13
  autocomplete_template: function (obj) {
13
14
  const thumbnail = obj.thumbnail
@@ -17,19 +18,32 @@ SirTrevor.Blocks.SolrDocumentsBase = (function () {
17
18
  <span class="autocomplete-title">${this.highlight(obj.title)}</span><br/><small>&nbsp;&nbsp;${this.highlight(obj.description)}</small></div>`
18
19
  },
19
20
  transform_autocomplete_results: function (response) {
20
- return $.map(response["docs"], function (doc) {
21
+ return (response["docs"] || []).map(function (doc) {
21
22
  return doc
22
23
  })
23
24
  },
24
25
 
25
26
  caption_option_values: function () {
26
- var fields = $("[data-blacklight-configuration-index-fields]").data(
27
- "blacklight-configuration-index-fields",
27
+ const element = document.querySelector(
28
+ "[data-blacklight-configuration-index-fields]",
28
29
  )
30
+ const fieldsData = element
31
+ ? element.dataset.blacklightConfigurationIndexFields
32
+ : null
33
+ let fields = []
34
+ if (fieldsData) {
35
+ try {
36
+ fields = JSON.parse(fieldsData)
37
+ } catch {
38
+ // ignore
39
+ }
40
+ }
29
41
 
30
- return $.map(fields, function (field) {
31
- return $("<option />").val(field.key).text(field.label)[0].outerHTML
32
- }).join("\n")
42
+ return fields
43
+ .map(function (field) {
44
+ return `<option value="${field.key}">${field.label}</option>`
45
+ })
46
+ .join("\n")
33
47
  },
34
48
 
35
49
  item_options: function () {
@@ -117,64 +131,103 @@ SirTrevor.Blocks.SolrDocumentsBase = (function () {
117
131
  // from canvases in the manifest, transformed by spotlight/admin/iiif.js in
118
132
  // the #images method.
119
133
  setIiifFields: function (panel, manifest_data, initialize) {
120
- var legacyThumbnailField = $(panel).find(
134
+ if (!panel) return
135
+
136
+ const legacyThumbnailField = panel.querySelector(
121
137
  '[name$="[thumbnail_image_url]"]',
122
138
  )
123
- var legacyFullField = $(panel).find('[name$="[full_image_url]"]')
139
+ const legacyFullField = panel.querySelector('[name$="[full_image_url]"]')
124
140
 
125
- if (initialize && legacyThumbnailField.val().length > 0) {
141
+ if (
142
+ initialize &&
143
+ legacyThumbnailField &&
144
+ legacyThumbnailField.value.length > 0
145
+ ) {
126
146
  return
127
147
  }
128
148
 
129
- legacyThumbnailField.val("")
130
- legacyFullField.val("")
131
- $(panel).find('[name$="[iiif_image_id]"]').val(manifest_data.imageId)
132
- $(panel).find('[name$="[iiif_tilesource]"]').val(manifest_data.tilesource)
133
- $(panel).find('[name$="[iiif_manifest_url]"]').val(manifest_data.manifest)
134
- $(panel).find('[name$="[iiif_canvas_id]"]').val(manifest_data.canvasId)
135
- $(panel)
136
- .find("img.img-thumbnail")
137
- .attr(
138
- "src",
149
+ if (legacyThumbnailField) legacyThumbnailField.value = ""
150
+ if (legacyFullField) legacyFullField.value = ""
151
+
152
+ const iiifImageIdField = panel.querySelector('[name$="[iiif_image_id]"]')
153
+ if (iiifImageIdField) iiifImageIdField.value = manifest_data.imageId || ""
154
+
155
+ const iiifTilesourceField = panel.querySelector(
156
+ '[name$="[iiif_tilesource]"]',
157
+ )
158
+ if (iiifTilesourceField)
159
+ iiifTilesourceField.value = manifest_data.tilesource || ""
160
+
161
+ const iiifManifestUrlField = panel.querySelector(
162
+ '[name$="[iiif_manifest_url]"]',
163
+ )
164
+ if (iiifManifestUrlField)
165
+ iiifManifestUrlField.value = manifest_data.manifest || ""
166
+
167
+ const iiifCanvasIdField = panel.querySelector(
168
+ '[name$="[iiif_canvas_id]"]',
169
+ )
170
+ if (iiifCanvasIdField)
171
+ iiifCanvasIdField.value = manifest_data.canvasId || ""
172
+
173
+ const img = panel.querySelector("img.img-thumbnail")
174
+ if (img) {
175
+ img.src =
139
176
  manifest_data.thumbnail_image_url ||
140
- manifest_data.tilesource.replace(
141
- "/info.json",
142
- "/full/100,100/0/default.jpg",
143
- ),
144
- )
177
+ (manifest_data.tilesource || "").replace(
178
+ "/info.json",
179
+ "/full/100,100/0/default.jpg",
180
+ )
181
+ }
145
182
  },
146
183
  afterPanelRender: function (data, panel) {
184
+ if (!panel) return
185
+
147
186
  var context = this
148
187
  var manifestUrl = data.iiif_manifest || data.iiif_manifest_url
149
188
 
150
189
  if (!manifestUrl) {
151
- $(panel)
152
- .find('[name$="[thumbnail_image_url]"]')
153
- .val(data.thumbnail_image_url || data.thumbnail)
154
- $(panel).find('[name$="[full_image_url]"]').val(data.full_image_url)
190
+ const legacyThumbnailField = panel.querySelector(
191
+ '[name$="[thumbnail_image_url]"]',
192
+ )
193
+ if (legacyThumbnailField) {
194
+ legacyThumbnailField.value =
195
+ data.thumbnail_image_url || data.thumbnail || ""
196
+ }
197
+ const legacyFullField = panel.querySelector(
198
+ '[name$="[full_image_url]"]',
199
+ )
200
+ if (legacyFullField) {
201
+ legacyFullField.value = data.full_image_url || ""
202
+ }
155
203
 
156
204
  return
157
205
  }
158
206
 
159
- $.ajax(manifestUrl).done(function (manifest) {
160
- var iiifManifest = new Iiif(manifestUrl, manifest)
161
-
162
- var thumbs = iiifManifest.imagesArray()
163
-
164
- if (!data.iiif_image_id) {
165
- context.setIiifFields(panel, thumbs[0], !!data.iiif_manifest_url)
166
- }
167
-
168
- if (thumbs.length > 1) {
169
- panel.multiImageSelector(
170
- thumbs,
171
- function (selectorImage) {
172
- context.setIiifFields(panel, selectorImage, false)
173
- },
174
- data.iiif_image_id,
175
- )
176
- }
177
- })
207
+ fetch(manifestUrl)
208
+ .then(function (response) {
209
+ return response.json()
210
+ })
211
+ .then(function (manifest) {
212
+ var iiifManifest = new Iiif(manifestUrl, manifest)
213
+
214
+ var thumbs = iiifManifest.imagesArray()
215
+
216
+ if (!data.iiif_image_id) {
217
+ context.setIiifFields(panel, thumbs[0], !!data.iiif_manifest_url)
218
+ }
219
+
220
+ if (thumbs.length > 1) {
221
+ multiImageSelector(
222
+ panel,
223
+ thumbs,
224
+ function (selectorImage) {
225
+ context.setIiifFields(panel, selectorImage, false)
226
+ },
227
+ data.iiif_image_id,
228
+ )
229
+ }
230
+ })
178
231
  },
179
232
  })
180
233
  })()
@@ -1,3 +1,8 @@
1
+ import * as bootstrap from "bootstrap"
2
+
3
+ // Bootstrap's ESM build exports Carousel by name; CDN-converted UMD builds (e.g. ga.jspm.io) only have a default export
4
+ const Carousel = bootstrap.Carousel ?? bootstrap.default?.Carousel
5
+
1
6
  SirTrevor.Blocks.SolrDocumentsCarousel = (function () {
2
7
  return SirTrevor.Blocks.SolrDocumentsBase.extend({
3
8
  plustextable: false,
@@ -39,7 +44,7 @@ SirTrevor.Blocks.SolrDocumentsCarousel = (function () {
39
44
  addCarouselCycleOptions: function (options) {
40
45
  var html = ""
41
46
 
42
- $.each(options.values, function (index, interval) {
47
+ options.values.forEach(function (interval) {
43
48
  var selected = interval === options.selected ? "selected" : "",
44
49
  intervalInMilliSeconds = parseInt(interval, 10) * 1000
45
50
 
@@ -60,7 +65,8 @@ SirTrevor.Blocks.SolrDocumentsCarousel = (function () {
60
65
  var html = "",
61
66
  _this = this
62
67
 
63
- $.each(options.values, function (size, px) {
68
+ Object.keys(options.values).forEach(function (size) {
69
+ var px = options.values[size]
64
70
  var checked = size === options.selected ? "checked" : "",
65
71
  id = _this.formId(_this.max_height_key)
66
72
 
@@ -84,35 +90,53 @@ SirTrevor.Blocks.SolrDocumentsCarousel = (function () {
84
90
  },
85
91
 
86
92
  afterPreviewLoad: function (_options) {
87
- $(this.inner).find(".carousel").carousel()
88
-
89
- // the bootstrap carousel only initializes data-bs-slide widgets on page load, so we need
90
- // to initialize them ourselves..
91
- var clickHandler = function (e) {
92
- var href
93
- var $this = $(this)
94
- var $target = $(
95
- $this.attr("data-bs-target") ||
96
- ((href = $this.attr("href")) && href.replace(/.*(?=#[^\s]+$)/, "")),
97
- ) // strip for ie7
98
- if (!$target.hasClass("carousel")) return
99
- var options = $.extend({}, $target.data(), $this.data())
100
- var slideIndex = $this.attr("data-bs-slide-to")
101
- if (slideIndex) options.interval = false
102
-
103
- $.fn.carousel.call($target, options)
104
-
105
- if (slideIndex) {
106
- $target.data("bs.carousel").to(slideIndex)
93
+ const carousels = this.inner.querySelectorAll(".carousel")
94
+
95
+ const clickHandler = function (e) {
96
+ const button = e.currentTarget
97
+ let target
98
+ try {
99
+ const targetSelector =
100
+ button.getAttribute("data-bs-target") || button.getAttribute("href")
101
+ if (targetSelector) {
102
+ target = document.querySelector(targetSelector)
103
+ }
104
+ } catch {
105
+ // ignore selector errors
106
+ }
107
+
108
+ if (!target) {
109
+ target = button.closest(".carousel")
110
+ }
111
+
112
+ if (!target || !target.classList.contains("carousel")) return
113
+
114
+ const carousel = Carousel.getOrCreateInstance(target)
115
+ const slideIndex = button.getAttribute("data-bs-slide-to")
116
+
117
+ if (slideIndex !== null) {
118
+ carousel.to(parseInt(slideIndex, 10))
119
+ } else {
120
+ const slideAction = button.getAttribute("data-bs-slide")
121
+ if (slideAction === "next") {
122
+ carousel.next()
123
+ } else if (slideAction === "prev") {
124
+ carousel.prev()
125
+ }
107
126
  }
108
127
 
109
128
  e.preventDefault()
110
129
  }
111
130
 
112
- $(this.inner)
113
- .find(".carousel")
114
- .on("click.bs.carousel.data-api", "[data-bs-slide]", clickHandler)
115
- .on("click.bs.carousel.data-api", "[data-bs-slide-to]", clickHandler)
131
+ carousels.forEach(function (carouselEl) {
132
+ Carousel.getOrCreateInstance(carouselEl)
133
+
134
+ carouselEl
135
+ .querySelectorAll("[data-bs-slide], [data-bs-slide-to]")
136
+ .forEach(function (btn) {
137
+ btn.addEventListener("click", clickHandler)
138
+ })
139
+ })
116
140
  },
117
141
  })
118
142
  })()
@@ -1,3 +1,8 @@
1
+ import * as bootstrap from "bootstrap"
2
+
3
+ // Bootstrap's ESM build exports Carousel by name; CDN-converted UMD builds (e.g. ga.jspm.io) only have a default export
4
+ const Carousel = bootstrap.Carousel ?? bootstrap.default?.Carousel
5
+
1
6
  SirTrevor.Blocks.SolrDocumentsFeatures = (function () {
2
7
  return SirTrevor.Blocks.SolrDocumentsBase.extend({
3
8
  plustextable: false,
@@ -6,34 +11,53 @@ SirTrevor.Blocks.SolrDocumentsFeatures = (function () {
6
11
  icon_name: "item_features",
7
12
 
8
13
  afterPreviewLoad: function (_options) {
9
- $(this.inner).find(".carousel").carousel()
10
-
11
- // the bootstrap carousel only initializes data-bs-slide widgets on page load, so we need
12
- // to initialize them ourselves..
13
- var clickHandler = function (e) {
14
- var href
15
- var $this = $(this)
16
- var $target = $(
17
- $this.attr("data-bs-target") ||
18
- ((href = $this.attr("href")) && href.replace(/.*(?=#[^\s]+$)/, "")),
19
- ) // strip for ie7
20
- if (!$target.hasClass("carousel")) return
21
- var options = $.extend({}, $target.data(), $this.data())
22
- var slideIndex = $this.attr("data-bs-slide-to")
23
- if (slideIndex) options.interval = false
24
-
25
- $.fn.carousel.call($target, options)
26
-
27
- if (slideIndex) {
28
- $target.data("bs.carousel").to(slideIndex)
14
+ const carousels = this.inner.querySelectorAll(".carousel")
15
+
16
+ const clickHandler = function (e) {
17
+ const button = e.currentTarget
18
+ let target
19
+ try {
20
+ const targetSelector =
21
+ button.getAttribute("data-bs-target") || button.getAttribute("href")
22
+ if (targetSelector) {
23
+ target = document.querySelector(targetSelector)
24
+ }
25
+ } catch {
26
+ // ignore selector errors
27
+ }
28
+
29
+ if (!target) {
30
+ target = button.closest(".carousel")
31
+ }
32
+
33
+ if (!target || !target.classList.contains("carousel")) return
34
+
35
+ const carousel = Carousel.getOrCreateInstance(target)
36
+ const slideIndex = button.getAttribute("data-bs-slide-to")
37
+
38
+ if (slideIndex !== null) {
39
+ carousel.to(parseInt(slideIndex, 10))
40
+ } else {
41
+ const slideAction = button.getAttribute("data-bs-slide")
42
+ if (slideAction === "next") {
43
+ carousel.next()
44
+ } else if (slideAction === "prev") {
45
+ carousel.prev()
46
+ }
29
47
  }
30
48
 
31
49
  e.preventDefault()
32
50
  }
33
51
 
34
- $(this.inner)
35
- .find(".carousel")
36
- .on("click.bs.carousel.data-api", "[data-bs-slide-to]", clickHandler)
52
+ carousels.forEach(function (carouselEl) {
53
+ Carousel.getOrCreateInstance(carouselEl)
54
+
55
+ carouselEl
56
+ .querySelectorAll("[data-bs-slide-to]")
57
+ .forEach(function (btn) {
58
+ btn.addEventListener("click", clickHandler)
59
+ })
60
+ })
37
61
  },
38
62
  })
39
63
  })()
@@ -21,18 +21,20 @@ SirTrevor.Blocks.UploadedItems = (function () {
21
21
  upload_options: { html: "" },
22
22
 
23
23
  fileInput: function () {
24
- return $(this.inner).find('input[type="file"]')
24
+ return this.inner.querySelector('input[type="file"]')
25
25
  },
26
26
 
27
27
  onBlockRender: function () {
28
- SpotlightNestable.init($(this.inner).find('[data-behavior="nestable"]'))
28
+ SpotlightNestable.init(
29
+ this.inner.querySelectorAll('[data-behavior="nestable"]'),
30
+ )
29
31
 
30
- this.fileInput().on(
31
- "change",
32
- function (ev) {
32
+ const input = this.fileInput()
33
+ if (input) {
34
+ input.addEventListener("change", (ev) => {
33
35
  this.onDrop(ev.currentTarget)
34
- }.bind(this),
35
- )
36
+ })
37
+ }
36
38
  },
37
39
 
38
40
  onDrop: function (transferData) {
@@ -50,12 +52,15 @@ SirTrevor.Blocks.UploadedItems = (function () {
50
52
 
51
53
  this.uploader(
52
54
  file,
53
- function (data) {
55
+ (data) => {
54
56
  this.createItemPanel(data)
55
- this.fileInput().val("")
57
+ const input = this.fileInput()
58
+ if (input) {
59
+ input.value = ""
60
+ }
56
61
  this.ready()
57
62
  },
58
- function (_error) {
63
+ () => {
59
64
  this.addMessage(i18n.t("blocks:image:upload_error"))
60
65
  this.ready()
61
66
  },
@@ -119,16 +124,27 @@ SirTrevor.Blocks.UploadedItems = (function () {
119
124
  </div>
120
125
  </li>`
121
126
 
122
- const panel = $(markup)
123
- panel.find('[data-field="caption"]').val(data.caption)
124
- panel.find('[data-field="link"]').val(data.link)
125
- var context = this
127
+ const tempDiv = document.createElement("div")
128
+ tempDiv.innerHTML = markup.trim()
129
+ const panel = tempDiv.firstElementChild
126
130
 
127
- $(".remove a", panel).on("click", function (e) {
128
- e.preventDefault()
129
- $(this).closest(".field").remove()
130
- context.afterPanelDelete()
131
- })
131
+ const captionInput = panel.querySelector('[data-field="caption"]')
132
+ if (captionInput) {
133
+ captionInput.value = data.caption || ""
134
+ }
135
+ const linkInput = panel.querySelector('[data-field="link"]')
136
+ if (linkInput) {
137
+ linkInput.value = data.link || ""
138
+ }
139
+
140
+ const removeBtn = panel.querySelector(".remove a")
141
+ if (removeBtn) {
142
+ removeBtn.addEventListener("click", (e) => {
143
+ e.preventDefault()
144
+ panel.remove()
145
+ this.afterPanelDelete()
146
+ })
147
+ }
132
148
 
133
149
  this.afterPanelRender(data, panel)
134
150