import { EventEmitter, OnInit, OnDestroy } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { FormConfig } from '../../blocks-dynamic/dynamic-form/dynamic-form.component'; import * as i0 from "@angular/core"; export interface FilterParameter { id: string; key: string; label: string; type: 'text' | 'number' | 'select' | 'multiselect' | 'checkbox' | 'date' | 'range' | 'checkboxlist' | 'htmleditor'; dataType?: 'string' | 'number' | 'boolean' | 'array' | 'date'; value?: any; options?: any[]; optionLabel?: string; optionValue?: string; placeholder?: string; required?: boolean; allowedTypes?: ('text' | 'number' | 'select' | 'multiselect' | 'checkbox' | 'date' | 'range' | 'checkboxlist' | 'htmleditor')[]; includeMode?: string; includeModeOptions?: { label: string; value: string; }[]; rangeConfig?: { fromLabel?: string; toLabel?: string; fromPlaceholder?: string; toPlaceholder?: string; }; } export interface ApiField { title: string; key: string; type: 'text' | 'number' | 'boolean' | 'object' | 'array' | 'relation' | 'media'; fullPath: string; children?: ApiField[]; } export interface SavedFilter { id: string; name: string; description?: string; parameters: FilterParameter[]; createdAt: Date; lastUsed?: Date; private?: boolean; /** Owner (user) id if provided by API */ ownerId?: number | null; } export interface DynamicFilterConfig { availableFields?: FilterParameter[]; allowCustomFields?: boolean; maxFilters?: number; storageKey?: string; apiEndpoint?: string; showSavedFilters?: boolean; autoSave?: boolean; showQuickFilter?: boolean; apiUrl?: string; headers?: import('@angular/common/http').HttpHeaders | { [header: string]: string | string[]; }; /** * Optional endpoints to persist saved filters via API (e.g. Strapi collection). * If provided, the component will load/save/delete saved filters using these endpoints. * If not provided, localStorage will be used (backward compatible). */ savedFiltersApi?: { /** GET list endpoint returning saved filters */ listUrl: string; /** POST create endpoint */ createUrl: string; /** PUT update endpoint. If omitted, will default to `${createUrl}/:id` */ updateUrl?: string; /** DELETE endpoint. If omitted, will default to `${createUrl}/:id` */ deleteUrl?: string; /** * Field mapping for API <-> SavedFilter. * Defaults assume Strapi response: item.id and item.attributes.{title,description,filter} */ idKey?: string; titleKey?: string; descriptionKey?: string; filterKey?: string; /** Optional API field key for the user relation/id. Defaults to 'user' */ userKey?: string; /** Optional API field key for public flag. Defaults to 'public'. */ publicKey?: string; /** * If true, user will not be able to update an existing saved filter unless * current user id equals the filter owner id from API. Default: false */ enforceOwnership?: boolean; }; } export declare class DynamicFilterComponent implements OnInit, OnDestroy { private http; config: DynamicFilterConfig; visible: boolean; header: string; visibleChange: EventEmitter; filterApply: EventEmitter; filterReset: EventEmitter; filterSave: EventEmitter; filterLoad: EventEmitter; quickFilterSelect: EventEmitter; quickFilterApply: EventEmitter; activeFilters: FilterParameter[]; filterValues: { [key: string]: any; }; savedFilters: SavedFilter[]; selectedSavedFilter: SavedFilter | null; showAddFilter: boolean; showSaveDialog: boolean; showManageFilters: boolean; expandedFilters: Set; selectedSavedFilterId: string | null; newFilterKey: string; newFilterLabel: string; newFilterType: string; saveFilterName: string; saveFilterDescription: string; saveFilterPrivate: boolean; editingFilterId: string | null; isEditMode: boolean; showApiFieldSelector: boolean; apiFields: ApiField[]; selectedApiFieldPath: string; loadingApiFields: boolean; apiFieldsError: string | null; fieldSelectionLevels: ApiField[][]; selectedFieldsAtLevel: (ApiField | null)[]; currentSelectableFields: ApiField[]; fieldTypes: { label: string; value: string; }[]; private strapiFilterOptions; constructor(http: HttpClient); ngOnInit(): void; ngOnDestroy(): void; onDialogHide(): void; addFilter(): void; removeFilter(filterId: string): void; addFilterFromAvailable(field: FilterParameter): void; private initializeFilterValue; applyFilter(): void; resetFilter(): void; clearAllFilters(): void; saveCurrentFilter(): void; loadFilter(savedFilter: SavedFilter): void; deleteSavedFilter(filterId: string): void; editSavedFilter(savedFilter: SavedFilter): void; exitEditMode(): void; cancelSaveDialog(): void; saveEditedFilter(): void; private loadSavedFilters; private loadSavedFiltersFromLocal; private saveSavedFilters; private autoSaveCurrentFilter; buildFormConfig(): FormConfig; onFormSubmit(formData: any): void; onFormReset(): void; onFormChange(fieldChangeEvent: any): void; private buildFilterData; private generateId; private mapSavedFiltersFromApi; private buildSavedFilterPayload; private extractIdFromApiResponse; canSaveCurrentFilter(): boolean; /** * Safely read current user id from localStorage. * Expects key 'strapi_user' as JSON with shape { id: number } or { user: { id: number } }. */ private getCurrentUserId; resetAddFilterForm(): void; loadApiFields(apiUrl: string): Promise; private flattenApiFields; addFilterFromApiField(apiField: ApiField): void; private mapApiTypeToComponentType; private mapApiTypeToDataType; toggleApiFieldSelector(): void; extractApiUrl(): string | null; initializeFieldSelection(): void; onFieldSelectionChange(levelIndex: number, selectedKey: string | null): void; canAddField(field: ApiField | null): boolean; getSelectedLeafField(): ApiField | null; addSelectedApiField(): void; resetFieldSelection(): void; mapApiFieldTypeToFilterType(apiType: string): 'text' | 'number' | 'checkbox' | 'date' | 'select'; resetSaveFilterForm(): void; onSavedFilterSelect(filterId: string): void; refreshAvailableFieldsCache(): void; private _availableFieldsCache; private _lastActiveFiltersKeys; availableFieldsToAdd: FilterParameter[]; formConfig: FormConfig; private getAllowedFilterTypes; private updateFormConfig; changeFilterType(filterId: string, newType: 'text' | 'number' | 'select' | 'multiselect' | 'checkbox' | 'date' | 'range' | 'checkboxlist' | 'htmleditor'): void; toggleFilterExpansion(filterId: string): void; isFilterExpanded(filterId: string): boolean; private setupFilterTypeDefaults; private setupStrapiFilterOptions; getFilterModeOptions(filter: FilterParameter): { label: string; value: string; }[]; changeFilterMode(filterId: string, newMode: string): void; onFilterValueChange(filterKey: string, value: any): void; private updateAvailableFields; get hasActiveFilters(): boolean; get hasFilterValues(): boolean; /** * Get saved filters for the quick filter selector (excludes auto-save) */ getQuickFilterOptions(): SavedFilter[]; /** * Get the currently selected quick filter ID */ getSelectedQuickFilterId(): string | null; /** * Get the name of the currently selected filter */ getSelectedFilterName(): string; /** * Check if there are active manual filters (not saved filters) */ hasActiveManualFilters(): boolean; /** * Get display name for active filter (saved or manual) */ getActiveFilterDisplayName(): string; /** * Clear all active filters (both saved and manual) */ clearAllActiveFilters(): void; /** * Handle quick filter selection */ onQuickFilterSelect(filterId: string | null): void; /** * Update the last used timestamp for a quick filter */ private updateQuickFilterLastUsed; /** * Clear quick filter selection */ clearQuickFilter(): void; static ɵfac: i0.ɵɵFactoryDeclaration; static ɵcmp: i0.ɵɵComponentDeclaration; }