@praxisui/table 1.0.0-beta.1 → 1.0.0-beta.10

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.
package/index.d.ts CHANGED
@@ -7,21 +7,23 @@ import { MatSnackBar } from '@angular/material/snack-bar';
7
7
  import { SelectionModel } from '@angular/cdk/collections';
8
8
  import { SettingsPanelService, SettingsValueProvider, SettingsPanelRef } from '@praxisui/settings-panel';
9
9
  import * as _praxisui_core from '@praxisui/core';
10
- import { GlobalConfigService, TableConfig, ConfigStorage, SchemaIdParams, FieldMetadata, FormConfig, GenericCrudService, DynamicFormService, SchemaNormalizerService, ColumnDefinition, ConnectionStorage, IconPickerService, TableConfigService, ComponentDocMeta } from '@praxisui/core';
10
+ import { GlobalConfigService, TableConfig, ConfigStorage, SchemaIdParams, FieldMetadata, FormConfig, GenericCrudService, DynamicFormService, SchemaNormalizerService, ColumnDefinition, ConnectionStorage, IconPickerService, TableConfigService, FieldDefinition, ComponentDocMeta } from '@praxisui/core';
11
11
  import { DatePipe, DecimalPipe, CurrencyPipe, PercentPipe, UpperCasePipe, LowerCasePipe, TitleCasePipe } from '@angular/common';
12
12
  import { FormControl, FormGroup, AbstractControl, FormBuilder } from '@angular/forms';
13
13
  import { MatDialog } from '@angular/material/dialog';
14
14
  import { CdkOverlayOrigin, ConnectedPosition } from '@angular/cdk/overlay';
15
- import { SpecificationBridgeService, RuleBuilderConfig, RuleBuilderState } from '@praxisui/visual-builder';
16
15
  import { PraxisDialog } from '@praxisui/dialog';
17
16
  import { BehaviorSubject, Observable } from 'rxjs';
18
17
  import { CdkDragDrop } from '@angular/cdk/drag-drop';
19
18
  import * as _angular_material_paginator_d_Zo1cMMo4 from '@angular/material/paginator.d-Zo1cMMo4';
20
19
  import { MatCheckboxChange } from '@angular/material/checkbox';
20
+ import * as _praxisui_table_rule_builder from '@praxisui/table-rule-builder';
21
+ import { RuleEffectDefinition } from '@praxisui/table-rule-builder';
22
+ import { DslParser } from '@praxisui/specification';
21
23
 
22
- type ColumnDataType = 'date' | 'number' | 'currency' | 'percentage' | 'string' | 'boolean' | 'custom';
24
+ type ColumnDataType$1 = 'date' | 'number' | 'currency' | 'percentage' | 'string' | 'boolean' | 'custom';
23
25
  interface FormatterConfig {
24
- type: ColumnDataType;
26
+ type: ColumnDataType$1;
25
27
  options: any;
26
28
  }
