{"version":3,"file":"pages-job-board.js","mappings":"sLAMA,MAAMA,EAAOC,SAASC,cAAc,gBAEpC,IAAIC,EAAe,GACfC,GAAa,EAEjB,MA0BMC,EAAsBC,IAC1BA,GAAKA,EAAEC,iBAEP,MAAMC,EAAS,IAAIC,SAAST,GAE5BG,EAAaO,SAASC,IACpBH,EAAOI,OAAOD,EAAGE,SAASC,MAE1B,MAAMA,EAAOH,EAAGE,SAASC,KAAKC,QAAQ,KAAM,IACtCC,EAAQL,EAAGM,cAAcC,KAAK,KAEhCF,GACFR,EAAOW,OAAOL,EAAME,EACtB,IAGF,MAAMI,GAAcC,EAAAA,EAAAA,IAAoBb,GAClCc,EAAMF,EAAYG,KAAQ,GAAEvB,EAAKwB,UAAUJ,IAAgBpB,EAAKwB,OAEtEC,OAAOC,QAAQC,aAAa,CAAC,EAAG,GAAIL,GAEpCM,GAAe,EAkBXA,EAAgBC,UACpB,MAAMC,EAAc7B,SAASC,cAAc,uBAE3C4B,EAAYC,UAAUC,IAAI,cAE1B,MAAMC,QAAYC,EAAAA,EAAKC,IAAIV,OAAOW,SAASC,MAAMC,OAEjDR,EAAYS,UAAYN,EAAIO,KAC5BV,EAAYC,UAAUU,OAAO,cAEzBR,EAAIS,WACN1C,EAAK+B,UAAUC,IAAI,eAEnBhC,EAAK+B,UAAUU,OAAO,cACxB,EAIIzC,IACFA,EAAK2C,iBAAiB,oBAAoBjC,SAASC,GApF7BA,KACxB,MAAMiC,EAAS,IAAIC,IAAJ,CAAe,CAC5BD,OAAQjC,EACRmC,SAAU,CACRC,eAAe,EACfC,eAAe,EACfC,YAAY,EACZC,eAAgB,EAChBC,iBAAkB,qBAEpBC,OAAQ,CACNC,YAAcC,IACPlD,IACgB,IAAfkD,EAAIC,SACN5C,EAAGK,MAAQ,IAGbX,IACF,KAKNF,EAAaqD,KAAKZ,EAAO,EA6DmCa,CAAiB9C,MAE3E+C,EAAAA,EAAAA,IAAG,SAAU,eAAgBrD,IAC7BqD,EAAAA,EAAAA,IAAG,QAAS,sBArCUC,KACxB3D,EAAK2C,iBAAiB,wBAAwBjC,SAASkD,GAAOA,EAAE5C,MAAQ,OAExEb,EAAaO,SAASkC,IACpBxC,GAAa,EACbwC,EAAOiB,YAAY,GAAG,IAGxBpC,OAAOC,QAAQC,aAAa,CAAC,EAAG,GAAI3B,EAAKwB,QAEzCI,IAEAxB,GAAa,CAAK,I,0DCtEpB0D,EAAAA,EAAOC,QAAQ,CACbC,QAAS,CAAE,mBAAoB,oBAGjC,SAAeF,EAAAA,EAAAA,KAASG,MAAMC,EAAAA,E,oDCPvB,MAAMC,EAAgB,iBAAkBlE,SAASmE,gBAE3C/C,EAAsBA,CAACgD,EAAO,CAAC,KAC1C,IAAI7D,EAAS6D,EAETA,aAAgB5D,UAAa,IAC/BD,EAAS,CAAC,EAEV6D,EAAK3D,SAAQ,CAACM,EAAOsD,IAAS9D,EAAO8D,GAAOtD,KAG9C,IAAK,MAAMsD,KAAO9D,EACI,KAAhBA,EAAO8D,WACF9D,EAAO8D,GAIlB,OAAO,IAAIC,gBAAgB/D,EAAO,EAGvBgE,EAAwBC,IAC/BhD,OAAOiD,WACTjD,OAAOiD,UAAUlB,KAAKiB,EACxB,C","sources":["webpack://silverstripe-base/./themes/app/src/pages/job-board.js","webpack://silverstripe-base/./themes/app/src/scripts/common/ajax.js","webpack://silverstripe-base/./themes/app/src/scripts/common/util.js"],"sourcesContent":["import { on } from \"delegated-events\";\nimport SlimSelect from \"slim-select\";\nimport \"slim-select/styles\";\nimport ajax from \"@common/ajax\";\nimport { generateQueryString } from \"@common/util\";\n\nconst form = document.querySelector(\".filter-form\");\n\nlet multiSelects = [];\nlet isClearing = false;\n\nconst setupMultiSelect = (el) => {\n const select = new SlimSelect({\n select: el,\n settings: {\n allowDeselect: true,\n closeOnSelect: false,\n showSearch: false,\n maxValuesShown: 1,\n maxValuesMessage: \"{number} selected\",\n },\n events: {\n afterChange: (val) => {\n if (!isClearing) {\n if (val.length === 0) {\n el.value = \"\";\n }\n\n handleFilterChange();\n }\n },\n },\n });\n\n multiSelects.push(select);\n};\n\nconst handleFilterChange = (e) => {\n e && e.preventDefault();\n\n const params = new FormData(form);\n\n multiSelects.forEach((el) => {\n params.delete(el.selectEl.name);\n\n const name = el.selectEl.name.replace(\"[]\", \"\");\n const value = el.getSelected().join(\"_\");\n\n if (value) {\n params.append(name, value);\n }\n });\n\n const queryString = generateQueryString(params);\n const url = queryString.size ? `${form.action}?${queryString}` : form.action;\n\n window.history.replaceState({}, \"\", url);\n\n updateResults();\n};\n\nconst handleFilterClear = () => {\n form.querySelectorAll('input[type=\"search\"]').forEach((x) => (x.value = null));\n\n multiSelects.forEach((select) => {\n isClearing = true;\n select.setSelected([]);\n });\n\n window.history.replaceState({}, \"\", form.action);\n\n updateResults();\n\n isClearing = false;\n};\n\nconst updateResults = async () => {\n const pageContent = document.querySelector(\"[data-page-content]\");\n\n pageContent.classList.add(\"is-loading\");\n\n const res = await ajax.get(window.location.href).json();\n\n pageContent.innerHTML = res.page;\n pageContent.classList.remove(\"is-loading\");\n\n if (res.isFiltered) {\n form.classList.add(\"is-filtered\");\n } else {\n form.classList.remove(\"is-filtered\");\n }\n};\n\nconst init = () => {\n if (form) {\n form.querySelectorAll(\"select[multiple]\").forEach((el) => setupMultiSelect(el));\n\n on(\"submit\", \".filter-form\", handleFilterChange);\n on(\"click\", \".filter-form-clear\", handleFilterClear);\n }\n};\n\ninit();\n","import wretch from 'wretch'\nimport QueryStringAddon from 'wretch/addons/queryString'\n\nwretch.options({\n headers: { 'X-Requested-With': 'XMLHttpRequest' },\n})\n\nexport default wretch().addon(QueryStringAddon)\n","export const isTouchDevice = \"ontouchstart\" in document.documentElement;\n\nexport const generateQueryString = (data = {}) => {\n let params = data;\n\n if (data instanceof FormData === true) {\n params = {};\n\n data.forEach((value, key) => (params[key] = value));\n }\n\n for (const key in params) {\n if (params[key] === \"\") {\n delete params[key];\n }\n }\n\n return new URLSearchParams(params);\n};\n\nexport const trackGoogleAnalytics = (event) => {\n if (window.dataLayer) {\n window.dataLayer.push(event);\n }\n};\n"],"names":["form","document","querySelector","multiSelects","isClearing","handleFilterChange","e","preventDefault","params","FormData","forEach","el","delete","selectEl","name","replace","value","getSelected","join","append","queryString","generateQueryString","url","size","action","window","history","replaceState","updateResults","async","pageContent","classList","add","res","ajax","get","location","href","json","innerHTML","page","remove","isFiltered","querySelectorAll","select","SlimSelect","settings","allowDeselect","closeOnSelect","showSearch","maxValuesShown","maxValuesMessage","events","afterChange","val","length","push","setupMultiSelect","on","handleFilterClear","x","setSelected","wretch","options","headers","addon","QueryStringAddon","isTouchDevice","documentElement","data","key","URLSearchParams","trackGoogleAnalytics","event","dataLayer"],"sourceRoot":""}