{"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":[]}