refine-rails 2.9.0 → 2.9.2

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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -6
  3. data/app/assets/javascripts/refine-stimulus.esm.js +1 -1
  4. data/app/assets/javascripts/refine-stimulus.esm.js.map +1 -1
  5. data/app/assets/javascripts/refine-stimulus.js +1 -1
  6. data/app/assets/javascripts/refine-stimulus.js.map +1 -1
  7. data/app/assets/javascripts/refine-stimulus.modern.js +1 -1
  8. data/app/assets/javascripts/refine-stimulus.modern.js.map +1 -1
  9. data/app/assets/javascripts/refine-stimulus.umd.js +1 -1
  10. data/app/assets/javascripts/refine-stimulus.umd.js.map +1 -1
  11. data/app/assets/stylesheets/index.css +16 -17
  12. data/app/assets/stylesheets/index.tailwind.css +16 -15
  13. data/app/controllers/refine/inline/criteria_controller.rb +6 -0
  14. data/app/javascript/controllers/index.js +3 -3
  15. data/app/javascript/controllers/refine/criterion-form-controller.js +13 -12
  16. data/app/javascript/controllers/refine/typeahead-list-controller.js +33 -0
  17. data/app/models/refine/conditions/date_condition.rb +1 -1
  18. data/app/models/refine/filter/internationalized.rb +28 -0
  19. data/app/models/refine/filter.rb +17 -3
  20. data/app/models/refine/inline/criteria/date_refinement.rb +14 -0
  21. data/app/models/refine/inline/criteria/input.rb +16 -2
  22. data/app/models/refine/inline/criterion.rb +2 -2
  23. data/app/views/refine/blueprints/_criterion.html.erb +1 -1
  24. data/app/views/refine/inline/criteria/_form_fields.html.erb +88 -17
  25. data/app/views/refine/inline/criteria/edit.turbo_stream.erb +11 -11
  26. data/app/views/refine/inline/criteria/index.html.erb +6 -5
  27. data/app/views/refine/inline/criteria/new.turbo_stream.erb +10 -11
  28. data/app/views/refine/inline/filters/_criterion.html.erb +0 -1
  29. data/app/views/refine/inline/inputs/_date_condition.html.erb +2 -2
  30. data/app/views/refine/inline/inputs/_date_condition_range.html.erb +2 -2
  31. data/app/views/refine/inline/inputs/_date_condition_single.html.erb +1 -1
  32. data/app/views/refine/inline/inputs/_option_condition.html.erb +21 -10
  33. data/lib/refine/rails/version.rb +1 -1
  34. metadata +5 -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/inline-conditions-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/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\"\n\nexport default class extends Controller {\n\n static targets = ['condition', 'category']\n\n filterConditions(event) {\n const query = event.currentTarget.value.toLowerCase()\n const visibleCategories = new Set()\n\n // hide / show condition links that match the query and note which\n // categories should be visible\n this.conditionTargets.forEach(conditionNode => {\n const conditionName = conditionNode.innerHTML.toLowerCase()\n if (conditionName.includes(query)) {\n conditionNode.hidden = false\n visibleCategories.add(conditionNode.dataset.category)\n } else {\n conditionNode.hidden = true\n }\n })\n\n // hide / show category headers that have\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 { 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 turboFrame: String,\n method: { type: String, default: \"POST\" }\n }\n\n refresh(_event) {\n // update the url with params from the form\n const formData = new FormData(this.element)\n const url = new URL(this.urlValue)\n\n for (const [name, value] of formData.entries()) {\n console.log(name, value)\n url.searchParams.set(name, value)\n }\n\n // navigate the modal to refresh the form\n window.Turbo.visit(url.toString(), {frame: this.turboFrameValue})\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","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.submit()\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 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 InlineConditionsController from './refine/inline-conditions-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 UpdateController from './refine/update-controller'\nimport DateController from './refine/date-controller'\n\nexport const controllerDefinitions = [\n [AddController, 'refine/add-controller.js'],\n [InlineConditionsController, './refine/inline-conditions-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 [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 InlineConditionsController,\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 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","filterConditions","event","currentTarget","value","toLowerCase","visibleCategories","Set","conditionTargets","forEach","conditionNode","innerHTML","includes","hidden","add","dataset","category","categoryTargets","categoryNode","has","targets","_class","refresh","_event","formData","FormData","url","URL","urlValue","name","entries","console","log","searchParams","set","window","Turbo","visit","toString","frame","turboFrameValue","String","turboFrame","method","type","default","getStateController","updateInput","criterionIdValue","inputValue","controller","criterionId","input","Object","deleteCriterion","urlParams","URLSearchParams","location","search","existingParams","delete","index","parseInt","stateController","reloadPage","submitUrlValue","refine_filters_builder","filter_class","blueprint_json","client_id","redirectToStableId","stableId","params","append","allParams","fromEntries","pathname","history","pushState","title","reload","refineStateController","stabilizeFilterController","submitUrl","useClickOutside","boundHandleKeyUp","handleKeyUp","bind","addEventListener","disconnect","removeEventListener","show","preventDefault","frameTarget","src","srcValue","isOpenValue","hide","clickOutside","isOpen","Boolean","submitFilter","activeElement","blur","querySelector","loadResults","_ref","detail","href","CustomEvent","bubbles","cancelable","undefined","evt","createEvent","initCustomEvent","prototype","Event","blueprintUpdatedEvent","formId","_ref2","dispatchEvent","id","depth","condition","_clauses$","component","meta","clauses","refinements","selected","newInput","clause","refinement","condition_id","changeDelegate","delegate","blueprintValue","conditions","conditionsValue","classNameValue","conditionsLookup","reduce","lookup","loadingTimeout","formIdValue","abnegate","clearTimeout","setTimeout","loadingTarget","classList","remove","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","getElementById","stateDomIdValue","blueprintFieldTarget","updateBlueprintField","stateDomId","submit","toggle","contentTargets","node","toggleAttribute","TurboStreamFormController","action","turboMethod","initialize","updateBlueprint","debounce","inputKey","refinedFilter","target","select","slice","call","filter","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","InlineConditionsController","CriterionFormController","DefaultsController","DeleteController","FilterPillsController","PopupController","SearchFilterController","StateController","StoredFilterController","SubmitForm","ToggleController","TurboStreamLinkController","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/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","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.submit()\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']\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 // hide / show category headers that have\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","toggle","contentTargets","node","toggleAttribute","TurboStreamFormController","method","action","turboMethod","filter","toLowerCase","visibleCategories","Set","listItemTargets","listItemNode","listItemValue","includes","hidden","category","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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"}
