@toolbox-web/grid-angular 0.12.1 → 0.13.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.
@@ -1,8 +1,8 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { Type, EnvironmentInjector, ApplicationRef, ViewContainerRef, InjectionToken, EnvironmentProviders, Signal, TemplateRef, EventEmitter, OnInit, OnDestroy, AfterContentInit } from '@angular/core';
3
- import { GridConfig as GridConfig$1, ColumnConfig as ColumnConfig$1, FrameworkAdapter, TypeDefault as TypeDefault$1, ColumnViewRenderer, ColumnEditorSpec, GridIcons, DataGridElement, ExpandCollapseAnimation, CellClickDetail, RowClickDetail, CellActivateDetail, CellChangeDetail, SortChangeDetail, ColumnResizeDetail, GridColumnState } from '@toolbox-web/grid';
3
+ import { GridConfig as GridConfig$1, ColumnConfig as ColumnConfig$1, FrameworkAdapter, TypeDefault as TypeDefault$1, ColumnViewRenderer, ColumnEditorSpec, GridIcons, DataGridElement, ExpandCollapseAnimation, FitMode, CellClickDetail, RowClickDetail, CellActivateDetail, CellChangeDetail, SortChangeDetail, ColumnResizeDetail, GridColumnState } from '@toolbox-web/grid';
4
4
  import { FilterPanelRenderer, FilterPanelParams } from '@toolbox-web/grid/plugins/filtering';
5
- import { AbstractControl, FormArray, FormGroup } from '@angular/forms';
5
+ import { AbstractControl, ControlValueAccessor, FormGroup, FormArray } from '@angular/forms';
6
6
  import { EditingConfig, ChangedRowsResetDetail } from '@toolbox-web/grid/plugins/editing';
7
7
  import { SelectionConfig, ClipboardConfig, ContextMenuConfig, MultiSortConfig, FilterConfig, ReorderConfig, VisibilityConfig, GroupingColumnsConfig, ColumnVirtualizationConfig, RowReorderConfig, GroupingRowsConfig, PinnedRowsConfig, TreeConfig, MasterDetailConfig, ResponsivePluginConfig, UndoRedoConfig, ExportConfig, PrintConfig, PivotConfig, ServerSideConfig, FilterChangeDetail, ColumnMoveDetail, ColumnVisibilityDetail, SelectionChangeDetail, RowMoveDetail, GroupToggleDetail, TreeExpandDetail, DetailExpandDetail, ResponsiveChangeDetail, CopyDetail, PasteDetail, UndoRedoDetail, ExportCompleteDetail, PrintStartDetail, PrintCompleteDetail } from '@toolbox-web/grid/all';
8
8
 
