refine-rails 2.11.4 → 2.11.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/refine-stimulus.esm.js +1 -1
  3. data/app/assets/javascripts/refine-stimulus.esm.js.map +1 -1
  4. data/app/assets/javascripts/refine-stimulus.js +1 -1
  5. data/app/assets/javascripts/refine-stimulus.js.map +1 -1
  6. data/app/assets/javascripts/refine-stimulus.modern.js +1 -1
  7. data/app/assets/javascripts/refine-stimulus.modern.js.map +1 -1
  8. data/app/assets/javascripts/refine-stimulus.umd.js +1 -1
  9. data/app/assets/javascripts/refine-stimulus.umd.js.map +1 -1
  10. data/app/assets/stylesheets/index.css +41 -10
  11. data/app/assets/stylesheets/index.tailwind.css +41 -10
  12. data/app/controllers/refine/inline/criteria_controller.rb +16 -3
  13. data/app/javascript/controllers/index.js +3 -0
  14. data/app/javascript/controllers/refine/modal-controller.js +41 -0
  15. data/app/models/refine/filters/blueprint_editor.rb +8 -0
  16. data/app/views/refine/inline/criteria/index_advanced.html.erb +29 -0
  17. data/app/views/refine/inline/filters/_add_first_condition_button.html.erb +10 -5
  18. data/app/views/refine/inline/filters/_and_button.html.erb +8 -3
  19. data/app/views/refine/inline/filters/_criterion.html.erb +1 -1
  20. data/app/views/refine/inline/filters/_group.html.erb +3 -1
  21. data/app/views/refine/inline/filters/_modal.html.erb +28 -0
  22. data/app/views/refine/inline/filters/_modal_or_popup.html.erb +35 -0
  23. data/app/views/refine/inline/filters/_or_button.html.erb +9 -3
  24. data/app/views/refine/inline/filters/_or_separator.html.erb +16 -0
  25. data/app/views/refine/inline/filters/_show.html.erb +11 -13
  26. data/config/routes.rb +2 -0
  27. data/lib/refine/rails/version.rb +1 -1
  28. metadata +7 -2
