ngx-kit 8.3.9 → 8.4.1

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.
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { InputSignal, Type, TemplateRef, InjectionToken, EnvironmentProviders, OnInit, AfterContentInit } from '@angular/core';
2
+ import { InputSignal, Type, TemplateRef, InjectionToken, EnvironmentProviders, OnInit, AfterContentInit, ElementRef } from '@angular/core';
3
3
  import * as ngx_kit_core from 'ngx-kit/core';
4
4
  import * as ngx_kit_data_table from 'ngx-kit/data-table';
5
5
 
@@ -9,6 +9,43 @@ interface SortMeta<T> {
9
9
  direction: SortDirection;
10
10
  }
11
11
 
12
+ declare enum DynamicDataFilterOperator {
13
+ Equal = 0,
14
+ NotEqual = 1,
15
+ Contains = 2,
16
+ StartsWith = 3,
17
+ EndsWith = 4,
18
+ GreaterThan = 5,
19
+ GreaterThanOrEqual = 6,
20
+ LessThan = 7,
21
+ LessThanOrEqual = 8,
22
+ Between = 9,
23
+ In = 10,
24
+ IsNull = 11,
25
+ IsNotNull = 12,
26
+ IsEmpty = 13,
27
+ IsNotEmpty = 14
28
+ }
29
+ type FilterDataType = 'text' | 'number' | 'date' | 'boolean' | 'enum';
30
+ interface EnumFilterOption<T = unknown> {
31
+ label: string;
32
+ value: T;
33
+ }
34
+ interface ColumnFilterConfig<T = unknown> {
35
+ type?: FilterDataType;
36
+ enabled?: boolean;
37
+ options?: EnumFilterOption<T>[];
38
+ placeholder?: string;
39
+ defaultOperator?: DynamicDataFilterOperator;
40
+ }
41
+ interface ColumnFilterState {
42
+ field: string;
43
+ operator: DynamicDataFilterOperator;
44
+ value: any;
45
+ valueTo?: any;
46
+ values?: any[];
47
+ }
48
+
12
49
  interface PageEvent {
13
50
  page: number;
14
51
  pageSize: number;
@@ -16,13 +53,12 @@ interface PageEvent {
16
53
  interface PageState {
17
54
  pageIndex: number;
18
55
  pageSize: number;
19
- /** آفست صفر-پایه‌ی اولین ردیف صفحه‌ی جاری. */
20
56
  first: number;
21
57
  }
22
- /** هر بار سرور باید صفحه‌ی جدید را (در حالت lazy) واکشی کند، امیت می‌شود. */
23
58
  interface LazyLoadEvent<T> extends PageState {
24
59
  sorts?: SortMeta<T>[];
25
60
  sorting?: string;
61
+ filters?: ColumnFilterState[];
26
62
  }
27
63
 
28
64
  interface NgxPaginationOptions {
@@ -57,7 +93,7 @@ interface CellTemplateContext<T extends object> {
57
93
  field: TableFieldBase<T>;
58
94
  }
59
95
  /** شکل پایه‌ای مشترک بین همه‌ی ستون‌ها، صرف‌نظر از این‌که renderer دارند یا نه. */
60
- interface TableFieldBase<T extends object> {
96
+ interface TableFieldBase<T extends object, K extends keyof T = keyof T> {
61
97
  column: Extract<keyof T, string>;
62
98
  title: string;
63
99
  /**
@@ -76,6 +112,8 @@ interface TableFieldBase<T extends object> {
76
112
  align?: ColumnAlign;
77
113
  prefix?: string;
78
114
  formatter?: string | TableCellFormatter<T>;
115
+ filterable?: boolean;
116
+ filterConfig?: ColumnFilterConfig<T[K]>;
79
117
  }
80
118
  /** ستون بدون renderer (متن ساده / formatter / cellTemplate دستی). */
81
119
  interface PlainTableField<T extends object> extends TableFieldBase<T> {
@@ -140,6 +178,29 @@ declare class TableLocalization {
140
178
  noData: string;
141
179
  loading: string;
142
180
  operation: string;
181
+ filter: string;
182
+ clearFilter: string;
183
+ applyFilter: string;
184
+ search: string;
185
+ selectAll: string;
186
+ from: string;
187
+ to: string;
188
+ trueText: string;
189
+ falseText: string;
190
+ opEqual: string;
191
+ opNotEqual: string;
192
+ opContains: string;
193
+ opStartsWith: string;
194
+ opEndsWith: string;
195
+ opGreaterThan: string;
196
+ opGreaterThanOrEqual: string;
197
+ opLessThan: string;
198
+ opLessThanOrEqual: string;
199
+ opBetween: string;
200
+ opIsNull: string;
201
+ opIsNotNull: string;
202
+ opIsEmpty: string;
203
+ opIsNotEmpty: string;
143
204
  }
144
205
 
145
206
  declare const NGX_TABLE_CONFIG: InjectionToken<ResolvedTableOptions>;
@@ -229,24 +290,19 @@ declare class ColumnResize {
229
290
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ColumnResize, "[ngxColumnResize]", never, { "startWidth": { "alias": "ngxColumnResizeWidth"; "required": true; "isSignal": true; }; "minWidth": { "alias": "ngxColumnResizeMin"; "required": false; "isSignal": true; }; "maxWidth": { "alias": "ngxColumnResizeMax"; "required": false; "isSignal": true; }; "direction": { "alias": "ngxColumnResizeDir"; "required": false; "isSignal": true; }; }, { "resizing": "resizing"; "resizeEnd": "resizeEnd"; }, never, never, true, never>;
230
291
  }
231
292
 
232
- /**
233
- * جدول داده‌ی جنریک و Type-Safe.
234
- *
235
- * `T` از روی چیزی که به [data] بایند می‌کنید استنتاج می‌شود؛ `field.column` در
236
- * `TableField<T, R>` محدود به `keyof T` است، و اگر از defineFields(renderers, ...)
237
- * استفاده کنید، `field.renderer` محدود به کلیدهای رجیستری و `rendererInputs`
238
- * دقیقاً همان ورودی‌های اضافه‌ی همان renderer است.
239
- *
240
- * دو حالت:
241
- * - کلاینت‌ساید (پیش‌فرض): [data] کل آرایه است؛ سورت/صفحه‌بندی داخلی و روی
242
- * یک computed خالص انجام می‌شود (بدون mutation روی آبجکت‌های شما).
243
- * - lazy: [lazy]="true" + [totalRecords]؛ [data] فقط صفحه‌ی جاری است؛ به
244
- * (lazyLoad) گوش بدهید.
245
- */
293
+ declare class ColumnFilterService {
294
+ applyFilters<T>(data: readonly T[], filters: Record<string, ColumnFilterState>): T[];
295
+ isFilterActive(filter?: ColumnFilterState | null): boolean;
296
+ private evaluateFilter;
297
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ColumnFilterService, never>;
298
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ColumnFilterService>;
299
+ }
300
+
246
301
  declare class NgxTable<T extends object> implements OnInit, AfterContentInit {
247
302
  protected readonly config: ngx_kit_data_table.ResolvedTableOptions;
248
303
  protected readonly labels: ngx_kit_data_table.TableLocalization;
249
304
  protected readonly paginationConfig: ngx_kit_data_table.NgxPaginationOptions;
305
+ protected readonly columnFilterService: ColumnFilterService;
250
306
  readonly fields: _angular_core.InputSignal<TableField<T, any>[]>;
251
307
  readonly data: _angular_core.InputSignal<readonly T[]>;
252
308
  readonly totalRecords: _angular_core.InputSignal<number>;
@@ -264,8 +320,6 @@ declare class NgxTable<T extends object> implements OnInit, AfterContentInit {
264
320
  readonly lazy: _angular_core.InputSignal<boolean>;
265
321
  readonly resizable: _angular_core.InputSignal<boolean>;
266
322
  readonly height: _angular_core.InputSignal<string>;
267
- /** پیش‌فرض بر اساس ایندکس؛ برای جلوگیری از گم‌شدن state سطرها هنگام سورت،
268
- * یک شناسه‌ی یکتا بدهید: [trackBy]="(i, row) => row.id" */
269
323
  readonly trackBy: _angular_core.InputSignal<(index: number, row: T) => unknown>;
270
324
  readonly lazyLoad: _angular_core.OutputEmitterRef<LazyLoadEvent<T>>;
271
325
  readonly sortChange: _angular_core.OutputEmitterRef<SortMeta<T>[]>;
@@ -273,10 +327,13 @@ declare class NgxTable<T extends object> implements OnInit, AfterContentInit {
273
327
  field: string;
274
328
  width: number;
275
329
  }>;
330
+ readonly filterChange: _angular_core.OutputEmitterRef<ColumnFilterState[]>;
331
+ readonly elementRef: ElementRef<HTMLElement>;
276
332
  protected readonly pageIndex: _angular_core.WritableSignal<number>;
277
333
  protected readonly pageSizeS: _angular_core.WritableSignal<number>;
278
334
  protected readonly sorts: _angular_core.WritableSignal<SortMeta<T>[]>;
279
335
  protected readonly widths: _angular_core.WritableSignal<Record<string, number>>;
336
+ protected readonly activeFilters: _angular_core.WritableSignal<Record<string, ColumnFilterState>>;
280
337
  private readonly manuallyResized;
281
338
  private readonly rendererInputsCache;
282
339
  private cellTemplates;
@@ -289,23 +346,22 @@ declare class NgxTable<T extends object> implements OnInit, AfterContentInit {
289
346
  ngOnInit(): void;
290
347
  ngAfterContentInit(): void;
291
348
  private syncTemplateMap;
349
+ protected readonly filteredData: _angular_core.Signal<readonly T[]>;
292
350
  protected readonly sortedData: _angular_core.Signal<readonly T[]>;
293
351
  protected readonly totalCount: _angular_core.Signal<number>;
294
352
  protected readonly pagedData: _angular_core.Signal<readonly T[]>;
295
353
  private compare;
296
- /** بدون mutation روی داده‌ی ورودی: شماره‌ی ردیف صرفاً از روی page/pageSize/rowIndex محاسبه می‌شود. */
297
354
  protected recordNumber(rowIndex: number): number;
298
355
  protected sortDirectionFor(column: string): SortDirection | null;
299
356
  protected onHeaderClick(field: TableField<T, any>, event: MouseEvent): void;
357
+ protected isFilterable(field: TableField<T, any>): boolean;
358
+ protected getFilterState(column: string): ColumnFilterState | null;
359
+ protected getDistinctValues(column: string): unknown[];
360
+ protected onFilterApply(state: ColumnFilterState): void;
361
+ protected onFilterClear(field: string): void;
300
362
  protected onPaginate(event: PageEvent): void;
301
363
  private emitLazyIfNeeded;
302
364
  protected columnWidth(column: string): number;
303
- /**
304
- * مقدار CSS `flex` واقعیِ این ستون:
305
- * - اگه دستی ریسایز شده یا width عددی داره → `0 0 <px>` (ثابت، بدون رشد/کوچک‌شدن)
306
- * - اگه width رشته‌ای داره (مثلاً '20%') → `0 0 <رشته>` (ثابت، هر واحد CSS معتبری)
307
- * - اگه اصلاً width نداره → `1 1 0` (رشد می‌کنه تا فضای باقی‌مونده‌ی جدول رو پر کنه)
308
- */
309
365
  protected columnFlex(field: TableField<T, any>): string;
310
366
  protected columnMin(field: TableField<T, any>): number;
311
367
  protected columnMax(field: TableField<T, any>): number;
@@ -317,12 +373,9 @@ declare class NgxTable<T extends object> implements OnInit, AfterContentInit {
317
373
  protected getCellValue(row: T, field: TableField<T, any>): unknown;
318
374
  protected formatCellValue(row: T, field: TableField<T, any>): string;
319
375
  private stringify;
320
- /** ورودی‌های renderer را به‌ازای هر (field, row) کش می‌کند تا هر Change
321
- * Detection یک آبجکت جدید ساخته نشود؛ با WeakMap، وقتی row از حافظه خارج
322
- * شود (مثلاً بعد از عوض‌شدن صفحه)، entry آن هم خودکار پاک می‌شود. */
323
376
  protected getRendererInputs(row: T, field: TableField<T, any>): Record<string, unknown>;
324
377
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxTable<any>, never>;
325
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxTable<any>, "ngx-table", never, { "fields": { "alias": "fields"; "required": true; "isSignal": true; }; "data": { "alias": "data"; "required": true; "isSignal": true; }; "totalRecords": { "alias": "totalRecords"; "required": true; "isSignal": true; }; "showRecordNumber": { "alias": "showRecordNumber"; "required": false; "isSignal": true; }; "operations": { "alias": "operations"; "required": false; "isSignal": true; }; "operationWidth": { "alias": "operationWidth"; "required": false; "isSignal": true; }; "numWidth": { "alias": "numWidth"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "page": { "alias": "page"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "multiSort": { "alias": "multiSort"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "trackBy": { "alias": "trackBy"; "required": false; "isSignal": true; }; }, { "pageChange": "pageChange"; "lazyLoad": "lazyLoad"; "sortChange": "sortChange"; "columnResize": "columnResize"; }, ["cellTemplates"], never, true, never>;
378
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxTable<any>, "ngx-table", never, { "fields": { "alias": "fields"; "required": true; "isSignal": true; }; "data": { "alias": "data"; "required": true; "isSignal": true; }; "totalRecords": { "alias": "totalRecords"; "required": true; "isSignal": true; }; "showRecordNumber": { "alias": "showRecordNumber"; "required": false; "isSignal": true; }; "operations": { "alias": "operations"; "required": false; "isSignal": true; }; "operationWidth": { "alias": "operationWidth"; "required": false; "isSignal": true; }; "numWidth": { "alias": "numWidth"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "page": { "alias": "page"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "multiSort": { "alias": "multiSort"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "trackBy": { "alias": "trackBy"; "required": false; "isSignal": true; }; }, { "pageChange": "pageChange"; "lazyLoad": "lazyLoad"; "sortChange": "sortChange"; "columnResize": "columnResize"; "filterChange": "filterChange"; }, ["cellTemplates"], never, true, never>;
326
379
  }
327
380
 
328
381
  declare class NgxPagination {
@@ -351,5 +404,42 @@ declare class NgxPagination {
351
404
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxPagination, "ngx-pagination", never, { "total": { "alias": "total"; "required": true; "isSignal": true; }; "page": { "alias": "page"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "siblingCount": { "alias": "siblingCount"; "required": false; "isSignal": true; }; "boundaryCount": { "alias": "boundaryCount"; "required": false; "isSignal": true; }; }, { "page": "pageChange"; "pageSize": "pageSizeChange"; "paginate": "paginate"; }, never, never, true, never>;
352
405
  }
353
406
 
354
- export { ColumnResize, NGX_PAGINATION_CONFIG, NGX_PAGINATION_I18N, NGX_TABLE_CONFIG, NGX_TABLE_I18N, NgxPagination, NgxTable, PaginationLocalization, TableCell, TableLocalization, defineFields, defineRenderers, providePagination, provideTable };
355
- export type { CellRendererComponent, CellTemplateContext, ColumnAlign, ColumnSizingConfig, LazyLoadEvent, NgxPaginationOptions, NgxTableOptions, PageEvent, PageState, PlainTableField, RenderedTableField, RendererExtraInputs, RendererRegistry, ResolvedTableOptions, SortDirection, SortMeta, TableCellFormatter, TableField, TableFieldBase };
407
+ declare class NgxColumnFilter {
408
+ protected readonly labels: ngx_kit_data_table.TableLocalization;
409
+ private readonly elementRef;
410
+ readonly tableEl: _angular_core.InputSignal<ElementRef<HTMLElement>>;
411
+ readonly field: _angular_core.InputSignal<string>;
412
+ readonly config: _angular_core.InputSignal<ColumnFilterConfig<unknown> | undefined>;
413
+ readonly currentFilter: _angular_core.InputSignal<ColumnFilterState | null>;
414
+ readonly distinctValues: _angular_core.InputSignal<unknown[]>;
415
+ readonly applyFilter: _angular_core.OutputEmitterRef<ColumnFilterState>;
416
+ readonly clearFilter: _angular_core.OutputEmitterRef<string>;
417
+ protected readonly isOpen: _angular_core.WritableSignal<boolean>;
418
+ protected readonly filterType: _angular_core.Signal<FilterDataType>;
419
+ protected readonly selectedOperator: _angular_core.WritableSignal<DynamicDataFilterOperator>;
420
+ protected readonly filterValue: _angular_core.WritableSignal<any>;
421
+ protected readonly filterValueTo: _angular_core.WritableSignal<any>;
422
+ protected readonly selectedEnumValues: _angular_core.WritableSignal<Set<any>>;
423
+ protected readonly enumSearchQuery: _angular_core.WritableSignal<string>;
424
+ protected readonly operators: _angular_core.Signal<{
425
+ label: string;
426
+ value: DynamicDataFilterOperator;
427
+ }[]>;
428
+ protected readonly enumOptions: _angular_core.Signal<EnumFilterOption<unknown>[]>;
429
+ protected readonly filteredEnumOptions: _angular_core.Signal<EnumFilterOption<unknown>[]>;
430
+ protected readonly isNoValueOperator: _angular_core.Signal<boolean>;
431
+ protected toggleDropdown(event: MouseEvent): void;
432
+ updatePosition(): void;
433
+ private syncStateFromInput;
434
+ protected onApply(): void;
435
+ protected onClear(): void;
436
+ protected toggleEnumSelection(val: any): void;
437
+ protected toggleSelectAll(checked: boolean): void;
438
+ protected onDocumentClick(event: MouseEvent): void;
439
+ protected onEscape(): void;
440
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxColumnFilter, never>;
441
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxColumnFilter, "ngx-column-filter", never, { "tableEl": { "alias": "tableEl"; "required": true; "isSignal": true; }; "field": { "alias": "field"; "required": true; "isSignal": true; }; "config": { "alias": "config"; "required": false; "isSignal": true; }; "currentFilter": { "alias": "currentFilter"; "required": false; "isSignal": true; }; "distinctValues": { "alias": "distinctValues"; "required": false; "isSignal": true; }; }, { "applyFilter": "applyFilter"; "clearFilter": "clearFilter"; }, never, never, true, never>;
442
+ }
443
+
444
+ export { ColumnFilterService, ColumnResize, DynamicDataFilterOperator, NGX_PAGINATION_CONFIG, NGX_PAGINATION_I18N, NGX_TABLE_CONFIG, NGX_TABLE_I18N, NgxColumnFilter, NgxPagination, NgxTable, PaginationLocalization, TableCell, TableLocalization, defineFields, defineRenderers, providePagination, provideTable };
445
+ export type { CellRendererComponent, CellTemplateContext, ColumnAlign, ColumnFilterConfig, ColumnFilterState, ColumnSizingConfig, EnumFilterOption, FilterDataType, LazyLoadEvent, NgxPaginationOptions, NgxTableOptions, PageEvent, PageState, PlainTableField, RenderedTableField, RendererExtraInputs, RendererRegistry, ResolvedTableOptions, SortDirection, SortMeta, TableCellFormatter, TableField, TableFieldBase };