@@ -822,13 +822,11 @@
822
822
  }
823
823
 
824
824
  .refine-criterion-refinement-container {
825
- width: 100%;
826
- padding-top: 0.75rem
825
+ width: 100%
827
826
  }
828
827
 
829
828
  @media (min-width: 640px) {
830
829
  .refine-criterion-refinement-container {
831
- margin-right: 0.75rem;
832
830
  width: auto;
833
831
  flex-shrink: 0
834
832
  }
@@ -1426,6 +1424,10 @@
1426
1424
  padding: 0.5rem 0;
1427
1425
  }
1428
1426
 
1427
+ .refine--refinement-input-container {
1428
+ margin: 0.5rem 0;
1429
+ }
1430
+
1429
1431
  /* _date_condition.html.erb */
1430
1432
 
1431
1433
  .refine--date-condition-days-text {
@@ -1535,7 +1537,6 @@
1535
1537
 
1536
1538
  .refine--option-condition-container {
1537
1539
  /* keep it because the dropdown select uses it */
1538
- display: flex;
1539
1540
  width: 100%;
1540
1541
  }
1541
1542
 
@@ -1547,21 +1548,19 @@
1547
1548
  }
1548
1549
  }
1549
1550
 
1550
- .refine--option-select {
1551
- width: 100%;
1552
- }
1553
-
1554
- .refine--option-condition-select:focus {
1555
- border-color: rgba(99, 102, 241, 1);
1556
- outline: 2px solid transparent;
1557
- outline-offset: 2px;
1551
+ .refine--option-label {
1552
+ cursor: pointer;
1553
+ display: flex;
1554
+ align-items: center;
1555
+ border-radius: 6px;
1556
+ padding: 4px 5px;
1557
+ &:hover {
1558
+ background-color: #eee;
1559
+ }
1558
1560
  }
1559
1561
 
1560
- @media (min-width: 640px) {
1561
- .refine--option-condition-select {
1562
- font-size: 0.875rem;
1563
- line-height: 1.25rem;
1564
- }
1562
+ .refine--option-input {
1563
+ margin-right: 5px;
1565
1564
  }
1566
1565
 
1567
1566
  .refine--option-condition-postfix {
@@ -224,7 +224,7 @@
224
224
  }
225
225
 
226
226
  .refine-criterion-refinement-container {
227
- @apply w-full pt-3 sm:w-auto sm:flex-shrink-0 sm:mr-3;
227
+ @apply w-full sm:w-auto sm:flex-shrink-0;
228
228
  }
229
229
 
230
230
  /* _delete_criterion.html.erb */
@@ -601,6 +601,10 @@
601
601
  padding: 0.5rem 0;
602
602
  }
603
603
 
604
+ .refine--refinement-input-container {
605
+ margin: 0.5rem 0;
606
+ }
607
+
604
608
 
605
609
  /* _date_condition.html.erb */
606
610
  .refine--date-condition-days-text {
@@ -710,7 +714,6 @@
710
714
  /* _option_condition.html.erb */
711
715
  .refine--option-condition-container {
712
716
  /* keep it because the dropdown select uses it */
713
- display: flex;
714
717
  width: 100%;
715
718
  }
716
719
 
@@ -722,21 +725,19 @@
722
725
  }
723
726
  }
