@praxisui/table 0.0.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"praxisui-table.mjs","sources":["../../../projects/praxis-table/src/lib/utils/action-utils.ts","../../../projects/praxis-table/src/lib/praxis-table-toolbar.ts","../../../projects/praxis-table/src/lib/json-config-editor/json-config-editor.component.ts","../../../projects/praxis-table/src/lib/visual-formula-builder/formula-types.ts","../../../projects/praxis-table/src/lib/visual-formula-builder/formula-generator.service.ts","../../../projects/praxis-table/src/lib/visual-formula-builder/visual-formula-builder.component.ts","../../../projects/praxis-table/src/lib/value-mapping-editor/value-mapping-editor.component.ts","../../../projects/praxis-table/src/lib/data-formatter/data-formatter-types.ts","../../../projects/praxis-table/src/lib/data-formatter/data-formatting.service.ts","../../../projects/praxis-table/src/lib/data-formatter/data-formatter.component.ts","../../../projects/praxis-table/src/lib/columns-config-editor/columns-config-editor.component.ts","../../../projects/praxis-table/src/lib/behavior-config-editor/behavior-config-editor.component.ts","../../../projects/praxis-table/src/lib/toolbar-actions-editor/toolbar-actions-editor.component.ts","../../../projects/praxis-table/src/lib/messages-localization-editor/messages-localization-editor.component.ts","../../../projects/praxis-table/src/lib/filter-settings/filter-settings.component.ts","../../../projects/praxis-table/src/lib/filter-settings/filter-settings.component.html","../../../projects/praxis-table/src/lib/header-appearance-editor/header-appearance-editor.component.ts","../../../projects/praxis-table/src/lib/crud-integration-editor/crud-integration-editor.component.ts","../../../projects/praxis-table/src/lib/visual-rules-editor/table-rule-converters.ts","../../../projects/praxis-table/src/lib/visual-rules-editor/table-visual-rules-editor.component.ts","../../../projects/praxis-table/src/lib/dialogs/confirm-dialog-appearance-editor.component.ts","../../../projects/praxis-table/src/lib/dialogs/confirm-dialog-appearance-editor.component.html","../../../projects/praxis-table/src/lib/praxis-table-config-editor.ts","../../../projects/praxis-table/src/lib/praxis-table-config-editor.html","../../../projects/praxis-table/src/lib/filter-drawer.adapter.ts","../../../projects/praxis-table/src/lib/services/filter-config.service.ts","../../../projects/praxis-table/src/lib/components/praxis-filter/praxis-filter.component.ts","../../../projects/praxis-table/src/lib/components/praxis-filter/praxis-filter.component.html","../../../projects/praxis-table/src/lib/services/table-defaults.provider.ts","../../../projects/praxis-table/src/lib/praxis-table.ts","../../../projects/praxis-table/src/lib/praxis-table.html","../../../projects/praxis-table/src/lib/praxis-table.metadata.ts","../../../projects/praxis-table/src/public-api.ts","../../../projects/praxis-table/src/praxisui-table.ts"],"sourcesContent":["export interface ActionLike {\n action?: string;\n id?: string;\n // Campos históricos/comuns em diferentes configurações\n code?: string;\n key?: string;\n name?: string;\n type?: string;\n // Suporte a inferência por ícone/rótulo\n icon?: string;\n label?: string;\n}\n\nfunction normalize(str?: string | null): string {\n if (!str) return '';\n return String(str).trim();\n}\n\nfunction fromCommonKeys(a: ActionLike): string | undefined {\n return (\n normalize(a.action) ||\n normalize(a.id) ||\n normalize(a.code) ||\n normalize(a.key) ||\n normalize(a.name) ||\n normalize(a.type) ||\n undefined\n );\n}\n\nfunction iconToAction(icon?: string): string | undefined {\n if (!icon) return undefined;\n const i = icon.trim().toLowerCase();\n // Mapeamento de ícones Material/SVG para ações canônicas\n const map: Record<string, string> = {\n delete: 'delete',\n delete_outline: 'delete',\n delete_forever: 'delete',\n remove: 'delete',\n trash: 'delete',\n edit: 'edit',\n create: 'edit',\n mode_edit: 'edit',\n visibility: 'view',\n visibility_off: 'hide',\n open_in_new: 'open',\n launch: 'open',\n add: 'add',\n add_circle: 'add',\n add_box: 'add',\n save: 'save',\n download: 'download',\n file_download: 'download',\n upload: 'upload',\n file_upload: 'upload',\n more_vert: 'more',\n more_horiz: 'more',\n info: 'info',\n warning: 'warning',\n block: 'block',\n close: 'close',\n cancel: 'cancel',\n check: 'confirm',\n done: 'confirm',\n done_all: 'confirm',\n content_copy: 'copy',\n content_paste: 'paste',\n restore: 'restore',\n refresh: 'refresh',\n search: 'search',\n filter_list: 'filter',\n settings: 'settings',\n };\n return map[i] || i; // fallback: usar o próprio nome do ícone\n}\n\nfunction labelToAction(label?: string): string | undefined {\n if (!label) return undefined;\n const l = label.trim().toLowerCase();\n // Normalização simples de alguns rótulos comuns em pt/en\n const map: Record<string, string> = {\n excluir: 'delete',\n deletar: 'delete',\n remover: 'delete',\n apagar: 'delete',\n delete: 'delete',\n remove: 'delete',\n editar: 'edit',\n edit: 'edit',\n visualizar: 'view',\n ver: 'view',\n view: 'view',\n salvar: 'save',\n save: 'save',\n baixar: 'download',\n download: 'download',\n };\n return map[l] || l.replace(/\\s+/g, '-');\n}\n\nexport function getActionId(action: ActionLike): string {\n // 1) Tentar pelas chaves padrão/históricas\n const byKey = fromCommonKeys(action);\n if (byKey) return byKey;\n\n // 2) Inferir pelo ícone\n const byIcon = iconToAction(action.icon);\n if (byIcon) return byIcon;\n\n // 3) Fallback para label\n const byLabel = labelToAction(action.label);\n if (byLabel) return byLabel;\n\n // 4) Evitar string vazia\n console.warn('[PraxisTable] getActionId: identificador desconhecido para ação', action);\n return 'unknown';\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { TableConfig } from '@praxisui/core';\nimport { getActionId } from './utils/action-utils';\n\n@Component({\n selector: 'praxis-table-toolbar',\n standalone: true,\n imports: [\n CommonModule,\n MatToolbarModule,\n MatButtonModule,\n MatIconModule,\n PraxisIconDirective,\n MatMenuModule,\n ],\n template: `\n <mat-toolbar class=\"praxis-toolbar\">\n <div class=\"toolbar-main\">\n <ng-content select=\"[advancedFilter]\"></ng-content>\n <ng-content select=\"[toolbar]\"></ng-content>\n </div>\n\n <div class=\"toolbar-actions\">\n <span class=\"spacer\"></span>\n <div class=\"actions-group\">\n <ng-container *ngFor=\"let action of getStartActions()\">\n <button\n *ngIf=\"action.appearance === 'outlined'\"\n class=\"action-btn\"\n mat-stroked-button\n [color]=\"action.color || 'primary'\"\n (click)=\"emitToolbarAction($event, getActionId(action))\"\n >\n <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n {{ action.label }}\n </button>\n <button\n *ngIf=\"action.appearance === 'elevated'\"\n class=\"action-btn\"\n mat-raised-button\n [color]=\"action.color || 'primary'\"\n (click)=\"emitToolbarAction($event, getActionId(action))\"\n >\n <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n {{ action.label }}\n </button>\n <button\n *ngIf=\"action.appearance === 'text'\"\n class=\"action-btn\"\n mat-button\n [color]=\"action.color || 'primary'\"\n (click)=\"emitToolbarAction($event, getActionId(action))\"\n >\n <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n {{ action.label }}\n </button>\n <button\n *ngIf=\"action.appearance === 'tonal'\"\n class=\"action-btn pfx-tonal\"\n mat-button\n [color]=\"action.color || 'primary'\"\n (click)=\"emitToolbarAction($event, getActionId(action))\"\n >\n <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n {{ action.label }}\n </button>\n <button\n *ngIf=\"!action.appearance || action.appearance === 'filled'\"\n class=\"action-btn\"\n mat-flat-button\n [color]=\"action.color || 'primary'\"\n (click)=\"emitToolbarAction($event, getActionId(action))\"\n >\n <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n {{ action.label }}\n </button>\n </ng-container>\n <ng-container *ngFor=\"let action of config?.toolbar?.actions\">\n <button\n *ngIf=\"action.appearance === 'outlined'\"\n class=\"action-btn\"\n mat-stroked-button\n [color]=\"action.color\"\n [disabled]=\"action.disabled\"\n (click)=\"emitToolbarAction($event, getActionId(action))\"\n >\n <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n {{ action.label }}\n </button>\n <button\n *ngIf=\"action.appearance === 'elevated'\"\n class=\"action-btn\"\n mat-raised-button\n [color]=\"action.color\"\n [disabled]=\"action.disabled\"\n (click)=\"emitToolbarAction($event, getActionId(action))\"\n >\n <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n {{ action.label }}\n </button>\n <button\n *ngIf=\"action.appearance === 'text'\"\n class=\"action-btn\"\n mat-button\n [color]=\"action.color\"\n [disabled]=\"action.disabled\"\n (click)=\"emitToolbarAction($event, getActionId(action))\"\n >\n <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n {{ action.label }}\n </button>\n <button\n *ngIf=\"action.appearance === 'tonal'\"\n class=\"action-btn pfx-tonal\"\n mat-button\n [color]=\"action.color\"\n [disabled]=\"action.disabled\"\n (click)=\"emitToolbarAction($event, getActionId(action))\"\n >\n <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n {{ action.label }}\n </button>\n <button\n *ngIf=\"!action.appearance || action.appearance === 'filled'\"\n class=\"action-btn\"\n mat-flat-button\n [color]=\"action.color\"\n [disabled]=\"action.disabled\"\n (click)=\"emitToolbarAction($event, getActionId(action))\"\n >\n <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n {{ action.label }}\n </button>\n </ng-container>\n <ng-container *ngIf=\"config?.actions?.bulk?.enabled\">\n <button\n class=\"action-btn\"\n mat-button\n *ngFor=\"let action of config?.actions?.bulk?.actions\"\n [color]=\"action.color || 'primary'\"\n (click)=\"emitToolbarAction($event, getActionId(action))\"\n >\n <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n {{ action.label }}\n </button>\n </ng-container>\n\n <ng-container *ngIf=\"config?.export?.enabled\">\n <button\n class=\"action-btn\"\n mat-button\n [matMenuTriggerFor]=\"exportMenu\"\n >\n <mat-icon [praxisIcon]=\"'download'\"></mat-icon>\n </button>\n <mat-menu #exportMenu=\"matMenu\">\n <button\n mat-menu-item\n *ngFor=\"let format of config?.export?.formats\"\n >\n <mat-icon [praxisIcon]=\"getExportIcon(format)\"></mat-icon>\n {{ format.toUpperCase() }}\n </button>\n </mat-menu>\n </ng-container>\n </div>\n <div class=\"end-actions\">\n <ng-content select=\"[end-actions]\"></ng-content>\n <!-- Reset preferences button slot -->\n <button mat-icon-button aria-label=\"Reset table preferences\" (click)=\"reset.emit()\" matTooltip=\"Redefinir preferências da tabela\">\n <mat-icon [praxisIcon]=\"'restart_alt'\"></mat-icon>\n </button>\n </div>\n\n <div class=\"mobile-actions\">\n <button\n mat-icon-button\n class=\"overflow-trigger\"\n *ngIf=\"getOverflowActions().length\"\n [matMenuTriggerFor]=\"overflowMenu\"\n >\n <mat-icon [praxisIcon]=\"'more_vert'\"></mat-icon>\n </button>\n <mat-menu #overflowMenu=\"matMenu\">\n <button\n mat-menu-item\n *ngFor=\"let action of getOverflowActions()\"\n (click)=\"emitToolbarAction($event, getActionId(action))\"\n >\n <mat-icon *ngIf=\"action.icon\" [praxisIcon]=\"action.icon\"></mat-icon>\n {{ action.label }}\n </button>\n </mat-menu>\n\n <ng-container *ngIf=\"config?.export?.enabled\">\n <button mat-icon-button [matMenuTriggerFor]=\"mobileExportMenu\">\n <mat-icon>download</mat-icon>\n </button>\n <mat-menu #mobileExportMenu=\"matMenu\">\n <button\n mat-menu-item\n *ngFor=\"let format of config?.export?.formats\"\n >\n <mat-icon>{{ getExportIcon(format) }}</mat-icon>\n {{ format.toUpperCase() }}\n </button>\n </mat-menu>\n </ng-container>\n </div>\n </div>\n </mat-toolbar>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n :host(.debug-layout) .praxis-toolbar { outline: 2px solid #ff4d4f; }\n :host(.debug-layout) .toolbar-main { outline: 1px dashed #3b82f6; }\n :host(.debug-layout) .toolbar-actions { outline: 1px dashed #22c55e; }\n .praxis-toolbar {\n border-radius: 12px 12px 0 0;\n background: transparent;\n box-shadow: none;\n padding: 8px 12px;\n min-height: var(--pfx-filter-h, 44px);\n display: flex;\n flex-direction: row; /* mantém layout em linha em todas as larguras */\n align-items: center;\n gap: 8px;\n }\n\n .toolbar-main {\n display: flex;\n align-items: center;\n min-width: 0; /* permite encolher sem overflow */\n gap: 8px;\n min-height: var(--pfx-filter-h, 44px);\n flex: 1 1 auto; /* ocupa o máximo possível */\n }\n\n .toolbar-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n min-height: var(--pfx-filter-h, 44px);\n flex: 0 0 auto; /* apenas o necessário */\n }\n\n .actions-group {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .action-btn {\n height: 40px;\n }\n /* Tonal custom style (M3-like) */\n .pfx-tonal {\n background: var(--mat-sys-secondary-container, color-mix(in srgb, currentColor 12%, transparent));\n color: var(--mat-sys-on-secondary-container, currentColor);\n }\n .pfx-tonal:hover {\n background: color-mix(in srgb, var(--mat-sys-secondary-container, currentColor) 90%, black 0%);\n }\n\n .mobile-actions {\n display: none;\n align-items: center;\n gap: 8px;\n }\n\n .overflow-trigger {\n height: 40px;\n }\n\n .spacer { flex: 1 1 auto; min-width: 8px; }\n .end-actions { display: flex; align-items: center; gap: 8px; }\n\n @media (min-width: 1024px) {\n .toolbar-actions { justify-content: flex-end; }\n .toolbar-actions .spacer { display: none; }\n }\n\n @media (max-width: 1023px) {\n .actions-group {\n display: none;\n }\n\n .mobile-actions {\n display: flex;\n }\n\n .toolbar-actions .spacer { flex: 1 1 auto; }\n }\n `,\n ],\n host: { '[class.debug-layout]': 'debugLayout' },\n})\nexport class PraxisTableToolbar {\n @Input() config?: TableConfig;\n @Input() debugLayout = false;\n @Output() toolbarAction = new EventEmitter<{ action: string }>();\n @Output() reset = new EventEmitter<void>();\n\n readonly getActionId = getActionId;\n\n emitToolbarAction(event: Event, action: string): void {\n (event.target as HTMLElement).blur();\n this.toolbarAction.emit({ action });\n }\n\n getStartActions() {\n return (\n this.config?.toolbar?.actions?.filter(\n (action) => action.position === 'start',\n ) || []\n );\n }\n\n getOverflowActions() {\n const start = this.getStartActions();\n const toolbar = this.config?.toolbar?.actions?.filter(\n (action) => action.position !== 'start',\n );\n const bulk = this.config?.actions?.bulk?.enabled\n ? this.config.actions.bulk.actions\n : [];\n return [...(start || []), ...(toolbar || []), ...(bulk || [])];\n }\n\n getExportIcon(format: string): string {\n switch (format.toLowerCase()) {\n case 'excel':\n case 'xlsx':\n return 'grid_on';\n case 'pdf':\n return 'picture_as_pdf';\n case 'csv':\n return 'table_chart';\n default:\n return 'download';\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {FormsModule} from '@angular/forms';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatFormFieldModule} from '@angular/material/form-field';\nimport {MatInputModule} from '@angular/material/input';\nimport {MatCardModule} from '@angular/material/card';\nimport {TableConfig} from '@praxisui/core';\nimport {debounceTime, Subject, takeUntil} from 'rxjs';\n\nexport interface JsonValidationResult {\n isValid: boolean;\n error?: string;\n config?: TableConfig;\n}\n\nexport interface JsonEditorEvent {\n type: 'apply' | 'format' | 'validation';\n payload: JsonValidationResult;\n}\n\n@Component({\n selector: 'json-config-editor',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n FormsModule,\n MatButtonModule,\n MatIconModule,\n MatFormFieldModule,\n MatInputModule,\n MatCardModule\n ],\n template: `\n <div class=\"json-config-editor\">\n <!-- Educational Card -->\n <mat-card class=\"educational-card\">\n <mat-card-header>\n <mat-icon mat-card-avatar class=\"card-icon\">data_object</mat-icon>\n <mat-card-title>Edição Avançada JSON</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n <p><strong>Para usuários avançados:</strong> Esta seção permite ajustar todas as configurações da tabela\n diretamente via JSON. <strong>Atenção:</strong> Alterações aqui podem sobrescrever configurações\n visuais nas outras abas.</p>\n </mat-card-content>\n </mat-card>\n\n <!-- JSON Editor Section -->\n <div class=\"json-editor-section\">\n <div class=\"json-editor-toolbar\">\n <button mat-button (click)=\"formatJson()\" [disabled]=\"!isValidJson\">\n <mat-icon>format_align_left</mat-icon>\n Formatar JSON\n </button>\n <button mat-button (click)=\"applyJsonChanges()\" [disabled]=\"!isValidJson\" color=\"primary\">\n <mat-icon>check</mat-icon>\n Aplicar JSON\n </button>\n </div>\n\n <mat-form-field appearance=\"outline\" class=\"json-textarea-field\">\n <mat-label>Configuração JSON</mat-label>\n <textarea\n matInput\n [(ngModel)]=\"jsonText\"\n (ngModelChange)=\"onJsonTextChange($event)\"\n placeholder=\"Edite a configuração JSON aqui...\"\n rows=\"20\"\n spellcheck=\"false\"\n class=\"json-textarea\">\n </textarea>\n <mat-hint *ngIf=\"isValidJson\" class=\"valid-hint\">JSON válido</mat-hint>\n <mat-hint align=\"end\" *ngIf=\"isValidJson && unknownTopKeys.length\" class=\"valid-hint\" style=\"color: var(--mat-sys-secondary);\">\n Aviso: chaves desconhecidas no topo — {{ unknownTopKeys.join(', ') }}\n </mat-hint>\n <mat-error *ngIf=\"!isValidJson && jsonText\">JSON inválido: {{ jsonError }}</mat-error>\n </mat-form-field>\n </div>\n </div>\n `,\n styles: [`\n .json-config-editor {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .educational-card {\n margin-bottom: 24px;\n background-color: var(--mat-sys-surface-container-low);\n border-left: 4px solid var(--mat-sys-primary);\n }\n\n .educational-card .mat-mdc-card-header {\n padding-bottom: 8px;\n }\n\n .card-icon {\n background-color: var(--mat-sys-primary-container);\n color: var(--mat-sys-on-primary-container);\n font-size: 20px;\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .educational-card .mat-mdc-card-title {\n font-size: 1.1rem;\n font-weight: 500;\n color: var(--mat-sys-on-surface);\n }\n\n .educational-card .mat-mdc-card-content {\n color: var(--mat-sys-on-surface-variant);\n line-height: 1.5;\n }\n\n .json-editor-section {\n flex: 1;\n display: flex;\n flex-direction: column;\n }\n\n .json-editor-toolbar {\n display: flex;\n gap: 12px;\n margin-bottom: 16px;\n padding: 12px;\n background-color: var(--mat-sys-surface-container-low);\n border-radius: 8px;\n border: 1px solid var(--mat-sys-outline-variant);\n }\n\n .json-textarea-field {\n width: 100%;\n flex: 1;\n }\n\n .json-textarea {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace !important;\n font-size: 13px !important;\n line-height: 1.4 !important;\n height: 100% !important;\n min-height: 300px !important;\n white-space: pre !important;\n overflow-wrap: normal !important;\n overflow-x: auto !important;\n resize: none !important;\n }\n\n .valid-hint {\n color: var(--mat-sys-primary) !important;\n }\n\n /* Responsividade */\n @media (max-width: 768px) {\n .json-editor-toolbar {\n flex-direction: column;\n gap: 8px;\n }\n\n .json-textarea {\n font-size: 12px !important;\n min-height: 300px !important;\n }\n }\n `]\n})\nexport class JsonConfigEditorComponent implements OnInit, OnDestroy {\n\n @Input() config: TableConfig | null = null;\n @Output() configChange = new EventEmitter<TableConfig>();\n @Output() validationChange = new EventEmitter<JsonValidationResult>();\n @Output() editorEvent = new EventEmitter<JsonEditorEvent>();\n\n // JSON editing state\n jsonText = '';\n isValidJson = true;\n jsonError = '';\n unknownTopKeys: string[] = [];\n\n // Subjects para cleanup e debouncing\n private destroy$ = new Subject<void>();\n private jsonTextChanges$ = new Subject<string>();\n\n constructor(private cdr: ChangeDetectorRef) {\n // Setup debounced JSON validation\n this.jsonTextChanges$\n .pipe(\n debounceTime(300),\n takeUntil(this.destroy$)\n )\n .subscribe(text => {\n this.validateJson(text);\n });\n }\n\n ngOnInit(): void {\n // Inicializar texto JSON com a configuração recebida\n if (this.config) {\n this.jsonText = JSON.stringify(this.config, null, 2);\n this.validateJson(this.jsonText);\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onJsonTextChange(text: string): void {\n this.jsonTextChanges$.next(text);\n }\n\n applyJsonChanges(): void {\n if (!this.isValidJson) {\n return;\n }\n\n try {\n const newConfig = JSON.parse(this.jsonText) as TableConfig;\n\n // Emitir a nova configuração\n this.configChange.emit(newConfig);\n\n // Emitir evento de aplicação\n this.editorEvent.emit({\n type: 'apply',\n payload: {\n isValid: true,\n config: newConfig\n }\n });\n\n } catch (error) {\n const errorResult: JsonValidationResult = {\n isValid: false,\n error: 'Erro ao aplicar configuração JSON'\n };\n\n this.editorEvent.emit({\n type: 'apply',\n payload: errorResult\n });\n }\n }\n\n formatJson(): void {\n if (!this.isValidJson) {\n return;\n }\n\n try {\n const parsed = JSON.parse(this.jsonText);\n this.jsonText = JSON.stringify(parsed, null, 2);\n\n // Emitir evento de formatação\n this.editorEvent.emit({\n type: 'format',\n payload: {\n isValid: true,\n config: parsed as TableConfig\n }\n });\n\n this.cdr.markForCheck();\n\n } catch (error) {\n this.editorEvent.emit({\n type: 'format',\n payload: {\n isValid: false,\n error: 'Erro ao formatar JSON'\n }\n });\n }\n }\n\n /**\n * Método público para atualizar o JSON externamente\n */\n updateJsonFromConfig(config: TableConfig): void {\n this.jsonText = JSON.stringify(config, null, 2);\n this.validateJson(this.jsonText);\n }\n\n /**\n * Método público para obter a configuração atual validada\n */\n getCurrentConfig(): TableConfig | null {\n if (!this.isValidJson) {\n return null;\n }\n\n try {\n return JSON.parse(this.jsonText) as TableConfig;\n } catch {\n return null;\n }\n }\n\n /**\n * Método público para verificar se há alterações\n */\n hasChanges(): boolean {\n if (!this.config) {\n return false;\n }\n\n const currentConfig = this.getCurrentConfig();\n if (!currentConfig) {\n return false;\n }\n\n return JSON.stringify(this.config) !== JSON.stringify(currentConfig);\n }\n\n private validateJson(text: string): void {\n const result: JsonValidationResult = {\n isValid: false,\n error: undefined,\n config: undefined\n };\n\n if (!text.trim()) {\n result.error = 'JSON não pode estar vazio';\n this.updateValidationState(result);\n return;\n }\n\n try {\n const parsed = JSON.parse(text);\n\n // Validação básica da estrutura TableConfig\n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error('Configuração deve ser um objeto');\n }\n\n if (!Array.isArray(parsed.columns)) {\n throw new Error('Campo \"columns\" deve ser um array');\n }\n\n // Validação adicional para campos críticos\n if (parsed.gridOptions && typeof parsed.gridOptions !== 'object') {\n throw new Error('Campo \"gridOptions\" deve ser um objeto');\n }\n\n if (parsed.toolbar && typeof parsed.toolbar !== 'object') {\n throw new Error('Campo \"toolbar\" deve ser um objeto');\n }\n\n result.isValid = true;\n result.config = parsed as TableConfig;\n // Detect unknown top-level keys (non-blocking)\n try {\n const allowed = [\n 'meta','columns','behavior','appearance','toolbar','actions','export','messages','localization','data','theme','performance','plugins','accessibility','rowConditionalStyles','_rowStyleRulesState'\n ];\n const keys = Object.keys(parsed || {});\n this.unknownTopKeys = keys.filter((k) => !allowed.includes(k));\n } catch { this.unknownTopKeys = []; }\n this.updateValidationState(result);\n\n } catch (error) {\n result.error = error instanceof Error ? error.message : 'Erro de sintaxe JSON';\n this.updateValidationState(result);\n }\n }\n\n private updateValidationState(result: JsonValidationResult): void {\n this.isValidJson = result.isValid;\n this.jsonError = result.error || '';\n\n // Emitir evento de validação\n this.validationChange.emit(result);\n\n // Emitir evento genérico do editor\n this.editorEvent.emit({\n type: 'validation',\n payload: result\n });\n\n this.cdr.markForCheck();\n }\n}\n","// Types and interfaces for the Visual Formula Builder\n\nexport type FormulaType = \n | 'none' \n | 'concatenation' \n | 'arithmetic' \n | 'nested_property' \n | 'conditional_mapping' \n | 'default_value';\n\nexport interface FieldSchema {\n name: string;\n label: string;\n type: 'string' | 'number' | 'boolean' | 'date' | 'object' | 'array';\n path?: string; // For nested properties like 'address.city'\n}\n\nexport interface FormulaDefinition {\n type: FormulaType;\n params: any;\n _generatedExpression?: string; // Auto-generated safe JS expression\n}\n\n// Specific parameter interfaces for each formula type\nexport interface ConcatenationParams {\n fields: string[];\n separator: string;\n ignoreEmpty: boolean;\n}\n\nexport interface ArithmeticParams {\n operator: '+' | '-' | '*' | '/';\n operand1: string | number; // Field name or constant\n operand2: string | number; // Field name or constant\n}\n\nexport interface NestedPropertyParams {\n propertyPath: string;\n fallbackValue?: any;\n}\n\nexport interface ConditionalMappingParams {\n conditionField: string;\n comparisonValue: any;\n trueValue: any;\n falseValue: any;\n operator?: '===' | '!=' | '>' | '<' | '>=' | '<=';\n}\n\nexport interface DefaultValueParams {\n originalField: string;\n defaultValue: any;\n}\n\n// Union type for all parameter types\nexport type FormulaParams = \n | ConcatenationParams \n | ArithmeticParams \n | NestedPropertyParams \n | ConditionalMappingParams \n | DefaultValueParams;\n\n// Formula template definitions\nexport interface FormulaTemplate {\n type: FormulaType;\n label: string;\n description: string;\n icon: string;\n parameterSchema: FormulaParameterSchema[];\n}\n\nexport interface FormulaParameterSchema {\n key: string;\n label: string;\n type: 'field' | 'text' | 'number' | 'boolean' | 'select' | 'value_input';\n required: boolean;\n options?: { value: any; label: string }[];\n placeholder?: string;\n hint?: string;\n valueType?: 'string' | 'number' | 'boolean' | 'any'; // For value_input type\n}\n\n// Default formula templates\nexport const FORMULA_TEMPLATES: FormulaTemplate[] = [\n {\n type: 'none',\n label: 'Campo Direto',\n description: 'Usar valor direto de um campo sem transformação',\n icon: 'data_object',\n parameterSchema: []\n },\n {\n type: 'concatenation',\n label: 'Concatenação de Campos',\n description: 'Combinar múltiplos campos com um separador',\n icon: 'merge',\n parameterSchema: [\n {\n key: 'fields',\n label: 'Campos para concatenar',\n type: 'field',\n required: true,\n hint: 'Selecione os campos que deseja unir'\n },\n {\n key: 'separator',\n label: 'Separador',\n type: 'text',\n required: false,\n placeholder: ' ',\n hint: 'Texto usado para separar os campos'\n },\n {\n key: 'ignoreEmpty',\n label: 'Ignorar campos vazios',\n type: 'boolean',\n required: false,\n hint: 'Não incluir campos vazios na concatenação'\n }\n ]\n },\n {\n type: 'arithmetic',\n label: 'Cálculo Numérico',\n description: 'Realizar operações matemáticas simples',\n icon: 'calculate',\n parameterSchema: [\n {\n key: 'operand1',\n label: 'Primeiro operando',\n type: 'value_input',\n valueType: 'number',\n required: true,\n hint: 'Campo numérico ou valor constante'\n },\n {\n key: 'operator',\n label: 'Operação',\n type: 'select',\n required: true,\n options: [\n { value: '+', label: 'Adição (+)' },\n { value: '-', label: 'Subtração (-)' },\n { value: '*', label: 'Multiplicação (×)' },\n { value: '/', label: 'Divisão (÷)' }\n ]\n },\n {\n key: 'operand2',\n label: 'Segundo operando',\n type: 'value_input',\n valueType: 'number',\n required: true,\n hint: 'Campo numérico ou valor constante'\n }\n ]\n },\n {\n type: 'nested_property',\n label: 'Propriedade Aninhada',\n description: 'Acessar propriedades de objetos aninhados',\n icon: 'account_tree',\n parameterSchema: [\n {\n key: 'propertyPath',\n label: 'Caminho da propriedade',\n type: 'text',\n required: true,\n placeholder: 'ex: address.city',\n hint: 'Use ponto (.) para navegar em objetos aninhados'\n },\n {\n key: 'fallbackValue',\n label: 'Valor padrão',\n type: 'text',\n required: false,\n placeholder: 'N/A',\n hint: 'Valor retornado se a propriedade não existir'\n }\n ]\n },\n {\n type: 'conditional_mapping',\n label: 'Mapeamento Condicional',\n description: 'Retornar diferentes valores baseado em uma condição',\n icon: 'swap_horizontal_circle',\n parameterSchema: [\n {\n key: 'conditionField',\n label: 'Campo de condição',\n type: 'field',\n required: true,\n hint: 'Campo usado para comparação'\n },\n {\n key: 'operator',\n label: 'Operador',\n type: 'select',\n required: true,\n options: [\n { value: '===', label: 'Igual a (===)' },\n { value: '!=', label: 'Diferente de (!=)' },\n { value: '>', label: 'Maior que (>)' },\n { value: '<', label: 'Menor que (<)' },\n { value: '>=', label: 'Maior ou igual (>=)' },\n { value: '<=', label: 'Menor ou igual (<=)' }\n ]\n },\n {\n key: 'comparisonValue',\n label: 'Valor de comparação',\n type: 'value_input',\n valueType: 'any',\n required: true,\n hint: 'Valor para comparar com o campo'\n },\n {\n key: 'trueValue',\n label: 'Valor se verdadeiro',\n type: 'value_input',\n valueType: 'any',\n required: true,\n hint: 'Valor retornado quando a condição é verdadeira'\n },\n {\n key: 'falseValue',\n label: 'Valor se falso',\n type: 'value_input',\n valueType: 'any',\n required: true,\n hint: 'Valor retornado quando a condição é falsa'\n }\n ]\n },\n {\n type: 'default_value',\n label: 'Valor Padrão se Vazio',\n description: 'Usar um valor padrão quando o campo estiver vazio',\n icon: 'rule',\n parameterSchema: [\n {\n key: 'originalField',\n label: 'Campo original',\n type: 'field',\n required: true,\n hint: 'Campo principal a ser verificado'\n },\n {\n key: 'defaultValue',\n label: 'Valor padrão',\n type: 'value_input',\n valueType: 'any',\n required: true,\n placeholder: 'N/A',\n hint: 'Valor usado quando o campo estiver vazio'\n }\n ]\n }\n];","import { Injectable } from '@angular/core';\nimport { \n FormulaDefinition, \n FormulaType, \n ConcatenationParams, \n ArithmeticParams, \n NestedPropertyParams, \n ConditionalMappingParams, \n DefaultValueParams \n} from './formula-types';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FormulaGeneratorService {\n\n /**\n * Generates a safe JavaScript expression from a formula definition\n */\n generateExpression(formula: FormulaDefinition): string {\n switch (formula.type) {\n case 'none':\n return '';\n case 'concatenation':\n return this.generateConcatenationExpression(formula.params as ConcatenationParams);\n case 'arithmetic':\n return this.generateArithmeticExpression(formula.params as ArithmeticParams);\n case 'nested_property':\n return this.generateNestedPropertyExpression(formula.params as NestedPropertyParams);\n case 'conditional_mapping':\n return this.generateConditionalMappingExpression(formula.params as ConditionalMappingParams);\n case 'default_value':\n return this.generateDefaultValueExpression(formula.params as DefaultValueParams);\n default:\n return '';\n }\n }\n\n /**\n * Validates a formula definition\n */\n validateFormula(formula: FormulaDefinition): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!formula.type || formula.type === 'none') {\n return { valid: true, errors: [] };\n }\n\n switch (formula.type) {\n case 'concatenation':\n return this.validateConcatenationParams(formula.params as ConcatenationParams);\n case 'arithmetic':\n return this.validateArithmeticParams(formula.params as ArithmeticParams);\n case 'nested_property':\n return this.validateNestedPropertyParams(formula.params as NestedPropertyParams);\n case 'conditional_mapping':\n return this.validateConditionalMappingParams(formula.params as ConditionalMappingParams);\n case 'default_value':\n return this.validateDefaultValueParams(formula.params as DefaultValueParams);\n default:\n errors.push('Tipo de fórmula não reconhecido');\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n // Private expression generators\n private generateConcatenationExpression(params: ConcatenationParams): string {\n if (!params.fields || params.fields.length === 0) {\n return '';\n }\n\n const separator = this.sanitizeStringValue(params.separator || ' ');\n const fieldExpressions = params.fields.map(field => \n `(rowData.${this.sanitizeFieldName(field)} || '')`\n );\n \n if (params.ignoreEmpty) {\n // Filter out empty values (null, undefined, empty string, whitespace-only)\n return `[${fieldExpressions.join(', ')}].filter(v => v && String(v).trim() !== '').join('${separator}')`;\n } else {\n // Include empty values but convert them to empty strings (preserves field positions)\n // However, use smart joining to avoid unwanted separators\n return `[${fieldExpressions.join(', ')}].map(v => v || '').filter(v => v !== '').join('${separator}')`;\n }\n }\n\n private generateArithmeticExpression(params: ArithmeticParams): string {\n const operand1 = this.parseOperand(params.operand1);\n const operand2 = this.parseOperand(params.operand2);\n const operator = this.sanitizeOperator(params.operator);\n\n return `(${operand1} ${operator} ${operand2})`;\n }\n\n private generateNestedPropertyExpression(params: NestedPropertyParams): string {\n const safePath = this.generateSafePropertyPath(params.propertyPath);\n const fallback = params.fallbackValue !== undefined \n ? this.sanitizeStringValue(params.fallbackValue) \n : 'null';\n\n return `(${safePath} ?? '${fallback}')`;\n }\n\n private generateConditionalMappingExpression(params: ConditionalMappingParams): string {\n const fieldAccess = `rowData.${this.sanitizeFieldName(params.conditionField)}`;\n const operator = this.sanitizeOperator(params.operator || '===');\n const comparisonValue = this.sanitizeValue(params.comparisonValue);\n const trueValueFormatted = this.sanitizeValue(params.trueValue);\n const falseValueFormatted = this.sanitizeValue(params.falseValue);\n\n return `(${fieldAccess} ${operator} ${comparisonValue} ? ${trueValueFormatted} : ${falseValueFormatted})`;\n }\n\n private generateDefaultValueExpression(params: DefaultValueParams): string {\n const fieldAccess = `rowData.${this.sanitizeFieldName(params.originalField)}`;\n const defaultValueFormatted = this.sanitizeValue(params.defaultValue);\n\n return `(${fieldAccess} || ${defaultValueFormatted})`;\n }\n\n // Private validation methods\n private validateConcatenationParams(params: ConcatenationParams): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n \n if (!params.fields || params.fields.length === 0) {\n errors.push('Pelo menos um campo deve ser selecionado para concatenação');\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n private validateArithmeticParams(params: ArithmeticParams): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n \n if (!params.operand1) {\n errors.push('Primeiro operando é obrigatório');\n }\n \n if (!params.operand2) {\n errors.push('Segundo operando é obrigatório');\n }\n \n if (!params.operator) {\n errors.push('Operador é obrigatório');\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n private validateNestedPropertyParams(params: NestedPropertyParams): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n \n if (!params.propertyPath) {\n errors.push('Caminho da propriedade é obrigatório');\n } else if (!this.isValidPropertyPath(params.propertyPath)) {\n errors.push('Caminho da propriedade inválido');\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n private validateConditionalMappingParams(params: ConditionalMappingParams): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n \n if (!params.conditionField) {\n errors.push('Campo de condição é obrigatório');\n }\n \n if (params.comparisonValue === undefined || params.comparisonValue === '') {\n errors.push('Valor de comparação é obrigatório');\n }\n \n if (!params.trueValue) {\n errors.push('Valor se verdadeiro é obrigatório');\n }\n \n if (!params.falseValue) {\n errors.push('Valor se falso é obrigatório');\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n private validateDefaultValueParams(params: DefaultValueParams): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n \n if (!params.originalField) {\n errors.push('Campo original é obrigatório');\n }\n \n if (!params.defaultValue) {\n errors.push('Valor padrão é obrigatório');\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n // Utility methods for safe expression generation\n private sanitizeFieldName(fieldName: string): string {\n // Only allow alphanumeric characters, underscores, and dots\n return fieldName.replace(/[^a-zA-Z0-9_.]/g, '');\n }\n\n private sanitizeStringValue(value: any): string {\n if (value === null || value === undefined) {\n return '';\n }\n // Escape single quotes and backslashes\n return String(value).replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n }\n\n private sanitizeValue(value: any): string {\n if (typeof value === 'string') {\n return `'${this.sanitizeStringValue(value)}'`;\n } else if (typeof value === 'number') {\n return String(value);\n } else if (typeof value === 'boolean') {\n return String(value);\n } else {\n return `'${this.sanitizeStringValue(value)}'`;\n }\n }\n\n private sanitizeOperator(operator: string): string {\n const allowedOperators = ['+', '-', '*', '/', '===', '!=', '>', '<', '>=', '<='];\n return allowedOperators.includes(operator) ? operator : '===';\n }\n\n private parseOperand(operand: string | number): string {\n if (typeof operand === 'number') {\n return String(operand);\n } else if (typeof operand === 'string') {\n // Check if it's a number string\n const numValue = parseFloat(operand);\n if (!isNaN(numValue) && isFinite(numValue)) {\n return String(numValue);\n } else {\n // Treat as field name\n return `(rowData.${this.sanitizeFieldName(operand)} || 0)`;\n }\n }\n return '0';\n }\n\n private generateSafePropertyPath(path: string): string {\n const sanitizedPath = this.sanitizeFieldName(path);\n const parts = sanitizedPath.split('.');\n \n if (parts.length === 1) {\n return `rowData.${parts[0]}`;\n }\n \n // Generate safe optional chaining\n let safePath = 'rowData';\n for (const part of parts) {\n safePath += `?.${part}`;\n }\n \n return safePath;\n }\n\n private isValidPropertyPath(path: string): boolean {\n // Basic validation for property path\n return /^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(path);\n }\n\n /**\n * Get a sample data object for testing formulas\n */\n getSampleData(): any {\n return {\n id: 1,\n firstName: 'João',\n lastName: 'Silva',\n email: 'joao.silva@example.com',\n age: 30,\n salary: 5000,\n status: 'active',\n address: {\n city: 'São Paulo',\n state: 'SP',\n zipCode: '01234-567'\n },\n isActive: true,\n lastLogin: new Date().toISOString(),\n tags: ['employee', 'developer']\n };\n }\n\n /**\n * Test a formula with sample data\n */\n testFormula(formula: FormulaDefinition, sampleData?: any): { success: boolean; result?: any; error?: string } {\n try {\n const expression = this.generateExpression(formula);\n if (!expression) {\n return { success: true, result: null };\n }\n\n const testData = sampleData || this.getSampleData();\n const testFunction = new Function('rowData', `return ${expression}`);\n const result = testFunction(testData);\n\n return { success: true, result };\n } catch (error) {\n return { \n success: false, \n error: error instanceof Error ? error.message : 'Erro desconhecido' \n };\n }\n }\n}","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnChanges,\n SimpleChanges,\n ChangeDetectorRef,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport {\n MatCheckboxModule,\n MatCheckboxChange,\n} from '@angular/material/checkbox';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport {\n FormulaDefinition,\n FieldSchema,\n FormulaType,\n FORMULA_TEMPLATES,\n FormulaTemplate,\n FormulaParameterSchema,\n} from './formula-types';\nimport { FormulaGeneratorService } from './formula-generator.service';\n\n@Component({\n selector: 'visual-formula-builder',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n FormsModule,\n MatButtonModule,\n MatIconModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatCheckboxModule,\n MatCardModule,\n MatChipsModule,\n MatTooltipModule,\n MatExpansionModule,\n MatDividerModule,\n MatButtonToggleModule,\n PraxisIconDirective,\n ],\n template: `\n <div class=\"visual-formula-builder\">\n <!-- Formula Type Selection -->\n <mat-card class=\"formula-type-card\">\n <mat-card-header class=\"compact-header\">\n <mat-icon mat-card-avatar class=\"formula-icon\" [praxisIcon]=\"'functions'\"></mat-icon>\n <mat-card-title>Construtor de Fórmulas</mat-card-title>\n <mat-card-subtitle\n >Configure como o valor da coluna será calculado</mat-card-subtitle\n >\n </mat-card-header>\n <mat-card-content>\n <mat-form-field appearance=\"outline\" class=\"formula-type-select\">\n <mat-label>Tipo de Fórmula</mat-label>\n <mat-select\n [(ngModel)]=\"selectedFormulaType\"\n (ngModelChange)=\"onFormulaTypeChange($event)\"\n >\n <mat-option\n *ngFor=\"let template of formulaTemplates\"\n [value]=\"template.type\"\n >\n <div class=\"formula-option\">\n <mat-icon class=\"option-icon\" [praxisIcon]=\"template.icon\"></mat-icon>\n <div class=\"option-content\">\n <span class=\"option-label\">{{ template.label }}</span>\n <span class=\"option-description\">{{\n template.description\n }}</span>\n </div>\n </div>\n </mat-option>\n </mat-select>\n <mat-hint>Selecione como o valor será calculado</mat-hint>\n </mat-form-field>\n </mat-card-content>\n </mat-card>\n\n <!-- Dynamic Parameter Builder -->\n <mat-card\n *ngIf=\"selectedTemplate && selectedTemplate.type !== 'none'\"\n class=\"parameters-card\"\n >\n <mat-card-header class=\"compact-header\">\n <mat-icon mat-card-avatar class=\"params-icon\">{{\n selectedTemplate.icon\n }}</mat-icon>\n <mat-card-title>{{ selectedTemplate.label }}</mat-card-title>\n <mat-card-subtitle>{{\n selectedTemplate.description\n }}</mat-card-subtitle>\n </mat-card-header>\n <mat-card-content>\n <form class=\"parameters-form\">\n <div\n *ngFor=\"let paramSchema of selectedTemplate.parameterSchema\"\n class=\"parameter-field\"\n >\n <!-- Field Selector -->\n <mat-form-field\n *ngIf=\"paramSchema.type === 'field'\"\n appearance=\"outline\"\n class=\"full-width\"\n >\n <mat-label>{{ paramSchema.label }}</mat-label>\n <mat-select\n [(ngModel)]=\"currentParams[paramSchema.key]\"\n [name]=\"paramSchema.key\"\n [multiple]=\"isMultiSelectField(paramSchema.key)\"\n (ngModelChange)=\"onParameterChange()\"\n >\n <mat-option\n *ngFor=\"let field of availableDataSchema\"\n [value]=\"field.name\"\n >\n <div class=\"field-option\">\n <mat-icon class=\"field-type-icon\">{{\n getFieldTypeIcon(field.type)\n }}</mat-icon>\n <div class=\"field-info\">\n <span class=\"field-label\">{{ field.label }}</span>\n <span class=\"field-name\">{{ field.name }}</span>\n </div>\n </div>\n </mat-option>\n </mat-select>\n <mat-hint>{{ paramSchema.hint }}</mat-hint>\n </mat-form-field>\n\n <!-- Text Input -->\n <mat-form-field\n *ngIf=\"paramSchema.type === 'text'\"\n appearance=\"outline\"\n class=\"full-width\"\n >\n <mat-label>{{ paramSchema.label }}</mat-label>\n <input\n matInput\n [(ngModel)]=\"currentParams[paramSchema.key]\"\n [name]=\"paramSchema.key\"\n [placeholder]=\"paramSchema.placeholder || ''\"\n (ngModelChange)=\"onParameterChange()\"\n />\n <mat-hint>{{ paramSchema.hint }}</mat-hint>\n </mat-form-field>\n\n <!-- Number Input -->\n <mat-form-field\n *ngIf=\"paramSchema.type === 'number'\"\n appearance=\"outline\"\n class=\"full-width\"\n >\n <mat-label>{{ paramSchema.label }}</mat-label>\n <input\n matInput\n type=\"number\"\n [(ngModel)]=\"currentParams[paramSchema.key]\"\n [name]=\"paramSchema.key\"\n [placeholder]=\"paramSchema.placeholder || ''\"\n (ngModelChange)=\"onParameterChange()\"\n />\n <mat-hint>{{ paramSchema.hint }}</mat-hint>\n </mat-form-field>\n\n <!-- Boolean Checkbox -->\n <div\n *ngIf=\"paramSchema.type === 'boolean'\"\n class=\"checkbox-field\"\n >\n <mat-checkbox\n [(ngModel)]=\"currentParams[paramSchema.key]\"\n [name]=\"paramSchema.key\"\n (ngModelChange)=\"onParameterChange()\"\n >\n {{ paramSchema.label }}\n </mat-checkbox>\n <div class=\"checkbox-hint\">{{ paramSchema.hint }}</div>\n </div>\n\n <!-- Select Dropdown -->\n <mat-form-field\n *ngIf=\"paramSchema.type === 'select'\"\n appearance=\"outline\"\n class=\"full-width\"\n >\n <mat-label>{{ paramSchema.label }}</mat-label>\n <mat-select\n [(ngModel)]=\"currentParams[paramSchema.key]\"\n [name]=\"paramSchema.key\"\n (ngModelChange)=\"onParameterChange()\"\n >\n <mat-option\n *ngFor=\"let option of paramSchema.options\"\n [value]=\"option.value\"\n >\n {{ option.label }}\n </mat-option>\n </mat-select>\n <mat-hint>{{ paramSchema.hint }}</mat-hint>\n </mat-form-field>\n\n <!-- Value Input - Field or Literal -->\n <div\n *ngIf=\"paramSchema.type === 'value_input'\"\n class=\"value-input-container\"\n >\n <div class=\"value-input-selector\">\n <mat-button-toggle-group\n [value]=\"getValueInputMode(paramSchema.key)\"\n (valueChange)=\"\n onValueInputModeChange(paramSchema.key, $event)\n \"\n class=\"input-mode-toggle\"\n >\n <mat-button-toggle value=\"field\">\n <mat-icon [praxisIcon]=\"'data_object'\"></mat-icon>\n Campo\n </mat-button-toggle>\n <mat-button-toggle value=\"literal\">\n <mat-icon [praxisIcon]=\"'edit'\"></mat-icon>\n Literal\n </mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <!-- Field Selection Mode -->\n <mat-form-field\n *ngIf=\"getValueInputMode(paramSchema.key) === 'field'\"\n appearance=\"outline\"\n class=\"full-width\"\n >\n <mat-label>{{ paramSchema.label }}</mat-label>\n <mat-select\n [value]=\"getValueInputValue(paramSchema.key)\"\n (valueChange)=\"\n onValueInputFieldChange(paramSchema.key, $event)\n \"\n >\n <mat-option\n *ngFor=\"let field of availableDataSchema\"\n [value]=\"field.name\"\n >\n <div class=\"field-option\">\n <mat-icon class=\"field-type-icon\">{{\n getFieldTypeIcon(field.type)\n }}</mat-icon>\n <div class=\"field-info\">\n <span class=\"field-label\">{{ field.label }}</span>\n <span class=\"field-name\">{{ field.name }}</span>\n </div>\n </div>\n </mat-option>\n </mat-select>\n <mat-hint>{{ paramSchema.hint }}</mat-hint>\n </mat-form-field>\n\n <!-- Literal Value Mode -->\n <div\n *ngIf=\"getValueInputMode(paramSchema.key) === 'literal'\"\n class=\"literal-input-container\"\n >\n <!-- String Input -->\n <mat-form-field\n *ngIf=\"\n paramSchema.valueType === 'string' ||\n paramSchema.valueType === 'any'\n \"\n appearance=\"outline\"\n class=\"full-width\"\n >\n <mat-label>{{ paramSchema.label }}</mat-label>\n <input\n matInput\n [value]=\"getValueInputValue(paramSchema.key)\"\n (input)=\"\n onValueInputLiteralChange(\n paramSchema.key,\n $any($event.target).value\n )\n \"\n [placeholder]=\"paramSchema.placeholder || ''\"\n />\n <mat-hint>{{ paramSchema.hint }}</mat-hint>\n </mat-form-field>\n\n <!-- Number Input -->\n <mat-form-field\n *ngIf=\"paramSchema.valueType === 'number'\"\n appearance=\"outline\"\n class=\"full-width\"\n >\n <mat-label>{{ paramSchema.label }}</mat-label>\n <input\n matInput\n type=\"number\"\n [value]=\"getValueInputValue(paramSchema.key)\"\n (input)=\"\n onValueInputLiteralChange(\n paramSchema.key,\n $any($event.target).value\n )\n \"\n [placeholder]=\"paramSchema.placeholder || ''\"\n />\n <mat-hint>{{ paramSchema.hint }}</mat-hint>\n </mat-form-field>\n\n <!-- Boolean Input -->\n <div\n *ngIf=\"paramSchema.valueType === 'boolean'\"\n class=\"checkbox-field\"\n >\n <mat-checkbox\n [checked]=\"getValueInputValue(paramSchema.key)\"\n (change)=\"\n onValueInputBooleanChange(paramSchema.key, $event)\n \"\n >\n {{ paramSchema.label }}\n </mat-checkbox>\n <div class=\"checkbox-hint\">{{ paramSchema.hint }}</div>\n </div>\n </div>\n </div>\n </div>\n </form>\n </mat-card-content>\n </mat-card>\n\n <!-- Generated Expression Preview -->\n <mat-card\n *ngIf=\"generatedExpressionChange\"\n class=\"expression-preview-card\"\n >\n <mat-card-header class=\"compact-header\">\n <mat-icon mat-card-avatar class=\"preview-icon\" [praxisIcon]=\"'code'\"></mat-icon>\n <mat-card-title>Expressão Gerada</mat-card-title>\n <mat-card-subtitle\n >Código JavaScript que será executado</mat-card-subtitle\n >\n </mat-card-header>\n <mat-card-content>\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Expressão JavaScript</mat-label>\n <textarea\n matInput\n [value]=\"generatedExpressionChange\"\n readonly\n rows=\"3\"\n class=\"expression-textarea\"\n >\n </textarea>\n <mat-hint\n >Esta expressão será avaliada para cada linha da tabela</mat-hint\n >\n </mat-form-field>\n </mat-card-content>\n </mat-card>\n\n <!-- Formula Testing -->\n <mat-expansion-panel *ngIf=\"generatedExpressionChange\" class=\"test-panel\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon [praxisIcon]=\"'science'\"></mat-icon>\n Testar Fórmula\n </mat-panel-title>\n <mat-panel-description>\n Teste a fórmula com dados de exemplo\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"test-content\">\n <div class=\"test-actions\">\n <button mat-raised-button color=\"primary\" (click)=\"testFormula()\">\n <mat-icon [praxisIcon]=\"'play_arrow'\"></mat-icon>\n Executar Teste\n </button>\n <button mat-button (click)=\"showSampleData = !showSampleData\">\n <mat-icon [praxisIcon]=\"'data_object'\"></mat-icon>\n {{ showSampleData ? 'Ocultar' : 'Ver' }} Dados de Teste\n </button>\n </div>\n\n <mat-divider></mat-divider>\n\n <!-- Sample Data Display -->\n <div *ngIf=\"showSampleData\" class=\"sample-data-section\">\n <h4>Dados de Exemplo:</h4>\n <pre class=\"sample-data\">{{ sampleDataJson }}</pre>\n </div>\n\n <!-- Test Result -->\n <div *ngIf=\"testResult\" class=\"test-result\">\n <h4>Resultado do Teste:</h4>\n <div *ngIf=\"testResult.success\" class=\"success-result\">\n <mat-icon class=\"result-icon success\" [praxisIcon]=\"'check_circle'\"></mat-icon>\n <span class=\"result-value\">{{\n formatTestResult(testResult.result)\n }}</span>\n </div>\n <div *ngIf=\"!testResult.success\" class=\"error-result\">\n <mat-icon class=\"result-icon error\" [praxisIcon]=\"'error'\"></mat-icon>\n <span class=\"error-message\">{{ testResult.error }}</span>\n </div>\n </div>\n\n <!-- Validation Errors -->\n <div *ngIf=\"validationErrors.length > 0\" class=\"validation-errors\">\n <h4>Erros de Validação:</h4>\n <mat-chip-set>\n <mat-chip\n *ngFor=\"let error of validationErrors\"\n class=\"error-chip\"\n >\n <mat-icon matChipAvatar [praxisIcon]=\"'error'\"></mat-icon>\n {{ error }}\n </mat-chip>\n </mat-chip-set>\n </div>\n </div>\n </mat-expansion-panel>\n </div>\n `,\n styles: [\n `\n :host { --vfb-primary: var(--mat-sys-primary, var(--md-sys-color-primary, var(--sicoob-primary-default))); --vfb-primary-container: var(--mat-sys-primary-container, color-mix(in srgb, var(--vfb-primary), transparent 85%)); --vfb-on-primary-container: var(--mat-sys-on-primary-container, #000); --vfb-surface-container-low: var(--mat-sys-surface-container-low, var(--md-sys-color-surface-container-low, var(--sicoob-bg-elev-1))); --vfb-surface-container: var(--mat-sys-surface-container, var(--md-sys-color-surface, var(--sicoob-bg-elev-1))); --vfb-outline: var(--mat-sys-outline, var(--md-sys-color-outline, var(--sicoob-stroke-medium))); --vfb-on-surface-variant: var(--mat-sys-on-surface-variant, color-mix(in srgb, var(--sicoob-text-high), transparent 40%)); --vfb-error: var(--mat-sys-error, var(--md-sys-color-error, var(--sicoob-error-default))); --vfb-error-container: var(--mat-sys-error-container, color-mix(in srgb, var(--vfb-error), transparent 85%)); --vfb-on-error-container: var(--mat-sys-on-error-container, var(--vfb-error)); }\n .visual-formula-builder {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .formula-type-card,\n .parameters-card,\n .expression-preview-card { background-color: var(--vfb-surface-container-low); }\n\n .compact-header { padding-bottom: 8px; align-items: center; }\n .compact-header .mat-mdc-card-title { font-size: 1.1rem; margin: 0; line-height: 1.2; }\n .compact-header .mat-mdc-card-subtitle { font-size: .875rem; margin: 0; }\n .compact-header .mat-mdc-card-avatar { align-self: center; }\n\n .formula-icon,\n .params-icon,\n .preview-icon {\n background-color: color-mix(in srgb, var(--vfb-primary), transparent 68%);\n color: var(--vfb-primary);\n border-radius: 50%;\n width: 36px; height: 36px; font-size: 20px;\n display: inline-flex; align-items: center; justify-content: center;\n }\n\n .formula-type-select {\n width: 100%;\n }\n\n .formula-option {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 0;\n }\n\n .option-icon { color: var(--vfb-primary); font-size: 20px; opacity: .95; }\n\n .option-content {\n display: flex;\n flex-direction: column;\n }\n\n .option-label {\n font-weight: 500;\n font-size: 0.9rem;\n }\n\n .option-description { font-size: 0.8rem; color: var(--vfb-on-surface-variant); }\n\n .parameters-form { display:flex; flex-direction:column; gap:16px; }\n\n .parameter-field { display:flex; flex-direction:column; }\n\n .full-width {\n width: 100%;\n }\n\n .field-option {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .field-type-icon { font-size: 16px; color: var(--vfb-outline); }\n\n .field-info {\n display: flex;\n flex-direction: column;\n }\n\n .field-label {\n font-weight: 500;\n font-size: 0.9rem;\n }\n\n .field-name { font-size: 0.8rem; color: var(--vfb-on-surface-variant); font-family: monospace; }\n\n .checkbox-field {\n padding: 8px 0;\n }\n\n .checkbox-hint { font-size: 0.75rem; color: var(--vfb-on-surface-variant); margin-top: 4px; margin-left: 32px; }\n\n .expression-textarea {\n font-family:\n 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace !important;\n font-size: 13px !important;\n line-height: 1.4 !important;\n }\n\n .test-panel {\n margin-top: 8px;\n }\n\n .test-content {\n padding: 16px 0;\n }\n\n .test-actions {\n display: flex;\n gap: 12px;\n margin-bottom: 16px;\n }\n\n .sample-data-section {\n margin: 16px 0;\n }\n\n .sample-data { background-color: var(--vfb-surface-container); padding: 12px; border-radius: 4px; font-size: 12px; overflow-x: auto; }\n\n .test-result {\n margin: 16px 0;\n }\n\n .success-result,\n .error-result {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n border-radius: 4px;\n }\n\n .success-result { background-color: color-mix(in srgb, var(--vfb-primary), transparent 90%); color: var(--vfb-primary); }\n\n .error-result { background-color: color-mix(in srgb, var(--vfb-error), transparent 90%); color: var(--vfb-error); }\n\n .result-icon.success { color: var(--vfb-primary); }\n\n .result-icon.error { color: var(--vfb-error); }\n\n .result-value {\n font-weight: 500;\n font-family: monospace;\n }\n\n .validation-errors {\n margin: 16px 0;\n }\n\n .error-chip { background-color: var(--vfb-error-container); color: var(--vfb-on-error-container); }\n\n /* Value Input Styles */\n .value-input-container {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .value-input-selector {\n display: flex;\n align-items: center;\n margin-bottom: 8px;\n }\n\n .input-mode-toggle {\n font-size: 0.875rem;\n }\n\n .input-mode-toggle .mat-button-toggle {\n height: 36px;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .literal-input-container {\n width: 100%;\n }\n\n /* Responsive Design */\n @media (max-width: 768px) {\n .test-actions {\n flex-direction: column;\n }\n\n .sample-data {\n font-size: 10px;\n }\n }\n `,\n ],\n})\nexport class VisualFormulaBuilderComponent implements OnInit, OnChanges {\n @Input() availableDataSchema: FieldSchema[] = [];\n @Input() currentFormula?: FormulaDefinition;\n\n @Output() formulaChange = new EventEmitter<FormulaDefinition>();\n @Output() generatedExpressionChange = new EventEmitter<string>();\n\n // Component state\n formulaTemplates = FORMULA_TEMPLATES;\n selectedFormulaType: FormulaType = 'none';\n selectedTemplate?: FormulaTemplate;\n currentParams: any = {};\n generatedExpressionValue = '';\n validationErrors: string[] = [];\n\n // Value input tracking: maps parameter key to input mode and value\n valueInputStates: {\n [key: string]: { mode: 'field' | 'literal'; value: any };\n } = {};\n\n // Testing\n showSampleData = false;\n testResult?: { success: boolean; result?: any; error?: string };\n sampleDataJson = '';\n\n constructor(\n private formulaGenerator: FormulaGeneratorService,\n private cdr: ChangeDetectorRef,\n ) {}\n\n ngOnInit(): void {\n this.sampleDataJson = JSON.stringify(\n this.formulaGenerator.getSampleData(),\n null,\n 2,\n );\n this.initializeFromCurrentFormula();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['currentFormula'] && !changes['currentFormula'].firstChange) {\n this.initializeFromCurrentFormula();\n }\n if (changes['availableDataSchema']) {\n this.cdr.markForCheck();\n }\n }\n\n private initializeFromCurrentFormula(): void {\n if (this.currentFormula) {\n this.selectedFormulaType = this.currentFormula.type;\n this.currentParams = { ...this.currentFormula.params };\n this.updateSelectedTemplate();\n this.generateAndEmitExpression();\n }\n }\n\n onFormulaTypeChange(formulaType: FormulaType): void {\n this.selectedFormulaType = formulaType;\n this.currentParams = {};\n this.updateSelectedTemplate();\n this.generateAndEmitExpression();\n }\n\n private updateSelectedTemplate(): void {\n this.selectedTemplate = this.formulaTemplates.find(\n (t) => t.type === this.selectedFormulaType,\n );\n this.initializeValueInputStates();\n this.cdr.markForCheck();\n }\n\n onParameterChange(): void {\n this.generateAndEmitExpression();\n }\n\n private generateAndEmitExpression(): void {\n const formula: FormulaDefinition = {\n type: this.selectedFormulaType,\n params: { ...this.currentParams },\n };\n\n // Validate formula\n const validation = this.formulaGenerator.validateFormula(formula);\n this.validationErrors = validation.errors;\n\n // Generate expression\n this.generatedExpressionValue = validation.valid\n ? this.formulaGenerator.generateExpression(formula)\n : '';\n\n // Emit changes\n this.formulaChange.emit(formula);\n this.generatedExpressionChange.emit(this.generatedExpressionValue);\n\n this.cdr.markForCheck();\n }\n\n get generatedExpression(): string {\n return this.generatedExpressionValue;\n }\n\n isMultiSelectField(paramKey: string): boolean {\n return paramKey === 'fields'; // Only 'fields' parameter supports multiple selection\n }\n\n getFieldTypeIcon(fieldType: string): string {\n switch (fieldType) {\n case 'string':\n return 'text_fields';\n case 'number':\n return 'numbers';\n case 'boolean':\n return 'toggle_on';\n case 'date':\n return 'calendar_today';\n case 'object':\n return 'data_object';\n case 'array':\n return 'data_array';\n default:\n return 'help';\n }\n }\n\n testFormula(): void {\n if (!this.generatedExpressionValue) {\n return;\n }\n\n const formula: FormulaDefinition = {\n type: this.selectedFormulaType,\n params: { ...this.currentParams },\n };\n\n this.testResult = this.formulaGenerator.testFormula(formula);\n this.cdr.markForCheck();\n }\n\n formatTestResult(result: any): string {\n if (result === null || result === undefined) {\n return 'null';\n }\n if (typeof result === 'string') {\n return `\"${result}\"`;\n }\n return String(result);\n }\n\n // Value Input Management Methods\n getValueInputMode(paramKey: string): 'field' | 'literal' {\n return this.valueInputStates[paramKey]?.mode || 'field';\n }\n\n getValueInputValue(paramKey: string): any {\n return this.valueInputStates[paramKey]?.value || '';\n }\n\n onValueInputModeChange(paramKey: string, mode: 'field' | 'literal'): void {\n if (!this.valueInputStates[paramKey]) {\n this.valueInputStates[paramKey] = { mode, value: '' };\n } else {\n this.valueInputStates[paramKey].mode = mode;\n // Reset value when switching modes\n this.valueInputStates[paramKey].value = mode === 'field' ? '' : '';\n }\n\n // Update the actual parameter value\n this.updateParameterFromValueInput(paramKey);\n }\n\n onValueInputFieldChange(paramKey: string, fieldName: string): void {\n if (!this.valueInputStates[paramKey]) {\n this.valueInputStates[paramKey] = { mode: 'field', value: fieldName };\n } else {\n this.valueInputStates[paramKey].value = fieldName;\n }\n\n this.updateParameterFromValueInput(paramKey);\n }\n\n onValueInputLiteralChange(paramKey: string, value: string): void {\n const parsed =\n !isNaN(Number(value)) && value.trim() !== '' ? Number(value) : value;\n\n if (!this.valueInputStates[paramKey]) {\n this.valueInputStates[paramKey] = { mode: 'literal', value: parsed };\n } else {\n this.valueInputStates[paramKey].value = parsed;\n }\n\n this.updateParameterFromValueInput(paramKey);\n }\n\n onValueInputBooleanChange(paramKey: string, change: MatCheckboxChange): void {\n if (!this.valueInputStates[paramKey]) {\n this.valueInputStates[paramKey] = {\n mode: 'literal',\n value: change.checked,\n };\n } else {\n this.valueInputStates[paramKey].value = change.checked;\n }\n\n this.updateParameterFromValueInput(paramKey);\n }\n\n private updateParameterFromValueInput(paramKey: string): void {\n const state = this.valueInputStates[paramKey];\n if (state) {\n // Store the value directly - the formula generator will handle field vs literal detection\n this.currentParams[paramKey] = state.value;\n this.generateAndEmitExpression();\n }\n }\n\n private initializeValueInputStates(): void {\n if (!this.selectedTemplate) return;\n\n // Initialize value input states for value_input parameters\n this.selectedTemplate.parameterSchema.forEach((schema) => {\n if (schema.type === 'value_input') {\n const currentValue = this.currentParams[schema.key];\n\n if (currentValue !== undefined) {\n // Try to determine if it's a field name or literal value\n const isFieldName = this.availableDataSchema.some(\n (field) => field.name === currentValue,\n );\n\n this.valueInputStates[schema.key] = {\n mode: isFieldName ? 'field' : 'literal',\n value: currentValue,\n };\n } else {\n // Default to field mode\n this.valueInputStates[schema.key] = {\n mode: 'field',\n value: '',\n };\n }\n }\n });\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnChanges,\n SimpleChanges,\n ChangeDetectorRef,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTableModule, MatTableDataSource } from '@angular/material/table';\nimport { MatCheckboxModule, MatCheckboxChange } from '@angular/material/checkbox';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\n\nexport interface ValueMappingPair {\n key: string | number | boolean;\n value: string;\n keyInput: string; // For UI binding\n hasError?: boolean;\n errorMessage?: string;\n}\n\n@Component({\n selector: 'value-mapping-editor',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n FormsModule,\n MatButtonModule,\n MatIconModule,\n MatFormFieldModule,\n MatInputModule,\n MatTableModule,\n MatCheckboxModule,\n MatTooltipModule,\n MatExpansionModule,\n MatDialogModule,\n MatSnackBarModule\n ],\n template: `\n <div class=\"value-mapping-editor\">\n <!-- Header with Import/Export Actions -->\n <div class=\"mapping-toolbar\">\n <div class=\"toolbar-title\">\n <mat-icon class=\"title-icon\">swap_horiz</mat-icon>\n <h4>Mapeamento de Valores</h4>\n @if (mappingPairs.length > 0) {\n <span class=\"mapping-count\">\n ({{ mappingPairs.length }} {{ mappingPairs.length === 1 ? 'definido' : 'definidos' }})\n </span>\n }\n </div>\n\n <div class=\"toolbar-actions\">\n <button mat-stroked-button (click)=\"showImportDialog = true\"\n matTooltip=\"Importar mapeamentos de um arquivo JSON\">\n <mat-icon>upload_file</mat-icon>\n Importar JSON\n </button>\n <button mat-stroked-button (click)=\"exportToJson()\"\n [disabled]=\"mappingPairs.length === 0\"\n matTooltip=\"Exportar mapeamentos para um arquivo JSON\">\n <mat-icon>download</mat-icon>\n Exportar JSON\n </button>\n </div>\n </div>\n\n <!-- Mappings Table -->\n <div class=\"mappings-container\">\n <table mat-table [dataSource]=\"dataSource\" class=\"mappings-table\">\n\n <!-- Key Column -->\n <ng-container matColumnDef=\"key\">\n <th mat-header-cell *matHeaderCellDef>{{ labelKey }}</th>\n <td mat-cell *matCellDef=\"let pair; let i = index\" class=\"key-cell\">\n\n <!-- Text/Number Input -->\n @if (keyInputType !== 'boolean') {\n <mat-form-field appearance=\"outline\" class=\"key-input\">\n <input matInput\n [(ngModel)]=\"pair.keyInput\"\n [type]=\"keyInputType === 'number' ? 'number' : 'text'\"\n [placeholder]=\"getKeyPlaceholder()\"\n (ngModelChange)=\"onKeyChange(i, $event)\"\n [class.error-input]=\"pair.hasError\">\n @if (pair.hasError) {\n <mat-error>{{ pair.errorMessage }}</mat-error>\n }\n </mat-form-field>\n }\n\n <!-- Boolean Checkbox -->\n @if (keyInputType === 'boolean') {\n <div class=\"boolean-key-container\">\n <mat-checkbox\n [checked]=\"isKeyTruthy(pair)\"\n (change)=\"onBooleanKeyChange(i, $event)\">\n {{ pair.key === true || pair.keyInput === 'true' ? 'Verdadeiro' : 'Falso' }}\n </mat-checkbox>\n </div>\n }\n </td>\n </ng-container>\n\n <!-- Value Column -->\n <ng-container matColumnDef=\"value\">\n <th mat-header-cell *matHeaderCellDef>{{ labelValue }}</th>\n <td mat-cell *matCellDef=\"let pair; let i = index\" class=\"value-cell\">\n <mat-form-field appearance=\"outline\" class=\"value-input\">\n <input matInput\n [(ngModel)]=\"pair.value\"\n placeholder=\"Digite o texto de exibição\"\n (ngModelChange)=\"onValueChange(i, $event)\">\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef class=\"actions-header\">Ações</th>\n <td mat-cell *matCellDef=\"let pair; let i = index\" class=\"actions-cell\">\n <button mat-icon-button color=\"warn\"\n (click)=\"removePair(i)\"\n matTooltip=\"Remover mapeamento\">\n <mat-icon>delete</mat-icon>\n </button>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n <!-- Empty State -->\n @if (mappingPairs.length === 0) {\n <div class=\"empty-state\">\n <mat-icon class=\"empty-icon\">swap_horiz</mat-icon>\n <h4>Nenhum mapeamento definido</h4>\n <p>Adicione mapeamentos para converter valores brutos em texto amigável</p>\n </div>\n }\n </div>\n\n <!-- Add New Mapping Button -->\n <div class=\"add-mapping-section\">\n <button mat-raised-button color=\"primary\"\n (click)=\"addNewPair()\"\n class=\"add-mapping-button\">\n <mat-icon>add_circle_outline</mat-icon>\n Adicionar Mapeamento\n </button>\n </div>\n\n <!-- Import Dialog -->\n @if (showImportDialog) {\n <mat-expansion-panel class=\"import-panel\" [expanded]=\"true\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon>upload_file</mat-icon>\n Importar JSON\n </mat-panel-title>\n <mat-panel-description>\n Cole ou digite o JSON dos mapeamentos\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"import-content\">\n <mat-form-field appearance=\"outline\" class=\"json-input\">\n <mat-label>JSON dos Mapeamentos</mat-label>\n <textarea matInput\n [(ngModel)]=\"importJsonText\"\n rows=\"8\"\n placeholder='{\"1\": \"Ativo\", \"0\": \"Inativo\"}'\n class=\"json-textarea\"></textarea>\n <mat-hint>Cole um objeto JSON com pares chave-valor</mat-hint>\n </mat-form-field>\n\n <div class=\"import-actions\">\n <button mat-button (click)=\"cancelImport()\">\n Cancelar\n </button>\n <button mat-raised-button color=\"primary\"\n (click)=\"importFromJson()\"\n [disabled]=\"!importJsonText\">\n <mat-icon>check</mat-icon>\n Importar\n </button>\n </div>\n\n @if (importError) {\n <div class=\"import-error\">\n <mat-icon>error</mat-icon>\n {{ importError }}\n </div>\n }\n </div>\n </mat-expansion-panel>\n }\n </div>\n `,\n styles: [`\n :host {\n /* Bridge tokens to respect host app theme (Material/Sicoob) */\n --vme-primary: var(--mat-sys-primary, var(--md-sys-color-primary, var(--sicoob-primary-default)));\n --vme-surface: var(--mat-sys-surface, var(--md-sys-color-surface, var(--sicoob-bg-elev-1)));\n --vme-surface-container: var(--mat-sys-surface-container, var(--sicoob-bg-elev-2));\n --vme-on-surface: var(--mat-sys-on-surface, var(--sicoob-text-high));\n --vme-on-surface-variant: var(--mat-sys-on-surface-variant, color-mix(in srgb, var(--sicoob-text-high), transparent 40%));\n --vme-outline-variant: var(--mat-sys-outline-variant, var(--sicoob-stroke-medium));\n --vme-error: var(--mat-sys-error, var(--sicoob-error-default));\n --vme-error-container: var(--mat-sys-error-container, color-mix(in srgb, var(--sicoob-error-default), transparent 85%));\n --vme-on-error-container: var(--mat-sys-on-error-container, var(--sicoob-error-default));\n }\n .value-mapping-editor {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .mapping-toolbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 0;\n border-bottom: 1px solid var(--vme-outline-variant);\n }\n\n .toolbar-title {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .title-icon { color: var(--vme-primary); }\n\n .toolbar-title h4 {\n margin: 0;\n font-size: 1rem;\n font-weight: 500;\n }\n\n .mapping-count { color: var(--vme-on-surface-variant); font-size: 0.875rem; }\n\n .toolbar-actions {\n display: flex;\n gap: 8px;\n }\n\n /* Theming for disabled export button (outlined) in dark/light */\n .toolbar-actions .mat-mdc-outlined-button.mdc-button--disabled {\n color: color-mix(in srgb, var(--vme-on-surface), transparent 40%);\n border-color: color-mix(in srgb, var(--vme-outline-variant), transparent 20%);\n background: color-mix(in srgb, var(--vme-surface-container), transparent 85%);\n }\n .toolbar-actions .mat-mdc-outlined-button.mdc-button--disabled .mat-icon {\n color: color-mix(in srgb, var(--vme-on-surface), transparent 55%);\n }\n\n .mappings-container { min-height: 200px; border: 1px solid var(--vme-outline-variant); border-radius: 8px; overflow: hidden; background: var(--vme-surface); }\n\n .mappings-table { width: 100%; }\n .mappings-table .mat-mdc-header-row { background: var(--vme-surface-container); }\n .mappings-table .mat-mdc-header-cell { color: var(--vme-on-surface); font-weight: 600; border-bottom-color: var(--vme-outline-variant); }\n\n .key-cell,\n .value-cell {\n padding: 8px 12px;\n }\n\n .key-input,\n .value-input {\n width: 100%;\n }\n\n .key-input .mat-mdc-form-field-infix,\n .value-input .mat-mdc-form-field-infix {\n min-height: 40px;\n }\n\n .boolean-key-container {\n display: flex;\n align-items: center;\n min-height: 40px;\n }\n\n .error-input { border-color: var(--vme-error) !important; }\n\n .actions-header {\n width: 80px;\n text-align: center;\n }\n\n .actions-cell {\n text-align: center;\n padding: 8px;\n }\n\n .empty-state { display:flex; flex-direction:column; align-items:center; justify-content:center; padding:48px 24px; text-align:center; color: var(--vme-on-surface-variant); }\n\n .empty-icon {\n font-size: 48px;\n width: 48px;\n height: 48px;\n margin-bottom: 16px;\n opacity: 0.5;\n }\n\n .empty-state h4 {\n margin: 0 0 8px 0;\n font-weight: 500;\n }\n\n .empty-state p {\n margin: 0;\n font-size: 0.875rem;\n }\n\n .add-mapping-section {\n display: flex;\n justify-content: center;\n padding: 16px 0;\n }\n\n .add-mapping-button {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .import-panel {\n margin-top: 16px;\n }\n\n .import-content {\n padding: 16px 0;\n }\n\n .json-input {\n width: 100%;\n margin-bottom: 16px;\n }\n\n .json-textarea {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace !important;\n font-size: 13px !important;\n line-height: 1.4 !important;\n }\n\n .import-actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n }\n\n .import-error { display:flex; align-items:center; gap:8px; margin-top:16px; padding:12px; background-color: var(--vme-error-container); color: var(--vme-on-error-container); border-radius:4px; font-size:.875rem; }\n\n /* Responsive Design */\n @media (max-width: 768px) {\n .mapping-toolbar {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n\n .toolbar-actions {\n justify-content: center;\n }\n\n .mappings-table {\n font-size: 0.875rem;\n }\n\n .key-input,\n .value-input {\n font-size: 0.875rem;\n }\n }\n `]\n})\nexport class ValueMappingEditorComponent implements OnInit, OnChanges {\n\n @Input() currentMapping: { [key: string | number]: string } = {};\n @Input() keyInputType: 'text' | 'number' | 'boolean' = 'text';\n @Input() labelKey: string = 'Valor Original';\n @Input() labelValue: string = 'Valor Exibido';\n\n @Output() mappingChange = new EventEmitter<{ [key: string | number]: string }>();\n\n // Component state\n mappingPairs: ValueMappingPair[] = [];\n dataSource = new MatTableDataSource<ValueMappingPair>([]);\n displayedColumns = ['key', 'value', 'actions'];\n\n // Import/Export state\n showImportDialog = false;\n importJsonText = '';\n importError = '';\n\n constructor(\n private cdr: ChangeDetectorRef,\n private dialog: MatDialog,\n private snackBar: MatSnackBar\n ) {}\n\n ngOnInit(): void {\n this.initializeMappingPairs();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['currentMapping']) {\n this.initializeMappingPairs();\n }\n }\n\n\n private initializeMappingPairs(): void {\n this.mappingPairs = Object.entries(this.currentMapping || {}).map(([key, value]) => ({\n key: this.parseKeyByType(key),\n value: value,\n keyInput: String(key)\n }));\n this.updateDataSource();\n }\n\n private updateDataSource(): void {\n console.log('🔄 updateDataSource() - Atualizando MatTable DataSource:', {\n newDataLength: this.mappingPairs.length,\n newData: [...this.mappingPairs]\n });\n \n this.dataSource.data = [...this.mappingPairs];\n \n // 🔍 LOG: Verificar estado após atualização do DataSource\n console.log('🔍 Estado após update do DataSource:', {\n mappingPairsLength: this.mappingPairs.length,\n dataSourceLength: this.dataSource.data.length,\n shouldShowEmptyState: this.mappingPairs.length === 0,\n shouldShowTable: this.mappingPairs.length > 0\n });\n \n this.cdr.markForCheck();\n \n // 🔍 LOG: Forçar detecção adicional após markForCheck\n setTimeout(() => {\n console.log('🎯 Estado após ChangeDetection (async):', {\n mappingPairsLength: this.mappingPairs.length,\n dataSourceLength: this.dataSource.data.length,\n DOMShouldUpdate: true\n });\n }, 10);\n \n console.log('✅ DataSource atualizado - Tabela será re-renderizada');\n }\n\n private parseKeyByType(key: string): string | number | boolean {\n switch (this.keyInputType) {\n case 'number':\n const num = parseFloat(key);\n return isNaN(num) ? key : num;\n case 'boolean':\n return key.toLowerCase() === 'true';\n default:\n return key;\n }\n }\n\n isKeyTruthy(pair: ValueMappingPair): boolean {\n return pair.key === true || pair.keyInput === 'true';\n }\n\n\n getKeyPlaceholder(): string {\n switch (this.keyInputType) {\n case 'number':\n return 'Ex: 1, 2, 3';\n case 'text':\n return 'Ex: ACTIVE, PENDING';\n default:\n return 'Digite o valor';\n }\n }\n\n addNewPair(): void {\n const newPair: ValueMappingPair = {\n key: this.keyInputType === 'boolean' ? false : (this.keyInputType === 'number' ? 0 : ''),\n value: '',\n keyInput: this.keyInputType === 'boolean' ? 'false' : (this.keyInputType === 'number' ? '0' : '')\n };\n\n this.mappingPairs.push(newPair);\n this.updateDataSource();\n this.validateAndEmitMapping();\n }\n\n\n removePair(index: number): void {\n if (index >= 0 && index < this.mappingPairs.length) {\n this.mappingPairs.splice(index, 1);\n this.updateDataSource();\n this.validateAndEmitMapping();\n }\n }\n\n onKeyChange(index: number, value: string): void {\n if (index >= 0 && index < this.mappingPairs.length) {\n this.mappingPairs[index].keyInput = value;\n this.mappingPairs[index].key = this.parseKeyByType(value);\n this.validateAndEmitMapping();\n }\n }\n\n onBooleanKeyChange(index: number, change: MatCheckboxChange): void {\n if (index >= 0 && index < this.mappingPairs.length) {\n this.mappingPairs[index].key = change.checked;\n this.mappingPairs[index].keyInput = String(change.checked);\n this.validateAndEmitMapping();\n }\n }\n\n onValueChange(index: number, value: string): void {\n if (index >= 0 && index < this.mappingPairs.length) {\n this.mappingPairs[index].value = value;\n this.validateAndEmitMapping();\n }\n }\n\n private validateAndEmitMapping(): void {\n // Clear previous errors\n this.mappingPairs.forEach(pair => {\n pair.hasError = false;\n pair.errorMessage = '';\n });\n\n // Validate for duplicate keys\n const keyMap = new Map<string, number[]>();\n this.mappingPairs.forEach((pair, index) => {\n const keyStr = String(pair.key);\n if (!keyMap.has(keyStr)) {\n keyMap.set(keyStr, []);\n }\n keyMap.get(keyStr)!.push(index);\n });\n\n // Mark duplicates\n let hasErrors = false;\n keyMap.forEach((indices, key) => {\n if (indices.length > 1) {\n indices.forEach(index => {\n this.mappingPairs[index].hasError = true;\n this.mappingPairs[index].errorMessage = 'Chave duplicada';\n hasErrors = true;\n });\n }\n });\n\n // Validate empty keys/values\n this.mappingPairs.forEach(pair => {\n if (!pair.hasError) {\n if (pair.keyInput.trim() === '' || pair.value.trim() === '') {\n pair.hasError = true;\n pair.errorMessage = 'Campo obrigatório';\n hasErrors = true;\n }\n }\n });\n\n // Emit mapping if no errors\n if (!hasErrors) {\n const mapping: { [key: string | number]: string } = {};\n this.mappingPairs.forEach(pair => {\n if (pair.keyInput.trim() !== '' && pair.value.trim() !== '') {\n mapping[String(pair.key)] = pair.value;\n }\n });\n \n this.mappingChange.emit(mapping);\n }\n\n // Update the visual state to show validation errors\n this.cdr.markForCheck();\n }\n\n // Import/Export functionality\n exportToJson(): void {\n const mapping = this.currentMapping || {};\n const jsonString = JSON.stringify(mapping, null, 2);\n\n const blob = new Blob([jsonString], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n\n const a = document.createElement('a');\n a.href = url;\n a.download = 'value-mapping.json';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n\n this.snackBar.open('Mapeamento exportado com sucesso', 'Fechar', {\n duration: 3000\n });\n }\n\n importFromJson(): void {\n this.importError = '';\n\n try {\n const parsed = JSON.parse(this.importJsonText);\n\n // Validate structure\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new Error('JSON deve ser um objeto');\n }\n\n // Validate key-value pairs\n for (const [key, value] of Object.entries(parsed)) {\n if (typeof value !== 'string') {\n throw new Error(`Valor para chave \"${key}\" deve ser uma string`);\n }\n }\n\n // Update mapping\n this.currentMapping = parsed;\n this.initializeMappingPairs();\n this.mappingChange.emit(this.currentMapping);\n\n this.cancelImport();\n this.snackBar.open('Mapeamento importado com sucesso', 'Fechar', {\n duration: 3000\n });\n\n } catch (error) {\n this.importError = error instanceof Error ? error.message : 'Erro ao importar JSON';\n this.cdr.markForCheck();\n }\n }\n\n cancelImport(): void {\n this.showImportDialog = false;\n this.importJsonText = '';\n this.importError = '';\n this.cdr.markForCheck();\n }\n}\n","// Types and interfaces for the Data Formatter component\n\nexport type ColumnDataType = \n | 'date' \n | 'number' \n | 'currency' \n | 'percentage' \n | 'string' \n | 'boolean'\n | 'custom';\n\n// Base interface for all formatter options\nexport interface FormatterConfig {\n type: ColumnDataType;\n options: any;\n}\n\n// Date formatting options\nexport interface DateFormatterOptions {\n preset?: string; // 'short' | 'medium' | 'long' | 'full' | 'shortDate' | 'mediumDate' | 'longDate' | 'fullDate' | 'shortTime' | 'mediumTime' | 'longTime' | 'fullTime' | 'short' | 'custom'\n customFormat?: string; // For custom Angular DatePipe patterns like 'dd/MM/yyyy HH:mm:ss'\n}\n\n// Number formatting options\nexport interface NumberFormatterOptions {\n decimalPlaces?: 'fixed' | 'variable'; // Fixed or variable decimal places\n fixedDecimals?: number; // 0, 1, 2, 3, etc.\n minDecimals?: number; // For variable: minimum decimals\n maxDecimals?: number; // For variable: maximum decimals\n thousandsSeparator?: boolean; // Show thousands separator\n signDisplay?: 'auto' | 'always' | 'never' | 'exceptZero'; // Sign display preference\n}\n\n// Currency formatting options\nexport interface CurrencyFormatterOptions {\n currencyCode?: string; // 'BRL', 'USD', 'EUR', etc.\n currencySymbol?: string; // 'R$', '$', '€', etc.\n symbolPosition?: 'before' | 'after'; // Symbol position\n symbolSpacing?: boolean; // Space between symbol and value\n decimalPlaces?: number; // Number of decimal places\n thousandsSeparator?: boolean; // Show thousands separator\n}\n\n// Percentage formatting options\nexport interface PercentageFormatterOptions {\n decimalPlaces?: number; // Number of decimal places\n showSymbol?: boolean; // Display % symbol\n multiplier?: boolean; // Multiply by 100 (true for 0.1234 -> 12.34%, false for 12.34 -> 12.34%)\n}\n\n// String formatting options\nexport interface StringFormatterOptions {\n transform?: 'none' | 'uppercase' | 'lowercase' | 'titlecase' | 'capitalize';\n truncate?: boolean; // Enable text truncation\n maxLength?: number; // Maximum text length\n truncateSuffix?: string; // Suffix for truncated text (e.g., '...')\n}\n\n// Boolean formatting options\nexport interface BooleanFormatterOptions {\n display?: 'true-false' | 'yes-no' | 'active-inactive' | 'on-off' | 'enabled-disabled' | 'custom';\n trueValue?: string; // Custom true display text\n falseValue?: string; // Custom false display text\n}\n\n// Predefined format presets for common use cases\nexport interface FormatPreset {\n label: string;\n description: string;\n value: string; // The format string that will be stored\n example: string; // Example of formatted output\n}\n\n// Date format presets\nexport const DATE_PRESETS: FormatPreset[] = [\n {\n label: 'Data Curta',\n description: 'Formato curto (01/01/2023)',\n value: 'shortDate',\n example: '01/12/2023'\n },\n {\n label: 'Data Média',\n description: 'Formato médio (01 Jan 2023)',\n value: 'mediumDate',\n example: '01 dez 2023'\n },\n {\n label: 'Data Completa',\n description: 'Formato completo (01 de Janeiro de 2023)',\n value: 'longDate',\n example: '01 de dezembro de 2023'\n },\n {\n label: 'Data Extensa',\n description: 'Formato extenso com dia da semana',\n value: 'fullDate',\n example: 'sexta-feira, 01 de dezembro de 2023'\n },\n {\n label: 'Apenas Mês/Ano',\n description: 'Apenas mês e ano (Dez/2023)',\n value: 'MMM/yyyy',\n example: 'dez/2023'\n },\n {\n label: 'Hora Curta',\n description: 'Apenas hora (14:30)',\n value: 'shortTime',\n example: '14:30'\n },\n {\n label: 'Data e Hora',\n description: 'Data e hora completas',\n value: 'short',\n example: '01/12/2023 14:30'\n },\n {\n label: 'ISO 8601',\n description: 'Formato internacional',\n value: 'yyyy-MM-dd',\n example: '2023-12-01'\n }\n];\n\n// Number format presets\nexport const NUMBER_PRESETS: FormatPreset[] = [\n {\n label: 'Número Inteiro',\n description: 'Sem casas decimais',\n value: '1.0-0',\n example: '1.234'\n },\n {\n label: '1 Casa Decimal',\n description: 'Uma casa decimal fixa',\n value: '1.1-1',\n example: '1.234,5'\n },\n {\n label: '2 Casas Decimais',\n description: 'Duas casas decimais fixas',\n value: '1.2-2',\n example: '1.234,56'\n },\n {\n label: 'Até 3 Decimais',\n description: 'Até três casas decimais variáveis',\n value: '1.0-3',\n example: '1.234,567'\n },\n {\n label: 'Sem Separador',\n description: 'Número simples sem formatação',\n value: '1.0-0|nosep',\n example: '1234'\n }\n];\n\n// Currency presets\nexport const CURRENCY_PRESETS: FormatPreset[] = [\n {\n label: 'Real Brasileiro (R$)',\n description: 'Moeda brasileira',\n value: 'BRL|symbol|2',\n example: 'R$ 1.234,56'\n },\n {\n label: 'Dólar Americano (US$)',\n description: 'Moeda americana',\n value: 'USD|symbol|2',\n example: 'US$ 1,234.56'\n },\n {\n label: 'Euro (€)',\n description: 'Moeda europeia',\n value: 'EUR|symbol|2',\n example: '€ 1.234,56'\n },\n {\n label: 'Apenas Código',\n description: 'Mostrar apenas código da moeda',\n value: 'BRL|code|2',\n example: '1.234,56 BRL'\n }\n];\n\n// Percentage presets\nexport const PERCENTAGE_PRESETS: FormatPreset[] = [\n {\n label: 'Percentual Simples',\n description: 'Sem casas decimais',\n value: '1.0-0',\n example: '12%'\n },\n {\n label: '1 Casa Decimal',\n description: 'Uma casa decimal',\n value: '1.1-1',\n example: '12,3%'\n },\n {\n label: '2 Casas Decimais',\n description: 'Duas casas decimais',\n value: '1.2-2',\n example: '12,34%'\n }\n];\n\n// String transform presets\nexport const STRING_PRESETS: FormatPreset[] = [\n {\n label: 'Normal',\n description: 'Sem transformação',\n value: 'none',\n example: 'Texto Normal'\n },\n {\n label: 'MAIÚSCULAS',\n description: 'Todas em maiúsculas',\n value: 'uppercase',\n example: 'TEXTO NORMAL'\n },\n {\n label: 'minúsculas',\n description: 'Todas em minúsculas',\n value: 'lowercase',\n example: 'texto normal'\n },\n {\n label: 'Capitalizar',\n description: 'Primeira letra de cada palavra',\n value: 'titlecase',\n example: 'Texto Normal'\n },\n {\n label: 'Primeira Maiúscula',\n description: 'Apenas a primeira letra',\n value: 'capitalize',\n example: 'Texto normal'\n }\n];\n\n// Boolean display presets\nexport const BOOLEAN_PRESETS: FormatPreset[] = [\n {\n label: 'Verdadeiro / Falso',\n description: 'Exibição padrão',\n value: 'true-false',\n example: 'Verdadeiro / Falso'\n },\n {\n label: 'Sim / Não',\n description: 'Formato pergunta',\n value: 'yes-no',\n example: 'Sim / Não'\n },\n {\n label: 'Ativo / Inativo',\n description: 'Formato status',\n value: 'active-inactive',\n example: 'Ativo / Inativo'\n },\n {\n label: 'Ligado / Desligado',\n description: 'Formato switch',\n value: 'on-off',\n example: 'Ligado / Desligado'\n },\n {\n label: 'Habilitado / Desabilitado',\n description: 'Formato permissão',\n value: 'enabled-disabled',\n example: 'Habilitado / Desabilitado'\n }\n];","import { Inject, Injectable, LOCALE_ID } from '@angular/core';\nimport {\n DatePipe,\n DecimalPipe,\n CurrencyPipe,\n PercentPipe,\n UpperCasePipe,\n LowerCasePipe,\n TitleCasePipe,\n} from '@angular/common';\nimport { ColumnDataType } from './data-formatter-types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DataFormattingService {\n private groupSeparator: string;\n private decimalSeparator: string;\n\n constructor(\n private datePipe: DatePipe,\n private decimalPipe: DecimalPipe,\n private currencyPipe: CurrencyPipe,\n private percentPipe: PercentPipe,\n private upperCasePipe: UpperCasePipe,\n private lowerCasePipe: LowerCasePipe,\n private titleCasePipe: TitleCasePipe,\n @Inject(LOCALE_ID) private locale: string,\n ) {\n const parts = new Intl.NumberFormat(this.locale).formatToParts(12345.6);\n this.groupSeparator = parts.find((p) => p.type === 'group')?.value || ',';\n this.decimalSeparator =\n parts.find((p) => p.type === 'decimal')?.value || '.';\n }\n\n /**\n * Apply formatting to a value based on column type and format string\n */\n formatValue(\n value: any,\n columnType: ColumnDataType,\n formatString: string,\n ): any {\n if (value === null || value === undefined) {\n return value;\n }\n\n try {\n // Coerce value to expected type\n const coercedValue = this.coerceValueToType(value, columnType);\n\n // Apply formatting based on column type\n switch (columnType) {\n case 'date':\n return this.formatDate(coercedValue, formatString);\n case 'number':\n return this.formatNumber(coercedValue, formatString);\n case 'currency':\n return this.formatCurrency(coercedValue, formatString);\n case 'percentage':\n return this.formatPercentage(coercedValue, formatString);\n case 'string':\n return this.formatString(coercedValue, formatString);\n case 'boolean':\n return this.formatBoolean(coercedValue, formatString);\n default:\n return value;\n }\n } catch (error) {\n console.warn(\n `Error formatting value ${value} with type ${columnType} and format ${formatString}:`,\n error,\n );\n return value; // Return original value on error\n }\n }\n\n /**\n * Coerce value to the expected type for formatting\n */\n private coerceValueToType(value: any, columnType: ColumnDataType): any {\n switch (columnType) {\n case 'date':\n if (value instanceof Date) return value;\n if (typeof value === 'string' || typeof value === 'number') {\n let date = new Date(value);\n if (typeof value === 'string' && isNaN(date.getTime())) {\n const parts = value.split(',');\n if (parts.length === 3) {\n const [year, month, day] = parts.map(Number);\n date = new Date(year, month - 1, day);\n }\n }\n return isNaN(date.getTime()) ? null : date;\n }\n if (Array.isArray(value)) {\n const [\n year,\n month = 1,\n day = 1,\n hour = 0,\n minute = 0,\n second = 0,\n millisecond = 0,\n ] = value;\n const date = new Date(\n Number(year),\n Number(month) - 1,\n Number(day),\n Number(hour),\n Number(minute),\n Number(second),\n Number(millisecond),\n );\n return isNaN(date.getTime()) ? null : date;\n }\n return null;\n\n case 'number':\n case 'currency':\n case 'percentage':\n if (typeof value === 'number') return value;\n if (typeof value === 'string') {\n const normalized = value\n .replace(new RegExp(`\\\\${this.groupSeparator}`, 'g'), '')\n .replace(this.decimalSeparator, '.');\n const num = parseFloat(normalized);\n return isNaN(num) ? 0 : num;\n }\n return 0;\n\n case 'boolean':\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') {\n return value.toLowerCase() === 'true' || value === '1';\n }\n if (typeof value === 'number') {\n return value !== 0;\n }\n return Boolean(value);\n\n case 'string':\n return String(value);\n\n default:\n return value;\n }\n }\n\n /**\n * Format date values\n */\n private formatDate(value: Date | null, formatString: string): string {\n if (!value) return '';\n\n // Handle custom formats and presets\n try {\n return this.datePipe.transform(value, formatString) || '';\n } catch {\n return this.datePipe.transform(value, 'shortDate') || '';\n }\n }\n\n /**\n * Format number values\n */\n private formatNumber(value: number, formatString: string): string {\n if (formatString.includes('|nosep')) {\n // No thousands separator\n const format = formatString.replace('|nosep', '');\n const formatted =\n this.decimalPipe.transform(value, format, this.locale) ||\n value.toString();\n return this.removeGrouping(formatted);\n }\n\n return (\n this.decimalPipe.transform(value, formatString, this.locale) ||\n value.toString()\n );\n }\n\n /**\n * Format currency values\n */\n private formatCurrency(value: number, formatString: string): string {\n // Parse format: \"BRL|symbol|2\" or \"USD|code|2\"\n const parts = formatString.split('|');\n if (parts.length < 3) {\n return (\n this.currencyPipe.transform(\n value,\n 'BRL',\n 'symbol',\n '1.2-2',\n this.locale,\n ) || value.toString()\n );\n }\n\n const currencyCode = parts[0];\n const display = parts[1]; // 'symbol' or 'code'\n const decimals = parts[2];\n const noSep = parts.includes('nosep');\n const digitsInfo = `1.${decimals}-${decimals}`;\n\n const formatted =\n this.currencyPipe.transform(\n value,\n currencyCode,\n display,\n digitsInfo,\n this.locale,\n ) || value.toString();\n\n return noSep ? this.removeGrouping(formatted) : formatted;\n }\n\n /**\n * Format percentage values\n */\n private formatPercentage(value: number, formatString: string): string {\n if (formatString.includes('|x100')) {\n const format = formatString.replace('|x100', '');\n const formatted =\n this.decimalPipe.transform(value * 100, format, this.locale) ||\n (value * 100).toString();\n return `${formatted}%`;\n }\n\n return (\n this.percentPipe.transform(value, formatString, this.locale) ||\n value.toString()\n );\n }\n\n private removeGrouping(value: string): string {\n return value.replace(new RegExp(`\\\\${this.groupSeparator}`, 'g'), '');\n }\n\n /**\n * Format string values\n */\n private formatString(value: string, formatString: string): string {\n if (!formatString || formatString === 'none') {\n return value;\n }\n\n let result = value;\n\n // Parse format for truncation: \"uppercase|truncate|50|...\"\n if (formatString.includes('|truncate|')) {\n const parts = formatString.split('|');\n const transform = parts[0];\n const maxLength = parseInt(parts[2]) || 50;\n const suffix = parts[3] || '...';\n\n // Apply text transformation first\n result = this.applyStringTransform(result, transform);\n\n // Then apply truncation\n if (result.length > maxLength) {\n result = result.substring(0, maxLength) + suffix;\n }\n } else {\n // Apply only text transformation\n result = this.applyStringTransform(result, formatString);\n }\n\n return result;\n }\n\n /**\n * Apply string transformations\n */\n private applyStringTransform(value: string, transform: string): string {\n switch (transform) {\n case 'uppercase':\n return this.upperCasePipe.transform(value);\n case 'lowercase':\n return this.lowerCasePipe.transform(value);\n case 'titlecase':\n return this.titleCasePipe.transform(value);\n case 'capitalize':\n return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();\n default:\n return value;\n }\n }\n\n /**\n * Format boolean values\n */\n private formatBoolean(value: boolean, formatString: string): string {\n if (formatString.startsWith('custom|')) {\n const parts = formatString.split('|');\n const trueValue = parts[1] || 'Verdadeiro';\n const falseValue = parts[2] || 'Falso';\n return value ? trueValue : falseValue;\n }\n\n const displays: { [key: string]: { true: string; false: string } } = {\n 'true-false': { true: 'Verdadeiro', false: 'Falso' },\n 'yes-no': { true: 'Sim', false: 'Não' },\n 'active-inactive': { true: 'Ativo', false: 'Inativo' },\n 'on-off': { true: 'Ligado', false: 'Desligado' },\n 'enabled-disabled': { true: 'Habilitado', false: 'Desabilitado' },\n };\n\n const display = displays[formatString] || displays['true-false'];\n return value ? display.true : display.false;\n }\n\n /**\n * Check if formatting is needed for a column\n */\n needsFormatting(columnType: ColumnDataType, formatString: string): boolean {\n return !!(formatString && formatString.trim() && columnType !== 'custom');\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnChanges,\n SimpleChanges,\n ChangeDetectorRef,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport {\n ColumnDataType,\n FormatterConfig,\n DATE_PRESETS,\n NUMBER_PRESETS,\n CURRENCY_PRESETS,\n PERCENTAGE_PRESETS,\n STRING_PRESETS,\n BOOLEAN_PRESETS,\n FormatPreset,\n} from './data-formatter-types';\nimport { DataFormattingService } from './data-formatting.service';\n\n@Component({\n selector: 'data-formatter',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n FormsModule,\n MatButtonModule,\n MatIconModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatCheckboxModule,\n MatCardModule,\n MatDividerModule,\n MatTooltipModule,\n MatChipsModule,\n PraxisIconDirective,\n ],\n template: `\n <div class=\"data-formatter\">\n <!-- Header -->\n <div class=\"formatter-header\">\n <mat-icon class=\"header-icon\" [praxisIcon]=\"getTypeIcon()\"></mat-icon>\n <div class=\"header-content\">\n <h4>Formatação de {{ getTypeLabel() }}</h4>\n <p class=\"header-description\">{{ getTypeDescription() }}</p>\n </div>\n </div>\n\n <!-- Date Formatting -->\n <div *ngIf=\"columnType === 'date'\" class=\"format-section\">\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Formato de Data</mat-label>\n <mat-select\n [(ngModel)]=\"selectedPreset\"\n (ngModelChange)=\"onPresetChange()\"\n >\n <mat-option\n *ngFor=\"let preset of datePresets\"\n [value]=\"preset.value\"\n >\n <div class=\"preset-option\">\n <div class=\"preset-content\">\n <span class=\"preset-label\">{{ preset.label }}</span>\n <span class=\"preset-description\">{{\n preset.description\n }}</span>\n </div>\n <span class=\"preset-example\">{{ preset.example }}</span>\n </div>\n </mat-option>\n </mat-select>\n <mat-hint>Escolha um formato predefinido ou personalize</mat-hint>\n </mat-form-field>\n\n <mat-form-field\n *ngIf=\"selectedPreset === 'custom'\"\n appearance=\"outline\"\n class=\"full-width\"\n >\n <mat-label>Formato Personalizado</mat-label>\n <input\n matInput\n [(ngModel)]=\"customFormat\"\n (ngModelChange)=\"onCustomFormatChange()\"\n placeholder=\"dd/MM/yyyy HH:mm:ss\"\n matTooltip=\"Use padrões do Angular DatePipe: dd, MM, yyyy, HH, mm, ss\"\n />\n <mat-hint>Ex: dd/MM/yyyy, HH:mm:ss, EEE dd/MM</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- Number Formatting -->\n <div *ngIf=\"columnType === 'number'\" class=\"format-section\">\n <div class=\"format-row\">\n <mat-form-field appearance=\"outline\" class=\"decimal-select\">\n <mat-label>Casas Decimais</mat-label>\n <mat-select\n [(ngModel)]=\"decimalMode\"\n (ngModelChange)=\"onDecimalModeChange()\"\n >\n <mat-option value=\"0\">Nenhuma (1.234)</mat-option>\n <mat-option value=\"1\">1 fixa (1.234,5)</mat-option>\n <mat-option value=\"2\">2 fixas (1.234,56)</mat-option>\n <mat-option value=\"3\">3 fixas (1.234,567)</mat-option>\n <mat-option value=\"variable\">Variável (0-3)</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-checkbox\n [(ngModel)]=\"thousandsSeparator\"\n (ngModelChange)=\"onFormatOptionChange()\"\n class=\"format-checkbox\"\n >\n Separador de milhares\n </mat-checkbox>\n </div>\n\n <mat-form-field\n *ngIf=\"decimalMode === 'variable'\"\n appearance=\"outline\"\n class=\"full-width\"\n >\n <mat-label>Faixa de Decimais</mat-label>\n <mat-select\n [(ngModel)]=\"variableRange\"\n (ngModelChange)=\"onFormatOptionChange()\"\n >\n <mat-option value=\"0-1\">0 a 1 casa</mat-option>\n <mat-option value=\"0-2\">0 a 2 casas</mat-option>\n <mat-option value=\"0-3\">0 a 3 casas</mat-option>\n <mat-option value=\"1-3\">1 a 3 casas</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- Currency Formatting -->\n <div *ngIf=\"columnType === 'currency'\" class=\"format-section\">\n <div class=\"format-row\">\n <mat-form-field appearance=\"outline\" class=\"currency-select\">\n <mat-label>Moeda</mat-label>\n <mat-select\n [(ngModel)]=\"currencyCode\"\n (ngModelChange)=\"onFormatOptionChange()\"\n >\n <mat-option value=\"BRL\">Real Brasileiro (R$)</mat-option>\n <mat-option value=\"USD\">Dólar Americano (US$)</mat-option>\n <mat-option value=\"EUR\">Euro (€)</mat-option>\n <mat-option value=\"GBP\">Libra Esterlina (£)</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"decimal-select\">\n <mat-label>Casas Decimais</mat-label>\n <mat-select\n [(ngModel)]=\"currencyDecimals\"\n (ngModelChange)=\"onFormatOptionChange()\"\n >\n <mat-option value=\"0\">Nenhuma</mat-option>\n <mat-option value=\"2\">2 casas</mat-option>\n <mat-option value=\"3\">3 casas</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div class=\"format-row\">\n <mat-checkbox\n [(ngModel)]=\"currencySymbol\"\n (ngModelChange)=\"onFormatOptionChange()\"\n class=\"format-checkbox\"\n >\n Exibir símbolo da moeda\n </mat-checkbox>\n\n <mat-checkbox\n [(ngModel)]=\"currencyThousands\"\n (ngModelChange)=\"onFormatOptionChange()\"\n class=\"format-checkbox\"\n >\n Separador de milhares\n </mat-checkbox>\n </div>\n </div>\n\n <!-- Percentage Formatting -->\n <div *ngIf=\"columnType === 'percentage'\" class=\"format-section\">\n <div class=\"format-row\">\n <mat-form-field appearance=\"outline\" class=\"decimal-select\">\n <mat-label>Casas Decimais</mat-label>\n <mat-select\n [(ngModel)]=\"percentageDecimals\"\n (ngModelChange)=\"onFormatOptionChange()\"\n >\n <mat-option value=\"0\">Nenhuma (12%)</mat-option>\n <mat-option value=\"1\">1 casa (12,3%)</mat-option>\n <mat-option value=\"2\">2 casas (12,34%)</mat-option>\n <mat-option value=\"3\">3 casas (12,345%)</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <mat-checkbox\n [(ngModel)]=\"percentageMultiplier\"\n (ngModelChange)=\"onFormatOptionChange()\"\n class=\"format-checkbox\"\n >\n Multiplicar por 100 (0.15 → 15%)\n </mat-checkbox>\n </div>\n\n <!-- String Formatting -->\n <div *ngIf=\"columnType === 'string'\" class=\"format-section\">\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Transformação de Texto</mat-label>\n <mat-select\n [(ngModel)]=\"stringTransform\"\n (ngModelChange)=\"onFormatOptionChange()\"\n >\n <mat-option\n *ngFor=\"let preset of stringPresets\"\n [value]=\"preset.value\"\n >\n <div class=\"preset-option\">\n <span class=\"preset-label\">{{ preset.label }}</span>\n <span class=\"preset-example\">{{ preset.example }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <div class=\"format-row\">\n <mat-checkbox\n [(ngModel)]=\"enableTruncate\"\n (ngModelChange)=\"onTruncateToggle()\"\n class=\"format-checkbox\"\n >\n Truncar texto longo\n </mat-checkbox>\n </div>\n\n <div *ngIf=\"enableTruncate\" class=\"truncate-options\">\n <div class=\"format-row\">\n <mat-form-field appearance=\"outline\" class=\"truncate-length\">\n <mat-label>Tamanho Máximo</mat-label>\n <input\n matInput\n type=\"number\"\n [(ngModel)]=\"truncateLength\"\n (ngModelChange)=\"onFormatOptionChange()\"\n [min]=\"1\"\n [max]=\"500\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"truncate-suffix\">\n <mat-label>Sufixo</mat-label>\n <input\n matInput\n [(ngModel)]=\"truncateSuffix\"\n (ngModelChange)=\"onFormatOptionChange()\"\n placeholder=\"...\"\n />\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <!-- Boolean Formatting -->\n <div *ngIf=\"columnType === 'boolean'\" class=\"format-section\">\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Exibição de Valores</mat-label>\n <mat-select\n [(ngModel)]=\"booleanDisplay\"\n (ngModelChange)=\"onBooleanDisplayChange()\"\n >\n <mat-option\n *ngFor=\"let preset of booleanPresets\"\n [value]=\"preset.value\"\n >\n <div class=\"preset-option\">\n <span class=\"preset-label\">{{ preset.label }}</span>\n <span class=\"preset-example\">{{ preset.example }}</span>\n </div>\n </mat-option>\n <mat-option value=\"custom\">Personalizado</mat-option>\n </mat-select>\n </mat-form-field>\n\n <div *ngIf=\"booleanDisplay === 'custom'\" class=\"custom-boolean\">\n <div class=\"format-row\">\n <mat-form-field appearance=\"outline\" class=\"boolean-value\">\n <mat-label>Texto para Verdadeiro</mat-label>\n <input\n matInput\n [(ngModel)]=\"customTrueValue\"\n (ngModelChange)=\"onFormatOptionChange()\"\n placeholder=\"Verdadeiro\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"boolean-value\">\n <mat-label>Texto para Falso</mat-label>\n <input\n matInput\n [(ngModel)]=\"customFalseValue\"\n (ngModelChange)=\"onFormatOptionChange()\"\n placeholder=\"Falso\"\n />\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <!-- Live Preview -->\n <div *ngIf=\"previewValue\" class=\"preview-section\">\n <mat-divider></mat-divider>\n <div class=\"preview-content\">\n <mat-icon class=\"preview-icon\" [praxisIcon]=\"'visibility'\"></mat-icon>\n <div class=\"preview-text\">\n <span class=\"preview-label\">Pré-visualização:</span>\n <span class=\"preview-value\">{{ previewValue }}</span>\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n .data-formatter {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .formatter-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 0;\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n }\n\n .header-icon {\n font-size: 24px;\n width: 24px;\n height: 24px;\n color: var(--mat-sys-primary);\n }\n\n .header-content h4 {\n margin: 0 0 4px 0;\n font-size: 1.1rem;\n font-weight: 500;\n color: var(--mat-sys-on-surface);\n }\n\n .header-description {\n margin: 0;\n font-size: 0.875rem;\n color: var(--mat-sys-on-surface-variant);\n }\n\n .format-section {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .format-row {\n display: flex;\n gap: 16px;\n align-items: center;\n flex-wrap: wrap;\n }\n\n .full-width {\n width: 100%;\n }\n\n .decimal-select,\n .currency-select {\n min-width: 200px;\n flex: 1;\n }\n\n .truncate-length {\n flex: 1;\n min-width: 120px;\n }\n\n .truncate-suffix {\n flex: 1;\n min-width: 100px;\n }\n\n .boolean-value {\n flex: 1;\n min-width: 150px;\n }\n\n .format-checkbox {\n margin-right: 16px;\n }\n\n .preset-option {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n padding: 4px 0;\n }\n\n .preset-content {\n display: flex;\n flex-direction: column;\n flex: 1;\n }\n\n .preset-label {\n font-weight: 500;\n font-size: 0.9rem;\n }\n\n .preset-description {\n font-size: 0.8rem;\n color: var(--mat-sys-on-surface-variant);\n }\n\n .preset-example {\n font-family: monospace;\n font-size: 0.8rem;\n color: var(--mat-sys-primary);\n background-color: var(--mat-sys-primary-container);\n padding: 2px 6px;\n border-radius: 4px;\n margin-left: 8px;\n }\n\n .truncate-options {\n margin-left: 24px;\n padding-left: 16px;\n border-left: 2px solid var(--mat-sys-outline-variant);\n }\n\n .custom-boolean {\n margin-top: 8px;\n }\n\n .preview-section {\n margin-top: 16px;\n }\n\n .preview-content {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n background-color: var(--mat-sys-surface-container);\n border-radius: 8px;\n margin-top: 16px;\n }\n\n .preview-icon {\n color: var(--mat-sys-secondary);\n }\n\n .preview-text {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .preview-label {\n font-size: 0.875rem;\n color: var(--mat-sys-on-surface-variant);\n }\n\n .preview-value {\n font-family: monospace;\n font-size: 1rem;\n font-weight: 500;\n color: var(--mat-sys-on-surface);\n background-color: var(--mat-sys-surface-container-high);\n padding: 8px 12px;\n border-radius: 4px;\n border: 1px solid var(--mat-sys-outline-variant);\n }\n\n /* Responsive Design */\n @media (max-width: 768px) {\n .format-row {\n flex-direction: column;\n align-items: stretch;\n }\n\n .decimal-select,\n .currency-select,\n .truncate-length,\n .truncate-suffix,\n .boolean-value {\n min-width: unset;\n width: 100%;\n }\n\n .format-checkbox {\n margin-right: 0;\n margin-bottom: 8px;\n }\n }\n `,\n ],\n})\nexport class DataFormatterComponent implements OnInit, OnChanges {\n @Input() columnType: ColumnDataType = 'string';\n @Input() currentFormat: string = '';\n\n @Output() formatChange = new EventEmitter<string>();\n\n // Preset data\n datePresets = DATE_PRESETS;\n numberPresets = NUMBER_PRESETS;\n currencyPresets = CURRENCY_PRESETS;\n percentagePresets = PERCENTAGE_PRESETS;\n stringPresets = STRING_PRESETS;\n booleanPresets = BOOLEAN_PRESETS;\n\n // Date formatting state\n selectedPreset = 'shortDate';\n customFormat = '';\n\n // Number formatting state\n decimalMode = '2';\n variableRange = '0-2';\n thousandsSeparator = true;\n\n // Currency formatting state\n currencyCode = 'BRL';\n currencyDecimals = '2';\n currencySymbol = true;\n currencyThousands = true;\n\n // Percentage formatting state\n percentageDecimals = '1';\n percentageMultiplier = true;\n\n // String formatting state\n stringTransform = 'none';\n enableTruncate = false;\n truncateLength = 50;\n truncateSuffix = '...';\n\n // Boolean formatting state\n booleanDisplay = 'true-false';\n customTrueValue = 'Verdadeiro';\n customFalseValue = 'Falso';\n\n // Preview\n previewValue = '';\n\n constructor(\n private cdr: ChangeDetectorRef,\n private formattingService: DataFormattingService,\n ) {}\n\n ngOnInit(): void {\n this.parseCurrentFormat();\n this.generatePreview();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['currentFormat'] && !changes['currentFormat'].firstChange) {\n this.parseCurrentFormat();\n }\n if (changes['columnType']) {\n this.generatePreview();\n }\n }\n\n getTypeIcon(): string {\n switch (this.columnType) {\n case 'date':\n return 'calendar_today';\n case 'number':\n return 'numbers';\n case 'currency':\n return 'attach_money';\n case 'percentage':\n return 'percent';\n case 'string':\n return 'text_fields';\n case 'boolean':\n return 'toggle_on';\n default:\n return 'format_shapes';\n }\n }\n\n getTypeLabel(): string {\n switch (this.columnType) {\n case 'date':\n return 'Data';\n case 'number':\n return 'Número';\n case 'currency':\n return 'Moeda';\n case 'percentage':\n return 'Percentual';\n case 'string':\n return 'Texto';\n case 'boolean':\n return 'Booleano';\n default:\n return 'Dados';\n }\n }\n\n getTypeDescription(): string {\n switch (this.columnType) {\n case 'date':\n return 'Configure como as datas serão exibidas';\n case 'number':\n return 'Defina a formatação de números';\n case 'currency':\n return 'Configure a exibição de valores monetários';\n case 'percentage':\n return 'Formate a exibição de percentuais';\n case 'string':\n return 'Transforme a apresentação de texto';\n case 'boolean':\n return 'Escolha como exibir valores verdadeiro/falso';\n default:\n return 'Configure a formatação dos dados';\n }\n }\n\n private parseCurrentFormat(): void {\n if (!this.currentFormat) {\n this.setDefaultValues();\n return;\n }\n\n // Parse the current format based on column type\n switch (this.columnType) {\n case 'date':\n this.parseDateFormat();\n break;\n case 'number':\n this.parseNumberFormat();\n break;\n case 'currency':\n this.parseCurrencyFormat();\n break;\n case 'percentage':\n this.parsePercentageFormat();\n break;\n case 'string':\n this.parseStringFormat();\n break;\n case 'boolean':\n this.parseBooleanFormat();\n break;\n }\n\n this.generatePreview();\n this.cdr.markForCheck();\n }\n\n private setDefaultValues(): void {\n switch (this.columnType) {\n case 'date':\n this.selectedPreset = 'shortDate';\n break;\n case 'number':\n this.decimalMode = '2';\n this.thousandsSeparator = true;\n break;\n case 'currency':\n this.currencyCode = 'BRL';\n this.currencyDecimals = '2';\n break;\n case 'percentage':\n this.percentageDecimals = '1';\n break;\n case 'string':\n this.stringTransform = 'none';\n break;\n case 'boolean':\n this.booleanDisplay = 'true-false';\n break;\n }\n }\n\n private parseDateFormat(): void {\n const presetMatch = this.datePresets.find(\n (p) => p.value === this.currentFormat,\n );\n if (presetMatch) {\n this.selectedPreset = presetMatch.value;\n } else {\n this.selectedPreset = 'custom';\n this.customFormat = this.currentFormat;\n }\n }\n\n private parseNumberFormat(): void {\n // Parse format like \"1.2-2\" or \"1.0-3\"\n const match = this.currentFormat.match(/1\\.(\\d+)-(\\d+)/);\n if (match) {\n const min = parseInt(match[1]);\n const max = parseInt(match[2]);\n if (min === max) {\n this.decimalMode = min.toString();\n } else {\n this.decimalMode = 'variable';\n this.variableRange = `${min}-${max}`;\n }\n }\n this.thousandsSeparator = !this.currentFormat.includes('|nosep');\n }\n\n private parseCurrencyFormat(): void {\n // Parse format like \"BRL|symbol|2\"\n const parts = this.currentFormat.split('|');\n if (parts.length >= 3) {\n this.currencyCode = parts[0];\n this.currencySymbol = parts[1] === 'symbol';\n this.currencyDecimals = parts[2];\n this.currencyThousands = !parts.includes('nosep');\n }\n }\n\n private parsePercentageFormat(): void {\n this.percentageMultiplier = this.currentFormat.includes('|x100');\n const format = this.currentFormat.replace('|x100', '');\n const match = format.match(/1\\.(\\d+)-(\\d+)/);\n if (match) {\n this.percentageDecimals = match[2];\n }\n }\n\n private parseStringFormat(): void {\n if (this.currentFormat.includes('|truncate|')) {\n const parts = this.currentFormat.split('|');\n this.stringTransform = parts[0];\n this.enableTruncate = true;\n this.truncateLength = parseInt(parts[2]) || 50;\n this.truncateSuffix = parts[3] || '...';\n } else {\n this.stringTransform = this.currentFormat || 'none';\n }\n }\n\n private parseBooleanFormat(): void {\n if (this.currentFormat.includes('|custom|')) {\n const parts = this.currentFormat.split('|');\n this.booleanDisplay = 'custom';\n this.customTrueValue = parts[2] || 'Verdadeiro';\n this.customFalseValue = parts[3] || 'Falso';\n } else {\n this.booleanDisplay = this.currentFormat || 'true-false';\n }\n }\n\n // Event handlers\n onPresetChange(): void {\n this.generateFormatString();\n }\n\n onCustomFormatChange(): void {\n this.generateFormatString();\n }\n\n onDecimalModeChange(): void {\n this.generateFormatString();\n }\n\n onFormatOptionChange(): void {\n this.generateFormatString();\n }\n\n onTruncateToggle(): void {\n this.generateFormatString();\n }\n\n onBooleanDisplayChange(): void {\n this.generateFormatString();\n }\n\n private generateFormatString(): void {\n let formatString = '';\n\n switch (this.columnType) {\n case 'date':\n formatString =\n this.selectedPreset === 'custom'\n ? this.customFormat\n : this.selectedPreset;\n break;\n\n case 'number':\n if (this.decimalMode === 'variable') {\n const [min, max] = this.variableRange.split('-');\n formatString = `1.${min}-${max}`;\n } else {\n formatString = `1.${this.decimalMode}-${this.decimalMode}`;\n }\n if (!this.thousandsSeparator) {\n formatString += '|nosep';\n }\n break;\n\n case 'currency':\n const symbolType = this.currencySymbol ? 'symbol' : 'code';\n formatString = `${this.currencyCode}|${symbolType}|${this.currencyDecimals}`;\n if (!this.currencyThousands) {\n formatString += '|nosep';\n }\n break;\n\n case 'percentage':\n formatString = `1.${this.percentageDecimals}-${this.percentageDecimals}`;\n if (this.percentageMultiplier) {\n formatString += '|x100';\n }\n break;\n\n case 'string':\n formatString = this.stringTransform;\n if (this.enableTruncate) {\n formatString += `|truncate|${this.truncateLength}|${this.truncateSuffix}`;\n }\n break;\n\n case 'boolean':\n if (this.booleanDisplay === 'custom') {\n formatString = `custom|${this.customTrueValue}|${this.customFalseValue}`;\n } else {\n formatString = this.booleanDisplay;\n }\n break;\n }\n\n this.formatChange.emit(formatString);\n this.generatePreview();\n this.cdr.markForCheck();\n }\n\n private generatePreview(): void {\n // Generate a preview using the actual DataFormattingService for accuracy\n const formatString = this.getCurrentFormatString();\n if (!formatString) {\n this.previewValue = '';\n return;\n }\n\n const sampleValue = this.getSampleValue();\n try {\n this.previewValue = this.formattingService.formatValue(\n sampleValue,\n this.columnType,\n formatString,\n );\n } catch (error) {\n this.previewValue = 'Erro na formatação';\n console.warn('Preview generation error:', error);\n }\n }\n\n /**\n * Get appropriate sample value for each data type\n */\n private getSampleValue(): any {\n switch (this.columnType) {\n case 'date':\n return new Date(); // Current date and time\n case 'number':\n return 1234.5678;\n case 'currency':\n return 1234.56;\n case 'percentage':\n return this.percentageMultiplier ? 0.12345 : 12.345; // Depends on multiplier setting\n case 'string':\n return 'Exemplo de Texto Longo Para Demonstrar Formatação';\n case 'boolean':\n return true;\n default:\n return null;\n }\n }\n\n /**\n * Get the current format string based on component state\n */\n private getCurrentFormatString(): string {\n switch (this.columnType) {\n case 'date':\n return this.selectedPreset === 'custom'\n ? this.customFormat\n : this.selectedPreset;\n case 'number':\n if (this.decimalMode === 'variable') {\n const [min, max] = this.variableRange.split('-');\n return `1.${min}-${max}${!this.thousandsSeparator ? '|nosep' : ''}`;\n } else {\n return `1.${this.decimalMode}-${this.decimalMode}${!this.thousandsSeparator ? '|nosep' : ''}`;\n }\n case 'currency':\n const symbolType = this.currencySymbol ? 'symbol' : 'code';\n return `${this.currencyCode}|${symbolType}|${this.currencyDecimals}${!this.currencyThousands ? '|nosep' : ''}`;\n case 'percentage':\n return `1.${this.percentageDecimals}-${this.percentageDecimals}${this.percentageMultiplier ? '|x100' : ''}`;\n case 'string':\n let format = this.stringTransform;\n if (this.enableTruncate) {\n format += `|truncate|${this.truncateLength}|${this.truncateSuffix}`;\n }\n return format;\n case 'boolean':\n if (this.booleanDisplay === 'custom') {\n return `custom|${this.customTrueValue}|${this.customFalseValue}`;\n } else {\n return this.booleanDisplay;\n }\n default:\n return '';\n }\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n ChangeDetectorRef,\n ChangeDetectionStrategy,\n DestroyRef,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatListModule } from '@angular/material/list';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport {\n CdkDragDrop,\n DragDropModule,\n moveItemInArray,\n} from '@angular/cdk/drag-drop';\nimport { TableConfig, ColumnDefinition, isTableConfigV2 } from '@praxisui/core';\nimport { Subject, debounceTime } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { VisualFormulaBuilderComponent } from '../visual-formula-builder/visual-formula-builder.component';\nimport {\n FieldSchema,\n FormulaDefinition,\n} from '../visual-formula-builder/formula-types';\nimport { ValueMappingEditorComponent } from '../value-mapping-editor/value-mapping-editor.component';\nimport { DataFormatterComponent } from '../data-formatter/data-formatter.component';\nimport { ColumnDataType } from '../data-formatter/data-formatter-types';\n\nexport interface ColumnChange {\n type: 'add' | 'remove' | 'update' | 'reorder' | 'global';\n columnIndex?: number;\n column?: ColumnDefinition;\n columns?: ColumnDefinition[];\n fullConfig?: TableConfig;\n}\n\ninterface ExtendedColumnDefinition extends ColumnDefinition {\n calculationType?: string;\n calculationParams?: any;\n _generatedValueGetter?: string;\n valueMapping?: { [key: string | number]: string };\n format?: string;\n conditionalStyles?: any[]; // ConditionalStyle[];\n cellClassCondition?: any;\n resizable?: boolean;\n filterable?: boolean;\n}\n\n@Component({\n selector: 'columns-config-editor',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./columns-config-editor.component.scss'],\n imports: [\n CommonModule,\n FormsModule,\n MatButtonModule,\n MatIconModule,\n MatFormFieldModule,\n MatInputModule,\n MatCardModule,\n MatCheckboxModule,\n MatButtonToggleModule,\n MatSelectModule,\n MatListModule,\n MatDividerModule,\n MatTooltipModule,\n MatExpansionModule,\n MatBadgeModule,\n MatSlideToggleModule,\n DragDropModule,\n VisualFormulaBuilderComponent,\n ValueMappingEditorComponent,\n DataFormatterComponent,\n ],\n template: `\n <div class=\"columns-config-editor\">\n <!-- Educational Card - Compact -->\n <mat-card class=\"educational-card compact\">\n <mat-card-content class=\"compact-content\">\n <div class=\"compact-header\">\n <mat-icon class=\"inline-icon\">table_chart</mat-icon>\n <h4>Personalização de Colunas</h4>\n </div>\n <p>\n Configure visibilidade, cabeçalhos, largura e propriedades de cada\n coluna.\n </p>\n </mat-card-content>\n </mat-card>\n\n <!-- Global Configuration Accordion -->\n <mat-accordion class=\"global-config-accordion\">\n <mat-expansion-panel class=\"global-config-panel\" [expanded]=\"true\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"panel-icon\">tune</mat-icon>\n Configurações Globais\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <div class=\"config-panel-content\">\n <div class=\"config-layout\">\n <!-- Visibility Controls -->\n <div class=\"config-group\">\n <div class=\"control-section\">\n <label class=\"control-label\">\n Visibilidade\n <span class=\"control-status\"\n >({{ getVisibleColumnsCount() }}/{{\n columns.length\n }}\n visíveis)</span\n >\n </label>\n <mat-button-toggle-group\n [(ngModel)]=\"visibilityState\"\n (ngModelChange)=\"onVisibilityChange($event)\"\n class=\"visibility-toggle-group\"\n >\n <mat-button-toggle\n value=\"all\"\n [disabled]=\"areAllColumnsVisible()\"\n >\n <mat-icon>visibility</mat-icon>\n <span>Todas</span>\n </mat-button-toggle>\n <mat-button-toggle\n value=\"none\"\n [disabled]=\"areAllColumnsHidden()\"\n >\n <mat-icon>visibility_off</mat-icon>\n <span>Nenhuma</span>\n </mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n </div>\n\n <!-- Alignment Controls -->\n <div class=\"config-group\">\n <div class=\"control-section\">\n <label class=\"control-label\">Alinhamento Padrão</label>\n <mat-button-toggle-group\n [(ngModel)]=\"globalAlignment\"\n (ngModelChange)=\"applyGlobalAlignment($event)\"\n class=\"alignment-toggle-group\"\n >\n <mat-button-toggle value=\"left\" matTooltip=\"Esquerda\">\n <mat-icon>format_align_left</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle value=\"center\" matTooltip=\"Centro\">\n <mat-icon>format_align_center</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle value=\"right\" matTooltip=\"Direita\">\n <mat-icon>format_align_right</mat-icon>\n </mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n </div>\n\n <!-- Feature Options -->\n <div class=\"config-group features-group\">\n <div class=\"control-section\">\n <label class=\"control-label\">Recursos</label>\n <div class=\"features-grid\">\n <mat-checkbox\n [(ngModel)]=\"globalSortableEnabled\"\n (ngModelChange)=\"applyGlobalSortable($event)\"\n class=\"feature-checkbox\"\n >\n Ordenação\n </mat-checkbox>\n\n @if (isV2Config) {\n <mat-checkbox\n [(ngModel)]=\"globalResizable\"\n (ngModelChange)=\"applyGlobalResizable($event)\"\n class=\"feature-checkbox\"\n >\n Redimensionáveis\n </mat-checkbox>\n\n <mat-checkbox\n [(ngModel)]=\"globalStickyEnabled\"\n (ngModelChange)=\"applyGlobalSticky($event)\"\n class=\"feature-checkbox\"\n >\n Fixar colunas\n </mat-checkbox>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n </mat-accordion>\n\n <!-- Master-Detail Layout -->\n <div class=\"master-detail-layout\">\n <!-- Master: Columns List -->\n <div class=\"master-panel\">\n <div class=\"list-header\">\n <h3>Colunas ({{ columns.length }})</h3>\n <button\n mat-fab\n color=\"primary\"\n class=\"add-column-fab\"\n (click)=\"addNewColumn()\"\n matTooltip=\"Adicionar Coluna Calculada\"\n >\n <mat-icon>functions</mat-icon>\n </button>\n </div>\n\n <div\n class=\"columns-list-container\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnReorder($event)\"\n >\n <mat-list class=\"columns-list\">\n @for (column of columns; track column.field; let i = $index) {\n <mat-list-item\n [class.selected]=\"selectedColumnIndex === i\"\n (click)=\"selectColumn(i)\"\n cdkDrag\n class=\"column-item\"\n >\n <div class=\"column-item-content\" cdkDragHandle>\n <div class=\"column-main-info\">\n <div class=\"column-header\">\n <mat-icon class=\"drag-handle\">drag_handle</mat-icon>\n <div class=\"column-text-info\">\n <span\n class=\"column-title\"\n [matTooltip]=\"column.field\"\n matTooltipPosition=\"below\"\n >\n {{ column.header || column.field }}\n </span>\n <span class=\"column-field\">{{ column.field }}</span>\n </div>\n <div class=\"column-indicators\">\n <mat-icon\n class=\"column-type-icon\"\n [matTooltip]=\"\n isCalculatedColumn(column)\n ? 'Coluna Calculada'\n : 'Campo da API'\n \"\n >\n {{\n isCalculatedColumn(column)\n ? 'functions'\n : 'data_object'\n }}\n </mat-icon>\n <mat-icon\n class=\"mapping-indicator-icon\"\n [matBadge]=\"getMappingCount(column)\"\n [matBadgeHidden]=\"getMappingCount(column) === 0\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n [matTooltip]=\"getMappingTooltip(column)\"\n aria-hidden=\"false\"\n [attr.aria-label]=\"\n getMappingCount(column) > 0\n ? getMappingTooltip(column)\n : null\n \"\n >\n swap_horiz\n </mat-icon>\n <mat-checkbox\n [(ngModel)]=\"column.visible\"\n (ngModelChange)=\"onColumnPropertyChange()\"\n (click)=\"$event.stopPropagation()\"\n class=\"visibility-checkbox\"\n matTooltip=\"Visível na tabela\"\n >\n </mat-checkbox>\n </div>\n </div>\n </div>\n\n <button\n mat-icon-button\n color=\"warn\"\n class=\"remove-button\"\n (click)=\"removeColumn(i, $event)\"\n matTooltip=\"Remover Coluna\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </mat-list-item>\n }\n </mat-list>\n </div>\n </div>\n\n <mat-divider [vertical]=\"true\" class=\"panel-divider\"></mat-divider>\n\n <!-- Detail: Column Editor -->\n <div class=\"detail-panel\">\n @if (selectedColumnIndex === -1) {\n <div class=\"no-selection-message\">\n <mat-icon>table_chart</mat-icon>\n <h3>Selecione uma coluna</h3>\n <p>Escolha uma coluna da lista para editar suas propriedades</p>\n </div>\n }\n\n @if (selectedColumn) {\n <div class=\"column-editor\">\n <div class=\"editor-header\">\n <h3 class=\"editor-title\">\n Editando: {{ selectedColumn.header || selectedColumn.field }}\n </h3>\n </div>\n\n <form class=\"column-form\">\n <!-- Basic Properties Row -->\n <div class=\"form-row\">\n <mat-form-field appearance=\"outline\" class=\"field-input\">\n <mat-label>Campo (field)</mat-label>\n <input\n matInput\n [(ngModel)]=\"selectedColumn.field\"\n name=\"field\"\n [readonly]=\"isExistingColumn(selectedColumn)\"\n (ngModelChange)=\"onColumnPropertyChange()\"\n />\n <mat-hint>Nome técnico do campo</mat-hint>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"header-input\">\n <mat-label>Cabeçalho (header)</mat-label>\n <input\n matInput\n [(ngModel)]=\"selectedColumn.header\"\n name=\"header\"\n (ngModelChange)=\"onColumnPropertyChange()\"\n />\n <mat-hint>Texto exibido no cabeçalho</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- Visibility and Alignment Row -->\n <div class=\"form-row\">\n <div class=\"checkbox-group\">\n <mat-checkbox\n [(ngModel)]=\"selectedColumn.visible\"\n name=\"visible\"\n (ngModelChange)=\"onColumnPropertyChange()\"\n >\n Coluna Visível\n </mat-checkbox>\n </div>\n\n <div class=\"alignment-group\">\n <label class=\"control-label\">Alinhamento</label>\n <mat-button-toggle-group\n [(ngModel)]=\"selectedColumn.align\"\n name=\"align\"\n (ngModelChange)=\"onColumnPropertyChange()\"\n >\n <mat-button-toggle value=\"left\">\n <mat-icon>format_align_left</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle value=\"center\">\n <mat-icon>format_align_center</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle value=\"right\">\n <mat-icon>format_align_right</mat-icon>\n </mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n </div>\n\n <!-- Width and Advanced Row -->\n <div class=\"form-row\">\n <mat-form-field appearance=\"outline\" class=\"width-input\">\n <mat-label>Largura</mat-label>\n <input\n matInput\n [(ngModel)]=\"selectedColumn.width\"\n name=\"width\"\n placeholder=\"auto\"\n (ngModelChange)=\"onColumnPropertyChange()\"\n />\n <mat-hint>Ex: 100px, 10%, auto</mat-hint>\n </mat-form-field>\n\n <div class=\"checkbox-group\">\n <mat-checkbox\n [(ngModel)]=\"selectedColumn.sortable\"\n name=\"sortable\"\n (ngModelChange)=\"onColumnPropertyChange()\"\n >\n Ordenável\n </mat-checkbox>\n </div>\n\n <div class=\"checkbox-group\" *ngIf=\"isV2Config\">\n <mat-checkbox\n [(ngModel)]=\"selectedColumn.resizable\"\n name=\"resizable\"\n (ngModelChange)=\"onColumnPropertyChange()\"\n >\n Redimensionável\n </mat-checkbox>\n </div>\n\n <div class=\"checkbox-group\">\n <mat-checkbox\n [(ngModel)]=\"selectedColumn.filterable\"\n name=\"filterable\"\n (ngModelChange)=\"onColumnPropertyChange()\"\n >\n Filtrável\n </mat-checkbox>\n </div>\n </div>\n\n <!-- Data Type Row -->\n <div class=\"form-row\">\n <mat-form-field appearance=\"outline\" class=\"data-type-input\">\n <mat-label>Tipo de Dados</mat-label>\n <mat-select\n [(ngModel)]=\"selectedColumnDataType\"\n (ngModelChange)=\"onDataTypeChange($event)\"\n name=\"dataType\"\n >\n <mat-option value=\"string\">\n <mat-icon>text_fields</mat-icon>\n Texto\n </mat-option>\n <mat-option value=\"number\">\n <mat-icon>numbers</mat-icon>\n Número\n </mat-option>\n <mat-option value=\"currency\">\n <mat-icon>attach_money</mat-icon>\n Moeda\n </mat-option>\n <mat-option value=\"percentage\">\n <mat-icon>percent</mat-icon>\n Percentual\n </mat-option>\n <mat-option value=\"date\">\n <mat-icon>calendar_today</mat-icon>\n Data\n </mat-option>\n <mat-option value=\"boolean\">\n <mat-icon>toggle_on</mat-icon>\n Booleano\n </mat-option>\n </mat-select>\n <mat-hint>Define como os dados serão formatados</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- Sticky Position Row -->\n <div class=\"form-row\">\n <div class=\"sticky-group\">\n <label class=\"control-label\">Posição Fixa</label>\n <mat-button-toggle-group\n [(ngModel)]=\"selectedColumn.sticky\"\n name=\"sticky\"\n (ngModelChange)=\"onColumnPropertyChange()\"\n >\n <mat-button-toggle [value]=\"null\"\n >Nenhum</mat-button-toggle\n >\n <mat-button-toggle value=\"start\"\n >Início</mat-button-toggle\n >\n <mat-button-toggle value=\"end\">Fim</mat-button-toggle>\n </mat-button-toggle-group>\n <div class=\"hint\" style=\"opacity:.75; margin-top:6px;\">\n Fixar colunas no início/fim ajuda a manter ações/identificação visíveis.\n </div>\n </div>\n </div>\n\n <!-- Sorting Backend Field Row -->\n <div class=\"form-row\">\n <mat-form-field appearance=\"outline\" class=\"field-input\">\n <mat-label>Campo de ordenação (backend)</mat-label>\n <input\n matInput\n [(ngModel)]=\"selectedColumn.sortField\"\n name=\"sortField\"\n (ngModelChange)=\"onColumnPropertyChange()\"\n placeholder=\"ex.: codigo, dataCriacao\"\n />\n <mat-hint>Use quando o campo de ordenação difere do field</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- Header/Cell Overrides Row -->\n <div class=\"form-row\">\n <mat-form-field appearance=\"outline\" class=\"field-input\">\n <mat-label>Classe do cabeçalho</mat-label>\n <input\n matInput\n [(ngModel)]=\"selectedColumn.headerCssClass\"\n name=\"headerCssClass\"\n (ngModelChange)=\"onColumnPropertyChange()\"\n placeholder=\"ex.: pfx-header--muted\"\n />\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"field-input\">\n <mat-label>Estilo do cabeçalho (CSS)</mat-label>\n <input\n matInput\n [(ngModel)]=\"selectedColumn.headerStyle\"\n name=\"headerStyle\"\n (ngModelChange)=\"onColumnPropertyChange()\"\n placeholder=\"ex.: background:#f8f9fb;\"\n />\n </mat-form-field>\n </div>\n <div class=\"form-row\">\n <mat-form-field appearance=\"outline\" class=\"field-input\">\n <mat-label>Classe da célula</mat-label>\n <input\n matInput\n [(ngModel)]=\"selectedColumn.cssClass\"\n name=\"cssClass\"\n (ngModelChange)=\"onColumnPropertyChange()\"\n placeholder=\"ex.: pfx-cell--warning\"\n />\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"field-input\">\n <mat-label>Estilo da célula (CSS)</mat-label>\n <input\n matInput\n [(ngModel)]=\"selectedColumn.style\"\n name=\"style\"\n (ngModelChange)=\"onColumnPropertyChange()\"\n placeholder=\"ex.: color:#555;\"\n />\n </mat-form-field>\n </div>\n\n <!-- Visual Formula Builder for Calculated Columns -->\n @if (isCalculatedColumn(selectedColumn)) {\n <div class=\"form-section\">\n <mat-divider></mat-divider>\n <div class=\"formula-builder-section\">\n <visual-formula-builder\n [availableDataSchema]=\"availableDataSchema\"\n [currentFormula]=\"getColumnFormula(selectedColumn)\"\n (formulaChange)=\"onFormulaChange($event)\"\n (generatedExpressionChange)=\"\n onGeneratedExpressionChange($event)\n \"\n >\n </visual-formula-builder>\n </div>\n </div>\n }\n\n <!-- Value Mapping Editor -->\n <div class=\"form-section\">\n <mat-divider></mat-divider>\n <mat-expansion-panel class=\"mapping-expansion-panel\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon>swap_horiz</mat-icon>\n Mapeamento de Valores\n </mat-panel-title>\n <mat-panel-description>\n {{ getMappingPanelDescription(selectedColumn) }}\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"mapping-panel-content\">\n <value-mapping-editor\n [currentMapping]=\"getColumnMapping(selectedColumn)\"\n [keyInputType]=\"getColumnKeyInputType(selectedColumn)\"\n [labelKey]=\"'Valor Original'\"\n [labelValue]=\"'Valor Exibido'\"\n (mappingChange)=\"onMappingChange($event)\"\n >\n </value-mapping-editor>\n </div>\n </mat-expansion-panel>\n </div>\n\n <!-- Data Formatting Editor -->\n @if (showDataFormatter(selectedColumn)) {\n <div class=\"form-section\">\n <mat-divider></mat-divider>\n <mat-expansion-panel class=\"formatter-expansion-panel\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon>{{\n getFormatterIcon(selectedColumn)\n }}</mat-icon>\n Formatação de Exibição\n </mat-panel-title>\n <mat-panel-description>\n {{ getFormatterPanelDescription(selectedColumn) }}\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"formatter-panel-content\">\n <data-formatter\n [columnType]=\"getColumnDataType(selectedColumn)\"\n [currentFormat]=\"getColumnFormat(selectedColumn)\"\n (formatChange)=\"onFormatChange($event)\"\n >\n </data-formatter>\n </div>\n </mat-expansion-panel>\n </div>\n }\n\n <!-- Cell Renderer (Phase 1) -->\n <div class=\"form-section\">\n <mat-divider></mat-divider>\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon>photo_filter</mat-icon>\n Renderização da Célula\n </mat-panel-title>\n <mat-panel-description>\n Ícone, imagem ou badge no lugar do texto\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"renderer-grid\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Modo de renderização</mat-label>\n <mat-select [(ngModel)]=\"uiRendererType\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"onRendererTypeChange($event)\" (closed)=\"onRendererModeClosed()\">\n <mat-option [value]=\"null\">Texto padrão</mat-option>\n <mat-option value=\"icon\">Ícone</mat-option>\n <mat-option value=\"image\">Imagem</mat-option>\n <mat-option value=\"badge\">Badge</mat-option>\n </mat-select>\n </mat-form-field>\n\n <div class=\"renderer-config\" style=\"grid-column: 1/-1; margin-top: 8px;\">\n <mat-slide-toggle [(ngModel)]=\"uiRendererConditional\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"onToggleRendererConditional($event)\">\n Modo condicional (expressão)\n </mat-slide-toggle>\n <mat-form-field appearance=\"outline\" *ngIf=\"uiRendererConditional\" style=\"width:100%; margin-top:8px;\">\n <mat-label>Expressão do modo (retorna 'icon' | 'image' | 'badge')</mat-label>\n <input matInput [ngModel]=\"getRendererTypeExpr()\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererTypeExpr($event)\" placeholder=\"= row.hasAvatar ? 'image' : 'icon'\" />\n <mat-hint>Use '= ...' para expressão. Ex.: = row.severity &gt;= 7 ? 'badge' : null</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- Icon configuration -->\n @if (uiRendererType === 'icon') {\n <div class=\"renderer-config\">\n <mat-slide-toggle [(ngModel)]=\"onlyVisibleRendererFields\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"onRendererFieldToggleChange()\">Somente colunas exibidas</mat-slide-toggle>\n <mat-form-field appearance=\"outline\">\n <mat-label>Nome do ícone (fixo)</mat-label>\n <input matInput [value]=\"getRendererIconName()\" (input)=\"setRendererIconName($any($event.target).value)\" placeholder=\"ex.: mi:check_circle, edit\" />\n <mat-hint>Material Symbols (mi:...)</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Campo do ícone (row.campo)</mat-label>\n <input matInput [value]=\"getRendererIconNameField()\" (input)=\"setRendererIconNameField($any($event.target).value)\" placeholder=\"ex.: statusIcon\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Selecionar campo do ícone</mat-label>\n <mat-select [ngModel]=\"getRendererIconNameField()\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererIconNameField($event)\">\n <mat-option *ngFor=\"let f of rendererFieldOptions\" [value]=\"f.name\">\n {{ f.label || f.name }} — {{ f.name }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor</mat-label>\n <mat-select [value]=\"getRendererIconColor()\" (valueChange)=\"setRendererIconColor($event)\">\n <mat-option value=\"\">Padrão</mat-option>\n <mat-option value=\"primary\">Primary</mat-option>\n <mat-option value=\"accent\">Accent</mat-option>\n <mat-option value=\"warn\">Warn</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Tamanho (px)</mat-label>\n <input matInput type=\"number\" [value]=\"getRendererIconSize()\" (input)=\"setRendererIconSize($any($event.target).valueAsNumber)\" />\n </mat-form-field>\n </div>\n }\n\n <!-- Image configuration -->\n @if (uiRendererType === 'image') {\n <div class=\"renderer-config\">\n <mat-slide-toggle [(ngModel)]=\"onlyVisibleRendererFields\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"onRendererFieldToggleChange()\">Somente colunas exibidas</mat-slide-toggle>\n <mat-form-field appearance=\"outline\">\n <mat-label>URL da imagem (fixo)</mat-label>\n <input matInput [value]=\"getRendererImageSrc()\" (input)=\"setRendererImageSrc($any($event.target).value)\" placeholder=\"https://...\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Campo da URL</mat-label>\n <input matInput [value]=\"getRendererImageSrcField()\" (input)=\"setRendererImageSrcField($any($event.target).value)\" placeholder=\"ex.: avatarUrl\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Selecionar campo da URL</mat-label>\n <mat-select [ngModel]=\"getRendererImageSrcField()\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererImageSrcField($event)\">\n <mat-option *ngFor=\"let f of rendererFieldOptions\" [value]=\"f.name\">\n {{ f.label || f.name }} — {{ f.name }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>ALT (fixo)</mat-label>\n <input matInput [value]=\"getRendererImageAlt()\" (input)=\"setRendererImageAlt($any($event.target).value)\" placeholder=\"Texto alternativo\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Campo do ALT</mat-label>\n <input matInput [value]=\"getRendererImageAltField()\" (input)=\"setRendererImageAltField($any($event.target).value)\" placeholder=\"ex.: name\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Selecionar campo do ALT</mat-label>\n <mat-select [ngModel]=\"getRendererImageAltField()\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererImageAltField($event)\">\n <mat-option *ngFor=\"let f of rendererFieldOptions\" [value]=\"f.name\">\n {{ f.label || f.name }} — {{ f.name }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Largura (px)</mat-label>\n <input matInput type=\"number\" [value]=\"getRendererImageWidth()\" (input)=\"setRendererImageWidth($any($event.target).valueAsNumber)\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Altura (px)</mat-label>\n <input matInput type=\"number\" [value]=\"getRendererImageHeight()\" (input)=\"setRendererImageHeight($any($event.target).valueAsNumber)\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Forma</mat-label>\n <mat-select [value]=\"getRendererImageShape()\" (valueChange)=\"setRendererImageShape($event)\">\n <mat-option value=\"square\">Quadrado</mat-option>\n <mat-option value=\"rounded\">Arredondado</mat-option>\n <mat-option value=\"circle\">Circular</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Fit</mat-label>\n <mat-select [value]=\"getRendererImageFit()\" (valueChange)=\"setRendererImageFit($event)\">\n <mat-option value=\"cover\">Cover</mat-option>\n <mat-option value=\"contain\">Contain</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-slide-toggle [checked]=\"getRendererImageLazy()\" (change)=\"setRendererImageLazy($event.checked)\">Lazy loading</mat-slide-toggle>\n </div>\n }\n\n <!-- Badge configuration -->\n @if (uiRendererType === 'badge') {\n <div class=\"renderer-config\">\n <mat-slide-toggle [(ngModel)]=\"onlyVisibleRendererFields\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"onRendererFieldToggleChange()\">Somente colunas exibidas</mat-slide-toggle>\n <mat-form-field appearance=\"outline\">\n <mat-label>Texto (fixo)</mat-label>\n <input matInput [value]=\"getRendererBadgeText()\" (input)=\"setRendererBadgeText($any($event.target).value)\" placeholder=\"ex.: Ativo\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Campo do texto</mat-label>\n <input matInput [value]=\"getRendererBadgeTextField()\" (input)=\"setRendererBadgeTextField($any($event.target).value)\" placeholder=\"ex.: statusText\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Selecionar campo do texto</mat-label>\n <mat-select [ngModel]=\"getRendererBadgeTextField()\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererBadgeTextField($event)\">\n <mat-option *ngFor=\"let f of rendererFieldOptions\" [value]=\"f.name\">\n {{ f.label || f.name }} — {{ f.name }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor</mat-label>\n <mat-select [value]=\"getRendererBadgeColor()\" (valueChange)=\"setRendererBadgeColor($event)\">\n <mat-option value=\"primary\">Primary</mat-option>\n <mat-option value=\"accent\">Accent</mat-option>\n <mat-option value=\"warn\">Warn</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Variante</mat-label>\n <mat-select [value]=\"getRendererBadgeVariant()\" (valueChange)=\"setRendererBadgeVariant($event)\">\n <mat-option value=\"filled\">Preenchido</mat-option>\n <mat-option value=\"outlined\">Contornado</mat-option>\n <mat-option value=\"soft\">Suave</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Ícone (opcional)</mat-label>\n <input matInput [value]=\"getRendererBadgeIcon()\" (input)=\"setRendererBadgeIcon($any($event.target).value)\" placeholder=\"ex.: mi:check, check\" />\n <mat-hint>Material Symbols (mi:...)</mat-hint>\n </mat-form-field>\n </div>\n }\n </div>\n </mat-expansion-panel>\n </div>\n </form>\n </div>\n }\n </div>\n </div>\n </div>\n `,\n})\nexport class ColumnsConfigEditorComponent implements OnInit, OnDestroy {\n @Input() config: TableConfig = { columns: [] };\n @Output() configChange = new EventEmitter<TableConfig>();\n @Output() columnChange = new EventEmitter<ColumnChange>();\n\n // Component state\n columns: ExtendedColumnDefinition[] = [];\n selectedColumnIndex = -1;\n selectedColumn: ExtendedColumnDefinition | null = null;\n isV2Config = false;\n\n // Formula builder data\n availableDataSchema: FieldSchema[] = [];\n\n // Style rules integration\n currentFieldSchemas: FieldSchema[] = [];\n sampleTableData: any[] = [];\n\n // Global settings\n globalSortableEnabled = true;\n globalAlignment: 'left' | 'center' | 'right' | null = null;\n visibilityState: 'all' | 'none' | null = null;\n\n // V2 specific features\n globalResizable = false;\n globalStickyEnabled = false;\n\n // Race condition prevention\n private operationInProgress = false;\n private columnOperationSubject = new Subject<() => void>();\n\n // Dependency injection\n private readonly destroyRef = inject(DestroyRef);\n\n // Cleanup\n private destroy$ = new Subject<void>();\n\n // Renderer field picker state\n onlyVisibleRendererFields = true;\n uiRendererType: 'icon' | 'image' | 'badge' | null = null;\n private _rendererApplyTimer: any = null;\n rendererFieldOptions: Array<{ name: string; label: string; type?: string; isVisible: boolean }> = [];\n uiRendererConditional = false;\n\n private refreshRendererFieldOptions(): void {\n const options: Array<{ name: string; label: string; type?: string; isVisible: boolean }> = [];\n try {\n const schema = (this.currentFieldSchemas?.length ? this.currentFieldSchemas : this.availableDataSchema) || [];\n const visibleSet = new Set(\n (this.columns || [])\n .filter((c) => c && (c as any).visible !== false)\n .map((c) => c.field),\n );\n const pushUnique = (name: string, label?: string, type?: string) => {\n if (!name) return;\n if (!options.some((o) => o.name === name)) {\n options.push({ name, label: label || name, type, isVisible: visibleSet.has(name) });\n }\n };\n schema.forEach((f: any) => pushUnique(f?.name, f?.label || f?.name, f?.type));\n (this.columns || []).forEach((c) => pushUnique(c.field, c.header || c.field, (c as any)?.type));\n } catch {}\n const filtered = this.onlyVisibleRendererFields ? options.filter((o) => o.isVisible) : options;\n this.rendererFieldOptions = filtered.sort((a, b) => {\n if (a.isVisible !== b.isVisible) return a.isVisible ? -1 : 1;\n const la = (a.label || a.name).toLowerCase();\n const lb = (b.label || b.name).toLowerCase();\n return la.localeCompare(lb);\n });\n }\n\n getRendererFieldOptions(): Array<{ name: string; label: string; type?: string; isVisible: boolean }> {\n const options: Array<{ name: string; label: string; type?: string; isVisible: boolean }> = [];\n try {\n const schema = (this.currentFieldSchemas?.length ? this.currentFieldSchemas : this.availableDataSchema) || [];\n const visibleSet = new Set(\n (this.columns || [])\n .filter((c) => c && (c as any).visible !== false)\n .map((c) => c.field),\n );\n const pushUnique = (name: string, label?: string, type?: string) => {\n if (!name) return;\n if (!options.some((o) => o.name === name)) {\n options.push({ name, label: label || name, type, isVisible: visibleSet.has(name) });\n }\n };\n schema.forEach((f: any) => pushUnique(f?.name, f?.label || f?.name, f?.type));\n (this.columns || []).forEach((c) => pushUnique(c.field, c.header || c.field, (c as any)?.type));\n } catch {}\n const filtered = this.onlyVisibleRendererFields ? options.filter((o) => o.isVisible) : options;\n return filtered.sort((a, b) => {\n if (a.isVisible !== b.isVisible) return a.isVisible ? -1 : 1;\n const la = (a.label || a.name).toLowerCase();\n const lb = (b.label || b.name).toLowerCase();\n return la.localeCompare(lb);\n });\n }\n\n // Public hook for template toggles\n onRendererFieldToggleChange(): void {\n try {\n this.refreshRendererFieldOptions();\n this.cdr.markForCheck();\n } catch {}\n }\n\n constructor(\n private cdr: ChangeDetectorRef,\n // private tableRuleEngine: TableRuleEngineService,\n // private fieldSchemaAdapter: FieldSchemaAdapter\n ) {}\n\n ngOnInit(): void {\n this.isV2Config = isTableConfigV2(this.config);\n\n if (this.config?.columns) {\n // Deep clone columns to avoid mutating the @Input() config by reference\n this.columns = (this.config.columns || []).map((col) =>\n JSON.parse(JSON.stringify(col)),\n ) as ExtendedColumnDefinition[];\n this.updateGlobalSettings();\n this.generateAvailableDataSchema();\n this.refreshRendererFieldOptions();\n // this.initializeStyleRules();\n }\n\n // Setup debounced column operations to prevent race conditions\n this.columnOperationSubject\n .pipe(debounceTime(100), takeUntilDestroyed(this.destroyRef))\n .subscribe((operation) => {\n try { console.debug('[ColumnsEditor] scheduledOp:begin'); } catch {}\n this.operationInProgress = true;\n try {\n operation();\n } finally {\n this.operationInProgress = false;\n try { console.debug('[ColumnsEditor] scheduledOp:end'); } catch {}\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private updateGlobalSettings(): void {\n // Check if all columns have sortable enabled\n this.globalSortableEnabled = this.columns.every(\n (col) => col.sortable !== false,\n );\n\n // Check if all columns have the same alignment\n const alignments = this.columns.map((col) => col.align).filter(Boolean);\n const uniqueAlignments = [...new Set(alignments)];\n this.globalAlignment =\n uniqueAlignments.length === 1 ? (uniqueAlignments[0] as any) : null;\n\n // Update visibility state\n this.updateVisibilityState();\n\n // V2 specific global settings\n if (this.isV2Config) {\n this.globalResizable = this.columns.every(\n (col) => (col as any).resizable !== false,\n );\n this.globalStickyEnabled = this.columns.some(\n (col) => (col as any).sticky === true,\n );\n }\n }\n\n private updateVisibilityState(): void {\n if (this.areAllColumnsVisible()) {\n this.visibilityState = 'all';\n } else if (this.areAllColumnsHidden()) {\n this.visibilityState = 'none';\n } else {\n this.visibilityState = null;\n }\n }\n\n // Visibility Helper Methods\n getVisibleColumnsCount(): number {\n return this.columns.filter((col) => col.visible).length;\n }\n\n areAllColumnsVisible(): boolean {\n return this.columns.length > 0 && this.columns.every((col) => col.visible);\n }\n\n areAllColumnsHidden(): boolean {\n return this.columns.length > 0 && this.columns.every((col) => !col.visible);\n }\n\n onVisibilityChange(state: 'all' | 'none'): void {\n if (state === 'all') {\n this.showAllColumns();\n } else if (state === 'none') {\n this.hideAllColumns();\n }\n }\n\n // Global Actions\n showAllColumns(): void {\n this.columns.forEach((column) => (column.visible = true));\n this.updateVisibilityState();\n this.emitConfigChange('global');\n }\n\n hideAllColumns(): void {\n this.columns.forEach((column) => (column.visible = false));\n this.updateVisibilityState();\n this.emitConfigChange('global');\n }\n\n applyGlobalSortable(enabled: boolean): void {\n this.columns.forEach((column) => {\n if (!this.isColumnExplicitlySet(column, 'sortable')) {\n column.sortable = enabled;\n }\n });\n this.emitConfigChange('global');\n }\n\n applyGlobalAlignment(alignment: 'left' | 'center' | 'right'): void {\n this.columns.forEach((column) => {\n if (!this.isColumnExplicitlySet(column, 'align')) {\n column.align = alignment;\n }\n });\n this.emitConfigChange('global');\n }\n\n // V2 Global Actions\n applyGlobalResizable(enabled: boolean): void {\n if (this.isV2Config) {\n this.columns.forEach((column) => {\n if (!this.isColumnExplicitlySet(column, 'resizable')) {\n (column as any).resizable = enabled;\n }\n });\n this.emitConfigChange('global');\n }\n }\n\n applyGlobalSticky(enabled: boolean): void {\n if (this.isV2Config) {\n this.columns.forEach((column) => {\n (column as any).sticky = enabled;\n });\n this.emitConfigChange('global');\n }\n }\n\n private isColumnExplicitlySet(\n column: ExtendedColumnDefinition,\n property: keyof ExtendedColumnDefinition | string,\n ): boolean {\n // In a real implementation, you might track which properties were explicitly set\n // For now, we'll assume all are explicit if they differ from default\n return false;\n }\n\n // Column Selection\n selectColumn(index: number): void {\n // Validate index\n if (index < -1 || index >= this.columns.length) {\n console.warn('Invalid column index for selection:', index);\n index = -1;\n }\n\n this.selectedColumnIndex = index;\n this.selectedColumn =\n index >= 0 && index < this.columns.length ? this.columns[index] : null;\n // Sync UI renderer type when selection changes\n this.uiRendererType = this.getRendererType(this.selectedColumn);\n this.uiRendererConditional = !!((this.selectedColumn as any)?.renderer?.typeExpr);\n this.refreshRendererFieldOptions();\n this.cdr.markForCheck();\n }\n\n // Column Management\n addNewColumn(): void {\n if (this.operationInProgress) return;\n\n this.columnOperationSubject.next(() => {\n // Generate unique field name\n let fieldIndex = this.columns.length + 1;\n let fieldName = `calculatedField${fieldIndex}`;\n\n // Ensure field name is unique\n while (this.columns.some((col) => col.field === fieldName)) {\n fieldIndex++;\n fieldName = `calculatedField${fieldIndex}`;\n }\n\n const newColumn: ExtendedColumnDefinition = {\n field: fieldName,\n header: `Nova Coluna Calculada ${fieldIndex}`,\n visible: true,\n align: 'left',\n sortable: true,\n order: this.columns.length,\n type: 'string',\n _isApiField: false,\n calculationType: 'none',\n calculationParams: {},\n _generatedValueGetter: '',\n };\n\n this.columns = [...this.columns, newColumn];\n this.selectColumn(this.columns.length - 1);\n this.emitConfigChange('add');\n });\n }\n\n removeColumn(index: number, event: Event): void {\n event.stopPropagation();\n\n if (this.operationInProgress) return;\n\n // Validate bounds\n if (index < 0 || index >= this.columns.length) {\n console.warn('Invalid column index for removal:', index);\n return;\n }\n\n this.columnOperationSubject.next(() => {\n // Create new array without the removed column\n this.columns = this.columns.filter((_, i) => i !== index);\n\n // Update orders\n this.updateColumnOrders();\n\n // Adjust selection properly\n if (this.selectedColumnIndex === index) {\n // Column being removed was selected - clear selection\n this.selectedColumnIndex = -1;\n this.selectedColumn = null;\n } else if (this.selectedColumnIndex > index) {\n // Selected column is after removed column - adjust index\n this.selectedColumnIndex--;\n // Ensure the selected column reference is updated\n if (\n this.selectedColumnIndex >= 0 &&\n this.selectedColumnIndex < this.columns.length\n ) {\n this.selectedColumn = this.columns[this.selectedColumnIndex];\n } else {\n // Safety check - clear selection if index is invalid\n this.selectedColumnIndex = -1;\n this.selectedColumn = null;\n }\n }\n // If selectedColumnIndex < index, no adjustment needed\n\n this.emitConfigChange('remove');\n this.cdr.markForCheck();\n });\n }\n\n onColumnReorder(event: CdkDragDrop<ExtendedColumnDefinition[]>): void {\n if (\n event.previousIndex === event.currentIndex ||\n this.operationInProgress\n ) {\n return;\n }\n\n // Validate indices\n if (\n event.previousIndex < 0 ||\n event.previousIndex >= this.columns.length ||\n event.currentIndex < 0 ||\n event.currentIndex >= this.columns.length\n ) {\n console.warn(\n 'Invalid indices for reorder:',\n event.previousIndex,\n event.currentIndex,\n );\n return;\n }\n\n this.columnOperationSubject.next(() => {\n // Create a new array to avoid direct mutation\n const newColumns = [...this.columns];\n moveItemInArray(newColumns, event.previousIndex, event.currentIndex);\n this.columns = newColumns;\n\n this.updateColumnOrders();\n\n // Update selection index if needed\n let newSelectedIndex = this.selectedColumnIndex;\n\n if (this.selectedColumnIndex === event.previousIndex) {\n // The selected item was moved\n newSelectedIndex = event.currentIndex;\n } else if (event.previousIndex < event.currentIndex) {\n // Item moved forward\n if (\n this.selectedColumnIndex > event.previousIndex &&\n this.selectedColumnIndex <= event.currentIndex\n ) {\n newSelectedIndex--;\n }\n } else {\n // Item moved backward\n if (\n this.selectedColumnIndex >= event.currentIndex &&\n this.selectedColumnIndex < event.previousIndex\n ) {\n newSelectedIndex++;\n }\n }\n\n // Update selection with validation\n if (newSelectedIndex !== this.selectedColumnIndex) {\n this.selectedColumnIndex = newSelectedIndex;\n if (\n this.selectedColumnIndex >= 0 &&\n this.selectedColumnIndex < this.columns.length\n ) {\n this.selectedColumn = this.columns[this.selectedColumnIndex];\n }\n }\n\n this.emitConfigChange('reorder');\n this.cdr.markForCheck();\n });\n }\n\n private updateColumnOrders(): void {\n this.columns.forEach((column, index) => {\n column.order = index;\n });\n }\n\n // Column Property Changes\n onColumnPropertyChange(): void {\n if (this.operationInProgress) {\n try { console.debug('[ColumnsEditor] onColumnPropertyChange:skipped (opInProgress)'); } catch {}\n return;\n }\n try { console.debug('[ColumnsEditor] onColumnPropertyChange:schedule'); } catch {}\n this.columnOperationSubject.next(() => {\n try { console.debug('[ColumnsEditor] onColumnPropertyChange:execute'); } catch {}\n this.updateVisibilityState();\n this.emitConfigChange('update');\n // this.updateFieldSchemasForStyleRules();\n try { console.debug('[ColumnsEditor] onColumnPropertyChange:done'); } catch {}\n });\n }\n\n isExistingColumn(column: ColumnDefinition): boolean {\n // Columns are considered existing (from API/schema) if they have the _isApiField flag\n // This provides a more robust way to identify API columns vs calculated columns\n return column._isApiField === true;\n }\n\n isCalculatedColumn(column: ColumnDefinition): boolean {\n // Simplified logic: A column is calculated if:\n // 1. It was created manually in the editor (_isApiField === false), OR\n // 2. It's an API field but has a formula applied to it\n\n if (column._isApiField !== true) {\n // Column created manually in editor - always calculated\n return true;\n }\n\n // API field with applied formula/calculation\n const extendedColumn = column as any;\n return (\n !!(\n extendedColumn.calculationType &&\n extendedColumn.calculationType !== 'none'\n ) ||\n !!(column._generatedValueGetter && column._generatedValueGetter.trim())\n );\n }\n\n hasValueGetterError(column: ColumnDefinition): boolean {\n const valueGetter = (column as any).valueGetter;\n if (!valueGetter || typeof valueGetter !== 'string') {\n return false;\n }\n\n // Basic JavaScript syntax validation\n try {\n // Create a function to test syntax without executing\n new Function('rowData', `return ${valueGetter}`);\n return false;\n } catch {\n return true;\n }\n }\n\n // Formula Builder Integration\n private generateAvailableDataSchema(): void {\n // Generate schema from API fields only\n this.availableDataSchema = this.columns\n .filter((col) => col._isApiField === true) // Only use columns from API schema\n .map((col) => ({\n name: col.field,\n label: col.header || col.field,\n type: this.mapColumnTypeToFieldType(\n (col._originalApiType || col.type || 'string') as ColumnDataType,\n ),\n path: col.field,\n }));\n\n // If no API fields are available yet, add some common examples for the formula builder\n if (this.availableDataSchema.length === 0) {\n this.availableDataSchema.push(\n { name: 'id', label: 'ID', type: 'number', path: 'id' },\n { name: 'name', label: 'Nome', type: 'string', path: 'name' },\n { name: 'email', label: 'Email', type: 'string', path: 'email' },\n { name: 'status', label: 'Status', type: 'string', path: 'status' },\n { name: 'isActive', label: 'Ativo', type: 'boolean', path: 'isActive' },\n {\n name: 'createdAt',\n label: 'Data de Criação',\n type: 'date',\n path: 'createdAt',\n },\n { name: 'price', label: 'Preço', type: 'number', path: 'price' },\n );\n }\n }\n\n /**\n * Map ColumnDataType to FieldSchema type\n */\n private mapColumnTypeToFieldType(\n columnType: ColumnDataType,\n ): 'string' | 'number' | 'boolean' | 'date' | 'object' | 'array' {\n switch (columnType) {\n case 'number':\n case 'currency':\n case 'percentage':\n return 'number';\n case 'date':\n return 'date';\n case 'boolean':\n return 'boolean';\n case 'string':\n case 'custom':\n default:\n return 'string';\n }\n }\n\n getColumnFormula(\n column: ColumnDefinition | null,\n ): FormulaDefinition | undefined {\n if (!column) return undefined;\n\n const extendedColumn = column as any;\n return {\n type: extendedColumn.calculationType || 'none',\n params: extendedColumn.calculationParams || {},\n };\n }\n\n onFormulaChange(formula: FormulaDefinition): void {\n if (!this.selectedColumn || this.selectedColumnIndex < 0) return;\n\n // Verify column still exists in array\n if (\n this.selectedColumnIndex >= this.columns.length ||\n this.columns[this.selectedColumnIndex] !== this.selectedColumn\n ) {\n console.warn('Selected column reference is stale');\n this.selectColumn(-1);\n return;\n }\n\n this.selectedColumn.calculationType = formula.type;\n this.selectedColumn.calculationParams = formula.params;\n this.onColumnPropertyChange();\n }\n\n onGeneratedExpressionChange(expression: string): void {\n if (!this.selectedColumn || this.selectedColumnIndex < 0) return;\n\n // Verify column still exists\n if (\n this.selectedColumnIndex >= this.columns.length ||\n this.columns[this.selectedColumnIndex] !== this.selectedColumn\n ) {\n console.warn('Selected column reference is stale');\n this.selectColumn(-1);\n return;\n }\n\n this.selectedColumn._generatedValueGetter = expression;\n this.onColumnPropertyChange();\n }\n\n // Value Mapping Management\n getMappingCount(column: ColumnDefinition): number {\n const extendedColumn = column as any;\n return extendedColumn.valueMapping\n ? Object.keys(extendedColumn.valueMapping).length\n : 0;\n }\n\n getMappingTooltip(column: ColumnDefinition): string {\n const count = this.getMappingCount(column);\n if (count === 0) {\n return 'Sem mapeamentos definidos';\n } else if (count === 1) {\n return '1 mapeamento definido';\n } else {\n return `${count} mapeamentos definidos`;\n }\n }\n\n getMappingPanelDescription(column: ColumnDefinition | null): string {\n if (!column) return 'Nenhuma coluna selecionada';\n\n const count = this.getMappingCount(column);\n if (count === 0) {\n return 'Converter valores brutos em texto amigável';\n } else if (count === 1) {\n return '1 mapeamento definido';\n } else {\n return `${count} mapeamentos definidos`;\n }\n }\n\n getColumnMapping(column: ColumnDefinition | null): {\n [key: string | number]: string;\n } {\n // Important: return a stable reference. Returning a new `{}` on each\n // change detection causes the child component (ValueMappingEditor)\n // to see an @Input change and reset its internal state.\n if (!column) return this._emptyMappingRef;\n\n const extendedColumn = column as any;\n if (!extendedColumn.valueMapping) {\n // Lazily initialize once to keep the same reference across checks\n extendedColumn.valueMapping = {} as { [key: string | number]: string };\n }\n return extendedColumn.valueMapping;\n }\n\n // =============================\n // Renderer helpers (Phase 1)\n // =============================\n getRendererType(col: ColumnDefinition | null): 'icon' | 'image' | 'badge' | null {\n return (col as any)?.renderer?.type || null;\n }\n onRendererTypeChange(type: 'icon' | 'image' | 'badge' | null): void {\n try {\n console.debug('[ColumnsEditor] rendererTypeChange:start', {\n type,\n selectedIndex: this.selectedColumnIndex,\n opInProgress: this.operationInProgress,\n });\n } catch {}\n this.uiRendererType = type;\n // Apenas armazena escolha; aplicaremos quando o overlay fechar\n // (onRendererModeClosed) para evitar travar o fechamento do menu.\n try {\n console.debug('[ColumnsEditor] rendererTypeChange:end', {\n type,\n selectedIndex: this.selectedColumnIndex,\n });\n } catch {}\n }\n\n onRendererModeClosed(): void {\n // Aplicar mudança do modo de renderização ao modelo e emitir update\n const type = this.uiRendererType;\n try {\n console.debug('[ColumnsEditor] rendererMode:closed', { type });\n } catch {}\n if (!this.selectedColumn) return;\n const current = this.getRendererType(this.selectedColumn);\n if (current === type) return;\n if (!type) {\n delete (this.selectedColumn as any).renderer;\n } else {\n (this.selectedColumn as any).renderer = { type } as any;\n }\n // Defer the config emission slightly to let the overlay finish closing\n try { console.debug('[ColumnsEditor] rendererMode:applyScheduled'); } catch {}\n setTimeout(() => {\n try { console.debug('[ColumnsEditor] rendererMode:applyEmit'); } catch {}\n this.onColumnPropertyChange();\n }, 150);\n }\n\n onToggleRendererConditional(enabled: boolean): void {\n this.uiRendererConditional = enabled;\n if (!this.selectedColumn) return;\n const col: any = this.selectedColumn as any;\n col.renderer = col.renderer || { type: this.uiRendererType || 'icon' };\n if (enabled) {\n col.renderer.typeExpr = col.renderer.typeExpr || \"= 'icon'\";\n } else {\n delete col.renderer.typeExpr;\n }\n this.onColumnPropertyChange();\n }\n\n getRendererTypeExpr(): string {\n return String(((this.selectedColumn as any)?.renderer?.typeExpr as any) || '');\n }\n setRendererTypeExpr(val: string): void {\n if (!this.selectedColumn) return;\n const col: any = this.selectedColumn as any;\n col.renderer = col.renderer || { type: this.uiRendererType || 'icon' };\n col.renderer.typeExpr = val;\n this.onColumnPropertyChange();\n }\n\n // Icon\n getRendererIconName(): string {\n return (this.selectedColumn as any)?.renderer?.icon?.name || '';\n }\n setRendererIconName(v: string): void {\n if (!this.selectedColumn) return;\n this.ensureRenderer('icon');\n (this.selectedColumn as any).renderer.icon.name = v;\n this.onColumnPropertyChange();\n }\n getRendererIconNameField(): string {\n return (this.selectedColumn as any)?.renderer?.icon?.nameField || '';\n }\n setRendererIconNameField(v: string): void {\n if (!this.selectedColumn) return;\n this.ensureRenderer('icon');\n (this.selectedColumn as any).renderer.icon.nameField = v;\n this.onColumnPropertyChange();\n }\n getRendererIconColor(): string {\n return (this.selectedColumn as any)?.renderer?.icon?.color || '';\n }\n setRendererIconColor(v: string): void {\n if (!this.selectedColumn) return;\n this.ensureRenderer('icon');\n (this.selectedColumn as any).renderer.icon.color = v;\n this.onColumnPropertyChange();\n }\n getRendererIconSize(): number | null {\n return (this.selectedColumn as any)?.renderer?.icon?.size ?? null;\n }\n setRendererIconSize(v: number): void {\n if (!this.selectedColumn) return;\n this.ensureRenderer('icon');\n (this.selectedColumn as any).renderer.icon.size = v || undefined;\n this.onColumnPropertyChange();\n }\n\n // Image\n getRendererImageSrc(): string {\n return (this.selectedColumn as any)?.renderer?.image?.src || '';\n }\n setRendererImageSrc(v: string): void {\n if (!this.selectedColumn) return;\n this.ensureRenderer('image');\n (this.selectedColumn as any).renderer.image.src = v;\n this.onColumnPropertyChange();\n }\n getRendererImageSrcField(): string {\n return (this.selectedColumn as any)?.renderer?.image?.srcField || '';\n }\n setRendererImageSrcField(v: string): void {\n if (!this.selectedColumn) return;\n this.ensureRenderer('image');\n (this.selectedColumn as any).renderer.image.srcField = v;\n this.onColumnPropertyChange();\n }\n getRendererImageAlt(): string {\n return (this.selectedColumn as any)?.renderer?.image?.alt || '';\n }\n setRendererImageAlt(v: string): void {\n if (!this.selectedColumn) return;\n this.ensureRenderer('image');\n (this.selectedColumn as any).renderer.image.alt = v;\n this.onColumnPropertyChange();\n }\n getRendererImageAltField(): string {\n return (this.selectedColumn as any)?.renderer?.image?.altField || '';\n }\n setRendererImageAltField(v: string): void {\n if (!this.selectedColumn) return;\n this.ensureRenderer('image');\n (this.selectedColumn as any).renderer.image.altField = v;\n this.onColumnPropertyChange();\n }\n getRendererImageWidth(): number | null {\n return (this.selectedColumn as any)?.renderer?.image?.width ?? null;\n }\n setRendererImageWidth(v: number): void {\n if (!this.selectedColumn) return;\n this.ensureRenderer('image');\n (this.selectedColumn as any).renderer.image.width = v || undefined;\n this.onColumnPropertyChange();\n }\n getRendererImageHeight(): number | null {\n return (this.selectedColumn as any)?.renderer?.image?.height ?? null;\n }\n setRendererImageHeight(v: number): void {\n if (!this.selectedColumn) return;\n this.ensureRenderer('image');\n (this.selectedColumn as any).renderer.image.height = v || undefined;\n this.onColumnPropertyChange();\n }\n getRendererImageShape(): 'square' | 'rounded' | 'circle' | '' {\n return ((this.selectedColumn as any)?.renderer?.image?.shape as any) || '';\n }\n setRendererImageShape(v: any): void {\n if (!this.selectedColumn) return;\n this.ensureRenderer('image');\n (this.selectedColumn as any).renderer.image.shape = v || undefined;\n this.onColumnPropertyChange();\n }\n getRendererImageFit(): 'cover' | 'contain' | '' {\n return ((this.selectedColumn as any)?.renderer?.image?.fit as any) || '';\n }\n setRendererImageFit(v: any): void {\n if (!this.selectedColumn) return;\n this.ensureRenderer('image');\n (this.selectedColumn as any).renderer.image.fit = v || undefined;\n this.onColumnPropertyChange();\n }\n getRendererImageLazy(): boolean {\n return !!(this.selectedColumn as any)?.renderer?.image?.lazy;\n }\n setRendererImageLazy(v: boolean): void {\n if (!this.selectedColumn) return;\n this.ensureRenderer('image');\n (this.selectedColumn as any).renderer.image.lazy = !!v;\n this.onColumnPropertyChange();\n }\n\n // Badge\n getRendererBadgeText(): string {\n return (this.selectedColumn as any)?.renderer?.badge?.text || '';\n }\n setRendererBadgeText(v: string): void {\n if (!this.selectedColumn) return;\n this.ensureRenderer('badge');\n (this.selectedColumn as any).renderer.badge.text = v;\n this.onColumnPropertyChange();\n }\n getRendererBadgeTextField(): string {\n return (this.selectedColumn as any)?.renderer?.badge?.textField || '';\n }\n setRendererBadgeTextField(v: string): void {\n if (!this.selectedColumn) return;\n this.ensureRenderer('badge');\n (this.selectedColumn as any).renderer.badge.textField = v;\n this.onColumnPropertyChange();\n }\n getRendererBadgeColor(): string {\n return (this.selectedColumn as any)?.renderer?.badge?.color || 'primary';\n }\n setRendererBadgeColor(v: string): void {\n if (!this.selectedColumn) return;\n this.ensureRenderer('badge');\n (this.selectedColumn as any).renderer.badge.color = v;\n this.onColumnPropertyChange();\n }\n getRendererBadgeVariant(): string {\n return (this.selectedColumn as any)?.renderer?.badge?.variant || 'filled';\n }\n setRendererBadgeVariant(v: string): void {\n if (!this.selectedColumn) return;\n this.ensureRenderer('badge');\n (this.selectedColumn as any).renderer.badge.variant = v;\n this.onColumnPropertyChange();\n }\n getRendererBadgeIcon(): string {\n return (this.selectedColumn as any)?.renderer?.badge?.icon || '';\n }\n setRendererBadgeIcon(v: string): void {\n if (!this.selectedColumn) return;\n this.ensureRenderer('badge');\n (this.selectedColumn as any).renderer.badge.icon = v;\n this.onColumnPropertyChange();\n }\n\n private ensureRenderer(kind: 'icon' | 'image' | 'badge'): void {\n if (!this.selectedColumn) return;\n const col: any = this.selectedColumn as any;\n col.renderer = col.renderer || { type: kind };\n col.renderer.type = kind;\n if (kind === 'icon') col.renderer.icon = col.renderer.icon || {};\n if (kind === 'image') col.renderer.image = col.renderer.image || {};\n if (kind === 'badge') col.renderer.badge = col.renderer.badge || {};\n }\n\n // Shared empty mapping reference used when no column is selected\n private readonly _emptyMappingRef: { [key: string | number]: string } = Object.freeze({});\n\n getColumnKeyInputType(\n column: ColumnDefinition | null,\n ): 'text' | 'number' | 'boolean' {\n if (!column) return 'text';\n\n // Try to infer from column field name\n const fieldName = column.field.toLowerCase();\n\n if (\n fieldName.includes('id') ||\n fieldName.includes('count') ||\n fieldName.includes('price') ||\n fieldName.includes('quantity') ||\n fieldName.includes('amount') ||\n fieldName.includes('number')\n ) {\n return 'number';\n }\n\n if (\n fieldName.includes('active') ||\n fieldName.includes('enabled') ||\n fieldName.includes('visible') ||\n fieldName.includes('is')\n ) {\n return 'boolean';\n }\n\n return 'text';\n }\n\n onMappingChange(mapping: { [key: string | number]: string }): void {\n if (!this.selectedColumn || this.selectedColumnIndex < 0) {\n return;\n }\n\n // Verify column still exists\n if (\n this.selectedColumnIndex >= this.columns.length ||\n this.columns[this.selectedColumnIndex] !== this.selectedColumn\n ) {\n console.warn('Selected column reference is stale');\n this.selectColumn(-1);\n return;\n }\n\n this.selectedColumn.valueMapping = mapping;\n this.onColumnPropertyChange();\n }\n\n get selectedColumnDataType(): ColumnDataType {\n return this.getColumnDataType(this.selectedColumn);\n }\n set selectedColumnDataType(value: ColumnDataType) {\n this.onDataTypeChange(value);\n }\n\n // Data Formatting Management\n getColumnDataType(column: ColumnDefinition | null): ColumnDataType {\n if (!column) return 'string';\n\n // Priority order: user-configured type > original API type > field name inference\n\n // 1. Use the user-configured type if available (highest priority)\n if (column.type) {\n return column.type;\n }\n\n // 2. For API fields, use the original API type as fallback\n if (column._isApiField && column._originalApiType) {\n return column._originalApiType as ColumnDataType;\n }\n\n // 3. Try to infer from column field name (last resort)\n return this.inferFieldTypeFromFieldName(column.field);\n }\n\n /**\n * Infer column data type from field name patterns (shared logic with PraxisTable)\n */\n private inferFieldTypeFromFieldName(fieldName: string): ColumnDataType {\n const lowercaseName = fieldName.toLowerCase();\n\n // Date/time patterns - more specific patterns first\n if (\n lowercaseName.endsWith('date') ||\n lowercaseName.endsWith('time') ||\n lowercaseName.endsWith('at') ||\n lowercaseName.startsWith('date') ||\n lowercaseName === 'created' ||\n lowercaseName === 'updated' ||\n lowercaseName === 'modified' ||\n lowercaseName.includes('timestamp')\n ) {\n return 'date';\n }\n\n // Boolean patterns - most specific first to avoid conflicts\n if (\n lowercaseName.startsWith('is_') ||\n lowercaseName.startsWith('has_') ||\n lowercaseName.startsWith('can_') ||\n lowercaseName.startsWith('should_') ||\n lowercaseName === 'active' ||\n lowercaseName === 'enabled' ||\n lowercaseName === 'visible' ||\n lowercaseName === 'deleted' ||\n lowercaseName === 'archived' ||\n lowercaseName.endsWith('_flag') ||\n lowercaseName.endsWith('_enabled') ||\n lowercaseName.endsWith('_active')\n ) {\n return 'boolean';\n }\n\n // Currency/money patterns - exclude common false positives\n if (\n (lowercaseName.includes('price') ||\n lowercaseName.includes('amount') ||\n lowercaseName.includes('cost') ||\n lowercaseName.includes('salary') ||\n lowercaseName.includes('wage') ||\n lowercaseName.includes('fee') ||\n (lowercaseName.includes('value') &&\n !lowercaseName.includes('id') &&\n !lowercaseName.includes('key'))) &&\n !lowercaseName.includes('count') &&\n !lowercaseName.includes('type')\n ) {\n return 'currency';\n }\n\n // Percentage patterns - be more specific\n if (\n lowercaseName.includes('percent') ||\n lowercaseName.endsWith('_rate') ||\n lowercaseName.endsWith('_ratio') ||\n lowercaseName.endsWith('_pct') ||\n (lowercaseName.includes('rate') &&\n !lowercaseName.includes('created') &&\n !lowercaseName.includes('updated')) ||\n lowercaseName.endsWith('_score')\n ) {\n return 'percentage';\n }\n\n // Number patterns - exclude common false positives like string IDs\n if (\n (lowercaseName.endsWith('_id') && lowercaseName !== 'id') || // composite IDs might be strings\n lowercaseName === 'id' ||\n lowercaseName.includes('count') ||\n lowercaseName.includes('quantity') ||\n lowercaseName.includes('number') ||\n lowercaseName.includes('total') ||\n lowercaseName.includes('sum') ||\n lowercaseName.includes('age') ||\n lowercaseName.includes('weight') ||\n lowercaseName.includes('height') ||\n lowercaseName.includes('size') ||\n lowercaseName.endsWith('_num') ||\n lowercaseName.endsWith('_number')\n ) {\n return 'number';\n }\n\n // Default to string for ambiguous cases\n return 'string';\n }\n\n onDataTypeChange(dataType: ColumnDataType): void {\n if (!this.selectedColumn || this.selectedColumnIndex < 0) return;\n\n // Verify column still exists\n if (\n this.selectedColumnIndex >= this.columns.length ||\n this.columns[this.selectedColumnIndex] !== this.selectedColumn\n ) {\n console.warn('Selected column reference is stale');\n this.selectColumn(-1);\n return;\n }\n\n // Store the user-selected type in the standard 'type' property\n this.selectedColumn.type = dataType;\n\n // Clear existing format when changing data type\n this.selectedColumn.format = '';\n\n this.onColumnPropertyChange();\n }\n\n showDataFormatter(column: ColumnDefinition | null): boolean {\n if (!column) return false;\n\n // Don't show formatter for calculated columns (they can use custom formatting)\n if (this.isCalculatedColumn(column)) {\n return false;\n }\n\n const dataType = this.getColumnDataType(column);\n return dataType !== 'custom';\n }\n\n getFormatterIcon(column: ColumnDefinition | null): string {\n const dataType = this.getColumnDataType(column);\n switch (dataType) {\n case 'date':\n return 'calendar_today';\n case 'number':\n return 'numbers';\n case 'currency':\n return 'attach_money';\n case 'percentage':\n return 'percent';\n case 'string':\n return 'text_fields';\n case 'boolean':\n return 'toggle_on';\n default:\n return 'format_shapes';\n }\n }\n\n getFormatterPanelDescription(column: ColumnDefinition | null): string {\n if (!column) return 'Nenhuma coluna selecionada';\n\n const dataType = this.getColumnDataType(column);\n const hasFormat = this.getColumnFormat(column).length > 0;\n\n if (hasFormat) {\n return 'Formatação personalizada aplicada';\n }\n\n switch (dataType) {\n case 'date':\n return 'Configure como as datas são exibidas';\n case 'number':\n return 'Defina a formatação de números';\n case 'currency':\n return 'Configure valores monetários';\n case 'percentage':\n return 'Formate percentuais';\n case 'string':\n return 'Transforme a apresentação de texto';\n case 'boolean':\n return 'Escolha exibição de verdadeiro/falso';\n default:\n return 'Configure a formatação dos dados';\n }\n }\n\n getColumnFormat(column: ColumnDefinition | null): string {\n if (!column) return '';\n\n const extendedColumn = column as any;\n return extendedColumn.format || '';\n }\n\n onFormatChange(format: string): void {\n if (!this.selectedColumn || this.selectedColumnIndex < 0) return;\n\n // Verify column still exists\n if (\n this.selectedColumnIndex >= this.columns.length ||\n this.columns[this.selectedColumnIndex] !== this.selectedColumn\n ) {\n console.warn('Selected column reference is stale');\n this.selectColumn(-1);\n return;\n }\n\n this.selectedColumn.format = format;\n if (!this.selectedColumn.type) {\n this.selectedColumn.type = this.selectedColumnDataType;\n }\n this.onColumnPropertyChange();\n }\n\n // Data Synchronization\n private emitConfigChange(changeType: ColumnChange['type']): void {\n if (!this.config) return;\n\n // Deep clone columns to prevent external mutations\n const clonedColumns = this.columns.map((col) => ({ ...col }));\n\n const updatedConfig: TableConfig = {\n ...this.config,\n columns: clonedColumns,\n };\n\n // Avoid feedback loops: if nothing effectively changed, don't emit\n try {\n const prev = JSON.stringify(this.config.columns || []);\n const next = JSON.stringify(clonedColumns || []);\n if (prev === next && changeType === 'update') {\n return;\n }\n } catch {}\n\n this.configChange.emit(updatedConfig);\n\n this.columnChange.emit({\n type: changeType,\n columns: clonedColumns,\n columnIndex: this.selectedColumnIndex,\n column:\n this.selectedColumnIndex >= 0\n ? { ...this.columns[this.selectedColumnIndex] }\n : undefined,\n fullConfig: updatedConfig,\n });\n\n this.cdr.markForCheck();\n }\n\n /**\n * Public method to update columns from external source\n */\n updateColumnsFromConfig(config: TableConfig): void {\n if (!config) return;\n\n this.isV2Config = isTableConfigV2(config);\n\n if (config.columns && Array.isArray(config.columns)) {\n this.columns = [...config.columns] as ExtendedColumnDefinition[];\n this.updateGlobalSettings();\n this.generateAvailableDataSchema();\n\n // Reset selection if current selection is invalid\n if (\n this.selectedColumnIndex >= this.columns.length ||\n this.selectedColumnIndex < 0\n ) {\n this.selectColumn(-1);\n } else {\n // Re-select to ensure reference is updated\n this.selectColumn(this.selectedColumnIndex);\n }\n\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Public method to get current columns\n */\n getCurrentColumns(): ExtendedColumnDefinition[] {\n return [...this.columns];\n }\n\n // Style Rules Integration Methods\n private initializeStyleRules(): void {\n // Convert table config to field schemas for the rule builder\n // const fallbackConfig: TableConfig = { columns: this.columns };\n // this.currentFieldSchemas = this.fieldSchemaAdapter.adaptTableConfigToFieldSchema(\n // !isTableConfigV2(this.config) ? fallbackConfig : this.config\n // );\n // Generate sample data for preview (in real app, this would come from actual data)\n // this.generateSampleData();\n }\n\n private generateSampleData(): void {\n // Generate realistic sample data based on columns\n this.sampleTableData = [];\n\n for (let i = 0; i < 5; i++) {\n const sampleRow: any = {};\n\n this.columns.forEach((column) => {\n const fieldName = column.field;\n const dataType = this.getColumnDataType(column);\n\n // Generate sample values based on data type and field name\n switch (dataType) {\n case 'number':\n if (fieldName.toLowerCase().includes('id')) {\n sampleRow[fieldName] = i + 1;\n } else if (fieldName.toLowerCase().includes('age')) {\n sampleRow[fieldName] = 25 + Math.floor(Math.random() * 40);\n } else {\n sampleRow[fieldName] = Math.floor(Math.random() * 1000);\n }\n break;\n\n case 'currency':\n sampleRow[fieldName] = (Math.random() * 10000).toFixed(2);\n break;\n\n case 'percentage':\n sampleRow[fieldName] = (Math.random() * 100).toFixed(1);\n break;\n\n case 'date':\n const date = new Date();\n date.setDate(date.getDate() - Math.floor(Math.random() * 365));\n sampleRow[fieldName] = date.toISOString().split('T')[0];\n break;\n\n case 'boolean':\n sampleRow[fieldName] = Math.random() > 0.5;\n break;\n\n default: // string\n if (fieldName.toLowerCase().includes('name')) {\n sampleRow[fieldName] = `Nome ${i + 1}`;\n } else if (fieldName.toLowerCase().includes('status')) {\n const statuses = ['Ativo', 'Inativo', 'Pendente', 'Cancelado'];\n sampleRow[fieldName] =\n statuses[Math.floor(Math.random() * statuses.length)];\n } else if (fieldName.toLowerCase().includes('email')) {\n sampleRow[fieldName] = `usuario${i + 1}@exemplo.com`;\n } else {\n sampleRow[fieldName] = `Valor ${i + 1}`;\n }\n break;\n }\n });\n\n this.sampleTableData.push(sampleRow);\n }\n }\n\n getStyleRulesPanelDescription(column: ColumnDefinition | null): string {\n if (!column) return 'Nenhuma coluna selecionada';\n\n const extendedColumn = column as any;\n const rulesCount = extendedColumn.conditionalStyles\n ? extendedColumn.conditionalStyles.length\n : 0;\n\n if (rulesCount === 0) {\n return 'Configure formatação condicional baseada em regras';\n } else if (rulesCount === 1) {\n return '1 regra de estilo definida';\n } else {\n return `${rulesCount} regras de estilo definidas`;\n }\n }\n\n onConditionalStylesChanged(styles: any[]): void {\n if (!this.selectedColumn || this.selectedColumnIndex < 0) return;\n\n // Verify column still exists\n if (\n this.selectedColumnIndex >= this.columns.length ||\n this.columns[this.selectedColumnIndex] !== this.selectedColumn\n ) {\n console.warn('Selected column reference is stale');\n this.selectColumn(-1);\n return;\n }\n\n this.selectedColumn.conditionalStyles = styles;\n\n // Compile rules for execution in the table\n // if (styles.length > 0) {\n // this.selectedColumn.cellClassCondition = this.tableRuleEngine.compileConditionalStyles(styles);\n // } else {\n // delete this.selectedColumn.cellClassCondition;\n // }\n\n this.onColumnPropertyChange();\n }\n\n onRuleValidated(event: { ruleId: string; result: any }): void {\n // Handle rule validation results - could show feedback to user\n console.log('Rule validated:', event);\n }\n\n // Update field schemas when columns change\n private updateFieldSchemasForStyleRules(): void {\n // this.currentFieldSchemas = this.fieldSchemaAdapter.adaptTableConfigToFieldSchema({ columns: this.columns });\n // this.generateSampleData();\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n FormsModule,\n ReactiveFormsModule,\n FormBuilder,\n FormGroup,\n} from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatButtonModule } from '@angular/material/button';\nimport { TableConfig, isTableConfigV2 } from '@praxisui/core';\nimport { Subject, takeUntil } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs/operators';\n\nexport interface BehaviorConfigChange {\n type:\n | 'pagination'\n | 'sorting'\n | 'filtering'\n | 'selection'\n | 'interaction'\n | 'general';\n property: string;\n value: any;\n fullConfig: TableConfig;\n}\n\n@Component({\n selector: 'behavior-config-editor',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatSlideToggleModule,\n MatExpansionModule,\n MatIconModule,\n MatTooltipModule,\n MatDividerModule,\n MatButtonModule,\n ],\n template: `\n <div class=\"behavior-config-container\">\n <form [formGroup]=\"behaviorForm\">\n <!-- Paginação -->\n <mat-expansion-panel expanded>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\">table_rows</mat-icon>\n Paginação\n </mat-panel-title>\n <mat-panel-description>\n Configure como os dados são divididos em páginas\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"config-section\">\n <mat-slide-toggle\n formControlName=\"paginationEnabled\"\n class=\"toggle-field\"\n >\n Habilitar paginação\n </mat-slide-toggle>\n\n <div\n class=\"config-fields\"\n *ngIf=\"behaviorForm.get('paginationEnabled')?.value\"\n >\n <mat-form-field appearance=\"outline\">\n <mat-label>Itens por página</mat-label>\n <input\n matInput\n type=\"number\"\n formControlName=\"pageSize\"\n min=\"1\"\n max=\"100\"\n />\n <mat-hint>Número de registros exibidos por página</mat-hint>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Opções de tamanho de página</mat-label>\n <input\n matInput\n formControlName=\"pageSizeOptions\"\n placeholder=\"5, 10, 25, 50\"\n />\n <mat-hint>Valores separados por vírgula</mat-hint>\n </mat-form-field>\n\n <mat-slide-toggle\n formControlName=\"showFirstLastButtons\"\n class=\"toggle-field\"\n >\n Mostrar botões primeira/última página\n </mat-slide-toggle>\n\n <mat-form-field appearance=\"outline\" *ngIf=\"isV2\">\n <mat-label>Estratégia de paginação</mat-label>\n <mat-select formControlName=\"paginationStrategy\">\n <mat-option value=\"client\">Cliente (dados locais)</mat-option>\n <mat-option value=\"server\"\n >Servidor (paginação remota)</mat-option\n >\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" *ngIf=\"isV2\">\n <mat-label>Posição do paginator</mat-label>\n <mat-select formControlName=\"paginationPosition\">\n <mat-option value=\"top\">Topo</mat-option>\n <mat-option value=\"bottom\">Base</mat-option>\n <mat-option value=\"both\">Ambos</mat-option>\n </mat-select>\n <mat-hint>Paginator no topo/baixo/ambos</mat-hint>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" *ngIf=\"isV2\">\n <mat-label>Estilo do paginator</mat-label>\n <mat-select formControlName=\"paginationStyle\">\n <mat-option value=\"default\">Padrão</mat-option>\n <mat-option value=\"compact\">Compacto</mat-option>\n </mat-select>\n <mat-hint>Compacto para densidade alta</mat-hint>\n </mat-form-field>\n </div>\n </div>\n </mat-expansion-panel>\n\n <!-- Ordenação -->\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\">sort</mat-icon>\n Ordenação\n </mat-panel-title>\n <mat-panel-description>\n Controle como as colunas podem ser ordenadas\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"config-section\">\n <mat-slide-toggle\n formControlName=\"sortingEnabled\"\n class=\"toggle-field\"\n >\n Habilitar ordenação\n </mat-slide-toggle>\n\n <div\n class=\"config-fields\"\n *ngIf=\"behaviorForm.get('sortingEnabled')?.value && isV2\"\n >\n <mat-slide-toggle\n formControlName=\"multiSort\"\n class=\"toggle-field\"\n >\n Ordenação múltipla\n <mat-icon\n class=\"info-icon\"\n matTooltip=\"Permite ordenar por múltiplas colunas simultaneamente\"\n >\n info_outline\n </mat-icon>\n </mat-slide-toggle>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Estratégia de ordenação</mat-label>\n <mat-select formControlName=\"sortingStrategy\">\n <mat-option value=\"client\"\n >Cliente (ordenação local)</mat-option\n >\n <mat-option value=\"server\"\n >Servidor (ordenação remota)</mat-option\n >\n </mat-select>\n </mat-form-field>\n\n <mat-slide-toggle\n formControlName=\"allowClearSort\"\n class=\"toggle-field\"\n >\n Permitir limpar ordenação\n </mat-slide-toggle>\n\n <!-- Default sort (single entry for now) -->\n <mat-form-field appearance=\"outline\">\n <mat-label>Ordenação inicial — coluna</mat-label>\n <mat-select formControlName=\"defaultSortField\">\n <mat-option *ngFor=\"let c of (config?.columns || [])\" [value]=\"c.field\">{{ c.header || c.field }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Direção</mat-label>\n <mat-select formControlName=\"defaultSortDirection\">\n <mat-option value=\"asc\">Ascendente</mat-option>\n <mat-option value=\"desc\">Descendente</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </mat-expansion-panel>\n\n <!-- Filtragem -->\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\">filter_list</mat-icon>\n Filtragem\n </mat-panel-title>\n <mat-panel-description>\n Configure opções de busca e filtros\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"config-section\">\n <mat-slide-toggle\n formControlName=\"filteringEnabled\"\n class=\"toggle-field\"\n >\n Habilitar filtragem\n </mat-slide-toggle>\n\n <div\n class=\"config-fields\"\n *ngIf=\"behaviorForm.get('filteringEnabled')?.value\"\n >\n <div *ngIf=\"isV2\">\n <mat-slide-toggle\n formControlName=\"columnFiltersEnabled\"\n class=\"toggle-field\"\n >\n Filtros por coluna\n <mat-icon\n class=\"info-icon\"\n matTooltip=\"Adiciona filtros individuais em cada coluna\"\n >\n info_outline\n </mat-icon>\n </mat-slide-toggle>\n\n <mat-slide-toggle\n formControlName=\"advancedFiltersEnabled\"\n class=\"toggle-field\"\n >\n Filtros avançados\n <mat-icon\n class=\"info-icon\"\n matTooltip=\"Editor visual de queries complexas\"\n >\n info_outline\n </mat-icon>\n </mat-slide-toggle>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Tempo de debounce (ms)</mat-label>\n <input\n matInput\n type=\"number\"\n formControlName=\"filterDebounce\"\n min=\"0\"\n max=\"2000\"\n />\n <mat-hint>Atraso antes de aplicar filtros</mat-hint>\n </mat-form-field>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n\n <!-- Seleção -->\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\">check_box</mat-icon>\n Seleção\n </mat-panel-title>\n <mat-panel-description>\n Configure seleção de linhas para ações em lote\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"config-section\">\n <mat-slide-toggle\n formControlName=\"selectionEnabled\"\n class=\"toggle-field\"\n >\n Habilitar seleção\n </mat-slide-toggle>\n\n <div\n class=\"config-fields\"\n *ngIf=\"behaviorForm.get('selectionEnabled')?.value\"\n >\n <mat-form-field appearance=\"outline\">\n <mat-label>Tipo de seleção</mat-label>\n <mat-select formControlName=\"selectionType\">\n <mat-option value=\"single\">Única</mat-option>\n <mat-option value=\"multiple\">Múltipla</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" *ngIf=\"isV2\">\n <mat-label>Modo de seleção</mat-label>\n <mat-select formControlName=\"selectionMode\">\n <mat-option value=\"checkbox\">Checkbox</mat-option>\n <mat-option value=\"row\">Clique na linha</mat-option>\n <mat-option value=\"both\">Ambos</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-slide-toggle\n formControlName=\"allowSelectAll\"\n class=\"toggle-field\"\n *ngIf=\"behaviorForm.get('selectionType')?.value === 'multiple'\"\n >\n Botão selecionar todos\n </mat-slide-toggle>\n </div>\n </div>\n </mat-expansion-panel>\n\n <!-- Interação (V2 only) -->\n <mat-expansion-panel *ngIf=\"isV2\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\">touch_app</mat-icon>\n Interação\n </mat-panel-title>\n <mat-panel-description>\n Configure comportamentos de interação do usuário\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"config-section\">\n <div class=\"config-fields\">\n <mat-slide-toggle\n formControlName=\"rowClickEnabled\"\n class=\"toggle-field\"\n >\n Ação ao clicar na linha\n </mat-slide-toggle>\n\n <mat-form-field\n appearance=\"outline\"\n *ngIf=\"behaviorForm.get('rowClickEnabled')?.value\"\n >\n <mat-label>Ação do clique</mat-label>\n <mat-select formControlName=\"rowClickAction\">\n <mat-option value=\"view\">Visualizar</mat-option>\n <mat-option value=\"edit\">Editar</mat-option>\n <mat-option value=\"select\">Selecionar</mat-option>\n <mat-option value=\"custom\">Personalizada</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-slide-toggle\n formControlName=\"rowDoubleClickEnabled\"\n class=\"toggle-field\"\n >\n Ação ao duplo clique\n </mat-slide-toggle>\n\n <mat-form-field\n appearance=\"outline\"\n *ngIf=\"behaviorForm.get('rowDoubleClickEnabled')?.value\"\n >\n <mat-label>Ação do duplo clique</mat-label>\n <mat-select formControlName=\"rowDoubleClickAction\">\n <mat-option value=\"edit\">Editar</mat-option>\n <mat-option value=\"view\">Visualizar</mat-option>\n <mat-option value=\"custom\">Personalizada</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-slide-toggle\n formControlName=\"hoverEnabled\"\n class=\"toggle-field\"\n >\n Efeitos de hover\n </mat-slide-toggle>\n\n <mat-slide-toggle\n formControlName=\"keyboardEnabled\"\n class=\"toggle-field\"\n >\n Navegação por teclado\n <mat-icon\n class=\"info-icon\"\n matTooltip=\"Permite navegação com setas e atalhos\"\n >\n info_outline\n </mat-icon>\n </mat-slide-toggle>\n </div>\n </div>\n </mat-expansion-panel>\n\n <!-- Virtualização -->\n <mat-expansion-panel *ngIf=\"isV2\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\">view_agenda</mat-icon>\n Virtualização\n </mat-panel-title>\n <mat-panel-description>\n Melhora performance em grandes listas\n </mat-panel-description>\n </mat-expansion-panel-header>\n <div class=\"config-section\">\n <mat-slide-toggle formControlName=\"virtEnabled\" class=\"toggle-field\">\n Habilitar virtualização\n </mat-slide-toggle>\n <div class=\"config-fields\" *ngIf=\"behaviorForm.get('virtEnabled')?.value\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Altura da linha (px)</mat-label>\n <input matInput type=\"number\" formControlName=\"virtItemHeight\" min=\"24\" max=\"96\" />\n <mat-hint>Requer altura de linha previsível</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Buffer (itens)</mat-label>\n <input matInput type=\"number\" formControlName=\"virtBufferSize\" min=\"0\" max=\"200\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Altura mínima do container (px)</mat-label>\n <input matInput type=\"number\" formControlName=\"virtMinHeight\" min=\"120\" max=\"2000\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Estratégia</mat-label>\n <mat-select formControlName=\"virtStrategy\">\n <mat-option value=\"fixed\">Fixa</mat-option>\n <mat-option value=\"dynamic\">Dinâmica</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div class=\"hint\" style=\"opacity:.75; margin-top:6px;\">\n Virtualização melhora performance em grandes listas; requer altura previsível.\n </div>\n </div>\n </mat-expansion-panel>\n\n <!-- Aparência rápida -->\n <mat-expansion-panel *ngIf=\"isV2\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\">density_medium</mat-icon>\n Aparência rápida\n </mat-panel-title>\n <mat-panel-description>\n Densidade e linhas de grade\n </mat-panel-description>\n </mat-expansion-panel-header>\n <div class=\"config-section\">\n <div class=\"config-fields\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Densidade</mat-label>\n <mat-select formControlName=\"density\">\n <mat-option value=\"compact\">Compacta</mat-option>\n <mat-option value=\"comfortable\">Confortável</mat-option>\n <mat-option value=\"spacious\">Espaçosa</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-slide-toggle formControlName=\"showRowBorders\" class=\"toggle-field\">\n Mostrar linhas horizontais\n </mat-slide-toggle>\n <mat-slide-toggle formControlName=\"showColumnBorders\" class=\"toggle-field\">\n Mostrar linhas verticais\n </mat-slide-toggle>\n </div>\n </div>\n </mat-expansion-panel>\n </form>\n </div>\n `,\n styles: [\n `\n .behavior-config-container {\n width: 100%;\n padding: 8px;\n }\n\n .config-section {\n padding: 16px;\n }\n\n .config-fields {\n display: flex;\n flex-direction: column;\n gap: 16px;\n margin-top: 16px;\n }\n\n .toggle-field {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .section-icon {\n margin-right: 8px;\n color: var(--mat-sys-primary);\n }\n\n .info-icon {\n font-size: 18px;\n width: 18px;\n height: 18px;\n color: var(--mat-sys-on-surface-variant);\n cursor: help;\n }\n\n mat-form-field {\n width: 100%;\n }\n\n mat-expansion-panel {\n margin-bottom: 8px;\n border-radius: 8px;\n overflow: hidden;\n }\n\n mat-expansion-panel-header {\n min-height: 56px;\n }\n\n mat-panel-description {\n color: var(--mat-sys-on-surface-variant);\n }\n `,\n ],\n})\nexport class BehaviorConfigEditorComponent implements OnInit, OnDestroy {\n @Input() config: TableConfig = { columns: [] };\n @Output() configChange = new EventEmitter<TableConfig>();\n @Output() behaviorChange = new EventEmitter<BehaviorConfigChange>();\n\n behaviorForm!: FormGroup;\n isV2 = false;\n\n private destroy$ = new Subject<void>();\n\n constructor(private fb: FormBuilder) {}\n\n ngOnInit(): void {\n this.isV2 = isTableConfigV2(this.config);\n this.initializeForm();\n this.setupFormListeners();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private initializeForm(): void {\n // Use type guards to safely access properties\n const v1Config = this.isV2 ? null : (this.config as any);\n const gridOptions = v1Config?.gridOptions || {};\n const pagination = gridOptions.pagination || {};\n\n // Build form with values from config\n this.behaviorForm = this.fb.group({\n // Pagination\n paginationEnabled: [!!gridOptions.pagination],\n pageSize: [pagination.pageSize || 10],\n pageSizeOptions: [\n this.arrayToString(pagination.pageSizeOptions || [5, 10, 25, 50]),\n ],\n showFirstLastButtons: [pagination.showFirstLastButtons !== false],\n paginationStrategy: ['client'], // V2 only\n paginationPosition: ['bottom'],\n paginationStyle: ['default'],\n\n // Sorting\n sortingEnabled: [gridOptions.sortable !== false],\n multiSort: [false], // V2 only\n sortingStrategy: ['client'], // V2 only\n allowClearSort: [true], // V2 only\n defaultSortField: [''],\n defaultSortDirection: ['asc'],\n\n // Filtering\n filteringEnabled: [!!gridOptions.filterable],\n columnFiltersEnabled: [false], // V2 only\n advancedFiltersEnabled: [false], // V2 only\n filterDebounce: [300], // V2 only\n\n // Selection\n selectionEnabled: [!!v1Config?.selection?.enabled],\n selectionType: [v1Config?.selection?.type || 'single'],\n selectionMode: ['checkbox'], // V2 only\n allowSelectAll: [true],\n\n // Interaction (V2 only)\n rowClickEnabled: [false],\n rowClickAction: ['view'],\n rowDoubleClickEnabled: [false],\n rowDoubleClickAction: ['edit'],\n hoverEnabled: [true],\n keyboardEnabled: [false],\n\n // Virtualization (V2 only)\n virtEnabled: [false],\n virtItemHeight: [48],\n virtBufferSize: [10],\n virtMinHeight: [200],\n virtStrategy: ['fixed'],\n\n // Quick appearance (V2 only)\n density: ['comfortable'],\n showRowBorders: [true],\n showColumnBorders: [false],\n });\n\n // If V2, load advanced settings\n if (this.isV2) {\n const v2Config = this.config as TableConfig;\n const behavior = v2Config.behavior || {};\n\n if (behavior.pagination) {\n this.behaviorForm.patchValue({\n paginationEnabled: behavior.pagination.enabled !== false,\n pageSize: behavior.pagination.pageSize || 10,\n pageSizeOptions: this.arrayToString(\n behavior.pagination.pageSizeOptions || [5, 10, 25, 50],\n ),\n showFirstLastButtons:\n behavior.pagination.showFirstLastButtons !== false,\n paginationStrategy: behavior.pagination.strategy || 'client',\n paginationPosition: behavior.pagination.position || 'bottom',\n paginationStyle: behavior.pagination.style || 'default',\n });\n }\n\n if (behavior.sorting) {\n this.behaviorForm.patchValue({\n sortingEnabled: behavior.sorting.enabled !== false,\n multiSort: behavior.sorting.multiSort || false,\n sortingStrategy: behavior.sorting.strategy || 'client',\n allowClearSort: behavior.sorting.allowClearSort !== false,\n defaultSortField: (Array.isArray(behavior.sorting.defaultSort) ? behavior.sorting.defaultSort[0]?.column : behavior.sorting.defaultSort?.column) || '',\n defaultSortDirection: (Array.isArray(behavior.sorting.defaultSort) ? behavior.sorting.defaultSort[0]?.direction : behavior.sorting.defaultSort?.direction) || 'asc',\n });\n }\n\n if (behavior.filtering) {\n this.behaviorForm.patchValue({\n filteringEnabled: behavior.filtering.enabled !== false,\n columnFiltersEnabled:\n behavior.filtering.columnFilters?.enabled || false,\n advancedFiltersEnabled:\n behavior.filtering.advancedFilters?.enabled || false,\n filterDebounce: behavior.filtering.debounceTime || 300,\n });\n }\n\n if (behavior.selection) {\n this.behaviorForm.patchValue({\n selectionEnabled: behavior.selection.enabled || false,\n selectionType: behavior.selection.type || 'single',\n selectionMode: behavior.selection.mode || 'checkbox',\n allowSelectAll: behavior.selection.allowSelectAll !== false,\n });\n }\n\n if (behavior.interaction) {\n this.behaviorForm.patchValue({\n rowClickEnabled: behavior.interaction.rowClick?.enabled || false,\n rowClickAction: behavior.interaction.rowClick?.action || 'view',\n rowDoubleClickEnabled:\n behavior.interaction.rowDoubleClick?.enabled || false,\n rowDoubleClickAction: behavior.interaction.rowDoubleClick?.action || 'edit',\n hoverEnabled: behavior.interaction.hover?.enabled !== false,\n keyboardEnabled: behavior.interaction.keyboard?.enabled || false,\n });\n }\n\n // Virtualization: prefer behavior.virtualization; fallback to performance.virtualization\n const virt = behavior.virtualization || (v2Config.performance?.virtualization as any);\n if (virt) {\n this.behaviorForm.patchValue({\n virtEnabled: !!virt.enabled,\n virtItemHeight: virt.itemHeight ?? 48,\n virtBufferSize: virt.bufferSize ?? 10,\n virtMinHeight: virt.minContainerHeight ?? 200,\n virtStrategy: virt.strategy || 'fixed',\n });\n }\n\n // Quick appearance\n const app = v2Config.appearance || ({} as any);\n this.behaviorForm.patchValue({\n density: app.density || 'comfortable',\n showRowBorders: app.borders?.showRowBorders !== false,\n showColumnBorders: !!app.borders?.showColumnBorders,\n });\n }\n }\n\n private setupFormListeners(): void {\n this.behaviorForm.valueChanges\n .pipe(distinctUntilChanged(), takeUntil(this.destroy$))\n .subscribe((values) => {\n this.updateConfig(values);\n });\n }\n\n /**\n * Applies current form values to the configuration immediately.\n * Useful to flush pending changes before external save operations.\n */\n applyFormChanges(): void {\n if (this.behaviorForm) {\n this.updateConfig(this.behaviorForm.value);\n }\n }\n\n private updateConfig(values: any): void {\n const updatedConfig = { ...this.config };\n\n if (this.isV2) {\n // Update V2 config structure\n const v2Config = updatedConfig as TableConfig;\n\n v2Config.behavior = v2Config.behavior || {};\n\n // Pagination\n v2Config.behavior.pagination = {\n enabled: values.paginationEnabled,\n pageSize: values.pageSize,\n pageSizeOptions: this.stringToArray(values.pageSizeOptions),\n showFirstLastButtons: values.showFirstLastButtons,\n strategy: values.paginationStrategy,\n showPageNumbers: true,\n showPageInfo: true,\n position: values.paginationPosition || 'bottom',\n style: values.paginationStyle || 'default',\n };\n\n // Sorting\n v2Config.behavior.sorting = {\n enabled: values.sortingEnabled,\n multiSort: values.multiSort,\n strategy: values.sortingStrategy,\n allowClearSort: values.allowClearSort,\n showSortIndicators: true,\n indicatorPosition: 'end',\n };\n const dfField = (values.defaultSortField || '').trim();\n const dfDir = values.defaultSortDirection;\n if (dfField) {\n if (values.multiSort) {\n (v2Config.behavior.sorting as any).defaultSort = [{ column: dfField, direction: dfDir }];\n } else {\n (v2Config.behavior.sorting as any).defaultSort = { column: dfField, direction: dfDir };\n }\n } else {\n (v2Config.behavior.sorting as any).defaultSort = undefined;\n }\n\n // Filtering\n v2Config.behavior.filtering = {\n enabled: values.filteringEnabled,\n columnFilters: {\n enabled: values.columnFiltersEnabled,\n defaultType: 'text',\n position: 'header',\n },\n advancedFilters: {\n enabled: values.advancedFiltersEnabled,\n queryBuilder: true,\n savePresets: true,\n },\n strategy: 'client',\n debounceTime: values.filterDebounce,\n };\n\n // Selection\n v2Config.behavior.selection = {\n enabled: values.selectionEnabled,\n type: values.selectionType,\n mode: values.selectionMode,\n allowSelectAll: values.allowSelectAll,\n checkboxPosition: 'start',\n persistSelection: false,\n persistOnDataUpdate: false,\n };\n\n // Interaction\n v2Config.behavior.interaction = {\n rowClick: {\n enabled: values.rowClickEnabled,\n action: values.rowClickAction,\n },\n rowDoubleClick: {\n enabled: values.rowDoubleClickEnabled,\n action: values.rowDoubleClickAction,\n },\n hover: {\n enabled: values.hoverEnabled,\n highlightRow: true,\n showActionsOnHover: false,\n },\n keyboard: {\n enabled: values.keyboardEnabled,\n arrowNavigation: true,\n spaceSelection: true,\n },\n };\n\n // Virtualization\n v2Config.behavior.virtualization = {\n enabled: values.virtEnabled,\n itemHeight: values.virtItemHeight,\n bufferSize: values.virtBufferSize,\n minContainerHeight: values.virtMinHeight,\n strategy: values.virtStrategy,\n };\n\n // Quick appearance\n v2Config.appearance = (v2Config.appearance || ({} as any)) as any;\n (v2Config.appearance as any).density = values.density;\n (v2Config.appearance as any).borders = {\n ...((v2Config.appearance as any).borders || {}),\n showRowBorders: values.showRowBorders,\n showColumnBorders: values.showColumnBorders,\n } as any;\n } else {\n // Update V1 config structure\n const v1UpdatedConfig = updatedConfig as any;\n v1UpdatedConfig.gridOptions = v1UpdatedConfig.gridOptions || {};\n\n if (values.paginationEnabled) {\n v1UpdatedConfig.gridOptions.pagination = {\n pageSize: values.pageSize,\n pageSizeOptions: this.stringToArray(values.pageSizeOptions),\n showFirstLastButtons: values.showFirstLastButtons,\n };\n } else {\n delete v1UpdatedConfig.gridOptions.pagination;\n }\n\n v1UpdatedConfig.gridOptions.sortable = values.sortingEnabled;\n v1UpdatedConfig.gridOptions.filterable = values.filteringEnabled;\n\n if (values.selectionEnabled) {\n (updatedConfig as any).selection = {\n enabled: true,\n type: values.selectionType,\n };\n } else {\n delete (updatedConfig as any).selection;\n }\n }\n\n this.configChange.emit(updatedConfig);\n }\n\n private arrayToString(arr: number[]): string {\n return arr.join(', ');\n }\n\n private stringToArray(str: string): number[] {\n return str\n .split(',')\n .map((s) => parseInt(s.trim()))\n .filter((n) => !isNaN(n));\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n OnChanges,\n SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n FormsModule,\n ReactiveFormsModule,\n FormBuilder,\n FormGroup,\n FormArray,\n} from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatListModule } from '@angular/material/list';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatMenuModule } from '@angular/material/menu';\nimport {\n DragDropModule,\n CdkDragDrop,\n moveItemInArray,\n} from '@angular/cdk/drag-drop';\nimport { TableConfig, IconPickerService, PraxisIconDirective } from '@praxisui/core';\nimport { Subject, takeUntil } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\n\nexport interface ToolbarAction {\n id: string;\n label: string;\n icon?: string;\n type: 'button' | 'icon' | 'fab' | 'menu';\n color?: 'primary' | 'accent' | 'warn';\n /** Aparência do botão Material: filled (flat), outlined (stroked), elevated (raised), text, tonal */\n appearance?: 'filled' | 'outlined' | 'elevated' | 'text' | 'tonal';\n action: string;\n position: 'start' | 'end';\n order?: number;\n disabled?: boolean;\n visible?: boolean;\n shortcut?: string;\n tooltip?: string;\n visibleWhen?: string;\n children?: ToolbarAction[];\n}\n\nexport interface RowAction {\n id: string;\n label: string;\n icon: string;\n action: string;\n color?: 'primary' | 'accent' | 'warn';\n tooltip?: string;\n requiresConfirmation?: boolean;\n autoDelete?: boolean;\n separator?: boolean;\n conditional?: string; // Expressão para mostrar/ocultar\n}\n\nexport interface BulkAction {\n id: string;\n label: string;\n icon: string;\n action: string;\n color?: 'primary' | 'accent' | 'warn';\n tooltip?: string;\n requiresConfirmation?: boolean;\n autoDelete?: boolean;\n minSelections?: number;\n maxSelections?: number;\n}\n\nexport interface ToolbarActionsChange {\n type: 'toolbar' | 'rowActions' | 'bulkActions' | 'export';\n property: string;\n value: any;\n fullConfig: TableConfig;\n}\n\n@Component({\n selector: 'toolbar-actions-editor',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatSlideToggleModule,\n MatExpansionModule,\n MatIconModule,\n MatTooltipModule,\n MatDividerModule,\n MatButtonModule,\n MatListModule,\n MatChipsModule,\n MatMenuModule,\n DragDropModule,\n PraxisIconDirective,\n ],\n template: `\n <div class=\"toolbar-actions-container\">\n <form [formGroup]=\"toolbarForm\">\n <!-- Barra de Ferramentas -->\n <mat-expansion-panel expanded>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\">build</mat-icon>\n Barra de Ferramentas\n </mat-panel-title>\n <mat-panel-description>\n Configure a barra superior da tabela\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"config-section\">\n <mat-slide-toggle\n formControlName=\"toolbarVisible\"\n class=\"toggle-field\"\n >\n Mostrar barra de ferramentas\n </mat-slide-toggle>\n\n <div\n class=\"config-fields\"\n *ngIf=\"toolbarForm.get('toolbarVisible')?.value\"\n >\n <mat-form-field appearance=\"outline\">\n <mat-label>Título da barra</mat-label>\n <input\n matInput\n formControlName=\"toolbarTitle\"\n placeholder=\"Ex: Gerenciar Usuários\"\n />\n <mat-hint>Título exibido na barra de ferramentas</mat-hint>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Subtítulo</mat-label>\n <input\n matInput\n formControlName=\"toolbarSubtitle\"\n placeholder=\"Ex: Lista completa de usuários do sistema\"\n />\n <mat-hint>Texto de apoio abaixo do título</mat-hint>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Posição</mat-label>\n <mat-select formControlName=\"toolbarPosition\">\n <mat-option value=\"top\">Acima da tabela</mat-option>\n <mat-option value=\"bottom\">Abaixo da tabela</mat-option>\n <mat-option value=\"both\">Ambos</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Altura da barra (px)</mat-label>\n <input\n matInput\n type=\"number\"\n formControlName=\"toolbarHeight\"\n min=\"40\"\n max=\"120\"\n />\n <mat-hint>Altura em pixels da barra de ferramentas</mat-hint>\n </mat-form-field>\n </div>\n </div>\n </mat-expansion-panel>\n\n <!-- Ações da Toolbar -->\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\">add_circle</mat-icon>\n Ações da Toolbar\n </mat-panel-title>\n <mat-panel-description>\n Botões e menus personalizados na barra\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"config-section\">\n <!-- Atalho rápido: Botão Adicionar (create) -->\n <div class=\"quick-add\">\n <mat-slide-toggle formControlName=\"addButtonEnabled\" class=\"toggle-field\">\n Exibir botão \"Adicionar\"\n </mat-slide-toggle>\n\n <div class=\"config-fields\" *ngIf=\"toolbarForm.get('addButtonEnabled')?.value\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Label</mat-label>\n <input matInput formControlName=\"addButtonLabel\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Ícone</mat-label>\n <span matPrefix *ngIf=\"toolbarForm.value.addButtonIcon\">\n <mat-icon aria-hidden=\"true\">{{ toolbarForm.value.addButtonIcon }}</mat-icon>\n </span>\n <input matInput formControlName=\"addButtonIcon\" placeholder=\"ex.: add, add_circle\" />\n <mat-hint>Material Symbols (mi:...)\n </mat-hint>\n <button mat-icon-button matSuffix type=\"button\" (click)=\"pickAddButtonIcon()\" matTooltip=\"Escolher ícone\">\n <mat-icon>search</mat-icon>\n </button>\n <button mat-icon-button matSuffix type=\"button\" (click)=\"toolbarForm.get('addButtonIcon')?.setValue('')\" matTooltip=\"Limpar\" *ngIf=\"toolbarForm.value.addButtonIcon\">\n <mat-icon [praxisIcon]=\"'backspace'\"></mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor</mat-label>\n <mat-select formControlName=\"addButtonColor\">\n <mat-option value=\"primary\">Primary</mat-option>\n <mat-option value=\"accent\">Accent</mat-option>\n <mat-option value=\"warn\">Warn</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Posição</mat-label>\n <mat-select formControlName=\"addButtonPosition\">\n <mat-option value=\"start\">Início</mat-option>\n <mat-option value=\"end\">Fim</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Aparência</mat-label>\n <mat-select formControlName=\"addButtonAppearance\">\n <mat-option value=\"filled\">Preenchido</mat-option>\n <mat-option value=\"outlined\">Contornado</mat-option>\n <mat-option value=\"elevated\">Elevado</mat-option>\n <mat-option value=\"text\">Texto</mat-option>\n <mat-option value=\"tonal\">Tonal</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"actions-header\">\n <button\n mat-raised-button\n color=\"primary\"\n (click)=\"addToolbarAction()\"\n type=\"button\"\n >\n <mat-icon [praxisIcon]=\"'add'\"></mat-icon>\n Adicionar Ação\n </button>\n <button mat-stroked-button [matMenuTriggerFor]=\"toolbarTplMenu\" type=\"button\" style=\"margin-left:8px\">\n <mat-icon [praxisIcon]=\"'bolt'\"></mat-icon>\n Usar Template\n </button>\n <mat-menu #toolbarTplMenu=\"matMenu\">\n <button mat-menu-item [matMenuTriggerFor]=\"toolbarCrudTpl\">\n <mat-icon [praxisIcon]=\"'add_circle'\"></mat-icon>\n <span>CRUD: botão Adicionar</span>\n </button>\n </mat-menu>\n <mat-menu #toolbarCrudTpl=\"matMenu\">\n <button mat-menu-item (click)=\"applyToolbarTemplate('crudAdd','replace')\">Aplicar (Substituir)</button>\n <button mat-menu-item (click)=\"applyToolbarTemplate('crudAdd','merge')\">Mesclar (Manter e adicionar)</button>\n </mat-menu>\n </div>\n\n <div\n class=\"actions-list\"\n cdkDropList\n (cdkDropListDropped)=\"dropToolbarAction($event)\"\n >\n <div\n class=\"action-item\"\n *ngFor=\"let action of toolbarActions; let i = index\"\n cdkDrag\n >\n <div class=\"action-header\" cdkDragHandle>\n <mat-icon class=\"drag-handle\" [praxisIcon]=\"'drag_indicator'\"></mat-icon>\n <mat-icon [praxisIcon]=\"action.icon\"></mat-icon>\n <span class=\"action-label\">{{\n action.label || 'Nova Ação'\n }}</span>\n <div class=\"action-controls\">\n <button\n mat-icon-button\n (click)=\"editToolbarAction(i)\"\n type=\"button\"\n >\n <mat-icon [praxisIcon]=\"'edit'\"></mat-icon>\n </button>\n <button\n mat-icon-button\n (click)=\"removeToolbarAction(i)\"\n type=\"button\"\n color=\"warn\"\n >\n <mat-icon [praxisIcon]=\"'delete'\"></mat-icon>\n </button>\n </div>\n </div>\n\n <div\n class=\"action-details\"\n *ngIf=\"editingToolbarActionIndex === i\"\n >\n <div class=\"action-form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>ID da ação</mat-label>\n <input\n matInput\n [(ngModel)]=\"action.id\"\n (ngModelChange)=\"updateToolbarActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Label</mat-label>\n <input\n matInput\n [(ngModel)]=\"action.label\"\n (ngModelChange)=\"updateToolbarActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Ícone</mat-label>\n <span matPrefix *ngIf=\"action.icon\">\n <mat-icon aria-hidden=\"true\" [praxisIcon]=\"action.icon\"></mat-icon>\n </span>\n <input\n matInput\n [(ngModel)]=\"action.icon\"\n (ngModelChange)=\"updateToolbarActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n placeholder=\"ex.: add, edit, delete\"\n />\n <mat-hint>Material Symbols (mi:...)</mat-hint>\n <button mat-icon-button matSuffix type=\"button\" (click)=\"pickActionIcon(i)\" matTooltip=\"Escolher ícone\">\n <mat-icon [praxisIcon]=\"'search'\"></mat-icon>\n </button>\n <button mat-icon-button matSuffix type=\"button\" (click)=\"action.icon=''; updateToolbarActions()\" matTooltip=\"Limpar\" *ngIf=\"action.icon\">\n <mat-icon [praxisIcon]=\"'backspace'\"></mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Tipo</mat-label>\n <mat-select\n [(ngModel)]=\"action.type\"\n (ngModelChange)=\"updateToolbarActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <mat-option value=\"button\">Botão</mat-option>\n <mat-option value=\"menu\">Menu</mat-option>\n <mat-option value=\"toggle\">Toggle</mat-option>\n <mat-option value=\"input\">Input</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" *ngIf=\"action.type === 'button'\">\n <mat-label>Aparência</mat-label>\n <mat-select\n [(ngModel)]=\"action.appearance\"\n (ngModelChange)=\"updateToolbarActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <mat-option value=\"filled\">Preenchido</mat-option>\n <mat-option value=\"outlined\">Contornado</mat-option>\n <mat-option value=\"elevated\">Elevado</mat-option>\n <mat-option value=\"text\">Texto</mat-option>\n <mat-option value=\"tonal\">Tonal</mat-option>\n </mat-select>\n <mat-hint>Compatível com Angular Material: filled/raised/stroked/text; tonal usa estilo custom.</mat-hint>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Ação/Função</mat-label>\n <input\n matInput\n [(ngModel)]=\"action.action\"\n (ngModelChange)=\"updateToolbarActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n />\n <mat-hint>Nome da função a ser chamada</mat-hint>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Posição</mat-label>\n <mat-select\n [(ngModel)]=\"action.position\"\n (ngModelChange)=\"updateToolbarActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <mat-option value=\"start\">Início</mat-option>\n <mat-option value=\"center\">Centro</mat-option>\n <mat-option value=\"end\">Fim</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor</mat-label>\n <mat-select\n [(ngModel)]=\"action.color\"\n (ngModelChange)=\"updateToolbarActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <mat-option value=\"\">Padrão</mat-option>\n <mat-option value=\"primary\">Primary</mat-option>\n <mat-option value=\"accent\">Accent</mat-option>\n <mat-option value=\"warn\">Warn</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Atalho de teclado</mat-label>\n <input\n matInput\n [(ngModel)]=\"action.shortcut\"\n (ngModelChange)=\"updateToolbarActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n placeholder=\"Ex: Ctrl+N\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Tooltip</mat-label>\n <input\n matInput\n [(ngModel)]=\"action.tooltip\"\n (ngModelChange)=\"updateToolbarActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n />\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n\n <!-- Ações por Linha -->\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\" [praxisIcon]=\"'more_vert'\"></mat-icon>\n Ações por Linha\n </mat-panel-title>\n <mat-panel-description>\n Ações específicas para cada registro\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"config-section\">\n <mat-slide-toggle\n formControlName=\"rowActionsEnabled\"\n class=\"toggle-field\"\n >\n Habilitar ações por linha\n </mat-slide-toggle>\n\n <div\n class=\"config-fields\"\n *ngIf=\"toolbarForm.get('rowActionsEnabled')?.value\"\n >\n <mat-form-field appearance=\"outline\">\n <mat-label>Modo de exibição</mat-label>\n <mat-select formControlName=\"rowActionsDisplay\">\n <mat-option value=\"menu\">Menu suspenso</mat-option>\n <mat-option value=\"buttons\">Botões individuais</mat-option>\n <mat-option value=\"hybrid\"\n >Híbrido (botões + menu)</mat-option\n >\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Quando mostrar</mat-label>\n <mat-select formControlName=\"rowActionsTrigger\">\n <mat-option value=\"always\">Sempre visível</mat-option>\n <mat-option value=\"hover\">Apenas no hover</mat-option>\n <mat-option value=\"focus\">Apenas com foco</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Máximo de ações visíveis</mat-label>\n <input\n matInput\n type=\"number\"\n formControlName=\"maxVisibleRowActions\"\n min=\"1\"\n max=\"5\"\n />\n <mat-hint>Demais ações ficam no menu \"Mais\"</mat-hint>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Largura da coluna de ações</mat-label>\n <input matInput formControlName=\"rowActionsWidth\" placeholder=\"ex.: 96px, 6rem\" />\n <mat-hint>Aplica no header e nas células</mat-hint>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Fixar coluna de ações</mat-label>\n <mat-select formControlName=\"rowActionsSticky\">\n <mat-option [value]=\"null\">Nenhum</mat-option>\n <mat-option value=\"start\">Início</mat-option>\n <mat-option value=\"end\">Fim</mat-option>\n </mat-select>\n <mat-hint>Fixar coluna de ações (início/fim)</mat-hint>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Ícone do menu (três pontos)</mat-label>\n <span matPrefix *ngIf=\"toolbarForm.value.rowActionsMenuIcon\">\n <mat-icon aria-hidden=\"true\" [praxisIcon]=\"toolbarForm.value.rowActionsMenuIcon\"></mat-icon>\n </span>\n <input matInput formControlName=\"rowActionsMenuIcon\" placeholder=\"ex.: more_vert, more_horiz\" />\n <button mat-icon-button matSuffix type=\"button\" (click)=\"pickRowMenuIcon()\" matTooltip=\"Escolher ícone\">\n <mat-icon [praxisIcon]=\"'search'\"></mat-icon>\n </button>\n <button mat-icon-button matSuffix type=\"button\" (click)=\"toolbarForm.get('rowActionsMenuIcon')?.setValue('')\" matTooltip=\"Limpar\" *ngIf=\"toolbarForm.value.rowActionsMenuIcon\">\n <mat-icon [praxisIcon]=\"'backspace'\"></mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor do botão do menu</mat-label>\n <mat-select formControlName=\"rowActionsMenuButtonColor\">\n <mat-option value=\"basic\">Padrão</mat-option>\n <mat-option value=\"primary\">Primary</mat-option>\n <mat-option value=\"accent\">Accent</mat-option>\n <mat-option value=\"warn\">Warn</mat-option>\n </mat-select>\n </mat-form-field>\n\n <div class=\"subsection\" style=\"grid-column: 1 / -1;\">\n <h4> Cabeçalho da coluna de ações </h4>\n <div class=\"action-form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Label</mat-label>\n <input matInput formControlName=\"rowActionsHeaderLabel\" placeholder=\"Ex.: Ações\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Ícone</mat-label>\n <span matPrefix *ngIf=\"toolbarForm.value.rowActionsHeaderIcon\">\n <mat-icon aria-hidden=\"true\" [praxisIcon]=\"toolbarForm.value.rowActionsHeaderIcon\"></mat-icon>\n </span>\n <input matInput formControlName=\"rowActionsHeaderIcon\" placeholder=\"ex.: more_horiz, build\" />\n <button mat-icon-button matSuffix type=\"button\" (click)=\"pickRowHeaderIcon()\" matTooltip=\"Escolher ícone\">\n <mat-icon [praxisIcon]=\"'search'\"></mat-icon>\n </button>\n <button mat-icon-button matSuffix type=\"button\" (click)=\"toolbarForm.get('rowActionsHeaderIcon')?.setValue('')\" matTooltip=\"Limpar\" *ngIf=\"toolbarForm.value.rowActionsHeaderIcon\">\n <mat-icon [praxisIcon]=\"'backspace'\"></mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Tooltip</mat-label>\n <input matInput formControlName=\"rowActionsHeaderTooltip\" placeholder=\"Ex.: Ações disponíveis\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Alinhamento</mat-label>\n <mat-select formControlName=\"rowActionsHeaderAlign\">\n <mat-option value=\"start\">Início</mat-option>\n <mat-option value=\"center\">Centro</mat-option>\n <mat-option value=\"end\">Fim</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"actions-header\">\n <button\n mat-raised-button\n color=\"primary\"\n (click)=\"addRowAction()\"\n type=\"button\"\n >\n <mat-icon [praxisIcon]=\"'add'\"></mat-icon>\n Adicionar Ação de Linha\n </button>\n <button mat-stroked-button [matMenuTriggerFor]=\"rowTplMenu\" type=\"button\" style=\"margin-left:8px\">\n <mat-icon [praxisIcon]=\"'bolt'\"></mat-icon>\n Usar Template\n </button>\n <mat-menu #rowTplMenu=\"matMenu\">\n <button mat-menu-item [matMenuTriggerFor]=\"rowCrudTpl\">\n <mat-icon [praxisIcon]=\"'list'\"></mat-icon>\n <span>CRUD padrão (ver/editar/excluir)</span>\n </button>\n <button mat-menu-item [matMenuTriggerFor]=\"rowEditDeleteTpl\">\n <mat-icon [praxisIcon]=\"'edit'\"></mat-icon>\n <span>Editar + Excluir</span>\n </button>\n <button mat-menu-item [matMenuTriggerFor]=\"rowViewOnlyTpl\">\n <mat-icon [praxisIcon]=\"'visibility'\"></mat-icon>\n <span>Apenas Visualizar</span>\n </button>\n <button mat-menu-item [matMenuTriggerFor]=\"rowCrudBulkTpl\">\n <mat-icon [praxisIcon]=\"'delete_sweep'\"></mat-icon>\n <span>CRUD + Excluir em Lote</span>\n </button>\n </mat-menu>\n <mat-menu #rowCrudTpl=\"matMenu\">\n <button mat-menu-item (click)=\"applyRowActionsTemplate('crud','replace')\">Aplicar (Substituir)</button>\n <button mat-menu-item (click)=\"applyRowActionsTemplate('crud','merge')\">Mesclar (Manter e adicionar)</button>\n </mat-menu>\n <mat-menu #rowEditDeleteTpl=\"matMenu\">\n <button mat-menu-item (click)=\"applyRowActionsTemplate('editDelete','replace')\">Aplicar (Substituir)</button>\n <button mat-menu-item (click)=\"applyRowActionsTemplate('editDelete','merge')\">Mesclar (Manter e adicionar)</button>\n </mat-menu>\n <mat-menu #rowViewOnlyTpl=\"matMenu\">\n <button mat-menu-item (click)=\"applyRowActionsTemplate('viewOnly','replace')\">Aplicar (Substituir)</button>\n <button mat-menu-item (click)=\"applyRowActionsTemplate('viewOnly','merge')\">Mesclar (Manter e adicionar)</button>\n </mat-menu>\n <mat-menu #rowCrudBulkTpl=\"matMenu\">\n <button mat-menu-item (click)=\"applyRowActionsTemplate('crudWithBulk','replace')\">Aplicar (Substituir)</button>\n <button mat-menu-item (click)=\"applyRowActionsTemplate('crudWithBulk','merge')\">Mesclar (Manter e adicionar)</button>\n </mat-menu>\n </div>\n\n <div\n class=\"actions-list\"\n cdkDropList\n (cdkDropListDropped)=\"dropRowAction($event)\"\n >\n <div\n class=\"action-item\"\n *ngFor=\"let action of rowActions; let i = index\"\n cdkDrag\n >\n <div class=\"action-header\" cdkDragHandle>\n <mat-icon class=\"drag-handle\" [praxisIcon]=\"'drag_indicator'\"></mat-icon>\n <mat-icon [praxisIcon]=\"action.icon\"></mat-icon>\n <span class=\"action-label\">{{\n action.label || 'Nova Ação'\n }}</span>\n <div class=\"action-controls\">\n <button\n mat-icon-button\n (click)=\"editRowAction(i)\"\n type=\"button\"\n >\n <mat-icon [praxisIcon]=\"'edit'\"></mat-icon>\n </button>\n <button\n mat-icon-button\n (click)=\"removeRowAction(i)\"\n type=\"button\"\n color=\"warn\"\n >\n <mat-icon [praxisIcon]=\"'delete'\"></mat-icon>\n </button>\n </div>\n </div>\n\n <div\n class=\"action-details\"\n *ngIf=\"editingRowActionIndex === i\"\n >\n <div class=\"action-form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>ID da ação</mat-label>\n <input\n matInput\n [(ngModel)]=\"action.id\"\n (ngModelChange)=\"updateRowActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Label</mat-label>\n <input\n matInput\n [(ngModel)]=\"action.label\"\n (ngModelChange)=\"updateRowActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Ícone</mat-label>\n <span matPrefix *ngIf=\"action.icon\">\n <mat-icon aria-hidden=\"true\" [praxisIcon]=\"action.icon\"></mat-icon>\n </span>\n <input\n matInput\n [(ngModel)]=\"action.icon\"\n (ngModelChange)=\"updateRowActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n placeholder=\"ex.: add, edit, delete\"\n />\n <mat-hint>Material Symbols (mi:...)</mat-hint>\n <button mat-icon-button matSuffix type=\"button\" (click)=\"pickRowActionIcon(i)\" matTooltip=\"Escolher ícone\">\n <mat-icon [praxisIcon]=\"'search'\"></mat-icon>\n </button>\n <button mat-icon-button matSuffix type=\"button\" (click)=\"action.icon=''; updateRowActions()\" matTooltip=\"Limpar\" *ngIf=\"action.icon\">\n <mat-icon [praxisIcon]=\"'backspace'\"></mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Ação/Função</mat-label>\n <input\n matInput\n [(ngModel)]=\"action.action\"\n (ngModelChange)=\"updateRowActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor</mat-label>\n <mat-select\n [(ngModel)]=\"action.color\"\n (ngModelChange)=\"updateRowActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <mat-option value=\"\">Padrão</mat-option>\n <mat-option value=\"primary\">Primary</mat-option>\n <mat-option value=\"accent\">Accent</mat-option>\n <mat-option value=\"warn\">Warn</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Tooltip</mat-label>\n <input\n matInput\n [(ngModel)]=\"action.tooltip\"\n (ngModelChange)=\"updateRowActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n />\n </mat-form-field>\n\n <mat-slide-toggle\n [(ngModel)]=\"action.requiresConfirmation\"\n (ngModelChange)=\"updateRowActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n class=\"toggle-field\"\n >\n Requer confirmação\n </mat-slide-toggle>\n\n <mat-slide-toggle\n *ngIf=\"action.action === 'delete'\"\n [(ngModel)]=\"action.autoDelete\"\n (ngModelChange)=\"updateRowActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n class=\"toggle-field\"\n >\n Excluir automaticamente\n </mat-slide-toggle>\n\n <mat-slide-toggle\n [(ngModel)]=\"action.separator\"\n (ngModelChange)=\"updateRowActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n class=\"toggle-field\"\n >\n Separador após esta ação\n </mat-slide-toggle>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n\n <!-- Ações em Lote -->\n <mat-expansion-panel *ngIf=\"isV2\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\" [praxisIcon]=\"'select_all'\"></mat-icon>\n Ações em Lote\n </mat-panel-title>\n <mat-panel-description>\n Ações para múltiplas seleções (V2 only)\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"config-section\">\n <mat-slide-toggle\n formControlName=\"bulkActionsEnabled\"\n class=\"toggle-field\"\n >\n Habilitar ações em lote\n </mat-slide-toggle>\n\n <div\n class=\"config-fields\"\n *ngIf=\"toolbarForm.get('bulkActionsEnabled')?.value\"\n >\n <mat-form-field appearance=\"outline\">\n <mat-label>Posição das ações em lote</mat-label>\n <mat-select formControlName=\"bulkActionsPosition\">\n <mat-option value=\"toolbar\"\n >Na barra de ferramentas</mat-option\n >\n <mat-option value=\"floating\">Barra flutuante</mat-option>\n <mat-option value=\"bottom\">Barra inferior</mat-option>\n </mat-select>\n </mat-form-field>\n\n <div class=\"actions-header\">\n <button\n mat-raised-button\n color=\"primary\"\n (click)=\"addBulkAction()\"\n type=\"button\"\n >\n <mat-icon [praxisIcon]=\"'add'\"></mat-icon>\n Adicionar Ação em Lote\n </button>\n </div>\n\n <div\n class=\"actions-list\"\n cdkDropList\n (cdkDropListDropped)=\"dropBulkAction($event)\"\n >\n <div\n class=\"action-item\"\n *ngFor=\"let action of bulkActions; let i = index\"\n cdkDrag\n >\n <div class=\"action-header\" cdkDragHandle>\n <mat-icon class=\"drag-handle\">drag_indicator</mat-icon>\n <mat-icon>{{ action.icon }}</mat-icon>\n <span class=\"action-label\">{{\n action.label || 'Nova Ação'\n }}</span>\n <div class=\"action-controls\">\n <button\n mat-icon-button\n (click)=\"editBulkAction(i)\"\n type=\"button\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n <button\n mat-icon-button\n (click)=\"removeBulkAction(i)\"\n type=\"button\"\n color=\"warn\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n\n <div\n class=\"action-details\"\n *ngIf=\"editingBulkActionIndex === i\"\n >\n <div class=\"action-form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>ID da ação</mat-label>\n <input\n matInput\n [(ngModel)]=\"action.id\"\n (ngModelChange)=\"updateBulkActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Label</mat-label>\n <input\n matInput\n [(ngModel)]=\"action.label\"\n (ngModelChange)=\"updateBulkActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Ícone</mat-label>\n <span matPrefix *ngIf=\"action.icon\">\n <mat-icon aria-hidden=\"true\">{{ action.icon }}</mat-icon>\n </span>\n <input\n matInput\n [(ngModel)]=\"action.icon\"\n (ngModelChange)=\"updateBulkActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n placeholder=\"ex.: add, edit, delete\"\n />\n <mat-hint>Material Symbols (mi:...)</mat-hint>\n <button mat-icon-button matSuffix type=\"button\" (click)=\"pickBulkActionIcon(i)\" matTooltip=\"Escolher ícone\">\n <mat-icon>search</mat-icon>\n </button>\n <button mat-icon-button matSuffix type=\"button\" (click)=\"action.icon=''; updateBulkActions()\" matTooltip=\"Limpar\" *ngIf=\"action.icon\">\n <mat-icon>backspace</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Ação/Função</mat-label>\n <input\n matInput\n [(ngModel)]=\"action.action\"\n (ngModelChange)=\"updateBulkActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor</mat-label>\n <mat-select\n [(ngModel)]=\"action.color\"\n (ngModelChange)=\"updateBulkActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <mat-option value=\"\">Padrão</mat-option>\n <mat-option value=\"primary\">Primary</mat-option>\n <mat-option value=\"accent\">Accent</mat-option>\n <mat-option value=\"warn\">Warn</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Mínimo de seleções</mat-label>\n <input\n matInput\n type=\"number\"\n [(ngModel)]=\"action.minSelections\"\n (ngModelChange)=\"updateBulkActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n min=\"1\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Máximo de seleções</mat-label>\n <input\n matInput\n type=\"number\"\n [(ngModel)]=\"action.maxSelections\"\n (ngModelChange)=\"updateBulkActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n min=\"1\"\n />\n </mat-form-field>\n\n <mat-slide-toggle\n [(ngModel)]=\"action.requiresConfirmation\"\n (ngModelChange)=\"updateBulkActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n class=\"toggle-field\"\n >\n Requer confirmação\n </mat-slide-toggle>\n\n <mat-slide-toggle\n *ngIf=\"action.action === 'delete'\"\n [(ngModel)]=\"action.autoDelete\"\n (ngModelChange)=\"updateBulkActions()\"\n [ngModelOptions]=\"{ standalone: true }\"\n class=\"toggle-field\"\n >\n Excluir automaticamente\n </mat-slide-toggle>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n\n <!-- Exportação -->\n <mat-expansion-panel *ngIf=\"isV2\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\">download</mat-icon>\n Exportação\n </mat-panel-title>\n <mat-panel-description>\n Configurações de exportação de dados (V2 only)\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"config-section\">\n <mat-slide-toggle\n formControlName=\"exportEnabled\"\n class=\"toggle-field\"\n >\n Habilitar exportação\n </mat-slide-toggle>\n\n <div\n class=\"config-fields\"\n *ngIf=\"toolbarForm.get('exportEnabled')?.value\"\n >\n <mat-form-field appearance=\"outline\">\n <mat-label>Formatos disponíveis</mat-label>\n <mat-select formControlName=\"exportFormats\" multiple>\n <mat-option value=\"excel\">Excel (.xlsx)</mat-option>\n <mat-option value=\"csv\">CSV</mat-option>\n <mat-option value=\"pdf\">PDF</mat-option>\n <mat-option value=\"json\">JSON</mat-option>\n </mat-select>\n <mat-hint\n >Segure Ctrl para selecionar múltiplos formatos</mat-hint\n >\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Nome padrão do arquivo</mat-label>\n <input\n matInput\n formControlName=\"exportFileName\"\n placeholder=\"dados-export\"\n />\n </mat-form-field>\n\n <mat-slide-toggle\n formControlName=\"exportIncludeHeaders\"\n class=\"toggle-field\"\n >\n Incluir cabeçalhos\n </mat-slide-toggle>\n\n <mat-slide-toggle\n formControlName=\"exportRespectFilters\"\n class=\"toggle-field\"\n >\n Respeitar filtros aplicados\n </mat-slide-toggle>\n\n <mat-slide-toggle\n formControlName=\"exportSelectedOnly\"\n class=\"toggle-field\"\n >\n Apenas linhas selecionadas\n </mat-slide-toggle>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Máximo de linhas</mat-label>\n <input\n matInput\n type=\"number\"\n formControlName=\"exportMaxRows\"\n min=\"1\"\n max=\"100000\"\n />\n <mat-hint>Limite para evitar arquivos muito grandes</mat-hint>\n </mat-form-field>\n </div>\n </div>\n </mat-expansion-panel>\n </form>\n </div>\n `,\n styles: [\n `\n :host {\n --tae-primary: var(--mat-sys-primary, var(--md-sys-color-primary, var(--sicoob-primary-default)));\n --tae-surface: var(--mat-sys-surface, var(--md-sys-color-surface, var(--sicoob-bg-elev-1)));\n --tae-surface-low: var(--mat-sys-surface-container-low, var(--sicoob-bg-elev-1));\n --tae-surface-variant: var(--mat-sys-surface-variant, var(--sicoob-bg-elev-2));\n --tae-outline-variant: var(--mat-sys-outline-variant, var(--sicoob-stroke-medium));\n --tae-on-surface: var(--mat-sys-on-surface, var(--sicoob-text-high));\n --tae-on-surface-variant: var(--mat-sys-on-surface-variant, color-mix(in srgb, var(--sicoob-text-high), transparent 40%));\n }\n .toolbar-actions-container {\n width: 100%;\n padding: 8px;\n }\n\n .config-section {\n padding: 16px;\n }\n\n .config-fields {\n display: flex;\n flex-direction: column;\n gap: 16px;\n margin-top: 16px;\n }\n\n .nested-fields {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-left: 24px;\n margin-top: 12px;\n padding: 16px;\n background-color: var(--tae-surface-variant);\n border-radius: 8px;\n }\n\n .toggle-field {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .section-icon { margin-right: 8px; color: var(--tae-primary); }\n\n .subsection {\n margin-top: 24px;\n padding: 16px;\n border: 1px solid var(--tae-outline-variant);\n border-radius: 8px;\n }\n\n .subsection h4 {\n margin: 0 0 16px 0;\n color: var(--tae-on-surface);\n font-weight: 500;\n }\n\n .actions-header {\n margin: 16px 0;\n display: flex;\n justify-content: flex-start;\n }\n\n .actions-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-height: 60px;\n }\n\n .action-item {\n border: 1px solid var(--tae-outline-variant);\n border-radius: 8px;\n background-color: var(--tae-surface);\n overflow: hidden;\n }\n\n .action-header {\n display: flex;\n align-items: center;\n padding: 12px 16px;\n background-color: var(--tae-surface-low);\n cursor: move;\n }\n\n .drag-handle {\n margin-right: 8px;\n color: var(--tae-on-surface-variant);\n cursor: grab;\n }\n\n .drag-handle:active {\n cursor: grabbing;\n }\n\n .action-label {\n flex: 1;\n margin-left: 8px;\n font-weight: 500;\n }\n\n .action-controls {\n display: flex;\n gap: 4px;\n }\n\n .action-details {\n padding: 16px;\n border-top: 1px solid var(--tae-outline-variant);\n background-color: var(--tae-surface);\n }\n\n .action-form {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 16px;\n }\n\n mat-form-field {\n width: 100%;\n }\n\n mat-expansion-panel {\n margin-bottom: 8px;\n border-radius: 8px;\n overflow: hidden;\n }\n\n mat-expansion-panel-header {\n min-height: 56px;\n }\n\n mat-panel-description { color: var(--tae-on-surface-variant); }\n\n .cdk-drag-preview {\n box-sizing: border-box;\n border-radius: 4px;\n box-shadow:\n 0 5px 5px -3px rgba(0, 0, 0, 0.2),\n 0 8px 10px 1px rgba(0, 0, 0, 0.14),\n 0 3px 14px 2px rgba(0, 0, 0, 0.12);\n }\n\n .cdk-drag-placeholder {\n opacity: 0;\n }\n\n .cdk-drag-animating {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n }\n\n .actions-list.cdk-drop-list-dragging\n .action-item:not(.cdk-drag-placeholder) {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n }\n `,\n ],\n})\nexport class ToolbarActionsEditorComponent\n implements OnInit, OnDestroy, OnChanges\n{\n @Input() config: TableConfig = { columns: [] };\n @Output() configChange = new EventEmitter<TableConfig>();\n @Output() toolbarActionsChange = new EventEmitter<ToolbarActionsChange>();\n\n toolbarForm!: FormGroup;\n isV2 = false;\n\n // Actions arrays\n toolbarActions: ToolbarAction[] = [];\n rowActions: RowAction[] = [];\n bulkActions: BulkAction[] = [];\n\n // Editing state\n editingToolbarActionIndex: number | null = null;\n editingRowActionIndex: number | null = null;\n editingBulkActionIndex: number | null = null;\n\n private destroy$ = new Subject<void>();\n\n constructor(private fb: FormBuilder, private iconPicker: IconPickerService) {}\n\n ngOnInit(): void {\n this.isV2 = true; // Always V2 in unified architecture\n this.initializeForm();\n this.setupFormListeners();\n this.loadActionsFromConfig();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && this.toolbarForm) {\n const toolbar = (this.config as any).toolbar || {};\n this.toolbarForm.patchValue(\n {\n toolbarVisible: toolbar.visible || false,\n toolbarTitle: toolbar.title || '',\n toolbarSubtitle: toolbar.subtitle || '',\n toolbarPosition: toolbar.position || 'top',\n toolbarHeight: toolbar.height || 64,\n },\n { emitEvent: false },\n );\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private initializeForm(): void {\n // Use type guards to safely access properties\n const v1Config = this.isV2 ? null : (this.config as any);\n const toolbar = v1Config?.toolbar || {};\n\n this.toolbarForm = this.fb.group({\n // Toolbar settings\n toolbarVisible: [toolbar.visible || false],\n toolbarTitle: [toolbar.title || ''],\n toolbarSubtitle: [toolbar.subtitle || ''],\n toolbarPosition: [toolbar.position || 'top'],\n toolbarHeight: [toolbar.height || 64],\n\n // Quick Add button controls\n addButtonEnabled: [false],\n addButtonLabel: ['Adicionar'],\n addButtonIcon: ['add'],\n addButtonColor: ['primary'],\n addButtonPosition: ['end'],\n addButtonAppearance: ['filled'],\n\n // Row actions\n rowActionsEnabled: [!!v1Config?.showActionsColumn],\n rowActionsDisplay: ['menu'],\n rowActionsTrigger: ['always'],\n maxVisibleRowActions: [3],\n // Row actions: column & header customization\n rowActionsWidth: ['120px'],\n rowActionsSticky: [null],\n rowActionsMenuIcon: ['more_vert'],\n rowActionsMenuButtonColor: ['basic'],\n rowActionsHeaderLabel: [''],\n rowActionsHeaderIcon: [''],\n rowActionsHeaderTooltip: [''],\n rowActionsHeaderAlign: ['end'],\n\n // Bulk actions (V2 only)\n bulkActionsEnabled: [false],\n bulkActionsPosition: ['toolbar'],\n\n // Export (V2 only)\n exportEnabled: [false],\n exportFormats: [['excel', 'csv']],\n exportFileName: ['dados-export'],\n exportIncludeHeaders: [true],\n exportRespectFilters: [true],\n exportSelectedOnly: [false],\n exportMaxRows: [10000],\n });\n\n // If V2, load advanced settings\n if (this.isV2) {\n const v2Config = this.config as TableConfig;\n\n if (v2Config.toolbar) {\n this.toolbarForm.patchValue({\n toolbarVisible: v2Config.toolbar.visible !== false,\n toolbarTitle: v2Config.toolbar.title || '',\n toolbarSubtitle: v2Config.toolbar.subtitle || '',\n toolbarPosition: v2Config.toolbar.position || 'top',\n toolbarHeight: v2Config.toolbar.layout?.height || 64,\n });\n }\n\n if (v2Config.actions) {\n const rowCfg = v2Config.actions.row;\n const beh = rowCfg?.behavior;\n const displayRaw = rowCfg?.display || 'menu';\n const displayUI =\n displayRaw === 'icons' && beh && beh.enabled !== false && beh.maxInline\n ? 'hybrid'\n : displayRaw;\n this.toolbarForm.patchValue({\n rowActionsEnabled: rowCfg?.enabled || false,\n rowActionsDisplay: displayUI,\n rowActionsTrigger: rowCfg?.trigger || 'always',\n maxVisibleRowActions: rowCfg?.maxVisibleActions || 3,\n rowActionsWidth: rowCfg?.width || '120px',\n rowActionsSticky: (rowCfg as any)?.sticky ?? null,\n rowActionsMenuIcon: rowCfg?.menuIcon || 'more_vert',\n rowActionsMenuButtonColor: (rowCfg as any)?.menuButtonColor || 'basic',\n rowActionsHeaderLabel: rowCfg?.header?.label || '',\n rowActionsHeaderIcon: rowCfg?.header?.icon || '',\n rowActionsHeaderTooltip: rowCfg?.header?.tooltip || '',\n rowActionsHeaderAlign: rowCfg?.header?.align || 'end',\n bulkActionsEnabled: v2Config.actions.bulk?.enabled || false,\n bulkActionsPosition: v2Config.actions.bulk?.position || 'toolbar',\n });\n }\n\n if (v2Config.export) {\n this.toolbarForm.patchValue({\n exportEnabled: v2Config.export.enabled || false,\n exportFormats: v2Config.export.formats || ['excel', 'csv'],\n exportFileName:\n v2Config.export.general?.defaultFileName || 'dados-export',\n exportIncludeHeaders:\n v2Config.export.general?.includeHeaders !== false,\n exportRespectFilters:\n v2Config.export.general?.respectFilters !== false,\n exportSelectedOnly:\n v2Config.export.general?.selectedRowsOnly || false,\n exportMaxRows: v2Config.export.general?.maxRows || 10000,\n });\n }\n\n // Initialize Quick Add controls from existing actions\n this.syncAddFormFromActions();\n }\n }\n\n private setupFormListeners(): void {\n this.toolbarForm.valueChanges\n .pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$))\n .subscribe((values) => {\n this.updateConfig(values);\n });\n\n // Individual listeners to mutate toolbarActions from quick add controls\n this.toolbarForm\n .get('addButtonEnabled')!\n .valueChanges.pipe(takeUntil(this.destroy$))\n .subscribe((enabled) => {\n if (enabled) {\n this.ensureAddToolbarAction();\n } else {\n this.removeAddToolbarAction();\n }\n this.updateToolbarActions();\n });\n const addFields = ['addButtonLabel', 'addButtonIcon', 'addButtonColor', 'addButtonPosition', 'addButtonAppearance'];\n addFields.forEach((f) => {\n this.toolbarForm\n .get(f)!\n .valueChanges.pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n if (this.toolbarForm.get('addButtonEnabled')?.value) {\n this.ensureAddToolbarAction();\n this.updateToolbarActions();\n }\n });\n });\n }\n\n private loadActionsFromConfig(): void {\n if (this.isV2) {\n const v2Config = this.config as TableConfig;\n\n // Load toolbar actions\n if (v2Config.toolbar?.actions) {\n this.toolbarActions = [...v2Config.toolbar.actions] as ToolbarAction[];\n }\n\n // Load row actions\n if (v2Config.actions?.row?.actions) {\n this.rowActions = [...v2Config.actions.row.actions] as RowAction[];\n }\n\n // Load bulk actions\n if (v2Config.actions?.bulk?.actions) {\n this.bulkActions = [...v2Config.actions.bulk.actions] as BulkAction[];\n }\n } else {\n // Load V1 config\n const v1Config = this.config as any;\n if (v1Config.toolbar?.actions) {\n this.toolbarActions = [...v1Config.toolbar.actions] as ToolbarAction[];\n }\n if (v1Config.rowActions) {\n this.rowActions = [...v1Config.rowActions] as RowAction[];\n }\n }\n }\n\n private isAddLike(a: ToolbarAction | undefined): boolean {\n if (!a) return false;\n const n = (s?: string) => String(s || '').trim().toLowerCase();\n const id = n((a as any).action || a.id);\n const label = n(a.label);\n const icon = n(a.icon);\n return (\n id === 'create' ||\n id === 'add' ||\n ['adicionar', 'novo', 'criar', 'incluir'].includes(label) ||\n icon === 'add' ||\n icon === 'add_circle' ||\n icon === 'add_box'\n );\n }\n\n private findAddToolbarIndex(): number {\n return this.toolbarActions.findIndex((a) => this.isAddLike(a));\n }\n\n private ensureAddToolbarAction(): void {\n const idx = this.findAddToolbarIndex();\n const label = this.toolbarForm.get('addButtonLabel')?.value || 'Adicionar';\n const icon = this.toolbarForm.get('addButtonIcon')?.value || 'add';\n const color = this.toolbarForm.get('addButtonColor')?.value || 'primary';\n const position = this.toolbarForm.get('addButtonPosition')?.value || 'end';\n const appearance = (this.toolbarForm.get('addButtonAppearance')?.value as ToolbarAction['appearance']) || 'filled';\n const action: ToolbarAction = {\n id: 'add',\n label,\n icon,\n type: 'button',\n color,\n appearance,\n action: 'create',\n position,\n };\n if (idx >= 0) {\n this.toolbarActions[idx] = { ...this.toolbarActions[idx], ...action };\n } else {\n this.toolbarActions.push(action);\n }\n }\n\n private removeAddToolbarAction(): void {\n const idx = this.findAddToolbarIndex();\n if (idx >= 0) {\n this.toolbarActions.splice(idx, 1);\n }\n }\n\n private syncAddFormFromActions(): void {\n const idx = this.findAddToolbarIndex();\n const enabled = idx >= 0;\n this.toolbarForm.patchValue(\n {\n addButtonEnabled: enabled,\n addButtonLabel: enabled ? this.toolbarActions[idx].label || 'Adicionar' : this.toolbarForm.get('addButtonLabel')?.value,\n addButtonIcon: enabled ? this.toolbarActions[idx].icon || 'add' : this.toolbarForm.get('addButtonIcon')?.value,\n addButtonColor: enabled ? (this.toolbarActions[idx] as any).color || 'primary' : this.toolbarForm.get('addButtonColor')?.value,\n addButtonPosition: enabled ? this.toolbarActions[idx].position || 'end' : this.toolbarForm.get('addButtonPosition')?.value,\n addButtonAppearance: enabled ? (this.toolbarActions[idx] as any).appearance || 'filled' : this.toolbarForm.get('addButtonAppearance')?.value,\n },\n { emitEvent: false },\n );\n }\n\n private updateConfig(values: any): void {\n const updatedConfig = { ...this.config };\n\n if (this.isV2) {\n // Update V2 config structure\n const v2Config = updatedConfig as TableConfig;\n\n // Toolbar\n if (!v2Config.toolbar) {\n v2Config.toolbar = {\n visible: false,\n position: 'top',\n };\n }\n v2Config.toolbar.visible = values.toolbarVisible;\n v2Config.toolbar.title = values.toolbarTitle;\n v2Config.toolbar.subtitle = values.toolbarSubtitle;\n v2Config.toolbar.position = values.toolbarPosition;\n\n if (!v2Config.toolbar.layout) {\n v2Config.toolbar.layout = {\n alignment: 'space-between',\n showSeparator: false,\n };\n }\n v2Config.toolbar.layout.height = values.toolbarHeight;\n\n v2Config.toolbar.actions = this.toolbarActions;\n\n // Actions\n v2Config.actions = v2Config.actions || {};\n const mappedDisplay = values.rowActionsDisplay === 'hybrid' ? 'icons' : values.rowActionsDisplay;\n v2Config.actions.row = {\n enabled: values.rowActionsEnabled,\n position: 'end',\n width: values.rowActionsWidth || '120px',\n sticky: values.rowActionsSticky ?? undefined,\n actions: this.rowActions,\n display: mappedDisplay,\n trigger: values.rowActionsTrigger,\n maxVisibleActions: values.maxVisibleRowActions,\n menuIcon: values.rowActionsMenuIcon || 'more_vert',\n menuButtonColor: values.rowActionsMenuButtonColor !== 'basic' ? values.rowActionsMenuButtonColor : undefined,\n header: {\n label: values.rowActionsHeaderLabel || undefined,\n icon: values.rowActionsHeaderIcon || undefined,\n tooltip: values.rowActionsHeaderTooltip || undefined,\n align: values.rowActionsHeaderAlign || 'end',\n },\n behavior: {\n enabled: true,\n ...(values.rowActionsDisplay === 'hybrid'\n ? { maxInline: 'auto' as const, autoStrategy: 'measure' as const }\n : (v2Config.actions?.row?.behavior || {})),\n },\n } as any;\n\n v2Config.actions.bulk = {\n enabled: values.bulkActionsEnabled,\n position: values.bulkActionsPosition,\n actions: this.bulkActions,\n };\n\n // Export\n v2Config.export = {\n enabled: values.exportEnabled,\n formats: values.exportFormats,\n general: {\n includeHeaders: values.exportIncludeHeaders,\n respectFilters: values.exportRespectFilters,\n selectedRowsOnly: values.exportSelectedOnly,\n maxRows: values.exportMaxRows,\n defaultFileName: values.exportFileName,\n includeColumns: 'visible',\n applyFormatting: true,\n },\n };\n } else {\n // Update V1 config structure\n const v1UpdatedConfig = updatedConfig as any;\n\n if (values.toolbarVisible) {\n v1UpdatedConfig.toolbar = {\n visible: true,\n title: values.toolbarTitle,\n actions: this.toolbarActions,\n };\n } else {\n delete v1UpdatedConfig.toolbar;\n }\n\n v1UpdatedConfig.showActionsColumn = values.rowActionsEnabled;\n v1UpdatedConfig.rowActions = this.rowActions;\n }\n\n this.configChange.emit(updatedConfig);\n }\n\n // Toolbar Actions Management\n addToolbarAction(): void {\n const newAction: ToolbarAction = {\n id: `action-${Date.now()}`,\n label: 'Nova Ação',\n icon: 'add',\n type: 'button',\n action: 'newAction',\n position: 'end',\n order: this.toolbarActions.length,\n };\n\n this.toolbarActions.push(newAction);\n this.editingToolbarActionIndex = this.toolbarActions.length - 1;\n this.updateToolbarActions();\n }\n\n editToolbarAction(index: number): void {\n this.editingToolbarActionIndex =\n this.editingToolbarActionIndex === index ? null : index;\n }\n\n removeToolbarAction(index: number): void {\n this.toolbarActions.splice(index, 1);\n this.editingToolbarActionIndex = null;\n this.updateToolbarActions();\n }\n\n dropToolbarAction(event: CdkDragDrop<ToolbarAction[]>): void {\n moveItemInArray(\n this.toolbarActions,\n event.previousIndex,\n event.currentIndex,\n );\n this.updateToolbarActions();\n }\n\n updateToolbarActions(): void {\n // Update order based on array position\n this.toolbarActions.forEach((action, index) => {\n action.order = index;\n });\n\n const values = this.toolbarForm.value;\n this.updateConfig(values);\n }\n\n // Row Actions Management\n addRowAction(): void {\n const newAction: RowAction = {\n id: `row-action-${Date.now()}`,\n label: 'Nova Ação',\n icon: 'edit',\n action: 'editRow',\n autoDelete: false,\n };\n\n this.rowActions.push(newAction);\n this.editingRowActionIndex = this.rowActions.length - 1;\n this.updateRowActions();\n }\n\n editRowAction(index: number): void {\n this.editingRowActionIndex =\n this.editingRowActionIndex === index ? null : index;\n }\n\n removeRowAction(index: number): void {\n this.rowActions.splice(index, 1);\n this.editingRowActionIndex = null;\n this.updateRowActions();\n }\n\n dropRowAction(event: CdkDragDrop<RowAction[]>): void {\n moveItemInArray(this.rowActions, event.previousIndex, event.currentIndex);\n this.updateRowActions();\n }\n\n updateRowActions(): void {\n this.rowActions.forEach((a) => {\n if (a.action !== 'delete') {\n a.autoDelete = false;\n }\n });\n const values = this.toolbarForm.value;\n this.updateConfig(values);\n }\n\n // Bulk Actions Management\n addBulkAction(): void {\n const newAction: BulkAction = {\n id: `bulk-action-${Date.now()}`,\n label: 'Nova Ação em Lote',\n icon: 'delete',\n action: 'delete',\n autoDelete: false,\n minSelections: 1,\n };\n\n this.bulkActions.push(newAction);\n this.editingBulkActionIndex = this.bulkActions.length - 1;\n this.updateBulkActions();\n }\n\n editBulkAction(index: number): void {\n this.editingBulkActionIndex =\n this.editingBulkActionIndex === index ? null : index;\n }\n\n removeBulkAction(index: number): void {\n this.bulkActions.splice(index, 1);\n this.editingBulkActionIndex = null;\n this.updateBulkActions();\n }\n\n dropBulkAction(event: CdkDragDrop<BulkAction[]>): void {\n moveItemInArray(this.bulkActions, event.previousIndex, event.currentIndex);\n this.updateBulkActions();\n }\n\n updateBulkActions(): void {\n this.bulkActions.forEach((a) => {\n if (a.action !== 'delete') {\n a.autoDelete = false;\n }\n });\n const values = this.toolbarForm.value;\n this.updateConfig(values);\n }\n\n // =============================================================\n // Templates (Presets) — Toolbar & Row Actions\n // =============================================================\n\n applyToolbarTemplate(tpl: 'crudAdd', mode: 'replace' | 'merge'): void {\n const preset: ToolbarAction[] = [\n {\n id: 'add',\n label: 'Adicionar',\n icon: 'add',\n type: 'button',\n color: 'primary',\n appearance: 'filled',\n action: 'create',\n position: 'end',\n },\n ];\n if (mode === 'replace') {\n this.toolbarActions = [...preset];\n } else {\n this.toolbarActions = this.mergeToolbarActions(this.toolbarActions, preset);\n }\n // Ensure toolbar visible\n this.toolbarForm.patchValue({ toolbarVisible: true }, { emitEvent: false });\n this.updateToolbarActions();\n }\n\n applyRowActionsTemplate(\n tpl: 'crud' | 'editDelete' | 'viewOnly' | 'crudWithBulk',\n mode: 'replace' | 'merge',\n ): void {\n const view: RowAction = {\n id: 'view',\n label: 'Visualizar',\n icon: 'visibility',\n action: 'view',\n };\n const edit: RowAction = {\n id: 'edit',\n label: 'Editar',\n icon: 'edit',\n action: 'edit',\n color: 'primary',\n };\n const del: RowAction = {\n id: 'delete',\n label: 'Excluir',\n icon: 'delete',\n action: 'delete',\n color: 'warn',\n requiresConfirmation: true,\n autoDelete: true,\n };\n const presets: Record<string, RowAction[]> = {\n crud: [view, edit, del],\n editDelete: [edit, del],\n viewOnly: [view],\n crudWithBulk: [view, edit, del],\n } as const;\n const incoming = presets[tpl];\n if (mode === 'replace') {\n this.rowActions = [...incoming];\n } else {\n this.rowActions = this.mergeRowActions(this.rowActions, incoming);\n }\n // Bulk delete when requested\n if (tpl === 'crudWithBulk' && this.isV2) {\n const bulkDel: BulkAction = {\n id: 'bulkDelete',\n label: 'Excluir Selecionados',\n icon: 'delete',\n action: 'delete',\n color: 'warn',\n requiresConfirmation: true,\n autoDelete: true,\n minSelections: 1,\n };\n this.toolbarForm.patchValue({ bulkActionsEnabled: true }, { emitEvent: false });\n this.bulkActions = this.mergeBulkActions(this.bulkActions, [bulkDel]);\n this.updateBulkActions();\n }\n // Encourage visible buttons, always on\n this.toolbarForm.patchValue(\n {\n rowActionsEnabled: true,\n rowActionsDisplay: 'buttons',\n rowActionsTrigger: 'always',\n maxVisibleRowActions: 3,\n },\n { emitEvent: false },\n );\n this.updateRowActions();\n }\n\n private mergeRowActions(base: RowAction[], add: RowAction[]): RowAction[] {\n const byKey = (a: RowAction) => (a.action || a.id || '').toLowerCase();\n const existing = new Map(base.map((a) => [byKey(a), a]));\n for (const a of add) {\n const key = byKey(a);\n if (!existing.has(key)) existing.set(key, a);\n }\n return Array.from(existing.values());\n }\n\n private mergeToolbarActions(\n base: ToolbarAction[],\n add: ToolbarAction[],\n ): ToolbarAction[] {\n const byKey = (a: ToolbarAction) => (a.action || a.id || '').toLowerCase();\n const existing = new Map(base.map((a) => [byKey(a), a]));\n for (const a of add) {\n const key = byKey(a);\n if (!existing.has(key)) existing.set(key, a);\n }\n return Array.from(existing.values());\n }\n\n private mergeBulkActions(base: BulkAction[], add: BulkAction[]): BulkAction[] {\n const byKey = (a: BulkAction) => (a.action || a.id || '').toLowerCase();\n const existing = new Map(base.map((a) => [byKey(a), a]));\n for (const a of add) {\n const key = byKey(a);\n if (!existing.has(key)) existing.set(key, a);\n }\n return Array.from(existing.values());\n }\n\n // Icon Picker integrations\n async pickAddButtonIcon(): Promise<void> {\n const current = this.toolbarForm.get('addButtonIcon')?.value;\n const res = await this.iconPicker.openDialog({ value: current });\n if (res !== undefined) {\n this.toolbarForm.get('addButtonIcon')?.setValue(res);\n }\n }\n\n async pickActionIcon(index: number): Promise<void> {\n const a = this.toolbarActions[index];\n const res = await this.iconPicker.openDialog({ value: a?.icon });\n if (res !== undefined) {\n this.toolbarActions[index] = { ...a, icon: res } as any;\n this.updateToolbarActions();\n }\n }\n\n async pickRowActionIcon(index: number): Promise<void> {\n const a = this.rowActions[index];\n const res = await this.iconPicker.openDialog({ value: a?.icon });\n if (res !== undefined) {\n this.rowActions[index] = { ...a, icon: res } as any;\n this.updateRowActions();\n }\n }\n\n async pickBulkActionIcon(index: number): Promise<void> {\n const a = this.bulkActions[index];\n const res = await this.iconPicker.openDialog({ value: a?.icon });\n if (res !== undefined) {\n this.bulkActions[index] = { ...a, icon: res } as any;\n this.updateBulkActions();\n }\n }\n\n async pickRowMenuIcon(): Promise<void> {\n const current = this.toolbarForm.get('rowActionsMenuIcon')?.value;\n const res = await this.iconPicker.openDialog({ value: current });\n if (res !== undefined) {\n this.toolbarForm.get('rowActionsMenuIcon')?.setValue(res);\n }\n }\n\n async pickRowHeaderIcon(): Promise<void> {\n const current = this.toolbarForm.get('rowActionsHeaderIcon')?.value;\n const res = await this.iconPicker.openDialog({ value: current });\n if (res !== undefined) {\n this.toolbarForm.get('rowActionsHeaderIcon')?.setValue(res);\n }\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatCardModule } from '@angular/material/card';\nimport { \n TableConfig, \n isTableConfigV2\n} from '@praxisui/core';\nimport { Subject, takeUntil } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\n\nexport interface MessagesLocalizationChange {\n type: 'messages' | 'localization' | 'formatting';\n property: string;\n value: any;\n fullConfig: TableConfig;\n}\n\n@Component({\n selector: 'messages-localization-editor',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatSlideToggleModule,\n MatExpansionModule,\n MatIconModule,\n MatTooltipModule,\n MatDividerModule,\n MatButtonModule,\n MatTabsModule,\n MatCardModule\n ],\n template: `\n <div class=\"messages-localization-container\">\n <form [formGroup]=\"messagesForm\">\n \n <!-- Mensagens de Estado -->\n <mat-expansion-panel expanded>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\">message</mat-icon>\n Mensagens de Estado\n </mat-panel-title>\n <mat-panel-description>\n Textos exibidos em diferentes estados da tabela\n </mat-panel-description>\n </mat-expansion-panel-header>\n \n <div class=\"config-section\">\n <div class=\"config-fields\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Carregando dados</mat-label>\n <input matInput formControlName=\"loadingMessage\" \n placeholder=\"Carregando...\">\n <mat-hint>Mensagem exibida durante o carregamento</mat-hint>\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Nenhum dado encontrado</mat-label>\n <input matInput formControlName=\"emptyMessage\" \n placeholder=\"Nenhum dado disponível\">\n <mat-hint>Mensagem quando não há registros</mat-hint>\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Erro ao carregar</mat-label>\n <input matInput formControlName=\"errorMessage\" \n placeholder=\"Erro ao carregar dados\">\n <mat-hint>Mensagem de erro genérica</mat-hint>\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Nenhum resultado</mat-label>\n <input matInput formControlName=\"noResultsMessage\" \n placeholder=\"Nenhum resultado encontrado\">\n <mat-hint>Mensagem quando filtros não retornam resultados</mat-hint>\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\" *ngIf=\"isV2\">\n <mat-label>Carregando mais</mat-label>\n <input matInput formControlName=\"loadingMoreMessage\" \n placeholder=\"Carregando mais dados...\">\n <mat-hint>Mensagem para carregamento incremental</mat-hint>\n </mat-form-field>\n </div>\n </div>\n </mat-expansion-panel>\n \n <!-- Mensagens de Ação -->\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\">help</mat-icon>\n Mensagens de Ação\n </mat-panel-title>\n <mat-panel-description>\n Confirmações, sucessos e mensagens de erro\n </mat-panel-description>\n </mat-expansion-panel-header>\n \n <div class=\"config-section\">\n <mat-tab-group>\n <!-- Confirmações -->\n <mat-tab label=\"Confirmações\">\n <div class=\"tab-content\">\n <div class=\"config-fields\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Confirmação de exclusão</mat-label>\n <input matInput formControlName=\"deleteConfirmation\" \n placeholder=\"Tem certeza que deseja excluir este item?\">\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Confirmação de exclusão múltipla</mat-label>\n <input matInput formControlName=\"deleteMultipleConfirmation\" \n placeholder=\"Tem certeza que deseja excluir os itens selecionados?\">\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Confirmação de salvar</mat-label>\n <input matInput formControlName=\"saveConfirmation\" \n placeholder=\"Deseja salvar as alterações?\">\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Confirmação de cancelar</mat-label>\n <input matInput formControlName=\"cancelConfirmation\" \n placeholder=\"Deseja cancelar as alterações?\">\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Confirmação de exportação</mat-label>\n <input matInput formControlName=\"exportConfirmation\" \n placeholder=\"Deseja exportar os dados selecionados?\">\n </mat-form-field>\n </div>\n </div>\n </mat-tab>\n \n <!-- Sucessos -->\n <mat-tab label=\"Sucessos\">\n <div class=\"tab-content\">\n <div class=\"config-fields\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Salvo com sucesso</mat-label>\n <input matInput formControlName=\"saveSuccess\" \n placeholder=\"Item salvo com sucesso!\">\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Excluído com sucesso</mat-label>\n <input matInput formControlName=\"deleteSuccess\" \n placeholder=\"Item excluído com sucesso!\">\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Exportação concluída</mat-label>\n <input matInput formControlName=\"exportSuccess\" \n placeholder=\"Exportação concluída com sucesso!\">\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Importação concluída</mat-label>\n <input matInput formControlName=\"importSuccess\" \n placeholder=\"Importação concluída com sucesso!\">\n </mat-form-field>\n </div>\n </div>\n </mat-tab>\n \n <!-- Progresso -->\n <mat-tab label=\"Progresso\">\n <div class=\"tab-content\">\n <div class=\"config-fields\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Excluindo...</mat-label>\n <input matInput formControlName=\"deleteProgress\" \n placeholder=\"Removendo...\">\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Excluindo (múltiplos)...</mat-label>\n <input matInput formControlName=\"deleteMultipleProgress\" \n placeholder=\"Removendo...\">\n </mat-form-field>\n </div>\n </div>\n </mat-tab>\n\n <!-- Erros -->\n <mat-tab label=\"Erros\">\n <div class=\"tab-content\">\n <div class=\"config-fields\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Erro ao salvar</mat-label>\n <input matInput formControlName=\"saveError\" \n placeholder=\"Erro ao salvar item\">\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Erro ao excluir</mat-label>\n <input matInput formControlName=\"deleteError\" \n placeholder=\"Erro ao excluir item\">\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Erro na exportação</mat-label>\n <input matInput formControlName=\"exportError\" \n placeholder=\"Erro na exportação\">\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Erro de rede</mat-label>\n <input matInput formControlName=\"networkError\" \n placeholder=\"Erro de conexão\">\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Erro de permissão</mat-label>\n <input matInput formControlName=\"permissionError\" \n placeholder=\"Sem permissão para esta ação\">\n </mat-form-field>\n </div>\n </div>\n </mat-tab>\n </mat-tab-group>\n </div>\n </mat-expansion-panel>\n \n <!-- Localização -->\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\">language</mat-icon>\n Configurações de Localização\n </mat-panel-title>\n <mat-panel-description>\n Idioma, região e formatação\n </mat-panel-description>\n </mat-expansion-panel-header>\n \n <div class=\"config-section\">\n <div class=\"config-fields\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Idioma/Região</mat-label>\n <mat-select formControlName=\"locale\">\n <mat-option value=\"pt-BR\">Português (Brasil)</mat-option>\n <mat-option value=\"en-US\">English (US)</mat-option>\n <mat-option value=\"en-GB\">English (UK)</mat-option>\n <mat-option value=\"es-ES\">Español</mat-option>\n <mat-option value=\"fr-FR\">Français</mat-option>\n <mat-option value=\"de-DE\">Deutsch</mat-option>\n <mat-option value=\"it-IT\">Italiano</mat-option>\n <mat-option value=\"ja-JP\">日本語</mat-option>\n <mat-option value=\"zh-CN\">中文</mat-option>\n </mat-select>\n <mat-hint>Define o idioma e região para formatação</mat-hint>\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Direção do texto</mat-label>\n <mat-select formControlName=\"direction\">\n <mat-option value=\"ltr\">Esquerda para direita (LTR)</mat-option>\n <mat-option value=\"rtl\">Direita para esquerda (RTL)</mat-option>\n </mat-select>\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Primeiro dia da semana</mat-label>\n <mat-select formControlName=\"firstDayOfWeek\">\n <mat-option value=\"0\">Domingo</mat-option>\n <mat-option value=\"1\">Segunda-feira</mat-option>\n <mat-option value=\"6\">Sábado</mat-option>\n </mat-select>\n </mat-form-field>\n \n <mat-slide-toggle formControlName=\"relativeTime\" class=\"toggle-field\">\n Usar tempo relativo\n <mat-icon class=\"info-icon\" matTooltip=\"Ex: 'há 2 horas' ao invés de horário específico\">\n info_outline\n </mat-icon>\n </mat-slide-toggle>\n </div>\n </div>\n </mat-expansion-panel>\n \n <!-- Formatação de Data e Hora -->\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\">schedule</mat-icon>\n Formatação de Data e Hora\n </mat-panel-title>\n <mat-panel-description>\n Padrões de exibição de datas e horários\n </mat-panel-description>\n </mat-expansion-panel-header>\n \n <div class=\"config-section\">\n <div class=\"config-fields\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Formato de data</mat-label>\n <mat-select formControlName=\"dateFormat\">\n <mat-option value=\"dd/MM/yyyy\">dd/MM/yyyy (31/12/2023)</mat-option>\n <mat-option value=\"MM/dd/yyyy\">MM/dd/yyyy (12/31/2023)</mat-option>\n <mat-option value=\"yyyy-MM-dd\">yyyy-MM-dd (2023-12-31)</mat-option>\n <mat-option value=\"dd-MM-yyyy\">dd-MM-yyyy (31-12-2023)</mat-option>\n <mat-option value=\"dd.MM.yyyy\">dd.MM.yyyy (31.12.2023)</mat-option>\n <mat-option value=\"MMM dd, yyyy\">MMM dd, yyyy (Dec 31, 2023)</mat-option>\n <mat-option value=\"MMMM dd, yyyy\">MMMM dd, yyyy (December 31, 2023)</mat-option>\n </mat-select>\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Formato de hora</mat-label>\n <mat-select formControlName=\"timeFormat\">\n <mat-option value=\"HH:mm:ss\">HH:mm:ss (24h)</mat-option>\n <mat-option value=\"HH:mm\">HH:mm (24h)</mat-option>\n <mat-option value=\"hh:mm:ss a\">hh:mm:ss a (12h)</mat-option>\n <mat-option value=\"hh:mm a\">hh:mm a (12h)</mat-option>\n <mat-option value=\"h:mm a\">h:mm a (12h)</mat-option>\n </mat-select>\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Formato de data e hora</mat-label>\n <input matInput formControlName=\"dateTimeFormat\" \n placeholder=\"dd/MM/yyyy HH:mm:ss\">\n <mat-hint>Combinação dos formatos de data e hora</mat-hint>\n </mat-form-field>\n </div>\n </div>\n </mat-expansion-panel>\n \n <!-- Formatação de Números -->\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\">pin</mat-icon>\n Formatação de Números\n </mat-panel-title>\n <mat-panel-description>\n Separadores, moeda e precisão decimal\n </mat-panel-description>\n </mat-expansion-panel-header>\n \n <div class=\"config-section\">\n <div class=\"config-fields\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Separador decimal</mat-label>\n <mat-select formControlName=\"decimalSeparator\">\n <mat-option value=\",\">, (vírgula)</mat-option>\n <mat-option value=\".\">. (ponto)</mat-option>\n </mat-select>\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Separador de milhares</mat-label>\n <mat-select formControlName=\"thousandsSeparator\">\n <mat-option value=\".\">. (ponto)</mat-option>\n <mat-option value=\",\">, (vírgula)</mat-option>\n <mat-option value=\" \"> (espaço)</mat-option>\n <mat-option value=\"\">(nenhum)</mat-option>\n </mat-select>\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Precisão decimal padrão</mat-label>\n <input matInput type=\"number\" formControlName=\"defaultPrecision\" \n min=\"0\" max=\"10\">\n <mat-hint>Número padrão de casas decimais</mat-hint>\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Sinal negativo</mat-label>\n <mat-select formControlName=\"negativeSign\">\n <mat-option value=\"-\">- (hífen)</mat-option>\n <mat-option value=\"−\">− (menos matemático)</mat-option>\n <mat-option value=\"()\">(parênteses)</mat-option>\n </mat-select>\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Posição do sinal negativo</mat-label>\n <mat-select formControlName=\"negativeSignPosition\">\n <mat-option value=\"before\">Antes do número</mat-option>\n <mat-option value=\"after\">Depois do número</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </mat-expansion-panel>\n \n <!-- Formatação de Moeda -->\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\">attach_money</mat-icon>\n Formatação de Moeda\n </mat-panel-title>\n <mat-panel-description>\n Símbolo, posição e formato monetário\n </mat-panel-description>\n </mat-expansion-panel-header>\n \n <div class=\"config-section\">\n <div class=\"config-fields\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Código da moeda</mat-label>\n <mat-select formControlName=\"currencyCode\">\n <mat-option value=\"BRL\">BRL (Real Brasileiro)</mat-option>\n <mat-option value=\"USD\">USD (Dólar Americano)</mat-option>\n <mat-option value=\"EUR\">EUR (Euro)</mat-option>\n <mat-option value=\"GBP\">GBP (Libra Esterlina)</mat-option>\n <mat-option value=\"JPY\">JPY (Iene)</mat-option>\n <mat-option value=\"CAD\">CAD (Dólar Canadense)</mat-option>\n <mat-option value=\"AUD\">AUD (Dólar Australiano)</mat-option>\n </mat-select>\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Símbolo da moeda</mat-label>\n <input matInput formControlName=\"currencySymbol\" \n placeholder=\"R$\">\n <mat-hint>Símbolo exibido junto aos valores</mat-hint>\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Posição do símbolo</mat-label>\n <mat-select formControlName=\"currencyPosition\">\n <mat-option value=\"before\">Antes (R$ 100,00)</mat-option>\n <mat-option value=\"after\">Depois (100,00 R$)</mat-option>\n </mat-select>\n </mat-form-field>\n \n <mat-slide-toggle formControlName=\"currencySpacing\" class=\"toggle-field\">\n Espaço entre símbolo e valor\n </mat-slide-toggle>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Precisão decimal (moeda)</mat-label>\n <input matInput type=\"number\" formControlName=\"currencyPrecision\" \n min=\"0\" max=\"4\">\n <mat-hint>Casas decimais para valores monetários</mat-hint>\n </mat-form-field>\n </div>\n </div>\n </mat-expansion-panel>\n \n <!-- Validação -->\n <mat-expansion-panel *ngIf=\"isV2\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\">rule</mat-icon>\n Mensagens de Validação\n </mat-panel-title>\n <mat-panel-description>\n Textos para validação de formulários (V2 only)\n </mat-panel-description>\n </mat-expansion-panel-header>\n \n <div class=\"config-section\">\n <div class=\"config-fields\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Campo obrigatório</mat-label>\n <input matInput formControlName=\"requiredField\" \n placeholder=\"Este campo é obrigatório\">\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Valor inválido</mat-label>\n <input matInput formControlName=\"invalidValue\" \n placeholder=\"Valor inválido\">\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Muito longo</mat-label>\n <input matInput formControlName=\"tooLong\" \n placeholder=\"Valor muito longo\">\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Muito curto</mat-label>\n <input matInput formControlName=\"tooShort\" \n placeholder=\"Valor muito curto\">\n </mat-form-field>\n \n <div class=\"subsection\">\n <h4>Validações por Tipo</h4>\n <div class=\"config-fields\">\n <mat-form-field appearance=\"outline\">\n <mat-label>E-mail inválido</mat-label>\n <input matInput formControlName=\"invalidEmail\" \n placeholder=\"E-mail inválido\">\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>URL inválida</mat-label>\n <input matInput formControlName=\"invalidUrl\" \n placeholder=\"URL inválida\">\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Deve ser um número</mat-label>\n <input matInput formControlName=\"mustBeNumber\" \n placeholder=\"Deve ser um número\">\n </mat-form-field>\n \n <mat-form-field appearance=\"outline\">\n <mat-label>Data inválida</mat-label>\n <input matInput formControlName=\"invalidDate\" \n placeholder=\"Data inválida\">\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n \n </form>\n </div>\n `,\n styles: [`\n .messages-localization-container {\n width: 100%;\n padding: 8px;\n }\n \n .config-section {\n padding: 16px;\n }\n \n .config-fields {\n display: flex;\n flex-direction: column;\n gap: 16px;\n margin-top: 16px;\n }\n \n .toggle-field {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n \n .section-icon {\n margin-right: 8px;\n color: var(--mat-sys-primary);\n }\n \n .info-icon {\n font-size: 18px;\n width: 18px;\n height: 18px;\n color: var(--mat-sys-on-surface-variant);\n cursor: help;\n }\n \n .subsection {\n margin-top: 24px;\n padding: 16px;\n border: 1px solid var(--mat-sys-outline-variant);\n border-radius: 8px;\n }\n \n .subsection h4 {\n margin: 0 0 16px 0;\n color: var(--mat-sys-on-surface);\n font-weight: 500;\n }\n \n .tab-content {\n padding: 16px 0;\n }\n \n mat-form-field {\n width: 100%;\n }\n \n mat-expansion-panel {\n margin-bottom: 8px;\n border-radius: 8px;\n overflow: hidden;\n }\n \n mat-expansion-panel-header {\n min-height: 56px;\n }\n \n mat-panel-description {\n color: var(--mat-sys-on-surface-variant);\n }\n \n mat-tab-group {\n margin-top: 16px;\n }\n `]\n})\nexport class MessagesLocalizationEditorComponent implements OnInit, OnDestroy {\n @Input() config: TableConfig = { columns: [] };\n @Output() configChange = new EventEmitter<TableConfig>();\n @Output() messagesLocalizationChange = new EventEmitter<MessagesLocalizationChange>();\n \n messagesForm!: FormGroup;\n isV2 = false;\n \n private destroy$ = new Subject<void>();\n \n constructor(private fb: FormBuilder) {}\n \n ngOnInit(): void {\n this.isV2 = isTableConfigV2(this.config);\n this.initializeForm();\n this.setupFormListeners();\n }\n \n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n \n private initializeForm(): void {\n // Use type guards to safely access properties\n const v1Config = this.isV2 ? null : this.config as any;\n const messages = v1Config?.messages || {};\n \n this.messagesForm = this.fb.group({\n // State messages\n loadingMessage: [messages.loading || 'Carregando...'],\n emptyMessage: [messages.empty || 'Nenhum dado disponível'],\n errorMessage: [messages.error || 'Erro ao carregar dados'],\n noResultsMessage: [messages.noResults || 'Nenhum resultado encontrado'],\n loadingMoreMessage: ['Carregando mais dados...'],\n \n // Action messages - Confirmations\n deleteConfirmation: ['Tem certeza que deseja excluir este item?'],\n deleteMultipleConfirmation: ['Tem certeza que deseja excluir os itens selecionados?'],\n saveConfirmation: ['Deseja salvar as alterações?'],\n cancelConfirmation: ['Deseja cancelar as alterações?'],\n exportConfirmation: ['Deseja exportar os dados selecionados?'],\n \n // Action messages - Success\n saveSuccess: ['Item salvo com sucesso!'],\n deleteSuccess: ['Item excluído com sucesso!'],\n exportSuccess: ['Exportação concluída com sucesso!'],\n importSuccess: ['Importação concluída com sucesso!'],\n \n // Action messages - Progress\n deleteProgress: ['Removendo...'],\n deleteMultipleProgress: ['Removendo...'],\n \n // Action messages - Errors\n saveError: ['Erro ao salvar item'],\n deleteError: ['Erro ao excluir item'],\n exportError: ['Erro na exportação'],\n networkError: ['Erro de conexão'],\n permissionError: ['Sem permissão para esta ação'],\n \n // Localization\n locale: ['pt-BR'],\n direction: ['ltr'],\n firstDayOfWeek: [0],\n relativeTime: [true],\n \n // Date/Time formatting\n dateFormat: ['dd/MM/yyyy'],\n timeFormat: ['HH:mm:ss'],\n dateTimeFormat: ['dd/MM/yyyy HH:mm:ss'],\n \n // Number formatting\n decimalSeparator: [','],\n thousandsSeparator: ['.'],\n defaultPrecision: [2],\n negativeSign: ['-'],\n negativeSignPosition: ['before'],\n \n // Currency formatting\n currencyCode: ['BRL'],\n currencySymbol: ['R$'],\n currencyPosition: ['before'],\n currencySpacing: [true],\n currencyPrecision: [2],\n \n // Validation messages (V2 only)\n requiredField: ['Este campo é obrigatório'],\n invalidValue: ['Valor inválido'],\n tooLong: ['Valor muito longo'],\n tooShort: ['Valor muito curto'],\n invalidEmail: ['E-mail inválido'],\n invalidUrl: ['URL inválida'],\n mustBeNumber: ['Deve ser um número'],\n invalidDate: ['Data inválida']\n });\n \n // If V2, load advanced settings\n if (this.isV2) {\n const v2Config = this.config as TableConfig;\n \n if (v2Config.messages) {\n this.messagesForm.patchValue({\n loadingMessage: v2Config.messages.states?.loading || 'Carregando...',\n emptyMessage: v2Config.messages.states?.empty || 'Nenhum dado disponível',\n errorMessage: v2Config.messages.states?.error || 'Erro ao carregar dados',\n noResultsMessage: v2Config.messages.states?.noResults || 'Nenhum resultado encontrado',\n loadingMoreMessage: v2Config.messages.states?.loadingMore || 'Carregando mais dados...',\n \n // Action messages\n deleteConfirmation: v2Config.messages.actions?.confirmations?.delete || 'Tem certeza que deseja excluir este item?',\n deleteMultipleConfirmation: v2Config.messages.actions?.confirmations?.deleteMultiple || 'Tem certeza que deseja excluir os itens selecionados?',\n saveConfirmation: v2Config.messages.actions?.confirmations?.save || 'Deseja salvar as alterações?',\n cancelConfirmation: v2Config.messages.actions?.confirmations?.cancel || 'Deseja cancelar as alterações?',\n exportConfirmation: v2Config.messages.actions?.confirmations?.export || 'Deseja exportar os dados selecionados?',\n \n saveSuccess: v2Config.messages.actions?.success?.save || 'Item salvo com sucesso!',\n deleteSuccess: v2Config.messages.actions?.success?.delete || 'Item excluído com sucesso!',\n exportSuccess: v2Config.messages.actions?.success?.export || 'Exportação concluída com sucesso!',\n importSuccess: v2Config.messages.actions?.success?.import || 'Importação concluída com sucesso!',\n \n deleteProgress: v2Config.messages.actions?.progress?.delete || 'Removendo...',\n deleteMultipleProgress: v2Config.messages.actions?.progress?.deleteMultiple || 'Removendo...',\n \n saveError: v2Config.messages.actions?.errors?.save || 'Erro ao salvar item',\n deleteError: v2Config.messages.actions?.errors?.delete || 'Erro ao excluir item',\n exportError: v2Config.messages.actions?.errors?.export || 'Erro na exportação',\n networkError: v2Config.messages.actions?.errors?.network || 'Erro de conexão',\n permissionError: v2Config.messages.actions?.errors?.permission || 'Sem permissão para esta ação',\n \n // Validation messages\n requiredField: v2Config.messages.validation?.required || 'Este campo é obrigatório',\n invalidValue: v2Config.messages.validation?.invalid || 'Valor inválido',\n tooLong: v2Config.messages.validation?.tooLong || 'Valor muito longo',\n tooShort: v2Config.messages.validation?.tooShort || 'Valor muito curto',\n invalidEmail: v2Config.messages.validation?.types?.email || 'E-mail inválido',\n invalidUrl: v2Config.messages.validation?.types?.url || 'URL inválida',\n mustBeNumber: v2Config.messages.validation?.types?.number || 'Deve ser um número',\n invalidDate: v2Config.messages.validation?.types?.date || 'Data inválida'\n });\n }\n \n if (v2Config.localization) {\n this.messagesForm.patchValue({\n locale: v2Config.localization.locale || 'pt-BR',\n direction: v2Config.localization.direction || 'ltr',\n firstDayOfWeek: v2Config.localization.dateTime?.firstDayOfWeek ?? 0,\n relativeTime: v2Config.localization.dateTime?.relativeTime !== false,\n \n dateFormat: v2Config.localization.dateTime?.dateFormat || 'dd/MM/yyyy',\n timeFormat: v2Config.localization.dateTime?.timeFormat || 'HH:mm:ss',\n dateTimeFormat: v2Config.localization.dateTime?.dateTimeFormat || 'dd/MM/yyyy HH:mm:ss',\n \n decimalSeparator: v2Config.localization.number?.decimalSeparator || ',',\n thousandsSeparator: v2Config.localization.number?.thousandsSeparator || '.',\n defaultPrecision: v2Config.localization.number?.defaultPrecision ?? 2,\n negativeSign: v2Config.localization.number?.negativeSign || '-',\n negativeSignPosition: v2Config.localization.number?.negativeSignPosition || 'before',\n \n currencyCode: v2Config.localization.currency?.code || 'BRL',\n currencySymbol: v2Config.localization.currency?.symbol || 'R$',\n currencyPosition: v2Config.localization.currency?.position || 'before',\n currencySpacing: v2Config.localization.currency?.spacing !== false,\n currencyPrecision: v2Config.localization.currency?.precision ?? 2\n });\n }\n }\n }\n \n private setupFormListeners(): void {\n this.messagesForm.valueChanges\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n )\n .subscribe(values => {\n this.updateConfig(values);\n });\n }\n \n private updateConfig(values: any): void {\n const updatedConfig = { ...this.config };\n \n if (this.isV2) {\n // Update V2 config structure\n const v2Config = updatedConfig as TableConfig;\n \n // Messages\n v2Config.messages = {\n states: {\n loading: values.loadingMessage,\n empty: values.emptyMessage,\n error: values.errorMessage,\n noResults: values.noResultsMessage,\n loadingMore: values.loadingMoreMessage\n },\n actions: {\n confirmations: {\n delete: values.deleteConfirmation,\n deleteMultiple: values.deleteMultipleConfirmation,\n save: values.saveConfirmation,\n cancel: values.cancelConfirmation,\n export: values.exportConfirmation\n },\n success: {\n save: values.saveSuccess,\n delete: values.deleteSuccess,\n export: values.exportSuccess,\n import: values.importSuccess\n },\n progress: {\n delete: values.deleteProgress,\n deleteMultiple: values.deleteMultipleProgress,\n },\n errors: {\n save: values.saveError,\n delete: values.deleteError,\n export: values.exportError,\n network: values.networkError,\n permission: values.permissionError\n }\n },\n validation: {\n required: values.requiredField,\n invalid: values.invalidValue,\n tooLong: values.tooLong,\n tooShort: values.tooShort,\n types: {\n email: values.invalidEmail,\n url: values.invalidUrl,\n number: values.mustBeNumber,\n date: values.invalidDate\n }\n }\n };\n \n // Localization\n v2Config.localization = {\n locale: values.locale,\n direction: values.direction,\n dateTime: {\n dateFormat: values.dateFormat,\n timeFormat: values.timeFormat,\n dateTimeFormat: values.dateTimeFormat,\n firstDayOfWeek: values.firstDayOfWeek,\n relativeTime: values.relativeTime\n },\n number: {\n decimalSeparator: values.decimalSeparator,\n thousandsSeparator: values.thousandsSeparator,\n defaultPrecision: values.defaultPrecision,\n negativeSign: values.negativeSign,\n negativeSignPosition: values.negativeSignPosition\n },\n currency: {\n code: values.currencyCode,\n symbol: values.currencySymbol,\n position: values.currencyPosition,\n spacing: values.currencySpacing,\n precision: values.currencyPrecision\n },\n formatting: {\n percentageFormat: '#0.00%',\n fileSizeFormat: 'binary'\n }\n };\n \n } else {\n // Update V1 config structure\n const v1UpdatedConfig = updatedConfig as any;\n v1UpdatedConfig.messages = {\n loading: values.loadingMessage,\n empty: values.emptyMessage,\n error: values.errorMessage,\n noResults: values.noResultsMessage\n };\n }\n \n this.configChange.emit(updatedConfig);\n }\n}\n","import {\n Component,\n Input,\n OnChanges,\n SimpleChanges,\n ChangeDetectionStrategy,\n Output,\n EventEmitter,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n FormBuilder,\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n Validators,\n FormsModule,\n} from '@angular/forms';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { FieldMetadata, CONFIG_STORAGE, ConfigStorage } from '@praxisui/core';\nimport { SETTINGS_PANEL_DATA } from '@praxisui/settings-panel';\nimport { FilterConfig } from '../services/filter-config.service';\nimport { Observable, of } from 'rxjs';\nimport { map, startWith } from 'rxjs/operators';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatListModule } from '@angular/material/list';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { DragDropModule, CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { FilterTag } from '../components/praxis-filter/praxis-filter.component';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n// (single import already declared above)\n\n@Component({\n selector: 'filter-settings',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n MatTabsModule,\n MatFormFieldModule,\n MatSelectModule,\n MatInputModule,\n MatCheckboxModule,\n MatListModule,\n MatButtonModule,\n MatIconModule,\n PraxisIconDirective,\n DragDropModule,\n ],\n templateUrl: './filter-settings.component.html',\n styleUrls: ['./filter-settings.component.scss'],\n})\nexport class FilterSettingsComponent implements OnChanges {\n @Input() metadata: FieldMetadata[] = [];\n @Input() settings: FilterConfig | undefined;\n @Input() configKey?: string;\n @Output() settingsChange = new EventEmitter<FilterConfig>();\n\n form: FormGroup<{\n quickField: FormControl<string | null>;\n alwaysVisibleFields: FormControl<string[]>;\n placeholder: FormControl<string>;\n showAdvanced: FormControl<boolean>;\n mode: FormControl<'auto' | 'filter' | 'card'>;\n changeDebounceMs: FormControl<number>;\n allowSaveTags: FormControl<boolean>;\n // Tag theming (M3-style knobs)\n tagColor: FormControl<'primary' | 'accent' | 'warn' | 'basic'>;\n tagVariant: FormControl<'filled' | 'outlined'>;\n tagButtonColor: FormControl<'primary' | 'accent' | 'warn' | 'basic'>;\n // Action buttons theming\n actionsButtonColor: FormControl<'primary' | 'accent' | 'warn' | 'basic'>;\n actionsVariant: FormControl<'standard' | 'outlined'>;\n // New layout/UX controls\n placeBooleansInActions: FormControl<boolean>;\n showToggleLabels: FormControl<boolean>;\n alwaysMinWidth: FormControl<number>;\n alwaysColsMd: FormControl<number>;\n alwaysColsLg: FormControl<number>;\n autoSummary: FormControl<boolean>;\n confirmTagDelete: FormControl<boolean>;\n debugLayout: FormControl<boolean>;\n overlayVariant: FormControl<'card' | 'frosted'>;\n overlayBackdrop: FormControl<boolean>;\n advancedOpenMode: FormControl<'overlay' | 'modal' | 'drawer'>;\n }>;\n\n /**\n * Emits true when form has changes and is valid, enabling the save button\n */\n canSave$: Observable<boolean>;\n\n // SettingsPanel contract: state observables to control buttons enablement\n isDirty$: Observable<boolean>;\n isValid$: Observable<boolean>;\n isBusy$: Observable<boolean>;\n\n private initialSettings: FilterConfig = {};\n // Storage (injected) used to clear filter preferences\n private readonly storage = inject<ConfigStorage>(CONFIG_STORAGE);\n\n // Optional data provided by SettingsPanelService when opened as panel\n private readonly injectedData = inject(SETTINGS_PANEL_DATA, {\n optional: true,\n }) as { metadata?: FieldMetadata[]; settings?: FilterConfig; configKey?: string; dto?: Record<string, any> } | null;\n /** Clears persisted preferences for this filter, falling back to globals. */\n resetPreferences(): void {\n const key = this.configKey;\n if (!key) return;\n try {\n this.storage.clearConfig('filter-config:' + key);\n this.storage.clearConfig(key); // DTO persisted\n this.form.markAsPristine();\n (inject(MatSnackBar) as MatSnackBar).open('Preferências do filtro redefinidas', undefined, { duration: 2000 });\n } catch {}\n }\n\n constructor(private fb: FormBuilder) {\n this.form = this.fb.group({\n quickField: this.fb.control<string | null>(null),\n alwaysVisibleFields: this.fb.nonNullable.control<string[]>([]),\n placeholder: this.fb.nonNullable.control(''),\n showAdvanced: this.fb.nonNullable.control(false),\n mode: this.fb.nonNullable.control<'auto' | 'filter' | 'card'>('auto'),\n changeDebounceMs: this.fb.nonNullable.control(300, {\n validators: [Validators.min(100), Validators.max(1000)],\n }),\n allowSaveTags: this.fb.nonNullable.control(false),\n // theming for tags\n tagColor: this.fb.nonNullable.control<'primary' | 'accent' | 'warn' | 'basic'>('primary'),\n tagVariant: this.fb.nonNullable.control<'filled' | 'outlined'>('filled'),\n tagButtonColor: this.fb.nonNullable.control<'primary' | 'accent' | 'warn' | 'basic'>('basic'),\n actionsButtonColor: this.fb.nonNullable.control<'primary' | 'accent' | 'warn' | 'basic'>('basic'),\n actionsVariant: this.fb.nonNullable.control<'standard' | 'outlined'>('standard'),\n placeBooleansInActions: this.fb.nonNullable.control(true),\n showToggleLabels: this.fb.nonNullable.control(true),\n alwaysMinWidth: this.fb.nonNullable.control(300, {\n validators: [Validators.min(240), Validators.max(480)],\n }),\n alwaysColsMd: this.fb.nonNullable.control(2, {\n validators: [Validators.min(1), Validators.max(3)],\n }),\n alwaysColsLg: this.fb.nonNullable.control(3, {\n validators: [Validators.min(1), Validators.max(4)],\n }),\n autoSummary: this.fb.nonNullable.control(false),\n confirmTagDelete: this.fb.nonNullable.control(true),\n debugLayout: this.fb.nonNullable.control(false),\n overlayVariant: this.fb.nonNullable.control<'card' | 'frosted'>('card'),\n overlayBackdrop: this.fb.nonNullable.control(true),\n advancedOpenMode: this.fb.nonNullable.control<'overlay' | 'modal' | 'drawer'>('overlay'),\n });\n\n this.canSave$ = this.form.valueChanges.pipe(\n map(() => this.form.dirty && this.form.valid),\n startWith(false),\n );\n\n // Expose state observables expected by SettingsPanel\n this.isDirty$ = this.form.valueChanges.pipe(\n map(() => this.form.dirty),\n startWith(false),\n );\n this.isValid$ = this.form.statusChanges.pipe(\n map(() => this.form.valid),\n startWith(this.form.valid),\n );\n this.isBusy$ = of(false);\n\n this.form.valueChanges\n .pipe(\n map(() => this.getSettingsValue()),\n takeUntilDestroyed(),\n )\n .subscribe((cfg) => this.settingsChange.emit(cfg));\n\n // If opened inside Settings Panel, seed inputs from injected data\n if (this.injectedData) {\n if (this.injectedData.metadata) {\n this.metadata = this.injectedData.metadata;\n }\n if (this.injectedData.settings) {\n this.settings = this.injectedData.settings;\n this.initialSettings = { ...this.injectedData.settings };\n this.form.reset({\n quickField: this.injectedData.settings.quickField ?? null,\n alwaysVisibleFields: this.injectedData.settings.alwaysVisibleFields ?? [],\n placeholder: this.injectedData.settings.placeholder ?? '',\n showAdvanced: this.injectedData.settings.showAdvanced ?? false,\n mode: this.injectedData.settings.mode ?? 'auto',\n changeDebounceMs: this.clampDebounce(\n this.injectedData.settings.changeDebounceMs,\n ),\n allowSaveTags: this.injectedData.settings.allowSaveTags ?? false,\n tagColor: (this.injectedData.settings as any).tagColor ?? 'primary',\n tagVariant: (this.injectedData.settings as any).tagVariant ?? 'filled',\n tagButtonColor: (this.injectedData.settings as any).tagButtonColor ?? 'basic',\n actionsButtonColor: (this.injectedData.settings as any).actionsButtonColor ?? 'basic',\n actionsVariant: (this.injectedData.settings as any).actionsVariant ?? 'standard',\n placeBooleansInActions: this.injectedData.settings.placeBooleansInActions ?? true,\n showToggleLabels: this.injectedData.settings.showToggleLabels ?? true,\n alwaysMinWidth: this.clampMinWidth(this.injectedData.settings.alwaysMinWidth),\n alwaysColsMd: this.clampColsMd(this.injectedData.settings.alwaysColsMd),\n alwaysColsLg: this.clampColsLg(this.injectedData.settings.alwaysColsLg),\n autoSummary: this.injectedData.settings.autoSummary ?? false,\n confirmTagDelete: this.injectedData.settings.confirmTagDelete ?? true,\n debugLayout: this.injectedData.settings.debugLayout ?? false,\n overlayVariant: (this.injectedData.settings as any).overlayVariant ?? 'card',\n overlayBackdrop: (this.injectedData.settings as any).overlayBackdrop ?? true,\n advancedOpenMode: (this.injectedData.settings as any).advancedOpenMode ?? 'overlay',\n });\n }\n if (this.injectedData.configKey) {\n this.configKey = this.injectedData.configKey;\n this.loadTags();\n }\n }\n }\n\n // ================= TAGS MANAGEMENT =================\n tags: FilterTag[] = [];\n exportJson = '';\n newTagLabel = '';\n newTagPatchText = '';\n\n private tagsKey(): string | null {\n return this.configKey ? `${this.configKey}:tags` : null;\n }\n\n loadTags(): void {\n const key = this.tagsKey();\n if (!key) return;\n const stored = this.storage.loadConfig<FilterTag[]>(key);\n this.tags = Array.isArray(stored) ? [...stored] : [];\n this.exportJson = JSON.stringify(this.tags, null, 2);\n }\n\n saveTags(): void {\n const key = this.tagsKey();\n if (!key) return;\n this.storage.saveConfig(key, this.tags);\n this.exportJson = JSON.stringify(this.tags, null, 2);\n }\n\n clearTags(): void {\n this.tags = [];\n this.saveTags();\n }\n\n removeTag(index: number): void {\n this.tags.splice(index, 1);\n this.saveTags();\n }\n\n renameTag(index: number, value: string): void {\n const v = (value || '').trim();\n if (!v) return;\n this.tags[index] = { ...this.tags[index], label: v };\n this.saveTags();\n }\n\n importTags(): void {\n try {\n const parsed = JSON.parse(this.exportJson);\n this.tags = Array.isArray(parsed) ? parsed : [];\n this.saveTags();\n } catch {\n // ignore JSON errors; keep previous value\n }\n }\n\n addTag(): void {\n const label = (this.newTagLabel || '').trim();\n if (!label) return;\n let patch: Record<string, any> = {};\n const raw = (this.newTagPatchText || '').trim();\n if (raw) {\n try { patch = JSON.parse(raw); } catch { patch = {}; }\n }\n const tag: FilterTag = { id: Date.now().toString(), label, patch };\n this.tags.push(tag);\n this.newTagLabel = '';\n this.newTagPatchText = '';\n this.saveTags();\n }\n\n addTagFromCurrent(): void {\n const dto = this.injectedData?.dto;\n const label = prompt('Tag label', this.newTagLabel || '') || '';\n if (!label) return;\n const tag: FilterTag = { id: Date.now().toString(), label, patch: { ...(dto || {}) } };\n this.tags.push(tag);\n this.saveTags();\n }\n\n dropAlwaysVisible(event: CdkDragDrop<string[]>): void {\n const ctrl = this.form.controls.alwaysVisibleFields;\n const arr = [...(ctrl.value || [])];\n moveItemInArray(arr, event.previousIndex, event.currentIndex);\n ctrl.setValue(arr);\n }\n\n // ================= THEME PRESETS =================\n presets = [\n {\n key: 'minimalOutlined',\n label: 'Minimal Outlined',\n values: {\n tagColor: 'basic',\n tagVariant: 'outlined',\n tagButtonColor: 'basic',\n actionsButtonColor: 'basic',\n actionsVariant: 'outlined',\n } as Partial<FilterConfig>,\n },\n {\n key: 'primaryFilled',\n label: 'Primary Filled',\n values: {\n tagColor: 'primary',\n tagVariant: 'filled',\n tagButtonColor: 'primary',\n actionsButtonColor: 'primary',\n actionsVariant: 'standard',\n } as Partial<FilterConfig>,\n },\n {\n key: 'accentSoft',\n label: 'Accent Soft',\n values: {\n tagColor: 'accent',\n tagVariant: 'filled',\n tagButtonColor: 'accent',\n actionsButtonColor: 'accent',\n actionsVariant: 'outlined',\n } as Partial<FilterConfig>,\n },\n {\n key: 'warnHighlight',\n label: 'Warn Highlight',\n values: {\n tagColor: 'warn',\n tagVariant: 'filled',\n tagButtonColor: 'warn',\n actionsButtonColor: 'warn',\n actionsVariant: 'standard',\n } as Partial<FilterConfig>,\n },\n ];\n\n applyPreset(key: string): void {\n const p = this.presets.find((x) => x.key === key);\n if (!p) return;\n this.form.patchValue(p.values as any);\n }\n\n // Template helpers\n getFieldLabel(name: string): string {\n const m = (this.metadata || []).find((x) => x?.name === name);\n return (m?.label as string) || name;\n }\n\n hasCurrentDto(): boolean {\n return !!this.injectedData?.dto;\n }\n\n renameTagPrompt(index: number): void {\n const current = this.tags[index]?.label ?? '';\n const v = window.prompt('New label', current);\n if (v != null) this.renameTag(index, v);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['settings'] && this.settings) {\n this.initialSettings = { ...this.settings };\n this.form.reset({\n quickField: this.settings.quickField ?? null,\n alwaysVisibleFields: this.settings.alwaysVisibleFields ?? [],\n placeholder: this.settings.placeholder ?? '',\n showAdvanced: this.settings.showAdvanced ?? false,\n mode: this.settings.mode ?? 'auto',\n changeDebounceMs: this.clampDebounce(this.settings.changeDebounceMs),\n allowSaveTags: this.settings.allowSaveTags ?? false,\n tagColor: (this.settings as any).tagColor ?? 'primary',\n tagVariant: (this.settings as any).tagVariant ?? 'filled',\n tagButtonColor: (this.settings as any).tagButtonColor ?? 'basic',\n actionsButtonColor: (this.settings as any).actionsButtonColor ?? 'basic',\n actionsVariant: (this.settings as any).actionsVariant ?? 'standard',\n placeBooleansInActions: this.settings.placeBooleansInActions ?? true,\n showToggleLabels: this.settings.showToggleLabels ?? true,\n alwaysMinWidth: this.clampMinWidth(this.settings.alwaysMinWidth),\n alwaysColsMd: this.clampColsMd(this.settings.alwaysColsMd),\n alwaysColsLg: this.clampColsLg(this.settings.alwaysColsLg),\n autoSummary: this.settings.autoSummary ?? false,\n confirmTagDelete: this.settings.confirmTagDelete ?? true,\n debugLayout: this.settings.debugLayout ?? false,\n overlayVariant: (this.settings as any).overlayVariant ?? 'card',\n overlayBackdrop: (this.settings as any).overlayBackdrop ?? true,\n advancedOpenMode: (this.settings as any).advancedOpenMode ?? 'overlay',\n });\n }\n }\n\n getSettingsValue(): FilterConfig {\n const value = this.form.getRawValue();\n const quickField = value.quickField || undefined;\n const alwaysVisibleFields = value.alwaysVisibleFields;\n return {\n quickField,\n alwaysVisibleFields: alwaysVisibleFields.length\n ? alwaysVisibleFields\n : undefined,\n placeholder: value.placeholder || undefined,\n showAdvanced: value.showAdvanced ?? undefined,\n mode: value.mode !== 'auto' ? value.mode : undefined,\n changeDebounceMs:\n value.changeDebounceMs !== 300 ? value.changeDebounceMs : undefined,\n allowSaveTags: value.allowSaveTags ? true : undefined,\n tagColor: value.tagColor !== 'primary' ? value.tagColor : undefined,\n tagVariant: value.tagVariant !== 'filled' ? value.tagVariant : undefined,\n tagButtonColor:\n value.tagButtonColor !== 'basic' ? value.tagButtonColor : undefined,\n actionsButtonColor:\n value.actionsButtonColor !== 'basic' ? value.actionsButtonColor : undefined,\n actionsVariant:\n value.actionsVariant !== 'standard' ? value.actionsVariant : undefined,\n placeBooleansInActions:\n value.placeBooleansInActions !== true ? value.placeBooleansInActions : undefined,\n showToggleLabels:\n value.showToggleLabels !== true ? value.showToggleLabels : undefined,\n alwaysMinWidth:\n value.alwaysMinWidth !== 300 ? value.alwaysMinWidth : undefined,\n alwaysColsMd: value.alwaysColsMd !== 2 ? value.alwaysColsMd : undefined,\n alwaysColsLg: value.alwaysColsLg !== 3 ? value.alwaysColsLg : undefined,\n autoSummary: value.autoSummary ? true : undefined,\n confirmTagDelete:\n value.confirmTagDelete !== true ? value.confirmTagDelete : undefined,\n debugLayout: value.debugLayout ? true : undefined,\n overlayVariant: value.overlayVariant !== 'card' ? value.overlayVariant : undefined,\n overlayBackdrop: value.overlayBackdrop !== true ? value.overlayBackdrop : undefined,\n advancedOpenMode: value.advancedOpenMode !== 'overlay' ? value.advancedOpenMode : undefined,\n };\n }\n\n reset(): void {\n this.form.reset({\n quickField: this.initialSettings.quickField ?? null,\n alwaysVisibleFields: this.initialSettings.alwaysVisibleFields ?? [],\n placeholder: this.initialSettings.placeholder ?? '',\n showAdvanced: this.initialSettings.showAdvanced ?? false,\n mode: this.initialSettings.mode ?? 'auto',\n changeDebounceMs: this.clampDebounce(\n this.initialSettings.changeDebounceMs,\n ),\n allowSaveTags: this.initialSettings.allowSaveTags ?? false,\n tagColor: (this.initialSettings as any).tagColor ?? 'primary',\n tagVariant: (this.initialSettings as any).tagVariant ?? 'filled',\n tagButtonColor: (this.initialSettings as any).tagButtonColor ?? 'basic',\n actionsButtonColor: (this.initialSettings as any).actionsButtonColor ?? 'basic',\n actionsVariant: (this.initialSettings as any).actionsVariant ?? 'standard',\n placeBooleansInActions: this.initialSettings.placeBooleansInActions ?? true,\n showToggleLabels: this.initialSettings.showToggleLabels ?? true,\n alwaysMinWidth: this.clampMinWidth(this.initialSettings.alwaysMinWidth),\n alwaysColsMd: this.clampColsMd(this.initialSettings.alwaysColsMd),\n alwaysColsLg: this.clampColsLg(this.initialSettings.alwaysColsLg),\n autoSummary: this.initialSettings.autoSummary ?? false,\n confirmTagDelete: this.initialSettings.confirmTagDelete ?? true,\n debugLayout: this.initialSettings.debugLayout ?? false,\n overlayVariant: (this.initialSettings as any).overlayVariant ?? 'card',\n overlayBackdrop: (this.initialSettings as any).overlayBackdrop ?? true,\n advancedOpenMode: (this.initialSettings as any).advancedOpenMode ?? 'overlay',\n });\n }\n\n private clampDebounce(value?: number): number {\n const v = value ?? 300;\n return Math.min(1000, Math.max(100, v));\n }\n\n private clampMinWidth(value?: number): number {\n const v = value ?? 300;\n return Math.min(480, Math.max(240, v));\n }\n\n private clampColsMd(value?: number): number {\n const v = value ?? 2;\n return Math.min(3, Math.max(1, v));\n }\n\n private clampColsLg(value?: number): number {\n const v = value ?? 3;\n return Math.min(4, Math.max(1, v));\n }\n}\n","<form [formGroup]=\"form\">\n <mat-tab-group>\n <mat-tab label=\"Quick Field\">\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Quick Field</mat-label>\n <mat-select formControlName=\"quickField\">\n <mat-option [value]=\"meta.name\" *ngFor=\"let meta of metadata\">\n {{ meta.label || meta.name }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </mat-tab>\n <mat-tab label=\"Always Visible\">\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Always Visible Fields</mat-label>\n <mat-select formControlName=\"alwaysVisibleFields\" multiple>\n <mat-option [value]=\"meta.name\" *ngFor=\"let meta of metadata\">\n {{ meta.label || meta.name }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <div class=\"options\">\n <p><strong>Order (drag to reorder)</strong></p>\n <div cdkDropList (cdkDropListDropped)=\"dropAlwaysVisible($event)\" class=\"dnd-list\">\n <div class=\"dnd-item\" *ngFor=\"let name of form.controls.alwaysVisibleFields.value; let i = index\" cdkDrag>\n <mat-icon [praxisIcon]=\"'drag_indicator'\"></mat-icon>\n <span>{{ getFieldLabel(name) }}</span>\n </div>\n </div>\n </div>\n </mat-tab>\n <mat-tab label=\"Layout\">\n <div class=\"options\">\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Min width (px)</mat-label>\n <input matInput type=\"number\" formControlName=\"alwaysMinWidth\" min=\"240\" max=\"480\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Columns ≥600px</mat-label>\n <input matInput type=\"number\" formControlName=\"alwaysColsMd\" min=\"1\" max=\"3\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Columns ≥960px</mat-label>\n <input matInput type=\"number\" formControlName=\"alwaysColsLg\" min=\"1\" max=\"4\" />\n </mat-form-field>\n </div>\n </mat-tab>\n <mat-tab label=\"Booleans\">\n <div class=\"options\">\n <mat-checkbox formControlName=\"placeBooleansInActions\">Place toggles in actions</mat-checkbox>\n <mat-checkbox formControlName=\"showToggleLabels\">Show toggle labels</mat-checkbox>\n </div>\n </mat-tab>\n <mat-tab label=\"Options\">\n <div class=\"options\">\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Overlay theme</mat-label>\n <mat-select formControlName=\"overlayVariant\">\n <mat-option value=\"card\">Card</mat-option>\n <mat-option value=\"frosted\">Frosted</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-checkbox formControlName=\"overlayBackdrop\">Overlay with backdrop</mat-checkbox>\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Advanced open mode</mat-label>\n <mat-select formControlName=\"advancedOpenMode\">\n <mat-option value=\"overlay\">Overlay (default)</mat-option>\n <mat-option value=\"modal\">Modal</mat-option>\n <mat-option value=\"drawer\">Drawer (right)</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Placeholder</mat-label>\n <input matInput formControlName=\"placeholder\" />\n </mat-form-field>\n <mat-checkbox formControlName=\"showAdvanced\"\n >Show Advanced</mat-checkbox\n >\n <mat-checkbox formControlName=\"autoSummary\">Enable auto summary</mat-checkbox>\n <mat-checkbox formControlName=\"confirmTagDelete\">Confirm tag delete</mat-checkbox>\n <div class=\"options\">\n <h4>Tag theme</h4>\n <mat-form-field appearance=\"outline\">\n <mat-label>Tag color</mat-label>\n <mat-select formControlName=\"tagColor\">\n <mat-option value=\"primary\">Primary</mat-option>\n <mat-option value=\"accent\">Accent</mat-option>\n <mat-option value=\"warn\">Warn</mat-option>\n <mat-option value=\"basic\">Basic</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Tag variant</mat-label>\n <mat-select formControlName=\"tagVariant\">\n <mat-option value=\"filled\">Filled</mat-option>\n <mat-option value=\"outlined\">Outlined</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Button color</mat-label>\n <mat-select formControlName=\"tagButtonColor\">\n <mat-option value=\"basic\">Basic</mat-option>\n <mat-option value=\"primary\">Primary</mat-option>\n <mat-option value=\"accent\">Accent</mat-option>\n <mat-option value=\"warn\">Warn</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div class=\"options\">\n <h4>Action buttons theme</h4>\n <mat-form-field appearance=\"outline\">\n <mat-label>Buttons color</mat-label>\n <mat-select formControlName=\"actionsButtonColor\">\n <mat-option value=\"basic\">Basic</mat-option>\n <mat-option value=\"primary\">Primary</mat-option>\n <mat-option value=\"accent\">Accent</mat-option>\n <mat-option value=\"warn\">Warn</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Buttons variant</mat-label>\n <mat-select formControlName=\"actionsVariant\">\n <mat-option value=\"standard\">Standard</mat-option>\n <mat-option value=\"outlined\">Outlined</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div class=\"options\">\n <h4>Theme presets</h4>\n <div class=\"preset-row\">\n <button mat-stroked-button *ngFor=\"let p of presets\" (click)=\"applyPreset(p.key)\">{{ p.label }}</button>\n </div>\n </div>\n </div>\n </mat-tab>\n <mat-tab label=\"i18n\">\n <div class=\"options\">\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Search placeholder</mat-label>\n <input matInput [value]=\"settings?.placeholder || ''\" disabled />\n <mat-hint>Placeholder do quick (integra com i18n no futuro)</mat-hint>\n </mat-form-field>\n <!-- Espaço reservado para i18n granular, se necessário -->\n </div>\n </mat-tab>\n <mat-tab label=\"Tags\" *ngIf=\"configKey\">\n <div class=\"options\">\n <div class=\"tags-header\">\n <span><strong>Saved tags</strong></span>\n <span class=\"spacer\"></span>\n <button mat-stroked-button color=\"warn\" (click)=\"clearTags()\">Clear all</button>\n </div>\n <div class=\"new-tag\">\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>New tag label</mat-label>\n <input matInput [(ngModel)]=\"newTagLabel\" [ngModelOptions]=\"{standalone: true}\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Patch (JSON, optional)</mat-label>\n <textarea matInput rows=\"3\" [(ngModel)]=\"newTagPatchText\" [ngModelOptions]=\"{standalone: true}\"></textarea>\n </mat-form-field>\n <div>\n <button mat-stroked-button color=\"primary\" (click)=\"addTag()\">Add</button>\n <button mat-stroked-button (click)=\"addTagFromCurrent()\" *ngIf=\"hasCurrentDto()\">Add from current filters</button>\n </div>\n </div>\n <mat-list>\n <mat-list-item *ngFor=\"let t of tags; index as i\">\n <span matListItemTitle>{{ t.label }}</span>\n <span matListItemLine>{{ t.id }}</span>\n <button mat-icon-button (click)=\"removeTag(i)\" matTooltip=\"Delete\">\n <mat-icon [praxisIcon]=\"'delete'\"></mat-icon>\n </button>\n <button mat-icon-button (click)=\"renameTagPrompt(i)\" matTooltip=\"Rename\">\n <mat-icon [praxisIcon]=\"'edit'\"></mat-icon>\n </button>\n </mat-list-item>\n </mat-list>\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Import/Export JSON</mat-label>\n <textarea matInput rows=\"6\" [(ngModel)]=\"exportJson\" [ngModelOptions]=\"{standalone: true}\"></textarea>\n </mat-form-field>\n <div>\n <button mat-stroked-button color=\"primary\" (click)=\"importTags()\">Import</button>\n <button mat-stroked-button (click)=\"loadTags()\">Reload</button>\n <button mat-stroked-button (click)=\"saveTags()\">Save</button>\n </div>\n </div>\n </mat-tab>\n <mat-tab label=\"Behavior\">\n <div class=\"options\">\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Mode</mat-label>\n <mat-select formControlName=\"mode\">\n <mat-option value=\"auto\">Auto</mat-option>\n <mat-option value=\"filter\">Filter</mat-option>\n <mat-option value=\"card\">Card</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-checkbox formControlName=\"allowSaveTags\"\n >Allow Save Tags</mat-checkbox\n >\n <mat-checkbox formControlName=\"debugLayout\">Show debug layout</mat-checkbox>\n </div>\n </mat-tab>\n <mat-tab label=\"Advanced\">\n <div class=\"options\">\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Change Debounce (ms)</mat-label>\n <input\n matInput\n type=\"number\"\n formControlName=\"changeDebounceMs\"\n min=\"100\"\n max=\"1000\"\n />\n <mat-error *ngIf=\"form.controls.changeDebounceMs.invalid\">\n Value must be between 100 and 1000\n </mat-error>\n </mat-form-field>\n <div class=\"actions\">\n <button mat-stroked-button color=\"warn\" (click)=\"resetPreferences()\">\n <mat-icon [praxisIcon]=\"'restart_alt'\"></mat-icon>\n Reset filter preferences\n </button>\n </div>\n </div>\n </mat-tab>\n </mat-tab-group>\n</form>\n","import { Component, EventEmitter, Input, Output, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatIconModule } from '@angular/material/icon';\nimport { TableConfig } from '@praxisui/core';\n\n@Component({\n selector: 'header-appearance-editor',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, MatSelectModule, MatSlideToggleModule, MatCardModule, MatIconModule],\n template: `\n <div class=\"header-editor\">\n <mat-card>\n <mat-card-header>\n <mat-icon>view_headline</mat-icon>\n <mat-card-title>Estilo do Cabeçalho</mat-card-title>\n </mat-card-header>\n <mat-card-content class=\"grid\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Altura do cabeçalho (px)</mat-label>\n <input matInput type=\"number\" [(ngModel)]=\"headerHeight\" (ngModelChange)=\"emit()\" min=\"32\" max=\"96\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Padding do cabeçalho</mat-label>\n <input matInput [(ngModel)]=\"headerPadding\" (ngModelChange)=\"emit()\" placeholder=\"12px 16px\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Tamanho da fonte</mat-label>\n <input matInput [(ngModel)]=\"headerFontSize\" (ngModelChange)=\"emit()\" placeholder=\"14px\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Peso da fonte</mat-label>\n <input matInput [(ngModel)]=\"headerFontWeight\" (ngModelChange)=\"emit()\" placeholder=\"600\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Espaçamento entre letras</mat-label>\n <input matInput [(ngModel)]=\"letterSpacing\" (ngModelChange)=\"emit()\" placeholder=\".02em\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Transformação do texto</mat-label>\n <mat-select [(ngModel)]=\"headerCase\" (ngModelChange)=\"emit()\">\n <mat-option value=\"none\">Nenhuma</mat-option>\n <mat-option value=\"uppercase\">MAIÚSCULAS</mat-option>\n <mat-option value=\"lowercase\">minúsculas</mat-option>\n <mat-option value=\"capitalize\">Capitalizar</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor de fundo do cabeçalho</mat-label>\n <input matInput [(ngModel)]=\"headerBg\" (ngModelChange)=\"emit()\" placeholder=\"#003E4D\" />\n <mat-hint>Use uma cor CSS válida (ex.: #003E4D)</mat-hint>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor do texto do cabeçalho</mat-label>\n <input matInput [(ngModel)]=\"headerFg\" (ngModelChange)=\"emit()\" placeholder=\"#ffffff\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor da borda inferior do cabeçalho</mat-label>\n <input matInput [(ngModel)]=\"headerBorder\" (ngModelChange)=\"emit()\" placeholder=\"#d5dae2\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor de fundo das linhas pares (zebra)</mat-label>\n <input matInput [(ngModel)]=\"zebraBg\" (ngModelChange)=\"emit()\" placeholder=\"#f6f7f9\" />\n </mat-form-field>\n </mat-card-content>\n </mat-card>\n </div>\n `,\n styles: [`\n .header-editor { display: block; }\n .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px,1fr)); gap: 12px; }\n mat-card-title { margin-left: 8px; }\n `]\n})\nexport class HeaderAppearanceEditorComponent {\n @Input() config!: TableConfig;\n @Output() configChange = new EventEmitter<TableConfig>();\n\n headerHeight?: number;\n headerPadding?: string;\n headerFontSize?: string;\n headerFontWeight?: string | number;\n letterSpacing?: string;\n headerCase: 'none'|'uppercase'|'lowercase'|'capitalize' = 'none';\n headerBg?: string;\n headerFg?: string;\n headerBorder?: string;\n zebraBg?: string;\n\n ngOnInit(): void {\n const app: any = this.config?.appearance || {};\n this.headerHeight = app.spacing?.headerHeight;\n this.headerPadding = app.spacing?.headerPadding;\n this.headerFontSize = app.typography?.headerFontSize;\n this.headerFontWeight = app.typography?.headerFontWeight;\n this.letterSpacing = app.typography?.letterSpacing;\n this.headerCase = app.typography?.headerCase || 'none';\n this.headerBg = app.colors?.headerBackground;\n this.headerFg = app.colors?.headerTextColor;\n this.zebraBg = app.colors?.alternateRowBackground;\n this.headerBorder = app.borders?.specific?.header?.color || app.borders?.color;\n }\n\n emit(): void {\n const next: TableConfig = {\n ...(this.config || {}),\n appearance: {\n ...(this.config?.appearance || {}),\n spacing: {\n ...(this.config?.appearance?.spacing || {}),\n headerHeight: this.headerHeight,\n headerPadding: this.headerPadding,\n },\n typography: {\n ...(this.config?.appearance?.typography || {}),\n headerFontSize: this.headerFontSize,\n headerFontWeight: this.headerFontWeight as any,\n letterSpacing: this.letterSpacing,\n headerCase: this.headerCase,\n },\n colors: {\n ...(this.config?.appearance?.colors || {}),\n headerBackground: this.headerBg,\n headerTextColor: this.headerFg,\n alternateRowBackground: this.zebraBg,\n },\n borders: {\n ...(this.config?.appearance?.borders || {}),\n specific: {\n ...(this.config?.appearance?.borders?.specific || {}),\n header: {\n ...(this.config?.appearance?.borders?.specific?.header || {}),\n color: this.headerBorder,\n }\n }\n }\n }\n } as TableConfig;\n this.config = next;\n this.configChange.emit(next);\n }\n}\n","import { Component, Input, OnInit, Inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, FormArray, Validators } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { CONFIG_STORAGE, ConfigStorage } from '@praxisui/core';\n\nexport interface CrudEditorContextLike {\n tableId: string;\n resourcePath?: string;\n defaults?: {\n openMode?: 'modal' | 'route' | 'drawer';\n modal?: Record<string, any>;\n back?: Record<string, any>;\n };\n actions?: Array<{\n action: string;\n label?: string;\n formId?: string;\n route?: string;\n openMode?: 'modal' | 'route' | 'drawer';\n }>;\n}\n\n@Component({\n selector: 'crud-integration-editor',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatSlideToggleModule,\n MatExpansionModule,\n MatIconModule,\n MatButtonModule,\n MatTooltipModule,\n ],\n template: `\n <div class=\"crud-editor\">\n <mat-expansion-panel [expanded]=\"true\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\">settings</mat-icon>\n Padrões do CRUD\n </mat-panel-title>\n <mat-panel-description>\n Comportamento ao abrir formulários a partir da tabela\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"config-section\">\n <div class=\"form-grid\" [formGroup]=\"defaultsForm\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Modo de abertura</mat-label>\n <mat-select formControlName=\"openMode\">\n <mat-option value=\"modal\">Modal</mat-option>\n <mat-option value=\"route\">Rota</mat-option>\n <mat-option value=\"drawer\">Gaveta (direita)</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-slide-toggle formControlName=\"modal_closeOnSave\">Fechar ao salvar</mat-slide-toggle>\n <mat-slide-toggle formControlName=\"modal_rememberLastState\">Lembrar tamanho/estado</mat-slide-toggle>\n <mat-slide-toggle formControlName=\"modal_autoFocus\">Auto foco</mat-slide-toggle>\n <mat-slide-toggle formControlName=\"modal_restoreFocus\">Restaurar foco ao fechar</mat-slide-toggle>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Largura</mat-label>\n <input matInput formControlName=\"modal_width\" placeholder=\"ex: 800px\" />\n <mat-hint>Use px, %, vw. Ex: 800px, 90vw</mat-hint>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Altura</mat-label>\n <input matInput formControlName=\"modal_height\" placeholder=\"ex: 90vh\" />\n <mat-hint>Use px, %, vh. Ex: 600px, 90vh</mat-hint>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Breakpoint de fullscreen (px)</mat-label>\n <input matInput type=\"number\" formControlName=\"modal_fullscreenBreakpoint\" />\n </mat-form-field>\n\n <mat-slide-toggle formControlName=\"modal_startMaximized\">Iniciar maximizado</mat-slide-toggle>\n <mat-slide-toggle formControlName=\"modal_canMaximize\">Permitir maximizar</mat-slide-toggle>\n <mat-slide-toggle formControlName=\"modal_disableCloseOnEsc\">Desabilitar fechar com ESC</mat-slide-toggle>\n <mat-slide-toggle formControlName=\"modal_disableCloseOnBackdrop\">Desabilitar fechar com backdrop</mat-slide-toggle>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Estilo do backdrop</mat-label>\n <mat-select formControlName=\"modal_backdropStyle\">\n <mat-option [value]=\"''\">Padrão</mat-option>\n <mat-option value=\"blur\">Blur</mat-option>\n <mat-option value=\"dim\">Escurecido</mat-option>\n <mat-option value=\"transparent\">Transparente</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Margem ao maximizar (edgeGap px)</mat-label>\n <input matInput type=\"number\" formControlName=\"modal_edgeGap\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>ReturnTo (padrão ao navegar)</mat-label>\n <input matInput formControlName=\"back_returnTo\" placeholder=\"/minha-rota\" />\n </mat-form-field>\n\n <mat-slide-toggle formControlName=\"back_confirmOnDirty\">Confirmar ao sair com alterações</mat-slide-toggle>\n\n <!-- Header (route mode) -->\n <mat-slide-toggle formControlName=\"header_showBack\">Mostrar botão Voltar (rota)</mat-slide-toggle>\n <mat-form-field appearance=\"outline\">\n <mat-label>Texto do botão Voltar</mat-label>\n <input matInput formControlName=\"header_backLabel\" placeholder=\"Voltar\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Variante do botão</mat-label>\n <mat-select formControlName=\"header_variant\">\n <mat-option value=\"ghost\">Ghost</mat-option>\n <mat-option value=\"tonal\">Tonal</mat-option>\n <mat-option value=\"outlined\">Outlined</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-slide-toggle formControlName=\"header_sticky\">Cabeçalho fixo (sticky)</mat-slide-toggle>\n <mat-slide-toggle formControlName=\"header_divider\">Exibir divisor inferior</mat-slide-toggle>\n </div>\n </div>\n </mat-expansion-panel>\n\n <mat-expansion-panel *ngIf=\"actionsArray?.length\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"section-icon\">list</mat-icon>\n Ações específicas\n </mat-panel-title>\n <mat-panel-description>\n Sobrescrever modo de abertura por ação\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"config-section\">\n <div class=\"actions-list\">\n <div class=\"action-item\" *ngFor=\"let ctrl of actionForms.controls; let i = index\" [formGroup]=\"ctrl\">\n <div class=\"action-row\">\n <span class=\"action-name\">{{ ctrl.get('action')?.value }}</span>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Modo</mat-label>\n <mat-select formControlName=\"openMode\">\n <mat-option [value]=\"''\">Padrão</mat-option>\n <mat-option value=\"modal\">Modal</mat-option>\n <mat-option value=\"route\">Rota</mat-option>\n <mat-option value=\"drawer\">Gaveta (direita)</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>formId (se modal/gaveta)</mat-label>\n <input matInput formControlName=\"formId\" placeholder=\"ex: employees-edit\" />\n <mat-hint>Obrigatório quando modo = Modal ou Gaveta</mat-hint>\n <mat-error *ngIf=\"(ctrl.get('openMode')?.value === 'modal' || ctrl.get('openMode')?.value === 'drawer') && ctrl.get('formId')?.enabled && !ctrl.get('formId')?.value\">\n Informe um formId para abrir em Modal/Gaveta\n </mat-error>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>route (se rota)</mat-label>\n <input matInput formControlName=\"route\" placeholder=\"ex: /employees/:id/edit\" />\n <mat-hint>Obrigatório quando modo = Rota</mat-hint>\n <mat-error *ngIf=\"ctrl.get('openMode')?.value === 'route' && ctrl.get('route')?.enabled && !ctrl.get('route')?.value\">\n Informe uma rota para abrir em Rota\n </mat-error>\n </mat-form-field>\n\n <button mat-icon-button type=\"button\" (click)=\"resetActionOverride(i)\" aria-label=\"Resetar overrides\" matTooltip=\"Resetar overrides\">\n <mat-icon>restart_alt</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n\n <div class=\"hint\">\n <button mat-stroked-button color=\"warn\" type=\"button\" (click)=\"resetAllOverrides()\">\n <mat-icon>restart_alt</mat-icon>\n Redefinir overrides de CRUD (todos)\n </button>\n </div>\n\n <div class=\"hint\">As alterações são salvas junto com a ação \"Salvar\" do painel.</div>\n </div>\n `,\n styles: [\n `\n :host {\n --cie-on-surface-variant: var(--mat-sys-on-surface-variant, color-mix(in srgb, var(--sicoob-text-high), transparent 40%));\n }\n .crud-editor { display: block; width: 100%; padding: 8px; }\n .config-section { padding: 16px; }\n .form-grid { display: grid; grid-template-columns: repeat(2, minmax(220px, 1fr)); gap: 12px; align-items: center; }\n .form-grid .mat-mdc-form-field { width: 100%; }\n .actions-list { display: flex; flex-direction: column; gap: 8px; }\n .action-row { display: grid; grid-template-columns: 160px 160px 1fr 1fr; gap: 8px; align-items: center; }\n .action-name { font-weight: 600; }\n .hint { margin-top: 8px; color: var(--cie-on-surface-variant); }\n .section-icon { margin-right: 8px; color: var(--mat-sys-primary); }\n mat-form-field { width: 100%; }\n mat-expansion-panel { margin-bottom: 8px; border-radius: 8px; overflow: hidden; }\n mat-expansion-panel-header { min-height: 56px; }\n mat-panel-description { color: var(--mat-sys-on-surface-variant); }\n `,\n ],\n})\nexport class CrudIntegrationEditorComponent implements OnInit {\n @Input() tableId!: string;\n @Input() crudContext?: CrudEditorContextLike;\n\n defaultsForm!: FormGroup;\n actionForms!: FormArray<FormGroup>;\n\n constructor(\n private fb: FormBuilder,\n @Inject(CONFIG_STORAGE) private storage: ConfigStorage,\n ) {}\n\n ngOnInit(): void {\n // Forms\n this.defaultsForm = this.fb.group({\n openMode: this.fb.control<'modal' | 'route' | 'drawer' | undefined>(undefined as any),\n modal_closeOnSave: this.fb.control<boolean>(true),\n modal_rememberLastState: this.fb.control<boolean>(false),\n modal_autoFocus: this.fb.control<boolean>(true),\n modal_restoreFocus: this.fb.control<boolean>(true),\n modal_width: this.fb.control<string | undefined>(undefined),\n modal_height: this.fb.control<string | undefined>(undefined),\n modal_startMaximized: this.fb.control<boolean>(false),\n modal_fullscreenBreakpoint: this.fb.control<number | null>(null),\n modal_canMaximize: this.fb.control<boolean>(true),\n modal_disableCloseOnEsc: this.fb.control<boolean>(false),\n modal_disableCloseOnBackdrop: this.fb.control<boolean>(false),\n modal_backdropStyle: this.fb.control<string | undefined>(undefined),\n modal_edgeGap: this.fb.control<number | null>(null),\n back_returnTo: this.fb.control<string | undefined>(undefined),\n back_confirmOnDirty: this.fb.control<boolean>(true),\n\n // Header (route mode)\n header_showBack: this.fb.control<boolean>(true),\n header_backLabel: this.fb.control<string | undefined>(undefined),\n header_variant: this.fb.control<string>('ghost'),\n header_sticky: this.fb.control<boolean>(true),\n header_divider: this.fb.control<boolean>(true),\n });\n this.actionForms = this.fb.array<FormGroup>([]);\n\n // Load overrides from storage, fallback to provided crudContext defaults\n const key = this.getStorageKey();\n const saved = (this.storage.loadConfig(key) as any) || {};\n const defaults = saved.defaults || (this.crudContext?.defaults || {});\n const modal = defaults.modal || {};\n const back = defaults.back || {};\n const header = defaults.header || {};\n\n this.defaultsForm.patchValue({\n openMode: defaults.openMode,\n modal_closeOnSave: modal.closeOnSave ?? true,\n modal_rememberLastState: modal.rememberLastState ?? false,\n modal_autoFocus: modal.autoFocus ?? true,\n modal_restoreFocus: modal.restoreFocus ?? true,\n modal_width: modal.width,\n modal_height: modal.height,\n modal_startMaximized: !!modal.startMaximized,\n modal_fullscreenBreakpoint: modal.fullscreenBreakpoint ?? null,\n modal_canMaximize: modal.canMaximize ?? true,\n modal_disableCloseOnEsc: !!modal.disableCloseOnEsc,\n modal_disableCloseOnBackdrop: !!modal.disableCloseOnBackdrop,\n modal_backdropStyle: modal.backdropStyle ?? '',\n modal_edgeGap: modal.edgeGap ?? null,\n back_returnTo: back.returnTo,\n back_confirmOnDirty: back.confirmOnDirty ?? true,\n\n header_showBack: header.showBack ?? true,\n header_backLabel: header.backLabel,\n header_variant: header.variant || 'ghost',\n header_sticky: header.sticky ?? true,\n header_divider: header.divider ?? true,\n });\n\n const actions = this.crudContext?.actions || [];\n const overrides = saved.actions || {};\n for (const a of actions) {\n const ov = overrides[a.action] || {};\n this.actionForms.push(\n this.fb.group({\n action: this.fb.control(a.action),\n openMode: this.fb.control<string | undefined>(ov.openMode),\n formId: this.fb.control<string | undefined>(ov.formId ?? a.formId),\n route: this.fb.control<string | undefined>(ov.route ?? a.route),\n }),\n );\n }\n\n // Prefill sensible defaults when selecting Modal\n this.defaultsForm.get('openMode')?.valueChanges.subscribe((mode) => {\n if (mode === 'modal') {\n const w = this.defaultsForm.get('modal_width');\n const h = this.defaultsForm.get('modal_height');\n if (!w?.value) w?.setValue('800px');\n if (!h?.value) h?.setValue('90vh');\n }\n });\n\n // Bind per-action control state to openMode\n for (const grp of this.actionForms.controls) {\n const update = () => this.updateActionControlsState(grp);\n grp.get('openMode')?.valueChanges.subscribe(update);\n update();\n }\n }\n\n get actionFormsControls() {\n return this.actionForms.controls;\n }\n\n get actionsArray(): any[] | undefined {\n return this.crudContext?.actions;\n }\n\n saveOverrides(): void {\n const key = this.getStorageKey();\n const v = this.defaultsForm.value;\n const defaults: any = {\n openMode: v.openMode,\n modal: {\n closeOnSave: !!v.modal_closeOnSave,\n rememberLastState: !!v.modal_rememberLastState,\n autoFocus: !!v.modal_autoFocus,\n restoreFocus: !!v.modal_restoreFocus,\n width: v.modal_width,\n height: v.modal_height,\n startMaximized: v.modal_startMaximized,\n fullscreenBreakpoint: v.modal_fullscreenBreakpoint ?? undefined,\n canMaximize: v.modal_canMaximize,\n disableCloseOnEsc: v.modal_disableCloseOnEsc,\n disableCloseOnBackdrop: v.modal_disableCloseOnBackdrop,\n backdropStyle: v.modal_backdropStyle || undefined,\n edgeGap: v.modal_edgeGap ?? undefined,\n },\n back: {\n returnTo: v.back_returnTo,\n confirmOnDirty: v.back_confirmOnDirty,\n },\n header: {\n showBack: v.header_showBack,\n backLabel: v.header_backLabel || undefined,\n variant: v.header_variant || 'ghost',\n sticky: v.header_sticky,\n divider: v.header_divider,\n },\n };\n const actions: Record<string, any> = {};\n for (const ctrl of this.actionForms.controls) {\n const av = ctrl.value as any;\n actions[av.action] = {\n openMode: av.openMode || undefined,\n formId: av.formId || undefined,\n route: av.route || undefined,\n };\n }\n const payload = { defaults, actions };\n this.storage.saveConfig(key, payload);\n }\n\n resetAllOverrides(): void {\n const key = this.getStorageKey();\n try { this.storage.clearConfig(key); } catch {}\n // Reset forms to initial state\n this.defaultsForm.reset({\n openMode: undefined,\n modal_closeOnSave: true,\n modal_rememberLastState: false,\n modal_autoFocus: true,\n modal_restoreFocus: true,\n modal_width: undefined,\n modal_height: undefined,\n modal_startMaximized: false,\n modal_fullscreenBreakpoint: null,\n modal_canMaximize: true,\n modal_disableCloseOnEsc: false,\n modal_disableCloseOnBackdrop: false,\n modal_backdropStyle: '',\n modal_edgeGap: null,\n back_returnTo: undefined,\n back_confirmOnDirty: true,\n header_showBack: true,\n header_backLabel: undefined,\n header_variant: 'ghost',\n header_sticky: true,\n header_divider: true,\n });\n for (const grp of this.actionForms.controls) {\n grp.reset({ action: grp.get('action')?.value, openMode: undefined, formId: undefined, route: undefined });\n this.updateActionControlsState(grp);\n }\n }\n\n private getStorageKey(): string {\n const id = this.crudContext?.tableId || this.tableId || 'default';\n return `crud-overrides:${id}`;\n }\n\n private updateActionControlsState(grp: FormGroup): void {\n const mode: string | undefined = grp.get('openMode')?.value;\n const formId = grp.get('formId');\n const route = grp.get('route');\n if (!formId || !route) return;\n if (mode === 'modal' || mode === 'drawer') {\n formId.enable({ emitEvent: false });\n formId.setValidators([Validators.required]);\n route.disable({ emitEvent: false });\n route.clearValidators();\n } else if (mode === 'route') {\n route.enable({ emitEvent: false });\n route.setValidators([Validators.required]);\n formId.disable({ emitEvent: false });\n formId.clearValidators();\n } else {\n formId.enable({ emitEvent: false });\n formId.clearValidators();\n route.enable({ emitEvent: false });\n route.clearValidators();\n }\n formId.updateValueAndValidity({ emitEvent: false });\n route.updateValueAndValidity({ emitEvent: false });\n }\n\n resetActionOverride(index: number): void {\n const grp = this.actionForms.at(index) as FormGroup;\n grp.patchValue({ openMode: '', formId: undefined, route: undefined }, { emitEvent: false });\n this.updateActionControlsState(grp);\n }\n}\n","import { RuleBuilderState, RuleNode } from '@praxisui/visual-builder';\n\nexport interface ConditionalStyleRule {\n condition: string;\n cssClass?: string;\n style?: { [key: string]: string };\n description?: string;\n}\n\nexport function ruleBuilderStateToConditionalStyles(\n state: RuleBuilderState | null | undefined,\n): ConditionalStyleRule[] {\n if (!state || !state.rootNodes?.length) return [];\n\n const rules: ConditionalStyleRule[] = [];\n state.rootNodes.forEach((rootId, idx) => {\n const root = state.nodes[rootId];\n const condition = buildDslFromNode(root, state.nodes) || '';\n if (condition) {\n rules.push({\n condition,\n cssClass: `rule-${idx + 1}`,\n });\n }\n });\n return rules;\n}\n\nexport function conditionalStylesToBuilderState(\n styles: ConditionalStyleRule[] | null | undefined,\n): RuleBuilderState {\n const state: RuleBuilderState = {\n nodes: {},\n rootNodes: [],\n validationErrors: [],\n mode: 'visual',\n isDirty: false,\n history: [],\n historyPosition: 0,\n } as any;\n\n if (!styles?.length) return state;\n\n styles.forEach((style) => {\n const conditionNode = parseSimpleCondition(style.condition);\n if (conditionNode) {\n state.nodes[conditionNode.id] = conditionNode;\n state.rootNodes.push(conditionNode.id);\n }\n });\n return state;\n}\n\nfunction buildDslFromNode(\n node: RuleNode | undefined,\n all: Record<string, RuleNode>,\n): string | null {\n if (!node) return null;\n // When the root is a validator node, try its linked condition\n if (\n node.type === 'visibleIf' ||\n node.type === 'requiredIf' ||\n node.type === 'disabledIf' ||\n node.type === 'readonlyIf'\n ) {\n const cfg: any = node.config || {};\n if (cfg.conditionNodeId) return buildDslFromNode(all[cfg.conditionNodeId], all);\n if (cfg.condition) return buildDslFromNode(cfg.condition as any, all);\n if (node.children?.length) return buildDslFromNode(all[node.children[0]], all);\n return null;\n }\n\n if (node.type === 'fieldCondition') {\n const cfg: any = node.config || {};\n const op: string = (cfg.operator || '').toString();\n const field: string = cfg.fieldName;\n\n // Helper to format values for DSL\n const fmt = (v: any) =>\n v === undefined\n ? 'null'\n : Array.isArray(v)\n ? `[${v.map((e) => JSON.stringify(e)).join(', ')}]`\n : typeof v === 'string'\n ? JSON.stringify(v)\n : String(v);\n\n // Support different value sources\n const valueText = (() => {\n switch (cfg.valueType) {\n case 'field':\n return cfg.compareToField || 'null';\n case 'context':\n return cfg.contextVariable ? `\\${cfg.contextVariable}`.replace(/^\\\\/, '$') : 'null';\n default:\n return fmt(cfg.value);\n }\n })();\n\n // Map visual-builder operators to DSL\n switch (op) {\n case 'equals':\n case 'eq':\n return `${field} == ${valueText}`;\n case 'notEquals':\n case 'neq':\n return `${field} != ${valueText}`;\n case 'greaterThan':\n case 'gt':\n return `${field} > ${valueText}`;\n case 'greaterThanOrEqual':\n case 'gte':\n return `${field} >= ${valueText}`;\n case 'lessThan':\n case 'lt':\n return `${field} < ${valueText}`;\n case 'lessThanOrEqual':\n case 'lte':\n return `${field} <= ${valueText}`;\n case 'contains':\n return `contains(${field}, ${valueText})`;\n case 'startsWith':\n return `startsWith(${field}, ${valueText})`;\n case 'endsWith':\n return `endsWith(${field}, ${valueText})`;\n case 'in':\n return `${field} in ${valueText}`;\n case 'notIn':\n return `not (${field} in ${valueText})`;\n case 'isTrue':\n return `${field} == true`;\n case 'isFalse':\n return `${field} == false`;\n case 'isNull':\n return `${field} == null`;\n case 'isNotNull':\n return `${field} != null`;\n case 'isEmpty':\n return `length(${field}) == 0`;\n case 'isNotEmpty':\n return `length(${field}) > 0`;\n default:\n // Fallback to string operator (best effort)\n return `${field} ${op} ${valueText}`;\n }\n }\n\n if (node.type === 'andGroup' || node.type === 'orGroup') {\n const op = node.type === 'andGroup' ? 'and' : 'or';\n const parts = (node.children || [])\n .map((id) => buildDslFromNode(all[id], all))\n .filter((p): p is string => !!p);\n if (!parts.length) return null;\n return parts.length > 1 ? `(${parts.join(` ${op} `)})` : parts[0];\n }\n\n return null;\n}\n\nfunction parseSimpleCondition(condition: string): RuleNode | undefined {\n const trimmed = (condition || '').trim();\n // Accept common comparison operators and basic forms used by the DSL\n const basicOp = trimmed.match(/^[\\w.]+\\s*(==|!=|<=|>=|<|>|in)\\s*.+$/i);\n const funcCall = trimmed.match(/^(contains|startsWith|endsWith)\\s*\\(/i);\n if (!basicOp && !funcCall) return undefined;\n\n const id = Math.random().toString(36).slice(2, 9);\n // Minimal round-trip: keep full condition as label; real editing via DSL panel\n return {\n id,\n type: 'fieldCondition',\n label: trimmed,\n config: {\n type: 'fieldCondition',\n fieldName: trimmed, // placeholder only\n operator: 'eq',\n value: true,\n },\n } as any;\n}\n","import { Component, EventEmitter, Input, Output, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { PraxisVisualBuilder, RuleBuilderConfig, RuleBuilderState, FieldSchema, FieldType } from '@praxisui/visual-builder';\nimport { ColumnDefinition, TableConfig, PraxisIconDirective } from '@praxisui/core';\nimport { ruleBuilderStateToConditionalStyles } from './table-rule-converters';\n\n@Component({\n selector: 'table-visual-rules-editor',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n FormsModule,\n MatFormFieldModule,\n MatSelectModule,\n MatInputModule,\n MatButtonModule,\n MatIconModule,\n PraxisIconDirective,\n MatCardModule,\n MatDividerModule,\n PraxisVisualBuilder,\n ],\n template: `\n <div class=\"rules-editor\">\n <div class=\"header\">\n <h3><mat-icon [praxisIcon]=\"'rule'\"></mat-icon> Regras Visuais</h3>\n <p class=\"subtitle\">Defina condições para aplicar classes/estilos em células.</p>\n </div>\n\n <div class=\"controls\">\n <mat-form-field appearance=\"outline\" class=\"scope-select\">\n <mat-label>Escopo</mat-label>\n <mat-select [(ngModel)]=\"scope\" (ngModelChange)=\"onScopeChange($event)\">\n <mat-option value=\"row\">Global (Linha)</mat-option>\n <mat-option value=\"column\">Por Coluna</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"scope==='column'\" appearance=\"outline\" class=\"column-select\">\n <mat-label>Coluna</mat-label>\n <mat-select [(ngModel)]=\"selectedField\" (ngModelChange)=\"onSelectColumn($event)\">\n <mat-option *ngFor=\"let c of columns\" [value]=\"c.field\">\n {{ c.header || c.field }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- Builder sem card wrapper para reduzir camadas e paddings -->\n <section class=\"builder-section\" *ngIf=\"scope==='row' || selectedColumn\">\n <praxis-visual-builder\n [config]=\"builderConfig\"\n [initialRules]=\"currentRulesState\"\n (rulesChanged)=\"onRulesChanged($event)\">\n </praxis-visual-builder>\n </section>\n\n <!-- Efeitos visuais, também sem card wrapper -->\n <section class=\"effects-section\" [class.hidden]=\"compiledRules.length === 0\">\n <h4 class=\"effects-title\"><mat-icon [praxisIcon]=\"'format_paint'\"></mat-icon> Efeitos Visuais</h4>\n <div class=\"effects-list\">\n <div class=\"effect-item\" *ngFor=\"let r of compiledRules; trackBy: trackRule; let i = index\" (mouseenter)=\"pauseEffects(true)\" (mouseleave)=\"pauseEffects(false)\">\n <div class=\"condition\">{{ r.display || r.condition }}</div>\n <div class=\"effect-fields\">\n <mat-form-field appearance=\"outline\" class=\"css-preset\">\n <mat-label>Preset</mat-label>\n <mat-select [value]=\"r.cssClass\" (openedChange)=\"pauseEffects($event)\" (selectionChange)=\"onPresetSelected(r, $event.value)\">\n <mat-option *ngFor=\"let p of classPresets\" [value]=\"p.value\">\n {{ p.label }} ({{ p.value }})\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"css-class\">\n <mat-label>Classe CSS</mat-label>\n <input matInput [(ngModel)]=\"r.cssClass\" (focusin)=\"pauseEffects(true)\" (focusout)=\"pauseEffects(false)\" (ngModelChange)=\"onEffectChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"inline-style\">\n <mat-label>Estilo Inline</mat-label>\n <input matInput [(ngModel)]=\"r._styleText\" (focusin)=\"pauseEffects(true)\" (focusout)=\"pauseEffects(false)\" (ngModelChange)=\"onStyleTextChanged(r)\" placeholder=\"ex: color: red; font-weight: 600\" />\n <mat-hint>Formato: key: value; key2: value2</mat-hint>\n </mat-form-field>\n </div>\n </div>\n </div>\n <div class=\"effects-actions\">\n <button mat-stroked-button color=\"primary\" (click)=\"applyEffects()\" [disabled]=\"!hasPending\">Aplicar Efeitos</button>\n <button mat-button color=\"warn\" (click)=\"discardEffects()\" [disabled]=\"!hasPending\">Descartar</button>\n </div>\n </section>\n\n <div class=\"help\">\n <mat-icon [praxisIcon]=\"'info'\"></mat-icon>\n <span>As regras são salvas conforme o escopo selecionado. Para coluna, ficam na própria coluna; para global, em rowConditionalStyles.</span>\n </div>\n </div>\n `,\n styles: [`\n .rules-editor{display:flex;flex-direction:column;gap:16px;min-width:0}\n .header{display:flex;align-items:center;gap:8px}\n .header h3{display:flex;align-items:center;gap:8px;margin:0}\n .subtitle{margin:0;color:var(--mat-sys-on-surface-variant)}\n .controls{display:flex;gap:12px;flex-wrap:wrap}\n .scope-select{min-width:220px;flex:1 1 220px}\n .column-select{min-width:280px;flex:2 1 280px}\n .help{display:flex;align-items:center;gap:8px;color:var(--mat-sys-on-surface-variant)}\n /* O builder deve ocupar apenas o necessário; sem rolagem interna para evitar scroll duplo */\n praxis-visual-builder{display:block;max-width:100%;height:auto;min-height:300px;overflow:visible}\n .builder-section{border:1px solid var(--mat-sys-outline-variant); border-radius:8px; padding:8px}\n .effects-section{border:1px solid var(--mat-sys-outline-variant); border-radius:8px; padding:8px; margin-top:12px; margin-bottom:96px}\n .effects-title{display:flex;align-items:center;gap:8px;margin:0 0 8px}\n .effects-list{display:flex;flex-direction:column;gap:12px}\n .effect-item{border:1px solid var(--mat-sys-outline-variant);border-radius:8px;padding:12px;overflow:visible}\n .condition{font-family:monospace;font-size:.9rem;color:var(--mat-sys-on-surface-variant);margin-bottom:8px;word-break:break-word}\n .effect-fields{display:flex;gap:12px;flex-wrap:wrap;align-items:flex-start}\n /* campos responsivos: quebram linha quando faltar espaço */\n .css-preset{min-width:220px;flex:1 1 240px}\n .css-class{min-width:200px;flex:1 1 220px}\n .inline-style{min-width:260px;flex:2 1 360px}\n .hidden{display:none}\n .effects-actions{display:flex;gap:12px;justify-content:flex-end;margin-top:12px;flex-wrap:wrap}\n @media (max-width: 1024px){\n praxis-visual-builder{min-height:260px}\n }\n\n /* Ajustes para o Visual Builder embutido: evitar FAB sobre o rodapé e duplo scroll */\n /* Forçar o modo embutido a não prender altura/scroll */\n :host ::ng-deep .praxis-visual-builder { height: auto !important; overflow: visible !important; }\n :host ::ng-deep .praxis-visual-builder .rule-editor-container { height: auto !important; overflow: visible !important; }\n :host ::ng-deep .praxis-visual-builder .rule-editor-content,\n :host ::ng-deep .praxis-visual-builder .editor-tabs,\n :host ::ng-deep .praxis-visual-builder .visual-builder,\n :host ::ng-deep .praxis-visual-builder .sidenav-container { height: auto !important; min-height: 0 !important; overflow: visible !important; }\n :host ::ng-deep .praxis-visual-builder .rule-editor-content { padding-bottom: 72px; }\n :host ::ng-deep .praxis-visual-builder .floating-add-menu { position: absolute !important; right: 16px; bottom: 16px; z-index: 2; }\n `]\n})\nexport class TableVisualRulesEditorComponent {\n @Input() config: TableConfig = { columns: [] } as any;\n @Output() configChange = new EventEmitter<TableConfig>();\n\n columns: ColumnDefinition[] = [];\n selectedField?: string;\n selectedColumn?: ColumnDefinition | null;\n scope: 'column' | 'row' = 'column';\n\n builderConfig: RuleBuilderConfig | null = null;\n currentRulesState?: RuleBuilderState;\n compiledRules: Array<{ condition: string; cssClass?: string; style?: Record<string,string>; _styleText?: string; display?: string }> = [];\n\n private rulesUpdateTimer: any = null;\n hasPending = false;\n private effectsPaused = 0;\n private destroyed = false;\n private suppressRulesUntil = 0;\n\n private lastCompiledJson = '';\n private lastStateJson = '';\n private lastColumnsSignature = '';\n\n classPresets = [\n { label: 'Sucesso', value: 'row--success' },\n { label: 'Aviso', value: 'row--warning' },\n { label: 'Erro', value: 'row--danger' },\n { label: 'Destaque', value: 'row--highlight' },\n { label: 'Suave', value: 'row--muted' },\n ];\n\n ngOnInit(): void {\n this.columns = (this.config.columns || []).map((c) => JSON.parse(JSON.stringify(c)));\n if (!this.selectedField && this.columns.length) {\n this.selectedField = this.columns[0].field;\n }\n this.maybeRebuildBuilderConfig();\n this.resolveSelectedTarget();\n }\n\n ngOnChanges(): void {\n this.columns = (this.config.columns || []).map((c) => JSON.parse(JSON.stringify(c)));\n this.maybeRebuildBuilderConfig();\n this.resolveSelectedTarget();\n }\n\n ngOnDestroy(): void {\n this.destroyed = true;\n if (this.rulesUpdateTimer) {\n clearTimeout(this.rulesUpdateTimer);\n this.rulesUpdateTimer = null;\n }\n }\n\n onScopeChange(scope: 'column' | 'row'): void {\n this.scope = scope;\n this.suppressRulesUntil = Date.now() + 500;\n this.resolveSelectedTarget();\n }\n\n onSelectColumn(field: string): void {\n this.selectedField = field;\n this.suppressRulesUntil = Date.now() + 500;\n this.resolveSelectedTarget();\n }\n\n private resolveSelectedTarget(): void {\n // Suppress initial burst of rulesChanged after rebinding target\n this.suppressRulesUntil = Date.now() + 500;\n const hadPending = this.hasPending;\n const previousCompiled = this.compiledRules?.length ? [...this.compiledRules] : [];\n if (this.scope === 'row') {\n const anyCfg: any = this.config as any;\n this.selectedColumn = null;\n this.currentRulesState = anyCfg._rowStyleRulesState || undefined;\n this.compiledRules = this.materializeCompiledRules(anyCfg.rowConditionalStyles || []);\n if (hadPending && previousCompiled.length) {\n this.mergePendingIntoCompiled(previousCompiled);\n }\n return;\n }\n this.selectedColumn = this.columns.find(c => c.field === this.selectedField) || null;\n const anyCol: any = this.selectedColumn as any;\n this.currentRulesState = anyCol?._styleRulesState || undefined;\n this.compiledRules = this.materializeCompiledRules(anyCol?.conditionalStyles || []);\n if (hadPending && previousCompiled.length) {\n this.mergePendingIntoCompiled(previousCompiled);\n }\n }\n\n onRulesChanged(state: RuleBuilderState): void {\n if (this.destroyed) return;\n if (Date.now() < this.suppressRulesUntil) return;\n const incomingStateJson = JSON.stringify(state);\n if (incomingStateJson === this.lastStateJson) {\n // Ignore redundant emissions (often caused by programmatic state rebind)\n return;\n }\n const schedule = () => {\n this.rulesUpdateTimer = null;\n this.applyRulesState(state);\n };\n if (this.rulesUpdateTimer) {\n clearTimeout(this.rulesUpdateTimer);\n }\n this.rulesUpdateTimer = setTimeout(schedule, 300);\n }\n\n private applyRulesState(state: RuleBuilderState): void {\n if (this.effectsPaused > 0) return;\n\n // Early dedup by state only (avoid loops due to effect merging)\n const stateJson = JSON.stringify(state);\n if (stateJson === this.lastStateJson) return;\n\n if (this.scope === 'row') {\n const compiled = ruleBuilderStateToConditionalStyles(state);\n this.mergeEffects(compiled, (this.config as any).rowConditionalStyles || []);\n const compiledJson = JSON.stringify(compiled);\n if (compiledJson === this.lastCompiledJson) {\n // No effective change; just remember we've seen this state to reduce noise\n this.lastStateJson = stateJson;\n return;\n }\n this.lastStateJson = stateJson;\n this.lastCompiledJson = compiledJson;\n const updated: TableConfig = { ...(this.config as any), rowConditionalStyles: compiled, _rowStyleRulesState: state };\n this.config = JSON.parse(JSON.stringify(updated));\n this.compiledRules = this.materializeCompiledRules(compiled);\n this.configChange.emit(updated);\n console.debug('[TableRulesEditor] row rules emitted configChange');\n return;\n }\n\n if (!this.selectedColumn) return;\n const colIdx = this.columns.findIndex(c => c.field === this.selectedColumn!.field);\n if (colIdx < 0) return;\n const col: any = { ...(this.columns[colIdx] as any) };\n col._styleRulesState = state;\n const compiled = ruleBuilderStateToConditionalStyles(state);\n this.mergeEffects(compiled, col.conditionalStyles || []);\n const compiledJson = JSON.stringify(compiled);\n if (compiledJson === this.lastCompiledJson) {\n this.lastStateJson = stateJson;\n return;\n }\n this.lastStateJson = stateJson;\n this.lastCompiledJson = compiledJson;\n col.conditionalStyles = compiled;\n\n const newColumns = [...this.columns];\n newColumns[colIdx] = col as ColumnDefinition;\n const updated: TableConfig = { ...(this.config as any), columns: newColumns };\n this.config = JSON.parse(JSON.stringify(updated));\n this.columns = newColumns;\n this.compiledRules = this.materializeCompiledRules(compiled);\n this.configChange.emit(updated);\n console.debug('[TableRulesEditor] column rules emitted configChange', { field: this.selectedColumn?.field });\n }\n\n onEffectChanged(): void {\n this.hasPending = true;\n }\n\n onStyleTextChanged(r: any): void {\n r.style = this.parseStyleText(r._styleText || '');\n this.onEffectChanged();\n }\n\n private mergeEffects(\n compiled: Array<{ condition: string; cssClass?: string; style?: Record<string,string> }>,\n previous: Array<{ condition: string; cssClass?: string; style?: Record<string,string> }> = [],\n ): void {\n // Pending (unsaved) takes precedence, then previously persisted\n const pending = new Map((this.compiledRules || []).map(p => [p.condition, p] as const));\n const persisted = new Map(previous.map(p => [p.condition, p] as const));\n compiled.forEach(c => {\n const fromPending = pending.get(c.condition);\n const fromPersisted = persisted.get(c.condition);\n if (fromPending) {\n c.cssClass = fromPending.cssClass ?? c.cssClass;\n c.style = fromPending.style ?? c.style;\n } else if (fromPersisted) {\n c.cssClass = fromPersisted.cssClass ?? c.cssClass;\n c.style = fromPersisted.style ?? c.style;\n }\n (c as any).display = this.prettifyCondition(c.condition);\n });\n }\n\n private materializeCompiledRules(input: Array<{ condition: string; cssClass?: string; style?: Record<string,string> }>): Array<any> {\n return input.map(r => ({ ...r, _styleText: this.stringifyStyle(r.style), display: this.prettifyCondition(r.condition) }));\n }\n\n private stringifyStyle(style?: Record<string,string>): string {\n if (!style) return '';\n return Object.entries(style).map(([k,v]) => `${k}: ${v}`).join('; ');\n }\n\n private parseStyleText(text: string): Record<string,string> | undefined {\n const obj: Record<string,string> = {};\n const parts = text.split(';').map(p => p.trim()).filter(Boolean);\n for (const part of parts) {\n const [k, ...rest] = part.split(':');\n if (!k || rest.length === 0) continue;\n obj[k.trim()] = rest.join(':').trim();\n }\n return Object.keys(obj).length ? obj : undefined;\n }\n\n onPresetSelected(r: any, value: string): void {\n console.debug('[TableRulesEditor] preset selected', { condition: r?.condition, value });\n r.cssClass = value;\n this.onEffectChanged();\n }\n\n private mergePendingIntoCompiled(previous: Array<{ condition: string; cssClass?: string; style?: Record<string,string>; _styleText?: string }>): void {\n const byCond = new Map(previous.map(p => [p.condition, p] as const));\n this.compiledRules = this.compiledRules.map(cr => {\n const prev = byCond.get(cr.condition);\n if (prev) {\n return { ...cr, cssClass: prev.cssClass ?? cr.cssClass, style: prev.style ?? cr.style, _styleText: prev._styleText ?? cr._styleText };\n }\n return cr;\n });\n }\n\n private prettifyCondition(cond: string): string {\n if (!cond) return '';\n let s = cond\n .replace(/\\bisTrue\\b/gi, 'is true')\n .replace(/\\bisFalse\\b/gi, 'is false')\n .replace(/==\\s*true/gi, 'is true')\n .replace(/==\\s*false/gi, 'is false')\n .replace(/equals\\s*true/gi, 'is true')\n .replace(/equals\\s*false/gi, 'is false')\n .replace(/\\s+null\\b/gi, '')\n .replace(/\\s+undefined\\b/gi, '');\n return s.trim();\n }\n\n private createBuilderConfig(columns: ColumnDefinition[]): RuleBuilderConfig {\n const schemas: Record<string, FieldSchema> = {};\n columns.forEach((c) => {\n schemas[c.field] = {\n name: c.field,\n label: c.header || c.field,\n type: this.mapType(c.type),\n } as FieldSchema;\n });\n return {\n fieldSchemas: schemas,\n ui: { showDSLPreview: true, showInlineErrors: true, enableDragDrop: true },\n } as any;\n }\n\n private mapType(t?: string): FieldType {\n switch (t) {\n case 'number': return FieldType.NUMBER;\n case 'date': return FieldType.DATE;\n case 'boolean': return FieldType.BOOLEAN;\n case 'currency':\n case 'percentage': return FieldType.NUMBER;\n default: return FieldType.STRING;\n }\n }\n\n private maybeRebuildBuilderConfig(): void {\n const signature = JSON.stringify((this.columns || []).map((c) => c.field));\n if (signature === this.lastColumnsSignature && this.builderConfig) {\n return;\n }\n this.lastColumnsSignature = signature;\n this.builderConfig = this.createBuilderConfig(this.columns);\n }\n\n applyEffects(): void {\n const toPersist = this.compiledRules.map(r => ({ condition: r.condition, cssClass: r.cssClass, style: r.style }));\n console.debug('[TableRulesEditor] applyEffects', { scope: this.scope, toPersist });\n if (this.scope === 'row') {\n const updated: TableConfig = { ...(this.config as any), rowConditionalStyles: toPersist };\n this.config = updated;\n this.configChange.emit(updated);\n console.debug('[TableRulesEditor] row effects persisted');\n this.hasPending = false;\n return;\n }\n if (!this.selectedColumn) return;\n const idx = this.columns.findIndex(c => c.field === this.selectedColumn!.field);\n if (idx < 0) return;\n const col = { ...(this.columns[idx] as any), conditionalStyles: toPersist } as any;\n const newColumns = [...this.columns];\n newColumns[idx] = col as ColumnDefinition;\n const updated: TableConfig = { ...(this.config as any), columns: newColumns };\n this.columns = newColumns;\n this.config = updated;\n this.configChange.emit(updated);\n console.debug('[TableRulesEditor] column effects persisted', { field: this.selectedColumn?.field });\n this.hasPending = false;\n }\n\n discardEffects(): void {\n if (this.scope === 'row') {\n const anyCfg: any = this.config as any;\n this.compiledRules = this.materializeCompiledRules(anyCfg.rowConditionalStyles || []);\n this.hasPending = false;\n return;\n }\n const anyCol: any = this.selectedColumn as any;\n this.compiledRules = this.materializeCompiledRules(anyCol?.conditionalStyles || []);\n this.hasPending = false;\n }\n\n pauseEffects(on: boolean): void {\n this.effectsPaused += on ? 1 : -1;\n if (this.effectsPaused < 0) this.effectsPaused = 0;\n }\n\n trackRule(index: number, r: any): any {\n return r?.condition ?? index;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } from '@praxisui/core';\n\ntype DialogConfigLike = any; // keep loose to avoid cross-lib coupling\n\n@Component({\n selector: 'confirm-dialog-appearance-editor',\n standalone: true,\n imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, MatSelectModule, MatSlideToggleModule, MatButtonModule, MatExpansionModule, MatIconModule, PraxisIconDirective],\n templateUrl: './confirm-dialog-appearance-editor.component.html',\n styleUrls: ['./confirm-dialog-appearance-editor.component.scss'],\n})\nexport class ConfirmDialogAppearanceEditorComponent {\n @Input() config!: DialogConfigLike; // TableConfig (V2) or partial structure\n @Output() configChange = new EventEmitter<DialogConfigLike>();\n\n // Safe getter/setter to editedConfig.dialogs.confirm.delete\n get deleteDialog(): any {\n const dialogs = (this.config as any).dialogs || {};\n const confirm = dialogs.confirm || {};\n const del = confirm.delete || {};\n return del;\n }\n\n // Size presets (defaults for quick selection)\n readonly sizePresets: Record<string, { width?: string; height?: string; maxWidth?: string; maxHeight?: string }> = {\n default: {},\n sm: { width: '360px', maxWidth: '360px', maxHeight: '80vh' },\n md: { width: '420px', maxWidth: '420px', maxHeight: '80vh' },\n lg: { width: '640px', maxWidth: '640px', maxHeight: '80vh' },\n xl: { width: '800px', maxWidth: '800px', maxHeight: '80vh' },\n tall: { width: '640px', maxWidth: '640px', height: '70vh', maxHeight: '70vh' },\n full: { width: '90vw', maxWidth: '90vw', height: '90vh', maxHeight: '90vh' },\n fluid: { width: '100%', maxWidth: '100%', maxHeight: '80vh' },\n };\n\n get selectedSizePreset(): string {\n const w = this.deleteDialog?.width as string | undefined;\n if (!w) return 'default';\n const match = Object.entries(this.sizePresets).find(([_, v]) => v.width === w);\n return match?.[0] || 'default';\n }\n\n setSizePreset(preset: string): void {\n const p = this.sizePresets[preset] || {};\n if (p.width !== undefined) this.update('width', p.width);\n if (p.maxWidth !== undefined) this.update('maxWidth', p.maxWidth);\n if (p.height !== undefined) this.update('height', p.height);\n if (p.maxHeight !== undefined) this.update('maxHeight', p.maxHeight);\n }\n\n getInheritedValue(field: 'width' | 'height' | 'maxHeight'): string | undefined {\n const preset = this.selectedSizePreset;\n if (!preset || preset === 'default') return undefined;\n const v = this.sizePresets[preset]?.[field];\n return v;\n }\n\n getPresetLabel(): string {\n const p = this.selectedSizePreset;\n switch (p) {\n case 'sm': return 'sm (360px)';\n case 'md': return 'md (420px)';\n case 'lg': return 'lg (640px)';\n case 'xl': return 'xl (800px)';\n case 'tall': return 'tall (640px × 70vh)';\n case 'full': return 'full (90vw × 90vh)';\n case 'fluid': return 'fluid (100% × 80vh)';\n default: return 'Herdar (preset global)';\n }\n }\n\n resetOverrides(): void {\n const next = { ...(this.config as any) };\n // Remove apenas a seção de delete confirm overrides\n if (next.dialogs?.confirm?.delete) {\n const dlg = { ...(next.dialogs) };\n const cnf = { ...(dlg.confirm) };\n delete (cnf as any).delete;\n dlg.confirm = cnf;\n next.dialogs = dlg;\n }\n this.configChange.emit(next);\n }\n\n update(path: string, value: any): void {\n const next = { ...(this.config as any) };\n next.dialogs = { ...(next.dialogs || {}) };\n next.dialogs.confirm = { ...(next.dialogs.confirm || {}) };\n const curr = { ...(next.dialogs.confirm.delete || {}) };\n // helper utils\n const isEmpty = (v: any) => v === '' || v === undefined || v === null;\n const ensureAnim = () => (curr.animation = { ...(curr.animation || {}) });\n const ensureStyles = () => (curr.styles = { ...(curr.styles || {}) });\n const ensurePos = () => (curr.position = { ...(curr.position || {}) });\n const cleanup = () => {\n if (curr.animation && Object.keys(curr.animation).length === 0) {\n delete (curr as any).animation;\n }\n if (curr.styles && Object.keys(curr.styles).length === 0) {\n delete (curr as any).styles;\n }\n if (curr.position && Object.keys(curr.position).length === 0) {\n delete (curr as any).position;\n }\n };\n // shallow set by path for known fields; delete key when value is empty to fallback to presets\n switch (path) {\n case 'themeColor':\n if (isEmpty(value)) delete (curr as any).themeColor; else curr.themeColor = value;\n break;\n case 'width':\n if (isEmpty(value)) delete (curr as any).width; else curr.width = value;\n break;\n case 'minWidth':\n if (isEmpty(value)) delete (curr as any).minWidth; else curr.minWidth = value;\n break;\n case 'maxWidth':\n if (isEmpty(value)) delete (curr as any).maxWidth; else curr.maxWidth = value;\n break;\n case 'height':\n if (isEmpty(value)) delete (curr as any).height; else curr.height = value;\n break;\n case 'minHeight':\n if (isEmpty(value)) delete (curr as any).minHeight; else curr.minHeight = value;\n break;\n case 'maxHeight':\n if (isEmpty(value)) delete (curr as any).maxHeight; else curr.maxHeight = value;\n break;\n case 'actionsLayout':\n if (isEmpty(value)) delete (curr as any).actionsLayout; else curr.actionsLayout = value;\n break;\n case 'animation.type':\n if (isEmpty(value)) { if (curr.animation) delete (curr.animation as any).type; } else { ensureAnim(); (curr.animation as any).type = value; }\n break;\n case 'animation.direction':\n if (isEmpty(value)) { if (curr.animation) delete (curr.animation as any).direction; } else { ensureAnim(); (curr.animation as any).direction = value; }\n break;\n case 'animation.duration': {\n const num = isEmpty(value) ? undefined : Number(value);\n if (num == null || Number.isNaN(num)) { if (curr.animation) delete (curr.animation as any).duration; }\n else { ensureAnim(); (curr.animation as any).duration = num; }\n break;\n }\n case 'animation.easing':\n if (isEmpty(value)) { if (curr.animation) delete (curr.animation as any).easing; } else { ensureAnim(); (curr.animation as any).easing = value; }\n break;\n case 'disableClose':\n if (isEmpty(value)) delete (curr as any).disableClose; else curr.disableClose = !!value;\n break;\n case 'hasBackdrop':\n if (isEmpty(value)) delete (curr as any).hasBackdrop; else curr.hasBackdrop = !!value;\n break;\n case 'panelClass':\n if (isEmpty(value)) delete (curr as any).panelClass; else curr.panelClass = value;\n break;\n case 'backdropClass':\n if (isEmpty(value)) delete (curr as any).backdropClass; else curr.backdropClass = value;\n break;\n case 'zIndex': {\n const num = isEmpty(value) ? undefined : Number(value);\n if (num == null || Number.isNaN(num)) {\n if ((curr as any).zIndex !== undefined) {\n delete (curr as any).zIndex;\n }\n } else {\n (curr as any).zIndex = num;\n }\n break;\n }\n case 'position.top':\n if (isEmpty(value)) { if (curr.position) delete (curr.position as any).top; } else { ensurePos(); (curr.position as any).top = value; }\n break;\n case 'position.right':\n if (isEmpty(value)) { if (curr.position) delete (curr.position as any).right; } else { ensurePos(); (curr.position as any).right = value; }\n break;\n case 'position.bottom':\n if (isEmpty(value)) { if (curr.position) delete (curr.position as any).bottom; } else { ensurePos(); (curr.position as any).bottom = value; }\n break;\n case 'position.left':\n if (isEmpty(value)) { if (curr.position) delete (curr.position as any).left; } else { ensurePos(); (curr.position as any).left = value; }\n break;\n case 'styles.containerShape':\n if (isEmpty(value)) { if (curr.styles) delete (curr.styles as any).containerShape; } else { ensureStyles(); (curr.styles as any).containerShape = value; }\n break;\n case 'styles.actionsPadding':\n if (isEmpty(value)) { if (curr.styles) delete (curr.styles as any).actionsPadding; } else { ensureStyles(); (curr.styles as any).actionsPadding = value; }\n break;\n case 'styles.contentPadding':\n if (isEmpty(value)) { if (curr.styles) delete (curr.styles as any).contentPadding; } else { ensureStyles(); (curr.styles as any).contentPadding = value; }\n break;\n case 'styles.headlinePadding':\n if (isEmpty(value)) { if (curr.styles) delete (curr.styles as any).headlinePadding; } else { ensureStyles(); (curr.styles as any).headlinePadding = value; }\n break;\n case 'styles.withActionsContentPadding':\n if (isEmpty(value)) { if (curr.styles) delete (curr.styles as any).withActionsContentPadding; } else { ensureStyles(); (curr.styles as any).withActionsContentPadding = value; }\n break;\n case 'styles.containerColor':\n if (isEmpty(value)) { if (curr.styles) delete (curr.styles as any).containerColor; } else { ensureStyles(); (curr.styles as any).containerColor = value; }\n break;\n case 'styles.subheadColor':\n if (isEmpty(value)) { if (curr.styles) delete (curr.styles as any).subheadColor; } else { ensureStyles(); (curr.styles as any).subheadColor = value; }\n break;\n case 'styles.supportingTextColor':\n if (isEmpty(value)) { if (curr.styles) delete (curr.styles as any).supportingTextColor; } else { ensureStyles(); (curr.styles as any).supportingTextColor = value; }\n break;\n default: break;\n }\n cleanup();\n next.dialogs.confirm.delete = curr;\n this.configChange.emit(next);\n }\n}\n","<mat-accordion multi>\n <mat-expansion-panel expanded>\n <mat-expansion-panel-header>\n <mat-panel-title><mat-icon [praxisIcon]=\"'tune'\"></mat-icon>&nbsp;Aparência & Comportamento</mat-panel-title>\n <mat-panel-description> Tema, alinhamento e herança de presets </mat-panel-description>\n </mat-expansion-panel-header>\n <div class=\"dialog-editor-grid\">\n <p style=\"grid-column:1 / -1; opacity:.8; margin: 0 0 8px;\">\n Precedência: <strong>preset global</strong> → <strong>variante (delete)</strong> → <strong>override local</strong> (esta aba). Campos em branco herdam o valor do preset selecionado.\n </p>\n <mat-form-field appearance=\"outline\">\n <mat-label>Tema</mat-label>\n <mat-select [ngModel]=\"deleteDialog.themeColor\" (ngModelChange)=\"update('themeColor', $event)\">\n <mat-option [value]=\"undefined\">Padrão</mat-option>\n <mat-option value=\"light\">Light</mat-option>\n <mat-option value=\"dark\">Dark</mat-option>\n <mat-option value=\"primary\">Primary</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Alinhamento das ações</mat-label>\n <mat-select [ngModel]=\"deleteDialog.actionsLayout\" (ngModelChange)=\"update('actionsLayout', $event)\">\n <mat-option value=\"start\">alinhado à esquerda</mat-option>\n <mat-option value=\"center\">centralizado</mat-option>\n <mat-option value=\"end\">alinhado à direita</mat-option>\n <mat-option value=\"stretched\">estendido (preencher)</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-slide-toggle [ngModel]=\"deleteDialog.hasBackdrop\" (ngModelChange)=\"update('hasBackdrop', $event)\">Mostrar backdrop</mat-slide-toggle>\n <mat-slide-toggle [ngModel]=\"deleteDialog.disableClose\" (ngModelChange)=\"update('disableClose', $event)\">Desabilitar fechar (ESC/clique)</mat-slide-toggle>\n </div>\n </mat-expansion-panel>\n\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title><mat-icon [praxisIcon]=\"'aspect_ratio'\"></mat-icon>&nbsp;Dimensões</mat-panel-title>\n <mat-panel-description> Largura/altura e limites </mat-panel-description>\n </mat-expansion-panel-header>\n <div class=\"dialog-editor-grid\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Tamanho (preset)</mat-label>\n <mat-select [ngModel]=\"selectedSizePreset\" (ngModelChange)=\"setSizePreset($event)\">\n <mat-option value=\"default\">Herdar (preset global)</mat-option>\n <mat-option value=\"sm\">sm (360px)</mat-option>\n <mat-option value=\"md\">md (420px)</mat-option>\n <mat-option value=\"lg\">lg (640px)</mat-option>\n <mat-option value=\"xl\">xl (800px)</mat-option>\n <mat-option value=\"tall\">tall (640px × 70vh)</mat-option>\n <mat-option value=\"full\">full (90vw × 90vh)</mat-option>\n <mat-option value=\"fluid\">fluid (100% × 80vh)</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Largura (width)</mat-label>\n <input matInput [placeholder]=\"getInheritedValue('width') || 'ex.: 420px'\" [ngModel]=\"deleteDialog.width\" (ngModelChange)=\"update('width', $event)\" />\n <mat-hint *ngIf=\"!deleteDialog.width && getInheritedValue('width')\">Herdado: {{ getInheritedValue('width') }}</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Altura (height)</mat-label>\n <input matInput [placeholder]=\"getInheritedValue('height') || 'ex.: auto'\" [ngModel]=\"deleteDialog.height\" (ngModelChange)=\"update('height', $event)\" />\n <mat-hint *ngIf=\"!deleteDialog.height && getInheritedValue('height')\">Herdado: {{ getInheritedValue('height') }}</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Largura mínima (minWidth)</mat-label><input matInput placeholder=\"ex.: 320px\" [ngModel]=\"deleteDialog.minWidth\" (ngModelChange)=\"update('minWidth', $event)\" /></mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Largura máxima (maxWidth)</mat-label><input matInput placeholder=\"ex.: 90vw\" [ngModel]=\"deleteDialog.maxWidth\" (ngModelChange)=\"update('maxWidth', $event)\" /></mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Altura mínima (minHeight)</mat-label><input matInput placeholder=\"ex.: 200px\" [ngModel]=\"deleteDialog.minHeight\" (ngModelChange)=\"update('minHeight', $event)\" /></mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Altura máxima (maxHeight)</mat-label><input matInput [placeholder]=\"getInheritedValue('maxHeight') || 'ex.: 80vh'\" [ngModel]=\"deleteDialog.maxHeight\" (ngModelChange)=\"update('maxHeight', $event)\" /></mat-form-field>\n </div>\n </mat-expansion-panel>\n\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title><mat-icon>animation</mat-icon>&nbsp;Animação</mat-panel-title>\n <mat-panel-description> Tipo, direção, duração </mat-panel-description>\n </mat-expansion-panel-header>\n <div class=\"dialog-editor-grid\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Tipo</mat-label>\n <mat-select [ngModel]=\"deleteDialog.animation?.type\" (ngModelChange)=\"update('animation.type', $event)\">\n <mat-option [value]=\"undefined\">Padrão (translate)</mat-option>\n <mat-option value=\"translate\">translate</mat-option>\n <mat-option value=\"slide\">slide</mat-option>\n <mat-option value=\"fade\">fade</mat-option>\n <mat-option value=\"expand\">expand</mat-option>\n <mat-option value=\"zoom\">zoom</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Direção</mat-label>\n <mat-select [ngModel]=\"deleteDialog.animation?.direction\" (ngModelChange)=\"update('animation.direction', $event)\">\n <mat-option [value]=\"undefined\">Padrão</mat-option>\n <mat-option value=\"up\">para cima</mat-option>\n <mat-option value=\"down\">para baixo</mat-option>\n <mat-option value=\"left\">para a esquerda</mat-option>\n <mat-option value=\"right\">para a direita</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Duração (ms)</mat-label>\n <input matInput type=\"number\" [ngModel]=\"deleteDialog.animation?.duration\" (ngModelChange)=\"update('animation.duration', $event)\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Easing</mat-label>\n <input matInput placeholder=\"cubic-bezier(...)\" [ngModel]=\"deleteDialog.animation?.easing\" (ngModelChange)=\"update('animation.easing', $event)\" />\n </mat-form-field>\n </div>\n </mat-expansion-panel>\n\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title><mat-icon>palette</mat-icon>&nbsp;Estilos (tokens)</mat-panel-title>\n <mat-panel-description> Aparência do contêiner e conteúdo </mat-panel-description>\n </mat-expansion-panel-header>\n <div class=\"dialog-editor-grid\">\n <mat-form-field appearance=\"outline\"><mat-label>Border radius (shape)</mat-label><input matInput placeholder=\"ex.: 12px\" [ngModel]=\"deleteDialog.styles?.containerShape\" (ngModelChange)=\"update('styles.containerShape', $event)\" /></mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Padding ações</mat-label><input matInput placeholder=\"12px 16px\" [ngModel]=\"deleteDialog.styles?.actionsPadding\" (ngModelChange)=\"update('styles.actionsPadding', $event)\" /></mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Padding conteúdo</mat-label><input matInput placeholder=\"16px\" [ngModel]=\"deleteDialog.styles?.contentPadding\" (ngModelChange)=\"update('styles.contentPadding', $event)\" /></mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Padding título</mat-label><input matInput placeholder=\"12px 16px\" [ngModel]=\"deleteDialog.styles?.headlinePadding\" (ngModelChange)=\"update('styles.headlinePadding', $event)\" /></mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Padding conteúdo (com ações)</mat-label><input matInput placeholder=\"16px\" [ngModel]=\"deleteDialog.styles?.withActionsContentPadding\" (ngModelChange)=\"update('styles.withActionsContentPadding', $event)\" /></mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Cor do contêiner</mat-label><input matInput placeholder=\"#262626\" [ngModel]=\"deleteDialog.styles?.containerColor\" (ngModelChange)=\"update('styles.containerColor', $event)\" /></mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Cor do título</mat-label><input matInput placeholder=\"#fff\" [ngModel]=\"deleteDialog.styles?.subheadColor\" (ngModelChange)=\"update('styles.subheadColor', $event)\" /></mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Cor do conteúdo</mat-label><input matInput placeholder=\"rgba(255,255,255,0.92)\" [ngModel]=\"deleteDialog.styles?.supportingTextColor\" (ngModelChange)=\"update('styles.supportingTextColor', $event)\" /></mat-form-field>\n </div>\n </mat-expansion-panel>\n\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title><mat-icon>open_with</mat-icon>&nbsp;Posição</mat-panel-title>\n <mat-panel-description> Offsets opcionais </mat-panel-description>\n </mat-expansion-panel-header>\n <div class=\"dialog-editor-grid\">\n <mat-form-field appearance=\"outline\"><mat-label>Top</mat-label><input matInput placeholder=\"ex.: 10vh\" [ngModel]=\"deleteDialog.position?.top\" (ngModelChange)=\"update('position.top', $event)\" /></mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Right</mat-label><input matInput placeholder=\"ex.: 24px\" [ngModel]=\"deleteDialog.position?.right\" (ngModelChange)=\"update('position.right', $event)\" /></mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Bottom</mat-label><input matInput placeholder=\"ex.: 10vh\" [ngModel]=\"deleteDialog.position?.bottom\" (ngModelChange)=\"update('position.bottom', $event)\" /></mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Left</mat-label><input matInput placeholder=\"ex.: 24px\" [ngModel]=\"deleteDialog.position?.left\" (ngModelChange)=\"update('position.left', $event)\" /></mat-form-field>\n </div>\n </mat-expansion-panel>\n\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title><mat-icon>code</mat-icon>&nbsp;Classes & Avançado</mat-panel-title>\n <mat-panel-description> CSS e z-index </mat-panel-description>\n </mat-expansion-panel-header>\n <div class=\"dialog-editor-grid\">\n <mat-form-field appearance=\"outline\"><mat-label>Classe do painel</mat-label><input matInput placeholder=\"ex.: my-panel\" [ngModel]=\"deleteDialog.panelClass\" (ngModelChange)=\"update('panelClass', $event)\" /></mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>Classe do backdrop</mat-label><input matInput placeholder=\"ex.: my-backdrop\" [ngModel]=\"deleteDialog.backdropClass\" (ngModelChange)=\"update('backdropClass', $event)\" /></mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>z-index</mat-label><input matInput type=\"number\" placeholder=\"ex.: 1200\" [ngModel]=\"deleteDialog.zIndex\" (ngModelChange)=\"update('zIndex', $event)\" /></mat-form-field>\n <div style=\"grid-column:1 / -1; display:flex; gap:8px; align-items:center; margin-top:8px;\">\n <button mat-stroked-button color=\"primary\" (click)=\"resetOverrides()\">Resetar overrides</button>\n <span style=\"opacity:.7\">Remove os valores locais para herdar do preset selecionado ou do preset global.</span>\n </div>\n </div>\n </mat-expansion-panel>\n</mat-accordion>\n","import {\n Component,\n Inject,\n OnInit,\n OnDestroy,\n ChangeDetectorRef,\n Optional,\n ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { TableConfig, isTableConfigV2, TableConfigService } from '@praxisui/core';\nimport {\n SETTINGS_PANEL_DATA,\n SETTINGS_PANEL_REF,\n SettingsPanelRef,\n SettingsValueProvider,\n} from '@praxisui/settings-panel';\nimport {\n JsonConfigEditorComponent,\n JsonValidationResult,\n JsonEditorEvent,\n} from './json-config-editor/json-config-editor.component';\nimport {\n ColumnsConfigEditorComponent,\n ColumnChange,\n} from './columns-config-editor/columns-config-editor.component';\nimport {\n BehaviorConfigEditorComponent,\n BehaviorConfigChange,\n} from './behavior-config-editor/behavior-config-editor.component';\nimport {\n ToolbarActionsEditorComponent,\n ToolbarActionsChange,\n} from './toolbar-actions-editor/toolbar-actions-editor.component';\nimport {\n MessagesLocalizationEditorComponent,\n MessagesLocalizationChange,\n} from './messages-localization-editor/messages-localization-editor.component';\nimport { FilterSettingsComponent } from './filter-settings/filter-settings.component';\nimport { HeaderAppearanceEditorComponent } from './header-appearance-editor/header-appearance-editor.component';\nimport { FilterConfig } from './services/filter-config.service';\nimport { FieldMetadata, FieldControlType } from '@praxisui/core';\nimport { CrudIntegrationEditorComponent } from './crud-integration-editor/crud-integration-editor.component';\nimport { TableVisualRulesEditorComponent } from './visual-rules-editor/table-visual-rules-editor.component';\nimport { ConfirmDialogAppearanceEditorComponent } from './dialogs/confirm-dialog-appearance-editor.component';\n\n@Component({\n selector: 'praxis-table-config-editor',\n standalone: true,\n imports: [\n CommonModule,\n MatIconModule,\n MatTabsModule,\n FormsModule,\n MatFormFieldModule,\n MatInputModule,\n PraxisIconDirective,\n JsonConfigEditorComponent,\n ColumnsConfigEditorComponent,\n BehaviorConfigEditorComponent,\n HeaderAppearanceEditorComponent,\n ToolbarActionsEditorComponent,\n MessagesLocalizationEditorComponent,\n FilterSettingsComponent,\n CrudIntegrationEditorComponent,\n TableVisualRulesEditorComponent,\n ConfirmDialogAppearanceEditorComponent,\n ],\n templateUrl: './praxis-table-config-editor.html',\n styleUrls: ['./praxis-table-config-editor.scss'],\n providers: [TableConfigService],\n})\nexport class PraxisTableConfigEditor\n implements OnInit, OnDestroy, SettingsValueProvider\n{\n @ViewChild(BehaviorConfigEditorComponent)\n behaviorEditor?: BehaviorConfigEditorComponent;\n // Disponível somente quando a tabela estiver em um contexto CRUD\n @ViewChild('crudEditorRef') crudEditor?: any;\n sections = [\n { id: 'connect', label: 'Conexão', icon: 'link' },\n {\n id: 'overview',\n label: 'Visão Geral & Comportamento',\n icon: 'tune',\n },\n { id: 'header', label: 'Cabeçalho', icon: 'view_headline' },\n { id: 'columns', label: 'Colunas', icon: 'view_column' },\n { id: 'toolbar', label: 'Barra de Ferramentas & Ações', icon: 'build' },\n { id: 'filters', label: 'Filtros', icon: 'filter_alt' },\n { id: 'messages', label: 'Mensagens & Localização', icon: 'chat' },\n { id: 'dialogs', label: 'Diálogos', icon: 'dynamic_form' },\n { id: 'visualRules', label: 'Regras Visuais', icon: 'rule' },\n { id: 'json', label: 'JSON', icon: 'code' },\n ];\n activeSectionIndex = 0;\n // Configurações\n private originalConfig!: TableConfig;\n editedConfig!: TableConfig;\n // resourcePath para conexão rápida (fora do TableConfig)\n resourcePath: string = '';\n private initialResourcePath: string = '';\n // idField (fora do TableConfig) – usado para resolver a chave primária no componente de Tabela standalone\n idField: string = 'id';\n private initialIdField: string = 'id';\n // Contexto CRUD (quando fornecido pelo painel)\n crudContext?: {\n tableId: string;\n resourcePath?: string;\n /** Nome do campo identificador do recurso (ex.: 'id', 'codigo'). */\n idField?: string;\n defaults?: {\n openMode?: 'modal' | 'route';\n modal?: Record<string, any>;\n back?: Record<string, any>;\n };\n actions?: Array<{\n action: string;\n label?: string;\n formId?: string;\n route?: string;\n openMode?: 'modal' | 'route';\n }>;\n };\n\n // Informações do servidor recebidas do host (opcionais)\n serverIdField?: string;\n private serverSchemaHash?: string;\n idFieldDiverges = false;\n schemaHashDiverges = false;\n\n // V2 specific configs for advanced editing\n isV2Config = false;\n\n // Estado do componente\n canSave = false;\n hasErrors = false;\n hasSuccess = false;\n statusMessage = '';\n private isValidJson = true;\n\n // Observables obrigatórios da interface SettingsValueProvider\n isDirty$ = new BehaviorSubject<boolean>(false);\n isValid$ = new BehaviorSubject<boolean>(true);\n isBusy$ = new BehaviorSubject<boolean>(false);\n columnMetas: FieldMetadata[] = [];\n\n constructor(\n private cdr: ChangeDetectorRef,\n private configService: TableConfigService,\n @Inject(SETTINGS_PANEL_DATA) private panelData: any,\n @Optional() @Inject(SETTINGS_PANEL_REF) private panelRef?: SettingsPanelRef,\n ) {}\n\n ngOnInit(): void {\n try {\n // Inicializar configurações (aceitar formatos: somente TableConfig OU { tableConfig, crudContext })\n let config: TableConfig;\n if (this.panelData && this.panelData.tableConfig) {\n config = this.panelData.tableConfig as TableConfig;\n this.crudContext = this.panelData.crudContext;\n } else {\n config = (this.panelData as TableConfig) || { columns: [] };\n this.crudContext = undefined;\n }\n // Dados do servidor para divergência\n this.serverIdField = (this.panelData?.serverIdField as string) || undefined;\n this.serverSchemaHash = (this.panelData?.serverSchemaInfo?.schemaHash as string) || (this.panelData?.serverHash as string) || undefined;\n\n // Inicializar resourcePath/idField (prioriza valor direto; fallback para crudContext/config.meta)\n this.resourcePath = (this.panelData?.resourcePath as string) || this.crudContext?.resourcePath || '';\n this.initialResourcePath = this.resourcePath;\n this.idField = (this.panelData?.idField as string) || this.crudContext?.idField || (config?.meta as any)?.idField || 'id';\n this.initialIdField = this.idField;\n\n // Divergência: idField e serverHash\n const cfgHash = (config?.meta as any)?.serverHash as string | undefined;\n this.idFieldDiverges = !!(this.serverIdField && this.idField && this.serverIdField !== this.idField);\n this.schemaHashDiverges = !!(this.serverSchemaHash && cfgHash && this.serverSchemaHash !== cfgHash);\n\n // Validar configuração recebida\n if (!config || typeof config !== 'object') {\n console.error('PTABLE:config:invalid', config);\n this.showError('Erro ao carregar configuração');\n return;\n }\n\n console.debug(\n '[PraxisTableConfigEditor] ngOnInit received config',\n config,\n );\n\n // Normalizar ambas as configurações antes de armazenar para garantir comparação consistente\n this.originalConfig = this.normalizeTableConfig(config);\n this.editedConfig = this.normalizeTableConfig(config);\n\n console.debug('[PraxisTableConfigEditor] ngOnInit normalized configs', {\n original: this.originalConfig,\n edited: this.editedConfig,\n });\n\n // Sempre usar V2 (arquitetura unificada)\n this.isV2Config = true;\n\n this.statusMessage = 'Pronto para configurar';\n\n // Se houver contexto CRUD, inserir aba extra\n if (this.crudContext) {\n const exists = this.sections.some((s) => s.id === 'crud');\n if (!exists) {\n this.sections.splice(2, 0, {\n id: 'crud',\n label: 'Integração CRUD',\n icon: 'open_in_new',\n });\n }\n }\n\n // Configurar estado inicial - detectar versão sem modificar editedConfig\n this.updateConfigurationVersionInfo();\n this.updateColumnMetas();\n\n // updateCanSaveState deve mostrar que não há mudanças após a normalização inicial\n this.updateCanSaveState();\n } catch (error) {\n console.error('PTABLE:config:init:error', error);\n this.showError('Erro ao inicializar editor');\n }\n }\n\n // Event handlers para o JsonConfigEditorComponent\n onJsonConfigChange(newConfig: TableConfig): void {\n console.debug(\n '[PraxisTableConfigEditor] onJsonConfigChange received',\n newConfig,\n );\n this.editedConfig = newConfig;\n\n // Update state directly\n this.updateConfigurationVersion();\n this.updateCanSaveState();\n }\n\n onJsonValidationChange(result: JsonValidationResult): void {\n this.isValidJson = result.isValid;\n // Atualizar diretamente o observable de validação\n this.isValid$.next(result.isValid);\n this.updateCanSaveState();\n }\n\n onJsonEditorEvent(event: JsonEditorEvent): void {\n switch (event.type) {\n case 'apply':\n if (event.payload.isValid && event.payload.config) {\n this.showSuccess('Configuração JSON aplicada com sucesso!');\n } else {\n this.showError(\n event.payload.error || 'Erro ao aplicar configuração JSON',\n );\n }\n break;\n case 'format':\n if (event.payload.isValid) {\n this.showSuccess('JSON formatado!');\n } else {\n this.showError(event.payload.error || 'Erro ao formatar JSON');\n }\n break;\n }\n }\n\n // Event handlers para o ColumnsConfigEditorComponent\n onColumnsConfigChange(newConfig: TableConfig): void {\n // Normalize and short-circuit when nothing effectively changed to avoid loops\n const normalizedNew = this.normalizeTableConfig(newConfig);\n const normalizedCurrent = this.normalizeTableConfig(this.editedConfig);\n if (this.deepEqual(normalizedCurrent, normalizedNew)) {\n return;\n }\n console.debug('[PraxisTableConfigEditor] onColumnsConfigChange received', normalizedNew);\n this.editedConfig = normalizedNew;\n this.updateConfigurationVersion();\n this.updateColumnMetas();\n this.updateCanSaveState();\n }\n\n onColumnChange(change: ColumnChange): void {\n // Update can save state when columns change\n this.updateCanSaveState();\n\n // Show feedback based on column change type\n switch (change.type) {\n case 'add':\n this.showSuccess('Nova coluna adicionada');\n break;\n case 'remove':\n this.showSuccess('Coluna removida');\n break;\n case 'reorder':\n this.showSuccess('Colunas reordenadas');\n break;\n case 'global':\n this.showSuccess('Configurações globais aplicadas');\n break;\n case 'update':\n // Don't show message for every property update to avoid spam\n break;\n }\n }\n\n onFilterSettingsChange(cfg: FilterConfig): void {\n // Prevent loops: only update when settings actually changed\n const prevSettings =\n this.editedConfig.behavior?.filtering?.advancedFilters?.settings || ({} as FilterConfig);\n\n const equal = this.deepEqual(prevSettings, cfg);\n if (equal) {\n return;\n }\n\n // Create a new config object to ensure change detection\n const newConfig: TableConfig = {\n ...this.editedConfig,\n behavior: {\n ...this.editedConfig.behavior,\n filtering: {\n ...(this.editedConfig.behavior?.filtering || {\n enabled: true,\n strategy: 'client' as const,\n debounceTime: 300,\n }),\n advancedFilters: {\n ...(this.editedConfig.behavior?.filtering?.advancedFilters || {\n enabled: false,\n }),\n settings: cfg,\n },\n },\n },\n } as TableConfig;\n\n this.editedConfig = newConfig;\n this.updateCanSaveState();\n }\n\n private updateColumnMetas(): void {\n this.columnMetas = (this.editedConfig.columns || []).map((c) => ({\n name: c.field,\n label: c.header,\n controlType: FieldControlType.INPUT,\n }));\n }\n\n private updateCanSaveState(): void {\n // Normalizar configurações antes da comparação para evitar falsos positivos\n const normalizedOriginal = this.normalizeTableConfig(this.originalConfig);\n const normalizedEdited = this.normalizeTableConfig(this.editedConfig);\n\n // Verificar se há alterações válidas usando comparação robusta\n const resourceDirty = (this.resourcePath || '').trim() !== (this.initialResourcePath || '').trim();\n const hasChanges = resourceDirty || !this.deepEqual(normalizedOriginal, normalizedEdited);\n const isValid = this.isValidJson;\n const canSave = hasChanges && isValid;\n\n const debug = (typeof window !== 'undefined' && (window as any).DEBUG_PTABLE) === true;\n if (debug) {\n console.debug('[PraxisTableConfigEditor] updateCanSaveState', {\n hasChanges,\n isValid,\n canSave,\n originalConfigKeys: Object.keys(normalizedOriginal),\n editedConfigKeys: Object.keys(normalizedEdited),\n });\n }\n\n this.canSave = canSave;\n // Emitir estados para o painel (habilitar/desabilitar botões)\n try { this.isDirty$.next(hasChanges); } catch {}\n try { this.isValid$.next(isValid); } catch {}\n\n // Atualizar observables da interface SettingsValueProvider\n this.isDirty$.next(hasChanges);\n this.isValid$.next(isValid);\n // isBusy$ será atualizado em operações específicas\n\n this.cdr.markForCheck();\n }\n\n private showSuccess(message: string): void {\n this.statusMessage = message;\n this.hasSuccess = true;\n this.hasErrors = false;\n this.cdr.markForCheck();\n\n setTimeout(() => {\n this.clearMessages();\n }, 3000);\n }\n\n private showError(message: string): void {\n this.statusMessage = message;\n this.hasErrors = true;\n this.hasSuccess = false;\n this.cdr.markForCheck();\n\n setTimeout(() => {\n this.clearMessages();\n }, 5000);\n }\n\n private clearMessages(): void {\n this.statusMessage = '';\n this.hasSuccess = false;\n this.hasErrors = false;\n this.cdr.markForCheck();\n }\n\n /**\n * Normaliza uma configuração de tabela para comparação consistente\n * Remove propriedades undefined, ordena arrays e objetos de forma consistente\n */\n private normalizeTableConfig(config: TableConfig): TableConfig {\n if (!config) {\n return { columns: [] };\n }\n\n // Deep clone and normalize\n const normalized = JSON.parse(\n JSON.stringify(config, (key, value) => {\n // Convert undefined to null for consistent comparison\n if (value === undefined) {\n return null;\n }\n return value;\n }),\n );\n\n // Ensure required properties exist\n if (!normalized.columns) {\n normalized.columns = [];\n }\n\n // Sort columns by field name for consistent comparison\n if (Array.isArray(normalized.columns)) {\n normalized.columns.sort((a: any, b: any) =>\n (a.field || '').localeCompare(b.field || ''),\n );\n }\n\n // Normalize behavior section\n if (normalized.behavior) {\n // Remove empty nested objects\n Object.keys(normalized.behavior).forEach((key) => {\n if (\n normalized.behavior[key] &&\n typeof normalized.behavior[key] === 'object' &&\n Object.keys(normalized.behavior[key]).length === 0\n ) {\n delete normalized.behavior[key];\n }\n });\n\n // If behavior is empty, remove it\n if (Object.keys(normalized.behavior).length === 0) {\n delete normalized.behavior;\n }\n }\n\n // Normalize filtering advanced settings\n if (normalized.behavior?.filtering?.advancedFilters?.settings) {\n const settings = normalized.behavior.filtering.advancedFilters.settings;\n\n // Remove undefined/null values from settings\n Object.keys(settings).forEach((key) => {\n if (\n settings[key] === undefined ||\n settings[key] === null ||\n settings[key] === ''\n ) {\n delete settings[key];\n }\n });\n\n // Sort arrays consistently\n if (Array.isArray(settings.alwaysVisibleFields)) {\n settings.alwaysVisibleFields.sort();\n }\n }\n\n return normalized;\n }\n\n /**\n * Realiza comparação profunda de objetos, ignorando ordem de propriedades\n */\n private deepEqual(obj1: any, obj2: any): boolean {\n if (obj1 === obj2) {\n return true;\n }\n\n if (obj1 == null || obj2 == null) {\n return obj1 === obj2;\n }\n\n if (typeof obj1 !== typeof obj2) {\n return false;\n }\n\n if (typeof obj1 !== 'object') {\n return obj1 === obj2;\n }\n\n if (Array.isArray(obj1) !== Array.isArray(obj2)) {\n return false;\n }\n\n if (Array.isArray(obj1)) {\n if (obj1.length !== obj2.length) {\n return false;\n }\n for (let i = 0; i < obj1.length; i++) {\n if (!this.deepEqual(obj1[i], obj2[i])) {\n return false;\n }\n }\n return true;\n }\n\n const keys1 = Object.keys(obj1);\n const keys2 = Object.keys(obj2);\n\n if (keys1.length !== keys2.length) {\n return false;\n }\n\n for (const key of keys1) {\n if (!keys2.includes(key)) {\n return false;\n }\n if (!this.deepEqual(obj1[key], obj2[key])) {\n return false;\n }\n }\n\n return true;\n }\n\n getSettingsValue(): TableConfig {\n console.debug('[PraxisTableConfigEditor] getSettingsValue', this.editedConfig);\n // Retorna objeto estendido quando resourcePath foi definido\n const trimmed = (this.resourcePath || '').trim();\n const idKey = (this.idField || '').trim();\n if (trimmed || idKey) {\n const out: any = { ...(this.editedConfig as any) };\n if (trimmed) out.__resourcePath__ = trimmed;\n if (idKey) out.__idField__ = idKey;\n return out as any;\n }\n return this.editedConfig;\n }\n\n onResourcePathChange(val: string): void {\n this.resourcePath = val ?? '';\n // Mark dirty when resourcePath differs from initial\n const resourceDirty = (this.resourcePath || '').trim() !== (this.initialResourcePath || '').trim();\n // Update state without waiting for other changes\n const normalizedOriginal = this.normalizeTableConfig(this.originalConfig);\n const normalizedEdited = this.normalizeTableConfig(this.editedConfig);\n const cfgDirty = !this.deepEqual(normalizedOriginal, normalizedEdited);\n const hasChanges = resourceDirty || cfgDirty;\n this.isDirty$.next(hasChanges);\n // keep validity as JSON validity for now\n this.isValid$.next(this.isValidJson);\n this.updateCanSaveState();\n }\n\n onIdFieldChange(val: string): void {\n this.idField = (val || '').trim();\n const idDirty = (this.idField || 'id').trim() !== (this.initialIdField || 'id').trim();\n this.idFieldDiverges = !!(this.serverIdField && this.idField && this.serverIdField !== this.idField);\n const normalizedOriginal = this.normalizeTableConfig(this.originalConfig);\n const normalizedEdited = this.normalizeTableConfig(this.editedConfig);\n const cfgDirty = !this.deepEqual(normalizedOriginal, normalizedEdited);\n this.isDirty$.next(idDirty || cfgDirty);\n this.isValid$.next(this.isValidJson);\n this.updateCanSaveState();\n }\n\n // Ação: reconciliar chave primária com o servidor\n onReconcileIdField(): void {\n if (!this.serverIdField) return;\n this.idField = this.serverIdField;\n const meta: any = { ...(this.editedConfig.meta || {}) };\n meta.idField = this.serverIdField;\n meta.version = meta.version || '2.0.0';\n const now = new Date().toISOString();\n meta.updatedAt = now;\n if (!meta.createdAt) meta.createdAt = now;\n this.editedConfig = { ...(this.editedConfig as any), meta } as any;\n this.idFieldDiverges = false;\n this.updateCanSaveState();\n this.showSuccess('Chave primária reconciliada com o servidor');\n }\n\n // Ação: aceitar hash de schema do servidor (somente metadado)\n onAcceptServerHash(): void {\n if (!this.serverSchemaHash) return;\n const meta: any = { ...(this.editedConfig.meta || {}) };\n meta.serverHash = this.serverSchemaHash;\n meta.version = meta.version || '2.0.0';\n const now = new Date().toISOString();\n meta.updatedAt = now;\n if (!meta.createdAt) meta.createdAt = now;\n this.editedConfig = { ...(this.editedConfig as any), meta } as any;\n this.schemaHashDiverges = false;\n this.updateCanSaveState();\n this.showSuccess('Metadados de schema atualizados');\n }\n\n onVisualRulesConfigChange(newConfig: TableConfig): void {\n this.editedConfig = newConfig;\n this.updateConfigurationVersion();\n this.updateCanSaveState();\n }\n\n reset(): void {\n this.onResetToDefaults();\n }\n\n onResetToDefaults(): void {\n // Indicar que está processando\n this.isBusy$.next(true);\n\n try {\n // Reset para configuração padrão unificada\n const defaultConfig: TableConfig = {\n columns: [],\n behavior: {\n sorting: {\n enabled: true,\n multiSort: false,\n strategy: 'client',\n showSortIndicators: true,\n indicatorPosition: 'end',\n allowClearSort: true,\n },\n filtering: {\n enabled: false,\n strategy: 'client',\n debounceTime: 300,\n },\n pagination: {\n enabled: true,\n pageSize: 10,\n pageSizeOptions: [5, 10, 25, 50],\n showFirstLastButtons: true,\n showPageNumbers: true,\n showPageInfo: true,\n position: 'bottom',\n style: 'default',\n strategy: 'client',\n },\n },\n toolbar: {\n visible: false,\n position: 'top',\n },\n };\n\n this.editedConfig = defaultConfig;\n this.updateConfigurationVersion();\n this.updateCanSaveState();\n this.showSuccess('Configurações resetadas para padrão');\n } finally {\n this.isBusy$.next(false);\n }\n }\n\n /**\n * Called by the settings panel when the user chooses to persist changes.\n *\n * The returned configuration is sent back to the panel via\n * `panelRef.save(returnedConfig)` and subsequently emitted on `saved$`.\n * Returning the current `TableConfig` is therefore required for the table to\n * apply the new settings.\n */\n onSave(): TableConfig | undefined {\n this.behaviorEditor?.applyFormChanges();\n // Persistir overrides do CRUD (se disponível)\n if (this.crudEditor && typeof this.crudEditor.saveOverrides === 'function') {\n try {\n this.crudEditor.saveOverrides();\n } catch (e) {\n console.warn('[PraxisTableConfigEditor] CRUD overrides save failed', e);\n }\n }\n if (!this.canSave) {\n this.showError('Não há alterações válidas para salvar');\n console.debug(\n '[PraxisTableConfigEditor] onSave blocked - cannot save',\n this.editedConfig,\n );\n return;\n }\n\n try {\n // Indicar que está ocupado durante salvamento\n this.isBusy$.next(true);\n\n if (!this.editedConfig || !Array.isArray(this.editedConfig.columns)) {\n throw new Error('Configuração inválida');\n }\n\n this.showSuccess('Configurações salvas com sucesso!');\n const value = this.getSettingsValue();\n console.debug(\n '[PraxisTableConfigEditor] onSave returning value',\n value,\n );\n\n // Importante: retornar o mesmo valor de getSettingsValue()\n // para garantir que __resourcePath__ seja propagado pelo painel\n return value as TableConfig;\n } catch (error) {\n this.showError('Configuração inválida. Verifique os campos.');\n console.error('[PraxisTableConfigEditor] onSave error', error);\n return;\n } finally {\n // Sempre restaurar estado não-ocupado\n this.isBusy$.next(false);\n }\n }\n\n /**\n * Atualiza as flags de versão baseado na configuração atual\n * Esta versão pode modificar a configuração, deve ser usada após mudanças\n */\n private updateConfigurationVersion(): void {\n this.isV2Config = isTableConfigV2(this.editedConfig);\n\n // Atualizar mensagem de status baseado na versão\n if (this.isV2Config) {\n this.statusMessage = 'Configuração V2 - Recursos avançados disponíveis';\n }\n }\n\n /**\n * Apenas detecta a versão da configuração sem modificá-la\n * Usado durante inicialização para evitar marcar como dirty\n */\n private updateConfigurationVersionInfo(): void {\n this.isV2Config = isTableConfigV2(this.editedConfig);\n\n // Atualizar mensagem de status baseado na versão sem modificar a configuração\n if (this.isV2Config) {\n this.statusMessage = 'Configuração V2 - Recursos avançados disponíveis';\n }\n }\n\n /**\n * Retorna a configuração atual (unified architecture)\n */\n getV1Config(): TableConfig {\n return this.editedConfig as TableConfig;\n }\n\n /**\n * Legacy migration handler. In the unified architecture this is a no-op\n * and simply refreshes the configuration version information.\n */\n onMigrateToV2(): void {\n this.updateConfigurationVersion();\n }\n\n /**\n * Verifica se um recurso está disponível na versão atual\n */\n isFeatureAvailable(feature: string): boolean {\n // Direct feature check - no adapter needed in unified architecture\n switch (feature) {\n case 'multiSort':\n return this.editedConfig.behavior?.sorting?.multiSort ?? false;\n case 'bulkActions':\n return this.editedConfig.actions?.bulk?.enabled ?? false;\n case 'export':\n return this.editedConfig.export?.enabled ?? false;\n default:\n return false;\n }\n }\n\n // Event handlers para o BehaviorConfigEditorComponent\n onBehaviorConfigChange(newConfig: TableConfig): void {\n this.editedConfig = newConfig;\n // Ensure toolbar is visible when advanced filters are enabled\n const advancedEnabled =\n this.editedConfig.behavior?.filtering?.advancedFilters?.enabled;\n if (advancedEnabled) {\n this.editedConfig.toolbar = {\n ...this.editedConfig.toolbar,\n position: this.editedConfig.toolbar?.position ?? 'top',\n visible: true,\n };\n }\n this.updateConfigurationVersion();\n this.updateCanSaveState();\n }\n\n onBehaviorChange(change: BehaviorConfigChange): void {\n // Show feedback based on behavior change type\n switch (change.type) {\n case 'pagination':\n this.showSuccess('Configurações de paginação atualizadas');\n break;\n case 'sorting':\n this.showSuccess('Configurações de ordenação atualizadas');\n break;\n case 'filtering':\n this.showSuccess('Configurações de filtragem atualizadas');\n break;\n case 'selection':\n this.showSuccess('Configurações de seleção atualizadas');\n break;\n case 'interaction':\n this.showSuccess('Configurações de interação atualizadas');\n break;\n }\n }\n\n // Event handlers para o ToolbarActionsEditorComponent\n onToolbarActionsConfigChange(newConfig: TableConfig): void {\n this.editedConfig = newConfig;\n\n // Update state directly\n this.updateConfigurationVersion();\n this.updateCanSaveState();\n }\n\n onToolbarActionsChange(change: ToolbarActionsChange): void {\n // Show feedback based on toolbar action change type\n switch (change.type) {\n case 'toolbar':\n this.showSuccess('Configurações de toolbar atualizadas');\n break;\n case 'rowActions':\n this.showSuccess('Ações por linha atualizadas');\n break;\n case 'bulkActions':\n this.showSuccess('Ações em lote atualizadas');\n break;\n case 'export':\n this.showSuccess('Configurações de exportação atualizadas');\n break;\n }\n }\n\n // Event handlers para o MessagesLocalizationEditorComponent\n onMessagesLocalizationConfigChange(newConfig: TableConfig): void {\n this.editedConfig = newConfig;\n\n // Update state directly\n this.updateConfigurationVersion();\n this.updateCanSaveState();\n }\n\n onMessagesLocalizationChange(change: MessagesLocalizationChange): void {\n // Show feedback based on messages/localization change type\n switch (change.type) {\n case 'messages':\n this.showSuccess('Mensagens atualizadas');\n break;\n case 'localization':\n this.showSuccess('Configurações de localização atualizadas');\n break;\n case 'formatting':\n this.showSuccess('Configurações de formatação atualizadas');\n break;\n }\n }\n\n ngOnDestroy(): void {\n // Finalizar observables para evitar memory leaks\n this.isDirty$.complete();\n this.isValid$.complete();\n this.isBusy$.complete();\n }\n}\n"," <mat-tab-group class=\"config-tabs\" [(selectedIndex)]=\"activeSectionIndex\">\n <mat-tab *ngFor=\"let section of sections\">\n <ng-template mat-tab-label>\n <mat-icon *ngIf=\"section.icon\" [praxisIcon]=\"section.icon\"></mat-icon>\n <span>{{ section.label }}</span>\n </ng-template>\n <div class=\"tab-content\">\n <ng-container [ngSwitch]=\"section.id\">\n <div *ngSwitchCase=\"'connect'\" style=\"display:grid; gap:12px; padding: 8px; grid-template-columns: 1fr 240px; align-items: start;\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Recurso</mat-label>\n <input matInput [(ngModel)]=\"resourcePath\" (ngModelChange)=\"onResourcePathChange($event)\" placeholder=\"ex.: retaguarda/parametros\" />\n <mat-icon matSuffix>link</mat-icon>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Chave primária</mat-label>\n <input matInput [(ngModel)]=\"idField\" (ngModelChange)=\"onIdFieldChange($event)\" placeholder=\"ex.: id, uuid, codigo\" />\n <mat-icon matSuffix>fingerprint</mat-icon>\n </mat-form-field>\n <small style=\"opacity:.75\">Defina o recurso da API e, se necessário, a chave primária</small>\n\n <!-- Divergência: idField -->\n <div *ngIf=\"idFieldDiverges\" style=\"grid-column: 1 / -1; padding: 8px 12px; border-radius: 6px; background: #fff4e5; color: #8a4b00; display:flex; align-items:center; gap: 8px;\">\n <mat-icon>warning</mat-icon>\n <div style=\"flex:1;\">\n A chave primária no servidor diverge da configuração atual.\n <span style=\"opacity:.85\">(config: {{ idField || 'id' }} | servidor: {{ serverIdField || 'id' }})</span>\n </div>\n <button mat-stroked-button color=\"primary\" type=\"button\" (click)=\"onReconcileIdField()\">Reconciliar</button>\n </div>\n\n <!-- Divergência: serverHash -->\n <div *ngIf=\"schemaHashDiverges\" style=\"grid-column: 1 / -1; padding: 8px 12px; border-radius: 6px; background: #e6f4ff; color: #0b5aaa; display:flex; align-items:center; gap: 8px;\">\n <mat-icon>info</mat-icon>\n <div style=\"flex:1;\">\n O schema no servidor foi atualizado desde a última sincronização.\n </div>\n <button mat-stroked-button color=\"primary\" type=\"button\" (click)=\"onAcceptServerHash()\">Atualizar metadados</button>\n </div>\n </div>\n\n <behavior-config-editor\n *ngSwitchCase=\"'overview'\"\n [config]=\"editedConfig\"\n (configChange)=\"onBehaviorConfigChange($event)\"\n (behaviorChange)=\"onBehaviorChange($event)\"\n ></behavior-config-editor>\n\n <columns-config-editor\n *ngSwitchCase=\"'columns'\"\n [config]=\"editedConfig\"\n (configChange)=\"onColumnsConfigChange($event)\"\n (columnChange)=\"onColumnChange($event)\"\n ></columns-config-editor>\n\n <header-appearance-editor\n *ngSwitchCase=\"'header'\"\n [config]=\"editedConfig\"\n (configChange)=\"onColumnsConfigChange($event)\"\n ></header-appearance-editor>\n\n <toolbar-actions-editor\n *ngSwitchCase=\"'toolbar'\"\n [config]=\"editedConfig\"\n (configChange)=\"onToolbarActionsConfigChange($event)\"\n (toolbarActionsChange)=\"onToolbarActionsChange($event)\"\n ></toolbar-actions-editor>\n\n <!-- Aba extra para integrações CRUD (visível quando em contexto CRUD) -->\n <crud-integration-editor\n #crudEditorRef\n *ngSwitchCase=\"'crud'\"\n [tableId]=\"crudContext?.tableId || 'default'\"\n [crudContext]=\"crudContext\"\n ></crud-integration-editor>\n\n <filter-settings\n *ngSwitchCase=\"'filters'\"\n [metadata]=\"columnMetas\"\n [settings]=\"\n editedConfig.behavior?.filtering?.advancedFilters?.settings\n \"\n (settingsChange)=\"onFilterSettingsChange($event)\"\n ></filter-settings>\n\n <messages-localization-editor\n *ngSwitchCase=\"'messages'\"\n [config]=\"editedConfig\"\n (configChange)=\"onMessagesLocalizationConfigChange($event)\"\n (messagesLocalizationChange)=\"\n onMessagesLocalizationChange($event)\n \"\n ></messages-localization-editor>\n\n <confirm-dialog-appearance-editor\n *ngSwitchCase=\"'dialogs'\"\n [config]=\"editedConfig\"\n (configChange)=\"onJsonConfigChange($event)\"\n ></confirm-dialog-appearance-editor>\n\n <!-- Visual Rules Editor -->\n <table-visual-rules-editor\n *ngSwitchCase=\"'visualRules'\"\n [config]=\"editedConfig\"\n (configChange)=\"onVisualRulesConfigChange($event)\"\n ></table-visual-rules-editor>\n\n <json-config-editor\n *ngSwitchCase=\"'json'\"\n [config]=\"editedConfig\"\n (configChange)=\"onJsonConfigChange($event)\"\n (editorEvent)=\"onJsonEditorEvent($event)\"\n ></json-config-editor>\n </ng-container>\n </div>\n </mat-tab>\n </mat-tab-group>\n<div class=\"config-editor-status\" *ngIf=\"statusMessage\">\n <span\n class=\"status-text\"\n [class.error]=\"hasErrors\"\n [class.success]=\"hasSuccess\"\n >{{ statusMessage }}</span\n >\n</div>\n","import { InjectionToken } from '@angular/core';\n\nexport interface FilterDrawerOpenConfig {\n resourcePath: string;\n formId: string;\n config: any; // FormConfig for PraxisFilterForm\n initialDto?: Record<string, any>;\n title?: string;\n onSubmit(dto: Record<string, any>): void;\n onClose?(): void;\n}\n\nexport interface FilterDrawerAdapter {\n open(config: FilterDrawerOpenConfig): Promise<void> | void;\n}\n\nexport const FILTER_DRAWER_ADAPTER = new InjectionToken<FilterDrawerAdapter>('FILTER_DRAWER_ADAPTER');\n\n","import { Inject, Injectable } from '@angular/core';\nimport { ConfigStorage, CONFIG_STORAGE } from '@praxisui/core';\n\nexport type FilterConfig = {\n quickField?: string;\n alwaysVisibleFields?: string[];\n placeholder?: string;\n showAdvanced?: boolean;\n mode?: 'auto' | 'filter' | 'card';\n changeDebounceMs?: number;\n allowSaveTags?: boolean;\n // New layout/UX options\n placeBooleansInActions?: boolean;\n showToggleLabels?: boolean;\n alwaysMinWidth?: number;\n alwaysColsMd?: number;\n alwaysColsLg?: number;\n autoSummary?: boolean;\n confirmTagDelete?: boolean;\n debugLayout?: boolean;\n // Tag theming (M3-style knobs)\n tagColor?: 'primary' | 'accent' | 'warn' | 'basic';\n tagVariant?: 'filled' | 'outlined';\n tagButtonColor?: 'primary' | 'accent' | 'warn' | 'basic';\n // Action buttons theming\n actionsButtonColor?: 'primary' | 'accent' | 'warn' | 'basic';\n actionsVariant?: 'standard' | 'outlined';\n // Overlay appearance for Advanced Filter\n overlayVariant?: 'card' | 'frosted';\n overlayBackdrop?: boolean;\n // Advanced panel open mode\n advancedOpenMode?: 'overlay' | 'modal' | 'drawer';\n};\n\n@Injectable({ providedIn: 'root' })\nexport class FilterConfigService {\n private readonly PREFIX = 'filter-config:';\n\n constructor(@Inject(CONFIG_STORAGE) private storage: ConfigStorage) {}\n\n /**\n * Load a persisted filter configuration for the given key.\n */\n load(key: string): FilterConfig | undefined {\n return (\n this.storage.loadConfig<FilterConfig>(this.PREFIX + key) ?? undefined\n );\n }\n\n /**\n * Persist a filter configuration for the given key.\n */\n save(key: string, config: FilterConfig): void {\n this.storage.saveConfig(this.PREFIX + key, config);\n }\n}\n","import {\n Component,\n EventEmitter,\n Inject,\n Input,\n OnChanges,\n OnInit,\n OnDestroy,\n Output,\n SimpleChanges,\n DestroyRef,\n TemplateRef,\n ViewChild,\n ChangeDetectorRef,\n AfterViewInit,\n HostListener,\n ElementRef,\n DoCheck,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormControl, FormGroup, ReactiveFormsModule, AbstractControl } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDialog } from '@angular/material/dialog';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { FILTER_DRAWER_ADAPTER, FilterDrawerAdapter } from '../../filter-drawer.adapter';\nimport { inject } from '@angular/core';\nimport {\n GenericCrudService,\n FieldMetadata,\n FormConfig,\n mapFieldDefinitionsToMetadata,\n ConfigStorage,\n CONFIG_STORAGE,\n FieldControlType,\n DynamicFormService,\n SchemaMetadataClient,\n LocalStorageCacheAdapter,\n SchemaIdParams,\n buildSchemaId,\n} from '@praxisui/core';\nimport { SchemaNormalizerService } from '@praxisui/core';\nimport { GlobalConfigService } from '@praxisui/core';\nimport {\n FilterConfigService,\n FilterConfig,\n} from '../../services/filter-config.service';\nimport { FilterSettingsComponent } from '../../filter-settings/filter-settings.component';\nimport { SettingsPanelService } from '@praxisui/settings-panel';\nimport { DynamicFieldLoaderDirective } from '@praxisui/dynamic-fields';\nimport { PraxisFilterForm } from '@praxisui/dynamic-form';\nimport { fetchWithETag } from '@praxisui/core';\nimport {\n OverlayModule,\n CdkOverlayOrigin,\n ConnectedPosition,\n} from '@angular/cdk/overlay';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { Subject, of, Subscription } from 'rxjs';\nimport { catchError, debounceTime, map, take, takeUntil } from 'rxjs/operators';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nexport type FilterTag = {\n id: string;\n label: string;\n patch: Record<string, any>;\n};\nexport type I18n = {\n searchPlaceholder: string;\n advanced: string;\n clear: string;\n apply: string;\n edit: string;\n noData: string;\n quickFieldNotFound: string;\n // New i18n entries\n saveAsShortcut: string;\n removeShortcut: string;\n renameShortcut: string;\n deleteShortcutConfirm: string;\n retry: string;\n errorLoadingFilters: string;\n settings: string;\n save: string;\n cancel: string;\n};\n\nconst DEFAULT_I18N: I18n = {\n searchPlaceholder: 'Buscar',\n advanced: 'Avançado',\n clear: 'Limpar',\n apply: 'Pesquisar',\n edit: 'Editar filtro',\n noData: 'Nenhum dado',\n quickFieldNotFound: 'Campo não encontrado',\n // New defaults\n saveAsShortcut: 'Salvar como atalho',\n removeShortcut: 'Remover atalho',\n renameShortcut: 'Renomear atalho',\n deleteShortcutConfirm: 'Remover atalho?',\n retry: 'Tentar novamente',\n errorLoadingFilters: 'Erro ao carregar filtros.',\n settings: 'Configurações',\n save: 'Salvar',\n cancel: 'Cancelar',\n};\n\n@Component({\n selector: 'praxis-filter',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatButtonModule,\n MatChipsModule,\n MatIconModule,\n PraxisIconDirective,\n MatBadgeModule,\n MatProgressBarModule,\n MatSnackBarModule,\n MatTooltipModule,\n DynamicFieldLoaderDirective,\n PraxisFilterForm,\n OverlayModule,\n MatDialogModule,\n ],\n templateUrl: './praxis-filter.component.html',\n styleUrls: ['./praxis-filter.component.scss'],\n host: {\n '[class.debug-layout]': 'debugLayout',\n '[style.--pfx-always-min]': 'alwaysMinWidth + \"px\"',\n '[style.--pfx-always-cols-md]': 'alwaysColsMd',\n '[style.--pfx-always-cols-lg]': 'alwaysColsLg',\n },\n})\n/**\n * Componente de filtro dinâmico para tabelas.\n *\n * Fluxo de dados\n * - Carrega o schema de filtro do backend (getFilterSchema).\n * - Normaliza para FieldMetadata via mapFieldDefinitionsToMetadata.\n * - Quick field: renderiza um campo dinâmico isolado e cria o FormControl via DynamicFormService,\n * preservando validadores, mensagens e updateOn do metadata.\n * - Always visible: cria FormControls via DynamicFormService e propaga alterações ao DTO.\n * - Advanced: delega ao PraxisDynamicForm, que monta o FormGroup completo com validadores.\n *\n * Persistência e UX\n * - Preferências e valores persistidos via ConfigStorage (persistenceKey, tags, modo/placeholder).\n * - Debounce configurável (changeDebounceMs) para emissões de change/submit.\n */\nexport class PraxisFilter implements OnInit, OnChanges, AfterViewInit, OnDestroy, DoCheck {\n @Input({ required: true }) resourcePath!: string;\n @Input({ required: true }) formId!: string;\n @Input() mode: 'auto' | 'filter' | 'card' = 'auto';\n /** Controls outdated schema notifications visibility and channel (only effective in edit mode) */\n @Input() notifyIfOutdated: 'inline' | 'snackbar' | 'both' | 'none' = 'both';\n /** Snooze duration for schema outdated notifications (ms), only in edit mode */\n @Input() snoozeMs = 24 * 60 * 60 * 1000; // 24h\n /** Auto open settings when schema is detected as outdated (only in edit mode) */\n @Input() autoOpenSettingsOnOutdated = false;\n /** Enable edit mode (gates notifications) */\n @Input() editModeEnabled = false;\n\n @Input() value?: Record<string, any>;\n @Input() quickField?: string;\n @Input() alwaysVisibleFields?: string[] = [];\n @Input() tags?: FilterTag[];\n @Input() allowSaveTags?: boolean;\n @Input() persistenceKey?: string;\n @Input() i18n?: Partial<I18n>;\n @Input() changeDebounceMs = 300;\n /** Controla a exibição do botão de configurações dentro do filtro */\n @Input() showFilterSettings = false;\n /** Data used to render the summary card when mode resolves to 'card'. */\n @Input() summary?: any;\n /** Custom template to render the summary card; receives the summary as $implicit. */\n @Input() summaryTemplate?: TemplateRef<any>;\n /** Mapping functions to build the native summary card. */\n @Input() summaryMap?: {\n avatar?: (s: any) => string;\n title: (s: any) => string;\n subtitle?: (s: any) => string;\n badges?: Array<(s: any) => string>;\n };\n /** When true and mode='auto', generates a summary from active filters if no summary is provided. */\n @Input() autoSummary = false;\n /** Exibir confirmação ao excluir atalho (tag) */\n @Input() confirmTagDelete = true;\n /** Debug visual de layout/alinhamento */\n @Input() debugLayout = false;\n /** Move toggles/booleans simples para a área de ações */\n @Input() placeBooleansInActions = true;\n /** Mostrar rótulos dos toggles na área de ações */\n @Input() showToggleLabels = true;\n /** Config da grade dos alwaysVisible */\n @Input() alwaysMinWidth = 300; // px\n @Input() alwaysColsMd = 2;\n @Input() alwaysColsLg = 3;\n /** Tag theming */\n @Input() tagColor: 'primary' | 'accent' | 'warn' | 'basic' = 'primary';\n @Input() tagVariant: 'filled' | 'outlined' = 'filled';\n @Input() tagButtonColor: 'primary' | 'accent' | 'warn' | 'basic' = 'basic';\n /** Action buttons theming */\n @Input() actionsButtonColor: 'primary' | 'accent' | 'warn' | 'basic' = 'basic';\n @Input() actionsVariant: 'standard' | 'outlined' = 'standard';\n /** Overlay appearance */\n @Input() overlayVariant: 'card' | 'frosted' = 'card';\n @Input() overlayBackdrop = true;\n /** Advanced panel open mode */\n @Input() advancedOpenMode: 'overlay' | 'modal' | 'drawer' = 'overlay';\n\n @Output() submit = new EventEmitter<Record<string, any>>();\n @Output() change = new EventEmitter<Record<string, any>>();\n @Output() clear = new EventEmitter<void>();\n @Output() modeChange = new EventEmitter<'filter' | 'card'>();\n @Output() requestSearch = this.submit;\n @Output() tagsChange = new EventEmitter<FilterTag[]>();\n // Propaga metadados do schema usado (schemaId/serverHash/context)\n @Output() metaChanged = new EventEmitter<{ schemaId: string; serverHash?: string; context: SchemaIdParams }>();\n /** Emits whenever schema outdated state changes (can be used by host) */\n @Output() schemaStatusChange = new EventEmitter<{ outdated: boolean; serverHash?: string; lastVerifiedAt?: string; formId?: string }>();\n\n quickControl: FormControl<any> = new FormControl<string>('', { nonNullable: true });\n quickForm = new FormGroup<Record<string, AbstractControl>>({});\n alwaysForm = new FormGroup<Record<string, FormControl<unknown>>>({});\n quickFieldMeta?: FieldMetadata;\n // For DynamicFieldLoader: avoid array literal in template causing re-renders each CD tick\n quickFieldMetaArray: FieldMetadata[] = [];\n alwaysVisibleMetas: FieldMetadata[] = [];\n toggleMetas: FieldMetadata[] = [];\n advancedConfig?: FormConfig;\n displayedTags: FilterTag[] = [];\n private savedTags: FilterTag[] = [];\n // Edição inline de tags\n editingTagId?: string;\n editingTagLabel = new FormControl<string>('', { nonNullable: true });\n schemaLoading = false;\n schemaError = false;\n private schemaMetas?: FieldMetadata[];\n private advancedChange$ = new Subject<Record<string, any>>();\n private alwaysFormReset$ = new Subject<void>();\n private dto: Record<string, any> = {};\n modeState: 'filter' | 'card' = 'filter';\n advancedOpen = false;\n // Novo: validade do form avançado para UX\n advancedValid = true;\n activeFiltersCount = 0;\n saving = false;\n i18nLabels: I18n = DEFAULT_I18N;\n placeholder?: string;\n private configKey!: string;\n private pendingQuickValue?: any; // valor inicial do quickControl a ser aplicado após a view inicializar\n private autoSummaryData?: any;\n private lastSchemaMeta?: { schemaId: string; serverHash?: string; context: SchemaIdParams };\n // Outdated state and persistence helpers\n schemaOutdated = false;\n\n @ViewChild('anchorRef', { read: CdkOverlayOrigin }) anchorRef?: CdkOverlayOrigin;\n @ViewChild('quickHostRef') quickHostRef?: ElementRef<HTMLElement>;\n\n overlayOrigin?: CdkOverlayOrigin;\n overlayWidth: number | string = 520;\n // Novo: estado de mobile para layout do overlay\n isMobile = false;\n // A11y: id único para o título do diálogo\n advancedTitleId = '';\n // A11y: id único para o painel do diálogo (para aria-controls)\n advancedPanelId = '';\n\n // Quick field mode tracking\n quickFieldMode: 'dynamic' | 'fallback' = 'fallback';\n\n // Lifecycle control\n private isViewInitialized = false;\n private pendingQuickFieldSetup = false;\n private isQuickFieldSetupInProgress = false;\n // Debug trackers\n private _dbgPrevQuickArrayRef: FieldMetadata[] | null = null;\n private _dbgPrevAlwaysArrayRef: FieldMetadata[] | null = null;\n private _dbgPrevToggleArrayRef: FieldMetadata[] | null = null;\n private _dbgPrevQuickFormRef: FormGroup<Record<string, AbstractControl>> | null = null;\n private _dbgPrevAlwaysFormRef: FormGroup<Record<string, FormControl<unknown>>> | null = null;\n private _dbgDoCheckCount = 0;\n private _dbgLastApplyMetasAt = 0;\n private _dbgLastQuickComponentsAt = 0;\n private _dbgLastAlwaysComponentsAt = 0;\n private _dbgLastToggleComponentsAt = 0;\n overlayPositions: ConnectedPosition[] = [\n // Prefer abrir abaixo e alinhado à esquerda do campo\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n // Abaixo alinhado à direita (fallback quando espaço à direita é melhor)\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top' },\n // Acima alinhado à esquerda (quando não há espaço abaixo)\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },\n // Acima alinhado à direita\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom' },\n ];\n // Subscriptions for dynamic debounce\n private quickSub?: Subscription;\n private advancedDebouncedSub?: Subscription;\n\n private lastSubmitAt = 0;\n // Observers for dynamic layout\n private resizeObs?: ResizeObserver;\n private mutationObs?: MutationObserver;\n // Guard to avoid closing immediately after opening due to the same click event\n private ignoreOutsideUntil = 0;\n // Resolved preferences (inputs → global fallback)\n private _resolvedPrefs: { notifyIfOutdated: 'inline'|'snackbar'|'both'|'none'; snoozeMs: number; autoOpenSettingsOnOutdated: boolean } = {\n notifyIfOutdated: 'both',\n snoozeMs: 24 * 60 * 60 * 1000,\n autoOpenSettingsOnOutdated: false,\n };\n\n private resolveSchemaPrefs(): void {\n const DEFAULTS = { notifyIfOutdated: 'both' as const, snoozeMs: 24 * 60 * 60 * 1000, autoOpenSettingsOnOutdated: false };\n let out = {\n notifyIfOutdated: (this.notifyIfOutdated as any) ?? DEFAULTS.notifyIfOutdated,\n snoozeMs: typeof this.snoozeMs === 'number' ? this.snoozeMs : DEFAULTS.snoozeMs,\n autoOpenSettingsOnOutdated: !!this.autoOpenSettingsOnOutdated,\n };\n const inputsAreDefaults = (this.notifyIfOutdated === DEFAULTS.notifyIfOutdated) && (this.snoozeMs === DEFAULTS.snoozeMs) && (this.autoOpenSettingsOnOutdated === DEFAULTS.autoOpenSettingsOnOutdated);\n if (inputsAreDefaults) {\n try {\n const g = this.global.getSchemaPrefsGlobal?.();\n if (g && typeof g === 'object') {\n out = {\n notifyIfOutdated: (g.notifyIfOutdated as any) ?? out.notifyIfOutdated,\n snoozeMs: (typeof g.snoozeMs === 'number' ? g.snoozeMs : out.snoozeMs),\n autoOpenSettingsOnOutdated: (typeof g.autoOpenSettingsOnOutdated === 'boolean' ? g.autoOpenSettingsOnOutdated : out.autoOpenSettingsOnOutdated),\n };\n }\n } catch {}\n }\n this._resolvedPrefs = out;\n }\n\n constructor(\n private crud: GenericCrudService<any>,\n @Inject(CONFIG_STORAGE) private configStorage: ConfigStorage,\n private destroyRef: DestroyRef,\n private filterConfig: FilterConfigService,\n private settingsPanel: SettingsPanelService,\n private snackBar: MatSnackBar,\n private dialog: MatDialog,\n private cdr: ChangeDetectorRef,\n private dynamicForm: DynamicFormService,\n private schemaNormalizer: SchemaNormalizerService,\n ) {}\n private readonly global = inject(GlobalConfigService);\n // Optional injection (adapter provided by host app)\n private readonly filterDrawerAdapter = (() => {\n try { return inject<FilterDrawerAdapter>(FILTER_DRAWER_ADAPTER); } catch { return undefined as any; }\n })();\n\n private loadSavedTagsFromStorage(): void {\n try {\n if (!this.configKey) return;\n const key = `${this.configKey}:tags`;\n const stored = this.configStorage.loadConfig<FilterTag[]>(key);\n this.savedTags = Array.isArray(stored) ? [...stored] : [];\n this.updateDisplayedTags();\n } catch {}\n }\n\n ngOnInit(): void {\n console.debug('[PFILTER] ngOnInit: config + state', { resourcePath: this.resourcePath, formId: this.formId });\n this.resolveSchemaPrefs();\n this.crud.configure(this.resourcePath);\n this.configKey = this.persistenceKey ?? this.formId;\n // Atribui id estável para o título do overlay (dialog)\n this.advancedTitleId = `praxis-advanced-title-${this.formId || 'default'}`;\n // Atribui id estável para o painel do overlay (dialog)\n this.advancedPanelId = `praxis-advanced-panel-${this.formId || 'default'}`;\n // Inicializa flag de mobile\n this.isMobile = this.computeIsMobile();\n const cfg = this.filterConfig.load(this.configKey);\n // Guardar preferências de abertura avançada para aplicar após resolver o modo\n const cfgShowAdvanced = cfg?.showAdvanced;\n if (cfg) {\n if (!this.quickField && cfg.quickField) {\n this.quickField = cfg.quickField;\n }\n if (!this.alwaysVisibleFields?.length && cfg.alwaysVisibleFields) {\n this.alwaysVisibleFields = cfg.alwaysVisibleFields;\n }\n if (!this.i18n?.searchPlaceholder && cfg.placeholder) {\n this.placeholder = cfg.placeholder;\n }\n // Resolver mode antes de mexer em advancedOpen\n if (this.mode === 'auto' && cfg.mode) {\n this.mode = cfg.mode;\n }\n if (this.allowSaveTags === undefined && cfg.allowSaveTags !== undefined) {\n this.allowSaveTags = cfg.allowSaveTags;\n }\n if (this.changeDebounceMs === 300 && cfg.changeDebounceMs !== undefined) {\n this.changeDebounceMs = cfg.changeDebounceMs;\n }\n if (cfg.placeBooleansInActions !== undefined) {\n this.placeBooleansInActions = cfg.placeBooleansInActions;\n }\n if (cfg.showToggleLabels !== undefined) {\n this.showToggleLabels = cfg.showToggleLabels;\n }\n if (cfg.alwaysMinWidth !== undefined) {\n this.alwaysMinWidth = cfg.alwaysMinWidth;\n }\n if (cfg.alwaysColsMd !== undefined) {\n this.alwaysColsMd = cfg.alwaysColsMd;\n }\n if (cfg.alwaysColsLg !== undefined) {\n this.alwaysColsLg = cfg.alwaysColsLg;\n }\n if (cfg.autoSummary !== undefined) {\n this.autoSummary = cfg.autoSummary;\n }\n if (cfg.confirmTagDelete !== undefined) {\n this.confirmTagDelete = cfg.confirmTagDelete;\n }\n if (cfg.debugLayout !== undefined) {\n this.debugLayout = cfg.debugLayout;\n }\n if ((cfg as any).overlayVariant) this.overlayVariant = (cfg as any).overlayVariant as any;\n if ((cfg as any).overlayBackdrop !== undefined) this.overlayBackdrop = !!(cfg as any).overlayBackdrop;\n if (cfg.tagColor) this.tagColor = cfg.tagColor;\n if (cfg.tagVariant) this.tagVariant = cfg.tagVariant;\n if (cfg.tagButtonColor) this.tagButtonColor = cfg.tagButtonColor;\n if (cfg.actionsButtonColor) this.actionsButtonColor = cfg.actionsButtonColor;\n if (cfg.actionsVariant) this.actionsVariant = cfg.actionsVariant;\n }\n // Apply global defaults for filter UI when not specified in saved config or inputs\n try {\n const table = this.global.getTable();\n const ui = (table as any)?.filteringUi as {\n overlayVariant?: 'card'|'frosted'; overlayBackdrop?: boolean; advancedOpenMode?: 'overlay'|'modal'|'drawer'\n } | undefined;\n if (ui) {\n const cfgAny: any = cfg || {};\n const hasCfgVariant = cfgAny.overlayVariant !== undefined;\n const hasCfgBackdrop = cfgAny.overlayBackdrop !== undefined;\n const hasCfgOpenMode = cfgAny.advancedOpenMode !== undefined;\n\n // If no local config persisted for a given key, always apply global\n if (!hasCfgVariant && ui.overlayVariant) {\n this.overlayVariant = ui.overlayVariant;\n }\n if (!hasCfgBackdrop && ui.overlayBackdrop !== undefined) {\n this.overlayBackdrop = !!ui.overlayBackdrop;\n }\n if (!hasCfgOpenMode && ui.advancedOpenMode) {\n this.advancedOpenMode = ui.advancedOpenMode;\n }\n }\n } catch {}\n this.mergeI18n();\n if (this.allowSaveTags && this.configKey) {\n const stored = this.configStorage.loadConfig<FilterTag[]>(\n `${this.configKey}:tags`,\n );\n if (stored) {\n this.savedTags = stored;\n }\n }\n this.updateDisplayedTags();\n // carregar filtros persistidos (DTO) usando configKey como fallback\n const dtoKey = this.persistenceKey ?? this.configKey;\n if (dtoKey) {\n const saved = this.configStorage.loadConfig<Record<string, any>>(dtoKey);\n if (saved) {\n this.dto = { ...saved };\n if (this.quickField && saved[this.quickField] !== undefined) {\n this.pendingQuickValue = saved[this.quickField];\n }\n }\n }\n if (!Object.keys(this.dto).length && this.value) {\n this.dto = { ...this.value };\n if (this.quickField && this.value[this.quickField] !== undefined) {\n this.pendingQuickValue = this.value[this.quickField];\n }\n }\n this.activeFiltersCount = Object.keys(this.dto).length;\n // Avaliar o modo primeiro\n this.evaluateMode();\n // Atualizar resumo automático conforme filtros iniciais\n this.updateAutoSummary();\n // Só então aplicar a preferência de advancedOpen conforme o modo efetivo\n if (cfgShowAdvanced !== undefined) {\n this.advancedOpen = cfgShowAdvanced;\n }\n\n // Bind subscriptions with current debounce\n this.bindQuickControlChanges();\n this.bindAdvancedDebounce();\n\n // Lightweight server schema verification (ETag/If-None-Match). Will not download schema body when columns already exist.\n this.verifyServerSchemaVersion().catch(() => {});\n // Only load schema body when necessary for rendering (alwaysVisible fields at init).\n if ((this.alwaysVisibleFields?.length || 0) > 0) {\n console.debug('[PFILTER] ngOnInit: alwaysVisible present → loadSchema');\n this.loadSchema();\n }\n }\n\n ngAfterViewInit(): void {\n // Define overlayOrigin e aplica valores iniciais após a view inicializar,\n // usando setTimeout para evitar ExpressionChanged em bindings do MatFormField\n setTimeout(() => {\n this.overlayOrigin = this.anchorRef;\n console.debug('[PFILTER] AfterViewInit: overlayOrigin set');\n this.updateOverlayWidth();\n if (this.pendingQuickValue !== undefined) {\n this.quickControl.setValue(this.pendingQuickValue, { emitEvent: false });\n this.pendingQuickValue = undefined;\n }\n\n // Mark view as initialized and trigger pending Quick Field setup\n this.isViewInitialized = true;\n if (this.pendingQuickFieldSetup && this.quickField && this.quickFieldMeta) {\n this.pendingQuickFieldSetup = false;\n this.setupQuickField().catch(error => {\n console.error('[QuickField] Deferred setup failed, falling back to generic input:', error);\n this.setupQuickFieldFallback();\n });\n }\n\n // Observers to react to dynamic quick field changes\n console.debug('[PFILTER] AfterViewInit: initDynamicObservers');\n this.initDynamicObservers();\n\n // Garante que o Angular processe as alterações imediatamente\n this.cdr.detectChanges();\n console.debug('[PFILTER] AfterViewInit: initial CD flushed');\n });\n }\n\n @HostListener('window:resize') onWindowResize() {\n this.isMobile = this.computeIsMobile();\n this.updateOverlayWidth();\n }\n\n private initDynamicObservers(): void {\n try {\n const anchorEl = this.anchorRef?.elementRef?.nativeElement as HTMLElement | undefined;\n const quickHostEl = this.quickHostRef?.nativeElement as HTMLElement | undefined;\n\n // ResizeObserver (quando disponível) para largura do anchor/quick\n const RO: any = (globalThis as any).ResizeObserver;\n if (RO && !this.resizeObs) {\n this.resizeObs = new RO(() => {\n // Debounced by animation frame for safety\n requestAnimationFrame(() => this.updateOverlayWidth());\n });\n if (anchorEl && this.resizeObs) this.resizeObs.observe(anchorEl);\n if (quickHostEl && this.resizeObs) this.resizeObs.observe(quickHostEl);\n }\n\n // MutationObserver para mudanças estruturais no quick (campo dinâmico)\n if (!this.mutationObs && quickHostEl) {\n this.mutationObs = new MutationObserver(() => {\n // Pequeno debounce natural via microtask\n Promise.resolve().then(() => {\n // Reatribui origem caso o anchor tenha sido recriado\n this.overlayOrigin = this.anchorRef;\n this.updateOverlayWidth();\n this.cdr.detectChanges();\n });\n });\n this.mutationObs.observe(quickHostEl, {\n childList: true,\n subtree: true,\n attributes: true,\n });\n }\n } catch {\n // noop: ambiente sem suporte a observers\n }\n }\n\n // Fecha o avançado ao pressionar ESC (exceto quando o foco está em um overlay filho — datepicker/select/etc.)\n @HostListener('document:keydown', ['$event'])\n onDocumentEscClose(event: KeyboardEvent): void {\n if (event.key !== 'Escape' || !this.advancedOpen) return;\n const target = event.target as HTMLElement | null;\n if (this.isEventFromNestedOverlay(target)) return;\n this.closeAdvanced();\n }\n\n private updateOverlayWidth(): void {\n try {\n if (this.isMobile) { this.overlayWidth = '100vw'; return; }\n const anchor = this.anchorRef?.elementRef?.nativeElement as HTMLElement | undefined;\n // Preferir a largura da barra completa para melhor alinhamento com ações\n const bar = anchor?.closest?.('.praxis-filter-bar') as HTMLElement | null | undefined;\n const el = (bar || anchor) as HTMLElement | undefined;\n } catch { /* noop */ }\n }\n\n // Helper para detectar viewport mobile (mantido simples e sem SSR)\n private computeIsMobile(): boolean {\n try {\n return typeof window !== 'undefined' && window.innerWidth <= 599;\n } catch {\n return false;\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['resourcePath'] && !changes['resourcePath'].firstChange) {\n console.debug('[PFILTER] ngOnChanges: resourcePath changed', { resourcePath: this.resourcePath });\n }\n if (changes['mode'] || changes['summary']) {\n this.evaluateMode();\n }\n if (changes['tags'] && !changes['tags'].firstChange) {\n this.updateDisplayedTags();\n }\n if (changes['resourcePath'] && !changes['resourcePath'].firstChange) {\n console.debug('[PFILTER] ngOnChanges: reconfigure CRUD');\n this.crud.configure(this.resourcePath);\n this.quickControl.setValue('', { emitEvent: false });\n this.dto = {};\n this.clearPersisted();\n this.schemaMetas = undefined;\n // Verify lightweight on path changes; load schema body only if needed for rendering\n this.verifyServerSchemaVersion().catch(() => {});\n if ((this.alwaysVisibleFields?.length || 0) > 0) {\n console.debug('[PFILTER] ngOnChanges: alwaysVisible present → loadSchema');\n if (!this.schemaLoading) this.loadSchema();\n }\n }\n if (\n (changes['quickField'] && !changes['quickField'].firstChange) ||\n (changes['alwaysVisibleFields'] &&\n !changes['alwaysVisibleFields'].firstChange)\n ) {\n console.debug('[PFILTER] ngOnChanges: quickField/alwaysVisibleFields changed', {\n quickField: this.quickField,\n alwaysVisibleFields: this.alwaysVisibleFields,\n hasSchema: !!this.schemaMetas,\n });\n if (this.schemaMetas) {\n this.applySchemaMetas();\n } else {\n if (!this.schemaLoading) this.loadSchema();\n }\n }\n if (changes['i18n']) {\n this.mergeI18n();\n }\n if (changes['notifyIfOutdated'] || changes['snoozeMs'] || changes['autoOpenSettingsOnOutdated']) {\n this.resolveSchemaPrefs();\n }\n }\n\n openSettings(): void {\n try {\n const currentConfig = {\n metadata: this.schemaMetas ?? [],\n configKey: this.configKey,\n dto: { ...this.dto },\n settings: {\n quickField: this.quickField,\n alwaysVisibleFields: this.alwaysVisibleFields,\n placeholder: this.placeholder,\n showAdvanced: this.advancedOpen,\n mode: this.mode,\n allowSaveTags: this.allowSaveTags,\n changeDebounceMs: this.changeDebounceMs,\n placeBooleansInActions: this.placeBooleansInActions,\n showToggleLabels: this.showToggleLabels,\n alwaysMinWidth: this.alwaysMinWidth,\n alwaysColsMd: this.alwaysColsMd,\n alwaysColsLg: this.alwaysColsLg,\n autoSummary: this.autoSummary,\n confirmTagDelete: this.confirmTagDelete,\n debugLayout: this.debugLayout,\n tagColor: this.tagColor,\n tagVariant: this.tagVariant,\n tagButtonColor: this.tagButtonColor,\n actionsButtonColor: this.actionsButtonColor,\n actionsVariant: this.actionsVariant,\n overlayVariant: this.overlayVariant,\n overlayBackdrop: this.overlayBackdrop,\n },\n };\n\n const ref = this.settingsPanel.open({\n id: `filter.${this.configKey}`,\n title: 'Configurações do Filtro',\n content: { component: FilterSettingsComponent, inputs: currentConfig },\n });\n\n const applyChanges = (cfg: FilterConfig): void => {\n this.quickField = cfg.quickField;\n this.alwaysVisibleFields = cfg.alwaysVisibleFields ?? [];\n this.placeholder = cfg.placeholder;\n this.advancedOpen = cfg.showAdvanced ?? false;\n this.mode = cfg.mode ?? 'auto';\n const prevAllowSaveTags = this.allowSaveTags;\n this.allowSaveTags = cfg.allowSaveTags;\n const prevDebounce = this.changeDebounceMs;\n this.changeDebounceMs = cfg.changeDebounceMs ?? 300;\n // New\n if (cfg.placeBooleansInActions !== undefined)\n this.placeBooleansInActions = cfg.placeBooleansInActions;\n if (cfg.showToggleLabels !== undefined)\n this.showToggleLabels = cfg.showToggleLabels;\n if (cfg.alwaysMinWidth !== undefined)\n this.alwaysMinWidth = cfg.alwaysMinWidth;\n if (cfg.alwaysColsMd !== undefined)\n this.alwaysColsMd = cfg.alwaysColsMd;\n if (cfg.alwaysColsLg !== undefined)\n this.alwaysColsLg = cfg.alwaysColsLg;\n if (cfg.autoSummary !== undefined)\n this.autoSummary = cfg.autoSummary;\n if (cfg.confirmTagDelete !== undefined)\n this.confirmTagDelete = cfg.confirmTagDelete;\n if (cfg.debugLayout !== undefined)\n this.debugLayout = cfg.debugLayout;\n if ((cfg as any).overlayVariant)\n this.overlayVariant = (cfg as any).overlayVariant as any;\n if ((cfg as any).overlayBackdrop !== undefined)\n this.overlayBackdrop = !!(cfg as any).overlayBackdrop;\n if ((cfg as any).advancedOpenMode)\n this.advancedOpenMode = (cfg as any).advancedOpenMode as any;\n if (cfg.tagColor) this.tagColor = cfg.tagColor;\n if (cfg.tagVariant) this.tagVariant = cfg.tagVariant;\n if (cfg.tagButtonColor) this.tagButtonColor = cfg.tagButtonColor;\n if (cfg.actionsButtonColor) this.actionsButtonColor = cfg.actionsButtonColor;\n if (cfg.actionsVariant) this.actionsVariant = cfg.actionsVariant;\n this.mergeI18n();\n this.applySchemaMetas();\n this.updateDisplayedTags();\n // If the user just enabled tag persistence, load saved tags immediately\n if (this.allowSaveTags && !prevAllowSaveTags) {\n this.loadSavedTagsFromStorage();\n }\n this.evaluateMode();\n if (this.changeDebounceMs !== prevDebounce) {\n this.bindQuickControlChanges();\n this.bindAdvancedDebounce();\n }\n };\n\n const persistConfig = (cfg: FilterConfig, message: string): void => {\n this.saving = true;\n try {\n this.filterConfig.save(this.configKey, cfg);\n this.snackBar.open(message, 'Fechar', { duration: 3000 });\n } catch (err) {\n console.error('PFILTER:config:save:error', err);\n this.snackBar.open('Erro ao salvar configurações', 'Fechar', {\n duration: 3000,\n });\n } finally {\n this.saving = false;\n }\n };\n\n const validateConfig = (cfg: FilterConfig): FilterConfig => {\n // Se o schema ainda não foi carregado, não invalide o quickField nem os alwaysVisibleFields\n if (!this.schemaMetas || this.schemaMetas.length === 0) {\n return { ...cfg };\n }\n const names = new Set(this.schemaMetas.map((m) => m.name));\n const quickField =\n cfg.quickField && names.has(cfg.quickField)\n ? cfg.quickField\n : undefined;\n const alwaysVisibleFields = cfg.alwaysVisibleFields?.filter((f) =>\n names.has(f),\n );\n const clamp = {\n minWidth: (v?: number) => {\n if (v == null) return undefined as any;\n return Math.min(480, Math.max(240, v));\n },\n colsMd: (v?: number) => {\n if (v == null) return undefined as any;\n return Math.min(3, Math.max(1, v));\n },\n colsLg: (v?: number) => {\n if (v == null) return undefined as any;\n return Math.min(4, Math.max(1, v));\n },\n };\n return {\n ...cfg,\n quickField,\n alwaysVisibleFields,\n alwaysMinWidth: clamp.minWidth(cfg.alwaysMinWidth),\n alwaysColsMd: clamp.colsMd(cfg.alwaysColsMd),\n alwaysColsLg: clamp.colsLg(cfg.alwaysColsLg),\n overlayVariant: (cfg as any).overlayVariant,\n overlayBackdrop: (cfg as any).overlayBackdrop,\n };\n };\n\n ref.applied$.pipe(take(1)).subscribe((cfg: FilterConfig) => {\n const safe = validateConfig(cfg);\n applyChanges(safe);\n persistConfig(safe, 'Configurações aplicadas');\n ref.close('save');\n });\n\n ref.saved$.pipe(take(1)).subscribe((cfg: FilterConfig) => {\n const safe = validateConfig(cfg);\n applyChanges(safe);\n persistConfig(safe, 'Configurações salvas');\n });\n } catch (err) {\n console.error('PFILTER:openSettings:error', err);\n this.snackBar.open('Erro ao abrir configurações', 'Fechar', {\n duration: 3000,\n });\n }\n }\n\n switchToFilter(): void {\n if (this.modeState !== 'filter') {\n this.modeState = 'filter';\n this.modeChange.emit('filter');\n }\n }\n\n createTag(label?: string): void {\n if (!this.allowSaveTags) {\n return;\n }\n const tagLabel =\n label ?? (typeof prompt === 'function' ? prompt('Nome do atalho') : '');\n if (!tagLabel) {\n return;\n }\n const tag: FilterTag = {\n id: Date.now().toString(),\n label: tagLabel,\n patch: { ...this.dto },\n };\n this.savedTags.push(tag);\n this.persistTags();\n this.updateDisplayedTags();\n this.tagsChange.emit([...this.displayedTags]);\n }\n\n renameTag(tag: FilterTag, label?: string): void {\n const newLabel = label ??\n (typeof prompt === 'function'\n ? prompt(this.i18nLabels.renameShortcut, tag.label)\n : tag.label);\n if (!newLabel || newLabel === tag.label) {\n return;\n }\n tag.label = newLabel;\n this.persistTags();\n this.updateDisplayedTags();\n this.tagsChange.emit([...this.displayedTags]);\n }\n\n deleteTag(tag: FilterTag): void {\n if (this.confirmTagDelete && this.isUserTag(tag)) {\n const ok = typeof confirm === 'function' ? confirm(this.i18nLabels.deleteShortcutConfirm) : true;\n if (!ok) return;\n }\n this.savedTags = this.savedTags.filter((t) => t.id !== tag.id);\n this.persistTags();\n this.updateDisplayedTags();\n this.tagsChange.emit([...this.displayedTags]);\n }\n\n // Métodos para edição inline de tags\n startEditTag(tag: FilterTag, $event?: Event): void {\n if ($event) $event.stopPropagation();\n if (!this.isUserTag(tag)) return;\n this.editingTagId = tag.id;\n this.editingTagLabel.setValue(tag.label);\n }\n commitEditTag(tag: FilterTag, $event?: Event): void {\n if ($event) $event.stopPropagation();\n const value = this.editingTagLabel.value?.trim();\n if (value && value !== tag.label) {\n this.renameTag(tag, value);\n }\n this.editingTagId = undefined;\n }\n cancelEditTag($event?: Event): void {\n if ($event) $event.stopPropagation();\n this.editingTagId = undefined;\n }\n\n advancedForm?: FormGroup<Record<string, any>>;\n\n // getFilterSchemaPath não é mais necessário, pois o serviço deriva o path via schemaUrl()\n\n private buildFilteredSchemaContext(): SchemaIdParams & { baseUrl: string } {\n // Derive path from schemaUrl (preserves prefixes) and ensure /filter suffix\n const basePath = (this.crud.schemaUrl() || '').replace(/\\/+$/, '').replace(/\\/schemas$/, '');\n let path = basePath ? `${basePath}/filter` : '';\n if (!path) {\n // Fallback path if schemaUrl is not available\n path = `/${this.resourcePath.replace(/^\\/+|\\/+$/g, '')}/filter`;\n }\n // Operation and type for filter forms\n const operation = 'post';\n const schemaType: 'request' = 'request';\n const baseUrl = this.crud.getSchemasFilteredBaseUrl();\n let apiOrigin = '';\n try { apiOrigin = new URL(baseUrl).origin; } catch {}\n const tenant = this.global.getTenant();\n const locale = (typeof navigator !== 'undefined' && navigator.language) ? navigator.language : undefined;\n return { path, operation, schemaType, includeInternalSchemas: true, tenant, locale, baseUrl, apiOrigin };\n }\n\n private async loadSchemaViaClient(): Promise<FieldMetadata[]> {\n const ctx = this.buildFilteredSchemaContext();\n const client = new SchemaMetadataClient(new LocalStorageCacheAdapter({ ttlMs: 30 * 60 * 1000, maxEntries: 200 }));\n const entry = await client.getSchema({\n baseUrl: ctx.baseUrl,\n path: ctx.path,\n operation: ctx.operation,\n schemaType: ctx.schemaType,\n includeInternalSchemas: ctx.includeInternalSchemas,\n tenant: ctx.tenant,\n locale: ctx.locale,\n });\n const defs = this.schemaNormalizer.normalizeSchema(entry.schema);\n const metas = mapFieldDefinitionsToMetadata(defs);\n const schemaId = buildSchemaId(ctx);\n this.lastSchemaMeta = { schemaId, serverHash: entry.schemaHash, context: ctx };\n // Emit metadata to host\n this.metaChanged.emit({ schemaId, serverHash: entry.schemaHash, context: ctx });\n // Persist minimal meta for future verify-only calls\n try {\n const nowIso = new Date().toISOString();\n this.configStorage.saveConfig(this.getSchemaMetaKey(), { serverHash: entry.schemaHash, lastVerifiedAt: nowIso });\n } catch {}\n return metas;\n }\n\n loadSchema(): void {\n console.debug('[PFILTER] loadSchema: start');\n if (this.schemaMetas) {\n console.debug('[PFILTER] loadSchema: schema already present, applying metas');\n this.applySchemaMetas();\n return;\n }\n if (this.schemaLoading) {\n console.debug('[PFILTER] loadSchema: already loading — skip');\n return;\n }\n\n this.schemaLoading = true;\n this.schemaError = false;\n // Use SchemaMetadataClient with ETag/304 + schemaId context\n this.loadSchemaViaClient()\n .then((metas) => {\n if (this.schemaError) return;\n setTimeout(() => {\n this.schemaLoading = false;\n this.schemaMetas = metas;\n console.debug('[PFILTER] loadSchema: metas received', { total: metas.length, names: metas.map(m => m.name) });\n this.applySchemaMetas();\n });\n })\n .catch((err) => {\n console.error('PFILTER:schema:load:error', err);\n setTimeout(() => {\n this.schemaLoading = false;\n this.schemaError = true;\n });\n });\n }\n\n private applySchemaMetas(): void {\n this._dbgLastApplyMetasAt = Date.now();\n console.debug('[PFILTER] applySchemaMetas: start', {\n quickField: this.quickField,\n alwaysVisibleFields: this.alwaysVisibleFields,\n hasSchema: !!this.schemaMetas,\n schemaCount: this.schemaMetas?.length ?? 0,\n });\n const metas = this.schemaMetas ?? [];\n this.quickFieldMeta = undefined;\n this.quickFieldMetaArray = [];\n this.alwaysVisibleMetas = [];\n this.toggleMetas = [];\n this.alwaysFormReset$.next();\n this.alwaysForm = new FormGroup<Record<string, FormControl<unknown>>>({});\n this.advancedConfig = undefined;\n if (this.quickField) {\n const found = metas.find((m) => m.name === this.quickField);\n if (found) {\n this.quickFieldMeta = {\n ...found,\n density: 'compact',\n updateOn: 'change',\n materialDesign: { ...(found as any).materialDesign, floatLabel: 'always' },\n } as FieldMetadata;\n this.quickFieldMetaArray = [this.quickFieldMeta];\n console.debug('[PFILTER] applySchemaMetas: quick field resolved', { name: this.quickFieldMeta.name, controlType: this.quickFieldMeta.controlType });\n this.quickForm = new FormGroup<Record<string, AbstractControl>>({});\n if (this.isViewInitialized) {\n this.setupQuickField().catch(error => {\n console.error('[QuickField] Setup failed, falling back to generic input:', error);\n this.setupQuickFieldFallback();\n });\n } else {\n this.pendingQuickFieldSetup = true;\n }\n } else {\n console.debug('[PFILTER] applySchemaMetas: quick field not found in schema', { quickField: this.quickField });\n }\n } else {\n // Ensure quick field array is cleared when quickField input is unset\n this.quickFieldMetaArray = [];\n }\n const initialAlways = metas.filter((m) => this.alwaysVisibleFields?.includes(m.name));\n const alwaysWithDensity = initialAlways.map((m) => ({\n ...(m as any),\n updateOn: 'change',\n density: 'compact',\n materialDesign: { ...((m as any).materialDesign || {}), floatLabel: 'always' },\n })) as FieldMetadata[];\n // Separar toggles (booleans simples) para a faixa de ações, se habilitado\n const isToggle = (m: FieldMetadata) => (m as any).controlType === FieldControlType.TOGGLE;\n if (this.placeBooleansInActions) {\n const toggles = alwaysWithDensity.filter(isToggle);\n this.toggleMetas = this.showToggleLabels\n ? toggles\n : toggles.map((m) => ({ ...(m as any), placeholder: m.label, label: '' } as FieldMetadata));\n this.alwaysVisibleMetas = alwaysWithDensity.filter((m) => !isToggle(m));\n } else {\n this.alwaysVisibleMetas = alwaysWithDensity;\n this.toggleMetas = [];\n }\n // Registrar controles para ambos os grupos dentro do mesmo FormGroup\n console.debug('[PFILTER] applySchemaMetas: always/toggles', {\n alwaysCount: this.alwaysVisibleMetas.length,\n toggleCount: this.toggleMetas.length,\n alwaysNames: this.alwaysVisibleMetas.map(m => m.name),\n toggleNames: this.toggleMetas.map(m => m.name),\n });\n [...this.alwaysVisibleMetas, ...this.toggleMetas].forEach((m) => {\n const ctrl = this.dynamicForm.createControlFromMetadata(m as any);\n const initial = this.dto[m.name];\n if (initial !== undefined) {\n ctrl.setValue(initial, { emitEvent: false });\n }\n this.alwaysForm.addControl(m.name, ctrl as any);\n });\n console.debug('[PFILTER] applySchemaMetas: alwaysForm controls set', { controls: Object.keys(this.alwaysForm.controls) });\n this.alwaysForm.valueChanges\n .pipe(\n debounceTime(this.changeDebounceMs),\n takeUntil(this.alwaysFormReset$),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((val) => this.advancedChange$.next(val));\n\n const advancedMetas = metas\n .filter((m) => m.name !== this.quickField && !this.alwaysVisibleFields?.includes(m.name))\n .map((m) => ({ ...(m as any), updateOn: 'change' })) as FieldMetadata[];\n\n if (advancedMetas.length) {\n // Única linha com várias colunas: melhora responsividade via wrap no formulário filho\n this.advancedConfig = {\n sections: [\n {\n id: 'advanced',\n rows: [\n {\n columns: advancedMetas.map((m) => ({ fields: [m.name] })),\n },\n ],\n },\n ],\n fieldMetadata: advancedMetas,\n metadata: this.lastSchemaMeta\n ? {\n schemaId: this.lastSchemaMeta.schemaId,\n serverHash: this.lastSchemaMeta.serverHash,\n schemaContext: this.lastSchemaMeta.context,\n }\n : undefined,\n } as FormConfig;\n console.debug('[PFILTER] applySchemaMetas: advancedConfig set', { count: advancedMetas.length, names: advancedMetas.map(m => m.name) });\n }\n }\n\n // Debug: monitor unexpected identity changes triggering DFL\n ngDoCheck(): void {\n this._dbgDoCheckCount++;\n const now = Date.now();\n const sinceApply = now - this._dbgLastApplyMetasAt;\n\n if (this._dbgPrevQuickArrayRef !== this.quickFieldMetaArray) {\n console.debug('[PFILTER] DoCheck: quickFieldMetaArray ref changed', { sinceApplyMs: sinceApply, len: this.quickFieldMetaArray?.length ?? 0 });\n this._dbgPrevQuickArrayRef = this.quickFieldMetaArray;\n }\n if (this._dbgPrevAlwaysArrayRef !== this.alwaysVisibleMetas) {\n console.debug('[PFILTER] DoCheck: alwaysVisibleMetas ref changed', { sinceApplyMs: sinceApply, len: this.alwaysVisibleMetas?.length ?? 0 });\n this._dbgPrevAlwaysArrayRef = this.alwaysVisibleMetas;\n }\n if (this._dbgPrevToggleArrayRef !== this.toggleMetas) {\n console.debug('[PFILTER] DoCheck: toggleMetas ref changed', { sinceApplyMs: sinceApply, len: this.toggleMetas?.length ?? 0 });\n this._dbgPrevToggleArrayRef = this.toggleMetas;\n }\n if (this._dbgPrevQuickFormRef !== this.quickForm) {\n console.debug('[PFILTER] DoCheck: quickForm ref changed', { sinceApplyMs: sinceApply });\n this._dbgPrevQuickFormRef = this.quickForm;\n }\n if (this._dbgPrevAlwaysFormRef !== this.alwaysForm) {\n console.debug('[PFILTER] DoCheck: alwaysForm ref changed', { sinceApplyMs: sinceApply });\n this._dbgPrevAlwaysFormRef = this.alwaysForm;\n }\n }\n\n // DFL diagnostics from template bindings\n onQuickComponents(map: Map<string, any>): void {\n this._dbgLastQuickComponentsAt = Date.now();\n console.debug('[PFILTER] Quick DFL componentsCreated', { count: map?.size ?? 0, names: Array.from(map?.keys?.() || []) });\n }\n onQuickFieldCreated(ev: any): void {\n console.debug('[PFILTER] Quick DFL fieldCreated', { name: ev?.field?.name, index: ev?.index });\n }\n onAlwaysComponents(map: Map<string, any>): void {\n this._dbgLastAlwaysComponentsAt = Date.now();\n console.debug('[PFILTER] Always DFL componentsCreated', { count: map?.size ?? 0, names: Array.from(map?.keys?.() || []) });\n }\n onToggleComponents(map: Map<string, any>): void {\n this._dbgLastToggleComponentsAt = Date.now();\n console.debug('[PFILTER] Toggle DFL componentsCreated', { count: map?.size ?? 0, names: Array.from(map?.keys?.() || []) });\n }\n\n onAdvancedReady(event: { formGroup: FormGroup<Record<string, any>> }): void {\n this.advancedForm = event.formGroup;\n this.advancedForm.patchValue(this.dto, { emitEvent: false });\n // Atualiza estado de validade inicial\n this.advancedValid = this.advancedForm.valid;\n }\n\n onAdvancedChange(event: { formData: Record<string, any> }): void {\n this.advancedChange$.next(event.formData);\n }\n\n // Novo: receber alterações de validade do form avançado\n onAdvancedValidityChange(valid: boolean): void {\n this.advancedValid = valid;\n }\n\n onAdvancedSubmit(event: { formData: Record<string, any> }): void {\n // Bloquear submit se inválido\n if (this.advancedForm && !this.advancedForm.valid) {\n this.advancedForm.markAllAsTouched();\n return;\n }\n // Mescla dados emitidos com quick e always\n const advancedData = event?.formData ?? {};\n const quickPatch = this.quickField ? { [this.quickField]: this.quickControl.value } : {};\n const alwaysData = this.alwaysForm?.getRawValue?.() ?? {};\n // Limpa valores vazios\n const cleaned: Record<string, any> = {};\n const assignClean = (src: Record<string, any>) => {\n Object.keys(src || {}).forEach((k) => {\n const v = (src as any)[k];\n if (v !== '' && v !== null && v !== undefined) cleaned[k] = v;\n });\n };\n assignClean(advancedData);\n assignClean(quickPatch);\n assignClean(alwaysData as any);\n this.dto = cleaned;\n this.activeFiltersCount = Object.keys(this.dto).length;\n this.updateAutoSummary();\n this.submit.emit({ ...this.dto });\n this.persist();\n if (this.mode === 'auto') this.evaluateMode();\n // Fecha o overlay após aplicar\n if (this.advancedOpen) {\n this.closeAdvanced();\n }\n }\n\n private closeAdvanced(): void {\n this.advancedOpen = false;\n this.anchorRef?.elementRef.nativeElement.focus();\n this.saveConfig();\n }\n\n // =============================\n // Auto Summary helpers\n // =============================\n get currentSummary(): any {\n return this.summary ?? this.autoSummaryData;\n }\n\n get currentSummaryMap(): {\n avatar?: (s: any) => string;\n title: (s: any) => string;\n subtitle?: (s: any) => string;\n badges?: Array<(s: any) => string>;\n } | undefined {\n return this.summary ? this.summaryMap : (this.autoSummary ? this.defaultSummaryMap() : this.summaryMap);\n }\n\n private updateAutoSummary(): void {\n if (!this.autoSummary) {\n this.autoSummaryData = undefined;\n return;\n }\n const entries = Object.entries(this.dto);\n if (!entries.length) {\n this.autoSummaryData = undefined;\n return;\n }\n const maxBadges = 6;\n const badges = entries.slice(0, maxBadges).map(([k, v]) => `${k}=${this.formatValueForBadge(v)}`);\n const extra = entries.length > maxBadges ? ` +${entries.length - maxBadges}` : '';\n this.autoSummaryData = {\n count: entries.length,\n dto: { ...this.dto },\n badges,\n title: `${entries.length} filtro${entries.length > 1 ? 's' : ''} ativo${entries.length > 1 ? 's' : ''}` + extra,\n };\n }\n\n private defaultSummaryMap() {\n return {\n title: (s: any) => s?.title || `${s?.count ?? 0} filtro${(s?.count ?? 0) > 1 ? 's' : ''} ativo${(s?.count ?? 0) > 1 ? 's' : ''}`,\n subtitle: (_s: any) => '',\n badges: (this.autoSummaryData?.badges as string[])?.map((b) => (() => b)) ?? [],\n } as {\n title: (s: any) => string;\n subtitle?: (s: any) => string;\n badges?: Array<(s: any) => string>;\n };\n }\n\n private formatValueForBadge(v: any): string {\n if (v === null || v === undefined) return '';\n if (Array.isArray(v)) return v.join(',');\n if (v instanceof Date) return v.toISOString().slice(0, 10);\n if (typeof v === 'object') return JSON.stringify(v);\n return String(v);\n }\n\n // Helper A11y: label do botão Avançado com contagem\n getAdvancedAriaLabel(): string {\n const count = this.activeFiltersCount || 0;\n if (!count) return this.i18nLabels.advanced;\n const plural = count > 1 ? 's' : '';\n return `${this.i18nLabels.advanced}, ${count} filtro${plural} ativo${plural}`;\n }\n\n // =============================\n // Schema verification (ETag) + persistence helpers\n // =============================\n private getSchemaMetaKey(): string {\n const id = this.formId || 'default';\n return `filter-schema-meta:${id}`;\n }\n private getOutdatedIgnoreKey(serverHash: string): string {\n const id = this.formId || 'default';\n return `schemaIgnore:${id}:${serverHash}`;\n }\n private getOutdatedSnoozeKey(serverHash: string): string {\n const id = this.formId || 'default';\n return `schemaSnooze:${id}:${serverHash}`;\n }\n private getOutdatedNotifiedKey(serverHash: string): string {\n const id = this.formId || 'default';\n return `schemaNotified:${id}:${serverHash}`;\n }\n private isOutdatedIgnored(serverHash?: string): boolean {\n if (!serverHash) return false;\n try { return !!this.configStorage.loadConfig<boolean>(this.getOutdatedIgnoreKey(serverHash)); } catch { return false; }\n }\n private getOutdatedSnoozeUntil(serverHash?: string): number | undefined {\n if (!serverHash) return undefined;\n try {\n const v = this.configStorage.loadConfig<string>(this.getOutdatedSnoozeKey(serverHash));\n if (!v) return undefined;\n const t = Date.parse(v);\n return isNaN(t) ? undefined : t;\n } catch { return undefined; }\n }\n private setOutdatedSnooze(serverHash?: string, until?: Date): void {\n if (!serverHash) return;\n try {\n if (!until) {\n this.configStorage.clearConfig(this.getOutdatedSnoozeKey(serverHash));\n } else {\n this.configStorage.saveConfig(this.getOutdatedSnoozeKey(serverHash), until.toISOString());\n }\n } catch {}\n }\n private setOutdatedIgnore(serverHash?: string, val = true): void {\n if (!serverHash) return;\n try {\n if (!val) this.configStorage.clearConfig(this.getOutdatedIgnoreKey(serverHash));\n else this.configStorage.saveConfig(this.getOutdatedIgnoreKey(serverHash), true);\n } catch {}\n }\n private setOutdatedNotified(serverHash?: string): void {\n if (!serverHash) return;\n try { this.configStorage.saveConfig(this.getOutdatedNotifiedKey(serverHash), true); } catch {}\n }\n private wasOutdatedNotified(serverHash?: string): boolean {\n if (!serverHash) return false;\n try { return !!this.configStorage.loadConfig<boolean>(this.getOutdatedNotifiedKey(serverHash)); } catch { return false; }\n }\n\n private async verifyServerSchemaVersion(): Promise<void> {\n try {\n if (!this.resourcePath || !this.formId) return;\n // Build request to /schemas/filtered for filter (path=/.../filter, operation=post, schemaType=request)\n const baseUrl = this.crud.getSchemasFilteredBaseUrl();\n const basePath = (this.crud.schemaUrl() || '').replace(/\\/+$/, '').replace(/\\/schemas$/, '');\n let path = basePath ? `${basePath}/filter` : `/${(this.resourcePath || '').replace(/^\\/+|\\/+$/g, '')}/filter`;\n const u = new URL(baseUrl);\n u.searchParams.set('path', path);\n u.searchParams.set('operation', 'post');\n u.searchParams.set('schemaType', 'request');\n u.searchParams.set('includeInternalSchemas', 'true');\n\n // Load previously persisted meta (serverHash)\n const persistedMeta = (() => { try { return this.configStorage.loadConfig<any>(this.getSchemaMetaKey()); } catch { return undefined; } })();\n const previousHash = (persistedMeta?.serverHash as string | undefined) || this.lastSchemaMeta?.serverHash;\n // If we have no prior hash and no in-memory schema, skip verification to avoid an extra full GET.\n // The initial loadSchema() will fetch the body and persist the hash.\n if (!previousHash && !this.schemaMetas?.length) {\n return;\n }\n const tenant = (() => { try { return this.global.getTenant(); } catch { return undefined; } })();\n const locale = (() => { try { return (typeof navigator !== 'undefined' && navigator.language) ? navigator.language : undefined; } catch { return undefined; } })();\n\n const res = await fetchWithETag({ url: u.toString(), schemaHash: previousHash, tenant, locale });\n const nowIso = new Date().toISOString();\n const metaToSave: any = { ...(persistedMeta || {}) };\n metaToSave.lastVerifiedAt = nowIso;\n\n if (res.status === 304) {\n try { this.configStorage.saveConfig(this.getSchemaMetaKey(), metaToSave); } catch {}\n if (this.schemaOutdated) this.schemaOutdated = false;\n this.schemaStatusChange.emit({ outdated: false, serverHash: metaToSave.serverHash, lastVerifiedAt: metaToSave.lastVerifiedAt, formId: this.formId });\n return;\n }\n\n // status === 200: server hash changed (or first verification without hash). Do not apply schema here.\n const newHash = (res as any).schemaHash as string | undefined;\n metaToSave.serverHash = newHash;\n try { this.configStorage.saveConfig(this.getSchemaMetaKey(), metaToSave); } catch {}\n\n // Only mark outdated when there was a previous base (hash or schemaMetas) and we are in edit mode\n const hadBase = !!previousHash || !!this.schemaMetas?.length;\n this.schemaOutdated = !!(this.editModeEnabled && hadBase);\n this.schemaStatusChange.emit({ outdated: this.schemaOutdated, serverHash: newHash, lastVerifiedAt: metaToSave.lastVerifiedAt, formId: this.formId });\n\n if (this.schemaOutdated) {\n if (this._resolvedPrefs.autoOpenSettingsOnOutdated) {\n this.openSettings();\n } else {\n this.maybeShowOutdatedSnack();\n }\n }\n } catch {\n // ignore verification errors; filter remains functional\n }\n }\n\n private maybeShowOutdatedSnack(): void {\n if (!this.editModeEnabled) return;\n if (this._resolvedPrefs.notifyIfOutdated === 'none') return;\n const serverHash = (this.configStorage.loadConfig<any>(this.getSchemaMetaKey()) || {})?.serverHash as string | undefined;\n if (!serverHash || !this.schemaOutdated) return;\n if (this.isOutdatedIgnored(serverHash)) return;\n const snoozeUntil = this.getOutdatedSnoozeUntil(serverHash) || 0;\n if (snoozeUntil && Date.now() < snoozeUntil) return;\n if (!(this._resolvedPrefs.notifyIfOutdated === 'snackbar' || this._resolvedPrefs.notifyIfOutdated === 'both')) return;\n if (this.wasOutdatedNotified(serverHash)) return;\n try {\n const ref = this.snackBar.open('O schema do servidor mudou.', 'Reconciliar', { duration: 8000 });\n ref.onAction().subscribe(() => {\n this.openSettings();\n });\n ref.afterDismissed().subscribe(() => {\n // Snooze on dismiss\n const until = new Date(Date.now() + Math.max(0, this._resolvedPrefs.snoozeMs || 0));\n this.setOutdatedSnooze(serverHash, until);\n });\n this.setOutdatedNotified(serverHash);\n } catch {}\n }\n\n // =============================================================================\n // STANDALONE QUICK FIELD IMPLEMENTATION - SAFE ISOLATED METHODS\n // =============================================================================\n\n /**\n * Sets up Quick Field creating a control from metadata and wiring it to quickForm.\n * Falls back to generic input if creation fails.\n */\n private async setupQuickField(): Promise<void> {\n // Prevent multiple concurrent setup operations\n if (this.isQuickFieldSetupInProgress) {\n console.debug('[QuickField] Setup already in progress, skipping duplicate call');\n return;\n }\n\n if (!this.quickField || !this.quickFieldMeta) {\n console.warn('[QuickField] Missing required dependencies (quickField or quickFieldMeta), using fallback');\n this.ensureFallbackSetup();\n return;\n }\n\n this.isQuickFieldSetupInProgress = true;\n\n try {\n console.info('[QuickField] Setting up dynamic field:', {\n fieldName: this.quickField,\n controlType: this.quickFieldMeta.controlType\n });\n\n // Create FormControl from metadata using DynamicFormService (preserves validators/updateOn)\n const created = this.dynamicForm.createControlFromMetadata(this.quickFieldMeta as any);\n\n // Remover verificação redundante e fazer cast seguro\n const control = created as FormControl<any>;\n\n const previousControl = this.quickControl;\n this.quickControl = control;\n this.quickFieldMode = 'dynamic';\n\n // Replace control in quickForm\n this.quickForm.removeControl(this.quickField);\n this.quickForm.addControl(this.quickField, control);\n\n if (previousControl && previousControl !== control) {\n console.debug('[QuickField] Replaced previous FormControl reference');\n }\n\n if (this.pendingQuickValue !== undefined) {\n this.applyPendingQuickValue(control);\n }\n\n // Reassinar assinaturas do quickControl com o debounce atual\n this.bindQuickControlChanges();\n } catch (error) {\n console.error('[QuickField] Error setting up dynamic field, falling back to generic input:', error);\n this.setupQuickFieldFallback();\n } finally {\n this.isQuickFieldSetupInProgress = false;\n }\n }\n\n /**\n * Ensures fallback setup happens only once, preventing multiple executions.\n */\n private ensureFallbackSetup(): void {\n if (this.isQuickFieldSetupInProgress) {\n console.debug('[QuickField] Fallback setup skipped - setup already in progress');\n return;\n }\n\n if (this.quickFieldMode === 'fallback') {\n console.debug('[QuickField] Already in fallback mode, skipping duplicate setup');\n return;\n }\n\n this.setupQuickFieldFallback();\n }\n\n /**\n * Fallback method - maintains current behavior with generic string input.\n * This ensures the system continues working even if dynamic creation fails.\n */\n private setupQuickFieldFallback(): void {\n console.info('[QuickField] Using fallback mode with generic string input');\n\n // Use original logic - generic string FormControl\n const previousControl = this.quickControl;\n const newControl = new FormControl<string>('', { nonNullable: true });\n this.quickControl = newControl;\n this.quickFieldMode = 'fallback';\n\n if (this.quickField) {\n this.quickForm.removeControl(this.quickField);\n this.quickForm.addControl(this.quickField, this.quickControl);\n\n if (previousControl && previousControl !== newControl) {\n console.debug('[QuickField] Cleaned up previous FormControl reference in fallback mode');\n }\n\n if (this.pendingQuickValue !== undefined) {\n this.quickControl.setValue(this.pendingQuickValue, { emitEvent: false });\n this.pendingQuickValue = undefined;\n }\n\n // Reassinar assinaturas do quickControl com o debounce atual\n this.bindQuickControlChanges();\n }\n }\n\n /**\n * Applies pending quick value to typed control with proper conversion.\n */\n private applyPendingQuickValue(control: AbstractControl): void {\n if (this.pendingQuickValue === undefined) return;\n\n try {\n const controlType = this.quickFieldMeta?.controlType;\n let convertedValue: any = this.pendingQuickValue;\n\n // Convert value to appropriate type only when necessary\n if ((controlType === FieldControlType.DATE_INPUT || controlType === FieldControlType.DATE_PICKER)) {\n if (typeof convertedValue === 'string') {\n convertedValue = convertedValue ? new Date(convertedValue) : null;\n }\n } else if (controlType === FieldControlType.NUMERIC_TEXT_BOX || controlType === FieldControlType.CURRENCY_INPUT) {\n if (typeof convertedValue === 'string') {\n convertedValue = convertedValue ? parseFloat(convertedValue) : null;\n }\n } else if (controlType === FieldControlType.CHECKBOX) {\n if (typeof convertedValue === 'string') {\n convertedValue = convertedValue === 'true';\n }\n } else if (controlType === FieldControlType.MULTI_SELECT) {\n convertedValue = Array.isArray(convertedValue) ? convertedValue : [convertedValue];\n }\n\n control.setValue(convertedValue, { emitEvent: false });\n console.debug('[QuickField] Applied pending value:', { original: this.pendingQuickValue, converted: convertedValue });\n } catch (error) {\n console.error('[QuickField] Error applying pending value:', error);\n control.setValue(this.pendingQuickValue, { emitEvent: false });\n } finally {\n this.pendingQuickValue = undefined;\n }\n }\n\n // =============================\n // QUICK FIELD UX HELPERS (icon, input type/mode)\n // =============================\n getQuickFieldIcon(): string {\n const type = this.quickFieldMeta?.controlType;\n switch (type) {\n case FieldControlType.DATE_INPUT:\n case FieldControlType.DATE_PICKER:\n return 'event';\n case FieldControlType.NUMERIC_TEXT_BOX:\n return 'pin';\n case FieldControlType.CURRENCY_INPUT:\n return 'payments';\n case FieldControlType.SELECT:\n case FieldControlType.MULTI_SELECT:\n case FieldControlType.AUTO_COMPLETE:\n return 'filter_list';\n case FieldControlType.CHECKBOX:\n return 'check_box';\n default:\n return 'search';\n }\n }\n\n getQuickInputType(): string {\n const type = this.quickFieldMeta?.controlType;\n if (type === FieldControlType.DATE_INPUT || type === FieldControlType.DATE_PICKER) {\n return 'date';\n }\n if (type === FieldControlType.NUMERIC_TEXT_BOX || type === FieldControlType.CURRENCY_INPUT) {\n return 'text'; // keep text to allow custom formatting; using number may block some locales\n }\n return 'text';\n }\n\n getQuickInputMode(): string | null {\n const type = this.quickFieldMeta?.controlType;\n if (type === FieldControlType.NUMERIC_TEXT_BOX || type === FieldControlType.CURRENCY_INPUT) {\n return 'decimal';\n }\n return null;\n }\n\n ngOnDestroy(): void {\n // Clear pending operations\n this.pendingQuickFieldSetup = false;\n this.isViewInitialized = false;\n this.isQuickFieldSetupInProgress = false;\n try { this.resizeObs?.disconnect?.(); } catch {}\n try { this.mutationObs?.disconnect?.(); } catch {}\n\n // Clear any pending quick value\n this.pendingQuickValue = undefined;\n this.quickSub?.unsubscribe();\n this.advancedDebouncedSub?.unsubscribe();\n }\n\n // =============================\n // Tag helpers\n // =============================\n isUserTag(tag: FilterTag): boolean {\n return this.savedTags?.some((t) => t.id === tag.id) ?? false;\n }\n\n applyTag(tag: FilterTag): void {\n if (!tag) return;\n try {\n // Atualiza DTO primeiro\n this.dto = { ...(tag.patch ?? {}) };\n\n // Quick field\n if (this.quickField) {\n const qv = this.dto[this.quickField];\n this.quickControl.setValue(qv ?? '', { emitEvent: false });\n }\n\n // Always visible\n Object.keys(this.dto).forEach((k) => {\n const ctrl = this.alwaysForm.get(k);\n if (ctrl) {\n ctrl.setValue((this.dto as any)[k], { emitEvent: false });\n }\n });\n\n // Advanced form (patch em lote)\n this.advancedForm?.patchValue(this.dto, { emitEvent: false });\n\n // Atualiza contadores/resumo e persiste\n this.activeFiltersCount = Object.keys(this.dto).length;\n this.updateAutoSummary();\n this.persist();\n\n // Dispara busca imediatamente ao aplicar atalho\n this.submit.emit({ ...this.dto });\n if (this.mode === 'auto') this.evaluateMode();\n } catch (err) {\n console.error('PFILTER:applyTag:error', err);\n }\n }\n\n // =============================\n // Quick field fallback input helpers\n // =============================\n onQuickNumericKeypress(event: KeyboardEvent): void {\n const type = this.quickFieldMeta?.controlType;\n const numeric = type === FieldControlType.NUMERIC_TEXT_BOX || type === FieldControlType.CURRENCY_INPUT;\n if (!numeric) return;\n\n const allowedChars = '0123456789.,-';\n const key = event.key;\n const isControl = key.length > 1 || event.ctrlKey || event.metaKey || event.altKey;\n if (isControl) return;\n if (!allowedChars.includes(key)) {\n event.preventDefault();\n }\n }\n\n onQuickBlurFormat(): void {\n const type = this.quickFieldMeta?.controlType;\n const numeric = type === FieldControlType.NUMERIC_TEXT_BOX || type === FieldControlType.CURRENCY_INPUT;\n if (!numeric) return;\n const raw = this.quickControl.value;\n if (typeof raw === 'string') {\n const trimmed = raw.trim();\n this.quickControl.setValue(trimmed, { emitEvent: false });\n }\n }\n\n // =============================\n // Debounce bindings for quick/advanced changes\n // =============================\n private bindQuickControlChanges(): void {\n // Recria a assinatura com o debounce atual\n this.quickSub?.unsubscribe();\n this.quickSub = this.quickControl.valueChanges\n .pipe(debounceTime(this.changeDebounceMs), takeUntilDestroyed(this.destroyRef))\n .subscribe((val) => {\n if (this.quickField) {\n if (val === undefined || val === null || val === '') {\n delete this.dto[this.quickField];\n } else {\n this.dto[this.quickField] = val;\n }\n }\n this.activeFiltersCount = Object.keys(this.dto).length;\n this.updateAutoSummary();\n this.change.emit({ ...this.dto });\n this.persist();\n if (this.mode === 'auto') this.evaluateMode();\n });\n }\n\n private bindAdvancedDebounce(): void {\n this.advancedDebouncedSub?.unsubscribe();\n this.advancedDebouncedSub = this.advancedChange$\n .pipe(debounceTime(this.changeDebounceMs), takeUntilDestroyed(this.destroyRef))\n .subscribe((val) => {\n const data = val ?? {};\n Object.keys(data).forEach((key) => {\n const value = (data as any)[key];\n if (value === undefined || value === null || value === '') {\n delete this.dto[key];\n } else {\n this.dto[key] = value;\n }\n });\n this.activeFiltersCount = Object.keys(this.dto).length;\n this.updateAutoSummary();\n this.change.emit({ ...this.dto });\n this.persist();\n if (this.mode === 'auto') this.evaluateMode();\n });\n }\n\n onSubmit(): void {\n // Throttle simples para evitar submits duplicados em curto intervalo\n const now = Date.now();\n if (now - this.lastSubmitAt < 300) {\n return;\n }\n this.lastSubmitAt = now;\n\n // Impedir submit se o avançado estiver aberto e inválido\n if (this.advancedOpen && this.advancedForm && !this.advancedForm.valid) {\n this.advancedForm.markAllAsTouched();\n return;\n }\n\n this.syncFormsToDto();\n this.activeFiltersCount = Object.keys(this.dto).length;\n this.updateAutoSummary();\n this.submit.emit({ ...this.dto });\n this.persist();\n if (this.mode === 'auto') {\n this.evaluateMode();\n }\n }\n\n onClear(): void {\n this.quickControl.setValue('', { emitEvent: false });\n this.alwaysForm.reset(undefined, { emitEvent: false });\n this.advancedForm?.reset(undefined, { emitEvent: false });\n this.dto = {};\n this.activeFiltersCount = 0;\n this.updateAutoSummary();\n this.clear.emit();\n this.change.emit({});\n this.clearPersisted();\n if (this.mode === 'auto') {\n this.evaluateMode();\n }\n if (this.advancedOpen) {\n this.closeAdvanced();\n }\n }\n\n quickHasValue(): boolean {\n const v = this.quickControl?.value;\n return v !== undefined && v !== null && v !== '';\n }\n\n // (old overlay toggler removed — now handled by unified method below)\n\n // Detecta interações vindas de overlays filhos do Material/CDK (ex.: datepicker, autocomplete, select)\n private isEventFromNestedOverlay(target?: EventTarget | null): boolean {\n try {\n const el = target as HTMLElement | null;\n if (!el) return false;\n return !!el.closest('.cdk-overlay-pane');\n } catch {\n return false;\n }\n }\n\n onOverlayDetach(): void {\n this.advancedOpen = false;\n this.anchorRef?.elementRef.nativeElement.focus();\n this.saveConfig();\n }\n\n // Fecha ao clicar fora do overlay (sem backdrop)\n onOverlayOutsideClick(_event: MouseEvent): void {\n // Ignorar o primeiro outsideClick logo após abrir (mesmo clique que abriu)\n if (Date.now() < this.ignoreOutsideUntil) {\n return;\n }\n // Ignorar cliques disparados por overlays filhos (datepicker, select, autocomplete, timepicker...)\n const target = _event.target as HTMLElement | null;\n if (this.isEventFromNestedOverlay(target)) {\n return;\n }\n if (this.advancedOpen) {\n this.closeAdvanced();\n }\n }\n\n private async openAdvancedModal(): Promise<void> {\n const { FilterFormDialogHostComponent } = await import('./filter-form-dialog-host.component');\n const ref = this.dialog.open(FilterFormDialogHostComponent, {\n width: '780px',\n maxWidth: '96vw',\n data: {\n formId: this.formId,\n resourcePath: this.resourcePath,\n config: this.advancedConfig,\n schemaLoading: this.schemaLoading,\n },\n });\n const result = await ref.afterClosed().toPromise();\n if (result && result.formData) {\n // reuse merge-and-submit logic\n this.onAdvancedSubmit({ formData: result.formData });\n }\n }\n\n private async openAdvancedDrawer(): Promise<void> {\n if (!this.filterDrawerAdapter) {\n await this.openAdvancedModal();\n return;\n }\n const initialDto = this.advancedForm?.getRawValue?.() || this.dto || {};\n this.filterDrawerAdapter.open({\n resourcePath: this.resourcePath,\n formId: this.formId,\n config: this.advancedConfig,\n initialDto,\n title: 'Filtro Avançado',\n onSubmit: (formData: Record<string, any>) => this.onAdvancedSubmit({ formData }),\n onClose: () => {\n // no-op; host controls drawer lifecycle\n },\n });\n }\n\n toggleAdvanced(): void {\n if (this.advancedOpenMode === 'overlay') {\n this.advancedOpen = !this.advancedOpen;\n if (this.advancedOpen) {\n // Prepare overlay origin and compute width\n this.overlayOrigin = this.anchorRef;\n this.updateOverlayWidth();\n // On-demand schema fetch for advanced panel\n if (!this.schemaMetas && !this.schemaLoading) {\n this.loadSchema();\n }\n }\n this.saveConfig();\n return;\n }\n if (this.advancedOpenMode === 'modal') {\n if (!this.schemaMetas && !this.schemaLoading) this.loadSchema();\n this.openAdvancedModal();\n return;\n }\n if (this.advancedOpenMode === 'drawer') {\n if (!this.schemaMetas && !this.schemaLoading) this.loadSchema();\n this.openAdvancedDrawer();\n return;\n }\n }\n\n private saveConfig(): void {\n const config: FilterConfig = {\n quickField: this.quickField,\n alwaysVisibleFields: this.alwaysVisibleFields,\n placeholder: this.placeholder,\n showAdvanced: this.advancedOpen,\n mode: this.mode,\n allowSaveTags: this.allowSaveTags,\n changeDebounceMs: this.changeDebounceMs,\n placeBooleansInActions: this.placeBooleansInActions,\n showToggleLabels: this.showToggleLabels,\n alwaysMinWidth: this.alwaysMinWidth,\n alwaysColsMd: this.alwaysColsMd,\n alwaysColsLg: this.alwaysColsLg,\n autoSummary: this.autoSummary,\n confirmTagDelete: this.confirmTagDelete,\n debugLayout: this.debugLayout,\n tagColor: this.tagColor,\n tagVariant: this.tagVariant,\n tagButtonColor: this.tagButtonColor,\n actionsButtonColor: this.actionsButtonColor,\n actionsVariant: this.actionsVariant,\n overlayVariant: this.overlayVariant,\n overlayBackdrop: this.overlayBackdrop,\n advancedOpenMode: this.advancedOpenMode,\n };\n this.filterConfig.save(this.configKey, config);\n }\n\n private mergeI18n(): void {\n this.i18nLabels = {\n ...DEFAULT_I18N,\n ...(this.placeholder ? { searchPlaceholder: this.placeholder } : {}),\n ...this.i18n,\n };\n }\n\n private persist(): void {\n const key = this.persistenceKey ?? this.configKey;\n if (key) {\n this.configStorage.saveConfig(key, this.dto);\n }\n }\n\n private clearPersisted(): void {\n const key = this.persistenceKey ?? this.configKey;\n if (key) {\n this.configStorage.clearConfig(key);\n }\n }\n\n private persistTags(): void {\n if (this.allowSaveTags) {\n this.configStorage.saveConfig(`${this.configKey}:tags`, this.savedTags);\n }\n }\n\n private syncFormsToDto(): void {\n // Mescla os valores dos forms (quick, always, advanced) no DTO\n const quickPatch = this.quickField ? { [this.quickField]: this.quickControl.value } : {};\n const alwaysData = this.alwaysForm?.getRawValue?.() ?? {};\n const advancedData = this.advancedForm?.getRawValue?.() ?? {};\n this.dto = {\n ...this.dto,\n ...quickPatch,\n ...alwaysData,\n ...advancedData,\n };\n }\n\n onQuickClear(): void {\n this.quickControl.setValue('');\n }\n\n private updateDisplayedTags(): void {\n this.displayedTags = [...(this.tags ?? []), ...this.savedTags];\n }\n\n private evaluateMode(): void {\n const prev = this.modeState;\n if (this.mode === 'filter' || this.mode === 'card') {\n this.modeState = this.mode;\n } else {\n const hasSummary = !!this.summary || (this.autoSummary && this.activeFiltersCount > 0);\n this.modeState = hasSummary ? 'card' : 'filter';\n }\n if (this.modeState !== prev) {\n if (this.modeState === 'card') {\n this.advancedOpen = false;\n }\n this.modeChange.emit(this.modeState);\n }\n }\n\n @HostListener('document:keydown', ['$event'])\n onGlobalKeydown(event: KeyboardEvent): void {\n try {\n // Atalho: \"/\" foca o quick, exceto quando já está digitando em um campo\n if (event.key === '/' && !event.altKey && !event.ctrlKey && !event.metaKey) {\n const target = event.target as HTMLElement | null;\n if (!this.isEditableElement(target)) {\n event.preventDefault();\n this.focusQuick();\n return;\n }\n }\n } catch {\n // ignora erros de foco\n }\n }\n\n private isEditableElement(el?: HTMLElement | null): boolean {\n if (!el) return false;\n const tag = (el.tagName || '').toLowerCase();\n if (tag === 'input' || tag === 'textarea' || tag === 'select') return true;\n if ((el as any).isContentEditable) return true;\n return false;\n }\n\n private focusQuick(): void {\n try {\n const host = this.anchorRef?.elementRef?.nativeElement as HTMLElement | undefined;\n if (!host) return;\n const focusable = host.querySelector(\n 'input, textarea, select, [contenteditable=\"true\"], .mat-mdc-select-trigger'\n ) as HTMLElement | null;\n if (focusable && typeof focusable.focus === 'function') {\n focusable.focus();\n } else if (typeof (host as any).focus === 'function') {\n (host as any).focus();\n }\n } catch {\n // no-op\n }\n }\n}\n","<ng-container *ngIf=\"modeState === 'filter'; else summaryCard\">\n <mat-progress-bar *ngIf=\"saving\" mode=\"indeterminate\"></mat-progress-bar>\n\n <form class=\"praxis-filter-bar\" [class.is-open]=\"advancedOpen\" (submit)=\"onSubmit(); $event.preventDefault()\">\n <!-- QUICK FIELD -->\n <div class=\"quick-field\" *ngIf=\"quickFieldMeta; else fallbackQuick\">\n <div class=\"filter-anchor quick-shell\" #anchorRef=\"cdkOverlayOrigin\" cdkOverlayOrigin>\n\n <!-- dinâmico: envolvido por host para garantir layout flex correto -->\n <div *ngIf=\"quickFieldMode === 'dynamic'\" class=\"quick-field-host\" #quickHostRef\n dynamicFieldLoader\n [fields]=\"quickFieldMetaArray\"\n [formGroup]=\"quickForm\"\n (componentsCreated)=\"onQuickComponents($event)\"\n (fieldCreated)=\"onQuickFieldCreated($event)\">\n </div>\n\n <!-- fallback (com meta) — sem suffix, só o input -->\n <mat-form-field *ngIf=\"quickFieldMode === 'fallback'\"\n appearance=\"outline\"\n floatLabel=\"always\"\n class=\"fallback-quick-field\">\n <mat-label>{{ quickFieldMeta.label || quickField }}</mat-label>\n <input matInput [formControl]=\"quickControl\"\n [type]=\"getQuickInputType()\"\n [attr.inputmode]=\"getQuickInputMode()\"\n [attr.aria-label]=\"quickFieldMeta.label || quickField\"\n (keydown.escape)=\"onQuickClear()\"\n (keypress)=\"onQuickNumericKeypress($event)\"\n (blur)=\"onQuickBlurFormat()\">\n </mat-form-field>\n\n \n </div>\n </div>\n\n\n <!-- QUICK “falso” (quando não há meta) -->\n <ng-template #fallbackQuick>\n <div class=\"filter-anchor quick-shell\" #anchorRef=\"cdkOverlayOrigin\" cdkOverlayOrigin>\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"fallback-quick-field\">\n <mat-label>{{ i18nLabels.searchPlaceholder }}</mat-label>\n <input matInput [formControl]=\"quickControl\"\n [attr.aria-label]=\"i18nLabels.searchPlaceholder\"\n (keydown.escape)=\"onQuickClear()\" />\n </mat-form-field>\n </div>\n </ng-template>\n\n <!-- AÇÕES INLINE (fixas à direita da barra) -->\n <div class=\"inline-actions\" [class.actions-outlined]=\"actionsVariant==='outlined'\">\n <!-- Toggles/booleans simples realocados para a barra de ações -->\n <div class=\"inline-toggles\" *ngIf=\"toggleMetas.length\">\n <ng-container dynamicFieldLoader [fields]=\"toggleMetas\" [formGroup]=\"alwaysForm\"\n (componentsCreated)=\"onToggleComponents($event)\"></ng-container>\n </div>\n <button mat-icon-button [color]=\"actionsButtonColor==='basic'? null : actionsButtonColor\" type=\"button\" *ngIf=\"quickHasValue()\"\n (click)=\"onQuickClear()\" [attr.aria-label]=\"i18nLabels.clear\">\n <mat-icon [praxisIcon]=\"'close'\"></mat-icon>\n </button>\n <button mat-icon-button [color]=\"actionsButtonColor==='basic'? null : actionsButtonColor\" type=\"button\" (click)=\"onSubmit()\" [attr.aria-label]=\"i18nLabels.apply\">\n <mat-icon [praxisIcon]=\"'search'\"></mat-icon>\n </button>\n <button mat-icon-button [color]=\"actionsButtonColor==='basic'? null : actionsButtonColor\" type=\"button\"\n [matBadge]=\"activeFiltersCount\"\n [matBadgeHidden]=\"!activeFiltersCount\"\n matBadgeSize=\"small\"\n matBadgeColor=\"primary\"\n [matBadgeOverlap]=\"false\"\n (click)=\"toggleAdvanced()\"\n [attr.aria-label]=\"getAdvancedAriaLabel()\"\n [attr.aria-expanded]=\"advancedOpen\"\n [attr.aria-controls]=\"advancedPanelId\">\n <mat-icon [praxisIcon]=\"'tune'\"></mat-icon>\n </button>\n <button mat-icon-button [color]=\"actionsButtonColor==='basic'? null : actionsButtonColor\" type=\"button\" (click)=\"openSettings()\" *ngIf=\"showFilterSettings\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"schemaOutdated ? 'Schema do servidor mudou — Reconciliar' : i18nLabels.settings\"\n matTooltipPosition=\"below\">\n <mat-icon [praxisIcon]=\"'settings'\"></mat-icon>\n </button>\n </div>\n\n <!-- campos sempre visíveis (se houver) -->\n <div class=\"always-fields\" *ngIf=\"alwaysVisibleMetas.length\">\n <ng-container dynamicFieldLoader [fields]=\"alwaysVisibleMetas\" [formGroup]=\"alwaysForm\"\n (componentsCreated)=\"onAlwaysComponents($event)\"></ng-container>\n </div>\n\n <!-- acessibilidade -->\n <span class=\"sr-only\" aria-live=\"polite\">\n {{ activeFiltersCount ? (activeFiltersCount + ' filtros ativos') : '' }}\n </span>\n <button type=\"submit\" class=\"hidden-submit\" aria-hidden=\"true\" tabindex=\"-1\"></button>\n </form>\n\n <!-- tags -->\n <div class=\"praxis-filter-tags\" *ngIf=\"displayedTags.length\" [class.outlined]=\"tagVariant==='outlined'\">\n <mat-chip-set>\n <mat-chip *ngFor=\"let tag of displayedTags\"\n [color]=\"tagColor === 'basic' ? null : tagColor\"\n (click)=\"applyTag(tag)\" (keydown.enter)=\"applyTag(tag)\"\n tabindex=\"0\" role=\"button\">\n <ng-container *ngIf=\"editingTagId !== tag.id; else editChip\">\n <span class=\"chip-label\">{{ tag.label }}</span>\n <span class=\"chip-actions\" *ngIf=\"isUserTag(tag)\">\n <button mat-icon-button [color]=\"tagButtonColor === 'basic' ? null : tagButtonColor\"\n (click)=\"startEditTag(tag, $event)\" aria-label=\"edit tag\">\n <mat-icon>edit</mat-icon>\n </button>\n <button mat-icon-button [color]=\"tagButtonColor === 'basic' ? null : tagButtonColor\"\n (click)=\"deleteTag(tag)\" aria-label=\"remove tag\">\n <mat-icon>close</mat-icon>\n </button>\n </span>\n </ng-container>\n <ng-template #editChip>\n <input matInput class=\"chip-editor\" [formControl]=\"editingTagLabel\"\n (keydown.enter)=\"commitEditTag(tag, $event)\" (keydown.escape)=\"cancelEditTag($event)\" (click)=\"$event.stopPropagation()\" />\n <button mat-button color=\"primary\" (click)=\"commitEditTag(tag, $event)\">{{ i18nLabels.save }}</button>\n <button mat-button (click)=\"cancelEditTag($event)\">{{ i18nLabels.cancel }}</button>\n </ng-template>\n </mat-chip>\n </mat-chip-set>\n </div>\n\n <!-- OVERLAY -->\n <ng-container *ngIf=\"overlayOrigin\">\n <ng-template cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"overlayOrigin!\"\n [cdkConnectedOverlayOpen]=\"advancedOpen\"\n [cdkConnectedOverlayHasBackdrop]=\"overlayBackdrop\"\n [cdkConnectedOverlayBackdropClass]=\"'praxis-overlay-backdrop'\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayOffsetY]=\"8\"\n [cdkConnectedOverlayLockPosition]=\"true\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n [cdkConnectedOverlayPanelClass]=\"['praxis-filter-overlay', isMobile ? 'mobile' : '', overlayVariant === 'frosted' ? 'frosted' : '']\"\n (overlayOutsideClick)=\"onOverlayOutsideClick($event)\"\n (backdropClick)=\"onOverlayDetach()\"\n (detach)=\"onOverlayDetach()\">\n <div class=\"praxis-filter-advanced\" (keydown.escape)=\"toggleAdvanced()\" role=\"dialog\" aria-modal=\"true\" [attr.id]=\"advancedPanelId\">\n <div class=\"advanced-body\">\n <mat-progress-bar *ngIf=\"schemaLoading\" mode=\"indeterminate\"></mat-progress-bar>\n <p *ngIf=\"schemaError\" class=\"schema-error\">\n {{ i18nLabels.errorLoadingFilters }}\n <button mat-button type=\"button\" (click)=\"loadSchema()\">{{ i18nLabels.retry }}</button>\n </p>\n <praxis-filter-form *ngIf=\"!schemaLoading && !schemaError && advancedConfig\"\n [formId]=\"formId\" [resourcePath]=\"resourcePath\" [mode]=\"'edit'\" [config]=\"advancedConfig\"\n (formReady)=\"onAdvancedReady($event)\" (valueChange)=\"onAdvancedChange($event)\"\n (validityChange)=\"onAdvancedValidityChange($event)\" (submit)=\"onAdvancedSubmit($event)\">\n </praxis-filter-form>\n <p *ngIf=\"!schemaLoading && !schemaError && !advancedConfig\">{{ i18nLabels.noData }}</p>\n </div>\n <div class=\"advanced-actions\" *ngIf=\"!schemaLoading && !schemaError && advancedConfig\">\n <button mat-raised-button color=\"primary\" type=\"button\"\n (click)=\"onAdvancedSubmit({ formData: (advancedForm?.getRawValue?.() || {}) })\"\n [disabled]=\"!advancedValid\">\n {{ i18nLabels.apply }}\n </button>\n <button mat-button type=\"button\" (click)=\"onClear()\">{{ i18nLabels.clear }}</button>\n </div>\n </div>\n </ng-template>\n </ng-container>\n</ng-container>\n\n<!-- resumo -->\n<ng-template #summaryCard>\n <div class=\"praxis-filter-card\" (keydown.escape)=\"onClear()\">\n <div class=\"summary-header\">\n <img *ngIf=\"currentSummaryMap?.avatar?.(currentSummary)\" [src]=\"currentSummaryMap?.avatar?.(currentSummary)\"\n class=\"summary-avatar\" alt=\"\" />\n <div class=\"summary-text\">\n <div class=\"summary-title\">{{ currentSummaryMap?.title?.(currentSummary) || '' }}</div>\n <div class=\"summary-subtitle\" *ngIf=\"currentSummaryMap?.subtitle\">{{ currentSummaryMap?.subtitle?.(currentSummary) }}</div>\n </div>\n </div>\n <div class=\"summary-badges\" *ngIf=\"currentSummaryMap?.badges?.length\">\n <span *ngFor=\"let b of currentSummaryMap!.badges\">{{ b(currentSummary) }}</span>\n </div>\n <div class=\"card-actions\">\n <button mat-button type=\"button\" (click)=\"switchToFilter()\">{{ i18nLabels.edit }}</button>\n <button mat-button type=\"button\" (click)=\"onClear()\">{{ i18nLabels.clear }}</button>\n </div>\n </div>\n</ng-template>\n","import { Injectable } from '@angular/core';\nimport { TableConfig, createDefaultTableConfig, GlobalConfigService, fillUndefined } from '@praxisui/core';\n\n/**\n * Provides default table configurations.\n * Applications may override this service to supply product or tenant-specific defaults.\n */\n@Injectable({ providedIn: 'root' })\nexport class TableDefaultsProvider {\n constructor(private readonly global: GlobalConfigService) {}\n /**\n * Returns default configuration for a given table identifier.\n * @param tableId Table identifier\n */\n getDefaults(tableId: string): TableConfig {\n const base = createDefaultTableConfig();\n const g = this.global.getTable();\n // Ensure proper typing: treat global table config as Partial<TableConfig>\n return g ? fillUndefined<TableConfig>(base, g as Partial<TableConfig>) : base;\n }\n}\n","import {\n AfterContentInit,\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ElementRef,\n EventEmitter,\n Inject,\n Input,\n OnInit,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatTableDataSource, MatTableModule } from '@angular/material/table';\nimport {\n MatPaginator,\n MatPaginatorModule,\n PageEvent,\n} from '@angular/material/paginator';\nimport { MatSort, MatSortModule, Sort } from '@angular/material/sort';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatBadgeModule } from '@angular/material/badge';\n// import { MatDialog, MatDialogModule } from '@angular/material/dialog';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { BehaviorSubject, take, Subscription } from 'rxjs';\nimport { SettingsPanelService } from '@praxisui/settings-panel';\nimport {\n ColumnDefinition,\n FieldDefinition,\n GenericCrudService,\n BatchDeleteProgress,\n BatchDeleteResult,\n Page,\n PageableRequest,\n TableConfig,\n createDefaultTableConfig,\n CONFIG_STORAGE,\n ConfigStorage,\n CONNECTION_STORAGE,\n ConnectionStorage,\n fillUndefined,\n} from '@praxisui/core';\nimport { PraxisTableToolbar } from './praxis-table-toolbar';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { EmptyStateCardComponent, ResourceQuickConnectComponent } from '@praxisui/core';\nimport { PraxisTableConfigEditor } from './praxis-table-config-editor';\nimport { DataFormattingService } from './data-formatter/data-formatting.service';\nimport { ColumnDataType } from './data-formatter/data-formatter-types';\nimport { TableDefaultsProvider } from './services/table-defaults.provider';\nimport { FilterConfigService } from './services/filter-config.service';\nimport { PraxisFilter, I18n } from './components/praxis-filter';\nimport { SpecificationBridgeService } from '@praxisui/visual-builder';\nimport { getActionId, ActionLike } from './utils/action-utils';\nimport { PraxisDialog } from '@praxisui/dialog';\nimport { fetchWithETag } from '@praxisui/core';\nimport { GlobalConfigService } from '@praxisui/core';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\n\nexport interface RowActionConfig extends ActionLike {\n /**\n * Identifier of the action. Historically this property was named `id`\n * in some configurations, so both `action` and `id` are supported.\n */\n icon: string;\n label?: string;\n priority?: number;\n alwaysInline?: boolean;\n visible?: (row: any) => boolean;\n disabled?: (row: any) => boolean;\n autoDelete?: boolean;\n requiresConfirmation?: boolean;\n}\n\nexport interface RowActionsBehavior {\n enabled: boolean;\n maxInline:\n | number\n | { xs: number; sm: number; md: number; lg: number }\n | 'auto';\n autoStrategy?: 'measure' | 'breakpoint';\n}\n\n@Component({\n selector: 'praxis-table',\n standalone: true,\n imports: [\n CommonModule,\n MatTableModule,\n MatButtonModule,\n MatPaginatorModule,\n MatSortModule,\n MatIconModule,\n MatMenuModule,\n MatTooltipModule,\n MatSnackBarModule,\n MatCheckboxModule,\n MatBadgeModule,\n ScrollingModule,\n PraxisTableToolbar,\n PraxisFilter,\n PraxisIconDirective,\n EmptyStateCardComponent,\n ],\n templateUrl: './praxis-table.html',\n styleUrls: ['./praxis-table.scss'],\n host: { '[class.debug-layout]': 'debugLayout' },\n})\nexport class PraxisTable\n implements OnInit, OnChanges, AfterViewInit, AfterContentInit, OnDestroy\n{\n @Input() config: TableConfig = createDefaultTableConfig();\n @Input() resourcePath?: string;\n @Input() filterCriteria: any = {};\n /** Controls outdated schema notifications visibility and channel (only effective in edit mode) */\n @Input() notifyIfOutdated: 'inline' | 'snackbar' | 'both' | 'none' = 'both';\n /** Snooze duration for schema outdated notifications (ms), only in edit mode */\n @Input() snoozeMs = 24 * 60 * 60 * 1000; // 24h\n /** Auto open settings when schema is detected as outdated (only in edit mode) */\n @Input() autoOpenSettingsOnOutdated = false;\n /** Controls toolbar visibility */\n @Input() showToolbar = false;\n /** Enables new toolbar layout */\n @Input() toolbarV2 = true;\n\n /** Habilita exclusão automática */\n @Input() autoDelete = false;\n\n /** Enable edit mode */\n @Input() editModeEnabled = false;\n\n /** Dense mode reduces cell padding */\n @Input() dense = false;\n\n /** Identifier used for settings storage */\n @Input() tableId = 'default';\n /** Habilita visual de debug para alinhamento/layouot */\n @Input() debugLayout = false;\n /** Contexto opcional quando tabela está dentro do componente CRUD */\n @Input() crudContext?: {\n tableId: string;\n resourcePath?: string;\n defaults?: {\n openMode?: 'modal' | 'route';\n modal?: Record<string, any>;\n back?: Record<string, any>;\n };\n actions?: Array<{\n action: string;\n label?: string;\n formId?: string;\n route?: string;\n openMode?: 'modal' | 'route';\n }>;\n /** Nome do campo usado como identificador primário (default: 'id') */\n idField?: string;\n };\n /** Nome do campo usado como identificador primário (default: 'id'). Tem precedência sobre crudContext.idField. */\n @Input() idField?: string;\n\n @Output() rowClick = new EventEmitter<{ row: any; index: number }>();\n @Output() rowAction = new EventEmitter<{ action: string; row: any }>();\n @Output() toolbarAction = new EventEmitter<{ action: string }>();\n @Output() bulkAction = new EventEmitter<{ action: string; rows: any[] }>();\n /** Emits on row double click according to behavior config */\n @Output() rowDoubleClick = new EventEmitter<{ action: string; row: any }>();\n /** Emits whenever schema outdated state changes (can be used by host) */\n @Output() schemaStatusChange = new EventEmitter<{ outdated: boolean; serverHash?: string; lastVerifiedAt?: string; resourcePath?: string }>();\n\n @Output() beforeDelete = new EventEmitter<any>();\n @Output() afterDelete = new EventEmitter<any>();\n @Output() deleteError = new EventEmitter<{ row: any; error: unknown }>();\n\n @Output() beforeBulkDelete = new EventEmitter<any[]>();\n @Output() afterBulkDelete = new EventEmitter<any[]>();\n @Output() bulkDeleteError = new EventEmitter<{\n rows: any[];\n error: unknown;\n }>();\n\n @ViewChild(MatPaginator) paginator?: MatPaginator;\n @ViewChild(MatSort) sort?: MatSort;\n @ViewChild('actionsHeaderCell') actionsHeaderCell?: ElementRef<HTMLElement>;\n\n @ContentChild(PraxisFilter) projectedFilter?: PraxisFilter;\n\n dataSource = new MatTableDataSource<any>();\n displayedColumns: string[] = [];\n visibleColumns: ColumnDefinition[] = [];\n private dataSubject = new BehaviorSubject<any[]>([]);\n selection = new SelectionModel<any>(true, []);\n private pageIndex = 0;\n private pageSize = 5;\n private sortState: Sort = { active: '', direction: '' };\n private hasInitialized = false;\n private breakpoints = { xs: 0, sm: 600, md: 960, lg: 1280 };\n private measuredInline = 0;\n private resizeObserver?: ResizeObserver;\n readonly getActionId = getActionId;\n\n // Row menu icon helpers (customizable via config.actions.row.menuIcon and optional menuButtonColor)\n getRowMenuIcon(): string {\n try {\n return this.config.actions?.row?.menuIcon || 'more_vert';\n } catch {\n return 'more_vert';\n }\n }\n getRowMenuButtonColor(): string | undefined {\n try {\n // Allow color override without strict typing changes\n const rowCfg: any = this.config.actions?.row as any;\n const c = rowCfg?.menuButtonColor;\n return c === 'basic' ? undefined : c || undefined;\n } catch {\n return undefined;\n }\n }\n\n // Actions header helpers\n getActionsHeaderAlign(): 'start' | 'center' | 'end' {\n try {\n return (this.config.actions?.row as any)?.header?.align || 'end';\n } catch {\n return 'end';\n }\n }\n getActionsHeaderLabel(): string | undefined {\n try {\n return (this.config.actions?.row as any)?.header?.label || undefined;\n } catch {\n return undefined;\n }\n }\n getActionsHeaderIcon(): string | undefined {\n try {\n return (this.config.actions?.row as any)?.header?.icon || undefined;\n } catch {\n return undefined;\n }\n }\n getActionsHeaderTooltip(): string | undefined {\n try {\n return (this.config.actions?.row as any)?.header?.tooltip || undefined;\n } catch {\n return undefined;\n }\n }\n\n // Cache precompilado para expressões de regras visuais (DSL → Specification)\n private styleSpecCache = new Map<string, any>();\n\n // Lightweight error state to expose CTA when backend/schema fails\n schemaError = false;\n dataError = false;\n errorMessage: string | null = null;\n // True when the server reports a new schema hash; UI may propose reconciliation\n schemaOutdated = false;\n // Resolved preferences (inputs → global fallback)\n private _resolvedPrefs: { notifyIfOutdated: 'inline'|'snackbar'|'both'|'none'; snoozeMs: number; autoOpenSettingsOnOutdated: boolean } = {\n notifyIfOutdated: 'both',\n snoozeMs: 24 * 60 * 60 * 1000,\n autoOpenSettingsOnOutdated: false,\n };\n\n private resolveSchemaPrefs(): void {\n const DEFAULTS = { notifyIfOutdated: 'both' as const, snoozeMs: 24 * 60 * 60 * 1000, autoOpenSettingsOnOutdated: false };\n let out = {\n notifyIfOutdated: (this.notifyIfOutdated as any) ?? DEFAULTS.notifyIfOutdated,\n snoozeMs: typeof this.snoozeMs === 'number' ? this.snoozeMs : DEFAULTS.snoozeMs,\n autoOpenSettingsOnOutdated: !!this.autoOpenSettingsOnOutdated,\n };\n const inputsAreDefaults = (this.notifyIfOutdated === DEFAULTS.notifyIfOutdated) && (this.snoozeMs === DEFAULTS.snoozeMs) && (this.autoOpenSettingsOnOutdated === DEFAULTS.autoOpenSettingsOnOutdated);\n if (inputsAreDefaults) {\n try {\n const g = this.global.getSchemaPrefsGlobal?.();\n if (g && typeof g === 'object') {\n out = {\n notifyIfOutdated: (g.notifyIfOutdated as any) ?? out.notifyIfOutdated,\n snoozeMs: (typeof g.snoozeMs === 'number' ? g.snoozeMs : out.snoozeMs),\n autoOpenSettingsOnOutdated: (typeof g.autoOpenSettingsOnOutdated === 'boolean' ? g.autoOpenSettingsOnOutdated : out.autoOpenSettingsOnOutdated),\n };\n }\n } catch {}\n }\n this._resolvedPrefs = out;\n }\n\n private getOutdatedIgnoreKey(serverHash: string): string {\n const id = this.tableId || 'default';\n return `schemaIgnore:${id}:${serverHash}`;\n }\n private getOutdatedSnoozeKey(serverHash: string): string {\n const id = this.tableId || 'default';\n return `schemaSnooze:${id}:${serverHash}`;\n }\n private getOutdatedNotifiedKey(serverHash: string): string {\n const id = this.tableId || 'default';\n return `schemaNotified:${id}:${serverHash}`;\n }\n\n private isOutdatedIgnored(serverHash?: string): boolean {\n if (!serverHash) return false;\n try { return !!this.configStorage.loadConfig<boolean>(this.getOutdatedIgnoreKey(serverHash)); } catch { return false; }\n }\n private getOutdatedSnoozeUntil(serverHash?: string): number | undefined {\n if (!serverHash) return undefined;\n try {\n const v = this.configStorage.loadConfig<string>(this.getOutdatedSnoozeKey(serverHash));\n if (!v) return undefined;\n const t = Date.parse(v);\n return isNaN(t) ? undefined : t;\n } catch { return undefined; }\n }\n private setOutdatedSnooze(serverHash?: string, until?: Date): void {\n if (!serverHash) return;\n try {\n if (!until) {\n this.configStorage.clearConfig(this.getOutdatedSnoozeKey(serverHash));\n } else {\n this.configStorage.saveConfig(this.getOutdatedSnoozeKey(serverHash), until.toISOString());\n }\n } catch {}\n }\n private setOutdatedIgnore(serverHash?: string, val = true): void {\n if (!serverHash) return;\n try {\n if (!val) this.configStorage.clearConfig(this.getOutdatedIgnoreKey(serverHash));\n else this.configStorage.saveConfig(this.getOutdatedIgnoreKey(serverHash), true);\n } catch {}\n }\n private setOutdatedNotified(serverHash?: string): void {\n if (!serverHash) return;\n try { this.configStorage.saveConfig(this.getOutdatedNotifiedKey(serverHash), true); } catch {}\n }\n private wasOutdatedNotified(serverHash?: string): boolean {\n if (!serverHash) return false;\n try { return !!this.configStorage.loadConfig<boolean>(this.getOutdatedNotifiedKey(serverHash)); } catch { return false; }\n }\n\n shouldShowOutdatedInline(): boolean {\n if (!this.editModeEnabled) return false;\n if (this._resolvedPrefs.notifyIfOutdated === 'none') return false;\n const serverHash = (this.config?.meta as any)?.serverHash as string | undefined;\n if (!serverHash) return false;\n if (!this.schemaOutdated) return false;\n if (this.isOutdatedIgnored(serverHash)) return false;\n const snoozeUntil = this.getOutdatedSnoozeUntil(serverHash) || 0;\n if (snoozeUntil && Date.now() < snoozeUntil) return false;\n return this._resolvedPrefs.notifyIfOutdated === 'inline' || this._resolvedPrefs.notifyIfOutdated === 'both';\n }\n\n private maybeShowOutdatedSnack(): void {\n if (!this.editModeEnabled) return;\n if (this._resolvedPrefs.notifyIfOutdated === 'none') return;\n const serverHash = (this.config?.meta as any)?.serverHash as string | undefined;\n if (!serverHash || !this.schemaOutdated) return;\n if (this.isOutdatedIgnored(serverHash)) return;\n const snoozeUntil = this.getOutdatedSnoozeUntil(serverHash) || 0;\n if (snoozeUntil && Date.now() < snoozeUntil) return;\n if (!(this._resolvedPrefs.notifyIfOutdated === 'snackbar' || this._resolvedPrefs.notifyIfOutdated === 'both')) return;\n if (this.wasOutdatedNotified(serverHash)) return;\n // Single-action snackbar: primary action = Reconciliar; dismiss = Lembrar depois\n try {\n const ref = this.snackBar.open('O schema do servidor mudou.', 'Reconciliar', { duration: 8000 });\n ref.onAction().subscribe(() => {\n this.onReconcileRequested();\n });\n ref.afterDismissed().subscribe(() => {\n // Snooze on dismiss\n const until = new Date(Date.now() + Math.max(0, this._resolvedPrefs.snoozeMs || 0));\n const hash = (this.config?.meta as any)?.serverHash as string | undefined;\n this.setOutdatedSnooze(hash, until);\n this.schemaOutdated = false;\n this.schemaStatusChange.emit({ outdated: false, serverHash: hash, lastVerifiedAt: (this.config?.meta as any)?.lastVerifiedAt, resourcePath: this.resourcePath });\n this.cdr.markForCheck();\n });\n this.setOutdatedNotified(serverHash);\n } catch {}\n }\n\n // Inline banner handlers\n onReconcileRequested(): void {\n this.schemaStatusChange.emit({ outdated: true, serverHash: (this.config?.meta as any)?.serverHash, lastVerifiedAt: (this.config?.meta as any)?.lastVerifiedAt, resourcePath: this.resourcePath });\n // Optional auto open settings first; otherwise just open settings\n this.openTableSettings();\n }\n onIgnoreOutdated(): void {\n const hash = (this.config?.meta as any)?.serverHash as string | undefined;\n this.setOutdatedIgnore(hash, true);\n this.schemaOutdated = false;\n this.schemaStatusChange.emit({ outdated: false, serverHash: hash, lastVerifiedAt: (this.config?.meta as any)?.lastVerifiedAt, resourcePath: this.resourcePath });\n this.cdr.markForCheck();\n }\n onSnoozeOutdated(): void {\n const hash = (this.config?.meta as any)?.serverHash as string | undefined;\n const until = new Date(Date.now() + Math.max(0, this.snoozeMs || 0));\n this.setOutdatedSnooze(hash, until);\n this.schemaOutdated = false; // hide inline banner for now\n this.schemaStatusChange.emit({ outdated: false, serverHash: hash, lastVerifiedAt: (this.config?.meta as any)?.lastVerifiedAt, resourcePath: this.resourcePath });\n this.cdr.markForCheck();\n }\n\n toggleRow(row: any): void {\n this.selection.toggle(row);\n }\n\n masterToggle(): void {\n if (this.isAllSelected()) {\n this.selection.clear();\n } else {\n this.dataSource.data.forEach((row) => this.selection.select(row));\n }\n }\n\n isAllSelected(): boolean {\n const numSelected = this.selection.selected.length;\n const numRows = this.dataSource.data.length;\n return numSelected === numRows;\n }\n private isOverflowEnabled(): boolean {\n return this.config.actions?.row?.behavior?.enabled !== false;\n }\n\n private getMaxInline(): number {\n if (!this.isOverflowEnabled()) {\n return Number.MAX_SAFE_INTEGER;\n }\n const behavior = this.config.actions?.row?.behavior;\n const defaults = { xs: 1, sm: 2, md: 3, lg: 4 };\n const maxInline = behavior?.maxInline ?? defaults;\n if (maxInline === 'auto') {\n if (behavior?.autoStrategy === 'measure') {\n return this.measuredInline || this.getBreakpointMaxInline(defaults);\n }\n return this.getBreakpointMaxInline(defaults);\n }\n if (typeof maxInline === 'number') {\n return maxInline;\n }\n // Merge with defaults to ensure all properties are defined\n const breakpointConfig = {\n xs: maxInline.xs ?? defaults.xs,\n sm: maxInline.sm ?? defaults.sm,\n md: maxInline.md ?? defaults.md,\n lg: maxInline.lg ?? defaults.lg,\n };\n return this.getBreakpointMaxInline(breakpointConfig);\n }\n\n private getBreakpointMaxInline(b: {\n xs: number;\n sm: number;\n md: number;\n lg: number;\n }): number {\n const w = window.innerWidth;\n if (w >= this.breakpoints.lg) {\n return b.lg;\n }\n if (w >= this.breakpoints.md) {\n return b.md;\n }\n if (w >= this.breakpoints.sm) {\n return b.sm;\n }\n return b.xs;\n }\n\n private sortByPriority(actions: any[]): any[] {\n return [...actions].sort(\n (a, b) => (a.priority ?? 100) - (b.priority ?? 100),\n );\n }\n\n isActionVisible(a: any, row: any): boolean {\n return typeof a.visible === 'function'\n ? !!a.visible(row)\n : a.visible !== false;\n }\n\n isActionDisabled(a: any, row: any): boolean {\n return typeof a.disabled === 'function' ? !!a.disabled(row) : !!a.disabled;\n }\n\n trackAction = (_: number, a: RowActionConfig) => this.getActionId(a);\n\n getInlineRowActions(row: any): any[] {\n // If display is 'menu', render no inline actions\n if ((this.config.actions?.row?.display as any) === 'menu') {\n return [];\n }\n const actions = this.sortByPriority(\n this.config.actions?.row?.actions ?? [],\n ).filter((a) => this.isActionVisible(a, row));\n const fixed = actions.filter((a) => a.alwaysInline);\n const remaining = actions.filter((a) => !a.alwaysInline);\n if (!this.isOverflowEnabled()) {\n return [...fixed, ...remaining];\n }\n const max = Math.max(0, this.getMaxInline() - fixed.length);\n return [...fixed, ...remaining.slice(0, max)];\n }\n\n getOverflowRowActions(row: any): any[] {\n if (!this.isOverflowEnabled()) {\n return [];\n }\n const actions = this.sortByPriority(\n this.config.actions?.row?.actions ?? [],\n ).filter((a) => this.isActionVisible(a, row));\n\n const inline = this.getInlineRowActions(row).map((a) =>\n this.getActionId(a),\n );\n return actions.filter((a) => !inline.includes(this.getActionId(a)));\n }\n\n hasOverflowRowActions(row: any): boolean {\n return (\n this.isOverflowEnabled() && this.getOverflowRowActions(row).length > 0\n );\n }\n\n private updateMeasuredInline(): void {\n if (!this.actionsHeaderCell) {\n return;\n }\n const width = this.actionsHeaderCell.nativeElement.offsetWidth;\n const iconWidth = this.dense ? 40 : 48;\n this.measuredInline = Math.floor(width / iconWidth);\n }\n\n private setupResizeObserver(): void {\n const behavior = this.config.actions?.row?.behavior;\n if (\n behavior?.maxInline === 'auto' &&\n behavior?.autoStrategy === 'measure' &&\n this.actionsHeaderCell\n ) {\n this.resizeObserver = new ResizeObserver(() =>\n this.updateMeasuredInline(),\n );\n this.resizeObserver.observe(this.actionsHeaderCell.nativeElement);\n this.updateMeasuredInline();\n }\n }\n\n private subscriptions: Subscription[] = [];\n private getIdField(): string {\n // Precedence: @Input → crudContext.idField → config.meta.idField → service.getResourceIdField() → 'id'\n const fromInput = (this.idField as string) || (this.crudContext?.idField as string);\n const fromConfig = (this.config?.meta as any)?.idField as string | undefined;\n const fromService = this.crudService?.getResourceIdField?.();\n return (fromInput || fromConfig || fromService || 'id') as string;\n }\n\n // =============================\n // Virtualization helpers\n // =============================\n isVirtualized(): boolean {\n return !!this.config.behavior?.virtualization?.enabled;\n }\n getVirtItemHeight(): number { return this.config.behavior?.virtualization?.itemHeight ?? 44; }\n getVirtBufferSize(): number { return this.config.behavior?.virtualization?.bufferSize ?? 10; }\n getVirtMinHeight(): number | string | undefined { return (this.config.behavior?.virtualization?.minContainerHeight as any) ?? undefined; }\n getVirtMinHeightStyle(): string | null { const v = this.getVirtMinHeight(); if (v == null) return null; return typeof v === 'number' ? `${v}px` : (v as string); }\n trackByRow = (index: number, row: any) => this.getRowId(row) ?? index;\n\n private getRowId(row: any): string | number | undefined {\n if (!row) return undefined;\n const key = this.getIdField();\n let id = row[key];\n if (id == null && key !== 'id') {\n id = row['id'];\n }\n // Basic heuristics fallback to common keys\n if (id == null) {\n const candidates = ['_id', 'uuid', 'codigo', 'code'];\n for (const c of candidates) { if (row[c] != null) { id = row[c]; break; } }\n }\n return id as any;\n }\n\n constructor(\n private crudService: GenericCrudService<any>,\n private cdr: ChangeDetectorRef,\n private settingsPanel: SettingsPanelService,\n private formattingService: DataFormattingService,\n private specBridge: SpecificationBridgeService,\n @Inject(CONFIG_STORAGE) private configStorage: ConfigStorage,\n @Inject(CONNECTION_STORAGE) private connectionStorage: ConnectionStorage,\n private tableDefaultsProvider: TableDefaultsProvider,\n private snackBar: MatSnackBar,\n private filterConfig: FilterConfigService,\n private pxDialog: PraxisDialog,\n private hostRef: ElementRef<HTMLElement>,\n private global: GlobalConfigService,\n ) {\n this.subscriptions.push(\n this.dataSubject.subscribe((data) => {\n this.dataSource.data = data;\n this.selection.clear();\n try {\n if (Array.isArray(data) && data.length) {\n // Lightweight debug to help diagnose column→data mapping issues\n const sample = data[0];\n const cols = this.visibleColumns.map((c) => c.field);\n if (this.isDebug()) {\n console.debug('[PraxisTable] Data loaded', {\n rows: data.length,\n columns: cols,\n sampleKeys: Object.keys(sample || {}),\n });\n }\n } else {\n if (this.isDebug()) {\n console.debug('[PraxisTable] Data loaded: empty page');\n }\n }\n } catch {}\n }),\n );\n }\n\n openQuickConnect(): void {\n const ref = this.settingsPanel.open({\n id: `table-quick-connect:${this.tableId}`,\n title: 'Conectar à fonte de dados',\n content: {\n component: ResourceQuickConnectComponent,\n inputs: { resourcePath: this.resourcePath },\n },\n });\n const apply = (v: any) => {\n const path = (v?.resourcePath as string || '').trim();\n if (!path) return;\n this.resourcePath = path;\n this.saveConnection('quick-connect');\n this.schemaError = false;\n this.dataError = false;\n this.errorMessage = null;\n this.crudService.configure(this.resourcePath);\n if ((this.config?.columns?.length ?? 0) > 0) {\n this.verifyServerSchemaVersion().catch(() => {});\n } else {\n this.loadSchema();\n }\n this.fetchData();\n this.cdr.markForCheck();\n };\n ref.applied$.subscribe(apply);\n ref.saved$.subscribe(apply);\n }\n\n ngOnInit(): void {\n // Resolve global fallback for schema prefs\n this.resolveSchemaPrefs();\n // Load persisted connection if not provided via input\n if (!this.resourcePath && this.tableId) {\n const saved = this.connectionStorage.loadConnection(this.connectionKey());\n if (saved?.resourcePath) {\n this.resourcePath = saved.resourcePath;\n try {\n this.crudService.configure(this.resourcePath);\n // If we already have columns configured, verify server hash without blocking UI; otherwise load schema to bootstrap columns\n if ((this.config?.columns?.length ?? 0) > 0) {\n this.verifyServerSchemaVersion().catch(() => {});\n } else {\n this.loadSchema();\n }\n } catch {}\n }\n }\n const storedConfig = this.configStorage.loadConfig<TableConfig>(\n `table-config:${this.tableId}`,\n );\n if (storedConfig) {\n this.config = storedConfig;\n }\n // Apply global defaults as fallback only for missing properties\n try {\n const defaults = this.tableDefaultsProvider.getDefaults(this.tableId);\n this.config = fillUndefined(this.config, defaults);\n } catch {}\n this.showToolbar = !!(\n this.config.toolbar?.visible ||\n this.config.behavior?.filtering?.advancedFilters?.enabled\n );\n if (this.isDebug()) {\n console.debug('[PraxisTable] Toolbar visibility on init', this.showToolbar);\n }\n }\n\n ngAfterContentInit(): void {\n if (this.config) {\n this.setupColumns();\n this.applyDefaultSortIfNone();\n if (this.resourcePath && !this.hasInitialized) {\n this.fetchData();\n }\n }\n this.hasInitialized = true;\n this.applyAppearanceVariables();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // Ensure CRUD service is configured before any fetch\n let configuredThisChange = false;\n if (changes['resourcePath'] && this.resourcePath) {\n // Reset error flags on resourcePath change\n this.schemaError = false;\n this.dataError = false;\n this.errorMessage = null;\n this.saveConnection('input');\n this.crudService.configure(this.resourcePath);\n // If columns already exist, verify server hash; otherwise load schema to generate columns\n if ((this.config?.columns?.length ?? 0) > 0) {\n this.verifyServerSchemaVersion().catch(() => {});\n } else {\n this.loadSchema();\n }\n configuredThisChange = true;\n // Only fetch data if this is not the first change (handled by ngAfterContentInit)\n // or if the component has already been initialized\n if (!changes['resourcePath'].firstChange || this.hasInitialized) {\n this.fetchData();\n }\n }\n\n if (changes['config'] && this.config) {\n // On external config changes, fill missing values from global defaults\n try {\n const defaults = this.tableDefaultsProvider.getDefaults(this.tableId);\n this.config = fillUndefined(this.config, defaults);\n } catch {}\n this.setupColumns();\n this.applyDefaultSortIfNone();\n // Avoid fetching twice in same cycle when resourcePath also changed\n if (this.resourcePath && !configuredThisChange) {\n this.fetchData();\n // If we have columns, kick a background verification when config changes externally\n if ((this.config?.columns?.length ?? 0) > 0) {\n this.verifyServerSchemaVersion().catch(() => {});\n }\n }\n this.showToolbar = !!(\n this.config.toolbar?.visible ||\n this.config.behavior?.filtering?.advancedFilters?.enabled\n );\n if (this.isDebug()) {\n console.debug(\n '[PraxisTable] Toolbar visibility on config change',\n this.showToolbar,\n );\n }\n }\n\n if (changes['filterCriteria'] && this.resourcePath) {\n this.fetchData();\n }\n\n this.applyDataSourceSettings();\n this.applyAppearanceVariables();\n if (changes['notifyIfOutdated'] || changes['snoozeMs'] || changes['autoOpenSettingsOnOutdated']) {\n this.resolveSchemaPrefs();\n }\n }\n\n private isDebug(): boolean {\n try {\n return (\n this.debugLayout ||\n (typeof window !== 'undefined' && (window as any).DEBUG_PTABLE === true)\n );\n } catch {\n return this.debugLayout;\n }\n }\n\n private connectionKey(): string {\n return `conn:table:${this.tableId || 'default'}`;\n }\n\n private saveConnection(origin: 'input' | 'quick-connect' | 'editor'): void {\n const rp = (this.resourcePath || '').trim();\n if (!rp) return;\n const key = this.connectionKey();\n const prev = this.connectionStorage.loadConnection(key);\n if (prev?.resourcePath === rp) return;\n this.connectionStorage.saveConnection(key, {\n resourcePath: rp,\n version: 1,\n updatedAt: new Date().toISOString(),\n origin,\n });\n }\n\n disconnect(): void {\n try {\n this.connectionStorage.clearConnection(this.connectionKey());\n } catch {}\n this.resourcePath = '';\n this.schemaError = false;\n this.dataError = false;\n this.errorMessage = null;\n this.dataSubject.next([]);\n this.cdr.detectChanges();\n }\n\n ngAfterViewInit(): void {\n this.applyDataSourceSettings();\n this.setupResizeObserver();\n this.applyDefaultSortIfNone();\n }\n\n onPageChange(event: PageEvent): void {\n this.pageIndex = event.pageIndex;\n this.pageSize = event.pageSize;\n if (this.resourcePath) {\n this.fetchData();\n }\n }\n\n onSortChange(event: Sort): void {\n this.sortState = event;\n // Reset to first page when sorting changes (server-side paging)\n this.pageIndex = 0;\n if (this.resourcePath) {\n this.fetchData();\n }\n }\n\n onRowClicked(row: any, index: number): void {\n console.debug('[PraxisTable] onRowClicked', { index, rowId: row?.id });\n this.rowClick.emit({ row, index });\n }\n\n onRowDoubleClicked(row: any, index: number): void {\n try {\n const cfg = this.config.behavior?.interaction?.rowDoubleClick;\n if (!cfg?.enabled) return;\n const action = (cfg.action || 'view') as 'edit'|'view'|'custom';\n const actId = action === 'custom' ? (cfg.customAction || 'custom') : action;\n console.debug('[PraxisTable] onRowDoubleClicked', { index, action: actId, rowId: this.getRowId(row) });\n this.rowDoubleClick.emit({ action: actId, row });\n } catch {}\n }\n\n onRowAction(action: string, row: any, event: Event): void {\n console.debug('[PraxisTable] onRowAction: click received', {\n action,\n rowId: row?.id,\n target: (event?.target as HTMLElement)?.tagName,\n });\n event.stopPropagation();\n (event.target as HTMLElement).blur?.();\n\n const cfg = this.config.actions?.row?.actions.find(\n (a) => this.getActionId(a) === action,\n );\n const cfgAutoDelete = cfg?.autoDelete;\n const willAutoDelete =\n action === 'delete' && !!(this.autoDelete || cfgAutoDelete);\n const requiresConfirmation =\n cfg?.requiresConfirmation || (action === 'delete' && willAutoDelete);\n\n console.debug('[PraxisTable] onRowAction: resolved config', {\n foundConfig: !!cfg,\n cfgAutoDelete,\n inputAutoDelete: this.autoDelete,\n willAutoDelete,\n requiresConfirmation,\n });\n\n if (requiresConfirmation) {\n this.showConfirmDialog(action, row, cfg, willAutoDelete);\n } else if (willAutoDelete) {\n this.executeDeleteAction(row);\n } else {\n console.debug('[PraxisTable] onRowAction: emitting rowAction', {\n action,\n rowId: row?.id,\n });\n this.rowAction.emit({ action, row });\n }\n }\n\n private showConfirmDialog(\n action: string,\n row: any,\n cfg: any,\n willAutoDelete: boolean,\n ): void {\n const isDelete = action === 'delete';\n const title = isDelete ? 'Confirmar Exclusão' : `Confirmar ${cfg?.label || action}`;\n // Prefer messages from TableConfig when available (configured via editor)\n const confirmMsgs = this.config?.messages?.actions?.confirmations as any;\n const message = isDelete\n ? (confirmMsgs?.delete || 'Tem certeza que deseja excluir este registro? Esta ação não pode ser desfeita.')\n : (confirmMsgs?.[action] || `Tem certeza que deseja executar a ação \"${cfg?.label || action}\"?`);\n\n // Debug logs to diagnose message resolution\n try {\n console.debug('[PraxisTable] Dialog: confirmation message resolution', {\n action,\n isDelete,\n hasMessages: !!this.config?.messages,\n hasActionsMessages: !!this.config?.messages?.actions,\n hasConfirmations: !!this.config?.messages?.actions?.confirmations,\n confirmations: this.config?.messages?.actions?.confirmations,\n resolvedTitle: title,\n resolvedMessage: message,\n });\n } catch {}\n\n const overrides = ((this.config as any)?.dialogs?.confirm?.delete ?? {}) as any;\n // Build local config only with defined overrides so global presets remain intact\n const localCfg: any = {\n title,\n message,\n // Allow ESC and cancel to close by default; can be overridden via overrides.disableClose\n };\n // Apply common overrides supported by PraxisDialog\n const copyIf = (k: string) => {\n const v = (overrides as any)[k];\n if (v != null && v !== '') (localCfg as any)[k] = v;\n };\n // Dimensions\n copyIf('width');\n copyIf('height');\n copyIf('minWidth');\n copyIf('maxWidth');\n copyIf('minHeight');\n copyIf('maxHeight');\n // Visual\n copyIf('themeColor');\n copyIf('actionsLayout');\n // Animation and style objects\n if (overrides.animation && Object.keys(overrides.animation).length) localCfg.animation = overrides.animation;\n if (overrides.styles && Object.keys(overrides.styles).length) localCfg.styles = overrides.styles;\n // Overlay classes and position\n copyIf('backdropClass');\n copyIf('panelClass');\n copyIf('position');\n copyIf('hasBackdrop');\n copyIf('zIndex');\n // Behavior\n if (overrides.disableClose != null) localCfg.disableClose = !!overrides.disableClose;\n\n try {\n console.debug('[PraxisTable] Dialog: final config for confirm', {\n localCfg,\n });\n } catch {}\n // Use the standard 'question' profile for confirmation prompts\n const ref = this.pxDialog.confirm(localCfg, 'question');\n\n ref.afterClosed().subscribe((result) => {\n if (result) {\n if (willAutoDelete) {\n this.executeDeleteAction(row);\n } else {\n console.debug(\n '[PraxisTable] onRowAction: confirmed, emitting rowAction',\n { action, rowId: row?.id },\n );\n this.rowAction.emit({ action, row });\n }\n } else {\n console.debug('[PraxisTable] onRowAction: action cancelled by user', {\n action,\n rowId: row?.id,\n });\n }\n });\n }\n\n private executeDeleteAction(row: any): void {\n const id = this.getRowId(row);\n if (id == null) {\n console.error('[PraxisTable] executeDeleteAction: missing id for row', { rowSampleKeys: Object.keys(row || {}), idField: this.getIdField() });\n try { this.snackBar.open('ID do registro não encontrado para exclusão', undefined, { duration: 3000 }); } catch {}\n return;\n }\n try {\n this.beforeDelete.emit(row);\n console.debug('[PraxisTable] executeDeleteAction: beforeDelete emitted', {\n rowId: id,\n });\n } catch (e) {\n console.warn(\n '[PraxisTable] executeDeleteAction: beforeDelete emit error',\n e,\n );\n }\n\n const progressMsg = this.config.messages?.actions?.progress?.delete || 'Removendo...';\n try {\n console.debug('[PraxisTable] Delete: progress/success/error message resolution', {\n progress: this.config.messages?.actions?.progress,\n success: this.config.messages?.actions?.success,\n errors: this.config.messages?.actions?.errors,\n resolved: {\n progress: progressMsg,\n success: this.config.messages?.actions?.success?.delete || 'Registro removido',\n error: this.config.messages?.actions?.errors?.delete || 'Erro ao remover',\n },\n });\n } catch {}\n this.snackBar.open(progressMsg);\n console.debug('[PraxisTable] executeDeleteAction: calling crudService.delete', { id });\n this.crudService.delete(id as any).subscribe({\n next: () => {\n console.debug('[PraxisTable] executeDeleteAction: delete success', {\n id,\n });\n this.snackBar.open(this.config.messages?.actions?.success?.delete || 'Registro removido', undefined, { duration: 3000 });\n try {\n this.afterDelete.emit(row);\n console.debug(\n '[PraxisTable] executeDeleteAction: afterDelete emitted',\n { id },\n );\n } catch (e) {\n console.warn(\n '[PraxisTable] executeDeleteAction: afterDelete emit error',\n e,\n );\n }\n this.fetchData();\n },\n error: (error) => {\n console.error('[PraxisTable] executeDeleteAction: delete error', {\n id,\n error,\n });\n this.snackBar.open(this.config.messages?.actions?.errors?.delete || 'Erro ao remover', undefined, { duration: 3000 });\n try {\n this.deleteError.emit({ row, error });\n } catch (e) {\n console.warn(\n '[PraxisTable] executeDeleteAction: deleteError emit error',\n e,\n );\n }\n },\n });\n }\n\n onToolbarAction(event: { action: string }): void {\n console.debug('[PraxisTable] onToolbarAction received', event);\n const bulk = this.config.actions?.bulk?.actions.find(\n (a) => this.getActionId(a) === event.action,\n );\n if (bulk) {\n if (event.action === 'delete' && (this.autoDelete || bulk.autoDelete)) {\n const rows = this.selection.selected.slice();\n const ids = rows.map((r) => this.getRowId(r)).filter((v) => v != null) as any[];\n console.debug('[PraxisTable] onToolbarAction: bulk delete requested', {\n count: rows.length,\n ids,\n });\n this.beforeBulkDelete.emit(rows);\n const progress = (e: BatchDeleteProgress) => {\n this.snackBar.open(\n (this.config.messages?.actions?.progress?.deleteMultiple ||\n 'Removendo...') + ` ${e.index}/${e.total}`,\n undefined,\n { duration: 1000 },\n );\n };\n this.crudService.deleteMany(ids, { progress }).subscribe({\n next: (result: BatchDeleteResult) => {\n console.debug(\n '[PraxisTable] onToolbarAction: bulk delete result',\n result,\n );\n if (result.errors.length) {\n this.snackBar.open(\n this.config.messages?.actions?.errors?.delete ||\n 'Erro ao remover',\n undefined,\n { duration: 3000 },\n );\n const failedIds = new Set(result.errors.map((e) => e.id));\n const failedRows = rows.filter((r) => failedIds.has(r.id));\n this.selection.clear();\n failedRows.forEach((r) => this.selection.select(r));\n this.bulkDeleteError.emit({\n rows: failedRows,\n error: result.errors,\n });\n } else {\n this.snackBar.open(\n this.config.messages?.actions?.success?.delete ||\n 'Registros removidos',\n undefined,\n { duration: 3000 },\n );\n this.afterBulkDelete.emit(rows);\n this.selection.clear();\n }\n this.fetchData();\n },\n error: (error) => {\n console.error(\n '[PraxisTable] onToolbarAction: bulk delete error',\n error,\n );\n this.snackBar.open(\n this.config.messages?.actions?.errors?.delete ||\n 'Erro ao remover',\n undefined,\n { duration: 3000 },\n );\n this.bulkDeleteError.emit({ rows, error });\n },\n });\n } else {\n console.debug('[PraxisTable] onToolbarAction: emitting bulkAction', {\n action: event.action,\n selected: this.selection.selected.length,\n });\n this.bulkAction.emit({\n action: event.action,\n rows: this.selection.selected,\n });\n }\n } else {\n console.debug(\n '[PraxisTable] onToolbarAction: emitting toolbarAction',\n event,\n );\n this.toolbarAction.emit(event);\n }\n }\n\n onAdvancedFilterSubmit(criteria: Record<string, any>): void {\n this.filterCriteria = criteria || {};\n if (this.resourcePath) {\n this.fetchData();\n }\n }\n\n onAdvancedFilterClear(): void {\n this.filterCriteria = {};\n if (this.resourcePath) {\n this.fetchData();\n }\n }\n\n openTableSettings(): void {\n try {\n console.debug('[PraxisTable] Opening table settings', {\n tableId: this.tableId,\n config: this.config,\n });\n\n const configCopy = JSON.parse(JSON.stringify(this.config)) as TableConfig;\n const panelInputs: any = {\n tableConfig: configCopy,\n resourcePath: this.resourcePath,\n idField: this.getIdField(),\n serverIdField: this.crudService.getResourceIdField?.(),\n serverSchemaInfo: this.crudService.getLastSchemaInfo(),\n crudContext: this.crudContext\n ? { ...this.crudContext, tableId: this.tableId, resourcePath: this.resourcePath }\n : undefined,\n };\n\n const ref = this.settingsPanel.open({\n id: `table.${this.tableId}`,\n title: 'Configurações da Tabela',\n content: { component: PraxisTableConfigEditor, inputs: panelInputs },\n });\n\n this.subscriptions.push(\n ref.applied$.subscribe((val: any) => {\n const cfg = val as any;\n if (!cfg) return;\n console.debug('[PraxisTable] Applied config', cfg);\n const newResourcePath = (cfg.__resourcePath__ as string) || '';\n const newIdField = (cfg.__idField__ as string) || '';\n if (newResourcePath && newResourcePath !== this.resourcePath) {\n this.resourcePath = newResourcePath;\n this.crudService.configure(this.resourcePath);\n if ((this.config?.columns?.length ?? 0) > 0) {\n this.verifyServerSchemaVersion().catch(() => {});\n } else {\n this.loadSchema();\n }\n this.fetchData();\n }\n if (newIdField && newIdField !== this.idField) {\n this.idField = newIdField;\n }\n // Persistir em memória no TableConfig.meta com idField resolvido (mesmo se usuário não alterou)\n const metaApply: any = { ...(cfg.meta || {}) };\n const resolvedIdApply = this.getIdField();\n if (resolvedIdApply) metaApply.idField = resolvedIdApply;\n if (!metaApply.version) metaApply.version = '2.0.0';\n const nowApply = new Date().toISOString();\n if (!metaApply.createdAt) metaApply.createdAt = nowApply;\n metaApply.updatedAt = nowApply;\n const infoApply = this.crudService.getLastSchemaInfo();\n if (infoApply?.schemaId) metaApply.schemaId = infoApply.schemaId;\n if (infoApply?.schemaHash) metaApply.serverHash = infoApply.schemaHash;\n cfg.meta = metaApply;\n // Remove internal marker before saving/applying\n if ('__resourcePath__' in cfg) delete cfg.__resourcePath__;\n if ('__idField__' in cfg) delete cfg.__idField__;\n this.applyTableConfig(cfg as TableConfig);\n }),\n ref.saved$.subscribe((val: any) => {\n const cfg = val as any;\n if (!cfg) return;\n console.debug('[PraxisTable] Saved config', cfg);\n const newResourcePath = (cfg.__resourcePath__ as string) || '';\n const newIdField = (cfg.__idField__ as string) || '';\n if (newResourcePath && newResourcePath !== this.resourcePath) {\n this.resourcePath = newResourcePath;\n this.crudService.configure(this.resourcePath);\n if ((this.config?.columns?.length ?? 0) > 0) {\n this.verifyServerSchemaVersion().catch(() => {});\n } else {\n this.loadSchema();\n }\n this.fetchData();\n }\n if (newIdField && newIdField !== this.idField) {\n this.idField = newIdField;\n }\n // Persistir meta no JSON salvo (sempre definir idField resolvido)\n const metaSave: any = { ...(cfg.meta || {}) };\n if (!metaSave.version) metaSave.version = '2.0.0';\n const now = new Date().toISOString();\n if (!metaSave.createdAt) metaSave.createdAt = now;\n metaSave.updatedAt = now;\n const info = this.crudService.getLastSchemaInfo();\n if (info?.schemaId) metaSave.schemaId = info.schemaId;\n if (info?.schemaHash) metaSave.serverHash = info.schemaHash;\n const resolvedIdSave = this.getIdField();\n if (resolvedIdSave) metaSave.idField = resolvedIdSave;\n cfg.meta = metaSave;\n if ('__resourcePath__' in cfg) delete cfg.__resourcePath__;\n if ('__idField__' in cfg) delete cfg.__idField__;\n this.configStorage.saveConfig(`table-config:${this.tableId}`, cfg as TableConfig);\n this.applyTableConfig(cfg as TableConfig);\n }),\n ref.reset$.subscribe(() => {\n console.debug('[PraxisTable] Resetting to default config');\n try { this.configStorage.clearConfig(`table-config:${this.tableId}`); } catch {}\n try { this.filterConfig.save(`${this.tableId}-filter`, {} as any); } catch {}\n const defaults = this.tableDefaultsProvider.getDefaults(this.tableId);\n this.applyTableConfig(defaults);\n }),\n );\n } catch (error) {\n console.error('[PraxisTable] Error opening table settings', error);\n }\n }\n\n private applyTableConfig(cfg: TableConfig): void {\n console.debug('[PraxisTable] Applying table config', cfg);\n this.config = { ...cfg };\n const filterSettings =\n cfg.behavior?.filtering?.advancedFilters?.settings ?? {};\n this.filterConfig.save(`${this.tableId}-filter`, filterSettings);\n this.showToolbar = !!(\n cfg.toolbar?.visible || cfg.behavior?.filtering?.advancedFilters?.enabled\n );\n console.debug(\n '[PraxisTable] Toolbar visibility after apply',\n this.showToolbar,\n );\n this.setupColumns();\n this.applyAppearanceVariables();\n this.applyDataSourceSettings();\n if (this.resourcePath) {\n this.fetchData();\n }\n this.cdr.detectChanges();\n }\n\n onResetPreferences(): void {\n try { this.configStorage.clearConfig(`table-config:${this.tableId}`); } catch {}\n try { this.filterConfig.save(`${this.tableId}-filter`, {} as any); } catch {}\n const defaults = this.tableDefaultsProvider.getDefaults(this.tableId);\n this.applyTableConfig(defaults);\n try { this.snackBar.open('Preferências de tabela redefinidas', undefined, { duration: 2000 }); } catch {}\n }\n\n private applyDataSourceSettings(): void {\n const paginationStrategy = this.config.behavior?.pagination?.strategy ?? 'client';\n const sortingStrategy = this.config.behavior?.sorting?.strategy ?? 'client';\n const isServerPaging = paginationStrategy === 'server';\n const isServerSorting = sortingStrategy === 'server';\n\n if (this.paginator) {\n this.paginator.length = this.getPaginationLength();\n // Only connect MatTableDataSource paginator when doing client-side paging\n this.dataSource.paginator = isServerPaging ? null : this.paginator;\n }\n if (this.sort) {\n // Only connect MatTableDataSource sorting when doing client-side sort\n this.dataSource.sort = isServerSorting ? null : this.sort;\n }\n }\n\n private setupColumns(): void {\n const columns = this.config.columns || [];\n this.visibleColumns = columns\n .filter((c) => c.visible !== false)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n this.displayedColumns = this.visibleColumns.map((c) => c.field);\n if (this.config.behavior?.selection?.enabled) {\n this.displayedColumns.unshift('_select');\n }\n if (this.config.actions?.row?.enabled) {\n this.displayedColumns.push('_actions');\n }\n }\n\n private applyDefaultSortIfNone(): void {\n try {\n if (this.sortState && this.sortState.active) return;\n const ds = this.config?.behavior?.sorting?.defaultSort as any;\n if (!ds) return;\n const entry = Array.isArray(ds) ? ds[0] : ds;\n if (!entry?.column || !entry?.direction) return;\n const dir = (entry.direction === 'asc' || entry.direction === 'desc') ? entry.direction : 'asc';\n this.sortState = { active: entry.column, direction: dir as any };\n if (this.sort) {\n (this.sort as any).active = entry.column;\n (this.sort as any).direction = dir;\n try { (this.sort.sortChange as any).emit({ active: entry.column, direction: dir }); } catch {}\n }\n } catch {}\n }\n\n /**\n * Performs a lightweight server schema verification using ETag/If-None-Match without\n * downloading or storing the schema body. Updates config.meta (serverHash/lastVerifiedAt)\n * and toggles schemaOutdated when a new hash is detected.\n */\n private async verifyServerSchemaVersion(): Promise<void> {\n try {\n if (!this.resourcePath) return;\n // Only verify when we already have columns configured (bootstrap handled by loadSchema)\n if ((this.config?.columns?.length ?? 0) === 0) return;\n\n // Build request to /schemas/filtered for grid (path=/.../all, operation=get, schemaType=response)\n const baseUrl = this.crudService.getSchemasFilteredBaseUrl();\n let derived = '';\n try { derived = this.crudService.schemaUrl().replace(/\\/schemas$/, ''); } catch { return; }\n const u = new URL(baseUrl);\n u.searchParams.set('path', `${derived}/all`);\n u.searchParams.set('operation', 'get');\n u.searchParams.set('schemaType', 'response');\n u.searchParams.set('includeInternalSchemas', 'false');\n\n const serverHash = (this.config?.meta as any)?.serverHash as string | undefined;\n const tenant = (() => { try { return this.global.getTenant(); } catch { return undefined; } })();\n const locale = (() => { try { return (typeof navigator !== 'undefined' && navigator.language) ? navigator.language : undefined; } catch { return undefined; } })();\n\n const res = await fetchWithETag({ url: u.toString(), schemaHash: serverHash, tenant, locale });\n const nowIso = new Date().toISOString();\n\n const meta: any = { ...(this.config?.meta || {}) };\n if (!meta.version) meta.version = '2.0.0';\n if (!meta.createdAt) meta.createdAt = nowIso;\n meta.lastVerifiedAt = nowIso;\n\n if (res.status === 304) {\n // Only update lastVerifiedAt and persist (keep using existing columns)\n this.config.meta = meta;\n try { this.configStorage.saveConfig(`table-config:${this.tableId}`, this.config); } catch {}\n // Keep outdated false and emit status\n if (this.schemaOutdated) {\n this.schemaOutdated = false;\n }\n this.schemaStatusChange.emit({ outdated: false, serverHash: (this.config?.meta as any)?.serverHash, lastVerifiedAt: meta.lastVerifiedAt, resourcePath: this.resourcePath });\n return;\n }\n\n // status === 200: server hash changed (or first verification without hash). Do not apply columns here.\n meta.serverHash = (res as any).schemaHash;\n this.config.meta = meta;\n this.schemaOutdated = !!this.editModeEnabled; // only notify in edit mode\n try { this.configStorage.saveConfig(`table-config:${this.tableId}`, this.config); } catch {}\n this.schemaStatusChange.emit({ outdated: this.schemaOutdated, serverHash: meta.serverHash, lastVerifiedAt: meta.lastVerifiedAt, resourcePath: this.resourcePath });\n // Notifications only if edit mode\n if (this.schemaOutdated) {\n if (this._resolvedPrefs.autoOpenSettingsOnOutdated) {\n this.openTableSettings();\n } else {\n this.maybeShowOutdatedSnack();\n }\n }\n } catch {\n // ignore verification errors; table remains functional with existing config\n }\n }\n\n private loadSchema(): void {\n this.crudService\n .getSchema()\n .pipe(take(1))\n .subscribe({\n next: (fields: FieldDefinition[]) => {\n this.schemaError = false;\n // Se idField não foi definido via inputs/contexto, tentar derivar do schema (x-ui.resource.idField)\n try {\n const derived = (this.idField as string) || (this.crudContext?.idField as string) || (this.config?.meta as any)?.idField || this.crudService.getResourceIdField();\n if (derived && (!this.idField || this.idField === 'id')) {\n this.idField = derived as any;\n }\n // Alertar divergência entre config.meta.idField e o idField vindo do serviço\n const cfgId = (this.config?.meta as any)?.idField as string | undefined;\n const svcId = this.crudService.getResourceIdField();\n if (cfgId && svcId && cfgId !== svcId) {\n try { this.snackBar.open('Aviso: idField do TableConfig diverge do servidor', undefined, { duration: 4000 }); } catch {}\n console.warn('[PraxisTable] Divergência idField', { config: cfgId, server: svcId });\n }\n } catch {}\n // Atualizar metadados de schema (schemaId/serverHash) e idField no TableConfig (em memória)\n try {\n const info = this.crudService.getLastSchemaInfo();\n const meta: any = { ...(this.config?.meta || {}) };\n if (info?.schemaId) meta.schemaId = info.schemaId;\n if (info?.schemaHash) meta.serverHash = info.schemaHash;\n if (!meta.version) meta.version = '2.0.0';\n if (!meta.createdAt) meta.createdAt = new Date().toISOString();\n meta.updatedAt = new Date().toISOString();\n meta.lastVerifiedAt = new Date().toISOString();\n this.config.meta = meta;\n } catch {}\n const existing = this.config?.columns ?? [];\n if (existing.length === 0) {\n this.config.columns = fields\n .filter((f) => !f.tableHidden)\n .map((f) => this.convertFieldToColumn(f));\n }\n this.setupColumns();\n this.cdr.detectChanges();\n },\n error: (err) => {\n console.error('[PraxisTable] Schema load error', err);\n this.schemaError = true;\n this.errorMessage =\n 'Erro ao carregar colunas do servidor. Verifique a rota do recurso (API) e a conexão.';\n this.cdr.detectChanges();\n },\n });\n }\n\n private convertFieldToColumn(field: FieldDefinition): ColumnDefinition {\n // Prioritize API type over inference - only use inference as last resort\n let apiType: ColumnDataType;\n\n if (field.type && this.isValidColumnDataType(field.type)) {\n // Use API type if it's valid\n apiType = field.type as ColumnDataType;\n } else {\n // Fall back to inference only if API type is not available or invalid\n apiType = this.inferFieldTypeFromFieldName(field.name);\n }\n\n return {\n field: field.name,\n header: field.label ?? field.name,\n order: field.order,\n width: (field.width as any) ?? undefined,\n sortable: field.sortable,\n visible: field.tableHidden ? false : true,\n type: apiType,\n _originalApiType: apiType,\n _isApiField: true,\n } as ColumnDefinition;\n }\n\n /**\n * Check if a value is a valid ColumnDataType\n */\n private isValidColumnDataType(type: any): boolean {\n const validTypes: ColumnDataType[] = [\n 'string',\n 'number',\n 'date',\n 'boolean',\n 'currency',\n 'percentage',\n 'custom',\n ];\n return validTypes.includes(type);\n }\n\n /**\n * Infer column data type from field name patterns when API type is not available\n * Refined logic to reduce false positives\n */\n private inferFieldTypeFromFieldName(fieldName: string): ColumnDataType {\n const lowercaseName = fieldName.toLowerCase();\n\n // Date/time patterns - more specific patterns first\n if (\n lowercaseName.endsWith('date') ||\n lowercaseName.endsWith('time') ||\n lowercaseName.endsWith('at') ||\n lowercaseName.startsWith('date') ||\n lowercaseName === 'created' ||\n lowercaseName === 'updated' ||\n lowercaseName === 'modified' ||\n lowercaseName.includes('timestamp')\n ) {\n return 'date';\n }\n\n // Boolean patterns - most specific first to avoid conflicts\n if (\n lowercaseName.startsWith('is_') ||\n lowercaseName.startsWith('has_') ||\n lowercaseName.startsWith('can_') ||\n lowercaseName.startsWith('should_') ||\n lowercaseName === 'active' ||\n lowercaseName === 'enabled' ||\n lowercaseName === 'visible' ||\n lowercaseName === 'deleted' ||\n lowercaseName === 'archived' ||\n lowercaseName.endsWith('_flag') ||\n lowercaseName.endsWith('_enabled') ||\n lowercaseName.endsWith('_active')\n ) {\n return 'boolean';\n }\n\n // Currency/money patterns - exclude common false positives\n if (\n (lowercaseName.includes('price') ||\n lowercaseName.includes('amount') ||\n lowercaseName.includes('cost') ||\n lowercaseName.includes('salary') ||\n lowercaseName.includes('wage') ||\n lowercaseName.includes('fee') ||\n (lowercaseName.includes('value') &&\n !lowercaseName.includes('id') &&\n !lowercaseName.includes('key'))) &&\n !lowercaseName.includes('count') &&\n !lowercaseName.includes('type')\n ) {\n return 'currency';\n }\n\n // Percentage patterns - be more specific\n if (\n lowercaseName.includes('percent') ||\n lowercaseName.endsWith('_rate') ||\n lowercaseName.endsWith('_ratio') ||\n lowercaseName.endsWith('_pct') ||\n (lowercaseName.includes('rate') &&\n !lowercaseName.includes('created') &&\n !lowercaseName.includes('updated')) ||\n lowercaseName.endsWith('_score')\n ) {\n return 'percentage';\n }\n\n // Number patterns - exclude common false positives like string IDs\n if (\n (lowercaseName.endsWith('_id') && lowercaseName !== 'id') || // composite IDs might be strings\n lowercaseName === 'id' ||\n lowercaseName.includes('count') ||\n lowercaseName.includes('quantity') ||\n lowercaseName.includes('number') ||\n lowercaseName.includes('total') ||\n lowercaseName.includes('sum') ||\n lowercaseName.includes('age') ||\n lowercaseName.includes('weight') ||\n lowercaseName.includes('height') ||\n lowercaseName.includes('size') ||\n lowercaseName.endsWith('_num') ||\n lowercaseName.endsWith('_number')\n ) {\n return 'number';\n }\n\n // Default to string for ambiguous cases\n return 'string';\n }\n\n private fetchData(): void {\n if (!this.resourcePath) {\n return;\n }\n const pageable: PageableRequest = {\n pageNumber: this.pageIndex,\n pageSize: this.pageSize,\n };\n if (this.sortState.active && this.sortState.direction) {\n // Map active to backend sort field if provided\n const active = this.sortState.active;\n const col = this.visibleColumns.find((c) => c.field === active);\n const sortField = (col as any)?.sortField || active;\n const dir = (this.sortState.direction || 'asc').toLowerCase();\n pageable.sort = [`${sortField},${dir}`];\n } else {\n // Apply defaultSort to first fetch when no sortState is active\n const ds = this.config?.behavior?.sorting?.defaultSort as any;\n if (ds) {\n const entries = Array.isArray(ds) ? ds : [ds];\n const sortList: string[] = [];\n for (const e of entries) {\n if (!e?.column || !e?.direction) continue;\n const col = this.visibleColumns.find((c) => c.field === e.column);\n const sf = (col as any)?.sortField || e.column;\n const dir = (e.direction || 'asc').toLowerCase();\n sortList.push(`${sf},${dir}`);\n }\n if (sortList.length) pageable.sort = sortList;\n }\n }\n this.crudService\n .filter(this.filterCriteria || {}, pageable)\n .pipe(take(1))\n .subscribe({\n next: (page: Page<any>) => {\n this.dataError = false;\n this.dataSubject.next(page.content);\n if (this.paginator) {\n this.paginator.length = page.totalElements;\n }\n },\n error: (err) => {\n console.error('[PraxisTable] Data load error', err);\n this.dataError = true;\n this.errorMessage =\n 'Erro ao carregar dados. Verifique a rota do recurso (API) e tente novamente.';\n this.cdr.detectChanges();\n },\n });\n }\n\n // Public wrappers for template actions (AOT-safe)\n retryData(): void {\n if (this.resourcePath) this.fetchData();\n }\n reloadSchema(): void {\n if (this.resourcePath) this.loadSchema();\n }\n\n refetch(): void {\n this.fetchData();\n }\n\n /**\n * Get the cell value for a given row and column\n * Handles the complete transformation pipeline:\n * 1. _generatedValueGetter (calculated columns) or regular field access\n * 2. valueMapping (convert values to display text)\n * 3. format (data formatting like dates, numbers, currency)\n */\n getCellValue(rowData: any, column: ColumnDefinition): any {\n let value: any;\n\n // Step 1: Get raw value (calculated or direct field access)\n if (column._generatedValueGetter && column._generatedValueGetter.trim()) {\n try {\n // Safely evaluate the generated expression\n const evaluationFunction = new Function(\n 'rowData',\n `return ${column._generatedValueGetter}`,\n );\n value = evaluationFunction(rowData);\n } catch (error) {\n console.error('PTABLE:formula:error', error, column);\n return `[Formula Error]`;\n }\n } else {\n // Fallback to regular field access\n value = this.getNestedPropertyValue(rowData, column.field);\n }\n\n // Step 2: Apply value mapping if defined\n if (column.valueMapping && Object.keys(column.valueMapping).length > 0) {\n value = this.applyValueMapping(value, column.valueMapping);\n }\n\n // Step 3: Apply data formatting if defined\n if (\n column.type &&\n column.format &&\n this.formattingService.needsFormatting(column.type, column.format)\n ) {\n try {\n value = this.formattingService.formatValue(\n value,\n column.type,\n column.format,\n );\n } catch (error) {\n console.error('PTABLE:format:error', error, { value, column });\n }\n }\n\n return value;\n }\n\n // =============================\n // Conditional Styles (per cell)\n // =============================\n getCellClasses(rowData: any, column: ColumnDefinition): string[] | undefined {\n const rules = (column as any).conditionalStyles as\n | Array<{ condition: string; cssClass?: string; style?: Record<string, string> }>\n | undefined;\n if (!rules || rules.length === 0) return undefined;\n const classes: string[] = [];\n for (const r of rules) {\n try {\n if (this.evaluateStyleRule(r.condition, rowData)) {\n if (r.cssClass) classes.push(r.cssClass);\n }\n } catch {}\n }\n if (!classes.length && rules?.length) {\n console.debug('[PraxisTable] getCellClasses: no match', {\n column: column.field,\n rules: rules.map(r => r.condition),\n });\n }\n return classes.length ? classes : undefined;\n }\n\n getCellNgStyle(\n rowData: any,\n column: ColumnDefinition,\n ): Record<string, string> | undefined {\n const rules = (column as any).conditionalStyles as\n | Array<{ condition: string; cssClass?: string; style?: Record<string, string> }>\n | undefined;\n if (!rules || rules.length === 0) return undefined;\n const style: Record<string, string> = {};\n for (const r of rules) {\n try {\n if (r.style && this.evaluateStyleRule(r.condition, rowData)) {\n Object.assign(style, r.style);\n }\n } catch {}\n }\n return Object.keys(style).length ? style : undefined;\n }\n\n private evaluateStyleRule(expression: string, rowData: any): boolean {\n if (!expression || !expression.trim()) return false;\n let spec = this.styleSpecCache.get(expression);\n if (spec === undefined) {\n const knownFields = this.visibleColumns.map((c) => c.field);\n const parse = this.specBridge.parseDslExpression<any>(expression, {\n knownFields,\n enablePerformanceWarnings: false,\n maxComplexity: 80,\n } as any);\n if (!parse.success || !parse.specification) {\n console.warn('[PraxisTable] Style DSL parse failed', {\n expression,\n knownFields,\n issues: (parse as any).issues,\n });\n this.styleSpecCache.set(expression, null);\n return false;\n }\n spec = parse.specification;\n console.debug('[PraxisTable] Style DSL parsed OK', { expression });\n this.styleSpecCache.set(expression, spec);\n }\n if (!spec) return false;\n try {\n return spec.isSatisfiedBy(rowData) === true;\n } catch {\n console.warn('[PraxisTable] Style spec evaluation error', { expression });\n return false;\n }\n }\n\n // =============================\n // Conditional Styles (row/global)\n // =============================\n getRowClasses(rowData: any): string[] | undefined {\n const rules = (this.config as any).rowConditionalStyles as\n | Array<{ condition: string; cssClass?: string; style?: Record<string, string> }>\n | undefined;\n if (!rules || rules.length === 0) return undefined;\n const classes: string[] = [];\n for (const r of rules) {\n try {\n if (this.evaluateStyleRule(r.condition, rowData)) {\n if (r.cssClass) classes.push(r.cssClass);\n }\n } catch {}\n }\n if (!classes.length && rules?.length) {\n console.debug('[PraxisTable] getRowClasses: no match', {\n rules: rules.map(r => r.condition),\n });\n }\n return classes.length ? classes : undefined;\n }\n\n getRowNgStyle(rowData: any): Record<string, string> | undefined {\n const rules = (this.config as any).rowConditionalStyles as\n | Array<{ condition: string; cssClass?: string; style?: Record<string, string> }>\n | undefined;\n if (!rules || rules.length === 0) return undefined;\n const style: Record<string, string> = {};\n for (const r of rules) {\n try {\n if (r.style && this.evaluateStyleRule(r.condition, rowData)) {\n Object.assign(style, r.style);\n }\n } catch {}\n }\n return Object.keys(style).length ? style : undefined;\n }\n\n /**\n * Apply value mapping to transform raw values into display-friendly text\n */\n private applyValueMapping(\n value: any,\n mapping: { [key: string | number]: string },\n ): any {\n if (value === null || value === undefined) {\n return value;\n }\n\n // Try to find mapping by exact match\n if (mapping.hasOwnProperty(value)) {\n return mapping[value];\n }\n\n // Try string conversion for number/boolean values\n const stringValue = String(value);\n if (mapping.hasOwnProperty(stringValue)) {\n return mapping[stringValue];\n }\n\n // Try number conversion for string values that represent numbers\n if (typeof value === 'string') {\n const numValue = parseFloat(value);\n if (\n !isNaN(numValue) &&\n isFinite(numValue) &&\n mapping.hasOwnProperty(numValue)\n ) {\n return mapping[numValue];\n }\n }\n\n // Try boolean conversion for string values\n if (typeof value === 'string') {\n const lowerValue = value.toLowerCase();\n if (lowerValue === 'true' && mapping.hasOwnProperty('true')) {\n return mapping['true'];\n }\n if (lowerValue === 'false' && mapping.hasOwnProperty('false')) {\n return mapping['false'];\n }\n }\n\n // Return original value if no mapping found\n return value;\n }\n\n /**\n * Safely access nested properties using dot notation\n */\n private getNestedPropertyValue(obj: any, path: string): any {\n if (!obj || !path) {\n return null;\n }\n\n try {\n return path.split('.').reduce((current, key) => {\n return current && current[key] !== undefined ? current[key] : null;\n }, obj);\n } catch (error) {\n console.error('PTABLE:property:access:error', error, { obj, path });\n return null;\n }\n }\n\n // =============================================================================\n // CONFIGURATION ACCESS METHODS\n // =============================================================================\n\n /**\n * Verifica se a ordenação está habilitada\n */\n getSortingEnabled(): boolean {\n return this.config.behavior?.sorting?.enabled ?? true;\n }\n\n /**\n * Verifica se a paginação está habilitada\n */\n getPaginationEnabled(): boolean {\n return this.config.behavior?.pagination?.enabled ?? false;\n }\n\n /**\n * Obtém o comprimento total da paginação\n */\n getPaginationLength(): number {\n return this.config.behavior?.pagination?.totalItems ?? 0;\n }\n\n /**\n * Obtém o tamanho da página\n */\n getPaginationPageSize(): number {\n return this.config.behavior?.pagination?.pageSize ?? 10;\n }\n\n /**\n * Obtém as opções de tamanho de página\n */\n getPaginationPageSizeOptions(): number[] {\n return this.config.behavior?.pagination?.pageSizeOptions ?? [5, 10, 25, 50];\n }\n\n /**\n * Verifica se deve mostrar botões primeira/última\n */\n getPaginationShowFirstLast(): boolean {\n return this.config.behavior?.pagination?.showFirstLastButtons ?? true;\n }\n\n /**\n * Verifica se uma funcionalidade está disponível\n */\n isFeatureAvailable(feature: string): boolean {\n switch (feature) {\n case 'multiSort':\n return this.config.behavior?.sorting?.multiSort ?? false;\n case 'bulkActions':\n return this.config.actions?.bulk?.enabled ?? false;\n case 'rowActions':\n return this.config.actions?.row?.enabled ?? false;\n case 'columnFilters':\n return this.config.behavior?.filtering?.columnFilters?.enabled ?? false;\n case 'export':\n return this.config.export?.enabled ?? false;\n case 'resizing':\n return this.config.behavior?.resizing?.enabled ?? false;\n case 'dragging':\n return this.config.behavior?.dragging?.columns ?? false;\n default:\n return false;\n }\n }\n\n /**\n * Obtém configurações de i18n para o filtro baseado na configuração da tabela\n */\n getFilterI18n(): Partial<I18n> | undefined {\n const placeholder =\n this.config.behavior?.filtering?.advancedFilters?.settings?.placeholder;\n return placeholder ? { searchPlaceholder: placeholder } : undefined;\n }\n\n // =============================\n // Cell Renderer Helpers (Phase 1)\n // =============================\n getIconName(row: any, column: ColumnDefinition): string | null {\n const cfg = (column as any).renderer?.icon;\n if (!cfg) return null;\n const raw = cfg.name as any;\n const fromField = cfg.nameField ? this.getNestedPropertyValue(row, cfg.nameField) : undefined;\n const evaluated = this.evaluateValueExpr(raw, row, 'string');\n if (evaluated != null && evaluated !== '') return String(evaluated);\n if (fromField != null && fromField !== '') return String(fromField);\n if (typeof raw === 'string') return raw;\n return null;\n }\n getIconColor(_row: any, column: ColumnDefinition): string | null {\n const cfg = (column as any).renderer?.icon;\n if (!cfg) return null;\n const raw = cfg.color as any;\n const evaluated = this.evaluateValueExpr(raw, _row, 'string');\n return (evaluated as any) || (typeof raw === 'string' ? raw : null);\n }\n getIconStyle(_row: any, column: ColumnDefinition): Record<string, string> | null {\n const raw = (column as any).renderer?.icon?.size as any;\n const size = this.evaluateValueExpr(raw, _row, 'number') as number | undefined;\n return size ? { fontSize: `${size}px`, width: `${size}px`, height: `${size}px` } : null;\n }\n getIconAriaLabel(_row: any, column: ColumnDefinition): string | null {\n return ((column as any).renderer?.icon?.ariaLabel as any) || null;\n }\n\n /**\n * Lightweight, controlled evaluator for string/number expressions using row context.\n * Accepts values like '= row.status === \"OK\" ? \"primary\" : \"warn\"'.\n * Falls back safely on error.\n */\n private evaluateValueExpr(\n raw: any,\n row: any,\n expect: 'string' | 'number' | 'boolean',\n ): string | number | boolean | null {\n try {\n if (raw == null) return null;\n // Object form: { expr: '...' }\n if (typeof raw === 'object' && typeof raw.expr === 'string') {\n const fn = new Function('row', `\"use strict\"; return (${raw.expr});`);\n const val = fn(row);\n return this.coerceExpected(val, expect);\n }\n // String shorthand: '= <expr>'\n if (typeof raw === 'string') {\n const m = raw.match(/^\\s*=(.*)$/s);\n if (m) {\n const expr = m[1];\n const fn = new Function('row', `\"use strict\"; return (${expr});`);\n const val = fn(row);\n return this.coerceExpected(val, expect);\n }\n }\n return null;\n } catch {\n return null;\n }\n }\n\n private coerceExpected(val: any, expect: 'string' | 'number' | 'boolean') {\n if (val == null) return null;\n switch (expect) {\n case 'string':\n return String(val);\n case 'number':\n return typeof val === 'number' ? val : Number(val);\n case 'boolean':\n return typeof val === 'boolean' ? val : !!val;\n }\n }\n\n getImageSrc(row: any, column: ColumnDefinition): string | null {\n const cfg = (column as any).renderer?.image;\n if (!cfg) return null;\n const src = cfg.srcField ? this.getNestedPropertyValue(row, cfg.srcField) : cfg.src;\n if (typeof src !== 'string') return null;\n // basic guard against javascript: urls\n if (/^\\s*javascript:/i.test(src)) return null;\n return src;\n }\n getImageAlt(row: any, column: ColumnDefinition): string | null {\n const cfg = (column as any).renderer?.image;\n if (!cfg) return null;\n return (cfg.altField ? this.getNestedPropertyValue(row, cfg.altField) : cfg.alt) || null;\n }\n getImageWidth(column: ColumnDefinition): number | null {\n return ((column as any).renderer?.image?.width as any) || null;\n }\n getImageHeight(column: ColumnDefinition): number | null {\n return ((column as any).renderer?.image?.height as any) || null;\n }\n getImageShape(column: ColumnDefinition): 'square' | 'rounded' | 'circle' | undefined {\n return ((column as any).renderer?.image?.shape as any) || undefined;\n }\n getImageFit(column: ColumnDefinition): 'cover' | 'contain' | undefined {\n return ((column as any).renderer?.image?.fit as any) || undefined;\n }\n getImageLazy(_row: any, column: ColumnDefinition): boolean {\n return !!(column as any).renderer?.image?.lazy;\n }\n\n getBadgeText(row: any, column: ColumnDefinition): string | null {\n const cfg = (column as any).renderer?.badge;\n if (!cfg) return null;\n const text = cfg.textField ? this.getNestedPropertyValue(row, cfg.textField) : cfg.text;\n return text != null ? String(text) : null;\n }\n getBadgeIcon(row: any, column: ColumnDefinition): string | null {\n const cfg = (column as any).renderer?.badge;\n return (cfg?.icon as any) || null;\n }\n getBadgeClasses(row: any, column: ColumnDefinition): string[] {\n const cfg = (column as any).renderer?.badge;\n if (!cfg) return [];\n const out: string[] = [];\n const variant = (cfg.variant as any) || 'filled';\n const color = ((cfg.color as any) || '').toLowerCase();\n if (variant === 'outlined') out.push('pfx-badge--outlined');\n else if (variant === 'soft') out.push(`pfx-badge--soft-${color || 'primary'}`);\n else out.push(`pfx-badge--filled-${color || 'primary'}`);\n return out;\n }\n\n // Resolve renderer type per row (supports conditional typeExpr)\n getEffectiveRendererType(row: any, column: ColumnDefinition): 'icon' | 'image' | 'badge' | null {\n const rend: any = (column as any)?.renderer || null;\n if (rend && rend.typeExpr) {\n // Try bridge (Phase 1 shim); fallback to local evaluator\n let t: string | null = null;\n try {\n const bridge: any = this.specBridge as any;\n if (bridge?.parseDslExpressionValue && bridge?.evaluateValue) {\n const parsed = bridge.parseDslExpressionValue(rend.typeExpr, { enablePerformanceWarnings: false, maxComplexity: 64 });\n if (parsed?.success) {\n t = bridge.evaluateValue(rend.typeExpr, { row }) as string | null;\n }\n }\n } catch {}\n if (t == null) {\n t = this.evaluateValueExpr(rend.typeExpr, row, 'string') as string | null;\n }\n if (t === 'icon' || t === 'image' || t === 'badge') return t;\n if (t === 'text' || t === 'none') return null;\n }\n return rend?.type || null;\n }\n\n // Apply appearance variables (header spacing/typography/colors) from config\n private applyAppearanceVariables(): void {\n try {\n const app: any = this.config?.appearance || {};\n const spacing = app.spacing || {};\n const typo = app.typography || {};\n const el = this.hostRef?.nativeElement as HTMLElement;\n if (!el) return;\n if (typeof spacing.headerHeight === 'number' && isFinite(spacing.headerHeight)) {\n el.style.setProperty('--mat-table-header-container-height', `${spacing.headerHeight}px`);\n }\n if (spacing.headerPadding) {\n el.style.setProperty('--p-header-padding', String(spacing.headerPadding));\n }\n if (typo.headerFontSize) {\n el.style.setProperty('--p-header-font-size', String(typo.headerFontSize));\n }\n if (typo.headerFontWeight) {\n el.style.setProperty('--p-header-font-weight', String(typo.headerFontWeight));\n }\n if (typo.letterSpacing) {\n el.style.setProperty('--p-header-letter-spacing', String(typo.letterSpacing));\n }\n if (typo.headerCase) {\n const map: any = { none: 'none', uppercase: 'uppercase', lowercase: 'lowercase', capitalize: 'capitalize' };\n el.style.setProperty('--p-header-text-transform', map[typo.headerCase] || 'none');\n }\n const colors = app.colors || {};\n if (colors.headerBackground) {\n el.style.setProperty('--p-table-header-bg', String(colors.headerBackground));\n }\n if (colors.headerTextColor) {\n el.style.setProperty('--p-table-header-fg', String(colors.headerTextColor));\n }\n const headerBorderColor = app?.borders?.specific?.header?.color || app?.borders?.color;\n if (headerBorderColor) {\n el.style.setProperty('--p-table-border-color', String(headerBorderColor));\n }\n if (colors.alternateRowBackground) {\n el.style.setProperty('--p-table-row-even-bg', String(colors.alternateRowBackground));\n }\n } catch {}\n }\n\n ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n // Clean up subscriptions to prevent memory leaks\n this.subscriptions.forEach((sub) => sub.unsubscribe());\n this.subscriptions = [];\n\n // Complete the data subject\n this.dataSubject.complete();\n }\n}\n","<praxis-empty-state-card\n *ngIf=\"!resourcePath\"\n icon=\"link\"\n [title]=\"'Conecte a tabela à fonte de dados'\"\n [description]=\"'Informe a rota do recurso da API para carregar colunas e dados automaticamente.'\"\n [primaryAction]=\"{ label: 'Conectar à fonte de dados', icon: 'bolt', action: openQuickConnect.bind(this) }\"\n></praxis-empty-state-card>\n\n<!-- Error State with Quick Connect CTA -->\n<div class=\"ptable-error\" *ngIf=\"resourcePath && (schemaError || dataError)\" style=\"display:flex; align-items:center; gap:12px; padding:12px; border:1px solid var(--md-sys-color-error, #b00020); border-radius:8px; margin: 8px 0;\">\n <mat-icon color=\"warn\" aria-hidden=\"true\">error</mat-icon>\n <div style=\"flex:1\">\n <div style=\"font-weight:600\">Erro</div>\n <div>{{ errorMessage || 'Ocorreu um erro ao carregar a tabela.' }}</div>\n </div>\n <button mat-flat-button color=\"primary\" (click)=\"openQuickConnect()\">\n <mat-icon>bolt</mat-icon>\n Conectar a recurso\n </button>\n <button mat-stroked-button (click)=\"retryData()\" *ngIf=\"!schemaError\">Tentar novamente</button>\n <button mat-stroked-button (click)=\"reloadSchema()\" *ngIf=\"schemaError\">Recarregar colunas</button>\n </div>\n\n<!-- Inline banner for schema change (only in edit mode) -->\n<div *ngIf=\"shouldShowOutdatedInline()\" class=\"ptable-info-banner\" role=\"status\" aria-live=\"polite\">\n <div class=\"text\">O schema do servidor mudou. Reconciliar agora?</div>\n <div class=\"actions\">\n <button mat-stroked-button color=\"primary\" (click)=\"onReconcileRequested()\">\n <mat-icon>sync</mat-icon>\n Reconciliar\n </button>\n <button mat-button (click)=\"onSnoozeOutdated()\">Lembrar depois</button>\n <button mat-button (click)=\"onIgnoreOutdated()\">Ignorar</button>\n </div>\n </div>\n\n <ng-container *ngIf=\"resourcePath && !schemaError && !dataError && toolbarV2; else legacyHeader\">\n <div class=\"praxis-table-header\" [class.debug-layout]=\"debugLayout\" [class.edit-mode]=\"editModeEnabled\" *ngIf=\"showToolbar || editModeEnabled\">\n <praxis-table-toolbar\n *ngIf=\"showToolbar\"\n [config]=\"config\"\n [debugLayout]=\"debugLayout\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (reset)=\"onResetPreferences()\"\n >\n <praxis-filter\n *ngIf=\"\n resourcePath &&\n config.behavior?.filtering?.advancedFilters?.enabled &&\n !projectedFilter\n \"\n advancedFilter\n [resourcePath]=\"resourcePath\"\n [formId]=\"tableId + '-filter'\"\n [editModeEnabled]=\"editModeEnabled\"\n [quickField]=\"\n config.behavior?.filtering?.advancedFilters?.settings?.quickField\n \"\n [alwaysVisibleFields]=\"\n config.behavior?.filtering?.advancedFilters?.settings\n ?.alwaysVisibleFields\n \"\n [allowSaveTags]=\"\n config.behavior?.filtering?.advancedFilters?.settings\n ?.allowSaveTags\n \"\n [changeDebounceMs]=\"\n config.behavior?.filtering?.advancedFilters?.settings\n ?.changeDebounceMs ?? 300\n \"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"\n config.behavior?.filtering?.advancedFilters?.settings?.mode ??\n 'auto'\n \"\n [debugLayout]=\"debugLayout\"\n [showFilterSettings]=\"!editModeEnabled\"\n (submit)=\"onAdvancedFilterSubmit($event)\"\n (clear)=\"onAdvancedFilterClear()\"\n ></praxis-filter>\n <ng-content select=\"[advancedFilter]\" />\n <ng-content select=\"[toolbar]\" />\n <button end-actions mat-icon-button color=\"primary\" *ngIf=\"editModeEnabled\"\n (click)=\"openTableSettings()\" aria-label=\"Configurações\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"schemaOutdated ? 'Schema do servidor mudou — Reconciliar' : 'Configurações'\"\n matTooltipPosition=\"below\">\n <mat-icon>settings</mat-icon>\n </button>\n </praxis-table-toolbar>\n <!-- Render a minimal settings button when toolbar is hidden but edit mode is enabled -->\n <div class=\"ptable-header-actions\" *ngIf=\"!showToolbar && editModeEnabled\">\n <button mat-icon-button color=\"primary\" (click)=\"openTableSettings()\" aria-label=\"Configurações\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"schemaOutdated ? 'Schema do servidor mudou — Reconciliar' : 'Configurações'\"\n matTooltipPosition=\"below\">\n <mat-icon>settings</mat-icon>\n </button>\n <button mat-icon-button (click)=\"disconnect()\" aria-label=\"Desconectar\" matTooltip=\"Desconectar da fonte de dados\">\n <mat-icon>link_off</mat-icon>\n </button>\n </div>\n \n </div>\n</ng-container>\n<ng-template #legacyHeader>\n <ng-container *ngIf=\"resourcePath && !schemaError && !dataError\">\n <praxis-table-toolbar\n *ngIf=\"showToolbar\"\n [config]=\"config\"\n [debugLayout]=\"debugLayout\"\n (toolbarAction)=\"onToolbarAction($event)\"\n (reset)=\"onResetPreferences()\"\n >\n <praxis-filter\n *ngIf=\"\n resourcePath &&\n config.behavior?.filtering?.advancedFilters?.enabled &&\n !projectedFilter\n \"\n advancedFilter\n [resourcePath]=\"resourcePath\"\n [formId]=\"tableId + '-filter'\"\n [editModeEnabled]=\"editModeEnabled\"\n [quickField]=\"\n config.behavior?.filtering?.advancedFilters?.settings?.quickField\n \"\n [alwaysVisibleFields]=\"\n config.behavior?.filtering?.advancedFilters?.settings\n ?.alwaysVisibleFields\n \"\n [allowSaveTags]=\"\n config.behavior?.filtering?.advancedFilters?.settings?.allowSaveTags\n \"\n [changeDebounceMs]=\"\n config.behavior?.filtering?.advancedFilters?.settings\n ?.changeDebounceMs ?? 300\n \"\n [i18n]=\"getFilterI18n()\"\n [mode]=\"\n config.behavior?.filtering?.advancedFilters?.settings?.mode ??\n 'auto'\n \"\n [debugLayout]=\"debugLayout\"\n [showFilterSettings]=\"!editModeEnabled\"\n (submit)=\"onAdvancedFilterSubmit($event)\"\n (clear)=\"onAdvancedFilterClear()\"\n ></praxis-filter>\n <ng-content select=\"[advancedFilter]\" />\n <ng-content select=\"[toolbar]\" />\n <button end-actions mat-icon-button color=\"primary\" *ngIf=\"editModeEnabled\"\n (click)=\"openTableSettings()\" aria-label=\"Configurações\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"schemaOutdated ? 'Schema do servidor mudou — Reconciliar' : 'Configurações'\"\n matTooltipPosition=\"below\">\n <mat-icon>settings</mat-icon>\n </button>\n </praxis-table-toolbar>\n <!-- Legacy header: settings button when toolbar hidden -->\n <div class=\"ptable-header-actions\" *ngIf=\"!showToolbar && editModeEnabled\">\n <button mat-icon-button color=\"primary\" (click)=\"openTableSettings()\" aria-label=\"Configurações\"\n [matBadge]=\"schemaOutdated ? '!' : ''\"\n [matBadgeHidden]=\"!schemaOutdated\"\n matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n [matTooltip]=\"schemaOutdated ? 'Schema do servidor mudou — Reconciliar' : 'Configurações'\"\n matTooltipPosition=\"below\">\n <mat-icon>settings</mat-icon>\n </button>\n </div>\n </ng-container>\n \n</ng-template>\n<table\n *ngIf=\"resourcePath && !schemaError && !dataError\"\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n (matSortChange)=\"onSortChange($event)\"\n [matSortDisabled]=\"!getSortingEnabled()\"\n class=\"mat-elevation-z8\"\n>\n <ng-container\n *ngIf=\"config.behavior?.selection?.enabled\"\n matColumnDef=\"_select\"\n >\n <th mat-header-cell *matHeaderCellDef>\n <mat-checkbox\n (change)=\"masterToggle()\"\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n ></mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n ></mat-checkbox>\n </td>\n </ng-container>\n <ng-container\n *ngFor=\"let column of visibleColumns\"\n [matColumnDef]=\"column.field\"\n [sticky]=\"column.sticky === true || column.sticky === 'start'\"\n [stickyEnd]=\"column.sticky === 'end'\"\n >\n <th\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header\n [disabled]=\"!getSortingEnabled() || column.sortable === false\"\n [style.text-align]=\"column.align\"\n [style.width]=\"column.width\"\n [attr.style]=\"column.headerStyle\"\n >\n {{ column.header }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let element\"\n [style.text-align]=\"column.align\"\n [style.width]=\"column.width\"\n [attr.style]=\"column.style\"\n [ngClass]=\"getCellClasses(element, column)\"\n [ngStyle]=\"getCellNgStyle(element, column)\"\n >\n <ng-container [ngSwitch]=\"getEffectiveRendererType(element, column)\">\n <!-- Icon renderer -->\n <ng-container *ngSwitchCase=\"'icon'\">\n <mat-icon\n [color]=\"getIconColor(element, column) || null\"\n [ngStyle]=\"getIconStyle(element, column)\"\n [attr.aria-label]=\"getIconAriaLabel(element, column) || null\"\n >{{ getIconName(element, column) }}</mat-icon\n >\n </ng-container>\n\n <!-- Image renderer -->\n <ng-container *ngSwitchCase=\"'image'\">\n <img\n class=\"pfx-cell-image\"\n [src]=\"getImageSrc(element, column)\"\n [attr.alt]=\"getImageAlt(element, column) || ''\"\n [attr.loading]=\"getImageLazy(element, column) ? 'lazy' : null\"\n [style.width.px]=\"getImageWidth(column)\"\n [style.height.px]=\"getImageHeight(column)\"\n [class.shape-rounded]=\"getImageShape(column) === 'rounded'\"\n [class.shape-circle]=\"getImageShape(column) === 'circle'\"\n [style.object-fit]=\"getImageFit(column)\"\n />\n </ng-container>\n\n <!-- Badge renderer -->\n <ng-container *ngSwitchCase=\"'badge'\">\n <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(element, column)\">\n <mat-icon *ngIf=\"getBadgeIcon(element, column) as bi\" class=\"pfx-badge-icon\">{{ bi }}</mat-icon>\n <span class=\"pfx-badge-text\">{{ getBadgeText(element, column) }}</span>\n </span>\n </ng-container>\n\n <!-- Default text rendering -->\n <ng-container *ngSwitchDefault>\n {{ getCellValue(element, column) }}\n </ng-container>\n </ng-container>\n </td>\n </ng-container>\n <ng-container *ngIf=\"config.actions?.row?.enabled\" matColumnDef=\"_actions\" [sticky]=\"config.actions?.row?.sticky === true || config.actions?.row?.sticky === 'start'\" [stickyEnd]=\"config.actions?.row?.sticky === 'end'\">\n <th mat-header-cell *matHeaderCellDef #actionsHeaderCell [style.width]=\"config.actions?.row?.width\" class=\"praxis-actions-header\" [class.align-start]=\"getActionsHeaderAlign() === 'start'\" [class.align-center]=\"getActionsHeaderAlign() === 'center'\" [class.align-end]=\"getActionsHeaderAlign() === 'end'\">\n <div class=\"praxis-actions-header__content\" [matTooltip]=\"getActionsHeaderTooltip() || ''\" [matTooltipDisabled]=\"!getActionsHeaderTooltip()\">\n <mat-icon *ngIf=\"getActionsHeaderIcon() as hi\" [praxisIcon]=\"hi\"></mat-icon>\n <span class=\"label\" *ngIf=\"getActionsHeaderLabel() as hl\">{{ hl }}</span>\n </div>\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n class=\"praxis-actions-cell\"\n [class.dense]=\"dense\"\n [style.width]=\"config.actions?.row?.width\"\n >\n <div class=\"praxis-actions-cell__content\">\n <!-- Ações inline -->\n <!-- Inline actions: icons mode -->\n <ng-container *ngIf=\"config.actions?.row?.display === 'icons' || !config.actions?.row?.display\">\n <ng-container *ngFor=\"let a of getInlineRowActions(row); trackBy: trackAction\">\n <button\n mat-icon-button\n class=\"praxis-icon-btn\"\n [disabled]=\"isActionDisabled(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event)\"\n [matTooltip]=\"a.label || getActionId(a)\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [color]=\"a.color || null\"\n >\n <mat-icon [praxisIcon]=\"a.icon\"></mat-icon>\n </button>\n </ng-container>\n </ng-container>\n\n <!-- Inline actions: buttons mode (show label + icon) -->\n <ng-container *ngIf=\"config.actions?.row?.display === 'buttons'\">\n <ng-container *ngFor=\"let a of getInlineRowActions(row); trackBy: trackAction\">\n <button\n mat-flat-button\n class=\"praxis-row-btn\"\n [disabled]=\"isActionDisabled(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event)\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [color]=\"a.color || null\"\n >\n <mat-icon [praxisIcon]=\"a.icon\"></mat-icon>\n <span>{{ a.label || getActionId(a) }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <!-- Menu de overflow -->\n <button\n mat-icon-button\n class=\"praxis-icon-btn praxis-more-btn\"\n *ngIf=\"hasOverflowRowActions(row)\"\n [matMenuTriggerFor]=\"rowMoreMenu\"\n [color]=\"getRowMenuButtonColor() || null\"\n aria-label=\"Mais ações\"\n >\n <mat-icon [praxisIcon]=\"getRowMenuIcon()\"></mat-icon>\n </button>\n <mat-menu #rowMoreMenu=\"matMenu\" xPosition=\"before\">\n <ng-container\n *ngFor=\"let a of getOverflowRowActions(row); trackBy: trackAction\"\n >\n <button\n mat-menu-item\n (click)=\"onRowAction(getActionId(a), row, $event)\"\n [disabled]=\"isActionDisabled(a, row)\"\n >\n <mat-icon [color]=\"a.color || null\" [praxisIcon]=\"a.icon\"></mat-icon>\n <span>{{ a.label || getActionId(a) }}</span>\n </button>\n </ng-container>\n </mat-menu>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <ng-container *ngIf=\"!isVirtualized()\">\n <tr\n mat-row\n *matRowDef=\"let row; let i = index; columns: displayedColumns\"\n [ngClass]=\"getRowClasses(row)\"\n [ngStyle]=\"getRowNgStyle(row)\"\n (click)=\"onRowClicked(row, i)\"\n (dblclick)=\"onRowDoubleClicked(row, i)\"\n ></tr>\n </ng-container>\n</table>\n\n<!-- Virtual rows path (header preserved above) -->\n<ng-container *ngIf=\"resourcePath && !schemaError && !dataError && isVirtualized()\">\n <cdk-virtual-scroll-viewport\n class=\"ptable-viewport\"\n [itemSize]=\"getVirtItemHeight()\"\n [minBufferPx]=\"getVirtBufferSize() * getVirtItemHeight()\"\n [maxBufferPx]=\"getVirtBufferSize() * getVirtItemHeight() * 2\"\n [style.minHeight]=\"getVirtMinHeightStyle()\"\n >\n <table class=\"mat-mdc-table mat-elevation-z8\" style=\"width:100%\">\n <tbody>\n <tr class=\"mat-mdc-row\"\n *cdkVirtualFor=\"let row of dataSource.data; let i = index; trackBy: trackByRow\"\n [ngClass]=\"getRowClasses(row)\"\n [ngStyle]=\"getRowNgStyle(row)\"\n (click)=\"onRowClicked(row, i)\"\n (dblclick)=\"onRowDoubleClicked(row, i)\">\n <!-- Selection column -->\n <td class=\"mat-mdc-cell\" *ngIf=\"config.behavior?.selection?.enabled\">\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td>\n <!-- Data columns -->\n <td class=\"mat-mdc-cell\"\n *ngFor=\"let column of visibleColumns\"\n [style.text-align]=\"column.align\"\n [style.width]=\"column.width\"\n [attr.style]=\"column.style\"\n [ngClass]=\"getCellClasses(row, column)\"\n [ngStyle]=\"getCellNgStyle(row, column)\">\n <ng-container [ngSwitch]=\"getEffectiveRendererType(row, column)\">\n <ng-container *ngSwitchCase=\"'icon'\">\n <mat-icon [color]=\"getIconColor(row, column) || null\"\n [ngStyle]=\"getIconStyle(row, column)\"\n [attr.aria-label]=\"getIconAriaLabel(row, column) || null\">\n {{ getIconName(row, column) }}\n </mat-icon>\n </ng-container>\n <ng-container *ngSwitchCase=\"'image'\">\n <img class=\"pfx-cell-image\"\n [src]=\"getImageSrc(row, column)\"\n [attr.alt]=\"getImageAlt(row, column) || ''\"\n [attr.loading]=\"getImageLazy(row, column) ? 'lazy' : null\"\n [style.width.px]=\"getImageWidth(column)\"\n [style.height.px]=\"getImageHeight(column)\"\n [class.shape-rounded]=\"getImageShape(column) === 'rounded'\"\n [class.shape-circle]=\"getImageShape(column) === 'circle'\"\n [style.object-fit]=\"getImageFit(column)\" />\n </ng-container>\n <ng-container *ngSwitchCase=\"'badge'\">\n <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(row, column)\">\n <mat-icon *ngIf=\"getBadgeIcon(row, column) as bi\" class=\"pfx-badge-icon\">{{ bi }}</mat-icon>\n <span class=\"pfx-badge-text\">{{ getBadgeText(row, column) }}</span>\n </span>\n </ng-container>\n <ng-container *ngSwitchDefault>\n {{ getCellValue(row, column) }}\n </ng-container>\n </ng-container>\n </td>\n\n <!-- Actions column -->\n <td class=\"mat-mdc-cell praxis-actions-cell\" *ngIf=\"config.actions?.row?.enabled\" [class.dense]=\"dense\" [style.width]=\"config.actions?.row?.width\">\n <div class=\"praxis-actions-cell__content\">\n <ng-container *ngIf=\"config.actions?.row?.display === 'icons' || !config.actions?.row?.display\">\n <ng-container *ngFor=\"let a of getInlineRowActions(row); trackBy: trackAction\">\n <button mat-icon-button class=\"praxis-icon-btn\"\n [disabled]=\"isActionDisabled(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event)\"\n [matTooltip]=\"a.label || getActionId(a)\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"praxis-tooltip\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [color]=\"a.color || null\">\n <mat-icon [praxisIcon]=\"a.icon\"></mat-icon>\n </button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"config.actions?.row?.display === 'buttons'\">\n <ng-container *ngFor=\"let a of getInlineRowActions(row); trackBy: trackAction\">\n <button mat-flat-button class=\"praxis-row-btn\"\n [disabled]=\"isActionDisabled(a, row)\"\n (click)=\"onRowAction(getActionId(a), row, $event)\"\n [attr.aria-label]=\"a.label || getActionId(a)\"\n [color]=\"a.color || null\">\n <mat-icon [praxisIcon]=\"a.icon\"></mat-icon>\n <span>{{ a.label || getActionId(a) }}</span>\n </button>\n </ng-container>\n </ng-container>\n <button mat-icon-button class=\"praxis-icon-btn praxis-more-btn\"\n *ngIf=\"hasOverflowRowActions(row)\"\n [matMenuTriggerFor]=\"rowMoreMenuV\"\n [color]=\"getRowMenuButtonColor() || null\"\n aria-label=\"Mais ações\">\n <mat-icon [praxisIcon]=\"getRowMenuIcon()\"></mat-icon>\n </button>\n <mat-menu #rowMoreMenuV=\"matMenu\" xPosition=\"before\">\n <ng-container *ngFor=\"let a of getOverflowRowActions(row); trackBy: trackAction\">\n <button mat-menu-item (click)=\"onRowAction(getActionId(a), row, $event)\" [disabled]=\"isActionDisabled(a, row)\">\n <mat-icon [color]=\"a.color || null\" [praxisIcon]=\"a.icon\"></mat-icon>\n <span>{{ a.label || getActionId(a) }}</span>\n </button>\n </ng-container>\n </mat-menu>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </cdk-virtual-scroll-viewport>\n</ng-container>\n<!-- Paginadores (top/bottom) -->\n<mat-paginator\n *ngIf=\"resourcePath && !schemaError && !dataError && getPaginationEnabled() && (config.behavior?.pagination?.position === 'top' || config.behavior?.pagination?.position === 'both')\"\n [length]=\"getPaginationLength()\"\n [pageSize]=\"getPaginationPageSize()\"\n [pageSizeOptions]=\"getPaginationPageSizeOptions()\"\n [showFirstLastButtons]=\"getPaginationShowFirstLast()\"\n (page)=\"onPageChange($event)\"\n [class.compact]=\"config.behavior?.pagination?.style === 'compact'\"\n>\n</mat-paginator>\n\n<mat-paginator\n *ngIf=\"resourcePath && !schemaError && !dataError && getPaginationEnabled() && (config.behavior?.pagination?.position === 'bottom' || config.behavior?.pagination?.position === 'both' || !config.behavior?.pagination?.position)\"\n [length]=\"getPaginationLength()\"\n [pageSize]=\"getPaginationPageSize()\"\n [pageSizeOptions]=\"getPaginationPageSizeOptions()\"\n [showFirstLastButtons]=\"getPaginationShowFirstLast()\"\n (page)=\"onPageChange($event)\"\n [class.compact]=\"config.behavior?.pagination?.style === 'compact'\"\n>\n</mat-paginator>\n","import { ComponentDocMeta, ComponentMetadataRegistry } from '@praxisui/core';\nimport { ENVIRONMENT_INITIALIZER, Provider } from '@angular/core';\nimport { PraxisTable } from './praxis-table';\n\n/** Metadata for PraxisTable component */\nexport const PRAXIS_TABLE_COMPONENT_METADATA: ComponentDocMeta = {\n id: 'praxis-table',\n selector: 'praxis-table',\n component: PraxisTable,\n friendlyName: 'Praxis Table',\n description: 'Tabela interativa com paginação, ordenação e ações em massa.',\n icon: 'grid_on',\n inputs: [\n {\n name: 'config',\n type: 'TableConfig',\n label: 'Configuração',\n description: 'Configuração da tabela (colunas, toolbar, ações)',\n },\n {\n name: 'resourcePath',\n type: 'string',\n label: 'Recurso',\n description: 'Endpoint base para operações de dados',\n },\n {\n name: 'filterCriteria',\n type: 'any',\n label: 'Filtro',\n description: 'Filtros aplicados às consultas (JSON)',\n default: {},\n },\n {\n name: 'showToolbar',\n type: 'boolean',\n default: false,\n description: 'Exibe barra de ferramentas',\n },\n {\n name: 'toolbarV2',\n type: 'boolean',\n default: true,\n description: 'Ativa layout da toolbar v2',\n },\n {\n name: 'autoDelete',\n type: 'boolean',\n default: false,\n description: 'Ativa deleção automática',\n },\n {\n name: 'editModeEnabled',\n type: 'boolean',\n default: false,\n description: 'Permite edição de layout',\n },\n {\n name: 'dense',\n type: 'boolean',\n default: false,\n description: 'Modo compacto',\n },\n {\n name: 'tableId',\n type: 'string',\n default: 'default',\n label: 'ID da Tabela',\n description: 'Identificador para armazenamento de configuração',\n },\n ],\n outputs: [\n {\n name: 'rowClick',\n type: '{ row: any; index: number }',\n label: 'Clique na linha',\n description: 'Emitido ao clicar em uma linha',\n },\n {\n name: 'rowDoubleClick',\n type: '{ action: string; row: any }',\n label: 'Duplo clique na linha',\n description: 'Emitido ao dar duplo clique na linha (ação conforme Behavior)',\n },\n {\n name: 'rowAction',\n type: '{ action: string; row: any }',\n label: 'Ação na linha',\n description: 'Emitido ao acionar uma ação em uma linha',\n },\n {\n name: 'toolbarAction',\n type: '{ action: string }',\n label: 'Ação da toolbar',\n description: 'Emitido ao acionar uma ação da toolbar',\n },\n {\n name: 'bulkAction',\n type: '{ action: string; rows: any[] }',\n label: 'Ação em massa',\n description: 'Emitido ao executar ações em massa',\n },\n {\n name: 'beforeDelete',\n type: 'any',\n description: 'Antes de deletar uma linha',\n },\n { name: 'afterDelete', type: 'any', description: 'Após deletar uma linha' },\n {\n name: 'deleteError',\n type: '{ row: any; error: unknown }',\n description: 'Erro ao deletar uma linha',\n },\n {\n name: 'beforeBulkDelete',\n type: 'any[]',\n description: 'Antes de deletar múltiplas linhas',\n },\n {\n name: 'afterBulkDelete',\n type: 'any[]',\n description: 'Após deletar múltiplas linhas',\n },\n {\n name: 'bulkDeleteError',\n type: '{ rows: any[]; error: unknown }',\n description: 'Erro ao deletar múltiplas linhas',\n },\n ],\n tags: ['widget', 'table', 'configurable', 'hasWizard', 'stable'],\n lib: '@praxisui/table',\n layoutHints: { recommendedCols: 8, recommendedRows: 6, minCols: 5, minRows: 4 },\n};\n\n/**\n * Provider que registra o metadata no ComponentMetadataRegistry durante o bootstrap.\n */\nexport function providePraxisTableMetadata(): Provider {\n return {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useFactory: (registry: ComponentMetadataRegistry) => () => {\n registry.register(PRAXIS_TABLE_COMPONENT_METADATA);\n },\n deps: [ComponentMetadataRegistry],\n } as Provider;\n}\n","/*\n * Public API Surface of praxis-table\n */\n\n// Core components and services\nexport * from './lib/praxis-table';\nexport * from './lib/praxis-table-toolbar';\nexport * from './lib/praxis-table-config-editor';\nexport * from './lib/components/praxis-filter';\nexport * from './lib/filter-drawer.adapter';\nexport * from './lib/services/filter-config.service';\nexport * from './lib/data-formatter/data-formatter-types';\nexport * from './lib/data-formatter/data-formatting.service';\nexport * from './lib/data-formatter/data-formatter.component';\nexport * from './lib/services/table-defaults.provider';\nexport * from './lib/utils/action-utils';\n\n// Editor components\nexport * from './lib/behavior-config-editor/behavior-config-editor.component';\nexport * from './lib/columns-config-editor/columns-config-editor.component';\nexport * from './lib/messages-localization-editor/messages-localization-editor.component';\nexport * from './lib/toolbar-actions-editor/toolbar-actions-editor.component';\nexport * from './lib/value-mapping-editor/value-mapping-editor.component';\nexport * from './lib/json-config-editor/json-config-editor.component';\nexport * from './lib/filter-settings/filter-settings.component';\nexport * from './lib/visual-rules-editor/table-visual-rules-editor.component';\nexport * from './lib/visual-rules-editor/table-rule-converters';\n\n// Integration and utilities\nexport * from './lib/visual-formula-builder/visual-formula-builder.component';\nexport * from './lib/visual-formula-builder/formula-generator.service';\nexport * from './lib/visual-formula-builder/formula-types';\nexport * from './lib/praxis-table.metadata';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i5","i1.FormulaGeneratorService","i3","i4","i6","i7","i8","i10","i12","i1","i11","i1.DataFormattingService","i9","i13","i14","debounceTime","takeUntil","i2.FilterConfigService","i15","take","i3.DataFormattingService","i5.TableDefaultsProvider","i7.FilterConfigService","i17","i18"],"mappings":"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"}