blacklight 8.0.0.beta1 → 8.0.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 (151) hide show
  1. checksums.yaml +4 -4
  2. data/.env +1 -0
  3. data/.github/workflows/ruby.yml +6 -0
  4. data/.gitignore +1 -0
  5. data/.rubocop_todo.yml +3 -1
  6. data/README.md +1 -1
  7. data/Rakefile +18 -0
  8. data/VERSION +1 -1
  9. data/app/assets/config/blacklight/manifest.js +3 -0
  10. data/app/assets/javascripts/blacklight/blacklight.esm.js +132 -140
  11. data/app/assets/javascripts/blacklight/blacklight.esm.js.map +1 -1
  12. data/app/assets/javascripts/blacklight/blacklight.js +132 -140
  13. data/app/assets/javascripts/blacklight/blacklight.js.map +1 -1
  14. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +1 -1
  15. data/app/assets/stylesheets/blacklight/_facets.scss +32 -5
  16. data/app/assets/stylesheets/blacklight/blacklight_defaults.scss +1 -1
  17. data/app/components/blacklight/advanced_search_form_component.rb +3 -3
  18. data/app/components/blacklight/document/actions_component.rb +1 -1
  19. data/app/components/blacklight/document/show_tools_component.html.erb +12 -0
  20. data/app/components/blacklight/document/show_tools_component.rb +23 -0
  21. data/app/components/blacklight/document_component.rb +48 -20
  22. data/app/components/blacklight/document_metadata_component.html.erb +4 -2
  23. data/app/components/blacklight/document_metadata_component.rb +8 -2
  24. data/app/components/blacklight/facet_field_checkboxes_component.html.erb +2 -2
  25. data/app/components/blacklight/facet_field_list_component.html.erb +2 -2
  26. data/app/components/blacklight/metadata_field_component.html.erb +2 -2
  27. data/app/components/blacklight/metadata_field_layout_component.rb +7 -4
  28. data/app/components/blacklight/metadata_field_plain_text_layout_component.rb +17 -0
  29. data/app/components/blacklight/response/facet_group_component.html.erb +2 -1
  30. data/app/components/blacklight/response/facet_group_component.rb +1 -1
  31. data/app/components/blacklight/response/sort_component.rb +1 -1
  32. data/app/components/blacklight/response/spellcheck_component.rb +1 -1
  33. data/app/components/blacklight/response/view_type_button_component.rb +1 -1
  34. data/app/components/blacklight/response/view_type_component.rb +2 -2
  35. data/app/components/blacklight/search/sidebar_component.html.erb +1 -1
  36. data/app/components/blacklight/search_context/server_applied_params_component.html.erb +4 -0
  37. data/app/components/blacklight/search_context/server_applied_params_component.rb +13 -0
  38. data/app/components/blacklight/search_context/server_item_pagination_component.rb +71 -0
  39. data/app/components/blacklight/system/dropdown_component.rb +3 -3
  40. data/app/components/blacklight/system/flash_message_component.rb +2 -2
  41. data/app/components/blacklight/system/modal_component.rb +1 -1
  42. data/app/components/blacklight/top_navbar_component.html.erb +1 -1
  43. data/app/components/blacklight/top_navbar_component.rb +4 -0
  44. data/app/controllers/concerns/blacklight/bookmarks.rb +1 -1
  45. data/app/controllers/concerns/blacklight/search_context.rb +46 -6
  46. data/app/helpers/blacklight/blacklight_helper_behavior.rb +0 -101
  47. data/app/helpers/blacklight/catalog_helper_behavior.rb +27 -54
  48. data/app/helpers/blacklight/component_helper_behavior.rb +0 -11
  49. data/app/helpers/blacklight/document_helper_behavior.rb +76 -0
  50. data/app/helpers/blacklight/layout_helper_behavior.rb +59 -0
  51. data/app/helpers/blacklight/render_partials_helper_behavior.rb +1 -0
  52. data/app/helpers/blacklight/url_helper_behavior.rb +11 -3
  53. data/app/javascript/blacklight/bookmark_toggle.js +8 -15
  54. data/app/javascript/blacklight/button_focus.js +10 -10
  55. data/app/javascript/blacklight/index.js +6 -5
  56. data/app/javascript/blacklight/modal.js +24 -24
  57. data/app/javascript/blacklight/search_context.js +51 -57
  58. data/app/models/concerns/blacklight/document.rb +11 -0
  59. data/app/models/record_mailer.rb +19 -15
  60. data/app/presenters/blacklight/document_presenter.rb +13 -11
  61. data/app/presenters/blacklight/index_presenter.rb +1 -1
  62. data/app/presenters/blacklight/rendering/abstract_step.rb +4 -0
  63. data/app/presenters/blacklight/rendering/join.rb +7 -1
  64. data/app/presenters/blacklight/rendering/link_to_facet.rb +1 -1
  65. data/app/presenters/blacklight/rendering/microdata.rb +1 -1
  66. data/app/services/blacklight/search_service.rb +2 -1
  67. data/app/views/catalog/_document.atom.builder +1 -1
  68. data/app/views/catalog/_document.html.erb +3 -8
  69. data/app/views/catalog/_document_list.html.erb +2 -1
  70. data/app/views/catalog/_facet_layout.html.erb +2 -2
  71. data/app/views/catalog/_show_main_content.html.erb +5 -11
  72. data/app/views/catalog/_show_tools.html.erb +1 -14
  73. data/app/views/catalog/facet.html.erb +3 -3
  74. data/app/views/catalog/index.html.erb +3 -0
  75. data/app/views/catalog/show.html.erb +1 -6
  76. data/app/views/layouts/blacklight/base.html.erb +4 -5
  77. data/app/views/record_mailer/email_record.text.erb +4 -3
  78. data/app/views/record_mailer/sms_record.text.erb +4 -4
  79. data/blacklight.gemspec +2 -2
  80. data/config/importmap.rb +1 -1
  81. data/config/locales/blacklight.ar.yml +209 -232
  82. data/config/locales/blacklight.ca.yml +0 -6
  83. data/config/locales/blacklight.de.yml +197 -215
  84. data/config/locales/blacklight.en.yml +2 -6
  85. data/config/locales/blacklight.es.yml +196 -215
  86. data/config/locales/blacklight.fr.yml +196 -219
  87. data/config/locales/blacklight.hu.yml +193 -212
  88. data/config/locales/blacklight.it.yml +197 -215
  89. data/config/locales/blacklight.nl.yml +193 -212
  90. data/config/locales/blacklight.pt-BR.yml +195 -215
  91. data/config/locales/blacklight.sq.yml +193 -212
  92. data/config/locales/blacklight.zh.yml +194 -213
  93. data/docker-compose.yml +1 -0
  94. data/lib/blacklight/configuration/session_tracking_config.rb +45 -0
  95. data/lib/blacklight/configuration/view_config.rb +0 -4
  96. data/lib/blacklight/configuration.rb +8 -4
  97. data/lib/blacklight/engine.rb +6 -7
  98. data/lib/blacklight/routes/searchable.rb +1 -0
  99. data/lib/generators/blacklight/assets/importmap_generator.rb +9 -8
  100. data/lib/generators/blacklight/assets/propshaft_generator.rb +11 -2
  101. data/lib/generators/blacklight/assets/sprockets_generator.rb +2 -0
  102. data/lib/generators/blacklight/assets_generator.rb +3 -1
  103. data/lib/generators/blacklight/install_generator.rb +3 -1
  104. data/lib/generators/blacklight/templates/solr_document.rb +0 -6
  105. data/package.json +7 -4
  106. data/rollup.config.js +11 -1
  107. data/spec/components/blacklight/document_component_spec.rb +66 -15
  108. data/spec/components/blacklight/header_component_spec.rb +20 -0
  109. data/spec/components/blacklight/response/view_type_component_spec.rb +17 -0
  110. data/spec/components/blacklight/search_bar_component_spec.rb +1 -1
  111. data/spec/components/blacklight/search_context/server_applied_params_component_spec.rb +29 -0
  112. data/spec/components/blacklight/{search_context_component_spec.rb → search_context/server_item_pagination_component_spec.rb} +15 -4
  113. data/spec/controllers/bookmarks_controller_spec.rb +1 -1
  114. data/spec/controllers/catalog_controller_spec.rb +18 -6
  115. data/spec/features/component_template_override_spec.rb +8 -0
  116. data/spec/features/modal_spec.rb +12 -0
  117. data/spec/features/sitelinks_search_box_spec.rb +13 -0
  118. data/spec/helpers/blacklight/url_helper_behavior_spec.rb +1 -1
  119. data/spec/helpers/blacklight_helper_spec.rb +0 -56
  120. data/spec/helpers/catalog_helper_spec.rb +56 -0
  121. data/spec/lib/blacklight/configuration/session_tracking_config_spec.rb +38 -0
  122. data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +2 -2
  123. data/spec/models/blacklight/configuration_spec.rb +2 -2
  124. data/spec/models/blacklight/icon_spec.rb +0 -2
  125. data/spec/models/blacklight/search_builder_spec.rb +3 -3
  126. data/spec/models/blacklight/solr/request_spec.rb +2 -2
  127. data/spec/models/record_mailer_spec.rb +36 -23
  128. data/spec/presenters/blacklight/document_presenter_spec.rb +1 -0
  129. data/spec/presenters/blacklight/field_presenter_spec.rb +2 -2
  130. data/spec/presenters/blacklight/index_presenter_spec.rb +1 -0
  131. data/spec/presenters/blacklight/show_presenter_spec.rb +1 -0
  132. data/spec/presenters/pipeline_spec.rb +13 -2
  133. data/spec/routing/catalog_routing_spec.rb +4 -0
  134. data/spec/spec_helper.rb +1 -1
  135. data/spec/support/view_component_test_helpers.rb +21 -0
  136. data/spec/test_app_templates/Gemfile.extra +4 -0
  137. data/spec/test_app_templates/lib/generators/test_app_generator.rb +8 -0
  138. data/spec/views/catalog/_document.html.erb_spec.rb +22 -1
  139. data/spec/views/catalog/_document_list.html.erb_spec.rb +7 -2
  140. data/spec/views/catalog/_show_tools.html.erb_spec.rb +2 -2
  141. data/spec/views/catalog/index.json.jbuilder_spec.rb +1 -1
  142. data/tasks/blacklight.rake +1 -1
  143. metadata +39 -21
  144. data/app/components/blacklight/search_context_component.rb +0 -68
  145. data/app/models/concerns/blacklight/document/email.rb +0 -27
  146. data/app/models/concerns/blacklight/document/sms.rb +0 -25
  147. data/spec/features/sitelinks_search_box.rb +0 -13
  148. data/spec/models/blacklight/document/email_spec.rb +0 -57
  149. data/spec/models/blacklight/document/sms_spec.rb +0 -58
  150. data/spec/support/view_component_capybara_test_helpers.rb +0 -8
  151. /data/app/components/blacklight/{search_context_component.html.erb → search_context/server_item_pagination_component.html.erb} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 765dc9ca02858805dc2cafc39f45090482e33301fec1c6ce6a7481a7bec5376d
