blacklight 8.8.0 → 8.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +17 -12
- data/VERSION +1 -1
- data/app/assets/javascripts/blacklight/blacklight.esm.js +1 -1
- data/app/assets/javascripts/blacklight/blacklight.esm.js.map +1 -1
- data/app/assets/javascripts/blacklight/blacklight.js +1 -1
- data/app/assets/javascripts/blacklight/blacklight.js.map +1 -1
- data/app/assets/stylesheets/blacklight/_search_form.scss +7 -0
- data/app/components/blacklight/facet_field_pagination_component.html.erb +4 -4
- data/app/components/blacklight/facet_field_pagination_component.rb +2 -1
- data/app/helpers/blacklight/catalog_helper_behavior.rb +5 -1
- data/app/javascript/blacklight/facet_suggest.js +1 -1
- data/compose.yaml +1 -0
- data/lib/generators/blacklight/templates/solr/conf/solrconfig.xml +1 -1
- data/package.json +1 -1
- data/spec/features/facets_spec.rb +8 -0
- data/spec/helpers/catalog_helper_spec.rb +8 -0
- metadata +3 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a451b7f410e4471509825f5d26bdcd26e641dc6bd812a471e16e1486e7a391e5
|
4
|
+
data.tar.gz: 410b81b50ada2b286b299175e504aa85f5ec87708ae64fb42d9b036c68535c98
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '08a2cff69bac1f9bd00889b428fef0f63e3aead84dd615126e9b1620b122f058d926172f919f915ce184bb04165eea50783af699309d61d31aaf8544349bc2c5'
|
7
|
+
data.tar.gz: eebf1d8271275ee525c374245be122f41b259bb95888e9d24ee15179ca457e4faa7863440f88f6d88a5b0b2547e5fa3c489e84d688c59a2723dc4ea0695c5149
|
data/.github/workflows/ruby.yml
CHANGED
@@ -34,9 +34,10 @@ jobs:
|
|
34
34
|
runs-on: ubuntu-latest
|
35
35
|
name: test (ruby ${{ matrix.ruby }} / rails ${{ matrix.rails_version }} ${{ matrix.additional_name }})
|
36
36
|
strategy:
|
37
|
+
fail-fast: false
|
37
38
|
matrix:
|
38
39
|
ruby: ["3.3"]
|
39
|
-
rails_version: ["7.
|
40
|
+
rails_version: ["7.1.5.1", "7.2.2.1"]
|
40
41
|
bootstrap_version: [null]
|
41
42
|
view_component_version: ["~> 3.12"]
|
42
43
|
api: [null]
|
@@ -44,35 +45,39 @@ jobs:
|
|
44
45
|
additional_name: [""]
|
45
46
|
include:
|
46
47
|
- ruby: "3.3"
|
47
|
-
rails_version: "8.0.
|
48
|
+
rails_version: "8.0.1"
|
48
49
|
additional_engine_cart_rails_options: --css=bootstrap
|
50
|
+
- ruby: "3.3"
|
51
|
+
rails_version: "8.0.1"
|
52
|
+
additional_engine_cart_rails_options: --css=bootstrap --js=esbuild
|
53
|
+
additional_name: "/ esbuild"
|
49
54
|
- ruby: "3.2"
|
50
|
-
rails_version: "
|
51
|
-
- ruby: "3.2"
|
52
|
-
rails_version: "7.0.8.4"
|
53
|
-
- ruby: "3.2"
|
54
|
-
rails_version: "7.1.3.4"
|
55
|
+
rails_version: "7.1.5.1"
|
55
56
|
solr_version: "8.11.2"
|
56
57
|
additional_name: "Solr 8.11.2"
|
57
58
|
- ruby: "3.1"
|
58
|
-
rails_version: "7.1.
|
59
|
+
rails_version: "7.1.5.1"
|
59
60
|
- ruby: "3.1"
|
60
|
-
rails_version: "7.1.
|
61
|
+
rails_version: "7.1.5.1"
|
61
62
|
view_component_version: "~> 2.74"
|
62
63
|
additional_name: "/ ViewComponent 2"
|
63
64
|
- ruby: "3.1"
|
64
|
-
rails_version: "7.
|
65
|
+
rails_version: "7.1.5.1"
|
65
66
|
additional_name: "/ Propshaft"
|
66
67
|
additional_engine_cart_rails_options: -a propshaft --css=bootstrap
|
67
68
|
- ruby: "3.1"
|
68
|
-
rails_version: "7.
|
69
|
+
rails_version: "7.1.5.1"
|
69
70
|
bootstrap_version: "~> 4.0"
|
70
71
|
additional_name: "/ Bootstrap 4"
|
71
72
|
- ruby: "3.3"
|
72
|
-
rails_version: "7.1.
|
73
|
+
rails_version: "7.1.5.1"
|
73
74
|
api: "true"
|
74
75
|
additional_engine_cart_rails_options: --api --skip-yarn
|
75
76
|
additional_name: "/ API"
|
77
|
+
- ruby: "3.3"
|
78
|
+
rails_version: "7.2.2.1"
|
79
|
+
additional_engine_cart_rails_options: -a propshaft --css=bootstrap --js=esbuild
|
80
|
+
additional_name: "/ Propshaft, esbuild"
|
76
81
|
env:
|
77
82
|
RAILS_VERSION: ${{ matrix.rails_version }}
|
78
83
|
SOLR_VERSION: ${{ matrix.solr_version || 'latest' }}
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
8.8.
|
1
|
+
8.8.1
|
@@ -132,7 +132,7 @@ const FacetSuggest = async (e) => {
|
|
132
132
|
const facetField = e.target.dataset.facetField;
|
133
133
|
if (!facetField) { return; }
|
134
134
|
|
135
|
-
const urlToFetch = `/catalog/facet_suggest/${facetField}/${queryFragment}`;
|
135
|
+
const urlToFetch = `/catalog/facet_suggest/${facetField}/${queryFragment}${window.location.search}`;
|
136
136
|
const response = await fetch(urlToFetch);
|
137
137
|
if (response.ok) {
|
138
138
|
const blob = await response.blob();
|
@@ -1 +1 @@
|
|
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/debounce.js","../../../javascript/blacklight/facet_suggest.js","../../../javascript/blacklight/modal.js","../../../javascript/blacklight/modalForm.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 clicked(evt) {\n this.spanTarget.innerHTML = this.form.getAttribute('data-inprogress')\n this.labelTarget.setAttribute('disabled', 'disabled');\n this.checkboxTarget.setAttribute('disabled', 'disabled');\n 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 }).then((response) => {\n if (response.ok) return response.json();\n return Promise.reject('response was not ok')\n }).then((json) => {\n this.labelTarget.removeAttribute('disabled')\n this.checkboxTarget.removeAttribute('disabled')\n this.updateStateFor(!this.checked)\n this.bookmarksCounter().forEach(counter => {\n counter.innerHTML = json.bookmarks.count;\n });\n }).catch((error) => {\n this.handleError(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 bookmarksCounter() {\n return document.querySelectorAll('[data-role=\"bookmark-counter\"]')\n }\n\n handleError() {\n alert(\"Unable to save the bookmark at this time.\")\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","// Usage:\n// ```\n// const basicFunction = (entry) => console.log(entry)\n// const debounced = debounce(basicFunction(\"I should only be called once\"));\n//\n// debounced // does NOT print to the screen because it is invoked again less than 200 milliseconds later\n// debounced // does print to the screen\n// ```\nexport default function debounce(func, timeout = 200) {\n let timer;\n return (...args) => {\n clearTimeout(timer);\n timer = setTimeout(() => { func.apply(this, args); }, timeout);\n };\n}\n","import debounce from \"blacklight/debounce\";\n\nconst FacetSuggest = async (e) => {\n if (e.target.matches('.facet-suggest')) {\n const queryFragment = e.target.value?.trim();\n const facetField = e.target.dataset.facetField;\n if (!facetField) { return; }\n\n const urlToFetch = `/catalog/facet_suggest/${facetField}/${queryFragment}`\n const response = await fetch(urlToFetch);\n if (response.ok) {\n const blob = await response.blob()\n const text = await blob.text()\n \n const facetArea = document.querySelector('.facet-extended-list');\n \n if (text && facetArea) {\n facetArea.innerHTML = text\n }\n }\n }\n};\n\ndocument.addEventListener('input', debounce(FacetSuggest));\n\nexport default FacetSuggest\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*/\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\">×</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 modal.target().querySelector('.modal-content').innerHTML = contents\n\n modal.show();\n }\n\n // Add the passed in contents to the modal and display it.\n // We have specific handling so that scripts returned from the ajax call are executed.\n // This enables adding a script like recaptcha to prevent bots from sending emails.\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 const frag = document.createDocumentFragment()\n if (elements.length == 0) {\n // If the containerSelector wasn't found, use the whole document\n elements = dom.body.childNodes\n }\n elements.forEach((el) => frag.appendChild(el))\n modal.activateScripts(frag)\n \n modal.target().querySelector('.modal-content').replaceChildren(frag)\n\n // send custom event with the modal dialog div as the target\n var e = new CustomEvent('loaded.blacklight.blacklight-modal', { bubbles: true, cancelable: true });\n modal.target().dispatchEvent(e)\n\n // if they did preventDefault, don't show the dialog\n if (e.defaultPrevented) return;\n\n modal.show();\n };\n\n // DOMParser doesn't allow scripts to be executed. This fixes that.\n modal.activateScripts = function (frag) {\n frag.querySelectorAll('script').forEach((script) => {\n const fixedScript = document.createElement('script')\n fixedScript.src = script.src\n fixedScript.async = false\n script.parentNode.replaceChild(fixedScript, script)\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 several click handlers in ONE event handler for efficiency\n //\n // * close button OR click on backdrop (modal.modalSelector) closes modal\n // * trigger and preserve link in modal functionality -- if somethign matches both trigger and\n // preserve, still only 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.matches(`${modal.modalSelector}`) || e.target.closest('[data-bl-dismiss=\"modal\"]'))\n modal.hide()\n })\n };\n\n modal.hide = function (el) {\n const dom = modal.target();\n\n if (!dom.open) return\n\n var e = new CustomEvent('hide.blacklight.blacklight-modal', { bubbles: true, cancelable: true });\n dom.dispatchEvent(e)\n\n dom.close()\n }\n\n modal.show = function(el) {\n const dom = modal.target();\n\n if (dom.open) return\n\n var e = new CustomEvent('show.blacklight.blacklight-modal', { bubbles: true, cancelable: true });\n dom.dispatchEvent(e)\n\n dom.showModal()\n }\n\n modal.target = function() {\n return document.querySelector(modal.modalSelector);\n }\n\n modal.setupModal()\n\n return modal;\n})()\n\nexport default Modal\n","// The email and sms forms are displayed inside a modal. When the form is submitted,\n// this script closes the modal and puts the output on the main part of the page.\n// By default it is rendering catalog/sms_success and catalog/email_succcess.\n// These templates deliver a payload of the format used by turbo-streams.\n// See https://turbo.hotwired.dev/handbook/streams\n// That format allows a downstream application to override the template to define\n// multiple customizable areas of the page to get updated.\nexport default class {\n constructor(errorHandler, badRequestHandler, hideModal) {\n this.errorHandler = errorHandler\n this.badRequestHandler = badRequestHandler\n this.hideModal = hideModal\n }\n\n get triggerFormSelector() {\n return 'form[data-blacklight-modal~=trigger]'\n }\n\n bind() {\n document.addEventListener('submit', (e) => {\n if (e.target.matches(this.triggerFormSelector))\n this.onSubmit(e)\n })\n }\n\n // This is like a light-weight version of turbo that only supports append presently.\n updateTurboStream(data) {\n this.hideModal()\n const domparser = new DOMParser();\n const dom = domparser.parseFromString(data, \"text/html\")\n dom.querySelectorAll(\"turbo-stream[action='append']\").forEach((node) => {\n const target = node.getAttribute('target')\n const element = document.getElementById(target)\n if (element)\n element.append(node.querySelector('template').content.cloneNode(true))\n else\n console.error(`Unable to find an element on the page with and ID of \"${target}\"\"`)\n })\n }\n\n onSubmit(e) {\n e.preventDefault();\n const form = e.target\n fetch(form.action, {\n body: new FormData(form),\n headers: { \"X-Requested-With\": \"XMLHttpRequest\" }, // Ensures rails will return true when checking request.xhr?\n method: form.method,\n })\n .then(response => {\n if (response.status === 422) {\n return response.text().then(content => this.badRequestHandler(content) )\n }\n if (!response.ok) {\n throw new TypeError(\"Request failed\");\n }\n response.text().then(content => this.updateTurboStream(content))\n })\n .catch(error => this.errorHandler(error))\n }\n}\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 form.dataset.turbo = \"false\";\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 Core = 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.\nCore.listeners().forEach(function(listener) {\n document.addEventListener(listener, function() {\n Core.activate()\n })\n})\n\nCore.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 Core\n","import BookmarkToggle from 'blacklight/bookmark_toggle'\nimport ButtonFocus from 'blacklight/button_focus'\nimport FacetSuggest from 'blacklight/facet_suggest'\nimport Modal from 'blacklight/modal'\nimport ModalForm from 'blacklight/modalForm'\nimport SearchContext from 'blacklight/search_context'\nimport Core from 'blacklight/core'\n\nexport default {\n BookmarkToggle,\n ButtonFocus,\n FacetSuggest,\n Modal,\n ModalForm,\n SearchContext,\n Core,\n onLoad: Core.onLoad\n}\n"],"names":[],"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/debounce.js","../../../javascript/blacklight/facet_suggest.js","../../../javascript/blacklight/modal.js","../../../javascript/blacklight/modalForm.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 clicked(evt) {\n this.spanTarget.innerHTML = this.form.getAttribute('data-inprogress')\n this.labelTarget.setAttribute('disabled', 'disabled');\n this.checkboxTarget.setAttribute('disabled', 'disabled');\n 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 }).then((response) => {\n if (response.ok) return response.json();\n return Promise.reject('response was not ok')\n }).then((json) => {\n this.labelTarget.removeAttribute('disabled')\n this.checkboxTarget.removeAttribute('disabled')\n this.updateStateFor(!this.checked)\n this.bookmarksCounter().forEach(counter => {\n counter.innerHTML = json.bookmarks.count;\n });\n }).catch((error) => {\n this.handleError(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 bookmarksCounter() {\n return document.querySelectorAll('[data-role=\"bookmark-counter\"]')\n }\n\n handleError() {\n alert(\"Unable to save the bookmark at this time.\")\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","// Usage:\n// ```\n// const basicFunction = (entry) => console.log(entry)\n// const debounced = debounce(basicFunction(\"I should only be called once\"));\n//\n// debounced // does NOT print to the screen because it is invoked again less than 200 milliseconds later\n// debounced // does print to the screen\n// ```\nexport default function debounce(func, timeout = 200) {\n let timer;\n return (...args) => {\n clearTimeout(timer);\n timer = setTimeout(() => { func.apply(this, args); }, timeout);\n };\n}\n","import debounce from \"blacklight/debounce\";\n\nconst FacetSuggest = async (e) => {\n if (e.target.matches('.facet-suggest')) {\n const queryFragment = e.target.value?.trim();\n const facetField = e.target.dataset.facetField;\n if (!facetField) { return; }\n\n const urlToFetch = `/catalog/facet_suggest/${facetField}/${queryFragment}${window.location.search}`\n const response = await fetch(urlToFetch);\n if (response.ok) {\n const blob = await response.blob()\n const text = await blob.text()\n \n const facetArea = document.querySelector('.facet-extended-list');\n \n if (text && facetArea) {\n facetArea.innerHTML = text\n }\n }\n }\n};\n\ndocument.addEventListener('input', debounce(FacetSuggest));\n\nexport default FacetSuggest\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*/\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\">×</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 modal.target().querySelector('.modal-content').innerHTML = contents\n\n modal.show();\n }\n\n // Add the passed in contents to the modal and display it.\n // We have specific handling so that scripts returned from the ajax call are executed.\n // This enables adding a script like recaptcha to prevent bots from sending emails.\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 const frag = document.createDocumentFragment()\n if (elements.length == 0) {\n // If the containerSelector wasn't found, use the whole document\n elements = dom.body.childNodes\n }\n elements.forEach((el) => frag.appendChild(el))\n modal.activateScripts(frag)\n \n modal.target().querySelector('.modal-content').replaceChildren(frag)\n\n // send custom event with the modal dialog div as the target\n var e = new CustomEvent('loaded.blacklight.blacklight-modal', { bubbles: true, cancelable: true });\n modal.target().dispatchEvent(e)\n\n // if they did preventDefault, don't show the dialog\n if (e.defaultPrevented) return;\n\n modal.show();\n };\n\n // DOMParser doesn't allow scripts to be executed. This fixes that.\n modal.activateScripts = function (frag) {\n frag.querySelectorAll('script').forEach((script) => {\n const fixedScript = document.createElement('script')\n fixedScript.src = script.src\n fixedScript.async = false\n script.parentNode.replaceChild(fixedScript, script)\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 several click handlers in ONE event handler for efficiency\n //\n // * close button OR click on backdrop (modal.modalSelector) closes modal\n // * trigger and preserve link in modal functionality -- if somethign matches both trigger and\n // preserve, still only 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.matches(`${modal.modalSelector}`) || e.target.closest('[data-bl-dismiss=\"modal\"]'))\n modal.hide()\n })\n };\n\n modal.hide = function (el) {\n const dom = modal.target();\n\n if (!dom.open) return\n\n var e = new CustomEvent('hide.blacklight.blacklight-modal', { bubbles: true, cancelable: true });\n dom.dispatchEvent(e)\n\n dom.close()\n }\n\n modal.show = function(el) {\n const dom = modal.target();\n\n if (dom.open) return\n\n var e = new CustomEvent('show.blacklight.blacklight-modal', { bubbles: true, cancelable: true });\n dom.dispatchEvent(e)\n\n dom.showModal()\n }\n\n modal.target = function() {\n return document.querySelector(modal.modalSelector);\n }\n\n modal.setupModal()\n\n return modal;\n})()\n\nexport default Modal\n","// The email and sms forms are displayed inside a modal. When the form is submitted,\n// this script closes the modal and puts the output on the main part of the page.\n// By default it is rendering catalog/sms_success and catalog/email_succcess.\n// These templates deliver a payload of the format used by turbo-streams.\n// See https://turbo.hotwired.dev/handbook/streams\n// That format allows a downstream application to override the template to define\n// multiple customizable areas of the page to get updated.\nexport default class {\n constructor(errorHandler, badRequestHandler, hideModal) {\n this.errorHandler = errorHandler\n this.badRequestHandler = badRequestHandler\n this.hideModal = hideModal\n }\n\n get triggerFormSelector() {\n return 'form[data-blacklight-modal~=trigger]'\n }\n\n bind() {\n document.addEventListener('submit', (e) => {\n if (e.target.matches(this.triggerFormSelector))\n this.onSubmit(e)\n })\n }\n\n // This is like a light-weight version of turbo that only supports append presently.\n updateTurboStream(data) {\n this.hideModal()\n const domparser = new DOMParser();\n const dom = domparser.parseFromString(data, \"text/html\")\n dom.querySelectorAll(\"turbo-stream[action='append']\").forEach((node) => {\n const target = node.getAttribute('target')\n const element = document.getElementById(target)\n if (element)\n element.append(node.querySelector('template').content.cloneNode(true))\n else\n console.error(`Unable to find an element on the page with and ID of \"${target}\"\"`)\n })\n }\n\n onSubmit(e) {\n e.preventDefault();\n const form = e.target\n fetch(form.action, {\n body: new FormData(form),\n headers: { \"X-Requested-With\": \"XMLHttpRequest\" }, // Ensures rails will return true when checking request.xhr?\n method: form.method,\n })\n .then(response => {\n if (response.status === 422) {\n return response.text().then(content => this.badRequestHandler(content) )\n }\n if (!response.ok) {\n throw new TypeError(\"Request failed\");\n }\n response.text().then(content => this.updateTurboStream(content))\n })\n .catch(error => this.errorHandler(error))\n }\n}\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 form.dataset.turbo = \"false\";\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 Core = 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.\nCore.listeners().forEach(function(listener) {\n document.addEventListener(listener, function() {\n Core.activate()\n })\n})\n\nCore.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 Core\n","import BookmarkToggle from 'blacklight/bookmark_toggle'\nimport ButtonFocus from 'blacklight/button_focus'\nimport FacetSuggest from 'blacklight/facet_suggest'\nimport Modal from 'blacklight/modal'\nimport ModalForm from 'blacklight/modalForm'\nimport SearchContext from 'blacklight/search_context'\nimport Core from 'blacklight/core'\n\nexport default {\n BookmarkToggle,\n ButtonFocus,\n FacetSuggest,\n Modal,\n ModalForm,\n SearchContext,\n Core,\n onLoad: Core.onLoad\n}\n"],"names":[],"mappings":"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"}
|
@@ -138,7 +138,7 @@
|
|
138
138
|
const facetField = e.target.dataset.facetField;
|
139
139
|
if (!facetField) { return; }
|
140
140
|
|
141
|
-
const urlToFetch = `/catalog/facet_suggest/${facetField}/${queryFragment}`;
|
141
|
+
const urlToFetch = `/catalog/facet_suggest/${facetField}/${queryFragment}${window.location.search}`;
|
142
142
|
const response = await fetch(urlToFetch);
|
143
143
|
if (response.ok) {
|
144
144
|
const blob = await response.blob();
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"blacklight.js","sources":["../../../javascript/blacklight/checkbox_submit.js","../../../javascript/blacklight/bookmark_toggle.js","../../../javascript/blacklight/button_focus.js","../../../javascript/blacklight/debounce.js","../../../javascript/blacklight/facet_suggest.js","../../../javascript/blacklight/modal.js","../../../javascript/blacklight/modalForm.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 clicked(evt) {\n this.spanTarget.innerHTML = this.form.getAttribute('data-inprogress')\n this.labelTarget.setAttribute('disabled', 'disabled');\n this.checkboxTarget.setAttribute('disabled', 'disabled');\n 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 }).then((response) => {\n if (response.ok) return response.json();\n return Promise.reject('response was not ok')\n }).then((json) => {\n this.labelTarget.removeAttribute('disabled')\n this.checkboxTarget.removeAttribute('disabled')\n this.updateStateFor(!this.checked)\n this.bookmarksCounter().forEach(counter => {\n counter.innerHTML = json.bookmarks.count;\n });\n }).catch((error) => {\n this.handleError(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 bookmarksCounter() {\n return document.querySelectorAll('[data-role=\"bookmark-counter\"]')\n }\n\n handleError() {\n alert(\"Unable to save the bookmark at this time.\")\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","// Usage:\n// ```\n// const basicFunction = (entry) => console.log(entry)\n// const debounced = debounce(basicFunction(\"I should only be called once\"));\n//\n// debounced // does NOT print to the screen because it is invoked again less than 200 milliseconds later\n// debounced // does print to the screen\n// ```\nexport default function debounce(func, timeout = 200) {\n let timer;\n return (...args) => {\n clearTimeout(timer);\n timer = setTimeout(() => { func.apply(this, args); }, timeout);\n };\n}\n","import debounce from \"blacklight/debounce\";\n\nconst FacetSuggest = async (e) => {\n if (e.target.matches('.facet-suggest')) {\n const queryFragment = e.target.value?.trim();\n const facetField = e.target.dataset.facetField;\n if (!facetField) { return; }\n\n const urlToFetch = `/catalog/facet_suggest/${facetField}/${queryFragment}`\n const response = await fetch(urlToFetch);\n if (response.ok) {\n const blob = await response.blob()\n const text = await blob.text()\n \n const facetArea = document.querySelector('.facet-extended-list');\n \n if (text && facetArea) {\n facetArea.innerHTML = text\n }\n }\n }\n};\n\ndocument.addEventListener('input', debounce(FacetSuggest));\n\nexport default FacetSuggest\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*/\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\">×</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 modal.target().querySelector('.modal-content').innerHTML = contents\n\n modal.show();\n }\n\n // Add the passed in contents to the modal and display it.\n // We have specific handling so that scripts returned from the ajax call are executed.\n // This enables adding a script like recaptcha to prevent bots from sending emails.\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 const frag = document.createDocumentFragment()\n if (elements.length == 0) {\n // If the containerSelector wasn't found, use the whole document\n elements = dom.body.childNodes\n }\n elements.forEach((el) => frag.appendChild(el))\n modal.activateScripts(frag)\n \n modal.target().querySelector('.modal-content').replaceChildren(frag)\n\n // send custom event with the modal dialog div as the target\n var e = new CustomEvent('loaded.blacklight.blacklight-modal', { bubbles: true, cancelable: true });\n modal.target().dispatchEvent(e)\n\n // if they did preventDefault, don't show the dialog\n if (e.defaultPrevented) return;\n\n modal.show();\n };\n\n // DOMParser doesn't allow scripts to be executed. This fixes that.\n modal.activateScripts = function (frag) {\n frag.querySelectorAll('script').forEach((script) => {\n const fixedScript = document.createElement('script')\n fixedScript.src = script.src\n fixedScript.async = false\n script.parentNode.replaceChild(fixedScript, script)\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 several click handlers in ONE event handler for efficiency\n //\n // * close button OR click on backdrop (modal.modalSelector) closes modal\n // * trigger and preserve link in modal functionality -- if somethign matches both trigger and\n // preserve, still only 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.matches(`${modal.modalSelector}`) || e.target.closest('[data-bl-dismiss=\"modal\"]'))\n modal.hide()\n })\n };\n\n modal.hide = function (el) {\n const dom = modal.target();\n\n if (!dom.open) return\n\n var e = new CustomEvent('hide.blacklight.blacklight-modal', { bubbles: true, cancelable: true });\n dom.dispatchEvent(e)\n\n dom.close()\n }\n\n modal.show = function(el) {\n const dom = modal.target();\n\n if (dom.open) return\n\n var e = new CustomEvent('show.blacklight.blacklight-modal', { bubbles: true, cancelable: true });\n dom.dispatchEvent(e)\n\n dom.showModal()\n }\n\n modal.target = function() {\n return document.querySelector(modal.modalSelector);\n }\n\n modal.setupModal()\n\n return modal;\n})()\n\nexport default Modal\n","// The email and sms forms are displayed inside a modal. When the form is submitted,\n// this script closes the modal and puts the output on the main part of the page.\n// By default it is rendering catalog/sms_success and catalog/email_succcess.\n// These templates deliver a payload of the format used by turbo-streams.\n// See https://turbo.hotwired.dev/handbook/streams\n// That format allows a downstream application to override the template to define\n// multiple customizable areas of the page to get updated.\nexport default class {\n constructor(errorHandler, badRequestHandler, hideModal) {\n this.errorHandler = errorHandler\n this.badRequestHandler = badRequestHandler\n this.hideModal = hideModal\n }\n\n get triggerFormSelector() {\n return 'form[data-blacklight-modal~=trigger]'\n }\n\n bind() {\n document.addEventListener('submit', (e) => {\n if (e.target.matches(this.triggerFormSelector))\n this.onSubmit(e)\n })\n }\n\n // This is like a light-weight version of turbo that only supports append presently.\n updateTurboStream(data) {\n this.hideModal()\n const domparser = new DOMParser();\n const dom = domparser.parseFromString(data, \"text/html\")\n dom.querySelectorAll(\"turbo-stream[action='append']\").forEach((node) => {\n const target = node.getAttribute('target')\n const element = document.getElementById(target)\n if (element)\n element.append(node.querySelector('template').content.cloneNode(true))\n else\n console.error(`Unable to find an element on the page with and ID of \"${target}\"\"`)\n })\n }\n\n onSubmit(e) {\n e.preventDefault();\n const form = e.target\n fetch(form.action, {\n body: new FormData(form),\n headers: { \"X-Requested-With\": \"XMLHttpRequest\" }, // Ensures rails will return true when checking request.xhr?\n method: form.method,\n })\n .then(response => {\n if (response.status === 422) {\n return response.text().then(content => this.badRequestHandler(content) )\n }\n if (!response.ok) {\n throw new TypeError(\"Request failed\");\n }\n response.text().then(content => this.updateTurboStream(content))\n })\n .catch(error => this.errorHandler(error))\n }\n}\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 form.dataset.turbo = \"false\";\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 Core = 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.\nCore.listeners().forEach(function(listener) {\n document.addEventListener(listener, function() {\n Core.activate()\n })\n})\n\nCore.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 Core\n","import BookmarkToggle from 'blacklight/bookmark_toggle'\nimport ButtonFocus from 'blacklight/button_focus'\nimport FacetSuggest from 'blacklight/facet_suggest'\nimport Modal from 'blacklight/modal'\nimport ModalForm from 'blacklight/modalForm'\nimport SearchContext from 'blacklight/search_context'\nimport Core from 'blacklight/core'\n\nexport default {\n BookmarkToggle,\n ButtonFocus,\n FacetSuggest,\n Modal,\n ModalForm,\n SearchContext,\n Core,\n onLoad: Core.onLoad\n}\n"],"names":[],"mappings":";;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACe,MAAM,cAAc,CAAC;EACpC,EAAE,WAAW,CAAC,IAAI,EAAE;EACpB,IAAI,IAAI,CAAC,IAAI,GAAG;EAChB;;EAEA,EAAE,OAAO,CAAC,GAAG,EAAE;EACf,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,iBAAiB;EACxE,IAAI,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC;EACzD,IAAI,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC;EAC5D,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE;EAClD,MAAM,IAAI,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;EACzC,MAAM,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;EAClE,MAAM,OAAO,EAAE;EACf,QAAQ,QAAQ,EAAE,kBAAkB;EACpC,QAAQ,kBAAkB,EAAE,gBAAgB;EAC5C,QAAQ,cAAc,EAAE,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC,EAAE;EACzE;EACA,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK;EAC1B,MAAM,IAAI,QAAQ,CAAC,EAAE,EAAE,OAAO,QAAQ,CAAC,IAAI,EAAE;EAC7C,MAAM,OAAO,OAAO,CAAC,MAAM,CAAC,qBAAqB;EACjD,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK;EACtB,MAAM,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,UAAU;EACjD,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,UAAU;EACpD,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,OAAO;EACvC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI;EACjD,QAAQ,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK;EAChD,OAAO,CAAC;EACR,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK;EACxB,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK;EAC5B,KAAK;EACL;;EAEA,EAAE,IAAI,OAAO,GAAG;EAChB,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,mCAAmC,CAAC,CAAC,MAAM,IAAI,CAAC;EACvF;;EAEA,EAAE,IAAI,UAAU,GAAG;EACnB,IAAI,OAAO,IAAI,CAAC;EAChB;;EAEA,EAAE,IAAI,WAAW,GAAG;EACpB,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,sCAAsC;EACzE;;EAEA,EAAE,IAAI,cAAc,GAAG;EACvB,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,yCAAyC;EAC5E;;EAEA,EAAE,IAAI,UAAU,GAAG;EACnB,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,qCAAqC;EACxE;;EAEA,EAAE,gBAAgB,GAAG;EACrB,IAAI,OAAO,QAAQ,CAAC,gBAAgB,CAAC,gCAAgC;EACrE;;EAEA,EAAE,WAAW,GAAG;EAChB,IAAI,KAAK,CAAC,2CAA2C;EACrD;;EAEA,EAAE,cAAc,CAAC,KAAK,EAAE;EACxB,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG;;EAElC,IAAI,IAAI,KAAK,EAAE;EACf,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS;EAC9C;EACA;EACA,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC,KAAK,GAAG;EACnE,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc;EACvE,KAAK,MAAM;EACX,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS;EACjD,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC,KAAK,GAAG;EACnE,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa;EACtE;EACA;EACA;;ECxFA,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK;EAC9B,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,yCAAyC,CAAC,EAAE;EACnE,IAAI,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM;EACxC,IAAI,IAAI,IAAI,EAAE,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;EACjD;EACA,CAAC;;EAED,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,cAAc,CAAC;;ECTlD,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK;EAC3B;EACA;EACA;EACA,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,EAAE;EACvG,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK;EAClB;EACA;;EAEA,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW;;ECT9C;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACe,SAAS,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,GAAG,EAAE;EACtD,IAAI,IAAI,KAAK;EACb,IAAI,OAAO,CAAC,GAAG,IAAI,KAAK;EACxB,MAAM,YAAY,CAAC,KAAK,CAAC;EACzB,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC;EACpE,KAAK;EACL;;ECZA,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK;EAClC,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE;EAC1C,IAAI,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE;EAChD,IAAI,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU;EAClD,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO;;EAE9B,IAAI,MAAM,UAAU,GAAG,CAAC,uBAAuB,EAAE,UAAU,CAAC,CAAC,EAAE,aAAa,CAAC;EAC7E,IAAI,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC;EAC5C,IAAI,IAAI,QAAQ,CAAC,EAAE,EAAE;EACrB,QAAQ,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI;EACxC,QAAQ,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI;EACpC;EACA,QAAQ,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,sBAAsB,CAAC;EACxE;EACA,QAAQ,IAAI,IAAI,IAAI,SAAS,EAAE;EAC/B,YAAY,SAAS,CAAC,SAAS,GAAG;EAClC;EACA;EACA;EACA,CAAC;;EAED,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;;ECvB1D;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;;EAEA;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;;EAEA;;EAEA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;;;EAGA;EACA;EACA;EACA;;;EAGA;EACA;EACA;EACA;;EAEA,MAAM,KAAK,GAAG,CAAC,MAAM;EACrB,EAAE,MAAM,KAAK,GAAG;;EAEhB;EACA,EAAE,KAAK,CAAC,aAAa,GAAG,mBAAmB;;EAE3C;EACA;EACA,EAAE,KAAK,CAAC,mBAAmB,IAAI,mCAAmC;;EAElE;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,KAAK,CAAC,oBAAoB,GAAG,KAAK,CAAC,aAAa,GAAG,qCAAqC;;EAE1F,EAAE,KAAK,CAAC,iBAAiB,MAAM,oCAAoC;;EAEnE;EACA;EACA,EAAE,KAAK,CAAC,SAAS,GAAG,UAAU,KAAK,EAAE;EACrC,MAAM,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;;EAErD,MAAM,MAAM,QAAQ,GAAG,CAAC;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC;AACpC,cAAc;;EAEd,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,SAAS,GAAG;;EAEjE,MAAM,KAAK,CAAC,IAAI,EAAE;EAClB;;EAEA;EACA;EACA;EACA,EAAE,KAAK,CAAC,WAAW,GAAG,UAAU,QAAQ,EAAE;EAC1C,IAAI,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE;EACrC,IAAI,MAAM,GAAG,GAAG,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW;EAC/D;EACA,IAAI,IAAI,QAAQ,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC;EACxE,IAAI,MAAM,IAAI,GAAG,QAAQ,CAAC,sBAAsB;EAChD,IAAI,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE;EAC9B;EACA,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC;EAC1B;EACA,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;EACjD,IAAI,KAAK,CAAC,eAAe,CAAC,IAAI;EAC9B;EACA,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,eAAe,CAAC,IAAI;;EAEvE;EACA,IAAI,IAAI,CAAC,GAAG,IAAI,WAAW,CAAC,oCAAoC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;EACtG,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,CAAC;;EAElC;EACA,IAAI,IAAI,CAAC,CAAC,gBAAgB,EAAE;;EAE5B,IAAI,KAAK,CAAC,IAAI,EAAE;EAChB,GAAG;;EAEH;EACA,EAAE,KAAK,CAAC,eAAe,GAAG,UAAU,IAAI,EAAE;EAC1C,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK;EACxD,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ;EACzD,MAAM,WAAW,CAAC,GAAG,GAAG,MAAM,CAAC;EAC/B,MAAM,WAAW,CAAC,KAAK,GAAG;EAC1B,MAAM,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM;EACxD,KAAK;EACL;;EAEA,EAAE,KAAK,CAAC,kBAAkB,GAAG,SAAS,CAAC,EAAE;EACzC,IAAI,CAAC,CAAC,cAAc,EAAE;EACtB,IAAI,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM;EAC7C,IAAI,KAAK,CAAC,IAAI;EACd,OAAO,IAAI,CAAC,QAAQ,IAAI;EACxB,SAAS,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;EAC3B,WAAW,MAAM,IAAI,SAAS,CAAC,gBAAgB,CAAC;EAChD;EACA,SAAS,OAAO,QAAQ,CAAC,IAAI,EAAE;EAC/B,QAAQ;EACR,OAAO,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;EAC3C,OAAO,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;EAC5C,GAAG;;EAEH,EAAE,KAAK,CAAC,UAAU,GAAG,WAAW;EAChC;EACA;EACA;EACA;EACA;EACA,IAAI,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK;EAC9C,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC,EAAE,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;EACzF,QAAQ,KAAK,CAAC,kBAAkB,CAAC,CAAC;EAClC,WAAW,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC;EAC1G,QAAQ,KAAK,CAAC,IAAI;EAClB,KAAK;EACL,GAAG;;EAEH,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU,EAAE,EAAE;EAC7B,IAAI,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE;;EAE9B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;;EAEnB,IAAI,IAAI,CAAC,GAAG,IAAI,WAAW,CAAC,kCAAkC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;EACpG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;;EAEvB,IAAI,GAAG,CAAC,KAAK;EACb;;EAEA,EAAE,KAAK,CAAC,IAAI,GAAG,SAAS,EAAE,EAAE;EAC5B,IAAI,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE;;EAE9B,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE;;EAElB,IAAI,IAAI,CAAC,GAAG,IAAI,WAAW,CAAC,kCAAkC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;EACpG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;;EAEvB,IAAI,GAAG,CAAC,SAAS;EACjB;;EAEA,EAAE,KAAK,CAAC,MAAM,GAAG,WAAW;EAC5B,IAAI,OAAO,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC;EACtD;;EAEA,EAAE,KAAK,CAAC,UAAU;;EAElB,EAAE,OAAO,KAAK;EACd,CAAC;;EChMD;EACA;EACA;EACA;EACA;EACA;EACA;EACe,eAAK,CAAC;EACrB,IAAI,WAAW,CAAC,YAAY,EAAE,iBAAiB,EAAE,SAAS,EAAE;EAC5D,MAAM,IAAI,CAAC,YAAY,GAAG;EAC1B,MAAM,IAAI,CAAC,iBAAiB,GAAG;EAC/B,MAAM,IAAI,CAAC,SAAS,GAAG;EACvB;;EAEA,IAAI,IAAI,mBAAmB,GAAG;EAC9B,MAAM,OAAO;EACb;;EAEA,IAAI,IAAI,GAAG;EACX,MAAM,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK;EACjD,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC;EACvD,UAAU,IAAI,CAAC,QAAQ,CAAC,CAAC;EACzB,OAAO;EACP;;EAEA;EACA,IAAI,iBAAiB,CAAC,IAAI,EAAE;EAC5B,QAAQ,IAAI,CAAC,SAAS;EACtB,QAAQ,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE;EACzC,QAAQ,MAAM,GAAG,GAAG,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,WAAW;EAC/D,QAAQ,GAAG,CAAC,gBAAgB,CAAC,+BAA+B,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK;EAChF,UAAU,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ;EACnD,UAAU,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM;EACxD,UAAU,IAAI,OAAO;EACrB,YAAY,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC;EACjF;EACA,YAAY,OAAO,CAAC,KAAK,CAAC,CAAC,sDAAsD,EAAE,MAAM,CAAC,EAAE,CAAC;EAC7F,SAAS;EACT;;EAEA,IAAI,QAAQ,CAAC,CAAC,EAAE;EAChB,QAAQ,CAAC,CAAC,cAAc,EAAE;EAC1B,QAAQ,MAAM,IAAI,GAAG,CAAC,CAAC;EACvB,QAAQ,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE;EAC3B,YAAY,IAAI,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC;EACpC,YAAY,OAAO,EAAE,EAAE,kBAAkB,EAAE,gBAAgB,EAAE;EAC7D,YAAY,MAAM,EAAE,IAAI,CAAC,MAAM;EAC/B,WAAW;EACX,WAAW,IAAI,CAAC,QAAQ,IAAI;EAC5B,aAAa,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE;EAC1C,eAAe,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;EACrF;EACA,aAAa,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;EAC/B,eAAe,MAAM,IAAI,SAAS,CAAC,gBAAgB,CAAC;EACpD;EACA,aAAa,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;EAC5E,YAAY;EACZ,WAAW,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;EAClD;EACA;;EC3DA,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK;EAC7B,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE;EAC/C,IAAI,aAAa,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;EAC5D;EACA;;EAEA,aAAa,CAAC,SAAS,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC,EAAE;EACjF,aAAa,CAAC,SAAS,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC,EAAE;;EAEjF;EACA;EACA,aAAa,CAAC,yBAAyB,GAAG,SAAS,KAAK,EAAE;EAC1D,EAAE,MAAM,IAAI,GAAG;;EAEf;EACA,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,mBAAmB;EAClD,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ;EACzC,EAAE,IAAI,SAAS,GAAG,aAAa,CAAC,SAAS;EACzC,EAAE,IAAI,SAAS,GAAG,aAAa,CAAC,SAAS;EACzC,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM;EAC1C,EAAE,IAAI,CAAC,MAAM,GAAG;EAChB,EAAE,IAAI,CAAC,MAAM,GAAG;;;EAGhB,EAAE,IAAI,WAAW,GAAG,CAAC;AACrB,kCAAkC,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,kBAAkB;;EAEhF;EACA,EAAE,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE;EACrC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,OAAO;EAChC,IAAI,MAAM,GAAG,QAAQ;EACrB;;EAEA,EAAE,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE;EAC1D,IAAI,WAAW,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,kBAAkB;EACpF;;EAEA;EACA;EACA,EAAE,WAAW,IAAI;;EAEjB,EAAE,IAAI,MAAM,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;;EAEpD,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG;EACvB,EAAE,IAAI,CAAC,SAAS,GAAG;EACnB,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI;EAChC,EAAE,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,KAAK;;EAE7C,EAAE,KAAK,CAAC,cAAc;EACtB,CAAC;;EAED,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa;;ECnDhD,MAAM,IAAI,GAAG,WAAW;EACxB,EAAE,MAAM,MAAM,GAAG,IAAI,KAAK;EAC1B,EAAE,OAAO;EACT,IAAI,MAAM,EAAE,SAAS,IAAI,EAAE;EAC3B,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;EACvB,KAAK;;EAEL,IAAI,QAAQ,EAAE,WAAW;EACzB,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;EAC7C,QAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;EACxB;EACA,KAAK;;EAEL,IAAI,SAAS,EAAE,YAAY;EAC3B,MAAM,MAAM,SAAS,GAAG,EAAE;EAC1B,MAAM,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;EACxC,QAAQ,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC;EACxD,OAAO,MAAM,IAAI,OAAO,UAAU,KAAK,WAAW,IAAI,UAAU,CAAC,SAAS,EAAE;EAC5E;EACA,QAAQ,IAAI,UAAU,CAAC,cAAc,EAAE;EACvC,UAAU,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC;EAC3C,SAAS,MAAM;EACf;EACA,UAAU,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC;EACzD;EACA,OAAO,MAAM;EACb,QAAQ,SAAS,CAAC,IAAI,CAAC,kBAAkB,CAAC;EAC1C;;EAEA,MAAM,OAAO,SAAS;EACtB;EACA,GAAG;EACH,CAAC,EAAE;;EAEH;EACA;EACA,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,SAAS,QAAQ,EAAE;EAC5C,EAAE,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,WAAW;EACjD,IAAI,IAAI,CAAC,QAAQ;EACjB,GAAG;EACH,CAAC;;EAED,IAAI,CAAC,MAAM,CAAC,YAAY;EACxB,EAAE,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;;EAE/C;EACA;EACA,EAAE,IAAI,CAAC,IAAI,EAAE;;EAEb,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO;EAC/B,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI;EACzB,CAAC;;AC3CD,gBAAe;EACf,EAAE,cAAc;EAChB,EAAE,WAAW;EACb,EAAE,YAAY;EACd,EAAE,KAAK;EACP,EAAE,SAAS;EACX,EAAE,aAAa;EACf,EAAE,IAAI;EACN,EAAE,MAAM,EAAE,IAAI,CAAC;EACf;;;;;;;;"}
|
1
|
+
{"version":3,"file":"blacklight.js","sources":["../../../javascript/blacklight/checkbox_submit.js","../../../javascript/blacklight/bookmark_toggle.js","../../../javascript/blacklight/button_focus.js","../../../javascript/blacklight/debounce.js","../../../javascript/blacklight/facet_suggest.js","../../../javascript/blacklight/modal.js","../../../javascript/blacklight/modalForm.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 clicked(evt) {\n this.spanTarget.innerHTML = this.form.getAttribute('data-inprogress')\n this.labelTarget.setAttribute('disabled', 'disabled');\n this.checkboxTarget.setAttribute('disabled', 'disabled');\n 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 }).then((response) => {\n if (response.ok) return response.json();\n return Promise.reject('response was not ok')\n }).then((json) => {\n this.labelTarget.removeAttribute('disabled')\n this.checkboxTarget.removeAttribute('disabled')\n this.updateStateFor(!this.checked)\n this.bookmarksCounter().forEach(counter => {\n counter.innerHTML = json.bookmarks.count;\n });\n }).catch((error) => {\n this.handleError(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 bookmarksCounter() {\n return document.querySelectorAll('[data-role=\"bookmark-counter\"]')\n }\n\n handleError() {\n alert(\"Unable to save the bookmark at this time.\")\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","// Usage:\n// ```\n// const basicFunction = (entry) => console.log(entry)\n// const debounced = debounce(basicFunction(\"I should only be called once\"));\n//\n// debounced // does NOT print to the screen because it is invoked again less than 200 milliseconds later\n// debounced // does print to the screen\n// ```\nexport default function debounce(func, timeout = 200) {\n let timer;\n return (...args) => {\n clearTimeout(timer);\n timer = setTimeout(() => { func.apply(this, args); }, timeout);\n };\n}\n","import debounce from \"blacklight/debounce\";\n\nconst FacetSuggest = async (e) => {\n if (e.target.matches('.facet-suggest')) {\n const queryFragment = e.target.value?.trim();\n const facetField = e.target.dataset.facetField;\n if (!facetField) { return; }\n\n const urlToFetch = `/catalog/facet_suggest/${facetField}/${queryFragment}${window.location.search}`\n const response = await fetch(urlToFetch);\n if (response.ok) {\n const blob = await response.blob()\n const text = await blob.text()\n \n const facetArea = document.querySelector('.facet-extended-list');\n \n if (text && facetArea) {\n facetArea.innerHTML = text\n }\n }\n }\n};\n\ndocument.addEventListener('input', debounce(FacetSuggest));\n\nexport default FacetSuggest\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*/\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\">×</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 modal.target().querySelector('.modal-content').innerHTML = contents\n\n modal.show();\n }\n\n // Add the passed in contents to the modal and display it.\n // We have specific handling so that scripts returned from the ajax call are executed.\n // This enables adding a script like recaptcha to prevent bots from sending emails.\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 const frag = document.createDocumentFragment()\n if (elements.length == 0) {\n // If the containerSelector wasn't found, use the whole document\n elements = dom.body.childNodes\n }\n elements.forEach((el) => frag.appendChild(el))\n modal.activateScripts(frag)\n \n modal.target().querySelector('.modal-content').replaceChildren(frag)\n\n // send custom event with the modal dialog div as the target\n var e = new CustomEvent('loaded.blacklight.blacklight-modal', { bubbles: true, cancelable: true });\n modal.target().dispatchEvent(e)\n\n // if they did preventDefault, don't show the dialog\n if (e.defaultPrevented) return;\n\n modal.show();\n };\n\n // DOMParser doesn't allow scripts to be executed. This fixes that.\n modal.activateScripts = function (frag) {\n frag.querySelectorAll('script').forEach((script) => {\n const fixedScript = document.createElement('script')\n fixedScript.src = script.src\n fixedScript.async = false\n script.parentNode.replaceChild(fixedScript, script)\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 several click handlers in ONE event handler for efficiency\n //\n // * close button OR click on backdrop (modal.modalSelector) closes modal\n // * trigger and preserve link in modal functionality -- if somethign matches both trigger and\n // preserve, still only 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.matches(`${modal.modalSelector}`) || e.target.closest('[data-bl-dismiss=\"modal\"]'))\n modal.hide()\n })\n };\n\n modal.hide = function (el) {\n const dom = modal.target();\n\n if (!dom.open) return\n\n var e = new CustomEvent('hide.blacklight.blacklight-modal', { bubbles: true, cancelable: true });\n dom.dispatchEvent(e)\n\n dom.close()\n }\n\n modal.show = function(el) {\n const dom = modal.target();\n\n if (dom.open) return\n\n var e = new CustomEvent('show.blacklight.blacklight-modal', { bubbles: true, cancelable: true });\n dom.dispatchEvent(e)\n\n dom.showModal()\n }\n\n modal.target = function() {\n return document.querySelector(modal.modalSelector);\n }\n\n modal.setupModal()\n\n return modal;\n})()\n\nexport default Modal\n","// The email and sms forms are displayed inside a modal. When the form is submitted,\n// this script closes the modal and puts the output on the main part of the page.\n// By default it is rendering catalog/sms_success and catalog/email_succcess.\n// These templates deliver a payload of the format used by turbo-streams.\n// See https://turbo.hotwired.dev/handbook/streams\n// That format allows a downstream application to override the template to define\n// multiple customizable areas of the page to get updated.\nexport default class {\n constructor(errorHandler, badRequestHandler, hideModal) {\n this.errorHandler = errorHandler\n this.badRequestHandler = badRequestHandler\n this.hideModal = hideModal\n }\n\n get triggerFormSelector() {\n return 'form[data-blacklight-modal~=trigger]'\n }\n\n bind() {\n document.addEventListener('submit', (e) => {\n if (e.target.matches(this.triggerFormSelector))\n this.onSubmit(e)\n })\n }\n\n // This is like a light-weight version of turbo that only supports append presently.\n updateTurboStream(data) {\n this.hideModal()\n const domparser = new DOMParser();\n const dom = domparser.parseFromString(data, \"text/html\")\n dom.querySelectorAll(\"turbo-stream[action='append']\").forEach((node) => {\n const target = node.getAttribute('target')\n const element = document.getElementById(target)\n if (element)\n element.append(node.querySelector('template').content.cloneNode(true))\n else\n console.error(`Unable to find an element on the page with and ID of \"${target}\"\"`)\n })\n }\n\n onSubmit(e) {\n e.preventDefault();\n const form = e.target\n fetch(form.action, {\n body: new FormData(form),\n headers: { \"X-Requested-With\": \"XMLHttpRequest\" }, // Ensures rails will return true when checking request.xhr?\n method: form.method,\n })\n .then(response => {\n if (response.status === 422) {\n return response.text().then(content => this.badRequestHandler(content) )\n }\n if (!response.ok) {\n throw new TypeError(\"Request failed\");\n }\n response.text().then(content => this.updateTurboStream(content))\n })\n .catch(error => this.errorHandler(error))\n }\n}\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 form.dataset.turbo = \"false\";\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 Core = 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.\nCore.listeners().forEach(function(listener) {\n document.addEventListener(listener, function() {\n Core.activate()\n })\n})\n\nCore.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 Core\n","import BookmarkToggle from 'blacklight/bookmark_toggle'\nimport ButtonFocus from 'blacklight/button_focus'\nimport FacetSuggest from 'blacklight/facet_suggest'\nimport Modal from 'blacklight/modal'\nimport ModalForm from 'blacklight/modalForm'\nimport SearchContext from 'blacklight/search_context'\nimport Core from 'blacklight/core'\n\nexport default {\n BookmarkToggle,\n ButtonFocus,\n FacetSuggest,\n Modal,\n ModalForm,\n SearchContext,\n Core,\n onLoad: Core.onLoad\n}\n"],"names":[],"mappings":"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"}
|
@@ -27,3 +27,10 @@
|
|
27
27
|
border-bottom-left-radius: 0;
|
28
28
|
display: flex;
|
29
29
|
}
|
30
|
+
|
31
|
+
// ensure that the search bar appears at the top of the page when focused using
|
32
|
+
// anchor links, e.g. from the skip links navigation
|
33
|
+
.search-field,
|
34
|
+
.search-q {
|
35
|
+
scroll-margin: 5rem;
|
36
|
+
}
|
@@ -10,10 +10,10 @@
|
|
10
10
|
|
11
11
|
<div class="sort-options btn-group">
|
12
12
|
<% if @facet_field.paginator.sort == 'index' -%>
|
13
|
-
<span class="active az
|
14
|
-
<%= helpers.link_to(t('blacklight.search.facets.sort.count'), sort_facet_url('count'), class: "sort_change numeric
|
13
|
+
<span class="active az <%= @button_classes %>"><%= t('blacklight.search.facets.sort.index') %></span>
|
14
|
+
<%= helpers.link_to(t('blacklight.search.facets.sort.count'), sort_facet_url('count'), class: "sort_change numeric #{@button_classes}", data: { blacklight_modal: "preserve" }) %>
|
15
15
|
<% elsif @facet_field.paginator.sort == 'count' -%>
|
16
|
-
<%= helpers.link_to(t('blacklight.search.facets.sort.index'), sort_facet_url('index'), class: "sort_change az
|
17
|
-
<span class="active numeric
|
16
|
+
<%= helpers.link_to(t('blacklight.search.facets.sort.index'), sort_facet_url('index'), class: "sort_change az #{@button_classes}", data: { blacklight_modal: "preserve" }) %>
|
17
|
+
<span class="active numeric <%= @button_classes %>"><%= t('blacklight.search.facets.sort.count') %></span>
|
18
18
|
<% end -%>
|
19
19
|
</div>
|
@@ -2,8 +2,9 @@
|
|
2
2
|
|
3
3
|
module Blacklight
|
4
4
|
class FacetFieldPaginationComponent < Blacklight::Component
|
5
|
-
def initialize(facet_field:)
|
5
|
+
def initialize(facet_field:, button_classes: %w[btn btn-outline-secondary])
|
6
6
|
@facet_field = facet_field
|
7
|
+
@button_classes = button_classes.join(' ')
|
7
8
|
end
|
8
9
|
|
9
10
|
def sort_facet_url(sort)
|
@@ -142,7 +142,11 @@ module Blacklight::CatalogHelperBehavior
|
|
142
142
|
facet_config = facet_configuration_for_field(facet)
|
143
143
|
filter_label = facet_field_label(facet_config.key)
|
144
144
|
filter_value = if values.size < 3
|
145
|
-
values.map
|
145
|
+
values.map do |value|
|
146
|
+
label = facet_item_presenter(facet_config, value, facet).label
|
147
|
+
label = strip_tags(label) if label.html_safe?
|
148
|
+
label
|
149
|
+
end.to_sentence
|
146
150
|
else
|
147
151
|
t('blacklight.search.page_title.many_constraint_values', values: values.size)
|
148
152
|
end
|
@@ -6,7 +6,7 @@ const FacetSuggest = async (e) => {
|
|
6
6
|
const facetField = e.target.dataset.facetField;
|
7
7
|
if (!facetField) { return; }
|
8
8
|
|
9
|
-
const urlToFetch = `/catalog/facet_suggest/${facetField}/${queryFragment}`
|
9
|
+
const urlToFetch = `/catalog/facet_suggest/${facetField}/${queryFragment}${window.location.search}`
|
10
10
|
const response = await fetch(urlToFetch);
|
11
11
|
if (response.ok) {
|
12
12
|
const blob = await response.blob()
|
data/compose.yaml
CHANGED
@@ -23,6 +23,7 @@ services:
|
|
23
23
|
environment:
|
24
24
|
- SOLR_PORT # Set via environment variable or use default defined in .env file
|
25
25
|
- SOLR_VERSION # Set via environment variable or use default defined in .env file
|
26
|
+
- SOLR_MODULES=analysis-extras
|
26
27
|
image: "solr:${SOLR_VERSION}"
|
27
28
|
volumes:
|
28
29
|
- $PWD/lib/generators/blacklight/templates/solr/conf:/opt/solr/conf
|
@@ -16,7 +16,7 @@
|
|
16
16
|
</updateLog>
|
17
17
|
</updateHandler>
|
18
18
|
|
19
|
-
<!-- solr lib dirs -->
|
19
|
+
<!-- solr lib dirs, which are needed for Solr 8 compatibility but ignored in solr 9.8 and above -->
|
20
20
|
<lib dir="${solr.install.dir:../../../..}/modules/analysis-extras/lib" />
|
21
21
|
<lib dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lib" />
|
22
22
|
<lib dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lucene-libs" />
|
data/package.json
CHANGED
@@ -117,6 +117,14 @@ RSpec.describe "Facets" do
|
|
117
117
|
expect(page).to have_link 'Old age'
|
118
118
|
expect(page).to have_css 'a.facet-select', count: 2
|
119
119
|
end
|
120
|
+
|
121
|
+
it 'shows the user facet suggestions that are relevant to their q param', :js do
|
122
|
+
visit '/catalog/facet/subject_ssim?q=tibet&search_field=all_fields'
|
123
|
+
fill_in 'facet_suggest_subject_ssim', with: 'la'
|
124
|
+
|
125
|
+
expect(page).to have_link 'Tibetan language'
|
126
|
+
expect(page).to have_css 'a.facet-select', count: 1
|
127
|
+
end
|
120
128
|
end
|
121
129
|
end
|
122
130
|
end
|
@@ -261,6 +261,14 @@ RSpec.describe CatalogHelper do
|
|
261
261
|
it "renders a facet with more than two values" do
|
262
262
|
expect(helper.render_search_to_page_title_filter('foo', %w[bar baz foobar])).to eq "Foo: 3 selected"
|
263
263
|
end
|
264
|
+
|
265
|
+
it "strips tags from html_safe values" do
|
266
|
+
expect(helper.render_search_to_page_title_filter('Year', ['<span class="from" data-blrl-begin="1990">1990</span> to <span class="to" data-blrl-end="1999">1999</span>'.html_safe])).to eq "Year: 1990 to 1999"
|
267
|
+
end
|
268
|
+
|
269
|
+
it "does not strip tags from non-html_safe values" do
|
270
|
+
expect(helper.render_search_to_page_title_filter('Folder', ['Some > Nested > <span>Hierarchy</span>'])).to eq "Folder: Some > Nested > <span>Hierarchy</span>"
|
271
|
+
end
|
264
272
|
end
|
265
273
|
|
266
274
|
describe "#render_search_to_page_title" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blacklight
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 8.8.
|
4
|
+
version: 8.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Rochkind
|
@@ -14,10 +14,9 @@ authors:
|
|
14
14
|
- Dan Funk
|
15
15
|
- Naomi Dushay
|
16
16
|
- Justin Coyne
|
17
|
-
autorequire:
|
18
17
|
bindir: exe
|
19
18
|
cert_chain: []
|
20
|
-
date: 2025-
|
19
|
+
date: 2025-02-04 00:00:00.000000000 Z
|
21
20
|
dependencies:
|
22
21
|
- !ruby/object:Gem::Dependency
|
23
22
|
name: rails
|
@@ -1006,7 +1005,6 @@ homepage: http://projectblacklight.org/
|
|
1006
1005
|
licenses:
|
1007
1006
|
- Apache 2.0
|
1008
1007
|
metadata: {}
|
1009
|
-
post_install_message:
|
1010
1008
|
rdoc_options: []
|
1011
1009
|
require_paths:
|
1012
1010
|
- lib
|
@@ -1021,8 +1019,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1021
1019
|
- !ruby/object:Gem::Version
|
1022
1020
|
version: '0'
|
1023
1021
|
requirements: []
|
1024
|
-
rubygems_version: 3.
|
1025
|
-
signing_key:
|
1022
|
+
rubygems_version: 3.6.3
|
1026
1023
|
specification_version: 4
|
1027
1024
|
summary: Blacklight provides a discovery interface for any Solr (http://lucene.apache.org/solr)
|
1028
1025
|
index.
|