{"version":3,"file":"sowatech-shared-compact-filter.mjs","sources":["../../../projects/shared/compact-filter/labels/filter-label.ts","../../../projects/shared/compact-filter/labels/compact-filter-labels.component.ts","../../../projects/shared/compact-filter/labels/compact-filter-labels.component.html","../../../projects/shared/compact-filter/compact-filter.component.ts","../../../projects/shared/compact-filter/compact-filter.component.html","../../../projects/shared/compact-filter/compact-filter.module.ts","../../../projects/shared/compact-filter/compact-filter.types.ts","../../../projects/shared/compact-filter/sowatech-shared-compact-filter.ts"],"sourcesContent":["import type { SelectItem } from '@sowatech/shared/@types';\r\nimport type { DialogDynamicList } from '@sowatech/shared/swt-generic';\r\n\r\nimport { FilterDialogField, FilterValue } from '../compact-filter.types';\r\n\r\n\r\nexport class FilterLabel<DTO> {\r\n    private constructor(fieldname: string, value: FilterValue, field: FilterDialogField<DTO>, fieldHasSingleValue: boolean, dynamicList: DialogDynamicList[] = []) {\r\n        this.fieldname = fieldname;\r\n        this.value = value;\r\n        this.text = FilterLabel.getText(fieldname, value, field, dynamicList);\r\n        this.title = FilterLabel.getTitle(fieldname, value, field);\r\n        this.class = FilterLabel.getClass(fieldname, value, field);\r\n        this.iconClass = FilterLabel.getIconClass(fieldname, value, field);\r\n        this.removable = !(field.required && fieldHasSingleValue);\r\n    }\r\n\r\n    public fieldname: string;\r\n    public value: FilterValue;\r\n    public text: string;\r\n    public title: string;\r\n    public class: string;\r\n    public iconClass: string;\r\n    public removable: boolean;\r\n\r\n    public static createLabels<DTO>(key: string, filterValue: FilterValue, field: FilterDialogField<DTO>, dynamicList: DialogDynamicList[]): FilterLabel<DTO>[] {\r\n        if (!field) return [];\r\n        let labels: FilterLabel<DTO>[];\r\n        if (Array.isArray(filterValue)) {\r\n            const fieldHasSingleValue = filterValue.length === 1;\r\n            labels = filterValue.map(value => new FilterLabel(key, value, field, fieldHasSingleValue, dynamicList));\r\n        }\r\n        else\r\n            labels = [new FilterLabel(key, filterValue, field, true, dynamicList)];\r\n\r\n        return labels.filter(fl => !!fl.text);\r\n    }\r\n\r\n    private static getText<DTO>(fieldname: string, value: FilterValue, field: FilterDialogField<DTO>, dynamicList: DialogDynamicList[]) {\r\n        if (field.getLabelText)\r\n            return field.getLabelText(value, fieldname);\r\n\r\n        if (field.lookUps) {\r\n            const lookups = Array.isArray(field.lookUps) ? field.lookUps as SelectItem[] : dynamicList.find(dl => dl.key === field.lookUps)?.lookupItems;\r\n            if (!lookups) return value.toString();\r\n            const isStringArrayLookUp = lookups.length > 0 && typeof lookups[0] === 'string';\r\n            if (!isStringArrayLookUp) {\r\n                const item = lookups.find(l => l.value === value);\r\n                return item?.text ?? value.toString();\r\n            }\r\n        }\r\n        return value.toString();\r\n    }\r\n\r\n    private static getTitle<DTO>(fieldname: string, value: FilterValue, field: FilterDialogField<DTO>) {\r\n        if (field.getLabelTitle)\r\n            return field.getLabelTitle(value, fieldname);\r\n        return field.text;\r\n    }\r\n\r\n    private static getClass<DTO>(fieldname: string, value: FilterValue, field: FilterDialogField<DTO>) {\r\n        if (field.getLabelClass)\r\n            return field.getLabelClass(value, fieldname);\r\n        return '';\r\n    }\r\n\r\n    private static getIconClass<DTO>(fieldname: string, value: FilterValue, field: FilterDialogField<DTO>) {\r\n        if (field.getLabelIconClass)\r\n            return field.getLabelIconClass(value, fieldname);\r\n        return '';\r\n    }\r\n}\r\n","import { Component, input, output } from '@angular/core';\r\n\r\nimport { FilterLabel } from './filter-label';\r\n\r\n@Component({\r\n    selector: 'compact-filter-labels',\r\n    templateUrl: './compact-filter-labels.component.html',\r\n    styleUrl: './compact-filter-labels.component.scss',\r\n    standalone: false\r\n})\r\nexport class CompactFilterLabelsComponent<DTO> {\r\n    public labels = input.required<FilterLabel<DTO>[]>();\r\n    public onLabelClick = output<FilterLabel<DTO>>();\r\n    public onLabelRemove = output<FilterLabel<DTO>>();\r\n}\r\n","@for(label of labels(); track label) {\r\n  <code class=\"filter-label\" sneat-class=\"sneat\" [ngClass]=\"{'removable': label.removable}\" [class]=\"label.class\" [title]=\"label.title\"\r\n    (click)=\"onLabelClick.emit(label)\">\r\n    @if (label.iconClass) {\r\n      <i [ngClass]=\"label.iconClass\"></i>\r\n    }\r\n    {{label.text}}\r\n    @if (label.removable) {\r\n      <i class=\"fa fa-times remove-icon\" (click)=\"onLabelRemove.emit(label)\"></i>\r\n    }\r\n  </code>\r\n}\r\n","import { booleanAttribute, Component, computed, DestroyRef, effect, inject, input, linkedSignal, output, signal, untracked } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FilterItem, FilterOperator } from '@sowatech/shared/ds-datasource';\r\nimport { SharedConfigService } from '@sowatech/shared/shared-config';\r\nimport { DialogDynamicList, GenericEditDialogService } from '@sowatech/shared/swt-generic';\r\nimport { UserPropertiesStorageService } from '@sowatech/shared/user-properties-storage';\r\nimport { first } from 'rxjs';\r\n\r\nimport { FilterValue, FilterValues, IFilterConfiguration } from './compact-filter.types';\r\nimport { FilterLabel } from './labels/filter-label';\r\n\r\nconst STORE_KEY_PREFIX = 'CompactFilter.';\r\n\r\n@Component({\r\n    selector: 'compact-filter',\r\n    templateUrl: './compact-filter.component.html',\r\n    styles: '.compact-filter-container {overflow-y: auto;}',\r\n    standalone: false\r\n})\r\nexport class CompactFilterComponent<DTO = unknown> {\r\n    /**\r\n     * Konfiguration des Filters. Ableitung der DialogConfiguration des GenericEditDialogs\r\n     */\r\n    public readonly configuration = input.required<IFilterConfiguration<DTO>>();\r\n    /**\r\n     * Store-Key für die Speicherung der Filterwerte im UserPropertiesStorage\r\n     */\r\n    public readonly partialStoreKey = input<string | null>(null, { alias: 'store-key' });\r\n    /**\r\n     * Wenn im Filter noch keine Werte gesetzt sind, werden die Default-Werte gesetzt\r\n     */\r\n    public readonly defaultValues = input<FilterValues | null>(null);\r\n    /**\r\n     * Dynamische Liste für Lookups/Datasource im Dialog\r\n     */\r\n    public readonly dynamicList = input<DialogDynamicList[] | null>(null);\r\n    /**\r\n     * Versteckt die Anzeige der FilterItems\r\n     */\r\n    public readonly hideFilterLabels = input(false, { transform: booleanAttribute });\r\n    /**\r\n     * Maximale Höhe des FilterButtons und FilterItems\r\n     */\r\n    public readonly maxHeight = input<string | null>(null);\r\n    /**\r\n     * Minimale Höhe des FilterButtons und FilterItems\r\n     * @default '68px' (entspricht FilterButton + eine Reihe FilterItems)\r\n     */\r\n    public readonly minHeight = input<string | null>('68px');\r\n    /** bootstrap Farbe für den Filter Button, z.B. \"primary\" */\r\n    public readonly btnClass = input(inject(SharedConfigService).templateKey === 'inspinia' ? 'default' : 'secondary');\r\n\r\n    /**\r\n     * Emitted wenn sich die FilterItems ändern\r\n     * Wird initial mit Daten vom Storage/DefaultValues emitted\r\n     */\r\n    public readonly change = output<FilterItem[]>();\r\n\r\n    /**\r\n     * Emitted wenn der Dialog geöffnet wird\r\n     */\r\n    public readonly dialogOpened = output<FilterValues>();\r\n\r\n    private readonly touchedFilterValues = signal<FilterValues | null>(null);\r\n    private readonly filterValues = computed(() => this.touchedFilterValues() ?? this.deepCopy(this.cleanedDefaultValues()));\r\n    /**\r\n     * Computed Signal mit den aktuellen FilterItems\r\n    */\r\n    public readonly filterItems = computed(() => this.createFilterItems(this.filterValues()));\r\n    protected readonly labels = linkedSignal(() => this.createLabels(this.filterValues()));\r\n\r\n    private readonly storeKey = computed(() => this.partialStoreKey() ? STORE_KEY_PREFIX + this.partialStoreKey() : null);\r\n    private readonly storageValues = computed(() => this.storeKey() ? this.loadFromStorage(this.storeKey()) : null);\r\n    private readonly cleanedDefaultValues = computed(() => this.defaultValues() ? this.deleteUnknownProperties(this.defaultValues()) : null);\r\n\r\n    private readonly dialog = inject(GenericEditDialogService);\r\n    private readonly userPropertiesStorage = inject(UserPropertiesStorageService);\r\n    private readonly destroyRef = inject(DestroyRef);\r\n\r\n    constructor() {\r\n        //Auslesen aus Storage\r\n        effect(() => {\r\n            if (this.storageValues() && untracked(this.touchedFilterValues) === null)\r\n                this.touchedFilterValues.set(this.storageValues());\r\n        });\r\n\r\n        //Speichern des Storage\r\n        effect(() => {\r\n            if (this.storeKey() && this.filterValues())\r\n                this.userPropertiesStorage.save(this.storeKey(), this.filterValues());\r\n        });\r\n\r\n        //Emit der FilterItems\r\n        effect(() => {\r\n            this.change.emit(this.filterItems());\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Anzeige der FilterItems wird neu kalkuliert.\r\n     * Wird benötigt, wenn z.B. getLabelText neu berechnet werden soll.\r\n     */\r\n    public refreshLabels() {\r\n        this.labels.set(this.createLabels(this.filterValues()));\r\n    }\r\n\r\n    private createLabels(filterValues: FilterValues) {\r\n        return filterValues !== null\r\n            ? Object.keys(filterValues).flatMap(key => FilterLabel.createLabels(key, filterValues[key], this.getField(key), this.dynamicList()))\r\n            : [];\r\n    }\r\n\r\n    protected openDialog(label?: FilterLabel<DTO>) {\r\n        const filterValues = this.filterValues() ? this.deleteUnknownProperties(this.filterValues()) : null;\r\n\r\n        this.dialog.show(this.configuration(), filterValues, null, this.dynamicList())\r\n            .pipe(\r\n                takeUntilDestroyed(this.destroyRef),\r\n                first()\r\n            ).subscribe(dialogResult => {\r\n                const newFilterValues = this.deleteUnknownProperties(dialogResult.dto);\r\n                this.touchedFilterValues.set(newFilterValues);\r\n            });\r\n\r\n        if (label)\r\n            this.dialog.focus(label.fieldname);\r\n\r\n        this.dialogOpened.emit(filterValues);\r\n    }\r\n\r\n    private deepCopy<T>(obj: T) {\r\n        return JSON.parse(JSON.stringify(obj)) as T;\r\n    }\r\n\r\n    private deleteUnknownProperties(filterValues: FilterValues): FilterValues {\r\n        const copy = this.deepCopy(filterValues);\r\n\r\n        // eslint-disable-next-line guard-for-in\r\n        for (const key in copy) {\r\n            const value = copy[key];\r\n\r\n            const valueIsNotSet = value === undefined || value === null || Number.isNaN(value)\r\n                || (Array.isArray(value) && value.length === 0);\r\n            const fieldIsNotInConfig = this.getField(key) === undefined;\r\n\r\n            if (valueIsNotSet || fieldIsNotInConfig)\r\n                delete copy[key];\r\n        }\r\n        return copy;\r\n    }\r\n\r\n    private getField(fieldname: string) {\r\n        const configuration = this.configuration();\r\n        return configuration.fieldsOrCategoriesOfFields.find(f => f.fieldname === fieldname)\r\n            ?? configuration.fieldsOrCategoriesOfFields.find(f => f.fieldname2 === fieldname);\r\n    }\r\n\r\n    private createFilterItems(values: FilterValues) {\r\n        if (!values) return [];\r\n        return Object.keys(values).map(key => this.createFilterItem(key, values[key]));\r\n    }\r\n\r\n    private createFilterItem(key: string, value: FilterValue) {\r\n        const field = this.getField(key);\r\n        const filterOperator = field.filterOperator ?? FilterOperator.IsEqual;\r\n\r\n        if (Array.isArray(value)) {\r\n            const stringValues = value.map(v => v.toString() as string);\r\n            return new FilterItem([key], stringValues, filterOperator);\r\n        }\r\n        else {\r\n            const stringValue = value.toString();\r\n            return new FilterItem([key], stringValue, filterOperator);\r\n        }\r\n    }\r\n\r\n    protected remove(label: FilterLabel<DTO>) {\r\n        if (this.filterValues() === null) return;\r\n\r\n        const filterValues = { ...this.filterValues() };\r\n        const filterValue = filterValues[label.fieldname];\r\n\r\n        if (Array.isArray(filterValue)) {\r\n            const index = filterValue.indexOf(label.value);\r\n            if (index >= 0) {\r\n                filterValue.splice(index, 1);\r\n                filterValues[label.fieldname] = filterValue;\r\n            }\r\n        } else\r\n            delete filterValues[label.fieldname];\r\n\r\n        this.touchedFilterValues.set(filterValues);\r\n    }\r\n\r\n    protected reset() {\r\n        if (this.touchedFilterValues() === null) return;\r\n\r\n        this.touchedFilterValues.set(\r\n            this.defaultValues()\r\n                ? null\r\n                : this.extractRequiredProperties(this.touchedFilterValues()),\r\n        );\r\n    }\r\n\r\n    private extractRequiredProperties(filterValues: FilterValues) {\r\n        const copy = { ...filterValues };\r\n\r\n        // eslint-disable-next-line guard-for-in\r\n        for (const key in copy) {\r\n            const field = this.getField(key);\r\n            if (!field || !field.required)\r\n                delete copy[key];\r\n            else if (this.isArrayWithMultipleItems(copy[key]))\r\n                copy[key] = [copy[key][0]];\r\n        }\r\n        return copy;\r\n    }\r\n\r\n    private isArrayWithMultipleItems(filterValue: FilterValue): filterValue is unknown[] {\r\n        return Array.isArray(filterValue) && filterValue.length > 1;\r\n    }\r\n\r\n    private loadFromStorage(storeKey: string) {\r\n        const storageValues = this.userPropertiesStorage.load<FilterValues>(storeKey);\r\n        return storageValues ? this.deleteUnknownProperties(storageValues) : null;\r\n    }\r\n}\r\n","<div class=\"compact-filter-container\" [style.maxHeight]=\"maxHeight()\" [style.minHeight]=\"minHeight()\">\r\n  <div class=\"btn-group\">\r\n    <button button-custom [btn-class]=\"btnClass()\" icon=\"filter\" (click)=\"openDialog()\" disableMargin\r\n    data-cy=\"compact-filter-button\" i18n=\"@@CompactFilter.Filter.act.Label\">Filter</button>\r\n    <button button-custom [btn-class]=\"btnClass()\" icon=\"undo\" data-cy=\"compact-filter-undo-button\"\r\n    (click)=\"reset()\"></button>\r\n  </div>\r\n  @if (!hideFilterLabels()) {\r\n    <compact-filter-labels [labels]=\"labels()\" (onLabelClick)=\"openDialog($event)\"\r\n    (onLabelRemove)=\"remove($event)\"></compact-filter-labels>\r\n  }\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { ButtonsModule } from '@sowatech/shared/buttons';\r\nimport { NoDblClickModule } from '@sowatech/shared/no-double-click';\r\nimport { SwitchTemplateModule } from '@sowatech/shared/template';\r\n\r\nimport { CompactFilterComponent } from './compact-filter.component';\r\nimport { CompactFilterLabelsComponent } from './labels/compact-filter-labels.component';\r\n\r\n\r\n@NgModule({\r\n    imports: [\r\n        CommonModule,\r\n        NoDblClickModule,\r\n        ButtonsModule,\r\n        SwitchTemplateModule,\r\n    ],\r\n    declarations: [\r\n        CompactFilterComponent,\r\n        CompactFilterLabelsComponent\r\n    ],\r\n    exports: [\r\n        CompactFilterComponent,\r\n        CompactFilterLabelsComponent\r\n    ]\r\n})\r\nexport class CompactFilterModule { }\r\n","import { FilterOperator } from '@sowatech/shared/ds-datasource';\r\nimport { DialogField, IDialogConfiguration } from '@sowatech/shared/swt-generic';\r\n\r\nexport type FilterValue = unknown;\r\nexport type FilterValues = Record<string, FilterValue>\r\n\r\nexport interface IFilterConfiguration<DTO> extends IDialogConfiguration<DTO> {\r\n    fieldsOrCategoriesOfFields: FilterDialogField<DTO>[];\r\n}\r\n\r\nexport class FilterDialogField<DTO> extends DialogField<DTO> {\r\n    public getLabelText?: (value: FilterValue, fieldname: string) => string;\r\n    public getLabelTitle?: (item: FilterValue, fieldname: string) => string;\r\n    public getLabelClass?: (item: FilterValue, fieldname: string) => string;\r\n    public getLabelIconClass?: (item: FilterValue, fieldname: string) => string;\r\n    /**\r\n     * Eingetragener FilterOperator für das FilterItem\r\n     * @default FilterOperator.IsEqual\r\n     */\r\n    public filterOperator?: FilterOperator;\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3.CompactFilterLabelsComponent"],"mappings":"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"}