@akcelik/strct 5.29.0 → 5.30.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.
@@ -1098,9 +1098,20 @@ function strctDevWarn(key, message) {
1098
1098
  warned.add(key);
1099
1099
  console.warn(message);
1100
1100
  }
1101
+ /**
1102
+ * A diagnostic that keeps its own state (one that collects names and reports
1103
+ * them together, say) registers how to forget it, so the test hook below
1104
+ * stays the one way to reset dev-mode diagnostics.
1105
+ */
1106
+ const resetters = new Set();
1107
+ function strctOnDevWarnReset(forget) {
1108
+ resetters.add(forget);
1109
+ }
1101
1110
  /** Test hook: forget which warnings have fired. Not part of the public API. */
1102
1111
  function resetStrctDevWarnings() {
1103
1112
  warned.clear();
1113
+ for (const forget of resetters)
1114
+ forget();
1104
1115
  }
1105
1116
 
1106
1117
  /**
@@ -15232,6 +15243,22 @@ const DG_LABELS = {
15232
15243
  pageOf: (page, pages) => `Page ${page} of ${pages}`,
15233
15244
  rowsMatch: (shown, total) => `${shown} of ${total} rows match`,
15234
15245
  };
15246
+ /** Flat inputs already named in a deprecation warning, per app run. */
15247
+ const warnedFlatInputs = new Set();
15248
+ const pendingFlatInputWarnings = new Set();
15249
+ let flatInputWarningQueued = false;
15250
+ strctOnDevWarnReset(() => {
15251
+ warnedFlatInputs.clear();
15252
+ pendingFlatInputWarnings.clear();
15253
+ });
15254
+ /**
15255
+ * `virtual` and `pane` take the flag they always took — including the bare
15256
+ * attribute, which arrives as `''` — or the object that replaced their
15257
+ * satellite inputs.
15258
+ */
15259
+ function objectOrBoolean(value) {
15260
+ return typeof value === 'object' && value !== null ? value : booleanAttribute(value);
15261
+ }
15235
15262
  /**
15236
15263
  * A fully custom group header row:
15237
15264
  *
@@ -15328,28 +15355,25 @@ class StrctDatagrid {
15328
15355
  rows = input.required(/* @ts-ignore */
15329
15356
  ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
15330
15357
  /** Rows per page (0 disables paging). */
15331
- pageSize = input(0, /* @ts-ignore */
15332
- ...(ngDevMode ? [{ debugName: "pageSize" }] : /* istanbul ignore next */ []));
15358
+ pageSizeFlat = input(0, { ...(ngDevMode ? { debugName: "pageSizeFlat" } : /* istanbul ignore next */ {}), alias: 'pageSize' });
15333
15359
  /** Enable row selection. */
