@shival99/z-ui 2.0.45 → 2.0.47

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.
@@ -2,18 +2,18 @@ import * as _tanstack_angular_table from '@tanstack/angular-table';
2
2
  import { RowData, RowSelectionState, HeaderContext, CellContext, FlexRenderComponent, Row, SortingState, ColumnFiltersState, PaginationState, ExpandedState, ColumnPinningState, RowPinningState, VisibilityState, ColumnOrderState, ColumnSizingState, Column, createAngularTable, Table, ColumnDef } from '@tanstack/angular-table';
3
3
  import * as _shival99_angular_virtual from '@shival99/angular-virtual';
4
4
  import * as _shival99_z_ui_components_z_input from '@shival99/z-ui/components/z-input';
5
- import { ZInputSize } from '@shival99/z-ui/components/z-input';
5
+ import { ZInputAlign, ZInputSize } from '@shival99/z-ui/components/z-input';
6
6
  import * as _angular_core from '@angular/core';
7
7
  import { TemplateRef, Type, AfterViewInit, ElementRef, OnInit } from '@angular/core';
8
8
  import { CdkDragDrop } from '@angular/cdk/drag-drop';
9
9
  import { ConnectedPosition } from '@angular/cdk/overlay';
10
- import { ZPopoverDirective } from '@shival99/z-ui/components/z-popover';
10
+ import { ZPopoverControl, ZPopoverDirective } from '@shival99/z-ui/components/z-popover';
11
11
  import { ClassValue } from 'clsx';
12
12
  import { NgScrollbar } from 'ngx-scrollbar';
13
13
  import { ZAutocompleteType, ZAutocompleteOption } from '@shival99/z-ui/components/z-autocomplete';
14
14
  import { ZButtonVariants } from '@shival99/z-ui/components/z-button';
15
15
  import { ZIcon, ZIconVariants } from '@shival99/z-ui/components/z-icon';
16
- import { ZSelectOption, ZSelectConfig } from '@shival99/z-ui/components/z-select';
16
+ import { ZSelectOption, ZSelectConfig, ZSelectMode } from '@shival99/z-ui/components/z-select';
17
17
  import * as _shival99_z_ui_components_z_tags from '@shival99/z-ui/components/z-tags';
18
18
  import { ZTagColor } from '@shival99/z-ui/components/z-tags';
19
19
  import * as _shival99_z_ui_components_z_tooltip from '@shival99/z-ui/components/z-tooltip';
@@ -147,6 +147,41 @@ interface ZTableFilterConfig<T = unknown> {
147
147
  filterOptions?: ZSelectOption[];
148
148
  }
149
149
  type ZTableEditSize = 'sm' | 'default' | 'lg';
