{"version":3,"sources":["webpack:///./app/javascript/controllers/frontend/tabs_controller.js","webpack:///./app/javascript/controllers/frontend/tooltip_controller.js","webpack:///./app/javascript/controllers/frontend/ui_accordion_controller.js","webpack:///./app/javascript/controllers/frontend/ui_other_offers_controller.js","webpack:///./app/javascript/controllers/frontend/ui_recommended_tabs_controller.js","webpack:///./app/javascript/controllers/frontend/ui_tabs_controller.js","webpack:///./app/javascript/controllers/frontend/validation_controller.js"],"names":["matchMedia","matches","this","hasAccordionTarget","type","tab","mainTargets","forEach","main","classList","remove","setTimeout","initialize","event","preventDefault","index","indexOf","currentTarget","tabTargets","toggle","accordionTargets","content","contentTargets","contains","add","parseInt","data","get","value","set","Controller","targets","show","tooltipTarget","setAttribute","popperInstance","setOptions","options","modifiers","name","enabled","update","hide","removeAttribute","createPopper","buttonTarget","placement","placementValue","offset","offsetValue","padding","altAxis","element","addEventListener","destroy","values","String","default","Array","hasAttribute","openAll","panel","nextElementSibling","hideAll","style","maxHeight","scrollHeight","window","innerWidth","buttonElement","Element","scrollIntoView","behavior","block","once","exceptThis","i","buttonTargets","length","button","getAttribute","containerTarget","position","minHeight","height","loader","document","createElement","id","appendChild","Rails","ajax","url","target","success","result","selector","$","replaceWith","x","hidden","selectedBtns","btnTargets","filter","defaultTabValue","find","map","selectedTab","typeValue","checked","console","log","defaultTab","previousIsMobile","isMobile","adjustTabsForDevice","handleResize","bind","panelInnerTargets","panelInner","btn","setDefaultTab","showTab","tabId","selectedPanelInner","closest","selectedBtn","btnId","toggleTab","panelInnerTarget","isHidden","classes","field","valid","invalid","message","parentNode","insertAdjacentHTML","removeChild","querySelector","form","requiredFields","querySelectorAll","from","requiredField","checkValidity","removeMessage","addMessage"],"mappings":"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","file":"js/application~a98c8321-009d086db62a2959194d.chunk.js","sourcesContent":["import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n static targets = ['tab', 'main', 'accordion', 'content'];\n\n initialize() {\n if ((matchMedia && matchMedia('(min-width: 768px)').matches) || !this.hasAccordionTarget) {\n this.type = 'tab';\n this.tab();\n } else {\n this.type = 'accordion';\n this.mainTargets.forEach((main) => {\n main.classList.remove('d-none');\n });\n }\n }\n\n resize() {\n setTimeout(() => this.initialize(), 1000);\n }\n\n change(event) {\n event.preventDefault();\n this.index = this[`${this.type}Targets`].indexOf(event.currentTarget);\n }\n\n tab() {\n this.tabTargets.forEach((tab, index) => {\n const main = this.mainTargets[index];\n tab.classList.toggle('c-tabs__nav-item--is-active', index === this.index);\n main.classList.toggle('d-none', index !== this.index);\n });\n }\n\n accordion() {\n this.accordionTargets.forEach((tab, index) => {\n const content = this.contentTargets[index];\n if (!content.classList.contains('closed')) {\n tab.classList.remove('c-tabs__accordion--is-active');\n content.classList.add('closed');\n } else {\n tab.classList.toggle('c-tabs__accordion--is-active', index === this.index);\n content.classList.toggle('closed', index !== this.index);\n }\n });\n }\n\n get index() {\n return parseInt(this.data.get('index') || 0, 10);\n }\n\n set index(value) {\n this.data.set('index', value);\n this[this.type]();\n }\n}\n","import { Controller } from '@hotwired/stimulus';\n// eslint-disable-next-line import/no-unresolved\nimport { createPopper } from '@popperjs/core';\n\nexport default class extends Controller {\n static targets = ['button', 'tooltip'];\n\n static values = {\n placement: { type: String, default: 'top' },\n offset: { type: Array, default: [0, 5] },\n };\n\n connect() {\n // Create a new Popper instance\n this.popperInstance = createPopper(this.buttonTarget, this.tooltipTarget, {\n placement: this.placementValue,\n modifiers: [\n {\n name: 'offset',\n options: {\n offset: this.offsetValue,\n },\n },\n {\n name: 'arrow',\n options: {\n padding: 5, // 5px from the edges of the popper\n },\n },\n {\n name: 'preventOverflow',\n options: {\n altAxis: true,\n padding: 40,\n },\n },\n ],\n });\n\n const showEvents = ['mouseenter', 'focus'];\n const hideEvents = ['mouseleave', 'blur'];\n\n showEvents.forEach((event) => {\n this.element.addEventListener(event, this.show);\n });\n\n hideEvents.forEach((event) => {\n this.element.addEventListener(event, this.hide);\n });\n }\n\n show = () => {\n this.tooltipTarget.setAttribute('data-show', '');\n\n this.popperInstance.setOptions((options) => ({\n ...options,\n modifiers: [...options.modifiers, { name: 'eventListeners', enabled: true }],\n }));\n\n // We need to tell Popper to update the tooltip position\n // after we show the tooltip, otherwise it will be incorrect\n this.popperInstance.update();\n };\n\n hide = () => {\n this.tooltipTarget.removeAttribute('data-show');\n\n this.popperInstance.setOptions((options) => ({\n ...options,\n modifiers: [...options.modifiers, { name: 'eventListeners', enabled: false }],\n }));\n };\n\n // Destroy the Popper instance\n disconnect() {\n if (this.popperInstance) {\n this.popperInstance.destroy();\n }\n }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n static targets = ['button'];\n\n connect() {\n if (this.element.hasAttribute('data-ui-accordion-open-all')) {\n this.openAll();\n }\n }\n\n toggle(event) {\n event.preventDefault(); // Prevent default button behavior\n\n const currentTarget = event.currentTarget;\n currentTarget.classList.toggle('active');\n const panel = currentTarget.nextElementSibling;\n\n if (\n !this.element.hasAttribute('data-ui-accordion-open-all') &&\n this.element.hasAttribute('data-ui-accordion-auto-close')\n ) {\n this.hideAll(currentTarget);\n }\n\n if (panel.style.maxHeight) {\n panel.style.maxHeight = null;\n } else {\n panel.style.maxHeight = `${panel.scrollHeight}px`;\n\n // Only add scroll behavior for mobile devices\n if (window.innerWidth < 768) {\n // Store a reference to the currentTarget to avoid issues with event handling\n const buttonElement = currentTarget;\n\n panel.addEventListener(\n 'transitionend',\n () => {\n if (buttonElement instanceof Element) {\n buttonElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n },\n { once: true },\n );\n }\n }\n }\n\n hideAll(exceptThis) {\n for (let i = 0; i < this.buttonTargets.length; i++) {\n const panel = this.buttonTargets[i].nextElementSibling;\n\n if (this.buttonTargets[i] !== exceptThis) {\n this.buttonTargets[i].classList.remove('active');\n\n if (panel.style.maxHeight) {\n panel.style.maxHeight = null;\n }\n }\n }\n }\n\n openAll() {\n for (let i = 0; i < this.buttonTargets.length; i++) {\n const button = this.buttonTargets[i];\n const panel = button.nextElementSibling;\n\n button.classList.add('active');\n panel.style.maxHeight = `${panel.scrollHeight}px`;\n }\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport Rails from '@rails/ujs';\n\nexport default class extends Controller {\n static targets = ['container'];\n\n load(event) {\n if (this.element.getAttribute('data-ui-other-offers-loaded')) {\n return;\n }\n\n this.containerTarget.style.position = 'relative';\n this.containerTarget.style.minHeight = '140px';\n this.containerTarget.style.height = '140px';\n\n const loader = document.createElement('div');\n loader.id = 'loader';\n this.containerTarget.appendChild(loader);\n\n Rails.ajax({\n url: event.target.getAttribute('data-ui-other-offers-path'),\n type: 'get',\n success: (result) => {\n const selector = '[data-render-target=\"groups#derivatives\"]';\n $(selector).replaceWith($(selector, result));\n this.element.setAttribute('data-ui-other-offers-loaded', true);\n },\n });\n }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n static targets = ['btn', 'tab'];\n\n static values = {\n defaultTab: String,\n type: String,\n };\n\n connect() {\n // Hide all tabs by default\n this.tabTargets.forEach((x) => {\n x.hidden = true;\n });\n\n // Open default tab is specified\n try {\n const selectedBtns = this.btnTargets.filter((element) => element.id === this.defaultTabValue);\n const selectedTab = this.tabTargets.find((element) => element.id === this.defaultTabValue);\n selectedTab.hidden = false;\n // selectedBtns.classList.add(\"active\")\n selectedBtns.map((x) => x.classList.add('active'));\n } catch {\n /* empty */\n }\n }\n\n select(event) {\n // find tab with same id as clicked btn\n let selectedTab;\n\n if (this.typeValue === 'boolean') {\n selectedTab = this.tabTargets.find((element) => element.id === `${event.target.checked}`);\n } else {\n selectedTab = this.tabTargets.find((element) => element.id === event.currentTarget.id);\n }\n\n if (this.typeValue === 'boolean') {\n console.log(selectedTab);\n }\n\n if (selectedTab.hidden) {\n // Close current tab and open selected tab\n this.tabTargets.forEach((x) => {\n x.hidden = true;\n }); // hide all tabs\n this.btnTargets.forEach((x) => x.classList.remove('active')); // deactive all btns\n selectedTab.hidden = false; // show current tab\n selectedTab.maxHeight = `${selectedTab.scrollHeight}px`;\n const selectedBtns = this.btnTargets.filter((element) => element.id === event.currentTarget.id);\n selectedBtns.map((x) => x.classList.add('active'));\n // event.currentTarget.classList.add(\"active\") // active current btn\n } else {\n selectedTab.hidden = true; // hide current tab\n event.currentTarget.classList.remove('active'); // active current btn\n }\n }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n static targets = ['btn', 'tab', 'panelInner'];\n\n static values = {\n defaultTab: String,\n };\n\n // Initialize a variable to keep track of the previous mobile state\n previousIsMobile = window.matchMedia('(max-width: 1200px)').matches;\n\n connect() {\n // Set the initial state based on the current window size\n this.isMobile = this.previousIsMobile;\n this.adjustTabsForDevice();\n\n // Add the resize event listener\n window.addEventListener('resize', this.handleResize.bind(this));\n }\n\n handleResize() {\n // Update the isMobile state based on the current window size\n this.isMobile = window.matchMedia('(max-width: 1200px)').matches;\n\n // Only adjust tabs if there was a change in state\n if (this.isMobile !== this.previousIsMobile) {\n this.adjustTabsForDevice();\n // Update the previousIsMobile state for the next resize event\n this.previousIsMobile = this.isMobile;\n }\n }\n\n adjustTabsForDevice() {\n // Execute changes only if transitioning through the breakpoint\n if (this.isMobile) {\n // On mobile, close all tabs but keep the buttons visible\n this.tabTargets.forEach((tab) => {\n tab.hidden = false;\n });\n this.panelInnerTargets.forEach((panelInner) => {\n panelInner.hidden = true;\n });\n this.btnTargets.forEach((btn) => btn.classList.remove('active'));\n } else {\n // On desktop, open the default tab\n this.setDefaultTab();\n }\n }\n\n setDefaultTab() {\n // On desktop, show the default tab or the first if no default is specified\n const defaultTab = this.defaultTabValue || this.btnTargets[0].id;\n this.showTab(defaultTab);\n }\n\n showTab(tabId) {\n // Close all tabs first\n this.tabTargets.forEach((tab) => {\n tab.hidden = true;\n });\n this.panelInnerTargets.forEach((panelInner) => {\n panelInner.hidden = true;\n });\n this.btnTargets.forEach((btn) => btn.classList.remove('active'));\n\n // Show the selected tab and button\n const selectedTab = this.tabTargets.find((tab) => tab.id === tabId);\n const selectedPanelInner = this.panelInnerTargets.find(\n (panelInner) => panelInner.closest('.drv-tabs__panel').id === tabId,\n );\n const selectedBtn = this.btnTargets.find((btn) => btn.id === tabId);\n\n if (selectedTab && selectedPanelInner && selectedBtn) {\n selectedTab.hidden = false;\n selectedPanelInner.hidden = false;\n selectedBtn.classList.add('active');\n }\n }\n\n select(event) {\n const btnId = event.currentTarget.id;\n\n if (this.isMobile) {\n // Toggle the panel inner visibility on mobile\n this.toggleTab(btnId);\n } else {\n // On desktop, show the clicked tab\n this.showTab(btnId);\n }\n }\n\n toggleTab(btnId) {\n const panelInner = this.panelInnerTargets.find(\n (panelInnerTarget) => panelInnerTarget.closest('.drv-tabs__panel').id === btnId,\n );\n\n if (panelInner) {\n const isHidden = panelInner.hidden;\n panelInner.hidden = !isHidden;\n this.btnTargets.forEach((btn) => btn.classList.toggle('active', btn.id === btnId && isHidden));\n }\n }\n}\n","// https://www.telerik.com/blogs/building-html5-form-validation-bubble-replacements\n\nimport { Controller } from '@hotwired/stimulus';\n\nconst classes = {\n field: { valid: 'is-valid', invalid: 'is-invalid' },\n message: { valid: 'valid-feedback', invalid: 'invalid-feedback' },\n};\n\nexport default class extends Controller {\n addMessage(field, type, message) {\n if (field.classList.contains(classes.field[type])) return;\n\n field.classList.add(classes.field[type]);\n field.parentNode.insertAdjacentHTML('beforeend', `<div class=\"${classes.message[type]}\">${message}</div>`);\n }\n\n removeMessage(field, type) {\n if (!field.classList.contains(classes.field[type])) return;\n\n field.classList.remove(classes.field[type]);\n field.parentNode.removeChild(field.parentNode.querySelector(`.${classes.message[type]}`));\n }\n\n connect() {\n const form = this.element;\n\n // rely on the good default browser form field validation\n form.removeAttribute('novalidate');\n\n const requiredFields = form.querySelectorAll('[name][required]');\n\n Array.from(requiredFields).forEach((requiredField) => {\n requiredField.addEventListener('blur', (event) => {\n const isValid = event.target.checkValidity();\n\n if (isValid) {\n this.removeMessage(event.target, 'invalid');\n this.addMessage(event.target, 'valid', 'Thank you.');\n } else {\n // checkValidity will automatically trigger `invalid` on the field\n }\n });\n\n requiredField.addEventListener('invalid', (event) => {\n // suppress the default form validation messages\n event.preventDefault();\n\n this.removeMessage(event.target, 'valid');\n this.addMessage(event.target, 'invalid', 'Please check and enter it again.');\n });\n });\n }\n}\n"],"sourceRoot":""}