@praxisui/table 3.0.0-beta.7 → 3.0.0-beta.9
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/fesm2022/praxisui-table-filter-drawer-adapter.mjs +0 -1
- package/fesm2022/praxisui-table-filter-form-dialog-host.component-EHoM1uuJ.mjs +0 -1
- package/fesm2022/praxisui-table-table-ai.adapter-C5rjLb8E.mjs +0 -1
- package/fesm2022/praxisui-table.mjs +3379 -1730
- package/index.d.ts +18 -9
- package/package.json +7 -7
- package/fesm2022/praxisui-table-filter-drawer-adapter.mjs.map +0 -1
- package/fesm2022/praxisui-table-filter-form-dialog-host.component-EHoM1uuJ.mjs.map +0 -1
- package/fesm2022/praxisui-table-table-ai.adapter-C5rjLb8E.mjs.map +0 -1
- package/fesm2022/praxisui-table.mjs.map +0 -1
package/index.d.ts
CHANGED
|
@@ -1753,9 +1753,11 @@ interface ExtendedColumnDefinition extends ColumnDefinition {
|
|
|
1753
1753
|
}
|
|
1754
1754
|
declare class ColumnsConfigEditorComponent implements OnInit, OnDestroy {
|
|
1755
1755
|
private cdr;
|
|
1756
|
-
readonly
|
|
1757
|
-
|
|
1758
|
-
readonly
|
|
1756
|
+
private readonly i18n;
|
|
1757
|
+
tx(key: string, fallback: string): string;
|
|
1758
|
+
readonly ratingAriaLabelPlaceholder: string;
|
|
1759
|
+
readonly ratingRendererHint: string;
|
|
1760
|
+
readonly composeRatingRendererHint: string;
|
|
1759
1761
|
config: TableConfig;
|
|
1760
1762
|
configChange: EventEmitter<_praxisui_core.TableConfigModern>;
|
|
1761
1763
|
columnChange: EventEmitter<ColumnChange>;
|
|
@@ -2025,11 +2027,13 @@ interface BehaviorConfigChange {
|
|
|
2025
2027
|
}
|
|
2026
2028
|
declare class BehaviorConfigEditorComponent implements OnInit, OnDestroy, OnChanges {
|
|
2027
2029
|
private fb;
|
|
2030
|
+
private readonly i18n;
|
|
2031
|
+
tx(key: string, fallback: string): string;
|
|
2028
2032
|
readonly schemaOnlyLimitationsDocPath = "praxis-table.json-api.md#known-limitations-and-mismatches";
|
|
2029
|
-
readonly multiSortSchemaOnlyTooltip
|
|
2030
|
-
readonly columnFiltersSchemaOnlyTooltip
|
|
2031
|
-
readonly draggingRowsSchemaOnlyTooltip
|
|
2032
|
-
readonly expansionSchemaOnlyTooltip
|
|
2033
|
+
readonly multiSortSchemaOnlyTooltip: string;
|
|
2034
|
+
readonly columnFiltersSchemaOnlyTooltip: string;
|
|
2035
|
+
readonly draggingRowsSchemaOnlyTooltip: string;
|
|
2036
|
+
readonly expansionSchemaOnlyTooltip: string;
|
|
2033
2037
|
config: TableConfig;
|
|
2034
2038
|
resourcePath?: string;
|
|
2035
2039
|
forceClientStrategies: boolean;
|
|
@@ -2152,7 +2156,7 @@ declare class ToolbarActionsEditorComponent implements OnInit, OnDestroy, OnChan
|
|
|
2152
2156
|
editingRowActionIndex: number | null;
|
|
2153
2157
|
editingBulkActionIndex: number | null;
|
|
2154
2158
|
readonly globalActionCatalog: GlobalActionSpec[];
|
|
2155
|
-
|
|
2159
|
+
get internalActionCatalog(): InternalActionSpec[];
|
|
2156
2160
|
readonly customActionValue = "__custom__";
|
|
2157
2161
|
readonly validShortcutScopes: ToolbarShortcutScope[];
|
|
2158
2162
|
private readonly actionFieldDrafts;
|
|
@@ -2161,6 +2165,7 @@ declare class ToolbarActionsEditorComponent implements OnInit, OnDestroy, OnChan
|
|
|
2161
2165
|
private readonly i18n;
|
|
2162
2166
|
private destroy$;
|
|
2163
2167
|
constructor(fb: FormBuilder, iconPicker: IconPickerService);
|
|
2168
|
+
tx(key: string, fallback: string): string;
|
|
2164
2169
|
getGlobalActionSpecLabel(spec: {
|
|
2165
2170
|
id?: string;
|
|
2166
2171
|
label?: string;
|
|
@@ -2285,10 +2290,12 @@ declare class MessagesLocalizationEditorComponent implements OnInit, OnDestroy {
|
|
|
2285
2290
|
config: TableConfig;
|
|
2286
2291
|
configChange: EventEmitter<_praxisui_core.TableConfigModern>;
|
|
2287
2292
|
messagesLocalizationChange: EventEmitter<MessagesLocalizationChange>;
|
|
2293
|
+
private readonly i18n;
|
|
2288
2294
|
messagesForm: FormGroup;
|
|
2289
2295
|
isV2: boolean;
|
|
2290
2296
|
private destroy$;
|
|
2291
2297
|
constructor(fb: FormBuilder);
|
|
2298
|
+
tx(key: string, fallback: string): string;
|
|
2292
2299
|
ngOnInit(): void;
|
|
2293
2300
|
ngOnDestroy(): void;
|
|
2294
2301
|
private initializeForm;
|
|
@@ -2602,7 +2609,9 @@ declare class PraxisTableConfigEditor implements OnInit, OnDestroy, SettingsValu
|
|
|
2602
2609
|
private readonly panelData;
|
|
2603
2610
|
private readonly crudService;
|
|
2604
2611
|
private readonly panelRef;
|
|
2612
|
+
private readonly i18n;
|
|
2605
2613
|
constructor(cdr: ChangeDetectorRef, configService: TableConfigService);
|
|
2614
|
+
tx(key: string, fallback: string): string;
|
|
2606
2615
|
private isDebugLoggingEnabled;
|
|
2607
2616
|
private debugLog;
|
|
2608
2617
|
ngOnInit(): void;
|
|
@@ -2889,6 +2898,7 @@ declare class TableRulesEditorComponent implements OnChanges, OnInit, OnDestroy
|
|
|
2889
2898
|
private dynamicForm;
|
|
2890
2899
|
private crud?;
|
|
2891
2900
|
private static runtimeRegistryInstanceCounter;
|
|
2901
|
+
private readonly i18n;
|
|
2892
2902
|
config: TableConfig;
|
|
2893
2903
|
resourcePath?: string;
|
|
2894
2904
|
fields?: FieldDefinition[] | null;
|
|
@@ -2940,7 +2950,6 @@ declare class TableRulesEditorComponent implements OnChanges, OnInit, OnDestroy
|
|
|
2940
2950
|
/** Log a focused view for a single field */
|
|
2941
2951
|
private logSingleFieldMeta;
|
|
2942
2952
|
private logFieldChoices;
|
|
2943
|
-
i18nDefault: Record<string, string>;
|
|
2944
2953
|
t(key: string): string;
|
|
2945
2954
|
constructor(cdr: ChangeDetectorRef, registry: OperatorsRegistryService, compiler: RuleCompilerService, dynamicForm: DynamicFormService, crud?: GenericCrudService<any> | undefined);
|
|
2946
2955
|
private configureDslRuntime;
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praxisui/table",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.9",
|
|
4
4
|
"description": "Advanced data table for Angular (Praxis UI) with editing, filtering, sorting, virtualization, and settings panel integration.",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/common": "^20.0.0",
|
|
7
7
|
"@angular/core": "^20.0.0",
|
|
8
|
-
"@praxisui/core": "^3.0.0-beta.
|
|
9
|
-
"@praxisui/dynamic-fields": "^3.0.0-beta.
|
|
10
|
-
"@praxisui/dynamic-form": "^3.0.0-beta.
|
|
11
|
-
"@praxisui/metadata-editor": "^3.0.0-beta.
|
|
12
|
-
"@praxisui/settings-panel": "^3.0.0-beta.
|
|
13
|
-
"@praxisui/table-rule-builder": "^3.0.0-beta.
|
|
8
|
+
"@praxisui/core": "^3.0.0-beta.9",
|
|
9
|
+
"@praxisui/dynamic-fields": "^3.0.0-beta.9",
|
|
10
|
+
"@praxisui/dynamic-form": "^3.0.0-beta.9",
|
|
11
|
+
"@praxisui/metadata-editor": "^3.0.0-beta.9",
|
|
12
|
+
"@praxisui/settings-panel": "^3.0.0-beta.9",
|
|
13
|
+
"@praxisui/table-rule-builder": "^3.0.0-beta.9"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
16
|
"tslib": "^2.3.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"praxisui-table-filter-drawer-adapter.mjs","sources":["../../../projects/praxis-table/filter-drawer-adapter/src/filter-drawer-adapter.ts","../../../projects/praxis-table/filter-drawer-adapter/praxisui-table-filter-drawer-adapter.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport type { FormConfig } from '@praxisui/core';\n\n/**\n * Configuração de abertura do Advanced Filter em gaveta pelo host.\n *\n * Notas para hosts que exibem botão \"Salvar como atalho\":\n * - Exiba a ação apenas quando `allowSaveTags === true`.\n * - Para habilitar o botão, verifique se há ao menos um filtro efetivo no DTO (campos não vazios).\n * - Monte o DTO para salvar mesclando `initialDto` e o valor atual do formulário (`lastValue`),\n * e limpe chaves com valores vazios ('' | null | undefined) antes de chamar `onSaveShortcut(dto)`.\n */\nexport interface FilterDrawerOpenConfig {\n resourcePath: string;\n formId: string;\n config: FormConfig;\n initialDto?: Record<string, any>;\n title?: string;\n onSubmit(dto: Record<string, any>): void;\n onClose?(): void;\n /** Permite que a UI do host exiba ação de salvar atalho (opcional, retrocompatível) */\n allowSaveTags?: boolean;\n /** Rótulo i18n para o botão de salvar atalho (opcional) */\n i18nSaveAsShortcut?: string;\n /** Callback disparado pelo host com o DTO atual quando o usuário optar por salvar um atalho */\n onSaveShortcut?: (dto: Record<string, any>) => void;\n}\n\nexport interface FilterDrawerAdapter {\n open(config: FilterDrawerOpenConfig): Promise<void> | void;\n}\n\nfunction getFilterDrawerAdapterToken(): InjectionToken<FilterDrawerAdapter> {\n const registryKey = '__PAX_FILTER_DRAWER_ADAPTER_TOKEN__';\n const globalRegistry = globalThis as typeof globalThis & {\n [registryKey]?: InjectionToken<FilterDrawerAdapter>;\n };\n if (!globalRegistry[registryKey]) {\n globalRegistry[registryKey] = new InjectionToken<FilterDrawerAdapter>('FILTER_DRAWER_ADAPTER');\n }\n return globalRegistry[registryKey];\n}\n\nexport const FILTER_DRAWER_ADAPTER = getFilterDrawerAdapterToken();\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;AAgCA,SAAS,2BAA2B,GAAA;IAClC,MAAM,WAAW,GAAG,qCAAqC;IACzD,MAAM,cAAc,GAAG,UAEtB;AACD,IAAA,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE;QAChC,cAAc,CAAC,WAAW,CAAC,GAAG,IAAI,cAAc,CAAsB,uBAAuB,CAAC;IAChG;AACA,IAAA,OAAO,cAAc,CAAC,WAAW,CAAC;AACpC;AAEO,MAAM,qBAAqB,GAAG,2BAA2B;;AC3ChE;;AAEG;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"praxisui-table-filter-form-dialog-host.component-EHoM1uuJ.mjs","sources":["../../../projects/praxis-table/src/lib/components/praxis-filter/filter-form-dialog-host.component.ts"],"sourcesContent":["import { Component, Inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatIconModule } from '@angular/material/icon';\nimport { FormGroup } from '@angular/forms';\nimport { PraxisFilterForm } from '@praxisui/dynamic-form';\n\n@Component({\n selector: 'praxis-filter-form-dialog-host',\n standalone: true,\n imports: [CommonModule, MatDialogModule, MatButtonModule, MatProgressBarModule, MatIconModule, PraxisFilterForm],\n template: `\n <div mat-dialog-title class=\"pfx-dialog-title\" id=\"filterDialogTitle\">\n <div class=\"pfx-dialog-title-text\">\n <mat-icon>tune</mat-icon>\n <span>{{ data.title || 'Filtro avançado' }}</span>\n </div>\n <button mat-icon-button type=\"button\" class=\"pfx-dialog-close\" (click)=\"close()\"\n [attr.aria-label]=\"data.i18n?.cancel || 'Fechar'\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n <mat-dialog-content class=\"pfx-filter-dialog-content\" aria-labelledby=\"filterDialogTitle\">\n <mat-progress-bar *ngIf=\"data?.schemaLoading\" mode=\"indeterminate\"></mat-progress-bar>\n <praxis-filter-form\n *ngIf=\"data?.config\"\n [formId]=\"data.formId\"\n [resourcePath]=\"data.resourcePath\"\n [mode]=\"'edit'\"\n [config]=\"data.config\"\n (formReady)=\"onReady($event)\"\n (valueChange)=\"onChange($event)\"\n (validityChange)=\"onValidity($event)\"\n ></praxis-filter-form>\n <p *ngIf=\"!data?.config && !data?.schemaLoading\" class=\"pfx-empty-state\">{{ data.i18n?.noData || 'Nenhum dado' }}</p>\n </mat-dialog-content>\n <mat-dialog-actions align=\"end\" class=\"pfx-dialog-actions\">\n <button mat-button type=\"button\"\n *ngIf=\"data?.allowSaveTags\"\n [disabled]=\"!canSave\"\n (click)=\"saveShortcut()\">\n {{ data.i18n?.saveAsShortcut || 'Salvar como atalho' }}\n </button>\n <button mat-stroked-button type=\"button\" (click)=\"close()\">{{ data.i18n?.cancel || 'Cancelar' }}</button>\n <button mat-flat-button color=\"primary\" (click)=\"apply()\" [disabled]=\"!valid\">\n {{ data.i18n?.apply || 'Aplicar' }}\n </button>\n </mat-dialog-actions>\n `,\n styles: [`\n .pfx-dialog-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding-right: 8px;\n }\n .pfx-dialog-title-text {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: var(--md-sys-color-on-surface);\n }\n .pfx-dialog-close {\n margin-left: auto;\n }\n .pfx-filter-dialog-content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding-top: 8px;\n }\n .pfx-empty-state {\n margin: 8px 0 0;\n color: var(--md-sys-color-on-surface-variant);\n }\n .pfx-dialog-actions {\n padding: var(--pdx-dialog-actions-padding, 12px 24px 16px);\n border-top: 1px solid var(--md-sys-color-outline-variant);\n background: transparent;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n `],\n})\nexport class FilterFormDialogHostComponent {\n valid = true;\n private lastValue: any = {};\n private formGroup: FormGroup<Record<string, any>> | null = null;\n canSave = false;\n constructor(\n @Inject(MAT_DIALOG_DATA)\n public data: {\n formId: string;\n resourcePath: string;\n config: any;\n title?: string;\n schemaLoading?: boolean;\n initialDto?: Record<string, any>;\n allowSaveTags?: boolean;\n i18n?: { saveAsShortcut?: string; cancel?: string; apply?: string; noData?: string };\n onSaveShortcut?: (dto: Record<string, any>) => void;\n },\n private ref: MatDialogRef<FilterFormDialogHostComponent>,\n ) {}\n\n onReady(ev: { formGroup: any }): void {\n try {\n this.formGroup = (ev?.formGroup as FormGroup<Record<string, any>>) || null;\n const dto = this.data?.initialDto || {};\n if (ev?.formGroup && dto && Object.keys(dto).length) {\n ev.formGroup.patchValue(dto, { emitEvent: false });\n }\n this.lastValue = this.formGroup?.getRawValue?.() ?? this.lastValue;\n this.updateCanSave();\n } catch {}\n }\n onChange(ev: { formData: Record<string, any> }): void {\n this.lastValue = ev?.formData ?? {};\n this.updateCanSave();\n }\n onValidity(v: boolean): void {\n this.valid = v;\n this.updateCanSave();\n }\n apply(): void {\n const formData =\n this.formGroup?.getRawValue?.() ??\n this.lastValue ??\n this.data?.initialDto ??\n {};\n this.ref.close({ formData });\n }\n close(): void { this.ref.close(); }\n\n private clean(obj: Record<string, any> | undefined | null): Record<string, any> {\n const out: Record<string, any> = {};\n Object.keys(obj || {}).forEach((k) => {\n const v = (obj as any)[k];\n if (v !== '' && v !== null && v !== undefined) out[k] = v;\n });\n return out;\n }\n private buildDtoForSave(): Record<string, any> {\n const base = this.data?.initialDto || {};\n const merged = { ...base, ...(this.lastValue || {}) };\n return this.clean(merged);\n }\n private updateCanSave(): void {\n this.canSave = Object.keys(this.buildDtoForSave() || {}).length > 0;\n }\n saveShortcut(): void {\n try {\n const dto = this.buildDtoForSave();\n if (!Object.keys(dto).length) return;\n this.data?.onSaveShortcut?.(dto);\n } catch {}\n }\n}\n"],"names":["i4"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"praxisui-table-table-ai.adapter-C5rjLb8E.mjs","sources":["../../../projects/praxis-table/src/lib/ai/table-data-profiler.ts","../../../projects/praxis-table/src/lib/ai/table-ai.adapter.ts"],"sourcesContent":["import { TableConfig } from '@praxisui/core';\n\nexport interface ColumnStats {\n field: string;\n header?: string;\n inferredType: 'string' | 'number' | 'boolean' | 'date' | 'mixed' | 'empty';\n cardinality: number; // Quantidade de valores únicos\n hasNulls: boolean;\n // Amostra de valores frequentes para contexto (limitado a 5)\n topValues: any[];\n // Para numbers\n min?: number;\n max?: number;\n // Para dates\n dateRange?: { start: string; end: string };\n // Flags úteis para sugestão\n isUrl?: boolean;\n isEmail?: boolean;\n isLongText?: boolean; // > 50 chars\n}\n\nexport interface DataProfile {\n rowCount: number;\n columns: Record<string, ColumnStats>;\n generatedAt: number;\n}\n\n/**\n * Analisa uma amostra de dados da tabela para gerar estatísticas\n * que ajudem a IA a sugerir renderers e formatos adequados.\n */\nexport class TableDataProfiler {\n private static SAMPLE_LIMIT = 3; // Analisa no máximo 3 linhas para performance\n private static VALUE_TRUNCATE = 50; // Trunca strings longas no contexto\n\n static profile(\n data: any[],\n config: TableConfig,\n options?: { sampleLimit?: number; rowCountOverride?: number }\n ): DataProfile {\n const sampleLimit = options?.sampleLimit ?? this.SAMPLE_LIMIT;\n const rowCount = options?.rowCountOverride ?? data.length;\n const profile: DataProfile = {\n rowCount,\n columns: {},\n generatedAt: Date.now()\n };\n\n if (!data || data.length === 0 || !config.columns) {\n return profile;\n }\n\n // 1. Selecionar amostra (início, meio e fim se possível, ou apenas slice)\n // Para simplicidade e estabilidade, pegamos os primeiros N itens.\n const sample = data.slice(0, sampleLimit);\n\n // 2. Iterar colunas configuradas\n for (const col of config.columns) {\n if (!col || !col.field) continue;\n const values = sample.map(row => this.getValue(row, col.field)).filter(v => v !== null && v !== undefined && v !== '');\n \n const stats: ColumnStats = {\n field: col.field,\n header: col.header,\n inferredType: 'empty',\n cardinality: 0,\n hasNulls: values.length < sample.length,\n topValues: []\n };\n\n if (values.length > 0) {\n stats.inferredType = this.inferType(values);\n stats.cardinality = new Set(values.map(v => String(v))).size;\n \n // Coletar Top Values (frequência)\n const freqMap = new Map<string, number>();\n values.forEach(v => {\n const k = String(v);\n freqMap.set(k, (freqMap.get(k) || 0) + 1);\n });\n \n stats.topValues = Array.from(freqMap.entries())\n .sort((a, b) => b[1] - a[1]) // Sort by count desc\n .slice(0, 5)\n .map(([val]) => this.sanitizeValue(val, stats.inferredType));\n\n // Stats específicas por tipo\n if (stats.inferredType === 'number') {\n const nums = values.map(v => Number(v)).filter(n => !isNaN(n));\n if (nums.length) {\n stats.min = Math.min(...nums);\n stats.max = Math.max(...nums);\n }\n } else if (stats.inferredType === 'date') {\n const dates = values.map(v => new Date(v).getTime()).filter(t => !isNaN(t));\n if (dates.length) {\n stats.dateRange = {\n start: new Date(Math.min(...dates)).toISOString(),\n end: new Date(Math.max(...dates)).toISOString()\n };\n }\n } else if (stats.inferredType === 'string') {\n const strVal = String(values[0]);\n stats.isUrl = strVal.startsWith('http');\n stats.isEmail = strVal.includes('@') && strVal.includes('.');\n stats.isLongText = values.some(v => String(v).length > 50);\n }\n }\n\n profile.columns[col.field] = stats;\n }\n\n return profile;\n }\n\n private static getValue(row: any, path: string): any {\n if (!path || typeof path !== 'string') return undefined;\n return path.split('.').reduce((obj, key) => obj?.[key], row);\n }\n\n private static inferType(values: any[]): ColumnStats['inferredType'] {\n const first = values[0];\n if (typeof first === 'number') return 'number';\n if (typeof first === 'boolean') return 'boolean';\n if (first instanceof Date) return 'date';\n \n // Check string formats\n const str = String(first);\n if (!isNaN(Number(str)) && str.trim() !== '') return 'number';\n if (!isNaN(Date.parse(str)) && str.length > 5) return 'date'; // length check avoids short strings being parsed as dates\n \n return 'string';\n }\n\n private static sanitizeValue(val: string, type: string): any {\n if (type === 'string' && val.length > this.VALUE_TRUNCATE) {\n return val.substring(0, this.VALUE_TRUNCATE) + '...';\n }\n return val;\n }\n}\n","import { firstValueFrom, Observable } from 'rxjs';\nimport { BaseAiAdapter, PatchResult, AiSuggestion, Capability } from '@praxisui/ai';\nimport { TableConfig, deepMerge, type AsyncConfigStorage } from '@praxisui/core';\nimport { PraxisTable } from '../praxis-table';\nimport { TABLE_AI_CAPABILITIES, TASK_PRESETS } from './table-ai-capabilities';\nimport { TableDataProfiler } from './table-data-profiler';\n\nexport interface AiServiceLike {\n classifyIntent: (input: string, columns: string[]) => any;\n executeEnrichedPrompt: (input: string, contextDesc: string, contextConfig: any, caps: Capability[]) => any;\n answerQuestion: (input: string, config: any) => Observable<string>;\n generateJson: <T>(prompt: string, modelName?: string, schema?: any) => Observable<T | null>;\n}\n\n/**\n * Adapter that connects the AI Engine to a specific PraxisTable instance.\n * Implements two-step intent flow + heuristics for contextual suggestions.\n */\nexport class TableAiAdapter extends BaseAiAdapter<TableConfig> {\n componentName = 'Data Table';\n componentId = 'praxis-table';\n componentType = 'table';\n\n constructor(private table: PraxisTable, private aiService?: AiServiceLike) {\n super();\n }\n\n // -------- Core contract --------\n\n getCurrentConfig(): TableConfig {\n try {\n return structuredClone(this.table.config);\n } catch {\n return JSON.parse(JSON.stringify(this.table.config));\n }\n }\n\n getCapabilities(): Capability[] {\n return TABLE_AI_CAPABILITIES.capabilities as unknown as Capability[];\n }\n\n override getTaskPresets(): Record<string, string[]> {\n return TASK_PRESETS;\n }\n\n override getRuntimeState(): Record<string, any> {\n return {\n rowsTotal: this.table.dataSource.data.length,\n rowsVisible: this.table.paginator ? this.table.paginator.pageSize : this.table.dataSource.data.length,\n pageIndex: this.table.paginator ? this.table.paginator.pageIndex : 0,\n sort: this.table.sort ? { active: this.table.sort.active, direction: this.table.sort.direction } : null,\n filters: this.table.filterCriteria,\n selectionCount: this.table.selection.selected.length,\n isLoading: false // TODO: expose real loading flag\n };\n }\n\n override getSuggestionContext(): Record<string, any> {\n const config = this.getCurrentConfig();\n const behavior = config.behavior || {};\n const actions = config.actions || {};\n const availableFeatures: string[] = [];\n const missingCapabilities: string[] = [];\n\n if (!this.table.resourcePath) {\n availableFeatures.push('data-connection');\n }\n if (!this.table.idField) {\n availableFeatures.push('bindings.idField');\n }\n if (!behavior.filtering?.enabled) {\n availableFeatures.push('behavior.filtering');\n missingCapabilities.push('filtering');\n }\n if (!behavior.sorting?.enabled) {\n availableFeatures.push('behavior.sorting');\n missingCapabilities.push('sorting');\n }\n if (!behavior.pagination?.enabled) {\n availableFeatures.push('behavior.pagination');\n missingCapabilities.push('pagination');\n }\n if (!behavior.selection?.enabled) {\n availableFeatures.push('behavior.selection');\n missingCapabilities.push('selection');\n }\n if (!config.toolbar?.visible) {\n availableFeatures.push('toolbar');\n missingCapabilities.push('toolbar');\n }\n if (!actions.row?.enabled) {\n availableFeatures.push('actions.row');\n missingCapabilities.push('actions');\n }\n if (!actions.bulk?.enabled) {\n availableFeatures.push('actions.bulk');\n missingCapabilities.push('actions');\n }\n if (!actions.context?.enabled) {\n availableFeatures.push('actions.context');\n missingCapabilities.push('actions');\n }\n if (!config.export?.enabled) {\n availableFeatures.push('export');\n missingCapabilities.push('export');\n }\n if (!config.localization) {\n availableFeatures.push('localization');\n missingCapabilities.push('localization');\n }\n if (!config.messages) {\n availableFeatures.push('messages');\n missingCapabilities.push('messages');\n }\n if (!config.performance) {\n availableFeatures.push('performance');\n missingCapabilities.push('performance');\n }\n if (!config.accessibility) {\n availableFeatures.push('accessibility');\n missingCapabilities.push('accessibility');\n }\n if (!config.rowConditionalStyles || config.rowConditionalStyles.length === 0) {\n availableFeatures.push('row-conditional-styles');\n missingCapabilities.push('conditional');\n }\n\n return {\n authoringContract: {\n kind: 'praxis.table.editor',\n usesBindings: true,\n bindingsPaths: ['bindings.resourcePath', 'bindings.idField', 'bindings.horizontalScroll'],\n runtimeConfigProjection: 'TableConfig',\n },\n availableFeatures,\n missingCapabilities: Array.from(new Set(missingCapabilities)),\n inputs: {\n resourcePath: this.table.resourcePath || null,\n idField: this.table.getIdField?.() || null,\n horizontalScroll: (this.table as any).horizontalScroll || null,\n },\n };\n }\n\n getDataProfile(): Record<string, any> {\n const data = this.table.dataSource.data || [];\n return TableDataProfiler.profile(data, this.table.config);\n }\n\n getSchemaFields(): Record<string, any>[] {\n try {\n return this.table.getSchemaFieldsSnapshot();\n } catch {\n return [];\n }\n }\n\n createSnapshot(): any {\n return this.getCurrentConfig();\n }\n\n async restoreSnapshot(snapshot: any): Promise<void> {\n if (!snapshot) return;\n this.applyConfig(snapshot);\n }\n\n async applyPatch(patch: Partial<TableConfig>, intent?: string): Promise<PatchResult> {\n const current = this.getCurrentConfig();\n const normalizedPatch = this.normalizePatch(patch);\n const nextConfig = this.smartMergeTableConfig(current, normalizedPatch);\n this.applyConfig(nextConfig);\n return { success: true };\n }\n\n // -------- Context & suggestions --------\n\n /**\n * Human-friendly summary for prompt/context (columns + feature flags + data stats).\n */\n getContextDescription(contextOverride?: Partial<TableConfig>): string {\n // 1. Generate Data Profile\n const data = this.table.dataSource.data || [];\n const effectiveConfig = contextOverride ? deepMerge(this.table.config, contextOverride) : this.table.config;\n const profile = TableDataProfiler.profile(data, effectiveConfig);\n \n // 2. Format Column Stats\n const colDetails = Object.values(profile.columns).map(stats => {\n let desc = `${stats.field} (${stats.inferredType})`;\n if (stats.cardinality > 0 && stats.cardinality < 10) {\n desc += `, values=[${stats.topValues.join(', ')}]`;\n } else if (stats.inferredType === 'number' && stats.min !== undefined) {\n desc += `, range=[${stats.min}-${stats.max}]`;\n }\n \n // Check existing config to see if it has renderer/format\n const colCfg = effectiveConfig.columns?.find(c => c.field === stats.field);\n if (colCfg?.renderer) desc += ` [has-renderer: ${colCfg.renderer.type}]`;\n if (colCfg?.format) desc += ` [has-format]`;\n \n return desc;\n });\n\n // 3. Active Features\n const behaviorFlags: string[] = [];\n const b = this.table.config?.behavior;\n if (b?.filtering?.enabled) behaviorFlags.push('filtering');\n if (b?.sorting?.enabled) behaviorFlags.push('sorting');\n if (b?.pagination?.enabled) behaviorFlags.push('pagination');\n if (b?.selection?.enabled) behaviorFlags.push('selection');\n\n return `\nDataset: ${profile.rowCount} rows.\nActive Features: ${behaviorFlags.join(', ') || 'None'}.\nColumns Analysis:\n- ${colDetails.join('\\n- ')}\n `.trim();\n }\n\n /**\n * Dynamic suggestions based on current config/data.\n * Uses AI Service if available, otherwise falls back to heuristics.\n */\n override async getSuggestions(forceReload = false): Promise<AiSuggestion[]> {\n const storage = (this.table as any)?.asyncConfigStorage as AsyncConfigStorage | undefined;\n const key = this.suggestionsKey();\n \n // 1. Try cache\n if (storage && !forceReload) {\n try {\n const cached = await firstValueFrom(storage.loadConfig<AiSuggestion[]>(key));\n if (cached && Array.isArray(cached) && cached.length) {\n return cached;\n }\n } catch {}\n }\n\n let suggestions: AiSuggestion[] = [];\n\n // 2. Clear cache explicitly when forcing reload\n if (forceReload && storage && typeof storage.clearConfig === 'function') {\n try { await firstValueFrom(storage.clearConfig(key)); } catch {}\n }\n\n // 3. Try AI Generation (if service available)\n if (this.aiService) {\n try {\n const filtered = this.filterCompletedColumnsFromContext();\n suggestions = await this.generateAiSuggestions(filtered);\n } catch (err) {\n console.warn('[TableAiAdapter] AI suggestion failed, falling back to heuristics', err);\n }\n }\n\n // 4. Fallback to Heuristics if AI failed or not available\n if (!suggestions.length) {\n suggestions = this.getHeuristicSuggestions();\n }\n\n // 5. Save to cache\n const sorted = suggestions.sort((a, b) => (b.score || 0) - (a.score || 0));\n if (storage && sorted.length > 0) {\n try {\n await firstValueFrom(storage.saveConfig(key, sorted));\n } catch {}\n }\n return sorted;\n }\n\n private async generateAiSuggestions(contextOverride?: Partial<TableConfig>): Promise<AiSuggestion[]> {\n if (!this.aiService) return [];\n\n const prompt = `\n Analyze the following data table context and stats.\n Suggest 3 to 5 specific UX/UI improvements based on the data distribution and active features.\n \n Guidelines for Suggestions:\n - Focus on: Data formatting (dates/currency), Visual indicators (badges/icons for low-cardinality or mapped fields), Filter types, and missing critical features (pagination/export).\n - Prefer explicit metadata (column types, value mappings, data stats). Avoid guessing semantics from field names.\n - Intents MUST be actionable user commands, not just labels.\n \n Intent Examples:\n [GOOD]: \"Format column 'birthDate' as dd/MM/yyyy\", \"Use badges for column 'state' (3 distinct values)\", \"Enable pagination with 10 rows\".\n [BAD]: \"Improve formatting\", \"Add badges\", \"Pagination settings\".\n\n Context:\n ${this.getContextDescription(contextOverride)}\n \n Return a JSON array of suggestions with: id, label, description, icon, group, intent (the actionable command), and score (0-1).\n `;\n\n const result = await firstValueFrom(this.aiService.generateJson<{ suggestions: AiSuggestion[] } | null>(prompt, undefined, {\n type: 'OBJECT',\n properties: {\n suggestions: {\n type: 'ARRAY',\n items: {\n type: 'OBJECT',\n properties: {\n id: { type: 'STRING' },\n label: { type: 'STRING' },\n description: { type: 'STRING' },\n icon: { type: 'STRING' },\n group: { type: 'STRING' },\n intent: { type: 'STRING' },\n score: { type: 'NUMBER' }\n },\n required: ['id', 'label', 'intent']\n }\n }\n }\n }));\n\n return result?.suggestions || [];\n }\n\n private getHeuristicSuggestions(): AiSuggestion[] {\n const suggestions: AiSuggestion[] = [];\n const config = this.table.config;\n const data = this.table.dataSource.data || [];\n const columns = config.columns || [];\n const profile = TableDataProfiler.profile(data, config);\n const profileColumns = profile.columns || {};\n const capabilities = this.getCapabilities?.() || [];\n const categorySet = new Set(\n capabilities\n .map((cap) => String(cap?.category || '').toLowerCase())\n .filter((cat) => cat.length > 0),\n );\n const allowCategory = (categories: string[]): boolean => {\n if (!categorySet.size) return false;\n return categories.some((cat) => categorySet.has(cat));\n };\n\n // Pagination if many rows and disabled\n if (allowCategory(['pagination', 'behavior']) && !config.behavior?.pagination?.enabled && data.length > 20) {\n suggestions.push({\n id: 'enable-paging',\n label: 'Habilitar Paginação',\n description: `Tabela tem ${data.length} linhas. Paginação melhora a performance.`,\n icon: 'list_alt',\n group: 'Performance',\n intent: 'Habilitar paginação com 10 itens por página',\n score: 0.9\n });\n }\n\n // Modo compacto se muitas colunas visíveis\n const visibleCols = columns.filter((c) => c.visible !== false).length;\n if (allowCategory(['appearance']) && visibleCols > 8 && config.appearance?.density !== 'compact') {\n suggestions.push({\n id: 'compact-mode',\n label: 'Modo Compacto',\n description: 'Muitas colunas visíveis. Modo compacto exibe mais dados.',\n icon: 'compress',\n group: 'Visual',\n intent: 'Usar densidade compacta',\n score: 0.8\n });\n }\n\n // Badge/Icon para valores discretos\n const badgeCardinalityMax = 6;\n const badgeCol = columns.find((col) => {\n if (!col || col.renderer || !col.field) return false;\n const stats = profileColumns[col.field];\n const inferredType = stats?.inferredType;\n const cardinality = stats?.cardinality ?? -1;\n const isLongText = stats?.isLongText ?? false;\n const hasValueMapping = !!col.valueMapping && Object.keys(col.valueMapping).length > 0;\n const typeMatch = col.type === 'boolean'\n || col.type === 'string'\n || inferredType === 'boolean'\n || inferredType === 'string';\n const lowCardinality = cardinality > 0 && cardinality <= badgeCardinalityMax;\n return !isLongText && (hasValueMapping || (typeMatch && lowCardinality));\n });\n if (allowCategory(['renderer', 'columns']) && badgeCol) {\n suggestions.push({\n id: 'status-badge',\n label: `Badges para ${badgeCol.header || badgeCol.field}`,\n description: 'Destacar valores com badges ou ícones.',\n icon: 'verified',\n group: 'Visual',\n intent: `Usar renderer badge para a coluna ${badgeCol.field}`,\n score: 0.7\n });\n }\n\n // Datas sem format\n const dateCol = columns.find((c) => c.type === 'date' && !c.format);\n if (allowCategory(['format', 'columns']) && dateCol) {\n suggestions.push({\n id: 'date-format',\n label: `Formatar ${dateCol.header || dateCol.field}`,\n description: 'Padronizar exibição de data.',\n icon: 'calendar_today',\n group: 'Formatação',\n intent: `Formatar coluna ${dateCol.field} como dd/MM/yyyy`,\n score: 0.6\n });\n }\n \n return suggestions;\n }\n\n /**\n * Remove colunas já formatadas/tipadas para evitar sugestões redundantes (ex.: salário já em currency)\n */\n private filterCompletedColumnsFromContext(): Partial<TableConfig> {\n const cfg = this.getCurrentConfig();\n const filteredCols = (cfg.columns || []).filter((col) => {\n // Keep if missing type or format (needs suggestion)\n if (!col.type) return true;\n if (col.type === 'currency' && col.format) return false;\n if (col.type === 'date' && col.format) return false;\n return true;\n });\n return { ...cfg, columns: filteredCols };\n }\n\n // -------- Two-step flow helpers --------\n\n getFilteredCapabilities(category?: string): Capability[] {\n const all = TABLE_AI_CAPABILITIES.capabilities as unknown as Capability[];\n if (!category || category === 'unknown') return all;\n\n const categoryMap: Record<string, string[]> = {\n columns: ['columns', 'format', 'mapping', 'renderer', 'conditional'],\n appearance: ['appearance', 'conditional'],\n conditional: ['conditional', 'renderer', 'columns'], // Include 'columns' to allow field context\n behavior: ['behavior', 'pagination', 'sorting', 'filtering', 'selection', 'interaction'],\n actions: ['actions', 'toolbar', 'export']\n };\n\n const targets = categoryMap[category] || [category];\n return all.filter((c) => targets.includes(c.category as string));\n }\n\n private suggestionsKey(): string {\n const id = this.table.tableId || 'default';\n const rp = this.table.resourcePath || 'default';\n // bump version to invalidate old cached suggestions\n return `ai-suggestions:v3:${id}:${rp}`;\n }\n\n private getColumnNames(): string[] {\n return (this.table.config?.columns || [])\n .map((c) => c.field)\n .filter((f) => !!f);\n }\n\n private extractContextForIntent(intent: any): { desc: string; config: any } {\n const fullConfig = this.getCurrentConfig();\n\n if ((intent.category === 'columns' || intent.category === 'conditional') && intent.targetField) {\n const col = fullConfig.columns?.find((c) => c.field === intent.targetField);\n if (col) {\n return { desc: `Contexto focado na coluna '${intent.targetField}'.`, config: { columns: [col] } };\n }\n }\n\n if (intent.category === 'behavior' && fullConfig.behavior) {\n return { desc: 'Contexto focado em Comportamento (pagination/sorting/filtering/selection).', config: { behavior: fullConfig.behavior } };\n }\n\n if (intent.category === 'appearance' && fullConfig.appearance) {\n return { desc: 'Contexto focado em Aparência.', config: { appearance: fullConfig.appearance } };\n }\n\n if (intent.category === 'actions' && (fullConfig.actions || fullConfig.toolbar)) {\n return { desc: 'Contexto focado em Ações e Toolbar.', config: { actions: fullConfig.actions, toolbar: fullConfig.toolbar } };\n }\n\n return { desc: 'Contexto completo da tabela.', config: fullConfig };\n }\n\n /**\n * Two-step flow: classify intent, build focused context, call enriched prompt.\n * Returns the patch WITHOUT applying, so the UI can review.\n */\n async processUserIntent(\n userInput: string,\n aiService: AiServiceLike // Use interface type\n ): Promise<{ patch?: any; explanation?: string; type?: string; message?: string; options?: string[]; warnings?: string[] }> {\n const classification: any = await firstValueFrom(aiService.classifyIntent(userInput, this.getColumnNames()));\n\n if (classification?.needsClarification) {\n return {\n type: 'clarification',\n message: 'Preciso de mais detalhes para continuar.',\n options: classification.options || []\n };\n }\n\n // Handle QA intent\n if (classification?.intent === 'ask_about_config') {\n const answer = await firstValueFrom(aiService.answerQuestion(userInput, this.getCurrentConfig()));\n return {\n type: 'info',\n message: answer,\n explanation: answer // Map to explanation for UI compatibility if needed, or UI should handle 'info' type\n };\n }\n\n const context = this.extractContextForIntent(classification);\n const caps = this.getFilteredCapabilities((classification as any)?.category);\n\n const result: any = await firstValueFrom(\n aiService.executeEnrichedPrompt(userInput, context.desc, context.config, caps)\n );\n\n if (!result || !result.patch) {\n return { type: 'error', message: 'Nenhum patch gerado.' };\n }\n\n const { sanitized, warnings } = this.validateAndSanitizePatch(result.patch, caps);\n // Passar warnings para o retorno, para que o UI possa mostrá-los\n // Se o patch estiver vazio após sanitização, informar ao usuário\n\n // Se sobrou algo válido\n if (Object.keys(sanitized).length > 0) {\n const explanation = result.explanation + (warnings.length ? ` (Ajustado: ${warnings.length} itens inválidos removidos)` : '');\n return { patch: sanitized, explanation, warnings };\n } else {\n return { type: 'error', message: 'O patch gerado não continha configurações válidas permitidas.', warnings };\n }\n }\n\n private validateAndSanitizePatch(patch: any, allowedCaps: Capability[]): { sanitized: any; warnings: string[] } {\n const allowedPaths = new Set(allowedCaps.map(c => c.path));\n const warnings: string[] = [];\n // Some schema-driven nodes are intentionally open objects and must be preserved as-is.\n const passthroughObjectPaths = new Set<string>([\n 'behavior.expansion.detail.source.inlineSchema',\n 'behavior.expansion.detail.source.resourcePath.paramsMap',\n ]);\n\n const recurse = (obj: any, currentPath: string): any => {\n if (typeof obj !== 'object' || obj === null) return obj;\n\n if (Array.isArray(obj)) {\n // Se estamos em um array conhecido (ex: columns), o path vira columns[]\n // Se não, assume que é valor final (ex: options: [1,2])\n const isRootArray = currentPath && (allowedPaths.has(currentPath + '[]') || Array.from(allowedPaths).some(p => p.startsWith(currentPath + '[].')));\n \n if (!isRootArray) return obj; // É um valor array (ex: tags), retorna direto\n\n return obj.map(item => recurse(item, currentPath + '[]'));\n }\n\n const cleanObj: any = {};\n for (const key of Object.keys(obj)) {\n const newPath = currentPath ? `${currentPath}.${key}` : key;\n // Verifica se este path exato é permitido OU se é um prefixo de algo permitido\n // Ex: 'columns' é permitido se 'columns[].width' existe\n // Special case: 'columns[].field' is identity, always allow it if we are inside columns[]\n const isIdentityField = currentPath === 'columns[]' && key === 'field';\n const exactMatch = allowedPaths.has(newPath) || isIdentityField;\n const prefixMatch = Array.from(allowedPaths).some(p => p.startsWith(newPath + '.') || p.startsWith(newPath + '['));\n\n if (exactMatch || prefixMatch) {\n if (\n exactMatch\n && passthroughObjectPaths.has(newPath)\n && typeof obj[key] === 'object'\n && obj[key] !== null\n ) {\n cleanObj[key] = obj[key];\n continue;\n }\n const val = recurse(obj[key], newPath);\n if (newPath === 'columns[].computed.expression') {\n if (typeof val !== 'string') {\n warnings.push(`Computed expression inválida: ${newPath} (não é string)`);\n continue;\n }\n const trimmed = val.trim();\n if (!trimmed) {\n warnings.push(`Computed expression vazia: ${newPath}`);\n continue;\n }\n if (trimmed.length > 200) {\n warnings.push(`Computed expression muito longa: ${newPath}`);\n continue;\n }\n cleanObj[key] = trimmed;\n continue;\n }\n // Se for objeto vazio após limpeza, não inclui (salvo se for intenção explicita de limpar config, mas patch geralmente é aditivo)\n if (typeof val === 'object' && val !== null && !Array.isArray(val) && Object.keys(val).length === 0) {\n // ignora\n } else {\n cleanObj[key] = val;\n }\n } else {\n warnings.push(`Campo ignorado: ${newPath}`);\n }\n }\n return cleanObj;\n };\n\n const sanitized = recurse(patch, '');\n return { sanitized, warnings };\n }\n\n \n\n // -------- Internal helpers --------\n\n /**\n * Specialized merge for TableConfig that handles Array reconciliation safely.\n * - 'columns': merges by 'field' ID.\n */\n private smartMergeTableConfig(base: TableConfig, patch: Partial<TableConfig>): TableConfig {\n const result = deepMerge(base, patch);\n\n if (patch.columns && Array.isArray(patch.columns)) {\n const originalCols = base.columns || [];\n const patchCols = patch.columns;\n\n const mergedCols = originalCols.map((origCol) => {\n const match = patchCols.find((p) => p.field === origCol.field);\n return match ? deepMerge(origCol, match) : origCol;\n });\n\n patchCols.forEach((pCol) => {\n if (!originalCols.find((o) => o.field === pCol.field)) {\n mergedCols.push(pCol as any);\n }\n });\n\n result.columns = mergedCols;\n }\n\n return result;\n }\n\n private applyConfig(config: TableConfig): void {\n const prev = this.table.config;\n this.table.config = config;\n\n this.table.ngOnChanges({\n config: {\n previousValue: prev,\n currentValue: config,\n firstChange: false,\n isFirstChange: () => false\n }\n });\n }\n\n /**\n * If a patch adds only a currency format, ensure the column type is set to 'currency'\n * so the formatter runs. Avoid overriding an explicit non-currency type.\n */\n private normalizePatch(patch: Partial<TableConfig>): Partial<TableConfig> {\n if (!patch.columns || !Array.isArray(patch.columns)) return patch;\n const cols = patch.columns.map((col) => this.normalizeColumn(col));\n return { ...patch, columns: cols };\n }\n\n private looksLikeCurrencyFormat(format: string | undefined | null): boolean {\n if (!format) return false;\n const fmt = format.trim();\n return /^[A-Z]{3}(\\|.*)?$/.test(fmt);\n }\n\n private looksLikeDateFormat(format: string | undefined | null): boolean {\n if (!format) return false;\n const fmt = format.trim();\n // Heuristics: contains date tokens like d/M/y or common date separators\n return /(d|M|y){2,}/i.test(fmt) || fmt.includes('/') || fmt.includes('-');\n }\n\n private isIconRendererHint(renderer: any): boolean {\n if (!renderer) return false;\n if (renderer.type && renderer.type !== 'icon') return false;\n const icon = renderer.icon || renderer.name || renderer.iconName;\n return typeof icon === 'string' || typeof renderer.color === 'string' || typeof renderer.size === 'number';\n }\n private normalizeColumn(col: any): any {\n if (!col) return col;\n const next = { ...col };\n\n // Normalize formats\n if (next.format && !next.type) {\n if (this.looksLikeCurrencyFormat(next.format)) {\n next.type = 'currency' as any;\n } else if (this.looksLikeDateFormat(next.format)) {\n next.type = 'date' as any;\n }\n }\n\n // Normalize renderer structure (icon shorthand)\n if (next.renderer) {\n next.renderer = this.normalizeRenderer(next.renderer);\n }\n\n // Normalize conditional renderers\n if (Array.isArray(next.conditionalRenderers)) {\n next.conditionalRenderers = next.conditionalRenderers.map((r: any) => {\n if (!r) return r;\n const out = { ...r };\n if (out.renderer) out.renderer = this.normalizeRenderer(out.renderer);\n return out;\n });\n }\n\n return next;\n }\n\n private normalizeRenderer(renderer: any): any {\n if (!renderer) return renderer;\n const out = { ...renderer };\n if (out.type === 'icon') {\n // Move icon shorthand to renderer.icon.*\n const iconObj: any = { ...(out.icon || {}) };\n if (renderer.icon && typeof renderer.icon === 'string') iconObj.name = renderer.icon;\n if (renderer.icon?.name) iconObj.name = renderer.icon.name;\n if (renderer.icon?.color) iconObj.color = renderer.icon.color;\n if (renderer.icon?.size) iconObj.size = renderer.icon.size;\n if (renderer.color && !iconObj.color) iconObj.color = renderer.color;\n if (renderer.size && !iconObj.size) iconObj.size = renderer.size;\n out.icon = iconObj;\n delete out.color;\n delete out.size;\n }\n\n // Badge shorthand (allow badge.color/variant/icon/text via renderer.badge or root)\n if (out.type === 'badge') {\n const badge = { ...(out.badge || {}) };\n if (renderer.color && !badge.color) badge.color = renderer.color;\n if (renderer.variant && !badge.variant) badge.variant = renderer.variant;\n if (renderer.text && !badge.text) badge.text = renderer.text;\n if (renderer.icon && !badge.icon && typeof renderer.icon === 'string') badge.icon = renderer.icon;\n out.badge = badge;\n delete out.color;\n delete out.variant;\n delete out.text;\n if (typeof out.icon === 'string') delete out.icon;\n }\n\n // Chip shorthand\n if (out.type === 'chip') {\n const chip = { ...(out.chip || {}) };\n if (renderer.color && !chip.color) chip.color = renderer.color;\n if (renderer.variant && !chip.variant) chip.variant = renderer.variant;\n if (renderer.text && !chip.text) chip.text = renderer.text;\n if (renderer.icon && !chip.icon && typeof renderer.icon === 'string') chip.icon = renderer.icon;\n out.chip = chip;\n delete out.color;\n delete out.variant;\n delete out.text;\n if (typeof out.icon === 'string') delete out.icon;\n }\n\n // Link shorthand\n if (out.type === 'link' && typeof renderer.href === 'string') {\n out.link = { ...(out.link || {}), href: renderer.href };\n delete out.href;\n }\n\n return out;\n }\n}\n"],"names":[],"mappings":"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"}
|