{"version":3,"file":"src_stimulus_controllers_dynamic_project_controller_ts.92970aa62023563a.js","mappings":"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","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 static values = {\n displayFilters: { type: Boolean, default: false },\n };\n\n declare displayFiltersValue:boolean;\n\n toggleDisplayFilters() {\n this.displayFiltersValue = !this.displayFiltersValue;\n }\n\n displayFiltersValueChanged() {\n this.toggleButtonActive();\n this.toggleFilterFormVisible();\n }\n\n toggleButtonActive() {\n if (this.displayFiltersValue) {\n this.filterFormToggleTarget.setAttribute('aria-disabled', 'true');\n } else {\n this.filterFormToggleTarget.removeAttribute('aria-disabled');\n }\n }\n\n toggleFilterFormVisible() {\n this.filterFormTarget.classList.toggle('-expanded', this.displayFiltersValue);\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-', '<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","targets","values","displayFilters","type","Boolean","default","toggleDisplayFilters","this","displayFiltersValue","displayFiltersValueChanged","toggleButtonActive","toggleFilterFormVisible","filterFormToggleTarget","setAttribute","removeAttribute","filterFormTarget","classList","toggle","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","removeFilter","filterToRemove","add","removedFilterOption","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","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"],"sourceRoot":"webpack:///","x_google_ignoreList":[]}