@@ -1 +1 @@
1
- {"version":3,"file":"refine-stimulus.umd.js","sources":["../../../node_modules/@hotwired/stimulus-webpack-helpers/dist/stimulus-webpack-helpers.js","../../javascript/controllers/refine/server-refresh-controller.js","../../javascript/controllers/refine/add-controller.js","../../javascript/controllers/refine/criterion-form-controller.js","../../javascript/controllers/refine/defaults-controller.js","../../javascript/controllers/refine/delete-controller.js","../../javascript/controllers/refine/filter-pills-controller.js","../../javascript/controllers/refine/popup-controller.js","../../javascript/controllers/refine/search-filter-controller.js","../../javascript/refine/helpers/index.js","../../javascript/controllers/refine/state-controller.js","../../javascript/controllers/refine/stored-filter-controller.js","../../javascript/controllers/refine/submit-form-controller.js","../../javascript/controllers/refine/toggle-controller.js","../../javascript/controllers/refine/turbo-stream-form-controller.js","../../javascript/controllers/refine/turbo-stream-link-controller.js","../../javascript/controllers/refine/typeahead-list-controller.js","../../javascript/controllers/refine/update-controller.js","../../javascript/controllers/refine/date-controller.js","../../javascript/controllers/index.js"],"sourcesContent":["/*\nStimulus Webpack Helpers 1.0.0\nCopyright © 2021 Basecamp, LLC\n */\nfunction definitionsFromContext(context) {\n return context.keys()\n .map((key) => definitionForModuleWithContextAndKey(context, key))\n .filter((value) => value);\n}\nfunction definitionForModuleWithContextAndKey(context, key) {\n const identifier = identifierForContextKey(key);\n if (identifier) {\n return definitionForModuleAndIdentifier(context(key), identifier);\n }\n}\nfunction definitionForModuleAndIdentifier(module, identifier) {\n const controllerConstructor = module.default;\n if (typeof controllerConstructor == \"function\") {\n return { identifier, controllerConstructor };\n }\n}\nfunction identifierForContextKey(key) {\n const logicalName = (key.match(/^(?:\\.\\/)?(.+)(?:[_-]controller\\..+?)$/) || [])[1];\n if (logicalName) {\n return logicalName.replace(/_/g, \"-\").replace(/\\//g, \"--\");\n }\n}\n\nexport { definitionForModuleAndIdentifier, definitionForModuleWithContextAndKey, definitionsFromContext, identifierForContextKey };\n","import { Controller } from \"@hotwired/stimulus\"\nimport { FetchRequest } from '@rails/request.js'\n\n\n// Base class for controllers that reload form content from the server\nexport default class extends Controller {\n connect() {\n this.state.finishUpdate()\n }\n\n get state() {\n let currentElement = this.element\n\n while(currentElement !== document.body) {\n if (currentElement.matches('[data-controller~=\"refine--state\"]'))\n return this.application.getControllerForElementAndIdentifier(currentElement, 'refine--state')\n else {\n currentElement = currentElement.parentNode\n }\n }\n\n return null\n }\n\n async refreshFromServer(options = {}) {\n const { includeErrors } = options\n this.state.startUpdate()\n const request = new FetchRequest(\n \"GET\",\n this.state.refreshUrlValue,\n {\n responseKind: \"turbo-stream\",\n query: {\n \"refine_filters_builder[filter_class]\": this.state.filterName,\n \"refine_filters_builder[blueprint_json]\": JSON.stringify(this.state.blueprint),\n \"refine_filters_builder[client_id]\": this.state.clientIdValue,\n include_errors: !!includeErrors\n }\n }\n )\n await request.perform()\n }\n}\n","import ServerRefreshController from './server-refresh-controller'\nimport { FetchRequest } from '@rails/request.js'\n\nexport default class extends ServerRefreshController {\n static values = {\n previousCriterionId: Number,\n }\n\n async criterion() {\n const isValid = await this.validateBlueprint()\n if (isValid) {\n this.state.addCriterion(this.previousCriterionIdValue)\n }\n this.refreshFromServer({includeErrors: !isValid})\n }\n\n async group() {\n const isValid = await this.validateBlueprint()\n if (isValid) {\n this.state.addGroup()\n }\n this.refreshFromServer({includeErrors: !isValid})\n }\n\n async validateBlueprint(blueprint) {\n const { state } = this\n\n const request = new FetchRequest(\n \"GET\",\n this.state.validateBlueprintUrlValue,\n {\n query: {\n \"refine_filters_builder[filter_class]\": this.state.filterName,\n \"refine_filters_builder[blueprint_json]\": JSON.stringify(this.state.blueprint),\n \"refine_filters_builder[client_id]\": this.state.clientIdValue\n }\n }\n )\n const response = await request.perform()\n return response.ok\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { FetchRequest } from '@rails/request.js'\n\n/*\n This controller handles criteria forms\n (refine/inline/criteria/new|edit)\n*/\nexport default class extends Controller {\n static values = {\n url: String,\n formId: String\n }\n\n async refresh(_event) {\n // update the url with params from the form\n const formElement = document.getElementById(this.formIdValue)\n const formData = new FormData(formElement)\n\n const request = new FetchRequest(\n \"GET\",\n this.urlValue,\n {\n query: formData,\n responseKind: \"turbo-stream\"\n }\n )\n const response = await request.perform()\n }\n\n\n\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n static values = {\n criterionId: Number,\n input: Object,\n };\n\n connect() {\n this.state = this.getStateController()\n\n this.state.updateInput(\n this.criterionIdValue,\n this.inputValue,\n );\n }\n\n getStateController() {\n let currentElement = this.element\n\n while(currentElement !== document.body) {\n const controller = this.application.getControllerForElementAndIdentifier(currentElement, 'refine--state')\n if (controller) {\n return controller\n } else {\n currentElement = currentElement.parentNode\n }\n }\n\n return null\n }\n}\n","import ServerRefreshController from './server-refresh-controller';\n\nexport default class extends ServerRefreshController {\n static values = {\n criterionId: Number,\n }\n\n criterion() {\n const { state, criterionIdValue } = this;\n state.deleteCriterion(criterionIdValue);\n this.refreshFromServer()\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { FetchRequest } from '@rails/request.js'\n\nexport default class extends Controller {\n static values = {\n submitUrl: String\n }\n\n connect() {\n const urlParams = new URLSearchParams(window.location.search)\n this.existingParams = urlParams\n this.existingParams.delete('stable_id')\n }\n\n delete(event) {\n const { criterionId } = event.currentTarget.dataset\n var index = parseInt(criterionId)\n this.stateController.deleteCriterion(index)\n this.reloadPage()\n }\n\n async reloadPage() {\n const {blueprint} = this.stateController\n const request = new FetchRequest(\n \"POST\",\n this.submitUrlValue,\n {\n responseKind: \"turbo-stream\",\n body: JSON.stringify({\n refine_filters_builder: {\n filter_class: this.stateController.filterName,\n blueprint_json: JSON.stringify(blueprint),\n client_id: this.stateController.clientIdValue\n }\n })\n }\n )\n await request.perform()\n }\n\n redirectToStableId(stableId) {\n const params = new URLSearchParams()\n if (stableId) {\n params.append('stable_id', stableId)\n }\n const allParams = new URLSearchParams({\n ...Object.fromEntries(this.existingParams),\n ...Object.fromEntries(params),\n }).toString()\n const url = `${window.location.pathname}?${allParams}`\n\n history.pushState({}, document.title, url)\n window.location.reload()\n }\n\n get stateController() {\n return this.element.refineStateController\n }\n\n get stabilizeFilterController() {\n return this.element.stabilizeFilterController\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { useClickOutside } from 'stimulus-use'\n\n// simple controller to hide/show the filter modal\nexport default class extends Controller {\n static targets = [\"frame\"]\n\n static values = {\n src: String,\n isOpen: {type: Boolean, default: false}\n }\n\n connect() {\n useClickOutside(this)\n this.boundHandleKeyUp = this.handleKeyUp.bind(this)\n document.addEventListener(\"keyup\", this.boundHandleKeyUp)\n }\n\n disconnect() {\n document.removeEventListener(\"keyup\", this.boundHandleKeyUp)\n }\n\n show(event) {\n event.preventDefault()\n this.frameTarget.src = this.srcValue;\n this.isOpenValue = true\n }\n\n hide(event) {\n if (this.isOpenValue) {\n event?.preventDefault()\n this.frameTarget.innerHTML = \"\";\n this.isOpenValue = false\n }\n }\n\n clickOutside(event) {\n this.hide(event)\n }\n\n handleKeyUp(event) {\n if (event.key === \"Escape\" || event.key === \"Esc\") {\n this.hide(event)\n }\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { FetchRequest } from '@rails/request.js'\n\nexport default class extends Controller {\n static values = {\n submitUrl: String\n }\n\n\n search(event) {\n event.preventDefault()\n this.submitFilter()\n document.activeElement.blur()\n }\n\n async submitFilter() {\n const {blueprint} = this.stateController\n const request = new FetchRequest(\n \"POST\",\n this.submitUrlValue,\n {\n responseKind: \"turbo-stream\",\n body: JSON.stringify({\n refine_filters_builder: {\n filter_class: this.stateController.filterName,\n blueprint_json: JSON.stringify(blueprint),\n client_id: this.stateController.clientIdValue\n }\n })\n }\n )\n await request.perform()\n }\n\n get stateController() {\n return this\n .element\n .querySelector('[data-controller~=\"refine--state\"]')\n .refineStateController\n }\n\n loadResults({detail: {url}}) {\n console.log(\"filter submit success\")\n if (window.Turbo) {\n window.Turbo.visit(url)\n } else {\n window.location.href = url\n }\n }\n}\n","// Polyfill for custom events in IE9-11\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#polyfill\n;(function () {\n if (typeof window.CustomEvent === 'function') return false\n\n function CustomEvent(event, params) {\n params = params || { bubbles: false, cancelable: false, detail: undefined }\n var evt = document.createEvent('CustomEvent')\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail)\n return evt\n }\n\n CustomEvent.prototype = window.Event.prototype\n\n window.CustomEvent = CustomEvent\n\n // eslint expects a return here\n return true\n})()\n\nexport const filterStabilizedEvent = (element, stableId, filterName) => {\n const event = new CustomEvent('filter-stabilized', {\n bubbles: true,\n cancelable: true,\n detail: {\n stableId,\n filterName,\n },\n })\n element.dispatchEvent(event)\n}\n\nexport const filterUnstableEvent = (blueprint) => {\n const event = new CustomEvent('filter-unstable', {\n bubbles: true,\n cancelable: true,\n detail: {\n blueprint,\n },\n })\n window.dispatchEvent(event)\n}\n\nexport const filterInvalidEvent = ({blueprint, errors}) => {\n const event = new CustomEvent('filter-invalid', {\n bubbles: true,\n cancelable: true,\n detail: {\n blueprint,\n errors,\n },\n })\n window.dispatchEvent(event)\n}\n\nexport const filterStoredEvent = (storedFilterId) => {\n const event = new CustomEvent('filter-stored', {\n bubbles: true,\n cancelable: true,\n detail: {\n storedFilterId,\n },\n })\n window.dispatchEvent(event)\n}\n\nexport const blueprintUpdatedEvent = (element, {blueprint, formId}) => {\n const event = new CustomEvent('blueprint-updated', {\n bubbles: true,\n cancelable: true,\n detail: {\n blueprint,\n formId\n },\n })\n element.dispatchEvent(event)\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { delegate, abnegate } from 'jquery-events-to-dom-events'\nimport { blueprintUpdatedEvent } from '../../refine/helpers'\nimport { isEqual } from 'lodash'\n\nconst criterion = (id, depth, condition) => {\n const component = condition?.component\n const meta = condition?.meta || { clauses: [], options: {}}\n const refinements = condition?.refinements || []\n const { clauses, options } = meta\n let selected\n if (component === 'option-condition') {\n selected = options[0] ? [options[0].id] : []\n } else {\n selected = undefined\n }\n // Set newInput based on component\n\n let newInput = {\n clause: clauses[0]?.id,\n selected: selected,\n }\n\n // If refinements are present, add to input array\n refinements.forEach((refinement) => {\n const { meta, component } = refinement\n const { clauses, options } = meta\n let selected\n if (component === 'option-condition') {\n selected = options[0] ? [options[0].id] : []\n } else {\n selected = undefined\n }\n newInput[refinement.id] = {\n clause: clauses[0].id,\n selected: selected,\n }\n })\n\n return {\n depth,\n type: 'criterion',\n condition_id: id,\n input: newInput,\n }\n}\n\nconst or = function (depth) {\n depth = depth === undefined ? 0 : depth\n return {\n depth,\n type: 'conjunction',\n word: 'or',\n }\n}\n\nconst and = function (depth) {\n depth = depth === undefined ? 1 : depth\n return {\n depth,\n type: 'conjunction',\n word: 'and',\n }\n}\nexport default class extends Controller {\n static values = {\n blueprint: Array,\n conditions: Array,\n className: String,\n refreshUrl: String,\n clientId: String,\n validateBlueprintUrl: String,\n defaultConditionId: String\n }\n static targets = ['loading']\n\n\n connect() {\n // for select2 jquery events and datepicker\n this.element.refineStateController = this\n this.changeDelegate = delegate('change', ['event', 'picker'])\n this.blueprint = this.blueprintValue\n this.conditions = this.conditionsValue\n this.filterName = this.classNameValue\n this.conditionsLookup = this.conditions.reduce((lookup, condition) => {\n lookup[condition.id] = condition\n return lookup\n }, {})\n this.loadingTimeout = null\n blueprintUpdatedEvent(this.element, {blueprint: this.blueprint, formId: this.formIdValue})\n }\n\n disconnect() {\n abnegate('change', this.changeDelegate)\n }\n\n startUpdate() {\n if (this.loadingTimeout) {\n window.clearTimeout(this.loadingTimeout)\n }\n // only show the loading overlay if it's taking a long time\n // to render the updates\n this.loadingTimeout = window.setTimeout(() => {\n this.loadingTarget.classList.remove('hidden')\n }, 1000)\n }\n\n finishUpdate() {\n if (this.loadingTimeout) {\n window.clearTimeout(this.loadingTimeout)\n }\n this.loadingTarget.classList.add('hidden')\n }\n\n conditionConfigFor(conditionId) {\n return this.conditionsLookup[conditionId]\n }\n\n addGroup() {\n const { blueprint, conditions } = this\n const condition = ( conditions.find(c => c.id == this.defaultConditionIdValue) || conditions[0] )\n const { meta } = condition\n\n if (this.blueprint.length > 0) {\n this.blueprint.push(or())\n }\n this.blueprint.push(criterion(condition.id, 1, condition))\n blueprintUpdatedEvent(this.element, {blueprint: this.blueprint, formId: this.formIdValue})\n }\n\n addCriterion(previousCriterionId) {\n const { blueprint, conditions } = this\n const condition = ( conditions.find(c => c.id == this.defaultConditionIdValue) || conditions[0] )\n const { meta } = condition\n blueprint.splice(previousCriterionId + 1, 0, and(), criterion(condition.id, 1, condition))\n blueprintUpdatedEvent(this.element, {blueprint: this.blueprint, formId: this.formIdValue})\n }\n\n deleteCriterion(criterionId) {\n /**\n To support 'groups' there is some complicated logic for deleting criterion.\n\n Imagine this simplified blueprint: [eq, and, sw, or, eq]\n\n User clicks to delete the last eq. We also have to delete the preceding or\n otherwise we're left with a hanging empty group\n\n What if the user deletes the sw? We have to clean up the preceding and.\n\n Imagine another scenario: [eq or sw and ew]\n Now we delete the first eq but this time we need to clean up the or.\n\n These conditionals cover these cases.\n **/\n const { blueprint } = this\n const previous = blueprint[criterionId - 1]\n const next = blueprint[criterionId + 1]\n\n const nextIsOr = next && next.word === 'or'\n const previousIsOr = previous && previous.word === 'or'\n\n const nextIsRightParen = nextIsOr || !next\n const previousIsLeftParen = previousIsOr || !previous\n\n const isFirstInGroup = previousIsLeftParen && !nextIsRightParen\n const isLastInGroup = previousIsLeftParen && nextIsRightParen\n const isLastCriterion = !previous && !next\n\n if (isLastCriterion) {\n this.blueprint = []\n } else if (isLastInGroup && previousIsOr) {\n blueprint.splice(criterionId - 1, 2)\n } else if (isLastInGroup && !previous) {\n blueprint.splice(criterionId, 2)\n } else if (isFirstInGroup) {\n blueprint.splice(criterionId, 2)\n } else {\n blueprint.splice(criterionId - 1, 2)\n }\n\n blueprintUpdatedEvent(this.element, {blueprint: this.blueprint, formId: this.formIdValue})\n }\n\n /*\n Updates a criterion in the blueprint\n Returns true if an update was actually performed, or false if no-op\n */\n replaceCriterion(criterionId, conditionId, condition) {\n const criterionRow = this.blueprint[criterionId]\n if (criterionRow.type !== 'criterion') {\n throw new Error(\n `You can't call updateConditionId on a non-criterion type. Trying to update ${JSON.stringify(criterion)}`\n )\n }\n const existingCriterion = this.blueprint[criterionId]\n const newCriterion = criterion(conditionId, criterionRow.depth, condition)\n if (isEqual(existingCriterion, newCriterion)) {\n return false\n } else {\n this.blueprint[criterionId] = newCriterion\n blueprintUpdatedEvent(this.element, {blueprint: this.blueprint, formId: this.formIdValue})\n return true\n }\n }\n\n updateInput(criterionId, input, inputId) {\n // Input id is an array of hash keys that define the path for this input such as [\"input\", \"date_refinement\"]\n const { blueprint } = this\n const criterion = blueprint[criterionId]\n inputId = inputId || 'input'\n const blueprintPath = inputId.split(', ')\n // If the inputId contains more than one element, add input at appropriate depth\n if (blueprintPath.length > 1) {\n criterion[blueprintPath[0]][blueprintPath[1]] = { ...criterion[blueprintPath[0]][blueprintPath[1]], ...input }\n } else {\n criterion[inputId] = { ...criterion[inputId], ...input }\n }\n blueprintUpdatedEvent(this.element, {blueprint: this.blueprint, formId: this.formIdValue})\n }\n\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { filterStoredEvent } from '../../refine/helpers'\n\nexport default class extends Controller {\n static targets = ['blueprintField']\n static values = { formId: String, stateDomId: String }\n\n connect() {\n const stateController = document\n .getElementById(this.stateDomIdValue)\n .refineStateController\n this.blueprintFieldTarget.value = JSON.stringify(stateController.blueprint)\n console.log(\"connect\", this.blueprintFieldTarget.value)\n }\n\n updateBlueprintField(event) {\n if (event.detail.formId != this.formIdValue) { return null }\n const { detail } = event\n const { blueprint } = detail\n this.blueprintFieldTarget.value = JSON.stringify(blueprint)\n console.log(\"update blueprint\", this.blueprintFieldTarget.value)\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n submit(event) {\n event.preventDefault()\n this.element.requestSubmit()\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\n// simple controller to hide/show the filter modal\nexport default class extends Controller {\n static targets = [\"content\"]\n\n toggle(_event) {\n this.contentTargets.forEach(node => {\n node.toggleAttribute(\"hidden\")\n })\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { FetchRequest } from '@rails/request.js'\n\n/*\n attach to a form element to have it submit to a turbo-stream endpoint\n\n <form action=\"/contacts\" data-controller=\"refine--turbo-stream-form\" data-action=\"submit->refine--turbo-stream-form#submit\">\n\n Turbo is supposed to handle this natively but we're seeing issues when the form is inside an iframe\n*/\nexport default class extends Controller {\n async submit(event) {\n event.preventDefault()\n const request = new FetchRequest(\n (this.element.method || \"POST\"),\n this.element.action,\n {\n responseKind: \"turbo-stream\",\n body: new FormData(this.element)\n }\n )\n await request.perform()\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { FetchRequest } from '@rails/request.js'\n\n/*\n attach to a link element to have it request turbo stream responses\n\n <a href=\"/contacts\" data-controller=\"refine--turbo-stream-link\" data-action=\"refine--turbo-stream-link#get\">Click me</a>\n\n Turbo is supposed to handle this natively with data-turbo-stream but we're\n seeing issues using that attribute inside iframes\n*/\nexport default class extends Controller {\n async visit(event) {\n event.preventDefault()\n const request = new FetchRequest(\n (this.element.dataset.turboMethod || \"GET\"),\n this.element.href,\n {\n responseKind: \"turbo-stream\",\n }\n )\n await request.perform()\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n\n static targets = ['listItem', 'category', 'recommended']\n\n filter(event) {\n const query = event.currentTarget.value.toLowerCase()\n const visibleCategories = new Set()\n\n // hide / show listItem links that match the query and note which\n // categories should be visible\n this.listItemTargets.forEach(listItemNode => {\n const listItemName = listItemNode.dataset.listItemValue.toLowerCase()\n if (listItemName.includes(query)) {\n listItemNode.hidden = false\n visibleCategories.add(listItemNode.dataset.category)\n } else {\n listItemNode.hidden = true\n }\n })\n\n this.recommendedTargets.forEach(recommendedNode => {\n (query !== '' && visibleCategories.size === 0) ? recommendedNode.hidden = true : recommendedNode.hidden = false\n })\n\n // hide / show category headers that have visible listItems\n this.categoryTargets.forEach(categoryNode => {\n const categoryName = categoryNode.innerHTML\n if (visibleCategories.has(categoryName)) {\n categoryNode.hidden = false\n } else {\n categoryNode.hidden = true\n }\n })\n }\n}\n","import ServerRefreshController from './server-refresh-controller'\nimport { debounce } from 'lodash'\n\nexport default class extends ServerRefreshController {\n static values = {\n criterionId: Number,\n }\n\n initialize() {\n this.updateBlueprint = debounce((event, value, inputKey) => {\n this.value(event, value, inputKey)\n }, 500)\n }\n\n refinedFilter(event) {\n const { criterionIdValue, state } = this\n const dataset = event.target.dataset\n const inputId = dataset.inputId\n\n state.updateInput(\n criterionIdValue,\n {\n id: event.target.value,\n },\n inputId\n )\n this.refreshFromServer()\n }\n\n clause(event) {\n const { criterionIdValue, state } = this\n const dataset = event.target.dataset\n const inputId = dataset.inputId\n state.updateInput(\n criterionIdValue,\n {\n clause: event.target.value,\n },\n inputId\n )\n this.refreshFromServer()\n }\n\n selected(event) {\n const { target: select } = event\n const options = Array.prototype.slice.call(select.options)\n const selectedOptions = options.filter((option) => option.selected)\n const selected = selectedOptions.map((option) => option.value)\n this.value(event, selected, 'selected')\n }\n\n value(event, value, inputKey) {\n const { criterionIdValue, state } = this\n const dataset = event.target.dataset\n const inputId = dataset.inputId\n inputKey = inputKey || dataset.inputKey || 'value'\n value = value || event.target.value\n state.updateInput(\n criterionIdValue,\n {\n [inputKey]: value,\n },\n inputId\n )\n }\n\n condition(event) {\n const { criterionIdValue, state } = this\n const element = event.target\n let newConditionId = element.value\n if (!newConditionId) newConditionId = element.querySelector('select').value \n const config = this.state.conditionConfigFor(newConditionId)\n const updatePerformed = state.replaceCriterion(criterionIdValue, newConditionId, config)\n if (updatePerformed) {\n this.refreshFromServer()\n }\n }\n\n // Prevent form submission when hitting enter in a text box\n cancelEnter(event) {\n if (event.code === \"Enter\") {\n event.preventDefault()\n event.stopPropagation()\n }\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport moment from 'moment'\nrequire('daterangepicker/daterangepicker.css')\n\n// requires jQuery, moment, might want to consider a vanilla JS alternative\nimport $ from 'jquery' // ensure jquery is loaded before daterangepicker\nimport 'daterangepicker'\n\nexport default class extends Controller {\n static targets = [\n 'field',\n 'hiddenField',\n 'clearButton',\n ]\n\n static values = {\n includeTime: Boolean,\n futureOnly: Boolean,\n drops: String,\n inline: Boolean,\n dateFormat: String,\n timeFormat: String,\n isAmPm: Boolean,\n locale: { type: String, default: 'en' },\n datetimeFormat: { type: String, default: 'MM/DD/YYYY h:mm A' },\n pickerLocale: { type: Object, default: {} },\n }\n\n connect() {\n this.initPluginInstance()\n }\n\n disconnect() {\n this.teardownPluginInstance()\n }\n\n clearDate(event) {\n // don't submit the form, unless it originated from the cancel/clear button\n event.preventDefault()\n\n window.$(this.fieldTarget).val('')\n\n this.dispatch('value-cleared')\n }\n\n applyDateToField(event, picker) {\n const format = this.includeTimeValue ? this.timeFormatValue : this.dateFormatValue\n\n const momentVal = picker\n ? moment(picker.startDate.toISOString())\n : moment(this.fieldTarget.value, 'YYYY-MM-DDTHH:mm').format('YYYY-MM-DDTHH:mm')\n const displayVal = momentVal.format(format)\n const dataVal = this.includeTimeValue ? momentVal.toISOString(true) : momentVal.format('YYYY-MM-DD')\n\n this.fieldTarget.value = displayVal\n this.hiddenFieldTarget.value = dataVal\n // bubble up a change event when the input is updated for other listeners\n window.$(this.fieldTarget).trigger('change', picker)\n\n // emit native change event\n this.hiddenFieldTarget.dispatchEvent(new Event('change', { detail: picker, bubbles: true }))\n }\n\n initPluginInstance() {\n const localeValues = this.pickerLocaleValue\n const isAmPm = this.isAmPmValue\n localeValues['format'] = this.includeTimeValue ? this.timeFormatValue : this.dateFormatValue\n\n window.$(this.fieldTarget).daterangepicker({\n singleDatePicker: true,\n timePicker: this.includeTimeValue,\n timePickerIncrement: 5,\n autoUpdateInput: false,\n autoApply: true,\n minDate: this.futureOnlyValue ? new Date() : false,\n locale: localeValues,\n parentEl: $(this.element),\n drops: this.dropsValue ? this.dropsValue : 'down',\n timePicker24Hour: !isAmPm,\n })\n\n window.$(this.fieldTarget).on('apply.daterangepicker', this.applyDateToField.bind(this))\n window.$(this.fieldTarget).on('cancel.daterangepicker', this.clearDate.bind(this))\n window.$(this.fieldTarget).on('showCalendar.daterangepicker', this.showCalendar.bind(this))\n\n this.pluginMainEl = this.fieldTarget\n this.plugin = $(this.pluginMainEl).data('daterangepicker') // weird\n\n if (this.inlineValue) {\n this.element.classList.add('date-input--inline')\n }\n\n }\n \n teardownPluginInstance() {\n if (this.plugin === undefined) {\n return\n }\n\n $(this.pluginMainEl).off('apply.daterangepicker')\n $(this.pluginMainEl).off('cancel.daterangepicker')\n $(this.pluginMainEl).off('showCalendar.daterangepicker')\n\n // revert to original markup, remove any event listeners\n this.plugin.remove()\n\n }\n\n showCalendar() {\n this.dispatch('show-calendar')\n }\n\n}\n","import { identifierForContextKey } from \"@hotwired/stimulus-webpack-helpers\"\n\nimport AddController from './refine/add-controller'\nimport CriterionFormController from './refine/criterion-form-controller'\nimport DefaultsController from './refine/defaults-controller'\nimport DeleteController from './refine/delete-controller'\nimport FilterPillsController from './refine/filter-pills-controller'\nimport PopupController from './refine/popup-controller'\nimport SearchFilterController from './refine/search-filter-controller'\nimport ServerRefreshController from './refine/server-refresh-controller'\nimport StateController from './refine/state-controller'\nimport StoredFilterController from './refine/stored-filter-controller'\nimport SubmitForm from './refine/submit-form-controller'\nimport ToggleController from './refine/toggle-controller'\nimport TurboStreamFormController from './refine/turbo-stream-form-controller'\nimport TurboStreamLinkController from './refine/turbo-stream-link-controller'\nimport TypeaheadListController from './refine/typeahead-list-controller'\nimport UpdateController from './refine/update-controller'\nimport DateController from './refine/date-controller'\n\nexport const controllerDefinitions = [\n [AddController, 'refine/add-controller.js'],\n [CriterionFormController, 'refine/criterion-form-controller.js'],\n [DefaultsController, 'refine/defaults-controller.js'],\n [DeleteController, 'refine/delete-controller.js'],\n [FilterPillsController, 'refine/filter-pills-controller.js'],\n [PopupController, 'refine/popup-controller.js'],\n [SearchFilterController, 'refine/search-filter-controller.js'],\n [ServerRefreshController, 'refine/server-refresh-controller.js'],\n [StateController, 'refine/state-controller.js'],\n [StoredFilterController, 'refine/stored-filter-controller.js'],\n [SubmitForm, 'refine/submit-form-controller.js'],\n [ToggleController, 'refine/toggle-controller.js'],\n [TurboStreamFormController, 'refine/turbo-stream-form-controller.js'],\n [TurboStreamLinkController, 'refine/turbo-stream-link-controller.js'],\n [TypeaheadListController, './refine/typeahead-list-controller.js'],\n [UpdateController, 'refine/update-controller.js'],\n [DateController, 'refine/date-controller.js']\n].map(function(d) {\n const key = d[1]\n const controller = d[0]\n return {\n identifier: identifierForContextKey(key),\n controllerConstructor: controller\n }\n})\n\nexport {\n AddController,\n CriterionFormController,\n DefaultsController,\n DeleteController,\n FilterPillsController,\n PopupController,\n SearchFilterController,\n ServerRefreshController,\n StateController,\n StoredFilterController,\n SubmitForm,\n ToggleController,\n TurboStreamFormController,\n TurboStreamLinkController,\n TypeaheadListController,\n UpdateController,\n DateController\n}\n"],"names":["identifierForContextKey","key","logicalName","match","replace","Controller","connect","this","state","finishUpdate","currentElement","element","document","body","matches","application","getControllerForElementAndIdentifier","parentNode","refreshFromServer","options","_this","includeErrors","startUpdate","request","FetchRequest","refreshUrlValue","responseKind","query","filterName","JSON","stringify","blueprint","clientIdValue","include_errors","perform","then","e","Promise","reject","ServerRefreshController","criterion","resolve","validateBlueprint","isValid","addCriterion","previousCriterionIdValue","group","_this2","addGroup","_this3","validateBlueprintUrlValue","response","ok","values","previousCriterionId","Number","refresh","_event","formElement","getElementById","formIdValue","formData","FormData","urlValue","url","String","formId","getStateController","updateInput","criterionIdValue","inputValue","controller","criterionId","input","Object","deleteCriterion","urlParams","URLSearchParams","window","location","search","existingParams","delete","event","currentTarget","dataset","index","parseInt","stateController","reloadPage","submitUrlValue","refine_filters_builder","filter_class","blueprint_json","client_id","redirectToStableId","stableId","params","append","allParams","fromEntries","toString","pathname","history","pushState","title","reload","refineStateController","stabilizeFilterController","submitUrl","useClickOutside","boundHandleKeyUp","handleKeyUp","bind","addEventListener","disconnect","removeEventListener","show","preventDefault","frameTarget","src","srcValue","isOpenValue","hide","innerHTML","clickOutside","targets","isOpen","type","Boolean","default","_class","submitFilter","activeElement","blur","querySelector","loadResults","_ref","detail","console","log","Turbo","visit","href","CustomEvent","bubbles","cancelable","undefined","evt","createEvent","initCustomEvent","prototype","Event","blueprintUpdatedEvent","_ref2","dispatchEvent","id","depth","condition","_clauses$","component","meta","clauses","refinements","selected","newInput","clause","forEach","refinement","condition_id","changeDelegate","delegate","blueprintValue","conditions","conditionsValue","classNameValue","conditionsLookup","reduce","lookup","loadingTimeout","abnegate","clearTimeout","setTimeout","loadingTarget","classList","remove","add","conditionConfigFor","conditionId","find","c","defaultConditionIdValue","length","push","word","splice","previous","next","previousIsOr","nextIsRightParen","previousIsLeftParen","isLastInGroup","replaceCriterion","criterionRow","Error","existingCriterion","newCriterion","isEqual","inputId","blueprintPath","split","Array","className","refreshUrl","clientId","validateBlueprintUrl","defaultConditionId","stateDomIdValue","blueprintFieldTarget","value","updateBlueprintField","stateDomId","submit","requestSubmit","toggle","contentTargets","node","toggleAttribute","TurboStreamFormController","method","action","turboMethod","filter","toLowerCase","visibleCategories","Set","listItemTargets","listItemNode","listItemValue","includes","hidden","category","recommendedTargets","recommendedNode","size","categoryTargets","categoryNode","has","initialize","updateBlueprint","debounce","inputKey","refinedFilter","target","select","slice","call","option","map","newConditionId","config","cancelEnter","code","stopPropagation","require","initPluginInstance","teardownPluginInstance","clearDate","$","fieldTarget","val","dispatch","applyDateToField","picker","format","includeTimeValue","timeFormatValue","dateFormatValue","momentVal","moment","startDate","toISOString","displayVal","dataVal","hiddenFieldTarget","trigger","localeValues","pickerLocaleValue","isAmPm","isAmPmValue","daterangepicker","singleDatePicker","timePicker","timePickerIncrement","autoUpdateInput","autoApply","minDate","futureOnlyValue","Date","locale","parentEl","drops","dropsValue","timePicker24Hour","on","showCalendar","pluginMainEl","plugin","data","inlineValue","off","includeTime","futureOnly","inline","dateFormat","timeFormat","datetimeFormat","pickerLocale","controllerDefinitions","AddController","CriterionFormController","DefaultsController","DeleteController","FilterPillsController","PopupController","SearchFilterController","StateController","StoredFilterController","SubmitForm","ToggleController","TurboStreamLinkController","TypeaheadListController","UpdateController","DateController","d","identifier","controllerConstructor"],"mappings":"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"}
1
+ {"version":3,"file":"refine-stimulus.umd.js","sources":["../../../node_modules/@hotwired/stimulus-webpack-helpers/dist/stimulus-webpack-helpers.js","../../javascript/controllers/refine/server-refresh-controller.js","../../javascript/controllers/refine/add-controller.js","../../javascript/controllers/refine/criterion-form-controller.js","../../javascript/controllers/refine/defaults-controller.js","../../javascript/controllers/refine/delete-controller.js","../../javascript/controllers/refine/filter-pills-controller.js","../../javascript/controllers/refine/popup-controller.js","../../javascript/controllers/refine/modal-controller.js","../../javascript/controllers/refine/search-filter-controller.js","../../javascript/refine/helpers/index.js","../../javascript/controllers/refine/state-controller.js","../../javascript/controllers/refine/stored-filter-controller.js","../../javascript/controllers/refine/submit-form-controller.js","../../javascript/controllers/refine/toggle-controller.js","../../javascript/controllers/refine/turbo-stream-form-controller.js","../../javascript/controllers/refine/turbo-stream-link-controller.js","../../javascript/controllers/refine/typeahead-list-controller.js","../../javascript/controllers/refine/update-controller.js","../../javascript/controllers/refine/date-controller.js","../../javascript/controllers/index.js"],"sourcesContent":["/*\nStimulus Webpack Helpers 1.0.0\nCopyright © 2021 Basecamp, LLC\n */\nfunction definitionsFromContext(context) {\n return context.keys()\n .map((key) => definitionForModuleWithContextAndKey(context, key))\n .filter((value) => value);\n}\nfunction definitionForModuleWithContextAndKey(context, key) {\n const identifier = identifierForContextKey(key);\n if (identifier) {\n return definitionForModuleAndIdentifier(context(key), identifier);\n }\n}\nfunction definitionForModuleAndIdentifier(module, identifier) {\n const controllerConstructor = module.default;\n if (typeof controllerConstructor == \"function\") {\n return { identifier, controllerConstructor };\n }\n}\nfunction identifierForContextKey(key) {\n const logicalName = (key.match(/^(?:\\.\\/)?(.+)(?:[_-]controller\\..+?)$/) || [])[1];\n if (logicalName) {\n return logicalName.replace(/_/g, \"-\").replace(/\\//g, \"--\");\n }\n}\n\nexport { definitionForModuleAndIdentifier, definitionForModuleWithContextAndKey, definitionsFromContext, identifierForContextKey };\n","import { Controller } from \"@hotwired/stimulus\"\nimport { FetchRequest } from '@rails/request.js'\n\n\n// Base class for controllers that reload form content from the server\nexport default class extends Controller {\n connect() {\n this.state.finishUpdate()\n }\n\n get state() {\n let currentElement = this.element\n\n while(currentElement !== document.body) {\n if (currentElement.matches('[data-controller~=\"refine--state\"]'))\n return this.application.getControllerForElementAndIdentifier(currentElement, 'refine--state')\n else {\n currentElement = currentElement.parentNode\n }\n }\n\n return null\n }\n\n async refreshFromServer(options = {}) {\n const { includeErrors } = options\n this.state.startUpdate()\n const request = new FetchRequest(\n \"GET\",\n this.state.refreshUrlValue,\n {\n responseKind: \"turbo-stream\",\n query: {\n \"refine_filters_builder[filter_class]\": this.state.filterName,\n \"refine_filters_builder[blueprint_json]\": JSON.stringify(this.state.blueprint),\n \"refine_filters_builder[client_id]\": this.state.clientIdValue,\n include_errors: !!includeErrors\n }\n }\n )\n await request.perform()\n }\n}\n","import ServerRefreshController from './server-refresh-controller'\nimport { FetchRequest } from '@rails/request.js'\n\nexport default class extends ServerRefreshController {\n static values = {\n previousCriterionId: Number,\n }\n\n async criterion() {\n const isValid = await this.validateBlueprint()\n if (isValid) {\n this.state.addCriterion(this.previousCriterionIdValue)\n }\n this.refreshFromServer({includeErrors: !isValid})\n }\n\n async group() {\n const isValid = await this.validateBlueprint()\n if (isValid) {\n this.state.addGroup()\n }\n this.refreshFromServer({includeErrors: !isValid})\n }\n\n async validateBlueprint(blueprint) {\n const { state } = this\n\n const request = new FetchRequest(\n \"GET\",\n this.state.validateBlueprintUrlValue,\n {\n query: {\n \"refine_filters_builder[filter_class]\": this.state.filterName,\n \"refine_filters_builder[blueprint_json]\": JSON.stringify(this.state.blueprint),\n \"refine_filters_builder[client_id]\": this.state.clientIdValue\n }\n }\n )\n const response = await request.perform()\n return response.ok\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { FetchRequest } from '@rails/request.js'\n\n/*\n This controller handles criteria forms\n (refine/inline/criteria/new|edit)\n*/\nexport default class extends Controller {\n static values = {\n url: String,\n formId: String\n }\n\n async refresh(_event) {\n // update the url with params from the form\n const formElement = document.getElementById(this.formIdValue)\n const formData = new FormData(formElement)\n\n const request = new FetchRequest(\n \"GET\",\n this.urlValue,\n {\n query: formData,\n responseKind: \"turbo-stream\"\n }\n )\n const response = await request.perform()\n }\n\n\n\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n static values = {\n criterionId: Number,\n input: Object,\n };\n\n connect() {\n this.state = this.getStateController()\n\n this.state.updateInput(\n this.criterionIdValue,\n this.inputValue,\n );\n }\n\n getStateController() {\n let currentElement = this.element\n\n while(currentElement !== document.body) {\n const controller = this.application.getControllerForElementAndIdentifier(currentElement, 'refine--state')\n if (controller) {\n return controller\n } else {\n currentElement = currentElement.parentNode\n }\n }\n\n return null\n }\n}\n","import ServerRefreshController from './server-refresh-controller';\n\nexport default class extends ServerRefreshController {\n static values = {\n criterionId: Number,\n }\n\n criterion() {\n const { state, criterionIdValue } = this;\n state.deleteCriterion(criterionIdValue);\n this.refreshFromServer()\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { FetchRequest } from '@rails/request.js'\n\nexport default class extends Controller {\n static values = {\n submitUrl: String\n }\n\n connect() {\n const urlParams = new URLSearchParams(window.location.search)\n this.existingParams = urlParams\n this.existingParams.delete('stable_id')\n }\n\n delete(event) {\n const { criterionId } = event.currentTarget.dataset\n var index = parseInt(criterionId)\n this.stateController.deleteCriterion(index)\n this.reloadPage()\n }\n\n async reloadPage() {\n const {blueprint} = this.stateController\n const request = new FetchRequest(\n \"POST\",\n this.submitUrlValue,\n {\n responseKind: \"turbo-stream\",\n body: JSON.stringify({\n refine_filters_builder: {\n filter_class: this.stateController.filterName,\n blueprint_json: JSON.stringify(blueprint),\n client_id: this.stateController.clientIdValue\n }\n })\n }\n )\n await request.perform()\n }\n\n redirectToStableId(stableId) {\n const params = new URLSearchParams()\n if (stableId) {\n params.append('stable_id', stableId)\n }\n const allParams = new URLSearchParams({\n ...Object.fromEntries(this.existingParams),\n ...Object.fromEntries(params),\n }).toString()\n const url = `${window.location.pathname}?${allParams}`\n\n history.pushState({}, document.title, url)\n window.location.reload()\n }\n\n get stateController() {\n return this.element.refineStateController\n }\n\n get stabilizeFilterController() {\n return this.element.stabilizeFilterController\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { useClickOutside } from 'stimulus-use'\n\n// simple controller to hide/show the filter modal\nexport default class extends Controller {\n static targets = [\"frame\"]\n\n static values = {\n src: String,\n isOpen: {type: Boolean, default: false}\n }\n\n connect() {\n useClickOutside(this)\n this.boundHandleKeyUp = this.handleKeyUp.bind(this)\n document.addEventListener(\"keyup\", this.boundHandleKeyUp)\n }\n\n disconnect() {\n document.removeEventListener(\"keyup\", this.boundHandleKeyUp)\n }\n\n show(event) {\n event.preventDefault()\n this.frameTarget.src = this.srcValue;\n this.isOpenValue = true\n }\n\n hide(event) {\n if (this.isOpenValue) {\n event?.preventDefault()\n this.frameTarget.innerHTML = \"\";\n this.isOpenValue = false\n }\n }\n\n clickOutside(event) {\n this.hide(event)\n }\n\n handleKeyUp(event) {\n if (event.key === \"Escape\" || event.key === \"Esc\") {\n this.hide(event)\n }\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { useClickOutside } from 'stimulus-use'\n\n// simple controller to hide/show the filter modal\nexport default class extends Controller {\n static targets = [\"frame\"]\n\n static values = {\n src: String,\n isOpen: {type: Boolean, default: false}\n }\n\n connect() {\n console.log(\"Connecting modal controller\")\n useClickOutside(this)\n }\n\n disconnect() {\n }\n\n open(event) {\n console.log(\"Opening modal!!!\", this.srcValue)\n event.preventDefault()\n this.frameTarget.src = this.srcValue;\n this.isOpenValue = true\n }\n\n close(event) {\n if (this.isOpenValue) {\n event?.preventDefault()\n this.frameTarget.innerHTML = \"\";\n this.isOpenValue = false\n }\n }\n\n clickOutside(event) {\n this.close(event)\n }\n\n\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { FetchRequest } from '@rails/request.js'\n\nexport default class extends Controller {\n static values = {\n submitUrl: String\n }\n\n\n search(event) {\n event.preventDefault()\n this.submitFilter()\n document.activeElement.blur()\n }\n\n async submitFilter() {\n const {blueprint} = this.stateController\n const request = new FetchRequest(\n \"POST\",\n this.submitUrlValue,\n {\n responseKind: \"turbo-stream\",\n body: JSON.stringify({\n refine_filters_builder: {\n filter_class: this.stateController.filterName,\n blueprint_json: JSON.stringify(blueprint),\n client_id: this.stateController.clientIdValue\n }\n })\n }\n )\n await request.perform()\n }\n\n get stateController() {\n return this\n .element\n .querySelector('[data-controller~=\"refine--state\"]')\n .refineStateController\n }\n\n loadResults({detail: {url}}) {\n console.log(\"filter submit success\")\n if (window.Turbo) {\n window.Turbo.visit(url)\n } else {\n window.location.href = url\n }\n }\n}\n","// Polyfill for custom events in IE9-11\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#polyfill\n;(function () {\n if (typeof window.CustomEvent === 'function') return false\n\n function CustomEvent(event, params) {\n params = params || { bubbles: false, cancelable: false, detail: undefined }\n var evt = document.createEvent('CustomEvent')\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail)\n return evt\n }\n\n CustomEvent.prototype = window.Event.prototype\n\n window.CustomEvent = CustomEvent\n\n // eslint expects a return here\n return true\n})()\n\nexport const filterStabilizedEvent = (element, stableId, filterName) => {\n const event = new CustomEvent('filter-stabilized', {\n bubbles: true,\n cancelable: true,\n detail: {\n stableId,\n filterName,\n },\n })\n element.dispatchEvent(event)\n}\n\nexport const filterUnstableEvent = (blueprint) => {\n const event = new CustomEvent('filter-unstable', {\n bubbles: true,\n cancelable: true,\n detail: {\n blueprint,\n },\n })\n window.dispatchEvent(event)\n}\n\nexport const filterInvalidEvent = ({blueprint, errors}) => {\n const event = new CustomEvent('filter-invalid', {\n bubbles: true,\n cancelable: true,\n detail: {\n blueprint,\n errors,\n },\n })\n window.dispatchEvent(event)\n}\n\nexport const filterStoredEvent = (storedFilterId) => {\n const event = new CustomEvent('filter-stored', {\n bubbles: true,\n cancelable: true,\n detail: {\n storedFilterId,\n },\n })\n window.dispatchEvent(event)\n}\n\nexport const blueprintUpdatedEvent = (element, {blueprint, formId}) => {\n const event = new CustomEvent('blueprint-updated', {\n bubbles: true,\n cancelable: true,\n detail: {\n blueprint,\n formId\n },\n })\n element.dispatchEvent(event)\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { delegate, abnegate } from 'jquery-events-to-dom-events'\nimport { blueprintUpdatedEvent } from '../../refine/helpers'\nimport { isEqual } from 'lodash'\n\nconst criterion = (id, depth, condition) => {\n const component = condition?.component\n const meta = condition?.meta || { clauses: [], options: {}}\n const refinements = condition?.refinements || []\n const { clauses, options } = meta\n let selected\n if (component === 'option-condition') {\n selected = options[0] ? [options[0].id] : []\n } else {\n selected = undefined\n }\n // Set newInput based on component\n\n let newInput = {\n clause: clauses[0]?.id,\n selected: selected,\n }\n\n // If refinements are present, add to input array\n refinements.forEach((refinement) => {\n const { meta, component } = refinement\n const { clauses, options } = meta\n let selected\n if (component === 'option-condition') {\n selected = options[0] ? [options[0].id] : []\n } else {\n selected = undefined\n }\n newInput[refinement.id] = {\n clause: clauses[0].id,\n selected: selected,\n }\n })\n\n return {\n depth,\n type: 'criterion',\n condition_id: id,\n input: newInput,\n }\n}\n\nconst or = function (depth) {\n depth = depth === undefined ? 0 : depth\n return {\n depth,\n type: 'conjunction',\n word: 'or',\n }\n}\n\nconst and = function (depth) {\n depth = depth === undefined ? 1 : depth\n return {\n depth,\n type: 'conjunction',\n word: 'and',\n }\n}\nexport default class extends Controller {\n static values = {\n blueprint: Array,\n conditions: Array,\n className: String,\n refreshUrl: String,\n clientId: String,\n validateBlueprintUrl: String,\n defaultConditionId: String\n }\n static targets = ['loading']\n\n\n connect() {\n // for select2 jquery events and datepicker\n this.element.refineStateController = this\n this.changeDelegate = delegate('change', ['event', 'picker'])\n this.blueprint = this.blueprintValue\n this.conditions = this.conditionsValue\n this.filterName = this.classNameValue\n this.conditionsLookup = this.conditions.reduce((lookup, condition) => {\n lookup[condition.id] = condition\n return lookup\n }, {})\n this.loadingTimeout = null\n blueprintUpdatedEvent(this.element, {blueprint: this.blueprint, formId: this.formIdValue})\n }\n\n disconnect() {\n abnegate('change', this.changeDelegate)\n }\n\n startUpdate() {\n if (this.loadingTimeout) {\n window.clearTimeout(this.loadingTimeout)\n }\n // only show the loading overlay if it's taking a long time\n // to render the updates\n this.loadingTimeout = window.setTimeout(() => {\n this.loadingTarget.classList.remove('hidden')\n }, 1000)\n }\n\n finishUpdate() {\n if (this.loadingTimeout) {\n window.clearTimeout(this.loadingTimeout)\n }\n this.loadingTarget.classList.add('hidden')\n }\n\n conditionConfigFor(conditionId) {\n return this.conditionsLookup[conditionId]\n }\n\n addGroup() {\n const { blueprint, conditions } = this\n const condition = ( conditions.find(c => c.id == this.defaultConditionIdValue) || conditions[0] )\n const { meta } = condition\n\n if (this.blueprint.length > 0) {\n this.blueprint.push(or())\n }\n this.blueprint.push(criterion(condition.id, 1, condition))\n blueprintUpdatedEvent(this.element, {blueprint: this.blueprint, formId: this.formIdValue})\n }\n\n addCriterion(previousCriterionId) {\n const { blueprint, conditions } = this\n const condition = ( conditions.find(c => c.id == this.defaultConditionIdValue) || conditions[0] )\n const { meta } = condition\n blueprint.splice(previousCriterionId + 1, 0, and(), criterion(condition.id, 1, condition))\n blueprintUpdatedEvent(this.element, {blueprint: this.blueprint, formId: this.formIdValue})\n }\n\n deleteCriterion(criterionId) {\n /**\n To support 'groups' there is some complicated logic for deleting criterion.\n\n Imagine this simplified blueprint: [eq, and, sw, or, eq]\n\n User clicks to delete the last eq. We also have to delete the preceding or\n otherwise we're left with a hanging empty group\n\n What if the user deletes the sw? We have to clean up the preceding and.\n\n Imagine another scenario: [eq or sw and ew]\n Now we delete the first eq but this time we need to clean up the or.\n\n These conditionals cover these cases.\n **/\n const { blueprint } = this\n const previous = blueprint[criterionId - 1]\n const next = blueprint[criterionId + 1]\n\n const nextIsOr = next && next.word === 'or'\n const previousIsOr = previous && previous.word === 'or'\n\n const nextIsRightParen = nextIsOr || !next\n const previousIsLeftParen = previousIsOr || !previous\n\n const isFirstInGroup = previousIsLeftParen && !nextIsRightParen\n const isLastInGroup = previousIsLeftParen && nextIsRightParen\n const isLastCriterion = !previous && !next\n\n if (isLastCriterion) {\n this.blueprint = []\n } else if (isLastInGroup && previousIsOr) {\n blueprint.splice(criterionId - 1, 2)\n } else if (isLastInGroup && !previous) {\n blueprint.splice(criterionId, 2)\n } else if (isFirstInGroup) {\n blueprint.splice(criterionId, 2)\n } else {\n blueprint.splice(criterionId - 1, 2)\n }\n\n blueprintUpdatedEvent(this.element, {blueprint: this.blueprint, formId: this.formIdValue})\n }\n\n /*\n Updates a criterion in the blueprint\n Returns true if an update was actually performed, or false if no-op\n */\n replaceCriterion(criterionId, conditionId, condition) {\n const criterionRow = this.blueprint[criterionId]\n if (criterionRow.type !== 'criterion') {\n throw new Error(\n `You can't call updateConditionId on a non-criterion type. Trying to update ${JSON.stringify(criterion)}`\n )\n }\n const existingCriterion = this.blueprint[criterionId]\n const newCriterion = criterion(conditionId, criterionRow.depth, condition)\n if (isEqual(existingCriterion, newCriterion)) {\n return false\n } else {\n this.blueprint[criterionId] = newCriterion\n blueprintUpdatedEvent(this.element, {blueprint: this.blueprint, formId: this.formIdValue})\n return true\n }\n }\n\n updateInput(criterionId, input, inputId) {\n // Input id is an array of hash keys that define the path for this input such as [\"input\", \"date_refinement\"]\n const { blueprint } = this\n const criterion = blueprint[criterionId]\n inputId = inputId || 'input'\n const blueprintPath = inputId.split(', ')\n // If the inputId contains more than one element, add input at appropriate depth\n if (blueprintPath.length > 1) {\n criterion[blueprintPath[0]][blueprintPath[1]] = { ...criterion[blueprintPath[0]][blueprintPath[1]], ...input }\n } else {\n criterion[inputId] = { ...criterion[inputId], ...input }\n }\n blueprintUpdatedEvent(this.element, {blueprint: this.blueprint, formId: this.formIdValue})\n }\n\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { filterStoredEvent } from '../../refine/helpers'\n\nexport default class extends Controller {\n static targets = ['blueprintField']\n static values = { formId: String, stateDomId: String }\n\n connect() {\n const stateController = document\n .getElementById(this.stateDomIdValue)\n .refineStateController\n this.blueprintFieldTarget.value = JSON.stringify(stateController.blueprint)\n console.log(\"connect\", this.blueprintFieldTarget.value)\n }\n\n updateBlueprintField(event) {\n if (event.detail.formId != this.formIdValue) { return null }\n const { detail } = event\n const { blueprint } = detail\n this.blueprintFieldTarget.value = JSON.stringify(blueprint)\n console.log(\"update blueprint\", this.blueprintFieldTarget.value)\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n submit(event) {\n event.preventDefault()\n this.element.requestSubmit()\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\n// simple controller to hide/show the filter modal\nexport default class extends Controller {\n static targets = [\"content\"]\n\n toggle(_event) {\n this.contentTargets.forEach(node => {\n node.toggleAttribute(\"hidden\")\n })\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { FetchRequest } from '@rails/request.js'\n\n/*\n attach to a form element to have it submit to a turbo-stream endpoint\n\n <form action=\"/contacts\" data-controller=\"refine--turbo-stream-form\" data-action=\"submit->refine--turbo-stream-form#submit\">\n\n Turbo is supposed to handle this natively but we're seeing issues when the form is inside an iframe\n*/\nexport default class extends Controller {\n async submit(event) {\n event.preventDefault()\n const request = new FetchRequest(\n (this.element.method || \"POST\"),\n this.element.action,\n {\n responseKind: \"turbo-stream\",\n body: new FormData(this.element)\n }\n )\n await request.perform()\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { FetchRequest } from '@rails/request.js'\n\n/*\n attach to a link element to have it request turbo stream responses\n\n <a href=\"/contacts\" data-controller=\"refine--turbo-stream-link\" data-action=\"refine--turbo-stream-link#get\">Click me</a>\n\n Turbo is supposed to handle this natively with data-turbo-stream but we're\n seeing issues using that attribute inside iframes\n*/\nexport default class extends Controller {\n async visit(event) {\n event.preventDefault()\n const request = new FetchRequest(\n (this.element.dataset.turboMethod || \"GET\"),\n this.element.href,\n {\n responseKind: \"turbo-stream\",\n }\n )\n await request.perform()\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n\n static targets = ['listItem', 'category', 'recommended']\n\n filter(event) {\n const query = event.currentTarget.value.toLowerCase()\n const visibleCategories = new Set()\n\n // hide / show listItem links that match the query and note which\n // categories should be visible\n this.listItemTargets.forEach(listItemNode => {\n const listItemName = listItemNode.dataset.listItemValue.toLowerCase()\n if (listItemName.includes(query)) {\n listItemNode.hidden = false\n visibleCategories.add(listItemNode.dataset.category)\n } else {\n listItemNode.hidden = true\n }\n })\n\n this.recommendedTargets.forEach(recommendedNode => {\n (query !== '' && visibleCategories.size === 0) ? recommendedNode.hidden = true : recommendedNode.hidden = false\n })\n\n // hide / show category headers that have visible listItems\n this.categoryTargets.forEach(categoryNode => {\n const categoryName = categoryNode.innerHTML\n if (visibleCategories.has(categoryName)) {\n categoryNode.hidden = false\n } else {\n categoryNode.hidden = true\n }\n })\n }\n}\n","import ServerRefreshController from './server-refresh-controller'\nimport { debounce } from 'lodash'\n\nexport default class extends ServerRefreshController {\n static values = {\n criterionId: Number,\n }\n\n initialize() {\n this.updateBlueprint = debounce((event, value, inputKey) => {\n this.value(event, value, inputKey)\n }, 500)\n }\n\n refinedFilter(event) {\n const { criterionIdValue, state } = this\n const dataset = event.target.dataset\n const inputId = dataset.inputId\n\n state.updateInput(\n criterionIdValue,\n {\n id: event.target.value,\n },\n inputId\n )\n this.refreshFromServer()\n }\n\n clause(event) {\n const { criterionIdValue, state } = this\n const dataset = event.target.dataset\n const inputId = dataset.inputId\n state.updateInput(\n criterionIdValue,\n {\n clause: event.target.value,\n },\n inputId\n )\n this.refreshFromServer()\n }\n\n selected(event) {\n const { target: select } = event\n const options = Array.prototype.slice.call(select.options)\n const selectedOptions = options.filter((option) => option.selected)\n const selected = selectedOptions.map((option) => option.value)\n this.value(event, selected, 'selected')\n }\n\n value(event, value, inputKey) {\n const { criterionIdValue, state } = this\n const dataset = event.target.dataset\n const inputId = dataset.inputId\n inputKey = inputKey || dataset.inputKey || 'value'\n value = value || event.target.value\n state.updateInput(\n criterionIdValue,\n {\n [inputKey]: value,\n },\n inputId\n )\n }\n\n condition(event) {\n const { criterionIdValue, state } = this\n const element = event.target\n let newConditionId = element.value\n if (!newConditionId) newConditionId = element.querySelector('select').value \n const config = this.state.conditionConfigFor(newConditionId)\n const updatePerformed = state.replaceCriterion(criterionIdValue, newConditionId, config)\n if (updatePerformed) {\n this.refreshFromServer()\n }\n }\n\n // Prevent form submission when hitting enter in a text box\n cancelEnter(event) {\n if (event.code === \"Enter\") {\n event.preventDefault()\n event.stopPropagation()\n }\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport moment from 'moment'\nrequire('daterangepicker/daterangepicker.css')\n\n// requires jQuery, moment, might want to consider a vanilla JS alternative\nimport $ from 'jquery' // ensure jquery is loaded before daterangepicker\nimport 'daterangepicker'\n\nexport default class extends Controller {\n static targets = [\n 'field',\n 'hiddenField',\n 'clearButton',\n ]\n\n static values = {\n includeTime: Boolean,\n futureOnly: Boolean,\n drops: String,\n inline: Boolean,\n dateFormat: String,\n timeFormat: String,\n isAmPm: Boolean,\n locale: { type: String, default: 'en' },\n datetimeFormat: { type: String, default: 'MM/DD/YYYY h:mm A' },\n pickerLocale: { type: Object, default: {} },\n }\n\n connect() {\n this.initPluginInstance()\n }\n\n disconnect() {\n this.teardownPluginInstance()\n }\n\n clearDate(event) {\n // don't submit the form, unless it originated from the cancel/clear button\n event.preventDefault()\n\n window.$(this.fieldTarget).val('')\n\n this.dispatch('value-cleared')\n }\n\n applyDateToField(event, picker) {\n const format = this.includeTimeValue ? this.timeFormatValue : this.dateFormatValue\n\n const momentVal = picker\n ? moment(picker.startDate.toISOString())\n : moment(this.fieldTarget.value, 'YYYY-MM-DDTHH:mm').format('YYYY-MM-DDTHH:mm')\n const displayVal = momentVal.format(format)\n const dataVal = this.includeTimeValue ? momentVal.toISOString(true) : momentVal.format('YYYY-MM-DD')\n\n this.fieldTarget.value = displayVal\n this.hiddenFieldTarget.value = dataVal\n // bubble up a change event when the input is updated for other listeners\n window.$(this.fieldTarget).trigger('change', picker)\n\n // emit native change event\n this.hiddenFieldTarget.dispatchEvent(new Event('change', { detail: picker, bubbles: true }))\n }\n\n initPluginInstance() {\n const localeValues = this.pickerLocaleValue\n const isAmPm = this.isAmPmValue\n localeValues['format'] = this.includeTimeValue ? this.timeFormatValue : this.dateFormatValue\n\n window.$(this.fieldTarget).daterangepicker({\n singleDatePicker: true,\n timePicker: this.includeTimeValue,\n timePickerIncrement: 5,\n autoUpdateInput: false,\n autoApply: true,\n minDate: this.futureOnlyValue ? new Date() : false,\n locale: localeValues,\n parentEl: $(this.element),\n drops: this.dropsValue ? this.dropsValue : 'down',\n timePicker24Hour: !isAmPm,\n })\n\n window.$(this.fieldTarget).on('apply.daterangepicker', this.applyDateToField.bind(this))\n window.$(this.fieldTarget).on('cancel.daterangepicker', this.clearDate.bind(this))\n window.$(this.fieldTarget).on('showCalendar.daterangepicker', this.showCalendar.bind(this))\n\n this.pluginMainEl = this.fieldTarget\n this.plugin = $(this.pluginMainEl).data('daterangepicker') // weird\n\n if (this.inlineValue) {\n this.element.classList.add('date-input--inline')\n }\n\n }\n \n teardownPluginInstance() {\n if (this.plugin === undefined) {\n return\n }\n\n $(this.pluginMainEl).off('apply.daterangepicker')\n $(this.pluginMainEl).off('cancel.daterangepicker')\n $(this.pluginMainEl).off('showCalendar.daterangepicker')\n\n // revert to original markup, remove any event listeners\n this.plugin.remove()\n\n }\n\n showCalendar() {\n this.dispatch('show-calendar')\n }\n\n}\n","import { identifierForContextKey } from \"@hotwired/stimulus-webpack-helpers\"\n\nimport AddController from './refine/add-controller'\nimport CriterionFormController from './refine/criterion-form-controller'\nimport DefaultsController from './refine/defaults-controller'\nimport DeleteController from './refine/delete-controller'\nimport FilterPillsController from './refine/filter-pills-controller'\nimport PopupController from './refine/popup-controller'\nimport ModalController from './refine/modal-controller'\nimport SearchFilterController from './refine/search-filter-controller'\nimport ServerRefreshController from './refine/server-refresh-controller'\nimport StateController from './refine/state-controller'\nimport StoredFilterController from './refine/stored-filter-controller'\nimport SubmitForm from './refine/submit-form-controller'\nimport ToggleController from './refine/toggle-controller'\nimport TurboStreamFormController from './refine/turbo-stream-form-controller'\nimport TurboStreamLinkController from './refine/turbo-stream-link-controller'\nimport TypeaheadListController from './refine/typeahead-list-controller'\nimport UpdateController from './refine/update-controller'\nimport DateController from './refine/date-controller'\n\nexport const controllerDefinitions = [\n [AddController, 'refine/add-controller.js'],\n [CriterionFormController, 'refine/criterion-form-controller.js'],\n [DefaultsController, 'refine/defaults-controller.js'],\n [DeleteController, 'refine/delete-controller.js'],\n [FilterPillsController, 'refine/filter-pills-controller.js'],\n [PopupController, 'refine/popup-controller.js'],\n [ModalController, 'refine/modal-controller.js'],\n [SearchFilterController, 'refine/search-filter-controller.js'],\n [ServerRefreshController, 'refine/server-refresh-controller.js'],\n [StateController, 'refine/state-controller.js'],\n [StoredFilterController, 'refine/stored-filter-controller.js'],\n [SubmitForm, 'refine/submit-form-controller.js'],\n [ToggleController, 'refine/toggle-controller.js'],\n [TurboStreamFormController, 'refine/turbo-stream-form-controller.js'],\n [TurboStreamLinkController, 'refine/turbo-stream-link-controller.js'],\n [TypeaheadListController, './refine/typeahead-list-controller.js'],\n [UpdateController, 'refine/update-controller.js'],\n [DateController, 'refine/date-controller.js']\n].map(function(d) {\n const key = d[1]\n const controller = d[0]\n return {\n identifier: identifierForContextKey(key),\n controllerConstructor: controller\n }\n})\n\nexport {\n AddController,\n CriterionFormController,\n DefaultsController,\n DeleteController,\n FilterPillsController,\n PopupController,\n ModalController,\n SearchFilterController,\n ServerRefreshController,\n StateController,\n StoredFilterController,\n SubmitForm,\n ToggleController,\n TurboStreamFormController,\n TurboStreamLinkController,\n TypeaheadListController,\n UpdateController,\n DateController\n}\n"],"names":["identifierForContextKey","key","logicalName","match","replace","Controller","connect","this","state","finishUpdate","currentElement","element","document","body","matches","application","getControllerForElementAndIdentifier","parentNode","refreshFromServer","options","_this","includeErrors","startUpdate","request","FetchRequest","refreshUrlValue","responseKind","query","filterName","JSON","stringify","blueprint","clientIdValue","include_errors","perform","then","e","Promise","reject","ServerRefreshController","criterion","resolve","validateBlueprint","isValid","addCriterion","previousCriterionIdValue","group","_this2","addGroup","_this3","validateBlueprintUrlValue","response","ok","values","previousCriterionId","Number","refresh","_event","formElement","getElementById","formIdValue","formData","FormData","urlValue","url","String","formId","getStateController","updateInput","criterionIdValue","inputValue","controller","criterionId","input","Object","deleteCriterion","urlParams","URLSearchParams","window","location","search","existingParams","delete","event","currentTarget","dataset","index","parseInt","stateController","reloadPage","submitUrlValue","refine_filters_builder","filter_class","blueprint_json","client_id","redirectToStableId","stableId","params","append","allParams","fromEntries","toString","pathname","history","pushState","title","reload","refineStateController","stabilizeFilterController","submitUrl","useClickOutside","boundHandleKeyUp","handleKeyUp","bind","addEventListener","disconnect","removeEventListener","show","preventDefault","frameTarget","src","srcValue","isOpenValue","hide","innerHTML","clickOutside","targets","isOpen","type","Boolean","default","console","log","open","close","_class","submitFilter","activeElement","blur","querySelector","loadResults","_ref","detail","Turbo","visit","href","CustomEvent","bubbles","cancelable","undefined","evt","createEvent","initCustomEvent","prototype","Event","blueprintUpdatedEvent","_ref2","dispatchEvent","id","depth","condition","_clauses$","component","meta","clauses","refinements","selected","newInput","clause","forEach","refinement","condition_id","changeDelegate","delegate","blueprintValue","conditions","conditionsValue","classNameValue","conditionsLookup","reduce","lookup","loadingTimeout","abnegate","clearTimeout","setTimeout","loadingTarget","classList","remove","add","conditionConfigFor","conditionId","find","c","defaultConditionIdValue","length","push","word","splice","previous","next","previousIsOr","nextIsRightParen","previousIsLeftParen","isLastInGroup","replaceCriterion","criterionRow","Error","existingCriterion","newCriterion","isEqual","inputId","blueprintPath","split","Array","className","refreshUrl","clientId","validateBlueprintUrl","defaultConditionId","stateDomIdValue","blueprintFieldTarget","value","updateBlueprintField","stateDomId","submit","requestSubmit","toggle","contentTargets","node","toggleAttribute","TurboStreamFormController","method","action","turboMethod","filter","toLowerCase","visibleCategories","Set","listItemTargets","listItemNode","listItemValue","includes","hidden","category","recommendedTargets","recommendedNode","size","categoryTargets","categoryNode","has","initialize","updateBlueprint","debounce","inputKey","refinedFilter","target","select","slice","call","option","map","newConditionId","config","cancelEnter","code","stopPropagation","require","initPluginInstance","teardownPluginInstance","clearDate","$","fieldTarget","val","dispatch","applyDateToField","picker","format","includeTimeValue","timeFormatValue","dateFormatValue","momentVal","moment","startDate","toISOString","displayVal","dataVal","hiddenFieldTarget","trigger","localeValues","pickerLocaleValue","isAmPm","isAmPmValue","daterangepicker","singleDatePicker","timePicker","timePickerIncrement","autoUpdateInput","autoApply","minDate","futureOnlyValue","Date","locale","parentEl","drops","dropsValue","timePicker24Hour","on","showCalendar","pluginMainEl","plugin","data","inlineValue","off","includeTime","futureOnly","inline","dateFormat","timeFormat","datetimeFormat","pickerLocale","controllerDefinitions","AddController","CriterionFormController","DefaultsController","DeleteController","FilterPillsController","PopupController","ModalController","SearchFilterController","StateController","StoredFilterController","SubmitForm","ToggleController","TurboStreamLinkController","TypeaheadListController","UpdateController","DateController","d","identifier","controllerConstructor"],"mappings":"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"}
@@ -1239,12 +1239,24 @@
1239
1239
  flex-wrap: wrap;
