@praxisui/metadata-editor 8.0.0-beta.27 → 8.0.0-beta.29

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.
@@ -530,6 +530,7 @@ class DynamicEditorRendererComponent {
530
530
  const order = [
531
531
  'geral',
532
532
  'apresent',
533
+ 'display',
533
534
  'valida',
534
535
  'formato',
535
536
  'comport',
@@ -594,7 +595,7 @@ class DynamicEditorRendererComponent {
594
595
  .replace(/[ñ]/g, 'n');
595
596
  if (normalized.includes('geral'))
596
597
  return 'widgets';
597
- if (normalized.includes('apresent'))
598
+ if (normalized.includes('apresent') || normalized.includes('display'))
598
599
  return 'slideshow';
599
600
  if (normalized.includes('dados') || normalized.includes('opcoes'))
600
601
  return 'list_alt';
@@ -753,7 +754,7 @@ class DynamicEditorRendererComponent {
753
754
  </mat-expansion-panel>
754
755
  </mat-accordion>
755
756
  </div>
756
- `, isInline: true, styles: [":host{display:block}.editor-surface{padding:8px 0 2px;border-radius:12px;background:transparent}.section-accordion{display:block}.section-card{margin:6px 0 8px;border-radius:12px;border:1px solid var(--md-sys-color-outline-variant);overflow:hidden}.section-card.mat-expanded{border-color:var(--md-sys-color-primary);box-shadow:0 2px 10px #0000000d}.section-card .mat-expansion-panel-body{background:var(--md-sys-color-surface-container-low)}.section-header{background:var(--md-sys-color-surface-container-low);border-bottom:1px solid var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));padding:2px 8px;min-height:32px;display:flex;align-items:center;color:var(--md-sys-color-on-surface)}.section-header .mat-expansion-panel-header-title,.section-header .mat-expansion-panel-header-description{display:flex;align-items:center;color:var(--md-sys-color-on-surface)}.section-title{display:inline-flex;align-items:center;gap:6px;font-weight:600;letter-spacing:.2px;color:var(--md-sys-color-on-surface);font-size:.9rem;line-height:1.2}.section-icon{color:var(--md-sys-color-primary, var(--md-sys-color-primary, #3f51b5));opacity:.9}.editor-row{display:flex;gap:12px;align-items:flex-start;flex-wrap:wrap;margin-bottom:8px}.editor-row>praxis-field-shell{flex:1 1 100%;min-width:280px}.editor-row praxis-field-shell .mat-mdc-form-field{width:100%;margin-bottom:8px}.editor-row.row-inline>praxis-field-shell{flex:0 0 auto}.editor-row.row-2>praxis-field-shell{flex:1 1 calc(50% - 12px);min-width:260px}.editor-row.row-3>praxis-field-shell{flex:1 1 calc(33.333% - 12px);min-width:220px}.editor-row>praxis-field-shell[data-field-name=controlType],.editor-row>praxis-field-shell[data-field-name=label],.editor-row>praxis-field-shell[data-field-name=placeholder]{flex:1 1 calc(50% - 12px);min-width:300px}praxis-field-shell[data-field-name=label] .mdc-floating-label,praxis-field-shell[data-field-name=placeholder] .mdc-floating-label{font-weight:600}.editor-row>praxis-field-shell[data-field-name=prefix],.editor-row>praxis-field-shell[data-field-name=suffix]{flex:0 0 200px;min-width:160px}.editor-row>praxis-field-shell[data-field-name=prefixIcon],.editor-row>praxis-field-shell[data-field-name=suffixIcon],.editor-row>praxis-field-shell[data-field-name=prefixIconColor],.editor-row>praxis-field-shell[data-field-name=suffixIconColor]{flex:1 1 auto;min-width:160px}.editor-item{display:flex;align-items:flex-start;gap:4px}.editor-item>ng-container,.editor-item>praxis-field-shell{flex:1;min-width:0}.actions-container{display:flex;align-items:center;gap:0;margin-top:12px;flex-shrink:0}.decorator-btn{position:static;color:var(--md-sys-color-primary, #3f51b5);opacity:.6;transform:scale(.8);width:32px;height:32px;line-height:32px;padding:0}.decorator-btn:hover{opacity:1}.icon-picker-btn,.hint-btn,.hint-btn.has-icon-picker{right:auto}.editor-row .mat-mdc-form-field-subscript-wrapper mat-hint{display:none!important}.editor-row .mat-mdc-form-field-subscript-wrapper mat-error{display:block!important}praxis-field-shell[data-field-name=showCharCount] .mdc-switch{transform:scale(1.05)}praxis-field-shell[data-field-name=showCharCount] .mat-mdc-slide-toggle{font-weight:600}praxis-field-shell[data-field-name=controlType] .mat-mdc-form-field-hint{display:flex;align-items:center;gap:8px;background:var(--md-sys-color-tertiary-container);border:1px solid var(--md-sys-color-tertiary);color:var(--md-sys-color-on-tertiary-container);padding:8px 10px;border-radius:6px;line-height:1.3;white-space:normal}praxis-field-shell[data-field-name=controlType] .mat-mdc-form-field-hint:before{content:\"\\26a0\\fe0f\";display:inline-block}praxis-field-shell[data-field-name=controlType] .mat-mdc-form-field-subscript-wrapper{margin-top:6px;margin-bottom:10px;min-height:auto}praxis-field-shell[data-field-name=controlType] .mat-mdc-form-field{margin-bottom:16px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: DynamicFieldLoaderDirective, selector: "[dynamicFieldLoader]", inputs: ["fields", "formGroup", "enableExternalControlBinding", "itemTemplate", "debugTrace", "debugTraceLabel", "readonlyMode", "disabledMode", "presentationMode", "visible", "canvasMode"], outputs: ["componentsCreated", "fieldCreated", "fieldDestroyed", "renderError", "canvasMouseEnter", "canvasMouseLeave", "canvasClick"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "directive", type: i5.MatAccordion, selector: "mat-accordion", inputs: ["hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i5.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5$1.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }], encapsulation: i0.ViewEncapsulation.None });
757
+ `, isInline: true, styles: [":host{display:block}.editor-surface{padding:8px 0 2px;border-radius:12px;background:transparent}.section-accordion{display:block}.section-card{margin:6px 0 8px;border-radius:12px;border:1px solid var(--md-sys-color-outline-variant);overflow:hidden}.section-card.mat-expanded{border-color:var(--md-sys-color-primary);box-shadow:0 2px 10px #0000000d}.section-card .mat-expansion-panel-body{background:var(--md-sys-color-surface-container-low)}.section-header{background:var(--md-sys-color-surface-container-low);border-bottom:1px solid var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));padding:2px 8px;min-height:32px;display:flex;align-items:center;color:var(--md-sys-color-on-surface)}.section-header .mat-expansion-panel-header-title,.section-header .mat-expansion-panel-header-description{display:flex;align-items:center;color:var(--md-sys-color-on-surface)}.section-title{display:inline-flex;align-items:center;gap:6px;font-weight:600;letter-spacing:.2px;color:var(--md-sys-color-on-surface);font-size:.9rem;line-height:1.2}.section-icon{color:var(--md-sys-color-primary, var(--md-sys-color-primary, #3f51b5));opacity:.9}.editor-row{display:flex;gap:12px;align-items:flex-start;flex-wrap:wrap;margin-bottom:8px}.editor-row>praxis-field-shell{flex:1 1 100%;min-width:280px}.editor-row praxis-field-shell .mat-mdc-form-field{width:100%;margin-bottom:8px}.editor-row.row-inline>praxis-field-shell{flex:0 0 auto}.editor-row.row-2>praxis-field-shell{flex:1 1 calc(50% - 12px);min-width:260px}.editor-row.row-3>praxis-field-shell{flex:1 1 calc(33.333% - 12px);min-width:220px}.editor-row>praxis-field-shell[data-field-name=controlType],.editor-row>praxis-field-shell[data-field-name=label],.editor-row>praxis-field-shell[data-field-name=placeholder]{flex:1 1 calc(50% - 12px);min-width:300px}praxis-field-shell[data-field-name=label] .mdc-floating-label,praxis-field-shell[data-field-name=placeholder] .mdc-floating-label{font-weight:600}.editor-row>praxis-field-shell[data-field-name=prefix],.editor-row>praxis-field-shell[data-field-name=suffix]{flex:0 0 200px;min-width:160px}.editor-row>praxis-field-shell[data-field-name=prefixIcon],.editor-row>praxis-field-shell[data-field-name=suffixIcon],.editor-row>praxis-field-shell[data-field-name=prefixIconColor],.editor-row>praxis-field-shell[data-field-name=suffixIconColor]{flex:1 1 auto;min-width:160px}.editor-item{display:flex;align-items:flex-start;gap:4px}.editor-item>ng-container,.editor-item>praxis-field-shell{flex:1;min-width:0}.actions-container{display:flex;align-items:center;gap:0;margin-top:12px;flex-shrink:0}.decorator-btn{position:static;color:var(--md-sys-color-primary, #3f51b5);opacity:.6;transform:scale(.8);width:32px;height:32px;line-height:32px;padding:0}.decorator-btn:hover{opacity:1}.icon-picker-btn,.hint-btn,.hint-btn.has-icon-picker{right:auto}.editor-row .mat-mdc-form-field-subscript-wrapper mat-hint{display:none!important}.editor-row .mat-mdc-form-field-subscript-wrapper mat-error{display:block!important}praxis-field-shell[data-field-name=showCharCount] .mdc-switch{transform:scale(1.05)}praxis-field-shell[data-field-name=showCharCount] .mat-mdc-slide-toggle{font-weight:600}praxis-field-shell[data-field-name=controlType] .mat-mdc-form-field-hint{display:flex;align-items:center;gap:8px;background:var(--md-sys-color-tertiary-container);border:1px solid var(--md-sys-color-tertiary);color:var(--md-sys-color-on-tertiary-container);padding:8px 10px;border-radius:6px;line-height:1.3;white-space:normal}praxis-field-shell[data-field-name=controlType] .mat-mdc-form-field-hint:before{content:\"\\26a0\\fe0f\";display:inline-block}praxis-field-shell[data-field-name=controlType] .mat-mdc-form-field-subscript-wrapper{margin-top:6px;margin-bottom:10px;min-height:auto}praxis-field-shell[data-field-name=controlType] .mat-mdc-form-field{margin-bottom:16px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: DynamicFieldLoaderDirective, selector: "[dynamicFieldLoader]", inputs: ["fields", "formGroup", "enableExternalControlBinding", "itemTemplate", "debugTrace", "debugTraceLabel", "readonlyMode", "disabledMode", "presentationMode", "visible", "canvasMode"], outputs: ["componentsCreated", "fieldCreated", "fieldDestroyed", "renderError", "canvasMouseEnter", "canvasMouseLeave", "canvasClick", "canvasFocus"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "directive", type: i5.MatAccordion, selector: "mat-accordion", inputs: ["hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i5.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5$1.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }], encapsulation: i0.ViewEncapsulation.None });
757
758
  }