4
- data.tar.gz: de48bda0bbcfb1bb096d2f516480ef4bfb77fddbed03ab0ac4f1ab533f433400
3
+ metadata.gz: bf15f6dbb817f0839a3b5729997535274d21043ff834b4882cbd50af5ad37f05
4
+ data.tar.gz: 57101760654230e5c50eaae71bdaf2fc679230d2ed739ad2023a1f48cea7a2ea
5
5
  SHA512:
6
- metadata.gz: 29e910be60960a061594b0def8b675efe0c93de7f32ea7d92180eed6d7ec9abc5b003b265ed8ca46bd50950b2d584ee5e8bd49a9f09ca0fc82884e5c31744e78
7
- data.tar.gz: 0a6805452778ce11213d7ac83238a19a596545a01d769b3f24ad59969f5f3e7fb6d0e9d8f8922792e34c062c3ccb73c04f149ff4e392f34d77ff2f6e6993e689
6
+ metadata.gz: bd8d458da8677de400d1e96104fbb0d0831ba674a1d1790dbfcdf2b4e939cc270dc6b263f48d20e2ddd309f5cff7a312d003d573cb4ab5b9455ecd970c8caa99
7
+ data.tar.gz: f2f66d799ca0c97a97705fb8d9d7f71ac2f374a9d0f69ecf02e620a5223ee1a72054b3911c8025959276a26bb71d6b852d3ab196d7b151d1d5aea3964a720e93
data/.env CHANGED
@@ -1,5 +1,6 @@
1
1
  ALPINE_RUBY_VERSION=3.0.3
2
2
  RAILS_VERSION=6.1.4.6
3
+ VIEW_COMPONENT_VERSION=2.6.6
3
4
  SOLR_PORT=8983
4
5
  SOLR_URL=http://solr:8983/solr/blacklight-core
5
6
  SOLR_VERSION=latest
@@ -36,6 +36,7 @@ jobs:
36
36
  ruby: [2.7, '3.0']
37
37
  rails_version: ['6.1.7', '7.0.4']
38
38
  bootstrap_version: [null]
39
+ view_component_version: ['~> 2.66']
39
40
  api: [null]
40
41
  additional_engine_cart_rails_options: ['']
41
42
  additional_name: ['']
@@ -44,6 +45,10 @@ jobs:
44
45
  rails_version: '7.0.4'
45
46
  - ruby: '3.1'
46
47
  rails_version: '7.0.4'
48
+ - ruby: '3.1'
49
+ rails_version: '7.0.4'
50
+ view_component_version: '~> 3.0.0.rc1'
51
+ additional_name: '/ ViewComponent 3'
47
52
  - ruby: '3.1'
48
53
  rails_version: '7.0.4'
49
54
  additional_name: '/ Propshaft'
@@ -59,6 +64,7 @@ jobs:
59
64
  additional_name: '/ API'
60
65
  env:
61
66
  RAILS_VERSION: ${{ matrix.rails_version }}
67
+ VIEW_COMPONENT_VERSION: ${{ matrix.view_component_version }}
62
68
  BOOTSTRAP_VERSION: ${{ matrix.bootstrap_version }}
63
69
  BLACKLIGHT_API_TEST: ${{ matrix.api }}
64
70
  ENGINE_CART_RAILS_OPTIONS: "--skip-git --skip-listen --skip-spring --skip-keeps --skip-action-cable --skip-coffee --skip-test ${{ matrix.additional_engine_cart_rails_options }}"