1240
1240
  display: flex;
1241
1241
  align-items: center;
1242
+ justify-content: end;
1242
1243
  }
1243
1244
 
1244
- @media (max-width: 960px) {
1245
+ @media (max-width: 1525px) {
1245
1246
  .refine--filter-control-group {
1246
- justify-content: end;
1247
- width: 25%;
1247
+ width: 24%;
1248
+ }
1249
+ }
1250
+
1251
+ @media (max-width: 1200px) {
1252
+ .refine--filter-control-group {
1253
+ width: 30%;
1254
+ }
1255
+ }
1256
+
1257
+ @media (max-width: 1100px) {
1258
+ .refine--filter-control-group {
1259
+ width: 40%;
1248
1260
  }
1249
1261
  }
1250
1262
 
@@ -1265,6 +1277,14 @@
1265
1277
  text-align: left;
1266
1278
  }
1267
1279
 
1280
+ .refine--group-join {
1281
+ &:hover {
1282
+ .refine--remove-group {
1283
+ display: block;
1284
+ }
1285
+ }
1286
+ }
1287
+
1268
1288
  .refine--group {
1269
1289
  display: flex;
1270
1290
  gap: 10px;
@@ -1383,7 +1403,7 @@
1383
1403
  padding: 4px;
1384
1404
  }
