{"version":3,"file":"hslayers-ng-common-filters.mjs","sources":["../../../projects/hslayers/common/filters/filters.service.ts","../../../projects/hslayers/common/filters/add-filter-button/add-filter-button.component.ts","../../../projects/hslayers/common/filters/add-filter-button/add-filter-button.component.html","../../../projects/hslayers/common/filters/filter-range-input/filter-range-input.component.ts","../../../projects/hslayers/common/filters/comparison-filter/attribute-selector/attribute-selector.component.ts","../../../projects/hslayers/common/filters/comparison-filter/comparison-filter.component.ts","../../../projects/hslayers/common/filters/comparison-filter/comparison-filter.component.html","../../../projects/hslayers/common/filters/filter.component.ts","../../../projects/hslayers/common/filters/filter.component.html","../../../projects/hslayers/common/filters/filters.component.ts","../../../projects/hslayers/common/filters/filters.component.html","../../../projects/hslayers/common/filters/hslayers-ng-common-filters.ts"],"sourcesContent":["import {HttpClient} from '@angular/common/http';\nimport {Injectable, inject} from '@angular/core';\nimport {Observable, of} from 'rxjs';\nimport {catchError, map} from 'rxjs/operators';\n\nimport {Layer} from 'ol/layer';\nimport {Source} from 'ol/source';\n\nimport {HsLanguageService} from 'hslayers-ng/services/language';\nimport {\n  HsLayerDescriptor,\n  WfsFeatureAttribute,\n  Filter,\n  FilterType,\n  LogicalOperatorType,\n} from 'hslayers-ng/types';\nimport {HsToastService} from 'hslayers-ng/common/toast';\nimport {HsProxyService} from 'hslayers-ng/services/utils';\nimport {\n  getDefinition,\n  getName,\n  getWfsUrl,\n  getWorkspace,\n} from 'hslayers-ng/common/extensions';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class HsFiltersService {\n  http = inject(HttpClient);\n  hsToastService = inject(HsToastService);\n  hsLanguageService = inject(HsLanguageService);\n  hsProxyService = inject(HsProxyService);\n\n  selectedLayer: HsLayerDescriptor;\n\n  attributesExcludedFromList: string[];\n  layerAttributes: WfsFeatureAttribute[] = [];\n\n  /**\n   * Sets the selected layer for filtering operations\n   * @param layer The layer to be set as selected\n   */\n  setSelectedLayer(layer: HsLayerDescriptor): void {\n    this.selectedLayer = layer;\n  }\n\n  /**\n   * Sets the attributes for the selected layer\n   * @param attributes Array of WFS feature attributes\n   */\n  setLayerAttributes(attributes: WfsFeatureAttribute[]): void {\n    this.layerAttributes = attributes;\n  }\n\n  /**\n   * Adds a new filter to the collection based on the specified type\n   * @param type The type of filter to add (AND, OR, COMPARE, NOT)\n   * @param append Whether to append the new filter or replace existing ones\n   * @param collection The collection to add the filter to\n   */\n  add(type: FilterType, append: boolean, collection: any[]): void {\n    let filter;\n    switch (type) {\n      case 'AND':\n        filter = [\n          '&&',\n          ['==', undefined, '<value>'],\n          ['==', undefined, '<value>'],\n        ];\n        break;\n      case 'OR':\n        filter = [\n          '||',\n          ['==', undefined, '<value>'],\n          ['==', undefined, '<value>'],\n        ];\n        break;\n      case 'COMPARE':\n        filter = ['==', undefined, '<value>'];\n        break;\n      case 'NOT':\n        filter = ['!', ['==', undefined, '<value>']];\n        break;\n      default:\n    }\n    if (append) {\n      collection.push(filter);\n    } else {\n      collection.length = 0;\n      collection.push(...filter);\n    }\n  }\n\n  /**\n   * Converts logical operators to human-readable format\n   * @param logOp The logical operator to convert\n   * @returns The human-readable version of the operator\n   */\n  humanReadableLogOp(logOp: string): LogicalOperatorType {\n    return {'&&': 'AND', '||': 'OR', '!': 'NOT'}[logOp] as LogicalOperatorType;\n  }\n\n  /**\n   * Checks if the given filter is a logical operator\n   * @param filters The filter array to check\n   * @returns True if the filter is a logical operator, false otherwise\n   */\n  isLogOp(filters: any[]): boolean {\n    return filters?.length > 0 && ['&&', '||', '!'].includes(filters[0]);\n  }\n\n  /**\n   * Checks if a filter can be deleted\n   */\n  private canDeleteFilter(parent: Filter): boolean {\n    if (!Array.isArray(parent)) {\n      return false;\n    }\n    return (\n      (['||', '&&'].includes(parent[0]) && parent.length > 3) ||\n      (parent[0] === '!' && parent.length > 2)\n    );\n  }\n\n  /**\n   * Displays a warning message when a filter cannot be deleted.\n   * @param parent The parent filter array\n   */\n  private showCannotDeleteFilterWarning(parent: Filter): void {\n    const readableOp = this.humanReadableLogOp(parent[0]);\n    const message = this.hsLanguageService.getTranslation(\n      'FILTERS.cannotDeleteFilterToastMessage',\n      {\n        operator: readableOp,\n        count: readableOp === 'NOT' ? 1 : 2,\n      },\n    );\n    this.hsToastService.createToastPopupMessage(\n      'STYLER.removeFilter',\n      message,\n      {\n        type: 'warning',\n        serviceCalledFrom: 'HsFiltersService',\n      },\n    );\n  }\n\n  /**\n   * Removes a filter from the parent filter array\n   * @param parent The parent filter array\n   * @param filter The filter to remove\n   * @returns True if the filter was successfully removed, false otherwise\n   */\n  removeFilter(parent: Filter, filter: Filter): boolean {\n    if (Array.isArray(parent) && this.canDeleteFilter(parent)) {\n      const index = parent.findIndex((item) => item === filter);\n      if (index !== -1) {\n        parent.splice(index, 1);\n        return true;\n      }\n    }\n    this.showCannotDeleteFilterWarning(parent);\n    return false;\n  }\n\n  /**\n   * Fetches attribute values for a given attribute name\n   * @param attributeName The name of the attribute to fetch values for\n   * @returns An Observable of the WfsFeatureAttribute with fetched values\n   */\n  getAttributeWithValues(\n    attributeName: string,\n  ): Observable<WfsFeatureAttribute> {\n    const attribute = this.layerAttributes.find(\n      (attr) => attr.name === attributeName,\n    );\n    if (!attribute) {\n      return of(null);\n    }\n\n    if (attribute.values || attribute.range) {\n      return of(attribute);\n    }\n\n    return this.fetchAttributeValues(attribute).pipe(\n      map((updatedAttr) => {\n        const index = this.layerAttributes.findIndex(\n          (attr) => attr.name === attributeName,\n        );\n        this.layerAttributes[index] = updatedAttr;\n        return updatedAttr;\n      }),\n      catchError(() => of(attribute)),\n    );\n  }\n\n  /**\n   * Fetches attribute values from the WFS service\n   * @param attribute The attribute to fetch values for\n   * @returns An Observable of the updated WfsFeatureAttribute\n   */\n  private fetchAttributeValues(\n    attribute: WfsFeatureAttribute,\n  ): Observable<WfsFeatureAttribute> {\n    if (!this.selectedLayer?.layer) {\n      return of(attribute);\n    }\n\n    const url = this.buildWfsUrl(this.selectedLayer.layer, attribute.name);\n\n    return this.http.get(url, {observe: 'response', responseType: 'text'}).pipe(\n      map((response) => {\n        const contentType = response.headers.get('content-type');\n        let parsedResponse: any;\n\n        /**\n         * NOTE: Spec says it might be served in other formats other than GML but\n         * havent found any example so keeping just in case\n         */\n        if (contentType && contentType.includes('application/json')) {\n          parsedResponse = JSON.parse(response.body);\n        } else {\n          // Assume XML if not JSON\n          parsedResponse = response.body;\n        }\n\n        const values = this.extractValuesFromResponse(\n          parsedResponse,\n          attribute,\n        );\n        if (attribute.isNumeric) {\n          return {\n            ...attribute,\n            range: {\n              min: Math.min(...values),\n              max: Math.max(...values),\n            },\n          };\n        }\n        return {\n          ...attribute,\n          values,\n        };\n      }),\n      catchError(() => of(attribute)),\n    );\n  }\n\n  /**\n   * Builds the WFS URL for fetching attribute values\n   * @param layer The layer to build the URL for\n   * @param attributeName The name of the attribute\n   * @returns The constructed WFS URL\n   */\n  private buildWfsUrl(layer: Layer<Source>, attributeName: string): string {\n    const baseUrl = getWfsUrl(layer) || getDefinition(layer).url;\n    const params = [\n      'service=WFS',\n      'version=2.0.0',\n      'request=GetPropertyValue',\n      `typename=${getName(layer)}`,\n      `valueReference=${attributeName}`,\n      'outputFormat=application/json',\n    ].join('&');\n    return this.hsProxyService.proxify(`${baseUrl}?${params.toString()}`);\n  }\n\n  /**\n   * Returns an array of unique, sorted attribute values\n   * @param values The array of values to sort\n   * @returns An array of unique, sorted values\n   */\n  getSortedUniqueValues(values: any[]): any[] {\n    return [...new Set(values)].sort((a, b) => {\n      if (typeof a === 'string' && typeof b === 'string') {\n        return a.localeCompare(b);\n      }\n      return a - b;\n    });\n  }\n\n  /**\n   * Extracts attribute values from the WFS response\n   * @param response The WFS response (can be JSON or XML)\n   * @param attribute The WFS feature attribute\n   * @returns An array of unique, sorted attribute values\n   */\n  private extractValuesFromResponse(\n    response: any,\n    attribute: WfsFeatureAttribute,\n  ): any[] {\n    let values: any[] = [];\n\n    if (typeof response === 'string') {\n      // XML response\n      const parser = new DOMParser();\n      const xmlDoc = parser.parseFromString(response, 'text/xml');\n      /**\n       * Extract values from the 'namespace:attributeName' elements\n       * namespace is extracted from\n       * a) normal WFS layers : the layerName eg.'filip:layer'\n       * b) Layman layers: workspace\n       */\n      const namespace =\n        getWorkspace(this.selectedLayer.layer) ||\n        getName(this.selectedLayer.layer).split(':')[0];\n      const elementName = `${namespace}:${attribute.name}`;\n      const valueElements = xmlDoc.getElementsByTagName(elementName);\n      values = Array.from(valueElements).map((el) =>\n        attribute.isNumeric ? +el.textContent : el.textContent.trim(),\n      );\n    } else if (response.features && Array.isArray(response.features)) {\n      // JSON response\n      values = response.features.map(\n        (feature) => feature.properties[attribute.name],\n      );\n    }\n    // Return unique, sorted values\n    return this.getSortedUniqueValues(values);\n  }\n}\n","import {\n  Component,\n  EventEmitter,\n  OnChanges,\n  Output,\n  SimpleChange,\n  inject,\n  input,\n} from '@angular/core';\nimport {NgbDropdownModule} from '@ng-bootstrap/ng-bootstrap';\nimport {TranslatePipe} from '@ngx-translate/core';\nimport {Rule} from 'geostyler-style';\n\nimport {\n  ComparisonOperatorType,\n  FilterType,\n  LogicalOperatorType,\n} from 'hslayers-ng/types';\nimport {HsFiltersService} from '../filters.service';\n\n@Component({\n  selector: 'hs-add-filter-button',\n  templateUrl: './add-filter-button.component.html',\n  imports: [TranslatePipe, NgbDropdownModule],\n})\nexport class HsAddFilterButtonComponent implements OnChanges {\n  @Output() clicks = new EventEmitter();\n  rule = input<Rule>();\n\n  ngOnChanges({rule}: {rule?: SimpleChange & {currentValue: Rule}}) {\n    /**\n     * Set correct active tab on rule change\n     */\n    if (rule !== undefined) {\n      if (rule.currentValue.filter?.[0]) {\n        const readableType = this.hsFiltersService.humanReadableLogOp(\n          rule.currentValue.filter[0],\n        );\n        this.setActiveTab(readableType || this.comparisonOperator);\n      } else {\n        this.activeTab = undefined;\n      }\n    }\n  }\n\n  hsFiltersService = inject(HsFiltersService);\n\n  activeTab: FilterType;\n  readonly logicalOperators: LogicalOperatorType[] = ['AND', 'OR', 'NOT'];\n  readonly comparisonOperator: ComparisonOperatorType = 'COMPARE';\n  readonly filterOptions: FilterType[] = [\n    this.comparisonOperator,\n    ...this.logicalOperators,\n  ];\n\n  emitClick(type: FilterType): void {\n    this.clicks.emit({type});\n    this.setActiveTab(type);\n  }\n\n  setActiveTab(type: FilterType) {\n    const rule = this.rule();\n    if (\n      !type &&\n      rule?.filter &&\n      Array.isArray(rule.filter) &&\n      rule.filter.length > 0\n    ) {\n      const readableType = this.hsFiltersService.humanReadableLogOp(\n        rule.filter[0],\n      );\n      this.activeTab = readableType || this.comparisonOperator;\n    } else {\n      this.activeTab = type;\n    }\n  }\n}\n","@if (!rule()) {\n  <div class=\"p-1\">\n    <div ngbDropdown class=\"d-inline-block\" #menu=\"ngbDropdown\">\n      <button class=\"btn btn-outline-primary btn-sm\" [title]=\"'STYLER.addFilter' | translate\" ngbDropdownToggle>\n        <span class=\"fa-solid fa-plus\"></span>\n      </button>\n      <div ngbDropdownMenu>\n        @for (filter of filterOptions; track filter) {\n          <button ngbDropdownItem (click)=\"emitClick(filter); menu.close()\">\n            {{ 'STYLER.' + filter | translate }}\n          </button>\n        }\n      </div>\n    </div>\n  </div>\n} @else {\n  <div class=\"btn-group w-100 py-2 px-1\">\n    @for (filter of filterOptions; track filter) {\n      <button class=\"btn btn-sm btn-outline-primary hs-add-filter-tab w-25 rounded-0\"\n        [class.text-bg-primary]=\"filter === activeTab\" (click)=\"emitClick(filter)\">\n        {{ 'STYLER.' + filter | translate }}\n      </button>\n    }\n  </div>\n}\n\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  input,\n  model,\n  output,\n  signal,\n} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\nimport {NgClass} from '@angular/common';\nimport {debounceTime} from 'rxjs';\nimport {takeUntilDestroyed, toObservable} from '@angular/core/rxjs-interop';\n\n@Component({\n  selector: 'hs-filter-range-input',\n  imports: [FormsModule, NgClass],\n  template: `\n    <div\n      class=\"filter-range-input-container position-relative h-100\"\n      [ngClass]=\"{'expanded': expanded()}\"\n    >\n      <div class=\"value-bubble text-bg-primary\" [style.left]=\"bubblePosition()\">\n        {{ value() }}\n      </div>\n      <input\n        #rangeInput\n        type=\"range\"\n        class=\"form-range border px-1 h-100\"\n        [(ngModel)]=\"value\"\n        [min]=\"min()\"\n        [max]=\"max()\"\n        (mousedown)=\"expandRange()\"\n        (mouseup)=\"contractRange()\"\n        (mouseleave)=\"contractRange()\"\n      />\n    </div>\n  `,\n  styles: [\n    `\n      .filter-range-input-container {\n        transition: min-width 0.5s ease-in-out;\n      }\n\n      .value-bubble {\n        position: absolute;\n        padding: 2px 6px;\n        border-radius: 10px;\n        font-size: 12px;\n        top: -10px;\n        transform: translateX(-50%);\n      }\n    `,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FilterRangeInputComponent {\n  min = input<number>();\n  max = input<number>();\n  value = model<number>();\n  change = output<number>();\n\n  bubblePosition = computed(() => {\n    const newVal = Number(\n      ((this.value() - this.min()) * 100) / (this.max() - this.min()),\n    );\n    return `calc(${newVal}% + (${12 - newVal * 0.15}px))`;\n  });\n\n  private expandedSignal = signal(false);\n  expanded = this.expandedSignal.asReadonly();\n\n  constructor() {\n    toObservable(this.bubblePosition)\n      .pipe(debounceTime(250), takeUntilDestroyed())\n      .subscribe(() => {\n        this.change.emit(this.value());\n      });\n  }\n\n  expandRange() {\n    this.expandedSignal.set(true);\n  }\n\n  contractRange() {\n    this.expandedSignal.set(false);\n  }\n}\n","import {Component, forwardRef, input} from '@angular/core';\nimport {\n  ControlValueAccessor,\n  FormsModule,\n  NG_VALUE_ACCESSOR,\n  ReactiveFormsModule,\n} from '@angular/forms';\nimport {TranslatePipe} from '@ngx-translate/core';\n\n@Component({\n  selector: 'hs-filters-attribute-selector',\n  imports: [FormsModule, ReactiveFormsModule, TranslatePipe],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      // eslint-disable-next-line no-use-before-define\n      useExisting: forwardRef(() => HsAttributeSelectorComponent),\n      multi: true,\n    },\n  ],\n  template: `\n    <select\n      class=\"form-control form-select hs-comparison-filter-attribute h-100 border-end-0\"\n      [(ngModel)]=\"value\"\n      (ngModelChange)=\"onChange($event)\"\n      (blur)=\"onTouched()\"\n      [disabled]=\"disabled\"\n    >\n      <option [ngValue]=\"null\" [disabled]=\"true\" hidden>\n        {{ 'FILTERS.pickAnAttribute' | translate }}\n      </option>\n      @for (attr of attributes(); track attr) {\n        <option [ngValue]=\"attr\">{{ attr }}</option>\n      }\n    </select>\n  `,\n})\nexport class HsAttributeSelectorComponent implements ControlValueAccessor {\n  attributes = input.required<string[]>();\n\n  value: string = null;\n  disabled = false;\n\n  onChange: (value: string) => void = () => {};\n  onTouched: () => void = () => {};\n\n  writeValue(value: string): void {\n    this.value = value;\n  }\n\n  registerOnChange(fn: (value: string) => void): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    this.disabled = isDisabled;\n  }\n}\n","import {AsyncPipe, NgClass} from '@angular/common';\nimport {\n  Component,\n  DestroyRef,\n  Injector,\n  Input,\n  OnChanges,\n  OnInit,\n  SimpleChange,\n  WritableSignal,\n  computed,\n  inject,\n  signal,\n  viewChild,\n} from '@angular/core';\nimport {Feature} from 'ol';\nimport {FormControl, FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {Geometry} from 'ol/geom';\nimport {\n  Observable,\n  catchError,\n  concat,\n  filter,\n  map,\n  of,\n  share,\n  startWith,\n  switchMap,\n  take,\n  tap,\n} from 'rxjs';\nimport {Vector as VectorSource} from 'ol/source';\nimport {takeUntilDestroyed, toSignal} from '@angular/core/rxjs-interop';\nimport {TranslatePipe} from '@ngx-translate/core';\n\nimport {CombinationOperator, ComparisonOperator} from 'geostyler-style';\nimport {FilterRangeInputComponent} from '../filter-range-input/filter-range-input.component';\nimport {HsAttributeSelectorComponent} from './attribute-selector/attribute-selector.component';\nimport {HsFiltersService} from '../filters.service';\nimport {HsLayoutService} from 'hslayers-ng/services/layout';\nimport {HsStylerPartBaseComponent} from 'hslayers-ng/services/styler';\nimport {listAttributes} from 'hslayers-ng/services/utils';\nimport {WfsFeatureAttribute, Filter} from 'hslayers-ng/types';\n\ninterface Operator {\n  value: string;\n  alias: string;\n}\n\ninterface FilterWithArgs {\n  name: 'property';\n  args: [string];\n}\n\n@Component({\n  imports: [\n    NgClass,\n    ReactiveFormsModule,\n    FormsModule,\n    TranslatePipe,\n    AsyncPipe,\n    FilterRangeInputComponent,\n    HsAttributeSelectorComponent,\n  ],\n  selector: 'hs-comparison-filter',\n  templateUrl: './comparison-filter.component.html',\n  styleUrls: ['./comparison-filter.component.scss'],\n})\nexport class HsComparisonFilterComponent\n  extends HsStylerPartBaseComponent\n  implements OnInit, OnChanges\n{\n  @Input() filter: Filter;\n  @Input() parent: Filter;\n\n  _filter: Filter;\n\n  injector = inject(Injector);\n\n  filterRangeInput = viewChild<FilterRangeInputComponent>(\n    FilterRangeInputComponent,\n  );\n  expanded = computed(() => this.filterRangeInput()?.expanded() ?? false);\n\n  private readonly OPERATORS = {\n    default: [\n      {value: '==', alias: '='},\n      {value: '!=', alias: '≠'},\n    ],\n    custom: [\n      {value: '==', alias: '= ∅'},\n      {value: '!=', alias: '≠ ∅'},\n    ],\n    stringBased: [{value: '*=', alias: '≈'}],\n    numeric: [\n      {value: '<', alias: '<'},\n      {value: '<=', alias: '≤'},\n      {value: '>', alias: '>'},\n      {value: '>=', alias: '≥'},\n    ],\n  };\n  customOperatorSelected = signal(false);\n\n  features: Feature<Geometry>[] = [];\n\n  attributeControl: FormControl;\n  attributes: string[];\n  operators: Observable<Operator[]>;\n  currentAttribute: WritableSignal<WfsFeatureAttribute> = signal(null);\n\n  hsFiltersService = inject(HsFiltersService);\n  hsLayoutService = inject(HsLayoutService);\n  destroyRef = inject(DestroyRef);\n\n  loading: WritableSignal<boolean> = signal(false);\n\n  selectedOperator = signal<string>(null);\n  valueSource = signal<'value' | 'property'>('value');\n\n  constructor() {\n    super();\n    this.updateFeatures();\n  }\n\n  isWfsFilter = toSignal(\n    this.hsLayoutService.mainpanel$.pipe(map((panel) => panel === 'wfsFilter')),\n  );\n\n  override emitChange(): void {\n    /**\n     * Sync local and remote filter values\n     */\n    if (this.valueSource() === 'property') {\n      /**\n       * Form necessary for geostlyer parser to properly encode fitler into SLD\n       */\n      this.filter[2] = {\n        name: 'property',\n        args: [this.extractValue(this._filter[2] as any)],\n      };\n      this.filter[1] = {\n        name: 'property',\n        args: [this.extractValue(this._filter[1] as any)],\n      };\n    } else {\n      this.filter[1] = this._filter[1];\n      this.filter[2] = this._filter[2];\n    }\n    this.changes.emit();\n  }\n\n  /**\n   * Extracts the value from the FilterWithArgs object\n   * @param value The value to extract\n   * @returns The extracted value\n   */\n  extractValue(value: string | FilterWithArgs): string {\n    if (value && typeof value === 'object' && 'args' in value) {\n      this.valueSource.set('property');\n      return value.args[0];\n    }\n    return value as string;\n  }\n\n  /**\n   * Parses filter values to extract the attribute name from the FilterWithArgs object\n   * in order to keep local state simple: string based\n   */\n  parseFilterValues(filter: Filter): Filter {\n    const localFilter = [\n      filter[0],\n      this.extractValue(filter[1] as FilterWithArgs),\n      this.extractValue(filter[2] as FilterWithArgs),\n    ] as Filter;\n    return localFilter;\n  }\n\n  /**\n   * In case user toggles between layer with comparison filters set up\n   * component is not recreated, only its inputs are changed.\n   * In that case we need to update features and reinitialize the filter.\n   */\n  ngOnChanges({\n    filter,\n    parent,\n  }: {\n    filter?: SimpleChange & {currentValue: any};\n    parent?: SimpleChange & {currentValue: any};\n  }): void {\n    if (filter && filter.previousValue) {\n      this.updateFeatures();\n      this.initializeFilter();\n    }\n  }\n\n  /**\n   * Handles operator selection changes\n   */\n  onOperatorChange(e: Event): void {\n    const operatorAlias = (e.target as HTMLSelectElement).value;\n    const isCustom = (\n      this.OPERATORS.custom.map((op) => op.alias) as string[]\n    ).includes(operatorAlias);\n    this.customOperatorSelected.set(isCustom);\n    const operators = Object.values(this.OPERATORS).flat();\n    const foundOperator = operators.find(\n      (op) =>\n        op.alias === operatorAlias &&\n        (isCustom ? op.alias.includes('∅') : !op.alias.includes('∅')),\n    );\n    if (foundOperator) {\n      this.filter[0] = foundOperator.value as\n        | ComparisonOperator\n        | '!'\n        | CombinationOperator;\n    }\n    if (isCustom) {\n      this._filter[2] = undefined;\n      this.valueSource.set('value');\n    }\n    this.emitChange();\n  }\n\n  ngOnInit(): void {\n    /**\n     * Populate local state with copy of filter values\n     */\n    const f = JSON.parse(JSON.stringify(this.filter));\n    this._filter = this.parseFilterValues(f);\n\n    this.initializeFilter();\n  }\n\n  /**\n   * Set up the filter with initial values and streams\n   * Is used both on init and on filter change (in case previous value is present)\n   */\n  private initializeFilter(): void {\n    this.initOperator();\n    // Initialize attribute control with the current filter value or null\n    this.attributeControl = new FormControl(this._filter[1] ?? null);\n\n    /**\n     * Stream to get initial attribute values.\n     * Serves basically as startWith but with observable\n     * NOTE: take(1) to allow switch to subsequentAttributes in concat\n     */\n    const initialAttribute$ = this.getAttributeWithValues(\n      this.attributeControl.value,\n    ).pipe(take(1));\n\n    // Stream to handle subsequent attribute changes\n    const subsequentAttributes$ = this.attributeControl.valueChanges.pipe(\n      tap(() => this.loading.set(true)),\n      switchMap((attrName: string) => {\n        this._filter[1] = attrName;\n        return this.getAttributeWithValues(attrName);\n      }),\n    );\n\n    // Combine initial and subsequent attribute streams\n    const currentAttribute$ = concat(\n      initialAttribute$,\n      subsequentAttributes$,\n    ).pipe(\n      tap((attr) => {\n        this.currentAttribute.set(attr);\n        this.loading.set(false);\n      }),\n    );\n\n    this.operators = currentAttribute$.pipe(\n      filter((attr) => attr !== null),\n      tap((attr) => {\n        this.currentAttribute.set(attr);\n        this.loading.set(false);\n      }),\n      map((attr) => {\n        const d = this.isWfsFilter()\n          ? this.OPERATORS.default\n          : [...this.OPERATORS.default, ...this.OPERATORS.custom];\n        if (attr?.isNumeric) {\n          if (this._filter[2] === '<value>') {\n            this._filter[2] = attr.range?.min || 0;\n          }\n          return [...d, ...this.OPERATORS.numeric];\n        }\n        return [...d, ...this.OPERATORS.stringBased];\n      }),\n      startWith(this.OPERATORS.default),\n      share(),\n      catchError((error) => {\n        console.error('Error fetching attribute values:', error);\n        this.loading.set(false);\n        return of(this.OPERATORS.default);\n      }),\n      takeUntilDestroyed(this.destroyRef),\n    );\n  }\n\n  /**\n   * Init operator value and adjusts it if necessary to match the custom operator mappings\n   * geostyler parses '= ∅' as '==', so in case value is undefined we need to adjust the operator\n   */\n  private initOperator(): void {\n    const operatorValue = this._filter[0];\n    const isCustom =\n      ['==', '!='].includes(operatorValue) &&\n      (this._filter[2] === undefined || this._filter[2] === null);\n    this.customOperatorSelected.set(isCustom);\n    if (isCustom) {\n      this.valueSource.set('value');\n    }\n    const operators = Object.values(this.OPERATORS).flat();\n    const operatorAlias = operators.find(\n      (op) =>\n        op.value === operatorValue &&\n        (isCustom ? op.alias.includes('∅') : !op.alias.includes('∅')),\n    )?.alias;\n\n    this.selectedOperator.set(operatorAlias);\n  }\n\n  /**\n   * Retrieves attribute with values based on the current filter type (WFS or local)\n   * @param attrName The name of the attribute to retrieve\n   * @returns An Observable of WfsFeatureAttribute\n   */\n  private getAttributeWithValues(\n    attrName: string,\n  ): Observable<WfsFeatureAttribute> {\n    return this.isWfsFilter()\n      ? this.hsFiltersService.getAttributeWithValues(attrName)\n      : this.getLocalAttributesWithValues(attrName);\n  }\n\n  /**\n   * Returns an array of values for the given attribute from the existing features.\n   * @param attrName The name of the attribute to retrieve values from.\n   * @returns An array of values for the given attribute.\n   */\n  private getValidValuesFromExistingFeatures(attrName: string): any[] {\n    return this.hsFiltersService.getSortedUniqueValues(\n      this.features.reduce((acc, feature) => {\n        const value = feature.get(attrName);\n        // Keep all non-null/undefined values and filter NaN for numbers\n        if (\n          value !== null &&\n          value !== undefined &&\n          (typeof value !== 'number' || !isNaN(value))\n        ) {\n          acc.push(value);\n        }\n        return acc;\n      }, []),\n    );\n  }\n\n  /**\n   * Creates WFSFeatureAttribute object from the existing feature values\n   * @param attrName The name of the attribute to retrieve.\n   * @returns An observable of WfsFeatureAttribute.\n   */\n  getLocalAttributesWithValues(\n    attrName: string,\n  ): Observable<WfsFeatureAttribute> {\n    const values = this.getValidValuesFromExistingFeatures(attrName);\n    const isNumeric = !isNaN(Number(values[0]));\n\n    return of({\n      name: attrName,\n      type: 'unknown',\n      isNumeric,\n      range: isNumeric\n        ? {\n            min: Math.min(...values),\n            max: Math.max(...values),\n          }\n        : undefined,\n      values,\n    });\n  }\n\n  /**\n   * Updates the features and attributes based on the selected layer\n   */\n  updateFeatures(): void {\n    const layer = this.hsFiltersService.selectedLayer?.layer;\n    if (layer) {\n      const src = layer.getSource();\n      this.features = (src as VectorSource).getFeatures();\n      /**\n       * If WFS layer is used, use the attributes from the layer descriptor,\n       * otherwise (in styler) use the attributes from the features.\n       */\n      this.attributes = this.isWfsFilter()\n        ? this.hsFiltersService.layerAttributes.map((a) => a.name)\n        : listAttributes(\n            this.features,\n            false,\n            this.hsFiltersService.attributesExcludedFromList,\n          );\n    }\n  }\n\n  /**\n   * Removes the current filter from its parent or deletes the rule filter\n   */\n  remove(): void {\n    if (this.parent) {\n      this.hsFiltersService.removeFilter(this.parent, this.filter);\n    } else {\n      this.deleteRuleFilter();\n    }\n    this.emitChange();\n  }\n\n  /**\n   * Toggles the value source between value and property\n   * @param source The source to toggle to\n   */\n  toggleValueSource(source: 'value' | 'property'): void {\n    this.valueSource.set(source);\n    this.emitChange();\n  }\n}\n","<div class=\"comparison-filter-container d-flex flex-row form-group p-1 position-relative mb-0\"\n  [ngClass]=\"{'expanded': expanded()}\">\n  <hs-filters-attribute-selector [attributes]=\"attributes\" [formControl]=\"attributeControl\"\n    (ngModelChange)=\"emitChange()\">\n  </hs-filters-attribute-selector>\n\n  <select class=\" form-control form-select hs-comparison-filter-operator\" style=\"width: min-content\"\n    [ngModel]=\"selectedOperator()\" (change)=\"onOperatorChange($event)\" name=\"hs-sld-filter-comparison-sign\"\n    [disabled]=\"!attributeControl.value\">\n    @for (op of operators | async; track op.alias) {\n    <option [value]=\"op.alias\">\n      {{'COMMON.' + op.alias | translate}}\n    </option>\n    }\n  </select>\n  <div class=\"comparison-filter-value\">\n    @if(customOperatorSelected()){\n    <input class=\"form-select h-100 rounded-0\" disabled value='NULL' />\n    }\n    @else if(currentAttribute()?.range){\n    @if(valueSource() === 'value'){\n\n    <hs-filter-range-input [min]=\"currentAttribute()?.range.min\" [max]=\"currentAttribute()?.range.max\"\n      [(value)]=\"_filter[2]\" (change)=\"emitChange()\">\n    </hs-filter-range-input>\n    } @else if(valueSource() === 'property') {\n    <hs-filters-attribute-selector [attributes]=\"attributes\" [(ngModel)]=\"_filter[2]\" (ngModelChange)=\"emitChange()\">\n    </hs-filters-attribute-selector>\n    }\n    }\n    @else {\n    @if(_filter[0] === '*=') {\n    <input class=\" form-select h-100\" [(ngModel)]=\"_filter[2]\" (change)=\"emitChange()\"\n      [disabled]=\"!attributeControl.value\" [attr.list]=\"'customValues'\" />\n    <datalist id=\"customValues\">\n      @for (value of currentAttribute()?.values; track value) {\n      <option [value]=\"value\">\n        }\n    </datalist>\n    } @else {\n    <select class=\"form-control form-select h-100\" [(ngModel)]=\"_filter[2]\" (change)=\"emitChange()\"\n      [disabled]=\"!attributeControl.value\">\n      @for (value of currentAttribute()?.values; track value) {\n      <option [ngValue]=\"value\">{{value}}</option>\n      }\n    </select>\n    }\n    }\n  </div>\n  <div>\n    <button class=\"btn btn-outline-danger btn-sm rounded-0\" style=\"height: 100%\" (click)=\"remove()\">\n      <span class=\"fa-solid fa-trash\"></span>\n    </button>\n  </div>\n\n  @if (loading()) {\n  <div\n    class=\"loading-overlay position-absolute top-0 start-0 w-100 h-100 d-flex justify-content-center align-items-center\">\n    <div class=\"text-center bg-secondary-subtle d-flex p-1 px-3 rounded-5 text-center\">\n      <span class=\"hs-loader hs-loader-dark\"></span>\n      <div class=\"small text-muted\">{{'FILTERS.loadingAttributeValues' | translate}}...</div>\n    </div>\n  </div>\n  }\n</div>\n@if(currentAttribute()?.range && !isWfsFilter() && !customOperatorSelected()){\n<div class=\"comparison-filter-value-source btn-group w-100 p-1 d-flex justify-content-end\">\n  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary p-1 border-0 rounded-0 w-25 flex-grow-0\"\n    [class.active]=\"valueSource() === 'value'\" (click)=\"toggleValueSource('value')\">\n    {{'COMMON.value' | translate}}\n  </button>\n  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary p-1 border-0 rounded-0 w-25 flex-grow-0\"\n    [class.active]=\"valueSource() === 'property'\" (click)=\"toggleValueSource('property')\">\n    {{'COMMON.property' | translate}}\n  </button>\n</div>\n}\n","import {Component, Input, inject} from '@angular/core';\nimport {TranslatePipe} from '@ngx-translate/core';\n\nimport {Filter} from 'hslayers-ng/types';\nimport {HsAddFilterButtonComponent} from './add-filter-button/add-filter-button.component';\nimport {HsComparisonFilterComponent} from './comparison-filter/comparison-filter.component';\nimport {HsFiltersService} from './filters.service';\nimport {HsStylerPartBaseComponent} from 'hslayers-ng/services/styler';\n\n@Component({\n  selector: 'hs-filter',\n  templateUrl: './filter.component.html',\n  imports: [\n    HsComparisonFilterComponent,\n    HsAddFilterButtonComponent,\n    TranslatePipe,\n  ],\n  styles: `\n    :host {\n      flex: 1 1 auto;\n    }\n  `,\n})\nexport class HsFilterComponent extends HsStylerPartBaseComponent {\n  @Input() filter: Filter;\n  @Input() parent: Filter;\n\n  hsFiltersService = inject(HsFiltersService);\n  constructor() {\n    super();\n  }\n\n  remove(): void {\n    if (this.parent) {\n      this.hsFiltersService.removeFilter(this.parent, this.filter);\n    }\n    this.emitChange();\n  }\n}\n","<div>\n  @if (hsFiltersService.isLogOp(filter)) {\n  <div class=\"card m-2\"><!-- TODO: Remove function call from template -->\n    <div class=\"d-flex flex-row card-header p-0\">\n      <div class=\"p-2\">{{hsFiltersService.humanReadableLogOp(filter[0])}}</div>\n      <!-- TODO: Remove function call from template -->\n      <hs-add-filter-button (clicks)=\"hsFiltersService.add($event.type, true, filter)\"></hs-add-filter-button>\n      <button class=\"btn btn-outline-danger btn-sm m-1\" [title]=\"'STYLER.removeFilter' | translate\"\n        (click)=\"remove()\">\n        <span class=\"fa-solid fa-trash\"></span>\n      </button>\n    </div>\n    @for (item of filter; track item; let i = $index) {\n    <div class=\"d-flex flex-row\">\n      @if (i>0) {\n      <hs-filter [filter]=\"item\" [parent]=\"filter\" (changes)=\"emitChange()\"></hs-filter>\n      }\n    </div>\n    }\n  </div>\n  }\n  @if (filter.length > 1 && !(hsFiltersService.isLogOp(filter))) {\n  <hs-comparison-filter [filter]=\"filter\" (changes)=\"emitChange()\" [parent]=\"parent\"></hs-comparison-filter>\n  }<!-- TODO: Remove function call from template -->\n</div>\n","import {Component, Input, inject, viewChild} from '@angular/core';\nimport {TranslatePipe} from '@ngx-translate/core';\n\nimport {FilterType, HsLayerDescriptor} from 'hslayers-ng/types';\nimport {HsAddFilterButtonComponent} from './add-filter-button/add-filter-button.component';\nimport {HsComparisonFilterComponent} from './comparison-filter/comparison-filter.component';\nimport {HsEventBusService} from 'hslayers-ng/services/event-bus';\nimport {HsFilterComponent} from './filter.component';\nimport {HsFiltersService} from './filters.service';\nimport {HsStylerPartBaseComponent} from 'hslayers-ng/services/styler';\n\n@Component({\n  selector: 'hs-filters',\n  templateUrl: './filters.component.html',\n  imports: [\n    HsAddFilterButtonComponent,\n    TranslatePipe,\n    HsFilterComponent,\n    HsComparisonFilterComponent,\n  ],\n})\nexport class HsFiltersComponent extends HsStylerPartBaseComponent {\n  @Input({required: true}) rule: any;\n  @Input({required: true}) set selectedLayer(layer: HsLayerDescriptor) {\n    this.hsFiltersService.setSelectedLayer(layer);\n  }\n  addFilterButton = viewChild<HsAddFilterButtonComponent>('addFilterButton');\n\n  hsFiltersService = inject(HsFiltersService);\n  hsEventBusService = inject(HsEventBusService);\n\n  constructor() {\n    super();\n  }\n\n  add(type: FilterType, append: boolean): void {\n    if (this.rule.filter == undefined) {\n      this.rule.filter = [];\n    }\n    this.hsFiltersService.add(type, append, this.rule.filter);\n  }\n\n  remove(): void {\n    delete this.rule.filter;\n    this.addFilterButton().setActiveTab(undefined);\n    this.hsEventBusService.resetWfsFilter.next();\n    this.emitChange();\n  }\n}\n","<div class=\"mb-2\">\n  <div class=\"d-flex flex-row justify-content-end\">\n    <hs-add-filter-button #addFilterButton class=\"w-100\" [rule]=\"rule\" (clicks)=\"add($event.type, false)\"></hs-add-filter-button>\n  </div>\n  @if (hsFiltersService.isLogOp(rule.filter)) {\n  <div class=\"card\">\n    <div class=\"d-flex flex-row card-header p-0\">\n      <div class=\"p-2\">\n        {{hsFiltersService.humanReadableLogOp(rule.filter[0])}}<!-- TODO: Remove function call from template -->\n      </div>\n      <hs-add-filter-button (clicks)=\"add($event.type, true)\"></hs-add-filter-button>\n      <button class=\"btn btn-outline-danger btn-sm m-1\" [title]=\"'STYLER.removeFilter' | translate\"\n        (click)=\"remove()\">\n        <span class=\"fa-solid fa-trash\"></span>\n      </button>\n    </div>\n    @for (item of rule.filter; track item; let i = $index) {\n    <div class=\"d-flex flex-row\">\n      @if (i>0) {\n      <hs-filter (changes)=\"emitChange()\" [filter]=\"item\" [parent]=\"rule.filter\"></hs-filter>\n      }\n    </div>\n    }\n  </div>\n  }\n  @if (rule.filter?.length > 0 && !(hsFiltersService.isLogOp(rule.filter))) {\n  <hs-comparison-filter (changes)=\"emitChange()\" (deleteFilter)=\"remove()\"\n    [filter]=\"rule.filter\"></hs-comparison-filter>\n  }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","map","catchError"],"mappings":"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"}