758
759
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: DynamicEditorRendererComponent, decorators: [{
759
760
  type: Component,
@@ -2235,6 +2236,172 @@ const entityLookupProperties = [
2235
2236
  group: 'Exibicao de entidade',
2236
2237
  hint: 'Campo opcional com mensagem de bloqueio quando selectable=false.',
2237
2238
  },
2239
+ {
2240
+ name: 'optionSource.display.preset',
2241
+ label: 'Preset canonico',
2242
+ editorType: 'select',
2243
+ group: 'Display canonico',
2244
+ options: [
2245
+ { value: 'compact', text: 'compact' },
2246
+ { value: 'rich', text: 'rich' },
2247
+ { value: 'directory', text: 'directory' },
2248
+ { value: 'status', text: 'status' },
2249
+ { value: 'reference', text: 'reference' },
2250
+ { value: 'hierarchical', text: 'hierarchical' },
2251
+ ],
2252
+ hint: 'Intencao visual da entidade. Use directory para pessoas/equipes, reference para codigo + descricao e status quando o estado operacional for central.',
2253
+ },
2254
+ {
2255
+ name: 'optionSource.display.usage',
2256
+ label: 'Uso preferencial',
2257
+ editorType: 'select',
2258
+ group: 'Display canonico',
2259
+ options: [
2260
+ { value: 'form', text: 'form' },
2261
+ { value: 'filter', text: 'filter' },
2262
+ { value: 'table-cell', text: 'table-cell' },
2263
+ { value: 'dashboard', text: 'dashboard' },
2264
+ { value: 'wizard', text: 'wizard' },
2265
+ { value: 'review', text: 'review' },
2266
+ ],
2267
+ hint: 'Contexto principal de uso desta option-source sem amarrar a regra a um componente especifico.',
2268
+ },
2269
+ {
2270
+ name: 'optionSource.display.density',
2271
+ label: 'Densidade',
2272
+ editorType: 'select',
2273
+ group: 'Display canonico',
2274
+ options: [
2275
+ { value: 'compact', text: 'compact' },
2276
+ { value: 'comfortable', text: 'comfortable' },
2277
+ { value: 'rich', text: 'rich' },
2278
+ ],
2279
+ hint: 'Densidade preferencial para runtimes. Filtros costumam usar compact; formularios, comfortable; revisoes, rich.',
2280
+ },
2281
+ {
2282
+ name: 'optionSource.display.selectedLayout',
2283
+ label: 'Layout selecionado canonico',
2284
+ editorType: 'select',
2285
+ group: 'Display canonico',
2286
+ options: [
2287
+ { value: 'card', text: 'card' },
2288
+ { value: 'inline', text: 'inline' },
2289
+ { value: 'compact', text: 'compact' },
2290
+ { value: 'token', text: 'token' },
2291
+ ],
2292
+ hint: 'Layout preferencial do valor selecionado publicado pela option-source.',
2293
+ },
2294
+ {
2295
+ name: 'optionSource.display.resultLayout',
2296
+ label: 'Layout de resultados canonico',
2297
+ editorType: 'select',
2298
+ group: 'Display canonico',
2299
+ options: [
2300
+ { value: 'list', text: 'list' },
2301
+ { value: 'denseList', text: 'denseList' },
2302
+ { value: 'table', text: 'table' },
2303
+ { value: 'card', text: 'card' },
2304
+ ],
2305
+ hint: 'Layout preferencial da lista de resultados publicado pela option-source.',
2306
+ },
2307
+ {
2308
+ name: 'optionSource.display.primaryPropertyPath',
2309
+ label: 'Campo primario',
2310
+ editorType: 'text',
2311
+ group: 'Display canonico',
2312
+ hint: 'Campo semantico usado como titulo principal quando diferente de labelPropertyPath.',
2313
+ },
2314
+ {
2315
+ name: 'optionSource.display.fields',
2316
+ label: 'Campos ricos',
2317
+ editorType: 'textarea',
2318
+ group: 'Display canonico',
2319
+ hint: 'JSON array de subinformacoes ricas. Ex.: [{ "key": "role", "propertyPath": "cargo.nome", "label": "Cargo", "icon": "work", "presentation": "text", "tone": "neutral" }, { "key": "department", "propertyPath": "departamento.nome", "label": "Departamento", "icon": "groups", "presentation": "chip", "tone": "info" }].',
2320
+ },
2321
+ {
2322
+ name: 'optionSource.display.secondaryPropertyPaths',
2323
+ label: 'Campos secundarios canonicos',
2324
+ editorType: 'textarea',
2325
+ group: 'Display canonico',
2326
+ hint: 'JSON array ou uma linha por campo usado como subtitulo. Ex.: cargo.nome, departamento.nome.',
2327
+ },
2328
+ {
2329
+ name: 'optionSource.display.badgePropertyPaths',
2330
+ label: 'Campos de badges canonicos',
2331
+ editorType: 'textarea',
2332
+ group: 'Display canonico',
2333
+ hint: 'JSON array ou uma linha por campo materializado como badge/chip.',
2334
+ },
2335
+ {
2336
+ name: 'optionSource.display.avatarPropertyPath',
2337
+ label: 'Campo de avatar',
2338
+ editorType: 'text',
2339
+ group: 'Display canonico',
2340
+ hint: 'Campo usado para avatar/imagem; quando ausente, o runtime pode usar iniciais.',
2341
+ },
2342
+ {
2343
+ name: 'optionSource.display.showAvatar',
2344
+ label: 'Display: avatar',
2345
+ editorType: 'checkbox',
2346
+ group: 'Display canonico',
2347
+ },
2348
+ {
2349
+ name: 'optionSource.display.showCode',
2350
+ label: 'Display: codigo',
2351
+ editorType: 'checkbox',
2352
+ group: 'Display canonico',
2353
+ },
2354
+ {
2355
+ name: 'optionSource.display.showDescription',
2356
+ label: 'Display: descricao',
2357
+ editorType: 'checkbox',
2358
+ group: 'Display canonico',
2359
+ },
2360
+ {
2361
+ name: 'optionSource.display.showStatus',
2362
+ label: 'Display: status',
2363
+ editorType: 'checkbox',
2364
+ group: 'Display canonico',
2365
+ },
2366
+ {
2367
+ name: 'optionSource.display.showBadges',
2368
+ label: 'Display: badges',
2369
+ editorType: 'checkbox',
2370
+ group: 'Display canonico',
2371
+ },
2372
+ {
2373
+ name: 'optionSource.display.showDisabledReason',
2374
+ label: 'Display: motivo bloqueado',
2375
+ editorType: 'checkbox',
2376
+ group: 'Display canonico',
2377
+ },
2378
+ {
2379
+ name: 'optionSource.display.showResultCount',
2380
+ label: 'Display: contador de resultados',
2381
+ editorType: 'checkbox',
2382
+ group: 'Display canonico',
2383
+ },
2384
+ {
2385
+ name: 'optionSource.display.statusToneMap',
2386
+ label: 'Mapa canonico de tons',
2387
+ editorType: 'textarea',
2388
+ group: 'Display canonico',
2389
+ hint: 'JSON object. Ex.: { "ACTIVE": "success", "BLOCKED": "danger" }.',
2390
+ },
2391
+ {
2392
+ name: 'optionSource.display.badgeKeys',
2393
+ label: 'Chaves canonicas de badges',
2394
+ editorType: 'textarea',
2395
+ group: 'Display canonico',
2396
+ hint: 'JSON array ou uma linha por chave complementar de badge.',
2397
+ },
2398
+ {
2399
+ name: 'optionSource.display.maxVisibleBadges',
2400
+ label: 'Maximo canonico de badges',
2401
+ editorType: 'number',
2402
+ group: 'Display canonico',
2403
+ hint: 'Limite preferencial de badges antes de overflow.',
2404
+ },
2238
2405
  {
2239
2406
  name: 'selectedLayout',
2240
2407
  label: 'Layout selecionado',
@@ -2551,6 +2718,55 @@ const entityLookupProperties = [
2551
2718
  { value: 'modal', text: 'Modal' },
2552
2719
  ],
2553
2720
  },
2721
+ {
2722
+ name: 'optionSource.detail.kind',
2723
+ label: 'Tipo de detalhe',
2724
+ editorType: 'select',
2725
+ group: 'Navegacao',
2726
+ options: [
2727
+ { value: 'surface', text: 'surface' },
2728
+ { value: 'route', text: 'route' },
2729
+ { value: 'href', text: 'href' },
2730
+ ],
2731
+ hint: 'Use surface como contrato canonico de plataforma; route/href ficam como fallback legado.',
2732
+ },
2733
+ {
2734
+ name: 'optionSource.detail.surfaceId',
2735
+ label: 'Surface de detalhe',
2736
+ editorType: 'text',
2737
+ group: 'Navegacao',
2738
+ hint: 'Id da surface item-level preferida. Ex.: view, detail.',
2739
+ },
2740
+ {
2741
+ name: 'optionSource.detail.presentation',
2742
+ label: 'Apresentacao da surface',
2743
+ editorType: 'select',
2744
+ group: 'Navegacao',
2745
+ options: [
2746
+ { value: 'drawer', text: 'Drawer' },
2747
+ { value: 'modal', text: 'Modal' },
2748
+ ],
2749
+ hint: 'Como o runtime deve materializar a surface de detalhe.',
2750
+ },
2751
+ {
2752
+ name: 'optionSource.detail.preferredWidget',
2753
+ label: 'Widget preferido',
2754
+ editorType: 'text',
2755
+ group: 'Navegacao',
2756
+ hint: 'Hint semantico para autoria/discovery. Ex.: praxis-dynamic-form.',
2757
+ },
2758
+ {
2759
+ name: 'optionSource.detail.mode',
2760
+ label: 'Modo da surface',
2761
+ editorType: 'select',
2762
+ group: 'Navegacao',
2763
+ options: [
2764
+ { value: 'view', text: 'view' },
2765
+ { value: 'edit', text: 'edit' },
2766
+ { value: 'create', text: 'create' },
2767
+ ],
2768
+ hint: 'Modo semantico da surface de detalhe.',
2769
+ },
2554
2770
  {
2555
2771
  name: 'optionSource.create.hrefTemplate',
2556
2772
  label: 'Template create href',
@@ -7768,6 +7984,14 @@ class FieldMetadataEditorComponent {
7768
7984
  this.normalizeJsonArrayProperty(filtering, 'sortOptions');
7769
7985
  this.normalizeStringListProperty(filtering, 'quickFilterFields');
7770
7986
  }
7987
+ const display = optionSource.display;
7988
+ if (display && typeof display === 'object') {
7989
+ this.normalizeJsonArrayProperty(display, 'fields');
7990
+ this.normalizeStringListProperty(display, 'secondaryPropertyPaths');
7991
+ this.normalizeStringListProperty(display, 'badgePropertyPaths');
7992
+ this.normalizeStringListProperty(display, 'badgeKeys');
7993
+ this.normalizeJsonObjectProperty(display, 'statusToneMap');
7994
+ }
7771
7995
  }
7772
7996
  this.normalizeStringListProperty(patch, 'badgeKeys');
7773
7997
  this.normalizeJsonObjectProperty(patch, 'statusToneMap');
@@ -9188,6 +9412,31 @@ const optionSourceSchema = {
9188
9412
  labelField: { type: 'string' },
9189
9413
  dependsOn: { type: 'string' },
9190
9414
  dependencyFilterMap: { type: 'object' },
9415
+ display: {
9416
+ type: 'object',
9417
+ properties: {
9418
+ preset: { enum: ['compact', 'rich', 'directory', 'status', 'reference', 'hierarchical'] },
9419
+ usage: { enum: ['form', 'filter', 'table-cell', 'dashboard', 'wizard', 'review'] },
9420
+ density: { enum: ['compact', 'comfortable', 'rich'] },
9421
+ selectedLayout: { enum: ['card', 'inline', 'compact', 'token'] },
9422
+ resultLayout: { enum: ['list', 'denseList', 'table', 'card'] },
9423
+ primaryPropertyPath: { type: 'string' },
9424
+ fields: { type: 'array' },
9425
+ secondaryPropertyPaths: { type: 'array' },
9426
+ badgePropertyPaths: { type: 'array' },
9427
+ statusToneMap: { type: 'object' },
9428
+ },
9429
+ },
9430
+ detail: {
9431
+ type: 'object',
9432
+ properties: {
9433
+ kind: { enum: ['surface', 'route', 'href'] },
9434
+ surfaceId: { type: 'string' },
9435
+ presentation: { enum: ['drawer', 'modal'] },
9436
+ preferredWidget: { type: 'string' },
9437
+ mode: { enum: ['view', 'edit', 'create'] },
9438
+ },
9439
+ },
9191
9440
  options: { type: 'array' },
9192
9441
  },
9193
9442
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@praxisui/metadata-editor",
3
- "version": "8.0.0-beta.27",
3
+ "version": "8.0.0-beta.29",
4
4
  "description": "Metadata editor for Praxis UI fields and components with runtime integration.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^20.0.0",
@@ -8,10 +8,10 @@
8
8
  "@angular/cdk": "^20.0.0",
9
9
  "@angular/forms": "^20.0.0",
10
10
  "@angular/material": "^20.0.0",
11
- "@praxisui/ai": "^8.0.0-beta.27",
12
- "@praxisui/core": "^8.0.0-beta.27",
13
- "@praxisui/dynamic-fields": "^8.0.0-beta.27",
14
- "@praxisui/settings-panel": "^8.0.0-beta.27",
11
+ "@praxisui/ai": "^8.0.0-beta.29",
12
+ "@praxisui/core": "^8.0.0-beta.29",
13
+ "@praxisui/dynamic-fields": "^8.0.0-beta.29",
14
+ "@praxisui/settings-panel": "^8.0.0-beta.29",
15
15
  "rxjs": "~7.8.0"
16
16
  },
17
17
  "dependencies": {