@aquera/ngx-smart-table 0.0.31 → 0.0.32

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.
@@ -529,6 +529,14 @@ declare class TableState {
529
529
  readonly requestAddRow$: Observable<{
530
530
  focusColumn: number;
531
531
  }>;
532
+ private _requestFocusTabs$;
533
+ readonly requestFocusTabs$: Observable<void>;
534
+ private _requestEditFocusedCell$;
535
+ readonly requestEditFocusedCell$: Observable<void>;
536
+ private _requestFocusRowActions$;
537
+ readonly requestFocusRowActions$: Observable<number>;
538
+ private _requestFocusHeader$;
539
+ readonly requestFocusHeader$: Observable<number>;
532
540
  private _pendingFocusAfterRowAdd;
533
541
  private _rowCount;
534
542
  private _columnCount;
@@ -731,6 +739,9 @@ declare class TableState {
731
739
  * Focus a cell by position
732
740
  */
733
741
  focusCell(rowIndex: number, columnIndex: number): void;
742
+ get rowCount(): number;
743
+ get columnCount(): number;
744
+ requestEditFocusedCell(): void;
734
745
  /**
735
746
  * Get currently focused position
736
747
  */
@@ -761,6 +772,8 @@ declare class TableState {
761
772
  * Clear focus
762
773
  */
763
774
  clearFocus(): void;
775
+ /** Emit requestFocusTabs$ to signal that focus should return to the sheet tabs/headers. */
776
+ requestFocusTabs(): void;
764
777
  /**
765
778
  * Check if navigation is active
766
779
  */
@@ -1607,7 +1620,11 @@ declare enum NavigationKey {
1607
1620
  /**
1608
1621
  * Escape key
1609
1622
  */
1610
- ESCAPE = "Escape"
1623
+ ESCAPE = "Escape",
1624
+ /**
1625
+ * Space key — starts cell editing
1626
+ */
1627
+ SPACE = " "
1611
1628
  }
1612
1629
  /**
1613
1630
  * Navigation directions
@@ -2081,6 +2098,11 @@ interface TableConfig {
2081
2098
  * Display configuration
2082
2099
  */
2083
2100
  display?: {
2101
+ /**
2102
+ * Accessible label for the table element (exposed as `aria-label`).
2103
+ * Used by screen readers to identify the table. Defaults to `'Data table'`.
2104
+ */
2105
+ ariaLabel?: string;
2084
2106
  /**
2085
2107
  * Make table header sticky on scroll
2086
2108
  * @default true
@@ -2123,6 +2145,32 @@ interface TableConfig {
2123
2145
  * Not serializable in JSON configs (TypeScript only).
2124
2146
  */
2125
2147
  rowBackground?: (rowData: any, context: TableRowBackgroundContext) => string | null | undefined;
2148
+ /**
2149
+ * Optional icon shown next to the row number from row data — useful for status badges
2150
+ * like "disabled", "warning", "locked". Return a Nile icon name to render the icon next
2151
+ * to the row number inside the same sticky row-number cell. Return `null` / `undefined` / `''`
2152
+ * to show no icon for that row. Has no effect when `showRowNumber` is `false`.
2153
+ *
2154
+ * Optionally return `{ name, tooltip }` to also surface a hover tooltip on the icon.
2155
+ * Not serializable in JSON configs (TypeScript only).
2156
+ *
2157
+ * @example
2158
+ * display: {
2159
+ * showRowNumber: true,
2160
+ * rowNumberIcon: (row) => row.disabled ? 'disabled' : null,
2161
+ * }
2162
+ */
2163
+ rowNumberIcon?: (rowData: any, context: TableRowBackgroundContext) => string | {
2164
+ name: string;
2165
+ tooltip?: string;
2166
+ } | null | undefined;
2167
+ /**
2168
+ * Explicit pixel width of the row-number column. Defaults to `30` when no
2169
+ * `rowNumberIcon` is configured, and `60` when one is — auto-sized to fit
2170
+ * triple-digit numbers plus the trailing status icon. Override if you have
2171
+ * very large row counts (4+ digits) or want a wider gutter.
2172
+ */
2173
+ rowNumberWidth?: number;
2126
2174
  /**
2127
2175
  * Customize the keyboard-focused cell outline (`.cell-focused` when keyboard navigation is enabled).
2128
2176
  * Any property omitted keeps the library default.
@@ -2319,10 +2367,286 @@ interface SheetActionContext {
2319
2367
  actions: SheetAction[];
2320
2368
  }
2321
2369
 
2370
+ /**
2371
+ * Condition builder operator types.
2372
+ *
2373
+ * Operator definitions are consumer-provided via ConditionBuilderConfig.operators.
2374
+ * The library does not ship a default operator set.
2375
+ */
2376
+ /**
2377
+ * Arity of an operator — how many value inputs the operator needs.
2378
+ * - 'none' : operator takes no value (e.g. IS_CHANGED, IS_EMPTY)
2379
+ * - 'single' : operator takes one value
2380
+ * - 'multi' : operator takes a list of values
2381
+ */
2382
+ type OperatorArity = 'none' | 'single' | 'multi';
2383
+ /**
2384
+ * Logical connector between two adjacent conditions.
2385
+ * The first condition in a list has an unused connector (defaults to 'AND').
2386
+ */
2387
+ type LogicalConnector = 'AND' | 'OR';
2388
+ /**
2389
+ * Group type — how subConditions inside a group are combined.
2390
+ * - 'all' : all subConditions must be true (AND)
2391
+ * - 'any' : at least one subCondition must be true (OR)
2392
+ */
2393
+ type GroupType = 'all' | 'any';
2394
+ /**
2395
+ * Declarative definition of one comparison operator.
2396
+ */
2397
+ interface OperatorDefinition {
2398
+ /** Stable identifier used in the saved condition (e.g. 'EQUAL'). */
2399
+ key: string;
2400
+ /** User-visible label (e.g. 'Equals to'). */
2401
+ label: string;
2402
+ /** Whether this operator needs a value, a single value, or multiple values. */
2403
+ arity: OperatorArity;
2404
+ }
2405
+
2406
+ /**
2407
+ * Field (attribute) schema for the condition builder.
2408
+ *
2409
+ * Fields are consumer-provided via ConditionBuilderConfig.fields.
2410
+ * The library does not ship default fields.
2411
+ */
2412
+ /**
2413
+ * Editor variant used to render a field's value input.
2414
+ * - 'text' : free-form text, single value
2415
+ * - 'chip' : free-form text, multi-value (chips)
2416
+ * - 'select' : dropdown of predefined options, single value
2417
+ * - 'multi-select' : dropdown of predefined options, multi value
2418
+ */
2419
+ type FieldValueEditor = 'text' | 'chip' | 'select' | 'multi-select';
2420
+ /**
2421
+ * A predefined option for select / multi-select editors.
2422
+ */
2423
+ interface FieldOption {
2424
+ /** Stable value stored in the condition. */
2425
+ value: string;
2426
+ /** User-visible label. */
2427
+ label: string;
2428
+ }
2429
+ /**
2430
+ * Declarative definition of one attribute the user can build conditions against.
2431
+ */
2432
+ interface FieldDefinition {
2433
+ /** Stable identifier stored in the condition (e.g. 'userStatus'). */
2434
+ attribute: string;
2435
+ /** User-visible label (e.g. 'User Status'). */
2436
+ screenName: string;
2437
+ /** Which value editor to render once the user picks this field. */
2438
+ valueEditor: FieldValueEditor;
2439
+ /**
2440
+ * Operator keys this field supports. If omitted, all operators from the
2441
+ * builder config are allowed. Operator keys must match an OperatorDefinition.key.
2442
+ */
2443
+ operators?: string[];
2444
+ /** Predefined options — required when valueEditor is 'select' or 'multi-select'. */
2445
+ options?: FieldOption[];
2446
+ /**
2447
+ * Placeholder text shown in the value editor when nothing is selected.
2448
+ * Falls back to a sensible default per editor type when omitted.
2449
+ */
2450
+ valuePlaceholder?: string;
2451
+ }
2452
+ /**
2453
+ * Grouped fields shown as a submenu in the field picker. Matches the v1 admin-ui
2454
+ * pattern where top-level options ("Groups Membership", "Operation") sit alongside
2455
+ * a nested "Attributes" category whose entries (often dozens or hundreds, fetched
2456
+ * dynamically per tenant) live behind a searchable submenu.
2457
+ */
2458
+ interface FieldCategory {
2459
+ /** Stable identifier for the category. */
2460
+ id: string;
2461
+ /** User-visible label (e.g. 'Attributes'). */
2462
+ label: string;
2463
+ /** Fields shown inside this category's submenu. */
2464
+ fields: FieldDefinition[];
2465
+ /**
2466
+ * Show a search input above the field list. Recommended for categories
2467
+ * with more than a handful of fields.
2468
+ * @default true
2469
+ */
2470
+ searchable?: boolean;
2471
+ }
2472
+
2473
+ /**
2474
+ * Condition builder configuration — provided by the consuming application.
2475
+ *
2476
+ * The library ships no defaults. The consumer is responsible for supplying
2477
+ * the field schema, operator catalogue, and feature flags.
2478
+ */
2479
+
2480
+ interface ConditionBuilderConfig {
2481
+ /** Top-level fields, shown directly in the field picker. */
2482
+ fields: FieldDefinition[];
2483
+ /**
2484
+ * Optional grouped fields. Each category shows as one entry in the top-level
2485
+ * picker with a chevron — clicking it opens a submenu containing the
2486
+ * category's fields (with optional search).
2487
+ */
2488
+ categories?: FieldCategory[];
2489
+ /** Available comparison operators. */
2490
+ operators: OperatorDefinition[];
2491
+ /**
2492
+ * Allow toggling between condition-builder UI and raw expression mode.
2493
+ * When false, the expression-mode toggle is hidden.
2494
+ * @default false
2495
+ */
2496
+ allowExpressionMode?: boolean;
2497
+ /**
2498
+ * Allow adding group conditions (1-level nesting).
2499
+ * When false, only flat single conditions can be added.
2500
+ * @default true
2501
+ */
2502
+ allowGroups?: boolean;
2503
+ /**
2504
+ * Maximum number of top-level conditions. Add buttons disable once reached.
2505
+ * @default 10
2506
+ */
2507
+ maxConditions?: number;
2508
+ /**
2509
+ * Language token-set for syntax highlighting in expression mode.
2510
+ * Passed to nile-code-editor's `language` prop.
2511
+ * @default 'javascript'
2512
+ */
2513
+ expressionLanguage?: 'javascript' | 'sql' | 'json' | 'html';
2514
+ /**
2515
+ * Nested autocompletion tree forwarded to nile-code-editor's
2516
+ * `customAutoCompletions`. Same shape v1 used in admin-ui — typically a
2517
+ * nested object describing variable hierarchies, e.g.:
2518
+ * { DEST: { target: {...}, projected: {...}, meta: {...} } }
2519
+ * Pair with `expressionAutoCompletionPaths` to control which paths show up.
2520
+ */
2521
+ expressionAutoCompletions?: Record<string, unknown>;
2522
+ /**
2523
+ * Dot-separated paths exposed by the autocompletion engine, forwarded to
2524
+ * nile-code-editor's `customCompletionsPaths`. Example:
2525
+ * ['DEST.target.email', 'DEST.projected.email', 'DEST.config.operation']
2526
+ */
2527
+ expressionAutoCompletionPaths?: string[];
2528
+ }
2529
+ /**
2530
+ * Validation error reported by the condition builder.
2531
+ */
2532
+ interface ConditionValidationError {
2533
+ /** Stable error code (e.g. 'empty-attribute'). */
2534
+ code: string;
2535
+ /** Human-readable message. */
2536
+ message: string;
2537
+ /** Index of the offending top-level condition, if applicable. */
2538
+ index?: number;
2539
+ /** Index of the offending subCondition within a group, if applicable. */
2540
+ subIndex?: number;
2541
+ }
2542
+ /**
2543
+ * Validity payload emitted by the condition builder.
2544
+ */
2545
+ interface ConditionBuilderValidity {
2546
+ valid: boolean;
2547
+ errors: ConditionValidationError[];
2548
+ }
2549
+
2550
+ /**
2551
+ * Strict types for the condition tree the builder produces.
2552
+ *
2553
+ * The shape is a discriminated union: a node is either a 'single' condition
2554
+ * (one field/operator/value triple) or a 'group' (a list of subConditions
2555
+ * combined by the group's groupType).
2556
+ *
2557
+ * Nesting depth is one level — groups contain only single subConditions,
2558
+ * not other groups. This matches the v1 admin-ui implementation.
2559
+ */
2560
+
2561
+ /**
2562
+ * Value held by a single condition. Shape depends on the operator's arity:
2563
+ * - 'none' → empty array
2564
+ * - 'single' → single-element array (or scalar — the builder normalises to array)
2565
+ * - 'multi' → array of strings
2566
+ */
2567
+ type ConditionValue = string[];
2568
+ /**
2569
+ * One leaf condition: field · operator · value, plus the logical connector
2570
+ * that ties it to the previous condition in its parent list.
2571
+ */
2572
+ interface SingleCondition {
2573
+ type: 'single';
2574
+ /** Logical connector to the previous condition in the parent list. First condition's connector is ignored. */
2575
+ connector: LogicalConnector;
2576
+ /** Field attribute key — references FieldDefinition.attribute. */
2577
+ attribute: string;
2578
+ /** Operator key — references OperatorDefinition.key. */
2579
+ operator: string;
2580
+ /** Value(s) for this condition. Empty array when operator arity is 'none'. */
2581
+ value: ConditionValue;
2582
+ }
2583
+ /**
2584
+ * A condition that lives inside a group. Same shape as SingleCondition but
2585
+ * typed separately to make the 1-level nesting rule explicit at compile time.
2586
+ */
2587
+ interface SubCondition {
2588
+ /** Logical connector to the previous subCondition in the parent group. First subCondition's connector is ignored. */
2589
+ connector: LogicalConnector;
2590
+ attribute: string;
2591
+ operator: string;
2592
+ value: ConditionValue;
2593
+ }
2594
+ /**
2595
+ * A group condition: bundles a list of subConditions combined by groupType.
2596
+ */
2597
+ interface GroupCondition {
2598
+ type: 'group';
2599
+ /** Logical connector to the previous condition in the parent list. */
2600
+ connector: LogicalConnector;
2601
+ /** How the subConditions are combined: 'all' = AND, 'any' = OR. */
2602
+ groupType: GroupType;
2603
+ /** List of subConditions in this group. Always at least one. */
2604
+ subConditions: SubCondition[];
2605
+ }
2606
+ /**
2607
+ * Discriminated union — a top-level condition is either single or a group.
2608
+ */
2609
+ type ConditionNode = SingleCondition | GroupCondition;
2610
+ /**
2611
+ * Builder mode for a rule.
2612
+ * - 'builder' : GUI condition builder (the default)
2613
+ * - 'expression' : raw expression text editor
2614
+ * The two modes are mutually exclusive per rule.
2615
+ */
2616
+ type ConditionBuilderMode = 'builder' | 'expression';
2617
+ /**
2618
+ * The full value the condition builder reads and writes.
2619
+ * Either `conditions` (when mode is 'builder') or `expression` (when mode is 'expression')
2620
+ * is the authoritative source — the unused one is preserved as-is.
2621
+ */
2622
+ interface ConditionBuilderValue {
2623
+ /** Current mode of this rule. */
2624
+ mode: ConditionBuilderMode;
2625
+ /** Condition tree — authoritative when mode is 'builder'. */
2626
+ conditions: ConditionNode[];
2627
+ /** Raw expression text — authoritative when mode is 'expression'. */
2628
+ expression: string;
2629
+ }
2630
+
2322
2631
  /**
2323
2632
  * Sheet configuration interface - wraps table with sheet-level settings
2324
2633
  */
2325
2634
 
2635
+ /**
2636
+ * Discriminator for the sheet's content type. Defaults to 'table' for back-compat.
2637
+ */
2638
+ type SheetContentType = 'table' | 'condition-builder';
2639
+ /**
2640
+ * Condition-builder branch of a sheet. Present when contentType is 'condition-builder'.
2641
+ */
2642
+ interface SheetConditionBuilder {
2643
+ /** Builder configuration — fields, operators, feature flags. */
2644
+ config: ConditionBuilderConfig;
2645
+ /** Current rule value — mode, conditions, expression. */
2646
+ value: ConditionBuilderValue;
2647
+ /** Whether the rule is enabled. Surface as a sheet-level toggle action. */
2648
+ isEnabled?: boolean;
2649
+ }
2326
2650
  /**
2327
2651
  * Comprehensive sheet configuration interface
2328
2652
  */
@@ -2336,9 +2660,19 @@ interface SheetConfig {
2336
2660
  */
2337
2661
  name: string;
2338
2662
  /**
2339
- * Table configuration (existing TableConfig)
2663
+ * Sheet content type. When omitted, defaults to 'table' (back-compat).
2340
2664
  */
2341
- tableConfig: TableConfig;
2665
+ contentType?: SheetContentType;
2666
+ /**
2667
+ * Table configuration (existing TableConfig).
2668
+ * Required when contentType is 'table' (or omitted).
2669
+ */
2670
+ tableConfig?: TableConfig;
2671
+ /**
2672
+ * Condition builder configuration + value.
2673
+ * Required when contentType is 'condition-builder'.
2674
+ */
2675
+ conditionBuilder?: SheetConditionBuilder;
2342
2676
  /**
2343
2677
  * Sheet-level actions (similar to RowAction pattern)
2344
2678
  */
@@ -2594,9 +2928,17 @@ interface AutosaveConfig {
2594
2928
  * - 'eager': Saves on every change (100ms debounce)
2595
2929
  */
2596
2930
  strategy: AutosaveStrategy;
2931
+ /**
2932
+ * Whether to render the small save / spinner indicator in the workbook
2933
+ * toolbar. Independent of `enabled` so a consumer can autosave silently
2934
+ * without surfacing it to the user.
2935
+ * @default false
2936
+ */
2937
+ showIndicator?: boolean;
2597
2938
  }
2598
2939
  /**
2599
- * Default autosave configuration
2940
+ * Default autosave configuration. Autosave itself is on by default but the
2941
+ * UI indicator is hidden — consumers must opt in via `showIndicator: true`.
2600
2942
  */
2601
2943
  declare const DEFAULT_AUTOSAVE_CONFIG: AutosaveConfig;
2602
2944
 
@@ -2617,9 +2959,19 @@ interface WorkbookSheetConfig {
2617
2959
  */
2618
2960
  name: string;
2619
2961
  /**
2620
- * Table configuration for this sheet
2962
+ * Sheet content type. When omitted, defaults to 'table' (back-compat).
2621
2963
  */
2622
- tableConfig: TableConfig;
2964
+ contentType?: SheetContentType;
2965
+ /**
2966
+ * Table configuration for this sheet.
2967
+ * Required when contentType is 'table' (or omitted).
2968
+ */
2969
+ tableConfig?: TableConfig;
2970
+ /**
2971
+ * Condition builder configuration + value.
2972
+ * Required when contentType is 'condition-builder'.
2973
+ */
2974
+ conditionBuilder?: SheetConditionBuilder;
2623
2975
  /**
2624
2976
  * Optional per-sheet tab actions (overrides workbook defaults)
2625
2977
  */
@@ -3552,11 +3904,36 @@ declare class NileSelectEditor<T = string> implements CellEditor<T> {
3552
3904
  private select?;
3553
3905
  private eventListeners;
3554
3906
  private optionsSubscription?;
3907
+ private dropdownOpen;
3908
+ private documentKeyForwarder;
3909
+ private wheelLockHandler;
3910
+ private highlightedOptionIndex;
3555
3911
  private currentOptions;
3556
3912
  private trackedValues;
3557
3913
  private hasChangeOccurred;
3558
3914
  constructor(options: NileSelectEditorOptions);
3559
3915
  edit(context: CellEditorContext<T>): void;
3916
+ private setupDocumentKeyForwarder;
3917
+ /** Dispatch mouseup on the currently highlighted virtual-scroll portal option */
3918
+ private selectHighlightedVirtualOption;
3919
+ /** Navigate options — delegates to virtual or regular path */
3920
+ private navigateOption;
3921
+ /** Virtual-scroll: options live in the portal DOM, queried directly */
3922
+ private navigateVirtualOption;
3923
+ /** Regular (non-virtual) select: options are in nile-select's light DOM */
3924
+ private navigateRegularOption;
3925
+ /** Apply data-kb-active on the portal option matching highlightedOptionIndex */
3926
+ private syncPortalHighlight;
3927
+ /** Return the active portal element for the current select mode */
3928
+ private getActivePortal;
3929
+ private getPortalOptions;
3930
+ /**
3931
+ * Prevent the table (and page) from scrolling while the dropdown is open.
3932
+ * Wheel events that originate inside the portal are allowed (so the dropdown
3933
+ * list can still be scrolled); all others are cancelled.
3934
+ */
3935
+ private setupScrollLock;
3936
+ private teardownScrollLock;
3560
3937
  private activateSelectAfterMount;
3561
3938
  /** Lit @query('nile-popup') / .select — must exist before handleOpenChange touches this.popup.popup */
3562
3939
  private isNileSelectPopupMounted;
@@ -3968,8 +4345,15 @@ declare class NileChipEditor implements CellEditor<string[]> {
3968
4345
  private eventListeners;
3969
4346
  private trackedValues;
3970
4347
  private hasChangeOccurred;
4348
+ private focusRetryHandle;
3971
4349
  constructor(options?: NileChipEditorOptions | undefined);
3972
4350
  edit(context: CellEditorContext<string[]>): void;
4351
+ /**
4352
+ * Retry focusing the chip's internal text input using requestAnimationFrame until
4353
+ * nile-chip's Lit shadow DOM has finished rendering (avoids fixed-timeout races).
4354
+ * Reads nile-chip's internal autoComplete reference for the most reliable access.
4355
+ */
4356
+ private scheduleFocusRetry;
3973
4357
  private positionPopover;
3974
4358
  private setInitialValue;
3975
4359
  private applyOptions;
@@ -4457,6 +4841,7 @@ declare class StTableComponent implements OnInit, OnChanges, OnDestroy, AfterVie
4457
4841
  readonly requestAddRow: _angular_core.OutputEmitterRef<{
4458
4842
  focusColumn?: number;
4459
4843
  }>;
4844
+ readonly requestFocusTabs: _angular_core.OutputEmitterRef<void>;
4460
4845
  readonly mergedConfig: _angular_core.WritableSignal<TableConfig | null>;
4461
4846
  readonly visibleColumns: _angular_core.WritableSignal<ColumnConfig<any>[]>;
4462
4847
  readonly visibleCellGrid: _angular_core.WritableSignal<Cell<any>[][]>;
@@ -4469,6 +4854,7 @@ declare class StTableComponent implements OnInit, OnChanges, OnDestroy, AfterVie
4469
4854
  triggerTop?: number;
4470
4855
  }>;
4471
4856
  readonly dropdownContext: _angular_core.WritableSignal<RowActionContext | null>;
4857
+ private dropdownTriggerEl;
4472
4858
  readonly columnMenuIsOpen: _angular_core.WritableSignal<boolean>;
4473
4859
  readonly columnMenuPosition: _angular_core.WritableSignal<{
4474
4860
  x: number;
@@ -4576,8 +4962,18 @@ declare class StTableComponent implements OnInit, OnChanges, OnDestroy, AfterVie
4576
4962
  getRowActions(): RowAction[];
4577
4963
  getRowData(rowIndex: number): any;
4578
4964
  openRowActionsDropdown(event: MouseEvent, rowData: any, rowIndex: number): void;
4579
- closeRowActionsDropdown(): void;
4965
+ closeRowActionsDropdown(returnFocus?: boolean): void;
4966
+ /** Tab pressed inside the row-actions dropdown: close + exit the table. */
4967
+ onDropdownTabbed(payload: {
4968
+ shift: boolean;
4969
+ }): void;
4580
4970
  onRowActionClicked(event: RowActionEvent): void;
4971
+ onSettingsTriggerKeydown(event: KeyboardEvent, rowData: any, rowIndex: number): void;
4972
+ /** Move focus to the first focusable element after the table host. */
4973
+ private focusNextOutsideTable;
4974
+ /** Move focus to the last focusable element before the table host. */
4975
+ private focusPrevOutsideTable;
4976
+ openColumnMenuFromKeyboard(columnIndex: number, isFirst: boolean, isLast: boolean): void;
4581
4977
  openColumnMenu(event: MouseEvent, column: ColumnConfig<any>, columnIndex: number, isFirst: boolean, isLast: boolean): void;
4582
4978
  closeColumnMenu(): void;
4583
4979
  onColumnActionClicked(event: ColumnActionEvent): void;
@@ -4596,6 +4992,29 @@ declare class StTableComponent implements OnInit, OnChanges, OnDestroy, AfterVie
4596
4992
  * Resolved CSS color from `display.rowBackground` for this row index, if any.
4597
4993
  */
4598
4994
  resolveRowBackground(rowIndex: number): string | undefined;
4995
+ /**
4996
+ * Pixel width of the row-number column. Honors `display.rowNumberWidth` when
4997
+ * set, else defaults to 60 when an icon function is configured (room for
4998
+ * triple-digit + icon), else 30 (matches the historical narrow gutter).
4999
+ * `table-layout: fixed` makes this width authoritative for the column.
5000
+ */
5001
+ get rowNumberColumnWidth(): number;
5002
+ /**
5003
+ * True when `display.rowNumberIcon` is configured. Toggles the
5004
+ * `--with-icon` CSS modifier on the row-number cells, switching the layout
5005
+ * from "centered single number" to "right-aligned slot + trailing icon" so
5006
+ * the icon's x position stays stable across digit counts.
5007
+ */
5008
+ get hasRowNumberIcon(): boolean;
5009
+ /**
5010
+ * Resolved row-number icon descriptor for this row, or `null` if the row has none.
5011
+ * Supports both shorthand (`'iconName'`) and object (`{ name, tooltip }`) return values
5012
+ * from `display.rowNumberIcon`.
5013
+ */
5014
+ resolveRowNumberIcon(rowIndex: number): {
5015
+ name: string;
5016
+ tooltip?: string;
5017
+ } | null;
4599
5018
  /**
4600
5019
  * Body cell background: `rowBackground` wins when set; otherwise sticky / full-row tint via `stickyColumnBackground`.
4601
5020
  */
@@ -4629,6 +5048,7 @@ declare class StTableComponent implements OnInit, OnChanges, OnDestroy, AfterVie
4629
5048
  private detachTableResizeObserver;
4630
5049
  /** Host styles: max-height plus CSS variables for keyboard-focused cell (see `display.focusedCell`). */
4631
5050
  tableWrapperStyle(): Record<string, string | number | null>;
5051
+ getColumnAriaSort(column: ColumnConfig<any>): string | null;
4632
5052
  onCellClick(rowIndex: number, columnIndex: number): void;
4633
5053
  onCellEdit(event: CellEditEvent): void;
4634
5054
  onCellSave(event: CellSaveEvent): void;
@@ -4637,13 +5057,24 @@ declare class StTableComponent implements OnInit, OnChanges, OnDestroy, AfterVie
4637
5057
  event: KeyboardEvent;
4638
5058
  direction: NavigationDirection;
4639
5059
  }): void;
5060
+ onHeaderTabOut(): void;
5061
+ /** Get the column-action button at a given column index, if it exists. */
5062
+ private getHeaderMenuButton;
5063
+ /**
5064
+ * Focus the column-action button at colIndex, or — if that column has no
5065
+ * action button — the nearest column to its right (then left) that does.
5066
+ */
5067
+ private focusHeader;
5068
+ /** Focus the next/previous column-action button after colIndex, skipping columns without actions. */
5069
+ private focusAdjacentHeader;
5070
+ onHeaderNavigate(direction: 'left' | 'right' | 'up' | 'down', colIndex: number): void;
4640
5071
  onTableContainerFocus(event: FocusEvent): void;
4641
5072
  isKeyboardNavigationEnabled(): boolean;
4642
5073
  getEditModeForCells(): EditMode;
4643
5074
  onDocumentClick(event: MouseEvent): void;
4644
5075
  ngOnDestroy(): void;
4645
5076
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StTableComponent, never>;
4646
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StTableComponent, "st-table", never, { "tableConfig": { "alias": "tableConfig"; "required": true; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "data$": { "alias": "data$"; "required": false; "isSignal": true; }; "tableState": { "alias": "tableState"; "required": false; "isSignal": true; }; "enableSorting": { "alias": "enableSorting"; "required": false; "isSignal": true; }; "enableFiltering": { "alias": "enableFiltering"; "required": false; "isSignal": true; }; "validateConfig": { "alias": "validateConfig"; "required": false; "isSignal": true; }; }, { "stateChange": "stateChange"; "dataChange": "dataChange"; "cellEdit": "cellEdit"; "cellSave": "cellSave"; "cellCancel": "cellCancel"; "cellChange": "cellChange"; "columnResized": "columnResized"; "columnMoved": "columnMoved"; "configValidationErrors": "configValidationErrors"; "columnAdded": "columnAdded"; "rowAction": "rowAction"; "validationStateChange": "validationStateChange"; "requestAddRow": "requestAddRow"; }, never, never, true, never>;
5077
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StTableComponent, "st-table", never, { "tableConfig": { "alias": "tableConfig"; "required": true; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "data$": { "alias": "data$"; "required": false; "isSignal": true; }; "tableState": { "alias": "tableState"; "required": false; "isSignal": true; }; "enableSorting": { "alias": "enableSorting"; "required": false; "isSignal": true; }; "enableFiltering": { "alias": "enableFiltering"; "required": false; "isSignal": true; }; "validateConfig": { "alias": "validateConfig"; "required": false; "isSignal": true; }; }, { "stateChange": "stateChange"; "dataChange": "dataChange"; "cellEdit": "cellEdit"; "cellSave": "cellSave"; "cellCancel": "cellCancel"; "cellChange": "cellChange"; "columnResized": "columnResized"; "columnMoved": "columnMoved"; "configValidationErrors": "configValidationErrors"; "columnAdded": "columnAdded"; "rowAction": "rowAction"; "validationStateChange": "validationStateChange"; "requestAddRow": "requestAddRow"; "requestFocusTabs": "requestFocusTabs"; }, never, never, true, never>;
4647
5078
  }
4648
5079
 
4649
5080
  /**
@@ -4696,10 +5127,26 @@ declare class StHeaderComponent implements OnDestroy {
4696
5127
  * Emits when column menu button is clicked
4697
5128
  */
4698
5129
  menuClick: EventEmitter<MouseEvent>;
5130
+ /**
5131
+ * Emits when Tab is pressed on the header cell itself (not on child elements),
5132
+ * signalling the table should receive focus next.
5133
+ */
5134
+ tabOut: EventEmitter<void>;
5135
+ /** Emits ArrowLeft / ArrowRight / ArrowUp / ArrowDown pressed on the header itself. */
5136
+ headerNavigate: EventEmitter<"left" | "right" | "up" | "down">;
5137
+ /** Emits when Space is pressed on the header to open the column menu via keyboard. */
5138
+ menuKeyboard: EventEmitter<void>;
4699
5139
  /**
4700
5140
  * Cleanup on destroy
4701
5141
  */
4702
5142
  ngOnDestroy(): void;
5143
+ /**
5144
+ * Tab pressed directly on the header div (not bubbled from a child):
5145
+ * forward focus to the table body so the flow is sheet-tab → header → cells.
5146
+ */
5147
+ onHeaderKeyDown(event: KeyboardEvent): void;
5148
+ /** Arrow key navigation from the column-menu-trigger button — mirrors header nav. */
5149
+ onMenuTriggerKeyDown(event: KeyboardEvent): void;
4703
5150
  /**
4704
5151
  * Handle column menu button click
4705
5152
  */
@@ -4733,7 +5180,7 @@ declare class StHeaderComponent implements OnDestroy {
4733
5180
  */
4734
5181
  onMoveRight(): void;
4735
5182
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StHeaderComponent, never>;
4736
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StHeaderComponent, "st-header", never, { "column": { "alias": "column"; "required": false; }; "columnIndex": { "alias": "columnIndex"; "required": false; }; "isFirstColumn": { "alias": "isFirstColumn"; "required": false; }; "isLastColumn": { "alias": "isLastColumn"; "required": false; }; "tableState": { "alias": "tableState"; "required": false; }; "enableSorting": { "alias": "enableSorting"; "required": false; }; "enableFiltering": { "alias": "enableFiltering"; "required": false; }; }, { "sortToggle": "sortToggle"; "filterChange": "filterChange"; "columnMoved": "columnMoved"; "menuClick": "menuClick"; }, never, never, true, never>;
5183
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StHeaderComponent, "st-header", never, { "column": { "alias": "column"; "required": false; }; "columnIndex": { "alias": "columnIndex"; "required": false; }; "isFirstColumn": { "alias": "isFirstColumn"; "required": false; }; "isLastColumn": { "alias": "isLastColumn"; "required": false; }; "tableState": { "alias": "tableState"; "required": false; }; "enableSorting": { "alias": "enableSorting"; "required": false; }; "enableFiltering": { "alias": "enableFiltering"; "required": false; }; }, { "sortToggle": "sortToggle"; "filterChange": "filterChange"; "columnMoved": "columnMoved"; "menuClick": "menuClick"; "tabOut": "tabOut"; "headerNavigate": "headerNavigate"; "menuKeyboard": "menuKeyboard"; }, never, never, true, never>;
4737
5184
  }
4738
5185
 
4739
5186
  /**
@@ -4937,6 +5384,7 @@ declare class StColumnMenuDropdownComponent implements OnChanges {
4937
5384
  * Close dropdown when clicking backdrop
4938
5385
  */
4939
5386
  onBackdropClick(event: MouseEvent): void;
5387
+ onKeydown(event: KeyboardEvent): void;
4940
5388
  onFilterClosed(): void;
4941
5389
  onFilterApplied(event: {
4942
5390
  operator: any;
@@ -5240,6 +5688,14 @@ declare class StRowActionsDropdownComponent implements OnChanges {
5240
5688
  * Emitted when the dropdown should close
5241
5689
  */
5242
5690
  closed: EventEmitter<void>;
5691
+ /**
5692
+ * Emitted when Tab / Shift+Tab is pressed while the dropdown is open.
5693
+ * The parent should close the dropdown WITHOUT returning focus to the trigger
5694
+ * and instead move focus to the next/previous element outside the table.
5695
+ */
5696
+ tabbed: EventEmitter<{
5697
+ shift: boolean;
5698
+ }>;
5243
5699
  dropdownPanel?: ElementRef<HTMLElement>;
5244
5700
  /**
5245
5701
  * Visible actions (filtered by hidden property)
@@ -5274,12 +5730,22 @@ declare class StRowActionsDropdownComponent implements OnChanges {
5274
5730
  * Handle ESC key press
5275
5731
  */
5276
5732
  onEscapeKey(event: Event): void;
5733
+ /**
5734
+ * Space closes the dropdown (focus is on a menu item after open, so the trigger
5735
+ * button's keydown never fires — handle it here at the document level instead).
5736
+ */
5737
+ onSpaceKey(event: Event): void;
5738
+ /**
5739
+ * Tab / Shift+Tab: close the dropdown AND tell the parent to move focus
5740
+ * outside the table (skipping subsequent rows' settings buttons).
5741
+ */
5742
+ onTabKey(event: Event): void;
5277
5743
  /**
5278
5744
  * Prevent dropdown click from closing
5279
5745
  */
5280
5746
  onDropdownClick(event: Event): void;
5281
5747
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StRowActionsDropdownComponent, never>;
5282
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StRowActionsDropdownComponent, "st-row-actions-dropdown", never, { "isOpen": { "alias": "isOpen"; "required": false; }; "position": { "alias": "position"; "required": false; }; "context": { "alias": "context"; "required": false; }; }, { "actionClicked": "actionClicked"; "closed": "closed"; }, never, never, true, never>;
5748
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StRowActionsDropdownComponent, "st-row-actions-dropdown", never, { "isOpen": { "alias": "isOpen"; "required": false; }; "position": { "alias": "position"; "required": false; }; "context": { "alias": "context"; "required": false; }; }, { "actionClicked": "actionClicked"; "closed": "closed"; "tabbed": "tabbed"; }, never, never, true, never>;
5283
5749
  }
5284
5750
 
5285
5751
  declare class StSheetComponent implements OnInit, OnChanges {
@@ -5320,6 +5786,14 @@ declare class StSheetComponent implements OnInit, OnChanges {
5320
5786
  * Emitted when data changes (via Observable)
5321
5787
  */
5322
5788
  dataChange: EventEmitter<DataChangeEvent>;
5789
+ /**
5790
+ * Emitted when the condition-builder value changes (only when contentType is 'condition-builder').
5791
+ */
5792
+ conditionBuilderValueChange: EventEmitter<ConditionBuilderValue>;
5793
+ /**
5794
+ * Emitted when the condition-builder validity changes (only when contentType is 'condition-builder').
5795
+ */
5796
+ conditionBuilderValidityChange: EventEmitter<ConditionBuilderValidity>;
5323
5797
  /**
5324
5798
  * Internal state instance
5325
5799
  */
@@ -5333,9 +5807,14 @@ declare class StSheetComponent implements OnInit, OnChanges {
5333
5807
  ngOnInit(): void;
5334
5808
  ngOnChanges(changes: SimpleChanges): void;
5335
5809
  /**
5336
- * Initialize sheet state
5810
+ * Initialize sheet state. Only table-typed sheets need SheetState — condition-builder
5811
+ * sheets don't have pagination/columns, so we skip state creation for them.
5337
5812
  */
5338
5813
  private initializeState;
5814
+ /** Resolved content type — defaults to 'table' when unset. */
5815
+ get contentType(): 'table' | 'condition-builder';
5816
+ onConditionBuilderValueChange(value: ConditionBuilderValue): void;
5817
+ onConditionBuilderValidityChange(validity: ConditionBuilderValidity): void;
5339
5818
  /**
5340
5819
  * Get active state (external or internal)
5341
5820
  */
@@ -5369,7 +5848,7 @@ declare class StSheetComponent implements OnInit, OnChanges {
5369
5848
  */
5370
5849
  get headerVariant(): string;
5371
5850
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StSheetComponent, never>;
5372
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StSheetComponent, "st-sheet", never, { "config": { "alias": "config"; "required": false; }; "data": { "alias": "data"; "required": false; }; "data$": { "alias": "data$"; "required": false; }; "state": { "alias": "state"; "required": false; }; }, { "sheetActionClicked": "sheetActionClicked"; "stateChange": "stateChange"; "cellChange": "cellChange"; "tableStateChange": "tableStateChange"; "dataChange": "dataChange"; }, never, never, true, never>;
5851
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StSheetComponent, "st-sheet", never, { "config": { "alias": "config"; "required": false; }; "data": { "alias": "data"; "required": false; }; "data$": { "alias": "data$"; "required": false; }; "state": { "alias": "state"; "required": false; }; }, { "sheetActionClicked": "sheetActionClicked"; "stateChange": "stateChange"; "cellChange": "cellChange"; "tableStateChange": "tableStateChange"; "dataChange": "dataChange"; "conditionBuilderValueChange": "conditionBuilderValueChange"; "conditionBuilderValidityChange": "conditionBuilderValidityChange"; }, never, never, true, never>;
5373
5852
  }
5374
5853
 
5375
5854
  declare class StSheetActionsComponent {
@@ -5448,6 +5927,14 @@ declare class StWorkbookComponent implements OnInit, OnChanges, OnDestroy {
5448
5927
  sheetId: string;
5449
5928
  focusColumn?: number;
5450
5929
  }>;
5930
+ readonly conditionBuilderValueChange: _angular_core.OutputEmitterRef<{
5931
+ sheetId: string;
5932
+ value: ConditionBuilderValue;
5933
+ }>;
5934
+ readonly conditionBuilderValidityChange: _angular_core.OutputEmitterRef<{
5935
+ sheetId: string;
5936
+ validity: ConditionBuilderValidity;
5937
+ }>;
5451
5938
  tableComponent?: StTableComponent;
5452
5939
  workbookTabGroup?: ElementRef<HTMLElement>;
5453
5940
  readonly sheets: _angular_core.WritableSignal<WorkbookSheetConfig[]>;
@@ -5461,11 +5948,18 @@ declare class StWorkbookComponent implements OnInit, OnChanges, OnDestroy {
5461
5948
  readonly selectedSheet: _angular_core.WritableSignal<WorkbookSheetConfig | null>;
5462
5949
  readonly selectedSheetIndex: _angular_core.WritableSignal<number>;
5463
5950
  readonly tabActionsPosition: _angular_core.WritableSignal<any>;
5951
+ /**
5952
+ * The sheet currently rendered in the workbook panel. Derived from sheets +
5953
+ * activeSheetIndex so it stays stable even while the tab-actions dropdown
5954
+ * is opening/closing (which mutates `selectedSheet`).
5955
+ */
5956
+ readonly activeSheet: _angular_core.Signal<WorkbookSheetConfig | null>;
5464
5957
  readonly workbookActionsOpen: _angular_core.WritableSignal<boolean>;
5465
5958
  readonly workbookActionsPosition: _angular_core.WritableSignal<any>;
5466
5959
  readonly visibleWorkbookActions: _angular_core.WritableSignal<WorkbookAction[]>;
5467
5960
  readonly toolbarWorkbookActions: _angular_core.WritableSignal<WorkbookAction[]>;
5468
5961
  readonly autosaveEnabled: _angular_core.WritableSignal<boolean>;
5962
+ readonly autosaveIndicatorVisible: _angular_core.WritableSignal<boolean>;
5469
5963
  readonly lastSaveTime: _angular_core.WritableSignal<Date | null>;
5470
5964
  readonly isSaving: _angular_core.WritableSignal<boolean>;
5471
5965
  readonly isFullscreen$: BehaviorSubject<boolean>;
@@ -5473,13 +5967,28 @@ declare class StWorkbookComponent implements OnInit, OnChanges, OnDestroy {
5473
5967
  private internalState?;
5474
5968
  private autosaveStrategy;
5475
5969
  private beforeUnloadHandler;
5970
+ /** Sheet ID rendered in the last updateActiveSheet — used to skip key bumps that would otherwise re-mount the content on every config update. */
5971
+ private lastRenderedSheetId;
5476
5972
  constructor();
5477
5973
  ngOnInit(): void;
5478
5974
  ngOnChanges(changes: SimpleChanges): void;
5479
5975
  private initializeComponent;
5480
5976
  get activeState(): WorkbookState;
5481
5977
  onTabChange(event: any): void;
5978
+ onSheetTabKeydown(event: KeyboardEvent, index: number): void;
5979
+ private openTabActionsForFocusedTab;
5980
+ private lockBodyScroll;
5981
+ private unlockBodyScroll;
5982
+ onTabActionsKeydown(event: KeyboardEvent): void;
5983
+ private focusToolbar;
5984
+ onToolbarKeydown(event: KeyboardEvent): void;
5985
+ private focusSheetTab;
5986
+ private focusTablePanel;
5482
5987
  private updateActiveSheet;
5988
+ /** Content type of the currently-active sheet. Defaults to 'table'. */
5989
+ get activeSheetContentType(): 'table' | 'condition-builder';
5990
+ onConditionBuilderValueChange(value: ConditionBuilderValue): void;
5991
+ onConditionBuilderValidityChange(validity: ConditionBuilderValidity): void;
5483
5992
  /**
5484
5993
  * After a new sheet is appended, scroll the tab strip so the new tab clears the sticky toolbar overlay
5485
5994
  * and move keyboard focus to that tab.
@@ -5501,6 +6010,7 @@ declare class StWorkbookComponent implements OnInit, OnChanges, OnDestroy {
5501
6010
  onTabActionClick(action: any, event: Event): void;
5502
6011
  toggleWorkbookActions(event: MouseEvent): void;
5503
6012
  closeWorkbookActions(): void;
6013
+ onWorkbookActionsKeydown(event: KeyboardEvent): void;
5504
6014
  private updateVisibleWorkbookActions;
5505
6015
  isActionDisabled(action: WorkbookAction): boolean;
5506
6016
  onWorkbookActionClick(action: WorkbookAction, event: Event): void;
@@ -5516,6 +6026,7 @@ declare class StWorkbookComponent implements OnInit, OnChanges, OnDestroy {
5516
6026
  onRequestAddRow(event: {
5517
6027
  focusColumn?: number;
5518
6028
  }): void;
6029
+ onRequestFocusTabs(): void;
5519
6030
  ngOnDestroy(): void;
5520
6031
  private initializeAutosave;
5521
6032
  private performAutosave;
@@ -5524,7 +6035,370 @@ declare class StWorkbookComponent implements OnInit, OnChanges, OnDestroy {
5524
6035
  scrollToRow(rowIndex: number, focusFirstCell?: boolean): void;
5525
6036
  scrollToLastRow(focusFirstCell?: boolean): void;
5526
6037
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StWorkbookComponent, never>;
5527
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StWorkbookComponent, "st-workbook", never, { "config": { "alias": "config"; "required": true; "isSignal": true; }; "sheetsData": { "alias": "sheetsData"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; }, { "sheetChanged": "sheetChanged"; "addSheet": "addSheet"; "sheetTabAction": "sheetTabAction"; "workbookAction": "workbookAction"; "cellChange": "cellChange"; "cellSave": "cellSave"; "tableStateChange": "tableStateChange"; "fullscreenToggle": "fullscreenToggle"; "requestAddRow": "requestAddRow"; }, never, never, true, never>;
6038
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StWorkbookComponent, "st-workbook", never, { "config": { "alias": "config"; "required": true; "isSignal": true; }; "sheetsData": { "alias": "sheetsData"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; }, { "sheetChanged": "sheetChanged"; "addSheet": "addSheet"; "sheetTabAction": "sheetTabAction"; "workbookAction": "workbookAction"; "cellChange": "cellChange"; "cellSave": "cellSave"; "tableStateChange": "tableStateChange"; "fullscreenToggle": "fullscreenToggle"; "requestAddRow": "requestAddRow"; "conditionBuilderValueChange": "conditionBuilderValueChange"; "conditionBuilderValidityChange": "conditionBuilderValidityChange"; }, never, never, true, never>;
6039
+ }
6040
+
6041
+ /**
6042
+ * Root condition builder. Renders either:
6043
+ * - the GUI condition list (single conditions + groups), or
6044
+ * - a raw expression code editor,
6045
+ * depending on `value.mode`. The mode toggle itself is surfaced at the sheet
6046
+ * level via SheetAction; consumers flip `value.mode` and the builder reacts.
6047
+ *
6048
+ * Owns the editable copy of the tree and emits the full ConditionBuilderValue
6049
+ * on every change. Persistence is the consumer's concern.
6050
+ */
6051
+ declare class StConditionBuilderComponent implements OnInit, OnChanges {
6052
+ private validator;
6053
+ private cdr;
6054
+ private host;
6055
+ private injector;
6056
+ config: ConditionBuilderConfig;
6057
+ value: ConditionBuilderValue;
6058
+ disabled: boolean;
6059
+ readonly valueChange: EventEmitter<ConditionBuilderValue>;
6060
+ readonly validityChange: EventEmitter<ConditionBuilderValidity>;
6061
+ /** Local editable copy of the value — the source of truth between input changes. */
6062
+ internalValue: ConditionBuilderValue;
6063
+ /** Latest validation summary, rendered into the aria-live region for SR users. */
6064
+ validityAnnouncement: string;
6065
+ /**
6066
+ * Flag set the moment we emit a valueChange. The parent typically feeds
6067
+ * the new value back through @Input (controlled-component pattern), which
6068
+ * triggers ngOnChanges → re-clone → re-render. That re-render destroys the
6069
+ * focused <nile-input> mid-typing. When this flag is true, ngOnChanges
6070
+ * recognises the inbound value as our own echo and skips the re-clone.
6071
+ */
6072
+ private skipNextValueChange;
6073
+ get maxConditions(): number;
6074
+ get allowGroups(): boolean;
6075
+ get canAddCondition(): boolean;
6076
+ ngOnInit(): void;
6077
+ ngOnChanges(changes: SimpleChanges): void;
6078
+ trackByIndex(index: number): number;
6079
+ isSingle(node: ConditionNode): node is SingleCondition;
6080
+ isGroup(node: ConditionNode): node is GroupCondition;
6081
+ onSingleChange(index: number, next: SubCondition): void;
6082
+ onGroupChange(index: number, next: GroupCondition): void;
6083
+ onRemoveCondition(index: number): void;
6084
+ /**
6085
+ * Insert a fresh single condition directly below `index`. Triggered by the
6086
+ * hover "+" → Condition menu option on a top-level rule or group row.
6087
+ * Honours `maxConditions`.
6088
+ */
6089
+ onInsertBelow(index: number): void;
6090
+ /**
6091
+ * Insert a fresh group directly below `index`. Triggered by the hover "+"
6092
+ * → Group menu option on a top-level rule or group row. Honours both
6093
+ * `maxConditions` and `allowGroups`.
6094
+ */
6095
+ onInsertGroupBelow(index: number): void;
6096
+ /**
6097
+ * Wait for the next render pass, then move keyboard focus into the row at
6098
+ * `index`. Focus lands on the first interactive element of the row — the
6099
+ * field-picker chip trigger — so a screen-reader user is taken straight to
6100
+ * the new condition's editable state.
6101
+ */
6102
+ private focusRowAfterRender;
6103
+ onAddCondition(): void;
6104
+ onAddGroup(): void;
6105
+ onExpressionInput(event: Event): void;
6106
+ get expressionLanguage(): 'javascript' | 'sql' | 'json' | 'html';
6107
+ /** Autocompletion tree forwarded to nile-code-editor — empty object when unset. */
6108
+ get expressionAutoCompletions(): Record<string, unknown>;
6109
+ /** Autocompletion paths forwarded to nile-code-editor — empty array when unset. */
6110
+ get expressionAutoCompletionPaths(): string[];
6111
+ /** Toggle between builder and expression mode. Triggered by the footer "Use advanced expression" link. */
6112
+ onToggleMode(): void;
6113
+ get isExpressionMode(): boolean;
6114
+ get expressionToggleLabel(): string;
6115
+ get allowExpressionMode(): boolean;
6116
+ private patchConditions;
6117
+ private emitValidity;
6118
+ /** Build an aria-label for a top-level node — read aloud when the row gains focus. */
6119
+ ariaLabelForNode(node: ConditionNode, index: number): string;
6120
+ private cloneValue;
6121
+ private cloneNode;
6122
+ private buildEmptySingle;
6123
+ private buildEmptyGroup;
6124
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StConditionBuilderComponent, never>;
6125
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StConditionBuilderComponent, "st-condition-builder", never, { "config": { "alias": "config"; "required": true; }; "value": { "alias": "value"; "required": true; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "valueChange": "valueChange"; "validityChange": "validityChange"; }, never, never, true, never>;
6126
+ }
6127
+
6128
+ /**
6129
+ * One group condition: a connector, a group-type selector (any/all of),
6130
+ * and a list of subConditions rendered via st-condition-rule.
6131
+ *
6132
+ * Groups do not nest further — this matches v1 (1-level nesting).
6133
+ */
6134
+ declare class StConditionGroupComponent {
6135
+ group: GroupCondition;
6136
+ config: ConditionBuilderConfig;
6137
+ /** When true, hide the leading connector (first top-level condition). */
6138
+ isFirst: boolean;
6139
+ canRemove: boolean;
6140
+ disabled: boolean;
6141
+ readonly groupChange: EventEmitter<GroupCondition>;
6142
+ readonly remove: EventEmitter<void>;
6143
+ /** User asked to insert a fresh peer Condition directly below this group. */
6144
+ readonly insertBelow: EventEmitter<void>;
6145
+ /** User asked to insert a fresh peer Group directly below this group. */
6146
+ readonly insertGroupBelow: EventEmitter<void>;
6147
+ readonly connectorOptions: LogicalConnector[];
6148
+ readonly groupTypeOptions: GroupType[];
6149
+ groupTypeLabel(type: GroupType): string;
6150
+ trackBySubIndex(index: number): number;
6151
+ onConnectorChange(event: Event): void;
6152
+ onGroupTypeChange(event: Event): void;
6153
+ onSubConditionChange(index: number, next: SubCondition): void;
6154
+ onSubConditionRemove(index: number): void;
6155
+ onSubConditionInsertBelow(index: number): void;
6156
+ onAddSubCondition(): void;
6157
+ onRemoveGroup(): void;
6158
+ onInsertBelowGroup(): void;
6159
+ onAddMenuSelect(event: Event): void;
6160
+ private buildEmptySubCondition;
6161
+ private emit;
6162
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StConditionGroupComponent, never>;
6163
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StConditionGroupComponent, "st-condition-group", never, { "group": { "alias": "group"; "required": true; }; "config": { "alias": "config"; "required": true; }; "isFirst": { "alias": "isFirst"; "required": false; }; "canRemove": { "alias": "canRemove"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "groupChange": "groupChange"; "remove": "remove"; "insertBelow": "insertBelow"; "insertGroupBelow": "insertGroupBelow"; }, never, never, true, never>;
6164
+ }
6165
+
6166
+ /**
6167
+ * One condition row: connector · field · operator · value · delete.
6168
+ *
6169
+ * Works with the structural `SubCondition` shape (no `type: 'single'` discriminator)
6170
+ * so the same component renders both top-level single conditions and subConditions
6171
+ * inside a group. The parent container wraps/unwraps the discriminator.
6172
+ */
6173
+ declare class StConditionRuleComponent {
6174
+ rule: SubCondition;
6175
+ config: ConditionBuilderConfig;
6176
+ /** When true, hide the connector picker — the first condition has no preceding peer. */
6177
+ isFirst: boolean;
6178
+ /** When false, hide the delete button (e.g. last remaining condition in a group). */
6179
+ canRemove: boolean;
6180
+ disabled: boolean;
6181
+ /**
6182
+ * When true, clicking the hover "+" opens a menu offering Condition or Group.
6183
+ * When false, clicking the hover "+" directly inserts a Condition (used for
6184
+ * sub-rules inside a group — v1's 1-level nesting forbids groups-in-groups).
6185
+ */
6186
+ canInsertGroup: boolean;
6187
+ readonly ruleChange: EventEmitter<SubCondition>;
6188
+ readonly remove: EventEmitter<void>;
6189
+ /** User asked to insert a fresh peer Condition directly below this row. */
6190
+ readonly insertBelow: EventEmitter<void>;
6191
+ /** User asked to insert a fresh peer Group directly below this row. Only fired when `canInsertGroup` is true. */
6192
+ readonly insertGroupBelow: EventEmitter<void>;
6193
+ readonly connectorOptions: LogicalConnector[];
6194
+ /** Resolve the FieldDefinition for the currently selected attribute — looks across top-level fields and nested categories. */
6195
+ get field(): FieldDefinition | undefined;
6196
+ /** Resolve the OperatorDefinition for the currently selected operator. */
6197
+ get operator(): OperatorDefinition | undefined;
6198
+ /** Operators allowed for the current field (or all operators if field has no restriction). */
6199
+ get availableOperators(): OperatorDefinition[];
6200
+ onConnectorChange(event: Event): void;
6201
+ onAttributeChange(nextAttr: string): void;
6202
+ /** Look up a field by attribute key across flat fields and nested categories. */
6203
+ private findField;
6204
+ onOperatorChange(event: Event): void;
6205
+ onValueChange(value: ConditionValue): void;
6206
+ onRemoveClick(): void;
6207
+ onInsertBelowClick(): void;
6208
+ onAddMenuSelect(event: Event): void;
6209
+ /** Pick a sensible default operator for a given field: first allowed operator. */
6210
+ private pickDefaultOperator;
6211
+ private emit;
6212
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StConditionRuleComponent, never>;
6213
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StConditionRuleComponent, "st-condition-rule", never, { "rule": { "alias": "rule"; "required": true; }; "config": { "alias": "config"; "required": true; }; "isFirst": { "alias": "isFirst"; "required": false; }; "canRemove": { "alias": "canRemove"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "canInsertGroup": { "alias": "canInsertGroup"; "required": false; }; }, { "ruleChange": "ruleChange"; "remove": "remove"; "insertBelow": "insertBelow"; "insertGroupBelow": "insertGroupBelow"; }, never, never, true, never>;
6214
+ }
6215
+
6216
+ /**
6217
+ * Renders the value input for a single condition row. Picks the editor variant
6218
+ * based on the field's `valueEditor` and the operator's arity:
6219
+ * - operator arity 'none' → no input rendered
6220
+ * - 'text' → single nile-input (text)
6221
+ * - 'chip' → nile-chip multi-value input
6222
+ * - 'select' → nile-select single
6223
+ * - 'multi-select' → nile-select multi
6224
+ *
6225
+ * Value is always handled as `string[]`. Single-value editors use the first array
6226
+ * element; empty array means "no value".
6227
+ */
6228
+ declare class StConditionValueEditorComponent implements OnInit, OnDestroy {
6229
+ field?: FieldDefinition;
6230
+ operator?: OperatorDefinition;
6231
+ value: ConditionValue;
6232
+ disabled: boolean;
6233
+ readonly valueChange: EventEmitter<ConditionValue>;
6234
+ private elementRef;
6235
+ /** Open/close + highlighted-option state for the slotted-trigger select. */
6236
+ private dropdownOpen;
6237
+ private highlightedIndex;
6238
+ private kbForwarder;
6239
+ /** The slot trigger that owns the open dropdown — used to refocus on close. */
6240
+ private activeSlot;
6241
+ /** The <nile-select> host that owns the open dropdown. */
6242
+ private activeHost;
6243
+ constructor();
6244
+ ngOnInit(): void;
6245
+ /**
6246
+ * Host class flag — when true, the value editor host stretches to take the
6247
+ * remaining flex space in the rule (so the chip can grow up to the row's
6248
+ * right edge, then scroll internally). For other variants we keep the host
6249
+ * content-sized so the inner select/input renders at its constant width.
6250
+ */
6251
+ get isChipMode(): boolean;
6252
+ /** True when operator arity is 'none' — input is hidden. */
6253
+ get hidden(): boolean;
6254
+ /** Placeholder for the current editor — field override wins, else a sensible default per editor type. */
6255
+ get placeholder(): string;
6256
+ /** Convenience: first element for single-value editors. */
6257
+ get singleValue(): string;
6258
+ /**
6259
+ * Convenience: array for multi-value editors. Returns the input array directly
6260
+ * — NOT a clone. Cloning here returns a new reference on every CD cycle, which
6261
+ * makes Angular rebind `[value]` on nile-select even when nothing changed,
6262
+ * causing the multi-select chip to flicker on every keystroke / selection.
6263
+ * The component never mutates this array in place, so sharing the ref is safe.
6264
+ */
6265
+ get multiValue(): string[];
6266
+ /**
6267
+ * Label shown for the first selected value in the multi-select chip's
6268
+ * custom display. Resolves the option's `label`; falls back to the raw value
6269
+ * if no matching option exists.
6270
+ */
6271
+ get firstSelectedLabel(): string;
6272
+ /** Count of additional selected values beyond the first — used for "+N More". */
6273
+ get overflowCount(): number;
6274
+ onTextInput(event: Event): void;
6275
+ onChipChange(event: Event): void;
6276
+ onSelectChange(event: Event): void;
6277
+ /**
6278
+ * Open Nile's dropdown using the most reliable path available. `host.show()`
6279
+ * is the documented Nile API; if it's missing or throws, fall back to
6280
+ * dispatching a real mouse-down on the host (Nile's own mousedown handler
6281
+ * opens the popup). Then dispatching a click event ensures any other Nile
6282
+ * listeners on the host get the expected sequence.
6283
+ *
6284
+ * State (activeHost / activeSlot / dropdownOpen) is set here so the doc
6285
+ * forwarder is responsive immediately — `nile-show` from Nile will run
6286
+ * `onSelectShow` shortly after and re-confirm the same state.
6287
+ */
6288
+ private openHost;
6289
+ /**
6290
+ * Nile emits `nile-show` when its dropdown opens — whether from our
6291
+ * `openHost()`, a click on the trigger, or any other path. We use it to
6292
+ * keep `dropdownOpen` truthful even when the user opens via mouse (skipping
6293
+ * `openHost()` entirely). The doc-level forwarder is already installed
6294
+ * (it lives for the component's lifetime).
6295
+ */
6296
+ onSelectShow(event: Event): void;
6297
+ /**
6298
+ * Nile emits `nile-hide` when its dropdown closes — for any reason (Esc,
6299
+ * click-outside, single-select pick, programmatic .hide()). Returning focus
6300
+ * to the slot is what makes Tab continue cleanly to the row's hover actions.
6301
+ * The document forwarder stays installed (it lives for the whole component
6302
+ * lifetime); only the open-state flags reset.
6303
+ */
6304
+ onSelectAfterHide(_event: Event): void;
6305
+ /**
6306
+ * Document-level keydown forwarder, installed for the lifetime of this
6307
+ * component instance. Runs in CAPTURE phase so it fires BEFORE any
6308
+ * bubble-phase listener — including Nile's internal listeners inside the
6309
+ * shadow DOM that would otherwise stop the event from ever reaching our
6310
+ * template-bound (keydown).
6311
+ *
6312
+ * Two distinct flows, gated by `dropdownOpen`:
6313
+ *
6314
+ * - Closed + focus is inside this component's host: Enter / Space / ↓ / ↑
6315
+ * opens our nile-select via `openHost()`.
6316
+ * - Open: ↑/↓ navigate options regardless of where focus has moved
6317
+ * (Nile may have taken focus into its portal listbox). PageUp/PageDown/
6318
+ * Home/End are swallowed so the page behind the dropdown doesn't scroll.
6319
+ * Enter, Space, Esc, Tab, type-to-search all pass through to Nile.
6320
+ *
6321
+ * The `focusIsInOurComponent` check ensures that across many co-existing
6322
+ * value-editor instances (one per condition row), only the editor the user
6323
+ * is actually interacting with reacts to the keystroke.
6324
+ */
6325
+ private installKeyForwarder;
6326
+ /**
6327
+ * True when document focus is on (or inside) our component's host element.
6328
+ * Shadow-DOM focus reports the SHADOW HOST in `document.activeElement` (it
6329
+ * does not pierce shadow boundaries), so `host.contains(...)` works even
6330
+ * when the user is actually focused on an element inside nile-select's
6331
+ * shadow root.
6332
+ */
6333
+ private focusIsInOurComponent;
6334
+ private removeKeyForwarder;
6335
+ /**
6336
+ * Walk options by `direction` (+1 or -1), update `highlightedIndex`, and
6337
+ * synchronise the visual highlight on both the light-DOM `<nile-option>` and
6338
+ * its portal counterpart.
6339
+ *
6340
+ * Strategies (matches `NileSelectEditor`):
6341
+ * - `setCurrentOption()` — preferred; Nile's documented API to mark the
6342
+ * "current" option so its native Enter handler picks the right one.
6343
+ * - `[data-kb-active]` attribute — the visual highlight, styled by our
6344
+ * injected CSS (matches the cell-editor look).
6345
+ * - `scrollIntoView` — keeps the highlighted option in view for long lists.
6346
+ *
6347
+ * We do NOT move DOM focus to the option — that would blur the trigger and
6348
+ * some Nile builds auto-close on blur. Focus stays on the trigger; Nile's
6349
+ * Enter handler reads `currentOption` from `setCurrentOption` to commit.
6350
+ */
6351
+ private navigateOption;
6352
+ ngOnDestroy(): void;
6353
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StConditionValueEditorComponent, never>;
6354
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StConditionValueEditorComponent, "st-condition-value-editor", never, { "field": { "alias": "field"; "required": false; }; "operator": { "alias": "operator"; "required": false; }; "value": { "alias": "value"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
6355
+ }
6356
+
6357
+ /**
6358
+ * Field picker — direct port of v1's `criteriaDropdown` template
6359
+ * (advanced-filter.component.html:533-629).
6360
+ *
6361
+ * Structure:
6362
+ * <nile-dropdown> ← outer dropdown anchored to the chip
6363
+ * <button slot="trigger"> ← the chip-style trigger
6364
+ * <nile-menu> ← main menu list
6365
+ * <nile-menu-item>flat field</nile-menu-item>
6366
+ * <nile-menu-item> ← one per category
6367
+ * <nile-dropdown placement="right-end"> ← nested flyout submenu
6368
+ * <span slot="trigger">{{ label }} ›</span>
6369
+ * <nile-menu searchEnabled> ← built-in search input
6370
+ * <nile-menu-item>category field</nile-menu-item>
6371
+ * </nile-menu>
6372
+ * </nile-dropdown>
6373
+ * </nile-menu-item>
6374
+ * </nile-menu>
6375
+ * </nile-dropdown>
6376
+ *
6377
+ * Nile handles positioning, click-outside, keyboard nav, and the search box —
6378
+ * we just emit valueChange when a field is picked.
6379
+ */
6380
+ declare class StConditionFieldPickerComponent {
6381
+ private cdr;
6382
+ /** Currently selected attribute key. */
6383
+ value: string;
6384
+ /** Top-level fields. */
6385
+ fields: FieldDefinition[];
6386
+ /** Optional grouped fields rendered as flyout submenus. */
6387
+ categories: FieldCategory[];
6388
+ disabled: boolean;
6389
+ placeholder: string;
6390
+ readonly valueChange: EventEmitter<string>;
6391
+ dropdownRef?: ElementRef<HTMLElement>;
6392
+ /** Resolved display label for the chip — searches flat fields, then category fields. */
6393
+ get displayLabel(): string;
6394
+ trackByAttribute: (_: number, f: FieldDefinition) => string;
6395
+ trackByCategoryId: (_: number, c: FieldCategory) => string;
6396
+ onFieldSelect(attribute: string, event?: Event): void;
6397
+ /** Swallow the click on a category menu-item so the outer dropdown stays open. */
6398
+ onCategoryItemClick(event: Event): void;
6399
+ private closeOuter;
6400
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StConditionFieldPickerComponent, never>;
6401
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StConditionFieldPickerComponent, "st-condition-field-picker", never, { "value": { "alias": "value"; "required": false; }; "fields": { "alias": "fields"; "required": false; }; "categories": { "alias": "categories"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
5528
6402
  }
5529
6403
 
5530
6404
  declare class ClickOutsideDirective {
@@ -5586,12 +6460,14 @@ declare class StColumnResizeDirective implements OnDestroy {
5586
6460
  * Directive to handle keyboard navigation in table cells
5587
6461
  */
5588
6462
  declare class StKeyboardNavigationDirective {
6463
+ private readonly el;
5589
6464
  tableState: TableState;
5590
6465
  /**
5591
6466
  * When enabled, pressing arrow down at the last row will emit requestAddRow event
5592
6467
  */
5593
6468
  addRowOnNavigatePastEnd: boolean;
5594
6469
  onKeyDown(event: KeyboardEvent): void;
6470
+ private focusNextOutside;
5595
6471
  /**
5596
6472
  * Convert navigation key to direction using enums
5597
6473
  */
@@ -5608,7 +6484,7 @@ declare class SharedTableComponentsModule {
5608
6484
 
5609
6485
  declare class SmartTableModule {
5610
6486
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SmartTableModule, never>;
5611
- static ɵmod: _angular_core.ɵɵNgModuleDeclaration<SmartTableModule, never, [typeof SharedTableComponentsModule, typeof StCellComponent, typeof StTableComponent, typeof StHeaderComponent, typeof StColumnMenuDropdownComponent, typeof StColumnVisibilityComponent, typeof StColumnFilterComponent, typeof StPaginationComponent, typeof StAddColumnButtonComponent, typeof StColumnEditorModalComponent, typeof StTableActionsComponent, typeof StRowActionsDropdownComponent, typeof StSheetComponent, typeof StSheetActionsComponent, typeof StWorkbookComponent, typeof ClickOutsideDirective, typeof StColumnResizeDirective, typeof StKeyboardNavigationDirective], [typeof StCellComponent, typeof StTableComponent, typeof StHeaderComponent, typeof StColumnMenuDropdownComponent, typeof StColumnVisibilityComponent, typeof StColumnFilterComponent, typeof StPaginationComponent, typeof StAddColumnButtonComponent, typeof StColumnEditorModalComponent, typeof StTableActionsComponent, typeof StRowActionsDropdownComponent, typeof StSheetComponent, typeof StSheetActionsComponent, typeof StWorkbookComponent, typeof ClickOutsideDirective, typeof StColumnResizeDirective, typeof StKeyboardNavigationDirective]>;
6487
+ static ɵmod: _angular_core.ɵɵNgModuleDeclaration<SmartTableModule, never, [typeof SharedTableComponentsModule, typeof StCellComponent, typeof StTableComponent, typeof StHeaderComponent, typeof StColumnMenuDropdownComponent, typeof StColumnVisibilityComponent, typeof StColumnFilterComponent, typeof StPaginationComponent, typeof StAddColumnButtonComponent, typeof StColumnEditorModalComponent, typeof StTableActionsComponent, typeof StRowActionsDropdownComponent, typeof StSheetComponent, typeof StSheetActionsComponent, typeof StWorkbookComponent, typeof StConditionBuilderComponent, typeof StConditionGroupComponent, typeof StConditionRuleComponent, typeof StConditionValueEditorComponent, typeof StConditionFieldPickerComponent, typeof ClickOutsideDirective, typeof StColumnResizeDirective, typeof StKeyboardNavigationDirective], [typeof StCellComponent, typeof StTableComponent, typeof StHeaderComponent, typeof StColumnMenuDropdownComponent, typeof StColumnVisibilityComponent, typeof StColumnFilterComponent, typeof StPaginationComponent, typeof StAddColumnButtonComponent, typeof StColumnEditorModalComponent, typeof StTableActionsComponent, typeof StRowActionsDropdownComponent, typeof StSheetComponent, typeof StSheetActionsComponent, typeof StWorkbookComponent, typeof StConditionBuilderComponent, typeof StConditionGroupComponent, typeof StConditionRuleComponent, typeof StConditionValueEditorComponent, typeof StConditionFieldPickerComponent, typeof ClickOutsideDirective, typeof StColumnResizeDirective, typeof StKeyboardNavigationDirective]>;
5612
6488
  static ɵinj: _angular_core.ɵɵInjectorDeclaration<SmartTableModule>;
5613
6489
  }
5614
6490
 
@@ -6455,5 +7331,29 @@ declare class AutosaveService {
6455
7331
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AutosaveService>;
6456
7332
  }
6457
7333
 
6458
- export { ArrayFormatter, AutosaveService, BaseColumnConfig, BooleanEditor, BooleanFormatter, BuilderPreviewComponent, BuilderToolbarComponent, Cell, CellAlignment, CellDataType, CellLifecycleState, CellVerticalAlignment, ChainValidator, ClickOutsideDirective, ColumnConfigFactory, ColumnEditorComponent, ColumnListComponent, Columns, CurrencyFormatter, DEFAULT_AUTOSAVE_CONFIG, DEFAULT_COLUMN_CONFIG, DEFAULT_TABLE_CONFIG, DateEditor, DateFormatter, DateRangeValidator, DefaultFormatter, DefinitionBuilderComponent, DefinitionBuilderModule, DefinitionBuilderService, DefinitionExportService, DefinitionImportService, EditMode, EmailValidator, FilterOperator, FunctionFormatter, FunctionValidator, JsonSchemaValidatorService, LengthValidator, NavigationDirection, NavigationKey, NileAutoCompleteEditor, NileCalendarEditor, NileCheckboxEditor, NileChipEditor, NileCodeEditor, NileDatePickerEditor, NileInputEditor, NileSelectEditor, NumberEditor, NumberFormatter, OUFormatter, PatternValidators, PercentageFormatter, RangeValidator, RegexValidator, RequiredValidator, RowValidationService, SampleDataGeneratorService, SelectEditor, SharedTableComponentsModule, SheetState, SimpleColumnConfig, SmartTableModule, SortDirection, StAddColumnButtonComponent, StCellComponent, StColumnEditorModalComponent, StColumnFilterComponent, StColumnMenuDropdownComponent, StColumnResizeDirective, StColumnVisibilityComponent, StHeaderComponent, StKeyboardNavigationDirective, StPaginationComponent, StRowActionsDropdownComponent, StSheetActionsComponent, StSheetComponent, StTableActionsComponent, StTableComponent, StWorkbookComponent, StringFormatter, TableConfigEditorComponent, TableState, TableZIndex, TemplateFormatter, TextAreaEditor, TextEditor, UrlValidator, ValidationLoggerService, VirtualScrollService, WorkbookState, canEdit, createCellState, createMemento, dnToHumanReadable, isCellValid, isDisplayMode, isNullOrUndefined, isValidDate, isValidationSuccess, mergeTableConfig, registerFormatter, resolveFormatter, restoreFromMemento };
6459
- export type { AllowedDatesRange, AsyncCellValidator, AutoCompleteOption, AutoCompleteStyle, AutosaveConfig, AutosaveData, AutosaveStrategy, BuilderState, CellCancelEvent, CellChangeEvent, CellEditEvent, CellEditor, CellEditorContext, CellEvent, CellEventHandler, CellFocusPosition, CellFormatter, CellLifecycleHooks, CellParser, CellSaveEvent, CellState, CellStateMemento, CellValidator, CellValue, ChipOption, CodeEditorCompletion, ColumnAction, ColumnActionContext, ColumnActionEvent, ColumnAddEvent, ColumnConfig, ColumnConfigOptions, ColumnConfigWithKey, ColumnFilterEvent, ColumnFilterState, ColumnMoveEvent, ColumnResizeEvent, ColumnSortEvent, ColumnSortState, CompositeValidator, DataChangeEvent, DateRange, ExportOptions, FilterContext, FilterOptions, ImportResult, NileAutoCompleteEditorOptions, NileCalendarEditorOptions, NileCheckboxEditorOptions, NileChipEditorOptions, NileCodeEditorOptions, NileDatePickerEditorOptions, NileInputEditorOptions, NileSelectEditorOptions, OUFormatterOptions, PaginationState, PartialColumnConfig, RowAction, RowActionContext, RowActionEvent, RowManagementConfig, RowValidationState, SelectOption, SheetAction, SheetActionContext, SheetActionEvent, SheetConfig, SheetMetadata, SheetStateConfig, SheetStateSnapshot, SheetTabAction, SheetTabActionEvent, TableConfig, TableRowBackgroundContext, TableStateChangeEvent, TableStateConfig, TableStateSnapshot, TableValidationState, ValidationError, ValidationLogEntry, ValidationResult, VirtualScrollState, WorkbookAction, WorkbookActionEvent, WorkbookConfig, WorkbookMetadata, WorkbookSheetConfig, WorkbookStateConfig, WorkbookStateSnapshot };
7334
+ /**
7335
+ * Stateless validator for ConditionBuilderValue. Ported from v1's `conditionsValidator`.
7336
+ *
7337
+ * Rules:
7338
+ * - In 'expression' mode: the expression string must be non-empty.
7339
+ * - In 'builder' mode:
7340
+ * - At least one top-level condition.
7341
+ * - For every single condition and subCondition:
7342
+ * - `attribute` must be set.
7343
+ * - `operator` must be set.
7344
+ * - `value` must be non-empty unless the operator's arity is 'none'.
7345
+ * - For every group: must have at least one subCondition.
7346
+ */
7347
+ declare class ConditionValidationService {
7348
+ validate(value: ConditionBuilderValue, config: ConditionBuilderConfig): ConditionBuilderValidity;
7349
+ private validateExpression;
7350
+ private validateBuilder;
7351
+ private validateGroup;
7352
+ private validateRule;
7353
+ private locator;
7354
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ConditionValidationService, never>;
7355
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ConditionValidationService>;
7356
+ }
7357
+
7358
+ export { ArrayFormatter, AutosaveService, BaseColumnConfig, BooleanEditor, BooleanFormatter, BuilderPreviewComponent, BuilderToolbarComponent, Cell, CellAlignment, CellDataType, CellLifecycleState, CellVerticalAlignment, ChainValidator, ClickOutsideDirective, ColumnConfigFactory, ColumnEditorComponent, ColumnListComponent, Columns, ConditionValidationService, CurrencyFormatter, DEFAULT_AUTOSAVE_CONFIG, DEFAULT_COLUMN_CONFIG, DEFAULT_TABLE_CONFIG, DateEditor, DateFormatter, DateRangeValidator, DefaultFormatter, DefinitionBuilderComponent, DefinitionBuilderModule, DefinitionBuilderService, DefinitionExportService, DefinitionImportService, EditMode, EmailValidator, FilterOperator, FunctionFormatter, FunctionValidator, JsonSchemaValidatorService, LengthValidator, NavigationDirection, NavigationKey, NileAutoCompleteEditor, NileCalendarEditor, NileCheckboxEditor, NileChipEditor, NileCodeEditor, NileDatePickerEditor, NileInputEditor, NileSelectEditor, NumberEditor, NumberFormatter, OUFormatter, PatternValidators, PercentageFormatter, RangeValidator, RegexValidator, RequiredValidator, RowValidationService, SampleDataGeneratorService, SelectEditor, SharedTableComponentsModule, SheetState, SimpleColumnConfig, SmartTableModule, SortDirection, StAddColumnButtonComponent, StCellComponent, StColumnEditorModalComponent, StColumnFilterComponent, StColumnMenuDropdownComponent, StColumnResizeDirective, StColumnVisibilityComponent, StConditionBuilderComponent, StConditionFieldPickerComponent, StConditionGroupComponent, StConditionRuleComponent, StConditionValueEditorComponent, StHeaderComponent, StKeyboardNavigationDirective, StPaginationComponent, StRowActionsDropdownComponent, StSheetActionsComponent, StSheetComponent, StTableActionsComponent, StTableComponent, StWorkbookComponent, StringFormatter, TableConfigEditorComponent, TableState, TableZIndex, TemplateFormatter, TextAreaEditor, TextEditor, UrlValidator, ValidationLoggerService, VirtualScrollService, WorkbookState, canEdit, createCellState, createMemento, dnToHumanReadable, isCellValid, isDisplayMode, isNullOrUndefined, isValidDate, isValidationSuccess, mergeTableConfig, registerFormatter, resolveFormatter, restoreFromMemento };
7359
+ export type { AllowedDatesRange, AsyncCellValidator, AutoCompleteOption, AutoCompleteStyle, AutosaveConfig, AutosaveData, AutosaveStrategy, BuilderState, CellCancelEvent, CellChangeEvent, CellEditEvent, CellEditor, CellEditorContext, CellEvent, CellEventHandler, CellFocusPosition, CellFormatter, CellLifecycleHooks, CellParser, CellSaveEvent, CellState, CellStateMemento, CellValidator, CellValue, ChipOption, CodeEditorCompletion, ColumnAction, ColumnActionContext, ColumnActionEvent, ColumnAddEvent, ColumnConfig, ColumnConfigOptions, ColumnConfigWithKey, ColumnFilterEvent, ColumnFilterState, ColumnMoveEvent, ColumnResizeEvent, ColumnSortEvent, ColumnSortState, CompositeValidator, ConditionBuilderConfig, ConditionBuilderMode, ConditionBuilderValidity, ConditionBuilderValue, ConditionNode, ConditionValidationError, ConditionValue, DataChangeEvent, DateRange, ExportOptions, FieldCategory, FieldDefinition, FieldOption, FieldValueEditor, FilterContext, FilterOptions, GroupCondition, GroupType, ImportResult, LogicalConnector, NileAutoCompleteEditorOptions, NileCalendarEditorOptions, NileCheckboxEditorOptions, NileChipEditorOptions, NileCodeEditorOptions, NileDatePickerEditorOptions, NileInputEditorOptions, NileSelectEditorOptions, OUFormatterOptions, OperatorArity, OperatorDefinition, PaginationState, PartialColumnConfig, RowAction, RowActionContext, RowActionEvent, RowManagementConfig, RowValidationState, SelectOption, SheetAction, SheetActionContext, SheetActionEvent, SheetConditionBuilder, SheetConfig, SheetContentType, SheetMetadata, SheetStateConfig, SheetStateSnapshot, SheetTabAction, SheetTabActionEvent, SingleCondition, SubCondition, TableConfig, TableRowBackgroundContext, TableStateChangeEvent, TableStateConfig, TableStateSnapshot, TableValidationState, ValidationError, ValidationLogEntry, ValidationResult, VirtualScrollState, WorkbookAction, WorkbookActionEvent, WorkbookConfig, WorkbookMetadata, WorkbookSheetConfig, WorkbookStateConfig, WorkbookStateSnapshot };