blacklight 9.1.0 → 9.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f2b7ef7b0e6e3924f62386fe3616e459ffc84875ceb3f9a00b225f765de60c87
4
- data.tar.gz: b4b9154df43849054ab080a1e904a38aae03e0fdf35cd0d4d6b5f3c2256ea4e8
3
+ metadata.gz: 796b61a9e49f3a1fd99017bcd810cf1d6a497156e4389b047ab977a0cff13e22
4
+ data.tar.gz: 62b9dc70cb54ade0ee25c5b3704fbd98396235052831c28f73b630bc34be3f62
5
5
  SHA512:
6
- metadata.gz: 22c974165abd744e806c376dfb91700868b821e461bc8229b32318192413f09e74b6e6ba6ede7640cc42b55806eb5c7d7ed5aa462b1d272caf87fb77c5508d0e
7
- data.tar.gz: abad542f7ddd3ac0ecab4d7de65825a29815de79ee30ed4318bbcc09ff9e24ceae22310526d7849503bdff0ac45fe16ad60a131d23503f2bf29042f9cbd4ce38
6
+ metadata.gz: 695f162e8b29894d856176eba6354017897777aa01eccf6e706c3c2312ebcef27c9d5483440e0b8ce2b39c7c675205c8dfe2c2e0a29e29c0220fda84a637ab35
7
+ data.tar.gz: 99fb5e3eff927b49862fe5925ecac89ee5443f4d1861d3b608248d4c5b3c123db4b8c87b02fed345252b0f1b009f7f0cb2cb75d38614970d85b2a17dec9a8393
@@ -9,7 +9,7 @@ jobs:
9
9
  build:
10
10
  runs-on: ubuntu-latest
11
11
  steps:
12
- - uses: actions/checkout@v4
12
+ - uses: actions/checkout@v7
13
13
  with:
14
14
  ref: ${{ inputs.ref }}
15
15
  - name: Build docker image
@@ -9,7 +9,7 @@ jobs:
9
9
  lint:
10
10
  runs-on: ubuntu-latest
11
11
  steps:
12
- - uses: actions/checkout@v4
12
+ - uses: actions/checkout@v7
13
13
  with:
14
14
  ref: ${{ inputs.ref }}
15
15
  - name: Set up Ruby
@@ -13,7 +13,7 @@ jobs:
13
13
  matrix: ${{ steps.matrix.outputs.matrix }}
14
14
  steps:
15
15
  - name: Checkout repository
16
- uses: actions/checkout@v3
16
+ uses: actions/checkout@v7
17
17
  with:
18
18
  ref: ${{ inputs.ref }}
19
19
  - name: Echo ./.github/matrix.json
@@ -38,7 +38,7 @@ jobs:
38
38
  ENGINE_CART_RAILS_OPTIONS: "--skip-git --skip-listen --skip-spring --skip-keeps --skip-kamal --skip-thruster --skip-solid --skip-coffee --skip-test ${{ matrix.additional_engine_cart_rails_options }}"
39
39
  BUNDLER_VERSION: ${{ matrix.bundler_version || '2.7.2' }}
40
40
  steps:
41
- - uses: actions/checkout@v4
41
+ - uses: actions/checkout@v7
42
42
  with:
43
43
  ref: ${{ inputs.ref }}
44
44
  - name: Set up Ruby