15334
- selectable = input(false, { ...(ngDevMode ? { debugName: "selectable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
15360
+ selectableFlat = input(false, { ...(ngDevMode ? { debugName: "selectableFlat" } : /* istanbul ignore next */ {}), alias: 'selectable', transform: booleanAttribute });
15335
15361
  /** Expand a row in place to reveal its detail template below it. */
15336
15362
  expandable = input(false, { ...(ngDevMode ? { debugName: "expandable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
15337
15363
  /** Collapse the grid to a single column and open a side detail pane for the
15338
15364
  * clicked row (distinct from {@link expandable}). */
15339
- detailPane = input(false, { ...(ngDevMode ? { debugName: "detailPane" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
15365
+ detailPaneFlat = input(false, { ...(ngDevMode ? { debugName: "detailPaneFlat" } : /* istanbul ignore next */ {}), alias: 'detailPane', transform: booleanAttribute });
15340
15366
  /**
15341
15367
  * How wide the list column is while the pane is open — px or any CSS width.
15342
15368
  * 260px cuts a test name like "Validate Switch Enabled Teaming
15343
15369
  * Configurations" in half and hides its status.
15344
15370
  */
15345
- paneListWidth = input('260px', /* @ts-ignore */
15346
- ...(ngDevMode ? [{ debugName: "paneListWidth" }] : /* istanbul ignore next */ []));
15371
+ paneListWidthFlat = input('260px', { ...(ngDevMode ? { debugName: "paneListWidthFlat" } : /* istanbul ignore next */ {}), alias: 'paneListWidth' });
15347
15372
  /**
15348
15373
  * Below this container width (px) the pane takes the list's place, with a
15349
15374
  * way back in its header, rather than squeezing both into a phone.
15350
15375
  */
15351
- paneTakeoverWidth = input(900, /* @ts-ignore */
15352
- ...(ngDevMode ? [{ debugName: "paneTakeoverWidth" }] : /* istanbul ignore next */ []));
15376
+ paneTakeoverWidthFlat = input(900, { ...(ngDevMode ? { debugName: "paneTakeoverWidthFlat" } : /* istanbul ignore next */ {}), alias: 'paneTakeoverWidth' });
15353
15377
  /**
15354
15378
  * The row whose pane is open, two-way: a "what to do next" chip opens the
15355
15379
  * finding it settles, a URL fragment deep-links to a test, `null` closes it.
@@ -15373,7 +15397,7 @@ class StrctDatagrid {
15373
15397
  /** Show a column-chooser dropdown in the footer. */
15374
15398
  columnChooser = input(false, { ...(ngDevMode ? { debugName: "columnChooser" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
15375
15399
  /** Show a refresh button in the footer. */
15376
- sync = input(false, { ...(ngDevMode ? { debugName: "sync" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
15400
+ syncFlat = input(false, { ...(ngDevMode ? { debugName: "syncFlat" } : /* istanbul ignore next */ {}), alias: 'sync', transform: booleanAttribute });
15377
15401
  /** Disable all footer action buttons (sync, column chooser, etc.). */
15378
15402
  footerActionsDisabled = input(false, { ...(ngDevMode ? { debugName: "footerActionsDisabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
15379
15403
  /**
@@ -15389,8 +15413,7 @@ class StrctDatagrid {
15389
15413
  * exactly one row is grid behaviour rather than a column of radios the
15390
15414
  * consumer builds and wires by hand.
15391
15415
  */
15392
- selectionMode = input('none', /* @ts-ignore */
15393
- ...(ngDevMode ? [{ debugName: "selectionMode" }] : /* istanbul ignore next */ []));
15416
+ selectionModeFlat = input('none', { ...(ngDevMode ? { debugName: "selectionModeFlat" } : /* istanbul ignore next */ {}), alias: 'selectionMode' });
15394
15417
  /** Two-way single selection: the row id (per `rowId`), or null. */
15395
15418
  selectedId = model(null, /* @ts-ignore */
15396
15419
  ...(ngDevMode ? [{ debugName: "selectedId" }] : /* istanbul ignore next */ []));
@@ -15399,30 +15422,22 @@ class StrctDatagrid {
15399
15422
  * it AND say why — shown as the row's tooltip and given to assistive tech as
15400
15423
  * the control's description, following the `hint` convention.
15401
15424
  */
15402
- rowSelectable = input(null, /* @ts-ignore */
15403
- ...(ngDevMode ? [{ debugName: "rowSelectable" }] : /* istanbul ignore next */ []));
15425
+ rowSelectableFlat = input(null, { ...(ngDevMode ? { debugName: "rowSelectableFlat" } : /* istanbul ignore next */ {}), alias: 'rowSelectable' });
15404
15426
  /** No outer border, radius or shadow — for a grid inside a bordered panel. */
15405
15427
  flush = input(false, { ...(ngDevMode ? { debugName: "flush" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
15406
15428
  /** The grid's title, rendered above the header and used as its accessible name. */
15407
15429
  caption = input('', /* @ts-ignore */
15408
15430
  ...(ngDevMode ? [{ debugName: "caption" }] : /* istanbul ignore next */ []));
15409
- /**
15410
- * `'more'` swaps the pager for a count and a Load more button — the shape a
15411
- * cursor API can answer. The consumer appends rows; the grid does not page.
15412
- */
15413
- paging = input('pages', /* @ts-ignore */
15414
- ...(ngDevMode ? [{ debugName: "paging" }] : /* istanbul ignore next */ []));
15415
15431
  /** Whether there is another slice to ask for. */
15416
- hasMore = input(false, { ...(ngDevMode ? { debugName: "hasMore" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
15432
+ hasMoreFlat = input(false, { ...(ngDevMode ? { debugName: "hasMoreFlat" } : /* istanbul ignore next */ {}), alias: 'hasMore', transform: booleanAttribute });
15417
15433
  /** A slice is on its way: the button waits with a spinner. */
15418
- loadingMore = input(false, { ...(ngDevMode ? { debugName: "loadingMore" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
15434
+ loadingMoreFlat = input(false, { ...(ngDevMode ? { debugName: "loadingMoreFlat" } : /* istanbul ignore next */ {}), alias: 'loadingMore', transform: booleanAttribute });
15419
15435
  /** The grand total, when the API knows it — "Showing the latest 50 of 812". */
15420
- moreTotal = input(null, /* @ts-ignore */
15421
- ...(ngDevMode ? [{ debugName: "moreTotal" }] : /* istanbul ignore next */ []));
15436
+ moreTotalFlat = input(null, { ...(ngDevMode ? { debugName: "moreTotalFlat" } : /* istanbul ignore next */ {}), alias: 'moreTotal' });
15422
15437
  /** The user asked for the next slice. */
15423
15438
  loadMore = output();
15424
15439
  /** With `groupBy` and multiple selection: a tri-state checkbox per group. */
15425
- groupSelect = input(false, { ...(ngDevMode ? { debugName: "groupSelect" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
15440
+ groupSelectFlat = input(false, { ...(ngDevMode ? { debugName: "groupSelectFlat" } : /* istanbul ignore next */ {}), alias: 'groupSelect', transform: booleanAttribute });
15426
15441
  /**
15427
15442
  * Per-row action menu resolver. When set, each row gets a trailing actions
15428
15443
  * column with a vertical-dots (kebab) button that opens this row's menu.
@@ -15436,8 +15451,7 @@ class StrctDatagrid {
15436
15451
  * `selectable`. Assigning a new array (e.g. when opening a dialog) re-seeds the
15437
15452
  * selection; the user's subsequent toggles are preserved until the next change.
15438
15453
  */
15439
- initialSelection = input(null, /* @ts-ignore */
15440
- ...(ngDevMode ? [{ debugName: "initialSelection" }] : /* istanbul ignore next */ []));
15454
+ initialSelectionFlat = input(null, { ...(ngDevMode ? { debugName: "initialSelectionFlat" } : /* istanbul ignore next */ {}), alias: 'initialSelection' });
15441
15455
  /**
15442
15456
  * The selection itself, two-way, for `selectionMode="multiple"` — what
15443
15457
  * `selectedId` is for single mode. Write it and the grid checks those rows
@@ -15453,48 +15467,36 @@ class StrctDatagrid {
15453
15467
  /** Effective labels (defaults + overrides). */
15454
15468
  L = computed(() => ({ ...DG_LABELS, ...this.labels() }), /* @ts-ignore */
15455
15469
  ...(ngDevMode ? [{ debugName: "L" }] : /* istanbul ignore next */ []));
15456
- /**
15457
- * Virtual scrolling for large data sets: only the rows inside the viewport
15458
- * (plus a small overscan) are in the DOM — 20k+ rows stay smooth. The scroll
15459
- * area gets `viewportHeight` and a sticky header. Assumes uniform
15460
- * `rowHeight`; combine with `expandable` is unsupported.
15461
- */
15462
- virtual = input(false, { ...(ngDevMode ? { debugName: "virtual" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
15463
15470
  /** Scroll viewport height in px (virtual mode). */
15464
- viewportHeight = input(360, /* @ts-ignore */
15465
- ...(ngDevMode ? [{ debugName: "viewportHeight" }] : /* istanbul ignore next */ []));
15471
+ viewportHeightFlat = input(360, { ...(ngDevMode ? { debugName: "viewportHeightFlat" } : /* istanbul ignore next */ {}), alias: 'viewportHeight' });
15466
15472
  /**
15467
15473
  * Bound the grid's own scroll box (px), with a sticky header — what
15468
15474
  * `viewportHeight` does for `virtual`, for every other grid: a grouped
15469
15475
  * picker inside a dialog scrolls instead of growing the page.
15470
15476
  */
15471
- maxHeight = input(null, /* @ts-ignore */
15472
- ...(ngDevMode ? [{ debugName: "maxHeight" }] : /* istanbul ignore next */ []));
15477
+ maxHeightFlat = input(null, { ...(ngDevMode ? { debugName: "maxHeightFlat" } : /* istanbul ignore next */ {}), alias: 'maxHeight' });
15473
15478
  /**
15474
15479
  * Show a pencil on an editable cell when it is hovered or focused. A mouse
15475
15480
  * user finds an editable cell by double-clicking one; nothing said so.
15476
15481
  */
15477
15482
  editHint = input(false, { ...(ngDevMode ? { debugName: "editHint" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
15478
15483
  /** Uniform row height in px (virtual mode; tune when `compact`). */
15479
- rowHeight = input(38, /* @ts-ignore */
15480
- ...(ngDevMode ? [{ debugName: "rowHeight" }] : /* istanbul ignore next */ []));
15484
+ rowHeightFlat = input(38, { ...(ngDevMode ? { debugName: "rowHeightFlat" } : /* istanbul ignore next */ {}), alias: 'rowHeight' });
15481
15485
  /**
15482
15486
  * Server-side mode: the grid never sorts or slices `rows` itself — it shows
15483
15487
  * them as given and emits `(lazyLoad)` with `{ page, pageSize, sortKey,
15484
15488
  * sortDir }` whenever the user pages or sorts (and once on init). Provide
15485
15489
  * `total` so the pager and count reflect the full server-side set.
15486
15490
  */
15487
- lazy = input(false, { ...(ngDevMode ? { debugName: "lazy" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
15491
+ lazyFlat = input(false, { ...(ngDevMode ? { debugName: "lazyFlat" } : /* istanbul ignore next */ {}), alias: 'lazy', transform: booleanAttribute });
15488
15492
  /** Total row count on the server (lazy mode). */
15489
- total = input(null, /* @ts-ignore */
15490
- ...(ngDevMode ? [{ debugName: "total" }] : /* istanbul ignore next */ []));
15493
+ totalFlat = input(null, { ...(ngDevMode ? { debugName: "totalFlat" } : /* istanbul ignore next */ {}), alias: 'total' });
15491
15494
  /**
15492
15495
  * Persist the user's column widths + hidden columns under this key in
15493
15496
  * localStorage (`strct-dg:<key>`), restoring them on init. For full control
15494
15497
  * use the two-way `columnState` instead (both may be combined).
15495
15498
  */
15496
- stateKey = input(null, /* @ts-ignore */
15497
- ...(ngDevMode ? [{ debugName: "stateKey" }] : /* istanbul ignore next */ []));
15499
+ stateKeyFlat = input(null, { ...(ngDevMode ? { debugName: "stateKeyFlat" } : /* istanbul ignore next */ {}), alias: 'stateKey' });
15498
15500
  /** User column preferences (two-way): widths from resize, hidden from the chooser. */
15499
15501
  columnState = model(null, /* @ts-ignore */
15500
15502
  ...(ngDevMode ? [{ debugName: "columnState" }] : /* istanbul ignore next */ []));
@@ -15505,17 +15507,16 @@ class StrctDatagrid {
15505
15507
  * per distinct value (with a count), respecting the current sort within
15506
15508
  * groups. Paging is bypassed while grouped; not combinable with `virtual`.
15507
15509
  */
15508
- groupBy = input(null, /* @ts-ignore */
15509
- ...(ngDevMode ? [{ debugName: "groupBy" }] : /* istanbul ignore next */ []));
15510
+ groupByFlat = input(null, { ...(ngDevMode ? { debugName: "groupByFlat" } : /* istanbul ignore next */ {}), alias: 'groupBy' });
15510
15511
  /**
15511
15512
  * The groups themselves, beside `groupBy`: their order, their labels, a
15512
15513
  * tone, a note, whether they start folded and a count of the consumer's
15513
15514
  * own. Values no group mentions follow, in the order the rows arrived.
15514
15515
  */
15515
- groups = input(null, /* @ts-ignore */
15516
- ...(ngDevMode ? [{ debugName: "groups" }] : /* istanbul ignore next */ []));
15516
+ groupsFlat = input(null, { ...(ngDevMode ? { debugName: "groupsFlat" } : /* istanbul ignore next */ {}), alias: 'groups' });
15517
15517
  /** Keep a declared group that holds no rows, rather than dropping it. */
15518
- showEmptyGroups = input(false, { ...(ngDevMode ? { debugName: "showEmptyGroups" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
15518
+ showEmptyGroupsFlat = input(false, { ...(ngDevMode ? { debugName: "showEmptyGroupsFlat" } : /* istanbul ignore next */ {}), alias: 'showEmptyGroups',
15519
+ transform: booleanAttribute });
15519
15520
  /**
15520
15521
  * Which groups are folded, two-way — so a summary counter elsewhere on the
15521
15522
  * page can open the group it counts.
@@ -15538,18 +15539,17 @@ class StrctDatagrid {
15538
15539
  quickFilter = model('', /* @ts-ignore */
15539
15540
  ...(ngDevMode ? [{ debugName: "quickFilter" }] : /* istanbul ignore next */ []));
15540
15541
  /** Columns the quick term scans. Defaults to every column's `key`. */
15541
- quickFilterFields = input(null, /* @ts-ignore */
15542
- ...(ngDevMode ? [{ debugName: "quickFilterFields" }] : /* istanbul ignore next */ []));
15542
+ quickFilterFieldsFlat = input(null, { ...(ngDevMode ? { debugName: "quickFilterFieldsFlat" } : /* istanbul ignore next */ {}), alias: 'quickFilterFields' });
15543
15543
  /** Render the built-in quick-filter searchbox in the toolbar. */
15544
- quickFilterable = input(false, { ...(ngDevMode ? { debugName: "quickFilterable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
15544
+ quickFilterableFlat = input(false, { ...(ngDevMode ? { debugName: "quickFilterableFlat" } : /* istanbul ignore next */ {}), alias: 'quickFilterable',
15545
+ transform: booleanAttribute });
15545
15546
  /**
15546
15547
  * Where the built-in box sits in the toolbar. `'end'` (default) follows the
15547
15548
  * console convention: action verbs lead on the left, view controls sit at
15548
15549
  * the far right — and the box keeps a stable position across grids whose
15549
15550
  * button sets differ.
15550
15551
  */
15551
- quickFilterAlign = input('end', /* @ts-ignore */
15552
- ...(ngDevMode ? [{ debugName: "quickFilterAlign" }] : /* istanbul ignore next */ []));
15552
+ quickFilterAlignFlat = input('end', { ...(ngDevMode ? { debugName: "quickFilterAlignFlat" } : /* istanbul ignore next */ {}), alias: 'quickFilterAlign' });
15553
15553
  /**
15554
15554
  * Tree-grid: the row property holding a row's children array. Rows render
15555
15555
  * hierarchically with indent + carets; sorting applies per sibling level;
@@ -15562,8 +15562,7 @@ class StrctDatagrid {
15562
15562
  * ArrowLeft collapses an expanded one. There is no cell-level navigation —
15563
15563
  * Tab walks the interactive elements inside each row as usual.
15564
15564
  */
15565
- childrenKey = input(null, /* @ts-ignore */
15566
- ...(ngDevMode ? [{ debugName: "childrenKey" }] : /* istanbul ignore next */ []));
15565
+ childrenKeyFlat = input(null, { ...(ngDevMode ? { debugName: "childrenKeyFlat" } : /* istanbul ignore next */ {}), alias: 'childrenKey' });
15567
15566
  /**
15568
15567
  * `'table'` (the default) is what the grid has always been: a table whose
15569
15568
  * controls each take a tab stop. `'grid'` is the APG grid: the table claims
@@ -15582,8 +15581,7 @@ class StrctDatagrid {
15582
15581
  * file list selects by clicking the row, not a control in it. The row is
15583
15582
  * then the control, so pair it with `interactionMode="grid"`.
15584
15583
  */
15585
- selectionColumn = input('auto', /* @ts-ignore */
15586
- ...(ngDevMode ? [{ debugName: "selectionColumn" }] : /* istanbul ignore next */ []));
15584
+ selectionColumnFlat = input('auto', { ...(ngDevMode ? { debugName: "selectionColumnFlat" } : /* istanbul ignore next */ {}), alias: 'selectionColumn' });
15587
15585
  /**
15588
15586
  * The row was opened: a double-click, or Enter on the focused row in grid
15589
15587
  * mode. Selection is "which rows do I mean"; activation is "go".
@@ -15601,6 +15599,193 @@ class StrctDatagrid {
15601
15599
  * editor). The grid does not mutate rows — apply the value to your data and
15602
15600
  * pass the updated array back in. */
15603
15601
  cellEdit = output();
15602
+ // ── The feature objects, and the flat inputs they replace ───────────────
15603
+ // Each resolved signal below keeps the name the rest of the component (and
15604
+ // the template) already uses, so the object is read where the flat input
15605
+ // was. The object wins when it carries the property; otherwise the flat
15606
+ // input answers, as it did before 5.30.0.
15607
+ /** How rows are picked — replaces six flat inputs. */
15608
+ selectionCfg = input({}, { ...(ngDevMode ? { debugName: "selectionCfg" } : /* istanbul ignore next */ {}), alias: 'selection' });
15609
+ /** The detail pane — replaces three. `[pane]` on its own turns it on. */
15610
+ paneFlat = input(false, { ...(ngDevMode ? { debugName: "paneFlat" } : /* istanbul ignore next */ {}), alias: 'pane',
15611
+ transform: objectOrBoolean });
15612
+ paneCfg = computed(() => {
15613
+ const v = this.paneFlat();
15614
+ return typeof v === 'boolean' ? (v ? { enabled: true } : {}) : { enabled: true, ...v };
15615
+ }, /* @ts-ignore */
15616
+ ...(ngDevMode ? [{ debugName: "paneCfg" }] : /* istanbul ignore next */ []));
15617
+ /** How rows are paged. Takes the mode on its own, as before, or the object. */
15618
+ pagingFlat = input('pages', { ...(ngDevMode ? { debugName: "pagingFlat" } : /* istanbul ignore next */ {}), alias: 'paging' });
15619
+ pagingCfg = computed(() => {
15620
+ const v = this.pagingFlat();
15621
+ return typeof v === 'string' ? { mode: v } : v;
15622
+ }, /* @ts-ignore */
15623
+ ...(ngDevMode ? [{ debugName: "pagingCfg" }] : /* istanbul ignore next */ []));
15624
+ /** Numbered pages or a "load more" footer. */
15625
+ paging = computed(() => this.pagingCfg().mode ?? 'pages', /* @ts-ignore */
15626
+ ...(ngDevMode ? [{ debugName: "paging" }] : /* istanbul ignore next */ []));
15627
+ /** Virtual scrolling. Takes the flag on its own, as before, or the object. */
15628
+ virtualFlat = input(false, { ...(ngDevMode ? { debugName: "virtualFlat" } : /* istanbul ignore next */ {}), alias: 'virtual', transform: objectOrBoolean });
15629
+ virtualCfg = computed(() => {
15630
+ const v = this.virtualFlat();
15631
+ return typeof v === 'boolean' ? (v ? { enabled: true } : {}) : { enabled: true, ...v };
15632
+ }, /* @ts-ignore */
15633
+ ...(ngDevMode ? [{ debugName: "virtualCfg" }] : /* istanbul ignore next */ []));
15634
+ /** Whether the grid renders only the rows in view. */
15635
+ virtual = computed(() => this.virtualCfg().enabled ?? false, /* @ts-ignore */
15636
+ ...(ngDevMode ? [{ debugName: "virtual" }] : /* istanbul ignore next */ []));
15637
+ /** How rows are grouped — replaces four flat inputs. */
15638
+ groupingCfg = input({}, { ...(ngDevMode ? { debugName: "groupingCfg" } : /* istanbul ignore next */ {}), alias: 'grouping' });
15639
+ /** The quick filter — replaces three flat inputs. */
15640
+ filteringCfg = input({}, { ...(ngDevMode ? { debugName: "filteringCfg" } : /* istanbul ignore next */ {}), alias: 'filtering' });
15641
+ /** Remembered state — replaces `stateKey` and `sync`. */
15642
+ stateCfg = input({}, { ...(ngDevMode ? { debugName: "stateCfg" } : /* istanbul ignore next */ {}), alias: 'state' });
15643
+ /**
15644
+ * The flat inputs this grid is actually given, with the object each has
15645
+ * moved into. "Given" is read as "not its default", which is what a
15646
+ * template can be checked against from inside the component.
15647
+ */
15648
+ flatInputsInUse = [
15649
+ ['pageSize', () => this.pageSizeFlat() !== 0, '[paging].pageSize'],
15650
+ ['selectable', () => this.selectableFlat(), '[selection].enabled'],
15651
+ ['detailPane', () => this.detailPaneFlat(), '[pane].enabled'],
15652
+ ['paneListWidth', () => this.paneListWidthFlat() !== '260px', '[pane].listWidth'],
15653
+ ['paneTakeoverWidth', () => this.paneTakeoverWidthFlat() !== 900, '[pane].takeoverWidth'],
15654
+ ['sync', () => this.syncFlat(), '[state].sync'],
15655
+ ['selectionMode', () => this.selectionModeFlat() !== 'none', '[selection].mode'],
15656
+ ['rowSelectable', () => this.rowSelectableFlat() !== null, '[selection].rowSelectable'],
15657
+ ['hasMore', () => this.hasMoreFlat(), '[paging].hasMore'],
15658
+ ['loadingMore', () => this.loadingMoreFlat(), '[paging].loadingMore'],
15659
+ ['moreTotal', () => this.moreTotalFlat() !== null, '[paging].moreTotal'],
15660
+ ['groupSelect', () => this.groupSelectFlat(), '[selection].groupSelect'],
15661
+ ['initialSelection', () => this.initialSelectionFlat() !== null, '[selection].initial'],
15662
+ ['viewportHeight', () => this.viewportHeightFlat() !== 360, '[virtual].viewportHeight'],
15663
+ ['maxHeight', () => this.maxHeightFlat() !== null, '[virtual].maxHeight'],
15664
+ ['rowHeight', () => this.rowHeightFlat() !== 38, '[virtual].rowHeight'],
15665
+ ['lazy', () => this.lazyFlat(), '[paging].lazy'],
15666
+ ['total', () => this.totalFlat() !== null, '[paging].total'],
15667
+ ['stateKey', () => this.stateKeyFlat() !== null, '[state].key'],
15668
+ ['groupBy', () => this.groupByFlat() !== null, '[grouping].by'],
15669
+ ['groups', () => this.groupsFlat() !== null, '[grouping].groups'],
15670
+ ['showEmptyGroups', () => this.showEmptyGroupsFlat(), '[grouping].showEmpty'],
15671
+ ['quickFilterFields', () => this.quickFilterFieldsFlat() !== null, '[filtering].fields'],
15672
+ ['quickFilterable', () => this.quickFilterableFlat(), '[filtering].quick'],
15673
+ ['quickFilterAlign', () => this.quickFilterAlignFlat() !== 'end', '[filtering].align'],
15674
+ ['childrenKey', () => this.childrenKeyFlat() !== null, '[grouping].childrenKey'],
15675
+ ['selectionColumn', () => this.selectionColumnFlat() !== 'auto', '[selection].column'],
15676
+ ];
15677
+ /**
15678
+ * Dev mode says, once per app run, which flat inputs have moved — a
15679
+ * console line per name would be a wall in a screen with four grids, so
15680
+ * the names are collected and reported together.
15681
+ */
15682
+ reportFlatInputs() {
15683
+ const fresh = this.flatInputsInUse
15684
+ .filter(([name, given]) => given() && !warnedFlatInputs.has(name))
15685
+ .map(([name, , to]) => {
15686
+ warnedFlatInputs.add(name);
15687
+ return ` ${name} → ${to}`;
15688
+ });
15689
+ if (!fresh.length)
15690
+ return;
15691
+ for (const line of fresh)
15692
+ pendingFlatInputWarnings.add(line);
15693
+ if (flatInputWarningQueued)
15694
+ return;
15695
+ flatInputWarningQueued = true;
15696
+ setTimeout(() => {
15697
+ flatInputWarningQueued = false;
15698
+ const lines = [...pendingFlatInputWarnings].sort();
15699
+ pendingFlatInputWarnings.clear();
15700
+ console.warn(`[strct-datagrid] ${lines.length} input(s) have moved into a feature ` +
15701
+ `object and are removed in 6.0. They keep working through 5.x:\n` +
15702
+ lines.join('\n') +
15703
+ `\nThe objects are [selection], [paging], [pane], [virtual], ` +
15704
+ `[grouping], [filtering] and [state]; two-way state ` +
15705
+ `(selectedIds, filters, columnState, …) stays where it is.`);
15706
+ });
15707
+ }
15708
+ /** `[paging].pageSize` when it is set, else the flat `pageSize` (deprecated). */
15709
+ pageSize = computed(() => this.pagingCfg().pageSize ?? this.pageSizeFlat(), /* @ts-ignore */
15710
+ ...(ngDevMode ? [{ debugName: "pageSize" }] : /* istanbul ignore next */ []));
15711
+ /** `[selection].enabled` when it is set, else the flat `selectable` (deprecated). */
15712
+ selectable = computed(() => this.selectionCfg().enabled ?? this.selectableFlat(), /* @ts-ignore */
15713
+ ...(ngDevMode ? [{ debugName: "selectable" }] : /* istanbul ignore next */ []));
15714
+ /** `[pane].enabled` when it is set, else the flat `detailPane` (deprecated). */
15715
+ detailPane = computed(() => this.paneCfg().enabled ?? this.detailPaneFlat(), /* @ts-ignore */
15716
+ ...(ngDevMode ? [{ debugName: "detailPane" }] : /* istanbul ignore next */ []));
15717
+ /** `[pane].listWidth` when it is set, else the flat `paneListWidth` (deprecated). */
15718
+ paneListWidth = computed(() => this.paneCfg().listWidth ?? this.paneListWidthFlat(), /* @ts-ignore */
15719
+ ...(ngDevMode ? [{ debugName: "paneListWidth" }] : /* istanbul ignore next */ []));
15720
+ /** `[pane].takeoverWidth` when it is set, else the flat `paneTakeoverWidth` (deprecated). */
15721
+ paneTakeoverWidth = computed(() => this.paneCfg().takeoverWidth ?? this.paneTakeoverWidthFlat(), /* @ts-ignore */
15722
+ ...(ngDevMode ? [{ debugName: "paneTakeoverWidth" }] : /* istanbul ignore next */ []));
15723
+ /** `[state].sync` when it is set, else the flat `sync` (deprecated). */
15724
+ sync = computed(() => this.stateCfg().sync ?? this.syncFlat(), /* @ts-ignore */
15725
+ ...(ngDevMode ? [{ debugName: "sync" }] : /* istanbul ignore next */ []));
15726
+ /** `[selection].mode` when it is set, else the flat `selectionMode` (deprecated). */
15727
+ selectionMode = computed(() => this.selectionCfg().mode ?? this.selectionModeFlat(), /* @ts-ignore */
15728
+ ...(ngDevMode ? [{ debugName: "selectionMode" }] : /* istanbul ignore next */ []));
15729
+ /** `[selection].rowSelectable` when it is set, else the flat `rowSelectable` (deprecated). */
15730
+ rowSelectable = computed(() => this.selectionCfg().rowSelectable ?? this.rowSelectableFlat(), /* @ts-ignore */
15731
+ ...(ngDevMode ? [{ debugName: "rowSelectable" }] : /* istanbul ignore next */ []));
15732
+ /** `[paging].hasMore` when it is set, else the flat `hasMore` (deprecated). */
15733
+ hasMore = computed(() => this.pagingCfg().hasMore ?? this.hasMoreFlat(), /* @ts-ignore */
15734
+ ...(ngDevMode ? [{ debugName: "hasMore" }] : /* istanbul ignore next */ []));
15735
+ /** `[paging].loadingMore` when it is set, else the flat `loadingMore` (deprecated). */
15736
+ loadingMore = computed(() => this.pagingCfg().loadingMore ?? this.loadingMoreFlat(), /* @ts-ignore */
15737
+ ...(ngDevMode ? [{ debugName: "loadingMore" }] : /* istanbul ignore next */ []));
15738
+ /** `[paging].moreTotal` when it is set, else the flat `moreTotal` (deprecated). */
15739
+ moreTotal = computed(() => this.pagingCfg().moreTotal ?? this.moreTotalFlat(), /* @ts-ignore */
15740
+ ...(ngDevMode ? [{ debugName: "moreTotal" }] : /* istanbul ignore next */ []));
15741
+ /** `[selection].groupSelect` when it is set, else the flat `groupSelect` (deprecated). */
15742
+ groupSelect = computed(() => this.selectionCfg().groupSelect ?? this.groupSelectFlat(), /* @ts-ignore */
15743
+ ...(ngDevMode ? [{ debugName: "groupSelect" }] : /* istanbul ignore next */ []));
15744
+ /** `[selection].initial` when it is set, else the flat `initialSelection` (deprecated). */
15745
+ initialSelection = computed(() => this.selectionCfg().initial ?? this.initialSelectionFlat(), /* @ts-ignore */
15746
+ ...(ngDevMode ? [{ debugName: "initialSelection" }] : /* istanbul ignore next */ []));
15747
+ /** `[virtual].viewportHeight` when it is set, else the flat `viewportHeight` (deprecated). */
15748
+ viewportHeight = computed(() => this.virtualCfg().viewportHeight ?? this.viewportHeightFlat(), /* @ts-ignore */
15749
+ ...(ngDevMode ? [{ debugName: "viewportHeight" }] : /* istanbul ignore next */ []));
15750
+ /** `[virtual].maxHeight` when it is set, else the flat `maxHeight` (deprecated). */
15751
+ maxHeight = computed(() => this.virtualCfg().maxHeight ?? this.maxHeightFlat(), /* @ts-ignore */
15752
+ ...(ngDevMode ? [{ debugName: "maxHeight" }] : /* istanbul ignore next */ []));
15753
+ /** `[virtual].rowHeight` when it is set, else the flat `rowHeight` (deprecated). */
15754
+ rowHeight = computed(() => this.virtualCfg().rowHeight ?? this.rowHeightFlat(), /* @ts-ignore */
15755
+ ...(ngDevMode ? [{ debugName: "rowHeight" }] : /* istanbul ignore next */ []));
15756
+ /** `[paging].lazy` when it is set, else the flat `lazy` (deprecated). */
15757
+ lazy = computed(() => this.pagingCfg().lazy ?? this.lazyFlat(), /* @ts-ignore */
15758
+ ...(ngDevMode ? [{ debugName: "lazy" }] : /* istanbul ignore next */ []));
15759
+ /** `[paging].total` when it is set, else the flat `total` (deprecated). */
15760
+ total = computed(() => this.pagingCfg().total ?? this.totalFlat(), /* @ts-ignore */
15761
+ ...(ngDevMode ? [{ debugName: "total" }] : /* istanbul ignore next */ []));
15762
+ /** `[state].key` when it is set, else the flat `stateKey` (deprecated). */
15763
+ stateKey = computed(() => this.stateCfg().key ?? this.stateKeyFlat(), /* @ts-ignore */
15764
+ ...(ngDevMode ? [{ debugName: "stateKey" }] : /* istanbul ignore next */ []));
15765
+ /** `[grouping].by` when it is set, else the flat `groupBy` (deprecated). */
15766
+ groupBy = computed(() => this.groupingCfg().by ?? this.groupByFlat(), /* @ts-ignore */
15767
+ ...(ngDevMode ? [{ debugName: "groupBy" }] : /* istanbul ignore next */ []));
15768
+ /** `[grouping].groups` when it is set, else the flat `groups` (deprecated). */
15769
+ groups = computed(() => this.groupingCfg().groups ?? this.groupsFlat(), /* @ts-ignore */
15770
+ ...(ngDevMode ? [{ debugName: "groups" }] : /* istanbul ignore next */ []));
15771
+ /** `[grouping].showEmpty` when it is set, else the flat `showEmptyGroups` (deprecated). */
15772
+ showEmptyGroups = computed(() => this.groupingCfg().showEmpty ?? this.showEmptyGroupsFlat(), /* @ts-ignore */
15773
+ ...(ngDevMode ? [{ debugName: "showEmptyGroups" }] : /* istanbul ignore next */ []));
15774
+ /** `[filtering].fields` when it is set, else the flat `quickFilterFields` (deprecated). */
15775
+ quickFilterFields = computed(() => this.filteringCfg().fields ?? this.quickFilterFieldsFlat(), /* @ts-ignore */
15776
+ ...(ngDevMode ? [{ debugName: "quickFilterFields" }] : /* istanbul ignore next */ []));
15777
+ /** `[filtering].quick` when it is set, else the flat `quickFilterable` (deprecated). */
15778
+ quickFilterable = computed(() => this.filteringCfg().quick ?? this.quickFilterableFlat(), /* @ts-ignore */
15779
+ ...(ngDevMode ? [{ debugName: "quickFilterable" }] : /* istanbul ignore next */ []));
15780
+ /** `[filtering].align` when it is set, else the flat `quickFilterAlign` (deprecated). */
15781
+ quickFilterAlign = computed(() => this.filteringCfg().align ?? this.quickFilterAlignFlat(), /* @ts-ignore */
15782
+ ...(ngDevMode ? [{ debugName: "quickFilterAlign" }] : /* istanbul ignore next */ []));
15783
+ /** `[grouping].childrenKey` when it is set, else the flat `childrenKey` (deprecated). */
15784
+ childrenKey = computed(() => this.groupingCfg().childrenKey ?? this.childrenKeyFlat(), /* @ts-ignore */
15785
+ ...(ngDevMode ? [{ debugName: "childrenKey" }] : /* istanbul ignore next */ []));
15786
+ /** `[selection].column` when it is set, else the flat `selectionColumn` (deprecated). */
15787
+ selectionColumn = computed(() => this.selectionCfg().column ?? this.selectionColumnFlat(), /* @ts-ignore */
15788
+ ...(ngDevMode ? [{ debugName: "selectionColumn" }] : /* istanbul ignore next */ []));
15604
15789
  menu = inject(StrctMenuService);
15605
15790
  detailDef = contentChild(StrctRowDetailDef, /* @ts-ignore */
15606
15791
  ...(ngDevMode ? [{ debugName: "detailDef" }] : /* istanbul ignore next */ []));
@@ -17108,6 +17293,12 @@ class StrctDatagrid {
17108
17293
  this.lazyLoad.emit(state);
17109
17294
  });
17110
17295
  });
17296
+ // The inputs are bound by the first render, so this is where they can be
17297
+ // read and reported.
17298
+ afterNextRender(() => {
17299
+ if (typeof ngDevMode !== 'undefined' && ngDevMode)
17300
+ this.reportFlatInputs();
17301
+ });
17111
17302
  // Below `paneTakeoverWidth` the pane replaces the list. The grid's own
17112
17303
  // width decides, not the viewport: the same grid is wide in a page and
17113
17304
  // narrow in a drawer.
@@ -17612,7 +17803,7 @@ class StrctDatagrid {
17612
17803
  return String(a ?? '').localeCompare(String(b ?? ''), undefined, { numeric: true });
17613
17804
  }
17614
17805
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctDatagrid, deps: [], target: i0.ɵɵFactoryTarget.Component });
17615
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.4", type: StrctDatagrid, isStandalone: true, selector: "strct-datagrid", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: true, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, expandable: { classPropertyName: "expandable", publicName: "expandable", isSignal: true, isRequired: false, transformFunction: null }, detailPane: { classPropertyName: "detailPane", publicName: "detailPane", isSignal: true, isRequired: false, transformFunction: null }, paneListWidth: { classPropertyName: "paneListWidth", publicName: "paneListWidth", isSignal: true, isRequired: false, transformFunction: null }, paneTakeoverWidth: { classPropertyName: "paneTakeoverWidth", publicName: "paneTakeoverWidth", isSignal: true, isRequired: false, transformFunction: null }, activeRowId: { classPropertyName: "activeRowId", publicName: "activeRowId", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, singleLine: { classPropertyName: "singleLine", publicName: "singleLine", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, resizable: { classPropertyName: "resizable", publicName: "resizable", isSignal: true, isRequired: false, transformFunction: null }, columnChooser: { classPropertyName: "columnChooser", publicName: "columnChooser", isSignal: true, isRequired: false, transformFunction: null }, sync: { classPropertyName: "sync", publicName: "sync", isSignal: true, isRequired: false, transformFunction: null }, footerActionsDisabled: { classPropertyName: "footerActionsDisabled", publicName: "footerActionsDisabled", isSignal: true, isRequired: false, transformFunction: null }, rowId: { classPropertyName: "rowId", publicName: "rowId", isSignal: true, isRequired: false, transformFunction: null }, selectionMode: { classPropertyName: "selectionMode", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, selectedId: { classPropertyName: "selectedId", publicName: "selectedId", isSignal: true, isRequired: false, transformFunction: null }, rowSelectable: { classPropertyName: "rowSelectable", publicName: "rowSelectable", isSignal: true, isRequired: false, transformFunction: null }, flush: { classPropertyName: "flush", publicName: "flush", isSignal: true, isRequired: false, transformFunction: null }, caption: { classPropertyName: "caption", publicName: "caption", isSignal: true, isRequired: false, transformFunction: null }, paging: { classPropertyName: "paging", publicName: "paging", isSignal: true, isRequired: false, transformFunction: null }, hasMore: { classPropertyName: "hasMore", publicName: "hasMore", isSignal: true, isRequired: false, transformFunction: null }, loadingMore: { classPropertyName: "loadingMore", publicName: "loadingMore", isSignal: true, isRequired: false, transformFunction: null }, moreTotal: { classPropertyName: "moreTotal", publicName: "moreTotal", isSignal: true, isRequired: false, transformFunction: null }, groupSelect: { classPropertyName: "groupSelect", publicName: "groupSelect", isSignal: true, isRequired: false, transformFunction: null }, rowActions: { classPropertyName: "rowActions", publicName: "rowActions", isSignal: true, isRequired: false, transformFunction: null }, initialSelection: { classPropertyName: "initialSelection", publicName: "initialSelection", isSignal: true, isRequired: false, transformFunction: null }, selectedIds: { classPropertyName: "selectedIds", publicName: "selectedIds", isSignal: true, isRequired: false, transformFunction: null }, labels: { classPropertyName: "labels", publicName: "labels", isSignal: true, isRequired: false, transformFunction: null }, virtual: { classPropertyName: "virtual", publicName: "virtual", isSignal: true, isRequired: false, transformFunction: null }, viewportHeight: { classPropertyName: "viewportHeight", publicName: "viewportHeight", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null }, editHint: { classPropertyName: "editHint", publicName: "editHint", isSignal: true, isRequired: false, transformFunction: null }, rowHeight: { classPropertyName: "rowHeight", publicName: "rowHeight", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, stateKey: { classPropertyName: "stateKey", publicName: "stateKey", isSignal: true, isRequired: false, transformFunction: null }, columnState: { classPropertyName: "columnState", publicName: "columnState", isSignal: true, isRequired: false, transformFunction: null }, reorderable: { classPropertyName: "reorderable", publicName: "reorderable", isSignal: true, isRequired: false, transformFunction: null }, groupBy: { classPropertyName: "groupBy", publicName: "groupBy", isSignal: true, isRequired: false, transformFunction: null }, groups: { classPropertyName: "groups", publicName: "groups", isSignal: true, isRequired: false, transformFunction: null }, showEmptyGroups: { classPropertyName: "showEmptyGroups", publicName: "showEmptyGroups", isSignal: true, isRequired: false, transformFunction: null }, collapsedGroups: { classPropertyName: "collapsedGroups", publicName: "collapsedGroups", isSignal: true, isRequired: false, transformFunction: null }, filters: { classPropertyName: "filters", publicName: "filters", isSignal: true, isRequired: false, transformFunction: null }, quickFilter: { classPropertyName: "quickFilter", publicName: "quickFilter", isSignal: true, isRequired: false, transformFunction: null }, quickFilterFields: { classPropertyName: "quickFilterFields", publicName: "quickFilterFields", isSignal: true, isRequired: false, transformFunction: null }, quickFilterable: { classPropertyName: "quickFilterable", publicName: "quickFilterable", isSignal: true, isRequired: false, transformFunction: null }, quickFilterAlign: { classPropertyName: "quickFilterAlign", publicName: "quickFilterAlign", isSignal: true, isRequired: false, transformFunction: null }, childrenKey: { classPropertyName: "childrenKey", publicName: "childrenKey", isSignal: true, isRequired: false, transformFunction: null }, interactionMode: { classPropertyName: "interactionMode", publicName: "interactionMode", isSignal: true, isRequired: false, transformFunction: null }, selectionColumn: { classPropertyName: "selectionColumn", publicName: "selectionColumn", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activeRowId: "activeRowIdChange", selectedId: "selectedIdChange", loadMore: "loadMore", selectedIds: "selectedIdsChange", columnState: "columnStateChange", collapsedGroups: "collapsedGroupsChange", filters: "filtersChange", quickFilter: "quickFilterChange", rowActivate: "rowActivate", selectionChange: "selectionChange", syncChange: "syncChange", rowAction: "rowAction", lazyLoad: "lazyLoad", cellEdit: "cellEdit" }, host: { listeners: { "document:click": "onDocClickOverlays($event)", "document:keydown.escape": "onEscapeOverlays($event)" }, properties: { "attr.aria-busy": "loading() || loadingMore() ? \"true\" : null", "class.strct-dg-host--compact": "compact()", "class.strct-dg-host--singleline": "singleLine()", "class.strct-dg-host--virtual": "virtual()", "class.strct-dg-host--bounded": "!virtual() && maxHeight() !== null", "class.strct-dg-host--sticky": "stickyActive()", "class.strct-dg-host--flush": "flush()" }, classAttribute: "strct-dg-host" }, queries: [{ propertyName: "detailDef", first: true, predicate: StrctRowDetailDef, descendants: true, isSignal: true }, { propertyName: "groupHeaderDef", first: true, predicate: StrctGroupHeaderDef, descendants: true, isSignal: true }, { propertyName: "paneTitleDef", first: true, predicate: StrctDetailPaneTitle, descendants: true, isSignal: true }, { propertyName: "actionBarDef", first: true, predicate: StrctDatagridActionBar, descendants: true, isSignal: true }, { propertyName: "actionBarCaptionDef", first: true, predicate: StrctDatagridActionBarCaption, descendants: true, isSignal: true }, { propertyName: "cellDefs", predicate: StrctCellDef, isSignal: true }], ngImport: i0, template: `
17806
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.4", type: StrctDatagrid, isStandalone: true, selector: "strct-datagrid", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: true, transformFunction: null }, pageSizeFlat: { classPropertyName: "pageSizeFlat", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, selectableFlat: { classPropertyName: "selectableFlat", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, expandable: { classPropertyName: "expandable", publicName: "expandable", isSignal: true, isRequired: false, transformFunction: null }, detailPaneFlat: { classPropertyName: "detailPaneFlat", publicName: "detailPane", isSignal: true, isRequired: false, transformFunction: null }, paneListWidthFlat: { classPropertyName: "paneListWidthFlat", publicName: "paneListWidth", isSignal: true, isRequired: false, transformFunction: null }, paneTakeoverWidthFlat: { classPropertyName: "paneTakeoverWidthFlat", publicName: "paneTakeoverWidth", isSignal: true, isRequired: false, transformFunction: null }, activeRowId: { classPropertyName: "activeRowId", publicName: "activeRowId", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, singleLine: { classPropertyName: "singleLine", publicName: "singleLine", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, resizable: { classPropertyName: "resizable", publicName: "resizable", isSignal: true, isRequired: false, transformFunction: null }, columnChooser: { classPropertyName: "columnChooser", publicName: "columnChooser", isSignal: true, isRequired: false, transformFunction: null }, syncFlat: { classPropertyName: "syncFlat", publicName: "sync", isSignal: true, isRequired: false, transformFunction: null }, footerActionsDisabled: { classPropertyName: "footerActionsDisabled", publicName: "footerActionsDisabled", isSignal: true, isRequired: false, transformFunction: null }, rowId: { classPropertyName: "rowId", publicName: "rowId", isSignal: true, isRequired: false, transformFunction: null }, selectionModeFlat: { classPropertyName: "selectionModeFlat", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, selectedId: { classPropertyName: "selectedId", publicName: "selectedId", isSignal: true, isRequired: false, transformFunction: null }, rowSelectableFlat: { classPropertyName: "rowSelectableFlat", publicName: "rowSelectable", isSignal: true, isRequired: false, transformFunction: null }, flush: { classPropertyName: "flush", publicName: "flush", isSignal: true, isRequired: false, transformFunction: null }, caption: { classPropertyName: "caption", publicName: "caption", isSignal: true, isRequired: false, transformFunction: null }, hasMoreFlat: { classPropertyName: "hasMoreFlat", publicName: "hasMore", isSignal: true, isRequired: false, transformFunction: null }, loadingMoreFlat: { classPropertyName: "loadingMoreFlat", publicName: "loadingMore", isSignal: true, isRequired: false, transformFunction: null }, moreTotalFlat: { classPropertyName: "moreTotalFlat", publicName: "moreTotal", isSignal: true, isRequired: false, transformFunction: null }, groupSelectFlat: { classPropertyName: "groupSelectFlat", publicName: "groupSelect", isSignal: true, isRequired: false, transformFunction: null }, rowActions: { classPropertyName: "rowActions", publicName: "rowActions", isSignal: true, isRequired: false, transformFunction: null }, initialSelectionFlat: { classPropertyName: "initialSelectionFlat", publicName: "initialSelection", isSignal: true, isRequired: false, transformFunction: null }, selectedIds: { classPropertyName: "selectedIds", publicName: "selectedIds", isSignal: true, isRequired: false, transformFunction: null }, labels: { classPropertyName: "labels", publicName: "labels", isSignal: true, isRequired: false, transformFunction: null }, viewportHeightFlat: { classPropertyName: "viewportHeightFlat", publicName: "viewportHeight", isSignal: true, isRequired: false, transformFunction: null }, maxHeightFlat: { classPropertyName: "maxHeightFlat", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null }, editHint: { classPropertyName: "editHint", publicName: "editHint", isSignal: true, isRequired: false, transformFunction: null }, rowHeightFlat: { classPropertyName: "rowHeightFlat", publicName: "rowHeight", isSignal: true, isRequired: false, transformFunction: null }, lazyFlat: { classPropertyName: "lazyFlat", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, totalFlat: { classPropertyName: "totalFlat", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, stateKeyFlat: { classPropertyName: "stateKeyFlat", publicName: "stateKey", isSignal: true, isRequired: false, transformFunction: null }, columnState: { classPropertyName: "columnState", publicName: "columnState", isSignal: true, isRequired: false, transformFunction: null }, reorderable: { classPropertyName: "reorderable", publicName: "reorderable", isSignal: true, isRequired: false, transformFunction: null }, groupByFlat: { classPropertyName: "groupByFlat", publicName: "groupBy", isSignal: true, isRequired: false, transformFunction: null }, groupsFlat: { classPropertyName: "groupsFlat", publicName: "groups", isSignal: true, isRequired: false, transformFunction: null }, showEmptyGroupsFlat: { classPropertyName: "showEmptyGroupsFlat", publicName: "showEmptyGroups", isSignal: true, isRequired: false, transformFunction: null }, collapsedGroups: { classPropertyName: "collapsedGroups", publicName: "collapsedGroups", isSignal: true, isRequired: false, transformFunction: null }, filters: { classPropertyName: "filters", publicName: "filters", isSignal: true, isRequired: false, transformFunction: null }, quickFilter: { classPropertyName: "quickFilter", publicName: "quickFilter", isSignal: true, isRequired: false, transformFunction: null }, quickFilterFieldsFlat: { classPropertyName: "quickFilterFieldsFlat", publicName: "quickFilterFields", isSignal: true, isRequired: false, transformFunction: null }, quickFilterableFlat: { classPropertyName: "quickFilterableFlat", publicName: "quickFilterable", isSignal: true, isRequired: false, transformFunction: null }, quickFilterAlignFlat: { classPropertyName: "quickFilterAlignFlat", publicName: "quickFilterAlign", isSignal: true, isRequired: false, transformFunction: null }, childrenKeyFlat: { classPropertyName: "childrenKeyFlat", publicName: "childrenKey", isSignal: true, isRequired: false, transformFunction: null }, interactionMode: { classPropertyName: "interactionMode", publicName: "interactionMode", isSignal: true, isRequired: false, transformFunction: null }, selectionColumnFlat: { classPropertyName: "selectionColumnFlat", publicName: "selectionColumn", isSignal: true, isRequired: false, transformFunction: null }, selectionCfg: { classPropertyName: "selectionCfg", publicName: "selection", isSignal: true, isRequired: false, transformFunction: null }, paneFlat: { classPropertyName: "paneFlat", publicName: "pane", isSignal: true, isRequired: false, transformFunction: null }, pagingFlat: { classPropertyName: "pagingFlat", publicName: "paging", isSignal: true, isRequired: false, transformFunction: null }, virtualFlat: { classPropertyName: "virtualFlat", publicName: "virtual", isSignal: true, isRequired: false, transformFunction: null }, groupingCfg: { classPropertyName: "groupingCfg", publicName: "grouping", isSignal: true, isRequired: false, transformFunction: null }, filteringCfg: { classPropertyName: "filteringCfg", publicName: "filtering", isSignal: true, isRequired: false, transformFunction: null }, stateCfg: { classPropertyName: "stateCfg", publicName: "state", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activeRowId: "activeRowIdChange", selectedId: "selectedIdChange", loadMore: "loadMore", selectedIds: "selectedIdsChange", columnState: "columnStateChange", collapsedGroups: "collapsedGroupsChange", filters: "filtersChange", quickFilter: "quickFilterChange", rowActivate: "rowActivate", selectionChange: "selectionChange", syncChange: "syncChange", rowAction: "rowAction", lazyLoad: "lazyLoad", cellEdit: "cellEdit" }, host: { listeners: { "document:click": "onDocClickOverlays($event)", "document:keydown.escape": "onEscapeOverlays($event)" }, properties: { "attr.aria-busy": "loading() || loadingMore() ? \"true\" : null", "class.strct-dg-host--compact": "compact()", "class.strct-dg-host--singleline": "singleLine()", "class.strct-dg-host--virtual": "virtual()", "class.strct-dg-host--bounded": "!virtual() && maxHeight() !== null", "class.strct-dg-host--sticky": "stickyActive()", "class.strct-dg-host--flush": "flush()" }, classAttribute: "strct-dg-host" }, queries: [{ propertyName: "detailDef", first: true, predicate: StrctRowDetailDef, descendants: true, isSignal: true }, { propertyName: "groupHeaderDef", first: true, predicate: StrctGroupHeaderDef, descendants: true, isSignal: true }, { propertyName: "paneTitleDef", first: true, predicate: StrctDetailPaneTitle, descendants: true, isSignal: true }, { propertyName: "actionBarDef", first: true, predicate: StrctDatagridActionBar, descendants: true, isSignal: true }, { propertyName: "actionBarCaptionDef", first: true, predicate: StrctDatagridActionBarCaption, descendants: true, isSignal: true }, { propertyName: "cellDefs", predicate: StrctCellDef, isSignal: true }], ngImport: i0, template: `
17616
17807
  <!-- One polite region for everything the grid does to itself: sorting,
17617
17808
  paging and filtering all change the rows without saying so. -->
17618
17809
  <span class="strct-dg__announcer" role="status" aria-live="polite">{{ announcement() }}</span>
@@ -19219,7 +19410,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImpor
19219
19410
  '[class.strct-dg-host--sticky]': 'stickyActive()',
19220
19411
  '[class.strct-dg-host--flush]': 'flush()',
19221
19412
  }, styles: [".strct-dg__radio{width:15px;height:15px;accent-color:var(--acc);cursor:pointer}.strct-dg__radio:disabled{cursor:not-allowed}.strct-dg__row--locked .strct-dg__sel{opacity:.55}.strct-dg__actioncaption:empty{display:none}.strct-dg__actioncaption{display:inline-flex;align-items:center;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm);color:var(--t2)}.strct-dg__bulk{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:4px 10px;padding:7px 12px;border-bottom:1px solid var(--b2);background:var(--acc-s);color:var(--t2);font-size:var(--text-md)}.strct-dg__announcer{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.strct-dg-host{display:block;border:1px solid var(--b2);border-radius:var(--radius-lg);background:var(--bg-2);box-shadow:var(--shadow-rest)}.strct-dg-host--flush{border:0;border-radius:0;background:transparent;box-shadow:none}.strct-dg__more strct-spinner{margin-inline-end:4px}.strct-dg__caption{caption-side:top;text-align:start;padding:var(--space-2) var(--space-3);font-size:var(--text-sm);font-weight:600;color:var(--t2)}.strct-dg td.strct-dg__cell--mono{font-family:var(--mono);font-size:var(--text-sm)}.strct-dg td.strct-dg__cell--muted{color:var(--t2)}.strct-dg td.strct-dg__cell--numeric{font-variant-numeric:tabular-nums}.strct-dg__empty{color:var(--t2)}.strct-dg__celldesc{display:block;font-size:var(--text-sm);color:var(--t2);line-height:1.3}.strct-dg__scroll{flex:1 1 auto;min-width:0;overflow-x:auto;-webkit-overflow-scrolling:touch}.strct-dg-host--virtual .strct-dg__scroll,.strct-dg-host--bounded .strct-dg__scroll{overflow-y:auto}.strct-dg-host--virtual .strct-dg thead th,.strct-dg-host--bounded .strct-dg thead th{position:sticky;top:0;z-index:var(--z-raised)}.strct-dg__vspacer td{padding:0;border:0;background:transparent}.strct-dg th[draggable]{cursor:grab}.strct-dg__th--drop{box-shadow:inset 3px 0 0 var(--acc)}.strct-dg__grouprow td{background:var(--bg-2)!important;padding:0}.strct-dg__groupbtn{display:flex;align-items:center;gap:8px;width:100%;padding:7px 13px;border:0;background:transparent;color:var(--t1);font-family:var(--font);font-size:var(--text-sm);font-weight:600;cursor:pointer;text-align:start}.strct-dg__groupbtn:hover{background:var(--bg-3)}.strct-dg__groupbtn:focus-visible{outline:2px solid var(--acc50);outline-offset:-2px}.strct-dg__groupchev{display:inline-flex;color:var(--t3);transition:transform .15s ease}.strct-dg__groupchev--open{transform:rotate(90deg)}@media(prefers-reduced-motion:reduce){.strct-dg__groupchev{transition:none}}.strct-dg__grouplabel--critical{color:var(--critical)}.strct-dg__grouplabel--warning{color:var(--warning)}.strct-dg__grouplabel--success{color:var(--success)}.strct-dg__grouplabel--accent{color:var(--acc)}.strct-dg__grouplabel--neutral,.strct-dg__grouplabel--none{color:var(--t1)}.strct-dg__groupnote{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm);font-weight:400;color:var(--t2)}.strct-dg__groupcount{min-width:18px;height:18px;padding:0 5px;display:inline-flex;align-items:center;justify-content:center;font-size:12px;border-radius:4px;background:var(--acc-m);color:var(--acc);font-variant-numeric:tabular-nums}.strct-dg__groupcount--critical{background:var(--critical-bg);color:var(--critical)}.strct-dg__groupcount--warning{background:var(--warning-bg);color:var(--warning)}.strct-dg__groupcount--success{background:var(--success-bg);color:var(--success)}.strct-dg__groupcount--neutral,.strct-dg__groupcount--none{background:var(--bg-3);color:var(--t2)}.strct-dg-host--singleline .strct-dg{border-collapse:separate;border-spacing:0}.strct-dg-host--sticky .strct-dg,.strct-dg-host--virtual .strct-dg,.strct-dg-host--bounded .strct-dg{border-collapse:separate;border-spacing:0;overflow:visible;border-radius:0}.strct-dg-host--sticky .strct-dg{width:max-content;min-width:100%}.strct-dg .strct-dg__cell--sticky{position:sticky;z-index:calc(var(--z-base) + 2)}.strct-dg thead th.strct-dg__cell--sticky{z-index:calc(var(--z-raised) + 1)}.strct-dg .strct-dg__cell--sticky-last:after{content:\"\";position:absolute;top:0;bottom:0;inset-inline-end:-1px;width:7px;pointer-events:none;background:linear-gradient(to right,rgba(0,0,0,.14),transparent)}[dir=rtl] .strct-dg .strct-dg__cell--sticky-last:after{background:linear-gradient(to left,rgba(0,0,0,.14),transparent)}.strct-dg-host--sticky .strct-dg__expandcol,.strct-dg-host--sticky .strct-dg__expandcell{width:36px;min-width:36px;max-width:36px;box-sizing:border-box}.strct-dg-host--sticky .strct-dg__sel{width:40px;min-width:40px;max-width:40px;box-sizing:border-box}.strct-dg-host--sticky tbody .strct-dg__cell--sticky{background:var(--bg-1)}[data-theme=dark] .strct-dg-host--sticky tbody .strct-dg__cell--sticky{background:var(--bg-3)}.strct-dg-host--sticky tbody tr:hover .strct-dg__cell--sticky{background:linear-gradient(var(--acc-s),var(--acc-s)) var(--bg-1)}[data-theme=dark] .strct-dg-host--sticky tbody tr:hover .strct-dg__cell--sticky{background:linear-gradient(var(--acc-s),var(--acc-s)) var(--bg-3)}.strct-dg-host--sticky tbody .strct-dg__row--selected .strct-dg__cell--sticky{background:linear-gradient(var(--acc-m),var(--acc-m)) var(--bg-1)}[data-theme=dark] .strct-dg-host--sticky tbody .strct-dg__row--selected .strct-dg__cell--sticky{background:linear-gradient(var(--acc-m),var(--acc-m)) var(--bg-3)}.strct-dg{width:100%;border-collapse:collapse;font-size:13px;overflow:hidden;background:var(--bg-2)}.strct-dg-host:not(:has(.strct-dg__toolbar)) .strct-dg{border-start-start-radius:4px;border-start-end-radius:4px}.strct-dg-host:not(:has(.strct-dg__foot)) .strct-dg{border-end-start-radius:4px;border-end-end-radius:4px}.strct-dg th,.strct-dg td{padding:9px 13px;text-align:start;border-bottom:1px solid var(--b1)}.strct-dg tbody td{background:var(--bg-1)}[data-theme=dark] .strct-dg tbody td{background:var(--bg-3)}.strct-dg-host--compact .strct-dg th,.strct-dg-host--compact .strct-dg td{padding:5px 11px}.strct-dg-host--singleline .strct-dg tbody tr:not(.strct-dg__detailrow)>td{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:360px}.strct-dg th{position:relative;font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.4px;color:var(--t2);background:var(--bg-2);white-space:nowrap;-webkit-user-select:none;user-select:none}.strct-dg__th--sortable{cursor:pointer}.strct-dg__th--sortable:hover{color:var(--t1)}.strct-dg__sortbtn{display:inline-flex;align-items:center;gap:inherit;padding:0;border:0;background:none;color:inherit;font:inherit;text-transform:inherit;letter-spacing:inherit;text-align:inherit;cursor:pointer}.strct-dg__sortbtn:focus-visible{outline:2px solid var(--acc50);outline-offset:2px;border-radius:var(--radius-sm)}.strct-dg__th--sortable:focus-visible{outline:2px solid var(--acc50);outline-offset:-2px}.strct-dg__hd{display:inline-flex;align-items:center;gap:5px}.strct-dg__sorticon{color:var(--t3)}.strct-dg__th--sortable:hover .strct-dg__sorticon{color:var(--acc)}.strct-dg__resize{position:absolute;inset-inline-end:0;top:0;bottom:0;width:4px;cursor:col-resize;background:transparent;z-index:calc(var(--z-base) + 1)}.strct-dg__resize:hover{background:var(--acc)}.strct-dg td{color:var(--t1)}.strct-dg tbody tr:last-child td{border-bottom:0}.strct-dg tbody tr:not(.strct-dg__detailrow):hover td{background:linear-gradient(var(--acc-s),var(--acc-s)) var(--bg-1)}[data-theme=dark] .strct-dg tbody tr:not(.strct-dg__detailrow):hover td{background:linear-gradient(var(--acc-s),var(--acc-s)) var(--bg-3)}.strct-dg tbody .strct-dg__row--selected td{background:linear-gradient(var(--acc-m),var(--acc-m)) var(--bg-1)}[data-theme=dark] .strct-dg tbody .strct-dg__row--selected td{background:linear-gradient(var(--acc-m),var(--acc-m)) var(--bg-3)}.strct-dg tbody tr.strct-dg__row--selected:hover td{background:linear-gradient(var(--acc-s),var(--acc-s)),linear-gradient(var(--acc-m),var(--acc-m)) var(--bg-1)}[data-theme=dark] .strct-dg tbody tr.strct-dg__row--selected:hover td{background:linear-gradient(var(--acc-s),var(--acc-s)),linear-gradient(var(--acc-m),var(--acc-m)) var(--bg-3)}.strct-dg__sel{width:1%;white-space:nowrap}.strct-dg__sel .strct-cb,.strct-dg__sel .strct-dg__radio,.strct-dg__expandbtn{position:relative}.strct-dg__sel .strct-cb:after,.strct-dg__sel .strct-dg__radio:after,.strct-dg__expandbtn:after{content:\"\";position:absolute;inset:-11px -13px;min-width:24px;min-height:24px}.strct-dg-host--compact .strct-dg__sel .strct-cb:after,.strct-dg-host--compact .strct-dg__sel .strct-dg__radio:after,.strct-dg-host--compact .strct-dg__expandbtn:after{inset:-7px -11px}.strct-dg__sel input{accent-color:var(--acc);width:15px;height:15px;cursor:pointer}.strct-dg__expandcol,.strct-dg__expandcell{width:1%;white-space:nowrap}.strct-dg__actioncol,.strct-dg__actioncell{width:1%;white-space:nowrap;text-align:end}.strct-dg__kebab{display:inline-flex;padding:4px;border:0;border-radius:2px;background:transparent;color:var(--t3);cursor:pointer;transition:color .14s ease,background .14s ease}.strct-dg__kebab:hover{color:var(--t1);background:var(--bg-3)}.strct-dg__expandbtn{position:relative;display:inline-flex;align-items:center;justify-content:center;padding:3px;border:0;border-radius:2px;background:transparent;color:var(--t3);cursor:pointer;transition:transform .15s ease,color .15s ease}.strct-dg__expandbtn:hover{color:var(--t1);background:var(--bg-3)}.strct-dg__expandbtn--open{transform:rotate(90deg);color:var(--acc)}.strct-dg__detailbtn{display:inline-flex;padding:3px;border:0;border-radius:2px;background:transparent;color:var(--t3);cursor:pointer;transition:color .14s ease,background .14s ease}.strct-dg__detailbtn:hover{color:var(--acc);background:var(--bg-3)}.strct-dg__detailbtn--active{color:var(--acc);background:var(--acc-m)}.strct-dg__detailrow td{background:var(--bg-2);padding:0}.strct-dg__detail{padding:14px 16px;font-size:13px;color:var(--t2)}.strct-dg__layout{display:flex;align-items:flex-start;min-width:0}.strct-dg__layout--paned{gap:0}.strct-dg__layout--paned>.strct-dg__scroll{flex:0 0 auto;width:var(--strct-dg-pane-list-w, 260px);min-width:var(--strct-dg-pane-list-w, 260px);max-width:var(--strct-dg-pane-list-w, 260px)}.strct-dg__layout--paned>.strct-dg__scroll>.strct-dg{width:100%;min-width:0;max-width:none;flex-shrink:0;border-start-end-radius:0;border-end-end-radius:0}.strct-dg__layout--panetakeover>.strct-dg__scroll{display:none}.strct-dg__layout--panetakeover>.strct-dg__pane{flex:1;min-width:0}.strct-dg__pane-meta,.strct-dg__pane-actions{display:inline-flex;align-items:center;gap:var(--space-2)}.strct-dg__pane-meta:empty,.strct-dg__pane-actions:empty{display:none}.strct-dg__pane-actions{margin-inline-start:auto}.strct-dg__pane-back{display:inline-flex;align-items:center;border:0;background:none;color:var(--t2);cursor:pointer;padding:2px;border-radius:var(--radius-sm)}.strct-dg__row--clickable{cursor:pointer}.strct-dg tbody .strct-dg__row--active td{background:linear-gradient(var(--acc-m),var(--acc-m)) var(--bg-1)}[data-theme=dark] .strct-dg tbody .strct-dg__row--active td{background:linear-gradient(var(--acc-m),var(--acc-m)) var(--bg-3)}.strct-dg__layout--paned .strct-dg__row--active td:last-child{position:relative;padding-inline-end:26px}.strct-dg__layout--paned .strct-dg__row--active td:last-child:after{content:\"\";position:absolute;inset-inline-end:11px;top:50%;width:6px;height:6px;border-top:1.6px solid var(--acc);border-inline-end:1.6px solid var(--acc);transform:translateY(-50%) rotate(45deg)}.strct-dg__pane{flex:1;min-width:0;align-self:stretch;background:var(--bg-1);border:1px solid var(--b2);border-inline-start:2px solid var(--acc);border-radius:4px;border-start-start-radius:0;border-end-start-radius:0;overflow:hidden;animation:strct-dg-pane-in .14s ease}.strct-dg__pane-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:11px 14px;border-bottom:1px solid var(--b1);font-size:13px;font-weight:600;color:var(--t1)}.strct-dg__pane-close{display:inline-flex;padding:3px;border:0;border-radius:2px;background:transparent;color:var(--t3);cursor:pointer}.strct-dg__pane-close:hover{color:var(--t1);background:var(--bg-3)}.strct-dg__pane-body{padding:14px 16px;font-size:13px;color:var(--t2)}@keyframes strct-dg-pane-in{0%{opacity:0;transform:translate(8px)}}@keyframes strct-skeleton-pulse{0%,to{opacity:.4}50%{opacity:.7}}.strct-dg__skeleton-block{height:12px;border-radius:var(--radius-sm);background:linear-gradient(90deg,var(--bg-3) 25%,var(--skeleton-hi, var(--acc18)) 50%,var(--bg-3) 75%);background-size:200% 100%;animation:strct-dg-skeleton-sweep 1.1s linear infinite}@keyframes strct-dg-skeleton-sweep{0%{background-position:100% 0}to{background-position:-100% 0}}@media(prefers-reduced-motion:reduce){.strct-dg__skeleton-block{animation:none;background:var(--skeleton-hi, var(--acc18))}}.strct-dg__skeleton-row td{border-bottom:1px solid var(--b1)}.strct-dg__empty{text-align:center;color:var(--t2);padding:22px}.strct-dg__quickfilter{min-width:180px;max-width:260px}.strct-dg__quickfilter--end{order:2;margin-inline-start:auto}.strct-dg__filternote--end{order:3}.strct-dg__filternote{font-size:var(--text-sm);color:var(--t2);font-variant-numeric:tabular-nums;white-space:nowrap}.strct-dg__toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:9px 14px;border-bottom:1px solid var(--b2)}.strct-dg__foot{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:9px 14px;border-top:1px solid var(--b2);flex-wrap:wrap}.strct-dg__foot-left,.strct-dg__foot-right{display:flex;align-items:center;gap:12px}.strct-dg__actions{position:relative}.strct-dg__chooser-menu{position:absolute;bottom:calc(100% + 6px);inset-inline-start:0;z-index:var(--z-sticky);min-width:180px;background:var(--bg-1);border:1px solid var(--b2);border-radius:4px;box-shadow:var(--shadow-pop);padding:6px;display:flex;flex-direction:column;gap:2px}.strct-dg__chooser-menu--right{inset-inline-start:auto;inset-inline-end:0}.strct-dg__chooser-item{display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:3px;cursor:pointer;font-size:12px;color:var(--t1);transition:background .1s ease;-webkit-user-select:none;user-select:none}.strct-dg__chooser-item:hover{background:var(--bg-3)}.strct-dg__count{font-size:12px;color:var(--t2)}.strct-dg__count-sep{margin:0 8px;color:var(--b2)}.strct-dg__count-sel{color:var(--acc)}.strct-dg__filterbtn{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;margin-inline-start:2px;padding:0;border:0;border-radius:2px;background:transparent;color:var(--t3);cursor:pointer;vertical-align:middle}.strct-dg__filterbtn:hover{color:var(--t1);background:var(--bg-3)}.strct-dg__filterbtn--active{color:var(--acc)}.strct-dg__filterbtn:focus-visible{outline:2px solid var(--acc50);outline-offset:1px}.strct-dg__filterpanel{position:absolute;z-index:calc(var(--z-dropdown) + 10);display:flex;flex-direction:column;gap:6px;min-width:180px;padding:10px;background:var(--bg-1);border:1px solid var(--b2);border-radius:3px;box-shadow:var(--shh);font-weight:400;text-transform:none;letter-spacing:normal;white-space:nowrap}.strct-dg__filterinput{padding:5px 8px;border:1px solid var(--b2);border-radius:var(--radius-sm);background:var(--bg-2);color:var(--t1);font-family:var(--font);font-size:12px}.strct-dg__filterinput:focus-visible{outline:2px solid var(--acc50);outline-offset:1px}.strct-dg__filteropt{display:flex;align-items:center;gap:7px;font-size:12.5px;color:var(--t1);cursor:pointer}.strct-dg__filterclear{align-self:flex-start;padding:3px 8px;border:1px solid var(--b2);border-radius:var(--radius-sm);background:transparent;color:var(--t2);font-family:var(--font);font-size:var(--text-sm);cursor:pointer}.strct-dg__filterclear:hover:not(:disabled){color:var(--t1);background:var(--bg-3)}.strct-dg__filterclear:disabled{color:var(--t4);cursor:default}.strct-dg tbody tr[tabindex]:focus-visible{outline:2px solid var(--acc50);outline-offset:-2px}.strct-dg__treepad{display:inline-block;height:1px;vertical-align:middle}.strct-dg__treebtn{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;margin-inline-end:4px;padding:0;border:0;border-radius:2px;background:transparent;color:var(--t3);cursor:pointer;vertical-align:middle}.strct-dg__treebtn:hover{color:var(--t1);background:var(--bg-3)}.strct-dg__treebtn:focus-visible{outline:2px solid var(--acc50);outline-offset:1px}.strct-dg__treebtn strct-icon{transition:transform .15s ease}.strct-dg__treebtn--open strct-icon{transform:rotate(90deg)}.strct-dg__treebtn--leaf{cursor:default;pointer-events:none}@media(prefers-reduced-motion:reduce){.strct-dg__treebtn strct-icon{transition:none}}.strct-dg__cell--editable{cursor:text;position:relative}.strct-dg__cell--editable:hover{box-shadow:inset 0 0 0 1px var(--b2)}.strct-dg__cell--editable:focus-visible{outline:none;box-shadow:inset 0 0 0 2px var(--acc50)}.strct-dg__editpencil{position:absolute;top:50%;inset-inline-end:6px;transform:translateY(-50%);color:var(--t3);opacity:0;pointer-events:none}td:hover>.strct-dg__editpencil,td:focus-within>.strct-dg__editpencil{opacity:1}.strct-dg__editinput{width:100%;box-sizing:border-box;padding:3px 6px;border:1px solid var(--acc);border-radius:var(--radius-sm);background:var(--bg-1);color:var(--t1);font:inherit}.strct-dg__editselect,.strct-dg__editnumber{display:block;width:100%}.strct-dg__editinput:focus-visible{outline:2px solid var(--acc50);outline-offset:1px}\n"] }]
19222
- }], ctorParameters: () => [], propDecorators: { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: true }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: true }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], expandable: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandable", required: false }] }], detailPane: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailPane", required: false }] }], paneListWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "paneListWidth", required: false }] }], paneTakeoverWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "paneTakeoverWidth", required: false }] }], activeRowId: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeRowId", required: false }] }, { type: i0.Output, args: ["activeRowIdChange"] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], singleLine: [{ type: i0.Input, args: [{ isSignal: true, alias: "singleLine", required: false }] }], emptyText: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyText", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], resizable: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizable", required: false }] }], columnChooser: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnChooser", required: false }] }], sync: [{ type: i0.Input, args: [{ isSignal: true, alias: "sync", required: false }] }], footerActionsDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "footerActionsDisabled", required: false }] }], rowId: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowId", required: false }] }], selectionMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionMode", required: false }] }], selectedId: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedId", required: false }] }, { type: i0.Output, args: ["selectedIdChange"] }], rowSelectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowSelectable", required: false }] }], flush: [{ type: i0.Input, args: [{ isSignal: true, alias: "flush", required: false }] }], caption: [{ type: i0.Input, args: [{ isSignal: true, alias: "caption", required: false }] }], paging: [{ type: i0.Input, args: [{ isSignal: true, alias: "paging", required: false }] }], hasMore: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasMore", required: false }] }], loadingMore: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingMore", required: false }] }], moreTotal: [{ type: i0.Input, args: [{ isSignal: true, alias: "moreTotal", required: false }] }], loadMore: [{ type: i0.Output, args: ["loadMore"] }], groupSelect: [{ type: i0.Input, args: [{ isSignal: true, alias: "groupSelect", required: false }] }], rowActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowActions", required: false }] }], initialSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialSelection", required: false }] }], selectedIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedIds", required: false }] }, { type: i0.Output, args: ["selectedIdsChange"] }], labels: [{ type: i0.Input, args: [{ isSignal: true, alias: "labels", required: false }] }], virtual: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtual", required: false }] }], viewportHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewportHeight", required: false }] }], maxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHeight", required: false }] }], editHint: [{ type: i0.Input, args: [{ isSignal: true, alias: "editHint", required: false }] }], rowHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowHeight", required: false }] }], lazy: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], total: [{ type: i0.Input, args: [{ isSignal: true, alias: "total", required: false }] }], stateKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateKey", required: false }] }], columnState: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnState", required: false }] }, { type: i0.Output, args: ["columnStateChange"] }], reorderable: [{ type: i0.Input, args: [{ isSignal: true, alias: "reorderable", required: false }] }], groupBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "groupBy", required: false }] }], groups: [{ type: i0.Input, args: [{ isSignal: true, alias: "groups", required: false }] }], showEmptyGroups: [{ type: i0.Input, args: [{ isSignal: true, alias: "showEmptyGroups", required: false }] }], collapsedGroups: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsedGroups", required: false }] }, { type: i0.Output, args: ["collapsedGroupsChange"] }], filters: [{ type: i0.Input, args: [{ isSignal: true, alias: "filters", required: false }] }, { type: i0.Output, args: ["filtersChange"] }], quickFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "quickFilter", required: false }] }, { type: i0.Output, args: ["quickFilterChange"] }], quickFilterFields: [{ type: i0.Input, args: [{ isSignal: true, alias: "quickFilterFields", required: false }] }], quickFilterable: [{ type: i0.Input, args: [{ isSignal: true, alias: "quickFilterable", required: false }] }], quickFilterAlign: [{ type: i0.Input, args: [{ isSignal: true, alias: "quickFilterAlign", required: false }] }], childrenKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "childrenKey", required: false }] }], interactionMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactionMode", required: false }] }], selectionColumn: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionColumn", required: false }] }], rowActivate: [{ type: i0.Output, args: ["rowActivate"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], syncChange: [{ type: i0.Output, args: ["syncChange"] }], rowAction: [{ type: i0.Output, args: ["rowAction"] }], lazyLoad: [{ type: i0.Output, args: ["lazyLoad"] }], cellEdit: [{ type: i0.Output, args: ["cellEdit"] }], detailDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrctRowDetailDef), { isSignal: true }] }], groupHeaderDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrctGroupHeaderDef), { isSignal: true }] }], paneTitleDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrctDetailPaneTitle), { isSignal: true }] }], actionBarDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrctDatagridActionBar), { isSignal: true }] }], actionBarCaptionDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrctDatagridActionBarCaption), { isSignal: true }] }], cellDefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrctCellDef), { isSignal: true }] }], onDocClickOverlays: [{
19413
+ }], ctorParameters: () => [], propDecorators: { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: true }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: true }] }], pageSizeFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], selectableFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], expandable: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandable", required: false }] }], detailPaneFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailPane", required: false }] }], paneListWidthFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "paneListWidth", required: false }] }], paneTakeoverWidthFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "paneTakeoverWidth", required: false }] }], activeRowId: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeRowId", required: false }] }, { type: i0.Output, args: ["activeRowIdChange"] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], singleLine: [{ type: i0.Input, args: [{ isSignal: true, alias: "singleLine", required: false }] }], emptyText: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyText", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], resizable: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizable", required: false }] }], columnChooser: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnChooser", required: false }] }], syncFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "sync", required: false }] }], footerActionsDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "footerActionsDisabled", required: false }] }], rowId: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowId", required: false }] }], selectionModeFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionMode", required: false }] }], selectedId: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedId", required: false }] }, { type: i0.Output, args: ["selectedIdChange"] }], rowSelectableFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowSelectable", required: false }] }], flush: [{ type: i0.Input, args: [{ isSignal: true, alias: "flush", required: false }] }], caption: [{ type: i0.Input, args: [{ isSignal: true, alias: "caption", required: false }] }], hasMoreFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasMore", required: false }] }], loadingMoreFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingMore", required: false }] }], moreTotalFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "moreTotal", required: false }] }], loadMore: [{ type: i0.Output, args: ["loadMore"] }], groupSelectFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "groupSelect", required: false }] }], rowActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowActions", required: false }] }], initialSelectionFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialSelection", required: false }] }], selectedIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedIds", required: false }] }, { type: i0.Output, args: ["selectedIdsChange"] }], labels: [{ type: i0.Input, args: [{ isSignal: true, alias: "labels", required: false }] }], viewportHeightFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewportHeight", required: false }] }], maxHeightFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHeight", required: false }] }], editHint: [{ type: i0.Input, args: [{ isSignal: true, alias: "editHint", required: false }] }], rowHeightFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowHeight", required: false }] }], lazyFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], totalFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "total", required: false }] }], stateKeyFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateKey", required: false }] }], columnState: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnState", required: false }] }, { type: i0.Output, args: ["columnStateChange"] }], reorderable: [{ type: i0.Input, args: [{ isSignal: true, alias: "reorderable", required: false }] }], groupByFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "groupBy", required: false }] }], groupsFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "groups", required: false }] }], showEmptyGroupsFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "showEmptyGroups", required: false }] }], collapsedGroups: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsedGroups", required: false }] }, { type: i0.Output, args: ["collapsedGroupsChange"] }], filters: [{ type: i0.Input, args: [{ isSignal: true, alias: "filters", required: false }] }, { type: i0.Output, args: ["filtersChange"] }], quickFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "quickFilter", required: false }] }, { type: i0.Output, args: ["quickFilterChange"] }], quickFilterFieldsFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "quickFilterFields", required: false }] }], quickFilterableFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "quickFilterable", required: false }] }], quickFilterAlignFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "quickFilterAlign", required: false }] }], childrenKeyFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "childrenKey", required: false }] }], interactionMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactionMode", required: false }] }], selectionColumnFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionColumn", required: false }] }], rowActivate: [{ type: i0.Output, args: ["rowActivate"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], syncChange: [{ type: i0.Output, args: ["syncChange"] }], rowAction: [{ type: i0.Output, args: ["rowAction"] }], lazyLoad: [{ type: i0.Output, args: ["lazyLoad"] }], cellEdit: [{ type: i0.Output, args: ["cellEdit"] }], selectionCfg: [{ type: i0.Input, args: [{ isSignal: true, alias: "selection", required: false }] }], paneFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "pane", required: false }] }], pagingFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "paging", required: false }] }], virtualFlat: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtual", required: false }] }], groupingCfg: [{ type: i0.Input, args: [{ isSignal: true, alias: "grouping", required: false }] }], filteringCfg: [{ type: i0.Input, args: [{ isSignal: true, alias: "filtering", required: false }] }], stateCfg: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], detailDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrctRowDetailDef), { isSignal: true }] }], groupHeaderDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrctGroupHeaderDef), { isSignal: true }] }], paneTitleDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrctDetailPaneTitle), { isSignal: true }] }], actionBarDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrctDatagridActionBar), { isSignal: true }] }], actionBarCaptionDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrctDatagridActionBarCaption), { isSignal: true }] }], cellDefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrctCellDef), { isSignal: true }] }], onDocClickOverlays: [{
19223
19414
  type: HostListener,
19224
19415
  args: ['document:click', ['$event']]
19225
19416
  }], onEscapeOverlays: [{