724
727
 
725
- .refine--option-select {
726
- width: 100%;
727
- }
728
-
729
- .refine--option-condition-select:focus {
730
- border-color: rgba(99, 102, 241, 1);
731
- outline: 2px solid transparent;
732
- outline-offset: 2px;
728
+ .refine--option-label {
729
+ cursor: pointer;
730
+ display: flex;
731
+ align-items: center;
732
+ border-radius: 6px;
733
+ padding: 4px 5px;
734
+ &:hover {
735
+ background-color: #eee;
736
+ }
733
737
  }
734
738
 
735
- @media (min-width: 640px) {
736
- .refine--option-condition-select {
737
- font-size: 0.875rem;
738
- line-height: 1.25rem;
739
- }
739
+ .refine--option-input {
740
+ margin-right: 5px;
740
741
  }
741
742
 
742
743
  .refine--option-condition-postfix {
@@ -118,6 +118,12 @@ class Refine::Inline::CriteriaController < ApplicationController
118
118
  :clause,
119
119
  :value1,
120
120
  :value2
121
+ ],
122
+ date_refinement_attributes: [
123
+ :clause,
124
+ :date1,
125
+ :date2,
126
+ :days
121
127
  ]
122
128
  ]
123
129
  )
@@ -1,7 +1,6 @@
1
1
  import { identifierForContextKey } from "@hotwired/stimulus-webpack-helpers"
2
2
 
3
3
  import AddController from './refine/add-controller'
4
- import InlineConditionsController from './refine/inline-conditions-controller'
5
4
  import CriterionFormController from './refine/criterion-form-controller'
6
5
  import DefaultsController from './refine/defaults-controller'
7
6
  import DeleteController from './refine/delete-controller'
@@ -15,12 +14,12 @@ import SubmitForm from './refine/submit-form-controller'
15
14
  import ToggleController from './refine/toggle-controller'
16
15
  import TurboStreamFormController from './refine/turbo-stream-form-controller'
