@praxisui/crud 1.0.0-beta.21 → 1.0.0-beta.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/praxisui-crud.mjs +16 -15
- package/fesm2022/praxisui-crud.mjs.map +1 -1
- package/index.d.ts +2 -0
- package/package.json +9 -9
|
@@ -6,7 +6,7 @@ import * as i1 from '@angular/material/dialog';
|
|
|
6
6
|
import { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
|
|
7
7
|
export { MAT_DIALOG_DATA as DIALOG_DATA } from '@angular/material/dialog';
|
|
8
8
|
import * as i2 from '@praxisui/core';
|
|
9
|
-
import { CONFIG_STORAGE, GlobalConfigService, fillUndefined, EmptyStateCardComponent, PraxisIconDirective, GenericCrudService, ComponentMetadataRegistry } from '@praxisui/core';
|
|
9
|
+
import { CONFIG_STORAGE, GlobalConfigService, fillUndefined, createDefaultTableConfig, EmptyStateCardComponent, PraxisIconDirective, GenericCrudService, ComponentMetadataRegistry } from '@praxisui/core';
|
|
10
10
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
11
11
|
import { MatSnackBar } from '@angular/material/snack-bar';
|
|
12
12
|
import * as i1$1 from '@angular/common';
|
|
@@ -280,6 +280,8 @@ class PraxisCrudComponent {
|
|
|
280
280
|
resolvedMetadata;
|
|
281
281
|
/** Configuração efetiva da tabela com melhorias automáticas (ex.: botão Adicionar). */
|
|
282
282
|
effectiveTableConfig;
|
|
283
|
+
/** Config passado ao PraxisTable — sempre definido (fallback seguro). */
|
|
284
|
+
tableConfigForBinding = createDefaultTableConfig();
|
|
283
285
|
launcher = inject(CrudLauncherService);
|
|
284
286
|
table;
|
|
285
287
|
storage = inject(CONFIG_STORAGE);
|
|
@@ -308,6 +310,11 @@ class PraxisCrudComponent {
|
|
|
308
310
|
: this.metadata;
|
|
309
311
|
assertCrudMetadata(this.resolvedMetadata);
|
|
310
312
|
this.effectiveTableConfig = this.buildEffectiveTableConfig(this.resolvedMetadata);
|
|
313
|
+
// Evitar passar undefined para [config], o que sobrescreve o default do PraxisTable
|
|
314
|
+
this.tableConfigForBinding =
|
|
315
|
+
this.effectiveTableConfig ||
|
|
316
|
+
(this.resolvedMetadata.table ??
|
|
317
|
+
createDefaultTableConfig());
|
|
311
318
|
// Build a stable table context when metadata changes
|
|
312
319
|
this.tableCrudContext = this.buildTableCrudContext(this.resolvedMetadata);
|
|
313
320
|
}
|
|
@@ -468,7 +475,7 @@ class PraxisCrudComponent {
|
|
|
468
475
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.4", type: PraxisCrudComponent, isStandalone: true, selector: "praxis-crud", inputs: { debugLayout: "debugLayout", metadata: "metadata", context: "context", editModeEnabled: "editModeEnabled" }, outputs: { configureRequested: "configureRequested", afterOpen: "afterOpen", afterClose: "afterClose", afterSave: "afterSave", afterDelete: "afterDelete", error: "error" }, viewQueries: [{ propertyName: "table", first: true, predicate: PraxisTable, descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
469
476
|
@if ($any(resolvedMetadata)?.resource?.path) {
|
|
470
477
|
<praxis-table
|
|
471
|
-
[config]="
|
|
478
|
+
[config]="tableConfigForBinding"
|
|
472
479
|
[resourcePath]="resolvedMetadata.resource?.path"
|
|
473
480
|
[tableId]="resolvedMetadata.resource?.path || 'default'"
|
|
474
481
|
[crudContext]="tableCrudContext"
|
|
@@ -499,7 +506,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImpor
|
|
|
499
506
|
template: `
|
|
500
507
|
@if ($any(resolvedMetadata)?.resource?.path) {
|
|
501
508
|
<praxis-table
|
|
502
|
-
[config]="
|
|
509
|
+
[config]="tableConfigForBinding"
|
|
503
510
|
[resourcePath]="resolvedMetadata.resource?.path"
|
|
504
511
|
[tableId]="resolvedMetadata.resource?.path || 'default'"
|
|
505
512
|
[crudContext]="tableCrudContext"
|
|
@@ -749,13 +756,9 @@ class DynamicFormDialogHostComponent {
|
|
|
749
756
|
mat-icon-button
|
|
750
757
|
type="button"
|
|
751
758
|
(click)="toggleMaximize()"
|
|
752
|
-
[attr.aria-label]="
|
|
753
|
-
maximized ? texts.restoreLabel : texts.maximizeLabel
|
|
754
|
-
"
|
|
759
|
+
[attr.aria-label]="maximized ? texts.restoreLabel : texts.maximizeLabel"
|
|
755
760
|
>
|
|
756
|
-
<mat-icon>
|
|
757
|
-
maximized ? 'close_fullscreen' : 'open_in_full'
|
|
758
|
-
}}</mat-icon>
|
|
761
|
+
<mat-icon [praxisIcon]="maximized ? 'close_fullscreen' : 'open_in_full'"></mat-icon>
|
|
759
762
|
</button>
|
|
760
763
|
}
|
|
761
764
|
<button
|
|
@@ -778,6 +781,7 @@ class DynamicFormDialogHostComponent {
|
|
|
778
781
|
[resourcePath]="resourcePath"
|
|
779
782
|
[resourceId]="resourceId"
|
|
780
783
|
[mode]="mode"
|
|
784
|
+
[presentationModeGlobal]="mode === 'view' ? true : null"
|
|
781
785
|
[backConfig]="backConfig"
|
|
782
786
|
(formSubmit)="onSave($event)"
|
|
783
787
|
(formCancel)="onCancel()"
|
|
@@ -808,13 +812,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImpor
|
|
|
808
812
|
mat-icon-button
|
|
809
813
|
type="button"
|
|
810
814
|
(click)="toggleMaximize()"
|
|
811
|
-
[attr.aria-label]="
|
|
812
|
-
maximized ? texts.restoreLabel : texts.maximizeLabel
|
|
813
|
-
"
|
|
815
|
+
[attr.aria-label]="maximized ? texts.restoreLabel : texts.maximizeLabel"
|
|
814
816
|
>
|
|
815
|
-
<mat-icon>
|
|
816
|
-
maximized ? 'close_fullscreen' : 'open_in_full'
|
|
817
|
-
}}</mat-icon>
|
|
817
|
+
<mat-icon [praxisIcon]="maximized ? 'close_fullscreen' : 'open_in_full'"></mat-icon>
|
|
818
818
|
</button>
|
|
819
819
|
}
|
|
820
820
|
<button
|
|
@@ -837,6 +837,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImpor
|
|
|
837
837
|
[resourcePath]="resourcePath"
|
|
838
838
|
[resourceId]="resourceId"
|
|
839
839
|
[mode]="mode"
|
|
840
|
+
[presentationModeGlobal]="mode === 'view' ? true : null"
|
|
840
841
|
[backConfig]="backConfig"
|
|
841
842
|
(formSubmit)="onSave($event)"
|
|
842
843
|
(formCancel)="onCancel()"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"praxisui-crud.mjs","sources":["../../../projects/praxis-crud/src/lib/dialog.service.ts","../../../projects/praxis-crud/src/lib/drawer.adapter.ts","../../../projects/praxis-crud/src/lib/crud-launcher.service.ts","../../../projects/praxis-crud/src/lib/crud.types.ts","../../../projects/praxis-crud/src/lib/praxis-crud.component.ts","../../../projects/praxis-crud/src/lib/dynamic-form-dialog-host.component.ts","../../../projects/praxis-crud/src/lib/praxis-crud.metadata.ts","../../../projects/praxis-crud/src/lib/crud-page-header.component.ts","../../../projects/praxis-crud/src/public-api.ts","../../../projects/praxis-crud/src/praxisui-crud.ts"],"sourcesContent":["import { Injectable, NgZone } from '@angular/core';\nimport {\n MatDialog,\n MatDialogRef,\n MatDialogConfig,\n MAT_DIALOG_DATA,\n} from '@angular/material/dialog';\nimport { ComponentType } from '@angular/cdk/portal';\n\nexport type DialogRef<T = any, R = any> = MatDialogRef<T, R>;\n\nexport interface DialogConfig<D = any> extends MatDialogConfig<D> {\n /** Disable closing when user clicks on backdrop */\n disableCloseOnBackdrop?: boolean;\n /** Disable closing when user presses escape */\n disableCloseOnEsc?: boolean;\n /** Enable maximize button */\n canMaximize?: boolean;\n /** Start dialog maximized */\n startMaximized?: boolean;\n /** Screen width in px where dialog starts fullscreen */\n fullscreenBreakpoint?: number;\n}\n\nexport { MAT_DIALOG_DATA as DIALOG_DATA } from '@angular/material/dialog';\n\n@Injectable({ providedIn: 'root' })\nexport class DialogService {\n constructor(private matDialog: MatDialog, private zone: NgZone) {}\n\n open<T, D = unknown, R = unknown>(\n component: ComponentType<T>,\n config?: DialogConfig<D>,\n ): DialogRef<T, R> {\n return this.zone.run(() => this.matDialog.open(component, config));\n }\n\n async openAsync<T, D = unknown, R = unknown>(\n loader: () => Promise<ComponentType<T>>,\n config?: DialogConfig<D>,\n ): Promise<DialogRef<T, R>> {\n const component = await loader();\n return this.zone.run(() => this.matDialog.open(component, config));\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport type { CrudAction, CrudMetadata } from './crud.types';\n\nexport interface CrudDrawerOpenConfig {\n action: CrudAction;\n metadata: CrudMetadata;\n inputs: Record<string, unknown>;\n}\n\nexport interface CrudDrawerAdapter {\n open(config: CrudDrawerOpenConfig): Promise<void> | void;\n}\n\nexport const CRUD_DRAWER_ADAPTER = new InjectionToken<CrudDrawerAdapter>('CRUD_DRAWER_ADAPTER');\n\n","import { Injectable, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { CrudMetadata, CrudAction, FormOpenMode } from './crud.types';\nimport { DialogService, DialogRef } from './dialog.service';\nimport { CONFIG_STORAGE, ConfigStorage, GlobalConfigService, fillUndefined } from '@praxisui/core';\nimport { CRUD_DRAWER_ADAPTER, CrudDrawerAdapter } from './drawer.adapter';\n\n@Injectable({ providedIn: 'root' })\nexport class CrudLauncherService {\n private readonly router = inject(Router);\n private readonly dialog = inject(DialogService);\n private readonly storage = inject<ConfigStorage>(CONFIG_STORAGE);\n private readonly global = inject(GlobalConfigService);\n private readonly drawerAdapter = (() => {\n try { return inject<CrudDrawerAdapter>(CRUD_DRAWER_ADAPTER); } catch { return undefined as any; }\n })();\n\n async launch(\n action: CrudAction,\n row: Record<string, unknown> | undefined,\n metadata: CrudMetadata,\n ): Promise<{\n mode: FormOpenMode;\n ref?: DialogRef<any>;\n }> {\n // Carregar overrides de CRUD (se houver) e mesclar em uma cópia local\n const merged = this.mergeCrudOverrides(metadata, action);\n const mode = this.resolveOpenMode(merged.action, merged.metadata);\n console.debug('[CRUD:Launcher] mode=', mode, 'action=', action);\n\n if (mode === 'route') {\n if (!merged.action.route) {\n throw new Error(`Route not provided for action ${merged.action.action}`);\n }\n const url = this.buildRoute(merged.action, row, merged.metadata);\n await this.router.navigateByUrl(url);\n return { mode };\n }\n\n if (mode === 'drawer' && this.drawerAdapter) {\n const inputs = this.mapInputs(merged.action, row);\n const idField = merged.metadata.resource?.idField ?? 'id';\n if (row && inputs[idField] === undefined && (row as any)[idField] !== undefined) {\n inputs[idField] = (row as any)[idField];\n }\n await Promise.resolve(this.drawerAdapter.open({ action: merged.action, metadata: merged.metadata, inputs }));\n return { mode };\n }\n\n if (!merged.action.formId) {\n throw new Error(`formId not provided for action ${merged.action.action}`);\n }\n const inputs = this.mapInputs(merged.action, row);\n const idField = merged.metadata.resource?.idField ?? 'id';\n if (row && inputs[idField] === undefined && row[idField] !== undefined) {\n inputs[idField] = row[idField];\n }\n const modalCfg = { ...(merged.metadata.defaults?.modal || {}) } as any;\n\n console.debug('[CRUD:Launcher] opening dialog with:', {\n action: merged.action.action,\n formId: merged.action.formId,\n inputs,\n modalCfg,\n resourcePath:\n merged.metadata.resource?.path ?? (merged.metadata.table as any)?.resourcePath,\n });\n const panelClasses = ['pfx-dialog-pane', 'pfx-dialog-frosted'];\n if (modalCfg.panelClass) {\n panelClasses.push(modalCfg.panelClass);\n }\n // Backdrop style presets\n const backdropClasses: string[] = [];\n const style = modalCfg.backdropStyle as string | undefined;\n if (!style || style === 'blur') {\n backdropClasses.push('pfx-blur-backdrop');\n } else if (style === 'dim') {\n backdropClasses.push('cdk-overlay-dark-backdrop');\n } else if (style === 'transparent') {\n backdropClasses.push('pfx-transparent-backdrop');\n }\n if (modalCfg.backdropClass) {\n backdropClasses.push(modalCfg.backdropClass);\n }\n const ref = await this.dialog.openAsync(\n () =>\n import('./dynamic-form-dialog-host.component').then(\n (m) => m.DynamicFormDialogHostComponent,\n ),\n {\n ...modalCfg,\n panelClass: panelClasses,\n backdropClass: backdropClasses,\n autoFocus: modalCfg.autoFocus ?? true,\n restoreFocus: modalCfg.restoreFocus ?? true,\n minWidth: '360px',\n maxWidth: '95vw',\n ariaLabelledBy: 'crudDialogTitle',\n data: { action: merged.action, row, metadata: merged.metadata, inputs },\n },\n );\n return { mode, ref };\n }\n\n resolveOpenMode(action: CrudAction, metadata: CrudMetadata): FormOpenMode {\n // Local precedence: action > metadata.defaults\n const local = action.openMode ?? metadata.defaults?.openMode;\n if (local) return local;\n\n // Global fallback (action-specific, then general), then hard fallback 'route'\n try {\n const globalCrud = this.global.getCrud();\n const actionName = (action as any).action as string | undefined;\n const globalMode = (actionName && globalCrud?.actionDefaults?.[actionName]?.openMode) ?? globalCrud?.defaults?.openMode;\n let resolved: FormOpenMode = (globalMode as any) ?? 'route';\n // Safety: if modal/drawer but no formId, degrade to route to avoid runtime error\n if ((resolved === 'modal' || resolved === 'drawer') && !action.formId) {\n resolved = 'route';\n }\n return resolved;\n } catch {\n return 'route';\n }\n }\n\n private buildRoute(\n action: CrudAction,\n row: Record<string, unknown> | undefined,\n metadata: CrudMetadata,\n ): string {\n let route = action.route as string;\n const query: Record<string, string> = {};\n action.params?.forEach((p) => {\n const value = row?.[p.from];\n if (p.to === 'routeParam') {\n if (value === undefined || value === null) {\n throw new Error(`Missing value for route param ${p.name}`);\n }\n const re = new RegExp(`:${p.name}\\\\b`, 'g');\n route = route.replace(re, encodeURIComponent(String(value)));\n } else if (p.to === 'query' && value !== undefined && value !== null) {\n query[p.name] = String(value);\n }\n });\n const missing = route.match(/:[a-zA-Z0-9_-]+/g);\n if (missing) {\n throw new Error(\n `Missing route parameters for action \"${action.action}\": ${missing\n .map((m) => m.slice(1))\n .join(', ')}`,\n );\n }\n // Ensure resource is present for routed forms so the formId is deterministic\n try {\n const resourcePath =\n metadata.resource?.path || (metadata.table as any)?.resourcePath;\n if (resourcePath && query['resource'] === undefined) {\n query['resource'] = resourcePath as string;\n }\n } catch {}\n // ReturnTo param for graceful back navigation on routed forms\n const back = action.back || metadata.defaults?.back;\n const returnTo = back?.returnTo || this.router.url;\n if (returnTo) {\n query['returnTo'] = returnTo;\n }\n const queryString = new URLSearchParams(query).toString();\n return queryString ? `${route}?${queryString}` : route;\n }\n\n private mapInputs(\n action: CrudAction,\n row: Record<string, unknown> | undefined,\n ): Record<string, unknown> {\n const inputs: Record<string, unknown> = {};\n action.params?.forEach((p) => {\n if (p.to === 'input') {\n inputs[p.name] = row?.[p.from];\n }\n });\n return inputs;\n }\n\n private mergeCrudOverrides(\n metadata: CrudMetadata,\n action: CrudAction,\n ): { metadata: CrudMetadata; action: CrudAction } {\n try {\n const tableId =\n metadata.resource?.path || (metadata.table as any)?.resourcePath || 'default';\n const key = `crud-overrides:${tableId}`;\n const saved = (this.storage.loadConfig(key) as any) || {};\n const overDefaults = saved.defaults || {};\n const overActions = saved.actions || {};\n\n // Merge defaults (shallow for defaults, shallow for modal/back)\n let mergedDefaults: any = {\n ...(metadata.defaults || {}),\n ...('openMode' in overDefaults ? { openMode: overDefaults.openMode } : {}),\n modal: { ...(metadata.defaults?.modal || {}), ...(overDefaults.modal || {}) },\n back: { ...(metadata.defaults?.back || {}), ...(overDefaults.back || {}) },\n header: { ...(metadata.defaults?.header || {}), ...(overDefaults.header || {}) },\n };\n\n // Fill missing defaults from GlobalConfig (as last fallback)\n try {\n const globalCrud = this.global.getCrud();\n if (globalCrud?.defaults) {\n mergedDefaults = fillUndefined(mergedDefaults, globalCrud.defaults as any);\n }\n } catch {}\n\n // Merge metadata copy\n const mergedMetadata: CrudMetadata = {\n ...metadata,\n defaults: mergedDefaults,\n };\n\n // Action-level override\n const actOv = overActions[action.action] || {};\n const mergedAction: CrudAction = {\n ...action,\n ...('openMode' in actOv ? { openMode: actOv.openMode } : {}),\n ...('formId' in actOv ? { formId: actOv.formId } : {}),\n ...('route' in actOv ? { route: actOv.route } : {}),\n } as CrudAction;\n\n return { metadata: mergedMetadata, action: mergedAction };\n } catch {\n return { metadata, action };\n }\n }\n}\n","import { DialogConfig } from './dialog.service';\nimport {\n TableConfig,\n FormConfig,\n RowAction,\n ToolbarAction,\n ApiEndpoint,\n} from '@praxisui/core';\nimport type { BackConfig } from '@praxisui/core';\n\nexport type FormOpenMode = 'route' | 'modal' | 'drawer';\n\nexport interface CrudParamMapping {\n from: string;\n to: 'routeParam' | 'query' | 'input';\n name: string;\n}\n\nexport type CrudAction = (RowAction | ToolbarAction) & {\n openMode?: FormOpenMode;\n route?: string;\n formId?: string;\n params?: CrudParamMapping[];\n back?: BackConfig;\n};\n\nexport interface CrudDefaults {\n openMode?: FormOpenMode;\n modal?: DialogConfig;\n back?: BackConfig;\n header?: CrudHeaderConfig;\n}\n\nexport interface CrudResource {\n path: string;\n idField?: string | number;\n endpointKey?: ApiEndpoint;\n}\n\nexport interface CrudMetadata {\n component: 'praxis-crud';\n resource?: CrudResource;\n table: TableConfig;\n form?: FormConfig;\n defaults?: CrudDefaults;\n actions?: CrudAction[];\n i18n?: { crudDialog?: Record<string, string> };\n}\n\n// BackConfig moved to @praxisui/core to avoid DF↔CRUD cycle\nexport type { BackConfig };\n\nexport interface CrudHeaderConfig {\n showBack?: boolean;\n backLabel?: string;\n variant?: 'ghost' | 'tonal' | 'outlined';\n sticky?: boolean;\n breadcrumbs?: boolean;\n divider?: boolean;\n}\n\nexport function assertCrudMetadata(meta: CrudMetadata): void {\n meta.actions?.forEach((action) => {\n const mode = action.openMode ?? meta.defaults?.openMode ?? 'route';\n if (mode === 'route' && !action.route) {\n throw new Error(`Route not provided for action ${action.action}`);\n }\n if ((mode === 'modal' || mode === 'drawer') && !action.formId) {\n throw new Error(`formId not provided for action ${action.action}`);\n }\n action.params?.forEach((p) => {\n if (!['routeParam', 'query', 'input'].includes(p.to)) {\n throw new Error(`Invalid param mapping target: ${p.to}`);\n }\n });\n });\n}\n","import {\n Component,\n EventEmitter,\n Input,\n Output,\n inject,\n OnChanges,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { PraxisTable } from '@praxisui/table';\nimport { CrudLauncherService } from './crud-launcher.service';\nimport { CrudMetadata, FormOpenMode, assertCrudMetadata, CrudAction } from './crud.types';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { TableConfig, CONFIG_STORAGE, ConfigStorage } from '@praxisui/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { EmptyStateCardComponent } from '@praxisui/core';\n\n@Component({\n selector: 'praxis-crud',\n standalone: true,\n imports: [PraxisTable, EmptyStateCardComponent],\n template: `\n @if ($any(resolvedMetadata)?.resource?.path) {\n <praxis-table\n [config]=\"effectiveTableConfig || resolvedMetadata.table\"\n [resourcePath]=\"resolvedMetadata.resource?.path\"\n [tableId]=\"resolvedMetadata.resource?.path || 'default'\"\n [crudContext]=\"tableCrudContext\"\n [editModeEnabled]=\"editModeEnabled\"\n (rowAction)=\"onAction($event.action, $event.row)\"\n (toolbarAction)=\"onAction($event.action)\"\n (reset)=\"onResetPreferences()\"\n [debugLayout]=\"debugLayout\"\n ></praxis-table>\n } @else {\n @if (editModeEnabled) {\n <praxis-empty-state-card\n icon=\"table_rows\"\n [title]=\"'Conecte o CRUD a um recurso'\"\n [description]=\"'Informe os metadados (resourcePath / schema) para habilitar a tabela e ações.'\"\n [primaryAction]=\"{ label: 'Configurar metadados', icon: 'bolt', action: onConfigureRequested.bind(this) }\"\n />\n }\n }\n `,\n})\nexport class PraxisCrudComponent implements OnChanges {\n /** Habilita visual de debug para alinhamento/layouot */\n @Input() debugLayout = false;\n /** JSON inline ou chave/URL resolvida pelo MetadataResolver */\n @Input({ required: true }) metadata!: CrudMetadata | string;\n @Input() context?: Record<string, unknown>;\n /** Encaminha o modo de edição de layout para a tabela interna */\n @Input() editModeEnabled = false;\n /** CTA: usado pelo Builder para abrir configuração de metadados quando vazio */\n @Output() configureRequested = new EventEmitter<void>();\n @Output() afterOpen = new EventEmitter<{\n mode: FormOpenMode;\n action: string;\n }>();\n @Output() afterClose = new EventEmitter<void>();\n @Output() afterSave = new EventEmitter<{\n id: string | number;\n data: unknown;\n }>();\n @Output() afterDelete = new EventEmitter<{ id: string | number }>();\n @Output() error = new EventEmitter<unknown>();\n\n resolvedMetadata!: CrudMetadata;\n /** Configuração efetiva da tabela com melhorias automáticas (ex.: botão Adicionar). */\n effectiveTableConfig?: TableConfig;\n private readonly launcher = inject(CrudLauncherService);\n @ViewChild(PraxisTable) private table!: PraxisTable;\n private readonly storage = inject<ConfigStorage>(CONFIG_STORAGE);\n private readonly snack = inject(MatSnackBar);\n /**\n * Stable CRUD context passed to PraxisTable.\n * Previously this was created via a getter, producing a new object each CD tick\n * and causing excessive re-renders. Now we compute it only when metadata changes.\n */\n tableCrudContext?: {\n tableId: string;\n resourcePath?: string;\n defaults?: any;\n actions?: Array<{\n action: string;\n label?: string;\n formId?: string;\n route?: string;\n openMode?: 'modal' | 'route';\n }>;\n };\n\n onResetPreferences(): void {\n try {\n const id = this.resolvedMetadata?.resource?.path || 'default';\n const key = `crud-overrides:${id}`;\n this.storage.clearConfig(key);\n this.snack.open('Overrides de CRUD redefinidos', undefined, { duration: 2000 });\n } catch {}\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['metadata']) {\n try {\n this.resolvedMetadata =\n typeof this.metadata === 'string'\n ? (JSON.parse(this.metadata) as CrudMetadata)\n : this.metadata;\n assertCrudMetadata(this.resolvedMetadata);\n this.effectiveTableConfig = this.buildEffectiveTableConfig(\n this.resolvedMetadata,\n );\n // Build a stable table context when metadata changes\n this.tableCrudContext = this.buildTableCrudContext(this.resolvedMetadata);\n } catch (err) {\n this.error.emit(err);\n }\n }\n }\n\n async onAction(action: string, row?: Record<string, unknown>): Promise<void> {\n try {\n (document.activeElement as HTMLElement | null)?.blur();\n let actionMeta = this.resolvedMetadata.actions?.find(\n (a) => a.action === action,\n );\n // Fallback: if metadata.actions is missing or doesn't include the action,\n // synthesize from table CRUD context or let overrides drive behavior.\n if (!actionMeta) {\n const ctxAction = this.tableCrudContext?.actions?.find((a) => a.action === action);\n if (ctxAction) {\n actionMeta = {\n action: ctxAction.action,\n openMode: ctxAction.openMode as any,\n formId: ctxAction.formId,\n route: ctxAction.route,\n } as any;\n } else {\n // Minimal stub – CrudLauncherService will merge overrides/defaults\n actionMeta = { action } as any;\n }\n }\n const effectiveAction = (actionMeta || { action } as any) as CrudAction;\n const { mode, ref } = await this.launcher.launch(\n effectiveAction,\n row,\n this.resolvedMetadata,\n );\n this.afterOpen.emit({ mode, action: effectiveAction.action });\n if (ref) {\n const idField = this.getIdField();\n ref\n .afterClosed()\n .pipe(takeUntilDestroyed())\n .subscribe((result) => {\n this.afterClose.emit();\n if (result?.type === 'save') {\n const data = result.data as Record<string, unknown>;\n const id = data?.[idField] as string | number;\n this.afterSave.emit({ id, data: result.data });\n this.refreshTable();\n }\n if (result?.type === 'delete') {\n const data = result.data as Record<string, unknown>;\n const id = data?.[idField] as string | number;\n this.afterDelete.emit({ id });\n this.refreshTable();\n }\n });\n }\n } catch (err) {\n this.error.emit(err);\n }\n }\n\n private refreshTable(): void {\n this.table.refetch();\n }\n\n private getIdField(): string {\n return (this.resolvedMetadata?.resource?.idField as string) || 'id';\n }\n\n onConfigureRequested(): void {\n this.configureRequested.emit();\n }\n\n /**\n * Constrói uma configuração de tabela efetiva a partir dos metadados,\n * adicionando automaticamente a ação de \"Adicionar\" na toolbar quando aplicável.\n * - Evita duplicidade se a toolbar já tiver ação equivalente.\n * - Garante visibilidade da toolbar quando a ação é injetada.\n */\n private buildEffectiveTableConfig(meta: CrudMetadata): TableConfig | undefined {\n const base = meta.table as TableConfig | undefined;\n if (!base) return undefined;\n\n // Clonar para evitar mutações\n const cfg: TableConfig = JSON.parse(JSON.stringify(base));\n\n const ensureToolbar = () => {\n if (!cfg.toolbar) {\n (cfg as any).toolbar = { visible: true, position: 'top' } as any;\n }\n return (cfg as any).toolbar as any;\n };\n\n // Detectar se já existe ação de adicionar na toolbar\n const hasToolbarAdd = (cfg.toolbar?.actions || []).some((a: any) =>\n this.isAddLike(a),\n );\n\n // Procurar mapeamento de ação \"adicionar/criar\" nos metadados do CRUD\n const addAction = (meta.actions || []).find((a: any) => this.isAddLike(a));\n\n // Se não houver mapeamento \"add/create\", não vamos injetar nada\n if (!addAction) {\n return hasToolbarAdd ? cfg : undefined;\n }\n\n // Se já existe na toolbar, apenas garantir visibilidade se necessário\n if (hasToolbarAdd) {\n const tb = ensureToolbar();\n tb.visible = true;\n return cfg;\n }\n\n // Injetar ação na toolbar\n const tb = ensureToolbar();\n tb.visible = true;\n if (!tb.actions) tb.actions = [] as any;\n\n const injected = {\n id: addAction.id || 'add',\n label: addAction.label || 'Adicionar',\n icon: addAction.icon || 'add',\n type: 'button',\n color: 'primary',\n position: 'end',\n action: addAction.action || 'add',\n } as any;\n (tb.actions as any[]).push(injected);\n return cfg;\n }\n\n /** Heurística leve para identificar ações do tipo \"adicionar/criar\" */\n private isAddLike(a: any): boolean {\n if (!a) return false;\n const normalize = (s?: any) => String(s || '').trim().toLowerCase();\n const id = normalize(a.action || a.id || a.code || a.key || a.name || a.type);\n const icon = normalize(a.icon);\n const label = normalize(a.label);\n const addIds = new Set(['add', 'create', 'novo', 'new', 'incluir', 'inserir']);\n if (addIds.has(id)) return true;\n if (icon === 'add' || icon === 'add_circle' || icon === 'add_box') return true;\n if (label === 'adicionar' || label === 'novo' || label === 'criar' || label === 'incluir')\n return true;\n return false;\n }\n\n /** Builds a stable CRUD context object for PraxisTable based on metadata. */\n private buildTableCrudContext(meta: CrudMetadata):\n | {\n tableId: string;\n resourcePath?: string;\n defaults?: any;\n actions?: Array<{\n action: string;\n label?: string;\n formId?: string;\n route?: string;\n openMode?: 'modal' | 'route';\n }>;\n idField?: string;\n }\n | undefined {\n if (!meta) return undefined;\n // Provide a minimal default action set when metadata.actions is empty,\n // so the editor can expose per-action overrides entirely via UI.\n const baseActions = meta.actions && meta.actions.length\n ? meta.actions\n : ([{ action: 'create' }, { action: 'view' }, { action: 'edit' }] as any[]);\n return {\n tableId: meta.resource?.path || (meta.table as any)?.resourcePath || 'default',\n resourcePath: meta.resource?.path || (meta.table as any)?.resourcePath,\n defaults: meta.defaults,\n actions: baseActions.map((a: any) => ({\n action: a.action,\n label: a.label,\n formId: a.formId,\n route: a.route,\n openMode: a.openMode,\n })),\n idField: (meta.resource as any)?.idField || 'id',\n };\n }\n}\n","import { Component, Inject, ViewChild, OnInit, DestroyRef, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogModule, MatDialogRef } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisDynamicForm } from '@praxisui/dynamic-form';\nimport { GenericCrudService, CONFIG_STORAGE, ConfigStorage, PraxisIconDirective } from '@praxisui/core';\nimport { DialogService, DialogRef, DIALOG_DATA } from './dialog.service';\nimport { ConfirmDialogComponent } from '@praxisui/dynamic-fields';\nimport { filter } from 'rxjs/operators';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'praxis-dynamic-form-dialog-host',\n standalone: true,\n imports: [\n CommonModule,\n MatDialogModule,\n MatButtonModule,\n MatIconModule,\n PraxisIconDirective,\n PraxisDynamicForm,\n ],\n providers: [GenericCrudService],\n host: {\n class: 'praxis-dialog',\n '[attr.data-density]': 'modal.density || \"default\"',\n },\n template: `\n <div class=\"dialog-header\">\n <h2 id=\"crudDialogTitle\" class=\"dialog-title\">\n {{ data.action?.label || texts.title }}\n </h2>\n <span class=\"spacer\"></span>\n @if (modal.canMaximize) {\n <button\n mat-icon-button\n type=\"button\"\n (click)=\"toggleMaximize()\"\n [attr.aria-label]=\"\n maximized ? texts.restoreLabel : texts.maximizeLabel\n \"\n >\n <mat-icon>{{\n maximized ? 'close_fullscreen' : 'open_in_full'\n }}</mat-icon>\n </button>\n }\n <button\n mat-icon-button\n type=\"button\"\n (click)=\"onCancel()\"\n [attr.aria-label]=\"texts.closeLabel\"\n cdkFocusInitial\n >\n <mat-icon [praxisIcon]=\"'close'\"></mat-icon>\n </button>\n </div>\n\n <mat-dialog-content\n class=\"dialog-content\"\n aria-labelledby=\"crudDialogTitle\"\n >\n <praxis-dynamic-form\n [formId]=\"data.action?.formId\"\n [resourcePath]=\"resourcePath\"\n [resourceId]=\"resourceId\"\n [mode]=\"mode\"\n [backConfig]=\"backConfig\"\n (formSubmit)=\"onSave($event)\"\n (formCancel)=\"onCancel()\"\n ></praxis-dynamic-form>\n </mat-dialog-content>\n `,\n styles: [\n `\n :host {\n --dlg-header-h: 56px;\n --dlg-footer-h: 56px;\n --dlg-pad: 16px;\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n }\n :host([data-density='compact']) {\n --dlg-header-h: 44px;\n --dlg-footer-h: 44px;\n --dlg-pad: 12px;\n }\n .dialog-header {\n position: sticky;\n top: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n gap: var(--dlg-pad);\n padding: 0 var(--dlg-pad);\n height: var(--dlg-header-h);\n background: var(--md-sys-color-surface-container-high);\n border-bottom: 1px solid var(--md-sys-color-outline-variant);\n color: var(--md-sys-color-on-surface);\n }\n .dialog-title {\n margin: 0;\n font: inherit;\n font-weight: 600;\n color: var(--md-sys-color-on-surface);\n }\n .spacer {\n flex: 1;\n }\n .dialog-content {\n overflow: auto;\n padding: var(--dlg-pad);\n /* use small viewport height to avoid mobile chrome jumps */\n max-height: calc(100svh - var(--dlg-header-h) - 32px);\n }\n .dialog-header button.mat-icon-button { color: var(--md-sys-color-on-surface-variant); }\n .dialog-header button.mat-icon-button:hover {\n color: var(--md-sys-color-primary);\n background: color-mix(in srgb, var(--md-sys-color-primary), transparent 90%);\n }\n .dialog-footer {\n position: sticky;\n bottom: 0;\n z-index: 1;\n padding: var(--dlg-pad);\n }\n `,\n ],\n})\nexport class DynamicFormDialogHostComponent implements OnInit {\n @ViewChild(PraxisDynamicForm) formComp?: PraxisDynamicForm;\n modal: any = {};\n maximized = false;\n private initialSize: { width?: string; height?: string } = {};\n private rememberState = false;\n private stateKey?: string;\n private destroyRef: DestroyRef = inject(DestroyRef);\n\n resourcePath?: string;\n resourceId?: string | number;\n mode: 'create' | 'edit' | 'view' = 'create';\n backConfig?: import('./crud.types').BackConfig;\n private idField = 'id';\n\n texts = {\n title: 'Formulário',\n close: 'Fechar',\n closeLabel: 'Fechar diálogo',\n maximizeLabel: 'Maximizar',\n restoreLabel: 'Restaurar',\n discardTitle: 'Descartar alterações?',\n discardMessage:\n 'Você tem alterações não salvas. Deseja fechar assim mesmo?',\n discardConfirm: 'Descartar',\n discardCancel: 'Cancelar',\n } as Record<string, string>;\n\n constructor(\n @Inject(MatDialogRef)\n public dialogRef: DialogRef<DynamicFormDialogHostComponent>,\n @Inject(DIALOG_DATA) public data: any,\n private dialogService: DialogService,\n private crud: GenericCrudService<any>,\n @Inject(CONFIG_STORAGE) private configStorage: ConfigStorage,\n ) {\n this.dialogRef.disableClose = true;\n\n // i18n\n this.texts = {\n ...this.texts,\n ...(this.data.metadata?.i18n?.crudDialog || {}),\n };\n\n // defaults do modal (inclui canMaximize: true)\n this.modal = {\n canMaximize: true,\n ...(this.data.metadata?.defaults?.modal || {}),\n };\n this.rememberState = !!this.modal.rememberLastState;\n this.stateKey = this.data.action?.formId\n ? `crud-dialog-state:${this.data.action.formId}`\n : undefined;\n\n // derivar path/id/mode\n this.resourcePath =\n this.data.metadata?.resource?.path ??\n this.data.metadata?.table?.resourcePath;\n\n if (this.resourcePath) {\n this.crud.configure(\n this.resourcePath,\n this.data.metadata?.resource?.endpointKey,\n );\n }\n\n this.idField = this.data.metadata?.resource?.idField ?? 'id';\n this.resourceId = this.data.inputs?.[this.idField];\n\n const act = this.data.action?.action;\n this.mode = act === 'edit' ? 'edit' : act === 'view' ? 'view' : 'create';\n\n // Back config: defaults from metadata/action, overridden by saved per-form config\n const defaults = (this.data.action?.back || this.data.metadata?.defaults?.back) || {};\n const saved = this.data.action?.formId\n ? this.configStorage.loadConfig(`crud-back:${this.data.action.formId}`)\n : null;\n this.backConfig = { ...defaults, ...(saved || {}) };\n\n console.debug('[CRUD:Host] constructed', {\n action: this.data?.action,\n resourcePath: this.resourcePath,\n resourceId: this.resourceId,\n mode: this.mode,\n modal: this.modal,\n backConfig: this.backConfig,\n });\n\n // Esc\n if (!this.modal.disableCloseOnEsc) {\n this.dialogRef\n .keydownEvents()\n .pipe(\n filter((e) => e.key === 'Escape'),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => this.onCancel());\n }\n\n // Backdrop\n if (!this.modal.disableCloseOnBackdrop) {\n this.dialogRef\n .backdropClick()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.onCancel());\n }\n\n // Salvar estado ao fechar, se aplicável\n this.dialogRef\n .afterClosed()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.saveState());\n }\n\n ngOnInit(): void {\n // Carregar estado salvo (se habilitado)\n const saved = this.rememberState && this.stateKey\n ? (this.configStorage.loadConfig(this.stateKey) as any)\n : null;\n this.initialSize = {\n width: saved?.width ?? this.modal.width,\n height: saved?.height ?? this.modal.height,\n };\n console.debug('[CRUD:Host] ngOnInit', {\n initialSize: this.initialSize,\n startMaximized: this.modal.startMaximized,\n fullscreenBreakpoint: this.modal.fullscreenBreakpoint,\n });\n let shouldMax = false;\n if (saved && typeof saved.maximized === 'boolean') {\n shouldMax = !!saved.maximized;\n } else {\n shouldMax =\n this.modal.startMaximized ||\n (this.modal.fullscreenBreakpoint &&\n window.innerWidth <= this.modal.fullscreenBreakpoint);\n }\n if (shouldMax) {\n this.toggleMaximize(true);\n } else if (this.initialSize.width || this.initialSize.height) {\n this.dialogRef.updateSize(this.initialSize.width, this.initialSize.height);\n this.dialogRef.updatePosition();\n }\n }\n\n onSave(result: unknown): void {\n if (this.modal.closeOnSave === false) {\n // Não fechar: manter aberto e opcionalmente salvar estado atual\n this.saveState();\n return;\n }\n this.dialogRef.close({ type: 'save', data: result });\n }\n\n onCancel(): void {\n const dirty = this.formComp?.form.dirty;\n const backCfg = (this.data.action?.back || this.data.metadata?.defaults?.back) || {};\n const confirm = backCfg.confirmOnDirty ?? true;\n if (dirty && confirm) {\n const ref = this.dialogService.open(ConfirmDialogComponent, {\n data: {\n title: this.texts.discardTitle,\n message: this.texts.discardMessage,\n confirmText: this.texts.discardConfirm,\n cancelText: this.texts.discardCancel,\n type: 'warning',\n },\n });\n ref\n .afterClosed()\n .pipe(\n filter((confirmed) => !!confirmed),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => this.dialogRef.close());\n } else {\n this.dialogRef.close();\n }\n }\n\n toggleMaximize(initial = false): void {\n this.maximized = initial ? true : !this.maximized;\n const gap = this.maximized ? this.modal.edgeGap ?? 8 : undefined;\n const width = this.maximized\n ? `calc(100vw - ${2 * (gap ?? 0)}px)`\n : this.initialSize.width;\n const height = this.maximized\n ? `calc(100dvh - ${2 * (gap ?? 0)}px)`\n : this.initialSize.height;\n\n this.dialogRef.updateSize(width, height);\n this.dialogRef.updatePosition();\n\n const pane: HTMLElement | undefined = (this.dialogRef as any)\n ?._containerInstance?._elementRef?.nativeElement?.parentElement;\n if (pane && pane.classList.contains('pfx-dialog-pane')) {\n pane.style.margin = this.maximized ? `${gap}px` : '';\n }\n this.saveState();\n }\n\n private saveState(): void {\n if (!this.rememberState || !this.stateKey) return;\n const pane: HTMLElement | undefined = (this.dialogRef as any)\n ?._containerInstance?._elementRef?.nativeElement?.parentElement;\n const style = pane ? getComputedStyle(pane) : null;\n const currentWidth = style?.width || this.initialSize.width;\n const currentHeight = style?.height || this.initialSize.height;\n this.configStorage.saveConfig(this.stateKey, {\n maximized: this.maximized,\n width: currentWidth,\n height: currentHeight,\n });\n }\n}\n","import { ComponentDocMeta, ComponentMetadataRegistry } from '@praxisui/core';\nimport { PraxisCrudComponent } from './praxis-crud.component';\nimport { CrudMetadata, FormOpenMode } from './crud.types';\nimport { ENVIRONMENT_INITIALIZER, Provider } from '@angular/core';\n\n/** Metadata for PraxisCrudComponent */\nexport const PRAXIS_CRUD_COMPONENT_METADATA: ComponentDocMeta = {\n id: 'praxis-crud',\n selector: 'praxis-crud',\n component: PraxisCrudComponent,\n friendlyName: 'Praxis CRUD',\n description: 'Tabela com operações de CRUD via metadados.',\n icon: 'table_chart',\n inputs: [\n {\n name: 'metadata',\n type: 'CrudMetadata | string',\n description: 'Metadados de configuração do CRUD',\n },\n {\n name: 'context',\n type: 'Record<string, unknown>',\n description: 'Contexto adicional para resoluções',\n },\n {\n name: 'editModeEnabled',\n type: 'boolean',\n default: false,\n description: 'Habilita modo de edição do layout',\n },\n ],\n outputs: [\n {\n name: 'afterOpen',\n type: '{ mode: FormOpenMode; action: string }',\n description: 'Emitido após abrir diálogo',\n },\n {\n name: 'afterClose',\n type: 'void',\n description: 'Emitido após fechar diálogo',\n },\n {\n name: 'afterSave',\n type: '{ id: string | number; data: unknown }',\n description: 'Emitido ao salvar',\n },\n {\n name: 'afterDelete',\n type: '{ id: string | number }',\n description: 'Emitido ao deletar',\n },\n { name: 'error', type: 'unknown', description: 'Emitido em erros' },\n {\n name: 'configureRequested',\n type: 'void',\n description: 'Emitido quando CTA de configuração é acionado em modo edição',\n },\n ],\n tags: ['widget', 'crud', 'configurable', 'hasWizard', 'stable'],\n lib: '@praxisui/crud',\n};\n\n/** Provider para auto-registrar metadados do componente CRUD. */\nexport function providePraxisCrudMetadata(): Provider {\n return {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useFactory: (registry: ComponentMetadataRegistry) => () => {\n registry.register(PRAXIS_CRUD_COMPONENT_METADATA);\n },\n deps: [ComponentMetadataRegistry],\n } as Provider;\n}\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink } from '@angular/router';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } from '@praxisui/core';\n\nexport type CrudHeaderVariant = 'ghost' | 'tonal' | 'outlined';\n\n@Component({\n selector: 'praxis-crud-page-header',\n standalone: true,\n imports: [CommonModule, RouterLink, MatButtonModule, MatIconModule, PraxisIconDirective],\n template: `\n <header\n class=\"crud-header\"\n [class.sticky]=\"sticky\"\n [class.with-divider]=\"divider\"\n >\n <div class=\"left\">\n <a\n *ngIf=\"showBack && returnTo\"\n class=\"back-btn\"\n [class.ghost]=\"variant === 'ghost'\"\n [class.tonal]=\"variant === 'tonal'\"\n [class.outlined]=\"variant === 'outlined'\"\n [routerLink]=\"returnTo\"\n [attr.aria-label]=\"backLabel || 'Voltar'\"\n mat-button\n >\n <mat-icon [praxisIcon]=\"'arrow_back'\"></mat-icon>\n <span class=\"label\" [class.hide-on-narrow]=\"true\">{{ backLabel || 'Voltar' }}</span>\n </a>\n <h2 class=\"title\" [attr.title]=\"title\">{{ title }}</h2>\n </div>\n <div class=\"right\">\n <ng-content></ng-content>\n </div>\n </header>\n `,\n styles: [\n `\n .crud-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 8px 0;\n background: var(--md-sys-color-surface, transparent);\n }\n .crud-header.sticky {\n position: sticky;\n top: 0;\n z-index: 10;\n backdrop-filter: saturate(110%);\n }\n .crud-header.with-divider {\n border-bottom: 1px solid var(--md-sys-color-outline-variant, rgba(0,0,0,0.08));\n }\n .left { display: flex; align-items: center; gap: 8px; min-width: 0; }\n .right { display: flex; align-items: center; gap: 8px; }\n .title {\n margin: 0; font-weight: 600;\n color: var(--md-sys-color-on-surface, currentColor);\n font: var(--mdc-typography-title-large, 600 20px/28px system-ui);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n .back-btn { display: inline-flex; align-items: center; gap: 6px; text-decoration: none; }\n .back-btn .mat-mdc-button { padding-left: 0; }\n .back-btn mat-icon { color: var(--md-sys-color-on-surface-variant, currentColor); }\n .back-btn .label { color: var(--md-sys-color-on-surface-variant, currentColor); }\n\n /* Variants */\n .back-btn.ghost { border-radius: 20px; padding: 4px 8px; }\n .back-btn.ghost:hover { background: color-mix(in srgb, var(--md-sys-color-primary) 8%, transparent); }\n\n .back-btn.tonal {\n border-radius: 20px; padding: 4px 10px;\n background: var(--md-sys-color-surface-container, rgba(0,0,0,0.02));\n box-shadow: inset 0 0 0 1px var(--md-sys-color-outline-variant, rgba(0,0,0,0.06));\n }\n .back-btn.tonal:hover { background: color-mix(in srgb, var(--md-sys-color-primary) 10%, var(--md-sys-color-surface-container)); }\n\n .back-btn.outlined {\n border-radius: 20px; padding: 4px 10px;\n border: 1px solid var(--md-sys-color-outline-variant, rgba(0,0,0,0.12));\n background: var(--md-sys-color-surface, transparent);\n }\n .back-btn.outlined:hover {\n border-color: color-mix(in srgb, var(--md-sys-color-primary) 40%, var(--md-sys-color-outline-variant));\n background: color-mix(in srgb, var(--md-sys-color-primary) 6%, transparent);\n }\n\n /* Responsive: hide label on very narrow */\n @media (max-width: 599px) { .label.hide-on-narrow { display: none; } }\n `,\n ],\n})\nexport class CrudPageHeaderComponent {\n @Input() title = '';\n @Input() backLabel?: string;\n @Input() showBack = true;\n @Input() variant: CrudHeaderVariant = 'ghost';\n @Input() sticky = true;\n @Input() divider = true;\n @Input() returnTo?: string | null;\n}\n","/*\n * Public API Surface of praxis-crud\n */\n\nexport * from './lib/praxis-crud.component';\nexport * from './lib/crud-launcher.service';\nexport * from './lib/dynamic-form-dialog-host.component';\nexport * from './lib/crud.types';\nexport * from './lib/dialog.service';\nexport * from './lib/praxis-crud.metadata';\nexport * from './lib/crud-page-header.component';\nexport * from './lib/drawer.adapter';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["DIALOG_DATA","i3","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"praxisui-crud.mjs","sources":["../../../projects/praxis-crud/src/lib/dialog.service.ts","../../../projects/praxis-crud/src/lib/drawer.adapter.ts","../../../projects/praxis-crud/src/lib/crud-launcher.service.ts","../../../projects/praxis-crud/src/lib/crud.types.ts","../../../projects/praxis-crud/src/lib/praxis-crud.component.ts","../../../projects/praxis-crud/src/lib/dynamic-form-dialog-host.component.ts","../../../projects/praxis-crud/src/lib/praxis-crud.metadata.ts","../../../projects/praxis-crud/src/lib/crud-page-header.component.ts","../../../projects/praxis-crud/src/public-api.ts","../../../projects/praxis-crud/src/praxisui-crud.ts"],"sourcesContent":["import { Injectable, NgZone } from '@angular/core';\nimport {\n MatDialog,\n MatDialogRef,\n MatDialogConfig,\n MAT_DIALOG_DATA,\n} from '@angular/material/dialog';\nimport { ComponentType } from '@angular/cdk/portal';\n\nexport type DialogRef<T = any, R = any> = MatDialogRef<T, R>;\n\nexport interface DialogConfig<D = any> extends MatDialogConfig<D> {\n /** Disable closing when user clicks on backdrop */\n disableCloseOnBackdrop?: boolean;\n /** Disable closing when user presses escape */\n disableCloseOnEsc?: boolean;\n /** Enable maximize button */\n canMaximize?: boolean;\n /** Start dialog maximized */\n startMaximized?: boolean;\n /** Screen width in px where dialog starts fullscreen */\n fullscreenBreakpoint?: number;\n}\n\nexport { MAT_DIALOG_DATA as DIALOG_DATA } from '@angular/material/dialog';\n\n@Injectable({ providedIn: 'root' })\nexport class DialogService {\n constructor(private matDialog: MatDialog, private zone: NgZone) {}\n\n open<T, D = unknown, R = unknown>(\n component: ComponentType<T>,\n config?: DialogConfig<D>,\n ): DialogRef<T, R> {\n return this.zone.run(() => this.matDialog.open(component, config));\n }\n\n async openAsync<T, D = unknown, R = unknown>(\n loader: () => Promise<ComponentType<T>>,\n config?: DialogConfig<D>,\n ): Promise<DialogRef<T, R>> {\n const component = await loader();\n return this.zone.run(() => this.matDialog.open(component, config));\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport type { CrudAction, CrudMetadata } from './crud.types';\n\nexport interface CrudDrawerOpenConfig {\n action: CrudAction;\n metadata: CrudMetadata;\n inputs: Record<string, unknown>;\n}\n\nexport interface CrudDrawerAdapter {\n open(config: CrudDrawerOpenConfig): Promise<void> | void;\n}\n\nexport const CRUD_DRAWER_ADAPTER = new InjectionToken<CrudDrawerAdapter>('CRUD_DRAWER_ADAPTER');\n\n","import { Injectable, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { CrudMetadata, CrudAction, FormOpenMode } from './crud.types';\nimport { DialogService, DialogRef } from './dialog.service';\nimport { CONFIG_STORAGE, ConfigStorage, GlobalConfigService, fillUndefined } from '@praxisui/core';\nimport { CRUD_DRAWER_ADAPTER, CrudDrawerAdapter } from './drawer.adapter';\n\n@Injectable({ providedIn: 'root' })\nexport class CrudLauncherService {\n private readonly router = inject(Router);\n private readonly dialog = inject(DialogService);\n private readonly storage = inject<ConfigStorage>(CONFIG_STORAGE);\n private readonly global = inject(GlobalConfigService);\n private readonly drawerAdapter = (() => {\n try { return inject<CrudDrawerAdapter>(CRUD_DRAWER_ADAPTER); } catch { return undefined as any; }\n })();\n\n async launch(\n action: CrudAction,\n row: Record<string, unknown> | undefined,\n metadata: CrudMetadata,\n ): Promise<{\n mode: FormOpenMode;\n ref?: DialogRef<any>;\n }> {\n // Carregar overrides de CRUD (se houver) e mesclar em uma cópia local\n const merged = this.mergeCrudOverrides(metadata, action);\n const mode = this.resolveOpenMode(merged.action, merged.metadata);\n console.debug('[CRUD:Launcher] mode=', mode, 'action=', action);\n\n if (mode === 'route') {\n if (!merged.action.route) {\n throw new Error(`Route not provided for action ${merged.action.action}`);\n }\n const url = this.buildRoute(merged.action, row, merged.metadata);\n await this.router.navigateByUrl(url);\n return { mode };\n }\n\n if (mode === 'drawer' && this.drawerAdapter) {\n const inputs = this.mapInputs(merged.action, row);\n const idField = merged.metadata.resource?.idField ?? 'id';\n if (row && inputs[idField] === undefined && (row as any)[idField] !== undefined) {\n inputs[idField] = (row as any)[idField];\n }\n await Promise.resolve(this.drawerAdapter.open({ action: merged.action, metadata: merged.metadata, inputs }));\n return { mode };\n }\n\n if (!merged.action.formId) {\n throw new Error(`formId not provided for action ${merged.action.action}`);\n }\n const inputs = this.mapInputs(merged.action, row);\n const idField = merged.metadata.resource?.idField ?? 'id';\n if (row && inputs[idField] === undefined && row[idField] !== undefined) {\n inputs[idField] = row[idField];\n }\n const modalCfg = { ...(merged.metadata.defaults?.modal || {}) } as any;\n\n console.debug('[CRUD:Launcher] opening dialog with:', {\n action: merged.action.action,\n formId: merged.action.formId,\n inputs,\n modalCfg,\n resourcePath:\n merged.metadata.resource?.path ?? (merged.metadata.table as any)?.resourcePath,\n });\n const panelClasses = ['pfx-dialog-pane', 'pfx-dialog-frosted'];\n if (modalCfg.panelClass) {\n panelClasses.push(modalCfg.panelClass);\n }\n // Backdrop style presets\n const backdropClasses: string[] = [];\n const style = modalCfg.backdropStyle as string | undefined;\n if (!style || style === 'blur') {\n backdropClasses.push('pfx-blur-backdrop');\n } else if (style === 'dim') {\n backdropClasses.push('cdk-overlay-dark-backdrop');\n } else if (style === 'transparent') {\n backdropClasses.push('pfx-transparent-backdrop');\n }\n if (modalCfg.backdropClass) {\n backdropClasses.push(modalCfg.backdropClass);\n }\n const ref = await this.dialog.openAsync(\n () =>\n import('./dynamic-form-dialog-host.component').then(\n (m) => m.DynamicFormDialogHostComponent,\n ),\n {\n ...modalCfg,\n panelClass: panelClasses,\n backdropClass: backdropClasses,\n autoFocus: modalCfg.autoFocus ?? true,\n restoreFocus: modalCfg.restoreFocus ?? true,\n minWidth: '360px',\n maxWidth: '95vw',\n ariaLabelledBy: 'crudDialogTitle',\n data: { action: merged.action, row, metadata: merged.metadata, inputs },\n },\n );\n return { mode, ref };\n }\n\n resolveOpenMode(action: CrudAction, metadata: CrudMetadata): FormOpenMode {\n // Local precedence: action > metadata.defaults\n const local = action.openMode ?? metadata.defaults?.openMode;\n if (local) return local;\n\n // Global fallback (action-specific, then general), then hard fallback 'route'\n try {\n const globalCrud = this.global.getCrud();\n const actionName = (action as any).action as string | undefined;\n const globalMode = (actionName && globalCrud?.actionDefaults?.[actionName]?.openMode) ?? globalCrud?.defaults?.openMode;\n let resolved: FormOpenMode = (globalMode as any) ?? 'route';\n // Safety: if modal/drawer but no formId, degrade to route to avoid runtime error\n if ((resolved === 'modal' || resolved === 'drawer') && !action.formId) {\n resolved = 'route';\n }\n return resolved;\n } catch {\n return 'route';\n }\n }\n\n private buildRoute(\n action: CrudAction,\n row: Record<string, unknown> | undefined,\n metadata: CrudMetadata,\n ): string {\n let route = action.route as string;\n const query: Record<string, string> = {};\n action.params?.forEach((p) => {\n const value = row?.[p.from];\n if (p.to === 'routeParam') {\n if (value === undefined || value === null) {\n throw new Error(`Missing value for route param ${p.name}`);\n }\n const re = new RegExp(`:${p.name}\\\\b`, 'g');\n route = route.replace(re, encodeURIComponent(String(value)));\n } else if (p.to === 'query' && value !== undefined && value !== null) {\n query[p.name] = String(value);\n }\n });\n const missing = route.match(/:[a-zA-Z0-9_-]+/g);\n if (missing) {\n throw new Error(\n `Missing route parameters for action \"${action.action}\": ${missing\n .map((m) => m.slice(1))\n .join(', ')}`,\n );\n }\n // Ensure resource is present for routed forms so the formId is deterministic\n try {\n const resourcePath =\n metadata.resource?.path || (metadata.table as any)?.resourcePath;\n if (resourcePath && query['resource'] === undefined) {\n query['resource'] = resourcePath as string;\n }\n } catch {}\n // ReturnTo param for graceful back navigation on routed forms\n const back = action.back || metadata.defaults?.back;\n const returnTo = back?.returnTo || this.router.url;\n if (returnTo) {\n query['returnTo'] = returnTo;\n }\n const queryString = new URLSearchParams(query).toString();\n return queryString ? `${route}?${queryString}` : route;\n }\n\n private mapInputs(\n action: CrudAction,\n row: Record<string, unknown> | undefined,\n ): Record<string, unknown> {\n const inputs: Record<string, unknown> = {};\n action.params?.forEach((p) => {\n if (p.to === 'input') {\n inputs[p.name] = row?.[p.from];\n }\n });\n return inputs;\n }\n\n private mergeCrudOverrides(\n metadata: CrudMetadata,\n action: CrudAction,\n ): { metadata: CrudMetadata; action: CrudAction } {\n try {\n const tableId =\n metadata.resource?.path || (metadata.table as any)?.resourcePath || 'default';\n const key = `crud-overrides:${tableId}`;\n const saved = (this.storage.loadConfig(key) as any) || {};\n const overDefaults = saved.defaults || {};\n const overActions = saved.actions || {};\n\n // Merge defaults (shallow for defaults, shallow for modal/back)\n let mergedDefaults: any = {\n ...(metadata.defaults || {}),\n ...('openMode' in overDefaults ? { openMode: overDefaults.openMode } : {}),\n modal: { ...(metadata.defaults?.modal || {}), ...(overDefaults.modal || {}) },\n back: { ...(metadata.defaults?.back || {}), ...(overDefaults.back || {}) },\n header: { ...(metadata.defaults?.header || {}), ...(overDefaults.header || {}) },\n };\n\n // Fill missing defaults from GlobalConfig (as last fallback)\n try {\n const globalCrud = this.global.getCrud();\n if (globalCrud?.defaults) {\n mergedDefaults = fillUndefined(mergedDefaults, globalCrud.defaults as any);\n }\n } catch {}\n\n // Merge metadata copy\n const mergedMetadata: CrudMetadata = {\n ...metadata,\n defaults: mergedDefaults,\n };\n\n // Action-level override\n const actOv = overActions[action.action] || {};\n const mergedAction: CrudAction = {\n ...action,\n ...('openMode' in actOv ? { openMode: actOv.openMode } : {}),\n ...('formId' in actOv ? { formId: actOv.formId } : {}),\n ...('route' in actOv ? { route: actOv.route } : {}),\n } as CrudAction;\n\n return { metadata: mergedMetadata, action: mergedAction };\n } catch {\n return { metadata, action };\n }\n }\n}\n","import { DialogConfig } from './dialog.service';\nimport {\n TableConfig,\n FormConfig,\n RowAction,\n ToolbarAction,\n ApiEndpoint,\n} from '@praxisui/core';\nimport type { BackConfig } from '@praxisui/core';\n\nexport type FormOpenMode = 'route' | 'modal' | 'drawer';\n\nexport interface CrudParamMapping {\n from: string;\n to: 'routeParam' | 'query' | 'input';\n name: string;\n}\n\nexport type CrudAction = (RowAction | ToolbarAction) & {\n openMode?: FormOpenMode;\n route?: string;\n formId?: string;\n params?: CrudParamMapping[];\n back?: BackConfig;\n};\n\nexport interface CrudDefaults {\n openMode?: FormOpenMode;\n modal?: DialogConfig;\n back?: BackConfig;\n header?: CrudHeaderConfig;\n}\n\nexport interface CrudResource {\n path: string;\n idField?: string | number;\n endpointKey?: ApiEndpoint;\n}\n\nexport interface CrudMetadata {\n component: 'praxis-crud';\n resource?: CrudResource;\n table: TableConfig;\n form?: FormConfig;\n defaults?: CrudDefaults;\n actions?: CrudAction[];\n i18n?: { crudDialog?: Record<string, string> };\n}\n\n// BackConfig moved to @praxisui/core to avoid DF↔CRUD cycle\nexport type { BackConfig };\n\nexport interface CrudHeaderConfig {\n showBack?: boolean;\n backLabel?: string;\n variant?: 'ghost' | 'tonal' | 'outlined';\n sticky?: boolean;\n breadcrumbs?: boolean;\n divider?: boolean;\n}\n\nexport function assertCrudMetadata(meta: CrudMetadata): void {\n meta.actions?.forEach((action) => {\n const mode = action.openMode ?? meta.defaults?.openMode ?? 'route';\n if (mode === 'route' && !action.route) {\n throw new Error(`Route not provided for action ${action.action}`);\n }\n if ((mode === 'modal' || mode === 'drawer') && !action.formId) {\n throw new Error(`formId not provided for action ${action.action}`);\n }\n action.params?.forEach((p) => {\n if (!['routeParam', 'query', 'input'].includes(p.to)) {\n throw new Error(`Invalid param mapping target: ${p.to}`);\n }\n });\n });\n}\n","import {\n Component,\n EventEmitter,\n Input,\n Output,\n inject,\n OnChanges,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { PraxisTable } from '@praxisui/table';\nimport { CrudLauncherService } from './crud-launcher.service';\nimport { CrudMetadata, FormOpenMode, assertCrudMetadata, CrudAction } from './crud.types';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { TableConfig, CONFIG_STORAGE, ConfigStorage, createDefaultTableConfig } from '@praxisui/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { EmptyStateCardComponent } from '@praxisui/core';\n\n@Component({\n selector: 'praxis-crud',\n standalone: true,\n imports: [PraxisTable, EmptyStateCardComponent],\n template: `\n @if ($any(resolvedMetadata)?.resource?.path) {\n <praxis-table\n [config]=\"tableConfigForBinding\"\n [resourcePath]=\"resolvedMetadata.resource?.path\"\n [tableId]=\"resolvedMetadata.resource?.path || 'default'\"\n [crudContext]=\"tableCrudContext\"\n [editModeEnabled]=\"editModeEnabled\"\n (rowAction)=\"onAction($event.action, $event.row)\"\n (toolbarAction)=\"onAction($event.action)\"\n (reset)=\"onResetPreferences()\"\n [debugLayout]=\"debugLayout\"\n ></praxis-table>\n } @else {\n @if (editModeEnabled) {\n <praxis-empty-state-card\n icon=\"table_rows\"\n [title]=\"'Conecte o CRUD a um recurso'\"\n [description]=\"'Informe os metadados (resourcePath / schema) para habilitar a tabela e ações.'\"\n [primaryAction]=\"{ label: 'Configurar metadados', icon: 'bolt', action: onConfigureRequested.bind(this) }\"\n />\n }\n }\n `,\n})\nexport class PraxisCrudComponent implements OnChanges {\n /** Habilita visual de debug para alinhamento/layouot */\n @Input() debugLayout = false;\n /** JSON inline ou chave/URL resolvida pelo MetadataResolver */\n @Input({ required: true }) metadata!: CrudMetadata | string;\n @Input() context?: Record<string, unknown>;\n /** Encaminha o modo de edição de layout para a tabela interna */\n @Input() editModeEnabled = false;\n /** CTA: usado pelo Builder para abrir configuração de metadados quando vazio */\n @Output() configureRequested = new EventEmitter<void>();\n @Output() afterOpen = new EventEmitter<{\n mode: FormOpenMode;\n action: string;\n }>();\n @Output() afterClose = new EventEmitter<void>();\n @Output() afterSave = new EventEmitter<{\n id: string | number;\n data: unknown;\n }>();\n @Output() afterDelete = new EventEmitter<{ id: string | number }>();\n @Output() error = new EventEmitter<unknown>();\n\n resolvedMetadata!: CrudMetadata;\n /** Configuração efetiva da tabela com melhorias automáticas (ex.: botão Adicionar). */\n effectiveTableConfig?: TableConfig;\n /** Config passado ao PraxisTable — sempre definido (fallback seguro). */\n tableConfigForBinding: TableConfig = createDefaultTableConfig();\n private readonly launcher = inject(CrudLauncherService);\n @ViewChild(PraxisTable) private table!: PraxisTable;\n private readonly storage = inject<ConfigStorage>(CONFIG_STORAGE);\n private readonly snack = inject(MatSnackBar);\n /**\n * Stable CRUD context passed to PraxisTable.\n * Previously this was created via a getter, producing a new object each CD tick\n * and causing excessive re-renders. Now we compute it only when metadata changes.\n */\n tableCrudContext?: {\n tableId: string;\n resourcePath?: string;\n defaults?: any;\n actions?: Array<{\n action: string;\n label?: string;\n formId?: string;\n route?: string;\n openMode?: 'modal' | 'route';\n }>;\n };\n\n onResetPreferences(): void {\n try {\n const id = this.resolvedMetadata?.resource?.path || 'default';\n const key = `crud-overrides:${id}`;\n this.storage.clearConfig(key);\n this.snack.open('Overrides de CRUD redefinidos', undefined, { duration: 2000 });\n } catch {}\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['metadata']) {\n try {\n this.resolvedMetadata =\n typeof this.metadata === 'string'\n ? (JSON.parse(this.metadata) as CrudMetadata)\n : this.metadata;\n assertCrudMetadata(this.resolvedMetadata);\n this.effectiveTableConfig = this.buildEffectiveTableConfig(\n this.resolvedMetadata,\n );\n // Evitar passar undefined para [config], o que sobrescreve o default do PraxisTable\n this.tableConfigForBinding =\n this.effectiveTableConfig ||\n ((this.resolvedMetadata.table as TableConfig | undefined) ??\n createDefaultTableConfig());\n // Build a stable table context when metadata changes\n this.tableCrudContext = this.buildTableCrudContext(this.resolvedMetadata);\n } catch (err) {\n this.error.emit(err);\n }\n }\n }\n\n async onAction(action: string, row?: Record<string, unknown>): Promise<void> {\n try {\n (document.activeElement as HTMLElement | null)?.blur();\n let actionMeta = this.resolvedMetadata.actions?.find(\n (a) => a.action === action,\n );\n // Fallback: if metadata.actions is missing or doesn't include the action,\n // synthesize from table CRUD context or let overrides drive behavior.\n if (!actionMeta) {\n const ctxAction = this.tableCrudContext?.actions?.find((a) => a.action === action);\n if (ctxAction) {\n actionMeta = {\n action: ctxAction.action,\n openMode: ctxAction.openMode as any,\n formId: ctxAction.formId,\n route: ctxAction.route,\n } as any;\n } else {\n // Minimal stub – CrudLauncherService will merge overrides/defaults\n actionMeta = { action } as any;\n }\n }\n const effectiveAction = (actionMeta || { action } as any) as CrudAction;\n const { mode, ref } = await this.launcher.launch(\n effectiveAction,\n row,\n this.resolvedMetadata,\n );\n this.afterOpen.emit({ mode, action: effectiveAction.action });\n if (ref) {\n const idField = this.getIdField();\n ref\n .afterClosed()\n .pipe(takeUntilDestroyed())\n .subscribe((result) => {\n this.afterClose.emit();\n if (result?.type === 'save') {\n const data = result.data as Record<string, unknown>;\n const id = data?.[idField] as string | number;\n this.afterSave.emit({ id, data: result.data });\n this.refreshTable();\n }\n if (result?.type === 'delete') {\n const data = result.data as Record<string, unknown>;\n const id = data?.[idField] as string | number;\n this.afterDelete.emit({ id });\n this.refreshTable();\n }\n });\n }\n } catch (err) {\n this.error.emit(err);\n }\n }\n\n private refreshTable(): void {\n this.table.refetch();\n }\n\n private getIdField(): string {\n return (this.resolvedMetadata?.resource?.idField as string) || 'id';\n }\n\n onConfigureRequested(): void {\n this.configureRequested.emit();\n }\n\n /**\n * Constrói uma configuração de tabela efetiva a partir dos metadados,\n * adicionando automaticamente a ação de \"Adicionar\" na toolbar quando aplicável.\n * - Evita duplicidade se a toolbar já tiver ação equivalente.\n * - Garante visibilidade da toolbar quando a ação é injetada.\n */\n private buildEffectiveTableConfig(meta: CrudMetadata): TableConfig | undefined {\n const base = meta.table as TableConfig | undefined;\n if (!base) return undefined;\n\n // Clonar para evitar mutações\n const cfg: TableConfig = JSON.parse(JSON.stringify(base));\n\n const ensureToolbar = () => {\n if (!cfg.toolbar) {\n (cfg as any).toolbar = { visible: true, position: 'top' } as any;\n }\n return (cfg as any).toolbar as any;\n };\n\n // Detectar se já existe ação de adicionar na toolbar\n const hasToolbarAdd = (cfg.toolbar?.actions || []).some((a: any) =>\n this.isAddLike(a),\n );\n\n // Procurar mapeamento de ação \"adicionar/criar\" nos metadados do CRUD\n const addAction = (meta.actions || []).find((a: any) => this.isAddLike(a));\n\n // Se não houver mapeamento \"add/create\", não vamos injetar nada\n if (!addAction) {\n return hasToolbarAdd ? cfg : undefined;\n }\n\n // Se já existe na toolbar, apenas garantir visibilidade se necessário\n if (hasToolbarAdd) {\n const tb = ensureToolbar();\n tb.visible = true;\n return cfg;\n }\n\n // Injetar ação na toolbar\n const tb = ensureToolbar();\n tb.visible = true;\n if (!tb.actions) tb.actions = [] as any;\n\n const injected = {\n id: addAction.id || 'add',\n label: addAction.label || 'Adicionar',\n icon: addAction.icon || 'add',\n type: 'button',\n color: 'primary',\n position: 'end',\n action: addAction.action || 'add',\n } as any;\n (tb.actions as any[]).push(injected);\n return cfg;\n }\n\n /** Heurística leve para identificar ações do tipo \"adicionar/criar\" */\n private isAddLike(a: any): boolean {\n if (!a) return false;\n const normalize = (s?: any) => String(s || '').trim().toLowerCase();\n const id = normalize(a.action || a.id || a.code || a.key || a.name || a.type);\n const icon = normalize(a.icon);\n const label = normalize(a.label);\n const addIds = new Set(['add', 'create', 'novo', 'new', 'incluir', 'inserir']);\n if (addIds.has(id)) return true;\n if (icon === 'add' || icon === 'add_circle' || icon === 'add_box') return true;\n if (label === 'adicionar' || label === 'novo' || label === 'criar' || label === 'incluir')\n return true;\n return false;\n }\n\n /** Builds a stable CRUD context object for PraxisTable based on metadata. */\n private buildTableCrudContext(meta: CrudMetadata):\n | {\n tableId: string;\n resourcePath?: string;\n defaults?: any;\n actions?: Array<{\n action: string;\n label?: string;\n formId?: string;\n route?: string;\n openMode?: 'modal' | 'route';\n }>;\n idField?: string;\n }\n | undefined {\n if (!meta) return undefined;\n // Provide a minimal default action set when metadata.actions is empty,\n // so the editor can expose per-action overrides entirely via UI.\n const baseActions = meta.actions && meta.actions.length\n ? meta.actions\n : ([{ action: 'create' }, { action: 'view' }, { action: 'edit' }] as any[]);\n return {\n tableId: meta.resource?.path || (meta.table as any)?.resourcePath || 'default',\n resourcePath: meta.resource?.path || (meta.table as any)?.resourcePath,\n defaults: meta.defaults,\n actions: baseActions.map((a: any) => ({\n action: a.action,\n label: a.label,\n formId: a.formId,\n route: a.route,\n openMode: a.openMode,\n })),\n idField: (meta.resource as any)?.idField || 'id',\n };\n }\n}\n","import { Component, Inject, ViewChild, OnInit, DestroyRef, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogModule, MatDialogRef } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisDynamicForm } from '@praxisui/dynamic-form';\nimport { GenericCrudService, CONFIG_STORAGE, ConfigStorage, PraxisIconDirective } from '@praxisui/core';\nimport { DialogService, DialogRef, DIALOG_DATA } from './dialog.service';\nimport { ConfirmDialogComponent } from '@praxisui/dynamic-fields';\nimport { filter } from 'rxjs/operators';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'praxis-dynamic-form-dialog-host',\n standalone: true,\n imports: [\n CommonModule,\n MatDialogModule,\n MatButtonModule,\n MatIconModule,\n PraxisIconDirective,\n PraxisDynamicForm,\n ],\n providers: [GenericCrudService],\n host: {\n class: 'praxis-dialog',\n '[attr.data-density]': 'modal.density || \"default\"',\n },\n template: `\n <div class=\"dialog-header\">\n <h2 id=\"crudDialogTitle\" class=\"dialog-title\">\n {{ data.action?.label || texts.title }}\n </h2>\n <span class=\"spacer\"></span>\n @if (modal.canMaximize) {\n <button\n mat-icon-button\n type=\"button\"\n (click)=\"toggleMaximize()\"\n [attr.aria-label]=\"maximized ? texts.restoreLabel : texts.maximizeLabel\"\n >\n <mat-icon [praxisIcon]=\"maximized ? 'close_fullscreen' : 'open_in_full'\"></mat-icon>\n </button>\n }\n <button\n mat-icon-button\n type=\"button\"\n (click)=\"onCancel()\"\n [attr.aria-label]=\"texts.closeLabel\"\n cdkFocusInitial\n >\n <mat-icon [praxisIcon]=\"'close'\"></mat-icon>\n </button>\n </div>\n\n <mat-dialog-content\n class=\"dialog-content\"\n aria-labelledby=\"crudDialogTitle\"\n >\n <praxis-dynamic-form\n [formId]=\"data.action?.formId\"\n [resourcePath]=\"resourcePath\"\n [resourceId]=\"resourceId\"\n [mode]=\"mode\"\n [presentationModeGlobal]=\"mode === 'view' ? true : null\"\n [backConfig]=\"backConfig\"\n (formSubmit)=\"onSave($event)\"\n (formCancel)=\"onCancel()\"\n ></praxis-dynamic-form>\n </mat-dialog-content>\n `,\n styles: [\n `\n :host {\n --dlg-header-h: 56px;\n --dlg-footer-h: 56px;\n --dlg-pad: 16px;\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n }\n :host([data-density='compact']) {\n --dlg-header-h: 44px;\n --dlg-footer-h: 44px;\n --dlg-pad: 12px;\n }\n .dialog-header {\n position: sticky;\n top: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n gap: var(--dlg-pad);\n padding: 0 var(--dlg-pad);\n height: var(--dlg-header-h);\n background: var(--md-sys-color-surface-container-high);\n border-bottom: 1px solid var(--md-sys-color-outline-variant);\n color: var(--md-sys-color-on-surface);\n }\n .dialog-title {\n margin: 0;\n font: inherit;\n font-weight: 600;\n color: var(--md-sys-color-on-surface);\n }\n .spacer {\n flex: 1;\n }\n .dialog-content {\n overflow: auto;\n padding: var(--dlg-pad);\n /* use small viewport height to avoid mobile chrome jumps */\n max-height: calc(100svh - var(--dlg-header-h) - 32px);\n }\n .dialog-header button.mat-icon-button { color: var(--md-sys-color-on-surface-variant); }\n .dialog-header button.mat-icon-button:hover {\n color: var(--md-sys-color-primary);\n background: color-mix(in srgb, var(--md-sys-color-primary), transparent 90%);\n }\n .dialog-footer {\n position: sticky;\n bottom: 0;\n z-index: 1;\n padding: var(--dlg-pad);\n }\n `,\n ],\n})\nexport class DynamicFormDialogHostComponent implements OnInit {\n @ViewChild(PraxisDynamicForm) formComp?: PraxisDynamicForm;\n modal: any = {};\n maximized = false;\n private initialSize: { width?: string; height?: string } = {};\n private rememberState = false;\n private stateKey?: string;\n private destroyRef: DestroyRef = inject(DestroyRef);\n\n resourcePath?: string;\n resourceId?: string | number;\n mode: 'create' | 'edit' | 'view' = 'create';\n backConfig?: import('./crud.types').BackConfig;\n private idField = 'id';\n\n texts = {\n title: 'Formulário',\n close: 'Fechar',\n closeLabel: 'Fechar diálogo',\n maximizeLabel: 'Maximizar',\n restoreLabel: 'Restaurar',\n discardTitle: 'Descartar alterações?',\n discardMessage:\n 'Você tem alterações não salvas. Deseja fechar assim mesmo?',\n discardConfirm: 'Descartar',\n discardCancel: 'Cancelar',\n } as Record<string, string>;\n\n constructor(\n @Inject(MatDialogRef)\n public dialogRef: DialogRef<DynamicFormDialogHostComponent>,\n @Inject(DIALOG_DATA) public data: any,\n private dialogService: DialogService,\n private crud: GenericCrudService<any>,\n @Inject(CONFIG_STORAGE) private configStorage: ConfigStorage,\n ) {\n this.dialogRef.disableClose = true;\n\n // i18n\n this.texts = {\n ...this.texts,\n ...(this.data.metadata?.i18n?.crudDialog || {}),\n };\n\n // defaults do modal (inclui canMaximize: true)\n this.modal = {\n canMaximize: true,\n ...(this.data.metadata?.defaults?.modal || {}),\n };\n this.rememberState = !!this.modal.rememberLastState;\n this.stateKey = this.data.action?.formId\n ? `crud-dialog-state:${this.data.action.formId}`\n : undefined;\n\n // derivar path/id/mode\n this.resourcePath =\n this.data.metadata?.resource?.path ??\n this.data.metadata?.table?.resourcePath;\n\n if (this.resourcePath) {\n this.crud.configure(\n this.resourcePath,\n this.data.metadata?.resource?.endpointKey,\n );\n }\n\n this.idField = this.data.metadata?.resource?.idField ?? 'id';\n this.resourceId = this.data.inputs?.[this.idField];\n\n const act = this.data.action?.action;\n this.mode = act === 'edit' ? 'edit' : act === 'view' ? 'view' : 'create';\n\n // Back config: defaults from metadata/action, overridden by saved per-form config\n const defaults = (this.data.action?.back || this.data.metadata?.defaults?.back) || {};\n const saved = this.data.action?.formId\n ? this.configStorage.loadConfig(`crud-back:${this.data.action.formId}`)\n : null;\n this.backConfig = { ...defaults, ...(saved || {}) };\n\n console.debug('[CRUD:Host] constructed', {\n action: this.data?.action,\n resourcePath: this.resourcePath,\n resourceId: this.resourceId,\n mode: this.mode,\n modal: this.modal,\n backConfig: this.backConfig,\n });\n\n // Esc\n if (!this.modal.disableCloseOnEsc) {\n this.dialogRef\n .keydownEvents()\n .pipe(\n filter((e) => e.key === 'Escape'),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => this.onCancel());\n }\n\n // Backdrop\n if (!this.modal.disableCloseOnBackdrop) {\n this.dialogRef\n .backdropClick()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.onCancel());\n }\n\n // Salvar estado ao fechar, se aplicável\n this.dialogRef\n .afterClosed()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.saveState());\n }\n\n ngOnInit(): void {\n // Carregar estado salvo (se habilitado)\n const saved = this.rememberState && this.stateKey\n ? (this.configStorage.loadConfig(this.stateKey) as any)\n : null;\n this.initialSize = {\n width: saved?.width ?? this.modal.width,\n height: saved?.height ?? this.modal.height,\n };\n console.debug('[CRUD:Host] ngOnInit', {\n initialSize: this.initialSize,\n startMaximized: this.modal.startMaximized,\n fullscreenBreakpoint: this.modal.fullscreenBreakpoint,\n });\n let shouldMax = false;\n if (saved && typeof saved.maximized === 'boolean') {\n shouldMax = !!saved.maximized;\n } else {\n shouldMax =\n this.modal.startMaximized ||\n (this.modal.fullscreenBreakpoint &&\n window.innerWidth <= this.modal.fullscreenBreakpoint);\n }\n if (shouldMax) {\n this.toggleMaximize(true);\n } else if (this.initialSize.width || this.initialSize.height) {\n this.dialogRef.updateSize(this.initialSize.width, this.initialSize.height);\n this.dialogRef.updatePosition();\n }\n }\n\n onSave(result: unknown): void {\n if (this.modal.closeOnSave === false) {\n // Não fechar: manter aberto e opcionalmente salvar estado atual\n this.saveState();\n return;\n }\n this.dialogRef.close({ type: 'save', data: result });\n }\n\n onCancel(): void {\n const dirty = this.formComp?.form.dirty;\n const backCfg = (this.data.action?.back || this.data.metadata?.defaults?.back) || {};\n const confirm = backCfg.confirmOnDirty ?? true;\n if (dirty && confirm) {\n const ref = this.dialogService.open(ConfirmDialogComponent, {\n data: {\n title: this.texts.discardTitle,\n message: this.texts.discardMessage,\n confirmText: this.texts.discardConfirm,\n cancelText: this.texts.discardCancel,\n type: 'warning',\n },\n });\n ref\n .afterClosed()\n .pipe(\n filter((confirmed) => !!confirmed),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => this.dialogRef.close());\n } else {\n this.dialogRef.close();\n }\n }\n\n toggleMaximize(initial = false): void {\n this.maximized = initial ? true : !this.maximized;\n const gap = this.maximized ? this.modal.edgeGap ?? 8 : undefined;\n const width = this.maximized\n ? `calc(100vw - ${2 * (gap ?? 0)}px)`\n : this.initialSize.width;\n const height = this.maximized\n ? `calc(100dvh - ${2 * (gap ?? 0)}px)`\n : this.initialSize.height;\n\n this.dialogRef.updateSize(width, height);\n this.dialogRef.updatePosition();\n\n const pane: HTMLElement | undefined = (this.dialogRef as any)\n ?._containerInstance?._elementRef?.nativeElement?.parentElement;\n if (pane && pane.classList.contains('pfx-dialog-pane')) {\n pane.style.margin = this.maximized ? `${gap}px` : '';\n }\n this.saveState();\n }\n\n private saveState(): void {\n if (!this.rememberState || !this.stateKey) return;\n const pane: HTMLElement | undefined = (this.dialogRef as any)\n ?._containerInstance?._elementRef?.nativeElement?.parentElement;\n const style = pane ? getComputedStyle(pane) : null;\n const currentWidth = style?.width || this.initialSize.width;\n const currentHeight = style?.height || this.initialSize.height;\n this.configStorage.saveConfig(this.stateKey, {\n maximized: this.maximized,\n width: currentWidth,\n height: currentHeight,\n });\n }\n}\n","import { ComponentDocMeta, ComponentMetadataRegistry } from '@praxisui/core';\nimport { PraxisCrudComponent } from './praxis-crud.component';\nimport { CrudMetadata, FormOpenMode } from './crud.types';\nimport { ENVIRONMENT_INITIALIZER, Provider } from '@angular/core';\n\n/** Metadata for PraxisCrudComponent */\nexport const PRAXIS_CRUD_COMPONENT_METADATA: ComponentDocMeta = {\n id: 'praxis-crud',\n selector: 'praxis-crud',\n component: PraxisCrudComponent,\n friendlyName: 'Praxis CRUD',\n description: 'Tabela com operações de CRUD via metadados.',\n icon: 'table_chart',\n inputs: [\n {\n name: 'metadata',\n type: 'CrudMetadata | string',\n description: 'Metadados de configuração do CRUD',\n },\n {\n name: 'context',\n type: 'Record<string, unknown>',\n description: 'Contexto adicional para resoluções',\n },\n {\n name: 'editModeEnabled',\n type: 'boolean',\n default: false,\n description: 'Habilita modo de edição do layout',\n },\n ],\n outputs: [\n {\n name: 'afterOpen',\n type: '{ mode: FormOpenMode; action: string }',\n description: 'Emitido após abrir diálogo',\n },\n {\n name: 'afterClose',\n type: 'void',\n description: 'Emitido após fechar diálogo',\n },\n {\n name: 'afterSave',\n type: '{ id: string | number; data: unknown }',\n description: 'Emitido ao salvar',\n },\n {\n name: 'afterDelete',\n type: '{ id: string | number }',\n description: 'Emitido ao deletar',\n },\n { name: 'error', type: 'unknown', description: 'Emitido em erros' },\n {\n name: 'configureRequested',\n type: 'void',\n description: 'Emitido quando CTA de configuração é acionado em modo edição',\n },\n ],\n tags: ['widget', 'crud', 'configurable', 'hasWizard', 'stable'],\n lib: '@praxisui/crud',\n};\n\n/** Provider para auto-registrar metadados do componente CRUD. */\nexport function providePraxisCrudMetadata(): Provider {\n return {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useFactory: (registry: ComponentMetadataRegistry) => () => {\n registry.register(PRAXIS_CRUD_COMPONENT_METADATA);\n },\n deps: [ComponentMetadataRegistry],\n } as Provider;\n}\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink } from '@angular/router';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } from '@praxisui/core';\n\nexport type CrudHeaderVariant = 'ghost' | 'tonal' | 'outlined';\n\n@Component({\n selector: 'praxis-crud-page-header',\n standalone: true,\n imports: [CommonModule, RouterLink, MatButtonModule, MatIconModule, PraxisIconDirective],\n template: `\n <header\n class=\"crud-header\"\n [class.sticky]=\"sticky\"\n [class.with-divider]=\"divider\"\n >\n <div class=\"left\">\n <a\n *ngIf=\"showBack && returnTo\"\n class=\"back-btn\"\n [class.ghost]=\"variant === 'ghost'\"\n [class.tonal]=\"variant === 'tonal'\"\n [class.outlined]=\"variant === 'outlined'\"\n [routerLink]=\"returnTo\"\n [attr.aria-label]=\"backLabel || 'Voltar'\"\n mat-button\n >\n <mat-icon [praxisIcon]=\"'arrow_back'\"></mat-icon>\n <span class=\"label\" [class.hide-on-narrow]=\"true\">{{ backLabel || 'Voltar' }}</span>\n </a>\n <h2 class=\"title\" [attr.title]=\"title\">{{ title }}</h2>\n </div>\n <div class=\"right\">\n <ng-content></ng-content>\n </div>\n </header>\n `,\n styles: [\n `\n .crud-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 8px 0;\n background: var(--md-sys-color-surface, transparent);\n }\n .crud-header.sticky {\n position: sticky;\n top: 0;\n z-index: 10;\n backdrop-filter: saturate(110%);\n }\n .crud-header.with-divider {\n border-bottom: 1px solid var(--md-sys-color-outline-variant, rgba(0,0,0,0.08));\n }\n .left { display: flex; align-items: center; gap: 8px; min-width: 0; }\n .right { display: flex; align-items: center; gap: 8px; }\n .title {\n margin: 0; font-weight: 600;\n color: var(--md-sys-color-on-surface, currentColor);\n font: var(--mdc-typography-title-large, 600 20px/28px system-ui);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n .back-btn { display: inline-flex; align-items: center; gap: 6px; text-decoration: none; }\n .back-btn .mat-mdc-button { padding-left: 0; }\n .back-btn mat-icon { color: var(--md-sys-color-on-surface-variant, currentColor); }\n .back-btn .label { color: var(--md-sys-color-on-surface-variant, currentColor); }\n\n /* Variants */\n .back-btn.ghost { border-radius: 20px; padding: 4px 8px; }\n .back-btn.ghost:hover { background: color-mix(in srgb, var(--md-sys-color-primary) 8%, transparent); }\n\n .back-btn.tonal {\n border-radius: 20px; padding: 4px 10px;\n background: var(--md-sys-color-surface-container, rgba(0,0,0,0.02));\n box-shadow: inset 0 0 0 1px var(--md-sys-color-outline-variant, rgba(0,0,0,0.06));\n }\n .back-btn.tonal:hover { background: color-mix(in srgb, var(--md-sys-color-primary) 10%, var(--md-sys-color-surface-container)); }\n\n .back-btn.outlined {\n border-radius: 20px; padding: 4px 10px;\n border: 1px solid var(--md-sys-color-outline-variant, rgba(0,0,0,0.12));\n background: var(--md-sys-color-surface, transparent);\n }\n .back-btn.outlined:hover {\n border-color: color-mix(in srgb, var(--md-sys-color-primary) 40%, var(--md-sys-color-outline-variant));\n background: color-mix(in srgb, var(--md-sys-color-primary) 6%, transparent);\n }\n\n /* Responsive: hide label on very narrow */\n @media (max-width: 599px) { .label.hide-on-narrow { display: none; } }\n `,\n ],\n})\nexport class CrudPageHeaderComponent {\n @Input() title = '';\n @Input() backLabel?: string;\n @Input() showBack = true;\n @Input() variant: CrudHeaderVariant = 'ghost';\n @Input() sticky = true;\n @Input() divider = true;\n @Input() returnTo?: string | null;\n}\n","/*\n * Public API Surface of praxis-crud\n */\n\nexport * from './lib/praxis-crud.component';\nexport * from './lib/crud-launcher.service';\nexport * from './lib/dynamic-form-dialog-host.component';\nexport * from './lib/crud.types';\nexport * from './lib/dialog.service';\nexport * from './lib/praxis-crud.metadata';\nexport * from './lib/crud-page-header.component';\nexport * from './lib/drawer.adapter';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["DIALOG_DATA","i3","i2"],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -103,6 +103,8 @@ declare class PraxisCrudComponent implements OnChanges {
|
|
|
103
103
|
resolvedMetadata: CrudMetadata;
|
|
104
104
|
/** Configuração efetiva da tabela com melhorias automáticas (ex.: botão Adicionar). */
|
|
105
105
|
effectiveTableConfig?: TableConfig;
|
|
106
|
+
/** Config passado ao PraxisTable — sempre definido (fallback seguro). */
|
|
107
|
+
tableConfigForBinding: TableConfig;
|
|
106
108
|
private readonly launcher;
|
|
107
109
|
private table;
|
|
108
110
|
private readonly storage;
|
package/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praxisui/crud",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.23",
|
|
4
4
|
"description": "CRUD building blocks for Praxis UI: integrates dynamic forms and tables with unified configuration and services.",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/common": "^20.1.0",
|
|
7
7
|
"@angular/core": "^20.1.0",
|
|
8
|
-
"@praxisui/dynamic-form": "^1.0.0-beta.
|
|
9
|
-
"@praxisui/table": "^1.0.0-beta.
|
|
10
|
-
"@praxisui/core": "^1.0.0-beta.
|
|
11
|
-
"@praxisui/dynamic-fields": "^1.0.0-beta.
|
|
12
|
-
"@praxisui/settings-panel": "^1.0.0-beta.
|
|
8
|
+
"@praxisui/dynamic-form": "^1.0.0-beta.23",
|
|
9
|
+
"@praxisui/table": "^1.0.0-beta.23",
|
|
10
|
+
"@praxisui/core": "^1.0.0-beta.23",
|
|
11
|
+
"@praxisui/dynamic-fields": "^1.0.0-beta.23",
|
|
12
|
+
"@praxisui/settings-panel": "^1.0.0-beta.23"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"tslib": "^2.3.0"
|
|
@@ -20,11 +20,11 @@
|
|
|
20
20
|
},
|
|
21
21
|
"repository": {
|
|
22
22
|
"type": "git",
|
|
23
|
-
"url": "https://github.com/codexrodrigues/praxis"
|
|
23
|
+
"url": "https://github.com/codexrodrigues/praxis-ui-angular"
|
|
24
24
|
},
|
|
25
|
-
"homepage": "https://github.com/codexrodrigues/praxis#readme",
|
|
25
|
+
"homepage": "https://github.com/codexrodrigues/praxis-ui-angular#readme",
|
|
26
26
|
"bugs": {
|
|
27
|
-
"url": "https://github.com/codexrodrigues/praxis/issues"
|
|
27
|
+
"url": "https://github.com/codexrodrigues/praxis-ui-angular/issues"
|
|
28
28
|
},
|
|
29
29
|
"keywords": [
|
|
30
30
|
"angular",
|