@praxisui/table 0.0.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;
@@ -1274,7 +1414,9 @@ declare class PraxisTableConfigEditor implements OnInit, OnDestroy, SettingsValu
1274
1414
  private panelData;
1275
1415
  private panelRef?;
1276
1416
  behaviorEditor?: BehaviorConfigEditorComponent;
1277
- crudEditor?: any;
1417
+ set crudEditorSetter(ref: any);
1418
+ private crudEditor?;
1419
+ private _crudSubscribed;
1278
1420
  sections: {
1279
1421
  id: string;
1280
1422
  label: string;
@@ -1287,6 +1429,8 @@ declare class PraxisTableConfigEditor implements OnInit, OnDestroy, SettingsValu
1287
1429
  private initialResourcePath;
1288
1430
  idField: string;
1289
1431
  private initialIdField;
1432
+ horizontalScroll: 'auto' | 'wrap' | 'none';
1433
+ private initialHorizontalScroll;
1290
1434
  crudContext?: {
1291
1435
  tableId: string;
1292
1436
  resourcePath?: string;
@@ -1319,6 +1463,7 @@ declare class PraxisTableConfigEditor implements OnInit, OnDestroy, SettingsValu
1319
1463
  isValid$: BehaviorSubject<boolean>;
1320
1464
  isBusy$: BehaviorSubject<boolean>;
1321
1465
  columnMetas: FieldMetadata[];
1466
+ private hasCrudOverridesDirty;
1322
1467
  constructor(cdr: ChangeDetectorRef, configService: TableConfigService, panelData: any, panelRef?: SettingsPanelRef | undefined);
1323
1468
  ngOnInit(): void;
1324
1469
  onJsonConfigChange(newConfig: TableConfig): void;
@@ -1327,8 +1472,10 @@ declare class PraxisTableConfigEditor implements OnInit, OnDestroy, SettingsValu
1327
1472
  onColumnsConfigChange(newConfig: TableConfig): void;
1328
1473
  onColumnChange(change: ColumnChange): void;
1329
1474
  onFilterSettingsChange(cfg: FilterConfig): void;
1475
+ onRulesConfigChange(newCfg: TableConfig): void;
1330
1476
  private updateColumnMetas;
1331
1477
  private updateCanSaveState;
1478
+ private subscribeCrudEditorChanges;
1332
1479
  private showSuccess;
1333
1480
  private showError;
1334
1481
  private clearMessages;
@@ -1344,9 +1491,9 @@ declare class PraxisTableConfigEditor implements OnInit, OnDestroy, SettingsValu
1344
1491
  getSettingsValue(): TableConfig;
1345
1492
  onResourcePathChange(val: string): void;
1346
1493
  onIdFieldChange(val: string): void;
1494
+ onHorizontalScrollChange(val: 'auto' | 'wrap' | 'none'): void;
1347
1495
  onReconcileIdField(): void;
1348
1496
  onAcceptServerHash(): void;
1349
- onVisualRulesConfigChange(newConfig: TableConfig): void;
1350
1497
  reset(): void;
1351
1498
  onResetToDefaults(): void;
1352
1499
  /**
@@ -1409,7 +1556,7 @@ declare const FILTER_DRAWER_ADAPTER: InjectionToken<FilterDrawerAdapter>;
1409
1556
  declare class DataFormatterComponent implements OnInit, OnChanges {
1410
1557
  private cdr;
1411
1558
  private formattingService;
1412
- columnType: ColumnDataType;
1559
+ columnType: ColumnDataType$1;
1413
1560
  currentFormat: string;
1414
1561
  formatChange: EventEmitter<string>;
1415
1562
  datePresets: FormatPreset[];
@@ -1597,72 +1744,255 @@ declare class FilterSettingsComponent implements OnChanges {
1597
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>;
1598
1745
  }
1599
1746
 
1600
- 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?;
1601
1811
  config: TableConfig;
1812
+ resourcePath?: string;
1813
+ fields?: FieldDefinition[] | null;
1814
+ i18nRules?: Partial<Record<string, string>>;
1602
1815
  configChange: EventEmitter<_praxisui_core.TableConfigModern>;
1603
- columns: ColumnDefinition[];
1604
- selectedField?: string;
1605
- selectedColumn?: ColumnDefinition | null;
1606
- scope: 'column' | 'row';
1607
- builderConfig: RuleBuilderConfig | null;
1608
- currentRulesState?: RuleBuilderState;
1609
- compiledRules: Array<{
1610
- condition: string;
1611
- cssClass?: string;
1612
- style?: Record<string, string>;
1613
- _styleText?: string;
1614
- 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;
1615
1913
  }>;
1616
- private rulesUpdateTimer;
1617
- hasPending: boolean;
1618
- private effectsPaused;
1619
- private destroyed;
1620
- private suppressRulesUntil;
1621
- private lastCompiledJson;
1622
- private lastStateJson;
1623
- private lastColumnsSignature;
1624
- 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;
1625
1927
  label: string;
1626
- value: string;
1627
1928
  }[];
1628
- ngOnInit(): void;
1629
- ngOnChanges(): void;
1630
- ngOnDestroy(): void;
1631
- onScopeChange(scope: 'column' | 'row'): void;
1632
- onSelectColumn(field: string): void;
1633
- private resolveSelectedTarget;
1634
- onRulesChanged(state: RuleBuilderState): void;
1635
- private applyRulesState;
1636
- onEffectChanged(): void;
1637
- onStyleTextChanged(r: any): void;
1638
- private mergeEffects;
1639
- private materializeCompiledRules;
1640
- private stringifyStyle;
1641
- private parseStyleText;
1642
- onPresetSelected(r: any, value: string): void;
1643
- private mergePendingIntoCompiled;
1644
- private prettifyCondition;
1645
- private createBuilderConfig;
1646
- private mapType;
1647
- private maybeRebuildBuilderConfig;
1648
- applyEffects(): void;
1649
- discardEffects(): void;
1650
- pauseEffects(on: boolean): void;
1651
- trackRule(index: number, r: any): any;
1652
- static ɵfac: i0.ɵɵFactoryDeclaration<TableVisualRulesEditorComponent, never>;
1653
- 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>;
1654
1969
  }
1655
1970
 
1656
- interface ConditionalStyleRule {
1657
- condition: string;
1658
- cssClass?: string;
1659
- style?: {
1660
- [key: string]: string;
1661
- };
1662
- description?: string;
1663
- }
1664
- declare function ruleBuilderStateToConditionalStyles(state: RuleBuilderState | null | undefined): ConditionalStyleRule[];
1665
- 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;
1666
1996
 
1667
1997
  declare class FormulaGeneratorService {
1668
1998
  /**
@@ -1767,5 +2097,5 @@ declare const PRAXIS_TABLE_COMPONENT_METADATA: ComponentDocMeta;
1767
2097
  */
1768
2098
  declare function providePraxisTableMetadata(): Provider;
1769
2099
 
1770
- 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 };
1771
- 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 };