data/VERSION CHANGED
@@ -1 +1 @@
1
- 9.1.0
1
+ 9.2.0
@@ -1 +1 @@
1
- {"version":3,"file":"blacklight.esm.js","sources":["../../../javascript/blacklight-frontend/checkbox_submit.js","../../../javascript/blacklight-frontend/bookmark_toggle.js","../../../javascript/blacklight-frontend/button_focus.js","../../../javascript/blacklight-frontend/core.js","../../../javascript/blacklight-frontend/color_theme_switcher.js","../../../javascript/blacklight-frontend/debounce.js","../../../javascript/blacklight-frontend/facet_suggest.js","../../../javascript/blacklight-frontend/modal.js","../../../javascript/blacklight-frontend/search_context.js","../../../javascript/blacklight-frontend/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.\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 // For accessibility return keyboard focus\n // back to the checkbox after form submission\n this.checkboxTarget.focus()\n this.updateStateFor(!this.checked)\n this.bookmarksCounter().forEach(counter => {\n counter.innerHTML = json.bookmarks.count;\n });\n\n var e = new CustomEvent('bookmark.blacklight', { detail: { checked: this.checked }, bubbles: true });\n this.formTarget.dispatchEvent(e)\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 if (state) { this.checkboxTarget.setAttribute('checked', state) }\n else { this.checkboxTarget.removeAttribute('checked') }\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-frontend/checkbox_submit'\n\nconst BookmarkToggle = (e) => {\n const elementType = e.target.getAttribute('data-checkboxsubmit-target');\n if (elementType == 'checkbox' || elementType == 'label') {\n const form = e.target.closest('form');\n if (form) new CheckboxSubmit(form).clicked(e);\n if (e.code == 'Space') e.preventDefault();\n }\n};\n\ndocument.addEventListener('click', BookmarkToggle);\ndocument.addEventListener('keydown', function (e) {\n if (e.key === 'Enter' || e.code == 'Space') { BookmarkToggle(e); } }\n);\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-bs-toggle=\"collapse\"]')) {\n e.target.focus()\n }\n}\n\ndocument.addEventListener('click', ButtonFocus)\n\nexport default ButtonFocus\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 {\n listeners.push('DOMContentLoaded');\n }\n\n return listeners;\n }\n };\n}();\n\n// turbo triggers turbo:load events on page transition\n// If app isn't using turbo, 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","/*!\n * Color mode toggler for Blacklight\n * Based on Bootstrap's color mode toggler (https://getbootstrap.com/docs/5.3/customize/color-modes/#javascript)\n */\n\nimport Core from 'blacklight-frontend/core'\n\nconst ColorThemeSwitcher = (() => {\n 'use strict'\n\n const getStoredTheme = () => localStorage.getItem('theme')\n const setStoredTheme = theme => localStorage.setItem('theme', theme)\n\n const getPreferredTheme = () => {\n const storedTheme = getStoredTheme()\n if (storedTheme) {\n return storedTheme\n }\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n }\n\n const setTheme = theme => {\n if (theme === 'auto') {\n document.documentElement.setAttribute('data-bs-theme', window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')\n } else {\n document.documentElement.setAttribute('data-bs-theme', theme)\n }\n }\n\n const showActiveTheme = (theme, focus = false) => {\n const themeSwitcher = document.querySelector('#bl-theme-switcher')\n if (!themeSwitcher) return\n\n // Reset all dropdown items\n document.querySelectorAll('[data-bs-theme-value]').forEach(element => {\n element.classList.remove('active')\n element.setAttribute('aria-pressed', 'false')\n const check = element.querySelector('.bl-theme-check')\n if (check) check.classList.add('d-none')\n })\n\n // Activate the selected item\n const btnToActive = document.querySelector(`[data-bs-theme-value=\"${theme}\"]`)\n if (btnToActive) {\n btnToActive.classList.add('active')\n btnToActive.setAttribute('aria-pressed', 'true')\n const check = btnToActive.querySelector('.bl-theme-check')\n if (check) check.classList.remove('d-none')\n }\n\n // Swap the toggle button icon\n themeSwitcher.querySelectorAll('.bl-theme-icon').forEach(icon => icon.classList.add('d-none'))\n const activeIcon = themeSwitcher.querySelector(`.bl-theme-icon[data-bl-theme-icon=\"${theme}\"]`)\n if (activeIcon) activeIcon.classList.remove('d-none')\n\n themeSwitcher.setAttribute('aria-label', `Toggle theme (${theme})`)\n\n if (focus) {\n themeSwitcher.focus()\n }\n }\n\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {\n const storedTheme = getStoredTheme()\n if (storedTheme !== 'light' && storedTheme !== 'dark') {\n setTheme(getPreferredTheme())\n }\n })\n\n document.addEventListener('click', e => {\n const btn = e.target.closest('[data-bs-theme-value]')\n if (!btn) return\n\n const theme = btn.getAttribute('data-bs-theme-value')\n setStoredTheme(theme)\n setTheme(theme)\n showActiveTheme(theme, true)\n })\n\n Core.onLoad(() => showActiveTheme(getPreferredTheme()))\n\n return { setTheme, getPreferredTheme, showActiveTheme }\n})()\n\nexport default ColorThemeSwitcher\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-frontend/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 const facetArea = document.querySelector('.facet-extended-list');\n const prevNextLinks = document.querySelectorAll('.prev_next_links');\n\n if (!facetField) { return; }\n\n // Get the search params from the current query so the facet suggestions\n // can retain that context.\n const facetSearchContext = e.target.dataset.facetSearchContext;\n const url = new URL(facetSearchContext, window.location.origin);\n\n // Drop facet.page so a filtered suggestion list will always start on page 1\n url.searchParams.delete('facet.page');\n // add our queryFragment for facet filtering\n url.searchParams.append('query_fragment', queryFragment);\n\n const facetSearchParams = url.searchParams.toString();\n const basePathComponent = url.pathname.split('/')[1];\n\n const urlToFetch = `/${basePathComponent}/facet_suggest/${facetField}?${facetSearchParams}`;\n\n const response = await fetch(urlToFetch);\n if (response.ok) {\n const blob = await response.blob()\n const text = await blob.text()\n\n if (text && facetArea) {\n facetArea.innerHTML = text\n }\n }\n\n // Hide the prev/next links when a user enters text in the facet\n // suggestion input. They don't work with a filtered list.\n prevNextLinks.forEach(element => {\n element.classList.toggle('invisible', !!queryFragment);\n });\n\n // Add a class to distinguish suggested facet values vs. regular.\n facetArea.classList.toggle('facet-suggestions', !!queryFragment);\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=\"btn-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\" data-bl-dismiss=\"modal\" aria-label=\"Close\">\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 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.closest('a').getAttribute('href')\n fetch(href, { headers: { 'X-Requested-With': 'XMLHttpRequest' }})\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 // Make sure user-agent dismissal of html 'dialog', etc `esc` key, triggers\n // our hide logic, including events and scroll restoration.\n const modalDom = modal.target();\n if (modalDom) {\n modal.target().addEventListener('cancel', (e) => {\n e.preventDefault(); // 'hide' will close the modal unless cancelled\n\n modal.hide();\n });\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 // Turn body scrolling back to what it was\n document.body.style[\"overflow\"] = modal.originalBodyOverflow;\n document.body.style[\"padding-right\"] = modal.originalBodyPaddingRight;\n modal.originalBodyOverflow = undefined;\n modal.originalBodyPaddingRight = undefined;\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 // Turn off body scrolling\n modal.originalBodyOverflow = document.body.style['overflow'];\n modal.originalBodyPaddingRight = document.body.style['padding-right'];\n document.body.style[\"overflow\"] = \"hidden\"\n document.body.style[\"padding-right\"] = \"0px\"\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","const SearchContext = (e) => {\n const contextLink = e.target.closest('[data-context-href]')\n if (contextLink) {\n SearchContext.handleSearchContextMethod.call(contextLink, 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","import BookmarkToggle from 'blacklight-frontend/bookmark_toggle'\nimport ButtonFocus from 'blacklight-frontend/button_focus'\nimport ColorThemeSwitcher from 'blacklight-frontend/color_theme_switcher'\nimport FacetSuggest from 'blacklight-frontend/facet_suggest'\nimport Modal from 'blacklight-frontend/modal'\nimport SearchContext from 'blacklight-frontend/search_context'\nimport Core from 'blacklight-frontend/core'\n\nexport default {\n BookmarkToggle,\n ButtonFocus,\n ColorThemeSwitcher,\n FacetSuggest,\n Modal,\n SearchContext,\n Core,\n onLoad: Core.onLoad\n}\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,MAAM,cAAc,CAAC;AACpC,EAAE,WAAW,CAAC,IAAI,EAAE;AACpB,IAAI,IAAI,CAAC,IAAI,GAAG;AAChB;;AAEA,EAAE,OAAO,CAAC,GAAG,EAAE;AACf,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,iBAAiB;AACxE,IAAI,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC;AACzD,IAAI,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC;AAC5D,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE;AAClD,MAAM,IAAI,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;AACzC,MAAM,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;AAClE,MAAM,OAAO,EAAE;AACf,QAAQ,QAAQ,EAAE,kBAAkB;AACpC,QAAQ,kBAAkB,EAAE,gBAAgB;AAC5C,QAAQ,cAAc,EAAE,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC,EAAE;AACzE;AACA,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK;AAC1B,MAAM,IAAI,QAAQ,CAAC,EAAE,EAAE,OAAO,QAAQ,CAAC,IAAI,EAAE;AAC7C,MAAM,OAAO,OAAO,CAAC,MAAM,CAAC,qBAAqB;AACjD,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK;AACtB,MAAM,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,UAAU;AACjD,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,UAAU;AACpD;AACA;AACA,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK;AAC/B,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,OAAO;AACvC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI;AACjD,QAAQ,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK;AAChD,OAAO,CAAC;;AAER,MAAM,IAAI,CAAC,GAAG,IAAI,WAAW,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC1G,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AACrC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK;AACxB,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK;AAC5B,KAAK;AACL;;AAEA,EAAE,IAAI,OAAO,GAAG;AAChB,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,mCAAmC,CAAC,CAAC,MAAM,IAAI,CAAC;AACvF;;AAEA,EAAE,IAAI,UAAU,GAAG;AACnB,IAAI,OAAO,IAAI,CAAC;AAChB;;AAEA,EAAE,IAAI,WAAW,GAAG;AACpB,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,sCAAsC;AACzE;;AAEA,EAAE,IAAI,cAAc,GAAG;AACvB,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,yCAAyC;AAC5E;;AAEA,EAAE,IAAI,UAAU,GAAG;AACnB,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,qCAAqC;AACxE;;AAEA,EAAE,gBAAgB,GAAG;AACrB,IAAI,OAAO,QAAQ,CAAC,gBAAgB,CAAC,gCAAgC;AACrE;;AAEA,EAAE,WAAW,GAAG;AAChB,IAAI,KAAK,CAAC,2CAA2C;AACrD;;AAEA,EAAE,cAAc,CAAC,KAAK,EAAE;AACxB,IAAI,IAAI,KAAK,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,EAAC;AACnE,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,SAAS,EAAC;;AAEzD,IAAI,IAAI,KAAK,EAAE;AACf,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS;AAC9C;AACA;AACA,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC,KAAK,GAAG;AACnE,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc;AACvE,KAAK,MAAM;AACX,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS;AACjD,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC,KAAK,GAAG;AACnE,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa;AACtE;AACA;AACA;;AC/FA,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK;AAC9B,EAAE,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,4BAA4B,CAAC;AACzE,EAAE,IAAI,WAAW,IAAI,UAAU,IAAI,WAAW,IAAI,OAAO,EAAE;AAC3D,IAAI,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;AACzC,IAAI,IAAI,IAAI,EAAE,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACjD,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC,cAAc,EAAE;AAC7C;AACA,CAAC;;AAED,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,cAAc,CAAC;AAClD,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE;AAClD,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE;AACpE,CAAC;;ACdD,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK;AAC3B;AACA;AACA;AACA,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,EAAE;AACvD,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK;AAClB;AACA;;AAEA,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW;;ACT9C,MAAM,IAAI,GAAG,WAAW;AACxB,EAAE,MAAM,MAAM,GAAG,IAAI,KAAK;AAC1B,EAAE,OAAO;AACT,IAAI,MAAM,EAAE,SAAS,IAAI,EAAE;AAC3B,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AACvB,KAAK;;AAEL,IAAI,QAAQ,EAAE,WAAW;AACzB,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC7C,QAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AACxB;AACA,KAAK;;AAEL,IAAI,SAAS,EAAE,YAAY;AAC3B,MAAM,MAAM,SAAS,GAAG,EAAE;AAC1B,MAAM,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;AACxC,QAAQ,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC;AACxD,OAAO,MAAM;AACb,QAAQ,SAAS,CAAC,IAAI,CAAC,kBAAkB,CAAC;AAC1C;;AAEA,MAAM,OAAO,SAAS;AACtB;AACA,GAAG;AACH,CAAC,EAAE;;AAEH;AACA;AACA,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,SAAS,QAAQ,EAAE;AAC5C,EAAE,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,WAAW;AACjD,IAAI,IAAI,CAAC,QAAQ;AACjB,GAAG;AACH,CAAC;;AAED,IAAI,CAAC,MAAM,CAAC,YAAY;AACxB,EAAE,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;;AAE/C;AACA;AACA,EAAE,IAAI,CAAC,IAAI,EAAE;;AAEb,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO;AAC/B,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI;AACzB,CAAC;;AC3CD;AACA;AACA;AACA;;;AAIA,MAAM,kBAAkB,GAAG,CAAC,MAAM;;AAGlC,EAAE,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,OAAO;AAC3D,EAAE,MAAM,cAAc,GAAG,KAAK,IAAI,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK;;AAErE,EAAE,MAAM,iBAAiB,GAAG,MAAM;AAClC,IAAI,MAAM,WAAW,GAAG,cAAc;AACtC,IAAI,IAAI,WAAW,EAAE;AACrB,MAAM,OAAO;AACb;AACA,IAAI,OAAO,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO,GAAG,MAAM,GAAG;AAChF;;AAEA,EAAE,MAAM,QAAQ,GAAG,KAAK,IAAI;AAC5B,IAAI,IAAI,KAAK,KAAK,MAAM,EAAE;AAC1B,MAAM,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO,GAAG,MAAM,GAAG,OAAO;AACzI,KAAK,MAAM;AACX,MAAM,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,eAAe,EAAE,KAAK;AAClE;AACA;;AAEA,EAAE,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,KAAK;AACpD,IAAI,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,oBAAoB;AACrE,IAAI,IAAI,CAAC,aAAa,EAAE;;AAExB;AACA,IAAI,QAAQ,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI;AAC1E,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ;AACvC,MAAM,OAAO,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO;AAClD,MAAM,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,iBAAiB;AAC3D,MAAM,IAAI,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ;AAC7C,KAAK;;AAEL;AACA,IAAI,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC;AACjF,IAAI,IAAI,WAAW,EAAE;AACrB,MAAM,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ;AACxC,MAAM,WAAW,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM;AACrD,MAAM,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,CAAC,iBAAiB;AAC/D,MAAM,IAAI,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ;AAChD;;AAEA;AACA,IAAI,aAAa,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AACjG,IAAI,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC,mCAAmC,EAAE,KAAK,CAAC,EAAE,CAAC;AAClG,IAAI,IAAI,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ;;AAExD,IAAI,aAAa,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC;;AAEtE,IAAI,IAAI,KAAK,EAAE;AACf,MAAM,aAAa,CAAC,KAAK;AACzB;AACA;;AAEA,EAAE,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM;AACrF,IAAI,MAAM,WAAW,GAAG,cAAc;AACtC,IAAI,IAAI,WAAW,KAAK,OAAO,IAAI,WAAW,KAAK,MAAM,EAAE;AAC3D,MAAM,QAAQ,CAAC,iBAAiB,EAAE;AAClC;AACA,GAAG;;AAEH,EAAE,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,IAAI;AAC1C,IAAI,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,uBAAuB;AACxD,IAAI,IAAI,CAAC,GAAG,EAAE;;AAEd,IAAI,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,qBAAqB;AACxD,IAAI,cAAc,CAAC,KAAK;AACxB,IAAI,QAAQ,CAAC,KAAK;AAClB,IAAI,eAAe,CAAC,KAAK,EAAE,IAAI;AAC/B,GAAG;;AAEH,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,eAAe,CAAC,iBAAiB,EAAE,CAAC;;AAExD,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,eAAe;AACvD,CAAC;;AClFD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAS,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,GAAG,EAAE;AACtD,IAAI,IAAI,KAAK;AACb,IAAI,OAAO,CAAC,GAAG,IAAI,KAAK;AACxB,MAAM,YAAY,CAAC,KAAK,CAAC;AACzB,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC;AACpE,KAAK;AACL;;ACZA,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK;AAClC,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE;AAC1C,IAAI,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE;AAChD,IAAI,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU;AAClD,IAAI,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,sBAAsB,CAAC;AACpE,IAAI,MAAM,aAAa,GAAG,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,CAAC;;AAEvE,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO;;AAE9B;AACA;AACA,IAAI,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB;AAClE,IAAI,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;;AAEnE;AACA,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC;AACzC;AACA,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC;;AAE5D,IAAI,MAAM,iBAAiB,GAAG,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE;AACzD,IAAI,MAAM,iBAAiB,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAExD,IAAI,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,iBAAiB,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;;AAE/F,IAAI,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC;AAC5C,IAAI,IAAI,QAAQ,CAAC,EAAE,EAAE;AACrB,QAAQ,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI;AACxC,QAAQ,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI;;AAEpC,QAAQ,IAAI,IAAI,IAAI,SAAS,EAAE;AAC/B,YAAY,SAAS,CAAC,SAAS,GAAG;AAClC;AACA;;AAEA;AACA;AACA,IAAI,aAAa,CAAC,OAAO,CAAC,OAAO,IAAI;AACrC,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,aAAa,CAAC;AAC5D,KAAK,CAAC;;AAEN;AACA,IAAI,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,aAAa,CAAC;AACpE;AACA,CAAC;;AAED,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;;AC/C1D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA,MAAM,KAAK,GAAG,CAAC,MAAM;AACrB,EAAE,MAAM,KAAK,GAAG;;AAEhB;AACA,EAAE,KAAK,CAAC,aAAa,GAAG,mBAAmB;;AAE3C;AACA;AACA,EAAE,KAAK,CAAC,mBAAmB,IAAI,mCAAmC;;AAElE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,KAAK,CAAC,oBAAoB,GAAG,KAAK,CAAC,aAAa,GAAG,qCAAqC;;AAE1F,EAAE,KAAK,CAAC,iBAAiB,MAAM,oCAAoC;;AAEnE;AACA;AACA,EAAE,KAAK,CAAC,SAAS,GAAG,UAAU,KAAK,EAAE;AACrC,MAAM,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;;AAErD,MAAM,MAAM,QAAQ,GAAG,CAAC;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC;AACpC,cAAc;;AAEd,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,SAAS,GAAG;;AAEjE,MAAM,KAAK,CAAC,IAAI,EAAE;AAClB;;AAEA;AACA;AACA;AACA,EAAE,KAAK,CAAC,WAAW,GAAG,UAAU,QAAQ,EAAE;AAC1C,IAAI,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE;AACrC,IAAI,MAAM,GAAG,GAAG,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW;AAC/D;AACA,IAAI,IAAI,QAAQ,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC;AACxE,IAAI,MAAM,IAAI,GAAG,QAAQ,CAAC,sBAAsB;AAChD,IAAI,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE;AAC9B;AACA,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC;AAC1B;AACA,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;AACjD,IAAI,KAAK,CAAC,eAAe,CAAC,IAAI;;AAE9B,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,eAAe,CAAC,IAAI;;AAEvE;AACA,IAAI,IAAI,CAAC,GAAG,IAAI,WAAW,CAAC,oCAAoC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AACtG,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,CAAC;;AAElC;AACA,IAAI,IAAI,CAAC,CAAC,gBAAgB,EAAE;AAC5B,IAAI,KAAK,CAAC,IAAI,EAAE;AAChB,GAAG;;AAEH;AACA,EAAE,KAAK,CAAC,eAAe,GAAG,UAAU,IAAI,EAAE;AAC1C,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK;AACxD,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ;AACzD,MAAM,WAAW,CAAC,GAAG,GAAG,MAAM,CAAC;AAC/B,MAAM,WAAW,CAAC,KAAK,GAAG;AAC1B,MAAM,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM;AACxD,KAAK;AACL;;AAEA,EAAE,KAAK,CAAC,kBAAkB,GAAG,SAAS,CAAC,EAAE;AACzC,IAAI,CAAC,CAAC,cAAc,EAAE;AACtB,IAAI,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM;AAC1D,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,CAAC;AACpE,OAAO,IAAI,CAAC,QAAQ,IAAI;AACxB,SAAS,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AAC3B,WAAW,MAAM,IAAI,SAAS,CAAC,gBAAgB,CAAC;AAChD;AACA,SAAS,OAAO,QAAQ,CAAC,IAAI,EAAE;AAC/B,QAAQ;AACR,OAAO,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;AAC3C,OAAO,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;AAC5C,GAAG;;AAEH,EAAE,KAAK,CAAC,UAAU,GAAG,WAAW;AAChC;AACA;AACA;AACA;AACA;AACA,IAAI,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK;AAC9C,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC,EAAE,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;AACzF,QAAQ,KAAK,CAAC,kBAAkB,CAAC,CAAC;AAClC,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;AAC1G,QAAQ,KAAK,CAAC,IAAI;AAClB,KAAK;;AAEL;AACA;AACA,IAAI,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE;AACnC,IAAI,IAAI,QAAQ,EAAE;AAClB,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK;AACvD,QAAQ,CAAC,CAAC,cAAc,EAAE,CAAC;;AAE3B,QAAQ,KAAK,CAAC,IAAI,EAAE;AACpB,OAAO,CAAC;AACR;AACA,GAAG;;AAEH,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU,EAAE,EAAE;AAC7B,IAAI,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE;;AAE9B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;;AAEnB,IAAI,IAAI,CAAC,GAAG,IAAI,WAAW,CAAC,kCAAkC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AACpG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;;AAEvB,IAAI,GAAG,CAAC,KAAK;;AAEb;AACA,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,oBAAoB;AAChE,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,wBAAwB;AACzE,IAAI,KAAK,CAAC,oBAAoB,GAAG,SAAS;AAC1C,IAAI,KAAK,CAAC,wBAAwB,GAAG,SAAS;AAC9C;;AAEA,EAAE,KAAK,CAAC,IAAI,GAAG,SAAS,EAAE,EAAE;AAC5B,IAAI,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE;;AAE9B,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE;;AAElB,IAAI,IAAI,CAAC,GAAG,IAAI,WAAW,CAAC,kCAAkC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AACpG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;;AAEvB,IAAI,GAAG,CAAC,SAAS;;AAEjB;AACA,IAAI,KAAK,CAAC,oBAAoB,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;AAChE,IAAI,KAAK,CAAC,wBAAwB,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC;AACzE,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG;AACtC,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG;AAC3C;;AAEA,EAAE,KAAK,CAAC,MAAM,GAAG,WAAW;AAC5B,IAAI,OAAO,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC;AACtD;;AAEA,EAAE,KAAK,CAAC,UAAU;;AAElB,EAAE,OAAO,KAAK;AACd,CAAC;;ACrND,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK;AAC7B,EAAE,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB;AAC5D,EAAE,IAAI,WAAW,EAAE;AACnB,IAAI,aAAa,CAAC,yBAAyB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAC/D;AACA;;AAEA,aAAa,CAAC,SAAS,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC,EAAE;AACjF,aAAa,CAAC,SAAS,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC,EAAE;;AAEjF;AACA;AACA,aAAa,CAAC,yBAAyB,GAAG,SAAS,KAAK,EAAE;AAC1D,EAAE,MAAM,IAAI,GAAG;;AAEf;AACA,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,mBAAmB;AAClD,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ;AACzC,EAAE,IAAI,SAAS,GAAG,aAAa,CAAC,SAAS;AACzC,EAAE,IAAI,SAAS,GAAG,aAAa,CAAC,SAAS;AACzC,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM;AAC1C,EAAE,IAAI,CAAC,MAAM,GAAG;AAChB,EAAE,IAAI,CAAC,MAAM,GAAG;;;AAGhB,EAAE,IAAI,WAAW,GAAG,CAAC;AACrB,kCAAkC,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,kBAAkB;;AAEhF;AACA,EAAE,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE;AACrC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,OAAO;AAChC,IAAI,MAAM,GAAG,QAAQ;AACrB;;AAEA,EAAE,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE;AAC1D,IAAI,WAAW,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,kBAAkB;AACpF;;AAEA;AACA;AACA,EAAE,WAAW,IAAI;;AAEjB,EAAE,IAAI,MAAM,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;;AAEpD,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG;AACvB,EAAE,IAAI,CAAC,SAAS,GAAG;AACnB,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI;AAChC,EAAE,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,KAAK;;AAE7C,EAAE,KAAK,CAAC,cAAc;AACtB,CAAC;;AAED,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa;;AC5ChD,cAAe;AACf,EAAE,cAAc;AAChB,EAAE,WAAW;AACb,EAAE,kBAAkB;AACpB,EAAE,YAAY;AACd,EAAE,KAAK;AACP,EAAE,aAAa;AACf,EAAE,IAAI;AACN,EAAE,MAAM,EAAE,IAAI,CAAC;AACf;;;;"}
1
+ {"version":3,"file":"blacklight.esm.js","sources":["../../../javascript/blacklight-frontend/checkbox_submit.js","../../../javascript/blacklight-frontend/bookmark_toggle.js","../../../javascript/blacklight-frontend/button_focus.js","../../../javascript/blacklight-frontend/core.js","../../../javascript/blacklight-frontend/color_theme_switcher.js","../../../javascript/blacklight-frontend/debounce.js","../../../javascript/blacklight-frontend/facet_suggest.js","../../../javascript/blacklight-frontend/modal.js","../../../javascript/blacklight-frontend/search_context.js","../../../javascript/blacklight-frontend/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.\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 // For accessibility return keyboard focus\n // back to the checkbox after form submission\n this.checkboxTarget.focus()\n this.updateStateFor(!this.checked)\n this.bookmarksCounter().forEach(counter => {\n counter.innerHTML = json.bookmarks.count;\n });\n\n var e = new CustomEvent('bookmark.blacklight', { detail: { checked: this.checked }, bubbles: true });\n this.formTarget.dispatchEvent(e)\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 if (state) { this.checkboxTarget.setAttribute('checked', state) }\n else { this.checkboxTarget.removeAttribute('checked') }\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-frontend/checkbox_submit'\n\nconst BookmarkToggle = (e) => {\n const elementType = e.target.getAttribute('data-checkboxsubmit-target');\n if (elementType == 'checkbox' || elementType == 'label') {\n const form = e.target.closest('form');\n if (form) new CheckboxSubmit(form).clicked(e);\n if (e.code == 'Space') e.preventDefault();\n }\n};\n\ndocument.addEventListener('click', BookmarkToggle);\ndocument.addEventListener('keydown', function (e) {\n if (e.key === 'Enter' || e.code == 'Space') { BookmarkToggle(e); } }\n);\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-bs-toggle=\"collapse\"]')) {\n e.target.focus()\n }\n}\n\ndocument.addEventListener('click', ButtonFocus)\n\nexport default ButtonFocus\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 {\n listeners.push('DOMContentLoaded');\n }\n\n return listeners;\n }\n };\n}();\n\n// turbo triggers turbo:load events on page transition\n// If app isn't using turbo, 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","/*!\n * Color mode toggler for Blacklight\n * Based on Bootstrap's color mode toggler (https://getbootstrap.com/docs/5.3/customize/color-modes/#javascript)\n */\n\nimport Core from 'blacklight-frontend/core'\n\nconst ColorThemeSwitcher = (() => {\n 'use strict'\n\n const getStoredTheme = () => localStorage.getItem('theme')\n const setStoredTheme = theme => localStorage.setItem('theme', theme)\n\n const getPreferredTheme = () => {\n const storedTheme = getStoredTheme()\n if (storedTheme) {\n return storedTheme\n }\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n }\n\n const setTheme = theme => {\n if (theme === 'auto') {\n document.documentElement.setAttribute('data-bs-theme', window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')\n } else {\n document.documentElement.setAttribute('data-bs-theme', theme)\n }\n }\n\n const showActiveTheme = (theme, focus = false) => {\n const themeSwitcher = document.querySelector('#bl-theme-switcher')\n if (!themeSwitcher) return\n\n // Reset all dropdown items\n document.querySelectorAll('[data-bs-theme-value]').forEach(element => {\n element.classList.remove('active')\n element.setAttribute('aria-pressed', 'false')\n const check = element.querySelector('.bl-theme-check')\n if (check) check.classList.add('d-none')\n })\n\n // Activate the selected item\n const btnToActive = document.querySelector(`[data-bs-theme-value=\"${theme}\"]`)\n if (btnToActive) {\n btnToActive.classList.add('active')\n btnToActive.setAttribute('aria-pressed', 'true')\n const check = btnToActive.querySelector('.bl-theme-check')\n if (check) check.classList.remove('d-none')\n }\n\n // Swap the toggle button icon\n themeSwitcher.querySelectorAll('.bl-theme-icon').forEach(icon => icon.classList.add('d-none'))\n const activeIcon = themeSwitcher.querySelector(`.bl-theme-icon[data-bl-theme-icon=\"${theme}\"]`)\n if (activeIcon) activeIcon.classList.remove('d-none')\n\n themeSwitcher.setAttribute('aria-label', `Toggle theme (${theme})`)\n\n if (focus) {\n themeSwitcher.focus()\n }\n }\n\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {\n const storedTheme = getStoredTheme()\n if (storedTheme !== 'light' && storedTheme !== 'dark') {\n setTheme(getPreferredTheme())\n }\n })\n\n document.addEventListener('click', e => {\n const btn = e.target.closest('[data-bs-theme-value]')\n if (!btn) return\n\n const theme = btn.getAttribute('data-bs-theme-value')\n setStoredTheme(theme)\n setTheme(theme)\n showActiveTheme(theme, true)\n })\n\n Core.onLoad(() => showActiveTheme(getPreferredTheme()))\n\n return { setTheme, getPreferredTheme, showActiveTheme }\n})()\n\nexport default ColorThemeSwitcher\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-frontend/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 const facetArea = document.querySelector('.facet-extended-list');\n const prevNextLinks = document.querySelectorAll('.prev_next_links');\n\n if (!facetField) { return; }\n\n // Get the search params from the current query so the facet suggestions\n // can retain that context.\n const facetSearchContext = e.target.dataset.facetSearchContext;\n const url = new URL(facetSearchContext, window.location.origin);\n\n // Drop facet.page so a filtered suggestion list will always start on page 1\n url.searchParams.delete('facet.page');\n // add our queryFragment for facet filtering\n url.searchParams.append('query_fragment', queryFragment);\n\n const facetSearchParams = url.searchParams.toString();\n const basePathComponent = url.pathname.split('/')[1];\n\n const urlToFetch = `/${basePathComponent}/facet_suggest/${facetField}?${facetSearchParams}`;\n\n const response = await fetch(urlToFetch);\n if (response.ok) {\n const blob = await response.blob()\n const text = await blob.text()\n\n if (text && facetArea) {\n facetArea.innerHTML = text\n }\n }\n\n // Hide the prev/next links when a user enters text in the facet\n // suggestion input. They don't work with a filtered list.\n prevNextLinks.forEach(element => {\n element.classList.toggle('invisible', !!queryFragment);\n });\n\n // Add a class to distinguish suggested facet values vs. regular.\n facetArea.classList.toggle('facet-suggestions', !!queryFragment);\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=\"btn-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\" data-bl-dismiss=\"modal\" aria-label=\"Close\">\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 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.closest('a').getAttribute('href')\n fetch(href, { headers: { 'X-Requested-With': 'XMLHttpRequest' }})\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 // Make sure user-agent dismissal of html 'dialog', etc `esc` key, triggers\n // our hide logic, including events and scroll restoration.\n const modalDom = modal.target();\n if (modalDom) {\n modal.target().addEventListener('cancel', (e) => {\n e.preventDefault(); // 'hide' will close the modal unless cancelled\n\n modal.hide();\n });\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 // Turn body scrolling back to what it was\n document.body.style[\"overflow\"] = modal.originalBodyOverflow;\n document.body.style[\"padding-right\"] = modal.originalBodyPaddingRight;\n modal.originalBodyOverflow = undefined;\n modal.originalBodyPaddingRight = undefined;\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 // Turn off body scrolling\n modal.originalBodyOverflow = document.body.style['overflow'];\n modal.originalBodyPaddingRight = document.body.style['padding-right'];\n document.body.style[\"overflow\"] = \"hidden\"\n document.body.style[\"padding-right\"] = \"0px\"\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","const SearchContext = (e) => {\n const contextLink = e.target.closest('[data-context-href]')\n if (contextLink) {\n SearchContext.handleSearchContextMethod.call(contextLink, 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","import BookmarkToggle from 'blacklight-frontend/bookmark_toggle'\nimport ButtonFocus from 'blacklight-frontend/button_focus'\nimport ColorThemeSwitcher from 'blacklight-frontend/color_theme_switcher'\nimport FacetSuggest from 'blacklight-frontend/facet_suggest'\nimport Modal from 'blacklight-frontend/modal'\nimport SearchContext from 'blacklight-frontend/search_context'\nimport Core from 'blacklight-frontend/core'\n\nexport default {\n BookmarkToggle,\n ButtonFocus,\n ColorThemeSwitcher,\n FacetSuggest,\n Modal,\n SearchContext,\n Core,\n onLoad: Core.onLoad\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"blacklight.js","sources":["../../../javascript/blacklight-frontend/checkbox_submit.js","../../../javascript/blacklight-frontend/bookmark_toggle.js","../../../javascript/blacklight-frontend/button_focus.js","../../../javascript/blacklight-frontend/core.js","../../../javascript/blacklight-frontend/color_theme_switcher.js","../../../javascript/blacklight-frontend/debounce.js","../../../javascript/blacklight-frontend/facet_suggest.js","../../../javascript/blacklight-frontend/modal.js","../../../javascript/blacklight-frontend/search_context.js","../../../javascript/blacklight-frontend/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.\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 // For accessibility return keyboard focus\n // back to the checkbox after form submission\n this.checkboxTarget.focus()\n this.updateStateFor(!this.checked)\n this.bookmarksCounter().forEach(counter => {\n counter.innerHTML = json.bookmarks.count;\n });\n\n var e = new CustomEvent('bookmark.blacklight', { detail: { checked: this.checked }, bubbles: true });\n this.formTarget.dispatchEvent(e)\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 if (state) { this.checkboxTarget.setAttribute('checked', state) }\n else { this.checkboxTarget.removeAttribute('checked') }\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-frontend/checkbox_submit'\n\nconst BookmarkToggle = (e) => {\n const elementType = e.target.getAttribute('data-checkboxsubmit-target');\n if (elementType == 'checkbox' || elementType == 'label') {\n const form = e.target.closest('form');\n if (form) new CheckboxSubmit(form).clicked(e);\n if (e.code == 'Space') e.preventDefault();\n }\n};\n\ndocument.addEventListener('click', BookmarkToggle);\ndocument.addEventListener('keydown', function (e) {\n if (e.key === 'Enter' || e.code == 'Space') { BookmarkToggle(e); } }\n);\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-bs-toggle=\"collapse\"]')) {\n e.target.focus()\n }\n}\n\ndocument.addEventListener('click', ButtonFocus)\n\nexport default ButtonFocus\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 {\n listeners.push('DOMContentLoaded');\n }\n\n return listeners;\n }\n };\n}();\n\n// turbo triggers turbo:load events on page transition\n// If app isn't using turbo, 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","/*!\n * Color mode toggler for Blacklight\n * Based on Bootstrap's color mode toggler (https://getbootstrap.com/docs/5.3/customize/color-modes/#javascript)\n */\n\nimport Core from 'blacklight-frontend/core'\n\nconst ColorThemeSwitcher = (() => {\n 'use strict'\n\n const getStoredTheme = () => localStorage.getItem('theme')\n const setStoredTheme = theme => localStorage.setItem('theme', theme)\n\n const getPreferredTheme = () => {\n const storedTheme = getStoredTheme()\n if (storedTheme) {\n return storedTheme\n }\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n }\n\n const setTheme = theme => {\n if (theme === 'auto') {\n document.documentElement.setAttribute('data-bs-theme', window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')\n } else {\n document.documentElement.setAttribute('data-bs-theme', theme)\n }\n }\n\n const showActiveTheme = (theme, focus = false) => {\n const themeSwitcher = document.querySelector('#bl-theme-switcher')\n if (!themeSwitcher) return\n\n // Reset all dropdown items\n document.querySelectorAll('[data-bs-theme-value]').forEach(element => {\n element.classList.remove('active')\n element.setAttribute('aria-pressed', 'false')\n const check = element.querySelector('.bl-theme-check')\n if (check) check.classList.add('d-none')\n })\n\n // Activate the selected item\n const btnToActive = document.querySelector(`[data-bs-theme-value=\"${theme}\"]`)\n if (btnToActive) {\n btnToActive.classList.add('active')\n btnToActive.setAttribute('aria-pressed', 'true')\n const check = btnToActive.querySelector('.bl-theme-check')\n if (check) check.classList.remove('d-none')\n }\n\n // Swap the toggle button icon\n themeSwitcher.querySelectorAll('.bl-theme-icon').forEach(icon => icon.classList.add('d-none'))\n const activeIcon = themeSwitcher.querySelector(`.bl-theme-icon[data-bl-theme-icon=\"${theme}\"]`)\n if (activeIcon) activeIcon.classList.remove('d-none')\n\n themeSwitcher.setAttribute('aria-label', `Toggle theme (${theme})`)\n\n if (focus) {\n themeSwitcher.focus()\n }\n }\n\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {\n const storedTheme = getStoredTheme()\n if (storedTheme !== 'light' && storedTheme !== 'dark') {\n setTheme(getPreferredTheme())\n }\n })\n\n document.addEventListener('click', e => {\n const btn = e.target.closest('[data-bs-theme-value]')\n if (!btn) return\n\n const theme = btn.getAttribute('data-bs-theme-value')\n setStoredTheme(theme)\n setTheme(theme)\n showActiveTheme(theme, true)\n })\n\n Core.onLoad(() => showActiveTheme(getPreferredTheme()))\n\n return { setTheme, getPreferredTheme, showActiveTheme }\n})()\n\nexport default ColorThemeSwitcher\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-frontend/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 const facetArea = document.querySelector('.facet-extended-list');\n const prevNextLinks = document.querySelectorAll('.prev_next_links');\n\n if (!facetField) { return; }\n\n // Get the search params from the current query so the facet suggestions\n // can retain that context.\n const facetSearchContext = e.target.dataset.facetSearchContext;\n const url = new URL(facetSearchContext, window.location.origin);\n\n // Drop facet.page so a filtered suggestion list will always start on page 1\n url.searchParams.delete('facet.page');\n // add our queryFragment for facet filtering\n url.searchParams.append('query_fragment', queryFragment);\n\n const facetSearchParams = url.searchParams.toString();\n const basePathComponent = url.pathname.split('/')[1];\n\n const urlToFetch = `/${basePathComponent}/facet_suggest/${facetField}?${facetSearchParams}`;\n\n const response = await fetch(urlToFetch);\n if (response.ok) {\n const blob = await response.blob()\n const text = await blob.text()\n\n if (text && facetArea) {\n facetArea.innerHTML = text\n }\n }\n\n // Hide the prev/next links when a user enters text in the facet\n // suggestion input. They don't work with a filtered list.\n prevNextLinks.forEach(element => {\n element.classList.toggle('invisible', !!queryFragment);\n });\n\n // Add a class to distinguish suggested facet values vs. regular.\n facetArea.classList.toggle('facet-suggestions', !!queryFragment);\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=\"btn-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\" data-bl-dismiss=\"modal\" aria-label=\"Close\">\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 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.closest('a').getAttribute('href')\n fetch(href, { headers: { 'X-Requested-With': 'XMLHttpRequest' }})\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 // Make sure user-agent dismissal of html 'dialog', etc `esc` key, triggers\n // our hide logic, including events and scroll restoration.\n const modalDom = modal.target();\n if (modalDom) {\n modal.target().addEventListener('cancel', (e) => {\n e.preventDefault(); // 'hide' will close the modal unless cancelled\n\n modal.hide();\n });\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 // Turn body scrolling back to what it was\n document.body.style[\"overflow\"] = modal.originalBodyOverflow;\n document.body.style[\"padding-right\"] = modal.originalBodyPaddingRight;\n modal.originalBodyOverflow = undefined;\n modal.originalBodyPaddingRight = undefined;\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 // Turn off body scrolling\n modal.originalBodyOverflow = document.body.style['overflow'];\n modal.originalBodyPaddingRight = document.body.style['padding-right'];\n document.body.style[\"overflow\"] = \"hidden\"\n document.body.style[\"padding-right\"] = \"0px\"\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","const SearchContext = (e) => {\n const contextLink = e.target.closest('[data-context-href]')\n if (contextLink) {\n SearchContext.handleSearchContextMethod.call(contextLink, 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","import BookmarkToggle from 'blacklight-frontend/bookmark_toggle'\nimport ButtonFocus from 'blacklight-frontend/button_focus'\nimport ColorThemeSwitcher from 'blacklight-frontend/color_theme_switcher'\nimport FacetSuggest from 'blacklight-frontend/facet_suggest'\nimport Modal from 'blacklight-frontend/modal'\nimport SearchContext from 'blacklight-frontend/search_context'\nimport Core from 'blacklight-frontend/core'\n\nexport default {\n BookmarkToggle,\n ButtonFocus,\n ColorThemeSwitcher,\n FacetSuggest,\n Modal,\n SearchContext,\n Core,\n onLoad: Core.onLoad\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"blacklight.js","sources":["../../../javascript/blacklight-frontend/checkbox_submit.js","../../../javascript/blacklight-frontend/bookmark_toggle.js","../../../javascript/blacklight-frontend/button_focus.js","../../../javascript/blacklight-frontend/core.js","../../../javascript/blacklight-frontend/color_theme_switcher.js","../../../javascript/blacklight-frontend/debounce.js","../../../javascript/blacklight-frontend/facet_suggest.js","../../../javascript/blacklight-frontend/modal.js","../../../javascript/blacklight-frontend/search_context.js","../../../javascript/blacklight-frontend/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.\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 // For accessibility return keyboard focus\n // back to the checkbox after form submission\n this.checkboxTarget.focus()\n this.updateStateFor(!this.checked)\n this.bookmarksCounter().forEach(counter => {\n counter.innerHTML = json.bookmarks.count;\n });\n\n var e = new CustomEvent('bookmark.blacklight', { detail: { checked: this.checked }, bubbles: true });\n this.formTarget.dispatchEvent(e)\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 if (state) { this.checkboxTarget.setAttribute('checked', state) }\n else { this.checkboxTarget.removeAttribute('checked') }\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-frontend/checkbox_submit'\n\nconst BookmarkToggle = (e) => {\n const elementType = e.target.getAttribute('data-checkboxsubmit-target');\n if (elementType == 'checkbox' || elementType == 'label') {\n const form = e.target.closest('form');\n if (form) new CheckboxSubmit(form).clicked(e);\n if (e.code == 'Space') e.preventDefault();\n }\n};\n\ndocument.addEventListener('click', BookmarkToggle);\ndocument.addEventListener('keydown', function (e) {\n if (e.key === 'Enter' || e.code == 'Space') { BookmarkToggle(e); } }\n);\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-bs-toggle=\"collapse\"]')) {\n e.target.focus()\n }\n}\n\ndocument.addEventListener('click', ButtonFocus)\n\nexport default ButtonFocus\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 {\n listeners.push('DOMContentLoaded');\n }\n\n return listeners;\n }\n };\n}();\n\n// turbo triggers turbo:load events on page transition\n// If app isn't using turbo, 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","/*!\n * Color mode toggler for Blacklight\n * Based on Bootstrap's color mode toggler (https://getbootstrap.com/docs/5.3/customize/color-modes/#javascript)\n */\n\nimport Core from 'blacklight-frontend/core'\n\nconst ColorThemeSwitcher = (() => {\n 'use strict'\n\n const getStoredTheme = () => localStorage.getItem('theme')\n const setStoredTheme = theme => localStorage.setItem('theme', theme)\n\n const getPreferredTheme = () => {\n const storedTheme = getStoredTheme()\n if (storedTheme) {\n return storedTheme\n }\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n }\n\n const setTheme = theme => {\n if (theme === 'auto') {\n document.documentElement.setAttribute('data-bs-theme', window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')\n } else {\n document.documentElement.setAttribute('data-bs-theme', theme)\n }\n }\n\n const showActiveTheme = (theme, focus = false) => {\n const themeSwitcher = document.querySelector('#bl-theme-switcher')\n if (!themeSwitcher) return\n\n // Reset all dropdown items\n document.querySelectorAll('[data-bs-theme-value]').forEach(element => {\n element.classList.remove('active')\n element.setAttribute('aria-pressed', 'false')\n const check = element.querySelector('.bl-theme-check')\n if (check) check.classList.add('d-none')\n })\n\n // Activate the selected item\n const btnToActive = document.querySelector(`[data-bs-theme-value=\"${theme}\"]`)\n if (btnToActive) {\n btnToActive.classList.add('active')\n btnToActive.setAttribute('aria-pressed', 'true')\n const check = btnToActive.querySelector('.bl-theme-check')\n if (check) check.classList.remove('d-none')\n }\n\n // Swap the toggle button icon\n themeSwitcher.querySelectorAll('.bl-theme-icon').forEach(icon => icon.classList.add('d-none'))\n const activeIcon = themeSwitcher.querySelector(`.bl-theme-icon[data-bl-theme-icon=\"${theme}\"]`)\n if (activeIcon) activeIcon.classList.remove('d-none')\n\n themeSwitcher.setAttribute('aria-label', `Toggle theme (${theme})`)\n\n if (focus) {\n themeSwitcher.focus()\n }\n }\n\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {\n const storedTheme = getStoredTheme()\n if (storedTheme !== 'light' && storedTheme !== 'dark') {\n setTheme(getPreferredTheme())\n }\n })\n\n document.addEventListener('click', e => {\n const btn = e.target.closest('[data-bs-theme-value]')\n if (!btn) return\n\n const theme = btn.getAttribute('data-bs-theme-value')\n setStoredTheme(theme)\n setTheme(theme)\n showActiveTheme(theme, true)\n })\n\n Core.onLoad(() => showActiveTheme(getPreferredTheme()))\n\n return { setTheme, getPreferredTheme, showActiveTheme }\n})()\n\nexport default ColorThemeSwitcher\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-frontend/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 const facetArea = document.querySelector('.facet-extended-list');\n const prevNextLinks = document.querySelectorAll('.prev_next_links');\n\n if (!facetField) { return; }\n\n // Get the search params from the current query so the facet suggestions\n // can retain that context.\n const facetSearchContext = e.target.dataset.facetSearchContext;\n const url = new URL(facetSearchContext, window.location.origin);\n\n // Drop facet.page so a filtered suggestion list will always start on page 1\n url.searchParams.delete('facet.page');\n // add our queryFragment for facet filtering\n url.searchParams.append('query_fragment', queryFragment);\n\n const facetSearchParams = url.searchParams.toString();\n const basePathComponent = url.pathname.split('/')[1];\n\n const urlToFetch = `/${basePathComponent}/facet_suggest/${facetField}?${facetSearchParams}`;\n\n const response = await fetch(urlToFetch);\n if (response.ok) {\n const blob = await response.blob()\n const text = await blob.text()\n\n if (text && facetArea) {\n facetArea.innerHTML = text\n }\n }\n\n // Hide the prev/next links when a user enters text in the facet\n // suggestion input. They don't work with a filtered list.\n prevNextLinks.forEach(element => {\n element.classList.toggle('invisible', !!queryFragment);\n });\n\n // Add a class to distinguish suggested facet values vs. regular.\n facetArea.classList.toggle('facet-suggestions', !!queryFragment);\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=\"btn-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\" data-bl-dismiss=\"modal\" aria-label=\"Close\">\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 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.closest('a').getAttribute('href')\n fetch(href, { headers: { 'X-Requested-With': 'XMLHttpRequest' }})\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 // Make sure user-agent dismissal of html 'dialog', etc `esc` key, triggers\n // our hide logic, including events and scroll restoration.\n const modalDom = modal.target();\n if (modalDom) {\n modal.target().addEventListener('cancel', (e) => {\n e.preventDefault(); // 'hide' will close the modal unless cancelled\n\n modal.hide();\n });\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 // Turn body scrolling back to what it was\n document.body.style[\"overflow\"] = modal.originalBodyOverflow;\n document.body.style[\"padding-right\"] = modal.originalBodyPaddingRight;\n modal.originalBodyOverflow = undefined;\n modal.originalBodyPaddingRight = undefined;\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 // Turn off body scrolling\n modal.originalBodyOverflow = document.body.style['overflow'];\n modal.originalBodyPaddingRight = document.body.style['padding-right'];\n document.body.style[\"overflow\"] = \"hidden\"\n document.body.style[\"padding-right\"] = \"0px\"\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","const SearchContext = (e) => {\n const contextLink = e.target.closest('[data-context-href]')\n if (contextLink) {\n SearchContext.handleSearchContextMethod.call(contextLink, 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","import BookmarkToggle from 'blacklight-frontend/bookmark_toggle'\nimport ButtonFocus from 'blacklight-frontend/button_focus'\nimport ColorThemeSwitcher from 'blacklight-frontend/color_theme_switcher'\nimport FacetSuggest from 'blacklight-frontend/facet_suggest'\nimport Modal from 'blacklight-frontend/modal'\nimport SearchContext from 'blacklight-frontend/search_context'\nimport Core from 'blacklight-frontend/core'\n\nexport default {\n BookmarkToggle,\n ButtonFocus,\n ColorThemeSwitcher,\n FacetSuggest,\n Modal,\n SearchContext,\n Core,\n onLoad: Core.onLoad\n}\n"],"names":[],"mappings":"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"}
@@ -23,13 +23,13 @@ module Blacklight
23
23
  end
24
24
 
25
25
  def render?
26
- @field.render_field?
26
+ @field.render_field? && render_field_values.present?
27
27
  end
28
28
 
29
29
  # Override this method in a subclass to change the way this value is rendered
30
30
  # @return [Array]
31
31
  def render_field_values
32
- @field.render
32
+ @render_field_values ||= @field.render
33
33
  end
34
34
 
35
35
  ##
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ # Adds Solr timing to the Rails request log line, mirroring how
5
+ # ActiveRecord::Railties::ControllerRuntime adds ActiveRecord timing, e.g.:
6
+ # Completed 200 OK in 62ms (Views: 12.0ms | ActiveRecord: 1.2ms | Solr: 45.3ms (2 queries))
7
+ module ControllerRuntime
8
+ extend ActiveSupport::Concern
9
+
10
+ protected
11
+
12
+ def process_action(action, *args)
13
+ Blacklight::RuntimeRegistry.stats.reset
14
+ super
15
+ end
16
+
17
+ def append_info_to_payload(payload)
18
+ super
19
+ stats = Blacklight::RuntimeRegistry.stats
20
+ payload[:solr_runtime] = stats.solr_runtime
21
+ payload[:solr_query_count] = stats.solr_query_count
22
+ stats.reset
23
+ end
24
+
25
+ module ClassMethods
26
+ def log_process_action(payload)
27
+ messages = super
28
+ count = payload[:solr_query_count].to_i
29
+ return messages unless count.positive?
30
+
31
+ messages << solr_log_message(payload[:solr_runtime], count)
32
+ messages
33
+ end
34
+
35
+ private
36
+
37
+ def solr_log_message(runtime, count)
38
+ format("Solr: %.1fms (%d %s)", runtime.to_f, count, "query".pluralize(count))
39
+ end
40
+ end
41
+ end
42
+ end
@@ -10,9 +10,11 @@ module Blacklight
10
10
  attr_writer :connection
11
11
 
12
12
  # (Note: ActiveSupport::Benchmarkable requires a logger method)
13
+ # No longer used in core Blacklight, keeping for downstream consumers
13
14
  # @return [Logger]
14
15
  attr_writer :logger
15
16
 
17
+ # No longer used in core Blacklight, keeping for downstream consumers
16
18
  include ActiveSupport::Benchmarkable
17
19
 
18
20
  ##
@@ -22,6 +22,15 @@ module Blacklight
22
22
  Blacklight::Configuration.initialize_default_configuration
23
23
  end
24
24
 
25
+ initializer "blacklight.runtime_registry" do
26
+ ActiveSupport::Notifications.monotonic_subscribe("solr_request.blacklight", Blacklight::RuntimeRegistry)
27
+ Blacklight::LogSubscriber.attach_to :blacklight
28
+
29
+ # ActionController::LogSubscriber#process_action calls ActionController::Base.log_process_action,
30
+ # so this has to live on ActionController::Base itself - a subclass's override is never consulted.
31
+ ActiveSupport.on_load(:action_controller) { include Blacklight::ControllerRuntime }
32
+ end
33
+
25
34
  # This makes our rake tasks visible.
26
35
  rake_tasks do
27
36
  Dir.chdir(File.expand_path(File.join(File.dirname(__FILE__), '..'))) do
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ # Debug-only logging for solr_request.blacklight notifications
5
+ # see Blacklight::ControllerRuntime for the :info-level per-request summary.
6
+ class LogSubscriber < ActiveSupport::LogSubscriber
7
+ # ActiveSupport::LogSubscriber#debug/#info call the instance method
8
+ # `logger`, which the base class hardcodes to `LogSubscriber.logger`
9
+ # (itself) rather than `self.class.logger`. If that's ever fixed
10
+ # upstream, a `self.logger` override here would be worth implementing.
11
+ delegate :logger, to: :Blacklight
12
+
13
+ def solr_request(event)
14
+ payload = event.payload
15
+ debug { "Solr fetch (#{event.duration.round(1)}ms): #{payload[:method]} #{payload[:path]} #{payload[:params].to_hash.inspect}" }
16
+ debug { "Solr response: #{payload[:response].inspect}" } if verbose_logging?
17
+ end
18
+
19
+ private
20
+
21
+ def verbose_logging?
22
+ defined?(::BLACKLIGHT_VERBOSE_LOGGING) && ::BLACKLIGHT_VERBOSE_LOGGING
23
+ end
24
+ end
25
+ end
@@ -3,5 +3,29 @@
3
3
  module Blacklight
4
4
  class RuntimeRegistry
5
5
  thread_mattr_accessor :connection, :connection_config
6
+
7
+ # per-thread/fiber Solr timing, read by Blacklight::ControllerRuntime
8
+ class Stats
9
+ attr_accessor :solr_runtime, :solr_query_count
10
+
11
+ def initialize
12
+ @solr_runtime = 0.0
13
+ @solr_query_count = 0
14
+ end
15
+
16
+ public alias_method :reset, :initialize
17
+ end
18
+
19
+ class << self
20
+ def stats
21
+ ActiveSupport::IsolatedExecutionState[:blacklight_solr_runtime] ||= Stats.new
22
+ end
23
+
24
+ # @see ActiveSupport::Notifications.monotonic_subscribe
25
+ def call(_name, start, finish, _id, _payload)
26
+ stats.solr_runtime += (finish - start) * 1000.0
27
+ stats.solr_query_count += 1
28
+ end
29
+ end
6
30
  end
7
31
  end
@@ -230,7 +230,8 @@ module Blacklight
230
230
  return if value.nil?
231
231
 
232
232
  params_will_change!
233
- @rows = [value, blacklight_config.max_per_page].map(&:to_i).min
233
+ new_rows = value.to_i.then { |parsed| parsed.positive? ? parsed : blacklight_config.default_per_page }
234
+ @rows = [new_rows, blacklight_config.max_per_page.to_i].min
234
235
  end
235
236
 
236
237
  # @param [#to_i] value
@@ -38,8 +38,10 @@ module Blacklight::Solr
38
38
  # @param [Hash] request_params
39
39
  # @return [Blacklight::Suggest::Response]
40
40
  def suggestions(request_params)
41
- suggest_results = connection.send_and_receive(suggest_handler_path, params: request_params)
42
- Blacklight::Suggest::Response.new suggest_results, request_params, suggest_handler_path, suggester_name
41
+ instrument_solr_request(suggest_handler_path, request_params) do
42
+ suggest_results = connection.send_and_receive(suggest_handler_path, params: request_params)
43
+ Blacklight::Suggest::Response.new suggest_results, request_params, suggest_handler_path, suggester_name
44
+ end
43
45
  end
44
46
 
45
47
  ##
@@ -53,7 +55,7 @@ module Blacklight::Solr
53
55
  ##
54
56
  # @return [boolean] true if the repository is reachable
55
57
  def ping?
56
- response = connection.send_and_receive 'admin/ping', {}
58
+ response = instrument_solr_request('admin/ping', {}) { connection.send_and_receive('admin/ping', {}) }
57
59
  Blacklight.logger&.info("Ping [#{connection.uri}] returned: '#{response['status']}'")
58
60
  response['status'] == "OK"
59
61
  end
@@ -69,13 +71,10 @@ module Blacklight::Solr
69
71
  # @param [Hash, Blacklight::SearchBuilder] solr_params parameters for RSolr::Client#send_and_receive
70
72
  # @return [Blacklight::Solr::Response] the solr response object
71
73
  def send_and_receive(path, solr_params = {})
72
- benchmark("Solr fetch", level: :debug) do
73
- res = connection.send_and_receive(path, build_solr_request(solr_params))
74
- solr_response = blacklight_config.response_model.new(res, solr_params, document_model: blacklight_config.document_model, blacklight_config: blacklight_config)
75
-
76
- Blacklight.logger&.debug("Solr query: #{blacklight_config.http_method} #{path} #{solr_params.to_hash.inspect}")
77
- Blacklight.logger&.debug("Solr response: #{solr_response.inspect}") if defined?(::BLACKLIGHT_VERBOSE_LOGGING) && ::BLACKLIGHT_VERBOSE_LOGGING
78
- solr_response
74
+ request = build_solr_request(solr_params)
75
+ instrument_solr_request(path, solr_params, method: request[:method]) do
76
+ res = connection.send_and_receive(path, request)
77
+ blacklight_config.response_model.new(res, solr_params, document_model: blacklight_config.document_model, blacklight_config: blacklight_config)
79
78
  end
80
79
  rescue *defined_rsolr_timeout_exceptions => e
81
80
  raise Blacklight::Exceptions::RepositoryTimeout, "Timeout connecting to Solr instance using #{connection.inspect}: #{e.inspect}"
@@ -106,6 +105,12 @@ module Blacklight::Solr
106
105
 
107
106
  private
108
107
 
108
+ def instrument_solr_request(path, params, method: :get)
109
+ ActiveSupport::Notifications.instrument("solr_request.blacklight", path: path, params: params, method: method) do |payload|
110
+ payload[:response] = yield
111
+ end
112
+ end
113
+
109
114
  ##
110
115
  # @return [String]
111
116
  def suggest_handler_path
@@ -41,6 +41,11 @@ module Blacklight
41
41
  generate "blacklight:assets", generated_options unless options[:'skip-assets']
42
42
  end
43
43
 
44
+ def pin_json_version
45
+ # json 3.0's JSON.parse rejects ActiveSupport::JSON.decode's positional options hash; unfixed as of Rails 8.1.3.
46
+ gem 'json', '< 3.0'
47
+ end
48
+
44
49
  def bundle_install
45
50
  inside destination_root do
46
51
  Bundler.with_unbundled_env do
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blacklight-frontend",
3
- "version": "9.1.0",
3
+ "version": "9.2.0",
4
4
  "description": "The frontend code and styles for Blacklight",
5
5
  "exports": {
6
6
  "./blacklight.esm.js": "./app/assets/javascripts/blacklight/blacklight.esm.js",
@@ -33,6 +33,21 @@ RSpec.describe Blacklight::MetadataFieldComponent, type: :component do
33
33
  end
34
34
  end
35
35
 
36
+ context 'when the configured helper method returns nil' do
37
+ let(:field_config) { Blacklight::Configuration::Field.new(key: 'field', field: 'field', label: 'Field label', helper_method: :field_helper) }
38
+
39
+ before do
40
+ allow(view_context).to receive(:field_helper).and_return(nil)
41
+
42
+ render_inline(described_class.new(field: field))
43
+ end
44
+
45
+ it 'does not render the field label without any values' do
46
+ expect(page).to have_no_css 'dt'
47
+ expect(page).to have_no_css 'dd'
48
+ end
49
+ end
50
+
36
51
  context 'from a show view' do
37
52
  before do
38
53
  allow(field).to receive(:label).with('show').and_return('custom label')
@@ -7,6 +7,29 @@
7
7
  BLACKLIGHT_MANAGES_GUESTS = !defined?(DeviseGuests)
8
8
 
9
9
  RSpec.describe ApplicationController do
10
+ describe ".log_process_action" do
11
+ it "appends Solr runtime to the messages ActiveRecord/ActionController already log" do
12
+ messages = described_class.log_process_action(solr_runtime: 45.3, solr_query_count: 2)
13
+ expect(messages).to include("Solr: 45.3ms (2 queries)")
14
+ end
15
+
16
+ it "uses singular 'query' for a single Solr request" do
17
+ messages = described_class.log_process_action(solr_runtime: 12.0, solr_query_count: 1)
18
+ expect(messages).to include("Solr: 12.0ms (1 query)")
19
+ end
20
+
21
+ it "does not add a message when no Solr request was made" do
22
+ messages = described_class.log_process_action({})
23
+ expect(messages.grep(/Solr/)).to be_empty
24
+ end
25
+
26
+ it "does not add a message when the payload reports zero Solr queries" do
27
+ # Stats#solr_runtime defaults to 0.0 (truthy, never nil) - query count is the real "did Solr get queried" signal.
28
+ messages = described_class.log_process_action(solr_runtime: 0.0, solr_query_count: 0)
29
+ expect(messages.grep(/Solr/)).to be_empty
30
+ end
31
+ end
32
+
10
33
  describe "#blacklight_config" do
11
34
  it "provides a default blacklight_config everywhere" do
12
35
  expect(controller.blacklight_config).to eq CatalogController.blacklight_config
@@ -11,6 +11,8 @@ RSpec.describe 'Accessibility testing', :js, api: false do
11
11
 
12
12
  it 'validates the home page' do
13
13
  visit root_path
14
+ wait_for_turbo
15
+
14
16
  expect(page).to be_axe_clean
15
17
  end
16
18
 
@@ -33,11 +35,15 @@ RSpec.describe 'Accessibility testing', :js, api: false do
33
35
 
34
36
  it 'validates the advanced search form' do
35
37
  visit advanced_search_catalog_path
38
+ wait_for_turbo
39
+
36
40
  expect(page).to be_axe_clean
37
41
  end
38
42
 
39
43
  it 'validates the single results page' do
40
44
  visit solr_document_path('2007020969')
45
+ wait_for_turbo
46
+
41
47
  expect(page).to be_axe_clean
42
48
  end
43
49
  end
@@ -93,4 +93,18 @@ RSpec.describe "Search Pagination" do
93
93
  expect(page).to have_text "1 - 20 of "
94
94
  end
95
95
  end
96
+
97
+ it 'falls back to the default in the case of negative rows param' do
98
+ visit '/catalog?search_field=all_fields&q=&rows=-20'
99
+ within("#sortAndPerPage") do
100
+ expect(page).to have_text "1 - 10 of "
101
+ end
102
+ end
103
+
104
+ it 'falls back to the default in the case of negative per_page param' do
105
+ visit '/catalog?search_field=all_fields&q=&per_page=-20'
106
+ within("#sortAndPerPage") do
107
+ expect(page).to have_text "1 - 10 of "
108
+ end
109
+ end
96
110
  end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Blacklight::RuntimeRegistry do
4
+ before { described_class.stats.reset }
5
+
6
+ describe ".call" do
7
+ it "accumulates the event's duration into stats.solr_runtime" do
8
+ described_class.call("solr_request.blacklight", 0.0, 0.0125, nil, {})
9
+
10
+ expect(described_class.stats.solr_runtime).to eq 12.5
11
+ end
12
+
13
+ it "increments stats.solr_query_count" do
14
+ described_class.call("solr_request.blacklight", 0.0, 0.0125, nil, {})
15
+ described_class.call("solr_request.blacklight", 0.0, 0.0125, nil, {})
16
+
17
+ expect(described_class.stats.solr_query_count).to eq 2
18
+ end
19
+ end
20
+
21
+ describe ".stats" do
22
+ it "is thread-local" do
23
+ described_class.call("solr_request.blacklight", 0.0, 0.0125, nil, {})
24
+
25
+ Thread.new { expect(described_class.stats.solr_runtime).to eq 0.0 }.join
26
+ end
27
+ end
28
+
29
+ describe "Stats#reset" do
30
+ it "clears the accumulated runtime and query count" do
31
+ stats = described_class.stats
32
+ described_class.call("solr_request.blacklight", 0.0, 0.0125, nil, {})
33
+
34
+ stats.reset
35
+
36
+ expect(stats.solr_runtime).to eq 0.0
37
+ expect(stats.solr_query_count).to eq 0
38
+ end
39
+ end
40
+
41
+ describe "subscribed to solr_request.blacklight notifications" do
42
+ it "fires without raising (Blacklight::Engine subscribes this at boot)" do
43
+ expect { ActiveSupport::Notifications.instrument("solr_request.blacklight") }.not_to raise_error
44
+ end
45
+ end
46
+ end
@@ -143,6 +143,31 @@ RSpec.describe Blacklight::Solr::Repository, :api do
143
143
  allow(repository.connection).to receive(:send_and_receive).and_raise(rsolr_timeout)
144
144
  expect { subject.search(params: {}) }.to raise_exception(Blacklight::Exceptions::RepositoryTimeout, /Timeout connecting to Solr instance/)
145
145
  end
146
+
147
+ it "instruments the request with ActiveSupport::Notifications" do
148
+ allow(subject.connection).to receive(:send_and_receive).and_return(mock_response)
149
+
150
+ payload = nil
151
+ callback = ->(event) { payload = event.payload }
152
+ ActiveSupport::Notifications.subscribed(callback, "solr_request.blacklight") do
153
+ subject.search(params: {})
154
+ end
155
+
156
+ expect(payload).to include(path: 'select', method: :get)
157
+ end
158
+
159
+ it "instruments a json query dsl request as post, regardless of http_method configuration" do
160
+ blacklight_config.http_method = :get
161
+ allow(subject.connection).to receive(:send_and_receive).and_return(mock_response)
162
+
163
+ payload = nil
164
+ callback = ->(event) { payload = event.payload }
165
+ ActiveSupport::Notifications.subscribed(callback, "solr_request.blacklight") do
166
+ subject.search(params: { json: { query: 'foo' } })
167
+ end
168
+
169
+ expect(payload).to include(method: :post)
170
+ end
146
171
  end
147
172
 
148
173
  describe "#build_solr_request" do
@@ -230,5 +255,49 @@ RSpec.describe Blacklight::Solr::Repository, :api do
230
255
  subject { repository.ping }
231
256
 
232
257
  it { is_expected.to be true }
258
+
259
+ it "instruments the request with ActiveSupport::Notifications" do
260
+ payload = nil
261
+ callback = ->(event) { payload = event.payload }
262
+ ActiveSupport::Notifications.subscribed(callback, "solr_request.blacklight") do
263
+ repository.ping
264
+ end
265
+
266
+ expect(payload).to include(path: 'admin/ping', method: :get)
267
+ end
268
+ end
269
+
270
+ describe "debug logging" do
271
+ let(:io) { StringIO.new }
272
+ let(:test_logger) { Logger.new(io, level: Logger::DEBUG) }
273
+
274
+ before do
275
+ allow(Blacklight).to receive(:logger).and_return(test_logger)
276
+ allow(subject.connection).to receive(:send_and_receive).and_return(mock_response)
277
+ end
278
+
279
+ it "logs the solr query at debug, never at info" do
280
+ subject.search(params: { q: 'test' })
281
+
282
+ expect(io.string).to include("test")
283
+ expect(io.string).not_to include("INFO")
284
+ end
285
+
286
+ it "does not log the full response by default" do
287
+ subject.search(params: { q: 'test' })
288
+
289
+ expect(io.string).not_to include("Solr response")
290
+ end
291
+
292
+ context "when BLACKLIGHT_VERBOSE_LOGGING is set" do
293
+ before { stub_const('BLACKLIGHT_VERBOSE_LOGGING', true) }
294
+
295
+ it "logs the full response at debug, never at info" do
296
+ subject.search(params: { q: 'test' })
297
+
298
+ expect(io.string).to include("Solr response")
299
+ expect(io.string).not_to include("INFO")
300
+ end
301
+ end
233
302
  end
234
303
  end
@@ -7,6 +7,7 @@ module Features
7
7
  # clicks return before the visit completes, so wait for the busy state to clear
8
8
  # before making assertions that don't wait on their own (e.g. be_axe_clean).
9
9
  def wait_for_turbo
10
+ page.has_css?('html[aria-busy]', visible: :all, wait: 0.5)
10
11
  expect(page).to have_no_css('html[aria-busy]', visible: :all)
11
12
  end
12
13
  end
@@ -3,3 +3,6 @@ gem 'rails-controller-testing'
3
3
  unless ENV['VIEW_COMPONENT_VERSION'].to_s == ""
4
4
  gem 'view_component', ENV.fetch('VIEW_COMPONENT_VERSION')
5
5
  end
6
+
7
+ # json 3.0's JSON.parse rejects ActiveSupport::JSON.decode's positional options hash; unfixed as of Rails 8.1.3.
8
+ gem 'json', '< 3.0'
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: 9.1.0
4
+ version: 9.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Rochkind
@@ -16,7 +16,7 @@ authors:
16
16
  - Justin Coyne
17
17
  bindir: exe
18
18
  cert_chain: []
19
- date: 2026-09-04 00:00:00.000000000 Z
19
+ date: 1980-01-02 00:00:00.000000000 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: rails
@@ -588,6 +588,7 @@ files:
588
588
  - app/controllers/concerns/blacklight/bookmarks.rb
589
589
  - app/controllers/concerns/blacklight/catalog.rb
590
590
  - app/controllers/concerns/blacklight/controller.rb
591
+ - app/controllers/concerns/blacklight/controller_runtime.rb
591
592
  - app/controllers/concerns/blacklight/guest_user.rb
592
593
  - app/controllers/concerns/blacklight/search_context.rb
593
594
  - app/controllers/concerns/blacklight/search_history.rb
@@ -779,6 +780,7 @@ files:
779
780
  - lib/blacklight/configuration/view_config.rb
780
781
  - lib/blacklight/engine.rb
781
782
  - lib/blacklight/exceptions.rb
783
+ - lib/blacklight/log_subscriber.rb
782
784
  - lib/blacklight/nested_open_struct_with_hash_access.rb
783
785
  - lib/blacklight/open_struct_with_hash_access.rb
784
786
  - lib/blacklight/parameters.rb
@@ -931,6 +933,7 @@ files:
931
933
  - spec/lib/blacklight/nested_open_struct_with_hash_access_spec.rb
932
934
  - spec/lib/blacklight/open_struct_with_hash_access_spec.rb
933
935
  - spec/lib/blacklight/parameters_spec.rb
936
+ - spec/lib/blacklight/runtime_registry_spec.rb
934
937
  - spec/lib/blacklight/search_state/filter_field_spec.rb
935
938
  - spec/lib/blacklight/search_state/pivot_filter_field_spec.rb
936
939
  - spec/lib/blacklight/search_state_spec.rb
@@ -1030,7 +1033,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1030
1033
  - !ruby/object:Gem::Version
1031
1034
  version: '0'
1032
1035
  requirements: []
1033
- rubygems_version: 3.6.2
1036
+ rubygems_version: 4.0.15
1034
1037
  specification_version: 4
1035
1038
  summary: Blacklight provides a discovery interface for any Solr (http://lucene.apache.org/solr)
1036
1039
  index.
@@ -1117,6 +1120,7 @@ test_files:
1117
1120
  - spec/lib/blacklight/nested_open_struct_with_hash_access_spec.rb
1118
1121
  - spec/lib/blacklight/open_struct_with_hash_access_spec.rb
1119
1122
  - spec/lib/blacklight/parameters_spec.rb
1123
+ - spec/lib/blacklight/runtime_registry_spec.rb
1120
1124
  - spec/lib/blacklight/search_state/filter_field_spec.rb
1121
1125
  - spec/lib/blacklight/search_state/pivot_filter_field_spec.rb
1122
1126
  - spec/lib/blacklight/search_state_spec.rb