@shival99/z-ui 1.9.11 → 1.9.13

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.
Files changed (36) hide show
  1. package/assets/css/base.css +0 -16
  2. package/fesm2022/shival99-z-ui-components-z-calendar.mjs.map +1 -1
  3. package/fesm2022/shival99-z-ui-components-z-drawer.mjs +7 -2
  4. package/fesm2022/shival99-z-ui-components-z-drawer.mjs.map +1 -1
  5. package/fesm2022/shival99-z-ui-components-z-filter.mjs +150 -3
  6. package/fesm2022/shival99-z-ui-components-z-filter.mjs.map +1 -1
  7. package/fesm2022/shival99-z-ui-components-z-kanban.mjs +2 -2
  8. package/fesm2022/shival99-z-ui-components-z-kanban.mjs.map +1 -1
  9. package/fesm2022/shival99-z-ui-components-z-modal.mjs +13 -6
  10. package/fesm2022/shival99-z-ui-components-z-modal.mjs.map +1 -1
  11. package/fesm2022/shival99-z-ui-components-z-select.mjs +4 -3
  12. package/fesm2022/shival99-z-ui-components-z-select.mjs.map +1 -1
  13. package/fesm2022/shival99-z-ui-components-z-table.mjs +219 -0
  14. package/fesm2022/shival99-z-ui-components-z-table.mjs.map +1 -1
  15. package/fesm2022/shival99-z-ui-components-z-timeline.mjs +43 -261
  16. package/fesm2022/shival99-z-ui-components-z-timeline.mjs.map +1 -1
  17. package/fesm2022/shival99-z-ui-components-z-upload.mjs +1 -4
  18. package/fesm2022/shival99-z-ui-components-z-upload.mjs.map +1 -1
  19. package/fesm2022/shival99-z-ui-providers.mjs +6 -2
  20. package/fesm2022/shival99-z-ui-providers.mjs.map +1 -1
  21. package/fesm2022/shival99-z-ui-services.mjs +71 -4
  22. package/fesm2022/shival99-z-ui-services.mjs.map +1 -1
  23. package/package.json +1 -1
  24. package/types/shival99-z-ui-components-z-autocomplete.d.ts +1 -1
  25. package/types/shival99-z-ui-components-z-calendar.d.ts +4 -4
  26. package/types/shival99-z-ui-components-z-drawer.d.ts +2 -0
  27. package/types/shival99-z-ui-components-z-editor.d.ts +1 -1
  28. package/types/shival99-z-ui-components-z-filter.d.ts +17 -0
  29. package/types/shival99-z-ui-components-z-modal.d.ts +5 -2
  30. package/types/shival99-z-ui-components-z-popover.d.ts +1 -1
  31. package/types/shival99-z-ui-components-z-select.d.ts +1 -1
  32. package/types/shival99-z-ui-components-z-table.d.ts +205 -1
  33. package/types/shival99-z-ui-components-z-timeline.d.ts +20 -62
  34. package/types/shival99-z-ui-components-z-upload.d.ts +3 -3
  35. package/types/shival99-z-ui-providers.d.ts +6 -2
  36. package/types/shival99-z-ui-services.d.ts +26 -1
@@ -19,12 +19,33 @@ import * as _shival99_z_ui_components_z_table from '@shival99/z-ui/components/z-
19
19
  import { ZDateRange } from '@shival99/z-ui/components/z-calendar';
20
20
  import { ZDropdownMenuItem } from '@shival99/z-ui/components/z-dropdown-menu';
21
21
 
22
+ /**
23
+ * Z-Table Type Definitions
24
+ *
25
+ * Central type file for the z-table component. Contains:
26
+ * - Default constants (row heights, sizing, debounce timers)
27
+ * - Column configuration types (header, body, footer)
28
+ * - Sort/filter/edit configuration interfaces
29
+ * - Event contracts for parent-component communication
30
+ * - Unified change event discriminated union
31
+ * - Virtual scrolling configuration
32
+ * - Settings persistence types
33
+ * - TanStack Table module augmentation for custom table meta
34
+ */
35
+
36
+ /**
37
+ * A virtual group represents one or more consecutive rows that must be
38
+ * rendered together (e.g. rows sharing a rowSpan). The virtualizer operates
39
+ * on groups rather than individual rows to keep merged cells intact.
40
+ */
22
41
  interface ZVirtualGroup {
23
42
  startIndex: number;
24
43
  endIndex: number;
25
44
  rowCount: number;
45
+ /** null when dynamicSize is enabled — height is measured after render */
26
46
  height: number | null;
27
47
  }