1385
1405
 
1386
- .refine--remove-condition {
1406
+ .refine--remove-condition, .refine--remove-group {
1387
1407
  display: none;
1388
1408
  color: #fff;
1389
1409
  padding: 0px 2px 0px 2px;
@@ -1400,12 +1420,11 @@
1400
1420
  .icon.refine--icon-sm {
1401
1421
  padding: 2px 0 ;
1402
1422
  }
1403
- }
1404
-
1405
- &:hover {
1406
- border-color: #999;
1407
- .remove-applied-condition {
1408
- display: block;
1423
+ &:hover {
1424
+ border-color: #999;
1425
+ .remove-applied-condition {
1426
+ display: block;
1427
+ }
1409
1428
  }
1410
1429
  }
1411
1430
 
@@ -1933,4 +1952,16 @@ input.refine--search-trigger[type="text"] {
1933
1952
  line-height: 18px;
1934
1953
  }
1935
1954
 
1955
+ /* Shoelace Modal Styling */
1956
+
1957
+ .dialog-full::part(panel) {
1958
+ width: 100%;
1959
+ max-width: 100%;
1960
+ height: 100%;
1961
+ max-height: 100%;
1962
+ border-radius: 0;
1963
+ padding: 0;
1964
+ margin: 0;
1965
+ }
1966
+
1936
1967
 
@@ -418,12 +418,23 @@
418
418
  flex-wrap: wrap;
419
419
  display: flex;
420
420
  align-items: center;
421
+ justify-content: end;
421
422
  }
422
423
 
423
- @media (max-width: 960px) {
424
+
425
+ @media (max-width: 1525px) {
426
+ .refine--filter-control-group {
427
+ width: 24%;
428
+ }
429
+ }
430
+ @media (max-width: 1200px) {
431
+ .refine--filter-control-group {
432
+ width: 30%;
433
+ }
434
+ }
435
+ @media (max-width: 1100px) {
424
436
  .refine--filter-control-group {
425
- justify-content: end;
426
- width: 25%;
437
+ width: 40%;
427
438
  }
428
439
  }
429
440
 
@@ -444,6 +455,14 @@
444
455
  text-align: left;
445
456
  }
446
457
 
458
+ .refine--group-join {
459
+ &:hover {
460
+ .refine--remove-group {
461
+ display: block;
462
+ }
463
+ }
464
+ }
465
+
447
466
  .refine--group {
448
467
  display: flex;
449
468
  gap: 10px;
@@ -563,7 +582,7 @@
563
582
  padding: 4px;
564
583
  }
565
584
 
566
- .refine--remove-condition {
585
+ .refine--remove-condition, .refine--remove-group {
567
586
  display: none;
568
587
  color: #fff;
569
588
  padding: 0px 2px 0px 2px;
@@ -580,15 +599,15 @@
580
599
  .icon.refine--icon-sm {
581
600
  padding: 2px 0 ;
582
601
  }
583
-
584
- }
585
- &:hover {
586
- border-color: #999;
587
- .remove-applied-condition {
588
- display: block;
602
+ &:hover {
603
+ border-color: #999;
604
+ .remove-applied-condition {
605
+ display: block;
606
+ }
589
607
  }
590
608
  }
591
609
 
610
+
592
611
  .refine--condition-value-wrapper {
593
612
  position: absolute;
594
613
  top: 100%;
@@ -1097,4 +1116,16 @@ input.refine--search-trigger[type="text"] {
1097
1116
  line-height: 18px;
1098
1117
  }
1099
1118
 
1119
+ /* Shoelace Modal Styling */
1120
+
1121
+ .dialog-full::part(panel) {
1122
+ width: 100%;
1123
+ max-width: 100%;
1124
+ height: 100%;
1125
+ max-height: 100%;
1126
+ border-radius: 0;
1127
+ padding: 0;
1128
+ margin: 0;
1129
+ }
1130
+
1100
1131
 
@@ -8,6 +8,14 @@ class Refine::Inline::CriteriaController < ApplicationController
8
8
  @conditions = @refine_filter.instantiated_conditions
9
9
  end
10
10
 
11
+ # List available conditions for new criteria in advanced view (IE: Modal)
12
+ # Carries position and index forward
13
+ def index_advanced
14
+ @criterion = Refine::Inline::Criterion.new(criterion_params.merge(refine_filter: @refine_filter))
15
+ @conditions = @refine_filter.instantiated_conditions
16
+ @fill_modal = params[:fill_modal]
17
+ end
18
+
11
19
  # Show the form to add a new criteria
12
20
  def new
13
21
  @criterion = Refine::Inline::Criterion.new(criterion_params.merge(refine_filter: @refine_filter))
@@ -93,12 +101,17 @@ class Refine::Inline::CriteriaController < ApplicationController
93
101
  handle_filter_update()
94
102
  end
95
103
 
96
- private
104
+ def merge_groups
105
+ @criterion = Refine::Inline::Criterion.new(criterion_params.merge(refine_filter: @refine_filter))
106
+ Refine::Filters::BlueprintEditor
107
+ .new(@refine_filter.blueprint)
108
+ .change_conjunction(criterion_params[:position].to_i - 1, "and")
97
109
 
98
- def set_blank_filter
99
- @refine_filter = Refine::Rails.configuration.stabilizer_classes[:url].new
110
+ handle_filter_update(@refine_filter.to_stable_id)
100
111
  end
101
112
 
113
+ private
114
+
102
115
  def set_refine_filter
103
116
  @refine_filter ||= Refine::Rails.configuration.stabilizer_classes[:url]
104
117
  .new
@@ -6,6 +6,7 @@ import DefaultsController from './refine/defaults-controller'
6
6
  import DeleteController from './refine/delete-controller'
7
7
  import FilterPillsController from './refine/filter-pills-controller'
8
8
  import PopupController from './refine/popup-controller'
9
+ import ModalController from './refine/modal-controller'
9
10
  import SearchFilterController from './refine/search-filter-controller'
10
11
  import ServerRefreshController from './refine/server-refresh-controller'
11
12
  import StateController from './refine/state-controller'
@@ -25,6 +26,7 @@ export const controllerDefinitions = [
25
26
  [DeleteController, 'refine/delete-controller.js'],
26
27
  [FilterPillsController, 'refine/filter-pills-controller.js'],
27
28
  [PopupController, 'refine/popup-controller.js'],
29
+ [ModalController, 'refine/modal-controller.js'],
28
30
  [SearchFilterController, 'refine/search-filter-controller.js'],
29
31
  [ServerRefreshController, 'refine/server-refresh-controller.js'],
30
32
  [StateController, 'refine/state-controller.js'],
@@ -52,6 +54,7 @@ export {
52
54
  DeleteController,
53
55
  FilterPillsController,
54
56
  PopupController,
57
+ ModalController,
55
58
  SearchFilterController,
56
59
  ServerRefreshController,
57
60
  StateController,
@@ -0,0 +1,41 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+ import { useClickOutside } from 'stimulus-use'
3
+
4
+ // simple controller to hide/show the filter modal
5
+ export default class extends Controller {
6
+ static targets = ["frame"]
7
+
8
+ static values = {
9
+ src: String,
10
+ isOpen: {type: Boolean, default: false}
11
+ }
12
+
13
+ connect() {
14
+ console.log("Connecting modal controller")
15
+ useClickOutside(this)
16
+ }
17
+
18
+ disconnect() {
19
+ }
20
+
21
+ open(event) {
22
+ console.log("Opening modal!!!", this.srcValue)
23
+ event.preventDefault()
24
+ this.frameTarget.src = this.srcValue;
25
+ this.isOpenValue = true
26
+ }
27
+
28
+ close(event) {
29
+ if (this.isOpenValue) {
30
+ event?.preventDefault()
31
+ this.frameTarget.innerHTML = "";
32
+ this.isOpenValue = false
33
+ }
34
+ }
35
+
36
+ clickOutside(event) {
37
+ this.close(event)
38
+ }
39
+
40
+
41
+ }
@@ -59,6 +59,14 @@ class Refine::Filters::BlueprintEditor
59
59
  blueprint[index][:input] = input
60
60
  end
61
61
 
62
+ def change_conjunction(index, conjunction_word)
63
+ if conjunction_word == "and"
64
+ blueprint[index][:word] = "and"
65
+ elsif conjunction_word == "or"
66
+ blueprint[index][:word] = "or"
67
+ end
68
+ end
69
+
62
70
  def delete(index)
63
71
  # To support 'groups' there is some complicated logic for deleting criterion.
64
72
  #
@@ -0,0 +1,29 @@
1
+ <%
2
+ # a hash mapping Category => [array, of, conditions], sorted by category
3
+ categorized_conditions = @conditions
4
+ .group_by {|c| c.meta[:category].presence}
5
+ .sort_by do |(category, _conditions)|
6
+ if @refine_filter.has_category_ordering?
7
+ @refine_filter.category_order.index(category) || Float::INFINITY
8
+ else
9
+ category.to_s.downcase
10
+ end
11
+ end
12
+ .to_h
13
+
14
+ recommended_conditions = @conditions
15
+ .select { |c| c.meta[:recommended] }
16
+ .sort_by {|recommended| recommended.to_s.downcase }
17
+
18
+ # an array of uncategorized conditions
19
+ uncategorized_conditions = categorized_conditions.delete(nil)
20
+ fill_modal = @fill_modal || false
21
+ dialog_class = "sl-dialog refine--inline-modal-container"
22
+ dialog_class += " dialog-full" if fill_modal
23
+ %>
24
+
25
+ <%= turbo_frame_tag @criterion do %>
26
+ <sl-dialog open class="<%= dialog_class %>" no-header>
27
+ This is where the main content will render...
28
+ </sl-dialog>
29
+ <% end %>
@@ -6,13 +6,18 @@
6
6
  conjunction: "and",
7
7
  position: position
8
8
  )
9
+ use_modal ||= false
10
+ fill_modal ||= false
11
+ src = use_modal ? index_advanced_refine_inline_criteria_path(criterion.to_params.merge(fill_modal: fill_modal)) : refine_inline_criteria_path(criterion.to_params)
9
12
  %>
10
13
 
11
- <%= render "refine/inline/filters/popup",
12
- frame_id: dom_id(criterion),
13
- src: refine_inline_criteria_path(criterion.to_params) do
14
- %>
15
- <button class="refine--add-condition-button refine--add-first-condition-button" href="#" data-action="click->refine--popup#show" type="button">
14
+ <%= render "refine/inline/filters/modal_or_popup",
15
+ frame_id: dom_id(criterion),
16
+ use_modal: use_modal,
17
+ fill_modal: fill_modal,
18
+ src: src do
19
+ %>
20
+ <button class="refine--add-condition-button refine--add-first-condition-button" href="#" data-action="click->refine--popup#show click->refine--modal#open" type="button">
16
21
  <span><%= t(".filter") %></span>
17
22
  <span class="icon material-icons-outlined refine--icon-sm">add</span>
18
23
  </button>
@@ -6,6 +6,9 @@
6
6
  conjunction: "and",
7
7
  position: position
8
8
  )
9
+ use_modal ||= false
10
+ fill_modal ||= false
11
+ src = use_modal ? index_advanced_refine_inline_criteria_path(criterion.to_params.merge(fill_modal: fill_modal)) : refine_inline_criteria_path(criterion.to_params)
9
12
  %>
10
13
 
11
14
  <% if @refine_filter.criteria_limit_reached? %>
@@ -16,11 +19,13 @@
16
19
  <span class="icon material-icons-outlined refine--icon-sm">add</span>
17
20
  </button>
18
21
  <% else %>
19
- <%= render "refine/inline/filters/popup",
22
+ <%= render "refine/inline/filters/modal_or_popup",
20
23
  frame_id: dom_id(criterion),
21
- src: refine_inline_criteria_path(criterion.to_params) do
24
+ use_modal: use_modal,
25
+ fill_modal: fill_modal,
26
+ src: src do
22
27
  %>
23
- <button class="refine--add-condition-button refine--group-last-item refine--condition-pill-end" type="button" data-action="click->refine--popup#show">
28
+ <button class="refine--add-condition-button refine--group-last-item refine--condition-pill-end" type="button" data-action="click->refine--popup#show click->refine--modal#open">
24
29
  <% if show_label %>
25
30
  <span class="refine--add-button-label"><%= t("refine.inline.filters.and_button.condition") %></span>
26
31
  <% end %>