150
+ type ZTableEditContentType = 'text' | 'number' | 'select' | 'date';
151
+ interface ZTableEditContentConfig<T = unknown> {
152
+ type?: ZTableEditContentType;
153
+ options?: unknown[] | ((row: T) => unknown[]);
154
+ placeholder?: string | ((row: T) => string);
155
+ class?: string | ((row: T) => string);
156
+ style?: Record<string, string> | ((row: T) => Record<string, string>);
157
+ size?: ZTableEditSize;
158
+ disabled?: boolean | ((row: T) => boolean);
159
+ readonly?: boolean | ((row: T) => boolean);
160
+ align?: ZInputAlign;
161
+ prefix?: string;
162
+ suffix?: string;
163
+ min?: number;
164
+ max?: number;
165
+ step?: number;
166
+ mask?: string;
167
+ decimalPlaces?: number;
168
+ allowNegative?: boolean;
169
+ thousandSeparator?: string;
170
+ decimalMarker?: '.' | ',' | ['.', ','];
171
+ optionLabelKey?: string;
172
+ optionValueKey?: string;
173
+ selectConfig?: Partial<ZSelectConfig<unknown>>;
174
+ selectMode?: ZSelectMode;
175
+ mode?: ZSelectMode;
176
+ selectShowSearch?: boolean;
177
+ selectWrap?: boolean;
178
+ maxTagCount?: number;
179
+ dateFormat?: string;
180
+ dateValueType?: 'date' | 'iso' | 'string';
181
+ minDate?: Date | null;
182
+ maxDate?: Date | null;
183
+ allowClear?: boolean;
184
+ }
150
185
  interface ZTableEditConfig<T = unknown> {
151
186
  enabled?: boolean;
152
187
  /** Edit type - can be static or dynamic per row */
@@ -260,6 +295,8 @@ interface ZTableBodyColumnConfig<T> {
260
295
  enabledClick?: boolean;
261
296
  /** Enable inline editing — true uses defaults, or pass full config */
262
297
  edit?: ZTableEditConfig<T> | boolean;
298
+ /** Cho phép sửa trực tiếp trong cell theo kiểu Excel, không render editor component. */
299
+ editContent?: ZTableEditContentConfig<T> | boolean;
263
300
  /** Control cell content visibility. When false, the cell is rendered but content is hidden. */
264
301
  visible?: boolean | ((info: CellContext<T, unknown>) => boolean);
265
302
  }
@@ -371,6 +408,54 @@ interface ZTableRowDragEvent<T> {
371
408
  currentIndex: number;
372
409
  data: T[];
373
410
  }
411
+ type ZTableRowInsertPosition = 'above' | 'below';
412
+ interface ZTableRowInsertEvent<T> {
413
+ row: T;
414
+ rowId: string;
415
+ /** Index trong row model đang hiển thị. */
416
+ rowIndex: number;
417
+ /** Index trong mảng data gốc. */
418
+ sourceIndex: number;
419
+ position: ZTableRowInsertPosition;
420
+ }
421
+ interface ZTableRowDeleteEvent<T> {
422
+ rows: T[];
423
+ rowIds: string[];
424
+ /** Index trong row model đang hiển thị. */
425
+ rowIndexes: number[];
426
+ /** Index trong mảng data gốc. */
427
+ sourceIndexes: number[];
428
+ }
429
+ interface ZTableRowCopyEvent<T> {
430
+ rows: T[];
431
+ rowIds: string[];
432
+ /** Index trong row model đang hiển thị. */
433
+ rowIndexes: number[];
434
+ /** Index trong mảng data gốc. */
435
+ sourceIndexes: number[];
436
+ }
437
+ interface ZTableRowPasteEvent<T> {
438
+ rows: T[];
439
+ targetRow: T;
440
+ targetRowId: string;
441
+ /** Index trong row model đang hiển thị. */
442
+ targetRowIndex: number;
443
+ /** Index trong mảng data gốc. */
444
+ targetSourceIndex: number;
445
+ position: ZTableRowInsertPosition;
446
+ }
447
+ type ZTableRowMoveDirection = 'up' | 'down';
448
+ interface ZTableRowMoveEvent<T> {
449
+ row: T;
450
+ rowId: string;
451
+ direction: ZTableRowMoveDirection;
452
+ /** Index trong row model đang hiển thị. */
453
+ previousIndex: number;
454
+ currentIndex: number;
455
+ /** Index trong mảng data gốc. */
456
+ previousSourceIndex: number;
457
+ currentSourceIndex: number;
458
+ }
374
459
  interface ZTableSortChangeEvent {
375
460
  sorting: SortingState;
376
461
  }
@@ -481,7 +566,7 @@ interface ZTableActionColumnConfig<T = unknown> {
481
566
  }
482
567
  type ZTableActionBodyConfig<T = unknown> = ZTableActionColumnConfig<T> | (ZTableActionList<T> & Partial<ZTableActionColumnConfig<T>>);
483
568
  /** All possible change event types — used as discriminant in ZTableChangeEvent */
484
- type ZTableChangeType = 'page' | 'sort' | 'filter' | 'search' | 'select' | 'expand' | 'rowSelect' | 'rowSelectAll' | 'rowExpand' | 'rowDrag' | 'cellClick' | 'cellEdit' | 'action' | 'bulkAction';
569
+ type ZTableChangeType = 'page' | 'sort' | 'filter' | 'search' | 'select' | 'expand' | 'rowSelect' | 'rowSelectAll' | 'rowExpand' | 'rowDrag' | 'rowInsert' | 'rowDelete' | 'rowCopy' | 'rowPaste' | 'rowMove' | 'cellClick' | 'cellEdit' | 'action' | 'bulkAction';
485
570
  interface ZTableChangeEventBase {
486
571
  type: ZTableChangeType;
487
572
  }
@@ -513,6 +598,26 @@ interface ZTableRowDragChange<T> extends ZTableChangeEventBase {
513
598
  type: 'rowDrag';
514
599
  data: ZTableRowDragEvent<T>;
515
600
  }
601
+ interface ZTableRowInsertChange<T> extends ZTableChangeEventBase {
602
+ type: 'rowInsert';
603
+ data: ZTableRowInsertEvent<T>;
604
+ }
605
+ interface ZTableRowDeleteChange<T> extends ZTableChangeEventBase {
606
+ type: 'rowDelete';
607
+ data: ZTableRowDeleteEvent<T>;
608
+ }
609
+ interface ZTableRowCopyChange<T> extends ZTableChangeEventBase {
610
+ type: 'rowCopy';
611
+ data: ZTableRowCopyEvent<T>;
612
+ }
613
+ interface ZTableRowPasteChange<T> extends ZTableChangeEventBase {
614
+ type: 'rowPaste';
615
+ data: ZTableRowPasteEvent<T>;
616
+ }
617
+ interface ZTableRowMoveChange<T> extends ZTableChangeEventBase {
618
+ type: 'rowMove';
619
+ data: ZTableRowMoveEvent<T>;
620
+ }
516
621
  interface ZTableCellClickChange<T> extends ZTableChangeEventBase {
517
622
  type: 'cellClick';
518
623
  data: ZTableCellClickEvent<T>;
@@ -558,7 +663,7 @@ interface ZTableCellEditChange<T> extends ZTableChangeEventBase {
558
663
  * }
559
664
  * ```
560
665
  */
561
- type ZTableChangeEvent<T> = ZTablePageChange | ZTableSortChange | ZTableFilterChange | ZTableSearchChange | ZTableSelectChange | ZTableExpandChange | ZTableRowSelectChange<T> | ZTableRowSelectAllChange<T> | ZTableRowExpandChange<T> | ZTableRowDragChange<T> | ZTableCellClickChange<T> | ZTableCellEditChange<T> | ZTableActionChange<T> | ZTableBulkActionChange<T>;
666
+ type ZTableChangeEvent<T> = ZTablePageChange | ZTableSortChange | ZTableFilterChange | ZTableSearchChange | ZTableSelectChange | ZTableExpandChange | ZTableRowSelectChange<T> | ZTableRowSelectAllChange<T> | ZTableRowExpandChange<T> | ZTableRowDragChange<T> | ZTableRowInsertChange<T> | ZTableRowDeleteChange<T> | ZTableRowCopyChange<T> | ZTableRowPasteChange<T> | ZTableRowMoveChange<T> | ZTableCellClickChange<T> | ZTableCellEditChange<T> | ZTableActionChange<T> | ZTableBulkActionChange<T>;
562
667
  /** Initial table state — applied on first render, before any cached config is loaded */
563
668
  interface ZTableInitialState {
564
669
  columnPinning?: ColumnPinningState;
@@ -683,12 +788,16 @@ interface ZTableConfig<T> {
683
788
  /** Show the settings drawer toggle button */
684
789
  enableSettings?: boolean;
685
790
  enableColumnResizing?: boolean;
791
+ /** Giữ kích thước cột ban đầu và chỉ kéo giãn cột dữ liệu cuối để lấp đầy bảng. */
792
+ fitContentWidth?: boolean;
686
793
  /** When true, shift-click sorting is simulated automatically */
687
794
  enableMultiSort?: boolean;
688
795
  /** true = enable with defaults; object = full search bar config */
689
796
  search?: ZTableSearchConfig | boolean;
690
797
  /** Floating bulk action bar shown when rows are selected */
691
798
  bulkAction?: ZTableBulkActionConfig<T> | boolean;
799
+ /** Bật menu chuột phải để chèn dòng khi bảng có cell editContent. */
800
+ enableContentRowInsert?: boolean;
692
801
  enableRowPinning?: boolean;
693
802
  enableColumnPinning?: boolean;
694
803
  enableColumnOrdering?: boolean;
@@ -700,6 +809,8 @@ interface ZTableConfig<T> {
700
809
  expandedRowTemplate?: TemplateRef<{
701
810
  $implicit: Row<T>;
702
811
  }>;
812
+ /** Render z-table con độc lập khi dòng mở rộng không dùng custom template. */
813
+ subTableConfig?: ZTableConfig<unknown> | ((row: Row<T>) => ZTableConfig<unknown> | undefined);
703
814
  /** Template rendered when no data matches */
704
815
  emptyTemplate?: TemplateRef<void>;
705
816
  /** Template rendered during loading state */
@@ -774,6 +885,8 @@ declare class ZTableComponent<T> implements AfterViewInit {
774
885
  readonly zVariant: _angular_core.InputSignal<"default" | "borderless">;
775
886
  private readonly _destroy$;
776
887
  private readonly _dragService;
888
+ private readonly _host;
889
+ private readonly _document;
777
890
  private readonly _zExcel;
778
891
  private readonly _zTranslate;
779
892
  /** Prevents recursive scroll sync between thead/tbody/tfoot */
@@ -789,6 +902,8 @@ declare class ZTableComponent<T> implements AfterViewInit {
789
902
  private _filterEmitDebounceTimeout;
790
903
  /** Keeps the bulk bar mounted long enough for its exit animation */
791
904
  private _bulkBarTimer;
905
+ private _contentRowMenuOutsideTimer;
906
+ private _contentRowMenuOutsideCleanup;
792
907
  private readonly _activeColumnVisibilityPopover;
793
908
  private _hasInitializedColumnPinning;
794
909
  private _isFitColumnScheduled;
@@ -812,6 +927,17 @@ declare class ZTableComponent<T> implements AfterViewInit {
812
927
  protected readonly rowPinning: _angular_core.WritableSignal<RowPinningState>;
813
928
  protected readonly columnFilters: _angular_core.WritableSignal<ColumnFiltersState>;
814
929
  protected readonly globalFilter: _angular_core.WritableSignal<string>;
930
+ protected readonly activeContentEditCell: _angular_core.WritableSignal<{
931
+ rowId: string;
932
+ columnId: string;
933
+ } | null>;
934
+ protected readonly contentRowMenu: _angular_core.WritableSignal<{
935
+ row: Row<T>;
936
+ left: number;
937
+ top: number;
938
+ } | null>;
939
+ protected readonly contentRowMenuControl: _angular_core.WritableSignal<ZPopoverControl | null>;
940
+ protected readonly contentRowClipboard: _angular_core.WritableSignal<T[]>;
815
941
  protected readonly columnSizingState: _angular_core.WritableSignal<ColumnSizingState>;
816
942
  private readonly _columnBaseSizing;
817
943
  /** Note: pageIndex is 1-based here; converted to 0-based for TanStack via _tanstackPagination */
@@ -876,6 +1002,11 @@ declare class ZTableComponent<T> implements AfterViewInit {
876
1002
  protected readonly hasSelectColumn: _angular_core.Signal<boolean>;
877
1003
  protected readonly hasExpandColumn: _angular_core.Signal<boolean>;
878
1004
  protected readonly hasRowDragColumn: _angular_core.Signal<boolean>;
1005
+ protected readonly hasContentEditableColumns: _angular_core.Signal<boolean>;
1006
+ protected readonly canUseContentRowInsert: _angular_core.Signal<boolean>;
1007
+ protected readonly contentRowDeleteCount: _angular_core.Signal<number>;
1008
+ protected readonly canMoveContentRowUp: _angular_core.Signal<boolean>;
1009
+ protected readonly canMoveContentRowDown: _angular_core.Signal<boolean>;
879
1010
  protected readonly canUseRowDrag: _angular_core.Signal<boolean>;
880
1011
  protected readonly isVirtualRowDragEnabled: _angular_core.Signal<boolean>;
881
1012
  protected readonly isRowDragEnabled: _angular_core.Signal<boolean>;
@@ -1001,6 +1132,7 @@ declare class ZTableComponent<T> implements AfterViewInit {
1001
1132
  private _getExcelColumnHeader;
1002
1133
  private _getExcelColumnHeaderAlign;
1003
1134
  private _clearBulkBarTimer;
1135
+ private _clearContentRowMenuOutsideListener;
1004
1136
  /**
1005
1137
  * Wraps state mutations with a debounced processing indicator.
1006
1138
  * Shows a brief loading state to prevent UI flicker during
@@ -1041,8 +1173,35 @@ declare class ZTableComponent<T> implements AfterViewInit {
1041
1173
  onSearchChange(value: string | number | null): void;
1042
1174
  toggleHeaderFooterShadow(): void;
1043
1175
  onActionClick(event: ZTableActionClickEvent<T>): void;
1176
+ protected setContentRowMenuControl(control: ZPopoverControl): void;
1177
+ protected clearContentRowMenu(): void;
1178
+ protected openContentRowMenu(event: MouseEvent, row: Row<T>): void;
1179
+ protected insertContentRow(position: ZTableRowInsertPosition): void;
1180
+ protected deleteContentRows(): void;
1181
+ private _removeDeletedRowsFromSelection;
1182
+ protected onContentTableKeydown(event: KeyboardEvent): void;
1183
+ protected copyContentRows(rowId?: string): void;
1184
+ protected pasteContentRows(position: ZTableRowInsertPosition, rowId?: string): void;
1185
+ protected moveContentRow(direction: ZTableRowMoveDirection): void;
1186
+ private _getContentRowsToDelete;
1187
+ private _getRowSourceIndex;
1188
+ private _getRowVisibleIndex;
1189
+ private _getContentRowsForRowAction;
1190
+ private _getContentRowActionTarget;
1191
+ private _isEditableKeyboardTarget;
1192
+ private _getContentEditTriggerTarget;
1193
+ private _clearContentEditCell;
1194
+ private _listenContentRowMenuOutside;
1044
1195
  onCellClick(row: Row<T>, columnId: string, value: unknown): void;
1045
1196
  onCellEdit(event: ZTableEditCellChangeEvent<T>): void;
1197
+ onContentEditStart(event: MouseEvent, rowId: string, columnId: string): void;
1198
+ onContentEditKeydown(event: KeyboardEvent, rowId: string, columnId: string): void;
1199
+ onContentEditCommit(newValue: unknown, row: Row<T>, columnId: string, oldValue: unknown): void;
1200
+ onContentEditCancel(): void;
1201
+ private _getContentEditDirection;
1202
+ private _findContentEditTarget;
1203
+ private _findHorizontalContentEditTarget;
1204
+ private _restoreContentEditFocus;
1046
1205
  openSettingsDrawer(): void;
1047
1206
  onPendingColumnDrop(event: CdkDragDrop<string[]>): void;
1048
1207
  onVisibleColumnsChange(values: (string | number)[]): void;
@@ -1071,6 +1230,7 @@ declare class ZTableComponent<T> implements AfterViewInit {
1071
1230
  private _collectColumnInfo;
1072
1231
  /** Loads cached config from ZCacheService; validates schema compatibility first */
1073
1232
  private _loadConfigCache;
1233
+ private _getConfigCacheKey;
1074
1234
  /**
1075
1235
  * Validates cached column info against current config.
1076
1236
  * Returns false if columns have been added/removed/renamed since cache was saved,
@@ -1193,7 +1353,7 @@ declare class ZTableActionsComponent<T = unknown> {
1193
1353
  readonly zConfig: _angular_core.InputSignal<ZTableActionColumnConfig<T>>;
1194
1354
  readonly zRow: _angular_core.InputSignal<T>;
1195
1355
  readonly zRowId: _angular_core.InputSignal<string>;
1196
- readonly zDropdownButtonSize: _angular_core.InputSignal<"default" | "sm" | "lg" | "xs" | "xl" | null | undefined>;
1356
+ readonly zDropdownButtonSize: _angular_core.InputSignal<"sm" | "default" | "lg" | "xs" | "xl" | null | undefined>;
1197
1357
  readonly zActionClick: _angular_core.OutputEmitterRef<ZTableActionClickEvent<T>>;
1198
1358
  protected readonly allActions: _angular_core.Signal<ZTableActionItem<T>[]>;
1199
1359
  protected readonly shouldShowAsButtons: _angular_core.Signal<boolean>;
@@ -1347,4 +1507,4 @@ declare const findColumnConfig: <T>(columnId: string, columns: ZTableColumnConfi
1347
1507
  declare function columnConfigToColumnDef<T>(config: ZTableColumnConfig<T>): ColumnDef<T>;
1348
1508
 
1349
1509
  export { ZTableActionsComponent, ZTableComponent, ZTableEditCellComponent, ZTableFilterComponent, ZTableIconTextComponent, columnConfigToColumnDef, findColumnConfig, getBodyConfig, getFooterConfig, getHeaderConfig, isBodyConfig, isFooterConfig, isHeaderConfig };
1350
- export type { ZTableActionBodyConfig, ZTableActionClickEvent, ZTableActionColumnConfig, ZTableActionItem, ZTableActionList, ZTableAdvancedFilterType, ZTableBodyContentType, ZTableBulkActionClickEvent, ZTableBulkActionConfig, ZTableBulkActionContext, ZTableBulkActionHandlerContext, ZTableBulkActionItem, ZTableBulkActionList, ZTableBulkActionOptions, ZTableBulkActionViewItem, ZTableCellEditChange, ZTableCellEditEvent, ZTableChangeEvent, ZTableColumn, ZTableColumnConfig, ZTableConfig, ZTableControl, ZTableEditCellChangeEvent, ZTableEditConfig, ZTableEditSize, ZTableEditType, ZTableExcelExportConfig, ZTableExcelExportContext, ZTableExcelExportScope, ZTableFilterChangeEvent, ZTableFilterCondition, ZTableFilterConfig, ZTableFilterJoinOperator, ZTableFilterOperator, ZTableFilterOptionSource, ZTableFilterUi, ZTableFilterValueType, ZTablePageChangeEvent, ZTablePaginationConfig, ZTableRowExpandEvent, ZTableRowSelectEvent, ZTableSearchChangeEvent, ZTableSearchConfig, ZTableSortChangeEvent, ZTableSortConfig, ZTableTagColor };
1510
+ export type { ZTableActionBodyConfig, ZTableActionClickEvent, ZTableActionColumnConfig, ZTableActionItem, ZTableActionList, ZTableAdvancedFilterType, ZTableBodyContentType, ZTableBulkActionClickEvent, ZTableBulkActionConfig, ZTableBulkActionContext, ZTableBulkActionHandlerContext, ZTableBulkActionItem, ZTableBulkActionList, ZTableBulkActionOptions, ZTableBulkActionViewItem, ZTableCellEditChange, ZTableCellEditEvent, ZTableChangeEvent, ZTableColumn, ZTableColumnConfig, ZTableConfig, ZTableControl, ZTableEditCellChangeEvent, ZTableEditConfig, ZTableEditContentConfig, ZTableEditContentType, ZTableEditSize, ZTableEditType, ZTableExcelExportConfig, ZTableExcelExportContext, ZTableExcelExportScope, ZTableFilterChangeEvent, ZTableFilterCondition, ZTableFilterConfig, ZTableFilterJoinOperator, ZTableFilterOperator, ZTableFilterOptionSource, ZTableFilterUi, ZTableFilterValueType, ZTablePageChangeEvent, ZTablePaginationConfig, ZTableRowCopyChange, ZTableRowCopyEvent, ZTableRowDeleteChange, ZTableRowDeleteEvent, ZTableRowExpandEvent, ZTableRowInsertChange, ZTableRowInsertEvent, ZTableRowInsertPosition, ZTableRowMoveChange, ZTableRowMoveDirection, ZTableRowMoveEvent, ZTableRowPasteChange, ZTableRowPasteEvent, ZTableRowSelectEvent, ZTableSearchChangeEvent, ZTableSearchConfig, ZTableSortChangeEvent, ZTableSortConfig, ZTableTagColor };