48
+ /** Parsed segment from the `[icon:name|size:16|class:text-red]` inline icon syntax */
28
49
  interface ZTableIconPart {
29
50
  type: 'text' | 'icon';
30
51
  value: string;
@@ -33,18 +54,35 @@ interface ZTableIconPart {
33
54
  strokeWidth?: number;
34
55
  }
35
56
  type ZTableAlign = 'left' | 'center' | 'right';
57
+ /**
58
+ * Body cell content — supports static values, Angular templates/components,
59
+ * or a function that receives the cell context and returns dynamic content.
60
+ */
36
61
  type ZTableCellContent<T> = string | number | TemplateRef<{
37
62
  $implicit: CellContext<T, unknown>;
38
63
  }> | Type<unknown> | FlexRenderComponent<unknown> | ((info: CellContext<T, unknown>) => string | number | TemplateRef<unknown> | FlexRenderComponent<unknown>);
64
+ /** Header/footer cell content — similar to body but uses HeaderContext */
39
65
  type ZTableHeaderContent<T> = string | TemplateRef<unknown> | Type<unknown> | (() => string) | ((info: HeaderContext<T, unknown>) => string);
66
+ /** Alias for ZTableColumnConfig — kept for backward compatibility */
40
67
  type ZTableColumn<T = unknown> = ZTableColumnConfig<T>;
68
+ /** Available column filter input types */
41
69
  type ZTableFilterType = 'text' | 'number' | 'select' | 'multi-select' | 'date' | 'date-range' | 'range' | 'tags';
70
+ /** Available inline cell edit input types */
42
71
  type ZTableEditType = 'text' | 'number' | 'select' | 'date' | 'checkbox' | 'textarea' | 'toggle' | 'autocomplete';
72
+ /**
73
+ * Table operation mode:
74
+ * - 'local': data is fully client-side (sort/filter/paginate handled by TanStack)
75
+ * - 'server': parent handles data fetching; table emits change events for server calls
76
+ */
43
77
  type ZTableMode = 'local' | 'server';
78
+ /** Per-column sort configuration; mode controls local vs server-side sorting */
44
79
  interface ZTableSortConfig<T> {
45
80
  enabled?: boolean;
81
+ /** 'local' = TanStack sorts in-memory; 'server' = emits event for API call */
46
82
  mode?: ZTableMode;
83
+ /** Custom key sent with server-side sort events (defaults to column id) */
47
84
  sortKey?: string;
85
+ /** Custom comparator for local sorting */
48
86
  sortFn?: (rowA: Row<T>, rowB: Row<T>, columnId: string) => number;
49
87
  }
50
88
  type ZTableBuiltInFilterFn = 'equalsString' | 'includesString' | 'includesStringSensitive' | 'arrIncludes' | 'arrIncludesAll' | 'arrIncludesSome' | 'equals' | 'weakEquals' | 'inNumberRange';
@@ -110,10 +148,16 @@ interface ZTableEditConfig<T = unknown> {
110
148
  /** Allow typing custom values when no options match. Default: false */
111
149
  autocompleteAllowCustomValue?: boolean;
112
150
  }
151
+ /** Minimal column info stored alongside saved config for cache invalidation */
113
152
  interface ZTableSavedColumnInfo {
114
153
  id: string;
115
154
  accessorKey?: string;
116
155
  }
156
+ /**
157
+ * Shape of the persisted table configuration (via ZCacheService).
158
+ * Restored when a table with matching zKey re-mounts.
159
+ * columnInfo is used to detect schema changes and invalidate stale caches.
160
+ */
117
161
  interface ZTableSavedConfig {
118
162
  columnOrder: string[];
119
163
  columnSizing: Record<string, number>;
@@ -127,6 +171,11 @@ interface ZTableSavedConfig {
127
171
  showHorizontalBorder: boolean;
128
172
  showVerticalBorder: boolean;
129
173
  }
174
+ /**
175
+ * Imperative control handle emitted via `zControl` output.
176
+ * Allows parent components to programmatically manipulate table state
177
+ * (add/update/delete items, reset filters, toggle settings, etc.).
178
+ */
130
179
  interface ZTableControl<T> {
131
180
  updateConfig: (config: Partial<ZTableConfig<T>>) => void;
132
181
  toggleSettings: () => void;
@@ -138,6 +187,7 @@ interface ZTableControl<T> {
138
187
  getItems: () => T[];
139
188
  setColumnVisibility: (columnIds: string | string[], visible: boolean) => void;
140
189
  }
190
+ /** Header cell configuration — applied to the <th> in the table header row */
141
191
  interface ZTableHeaderColumnConfig<T> {
142
192
  content?: ZTableHeaderContent<T>;
143
193
  class?: string;
@@ -145,22 +195,31 @@ interface ZTableHeaderColumnConfig<T> {
145
195
  align?: ZTableAlign;
146
196
  rowSpan?: number;
147
197
  colSpan?: number;
198
+ /** Class applied to the inner content wrapper, not the <th> itself */
148
199
  contentClass?: string | ((info: HeaderContext<T, unknown>) => string);
149
200
  contentStyle?: Record<string, string> | ((info: HeaderContext<T, unknown>) => Record<string, string>);
150
201
  tooltip?: string | ZTooltipConfig;
151
202
  }
203
+ /**
204
+ * Body cell configuration — most properties accept a static value or
205
+ * a function receiving CellContext for per-row dynamic behavior.
206
+ */
152
207
  interface ZTableBodyColumnConfig<T> {
153
208
  content?: ZTableCellContent<T>;
154
209
  class?: string | ((info: CellContext<T, unknown>) => string);
155
210
  style?: Record<string, string> | ((info: CellContext<T, unknown>) => Record<string, string>);
156
211
  align?: ZTableAlign;
212
+ /** Static rowSpan or function returning 0 to hide the cell (merged into neighbor) */
157
213
  rowSpan?: number | ((info: CellContext<T, unknown>) => number);
158
214
  colSpan?: number | ((info: CellContext<T, unknown>) => number);
159
215
  contentClass?: string | ((info: CellContext<T, unknown>) => string);
160
216
  contentStyle?: Record<string, string> | ((info: CellContext<T, unknown>) => Record<string, string>);
161
217
  tooltip?: string | ZTooltipConfig | ((info: CellContext<T, unknown>) => string | ZTooltipConfig);
218
+ /** Action buttons rendered inside this cell */
162
219
  actions?: ZTableActionColumnConfig<T>;
220
+ /** When true, clicking the cell emits a cellClick event */
163
221
  enabledClick?: boolean;
222
+ /** Enable inline editing — true uses defaults, or pass full config */
164
223
  edit?: ZTableEditConfig<T> | boolean;
165
224
  /** Control cell content visibility. When false, the cell is rendered but content is hidden. */
166
225
  visible?: boolean | ((info: CellContext<T, unknown>) => boolean);
@@ -176,10 +235,23 @@ interface ZTableFooterColumnConfig<T> {
176
235
  contentStyle?: Record<string, string> | ((info: HeaderContext<T, unknown>) => Record<string, string>);
177
236
  tooltip?: string | ZTooltipConfig;
178
237
  }
238
+ /**
239
+ * Primary column definition — the consumer-facing API.
240
+ * Converted to TanStack ColumnDef internally via `columnConfigToColumnDef()`.
241
+ *
242
+ * Shorthand: header/body/footer accept either a full config object or
243
+ * just the content directly (string/template/function).
244
+ *
245
+ * Nested columns: use `columns` for multi-level header groups.
246
+ */
179
247
  interface ZTableColumnConfig<T> {
248
+ /** Unique column identifier — must be stable across re-renders */
180
249
  id: string;
250
+ /** Pre-filter visibility — unlike columnVisibility, this removes the column entirely */
181
251
  visible?: boolean | (() => boolean);
252
+ /** Object property key for simple accessor — mutually exclusive with accessorFn */
182
253
  accessorKey?: keyof T & string;
254
+ /** Custom accessor function for derived/computed cell values */
183
255
  accessorFn?: (row: T) => unknown;
184
256
  header?: ZTableHeaderColumnConfig<T> | ZTableHeaderContent<T>;
185
257
  body?: ZTableBodyColumnConfig<T> | ZTableCellContent<T>;
@@ -188,13 +260,17 @@ interface ZTableColumnConfig<T> {
188
260
  minSize?: number;
189
261
  maxSize?: number;
190
262
  width?: string;
263
+ /** true = local sort with defaults; object = full config */
191
264
  sort?: ZTableSortConfig<T> | boolean;
265
+ /** true = local filter with defaults; object = full config */
192
266
  filter?: ZTableFilterConfig<T> | boolean;
193
267
  enableResizing?: boolean;
194
268
  enablePinning?: boolean;
195
269
  enableHiding?: boolean;
196
270
  enableOrdering?: boolean;
271
+ /** Initial pin position — applied on first render */
197
272
  pinned?: 'left' | 'right' | false;
273
+ /** Child columns for multi-level header grouping */
198
274
  columns?: ZTableColumnConfig<T>[];
199
275
  }
200
276
  interface ZTablePaginationConfig {
@@ -208,6 +284,7 @@ interface ZTablePaginationConfig {
208
284
  totalLabel?: string;
209
285
  disabled?: boolean;
210
286
  }
287
+ /** Distinguishes user-triggered vs programmatic pagination changes */
211
288
  type ZTableEmitType = 'user' | 'auto';
212
289
  interface ZTablePageChangeEvent {
213
290
  pageIndex: number;
@@ -290,6 +367,7 @@ interface ZTableActionColumnConfig<T = unknown> {
290
367
  actions: ZTableActionItem<T>[] | ((row: T) => ZTableActionItem<T>[]);
291
368
  maxVisible?: number;
292
369
  }
370
+ /** All possible change event types — used as discriminant in ZTableChangeEvent */
293
371
  type ZTableChangeType = 'page' | 'sort' | 'filter' | 'search' | 'select' | 'expand' | 'rowSelect' | 'rowSelectAll' | 'rowExpand' | 'cellClick' | 'cellEdit' | 'action';
294
372
  interface ZTableChangeEventBase {
295
373
  type: ZTableChangeType;
@@ -346,7 +424,21 @@ interface ZTableCellEditChange<T> extends ZTableChangeEventBase {
346
424
  type: 'cellEdit';
347
425
  data: ZTableCellEditEvent<T>;
348
426
  }
427
+ /**
428
+ * Unified change event emitted via `zChange` output.
429
+ * Parent components can use `event.type` to narrow the discriminated union.
430
+ *
431
+ * Example:
432
+ * ```ts
433
+ * onTableChange(event: ZTableChangeEvent<MyRow>) {
434
+ * if (event.type === 'page') {
435
+ * // event.data is ZTablePageChangeEvent
436
+ * }
437
+ * }
438
+ * ```
439
+ */
349
440
  type ZTableChangeEvent<T> = ZTablePageChange | ZTableSortChange | ZTableFilterChange | ZTableSearchChange | ZTableSelectChange | ZTableExpandChange | ZTableRowSelectChange<T> | ZTableRowSelectAllChange<T> | ZTableRowExpandChange<T> | ZTableCellClickChange<T> | ZTableCellEditChange<T> | ZTableActionChange<T>;
441
+ /** Initial table state — applied on first render, before any cached config is loaded */
350
442
  interface ZTableInitialState {
351
443
  columnPinning?: ColumnPinningState;
352
444
  rowPinning?: RowPinningState;
@@ -425,22 +517,37 @@ interface ZTableSearchConfig {
425
517
  width?: string;
426
518
  size?: ZInputSize;
427
519
  }
520
+ /**
521
+ * Top-level configuration passed via `[zConfig]` input.
522
+ * This is the primary API surface for consumers of z-table.
523
+ */
428
524
  interface ZTableConfig<T> {
525
+ /** 'local' = client-side operations; 'server' = parent handles data fetching */
429
526
  mode?: ZTableMode;
527
+ /** Row data array — for server mode, this is the current page's data */
430
528
  data: T[];
529
+ /** Total row count for server-side pagination (aliased as totalRows) */
431
530
  totalCount?: number;
531
+ /** Column definitions */
432
532
  columns: ZTableColumnConfig<T>[];
533
+ /** Custom row ID generator — critical for selection/expansion state stability */
433
534
  getRowId?: (row: T, index: number, parent: T | undefined, data: T[]) => string;
535
+ /** Sub-row accessor for tree/hierarchical data */
434
536
  getSubRows?: (row: T, index: number, parent: T | undefined, data: T[]) => T[] | undefined;
537
+ /** @deprecated Use totalCount instead */
435
538
  totalRows?: number;
539
+ /** true = enable with defaults; object = full virtual scroll config */
436
540
  virtual?: ZTableVirtualConfig | boolean;
437
541
  showHorizontalBorder?: boolean;
438
542
  showVerticalBorder?: boolean;
439
543
  showHeaderShadow?: boolean;
440
544
  showFooterShadow?: boolean;
545
+ /** Show the settings drawer toggle button */
441
546
  enableSettings?: boolean;
442
547
  enableColumnResizing?: boolean;
548
+ /** When true, shift-click sorting is simulated automatically */
443
549
  enableMultiSort?: boolean;
550
+ /** true = enable with defaults; object = full search bar config */
444
551
  search?: ZTableSearchConfig | boolean;
445
552
  enableRowPinning?: boolean;
446
553
  enableColumnPinning?: boolean;
@@ -449,15 +556,20 @@ interface ZTableConfig<T> {
449
556
  pagination?: ZTablePaginationConfig;
450
557
  initialState?: ZTableInitialState;
451
558
  loading?: boolean;
559
+ /** Template rendered when a row is expanded */
452
560
  expandedRowTemplate?: TemplateRef<{
453
561
  $implicit: Row<T>;
454
562
  }>;
563
+ /** Template rendered when no data matches */
455
564
  emptyTemplate?: TemplateRef<void>;
565
+ /** Template rendered during loading state */
456
566
  loadingTemplate?: TemplateRef<void>;
457
567
  getRowCanExpand?: (row: Row<T>) => boolean;
458
568
  maxHeight?: string;
459
569
  minHeight?: string;
570
+ /** Debounce time (ms) for async state updates; defaults to Z_DEFAULT_DEBOUNCE_TIME */
460
571
  debounceTime?: number;
572
+ /** Use skeleton rows instead of loading spinner */
461
573
  useSkeleton?: boolean;
462
574
  }
463
575
  interface ZTableEditCellChangeEvent<T = unknown> {
@@ -478,6 +590,10 @@ interface ZResolvedEditConfig {
478
590
  disabled: boolean;
479
591
  readonly: boolean;
480
592
  }
593
+ /**
594
+ * Extends TanStack's TableMeta to add a custom `updateData` callback.
595
+ * This is used by inline edit cells to notify the table of value changes.
596
+ */
481
597
  declare module '@tanstack/angular-table' {
482
598
  interface TableMeta<TData extends RowData> {
483
599
  updateData?: (rowIndex: number, columnId: string, value: unknown) => void;
@@ -485,21 +601,35 @@ declare module '@tanstack/angular-table' {
485
601
  }
486
602
 
487
603
  declare class ZTableComponent<T> implements AfterViewInit {
604
+ /** Unified change event — parent listens to this for all table interactions */
488
605
  readonly zChange: _angular_core.OutputEmitterRef<ZTableChangeEvent<T>>;
606
+ /** Emits an imperative control handle for programmatic table manipulation */
489
607
  readonly zControl: _angular_core.OutputEmitterRef<ZTableControl<T>>;
608
+ /** Extra CSS classes merged onto the table container */
490
609
  readonly zClass: _angular_core.InputSignal<ClassValue>;
610
+ /** Main configuration — data, columns, mode, features */
491
611
  readonly zConfig: _angular_core.InputSignal<ZTableConfig<T>>;
612
+ /** External loading state (complementary to config.loading) */
492
613
  readonly zLoading: _angular_core.InputSignal<boolean>;
614
+ /** Cache key for persisting column settings; no persistence when empty */
493
615
  readonly zKey: _angular_core.InputSignal<string>;
616
+ /** Visual variant: 'default' has card shadow, 'borderless' has no container border */
494
617
  readonly zVariant: _angular_core.InputSignal<"default" | "borderless">;
495
618
  private readonly _destroy$;
496
619
  private readonly _zTranslate;
620
+ /** Prevents recursive scroll sync between thead/tbody/tfoot */
497
621
  private readonly _isSyncingScroll;
622
+ /** Preserves horizontal scroll position across loading states */
498
623
  private readonly _savedScrollLeft;
624
+ /** Observes tbody container height changes for skeleton row count calculation */
499
625
  private _resizeObserver;
626
+ /** Debounces rapid settings changes (visibility/pin toggles) */
500
627
  private _settingsDebounceTimeout;
628
+ /** Debounces filter change emissions to server */
501
629
  private _filterEmitDebounceTimeout;
630
+ /** Merged loading state from both zLoading input and config.loading */
502
631
  protected readonly isLoading: _angular_core.Signal<boolean>;
632
+ /** True during debounced async state transitions (sort/filter processing) */
503
633
  protected readonly isProcessing: _angular_core.WritableSignal<boolean>;
504
634
  protected readonly theadWrapper: _angular_core.Signal<ElementRef<HTMLDivElement> | undefined>;
505
635
  protected readonly tbodyContainer: _angular_core.Signal<ElementRef<HTMLDivElement> | undefined>;
@@ -516,35 +646,54 @@ declare class ZTableComponent<T> implements AfterViewInit {
516
646
  protected readonly rowPinning: _angular_core.WritableSignal<RowPinningState>;
517
647
  protected readonly columnFilters: _angular_core.WritableSignal<ColumnFiltersState>;
518
648
  protected readonly globalFilter: _angular_core.WritableSignal<string>;
649
+ /** Note: pageIndex is 1-based here; converted to 0-based for TanStack via _tanstackPagination */
519
650
  protected readonly pagination: _angular_core.WritableSignal<PaginationState>;
520
651
  protected readonly sorting: _angular_core.WritableSignal<SortingState>;
652
+ /**
653
+ * Caches the last server-provided total to avoid flickering to 0
654
+ * during loading transitions in server-side pagination mode.
655
+ */
521
656
  private readonly _serverPaginationTotal;
657
+ /** Container CSS classes combining variant + user-provided classes */
522
658
  protected readonly classTable: _angular_core.Signal<string>;
659
+ /** Convert 1-based pagination to TanStack's 0-based pageIndex */
523
660
  private readonly _tanstackPagination;
524
661
  private readonly _configPagination;
525
662
  protected readonly paginationTotal: _angular_core.Signal<number>;
526
663
  protected readonly hasVerticalScroll: _angular_core.WritableSignal<boolean>;
527
664
  protected readonly hasHorizontalScroll: _angular_core.WritableSignal<boolean>;
665
+ /** True when the last row touches or extends past the container bottom (no gap) */
528
666
  protected readonly lastRowTouchesBottom: _angular_core.WritableSignal<boolean>;
529
667
  protected readonly showSettingsDrawer: _angular_core.WritableSignal<boolean>;
530
668
  protected readonly showHorizontalBorder: _angular_core.WritableSignal<boolean>;
531
669
  protected readonly showVerticalBorder: _angular_core.WritableSignal<boolean>;
532
670
  protected readonly showHeaderFooterShadow: _angular_core.WritableSignal<boolean>;
671
+ /** True when table body is scrolled away from left edge (shows left pin shadow) */
533
672
  protected readonly hasScrollLeft: _angular_core.WritableSignal<boolean>;
673
+ /** True when table has right-pinned columns and body isn't scrolled to the end */
534
674
  protected readonly hasScrollRight: _angular_core.WritableSignal<boolean>;
675
+ /** Maps row IDs to measured DOM heights for pinned row offset calculations */
535
676
  protected readonly pinnedRowHeights: _angular_core.WritableSignal<Record<string, number>>;
677
+ /** Bumped to force recomputation of pinned column IDs after programmatic pin changes */
536
678
  private readonly _columnPinVersion;
679
+ /** Bumped to trigger data refresh (e.g., after addItem/deleteItem via control API) */
537
680
  private readonly _dataForceUpdate;
681
+ /** Set when a single row is updated via control API (for targeted re-render) */
538
682
  protected readonly _rowUpdate: _angular_core.WritableSignal<{
539
683
  rowId: string;
540
684
  updates: Record<string, unknown>;
541
685
  } | null>;
686
+ /**
687
+ * Column config lookup cache — cleared when column reference changes.
688
+ * Avoids repeated recursive searches during render cycles.
689
+ */
542
690
  private _columnConfigCache;
543
691
  private _lastColumnsRef;
544
692
  protected readonly pinnedColumnIds: _angular_core.Signal<string[]>;
545
693
  protected readonly pendingVisibleColumns: _angular_core.WritableSignal<string[]>;
546
694
  protected readonly pendingColumnOrder: _angular_core.WritableSignal<string[]>;
547
695
  protected readonly pendingShowHeaderFooterShadow: _angular_core.WritableSignal<boolean>;
696
+ /** True if ANY body column uses rowSpan — affects virtual grouping and expand column behavior */
548
697
  protected readonly hasBodyRowSpan: _angular_core.Signal<boolean>;
549
698
  protected readonly hasSelectColumn: _angular_core.Signal<boolean>;
550
699
  protected readonly hasExpandColumn: _angular_core.Signal<boolean>;
@@ -568,15 +717,27 @@ declare class ZTableComponent<T> implements AfterViewInit {
568
717
  size: _shival99_z_ui_components_z_input.ZInputSize;
569
718
  } | null>;
570
719
  protected readonly isSearchEnabled: _angular_core.Signal<boolean>;
720
+ /** Data signal with force-update support for control API mutations */
571
721
  private readonly _data;
722
+ /**
723
+ * Converts ZTableColumnConfig[] into TanStack ColumnDef[].
724
+ * Handles special columns (select, expand, actionRowPin), action column sizing,
725
+ * and rowSpan/expand compatibility (expand column is removed when rowSpan is used).
726
+ */
572
727
  private readonly _columns;
573
728
  protected readonly isVirtual: _angular_core.Signal<boolean>;
729
+ /** Normalized virtual config with defaults applied */
574
730
  private readonly _virtualConfig;
575
731
  protected readonly virtualRowHeight: _angular_core.Signal<number>;
576
732
  protected readonly dynamicSize: _angular_core.Signal<boolean>;
577
733
  protected readonly groupSize: _angular_core.Signal<number>;
578
734
  protected readonly groupHeight: _angular_core.Signal<number>;
579
735
  private readonly _dynamicGroupsVersion;
736
+ /**
737
+ * Groups rows for virtual scrolling. When rowSpan is used, rows that share
738
+ * a merged cell are grouped together so the virtualizer treats them as
739
+ * a single unit, preserving the visual merge across scroll boundaries.
740
+ */
580
741
  protected readonly dynamicGroups: _angular_core.Signal<ZVirtualGroup[]>;
581
742
  protected readonly hasFooter: _angular_core.Signal<boolean>;
582
743
  protected readonly isEmpty: _angular_core.Signal<boolean>;
@@ -608,11 +769,22 @@ declare class ZTableComponent<T> implements AfterViewInit {
608
769
  protected readonly columnSizeVars: _angular_core.Signal<Record<string, number>>;
609
770
  protected readonly table: ReturnType<typeof createAngularTable<T>>;
610
771
  private readonly _virtualGroupCount;
772
+ /** Virtualizer instance — operates on groups rather than individual rows */
611
773
  protected readonly virtualizer: _shival99_angular_virtual.AngularVirtualizer<HTMLDivElement, Element>;
612
774
  private readonly _measureVirtualItems;
613
775
  constructor();
614
776
  ngAfterViewInit(): void;
777
+ /**
778
+ * Syncs parent row selection state based on children.
779
+ * If all children are selected, the parent is auto-selected;
780
+ * if no children are selected, the parent is deselected.
781
+ */
615
782
  private _handleRowSelectionWithParents;
783
+ /**
784
+ * Wraps state mutations with a debounced processing indicator.
785
+ * Shows a brief loading state to prevent UI flicker during
786
+ * filter/sort recomputation on large datasets.
787
+ */
616
788
  private _runAsyncStateUpdate;
617
789
  private _emitFilterChangeDebounced;
618
790
  private _checkScrollState;
@@ -624,6 +796,7 @@ declare class ZTableComponent<T> implements AfterViewInit {
624
796
  hasRightPinnedColumns(): boolean;
625
797
  onTbodyScroll(event: Event): void;
626
798
  private _syncScrollLeft;
799
+ /** Handles sort click; auto-adds shiftKey for multi-sort when enabled */
627
800
  handleSort(event: Event, handler?: (event: unknown) => void): void;
628
801
  onColumnDrop(event: CdkDragDrop<string[]>): void;
629
802
  onToggleAllColumns(): void;
@@ -646,9 +819,16 @@ declare class ZTableComponent<T> implements AfterViewInit {
646
819
  moveColumnRight(columnId: string): void;
647
820
  isFirstMovableColumn(columnId: string): boolean;
648
821
  isLastMovableColumn(columnId: string): boolean;
822
+ /** Saves current column layout, sizing, pinning, and visibility to ZCacheService */
649
823
  private _saveConfig;
650
824
  private _collectColumnInfo;
825
+ /** Loads cached config from ZCacheService; validates schema compatibility first */
651
826
  private _loadConfigCache;
827
+ /**
828
+ * Validates cached column info against current config.
829
+ * Returns false if columns have been added/removed/renamed since cache was saved,
830
+ * which triggers cache invalidation.
831
+ */
652
832
  private _isColumnConfigValid;
653
833
  private _getChangedFilterColumnIds;
654
834
  private _getChangedSortColumnIds;
@@ -656,6 +836,10 @@ declare class ZTableComponent<T> implements AfterViewInit {
656
836
  private _isColumnSortModeLocal;
657
837
  private _filterServerModeColumnFilters;
658
838
  private _filterServerModeSorting;
839
+ /**
840
+ * Recursively finds a column config by ID with caching.
841
+ * Cache is invalidated when the column array reference changes.
842
+ */
659
843
  private _findColumnConfig;
660
844
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ZTableComponent<any>, never>;
661
845
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ZTableComponent<any>, "z-table", ["zTable"], { "zClass": { "alias": "zClass"; "required": false; "isSignal": true; }; "zConfig": { "alias": "zConfig"; "required": false; "isSignal": true; }; "zLoading": { "alias": "zLoading"; "required": false; "isSignal": true; }; "zKey": { "alias": "zKey"; "required": false; "isSignal": true; }; "zVariant": { "alias": "zVariant"; "required": false; "isSignal": true; }; }, { "zChange": "zChange"; "zControl": "zControl"; }, never, never, true, never>;
@@ -711,7 +895,7 @@ declare class ZTableActionsComponent<T = unknown> {
711
895
  readonly zConfig: _angular_core.InputSignal<ZTableActionColumnConfig<T>>;
712
896
  readonly zRow: _angular_core.InputSignal<T>;
713
897
  readonly zRowId: _angular_core.InputSignal<string>;
714
- readonly zDropdownButtonSize: _angular_core.InputSignal<"sm" | "default" | "lg" | "xs" | "xl" | null | undefined>;
898
+ readonly zDropdownButtonSize: _angular_core.InputSignal<"default" | "sm" | "lg" | "xs" | "xl" | null | undefined>;
715
899
  readonly zActionClick: _angular_core.OutputEmitterRef<ZTableActionClickEvent<T>>;
716
900
  protected readonly allActions: _angular_core.Signal<ZTableActionItem<T>[]>;
717
901
  protected readonly shouldShowAsButtons: _angular_core.Signal<boolean>;
@@ -771,9 +955,13 @@ declare class ZTableEditCellComponent<T = unknown> implements OnInit {
771
955
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ZTableEditCellComponent<any>, "z-table-edit-cell", never, { "zRow": { "alias": "zRow"; "required": true; "isSignal": true; }; "zRowId": { "alias": "zRowId"; "required": true; "isSignal": true; }; "zRowIndex": { "alias": "zRowIndex"; "required": true; "isSignal": true; }; "zColumnId": { "alias": "zColumnId"; "required": true; "isSignal": true; }; "zValue": { "alias": "zValue"; "required": false; "isSignal": true; }; "zEditConfig": { "alias": "zEditConfig"; "required": false; "isSignal": true; }; "zRowUpdate": { "alias": "zRowUpdate"; "required": false; "isSignal": true; }; }, { "zChange": "zChange"; }, never, never, true, never>;
772
956
  }
773
957
 
958
+ /** Type guard: is this a full header config object (not just content shorthand)? */
774
959
  declare const isHeaderConfig: <T>(config: ZTableHeaderColumnConfig<T> | ZTableHeaderContent<T> | undefined) => config is ZTableHeaderColumnConfig<T>;
960
+ /** Type guard: is this a full body config object (not just content shorthand)? */
775
961
  declare const isBodyConfig: <T>(config: ZTableBodyColumnConfig<T> | ZTableCellContent<T> | undefined) => config is ZTableBodyColumnConfig<T>;
962
+ /** Type guard: is this a full footer config object (not just content shorthand)? */
776
963
  declare const isFooterConfig: <T>(config: ZTableFooterColumnConfig<T> | ZTableHeaderContent<T> | undefined) => config is ZTableFooterColumnConfig<T>;
964
+ /** Extract and normalize header config from a column definition */
777
965
  declare const getHeaderConfig: <T>(col: ZTableColumnConfig<T> | undefined) => {
778
966
  content: ZTableHeaderContent<T> | undefined;
779
967
  class: string | undefined;
@@ -795,6 +983,10 @@ declare const getHeaderConfig: <T>(col: ZTableColumnConfig<T> | undefined) => {
795
983
  contentClass: string | ((info: _tanstack_angular_table.HeaderContext<T, unknown>) => string) | ((info: _tanstack_angular_table.HeaderContext<T, unknown>) => string) | undefined;
796
984
  contentStyle: Record<string, string> | ((info: _tanstack_angular_table.HeaderContext<T, unknown>) => Record<string, string>) | ((info: _tanstack_angular_table.HeaderContext<T, unknown>) => Record<string, string>) | undefined;
797
985
  };
986
+ /**
987
+ * Extract and normalize body config from a column definition.
988
+ * Resolves dynamic properties (class, style, rowSpan, etc.) when CellContext is provided.
989
+ */
798
990
  declare const getBodyConfig: <T>(col: ZTableColumnConfig<T> | undefined, ctx?: CellContext<T, unknown>) => {
799
991
  content: ZTableCellContent<T> | undefined;
800
992
  class: string | undefined;
@@ -837,7 +1029,19 @@ declare const getFooterConfig: <T>(col: ZTableColumnConfig<T> | undefined) => {
837
1029
  contentClass: string | ((info: _tanstack_angular_table.HeaderContext<T, unknown>) => string) | ((info: _tanstack_angular_table.HeaderContext<T, unknown>) => string) | undefined;
838
1030
  contentStyle: Record<string, string> | ((info: _tanstack_angular_table.HeaderContext<T, unknown>) => Record<string, string>) | ((info: _tanstack_angular_table.HeaderContext<T, unknown>) => Record<string, string>) | undefined;
839
1031
  };
1032
+ /** Recursively search for a column config by ID within a (possibly nested) column array */
840
1033
  declare const findColumnConfig: <T>(columnId: string, columns: ZTableColumnConfig<T>[]) => ZTableColumnConfig<T> | undefined;
1034
+ /**
1035
+ * Converts the consumer-facing ZTableColumnConfig into a TanStack ColumnDef.
1036
+ * This is the bridge between the z-table API and TanStack Table internals.
1037
+ *
1038
+ * Handles:
1039
+ * - Accessor mapping (accessorKey / accessorFn)
1040
+ * - Header/body/footer content resolution
1041
+ * - Sort and filter function wiring (local vs server mode)
1042
+ * - Built-in filter functions for each filter type
1043
+ * - Recursive nested column conversion
1044
+ */
841
1045
  declare function columnConfigToColumnDef<T>(config: ZTableColumnConfig<T>): ColumnDef<T>;
842
1046
 
843
1047
  export { ZTableActionsComponent, ZTableComponent, ZTableEditCellComponent, ZTableFilterComponent, ZTableIconTextComponent, columnConfigToColumnDef, findColumnConfig, getBodyConfig, getFooterConfig, getHeaderConfig, isBodyConfig, isFooterConfig, isHeaderConfig };
@@ -1,7 +1,6 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { PipeTransform } from '@angular/core';
2
+ import { TemplateRef } from '@angular/core';
3
3
  import { ClassValue } from 'clsx';
4
- import { ZIcon } from '@shival99/z-ui/components/z-icon';
5
4
  import * as class_variance_authority_types from 'class-variance-authority/types';
6
5
  import { VariantProps } from 'class-variance-authority';
7
6
 
@@ -10,89 +9,48 @@ interface ZTimelineItem {
10
9
  title: string;
11
10
  description?: string;
12
11
  time?: string;
13
- icon?: ZIcon;
14
- color?: 'default' | 'primary' | 'success' | 'warning' | 'error' | 'info';
12
+ subtitle?: string;
13
+ active?: boolean;
14
+ contentTemplate?: TemplateRef<unknown>;
15
15
  }
16
16
  type ZTimelineSize = 'sm' | 'default' | 'lg';
17
- type ZTimelineLayout = 'default' | 'reversed' | 'alternate';
18
- type ZTimelineLineStyle = 'solid' | 'dashed';
19
- type ZTimelineIconStyle = 'filled' | 'outline';
20
- type ZTimelineContentStyle = 'simple' | 'card';
21
- type ZTimelineClassType = 'item' | 'header' | 'icon' | 'iconCenter' | 'dot' | 'line' | 'dotCircle' | 'time' | 'side';
22
- interface ZTimelineClassOptions {
23
- item?: ZTimelineItem;
24
- layout?: ZTimelineLayout;
25
- lineStyle?: ZTimelineLineStyle;
26
- iconStyle?: ZTimelineIconStyle;
27
- timeVariant?: 'default' | 'secondary' | 'outline' | 'muted';
28
- side?: 'left' | 'right';
29
- }
17
+ type ZTimelineLayout = 'default' | 'alternate';
30
18
 
31
19
  declare class ZTimelineComponent {
32
20
  readonly class: _angular_core.InputSignal<ClassValue>;
33
21
  readonly zItems: _angular_core.InputSignal<ZTimelineItem[]>;
34
22
  readonly zSize: _angular_core.InputSignal<ZTimelineSize>;
35
- readonly zTimeVariant: _angular_core.InputSignal<"default" | "outline" | "secondary" | "muted">;
36
- readonly zLineStyle: _angular_core.InputSignal<ZTimelineLineStyle>;
37
- readonly zIconStyle: _angular_core.InputSignal<ZTimelineIconStyle>;
38
23
  readonly zLayout: _angular_core.InputSignal<ZTimelineLayout>;
39
- readonly zContentStyle: _angular_core.InputSignal<ZTimelineContentStyle>;
40
24
  protected readonly hostClasses: _angular_core.Signal<string>;
41
- protected readonly isAlternate: _angular_core.Signal<boolean>;
42
- protected readonly itemClasses: _angular_core.Signal<string>;
43
25
  protected readonly dotClasses: _angular_core.Signal<string>;
44
- protected readonly lineClasses: _angular_core.Signal<string>;
26
+ protected readonly innerDotClasses: _angular_core.Signal<string>;
27
+ protected readonly badgeClasses: _angular_core.Signal<string>;
45
28
  protected readonly titleClasses: _angular_core.Signal<string>;
46
29
  protected readonly descriptionClasses: _angular_core.Signal<string>;
47
- protected readonly contentClasses: _angular_core.Signal<string>;
48
- protected readonly iconSize: _angular_core.Signal<"18" | "14">;
30
+ protected readonly isAlternate: _angular_core.Signal<boolean>;
49
31
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ZTimelineComponent, never>;
50
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ZTimelineComponent, "z-timeline", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; "zItems": { "alias": "zItems"; "required": false; "isSignal": true; }; "zSize": { "alias": "zSize"; "required": false; "isSignal": true; }; "zTimeVariant": { "alias": "zTimeVariant"; "required": false; "isSignal": true; }; "zLineStyle": { "alias": "zLineStyle"; "required": false; "isSignal": true; }; "zIconStyle": { "alias": "zIconStyle"; "required": false; "isSignal": true; }; "zLayout": { "alias": "zLayout"; "required": false; "isSignal": true; }; "zContentStyle": { "alias": "zContentStyle"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
51
- }
52
-
53
- declare class ZTimelineClassPipe implements PipeTransform {
54
- transform(type: ZTimelineClassType, options?: ZTimelineClassOptions): string;
55
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<ZTimelineClassPipe, never>;
56
- static ɵpipe: _angular_core.ɵɵPipeDeclaration<ZTimelineClassPipe, "zTimelineClass", true>;
32
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ZTimelineComponent, "z-timeline", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; "zItems": { "alias": "zItems"; "required": false; "isSignal": true; }; "zSize": { "alias": "zSize"; "required": false; "isSignal": true; }; "zLayout": { "alias": "zLayout"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
57
33
  }
58
34
 
59
35
  declare const zTimelineVariants: (props?: ({
60
- zSize?: "default" | "sm" | "lg" | null | undefined;
61
- zLayout?: "default" | "reversed" | "alternate" | null | undefined;
36
+ zSize?: "sm" | "default" | "lg" | null | undefined;
62
37
  } & class_variance_authority_types.ClassProp) | undefined) => string;
63
- declare const zTimelineItemVariants: (props?: ({
64
- zLayout?: "default" | "reversed" | "alternate" | null | undefined;
38
+ declare const zTimelineDotVariants: (props?: ({
39
+ zSize?: "sm" | "default" | "lg" | null | undefined;
65
40
  } & class_variance_authority_types.ClassProp) | undefined) => string;
66
- declare const zTimelineHeaderVariants: (props?: ({
67
- hasIcon?: boolean | null | undefined;
68
- zColor?: "default" | "primary" | "success" | "warning" | "error" | "info" | null | undefined;
69
- zLineStyle?: "solid" | "dashed" | null | undefined;
70
- zLayout?: "default" | "reversed" | "alternate" | null | undefined;
41
+ declare const zTimelineInnerDotVariants: (props?: ({
42
+ zSize?: "sm" | "default" | "lg" | null | undefined;
71
43
  } & class_variance_authority_types.ClassProp) | undefined) => string;
72
- declare const zTimelineIconVariants: (props?: ({
73
- zColor?: "default" | "primary" | "success" | "warning" | "error" | "info" | null | undefined;
74
- zIconStyle?: "filled" | "outline" | null | undefined;
75
- zLayout?: "default" | "reversed" | "alternate" | null | undefined;
44
+ declare const zTimelineTimeBadgeVariants: (props?: ({
45
+ zSize?: "sm" | "default" | "lg" | null | undefined;
76
46
  } & class_variance_authority_types.ClassProp) | undefined) => string;
77
47
  declare const zTimelineTitleVariants: (props?: ({
78
- zSize?: "default" | "sm" | "lg" | null | undefined;
79
- } & class_variance_authority_types.ClassProp) | undefined) => string;
80
- declare const zTimelineTimeVariants: (props?: ({
81
- zVariant?: "default" | "outline" | "secondary" | "muted" | null | undefined;
82
- zLayout?: "default" | "reversed" | "alternate" | null | undefined;
48
+ zSize?: "sm" | "default" | "lg" | null | undefined;
83
49
  } & class_variance_authority_types.ClassProp) | undefined) => string;
84
50
  declare const zTimelineDescriptionVariants: (props?: ({
85
- zSize?: "default" | "sm" | "lg" | null | undefined;
86
- } & class_variance_authority_types.ClassProp) | undefined) => string;
87
- declare const zTimelineContentVariants: (props?: ({
88
- zContentStyle?: "simple" | "card" | null | undefined;
51
+ zSize?: "sm" | "default" | "lg" | null | undefined;
89
52
  } & class_variance_authority_types.ClassProp) | undefined) => string;
90
53
  type ZTimelineVariants = VariantProps<typeof zTimelineVariants>;
91
- type ZTimelineItemVariants = VariantProps<typeof zTimelineItemVariants>;
92
- type ZTimelineHeaderVariants = VariantProps<typeof zTimelineHeaderVariants>;
93
- type ZTimelineIconVariants = VariantProps<typeof zTimelineIconVariants>;
94
- type ZTimelineTimeVariants = VariantProps<typeof zTimelineTimeVariants>;
95
- type ZTimelineContentVariants = VariantProps<typeof zTimelineContentVariants>;
96
54
 
97
- export { ZTimelineClassPipe, ZTimelineComponent, zTimelineContentVariants, zTimelineDescriptionVariants, zTimelineHeaderVariants, zTimelineIconVariants, zTimelineItemVariants, zTimelineTimeVariants, zTimelineTitleVariants, zTimelineVariants };
98
- export type { ZTimelineClassOptions, ZTimelineClassType, ZTimelineContentStyle, ZTimelineContentVariants, ZTimelineHeaderVariants, ZTimelineIconStyle, ZTimelineIconVariants, ZTimelineItem, ZTimelineItemVariants, ZTimelineLayout, ZTimelineLineStyle, ZTimelineSize, ZTimelineTimeVariants, ZTimelineVariants };
55
+ export { ZTimelineComponent, zTimelineDescriptionVariants, zTimelineDotVariants, zTimelineInnerDotVariants, zTimelineTimeBadgeVariants, zTimelineTitleVariants, zTimelineVariants };
56
+ export type { ZTimelineItem, ZTimelineLayout, ZTimelineSize, ZTimelineVariants };