advanced-filter-system 1.7.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "advanced-filter-system",
3
- "version": "1.7.0",
3
+ "version": "1.8.0",
4
4
  "description": "Advanced filtering system for DOM elements with multiple features",
5
5
  "main": "dist/afs.legacy.js",
6
6
  "module": "dist/afs.modern.js",
@@ -3,7 +3,7 @@
3
3
  * @fileoverview TypeScript definitions for core classes
4
4
  */
5
5
 
6
- import { AFSOptions, AFSEventData, EventCallback, FilterMode, FilterCategoryMode } from './index';
6
+ import { AFSOptions, AFSEventData, EventCallback } from './index';
7
7
 
8
8
  // Options Class
9
9
  export declare class Options {
@@ -22,10 +22,23 @@ export declare class Options {
22
22
  // State Class
23
23
  export declare class State {
24
24
  constructor();
25
-
25
+
26
+ /** Live, read-only view of the state. Write via setState() or the mutators. */
26
27
  getState(): any;
27
28
  setState(path: string, value: any): void;
28
- resetState(): void;
29
+ /**
30
+ * Subscribe to writes at `path` or any descendant of it
31
+ * (a listener on "items" also hears "items.visible").
32
+ * @returns an unsubscribe function
33
+ */
34
+ subscribe(path: string, callback: (value: any, path: string) => void): () => void;
35
+
36
+ // Encapsulated mutators for the visible-items set (write + notify)
37
+ setVisibleItems(set: Set<HTMLElement>): void;
38
+ addVisibleItem(item: HTMLElement): void;
39
+ removeVisibleItem(item: HTMLElement): void;
40
+ clearVisibleItems(): void;
41
+
29
42
  export(): any;
30
43
  import(state: any): void;
31
44
  reset(): void;
@@ -46,10 +59,12 @@ export declare class Logger {
46
59
  export declare class EventEmitter {
47
60
  constructor();
48
61
 
49
- on(event: string, callback: EventCallback): void;
62
+ /** @returns an unsubscribe function */
63
+ on(event: string, callback: EventCallback): () => void;
50
64
  off(event: string, callback?: EventCallback): void;
51
65
  emit(event: string, data?: AFSEventData): void;
52
- once(event: string, callback: EventCallback): void;
66
+ /** @returns an unsubscribe function */
67
+ once(event: string, callback: EventCallback): () => void;
53
68
  removeAllListeners(event?: string): void;
54
69
  }
55
70
 
@@ -1,54 +1,63 @@
1
1
  /**
2
2
  * Feature Types for Advanced Filter System
3
3
  * @fileoverview TypeScript definitions for feature classes
4
+ *
5
+ * NOTE: the published entry point is `index.d.ts`, which declares its own
6
+ * copies of these classes. This file mirrors them for direct imports and must
7
+ * be kept in sync with the actual public API.
4
8
  */
5
9
 
6
- import {
7
- SortDirection,
8
- SortCriteria,
9
- FilterMode,
10
+ import {
11
+ SortDirection,
12
+ SortCriteria,
13
+ FilterMode,
10
14
  FilterTypeConfig,
11
15
  RangeSliderOptions,
12
16
  DateFilterOptions,
17
+ InputRangeOptions,
13
18
  PageInfo,
14
- AFSEventData
15
19
  } from './index';
16
20
  import { AFS } from './index';
17
21
 
18
22
  // Filter Feature
19
23
  export declare class Filter {
20
24
  constructor(afs: AFS);
21
-
25
+
22
26
  addFilter(filter: string): void;
23
27
  removeFilter(filter: string): void;
24
28
  toggleFilter(filter: string): void;
25
29
  toggleFilterExclusive(filter: string): void;
26
30
  clearAllFilters(): void;
27
31
  clearFilterCategory(category: string): void;
32
+ resetFilters(): void;
28
33
  getActiveFilters(): Set<string>;
34
+ setFilterMode(mode: FilterMode): void;
35
+ setGroupMode(mode: FilterMode): void;
29
36
  setFilterTypeLogic(type: string, logic: FilterMode | FilterTypeConfig): void;
37
+ setFilterTypeExclusive(types: string | string[], exclusive?: boolean): void;
38
+ addFilterGroup(id: string, filters: string[], operator?: FilterMode): void;
39
+ removeFilterGroup(id: string): void;
40
+ getFilterGroups(): Map<string, any>;
41
+ addFilterButton(button: HTMLElement, filter: string): void;
42
+ removeFilterButton(button: HTMLElement): void;
30
43
  applyFilters(): void;
31
- getFilteredItems(): Set<HTMLElement>;
32
- isFilterActive(filter: string): boolean;
33
- getFiltersByType(type: string): Set<string>;
44
+ refresh(): void;
34
45
  destroy(): void;
35
46
  }
36
47
 
37
48
  // Search Feature
38
49
  export declare class Search {
39
50
  constructor(afs: AFS);
40
-
51
+
41
52
  search(query: string): void;
42
53
  clearSearch(): void;
43
54
  setValue(value: string): void;
44
55
  getValue(): string;
45
- getMatches(): HTMLElement[];
46
- highlightMatches(enable?: boolean): void;
47
- configure(options: {
48
- keys?: string[];
49
- debounce?: number;
50
- minLength?: number;
51
- caseSensitive?: boolean;
56
+ updateConfig(config: {
57
+ searchKeys?: string[];
58
+ minSearchLength?: number;
59
+ highlightClass?: string;
60
+ debounceTime?: number;
52
61
  }): void;
53
62
  destroy(): void;
54
63
  }
@@ -56,22 +65,22 @@ export declare class Search {
56
65
  // Sort Feature
57
66
  export declare class Sort {
58
67
  constructor(afs: AFS);
59
-
68
+
60
69
  sort(key: string, direction?: SortDirection): void;
61
70
  sortMultiple(criteria: SortCriteria[]): void;
62
71
  sortWithComparator(key: string, comparator: (a: any, b: any) => number): void;
63
72
  shuffle(): void;
64
73
  reset(): void;
65
74
  getCurrentSort(): SortCriteria | null;
66
- getSortValue(element: HTMLElement, key: string): any;
67
- addCustomComparator(name: string, comparator: (a: any, b: any) => number): void;
75
+ addSortButton(button: HTMLElement, key: string, direction?: SortDirection): void;
76
+ removeSortButton(button: HTMLElement): void;
68
77
  destroy(): void;
69
78
  }
70
79
 
71
80
  // Pagination Feature
72
81
  export declare class Pagination {
73
82
  constructor(afs: AFS);
74
-
83
+
75
84
  goToPage(page: number): void;
76
85
  nextPage(): void;
77
86
  previousPage(): void;
@@ -84,43 +93,46 @@ export declare class Pagination {
84
93
  getTotalPages(): number;
85
94
  getItemsPerPage(): number;
86
95
  update(): void;
87
- render(): void;
88
96
  destroy(): void;
89
97
  }
90
98
 
91
99
  // Range Filter Feature
92
100
  export declare class RangeFilter {
93
101
  constructor(afs: AFS);
94
-
102
+
95
103
  addRangeSlider(options: RangeSliderOptions): void;
96
104
  removeRangeSlider(key: string): void;
97
- getRangeValue(key: string): { min: number; max: number } | null;
98
- setRangeValue(key: string, min: number, max: number): void;
99
- resetRange(key: string): void;
100
- getRangeSliders(): Map<string, any>;
101
- updateHistogram(key: string): void;
105
+ getRangeValues(key: string): { min: number; max: number; type: 'number' | 'date' } | null;
106
+ setRangeValues(key: string, min: number, max: number): void;
102
107
  destroy(): void;
103
108
  }
104
109
 
105
110
  // Date Filter Feature
106
111
  export declare class DateFilter {
107
112
  constructor(afs: AFS);
108
-
113
+
109
114
  addDateRange(options: DateFilterOptions): void;
110
115
  removeDateRange(key: string): void;
111
- getDateRange(key: string): { start: Date; end: Date } | null;
112
- setDateRange(key: string, start: Date, end: Date): void;
113
- resetDateRange(key: string): void;
114
- getDateFilters(): Map<string, any>;
115
- parseDate(dateString: string, format?: string): Date;
116
- formatDate(date: Date, format?: string): string;
116
+ getDateRange(key: string): { startDate: Date; endDate: Date } | null;
117
+ setDateRange(key: string, startDate: Date, endDate: Date): void;
118
+ destroy(): void;
119
+ }
120
+
121
+ // Input Range Filter Feature
122
+ export declare class InputRangeFilter {
123
+ constructor(afs: AFS);
124
+
125
+ addInputRange(options: InputRangeOptions): void;
126
+ removeInputRange(key: string): void;
127
+ getRange(key: string): { min: number; max: number } | null;
128
+ setRange(key: string, min: number, max: number): void;
117
129
  destroy(): void;
118
130
  }
119
131
 
120
132
  // URL Manager Feature
121
133
  export declare class URLManager {
122
134
  constructor(afs: AFS);
123
-
135
+
124
136
  initialize(): void;
125
137
  updateURL(): void;
126
138
  loadFromURL(): void;
@@ -128,21 +140,5 @@ export declare class URLManager {
128
140
  getURLParams(): URLSearchParams;
129
141
  hasParams(): boolean;
130
142
  getParam(param: string): string | null;
131
- setParam(param: string, value: string): void;
132
- removeParam(param: string): void;
133
- serializeState(): string;
134
- deserializeState(serialized: string): any;
135
143
  destroy(): void;
136
144
  }
137
-
138
- // Input Range Filter Feature
139
- export declare class InputRangeFilter {
140
- constructor(afs: AFS);
141
-
142
- addInput(selector: string, key: string): void;
143
- removeInput(key: string): void;
144
- getValue(key: string): string | null;
145
- setValue(key: string, value: string): void;
146
- getInputs(): Map<string, HTMLInputElement>;
147
- destroy(): void;
148
- }
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Advanced Filter System (AFS) - TypeScript Definitions
3
- * @version 1.5.2
3
+ * @version 1.8.0
4
4
  */
5
5
 
6
6
  // Core Types
@@ -13,7 +13,7 @@ export type EventCallback = (data?: AFSEventData) => void;
13
13
  export type FilterMode = 'OR' | 'AND';
14
14
  export type FilterCategoryMode = 'mixed' | 'OR' | 'AND';
15
15
  export type SortDirection = 'asc' | 'desc';
16
- export type AnimationType = 'fade' | 'slide' | 'scale' | 'flip' | 'rotate' | 'zoom' | 'bounce' | 'blur' | 'slideUp' | 'slideDown' | 'slideLeft' | 'slideRight' | 'zoomIn' | 'zoomOut' | 'fadeIn' | 'fadeOut';
16
+ export type AnimationType = 'fade' | 'slide' | 'scale' | 'rotate' | 'flip' | 'zoom' | 'bounce' | 'blur' | 'skew' | 'slideInLeft' | 'slideInRight' | 'fadeInUp' | 'fadeInDown' | 'bounceIn';
17
17
  export type DateFormat = 'YYYY-MM-DD' | 'DD/MM/YYYY' | 'MM/DD/YYYY' | 'DD-MM-YYYY' | 'MM-DD-YYYY';
18
18
  export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
19
19
 
@@ -141,6 +141,16 @@ export interface DateFilterOptions {
141
141
  defaultEnd?: Date;
142
142
  }
143
143
 
144
+ // Input Range (min/max number inputs) Configuration
145
+ export interface InputRangeOptions {
146
+ key: string;
147
+ container: HTMLElement;
148
+ min?: number;
149
+ max?: number;
150
+ step?: number;
151
+ label?: string;
152
+ }
153
+
144
154
  // Main AFS Options Interface
145
155
  export interface AFSOptions {
146
156
  // Required selectors
@@ -158,8 +168,7 @@ export interface AFSOptions {
158
168
  activeClass?: string;
159
169
  hiddenClass?: string;
160
170
  activeSortClass?: string;
161
- transitionClass?: string;
162
-
171
+
163
172
  // Filter Configuration
164
173
  filterMode?: FilterMode;
165
174
  groupMode?: FilterMode;
@@ -247,15 +256,37 @@ export interface PageInfo {
247
256
  currentPage: number;
248
257
  totalPages: number;
249
258
  itemsPerPage: number;
250
- totalItems: number;
251
259
  }
252
260
 
253
261
  // Feature Classes
254
262
  export declare class EventEmitter {
255
- on(event: string, callback: EventCallback): void;
263
+ /** @returns an unsubscribe function */
264
+ on(event: string, callback: EventCallback): () => void;
256
265
  off(event: string, callback?: EventCallback): void;
257
266
  emit(event: string, data?: AFSEventData): void;
258
- once(event: string, callback: EventCallback): void;
267
+ /** @returns an unsubscribe function */
268
+ once(event: string, callback: EventCallback): () => void;
269
+ removeAllListeners(event?: string): void;
270
+ }
271
+
272
+ // Central state store (afs.state)
273
+ export declare class State {
274
+ /** Live, read-only view. Write via setState() or the mutators. */
275
+ getState(): any;
276
+ setState(path: string, value: any): void;
277
+ /**
278
+ * Subscribe to writes at `path` or any descendant of it
279
+ * (a listener on "items" also hears "items.visible").
280
+ * @returns an unsubscribe function
281
+ */
282
+ subscribe(path: string, callback: (value: any, path: string) => void): () => void;
283
+ setVisibleItems(set: Set<HTMLElement>): void;
284
+ addVisibleItem(item: HTMLElement): void;
285
+ removeVisibleItem(item: HTMLElement): void;
286
+ clearVisibleItems(): void;
287
+ export(): any;
288
+ import(state: any): void;
289
+ reset(): void;
259
290
  }
260
291
 
261
292
  export declare class Filter {
@@ -266,9 +297,19 @@ export declare class Filter {
266
297
  toggleFilterExclusive(filter: string): void;
267
298
  clearAllFilters(): void;
268
299
  clearFilterCategory(category: string): void;
300
+ resetFilters(): void;
269
301
  getActiveFilters(): Set<string>;
302
+ setFilterMode(mode: FilterMode): void;
303
+ setGroupMode(mode: FilterMode): void;
270
304
  setFilterTypeLogic(type: string, logic: FilterMode | FilterTypeConfig): void;
305
+ setFilterTypeExclusive(types: string | string[], exclusive?: boolean): void;
306
+ addFilterGroup(id: string, filters: string[], operator?: FilterMode): void;
307
+ removeFilterGroup(id: string): void;
308
+ getFilterGroups(): Map<string, any>;
309
+ addFilterButton(button: HTMLElement, filter: string): void;
310
+ removeFilterButton(button: HTMLElement): void;
271
311
  applyFilters(): void;
312
+ refresh(): void;
272
313
  destroy(): void;
273
314
  }
274
315
 
@@ -278,7 +319,12 @@ export declare class Search {
278
319
  clearSearch(): void;
279
320
  setValue(value: string): void;
280
321
  getValue(): string;
281
- getMatches(): HTMLElement[];
322
+ updateConfig(config: {
323
+ searchKeys?: string[];
324
+ minSearchLength?: number;
325
+ highlightClass?: string;
326
+ debounceTime?: number;
327
+ }): void;
282
328
  destroy(): void;
283
329
  }
284
330
 
@@ -290,6 +336,8 @@ export declare class Sort {
290
336
  shuffle(): void;
291
337
  reset(): void;
292
338
  getCurrentSort(): SortCriteria | null;
339
+ addSortButton(button: HTMLElement, key: string, direction?: SortDirection): void;
340
+ removeSortButton(button: HTMLElement): void;
293
341
  destroy(): void;
294
342
  }
295
343
 
@@ -298,8 +346,14 @@ export declare class Pagination {
298
346
  goToPage(page: number): void;
299
347
  nextPage(): void;
300
348
  previousPage(): void;
349
+ firstPage(): void;
350
+ lastPage(): void;
301
351
  setPaginationMode(enabled: boolean): void;
352
+ setItemsPerPage(count: number): void;
302
353
  getPageInfo(): PageInfo;
354
+ getCurrentPage(): number;
355
+ getTotalPages(): number;
356
+ getItemsPerPage(): number;
303
357
  update(): void;
304
358
  destroy(): void;
305
359
  }
@@ -308,8 +362,8 @@ export declare class RangeFilter {
308
362
  constructor(afs: AFS);
309
363
  addRangeSlider(options: RangeSliderOptions): void;
310
364
  removeRangeSlider(key: string): void;
311
- getRangeValue(key: string): { min: number; max: number } | null;
312
- setRangeValue(key: string, min: number, max: number): void;
365
+ getRangeValues(key: string): { min: number; max: number; type: 'number' | 'date' } | null;
366
+ setRangeValues(key: string, min: number, max: number): void;
313
367
  destroy(): void;
314
368
  }
315
369
 
@@ -317,8 +371,17 @@ export declare class DateFilter {
317
371
  constructor(afs: AFS);
318
372
  addDateRange(options: DateFilterOptions): void;
319
373
  removeDateRange(key: string): void;
320
- getDateRange(key: string): { start: Date; end: Date } | null;
321
- setDateRange(key: string, start: Date, end: Date): void;
374
+ getDateRange(key: string): { startDate: Date; endDate: Date } | null;
375
+ setDateRange(key: string, startDate: Date, endDate: Date): void;
376
+ destroy(): void;
377
+ }
378
+
379
+ export declare class InputRangeFilter {
380
+ constructor(afs: AFS);
381
+ addInputRange(options: InputRangeOptions): void;
382
+ removeInputRange(key: string): void;
383
+ getRange(key: string): { min: number; max: number } | null;
384
+ setRange(key: string, min: number, max: number): void;
322
385
  destroy(): void;
323
386
  }
324
387
 
@@ -331,6 +394,7 @@ export declare class URLManager {
331
394
  getURLParams(): URLSearchParams;
332
395
  hasParams(): boolean;
333
396
  getParam(param: string): string | null;
397
+ destroy(): void;
334
398
  }
335
399
 
336
400
  // Main AFS Class
@@ -339,11 +403,11 @@ export declare class AFS extends EventEmitter {
339
403
  readonly VERSION: string;
340
404
  readonly options: any;
341
405
  readonly logger: any;
342
- readonly state: any;
406
+ readonly state: State;
343
407
  readonly styleManager: any;
344
408
  readonly container: HTMLElement;
345
409
  readonly items: NodeListOf<HTMLElement>;
346
-
410
+
347
411
  // Features
348
412
  readonly filter: Filter;
349
413
  readonly search: Search;
@@ -352,7 +416,7 @@ export declare class AFS extends EventEmitter {
352
416
  readonly rangeFilter: RangeFilter;
353
417
  readonly dateFilter: DateFilter;
354
418
  readonly urlManager: URLManager;
355
- readonly inputRangeFilter: any;
419
+ readonly inputRangeFilter: InputRangeFilter;
356
420
 
357
421
  constructor(options?: AFSOptions);
358
422
 
@@ -379,9 +443,9 @@ export declare class AFS extends EventEmitter {
379
443
  destroy(): void;
380
444
  }
381
445
 
382
- // Events Map
446
+ // Events Map — keys are the exact event names emitted by AFS
383
447
  export interface AFSEventMap {
384
- // Core events
448
+ // Core / lifecycle
385
449
  initialized: { itemCount: number; options: AFSOptions };
386
450
  destroyed: void;
387
451
  refreshed: { itemCount: number };
@@ -389,37 +453,43 @@ export interface AFSEventMap {
389
453
  resize: void;
390
454
  hidden: void;
391
455
  visible: void;
392
-
393
- // Filter events
394
- filtersApplied: FiltersAppliedData;
395
- filtersCleared: { clearedCount: number };
396
- filterAdded: { filter: string; activeFilters: Set<string> };
397
- filterRemoved: { filter: string; activeFilters: Set<string> };
398
- filterToggled: { filter: string; isActive: boolean };
399
-
400
- // Search events
401
- search: SearchData;
456
+
457
+ // Filter
458
+ filter: { activeFilters: string[]; visibleItems: number; added: number; removed: number };
459
+ filtersApplied: { activeFilters: string[]; visibleItems: number };
460
+ filtersCleared: void;
461
+ filtersReset: void;
462
+ filterChanged: { type: string; value: string; activeFilters: string[] };
463
+ filterRemoved: { filter: string; activeFilters: string[] };
464
+ filterToggled: { filter: string; activeFilters: string[] };
465
+ filterToggledExclusive: { filter: string; activeFilters: string[] };
466
+ filterCategoryCleared: { category: string; activeFilters: string[] };
467
+ itemsShown: { items: Set<HTMLElement> };
468
+ itemsHidden: { items: Set<HTMLElement> };
469
+
470
+ // Search
471
+ search: { query: string; matches: number; total: number };
402
472
  searchCleared: void;
403
-
404
- // Sort events
405
- sort: SortData;
406
- sortMultiple: { criteria: SortCriteria[]; itemCount: number };
407
- sortCustom: { key: string; comparatorName?: string };
408
- sortShuffled: { itemCount: number };
409
- sortCleared: { buttonCount: number };
410
-
411
- // Pagination events
473
+
474
+ // Sort
475
+ sort: { key: string; order: SortDirection };
476
+ sortMultiple: { criteria: SortCriteria[]; itemCount?: number };
477
+ sortCustom: { key: string };
478
+ sortShuffled: { itemCount?: number };
479
+ sortCleared: void;
480
+
481
+ // Pagination
482
+ pagination: { currentPage: number; totalPages: number; itemsPerPage: number; visibleItems: number };
412
483
  pageChanged: PageChangedData;
413
- paginationToggled: { enabled: boolean };
414
-
415
- // URL events
484
+ paginationModeChanged: { enabled: boolean };
485
+
486
+ // URL
416
487
  urlStateLoaded: { params: Record<string, string> };
417
-
418
- // Range filter events
419
- rangeChanged: { key: string; min: number; max: number };
420
-
421
- // Date filter events
422
- dateRangeChanged: { key: string; start: Date; end: Date };
488
+
489
+ // Range / input-range / date filters
490
+ rangeFilter: { key: string; min: number; max: number };
491
+ inputRangeFilter: { key: string; min: number; max: number };
492
+ dateFilter: { key: string; startDate: Date; endDate: Date };
423
493
  }
424
494
 
425
495
  // Global exports
@@ -24,11 +24,6 @@ export interface PageInfo {
24
24
  currentPage: number;
25
25
  itemsPerPage: number;
26
26
  totalPages: number;
27
- totalItems: number;
28
- startIndex: number;
29
- endIndex: number;
30
- hasNextPage: boolean;
31
- hasPrevPage: boolean;
32
27
  }
33
28
  export interface PaginationEvent {
34
29
  currentPage: number;