17
16
  import TurboStreamLinkController from './refine/turbo-stream-link-controller'
17
+ import TypeaheadListController from './refine/typeahead-list-controller'
18
18
  import UpdateController from './refine/update-controller'
19
19
  import DateController from './refine/date-controller'
20
20
 
21
21
  export const controllerDefinitions = [
22
22
  [AddController, 'refine/add-controller.js'],
23
- [InlineConditionsController, './refine/inline-conditions-controller.js'],
24
23
  [CriterionFormController, 'refine/criterion-form-controller.js'],
25
24
  [DefaultsController, 'refine/defaults-controller.js'],
26
25
  [DeleteController, 'refine/delete-controller.js'],
@@ -34,6 +33,7 @@ export const controllerDefinitions = [
34
33
  [ToggleController, 'refine/toggle-controller.js'],
35
34
  [TurboStreamFormController, 'refine/turbo-stream-form-controller.js'],
36
35
  [TurboStreamLinkController, 'refine/turbo-stream-link-controller.js'],
36
+ [TypeaheadListController, './refine/typeahead-list-controller.js'],
37
37
  [UpdateController, 'refine/update-controller.js'],
38
38
  [DateController, 'refine/date-controller.js']
39
39
  ].map(function(d) {
@@ -47,7 +47,6 @@ export const controllerDefinitions = [
47
47
 
48
48
  export {
49
49
  AddController,
50
- InlineConditionsController,
51
50
  CriterionFormController,
52
51
  DefaultsController,
53
52
  DeleteController,
@@ -61,6 +60,7 @@ export {
61
60
  ToggleController,
62
61
  TurboStreamFormController,
63
62
  TurboStreamLinkController,
63
+ TypeaheadListController,
64
64
  UpdateController,
65
65
  DateController
66
66
  }
@@ -8,22 +8,23 @@ import { FetchRequest } from '@rails/request.js'
8
8
  export default class extends Controller {
9
9
  static values = {
10
10
  url: String,
11
- turboFrame: String,
12
- method: { type: String, default: "POST" }
11
+ formId: String
13
12
  }
14
13
 
15
- refresh(_event) {
14
+ async refresh(_event) {
16
15
  // update the url with params from the form
17
- const formData = new FormData(this.element)
18
- const url = new URL(this.urlValue)
16
+ const formElement = document.getElementById(this.formIdValue)
17
+ const formData = new FormData(formElement)
19
18
 
20
- for (const [name, value] of formData.entries()) {
21
- console.log(name, value)
22
- url.searchParams.set(name, value)
23
- }
24
-
25
- // navigate the modal to refresh the form
26
- window.Turbo.visit(url.toString(), {frame: this.turboFrameValue})
19
+ const request = new FetchRequest(
20
+ "GET",
21
+ this.urlValue,
22
+ {
23
+ query: formData,
24
+ responseKind: "turbo-stream"
25
+ }
26
+ )
27
+ const response = await request.perform()
27
28
  }
28
29
 
29
30
 
@@ -0,0 +1,33 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ export default class extends Controller {
4
+
5
+ static targets = ['listItem', 'category']
6
+
7
+ filter(event) {
8
+ const query = event.currentTarget.value.toLowerCase()
9
+ const visibleCategories = new Set()
10
+
11
+ // hide / show listItem links that match the query and note which
12
+ // categories should be visible
13
+ this.listItemTargets.forEach(listItemNode => {
14
+ const listItemName = listItemNode.dataset.listItemValue.toLowerCase()
15
+ if (listItemName.includes(query)) {
16
+ listItemNode.hidden = false
17
+ visibleCategories.add(listItemNode.dataset.category)
18
+ } else {
19
+ listItemNode.hidden = true
20
+ }
21
+ })
22
+
23
+ // hide / show category headers that have
24
+ this.categoryTargets.forEach(categoryNode => {
25
+ const categoryName = categoryNode.innerHTML
26
+ if (visibleCategories.has(categoryName)) {
27
+ categoryNode.hidden = false
28
+ } else {
29
+ categoryNode.hidden = true
30
+ }
31
+ })
32
+ }
33
+ }
@@ -52,7 +52,7 @@ module Refine::Conditions
52
52
  end
53
53
 
54
54
  def date1_must_be_less_than_date2
55
- return true unless date1 && date2
55
+ return true unless [CLAUSE_BETWEEN, CLAUSE_NOT_BETWEEN].include?(@clause) && date1 && date2
56
56
  if Date.strptime(date1, "%Y-%m-%d") > Date.strptime(date2, "%Y-%m-%d")
57
57
  errors.add(:base, I18n.t("#{I18N_PREFIX}date1_greater_date2_error"))
58
58
  false
@@ -0,0 +1,28 @@
1
+ module Refine::Filter::Internationalized
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ class_attribute :i18n_scope, instance_writer: false
6
+ end
7
+
8
+ class_methods do
9
+ def inherited(klass)
10
+ klass.i18n_scope = klass.model_name.pluralize.underscore.tr("/", ".")
11
+ super
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def heading(field)
18
+ t("#{field}.heading")
19
+ end
20
+
21
+ def options_for(field)
22
+ t("#{field}.options").map { {id: _1.to_s, display: _2} }
23
+ end
24
+
25
+ def t(key, **options)
26
+ I18n.t("#{i18n_scope}.fields.#{key}", **options)
27
+ end
28
+ end
@@ -4,10 +4,19 @@ module Refine
4
4
  include ActiveModel::Callbacks
5
5
  include TracksPendingRelationshipSubqueries
6
6
  include Stabilize
7
+ include Internationalized
7
8
  # This validation structure sents `initial_query` as the method to validate against
8
9
  define_model_callbacks :initialize, only: [:after]
9
10
  after_initialize :valid?
10
11
 
12
+ def self.model_name
13
+ name.sub(/(::)?Filter$/, "").singularize
14
+ end
15
+
16
+ def self.model
17
+ @model ||= model_name.constantize
18
+ end
19
+
11
20
  cattr_accessor :default_stabilizer, default: nil, instance_accessor: false
12
21
  cattr_accessor :criteria_limit, default: 5, instance_accessor: true
13
22
 
@@ -41,7 +50,6 @@ module Refine
41
50
  end
42
51
  end
43
52
 
44
- # DEPRECATED use Refine::Filters::Criterion#human_readable instead
45
53
  def human_readable_criterions
46
54
  output = []
47
55
  if blueprint.present?
@@ -49,7 +57,13 @@ module Refine
49
57
  if criterion[:type] == "conjunction"
50
58
  output << criterion[:word]
51
59
  else
52
- output << get_condition_for_criterion(criterion).human_readable(criterion[:input])
60
+ condition = get_condition_for_criterion(criterion)
61
+ text = condition.human_readable(criterion[:input])
62
+ if condition.has_date_refinement?
63
+ date_refinement_condition = condition.has_date_refinement?.call
64
+ text += date_refinement_condition.human_readable(criterion[:input][:date_refinement])
65
+ end
66
+ output << text
53
67
  end
54
68
  end
55
69
  end
@@ -62,7 +76,7 @@ module Refine
62
76
 
63
77
  # e.g. ContactsFilter -> Contact
64
78
  def model
65
- initial_query&.model || self.class.to_s.gsub(/Filter$/, "").singularize.constantize
79
+ initial_query&.model || self.class.model
66
80
  end
67
81
 
68
82
  def table
@@ -0,0 +1,14 @@
1
+ class Refine::Inline::Criteria::DateRefinement
2
+ include ActiveModel::Model
3
+
4
+ attr_accessor :clause, :date1, :date2, :days
5
+
6
+ def attributes
7
+ {
8
+ clause: clause,
9
+ date1: date1,
10
+ date2: date2,
11
+ days: days
12
+ }.compact
13
+ end
14
+ end