27
29
  interface DateFormatterOptions {
@@ -88,7 +90,7 @@ declare class DataFormattingService {
88
90
  /**
89
91
  * Apply formatting to a value based on column type and format string
90
92
  */
91
- formatValue(value: any, columnType: ColumnDataType, formatString: string): any;
93
+ formatValue(value: any, columnType: ColumnDataType$1, formatString: string): any;
92
94
  /**
93
95
  * Coerce value to the expected type for formatting
94
96
  */
@@ -125,7 +127,7 @@ declare class DataFormattingService {
125
127
  /**
126
128
  * Check if formatting is needed for a column
127
129
  */
128
- needsFormatting(columnType: ColumnDataType, formatString: string): boolean;
130
+ needsFormatting(columnType: ColumnDataType$1, formatString: string): boolean;
129
131
  static ɵfac: i0.ɵɵFactoryDeclaration<DataFormattingService, never>;
130
132
  static ɵprov: i0.ɵɵInjectableDeclaration<DataFormattingService>;
131
133
  }
@@ -515,7 +517,6 @@ declare class PraxisTable implements OnInit, OnChanges, AfterViewInit, AfterCont
515
517
  private cdr;
516
518
  private settingsPanel;
517
519
  private formattingService;
518
- private specBridge;
519
520
  private configStorage;
520
521
  private connectionStorage;
521
522
  private tableDefaultsProvider;
@@ -547,6 +548,13 @@ declare class PraxisTable implements OnInit, OnChanges, AfterViewInit, AfterCont
547
548
  tableId: string;
548
549
  /** Habilita visual de debug para alinhamento/layouot */
549
550
  debugLayout: boolean;
551
+ /**
552
+ * Controla a estratégia de largura/scroll horizontal.
553
+ * - 'auto': (padrão) cria viewport com overflow-x e deixa a tabela crescer via max-content
554
+ * - 'wrap': permite quebra de linha nas células, reduzindo a largura (menos scroll)
555
+ * - 'none': desabilita comportamento da lib (host cuida do scroll)
556
+ */
557
+ horizontalScroll: 'auto' | 'wrap' | 'none';
550
558
  /** Contexto opcional quando tabela está dentro do componente CRUD */
551
559
  crudContext?: {
552
560
  tableId: string;
@@ -631,6 +639,8 @@ declare class PraxisTable implements OnInit, OnChanges, AfterViewInit, AfterCont
631
639
  getActionsHeaderIcon(): string | undefined;
632
640
  getActionsHeaderTooltip(): string | undefined;
633
641
  private styleSpecCache;
642
+ private actionSpecCache;
643
+ private dslParser;
634
644
  schemaError: boolean;
635
645
  dataError: boolean;
636
646
  errorMessage: string | null;
@@ -675,7 +685,7 @@ declare class PraxisTable implements OnInit, OnChanges, AfterViewInit, AfterCont
675
685
  getVirtMinHeightStyle(): string | null;
676
686
  trackByRow: (index: number, row: any) => string | number;
677
687
  private getRowId;
678
- constructor(crudService: GenericCrudService<any>, cdr: ChangeDetectorRef, settingsPanel: SettingsPanelService, formattingService: DataFormattingService, specBridge: SpecificationBridgeService, configStorage: ConfigStorage, connectionStorage: ConnectionStorage, tableDefaultsProvider: TableDefaultsProvider, snackBar: MatSnackBar, filterConfig: FilterConfigService, pxDialog: PraxisDialog, hostRef: ElementRef<HTMLElement>, global: GlobalConfigService);
688
+ constructor(crudService: GenericCrudService<any>, cdr: ChangeDetectorRef, settingsPanel: SettingsPanelService, formattingService: DataFormattingService, configStorage: ConfigStorage, connectionStorage: ConnectionStorage, tableDefaultsProvider: TableDefaultsProvider, snackBar: MatSnackBar, filterConfig: FilterConfigService, pxDialog: PraxisDialog, hostRef: ElementRef<HTMLElement>, global: GlobalConfigService);
679
689
  openQuickConnect(): void;
680
690
  ngOnInit(): void;
681
691
  ngAfterContentInit(): void;
@@ -683,6 +693,7 @@ declare class PraxisTable implements OnInit, OnChanges, AfterViewInit, AfterCont
683
693
  private isDebug;
684
694
  private connectionKey;
685
695
  private saveConnection;
696
+ private inputsKey;
686
697
  disconnect(): void;
687
698
  ngAfterViewInit(): void;
688
699
  onPageChange(event: PageEvent): void;
@@ -735,8 +746,14 @@ declare class PraxisTable implements OnInit, OnChanges, AfterViewInit, AfterCont
735
746
  getCellClasses(rowData: any, column: ColumnDefinition): string[] | undefined;
736
747
  getCellNgStyle(rowData: any, column: ColumnDefinition): Record<string, string> | undefined;
737
748
  private evaluateStyleRule;
749
+ /** Evaluate row action visibility condition using the same DSL as styles */
750
+ private evaluateActionCondition;
738
751
  getRowClasses(rowData: any): string[] | undefined;
739
752
  getRowNgStyle(rowData: any): Record<string, string> | undefined;
753
+ private getRowRenderer;
754
+ getRowTooltip(rowData: any): string | null;
755
+ getRowTooltipPosition(rowData: any): 'above' | 'below' | 'left' | 'right';
756
+ getRowTooltipShowDelay(rowData: any): number;
740
757
  /**
741
758
  * Apply value mapping to transform raw values into display-friendly text
742
759
  */
@@ -790,19 +807,64 @@ declare class PraxisTable implements OnInit, OnChanges, AfterViewInit, AfterCont
790
807
  private coerceExpected;
791
808
  getImageSrc(row: any, column: ColumnDefinition): string | null;
792
809
  getImageAlt(row: any, column: ColumnDefinition): string | null;
793
- getImageWidth(column: ColumnDefinition): number | null;
794
- getImageHeight(column: ColumnDefinition): number | null;
795
- getImageShape(column: ColumnDefinition): 'square' | 'rounded' | 'circle' | undefined;
796
- getImageFit(column: ColumnDefinition): 'cover' | 'contain' | undefined;
810
+ getImageWidth(row: any, column: ColumnDefinition): number | null;
811
+ getImageHeight(row: any, column: ColumnDefinition): number | null;
812
+ getImageShape(row: any, column: ColumnDefinition): 'square' | 'rounded' | 'circle' | undefined;
813
+ getImageFit(row: any, column: ColumnDefinition): 'cover' | 'contain' | undefined;
797
814
  getImageLazy(_row: any, column: ColumnDefinition): boolean;
798
815
  getBadgeText(row: any, column: ColumnDefinition): string | null;
799
816
  getBadgeIcon(row: any, column: ColumnDefinition): string | null;
800
817
  getBadgeClasses(row: any, column: ColumnDefinition): string[];
801
- getEffectiveRendererType(row: any, column: ColumnDefinition): 'icon' | 'image' | 'badge' | null;
818
+ getEffectiveRendererType(row: any, column: ColumnDefinition): 'icon' | 'image' | 'badge' | 'link' | 'button' | 'chip' | 'progress' | 'avatar' | 'toggle' | 'menu' | 'html' | 'compose' | null;
819
+ getComposeItems(row: any, column: ColumnDefinition): any[];
820
+ getComposeClasses(row: any, column: ColumnDefinition): string[];
821
+ getComposeGapStyle(row: any, column: ColumnDefinition): any;
822
+ asItemColumn(base: ColumnDefinition, item: any): any;
823
+ getItemEffectiveType(row: any, column: ColumnDefinition, item: any): any;
824
+ private _rendererOverrideCache;
825
+ private mergeRenderer;
826
+ private getEffectiveRenderer;
827
+ getLinkHref(row: any, column: ColumnDefinition): string | null;
828
+ getLinkText(row: any, column: ColumnDefinition): string;
829
+ getLinkTarget(row: any, column: ColumnDefinition): string | null;
830
+ getLinkRel(row: any, column: ColumnDefinition): string | null;
831
+ getButtonLabel(row: any, column: ColumnDefinition): string;
832
+ getButtonIcon(row: any, column: ColumnDefinition): string | null;
833
+ getButtonVariant(row: any, column: ColumnDefinition): 'filled' | 'outlined' | 'text';
834
+ getButtonColor(row: any, column: ColumnDefinition): string | null;
835
+ isButtonDisabled(row: any, column: ColumnDefinition): boolean;
836
+ getButtonAriaLabel(row: any, column: ColumnDefinition): string | null;
837
+ onButtonClick(row: any, column: ColumnDefinition, event: Event): void;
838
+ getChipText(row: any, column: ColumnDefinition): string | null;
839
+ getChipIcon(row: any, column: ColumnDefinition): string | null;
840
+ getChipClasses(row: any, column: ColumnDefinition): string[];
841
+ getProgressValue(row: any, column: ColumnDefinition): number;
842
+ getProgressColor(row: any, column: ColumnDefinition): string | null;
843
+ getProgressShowLabel(row: any, column: ColumnDefinition): boolean;
844
+ getAvatarSrc(row: any, column: ColumnDefinition): string | null;
845
+ getAvatarAlt(row: any, column: ColumnDefinition): string | null;
846
+ getAvatarInitials(row: any, column: ColumnDefinition): string;
847
+ getAvatarShape(row: any, column: ColumnDefinition): 'square' | 'rounded' | 'circle' | undefined;
848
+ getAvatarStyle(row: any, column: ColumnDefinition): Record<string, string>;
849
+ getToggleState(row: any, column: ColumnDefinition): boolean;
850
+ isToggleDisabled(row: any, column: ColumnDefinition): boolean;
851
+ getToggleAriaLabel(row: any, column: ColumnDefinition): string | null;
852
+ onToggleChange(row: any, column: ColumnDefinition, event: any): void;
853
+ getMenuAriaLabel(row: any, column: ColumnDefinition): string | null;
854
+ private evaluateArrayExpr;
855
+ getMenuItems(row: any, column: ColumnDefinition): Array<{
856
+ label: string;
857
+ icon?: string;
858
+ id: string;
859
+ __visible: boolean;
860
+ }>;
861
+ onMenuItemClick(actionId: string, row: any, event: Event): void;
862
+ getSafeHtml(row: any, column: ColumnDefinition): any;
863
+ private escapeHtml;
802
864
  private applyAppearanceVariables;
803
865
  ngOnDestroy(): void;
804
866
  static ɵfac: i0.ɵɵFactoryDeclaration<PraxisTable, never>;
805
- static ɵcmp: i0.ɵɵComponentDeclaration<PraxisTable, "praxis-table", never, { "config": { "alias": "config"; "required": false; }; "resourcePath": { "alias": "resourcePath"; "required": false; }; "filterCriteria": { "alias": "filterCriteria"; "required": false; }; "notifyIfOutdated": { "alias": "notifyIfOutdated"; "required": false; }; "snoozeMs": { "alias": "snoozeMs"; "required": false; }; "autoOpenSettingsOnOutdated": { "alias": "autoOpenSettingsOnOutdated"; "required": false; }; "showToolbar": { "alias": "showToolbar"; "required": false; }; "toolbarV2": { "alias": "toolbarV2"; "required": false; }; "autoDelete": { "alias": "autoDelete"; "required": false; }; "editModeEnabled": { "alias": "editModeEnabled"; "required": false; }; "dense": { "alias": "dense"; "required": false; }; "tableId": { "alias": "tableId"; "required": false; }; "debugLayout": { "alias": "debugLayout"; "required": false; }; "crudContext": { "alias": "crudContext"; "required": false; }; "idField": { "alias": "idField"; "required": false; }; }, { "rowClick": "rowClick"; "rowAction": "rowAction"; "toolbarAction": "toolbarAction"; "bulkAction": "bulkAction"; "rowDoubleClick": "rowDoubleClick"; "schemaStatusChange": "schemaStatusChange"; "beforeDelete": "beforeDelete"; "afterDelete": "afterDelete"; "deleteError": "deleteError"; "beforeBulkDelete": "beforeBulkDelete"; "afterBulkDelete": "afterBulkDelete"; "bulkDeleteError": "bulkDeleteError"; }, ["projectedFilter"], ["[advancedFilter]", "[toolbar]", "[advancedFilter]", "[toolbar]"], true, never>;
867
+ static ɵcmp: i0.ɵɵComponentDeclaration<PraxisTable, "praxis-table", never, { "config": { "alias": "config"; "required": false; }; "resourcePath": { "alias": "resourcePath"; "required": false; }; "filterCriteria": { "alias": "filterCriteria"; "required": false; }; "notifyIfOutdated": { "alias": "notifyIfOutdated"; "required": false; }; "snoozeMs": { "alias": "snoozeMs"; "required": false; }; "autoOpenSettingsOnOutdated": { "alias": "autoOpenSettingsOnOutdated"; "required": false; }; "showToolbar": { "alias": "showToolbar"; "required": false; }; "toolbarV2": { "alias": "toolbarV2"; "required": false; }; "autoDelete": { "alias": "autoDelete"; "required": false; }; "editModeEnabled": { "alias": "editModeEnabled"; "required": false; }; "dense": { "alias": "dense"; "required": false; }; "tableId": { "alias": "tableId"; "required": false; }; "debugLayout": { "alias": "debugLayout"; "required": false; }; "horizontalScroll": { "alias": "horizontalScroll"; "required": false; }; "crudContext": { "alias": "crudContext"; "required": false; }; "idField": { "alias": "idField"; "required": false; }; }, { "rowClick": "rowClick"; "rowAction": "rowAction"; "toolbarAction": "toolbarAction"; "bulkAction": "bulkAction"; "rowDoubleClick": "rowDoubleClick"; "schemaStatusChange": "schemaStatusChange"; "beforeDelete": "beforeDelete"; "afterDelete": "afterDelete"; "deleteError": "deleteError"; "beforeBulkDelete": "beforeBulkDelete"; "afterBulkDelete": "afterBulkDelete"; "bulkDeleteError": "bulkDeleteError"; }, ["projectedFilter"], ["[advancedFilter]", "[toolbar]", "[advancedFilter]", "[toolbar]"], true, never>;
806
868
  }
807
869
 
808
870
  declare class PraxisTableToolbar {
@@ -968,7 +1030,7 @@ declare class ColumnsConfigEditorComponent implements OnInit, OnDestroy {
968
1030
  private readonly destroyRef;
969
1031
  private destroy$;
970
1032
  onlyVisibleRendererFields: boolean;
971
- uiRendererType: 'icon' | 'image' | 'badge' | null;
1033
+ uiRendererType: 'icon' | 'image' | 'badge' | 'link' | 'button' | 'chip' | 'progress' | 'avatar' | 'toggle' | 'menu' | 'html' | 'compose' | null;
972
1034
  private _rendererApplyTimer;
973
1035
  rendererFieldOptions: Array<{
974
1036
  name: string;
@@ -977,6 +1039,24 @@ declare class ColumnsConfigEditorComponent implements OnInit, OnDestroy {
977
1039
  isVisible: boolean;
978
1040
  }>;
979
1041
  uiRendererConditional: boolean;
1042
+ condOverridesSelectedIndex: number;
1043
+ getConditionalOverrides(): any[];
1044
+ ensureConditionalOverrides(): any[];
1045
+ addConditionalOverride(): void;
1046
+ removeConditionalOverride(index: number): void;
1047
+ duplicateConditionalOverride(index: number): void;
1048
+ onConditionalOverrideReorder(event: any): void;
1049
+ selectConditionalOverride(index: number): void;
1050
+ getOverrideField(path: string): any;
1051
+ setOverrideField(path: string, value: any): void;
1052
+ onOverrideTypeChange(ov: any, val: string): void;
1053
+ exportOverrideJson(index: number): void;
1054
+ importOverrideJson(index: number): void;
1055
+ rendererValidationErrors: string[];
1056
+ rendererIsValid: boolean;
1057
+ rendererPreviewEnabled: boolean;
1058
+ private rendererAppliedSnapshot;
1059
+ previewRows: any[];
980
1060
  private refreshRendererFieldOptions;
981
1061
  getRendererFieldOptions(): Array<{
982
1062
  name: string;
@@ -1024,7 +1104,7 @@ declare class ColumnsConfigEditorComponent implements OnInit, OnDestroy {
1024
1104
  getColumnMapping(column: ColumnDefinition | null): {
1025
1105
  [key: string | number]: string;
1026
1106
  };
1027
- getRendererType(col: ColumnDefinition | null): 'icon' | 'image' | 'badge' | null;
1107
+ getRendererType(col: ColumnDefinition | null): 'icon' | 'image' | 'badge' | 'link' | 'button' | 'chip' | 'progress' | 'avatar' | 'toggle' | 'menu' | 'html' | null;
1028
1108
  onRendererTypeChange(type: 'icon' | 'image' | 'badge' | null): void;
1029
1109
  onRendererModeClosed(): void;
1030
1110
  onToggleRendererConditional(enabled: boolean): void;
@@ -1067,19 +1147,79 @@ declare class ColumnsConfigEditorComponent implements OnInit, OnDestroy {
1067
1147
  getRendererBadgeIcon(): string;
1068
1148
  setRendererBadgeIcon(v: string): void;
1069
1149
  private ensureRenderer;
1150
+ private _ensureKind;
1151
+ getRendererProp(kind: string, path: string): any;
1152
+ setRendererProp(kind: string, path: string, value: any): void;
1153
+ private _deepClone;
1154
+ hasSelectedRenderer(): boolean;
1155
+ onApplyRenderer(): void;
1156
+ onDiscardRenderer(): void;
1157
+ onExportRendererJson(): Promise<void>;
1158
+ onImportRendererJson(): void;
1159
+ private sanitizeRenderer;
1160
+ private ensurePreviewRows;
1161
+ private evalValueExpr;
1162
+ private evalArrayExpr;
1163
+ private _coerceExpected;
1164
+ private getNested;
1165
+ getPreviewRendererType(row: any): 'icon' | 'image' | 'badge' | 'link' | 'button' | 'chip' | 'progress' | 'avatar' | 'toggle' | 'menu' | 'html' | 'compose' | null;
1166
+ getPreviewIconName(row: any): string | null;
1167
+ getPreviewIconColor(row: any): string | null;
1168
+ getPreviewIconStyle(row: any): Record<string, string> | null;
1169
+ getPreviewImageSrc(row: any): string | null;
1170
+ getPreviewImageAlt(row: any): string | null;
1171
+ getPreviewImageWidth(): number | null;
1172
+ getPreviewImageHeight(): number | null;
1173
+ getPreviewImageShape(): 'square' | 'rounded' | 'circle' | undefined;
1174
+ getPreviewImageFit(): 'cover' | 'contain' | undefined;
1175
+ getPreviewBadgeText(row: any): string | null;
1176
+ getPreviewBadgeIcon(_row: any): string | null;
1177
+ getPreviewBadgeClasses(_row: any): string[];
1178
+ getPreviewLinkText(row: any): string;
1179
+ getPreviewLinkHref(row: any): string | null;
1180
+ getPreviewButtonLabel(row: any): string;
1181
+ getPreviewButtonIcon(): string | null;
1182
+ getPreviewChipText(row: any): string | null;
1183
+ getPreviewChipClasses(): string[];
1184
+ getPreviewProgressValue(row: any): number;
1185
+ getPreviewAvatarSrc(row: any): string | null;
1186
+ getPreviewAvatarInitials(row: any): string;
1187
+ getPreviewAvatarStyle(): Record<string, string>;
1188
+ getPreviewAvatarShape(): 'square' | 'rounded' | 'circle' | undefined;
1189
+ getPreviewToggleState(row: any): boolean;
1190
+ getPreviewMenuCount(row: any): number;
1191
+ getPreviewHtml(row: any): string;
1192
+ trackByIdx: (_: number, item: any) => number;
1193
+ private validateRenderer;
1070
1194
  private readonly _emptyMappingRef;
1195
+ composeSelectedIndex: number;
1196
+ private ensureCompose;
1197
+ getComposeItemsUI(): Array<{
1198
+ type: string;
1199
+ summary: string;
1200
+ raw: any;
1201
+ }>;
1202
+ private getComposeItemSummary;
1203
+ addComposeItem(kind: string): void;
1204
+ removeComposeItem(index: number): void;
1205
+ duplicateComposeItem(index: number): void;
1206
+ onComposeReorder(event: any): void;
1207
+ selectComposeItem(index: number): void;
1208
+ getComposeLayoutProp(key: string): any;
1209
+ setComposeLayoutProp(key: string, value: any): void;
1210
+ private getSelectedComposeItem;
1071
1211
  getColumnKeyInputType(column: ColumnDefinition | null): 'text' | 'number' | 'boolean';
1072
1212
  onMappingChange(mapping: {
1073
1213
  [key: string | number]: string;
1074
1214
  }): void;
1075
- get selectedColumnDataType(): ColumnDataType;
1076
- set selectedColumnDataType(value: ColumnDataType);
1077
- getColumnDataType(column: ColumnDefinition | null): ColumnDataType;
1215
+ get selectedColumnDataType(): ColumnDataType$1;
1216
+ set selectedColumnDataType(value: ColumnDataType$1);
1217
+ getColumnDataType(column: ColumnDefinition | null): ColumnDataType$1;
1078
1218
  /**
1079
1219
  * Infer column data type from field name patterns (shared logic with PraxisTable)
1080
1220
  */
1081
1221
  private inferFieldTypeFromFieldName;
1082
- onDataTypeChange(dataType: ColumnDataType): void;
1222
+ onDataTypeChange(dataType: ColumnDataType$1): void;
1083
1223
  showDataFormatter(column: ColumnDefinition | null): boolean;
1084
1224
  getFormatterIcon(column: ColumnDefinition | null): string;
1085
1225
  getFormatterPanelDescription(column: ColumnDefinition | null): string;
@@ -1289,6 +1429,8 @@ declare class PraxisTableConfigEditor implements OnInit, OnDestroy, SettingsValu
1289
1429
  private initialResourcePath;
1290
1430
  idField: string;
1291
1431
  private initialIdField;
1432
+ horizontalScroll: 'auto' | 'wrap' | 'none';
1433
+ private initialHorizontalScroll;
1292
1434
  crudContext?: {
1293
1435
  tableId: string;
1294
1436
  resourcePath?: string;
@@ -1330,6 +1472,7 @@ declare class PraxisTableConfigEditor implements OnInit, OnDestroy, SettingsValu
1330
1472
  onColumnsConfigChange(newConfig: TableConfig): void;
1331
1473
  onColumnChange(change: ColumnChange): void;
1332
1474
  onFilterSettingsChange(cfg: FilterConfig): void;
1475
+ onRulesConfigChange(newCfg: TableConfig): void;
1333
1476
  private updateColumnMetas;
1334
1477
  private updateCanSaveState;
1335
1478
  private subscribeCrudEditorChanges;
@@ -1348,9 +1491,9 @@ declare class PraxisTableConfigEditor implements OnInit, OnDestroy, SettingsValu
1348
1491
  getSettingsValue(): TableConfig;
1349
1492
  onResourcePathChange(val: string): void;
1350
1493
  onIdFieldChange(val: string): void;
1494
+ onHorizontalScrollChange(val: 'auto' | 'wrap' | 'none'): void;
1351
1495
  onReconcileIdField(): void;
1352
1496
  onAcceptServerHash(): void;
1353
- onVisualRulesConfigChange(newConfig: TableConfig): void;
1354
1497
  reset(): void;
1355
1498
  onResetToDefaults(): void;
1356
1499
  /**
@@ -1413,7 +1556,7 @@ declare const FILTER_DRAWER_ADAPTER: InjectionToken<FilterDrawerAdapter>;
1413
1556
  declare class DataFormatterComponent implements OnInit, OnChanges {
1414
1557
  private cdr;
1415
1558
  private formattingService;
1416
- columnType: ColumnDataType;
1559
+ columnType: ColumnDataType$1;
1417
1560
  currentFormat: string;
1418
1561
  formatChange: EventEmitter<string>;
1419
1562
  datePresets: FormatPreset[];
@@ -1601,72 +1744,255 @@ declare class FilterSettingsComponent implements OnChanges {
1601
1744
  static ɵcmp: i0.ɵɵComponentDeclaration<FilterSettingsComponent, "filter-settings", never, { "metadata": { "alias": "metadata"; "required": false; }; "settings": { "alias": "settings"; "required": false; }; "configKey": { "alias": "configKey"; "required": false; }; }, { "settingsChange": "settingsChange"; }, never, never, true, never>;
1602
1745
  }
1603
1746
 
1604
- declare class TableVisualRulesEditorComponent {
1747
+ type ColumnDataType = 'string' | 'number' | 'date' | 'boolean' | 'currency' | 'percentage' | 'custom';
1748
+
1749
+ type OperatorKey = '==' | '!=' | '<' | '<=' | '>' | '>=' | 'contains' | 'startsWith' | 'endsWith' | 'matches' | 'in' | 'not in' | 'is empty' | 'is not empty' | 'between' | 'is today' | 'in last' | 'weekday is' | 'is true' | 'is false' | 'contains all' | 'contains any' | 'length ==' | 'length >' | 'length <' | 'jsonPath matches' | 'has key' | 'key ==' | 'id ==' | 'id in' | 'has property';
1750
+ interface OperatorSpec {
1751
+ key: OperatorKey;
1752
+ label: string;
1753
+ icon?: string;
1754
+ description?: string;
1755
+ }
1756
+ declare class OperatorsRegistryService {
1757
+ /** Returns the list of operator specs supported for a given data type. */
1758
+ getForType(type: ColumnDataType | 'enum' | 'array' | 'json' | 'relational'): OperatorSpec[];
1759
+ get keys(): OperatorKey[];
1760
+ private readonly stringOps;
1761
+ private readonly numberOps;
1762
+ private readonly dateOps;
1763
+ private readonly booleanOps;
1764
+ private readonly enumOps;
1765
+ private readonly arrayOps;
1766
+ private readonly jsonOps;
1767
+ private readonly relationalOps;
1768
+ static ɵfac: i0.ɵɵFactoryDeclaration<OperatorsRegistryService, never>;
1769
+ static ɵprov: i0.ɵɵInjectableDeclaration<OperatorsRegistryService>;
1770
+ }
1771
+
1772
+ type GroupOp = 'AND' | 'OR' | 'NOT';
1773
+ interface RuleAtom {
1774
+ field: string;
1775
+ operator: string;
1776
+ value?: any;
1777
+ options?: Record<string, any>;
1778
+ }
1779
+ interface RuleGroup {
1780
+ op: GroupOp;
1781
+ conditions: RuleAtom[];
1782
+ groups?: RuleGroup[];
1783
+ }
1784
+ declare class RuleCompilerService {
1785
+ /**
1786
+ * Compiles a rule group into a single DSL expression string, adding
1787
+ * parentheses according to grouping and operator precedence.
1788
+ */
1789
+ compileGroup(group: RuleGroup): string;
1790
+ /** Compiles a single rule atom to DSL. */
1791
+ compileAtom(atom: RuleAtom): string;
1792
+ private stringify;
1793
+ static ɵfac: i0.ɵɵFactoryDeclaration<RuleCompilerService, never>;
1794
+ static ɵprov: i0.ɵɵInjectableDeclaration<RuleCompilerService>;
1795
+ }
1796
+
1797
+ type RuleItem = {
1798
+ condition: string;
1799
+ cssClass?: string;
1800
+ style?: Record<string, string>;
1801
+ description?: string;
1802
+ effects?: _praxisui_table_rule_builder.RuleEffectDefinition;
1803
+ enabled?: boolean;
1804
+ };
1805
+ declare class TableRulesEditorComponent implements OnChanges {
1806
+ private cdr;
1807
+ private registry;
1808
+ private compiler;
1809
+ private dynamicForm;
1810
+ private crud?;
1605
1811
  config: TableConfig;
1812
+ resourcePath?: string;
1813
+ fields?: FieldDefinition[] | null;
1814
+ i18nRules?: Partial<Record<string, string>>;
1606
1815
  configChange: EventEmitter<_praxisui_core.TableConfigModern>;
1607
- columns: ColumnDefinition[];
1608
- selectedField?: string;
1609
- selectedColumn?: ColumnDefinition | null;
1610
- scope: 'column' | 'row';
1611
- builderConfig: RuleBuilderConfig | null;
1612
- currentRulesState?: RuleBuilderState;
1613
- compiledRules: Array<{
1614
- condition: string;
1615
- cssClass?: string;
1616
- style?: Record<string, string>;
1617
- _styleText?: string;
1618
- display?: string;
1816
+ scope: 'row' | 'column';
1817
+ selectedColumnField: string | null;
1818
+ draftCondition: string;
1819
+ draftCssClass: string;
1820
+ draftStyleText: string;
1821
+ dslMode: boolean;
1822
+ dslErrors: string[];
1823
+ editIndex: number;
1824
+ get currentRules(): RuleItem[];
1825
+ set currentRules(v: RuleItem[]);
1826
+ rulesRow: RuleItem[];
1827
+ rulesColumn: RuleItem[];
1828
+ private parser;
1829
+ objectKeys: {
1830
+ (o: object): string[];
1831
+ (o: {}): string[];
1832
+ };
1833
+ dynamicValueForm: FormGroup;
1834
+ dynamicValueMetas: FieldMetadata[];
1835
+ effectsValue?: RuleEffectDefinition;
1836
+ dynamicValueActive: boolean;
1837
+ private dynamicValueSub?;
1838
+ basicFieldType: 'enum' | 'array' | 'json' | 'relational' | 'string' | 'number' | 'date' | 'boolean' | 'currency' | 'percentage' | 'custom';
1839
+ noValueOperator: boolean;
1840
+ i18nValuePlaceholder: string;
1841
+ enumOptions: Array<{
1842
+ value: any;
1843
+ label: string;
1844
+ }>;
1845
+ private updateDerivedUiProps;
1846
+ /** Enable verbose console logging for debugging value editor behavior */
1847
+ debugLogs: boolean;
1848
+ debugLevel: 'log' | 'info' | 'debug';
1849
+ private dbg;
1850
+ /** Log a summary table of field metadata and column info for diagnostics */
1851
+ private logFieldMetasContext;
1852
+ /** Log a focused view for a single field */
1853
+ private logSingleFieldMeta;
1854
+ private logFieldChoices;
1855
+ i18nDefault: Record<string, string>;
1856
+ t(key: string): string;
1857
+ constructor(cdr: ChangeDetectorRef, registry: OperatorsRegistryService, compiler: RuleCompilerService, dynamicForm: DynamicFormService, crud?: GenericCrudService<any> | undefined);
1858
+ ngOnInit(): void;
1859
+ ngOnChanges(changes: SimpleChanges): void;
1860
+ get columnFields(): string[];
1861
+ getOperatorsForField(fieldName: string | null): string[];
1862
+ onScopeChange(_s: 'row' | 'column'): void;
1863
+ onColumnSelect(_field: string): void;
1864
+ private initFromConfig;
1865
+ private loadColumnRules;
1866
+ rebuildCondition(): void;
1867
+ onDraftChange(): void;
1868
+ onRelSearch(ev: any): void;
1869
+ clearRelSelection(): void;
1870
+ onRelSelectSingle(opt: any): void;
1871
+ onRelAddMulti(opt: any): void;
1872
+ removeRelMulti(i: number): void;
1873
+ private fetchRelOptions;
1874
+ private getRelationalConfig;
1875
+ validateDraft(): void;
1876
+ canCommitDraft(): boolean;
1877
+ addOrUpdateRule(): void;
1878
+ editRule(index: number): void;
1879
+ removeRule(index: number): void;
1880
+ duplicateRule(index: number): void;
1881
+ onRuleToggle(): void;
1882
+ onApply(): void;
1883
+ isValid(): boolean;
1884
+ onExportRules(): void;
1885
+ onImportRules(): void;
1886
+ private sanitizeRule;
1887
+ private buildRendererOverrideFromRule;
1888
+ private buildRowRendererOverrideFromRule;
1889
+ private stringifyValue;
1890
+ private extractIdentifiers;
1891
+ resetDraft(): void;
1892
+ basicField: string;
1893
+ basicOperator: string;
1894
+ basicValue: any;
1895
+ basicMin: any;
1896
+ basicMax: any;
1897
+ basicListCsv: string;
1898
+ basicDate: Date | null;
1899
+ basicDateStart: Date | null;
1900
+ basicDateEnd: Date | null;
1901
+ basicEnumValue: string | number | null;
1902
+ basicEnumValues: Array<string | number>;
1903
+ basicLength: number | null;
1904
+ relationalSelected: {
1905
+ id: any;
1906
+ label: string;
1907
+ raw: any;
1908
+ } | null;
1909
+ relationalSelectedMulti: Array<{
1910
+ id: any;
1911
+ label: string;
1912
+ raw: any;
1619
1913
  }>;
1620
- private rulesUpdateTimer;
1621
- hasPending: boolean;
1622
- private effectsPaused;
1623
- private destroyed;
1624
- private suppressRulesUntil;
1625
- private lastCompiledJson;
1626
- private lastStateJson;
1627
- private lastColumnsSignature;
1628
- classPresets: {
1914
+ relationalOptions: Array<{
1915
+ id: any;
1916
+ label: string;
1917
+ raw: any;
1918
+ }>;
1919
+ basicRelPath: string;
1920
+ private relSearchTerm;
1921
+ private relCache;
1922
+ basicLastN: number | null;
1923
+ basicLastUnit: 'days' | 'weeks' | 'months';
1924
+ basicWeekdays: number[];
1925
+ weekdayOptions: {
1926
+ value: number;
1629
1927
  label: string;
1630
- value: string;
1631
1928
  }[];
1632
- ngOnInit(): void;
1633
- ngOnChanges(): void;
1634
- ngOnDestroy(): void;
1635
- onScopeChange(scope: 'column' | 'row'): void;
1636
- onSelectColumn(field: string): void;
1637
- private resolveSelectedTarget;
1638
- onRulesChanged(state: RuleBuilderState): void;
1639
- private applyRulesState;
1640
- onEffectChanged(): void;
1641
- onStyleTextChanged(r: any): void;
1642
- private mergeEffects;
1643
- private materializeCompiledRules;
1644
- private stringifyStyle;
1645
- private parseStyleText;
1646
- onPresetSelected(r: any, value: string): void;
1647
- private mergePendingIntoCompiled;
1648
- private prettifyCondition;
1649
- private createBuilderConfig;
1650
- private mapType;
1651
- private maybeRebuildBuilderConfig;
1652
- applyEffects(): void;
1653
- discardEffects(): void;
1654
- pauseEffects(on: boolean): void;
1655
- trackRule(index: number, r: any): any;
1656
- static ɵfac: i0.ɵɵFactoryDeclaration<TableVisualRulesEditorComponent, never>;
1657
- static ɵcmp: i0.ɵɵComponentDeclaration<TableVisualRulesEditorComponent, "table-visual-rules-editor", never, { "config": { "alias": "config"; "required": false; }; }, { "configChange": "configChange"; }, never, never, true, never>;
1929
+ basicJsonPath: string;
1930
+ basicJsonPattern: string;
1931
+ basicJsonKey: string;
1932
+ basicJsonExpected: any;
1933
+ draftGroup: RuleGroup;
1934
+ editAtomIndex: number;
1935
+ activeGroupTarget: 'root' | number;
1936
+ onEffectsChange(v: RuleEffectDefinition): void;
1937
+ private hasRuleEffectsValue;
1938
+ getFieldType(fieldName: string | null): 'enum' | 'array' | 'json' | 'relational' | 'string' | 'number' | 'date' | 'boolean' | 'currency' | 'percentage' | 'custom';
1939
+ getEnumOptions(fieldName: string | null): Array<{
1940
+ value: any;
1941
+ label: string;
1942
+ }>;
1943
+ isNoValueOperator(op: string): boolean;
1944
+ getValuePlaceholder(): string;
1945
+ getI18nValuePlaceholder(): string;
1946
+ private toIsoDateString;
1947
+ setDsl(v: boolean): void;
1948
+ onBasicFieldChange(_val: string): void;
1949
+ onBasicOperatorChange(_val: string): void;
1950
+ private refreshDynamicValueInitialValueOnly;
1951
+ refreshDynamicValueHost(): void;
1952
+ private buildAtomFromBasic;
1953
+ canBuildAtom(): boolean;
1954
+ onAddOrUpdateAtom(): void;
1955
+ editAtom(index: number): void;
1956
+ removeAtom(index: number): void;
1957
+ resetAtomEdit(): void;
1958
+ private focusAddCondition;
1959
+ clearGroup(): void;
1960
+ onDropCondition(evt: CdkDragDrop<RuleAtom[]>): void;
1961
+ updateDraftFromGroup(): void;
1962
+ getAtomPreview(a: RuleAtom): string;
1963
+ addSubgroup(): void;
1964
+ removeSubgroup(index: number): void;
1965
+ getGroupPreview(g: RuleGroup): string;
1966
+ private getActiveGroupRef;
1967
+ static ɵfac: i0.ɵɵFactoryDeclaration<TableRulesEditorComponent, [null, null, null, null, { optional: true; }]>;
1968
+ static ɵcmp: i0.ɵɵComponentDeclaration<TableRulesEditorComponent, "table-rules-editor", never, { "config": { "alias": "config"; "required": false; }; "resourcePath": { "alias": "resourcePath"; "required": false; }; "fields": { "alias": "fields"; "required": false; }; "i18nRules": { "alias": "i18nRules"; "required": false; }; "debugLogs": { "alias": "debugLogs"; "required": false; }; "debugLevel": { "alias": "debugLevel"; "required": false; }; }, { "configChange": "configChange"; }, never, never, true, never>;
1658
1969
  }
1659
1970
 
1660
- interface ConditionalStyleRule {
1661
- condition: string;
1662
- cssClass?: string;
1663
- style?: {
1664
- [key: string]: string;
1665
- };
1666
- description?: string;
1667
- }
1668
- declare function ruleBuilderStateToConditionalStyles(state: RuleBuilderState | null | undefined): ConditionalStyleRule[];
1669
- declare function conditionalStylesToBuilderState(styles: ConditionalStyleRule[] | null | undefined): RuleBuilderState;
1971
+ /**
1972
+ * Lightweight JSON path evaluator for simple cases used in conditional styling.
1973
+ * Supported syntax (subset):
1974
+ * - $.a.b.c
1975
+ * - a.b[0].c
1976
+ * - a["key"] / a['key']
1977
+ * - a[0]
1978
+ */
1979
+ declare function jsonPathGet(root: any, rawPath: string): any;
1980
+ declare function hasJsonKey(root: any, keyOrPath: string): boolean;
1981
+ declare function jsonPathMatches(root: any, path: string, pattern: string): boolean;
1982
+ /**
1983
+ * Registers JSON helpers in a DslParser instance, if it supports custom functions.
1984
+ * This is optional — call it in your app host bootstrap.
1985
+ */
1986
+ declare function registerJsonDslFunctions(parser: DslParser | any): void;
1987
+
1988
+ /**
1989
+ * Registers simple date/time helpers in a DslParser instance.
1990
+ * - today(): returns 'YYYY-MM-DD' (UTC)
1991
+ * - now(): returns Date ISO string (toISOString)
1992
+ * - dateAdd(date, amount, unit): adds amount (days|weeks|months) and returns 'YYYY-MM-DD'
1993
+ * - dateFormat(date, token): supports token 'E' (ISO weekday 1..7)
1994
+ */
1995
+ declare function registerDateDslFunctions(parser: DslParser | any): void;
1670
1996
 
1671
1997
  declare class FormulaGeneratorService {
1672
1998
  /**
@@ -1771,5 +2097,5 @@ declare const PRAXIS_TABLE_COMPONENT_METADATA: ComponentDocMeta;
1771
2097
  */
1772
2098
  declare function providePraxisTableMetadata(): Provider;
1773
2099
 
1774
- export { BOOLEAN_PRESETS, BehaviorConfigEditorComponent, CURRENCY_PRESETS, ColumnsConfigEditorComponent, DATE_PRESETS, DataFormatterComponent, DataFormattingService, FILTER_DRAWER_ADAPTER, FORMULA_TEMPLATES, FilterConfigService, FilterSettingsComponent, FormulaGeneratorService, JsonConfigEditorComponent, MessagesLocalizationEditorComponent, NUMBER_PRESETS, PERCENTAGE_PRESETS, PRAXIS_TABLE_COMPONENT_METADATA, PraxisFilter, PraxisTable, PraxisTableConfigEditor, PraxisTableToolbar, STRING_PRESETS, TableDefaultsProvider, TableVisualRulesEditorComponent, ToolbarActionsEditorComponent, ValueMappingEditorComponent, VisualFormulaBuilderComponent, conditionalStylesToBuilderState, getActionId, providePraxisTableMetadata, ruleBuilderStateToConditionalStyles };
1775
- export type { ActionLike, ArithmeticParams, BehaviorConfigChange, BooleanFormatterOptions, BulkAction, ColumnChange, ColumnDataType, ConcatenationParams, ConditionalMappingParams, ConditionalStyleRule, CurrencyFormatterOptions, DateFormatterOptions, DefaultValueParams, FieldSchema, FilterConfig, FilterDrawerAdapter, FilterDrawerOpenConfig, FilterTag, FormatPreset, FormatterConfig, FormulaDefinition, FormulaParameterSchema, FormulaParams, FormulaTemplate, FormulaType, I18n, JsonEditorEvent, JsonValidationResult, MessagesLocalizationChange, NestedPropertyParams, NumberFormatterOptions, PercentageFormatterOptions, RowAction, RowActionConfig, RowActionsBehavior, StringFormatterOptions, ToolbarAction, ToolbarActionsChange, ValueMappingPair };
2100
+ export { BOOLEAN_PRESETS, BehaviorConfigEditorComponent, CURRENCY_PRESETS, ColumnsConfigEditorComponent, DATE_PRESETS, DataFormatterComponent, DataFormattingService, FILTER_DRAWER_ADAPTER, FORMULA_TEMPLATES, FilterConfigService, FilterSettingsComponent, FormulaGeneratorService, JsonConfigEditorComponent, MessagesLocalizationEditorComponent, NUMBER_PRESETS, PERCENTAGE_PRESETS, PRAXIS_TABLE_COMPONENT_METADATA, PraxisFilter, PraxisTable, PraxisTableConfigEditor, PraxisTableToolbar, STRING_PRESETS, TableDefaultsProvider, TableRulesEditorComponent, ToolbarActionsEditorComponent, ValueMappingEditorComponent, VisualFormulaBuilderComponent, getActionId, hasJsonKey, jsonPathGet, jsonPathMatches, providePraxisTableMetadata, registerDateDslFunctions, registerJsonDslFunctions };
2101
+ export type { ActionLike, ArithmeticParams, BehaviorConfigChange, BooleanFormatterOptions, BulkAction, ColumnChange, ColumnDataType$1 as ColumnDataType, ConcatenationParams, ConditionalMappingParams, CurrencyFormatterOptions, DateFormatterOptions, DefaultValueParams, FieldSchema, FilterConfig, FilterDrawerAdapter, FilterDrawerOpenConfig, FilterTag, FormatPreset, FormatterConfig, FormulaDefinition, FormulaParameterSchema, FormulaParams, FormulaTemplate, FormulaType, I18n, JsonEditorEvent, JsonValidationResult, MessagesLocalizationChange, NestedPropertyParams, NumberFormatterOptions, PercentageFormatterOptions, RowAction, RowActionConfig, RowActionsBehavior, StringFormatterOptions, ToolbarAction, ToolbarActionsChange, ValueMappingPair };