data/.gitignore CHANGED
@@ -17,3 +17,4 @@ pkg/*
17
17
  /spec/examples.txt
18
18
  node_modules/*
19
19
  package-lock.json
20
+ /app/assets/javascripts/blacklight
data/.rubocop_todo.yml CHANGED
@@ -371,7 +371,9 @@ Rails/HelperInstanceVariable:
371
371
  Exclude:
372
372
  - 'app/helpers/blacklight/blacklight_helper_behavior.rb'
373
373
  - 'app/helpers/blacklight/catalog_helper_behavior.rb'
374
+ - 'app/helpers/blacklight/document_helper_behavior.rb'
374
375
  - 'app/helpers/blacklight/component_helper_behavior.rb'
376
+ - 'app/helpers/blacklight/layout_helper_behavior.rb'
375
377
  - 'app/helpers/blacklight/render_partials_helper_behavior.rb'
376
378
 
377
379
  # Offense count: 2
@@ -384,7 +386,7 @@ Rails/I18nLocaleAssignment:
384
386
  # Offense count: 10
385
387
  Rails/OutputSafety:
386
388
  Exclude:
387
- - 'app/components/blacklight/search_context_component.rb'
389
+ - 'app/components/blacklight/search_context/server_item_pagination_component.rb'
388
390
  - 'app/helpers/blacklight/catalog_helper_behavior.rb'
389
391
  - 'app/helpers/blacklight/configuration_helper_behavior.rb'
390
392
  - 'app/presenters/blacklight/rendering/join.rb'
data/README.md CHANGED
@@ -60,7 +60,7 @@ components in the gem are changed, this bundle should be rebuild with the
60
60
  following steps:
61
61
  1. [Install npm](https://www.npmjs.com/get-npm)
62
62
  1. run `npm install` to download dependencies
63
- 1. run `npm run js-compile-bundle` to build the bundle
63
+ 1. run `npm run prepare` to build the bundle
64
64
  1. run `npm publish` to push the javascript package to https://npmjs.org/package/blacklight-frontend
65
65
 
66
66
  ## Using the javascript
data/Rakefile CHANGED
@@ -10,6 +10,24 @@ end
10
10
 
11
11
  Bundler::GemHelper.install_tasks
12
12
 
13
+ # Hook up our NPM tasks to the standard uild and release tasks
14
+ Rake::Task['build'].enhance(['build:npm'])
15
+ Rake::Task['release'].enhance(['release:npm'])
16
+
17
+ # rubocop:disable Rails/RakeEnvironment
18
+ desc 'build javascript assets'
19
+ task 'build:npm' do
20
+ sh 'npm install'
21
+ sh 'npm run prepare'
22
+ end
23
+
24
+ desc "Publish javascript assets to npm\n" \
25
+ "To prevent publishing in NPM use e.g. `npm_push=no rake release`"
26
+ task 'release:npm' do
27
+ sh 'npm publish' unless %w[n no nil false off 0].include?(ENV["npm_push"].to_s.downcase)
28
+ end
29
+ # rubocop:enable Rails/RakeEnvironment
30
+
13
31
  load "tasks/blacklight.rake"
14
32
  load "lib/railties/blacklight.rake"
15
33
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 8.0.0.beta1
1
+ 8.0.0
@@ -0,0 +1,3 @@
1
+ //= link_tree ../../images .png
2
+ //= link_directory ../../stylesheets .css
3
+ //= link_tree ../../../javascript .js
@@ -1,56 +1,3 @@
1
- const Blacklight = function() {
2
- const buffer = new Array;
3
- return {
4
- onLoad: function(func) {
5
- buffer.push(func);
6
- },
7
-
8
- activate: function() {
9
- for(let i = 0; i < buffer.length; i++) {
10
- buffer[i].call();
11
- }
12
- },
13
-
14
- listeners: function () {
15
- const listeners = [];
16
- if (typeof Turbo !== 'undefined') {
17
- listeners.push('turbo:load', 'turbo:frame-load');
18
- } else if (typeof Turbolinks !== 'undefined' && Turbolinks.supported) {
19
- // Turbolinks 5
20
- if (Turbolinks.BrowserAdapter) {
21
- listeners.push('turbolinks:load');
22
- } else {
23
- // Turbolinks < 5
24
- listeners.push('page:load', 'DOMContentLoaded');
25
- }
26
- } else {
27
- listeners.push('DOMContentLoaded');
28
- }
29
-
30
- return listeners;
31
- }
32
- };
33
- }();
34
-
35
- // turbolinks triggers page:load events on page transition
36
- // If app isn't using turbolinks, this event will never be triggered, no prob.
37
- Blacklight.listeners().forEach(function(listener) {
38
- document.addEventListener(listener, function() {
39
- Blacklight.activate();
40
- });
41
- });
42
-
43
- Blacklight.onLoad(function () {
44
- const elem = document.querySelector('.no-js');
45
-
46
- // The "no-js" class may already have been removed because this function is
47
- // run on every turbo:load event, in that case, it won't find an element.
48
- if (!elem) return;
49
-
50
- elem.classList.remove('no-js');
51
- elem.classList.add('js');
52
- });
53
-
54
1
  /* Converts a "toggle" form, with single submit button to add/remove
55
2
  something, like used for Bookmarks, into an AJAXy checkbox instead.
56
3
  Apply to a form. Does require certain assumption about the form:
@@ -132,31 +79,25 @@ class CheckboxSubmit {
132
79
  }
133
80
  }
134
81
 
135
- const BookmarkToggle = (() => {
136
- // change form submit toggle to checkbox
137
- Blacklight.doBookmarkToggleBehavior = function() {
138
- document.addEventListener('click', (e) => {
139
- if (e.target.matches('[data-checkboxsubmit-target="checkbox"]')) {
140
- const form = e.target.closest('form');
141
- if (form) new CheckboxSubmit(form).clicked(e);
142
- }
143
- });
144
- };
145
- Blacklight.doBookmarkToggleBehavior.selector = 'form.bookmark-toggle';
82
+ const BookmarkToggle = (e) => {
83
+ if (e.target.matches('[data-checkboxsubmit-target="checkbox"]')) {
84
+ const form = e.target.closest('form');
85
+ if (form) new CheckboxSubmit(form).clicked(e);
86
+ }
87
+ };
146
88
 
147
- Blacklight.doBookmarkToggleBehavior();
148
- })();
89
+ document.addEventListener('click', BookmarkToggle);
149
90
 
150
- const ButtonFocus = (() => {
151
- document.addEventListener('click', (e) => {
152
- // Button clicks should change focus. As of 10/3/19, Firefox for Mac and
153
- // Safari both do not set focus to a button on button click.
154
- // See https://zellwk.com/blog/inconsistent-button-behavior/ for background information
155
- if (e.target.matches('[data-toggle="collapse"]') || e.target.matches('[data-bs-toggle="collapse"]')) {
156
- e.target.focus();
157
- }
158
- });
159
- })();
91
+ const ButtonFocus = (e) => {
92
+ // Button clicks should change focus. As of 10/3/19, Firefox for Mac and
93
+ // Safari both do not set focus to a button on button click.
94
+ // See https://zellwk.com/blog/inconsistent-button-behavior/ for background information
95
+ if (e.target.matches('[data-toggle="collapse"]') || e.target.matches('[data-bs-toggle="collapse"]')) {
96
+ e.target.focus();
97
+ }
98
+ };
99
+
100
+ document.addEventListener('click', ButtonFocus);
160
101
 
161
102
  /*
162
103
  The blacklight modal plugin can display some interactions inside a Bootstrap
@@ -192,7 +133,7 @@ const ButtonFocus = (() => {
192
133
 
193
134
  <div data-blacklight-modal="container">
194
135
  <div class="modal-header">
195
- <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
136
+ <button type="button" class="close" data-bl-dismiss="modal" aria-hidden="true">×</button>
196
137
  <h3 class="modal-title">Request Placed</h3>
197
138
  </div>
198
139
 
@@ -203,7 +144,7 @@ const ButtonFocus = (() => {
203
144
 
204
145
 
205
146
  <div class="modal-footer">
206
- <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
147
+ <button type="button" class="btn btn-secondary" data-bl-dismiss="modal">Close</button>
207
148
  </div>
208
149
  </div>
209
150
 
@@ -214,13 +155,7 @@ const ButtonFocus = (() => {
214
155
  */
215
156
 