@@ -989,6 +989,99 @@ declare function createPluginFromFeature<TConfig = unknown>(name: FeatureName, c
989
989
  */
990
990
  declare function clearFeatureRegistry(): void;
991
991
 
992
+ /**
993
+ * Base class for Angular filter panel components.
994
+ *
995
+ * Provides a ready-made `params` input and common lifecycle helpers
996
+ * (`applyAndClose`, `clearAndClose`) so consumers only need to implement
997
+ * their filter logic in `applyFilter()`.
998
+ *
999
+ * ## Usage
1000
+ *
1001
+ * ```typescript
1002
+ * import { Component } from '@angular/core';
1003
+ * import { BaseFilterPanel } from '@toolbox-web/grid-angular';
1004
+ *
1005
+ * @Component({
1006
+ * selector: 'app-text-filter',
1007
+ * template: `
1008
+ * <input #input (keydown.enter)="applyAndClose()" />
1009
+ * <button (click)="applyAndClose()">Apply</button>
1010
+ * <button (click)="clearAndClose()">Clear</button>
1011
+ * `
1012
+ * })
1013
+ * export class TextFilterComponent extends BaseFilterPanel {
1014
+ * @ViewChild('input') input!: ElementRef<HTMLInputElement>;
1015
+ *
1016
+ * applyFilter(): void {
1017
+ * this.params().applyTextFilter('contains', this.input.nativeElement.value);
1018
+ * }
1019
+ * }
1020
+ * ```
1021
+ *
1022
+ * ## Template Syntax
1023
+ *
1024
+ * The grid's filtering plugin will mount this component and provide `params`
1025
+ * automatically. No manual wiring is required:
1026
+ *
1027
+ * ```typescript
1028
+ * gridConfig = {
1029
+ * columns: [
1030
+ * { field: 'name', filterable: true, filterPanel: TextFilterComponent },
1031
+ * ],
1032
+ * };
1033
+ * ```
1034
+ *
1035
+ * @typeParam TRow - The row data type (available via `params().column`)
1036
+ */
1037
+ declare abstract class BaseFilterPanel implements FilterPanel {
1038
+ /**
1039
+ * Filter panel parameters injected by the grid's filtering plugin.
1040
+ *
1041
+ * Provides access to:
1042
+ * - `field` — the column field name
1043
+ * - `column` — full column configuration
1044
+ * - `uniqueValues` — distinct values in the column
1045
+ * - `excludedValues` — currently excluded values (set filter)
1046
+ * - `searchText` — current search text
1047
+ * - `applySetFilter(excluded)` — apply a set-based (include/exclude) filter
1048
+ * - `applyTextFilter(operator, value, valueTo?)` — apply a text/number filter
1049
+ * - `clearFilter()` — clear the filter for this column
1050
+ * - `closePanel()` — close the filter panel
1051
+ */
1052
+ readonly params: _angular_core.InputSignal<FilterPanelParams>;
1053
+ /**
1054
+ * Implement this to apply your filter logic.
1055
+ *
1056
+ * Called by {@link applyAndClose} before closing the panel.
1057
+ * Use `this.params()` to access the filter API.
1058
+ *
1059
+ * @example
1060
+ * ```typescript
1061
+ * applyFilter(): void {
1062
+ * this.params().applyTextFilter('contains', this.searchText);
1063
+ * }
1064
+ * ```
1065
+ */
1066
+ abstract applyFilter(): void;
1067
+ /**
1068
+ * Apply the filter then close the panel.
1069
+ *
1070
+ * Calls {@link applyFilter} followed by `params().closePanel()`.
1071
+ * Bind this to your "Apply" button or Enter key handler.
1072
+ */
1073
+ applyAndClose(): void;
1074
+ /**
1075
+ * Clear the filter then close the panel.
1076
+ *
1077
+ * Calls `params().clearFilter()` followed by `params().closePanel()`.
1078
+ * Bind this to your "Clear" / "Reset" button.
1079
+ */
1080
+ clearAndClose(): void;
1081
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BaseFilterPanel, never>;
1082
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BaseFilterPanel, never, never, { "params": { "alias": "params"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1083
+ }
1084
+
992
1085
  /**
993
1086
  * Base class for grid cell editors.
994
1087
  *
@@ -1160,6 +1253,329 @@ declare abstract class BaseGridEditor<TRow = unknown, TValue = unknown> {
1160
1253
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BaseGridEditor<any, any>, never, never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "row": { "alias": "row"; "required": false; "isSignal": true; }; "column": { "alias": "column"; "required": false; "isSignal": true; }; "control": { "alias": "control"; "required": false; "isSignal": true; }; }, { "commit": "commit"; "cancel": "cancel"; }, never, never, true, never>;
1161
1254
  }
1162
1255
 
1256
+ /**
1257
+ * Base class for grid editors that also work as Angular form controls.
1258
+ *
1259
+ * Combines `BaseGridEditor` with `ControlValueAccessor` so the same component
1260
+ * can be used inside a `<tbw-grid>` **and** in a standalone `<form>`.
1261
+ *
1262
+ * ## What it provides
1263
+ *
1264
+ * | Member | Purpose |
1265
+ * |--------|---------|
1266
+ * | `cvaValue` | Signal holding the value written by the form control |
1267
+ * | `disabledState` | Signal tracking `setDisabledState` calls |
1268
+ * | `displayValue` | Computed that prefers grid value (`currentValue`) and falls back to `cvaValue` |
1269
+ * | `commitBoth(v)` | Commits via both CVA `onChange` and grid `commitValue` |
1270
+ * | `writeValue` / `registerOn*` / `setDisabledState` | Full CVA implementation |
1271
+ *
1272
+ * ## Usage
1273
+ *
1274
+ * ```typescript
1275
+ * import { Component, forwardRef } from '@angular/core';
1276
+ * import { NG_VALUE_ACCESSOR } from '@angular/forms';
1277
+ * import { BaseGridEditorCVA } from '@toolbox-web/grid-angular';
1278
+ *
1279
+ * @Component({
1280
+ * selector: 'app-date-picker',
1281
+ * providers: [{
1282
+ * provide: NG_VALUE_ACCESSOR,
1283
+ * useExisting: forwardRef(() => DatePickerComponent),
1284
+ * multi: true,
1285
+ * }],
1286
+ * template: `
1287
+ * <input
1288
+ * type="date"
1289
+ * [value]="displayValue()"
1290
+ * [disabled]="disabledState()"
1291
+ * (change)="commitBoth($event.target.value)"
1292
+ * (keydown.escape)="cancelEdit()"
1293
+ * />
1294
+ * `
1295
+ * })
1296
+ * export class DatePickerComponent extends BaseGridEditorCVA<MyRow, string> {}
1297
+ * ```
1298
+ *
1299
+ * > **Note:** Subclasses must still provide `NG_VALUE_ACCESSOR` themselves
1300
+ * > because `forwardRef(() => ConcreteClass)` must reference the concrete
1301
+ * > component — this is an Angular limitation.
1302
+ *
1303
+ * @typeParam TRow - The row data type
1304
+ * @typeParam TValue - The cell/control value type
1305
+ */
1306
+ declare abstract class BaseGridEditorCVA<TRow = unknown, TValue = unknown> extends BaseGridEditor<TRow, TValue> implements ControlValueAccessor {
1307
+ /** Internal onChange callback registered by the form control. */
1308
+ private _onChange;
1309
+ /** Internal onTouched callback registered by the form control. */
1310
+ private _onTouched;
1311
+ /**
1312
+ * Signal holding the value written by the form control via `writeValue()`.
1313
+ * Updated when the form control pushes a new value (e.g. `patchValue`, `setValue`).
1314
+ */
1315
+ protected readonly cvaValue: _angular_core.WritableSignal<TValue | null>;
1316
+ /**
1317
+ * Signal tracking the disabled state set by the form control.
1318
+ * Updated when `setDisabledState()` is called by Angular's forms module.
1319
+ */
1320
+ readonly disabledState: _angular_core.WritableSignal<boolean>;
1321
+ /**
1322
+ * Resolved display value.
1323
+ *
1324
+ * Prefers `currentValue()` (grid context — from `control.value` or `value` input)
1325
+ * and falls back to `cvaValue()` (standalone form context — from `writeValue`).
1326
+ *
1327
+ * Use this in your template instead of reading `currentValue()` directly
1328
+ * so the component works in both grid and standalone form contexts.
1329
+ */
1330
+ readonly displayValue: _angular_core.Signal<TValue | null>;
1331
+ /**
1332
+ * Called by Angular forms when the form control value changes programmatically.
1333
+ */
1334
+ writeValue(value: TValue | null): void;
1335
+ /**
1336
+ * Called by Angular forms to register a change callback.
1337
+ */
1338
+ registerOnChange(fn: (value: TValue | null) => void): void;
1339
+ /**
1340
+ * Called by Angular forms to register a touched callback.
1341
+ */
1342
+ registerOnTouched(fn: () => void): void;
1343
+ /**
1344
+ * Called by Angular forms to set the disabled state.
1345
+ */
1346
+ setDisabledState(isDisabled: boolean): void;
1347
+ /**
1348
+ * Commit a value through both the CVA (form control) and the grid.
1349
+ *
1350
+ * - Calls the CVA `onChange` callback (updates the form control)
1351
+ * - Marks the control as touched
1352
+ * - Calls `commitValue()` (emits grid commit event + DOM `CustomEvent`)
1353
+ *
1354
+ * Use this instead of `commitValue()` when your editor doubles as a form control.
1355
+ *
1356
+ * @param value - The new value to commit
1357
+ */
1358
+ protected commitBoth(value: TValue | null): void;
1359
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BaseGridEditorCVA<any, any>, never>;
1360
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BaseGridEditorCVA<any, any>, never, never, {}, {}, never, never, true, never>;
1361
+ }
1362
+
1363
+ /**
1364
+ * Position of the overlay panel relative to its anchor cell.
1365
+ *
1366
+ * - `'below'` — panel appears below the cell, left-aligned (default)
1367
+ * - `'above'` — panel appears above the cell, left-aligned
1368
+ * - `'below-right'` — panel appears below the cell, right-aligned
1369
+ * - `'over-left'` — panel covers the cell, left-aligned
1370
+ */
1371
+ type OverlayPosition = 'below' | 'above' | 'below-right' | 'over-left';
1372
+ /**
1373
+ * Base class for grid editors that display a floating overlay panel.
1374
+ *
1375
+ * Provides infrastructure for:
1376
+ * - **Overlay positioning** — CSS Anchor Positioning with JS fallback
1377
+ * - **Focus gating** — in row editing mode, the panel only opens for the focused cell
1378
+ * - **Click-outside detection** — closes the panel when clicking outside
1379
+ * - **MutationObserver** — detects cell focus changes (row editing mode)
1380
+ * - **Escape handling** — closes the panel and returns focus to the inline input
1381
+ * - **Synthetic Tab dispatch** — advances grid focus after overlay close
1382
+ * - **Automatic teardown** — removes the panel from `<body>` and cleans up listeners
1383
+ *
1384
+ * ## Usage
1385
+ *
1386
+ * ```typescript
1387
+ * import { Component, ViewChild, ElementRef } from '@angular/core';
1388
+ * import { BaseOverlayEditor } from '@toolbox-web/grid-angular';
1389
+ *
1390
+ * @Component({
1391
+ * selector: 'app-date-editor',
1392
+ * template: `
1393
+ * <input
1394
+ * #inlineInput
1395
+ * readonly
1396
+ * [value]="currentValue()"
1397
+ * (click)="onInlineClick()"
1398
+ * (keydown)="onInlineKeydown($event)"
1399
+ * />
1400
+ * <div #panel class="tbw-overlay-panel" style="width: 280px;">
1401
+ * <!-- your date picker UI here -->
1402
+ * <div class="actions">
1403
+ * <button (click)="selectAndClose(selectedDate)">OK</button>
1404
+ * <button (click)="hideOverlay()">Cancel</button>
1405
+ * </div>
1406
+ * </div>
1407
+ * `
1408
+ * })
1409
+ * export class DateEditorComponent extends BaseOverlayEditor<MyRow, string> {
1410
+ * @ViewChild('panel') panelRef!: ElementRef<HTMLElement>;
1411
+ * @ViewChild('inlineInput') inputRef!: ElementRef<HTMLInputElement>;
1412
+ *
1413
+ * protected override overlayPosition = 'below' as const;
1414
+ *
1415
+ * ngAfterViewInit(): void {
1416
+ * this.initOverlay(this.panelRef.nativeElement);
1417
+ * if (this.isCellFocused()) this.showOverlay();
1418
+ * }
1419
+ *
1420
+ * protected getInlineInput(): HTMLInputElement | null {
1421
+ * return this.inputRef?.nativeElement ?? null;
1422
+ * }
1423
+ *
1424
+ * protected onOverlayOutsideClick(): void {
1425
+ * this.hideOverlay();
1426
+ * }
1427
+ *
1428
+ * selectAndClose(date: string): void {
1429
+ * this.commitValue(date);
1430
+ * this.hideOverlay();
1431
+ * }
1432
+ * }
1433
+ * ```
1434
+ *
1435
+ * @typeParam TRow - The row data type
1436
+ * @typeParam TValue - The cell value type
1437
+ */
1438
+ declare abstract class BaseOverlayEditor<TRow = unknown, TValue = unknown> extends BaseGridEditor<TRow, TValue> {
1439
+ private readonly _elementRef;
1440
+ private readonly _overlayDestroyRef;
1441
+ /**
1442
+ * Position of the overlay panel relative to the anchor cell.
1443
+ * Override in subclasses to change the default position.
1444
+ *
1445
+ * @default 'below'
1446
+ */
1447
+ protected overlayPosition: OverlayPosition;
1448
+ /** The overlay panel element (set via `initOverlay()`). */
1449
+ private _panel;
1450
+ /** Whether the overlay is currently visible. */
1451
+ private _isOpen;
1452
+ /** Unique anchor ID for CSS Anchor Positioning. */
1453
+ private _anchorId;
1454
+ /** Whether the browser supports CSS Anchor Positioning. */
1455
+ private _supportsAnchor;
1456
+ /** AbortController for all overlay-related listeners. */
1457
+ private _abortCtrl;
1458
+ /** MutationObserver watching cell focus class changes. */
1459
+ private _focusObserver;
1460
+ constructor();
1461
+ /**
1462
+ * Initialise the overlay with the panel element.
1463
+ *
1464
+ * Call this in `ngAfterViewInit` with your `@ViewChild` panel reference.
1465
+ * The panel is moved to `<body>` and hidden until {@link showOverlay} is called.
1466
+ *
1467
+ * @param panel - The overlay panel DOM element
1468
+ */
1469
+ protected initOverlay(panel: HTMLElement): void;
1470
+ /**
1471
+ * Show the overlay panel.
1472
+ *
1473
+ * If CSS Anchor Positioning is not supported, falls back to JS-based
1474
+ * positioning using `getBoundingClientRect()`.
1475
+ */
1476
+ protected showOverlay(): void;
1477
+ /**
1478
+ * Hide the overlay panel.
1479
+ *
1480
+ * @param suppressTabAdvance - When `true`, skip synthetic Tab dispatch
1481
+ * (useful when hiding is triggered by an external focus change).
1482
+ */
1483
+ protected hideOverlay(suppressTabAdvance?: boolean): void;
1484
+ /**
1485
+ * Close and immediately re-open the overlay.
1486
+ * Useful after the panel content changes size and needs repositioning.
1487
+ */
1488
+ protected reopenOverlay(): void;
1489
+ /**
1490
+ * Remove the overlay from the DOM and clean up all listeners.
1491
+ *
1492
+ * Called automatically on `DestroyRef.onDestroy`. Can also be called
1493
+ * manually if the editor needs early cleanup.
1494
+ */
1495
+ protected teardownOverlay(): void;
1496
+ /**
1497
+ * Override in `edit-close` handler to also hide the overlay.
1498
+ * This is called automatically by `BaseGridEditor` when the grid
1499
+ * ends the editing session.
1500
+ */
1501
+ protected onEditClose(): void;
1502
+ /**
1503
+ * Keydown handler for the inline readonly input.
1504
+ *
1505
+ * - **Enter / Space / ArrowDown / F2** → open overlay
1506
+ * - **Escape** → calls {@link handleEscape}
1507
+ *
1508
+ * Bind this to `(keydown)` on your inline input element.
1509
+ */
1510
+ onInlineKeydown(event: KeyboardEvent): void;
1511
+ /**
1512
+ * Click handler for the inline input.
1513
+ * Opens the overlay and calls {@link onOverlayOpened}.
1514
+ *
1515
+ * Bind this to `(click)` on your inline input element.
1516
+ */
1517
+ onInlineClick(): void;
1518
+ /**
1519
+ * Handle Escape key press.
1520
+ *
1521
+ * If the overlay is open, closes it and returns focus to the inline input.
1522
+ * If the overlay is already closed, cancels the edit entirely.
1523
+ */
1524
+ protected handleEscape(event: Event): void;
1525
+ /**
1526
+ * Dispatch a synthetic Tab key event to advance grid focus.
1527
+ *
1528
+ * Call this after committing a value and closing the overlay so the
1529
+ * grid moves focus to the next cell.
1530
+ *
1531
+ * @param backward - When `true`, dispatch Shift+Tab to move backwards.
1532
+ */
1533
+ protected advanceGridFocus(backward?: boolean): void;
1534
+ /**
1535
+ * Return the inline input element, if any.
1536
+ *
1537
+ * Used by overlay infrastructure to return focus after hiding.
1538
+ * Return `null` if there is no inline input.
1539
+ */
1540
+ protected abstract getInlineInput(): HTMLInputElement | null;
1541
+ /**
1542
+ * Called when a pointerdown event occurs outside the overlay panel
1543
+ * and outside the editor's host element.
1544
+ *
1545
+ * Typically, subclasses call `hideOverlay()` here.
1546
+ */
1547
+ protected abstract onOverlayOutsideClick(): void;
1548
+ /**
1549
+ * Called after the overlay is shown.
1550
+ *
1551
+ * Override to focus an element inside the panel, start animations, etc.
1552
+ * Default implementation is a no-op.
1553
+ */
1554
+ protected onOverlayOpened(): void;
1555
+ /** Find the parent cell element for this editor. */
1556
+ private _getCell;
1557
+ /**
1558
+ * JS fallback positioning for browsers without CSS Anchor Positioning.
1559
+ * Uses `getBoundingClientRect()` with viewport overflow detection.
1560
+ */
1561
+ private _positionWithJs;
1562
+ /**
1563
+ * Document pointerdown handler for click-outside detection.
1564
+ * Fires `onOverlayOutsideClick()` if the click is outside the panel
1565
+ * and outside the editor's host element.
1566
+ */
1567
+ private _onDocumentPointerDown;
1568
+ /**
1569
+ * Set up a MutationObserver on the parent cell to watch for
1570
+ * `cell-focus` class changes. This handles row-editing mode where
1571
+ * all editors exist simultaneously but only the focused cell's
1572
+ * editor should have its overlay visible.
1573
+ */
1574
+ private _setupFocusObserver;
1575
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BaseOverlayEditor<any, any>, never>;
1576
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BaseOverlayEditor<any, any>, never, never, {}, {}, never, never, true, never>;
1577
+ }
1578
+
1163
1579
  /**
1164
1580
  * Context object passed to the cell editor template.
1165
1581
  * Contains the cell value, row data, column configuration, and commit/cancel functions.
@@ -1350,6 +1766,39 @@ declare class GridColumnView {
1350
1766
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<GridColumnView, "tbw-grid-column-view", never, {}, {}, ["template"], never, true, never>;
1351
1767
  }
1352
1768
 
1769
+ /**
1770
+ * Directive that registers `<tbw-grid-column>` as a known Angular element.
1771
+ *
1772
+ * This directive exists so that Angular's template compiler recognises
1773
+ * `<tbw-grid-column>` without requiring `CUSTOM_ELEMENTS_SCHEMA`.
1774
+ * The underlying web component reads its attributes (`field`, `header`,
1775
+ * `type`, `width`, etc.) directly from the DOM, so no `@Input()` forwarding
1776
+ * is needed — Angular's standard property/attribute binding handles it.
1777
+ *
1778
+ * ## Usage
1779
+ *
1780
+ * ```typescript
1781
+ * import { Component } from '@angular/core';
1782
+ * import { Grid, TbwGridColumn, TbwRenderer } from '@toolbox-web/grid-angular';
1783
+ *
1784
+ * @Component({
1785
+ * imports: [Grid, TbwGridColumn, TbwRenderer],
1786
+ * template: `
1787
+ * <tbw-grid [rows]="rows" [gridConfig]="config">
1788
+ * <tbw-grid-column field="status">
1789
+ * <app-status-badge *tbwRenderer="let value" [value]="value" />
1790
+ * </tbw-grid-column>
1791
+ * </tbw-grid>
1792
+ * `
1793
+ * })
1794
+ * export class MyComponent { }
1795
+ * ```
1796
+ */
1797
+ declare class TbwGridColumn {
1798
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TbwGridColumn, never>;
1799
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TbwGridColumn, "tbw-grid-column", never, {}, {}, never, never, true, never>;
1800
+ }
1801
+
1353
1802
  /**
1354
1803
  * Context object passed to the detail renderer template.
1355
1804
  * Contains the row data for the expanded detail view.
@@ -1571,6 +2020,36 @@ declare class GridFormArray implements OnInit, OnDestroy {
1571
2020
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<GridFormArray, "tbw-grid[formArray]", never, { "formArray": { "alias": "formArray"; "required": true; "isSignal": true; }; "syncValidation": { "alias": "syncValidation"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1572
2021
  }
1573
2022
 
2023
+ /**
2024
+ * Directive that registers `<tbw-grid-header>` as a known Angular element.
2025
+ *
2026
+ * This directive exists so that Angular's template compiler recognises
2027
+ * `<tbw-grid-header>` without requiring `CUSTOM_ELEMENTS_SCHEMA`.
2028
+ * The grid's `config-manager` reads attributes like `title` directly
2029
+ * from the DOM element.
2030
+ *
2031
+ * ## Usage
2032
+ *
2033
+ * ```typescript
2034
+ * import { Component } from '@angular/core';
2035
+ * import { Grid, TbwGridHeader } from '@toolbox-web/grid-angular';
2036
+ *
2037
+ * @Component({
2038
+ * imports: [Grid, TbwGridHeader],
2039
+ * template: `
2040
+ * <tbw-grid [rows]="rows" [gridConfig]="config">
2041
+ * <tbw-grid-header title="My Grid Title"></tbw-grid-header>
2042
+ * </tbw-grid>
2043
+ * `
2044
+ * })
2045
+ * export class MyComponent { }
2046
+ * ```
2047
+ */
2048
+ declare class TbwGridHeader {
2049
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TbwGridHeader, never>;
2050
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TbwGridHeader, "tbw-grid-header", never, {}, {}, never, never, true, never>;
2051
+ }
2052
+
1574
2053
  /**
1575
2054
  * Gets the FormArrayContext from a grid element, if present.
1576
2055
  * @internal
@@ -1836,6 +2315,37 @@ declare class GridResponsiveCard<TRow = unknown> {
1836
2315
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<GridResponsiveCard<any>, "tbw-grid-responsive-card", never, {}, {}, ["template"], never, true, never>;
1837
2316
  }
1838
2317
 
2318
+ /**
2319
+ * Directive that registers `<tbw-grid-tool-buttons>` as a known Angular element.
2320
+ *
2321
+ * This directive exists so that Angular's template compiler recognises
2322
+ * `<tbw-grid-tool-buttons>` without requiring `CUSTOM_ELEMENTS_SCHEMA`.
2323
+ * The grid's shell reads toolbar buttons directly from the DOM.
2324
+ *
2325
+ * ## Usage
2326
+ *
2327
+ * ```typescript
2328
+ * import { Component } from '@angular/core';
2329
+ * import { Grid, TbwGridToolButtons } from '@toolbox-web/grid-angular';
2330
+ *
2331
+ * @Component({
2332
+ * imports: [Grid, TbwGridToolButtons],
2333
+ * template: `
2334
+ * <tbw-grid [rows]="rows" [gridConfig]="config">
2335
+ * <tbw-grid-tool-buttons>
2336
+ * <button (click)="doSomething()">Action</button>
2337
+ * </tbw-grid-tool-buttons>
2338
+ * </tbw-grid>
2339
+ * `
2340
+ * })
2341
+ * export class MyComponent { }
2342
+ * ```
2343
+ */
2344
+ declare class TbwGridToolButtons {
2345
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TbwGridToolButtons, never>;
2346
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TbwGridToolButtons, "tbw-grid-tool-buttons", never, {}, {}, never, never, true, never>;
2347
+ }
2348
+
1839
2349
  /**
1840
2350
  * Context object passed to the tool panel template.
1841
2351
  * Provides access to grid-related information for the panel content.
@@ -1962,13 +2472,12 @@ interface RowCommitEvent<TRow = unknown> {
1962
2472
  * ## Usage
1963
2473
  *
1964
2474
  * ```typescript
1965
- * import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
2475
+ * import { Component } from '@angular/core';
1966
2476
  * import { Grid } from '@toolbox-web/grid-angular';
1967
2477
  *
1968
2478
  * @Component({
1969
2479
  * selector: 'app-root',
1970
2480
  * imports: [Grid],
1971
- * schemas: [CUSTOM_ELEMENTS_SCHEMA],
1972
2481
  * template: `
1973
2482
  * <tbw-grid [rows]="rows" [gridConfig]="config" [customStyles]="myStyles">
1974
2483
  * <!-- column templates -->
@@ -2103,6 +2612,51 @@ declare class Grid implements OnInit, AfterContentInit, OnDestroy {
2103
2612
  * ```
2104
2613
  */
2105
2614
  loading: _angular_core.InputSignal<boolean | undefined>;
2615
+ /**
2616
+ * The data rows to display in the grid.
2617
+ *
2618
+ * Accepts an array of data objects. Each object represents one row.
2619
+ * The grid reads property values for each column's `field` from these objects.
2620
+ *
2621
+ * @example
2622
+ * ```html
2623
+ * <tbw-grid [rows]="employees()" [gridConfig]="config" />
2624
+ * ```
2625
+ */
2626
+ rows: _angular_core.InputSignal<any[] | undefined>;
2627
+ /**
2628
+ * Column configuration array.
2629
+ *
2630
+ * Shorthand for setting columns without wrapping them in a full `gridConfig`.
2631
+ * If both `columns` and `gridConfig.columns` are set, `columns` takes precedence
2632
+ * (see configuration precedence system).
2633
+ *
2634
+ * @example
2635
+ * ```html
2636
+ * <tbw-grid [rows]="data" [columns]="[
2637
+ * { field: 'id', header: 'ID', pinned: 'left', width: 80 },
2638
+ * { field: 'name', header: 'Name' },
2639
+ * { field: 'email', header: 'Email' }
2640
+ * ]" />
2641
+ * ```
2642
+ */
2643
+ columns: _angular_core.InputSignal<ColumnConfig<any>[] | undefined>;
2644
+ /**
2645
+ * Column sizing strategy.
2646
+ *
2647
+ * - `'stretch'` (default) — columns stretch to fill available width
2648
+ * - `'fixed'` — columns use their declared widths; enables horizontal scrolling
2649
+ * - `'auto-fit'` — columns auto-size to content, then stretch to fill
2650
+ *
2651
+ * @default 'stretch'
2652
+ *
2653
+ * @example
2654
+ * ```html
2655
+ * <tbw-grid [rows]="data" fitMode="fixed" />
2656
+ * <tbw-grid [rows]="data" [fitMode]="dynamicMode()" />
2657
+ * ```
2658
+ */
2659
+ fitMode: _angular_core.InputSignal<FitMode | undefined>;
2106
2660
  /**
2107
2661
  * Grid configuration object with optional Angular-specific extensions.
2108
2662
  *
@@ -2314,9 +2868,9 @@ declare class Grid implements OnInit, AfterContentInit, OnDestroy {
2314
2868
  * @example
2315
2869
  * ```html
2316
2870
  * <tbw-grid [pinnedColumns]="true" [columns]="[
2317
- * { field: 'id', sticky: 'left' },
2871
+ * { field: 'id', pinned: 'left' },
2318
2872
  * { field: 'name' },
2319
- * { field: 'actions', sticky: 'right' }
2873
+ * { field: 'actions', pinned: 'right' }
2320
2874
  * ]" />
2321
2875
  * ```
2322
2876
  */
@@ -2781,7 +3335,7 @@ declare class Grid implements OnInit, AfterContentInit, OnDestroy {
2781
3335
  private configureResponsiveCard;
2782
3336
  ngOnDestroy(): void;
2783
3337
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<Grid, never>;
2784
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<Grid, "tbw-grid", never, { "customStyles": { "alias": "customStyles"; "required": false; "isSignal": true; }; "sortable": { "alias": "sortable"; "required": false; "isSignal": true; }; "filterable": { "alias": "filterable"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "gridConfig": { "alias": "gridConfig"; "required": false; "isSignal": true; }; "angularConfig": { "alias": "angularConfig"; "required": false; "isSignal": true; }; "selection": { "alias": "selection"; "required": false; "isSignal": true; }; "editing": { "alias": "editing"; "required": false; "isSignal": true; }; "clipboard": { "alias": "clipboard"; "required": false; "isSignal": true; }; "contextMenu": { "alias": "contextMenu"; "required": false; "isSignal": true; }; "multiSort": { "alias": "multiSort"; "required": false; "isSignal": true; }; "sorting": { "alias": "sorting"; "required": false; "isSignal": true; }; "filtering": { "alias": "filtering"; "required": false; "isSignal": true; }; "reorder": { "alias": "reorder"; "required": false; "isSignal": true; }; "visibility": { "alias": "visibility"; "required": false; "isSignal": true; }; "pinnedColumns": { "alias": "pinnedColumns"; "required": false; "isSignal": true; }; "groupingColumns": { "alias": "groupingColumns"; "required": false; "isSignal": true; }; "columnVirtualization": { "alias": "columnVirtualization"; "required": false; "isSignal": true; }; "rowReorder": { "alias": "rowReorder"; "required": false; "isSignal": true; }; "groupingRows": { "alias": "groupingRows"; "required": false; "isSignal": true; }; "pinnedRows": { "alias": "pinnedRows"; "required": false; "isSignal": true; }; "tree": { "alias": "tree"; "required": false; "isSignal": true; }; "masterDetail": { "alias": "masterDetail"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "undoRedo": { "alias": "undoRedo"; "required": false; "isSignal": true; }; "exportFeature": { "alias": "export"; "required": false; "isSignal": true; }; "print": { "alias": "print"; "required": false; "isSignal": true; }; "pivot": { "alias": "pivot"; "required": false; "isSignal": true; }; "serverSide": { "alias": "serverSide"; "required": false; "isSignal": true; }; }, { "cellClick": "cellClick"; "rowClick": "rowClick"; "cellActivate": "cellActivate"; "cellChange": "cellChange"; "cellCommit": "cellCommit"; "rowCommit": "rowCommit"; "changedRowsReset": "changedRowsReset"; "sortChange": "sortChange"; "filterChange": "filterChange"; "columnResize": "columnResize"; "columnMove": "columnMove"; "columnVisibility": "columnVisibility"; "columnStateChange": "columnStateChange"; "selectionChange": "selectionChange"; "rowMove": "rowMove"; "groupToggle": "groupToggle"; "treeExpand": "treeExpand"; "detailExpand": "detailExpand"; "responsiveChange": "responsiveChange"; "copy": "copy"; "paste": "paste"; "undoRedoAction": "undoRedoAction"; "exportComplete": "exportComplete"; "printStart": "printStart"; "printComplete": "printComplete"; }, never, never, true, never>;
3338
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<Grid, "tbw-grid", never, { "customStyles": { "alias": "customStyles"; "required": false; "isSignal": true; }; "sortable": { "alias": "sortable"; "required": false; "isSignal": true; }; "filterable": { "alias": "filterable"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "fitMode": { "alias": "fitMode"; "required": false; "isSignal": true; }; "gridConfig": { "alias": "gridConfig"; "required": false; "isSignal": true; }; "angularConfig": { "alias": "angularConfig"; "required": false; "isSignal": true; }; "selection": { "alias": "selection"; "required": false; "isSignal": true; }; "editing": { "alias": "editing"; "required": false; "isSignal": true; }; "clipboard": { "alias": "clipboard"; "required": false; "isSignal": true; }; "contextMenu": { "alias": "contextMenu"; "required": false; "isSignal": true; }; "multiSort": { "alias": "multiSort"; "required": false; "isSignal": true; }; "sorting": { "alias": "sorting"; "required": false; "isSignal": true; }; "filtering": { "alias": "filtering"; "required": false; "isSignal": true; }; "reorder": { "alias": "reorder"; "required": false; "isSignal": true; }; "visibility": { "alias": "visibility"; "required": false; "isSignal": true; }; "pinnedColumns": { "alias": "pinnedColumns"; "required": false; "isSignal": true; }; "groupingColumns": { "alias": "groupingColumns"; "required": false; "isSignal": true; }; "columnVirtualization": { "alias": "columnVirtualization"; "required": false; "isSignal": true; }; "rowReorder": { "alias": "rowReorder"; "required": false; "isSignal": true; }; "groupingRows": { "alias": "groupingRows"; "required": false; "isSignal": true; }; "pinnedRows": { "alias": "pinnedRows"; "required": false; "isSignal": true; }; "tree": { "alias": "tree"; "required": false; "isSignal": true; }; "masterDetail": { "alias": "masterDetail"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "undoRedo": { "alias": "undoRedo"; "required": false; "isSignal": true; }; "exportFeature": { "alias": "export"; "required": false; "isSignal": true; }; "print": { "alias": "print"; "required": false; "isSignal": true; }; "pivot": { "alias": "pivot"; "required": false; "isSignal": true; }; "serverSide": { "alias": "serverSide"; "required": false; "isSignal": true; }; }, { "cellClick": "cellClick"; "rowClick": "rowClick"; "cellActivate": "cellActivate"; "cellChange": "cellChange"; "cellCommit": "cellCommit"; "rowCommit": "rowCommit"; "changedRowsReset": "changedRowsReset"; "sortChange": "sortChange"; "filterChange": "filterChange"; "columnResize": "columnResize"; "columnMove": "columnMove"; "columnVisibility": "columnVisibility"; "columnStateChange": "columnStateChange"; "selectionChange": "selectionChange"; "rowMove": "rowMove"; "groupToggle": "groupToggle"; "treeExpand": "treeExpand"; "detailExpand": "detailExpand"; "responsiveChange": "responsiveChange"; "copy": "copy"; "paste": "paste"; "undoRedoAction": "undoRedoAction"; "exportComplete": "exportComplete"; "printStart": "printStart"; "printComplete": "printComplete"; }, never, never, true, never>;
2785
3339
  }
2786
3340
 
2787
3341
  /**
@@ -2950,6 +3504,6 @@ declare class TbwEditor implements OnDestroy {
2950
3504
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TbwEditor, "[tbwEditor]", never, {}, {}, never, never, true, never>;
2951
3505
  }
2952
3506
 
2953
- export { AngularGridAdapter, BaseGridEditor, GRID_ICONS, GRID_TYPE_DEFAULTS, Grid, GridAdapter, GridColumnEditor, GridColumnView, GridDetailView, GridFormArray, GridIconRegistry, GridLazyForm, GridResponsiveCard, GridToolPanel, GridTypeRegistry, TbwEditor as TbwCellEditor, TbwRenderer as TbwCellView, TbwEditor, TbwRenderer, clearFeatureRegistry, createPluginFromFeature, getFeatureFactory, getFormArrayContext, getLazyFormContext, getRegisteredFeatures, injectGrid, isComponentClass, isFeatureRegistered, provideGridIcons, provideGridTypeDefaults, registerFeature };
2954
- export type { AngularCellEditor, AngularCellRenderer, AngularColumnConfig, AngularGridConfig, AngularTypeDefault, CellCommitEvent, CellEditor, CellRenderer, ColumnConfig, ExportMethods, FeatureName, FilterPanel, FormArrayContext, GridCellContext, GridConfig, GridDetailContext, GridEditorContext, GridResponsiveCardContext, GridToolPanelContext, InjectGridReturn, LazyFormFactory, PluginFactory, RowCommitEvent, RowFormChangeEvent, SelectionMethods, StructuralCellContext, StructuralEditorContext, TypeDefault, TypeDefaultRegistration };
3507
+ export { AngularGridAdapter, BaseFilterPanel, BaseGridEditor, BaseGridEditorCVA, BaseOverlayEditor, GRID_ICONS, GRID_TYPE_DEFAULTS, Grid, GridAdapter, GridColumnEditor, GridColumnView, GridDetailView, GridFormArray, GridIconRegistry, GridLazyForm, GridResponsiveCard, GridToolPanel, GridTypeRegistry, TbwEditor as TbwCellEditor, TbwRenderer as TbwCellView, TbwEditor, TbwGridColumn, TbwGridHeader, TbwGridToolButtons, TbwRenderer, clearFeatureRegistry, createPluginFromFeature, getFeatureFactory, getFormArrayContext, getLazyFormContext, getRegisteredFeatures, injectGrid, isComponentClass, isFeatureRegistered, provideGridIcons, provideGridTypeDefaults, registerFeature };
3508
+ export type { AngularCellEditor, AngularCellRenderer, AngularColumnConfig, AngularGridConfig, AngularTypeDefault, CellCommitEvent, CellEditor, CellRenderer, ColumnConfig, ExportMethods, FeatureName, FilterPanel, FormArrayContext, GridCellContext, GridConfig, GridDetailContext, GridEditorContext, GridResponsiveCardContext, GridToolPanelContext, InjectGridReturn, LazyFormFactory, OverlayPosition, PluginFactory, RowCommitEvent, RowFormChangeEvent, SelectionMethods, StructuralCellContext, StructuralEditorContext, TypeDefault, TypeDefaultRegistration };
2955
3509
  //# sourceMappingURL=toolbox-web-grid-angular.d.ts.map