{"version":3,"file":"dropdown-controller-CBgVdszG.js","sources":["../../../app/frontend/src/yobbers/js/controllers/dropdown-controller.js"],"sourcesContent":["import { Controller } from '@hotwired/stimulus';\nimport { computePosition, autoUpdate, flip, shift } from '@floating-ui/dom';\nimport { useHotkeys } from 'stimulus-use/hotkeys';\n\nconst CLASS_NAME_SHOW = '-is-active';\n\nlet submenu;\nlet dropdown;\n\nexport default class extends Controller {\n static targets = ['trigger', 'menu', 'input'];\n static values = {\n placement: {\n type: String,\n default: 'bottom-start'\n },\n strategy: {\n type: String,\n default: 'absolute'\n },\n submenu: {\n type: Boolean,\n default: false\n }\n };\n\n connect() {\n useHotkeys(this, {\n esc: [this.hide]\n });\n\n this.menuTarget.style.position = this.strategyValue;\n this.innerMenuEl = this.menuTarget.querySelector('.y-dropdown__menu-inner');\n this.setTransformOrigin(this.placementValue);\n }\n\n setTransformOrigin(placement) {\n const transformOriginValues = {\n 'bottom-end': 'top right',\n 'bottom-start': 'top left',\n 'top-end': 'bottom right',\n 'top-start': 'bottom left',\n bottom: 'top center',\n top: 'bottom center',\n 'right-end': 'left top',\n 'right-start': 'left bottom',\n 'left-end': 'right top',\n 'left-start': 'right bottom',\n default: 'top right' // default value if none of the above conditions are met\n };\n const transformOrigin =\n transformOriginValues[placement] || transformOriginValues.default;\n this.innerMenuEl.style.transformOrigin = transformOrigin;\n }\n\n calcPosition = async () => {\n this.popper = await computePosition(this.triggerTarget, this.menuTarget, {\n placement: this.placementValue,\n strategy: this.strategyValue,\n middleware: [flip(), shift({ padding: 60 })] // Padding 60px for the height of navbar.\n }).then(({ x, y, strategy }) => {\n Object.assign(this.menuTarget.style, {\n left: `${x}px`,\n top: `${y}px`,\n position: strategy\n });\n });\n };\n\n handleOutsideClick = (e) => {\n if (!this.isShown()) return;\n if (e.target.closest('[data-controller=\"dropdown\"]')) return;\n if (e.target.closest('.flatpickr-calendar')) return;\n this.hide();\n };\n\n toggle(event) {\n if (event) event.preventDefault();\n return this.isShown() ? this.hide() : this.show();\n }\n\n show() {\n if (this.submenuValue) {\n if (submenu) submenu.hide();\n submenu = this;\n } else {\n if (dropdown) dropdown.hide();\n dropdown = this;\n }\n\n this.triggerTarget.classList.add(CLASS_NAME_SHOW);\n this.menuTarget.classList.add(CLASS_NAME_SHOW);\n this.floatingInstance = autoUpdate(\n this.triggerTarget,\n this.menuTarget,\n this.calcPosition\n );\n\n // TODO: Causes a scroll glitch, might look into it later\n // if (this.hasInputTarget) {\n // this.inputTarget.focus();\n // }\n this.dispatch('show');\n\n if (!this.submenuValue) {\n document.addEventListener('click', this.handleOutsideClick);\n }\n }\n\n hide = () => {\n if (!this.isShown()) return;\n this.triggerTarget.classList.remove(CLASS_NAME_SHOW);\n this.menuTarget.classList.remove(CLASS_NAME_SHOW);\n this.floatingInstance = undefined;\n\n if (!this.submenuValue) {\n document.removeEventListener('click', this.handleOutsideClick);\n }\n\n this.closeSubmenus();\n\n this.dispatch('hide');\n };\n\n isShown() {\n return (\n this.menuTarget && this.menuTarget.classList.contains(CLASS_NAME_SHOW)\n );\n }\n\n closeSubmenus = () => {\n const dropdowns = this.element.querySelectorAll(\n '[data-controller=\"dropdown\"]'\n );\n\n dropdowns.forEach((el) => {\n const controller = this.application.getControllerForElementAndIdentifier(\n el,\n 'dropdown'\n );\n if (controller) controller.hide();\n });\n };\n\n disconnect() {\n if (submenu) submenu = undefined;\n if (dropdown) dropdown = undefined;\n\n this.hide();\n }\n}\n"],"names":["CLASS_NAME_SHOW","submenu","dropdown","DropdownController","Controller","__publicField","computePosition","flip","shift","x","y","strategy","e","el","controller","useHotkeys","placement","transformOriginValues","transformOrigin","event","autoUpdate"],"mappings":"4UAIA,MAAMA,EAAkB,aAExB,IAAIC,EACAC,EAEW,MAAKC,UAASC,CAAW,CAAzB,kCA8CbC,EAAA,oBAAe,SAAY,CACzB,KAAK,OAAS,MAAMC,EAAgB,KAAK,cAAe,KAAK,WAAY,CACvE,UAAW,KAAK,eAChB,SAAU,KAAK,cACf,WAAY,CAACC,IAAQC,EAAM,CAAE,QAAS,EAAE,CAAE,CAAC,CACjD,CAAK,EAAE,KAAK,CAAC,CAAE,EAAAC,EAAG,EAAAC,EAAG,SAAAC,CAAQ,IAAO,CAC9B,OAAO,OAAO,KAAK,WAAW,MAAO,CACnC,KAAM,GAAGF,CAAC,KACV,IAAK,GAAGC,CAAC,KACT,SAAUC,CAClB,CAAO,CACP,CAAK,CACF,GAEDN,EAAA,0BAAsBO,GAAM,CACrB,KAAK,YACNA,EAAE,OAAO,QAAQ,8BAA8B,GAC/CA,EAAE,OAAO,QAAQ,qBAAqB,GAC1C,KAAK,KAAM,EACZ,GAmCDP,EAAA,YAAO,IAAM,CACN,KAAK,YACV,KAAK,cAAc,UAAU,OAAOL,CAAe,EACnD,KAAK,WAAW,UAAU,OAAOA,CAAe,EAChD,KAAK,iBAAmB,OAEnB,KAAK,cACR,SAAS,oBAAoB,QAAS,KAAK,kBAAkB,EAG/D,KAAK,cAAe,EAEpB,KAAK,SAAS,MAAM,EACrB,GAQDK,EAAA,qBAAgB,IAAM,CACF,KAAK,QAAQ,iBAC7B,8BACD,EAES,QAASQ,GAAO,CACxB,MAAMC,EAAa,KAAK,YAAY,qCAClCD,EACA,UACD,EACGC,GAAYA,EAAW,KAAM,CACvC,CAAK,CACF,GApHD,SAAU,CACRC,EAAW,KAAM,CACf,IAAK,CAAC,KAAK,IAAI,CACrB,CAAK,EAED,KAAK,WAAW,MAAM,SAAW,KAAK,cACtC,KAAK,YAAc,KAAK,WAAW,cAAc,yBAAyB,EAC1E,KAAK,mBAAmB,KAAK,cAAc,CAC/C,CAEE,mBAAmBC,EAAW,CAC5B,MAAMC,EAAwB,CAC5B,aAAc,YACd,eAAgB,WAChB,UAAW,eACX,YAAa,cACb,OAAQ,aACR,IAAK,gBACL,YAAa,WACb,cAAe,cACf,WAAY,YACZ,aAAc,eACd,QAAS,WACV,EACKC,EACJD,EAAsBD,CAAS,GAAKC,EAAsB,QAC5D,KAAK,YAAY,MAAM,gBAAkBC,CAC7C,CAuBE,OAAOC,EAAO,CACZ,OAAIA,GAAOA,EAAM,eAAgB,EAC1B,KAAK,UAAY,KAAK,KAAM,EAAG,KAAK,KAAM,CACrD,CAEE,MAAO,CACD,KAAK,cACHlB,GAASA,EAAQ,KAAM,EAC3BA,EAAU,OAENC,GAAUA,EAAS,KAAM,EAC7BA,EAAW,MAGb,KAAK,cAAc,UAAU,IAAIF,CAAe,EAChD,KAAK,WAAW,UAAU,IAAIA,CAAe,EAC7C,KAAK,iBAAmBoB,EACtB,KAAK,cACL,KAAK,WACL,KAAK,YACN,EAMD,KAAK,SAAS,MAAM,EAEf,KAAK,cACR,SAAS,iBAAiB,QAAS,KAAK,kBAAkB,CAEhE,CAiBE,SAAU,CACR,OACE,KAAK,YAAc,KAAK,WAAW,UAAU,SAASpB,CAAe,CAE3E,CAgBE,YAAa,CACPC,IAASA,EAAU,QACnBC,IAAUA,EAAW,QAEzB,KAAK,KAAM,CACf,CACA,CA5IEG,EADkBF,EACX,UAAU,CAAC,UAAW,OAAQ,OAAO,GAC5CE,EAFkBF,EAEX,SAAS,CACd,UAAW,CACT,KAAM,OACN,QAAS,cACV,EACD,SAAU,CACR,KAAM,OACN,QAAS,UACV,EACD,QAAS,CACP,KAAM,QACN,QAAS,EACf,CACG"}