216
157
  const Modal = (() => {
217
- // We keep all our data in Blacklight.modal object.
218
- // Create lazily if someone else created first.
219
- if (Blacklight.modal === undefined) {
220
- Blacklight.modal = {};
221
- }
222
-
223
- const modal = Blacklight.modal;
158
+ const modal = {};
224
159
 
225
160
  // a Bootstrap modal div that should be already on the page hidden
226
161
  modal.modalSelector = '#blacklight-modal';
@@ -241,20 +176,19 @@ const Modal = (() => {
241
176
  modal.containerSelector = '[data-blacklight-modal~=container]';
242
177
 
243
178
  // Called on fatal failure of ajax load, function returns content
244
- // to show to user in modal. Right now called only for extreme
245
- // network errors.
246
- modal.onFailure = function (jqXHR, textStatus, errorThrown) {
247
- console.error('Server error:', this.url, jqXHR.status, errorThrown);
179
+ // to show to user in modal. Right now called only for network errors.
180
+ modal.onFailure = function (error) {
181
+ console.error('Server error:', this.url, error);
248
182
 
249
183
  const contents = `<div class="modal-header">
250
184
  <div class="modal-title">There was a problem with your request.</div>
251
- <button type="button" class="blacklight-modal-close btn-close close" data-dismiss="modal" data-bs-dismiss="modal" aria-label="Close">
252
- <span aria-hidden="true">&times;</span>
185
+ <button type="button" class="blacklight-modal-close btn-close close" data-bl-dismiss="modal" aria-label="Close">
186
+ <span aria-hidden="true" class="visually-hidden">&times;</span>
253
187
  </button>
254
188
  </div>
255
189
  <div class="modal-body">
256
190
  <p>Expected a successful response from the server, but got an error</p>
257
- <pre>${this.type} ${this.url}\n${jqXHR.status}: ${errorThrown}</pre>
191
+ <pre>${this.url}\n${error}</pre>
258
192
  </div>`;
259
193
 
260
194
  document.querySelector(`${modal.modalSelector} .modal-content`).innerHTML = contents;
@@ -263,10 +197,16 @@ const Modal = (() => {
263
197
  };
264
198
 
265
199
  // Add the passed in contents to the modal and display it.
266
- modal.receiveAjax = function (contents) {
200
+ modal.receiveAjax = function (contents) {
267
201
  const domparser = new DOMParser();
268
202
  const dom = domparser.parseFromString(contents, "text/html");
269
- const elements = dom.querySelectorAll(`${modal.containerSelector} > *`);
203
+ // If there is a containerSelector on the document, use its children.
204
+ let elements = dom.querySelectorAll(`${modal.containerSelector} > *`);
205
+ if (elements.length == 0) {
206
+ // If the containerSelector wasn't found, use the whole document
207
+ elements = dom.body.childNodes;
208
+ }
209
+
270
210
  document.querySelector(`${modal.modalSelector} .modal-content`).replaceChildren(...elements);
271
211
 
272
212
  modal.show();
@@ -292,91 +232,143 @@ modal.receiveAjax = function (contents) {
292
232
  // into one selector with a comma, so if something matches BOTH selectors, it
293
233
  // still only gets the event handler called once.
294
234
  document.addEventListener('click', (e) => {
295
- if (e.target.matches(`${modal.triggerLinkSelector}, ${modal.preserveLinkSelector}`))
235
+ if (e.target.closest(`${modal.triggerLinkSelector}, ${modal.preserveLinkSelector}`))
296
236
  modal.modalAjaxLinkClick(e);
297
- else if (e.target.matches('[data-bl-dismiss="modal"]'))
237
+ else if (e.target.closest('[data-bl-dismiss="modal"]'))
298
238
  modal.hide();
299
239
  });
300
240
  };
301
241
 
302
242
  modal.hide = function (el) {
303
- const dom = document.querySelector(Blacklight.modal.modalSelector);
243
+ const dom = document.querySelector(modal.modalSelector);
304
244
 
305
245
  if (!dom.open) return
306
246
  dom.close();
307
247
  };
308
248
 
309
249
  modal.show = function(el) {
310
- const dom = document.querySelector(Blacklight.modal.modalSelector);
250
+ const dom = document.querySelector(modal.modalSelector);
311
251
 
312
252
  if (dom.open) return
313
253
  dom.showModal();
314
254
  };
315
255
 
316
256
  modal.setupModal();
257
+
258
+ return modal;
317
259
  })();
318
260
 
319
- const SearchContext = (() => {
320
- Blacklight.doSearchContextBehavior = function() {
321
- document.addEventListener('click', (e) => {
322
- if (e.target.matches('[data-context-href]')) {
323
- Blacklight.handleSearchContextMethod.call(e.target, e);
324
- }
325
- });
326
- };
261
+ const SearchContext = (e) => {
262
+ if (e.target.matches('[data-context-href]')) {
263
+ SearchContext.handleSearchContextMethod.call(e.target, e);
264
+ }
265
+ };
327
266
 
328
- Blacklight.csrfToken = () => document.querySelector('meta[name=csrf-token]')?.content;
329
- Blacklight.csrfParam = () => document.querySelector('meta[name=csrf-param]')?.content;
267
+ SearchContext.csrfToken = () => document.querySelector('meta[name=csrf-token]')?.content;
268
+ SearchContext.csrfParam = () => document.querySelector('meta[name=csrf-param]')?.content;
330
269
 
331
- // this is the Rails.handleMethod with a couple adjustments, described inline:
332
- // first, we're attaching this directly to the event handler, so we can check for meta-keys
333
- Blacklight.handleSearchContextMethod = function(event) {
334
- const link = this;
270
+ // this is the Rails.handleMethod with a couple adjustments, described inline:
271
+ // first, we're attaching this directly to the event handler, so we can check for meta-keys
272
+ SearchContext.handleSearchContextMethod = function(event) {
273
+ const link = this;
335
274
 
336
- // instead of using the normal href, we need to use the context href instead
337
- let href = link.getAttribute('data-context-href');
338
- let target = link.getAttribute('target');
339
- let csrfToken = Blacklight.csrfToken();
340
- let csrfParam = Blacklight.csrfParam();
341
- let form = document.createElement('form');
342
- form.method = 'post';
343
- form.action = href;
275
+ // instead of using the normal href, we need to use the context href instead
276
+ let href = link.getAttribute('data-context-href');
277
+ let target = link.getAttribute('target');
278
+ let csrfToken = SearchContext.csrfToken();
279
+ let csrfParam = SearchContext.csrfParam();
280
+ let form = document.createElement('form');
281
+ form.method = 'post';
282
+ form.action = href;
344
283
 
345
284
 
346
- let formContent = `<input name="_method" value="post" type="hidden" />
347
- <input name="redirect" value="${link.getAttribute('href')}" type="hidden" />`;
285
+ let formContent = `<input name="_method" value="post" type="hidden" />
286
+ <input name="redirect" value="${link.getAttribute('href')}" type="hidden" />`;
348
287
 
349
- // check for meta keys.. if set, we should open in a new tab
350
- if(event.metaKey || event.ctrlKey) {
351
- target = '_blank';
352
- }
288
+ // check for meta keys.. if set, we should open in a new tab
289
+ if(event.metaKey || event.ctrlKey) {
290
+ target = '_blank';
291
+ }
353
292
 
354
- if (csrfParam !== undefined && csrfToken !== undefined) {
355
- formContent += `<input name="${csrfParam}" value="${csrfToken}" type="hidden" />`;
356
- }
293
+ if (csrfParam !== undefined && csrfToken !== undefined) {
294
+ formContent += `<input name="${csrfParam}" value="${csrfToken}" type="hidden" />`;
295
+ }
296
+
297
+ // Must trigger submit by click on a button, else "submit" event handler won't work!
298
+ // https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit
299
+ formContent += '<input type="submit" />';
357
300
 
358
- // Must trigger submit by click on a button, else "submit" event handler won't work!
359
- // https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit
360
- formContent += '<input type="submit" />';
301
+ if (target) { form.setAttribute('target', target); }
361
302
 
362
- if (target) { form.setAttribute('target', target); }
303
+ form.style.display = 'none';
304
+ form.innerHTML = formContent;
305
+ document.body.appendChild(form);
306
+ form.querySelector('[type="submit"]').click();
363
307
 
364
- form.style.display = 'none';
365
- form.innerHTML = formContent;
366
- document.body.appendChild(form);
367
- form.querySelector('[type="submit"]').click();
308
+ event.preventDefault();
309
+ };
310
+
311
+ document.addEventListener('click', SearchContext);
312
+
313
+ const Blacklight = function() {
314
+ const buffer = new Array;
315
+ return {
316
+ onLoad: function(func) {
317
+ buffer.push(func);
318
+ },
319
+
320
+ activate: function() {
321
+ for(let i = 0; i < buffer.length; i++) {
322
+ buffer[i].call();
323
+ }
324
+ },
325
+
326
+ listeners: function () {
327
+ const listeners = [];
328
+ if (typeof Turbo !== 'undefined') {
329
+ listeners.push('turbo:load', 'turbo:frame-load');
330
+ } else if (typeof Turbolinks !== 'undefined' && Turbolinks.supported) {
331
+ // Turbolinks 5
332
+ if (Turbolinks.BrowserAdapter) {
333
+ listeners.push('turbolinks:load');
334
+ } else {
335
+ // Turbolinks < 5
336
+ listeners.push('page:load', 'DOMContentLoaded');
337
+ }
338
+ } else {
339
+ listeners.push('DOMContentLoaded');
340
+ }
368
341
 
369
- event.preventDefault();
342
+ return listeners;
343
+ }
370
344
  };
345
+ }();
371
346
 
372
- Blacklight.doSearchContextBehavior();
373
- })();
347
+ // turbolinks triggers page:load events on page transition
348
+ // If app isn't using turbolinks, this event will never be triggered, no prob.
349
+ Blacklight.listeners().forEach(function(listener) {
350
+ document.addEventListener(listener, function() {
351
+ Blacklight.activate();
352
+ });
353
+ });
354
+
355
+ Blacklight.onLoad(function () {
356
+ const elem = document.querySelector('.no-js');
357
+
358
+ // The "no-js" class may already have been removed because this function is
359
+ // run on every turbo:load event, in that case, it won't find an element.
360
+ if (!elem) return;
361
+
362
+ elem.classList.remove('no-js');
363
+ elem.classList.add('js');
364
+ });
374
365
 
375
366
  const index = {
376
367
  BookmarkToggle,
377
368
  ButtonFocus,
378
369
  Modal,
379
370
  SearchContext,
371
+ Core: Blacklight,
380
372
  onLoad: Blacklight.onLoad
381
373
  };
382
374
 
@@ -1 +1 @@
1
- {"version":3,"file":"blacklight.esm.js","sources":["../../../javascript/blacklight/core.js","../../../javascript/blacklight/checkbox_submit.js","../../../javascript/blacklight/bookmark_toggle.js","../../../javascript/blacklight/button_focus.js","../../../javascript/blacklight/modal.js","../../../javascript/blacklight/search_context.js","../../../javascript/blacklight/index.js"],"sourcesContent":["const Blacklight = function() {\n const buffer = new Array;\n return {\n onLoad: function(func) {\n buffer.push(func);\n },\n\n activate: function() {\n for(let i = 0; i < buffer.length; i++) {\n buffer[i].call();\n }\n },\n\n listeners: function () {\n const listeners = [];\n if (typeof Turbo !== 'undefined') {\n listeners.push('turbo:load', 'turbo:frame-load');\n } else if (typeof Turbolinks !== 'undefined' && Turbolinks.supported) {\n // Turbolinks 5\n if (Turbolinks.BrowserAdapter) {\n listeners.push('turbolinks:load');\n } else {\n // Turbolinks < 5\n listeners.push('page:load', 'DOMContentLoaded');\n }\n } else {\n listeners.push('DOMContentLoaded');\n }\n\n return listeners;\n }\n };\n}();\n\n// turbolinks triggers page:load events on page transition\n// If app isn't using turbolinks, this event will never be triggered, no prob.\nBlacklight.listeners().forEach(function(listener) {\n document.addEventListener(listener, function() {\n Blacklight.activate()\n })\n})\n\nBlacklight.onLoad(function () {\n const elem = document.querySelector('.no-js');\n\n // The \"no-js\" class may already have been removed because this function is\n // run on every turbo:load event, in that case, it won't find an element.\n if (!elem) return;\n\n elem.classList.remove('no-js')\n elem.classList.add('js')\n})\n\n\nexport default Blacklight\n","/* Converts a \"toggle\" form, with single submit button to add/remove\n something, like used for Bookmarks, into an AJAXy checkbox instead.\n Apply to a form. Does require certain assumption about the form:\n 1) The same form 'action' href must be used for both ADD and REMOVE\n actions, with the different being the hidden input name=\"_method\"\n being set to \"put\" or \"delete\" -- that's the Rails method to pretend\n to be doing a certain HTTP verb. So same URL, PUT to add, DELETE\n to remove. This plugin assumes that.\n Plus, the form this is applied to should provide a data-doc-id\n attribute (HTML5-style doc-*) that contains the id/primary key\n of the object in question -- used by plugin for a unique value for\n DOM id's.\n Uses HTML for a checkbox compatible with Bootstrap 4.\n new CheckboxSubmit(document.querySelector('form.something')).render()\n*/\nexport default class CheckboxSubmit {\n constructor(form) {\n this.form = form\n }\n\n async clicked(evt) {\n this.spanTarget.innerHTML = this.form.getAttribute('data-inprogress')\n this.labelTarget.setAttribute('disabled', 'disabled');\n this.checkboxTarget.setAttribute('disabled', 'disabled');\n const response = await fetch(this.formTarget.getAttribute('action'), {\n body: new FormData(this.formTarget),\n method: this.formTarget.getAttribute('method').toUpperCase(),\n headers: {\n 'Accept': 'application/json',\n 'X-Requested-With': 'XMLHttpRequest',\n 'X-CSRF-Token': document.querySelector('meta[name=csrf-token]')?.content\n }\n })\n this.labelTarget.removeAttribute('disabled')\n this.checkboxTarget.removeAttribute('disabled')\n if (response.ok) {\n const json = await response.json()\n this.updateStateFor(!this.checked)\n document.querySelector('[data-role=bookmark-counter]').innerHTML = json.bookmarks.count\n } else {\n alert('Error')\n }\n }\n\n get checked() {\n return (this.form.querySelectorAll('input[name=_method][value=delete]').length != 0)\n }\n\n get formTarget() {\n return this.form\n }\n\n get labelTarget() {\n return this.form.querySelector('[data-checkboxsubmit-target=\"label\"]')\n }\n\n get checkboxTarget() {\n return this.form.querySelector('[data-checkboxsubmit-target=\"checkbox\"]')\n }\n\n get spanTarget() {\n return this.form.querySelector('[data-checkboxsubmit-target=\"span\"]')\n }\n\n updateStateFor(state) {\n this.checkboxTarget.checked = state\n\n if (state) {\n this.labelTarget.classList.add('checked')\n //Set the Rails hidden field that fakes an HTTP verb\n //properly for current state action.\n this.formTarget.querySelector('input[name=_method]').value = 'delete'\n this.spanTarget.innerHTML = this.form.getAttribute('data-present')\n } else {\n this.labelTarget.classList.remove('checked')\n this.formTarget.querySelector('input[name=_method]').value = 'put'\n this.spanTarget.innerHTML = this.form.getAttribute('data-absent')\n }\n }\n}\n","import Blacklight from './core'\nimport CheckboxSubmit from './checkbox_submit'\n\nconst BookmarkToggle = (() => {\n // change form submit toggle to checkbox\n Blacklight.doBookmarkToggleBehavior = function() {\n document.addEventListener('click', (e) => {\n if (e.target.matches('[data-checkboxsubmit-target=\"checkbox\"]')) {\n const form = e.target.closest('form')\n if (form) new CheckboxSubmit(form).clicked(e);\n }\n });\n };\n Blacklight.doBookmarkToggleBehavior.selector = 'form.bookmark-toggle';\n\n Blacklight.doBookmarkToggleBehavior();\n})()\n\nexport default BookmarkToggle\n","const ButtonFocus = (() => {\n document.addEventListener('click', (e) => {\n // Button clicks should change focus. As of 10/3/19, Firefox for Mac and\n // Safari both do not set focus to a button on button click.\n // See https://zellwk.com/blog/inconsistent-button-behavior/ for background information\n if (e.target.matches('[data-toggle=\"collapse\"]') || e.target.matches('[data-bs-toggle=\"collapse\"]')) {\n e.target.focus()\n }\n })\n})()\n\nexport default ButtonFocus\n","/*\n The blacklight modal plugin can display some interactions inside a Bootstrap\n modal window, including some multi-page interactions.\n\n It supports unobtrusive Javascript, where a link or form that would have caused\n a new page load is changed to display it's results inside a modal dialog,\n by this plugin. The plugin assumes there is a Bootstrap modal div\n on the page with id #blacklight-modal to use as the modal -- the standard Blacklight\n layout provides this.\n\n To make a link or form have their results display inside a modal, add\n `data-blacklight-modal=\"trigger\"` to the link or form. (Note, form itself not submit input)\n With Rails link_to helper, you'd do that like:\n\n link_to something, link, data: { blacklight_modal: \"trigger\" }\n\n The results of the link href or form submit will be displayed inside\n a modal -- they should include the proper HTML markup for a bootstrap modal's\n contents. Also, you ordinarily won't want the Rails template with wrapping\n navigational elements to be used. The Rails controller could suppress\n the layout when a JS AJAX request is detected, OR the response\n can include a `<div data-blacklight-modal=\"container\">` -- only the contents\n of the container will be placed inside the modal, the rest of the\n page will be ignored.\n\n Link or forms inside the modal will ordinarily cause page loads\n when they are triggered. However, if you'd like their results\n to stay within the modal, just add `data-blacklight-modal=\"preserve\"`\n to the link or form.\n\n Here's an example of what might be returned, demonstrating most of the devices available:\n\n <div data-blacklight-modal=\"container\">\n <div class=\"modal-header\">\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-hidden=\"true\">×</button>\n <h3 class=\"modal-title\">Request Placed</h3>\n </div>\n\n <div class=\"modal-body\">\n <p>Some message</p>\n <%= link_to \"This result will still be within modal\", some_link, data: { blacklight_modal: \"preserve\" } %>\n </div>\n\n\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" data-dismiss=\"modal\">Close</button>\n </div>\n </div>\n\n\n One additional feature. If the content returned from the AJAX form submission\n can be a turbo-stream that defines some HTML fragementsand where on the page to put them:\n https://turbo.hotwired.dev/handbook/streams\n*/\nimport Blacklight from './core'\nimport ModalForm from './modalForm'\n\nconst Modal = (() => {\n // We keep all our data in Blacklight.modal object.\n // Create lazily if someone else created first.\n if (Blacklight.modal === undefined) {\n Blacklight.modal = {};\n }\n\n const modal = Blacklight.modal\n\n // a Bootstrap modal div that should be already on the page hidden\n modal.modalSelector = '#blacklight-modal';\n\n // Trigger selectors identify forms or hyperlinks that should open\n // inside a modal dialog.\n modal.triggerLinkSelector = 'a[data-blacklight-modal~=trigger]';\n\n // preserve selectors identify forms or hyperlinks that, if activated already\n // inside a modal dialog, should have destinations remain inside the modal -- but\n // won't trigger a modal if not already in one.\n //\n // No need to repeat selectors from trigger selectors, those will already\n // be preserved. MUST be manually prefixed with the modal selector,\n // so they only apply to things inside a modal.\n modal.preserveLinkSelector = modal.modalSelector + ' a[data-blacklight-modal~=preserve]';\n\n modal.containerSelector = '[data-blacklight-modal~=container]';\n\n // Called on fatal failure of ajax load, function returns content\n // to show to user in modal. Right now called only for extreme\n // network errors.\n modal.onFailure = function (jqXHR, textStatus, errorThrown) {\n console.error('Server error:', this.url, jqXHR.status, errorThrown);\n\n const contents = `<div class=\"modal-header\">\n <div class=\"modal-title\">There was a problem with your request.</div>\n <button type=\"button\" class=\"blacklight-modal-close btn-close close\" data-dismiss=\"modal\" data-bs-dismiss=\"modal\" aria-label=\"Close\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>Expected a successful response from the server, but got an error</p>\n <pre>${this.type} ${this.url}\\n${jqXHR.status}: ${errorThrown}</pre>\n </div>`\n\n document.querySelector(`${modal.modalSelector} .modal-content`).innerHTML = contents\n\n modal.show();\n }\n\n // Add the passed in contents to the modal and display it.\nmodal.receiveAjax = function (contents) {\n const domparser = new DOMParser();\n const dom = domparser.parseFromString(contents, \"text/html\")\n const elements = dom.querySelectorAll(`${modal.containerSelector} > *`)\n document.querySelector(`${modal.modalSelector} .modal-content`).replaceChildren(...elements)\n\n modal.show();\n };\n\n\n modal.modalAjaxLinkClick = function(e) {\n e.preventDefault();\n const href = e.target.getAttribute('href')\n fetch(href)\n .then(response => {\n if (!response.ok) {\n throw new TypeError(\"Request failed\");\n }\n return response.text();\n })\n .then(data => modal.receiveAjax(data))\n .catch(error => modal.onFailure(error))\n };\n\n modal.setupModal = function() {\n // Register both trigger and preserve selectors in ONE event handler, combining\n // into one selector with a comma, so if something matches BOTH selectors, it\n // still only gets the event handler called once.\n document.addEventListener('click', (e) => {\n if (e.target.matches(`${modal.triggerLinkSelector}, ${modal.preserveLinkSelector}`))\n modal.modalAjaxLinkClick(e)\n else if (e.target.matches('[data-bl-dismiss=\"modal\"]'))\n modal.hide()\n })\n };\n\n modal.hide = function (el) {\n const dom = document.querySelector(Blacklight.modal.modalSelector)\n\n if (!dom.open) return\n dom.close()\n }\n\n modal.show = function(el) {\n const dom = document.querySelector(Blacklight.modal.modalSelector)\n\n if (dom.open) return\n dom.showModal()\n }\n\n modal.setupModal()\n})()\n\nexport default Modal\n","import Blacklight from './core'\n\nconst SearchContext = (() => {\n Blacklight.doSearchContextBehavior = function() {\n document.addEventListener('click', (e) => {\n if (e.target.matches('[data-context-href]')) {\n Blacklight.handleSearchContextMethod.call(e.target, e)\n }\n })\n };\n\n Blacklight.csrfToken = () => document.querySelector('meta[name=csrf-token]')?.content\n Blacklight.csrfParam = () => document.querySelector('meta[name=csrf-param]')?.content\n\n // this is the Rails.handleMethod with a couple adjustments, described inline:\n // first, we're attaching this directly to the event handler, so we can check for meta-keys\n Blacklight.handleSearchContextMethod = function(event) {\n const link = this\n\n // instead of using the normal href, we need to use the context href instead\n let href = link.getAttribute('data-context-href')\n let target = link.getAttribute('target')\n let csrfToken = Blacklight.csrfToken()\n let csrfParam = Blacklight.csrfParam()\n let form = document.createElement('form')\n form.method = 'post'\n form.action = href\n\n\n let formContent = `<input name=\"_method\" value=\"post\" type=\"hidden\" />\n <input name=\"redirect\" value=\"${link.getAttribute('href')}\" type=\"hidden\" />`\n\n // check for meta keys.. if set, we should open in a new tab\n if(event.metaKey || event.ctrlKey) {\n target = '_blank';\n }\n\n if (csrfParam !== undefined && csrfToken !== undefined) {\n formContent += `<input name=\"${csrfParam}\" value=\"${csrfToken}\" type=\"hidden\" />`\n }\n\n // Must trigger submit by click on a button, else \"submit\" event handler won't work!\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit\n formContent += '<input type=\"submit\" />'\n\n if (target) { form.setAttribute('target', target); }\n\n form.style.display = 'none'\n form.innerHTML = formContent\n document.body.appendChild(form)\n form.querySelector('[type=\"submit\"]').click()\n\n event.preventDefault()\n };\n\n Blacklight.doSearchContextBehavior();\n})()\n\nexport default SearchContext\n","import BookmarkToggle from './bookmark_toggle'\nimport ButtonFocus from './button_focus'\nimport Modal from './modal'\nimport SearchContext from './search_context'\nimport Core from './core'\n\nexport default {\n BookmarkToggle,\n ButtonFocus,\n Modal,\n SearchContext,\n onLoad: Core.onLoad\n}\n"],"names":["Core"],"mappings":"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"}
1
+ {"version":3,"file":"blacklight.esm.js","sources":["../../../javascript/blacklight/checkbox_submit.js","../../../javascript/blacklight/bookmark_toggle.js","../../../javascript/blacklight/button_focus.js","../../../javascript/blacklight/modal.js","../../../javascript/blacklight/search_context.js","../../../javascript/blacklight/core.js","../../../javascript/blacklight/index.js"],"sourcesContent":["/* Converts a \"toggle\" form, with single submit button to add/remove\n something, like used for Bookmarks, into an AJAXy checkbox instead.\n Apply to a form. Does require certain assumption about the form:\n 1) The same form 'action' href must be used for both ADD and REMOVE\n actions, with the different being the hidden input name=\"_method\"\n being set to \"put\" or \"delete\" -- that's the Rails method to pretend\n to be doing a certain HTTP verb. So same URL, PUT to add, DELETE\n to remove. This plugin assumes that.\n Plus, the form this is applied to should provide a data-doc-id\n attribute (HTML5-style doc-*) that contains the id/primary key\n of the object in question -- used by plugin for a unique value for\n DOM id's.\n Uses HTML for a checkbox compatible with Bootstrap 4.\n new CheckboxSubmit(document.querySelector('form.something')).render()\n*/\nexport default class CheckboxSubmit {\n constructor(form) {\n this.form = form\n }\n\n async clicked(evt) {\n this.spanTarget.innerHTML = this.form.getAttribute('data-inprogress')\n this.labelTarget.setAttribute('disabled', 'disabled');\n this.checkboxTarget.setAttribute('disabled', 'disabled');\n const response = await fetch(this.formTarget.getAttribute('action'), {\n body: new FormData(this.formTarget),\n method: this.formTarget.getAttribute('method').toUpperCase(),\n headers: {\n 'Accept': 'application/json',\n 'X-Requested-With': 'XMLHttpRequest',\n 'X-CSRF-Token': document.querySelector('meta[name=csrf-token]')?.content\n }\n })\n this.labelTarget.removeAttribute('disabled')\n this.checkboxTarget.removeAttribute('disabled')\n if (response.ok) {\n const json = await response.json()\n this.updateStateFor(!this.checked)\n document.querySelector('[data-role=bookmark-counter]').innerHTML = json.bookmarks.count\n } else {\n alert('Error')\n }\n }\n\n get checked() {\n return (this.form.querySelectorAll('input[name=_method][value=delete]').length != 0)\n }\n\n get formTarget() {\n return this.form\n }\n\n get labelTarget() {\n return this.form.querySelector('[data-checkboxsubmit-target=\"label\"]')\n }\n\n get checkboxTarget() {\n return this.form.querySelector('[data-checkboxsubmit-target=\"checkbox\"]')\n }\n\n get spanTarget() {\n return this.form.querySelector('[data-checkboxsubmit-target=\"span\"]')\n }\n\n updateStateFor(state) {\n this.checkboxTarget.checked = state\n\n if (state) {\n this.labelTarget.classList.add('checked')\n //Set the Rails hidden field that fakes an HTTP verb\n //properly for current state action.\n this.formTarget.querySelector('input[name=_method]').value = 'delete'\n this.spanTarget.innerHTML = this.form.getAttribute('data-present')\n } else {\n this.labelTarget.classList.remove('checked')\n this.formTarget.querySelector('input[name=_method]').value = 'put'\n this.spanTarget.innerHTML = this.form.getAttribute('data-absent')\n }\n }\n}\n","import CheckboxSubmit from 'blacklight/checkbox_submit'\n\nconst BookmarkToggle = (e) => {\n if (e.target.matches('[data-checkboxsubmit-target=\"checkbox\"]')) {\n const form = e.target.closest('form')\n if (form) new CheckboxSubmit(form).clicked(e);\n }\n};\n\ndocument.addEventListener('click', BookmarkToggle);\n\nexport default BookmarkToggle\n","const ButtonFocus = (e) => {\n // Button clicks should change focus. As of 10/3/19, Firefox for Mac and\n // Safari both do not set focus to a button on button click.\n // See https://zellwk.com/blog/inconsistent-button-behavior/ for background information\n if (e.target.matches('[data-toggle=\"collapse\"]') || e.target.matches('[data-bs-toggle=\"collapse\"]')) {\n e.target.focus()\n }\n}\n\ndocument.addEventListener('click', ButtonFocus)\n\nexport default ButtonFocus\n","/*\n The blacklight modal plugin can display some interactions inside a Bootstrap\n modal window, including some multi-page interactions.\n\n It supports unobtrusive Javascript, where a link or form that would have caused\n a new page load is changed to display it's results inside a modal dialog,\n by this plugin. The plugin assumes there is a Bootstrap modal div\n on the page with id #blacklight-modal to use as the modal -- the standard Blacklight\n layout provides this.\n\n To make a link or form have their results display inside a modal, add\n `data-blacklight-modal=\"trigger\"` to the link or form. (Note, form itself not submit input)\n With Rails link_to helper, you'd do that like:\n\n link_to something, link, data: { blacklight_modal: \"trigger\" }\n\n The results of the link href or form submit will be displayed inside\n a modal -- they should include the proper HTML markup for a bootstrap modal's\n contents. Also, you ordinarily won't want the Rails template with wrapping\n navigational elements to be used. The Rails controller could suppress\n the layout when a JS AJAX request is detected, OR the response\n can include a `<div data-blacklight-modal=\"container\">` -- only the contents\n of the container will be placed inside the modal, the rest of the\n page will be ignored.\n\n Link or forms inside the modal will ordinarily cause page loads\n when they are triggered. However, if you'd like their results\n to stay within the modal, just add `data-blacklight-modal=\"preserve\"`\n to the link or form.\n\n Here's an example of what might be returned, demonstrating most of the devices available:\n\n <div data-blacklight-modal=\"container\">\n <div class=\"modal-header\">\n <button type=\"button\" class=\"close\" data-bl-dismiss=\"modal\" aria-hidden=\"true\">×</button>\n <h3 class=\"modal-title\">Request Placed</h3>\n </div>\n\n <div class=\"modal-body\">\n <p>Some message</p>\n <%= link_to \"This result will still be within modal\", some_link, data: { blacklight_modal: \"preserve\" } %>\n </div>\n\n\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" data-bl-dismiss=\"modal\">Close</button>\n </div>\n </div>\n\n\n One additional feature. If the content returned from the AJAX form submission\n can be a turbo-stream that defines some HTML fragementsand where on the page to put them:\n https://turbo.hotwired.dev/handbook/streams\n*/\nimport ModalForm from 'blacklight/modalForm'\n\nconst Modal = (() => {\n const modal = {}\n\n // a Bootstrap modal div that should be already on the page hidden\n modal.modalSelector = '#blacklight-modal';\n\n // Trigger selectors identify forms or hyperlinks that should open\n // inside a modal dialog.\n modal.triggerLinkSelector = 'a[data-blacklight-modal~=trigger]';\n\n // preserve selectors identify forms or hyperlinks that, if activated already\n // inside a modal dialog, should have destinations remain inside the modal -- but\n // won't trigger a modal if not already in one.\n //\n // No need to repeat selectors from trigger selectors, those will already\n // be preserved. MUST be manually prefixed with the modal selector,\n // so they only apply to things inside a modal.\n modal.preserveLinkSelector = modal.modalSelector + ' a[data-blacklight-modal~=preserve]';\n\n modal.containerSelector = '[data-blacklight-modal~=container]';\n\n // Called on fatal failure of ajax load, function returns content\n // to show to user in modal. Right now called only for network errors.\n modal.onFailure = function (error) {\n console.error('Server error:', this.url, error);\n\n const contents = `<div class=\"modal-header\">\n <div class=\"modal-title\">There was a problem with your request.</div>\n <button type=\"button\" class=\"blacklight-modal-close btn-close close\" data-bl-dismiss=\"modal\" aria-label=\"Close\">\n <span aria-hidden=\"true\" class=\"visually-hidden\">&times;</span>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>Expected a successful response from the server, but got an error</p>\n <pre>${this.url}\\n${error}</pre>\n </div>`\n\n document.querySelector(`${modal.modalSelector} .modal-content`).innerHTML = contents\n\n modal.show();\n }\n\n // Add the passed in contents to the modal and display it.\n modal.receiveAjax = function (contents) {\n const domparser = new DOMParser();\n const dom = domparser.parseFromString(contents, \"text/html\")\n // If there is a containerSelector on the document, use its children.\n let elements = dom.querySelectorAll(`${modal.containerSelector} > *`)\n if (elements.length == 0) {\n // If the containerSelector wasn't found, use the whole document\n elements = dom.body.childNodes\n }\n\n document.querySelector(`${modal.modalSelector} .modal-content`).replaceChildren(...elements)\n\n modal.show();\n };\n\n\n modal.modalAjaxLinkClick = function(e) {\n e.preventDefault();\n const href = e.target.getAttribute('href')\n fetch(href)\n .then(response => {\n if (!response.ok) {\n throw new TypeError(\"Request failed\");\n }\n return response.text();\n })\n .then(data => modal.receiveAjax(data))\n .catch(error => modal.onFailure(error))\n };\n\n modal.setupModal = function() {\n // Register both trigger and preserve selectors in ONE event handler, combining\n // into one selector with a comma, so if something matches BOTH selectors, it\n // still only gets the event handler called once.\n document.addEventListener('click', (e) => {\n if (e.target.closest(`${modal.triggerLinkSelector}, ${modal.preserveLinkSelector}`))\n modal.modalAjaxLinkClick(e)\n else if (e.target.closest('[data-bl-dismiss=\"modal\"]'))\n modal.hide()\n })\n };\n\n modal.hide = function (el) {\n const dom = document.querySelector(modal.modalSelector)\n\n if (!dom.open) return\n dom.close()\n }\n\n modal.show = function(el) {\n const dom = document.querySelector(modal.modalSelector)\n\n if (dom.open) return\n dom.showModal()\n }\n\n modal.setupModal()\n\n return modal;\n})()\n\nexport default Modal\n","const SearchContext = (e) => {\n if (e.target.matches('[data-context-href]')) {\n SearchContext.handleSearchContextMethod.call(e.target, e)\n }\n}\n\nSearchContext.csrfToken = () => document.querySelector('meta[name=csrf-token]')?.content\nSearchContext.csrfParam = () => document.querySelector('meta[name=csrf-param]')?.content\n\n// this is the Rails.handleMethod with a couple adjustments, described inline:\n// first, we're attaching this directly to the event handler, so we can check for meta-keys\nSearchContext.handleSearchContextMethod = function(event) {\n const link = this\n\n // instead of using the normal href, we need to use the context href instead\n let href = link.getAttribute('data-context-href')\n let target = link.getAttribute('target')\n let csrfToken = SearchContext.csrfToken()\n let csrfParam = SearchContext.csrfParam()\n let form = document.createElement('form')\n form.method = 'post'\n form.action = href\n\n\n let formContent = `<input name=\"_method\" value=\"post\" type=\"hidden\" />\n <input name=\"redirect\" value=\"${link.getAttribute('href')}\" type=\"hidden\" />`\n\n // check for meta keys.. if set, we should open in a new tab\n if(event.metaKey || event.ctrlKey) {\n target = '_blank';\n }\n\n if (csrfParam !== undefined && csrfToken !== undefined) {\n formContent += `<input name=\"${csrfParam}\" value=\"${csrfToken}\" type=\"hidden\" />`\n }\n\n // Must trigger submit by click on a button, else \"submit\" event handler won't work!\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit\n formContent += '<input type=\"submit\" />'\n\n if (target) { form.setAttribute('target', target); }\n\n form.style.display = 'none'\n form.innerHTML = formContent\n document.body.appendChild(form)\n form.querySelector('[type=\"submit\"]').click()\n\n event.preventDefault()\n};\n\ndocument.addEventListener('click', SearchContext)\n\nexport default SearchContext\n","const Blacklight = function() {\n const buffer = new Array;\n return {\n onLoad: function(func) {\n buffer.push(func);\n },\n\n activate: function() {\n for(let i = 0; i < buffer.length; i++) {\n buffer[i].call();\n }\n },\n\n listeners: function () {\n const listeners = [];\n if (typeof Turbo !== 'undefined') {\n listeners.push('turbo:load', 'turbo:frame-load');\n } else if (typeof Turbolinks !== 'undefined' && Turbolinks.supported) {\n // Turbolinks 5\n if (Turbolinks.BrowserAdapter) {\n listeners.push('turbolinks:load');\n } else {\n // Turbolinks < 5\n listeners.push('page:load', 'DOMContentLoaded');\n }\n } else {\n listeners.push('DOMContentLoaded');\n }\n\n return listeners;\n }\n };\n}();\n\n// turbolinks triggers page:load events on page transition\n// If app isn't using turbolinks, this event will never be triggered, no prob.\nBlacklight.listeners().forEach(function(listener) {\n document.addEventListener(listener, function() {\n Blacklight.activate()\n })\n})\n\nBlacklight.onLoad(function () {\n const elem = document.querySelector('.no-js');\n\n // The \"no-js\" class may already have been removed because this function is\n // run on every turbo:load event, in that case, it won't find an element.\n if (!elem) return;\n\n elem.classList.remove('no-js')\n elem.classList.add('js')\n})\n\n\nexport default Blacklight\n","import BookmarkToggle from 'blacklight/bookmark_toggle'\nimport ButtonFocus from 'blacklight/button_focus'\nimport Modal from 'blacklight/modal'\nimport SearchContext from 'blacklight/search_context'\nimport Core from 'blacklight/core'\n\nexport default {\n BookmarkToggle,\n ButtonFocus,\n Modal,\n SearchContext,\n Core,\n onLoad: Core.onLoad\n}\n"],"names":["Core"],"mappings":"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"}