{"version":3,"file":"src_stimulus_controllers_dynamic_project_controller_ts.6a34319fe6059f85.js","mappings":"4NAwCc,MAAOA,0BAA0BC,EAAAA,GAA/CC,WAAAA,G,oBA6GmB,KAAAC,iBAAmB,CAAC,IAAK,KAAM,IAAK,KACpC,KAAAC,cAAgB,CAAC,MAAO,MAAO,KAAM,MAAO,MAAO,MACnD,KAAAC,eAAiB,KACjB,KAAAC,qBAAuB,MAgGvB,KAAAC,uBAAyB,CAAC,IAAK,KAAM,IAAK,KAC1C,KAAAC,kBAAoB,CAAC,OAAQ,WAAY,iBACzC,KAAAC,gBAAkB,CAAC,gBAAiB,OA2FvD,CA5QEC,gBAAAA,GACEC,KAAKC,uBAAuBC,UAAUC,OAAO,WAC7CH,KAAKI,iBAAiBF,UAAUC,OAAO,YACzC,CAEAE,iBAAAA,EAAoBC,QAAQ,WAAEC,KAC5B,MAAMC,EAAiBR,KAAKS,4BAA4BC,MAAMC,GAAyBA,EAAqBC,aAAa,sBAAwBL,IAC3IM,EAAeb,KAAKc,yBAAyBJ,MAAMK,IAAiBA,EAAYC,UAAYD,EAAYH,aAAa,sBAAwBL,IAC7IU,EAAcjB,KAAKc,yBAAyBJ,MAAMK,GAAgBA,EAAYC,UAAYD,EAAYH,aAAa,sBAAwBL,IACjJ,GAAIC,GAAkBK,GAAgBI,EAAa,CACjD,GAAIT,EAAeN,UAAUgB,SAAS,eAAgB,CACpD,MAAMC,EAAgBnB,KAAKoB,iBAAiBH,GAC5CjB,KAAKqB,iBAAiBR,EAAcM,E,KAC/B,CACL,MAAMA,EAAgBnB,KAAKoB,iBAAiBP,GAC5Cb,KAAKqB,iBAAiBJ,EAAaE,E,CAGrCX,EAAeN,UAAUC,OAAO,c,CAEpC,CAEQiB,gBAAAA,CAAiBE,GACvB,OAAOA,EAAcC,gBAAgB,IAAIC,KAC3C,CAEQH,gBAAAA,CAAiBC,EAAiCG,GACxDC,MAAMC,KAAKL,EAAcM,SAASC,SAASC,IACzCA,EAAOC,SAAWD,EAAON,QAAUC,CAAa,GAEpD,CAEAO,SAAAA,CAAUC,GACR,MAAMC,EAAsBD,EAAME,OAA6BX,MACzDY,EAAiBpC,KAAKqC,cAAc3B,MAAM4B,GAAWA,EAAO1B,aAAa,iBAAmBsB,IAE9FE,GACFA,EAAelC,UAAUqC,OAAO,UAGlCvC,KAAKwC,mBACLxC,KAAKyC,4BACLzC,KAAK0C,qBACP,CAEQF,gBAAAA,GACNxC,KAAK2C,sBAAsBpB,gBAAgB,GAAGqB,aAAa,WAAY,WACzE,CAEQH,yBAAAA,GACNzC,KAAK2C,sBAAsBf,QAAQ,GAAGgB,aAAa,WAAY,WACjE,CAEAC,YAAAA,EAAevC,QAAQ,WAAEC,KACvB,MAAMuC,EAAiB9C,KAAKqC,cAAc3B,MAAM4B,GAAWA,EAAO1B,aAAa,iBAAmBL,IAClGuC,GAAgB5C,UAAU6C,IAAI,UAE9B,MACMC,EADgBtB,MAAMC,KAAK3B,KAAK2C,sBAAsBf,SAClBlB,MAAMoB,GAAWA,EAAON,QAAUjB,IAC5EyC,GAAqBC,gBAAgB,YAErCjD,KAAK0C,qBACP,CAEQA,mBAAAA,GACF1C,KAAKkD,yBACPlD,KAAKmD,aAAajD,UAAUqC,OAAO,UAEnCvC,KAAKmD,aAAajD,UAAU6C,IAAI,SAEpC,CAEQG,sBAAAA,GACN,OAAOlD,KAAKqC,cAAce,MAAMd,IAAYA,EAAOpC,UAAUgB,SAAS,WACxE,CAOAmC,kBAAAA,EAAmB,OAAElB,EAAQ7B,QAAQ,WAAEC,KACrC,MAAM+C,EAAmBnB,EAAOX,MAC1BhB,EAAiBR,KAAKS,4BAA4BC,MAAMC,GAAyBA,EAAqBC,aAAa,sBAAwBL,IAC7IC,IACER,KAAKR,iBAAiB+D,SAASD,GACjC9C,EAAeN,UAAU6C,IAAI,UAE7BvC,EAAeN,UAAUqC,OAAO,UAG9BvC,KAAKP,cAAc8D,SAASD,IAC9B9C,EAAeN,UAAU6C,IAAI,QAC7BvC,EAAeN,UAAUqC,OAAO,WAChC/B,EAAeN,UAAUqC,OAAO,kBACvBe,IAAqBtD,KAAKN,gBACnCc,EAAeN,UAAU6C,IAAI,WAC7BvC,EAAeN,UAAUqC,OAAO,QAChC/B,EAAeN,UAAUqC,OAAO,kBACvBe,IAAqBtD,KAAKL,uBACnCa,EAAeN,UAAU6C,IAAI,iBAC7BvC,EAAeN,UAAUqC,OAAO,QAChC/B,EAAeN,UAAUqC,OAAO,YAGtC,CAEAiB,iBAAAA,EAAkB,OAAErB,EAAQ7B,QAAQ,UAAEmD,KACpC,MAAMC,EAAiBvB,EACjBwB,EAAe3D,KAAK4D,yBAAyBlD,MAAMmD,GAAYA,IAAYH,IAI3EI,EAAoB9D,KAAK+D,kBAAkBrD,MAAMsD,GAAeA,EAAWpD,aAAa,qBAAuB6C,EAAUQ,aACzHC,EAAwBlE,KAAKmE,sBAAsBzD,MAAM0D,GAAmBA,EAAexD,aAAa,qBAAuB6C,EAAUQ,aAE3IH,GAAqBI,IACvBJ,EAAkB5D,UAAUC,OAAO,oBACnC2D,EAAkB5D,UAAUC,OAAO,aACnC+D,EAAsBhE,UAAUC,OAAO,aAEvCH,KAAKqE,YAAYH,IAGfP,GACFA,EAAaW,OAEjB,CAEQD,WAAAA,CAAYD,GACdA,EAAelE,UAAUgB,SAAS,aACpCkD,EAAexB,aAAa,YAAa,UAEzCwB,EAAenB,gBAAgB,YAEnC,CAEAsB,QAAAA,GACwBC,SAASC,cAAc,mBAC/BC,MAAMC,QAAU,GAE9B,MAAMC,EAAU5E,KAAK6E,eACfC,EAAa9E,KAAK+E,gBAAgB,UACxC,IAAIC,EAAc,YAAYC,mBAAmBC,KAAKC,UAAUP,MAC5DE,IACFE,EAAc,GAAGA,YAAsBC,mBAAmBH,MAG5DM,OAAOC,SAASC,KAAOF,OAAOC,SAASE,SAAWP,CACpD,CAEQH,YAAAA,GACN,MAAMW,EAAkBxF,KAAKqC,cAAcC,QAAQA,IAAYA,EAAOpC,UAAUgB,SAAS,YACnF0D,EAAmB,GAmBzB,OAjBAY,EAAgB3D,SAASS,IACvB,MAAM/B,EAAa+B,EAAO1B,aAAa,eACjC6E,EAAanD,EAAO1B,aAAa,eACjC8E,EAAiB1F,KAAK2F,gBAAgBjF,MAAMkF,GAAaA,EAAShF,aAAa,sBAAwBL,KAAaiB,MAE1H,GAAIjB,GAAckF,GAAcC,EAAgB,CAC9C,MAAMG,EAAc7F,KAAK8F,iBAAiBvF,EAAYkF,EAAYC,GAElE,GAAIG,EAAa,CACf,MAAME,EAAuB,CAC3B,CAACxF,GAAa,CAAEqF,SAAUF,EAAgBM,OAAQH,IAEpDjB,EAAQqB,KAAKF,E,MAKZnB,CACT,CAMQkB,gBAAAA,CAAiBvF,EAAmBkF,EAAmBG,GAC7D,MAAMpF,EAAiBR,KAAKS,4BAA4BC,MAAMC,GAAyBA,EAAqBC,aAAa,sBAAwBL,IAEjJ,GAAIC,EAAgB,CAClB,MAAM0F,EAAW1F,EAAeiE,cAAc,0BAE9C,GAAIyB,EACF,MAAO,CAACA,EAASC,QAAU,IAAM,KAGnC,GAAInG,KAAKJ,uBAAuB2D,SAASqC,GACvC,MAAO,GAGT,GAAI5F,KAAKH,kBAAkB0D,SAASkC,GAClC,OAAOzF,KAAKoG,uBAAuB5F,EAAgBD,GAGrD,GAAIP,KAAKF,gBAAgByD,SAASkC,GAChC,OAAOzF,KAAKqG,qBAAqB7F,EAAgBD,GAGnD,MAAMiB,EAAQxB,KAAKsG,mBAAmB5F,MAAM6F,GAAqBA,EAAiB3F,aAAa,sBAAwBL,KAAaiB,MAEpI,GAAIA,GAASA,EAAMgF,OAAS,EAC1B,MAAO,CAAChF,E,CAIZ,OAAO,IACT,CAEQ4E,sBAAAA,CAAuB5F,EAA4BD,GACzD,IAAIkG,EAGFA,EADEjG,EAAeN,UAAUgB,SAAS,eACrBlB,KAAKc,yBAAyBwB,QAAQvB,GAAgBA,EAAYC,UAAYD,EAAYH,aAAa,sBAAwBL,IAE/HP,KAAKc,yBAAyBwB,QAAQvB,IAAiBA,EAAYC,UAAYD,EAAYH,aAAa,sBAAwBL,IAGjJ,MAAMmG,EAAiBC,EAAEC,QAAQlF,MAAMC,KAAK8E,GAAcI,KAAK9F,GAAgBW,MAAMC,KAAKZ,EAAYQ,iBAAiBsF,KAAK/E,GAAWA,EAAON,WAE9I,OAAIkF,EAAeF,OAAS,EACnBE,EAGF,IACT,CAEQL,oBAAAA,CAAqB7F,EAA4BD,GACvD,IAAIiB,EAEJ,GAAIhB,EAAeN,UAAUgB,SAAS,QAAS,CAC7C,MAAM4F,EAAY9G,KAAK+G,YAAYrG,MAAMsG,GAAcA,EAAUpG,aAAa,sBAAwBL,KAAaiB,MAEnHA,EAAQmF,EAAEM,QAAQ,CAACH,GAAY,G,MAC1B,GAAItG,EAAeN,UAAUgB,SAAS,WAAY,CACvD,MAAM4F,EAAY9G,KAAKkH,iBAAiBxG,MAAMyG,GAAcA,EAAUC,KAAO,iBAAiB7G,OAAeiB,MAE7GA,EAAQmF,EAAEM,QAAQ,CAACH,GAAY,G,MAC1B,GAAItG,EAAeN,UAAUgB,SAAS,iBAAkB,CAC7D,MAAMmG,EAAYrH,KAAKkH,iBAAiBxG,MAAMyG,GAAcA,EAAUC,KAAO,4BAA4B7G,OAAeiB,MAClH8F,EAAUtH,KAAKkH,iBAAiBxG,MAAMyG,GAAcA,EAAUC,KAAO,0BAA0B7G,OAAeiB,MAEpHA,EAAQ,CAAC6F,EAAWC,E,CAGtB,OAAI9F,GAASA,EAAMgF,OAAS,EACnBhF,EAGF,IACT,CAEQuD,eAAAA,CAAgBwC,GACtB,MACMC,EADcC,mBAAmBrC,OAAOC,SAASqC,OAAOC,UAAU,IACxCC,MAAM,KAEtC,IAAK,IAAIC,EAAI,EAAGA,EAAIL,EAAYhB,OAAQqB,IAAK,CAC3C,MAAOC,EAAKtG,GAASgG,EAAYK,GAAGD,MAAM,KAE1C,GAAIE,IAAQP,EACV,OAAO/F,IAAS,C,CAIpB,OAAO,IACT,EA5SmBnC,kBACZ0I,QAAU,CACf,mBACA,aACA,SACA,kBACA,SACA,oBACA,aACA,iBACA,WACA,uBACA,oBACA,OACA,YACA,c","sources":["./src/stimulus/controllers/dynamic/project.controller.ts"],"sourcesContent":["/*\n * -- copyright\n * OpenProject is an open source project management software.\n * Copyright (C) 2023 the OpenProject GmbH\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License version 3.\n *\n * OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n * Copyright (C) 2006-2013 Jean-Philippe Lang\n * Copyright (C) 2010-2013 the ChiliProject Team\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * See COPYRIGHT and LICENSE files for more details.\n * ++\n *\n */\n\nimport { Controller } from '@hotwired/stimulus';\n\ninterface Filter {\n [key:string]:{\n operator:string;\n values:string[];\n };\n}\n\nexport default class ProjectController extends Controller {\n static targets = [\n 'filterFormToggle',\n 'filterForm',\n 'filter',\n 'addFilterSelect',\n 'spacer',\n 'descriptionToggle',\n 'projectRow',\n 'descriptionRow',\n 'operator',\n 'filterValueContainer',\n 'filterValueSelect',\n 'days',\n 'singleDay',\n 'simpleValue',\n ];\n\n declare readonly filterFormToggleTarget:HTMLButtonElement;\n declare readonly filterFormTarget:HTMLFormElement;\n declare readonly filterTargets:HTMLElement[];\n declare readonly addFilterSelectTarget:HTMLSelectElement;\n declare readonly spacerTarget:HTMLElement;\n declare readonly descriptionToggleTargets:HTMLAnchorElement[];\n declare readonly projectRowTargets:HTMLTableRowElement[];\n declare readonly descriptionRowTargets:HTMLTableRowElement[];\n declare readonly operatorTargets:HTMLSelectElement[];\n declare readonly filterValueContainerTargets:HTMLElement[];\n declare readonly filterValueSelectTargets:HTMLSelectElement[];\n declare readonly daysTargets:HTMLInputElement[];\n declare readonly singleDayTargets:HTMLInputElement[];\n declare readonly simpleValueTargets:HTMLInputElement[];\n\n toggleFilterForm() {\n this.filterFormToggleTarget.classList.toggle('-active');\n this.filterFormTarget.classList.toggle('-expanded');\n }\n\n toggleMultiSelect({ params: { filterName } }:{ params:{ filterName:string } }) {\n const valueContainer = this.filterValueContainerTargets.find((filterValueContainer) => filterValueContainer.getAttribute('data-filter-name') === filterName);\n const singleSelect = this.filterValueSelectTargets.find((selectField) => !selectField.multiple && selectField.getAttribute('data-filter-name') === filterName);\n const multiSelect = this.filterValueSelectTargets.find((selectField) => selectField.multiple && selectField.getAttribute('data-filter-name') === filterName);\n if (valueContainer && singleSelect && multiSelect) {\n if (valueContainer.classList.contains('multi-value')) {\n const valueToSelect = this.getValueToSelect(multiSelect);\n this.setSelectOptions(singleSelect, valueToSelect);\n } else {\n const valueToSelect = this.getValueToSelect(singleSelect);\n this.setSelectOptions(multiSelect, valueToSelect);\n }\n\n valueContainer.classList.toggle('multi-value');\n }\n }\n\n private getValueToSelect(selectElement:HTMLSelectElement) {\n return selectElement.selectedOptions[0]?.value;\n }\n\n private setSelectOptions(selectElement:HTMLSelectElement, selectedValue:string) {\n Array.from(selectElement.options).forEach((option) => {\n option.selected = option.value === selectedValue;\n });\n }\n\n addFilter(event:Event) {\n const selectedFilterName = (event.target as HTMLSelectElement).value;\n const selectedFilter = this.filterTargets.find((filter) => filter.getAttribute('filter-name') === selectedFilterName);\n\n if (selectedFilter) {\n selectedFilter.classList.remove('hidden');\n }\n\n this.disableSelection();\n this.reselectPlaceholderOption();\n this.setSpacerVisibility();\n }\n\n private disableSelection() {\n this.addFilterSelectTarget.selectedOptions[0].setAttribute('disabled', 'disabled');\n }\n\n private reselectPlaceholderOption() {\n this.addFilterSelectTarget.options[0].setAttribute('selected', 'selected');\n }\n\n removeFilter({ params: { filterName } }:{ params:{ filterName:string } }) {\n const filterToRemove = this.filterTargets.find((filter) => filter.getAttribute('filter-name') === filterName);\n filterToRemove?.classList.add('hidden');\n\n const selectOptions = Array.from(this.addFilterSelectTarget.options);\n const removedFilterOption = selectOptions.find((option) => option.value === filterName);\n removedFilterOption?.removeAttribute('disabled');\n\n this.setSpacerVisibility();\n }\n\n private setSpacerVisibility() {\n if (this.anyFiltersStillVisible()) {\n this.spacerTarget.classList.remove('hidden');\n } else {\n this.spacerTarget.classList.add('hidden');\n }\n }\n\n private anyFiltersStillVisible() {\n return this.filterTargets.some((filter) => !filter.classList.contains('hidden'));\n }\n\n private readonly noValueOperators = ['*', '!*', 't', 'w'];\n private readonly daysOperators = ['>t-', 't+', 't+'];\n private readonly onDateOperator = '=d';\n private readonly betweenDatesOperator = '<>d';\n\n setValueVisibility({ target, params: { filterName } }:{ target:HTMLSelectElement, params:{ filterName:string } }) {\n const selectedOperator = target.value;\n const valueContainer = this.filterValueContainerTargets.find((filterValueContainer) => filterValueContainer.getAttribute('data-filter-name') === filterName);\n if (valueContainer) {\n if (this.noValueOperators.includes(selectedOperator)) {\n valueContainer.classList.add('hidden');\n } else {\n valueContainer.classList.remove('hidden');\n }\n\n if (this.daysOperators.includes(selectedOperator)) {\n valueContainer.classList.add('days');\n valueContainer.classList.remove('on-date');\n valueContainer.classList.remove('between-dates');\n } else if (selectedOperator === this.onDateOperator) {\n valueContainer.classList.add('on-date');\n valueContainer.classList.remove('days');\n valueContainer.classList.remove('between-dates');\n } else if (selectedOperator === this.betweenDatesOperator) {\n valueContainer.classList.add('between-dates');\n valueContainer.classList.remove('days');\n valueContainer.classList.remove('on-date');\n }\n }\n }\n\n toggleDescription({ target, params: { projectId } }:{ target:HTMLAnchorElement, params:{ projectId:number } }) {\n const toggledTrigger = target;\n const otherTrigger = this.descriptionToggleTargets.find((trigger) => trigger !== toggledTrigger);\n // The projectId action parameter is automatically typecast to Number\n // and to compare it with a data attribute it needs to be converted to\n // a string.\n const clickedProjectRow = this.projectRowTargets.find((projectRow) => projectRow.getAttribute('data-project-id') === projectId.toString());\n const projectDescriptionRow = this.descriptionRowTargets.find((descriptionRow) => descriptionRow.getAttribute('data-project-id') === projectId.toString());\n\n if (clickedProjectRow && projectDescriptionRow) {\n clickedProjectRow.classList.toggle('-no-highlighting');\n clickedProjectRow.classList.toggle('-expanded');\n projectDescriptionRow.classList.toggle('-expanded');\n\n this.setAriaLive(projectDescriptionRow);\n }\n\n if (otherTrigger) {\n otherTrigger.focus();\n }\n }\n\n private setAriaLive(descriptionRow:HTMLElement) {\n if (descriptionRow.classList.contains('-expanded')) {\n descriptionRow.setAttribute('aria-live', 'polite');\n } else {\n descriptionRow.removeAttribute('aria-live');\n }\n }\n\n sendForm() {\n const ajaxIndicator = document.querySelector('#ajax-indicator') as HTMLElement;\n ajaxIndicator.style.display = '';\n\n const filters = this.parseFilters();\n const orderParam = this.getUrlParameter('sortBy');\n let queryString = `?filters=${encodeURIComponent(JSON.stringify(filters))}`;\n if (orderParam) {\n queryString = `${queryString}&sortBy=${encodeURIComponent(orderParam)}`;\n }\n\n window.location.href = window.location.pathname + queryString;\n }\n\n private parseFilters() {\n const advancedFilters = this.filterTargets.filter((filter) => !filter.classList.contains('hidden'));\n const filters:Filter[] = [];\n\n advancedFilters.forEach((filter) => {\n const filterName = filter.getAttribute('filter-name');\n const filterType = filter.getAttribute('filter-type');\n const parsedOperator = this.operatorTargets.find((operator) => operator.getAttribute('data-filter-name') === filterName)?.value;\n\n if (filterName && filterType && parsedOperator) {\n const parsedValue = this.parseFilterValue(filterName, filterType, parsedOperator);\n\n if (parsedValue) {\n const currentFilter:Filter = {\n [filterName]: { operator: parsedOperator, values: parsedValue as string[] },\n };\n filters.push(currentFilter);\n }\n }\n });\n\n return filters;\n }\n\n private readonly operatorsWithoutValues = ['*', '!*', 't', 'w'];\n private readonly selectFilterTypes = ['list', 'list_all', 'list_optional'];\n private readonly dateFilterTypes = ['datetime_past', 'date'];\n\n private parseFilterValue(filterName:string, filterType:string, operator:string) {\n const valueContainer = this.filterValueContainerTargets.find((filterValueContainer) => filterValueContainer.getAttribute('data-filter-name') === filterName);\n\n if (valueContainer) {\n const checkbox = valueContainer.querySelector('input[type=\"checkbox\"]') as HTMLInputElement;\n\n if (checkbox) {\n return [checkbox.checked ? 't' : 'f'];\n }\n\n if (this.operatorsWithoutValues.includes(operator)) {\n return [];\n }\n\n if (this.selectFilterTypes.includes(filterType)) {\n return this.parseSelectFilterValue(valueContainer, filterName);\n }\n\n if (this.dateFilterTypes.includes(filterType)) {\n return this.parseDateFilterValue(valueContainer, filterName);\n }\n\n const value = this.simpleValueTargets.find((simpleValueInput) => simpleValueInput.getAttribute('data-filter-name') === filterName)?.value;\n\n if (value && value.length > 0) {\n return [value];\n }\n }\n\n return null;\n }\n\n private parseSelectFilterValue(valueContainer:HTMLElement, filterName:string) {\n let selectFields;\n\n if (valueContainer.classList.contains('multi-value')) {\n selectFields = this.filterValueSelectTargets.filter((selectField) => selectField.multiple && selectField.getAttribute('data-filter-name') === filterName);\n } else {\n selectFields = this.filterValueSelectTargets.filter((selectField) => !selectField.multiple && selectField.getAttribute('data-filter-name') === filterName);\n }\n\n const selectedValues = _.flatten(Array.from(selectFields).map((selectField) => Array.from(selectField.selectedOptions).map((option) => option.value)));\n\n if (selectedValues.length > 0) {\n return selectedValues;\n }\n\n return null;\n }\n\n private parseDateFilterValue(valueContainer:HTMLElement, filterName:string) {\n let value;\n\n if (valueContainer.classList.contains('days')) {\n const dateValue = this.daysTargets.find((daysField) => daysField.getAttribute('data-filter-name') === filterName)?.value;\n\n value = _.without([dateValue], '');\n } else if (valueContainer.classList.contains('on-date')) {\n const dateValue = this.singleDayTargets.find((dateInput) => dateInput.id === `on-date-value-${filterName}`)?.value;\n\n value = _.without([dateValue], '');\n } else if (valueContainer.classList.contains('between-dates')) {\n const fromValue = this.singleDayTargets.find((dateInput) => dateInput.id === `between-dates-from-value-${filterName}`)?.value;\n const toValue = this.singleDayTargets.find((dateInput) => dateInput.id === `between-dates-to-value-${filterName}`)?.value;\n\n value = [fromValue, toValue];\n }\n\n if (value && value.length > 0) {\n return value;\n }\n\n return null;\n }\n\n private getUrlParameter(sortParam:string) {\n const queryString = decodeURIComponent(window.location.search.substring(1));\n const queryParams = queryString.split('&');\n\n for (let i = 0; i < queryParams.length; i++) {\n const [key, value] = queryParams[i].split('=');\n\n if (key === sortParam) {\n return value || true;\n }\n }\n\n return null;\n }\n}\n"],"names":["ProjectController","Controller","constructor","noValueOperators","daysOperators","onDateOperator","betweenDatesOperator","operatorsWithoutValues","selectFilterTypes","dateFilterTypes","toggleFilterForm","this","filterFormToggleTarget","classList","toggle","filterFormTarget","toggleMultiSelect","params","filterName","valueContainer","filterValueContainerTargets","find","filterValueContainer","getAttribute","singleSelect","filterValueSelectTargets","selectField","multiple","multiSelect","contains","valueToSelect","getValueToSelect","setSelectOptions","selectElement","selectedOptions","value","selectedValue","Array","from","options","forEach","option","selected","addFilter","event","selectedFilterName","target","selectedFilter","filterTargets","filter","remove","disableSelection","reselectPlaceholderOption","setSpacerVisibility","addFilterSelectTarget","setAttribute","removeFilter","filterToRemove","add","removedFilterOption","removeAttribute","anyFiltersStillVisible","spacerTarget","some","setValueVisibility","selectedOperator","includes","toggleDescription","projectId","toggledTrigger","otherTrigger","descriptionToggleTargets","trigger","clickedProjectRow","projectRowTargets","projectRow","toString","projectDescriptionRow","descriptionRowTargets","descriptionRow","setAriaLive","focus","sendForm","document","querySelector","style","display","filters","parseFilters","orderParam","getUrlParameter","queryString","encodeURIComponent","JSON","stringify","window","location","href","pathname","advancedFilters","filterType","parsedOperator","operatorTargets","operator","parsedValue","parseFilterValue","currentFilter","values","push","checkbox","checked","parseSelectFilterValue","parseDateFilterValue","simpleValueTargets","simpleValueInput","length","selectFields","selectedValues","_","flatten","map","dateValue","daysTargets","daysField","without","singleDayTargets","dateInput","id","fromValue","toValue","sortParam","queryParams","decodeURIComponent","search","substring","split","i","key","targets"],"sourceRoot":"webpack:///","x_google_ignoreList":[]}