@praxisui/crud 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-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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"}
package/index.d.ts ADDED
@@ -0,0 +1,224 @@
1
+ import * as i0 from '@angular/core';
2
+ import { NgZone, OnChanges, EventEmitter, SimpleChanges, OnInit, Provider, InjectionToken } from '@angular/core';
3
+ import { MatDialogConfig, MatDialogRef, MatDialog } from '@angular/material/dialog';
4
+ export { MAT_DIALOG_DATA as DIALOG_DATA } from '@angular/material/dialog';
5
+ import { ComponentType } from '@angular/cdk/portal';
6
+ import { ApiEndpoint, TableConfig, FormConfig, BackConfig, RowAction, ToolbarAction, GenericCrudService, ConfigStorage, ComponentDocMeta } from '@praxisui/core';
7
+ export { BackConfig } from '@praxisui/core';
8
+ import { PraxisDynamicForm } from '@praxisui/dynamic-form';
9
+
10
+ type DialogRef<T = any, R = any> = MatDialogRef<T, R>;
11
+ interface DialogConfig<D = any> extends MatDialogConfig<D> {
12
+ /** Disable closing when user clicks on backdrop */
13
+ disableCloseOnBackdrop?: boolean;
14
+ /** Disable closing when user presses escape */
15
+ disableCloseOnEsc?: boolean;
16
+ /** Enable maximize button */
17
+ canMaximize?: boolean;
18
+ /** Start dialog maximized */
19
+ startMaximized?: boolean;
20
+ /** Screen width in px where dialog starts fullscreen */
21
+ fullscreenBreakpoint?: number;
22
+ }
23
+
24
+ declare class DialogService {
25
+ private matDialog;
26
+ private zone;
27
+ constructor(matDialog: MatDialog, zone: NgZone);
28
+ open<T, D = unknown, R = unknown>(component: ComponentType<T>, config?: DialogConfig<D>): DialogRef<T, R>;
29
+ openAsync<T, D = unknown, R = unknown>(loader: () => Promise<ComponentType<T>>, config?: DialogConfig<D>): Promise<DialogRef<T, R>>;
30
+ static ɵfac: i0.ɵɵFactoryDeclaration<DialogService, never>;
31
+ static ɵprov: i0.ɵɵInjectableDeclaration<DialogService>;
32
+ }
33
+
34
+ type FormOpenMode = 'route' | 'modal' | 'drawer';
35
+ interface CrudParamMapping {
36
+ from: string;
37
+ to: 'routeParam' | 'query' | 'input';
38
+ name: string;
39
+ }
40
+ type CrudAction = (RowAction | ToolbarAction) & {
41
+ openMode?: FormOpenMode;
42
+ route?: string;
43
+ formId?: string;
44
+ params?: CrudParamMapping[];
45
+ back?: BackConfig;
46
+ };
47
+ interface CrudDefaults {
48
+ openMode?: FormOpenMode;
49
+ modal?: DialogConfig;
50
+ back?: BackConfig;
51
+ header?: CrudHeaderConfig;
52
+ }
53
+ interface CrudResource {
54
+ path: string;
55
+ idField?: string | number;
56
+ endpointKey?: ApiEndpoint;
57
+ }
58
+ interface CrudMetadata {
59
+ component: 'praxis-crud';
60
+ resource?: CrudResource;
61
+ table: TableConfig;
62
+ form?: FormConfig;
63
+ defaults?: CrudDefaults;
64
+ actions?: CrudAction[];
65
+ i18n?: {
66
+ crudDialog?: Record<string, string>;
67
+ };
68
+ }
69
+
70
+ interface CrudHeaderConfig {
71
+ showBack?: boolean;
72
+ backLabel?: string;
73
+ variant?: 'ghost' | 'tonal' | 'outlined';
74
+ sticky?: boolean;
75
+ breadcrumbs?: boolean;
76
+ divider?: boolean;
77
+ }
78
+ declare function assertCrudMetadata(meta: CrudMetadata): void;
79
+
80
+ declare class PraxisCrudComponent implements OnChanges {
81
+ /** Habilita visual de debug para alinhamento/layouot */
82
+ debugLayout: boolean;
83
+ /** JSON inline ou chave/URL resolvida pelo MetadataResolver */
84
+ metadata: CrudMetadata | string;
85
+ context?: Record<string, unknown>;
86
+ /** Encaminha o modo de edição de layout para a tabela interna */
87
+ editModeEnabled: boolean;
88
+ /** CTA: usado pelo Builder para abrir configuração de metadados quando vazio */
89
+ configureRequested: EventEmitter<void>;
90
+ afterOpen: EventEmitter<{
91
+ mode: FormOpenMode;
92
+ action: string;
93
+ }>;
94
+ afterClose: EventEmitter<void>;
95
+ afterSave: EventEmitter<{
96
+ id: string | number;
97
+ data: unknown;
98
+ }>;
99
+ afterDelete: EventEmitter<{
100
+ id: string | number;
101
+ }>;
102
+ error: EventEmitter<unknown>;
103
+ resolvedMetadata: CrudMetadata;
104
+ /** Configuração efetiva da tabela com melhorias automáticas (ex.: botão Adicionar). */
105
+ effectiveTableConfig?: TableConfig;
106
+ private readonly launcher;
107
+ private table;
108
+ private readonly storage;
109
+ private readonly snack;
110
+ /**
111
+ * Stable CRUD context passed to PraxisTable.
112
+ * Previously this was created via a getter, producing a new object each CD tick
113
+ * and causing excessive re-renders. Now we compute it only when metadata changes.
114
+ */
115
+ tableCrudContext?: {
116
+ tableId: string;
117
+ resourcePath?: string;
118
+ defaults?: any;
119
+ actions?: Array<{
120
+ action: string;
121
+ label?: string;
122
+ formId?: string;
123
+ route?: string;
124
+ openMode?: 'modal' | 'route';
125
+ }>;
126
+ };
127
+ onResetPreferences(): void;
128
+ ngOnChanges(changes: SimpleChanges): void;
129
+ onAction(action: string, row?: Record<string, unknown>): Promise<void>;
130
+ private refreshTable;
131
+ private getIdField;
132
+ onConfigureRequested(): void;
133
+ /**
134
+ * Constrói uma configuração de tabela efetiva a partir dos metadados,
135
+ * adicionando automaticamente a ação de "Adicionar" na toolbar quando aplicável.
136
+ * - Evita duplicidade se a toolbar já tiver ação equivalente.
137
+ * - Garante visibilidade da toolbar quando a ação é injetada.
138
+ */
139
+ private buildEffectiveTableConfig;
140
+ /** Heurística leve para identificar ações do tipo "adicionar/criar" */
141
+ private isAddLike;
142
+ /** Builds a stable CRUD context object for PraxisTable based on metadata. */
143
+ private buildTableCrudContext;
144
+ static ɵfac: i0.ɵɵFactoryDeclaration<PraxisCrudComponent, never>;
145
+ static ɵcmp: i0.ɵɵComponentDeclaration<PraxisCrudComponent, "praxis-crud", never, { "debugLayout": { "alias": "debugLayout"; "required": false; }; "metadata": { "alias": "metadata"; "required": true; }; "context": { "alias": "context"; "required": false; }; "editModeEnabled": { "alias": "editModeEnabled"; "required": false; }; }, { "configureRequested": "configureRequested"; "afterOpen": "afterOpen"; "afterClose": "afterClose"; "afterSave": "afterSave"; "afterDelete": "afterDelete"; "error": "error"; }, never, never, true, never>;
146
+ }
147
+
148
+ declare class CrudLauncherService {
149
+ private readonly router;
150
+ private readonly dialog;
151
+ private readonly storage;
152
+ private readonly global;
153
+ private readonly drawerAdapter;
154
+ launch(action: CrudAction, row: Record<string, unknown> | undefined, metadata: CrudMetadata): Promise<{
155
+ mode: FormOpenMode;
156
+ ref?: DialogRef<any>;
157
+ }>;
158
+ resolveOpenMode(action: CrudAction, metadata: CrudMetadata): FormOpenMode;
159
+ private buildRoute;
160
+ private mapInputs;
161
+ private mergeCrudOverrides;
162
+ static ɵfac: i0.ɵɵFactoryDeclaration<CrudLauncherService, never>;
163
+ static ɵprov: i0.ɵɵInjectableDeclaration<CrudLauncherService>;
164
+ }
165
+
166
+ declare class DynamicFormDialogHostComponent implements OnInit {
167
+ dialogRef: DialogRef<DynamicFormDialogHostComponent>;
168
+ data: any;
169
+ private dialogService;
170
+ private crud;
171
+ private configStorage;
172
+ formComp?: PraxisDynamicForm;
173
+ modal: any;
174
+ maximized: boolean;
175
+ private initialSize;
176
+ private rememberState;
177
+ private stateKey?;
178
+ private destroyRef;
179
+ resourcePath?: string;
180
+ resourceId?: string | number;
181
+ mode: 'create' | 'edit' | 'view';
182
+ backConfig?: BackConfig;
183
+ private idField;
184
+ texts: Record<string, string>;
185
+ constructor(dialogRef: DialogRef<DynamicFormDialogHostComponent>, data: any, dialogService: DialogService, crud: GenericCrudService<any>, configStorage: ConfigStorage);
186
+ ngOnInit(): void;
187
+ onSave(result: unknown): void;
188
+ onCancel(): void;
189
+ toggleMaximize(initial?: boolean): void;
190
+ private saveState;
191
+ static ɵfac: i0.ɵɵFactoryDeclaration<DynamicFormDialogHostComponent, never>;
192
+ static ɵcmp: i0.ɵɵComponentDeclaration<DynamicFormDialogHostComponent, "praxis-dynamic-form-dialog-host", never, {}, {}, never, never, true, never>;
193
+ }
194
+
195
+ /** Metadata for PraxisCrudComponent */
196
+ declare const PRAXIS_CRUD_COMPONENT_METADATA: ComponentDocMeta;
197
+ /** Provider para auto-registrar metadados do componente CRUD. */
198
+ declare function providePraxisCrudMetadata(): Provider;
199
+
200
+ type CrudHeaderVariant = 'ghost' | 'tonal' | 'outlined';
201
+ declare class CrudPageHeaderComponent {
202
+ title: string;
203
+ backLabel?: string;
204
+ showBack: boolean;
205
+ variant: CrudHeaderVariant;
206
+ sticky: boolean;
207
+ divider: boolean;
208
+ returnTo?: string | null;
209
+ static ɵfac: i0.ɵɵFactoryDeclaration<CrudPageHeaderComponent, never>;
210
+ static ɵcmp: i0.ɵɵComponentDeclaration<CrudPageHeaderComponent, "praxis-crud-page-header", never, { "title": { "alias": "title"; "required": false; }; "backLabel": { "alias": "backLabel"; "required": false; }; "showBack": { "alias": "showBack"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "sticky": { "alias": "sticky"; "required": false; }; "divider": { "alias": "divider"; "required": false; }; "returnTo": { "alias": "returnTo"; "required": false; }; }, {}, never, ["*"], true, never>;
211
+ }
212
+
213
+ interface CrudDrawerOpenConfig {
214
+ action: CrudAction;
215
+ metadata: CrudMetadata;
216
+ inputs: Record<string, unknown>;
217
+ }
218
+ interface CrudDrawerAdapter {
219
+ open(config: CrudDrawerOpenConfig): Promise<void> | void;
220
+ }
221
+ declare const CRUD_DRAWER_ADAPTER: InjectionToken<CrudDrawerAdapter>;
222
+
223
+ export { CRUD_DRAWER_ADAPTER, CrudLauncherService, CrudPageHeaderComponent, DialogService, DynamicFormDialogHostComponent, PRAXIS_CRUD_COMPONENT_METADATA, PraxisCrudComponent, assertCrudMetadata, providePraxisCrudMetadata };
224
+ export type { CrudAction, CrudDefaults, CrudDrawerAdapter, CrudDrawerOpenConfig, CrudHeaderConfig, CrudHeaderVariant, CrudMetadata, CrudParamMapping, CrudResource, DialogConfig, DialogRef, FormOpenMode };
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@praxisui/crud",
3
+ "version": "0.0.1",
4
+ "peerDependencies": {
5
+ "@angular/common": "^20.1.0",
6
+ "@angular/core": "^20.1.0",
7
+ "@praxisui/dynamic-form": "^0.0.1",
8
+ "@praxisui/table": "^0.0.1",
9
+ "@praxisui/core": "^0.0.1",
10
+ "@praxisui/dynamic-fields": "^0.0.1",
11
+ "@praxisui/settings-panel": "^0.0.1"
12
+ },
13
+ "dependencies": {
14
+ "tslib": "^2.3.0"
15
+ },
16
+ "license": "Apache-2.0",
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "https://github.com/codexrodrigues/praxis"
23
+ },
24
+ "homepage": "https://github.com/codexrodrigues/praxis#readme",
25
+ "bugs": {
26
+ "url": "https://github.com/codexrodrigues/praxis/issues"
27
+ },
28
+ "sideEffects": false,
29
+ "module": "fesm2022/praxisui-crud.mjs",
30
+ "typings": "index.d.ts",
31
+ "exports": {
32
+ "./package.json": {
33
+ "default": "./package.json"
34
+ },
35
+ ".": {
36
+ "types": "./index.d.ts",
37
+ "default": "./fesm2022/praxisui-crud.mjs"
38
+ }
39
+ }
40
+ }