@praxisui/core 9.0.36 → 9.0.37
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/README.md +3 -1
- package/ai/component-registry.json +729 -4
- package/fesm2022/praxisui-core.mjs +1710 -385
- package/package.json +1 -1
- package/types/praxisui-core.d.ts +109 -3
|
@@ -8,13 +8,13 @@ import * as i1$3 from '@angular/common';
|
|
|
8
8
|
import { Location, DOCUMENT, CommonModule } from '@angular/common';
|
|
9
9
|
import { Router, ActivatedRoute } from '@angular/router';
|
|
10
10
|
import * as i1$2 from '@angular/forms';
|
|
11
|
-
import { Validators, FormGroup, FormControl, FormArray, FormsModule } from '@angular/forms';
|
|
11
|
+
import { Validators, FormGroup, FormControl, FormArray, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
12
12
|
import { MatSnackBar } from '@angular/material/snack-bar';
|
|
13
13
|
import * as i1$1 from '@angular/material/icon';
|
|
14
14
|
import { MatIconRegistry, MatIconModule } from '@angular/material/icon';
|
|
15
15
|
import * as i2 from '@angular/material/button';
|
|
16
16
|
import { MatButtonModule } from '@angular/material/button';
|
|
17
|
-
import * as
|
|
17
|
+
import * as i4 from '@angular/material/form-field';
|
|
18
18
|
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
19
19
|
import * as i5 from '@angular/material/input';
|
|
20
20
|
import { MatInputModule } from '@angular/material/input';
|
|
@@ -25,16 +25,19 @@ import { MatSlideToggleModule } from '@angular/material/slide-toggle';
|
|
|
25
25
|
import * as i8 from '@angular/material/tooltip';
|
|
26
26
|
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
27
27
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
28
|
-
import * as i4 from '@angular/material/menu';
|
|
28
|
+
import * as i4$1 from '@angular/material/menu';
|
|
29
29
|
import { MatMenuModule } from '@angular/material/menu';
|
|
30
|
-
import * as i3
|
|
30
|
+
import * as i3 from '@angular/material/progress-spinner';
|
|
31
31
|
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
32
|
-
import * as
|
|
33
|
-
import {
|
|
34
|
-
import
|
|
35
|
-
import { MatChipsModule } from '@angular/material/chips';
|
|
32
|
+
import * as i3$1 from '@angular/material/button-toggle';
|
|
33
|
+
import { MatButtonToggleModule } from '@angular/material/button-toggle';
|
|
34
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
36
35
|
import * as i1$4 from '@angular/material/dialog';
|
|
37
36
|
import { MAT_DIALOG_DATA, MatDialogModule, MatDialog } from '@angular/material/dialog';
|
|
37
|
+
import * as i8$1 from '@angular/material/chips';
|
|
38
|
+
import { MatChipsModule } from '@angular/material/chips';
|
|
39
|
+
import * as i2$1 from '@angular/material/card';
|
|
40
|
+
import { MatCardModule } from '@angular/material/card';
|
|
38
41
|
import * as i1$5 from '@angular/material/tabs';
|
|
39
42
|
import { MatTabsModule } from '@angular/material/tabs';
|
|
40
43
|
|
|
@@ -14488,6 +14491,51 @@ const RELATED_RESOURCE_OUTLET_I18N_CONFIG = {
|
|
|
14488
14491
|
'action.delete.label': 'Remover {{noun}}',
|
|
14489
14492
|
'action.delete.tooltip': 'Remova {{noun}} do contexto selecionado.',
|
|
14490
14493
|
'status.ready': 'Recurso relacionado pronto',
|
|
14494
|
+
'editor.title': 'Apresentação do recurso relacionado',
|
|
14495
|
+
'editor.description': 'Configure somente a moldura visual. A relação e seus dados continuam governados pelos metadados.',
|
|
14496
|
+
'editor.shell.title': 'Apresentação',
|
|
14497
|
+
'editor.shell.help': 'Textos e escolhas de exibição desta instância do outlet.',
|
|
14498
|
+
'editor.field.title': 'Título',
|
|
14499
|
+
'editor.field.subtitle': 'Subtítulo',
|
|
14500
|
+
'editor.field.icon': 'Ícone',
|
|
14501
|
+
'editor.field.icon.choose': 'Escolher ícone do outlet',
|
|
14502
|
+
'editor.field.mode': 'Modo de exibição',
|
|
14503
|
+
'editor.field.mode.inline': 'Em linha',
|
|
14504
|
+
'editor.field.mode.openAction': 'Ação de abertura',
|
|
14505
|
+
'editor.field.presentation': 'Apresentação ao abrir',
|
|
14506
|
+
'editor.field.presentation.drawer': 'Painel lateral',
|
|
14507
|
+
'editor.field.presentation.modal': 'Modal',
|
|
14508
|
+
'editor.field.compact': 'Usar estados vazios e de carregamento compactos',
|
|
14509
|
+
'editor.emptyState.title': 'Estado vazio',
|
|
14510
|
+
'editor.emptyState.help': 'Sobrescreva somente a apresentação. Ações, templates e comportamento contextual permanecem intactos.',
|
|
14511
|
+
'editor.emptyState.field.title': 'Título',
|
|
14512
|
+
'editor.emptyState.field.message': 'Mensagem',
|
|
14513
|
+
'editor.emptyState.field.description': 'Descrição',
|
|
14514
|
+
'editor.emptyState.field.icon': 'Ícone',
|
|
14515
|
+
'editor.emptyState.field.icon.choose': 'Escolher ícone do estado vazio',
|
|
14516
|
+
'editor.emptyState.field.tone': 'Tom',
|
|
14517
|
+
'editor.emptyState.field.variant': 'Variante',
|
|
14518
|
+
'editor.emptyState.field.alignment': 'Alinhamento',
|
|
14519
|
+
'editor.emptyState.field.density': 'Densidade',
|
|
14520
|
+
'editor.emptyState.field.iconContainer': 'Contêiner do ícone',
|
|
14521
|
+
'editor.value.derived': 'Usar padrão do runtime',
|
|
14522
|
+
'editor.value.derived.short': 'Automático',
|
|
14523
|
+
'editor.value.tone.neutral': 'Neutro',
|
|
14524
|
+
'editor.value.tone.primary': 'Primário',
|
|
14525
|
+
'editor.value.tone.secondary': 'Secundário',
|
|
14526
|
+
'editor.value.variant.inline': 'Em linha',
|
|
14527
|
+
'editor.value.variant.card': 'Cartão',
|
|
14528
|
+
'editor.value.variant.panel': 'Painel',
|
|
14529
|
+
'editor.value.variant.transparent': 'Transparente',
|
|
14530
|
+
'editor.value.alignment.start': 'Início',
|
|
14531
|
+
'editor.value.alignment.center': 'Centro',
|
|
14532
|
+
'editor.value.density.compact': 'Compacta',
|
|
14533
|
+
'editor.value.density.comfortable': 'Confortável',
|
|
14534
|
+
'editor.value.iconContainer.none': 'Nenhum',
|
|
14535
|
+
'editor.value.iconContainer.circle': 'Círculo',
|
|
14536
|
+
'editor.value.iconContainer.soft': 'Suave',
|
|
14537
|
+
'editor.boundary.title': 'A relação é somente leitura aqui',
|
|
14538
|
+
'editor.boundary.description': 'Paths de recursos, vínculos com o pai, operações, filtros e a configuração da tabela filha permanecem com seus donos canônicos.',
|
|
14491
14539
|
},
|
|
14492
14540
|
'en-US': {
|
|
14493
14541
|
'state.idle.title': 'Related resource not selected',
|
|
@@ -14514,6 +14562,51 @@ const RELATED_RESOURCE_OUTLET_I18N_CONFIG = {
|
|
|
14514
14562
|
'action.delete.label': 'Remove {{noun}}',
|
|
14515
14563
|
'action.delete.tooltip': 'Remove {{noun}} from the selected context.',
|
|
14516
14564
|
'status.ready': 'Related resource ready',
|
|
14565
|
+
'editor.title': 'Related resource presentation',
|
|
14566
|
+
'editor.description': 'Configure only the visual shell. The relationship and its data remain governed by metadata.',
|
|
14567
|
+
'editor.shell.title': 'Presentation',
|
|
14568
|
+
'editor.shell.help': 'Copy and display choices for this outlet instance.',
|
|
14569
|
+
'editor.field.title': 'Title',
|
|
14570
|
+
'editor.field.subtitle': 'Subtitle',
|
|
14571
|
+
'editor.field.icon': 'Icon',
|
|
14572
|
+
'editor.field.icon.choose': 'Choose outlet icon',
|
|
14573
|
+
'editor.field.mode': 'Display mode',
|
|
14574
|
+
'editor.field.mode.inline': 'Inline',
|
|
14575
|
+
'editor.field.mode.openAction': 'Open action',
|
|
14576
|
+
'editor.field.presentation': 'Open presentation',
|
|
14577
|
+
'editor.field.presentation.drawer': 'Drawer',
|
|
14578
|
+
'editor.field.presentation.modal': 'Modal',
|
|
14579
|
+
'editor.field.compact': 'Use compact empty and loading states',
|
|
14580
|
+
'editor.emptyState.title': 'Empty state',
|
|
14581
|
+
'editor.emptyState.help': 'Override presentation only. Actions, templates and contextual behavior remain untouched.',
|
|
14582
|
+
'editor.emptyState.field.title': 'Title',
|
|
14583
|
+
'editor.emptyState.field.message': 'Message',
|
|
14584
|
+
'editor.emptyState.field.description': 'Description',
|
|
14585
|
+
'editor.emptyState.field.icon': 'Icon',
|
|
14586
|
+
'editor.emptyState.field.icon.choose': 'Choose empty-state icon',
|
|
14587
|
+
'editor.emptyState.field.tone': 'Tone',
|
|
14588
|
+
'editor.emptyState.field.variant': 'Variant',
|
|
14589
|
+
'editor.emptyState.field.alignment': 'Alignment',
|
|
14590
|
+
'editor.emptyState.field.density': 'Density',
|
|
14591
|
+
'editor.emptyState.field.iconContainer': 'Icon container',
|
|
14592
|
+
'editor.value.derived': 'Use runtime default',
|
|
14593
|
+
'editor.value.derived.short': 'Auto',
|
|
14594
|
+
'editor.value.tone.neutral': 'Neutral',
|
|
14595
|
+
'editor.value.tone.primary': 'Primary',
|
|
14596
|
+
'editor.value.tone.secondary': 'Secondary',
|
|
14597
|
+
'editor.value.variant.inline': 'Inline',
|
|
14598
|
+
'editor.value.variant.card': 'Card',
|
|
14599
|
+
'editor.value.variant.panel': 'Panel',
|
|
14600
|
+
'editor.value.variant.transparent': 'Transparent',
|
|
14601
|
+
'editor.value.alignment.start': 'Start',
|
|
14602
|
+
'editor.value.alignment.center': 'Center',
|
|
14603
|
+
'editor.value.density.compact': 'Compact',
|
|
14604
|
+
'editor.value.density.comfortable': 'Comfortable',
|
|
14605
|
+
'editor.value.iconContainer.none': 'None',
|
|
14606
|
+
'editor.value.iconContainer.circle': 'Circle',
|
|
14607
|
+
'editor.value.iconContainer.soft': 'Soft',
|
|
14608
|
+
'editor.boundary.title': 'Relationship is read-only here',
|
|
14609
|
+
'editor.boundary.description': 'Resource paths, parent bindings, operations, filters and child table configuration stay with their canonical owners.',
|
|
14517
14610
|
},
|
|
14518
14611
|
},
|
|
14519
14612
|
},
|
|
@@ -27019,7 +27112,7 @@ class SurfaceOpenActionEditorComponent {
|
|
|
27019
27112
|
</mat-form-field>
|
|
27020
27113
|
</div>
|
|
27021
27114
|
</div>
|
|
27022
|
-
`, isInline: true, styles: [".surface-editor{display:grid;gap:14px;min-width:0}.surface-section{display:grid;gap:10px;min-width:0;padding:14px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-low)}.surface-section-header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:0}.surface-section-title{font-size:12px;font-weight:700;letter-spacing:0;text-transform:uppercase;color:var(--md-sys-color-on-surface-variant);margin-bottom:0}.surface-section-header .surface-section-title{margin-bottom:0}.surface-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(220px,100%),1fr));gap:12px 16px;min-width:0}.surface-preset-row{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}.surface-span-2{grid-column:span 2}.surface-span-all{width:100%;min-width:0}.surface-component-meta{display:grid;gap:4px;padding:10px 12px;border-radius:8px;background:var(--md-sys-color-surface-container)}.surface-component-title{font-weight:600;color:var(--md-sys-color-on-surface)}.surface-component-description,.surface-empty{color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.45}.surface-bindings{display:grid;gap:10px;min-width:0}.surface-binding-row{display:grid;grid-template-columns:minmax(min(220px,100%),1.15fr) minmax(min(240px,100%),1.25fr) minmax(128px,.55fr) auto;gap:10px;align-items:start;min-width:0;padding:10px;border-radius:8px;background:var(--md-sys-color-surface-container)}.surface-binding-row mat-form-field:nth-child(4){grid-column:1 / -2}.surface-binding-remove{color:var(--md-sys-color-error)}.surface-guidance{display:grid;gap:4px;padding:10px 12px;border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-primary-container) 18%,transparent);color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.45}.surface-guidance__item{overflow-wrap:anywhere}.surface-guidance__item--primary{color:var(--md-sys-color-on-surface)}mat-form-field{width:100%;min-width:0}@media(max-width:960px){.surface-section{padding:12px}.surface-span-2{grid-column:1 / -1}.surface-binding-row{grid-template-columns:minmax(0,1fr)}.surface-binding-row mat-form-field:nth-child(4){grid-column:auto}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type:
|
|
27115
|
+
`, isInline: true, styles: [".surface-editor{display:grid;gap:14px;min-width:0}.surface-section{display:grid;gap:10px;min-width:0;padding:14px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-low)}.surface-section-header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:0}.surface-section-title{font-size:12px;font-weight:700;letter-spacing:0;text-transform:uppercase;color:var(--md-sys-color-on-surface-variant);margin-bottom:0}.surface-section-header .surface-section-title{margin-bottom:0}.surface-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(220px,100%),1fr));gap:12px 16px;min-width:0}.surface-preset-row{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}.surface-span-2{grid-column:span 2}.surface-span-all{width:100%;min-width:0}.surface-component-meta{display:grid;gap:4px;padding:10px 12px;border-radius:8px;background:var(--md-sys-color-surface-container)}.surface-component-title{font-weight:600;color:var(--md-sys-color-on-surface)}.surface-component-description,.surface-empty{color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.45}.surface-bindings{display:grid;gap:10px;min-width:0}.surface-binding-row{display:grid;grid-template-columns:minmax(min(220px,100%),1.15fr) minmax(min(240px,100%),1.25fr) minmax(128px,.55fr) auto;gap:10px;align-items:start;min-width:0;padding:10px;border-radius:8px;background:var(--md-sys-color-surface-container)}.surface-binding-row mat-form-field:nth-child(4){grid-column:1 / -2}.surface-binding-remove{color:var(--md-sys-color-error)}.surface-guidance{display:grid;gap:4px;padding:10px 12px;border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-primary-container) 18%,transparent);color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.45}.surface-guidance__item{overflow-wrap:anywhere}.surface-guidance__item--primary{color:var(--md-sys-color-on-surface)}mat-form-field{width:100%;min-width:0}@media(max-width:960px){.surface-section{padding:12px}.surface-span-2{grid-column:1 / -1}.surface-binding-row{grid-template-columns:minmax(0,1fr)}.surface-binding-row mat-form-field:nth-child(4){grid-column:auto}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i6.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i7.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }] });
|
|
27023
27116
|
}
|
|
27024
27117
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: SurfaceOpenActionEditorComponent, decorators: [{
|
|
27025
27118
|
type: Component,
|
|
@@ -27384,6 +27477,151 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
27384
27477
|
type: Output
|
|
27385
27478
|
}] } });
|
|
27386
27479
|
|
|
27480
|
+
class ComponentAuthoringManifestProjectionError extends Error {
|
|
27481
|
+
name = 'ComponentAuthoringManifestProjectionError';
|
|
27482
|
+
code;
|
|
27483
|
+
path;
|
|
27484
|
+
constructor(code, path, message) {
|
|
27485
|
+
super(message);
|
|
27486
|
+
this.code = code;
|
|
27487
|
+
this.path = path;
|
|
27488
|
+
}
|
|
27489
|
+
}
|
|
27490
|
+
/**
|
|
27491
|
+
* Materializa um manifesto filho sem copiar ou redefinir operações do owner.
|
|
27492
|
+
*
|
|
27493
|
+
* A função é deliberadamente fail-closed: toda referência deve existir na fonte,
|
|
27494
|
+
* e a closure de targets, validators e examples precisa permanecer executável.
|
|
27495
|
+
*/
|
|
27496
|
+
function projectComponentAuthoringManifest(source, projection) {
|
|
27497
|
+
assertProjectionIdentity(source, projection);
|
|
27498
|
+
assertSourceIdentitiesUnique(source);
|
|
27499
|
+
assertReferenceListNotEmpty(projection.runtimeInputNames, 'runtimeInputNames');
|
|
27500
|
+
assertReferenceListNotEmpty(projection.operationIds, 'operationIds');
|
|
27501
|
+
assertUniqueReferences(projection.runtimeInputNames, 'runtimeInputNames');
|
|
27502
|
+
assertUniqueReferences(projection.operationIds, 'operationIds');
|
|
27503
|
+
assertUniqueReferences(projection.roundTripRequirements ?? [], 'roundTripRequirements');
|
|
27504
|
+
const runtimeInputs = selectByStableId(source.runtimeInputs, projection.runtimeInputNames, (input) => input.name, 'runtimeInputNames', 'AUTHORING_MANIFEST_PROJECTION_RUNTIME_INPUT_MISSING');
|
|
27505
|
+
const operations = selectByStableId(source.operations, projection.operationIds, (operation) => operation.operationId, 'operationIds', 'AUTHORING_MANIFEST_PROJECTION_OPERATION_MISSING');
|
|
27506
|
+
const editableTargets = closeEditableTargets(source.editableTargets, operations);
|
|
27507
|
+
const validators = closeValidators(source.validators, operations);
|
|
27508
|
+
const examples = closeExamples(source.examples, operations);
|
|
27509
|
+
const roundTripRequirements = selectRoundTripRequirements(source.roundTripRequirements ?? [], projection.roundTripRequirements ?? []);
|
|
27510
|
+
return cloneManifestValue({
|
|
27511
|
+
schemaVersion: source.schemaVersion,
|
|
27512
|
+
componentId: projection.componentId.trim(),
|
|
27513
|
+
ownerPackage: source.ownerPackage,
|
|
27514
|
+
configSchemaId: source.configSchemaId,
|
|
27515
|
+
manifestVersion: projection.manifestVersion.trim(),
|
|
27516
|
+
runtimeInputs,
|
|
27517
|
+
editableTargets,
|
|
27518
|
+
operations,
|
|
27519
|
+
validators,
|
|
27520
|
+
...(roundTripRequirements.length ? { roundTripRequirements } : {}),
|
|
27521
|
+
examples,
|
|
27522
|
+
});
|
|
27523
|
+
}
|
|
27524
|
+
function assertSourceIdentitiesUnique(source) {
|
|
27525
|
+
assertSourceCollectionIdentitiesUnique(source.runtimeInputs, (input) => input.name, 'source.runtimeInputs', 'name');
|
|
27526
|
+
assertSourceCollectionIdentitiesUnique(source.operations, (operation) => operation.operationId, 'source.operations', 'operationId');
|
|
27527
|
+
assertSourceCollectionIdentitiesUnique(source.editableTargets, (target) => target.kind, 'source.editableTargets', 'kind');
|
|
27528
|
+
assertSourceCollectionIdentitiesUnique(source.validators, (validator) => validator.validatorId, 'source.validators', 'validatorId');
|
|
27529
|
+
assertSourceCollectionIdentitiesUnique(source.examples, (example) => example.id, 'source.examples', 'id');
|
|
27530
|
+
}
|
|
27531
|
+
function assertSourceCollectionIdentitiesUnique(items, identity, path, identityProperty) {
|
|
27532
|
+
const seen = new Set();
|
|
27533
|
+
items.forEach((item, index) => {
|
|
27534
|
+
const stableId = identity(item)?.trim();
|
|
27535
|
+
if (!stableId) {
|
|
27536
|
+
fail('AUTHORING_MANIFEST_PROJECTION_ID_INVALID', `${path}[${index}].${identityProperty}`, 'Source manifest stable identities must be non-empty.');
|
|
27537
|
+
}
|
|
27538
|
+
if (seen.has(stableId)) {
|
|
27539
|
+
fail('AUTHORING_MANIFEST_PROJECTION_SOURCE_ID_DUPLICATE', `${path}[${index}].${identityProperty}`, `Duplicate source manifest identity ${stableId}.`);
|
|
27540
|
+
}
|
|
27541
|
+
seen.add(stableId);
|
|
27542
|
+
});
|
|
27543
|
+
}
|
|
27544
|
+
function assertReferenceListNotEmpty(references, path) {
|
|
27545
|
+
if (!references.length) {
|
|
27546
|
+
fail('AUTHORING_MANIFEST_PROJECTION_EMPTY_REFERENCE_LIST', path, 'Required projection reference lists must not be empty.');
|
|
27547
|
+
}
|
|
27548
|
+
}
|
|
27549
|
+
function assertProjectionIdentity(source, projection) {
|
|
27550
|
+
if (projection.sourceComponentId !== source.componentId) {
|
|
27551
|
+
fail('AUTHORING_MANIFEST_PROJECTION_SOURCE_MISMATCH', 'sourceComponentId', `Expected sourceComponentId ${source.componentId}, received ${projection.sourceComponentId}.`);
|
|
27552
|
+
}
|
|
27553
|
+
if (!projection.componentId?.trim()) {
|
|
27554
|
+
fail('AUTHORING_MANIFEST_PROJECTION_ID_INVALID', 'componentId', 'Projected componentId must be a non-empty canonical id.');
|
|
27555
|
+
}
|
|
27556
|
+
if (!projection.manifestVersion?.trim()) {
|
|
27557
|
+
fail('AUTHORING_MANIFEST_PROJECTION_ID_INVALID', 'manifestVersion', 'Projected manifestVersion must be non-empty.');
|
|
27558
|
+
}
|
|
27559
|
+
}
|
|
27560
|
+
function assertUniqueReferences(references, path) {
|
|
27561
|
+
const seen = new Set();
|
|
27562
|
+
references.forEach((reference, index) => {
|
|
27563
|
+
const normalized = reference?.trim();
|
|
27564
|
+
if (!normalized || seen.has(normalized)) {
|
|
27565
|
+
fail('AUTHORING_MANIFEST_PROJECTION_DUPLICATE_REFERENCE', `${path}[${index}]`, normalized
|
|
27566
|
+
? `Duplicate stable reference ${normalized}.`
|
|
27567
|
+
: 'Stable references must be non-empty.');
|
|
27568
|
+
}
|
|
27569
|
+
seen.add(normalized);
|
|
27570
|
+
});
|
|
27571
|
+
}
|
|
27572
|
+
function selectByStableId(source, references, identity, path, missingCode) {
|
|
27573
|
+
const sourceById = new Map(source.map((item) => [identity(item), item]));
|
|
27574
|
+
return references.map((reference, index) => {
|
|
27575
|
+
const resolved = sourceById.get(reference);
|
|
27576
|
+
if (!resolved) {
|
|
27577
|
+
fail(missingCode, `${path}[${index}]`, `Stable reference ${reference} does not exist in the source manifest.`);
|
|
27578
|
+
}
|
|
27579
|
+
return resolved;
|
|
27580
|
+
});
|
|
27581
|
+
}
|
|
27582
|
+
function closeEditableTargets(sourceTargets, operations) {
|
|
27583
|
+
const targetKinds = unique(operations
|
|
27584
|
+
.map((operation) => operation.target?.kind ?? operation.targetKind)
|
|
27585
|
+
.filter((kind) => !!kind));
|
|
27586
|
+
return selectByStableId(sourceTargets, targetKinds, (target) => target.kind, 'source.editableTargets', 'AUTHORING_MANIFEST_PROJECTION_TARGET_MISSING');
|
|
27587
|
+
}
|
|
27588
|
+
function closeValidators(sourceValidators, operations) {
|
|
27589
|
+
const validatorIds = unique(operations.flatMap((operation) => operation.validators ?? []));
|
|
27590
|
+
return selectByStableId(sourceValidators, validatorIds, (validator) => validator.validatorId, 'source.validators', 'AUTHORING_MANIFEST_PROJECTION_VALIDATOR_MISSING');
|
|
27591
|
+
}
|
|
27592
|
+
function closeExamples(sourceExamples, operations) {
|
|
27593
|
+
const operationIds = new Set(operations.map((operation) => operation.operationId));
|
|
27594
|
+
const examples = sourceExamples.filter((example) => operationIds.has(example.operationId));
|
|
27595
|
+
if (!examples.length) {
|
|
27596
|
+
fail('AUTHORING_MANIFEST_PROJECTION_EXAMPLE_MISSING', 'source.examples', 'The projected operations have no source examples.');
|
|
27597
|
+
}
|
|
27598
|
+
if (!examples.some((example) => example.isPositive !== false)) {
|
|
27599
|
+
fail('AUTHORING_MANIFEST_PROJECTION_POSITIVE_EXAMPLE_MISSING', 'source.examples', 'The projected operations require at least one positive source example.');
|
|
27600
|
+
}
|
|
27601
|
+
if (!examples.some((example) => example.isPositive === false)) {
|
|
27602
|
+
fail('AUTHORING_MANIFEST_PROJECTION_NEGATIVE_EXAMPLE_MISSING', 'source.examples', 'The projected operations require at least one negative source example.');
|
|
27603
|
+
}
|
|
27604
|
+
return examples;
|
|
27605
|
+
}
|
|
27606
|
+
function selectRoundTripRequirements(sourceRequirements, projectedRequirements) {
|
|
27607
|
+
return selectByStableId(sourceRequirements, projectedRequirements, (requirement) => requirement, 'roundTripRequirements', 'AUTHORING_MANIFEST_PROJECTION_ROUND_TRIP_REQUIREMENT_MISSING');
|
|
27608
|
+
}
|
|
27609
|
+
function unique(values) {
|
|
27610
|
+
return [...new Set(values)];
|
|
27611
|
+
}
|
|
27612
|
+
function fail(code, path, message) {
|
|
27613
|
+
throw new ComponentAuthoringManifestProjectionError(code, path, message);
|
|
27614
|
+
}
|
|
27615
|
+
function cloneManifestValue(value) {
|
|
27616
|
+
if (Array.isArray(value)) {
|
|
27617
|
+
return value.map((item) => cloneManifestValue(item));
|
|
27618
|
+
}
|
|
27619
|
+
if (value && typeof value === 'object') {
|
|
27620
|
+
return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, cloneManifestValue(item)]));
|
|
27621
|
+
}
|
|
27622
|
+
return value;
|
|
27623
|
+
}
|
|
27624
|
+
|
|
27387
27625
|
/**
|
|
27388
27626
|
* Catálogo de capacidades genéricas de FieldMetadata para uso da IA.
|
|
27389
27627
|
* Baseado em projects/praxis-core/src/lib/models/component-metadata.interface.ts
|
|
@@ -32983,7 +33221,7 @@ class WidgetShellComponent {
|
|
|
32983
33221
|
@if (expanded || fullscreen) {
|
|
32984
33222
|
<div class="pdx-shell-backdrop" (click)="closeOverlay()"></div>
|
|
32985
33223
|
}
|
|
32986
|
-
`, isInline: true, styles: [":host{display:block;height:100%}:host(.pdx-widget-shell-collapsed){height:auto}.pdx-shell{position:relative;height:100%;display:flex;flex-direction:column}.pdx-shell.no-shell{background:transparent;border:none;border-radius:0;box-shadow:none}.pdx-shell.dashboard{background:var(--pdx-shell-card-bg, var(--pdx-dashboard-card-bg, var(--md-sys-color-surface-container-low)));border:1px solid var(--pdx-shell-card-border, var(--pdx-dashboard-card-border, var(--md-sys-color-outline-variant)));border-radius:var(--pdx-shell-card-radius, 12px);box-shadow:var(--pdx-shell-card-shadow, 0 4px 12px rgba(15, 23, 42, .06));overflow:hidden}.pdx-shell-header{display:flex;align-items:center;gap:10px;padding:8px 10px 7px;border-bottom:1px solid var(--pdx-shell-header-border, var(--md-sys-color-outline-variant));background:var(--pdx-shell-header-bg, var(--md-sys-color-surface-container))}.pdx-shell-header--drag-enabled{cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.pdx-shell-header--drag-enabled:active{cursor:grabbing}.pdx-shell-header--drag-enabled:focus-visible{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary) 72%,white 28%);outline-offset:-2px}.pdx-shell-title{display:flex;align-items:center;gap:8px;min-width:0;flex:1;color:var(--pdx-shell-title-color, inherit)}.pdx-shell-title mat-icon{color:var(--pdx-shell-icon-color, currentColor)}.pdx-shell-text{min-width:0}.pdx-shell-title-text{font-weight:var(--pdx-shell-title-weight, 600);font-size:var(--pdx-shell-title-size, 13px);line-height:1.15;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-subtitle{font-size:var(--pdx-shell-subtitle-size, 11px);opacity:.75;color:var(--pdx-shell-subtitle-color, currentColor);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-actions,.pdx-shell-window-actions{display:flex;align-items:center;gap:4px}.pdx-shell-window-actions{margin-left:auto}@media(max-width:640px){.pdx-shell-header,.pdx-shell-title{align-items:flex-start}.pdx-shell-text{display:grid;gap:2px}.pdx-shell-title-text,.pdx-shell-subtitle{display:-webkit-box;white-space:normal;overflow-wrap:anywhere;-webkit-box-orient:vertical}.pdx-shell-title-text,.pdx-shell-subtitle{-webkit-line-clamp:2}.pdx-shell-actions{flex:0 0 auto}}.pdx-action-outlined{border:1px solid var(--md-sys-color-outline-variant);border-radius:999px;padding:0 10px}.pdx-action-text{padding:0 8px}.pdx-shell-action--pressed:not(.praxis-icon-button){color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 12%,transparent)}.pdx-action-label{font-size:12px;font-weight:500}.pdx-shell-body{flex:1;min-height:0;padding:var(--pdx-shell-body-padding, 8px 10px 10px 10px);background:var(--pdx-shell-body-bg, transparent);color:var(--pdx-shell-body-color, inherit)}.pdx-shell.no-shell .pdx-shell-body{padding:0}.pdx-shell-body.hidden{display:none}.pdx-shell.collapsed{height:auto}.pdx-shell.collapsed .pdx-shell-header{border-bottom-color:transparent}.pdx-shell.body-fill .pdx-shell-body,.pdx-shell.body-scroll .pdx-shell-body,.pdx-shell.expanded .pdx-shell-body,.pdx-shell.fullscreen .pdx-shell-body{overflow:auto;display:flex;flex-direction:column;min-height:0}.pdx-shell.collapsed .pdx-shell-body{display:none}.pdx-shell.body-fill .pdx-shell-body{overflow:hidden}.pdx-shell.body-scroll .pdx-shell-body{overflow:auto}.pdx-shell.body-fill .pdx-shell-body>*,.pdx-shell.body-scroll .pdx-shell-body>*,.pdx-shell.expanded .pdx-shell-body>*,.pdx-shell.fullscreen .pdx-shell-body>*{flex:1 1 auto;min-height:0;width:100%}.pdx-shell.expanded{position:fixed;top:10vh;left:50%;width:min(920px,92vw);height:min(640px,82vh);transform:translate(-50%);z-index:var(--praxis-layer-widget-shell-expanded, 1290);box-shadow:var(--mat-elevation-level8)}.pdx-shell.fullscreen{position:fixed;inset:0;width:auto;height:auto;transform:none;border-radius:0;z-index:var(--praxis-layer-widget-shell-fullscreen, 1291);box-shadow:var(--mat-elevation-level8)}.pdx-shell-backdrop{position:fixed;inset:0;z-index:var(--praxis-layer-widget-shell-backdrop, 1280);background:#0000008c;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
33224
|
+
`, isInline: true, styles: [":host{display:block;height:100%}:host(.pdx-widget-shell-collapsed){height:auto}.pdx-shell{position:relative;height:100%;display:flex;flex-direction:column}.pdx-shell.no-shell{background:transparent;border:none;border-radius:0;box-shadow:none}.pdx-shell.dashboard{background:var(--pdx-shell-card-bg, var(--pdx-dashboard-card-bg, var(--md-sys-color-surface-container-low)));border:1px solid var(--pdx-shell-card-border, var(--pdx-dashboard-card-border, var(--md-sys-color-outline-variant)));border-radius:var(--pdx-shell-card-radius, 12px);box-shadow:var(--pdx-shell-card-shadow, 0 4px 12px rgba(15, 23, 42, .06));overflow:hidden}.pdx-shell-header{display:flex;align-items:center;gap:10px;padding:8px 10px 7px;border-bottom:1px solid var(--pdx-shell-header-border, var(--md-sys-color-outline-variant));background:var(--pdx-shell-header-bg, var(--md-sys-color-surface-container))}.pdx-shell-header--drag-enabled{cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.pdx-shell-header--drag-enabled:active{cursor:grabbing}.pdx-shell-header--drag-enabled:focus-visible{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary) 72%,white 28%);outline-offset:-2px}.pdx-shell-title{display:flex;align-items:center;gap:8px;min-width:0;flex:1;color:var(--pdx-shell-title-color, inherit)}.pdx-shell-title mat-icon{color:var(--pdx-shell-icon-color, currentColor)}.pdx-shell-text{min-width:0}.pdx-shell-title-text{font-weight:var(--pdx-shell-title-weight, 600);font-size:var(--pdx-shell-title-size, 13px);line-height:1.15;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-subtitle{font-size:var(--pdx-shell-subtitle-size, 11px);opacity:.75;color:var(--pdx-shell-subtitle-color, currentColor);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-actions,.pdx-shell-window-actions{display:flex;align-items:center;gap:4px}.pdx-shell-window-actions{margin-left:auto}@media(max-width:640px){.pdx-shell-header,.pdx-shell-title{align-items:flex-start}.pdx-shell-text{display:grid;gap:2px}.pdx-shell-title-text,.pdx-shell-subtitle{display:-webkit-box;white-space:normal;overflow-wrap:anywhere;-webkit-box-orient:vertical}.pdx-shell-title-text,.pdx-shell-subtitle{-webkit-line-clamp:2}.pdx-shell-actions{flex:0 0 auto}}.pdx-action-outlined{border:1px solid var(--md-sys-color-outline-variant);border-radius:999px;padding:0 10px}.pdx-action-text{padding:0 8px}.pdx-shell-action--pressed:not(.praxis-icon-button){color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 12%,transparent)}.pdx-action-label{font-size:12px;font-weight:500}.pdx-shell-body{flex:1;min-height:0;padding:var(--pdx-shell-body-padding, 8px 10px 10px 10px);background:var(--pdx-shell-body-bg, transparent);color:var(--pdx-shell-body-color, inherit)}.pdx-shell.no-shell .pdx-shell-body{padding:0}.pdx-shell-body.hidden{display:none}.pdx-shell.collapsed{height:auto}.pdx-shell.collapsed .pdx-shell-header{border-bottom-color:transparent}.pdx-shell.body-fill .pdx-shell-body,.pdx-shell.body-scroll .pdx-shell-body,.pdx-shell.expanded .pdx-shell-body,.pdx-shell.fullscreen .pdx-shell-body{overflow:auto;display:flex;flex-direction:column;min-height:0}.pdx-shell.collapsed .pdx-shell-body{display:none}.pdx-shell.body-fill .pdx-shell-body{overflow:hidden}.pdx-shell.body-scroll .pdx-shell-body{overflow:auto}.pdx-shell.body-fill .pdx-shell-body>*,.pdx-shell.body-scroll .pdx-shell-body>*,.pdx-shell.expanded .pdx-shell-body>*,.pdx-shell.fullscreen .pdx-shell-body>*{flex:1 1 auto;min-height:0;width:100%}.pdx-shell.expanded{position:fixed;top:10vh;left:50%;width:min(920px,92vw);height:min(640px,82vh);transform:translate(-50%);z-index:var(--praxis-layer-widget-shell-expanded, 1290);box-shadow:var(--mat-elevation-level8)}.pdx-shell.fullscreen{position:fixed;inset:0;width:auto;height:auto;transform:none;border-radius:0;z-index:var(--praxis-layer-widget-shell-fullscreen, 1291);box-shadow:var(--mat-elevation-level8)}.pdx-shell-backdrop{position:fixed;inset:0;z-index:var(--praxis-layer-widget-shell-backdrop, 1280);background:#0000008c;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
32987
33225
|
}
|
|
32988
33226
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: WidgetShellComponent, decorators: [{
|
|
32989
33227
|
type: Component,
|
|
@@ -37486,7 +37724,7 @@ class DynamicWidgetContextToolbarComponent {
|
|
|
37486
37724
|
</mat-menu>
|
|
37487
37725
|
}
|
|
37488
37726
|
</div>
|
|
37489
|
-
`, isInline: true, styles: [".pdx-widget-context-toolbar{position:absolute;top:-19px;right:12px;z-index:4;display:inline-flex;align-items:center;gap:4px;min-height:34px;padding:2px 4px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 28%,var(--md-sys-color-outline-variant));border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-high) 88%,transparent);box-shadow:0 10px 28px #0f172a38,0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.pdx-widget-context-toolbar--with-context{border-radius:18px}.pdx-widget-context-toolbar__context{display:inline-flex;align-items:center;align-self:stretch;max-width:180px;padding:0 8px 0 10px;border-right:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 64%,transparent);color:var(--md-sys-color-on-surface-variant);font-size:11px;font-weight:700;letter-spacing:.01em;line-height:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { 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"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
37727
|
+
`, isInline: true, styles: [".pdx-widget-context-toolbar{position:absolute;top:-19px;right:12px;z-index:4;display:inline-flex;align-items:center;gap:4px;min-height:34px;padding:2px 4px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 28%,var(--md-sys-color-outline-variant));border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-high) 88%,transparent);box-shadow:0 10px 28px #0f172a38,0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.pdx-widget-context-toolbar--with-context{border-radius:18px}.pdx-widget-context-toolbar__context{display:inline-flex;align-items:center;align-self:stretch;max-width:180px;padding:0 8px 0 10px;border-right:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 64%,transparent);color:var(--md-sys-color-on-surface-variant);font-size:11px;font-weight:700;letter-spacing:.01em;line-height:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { 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"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
37490
37728
|
}
|
|
37491
37729
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DynamicWidgetContextToolbarComponent, decorators: [{
|
|
37492
37730
|
type: Component,
|
|
@@ -39700,7 +39938,7 @@ class DynamicWidgetPageComponent {
|
|
|
39700
39938
|
this.dispatchWidgetComponentSettingsToRuntime(key);
|
|
39701
39939
|
return;
|
|
39702
39940
|
}
|
|
39703
|
-
const page = this.
|
|
39941
|
+
const page = this.ensurePageDefinition();
|
|
39704
39942
|
const widget = page.widgets.find((w) => w.key === key);
|
|
39705
39943
|
if (!widget)
|
|
39706
39944
|
return;
|
|
@@ -39711,9 +39949,12 @@ class DynamicWidgetPageComponent {
|
|
|
39711
39949
|
return;
|
|
39712
39950
|
}
|
|
39713
39951
|
const persistedInputs = this.cloneStateValues(widget.definition.inputs || {});
|
|
39952
|
+
const materializedInputs = metadata.configEditor?.contextResolver
|
|
39953
|
+
? this.readMaterializedInputsForWidget(metadata, key)
|
|
39954
|
+
: undefined;
|
|
39714
39955
|
const requestId = ++this.nextConfigEditorContextRequestId;
|
|
39715
39956
|
this.configEditorContextRequests.set(key, requestId);
|
|
39716
|
-
const contextResult = await this.resolveWidgetConfigEditorContext(metadata, page, widget, key, persistedInputs);
|
|
39957
|
+
const contextResult = await this.resolveWidgetConfigEditorContext(metadata, page, widget, key, persistedInputs, materializedInputs);
|
|
39717
39958
|
if (this.configEditorContextRequests.get(key) !== requestId) {
|
|
39718
39959
|
return;
|
|
39719
39960
|
}
|
|
@@ -39736,7 +39977,7 @@ class DynamicWidgetPageComponent {
|
|
|
39736
39977
|
ref.applied$.subscribe((result) => this.applyWidgetComponentInputs(key, result, false));
|
|
39737
39978
|
ref.saved$.subscribe((result) => this.applyWidgetComponentInputs(key, result, true));
|
|
39738
39979
|
}
|
|
39739
|
-
async resolveWidgetConfigEditorContext(metadata, page, widget, key, persistedInputs) {
|
|
39980
|
+
async resolveWidgetConfigEditorContext(metadata, page, widget, key, persistedInputs, materializedInputs) {
|
|
39740
39981
|
const resolver = metadata.configEditor?.contextResolver;
|
|
39741
39982
|
if (!resolver) {
|
|
39742
39983
|
return {};
|
|
@@ -39747,6 +39988,11 @@ class DynamicWidgetPageComponent {
|
|
|
39747
39988
|
widgetKey: key,
|
|
39748
39989
|
widgetType: widget.definition?.id,
|
|
39749
39990
|
persistedInputs: this.cloneStateValues(persistedInputs),
|
|
39991
|
+
...(materializedInputs
|
|
39992
|
+
? {
|
|
39993
|
+
materializedInputs: this.cloneStateValues(materializedInputs),
|
|
39994
|
+
}
|
|
39995
|
+
: {}),
|
|
39750
39996
|
page: this.cloneStateValues(page),
|
|
39751
39997
|
widget: this.cloneStateValues(widget),
|
|
39752
39998
|
metadata,
|
|
@@ -39783,39 +40029,22 @@ class DynamicWidgetPageComponent {
|
|
|
39783
40029
|
!Array.isArray(value) &&
|
|
39784
40030
|
('context' in value || 'diagnostics' in value));
|
|
39785
40031
|
}
|
|
39786
|
-
|
|
40032
|
+
readMaterializedInputsForWidget(metadata, key) {
|
|
39787
40033
|
const normalizedKey = String(key || '').trim();
|
|
39788
40034
|
if (!normalizedKey) {
|
|
39789
|
-
return
|
|
39790
|
-
}
|
|
39791
|
-
const widget = page.widgets?.find((candidate) => candidate.key === normalizedKey);
|
|
39792
|
-
if (!widget) {
|
|
39793
|
-
return page;
|
|
40035
|
+
return undefined;
|
|
39794
40036
|
}
|
|
39795
|
-
const inputNames =
|
|
39796
|
-
?.
|
|
39797
|
-
?.inputs?.map((input) => input.name)
|
|
40037
|
+
const inputNames = metadata.inputs
|
|
40038
|
+
?.map((input) => input.name)
|
|
39798
40039
|
?.filter((name) => typeof name === 'string' && !!name.trim()) || [];
|
|
39799
40040
|
if (!inputNames.length) {
|
|
39800
|
-
return
|
|
40041
|
+
return undefined;
|
|
39801
40042
|
}
|
|
39802
40043
|
const loader = this.findWidgetLoader(normalizedKey);
|
|
39803
|
-
|
|
39804
|
-
|
|
39805
|
-
return page;
|
|
39806
|
-
}
|
|
39807
|
-
const result = this.applyWidgetInputPatchToPage(page, normalizedKey, {
|
|
39808
|
-
sourceComponentId: widget.definition?.id,
|
|
39809
|
-
output: 'runtimeInputSnapshot',
|
|
39810
|
-
payload: {
|
|
39811
|
-
inputPatch: materializedInputs,
|
|
39812
|
-
},
|
|
39813
|
-
});
|
|
39814
|
-
if (!result.changed) {
|
|
39815
|
-
return page;
|
|
40044
|
+
if (!loader) {
|
|
40045
|
+
return undefined;
|
|
39816
40046
|
}
|
|
39817
|
-
this.
|
|
39818
|
-
return result.page;
|
|
40047
|
+
return this.cloneStateValues(loader.materializedInputSnapshot(inputNames));
|
|
39819
40048
|
}
|
|
39820
40049
|
findWidgetLoader(key) {
|
|
39821
40050
|
return this.widgetLoaders?.find((loader) => loader.ownerWidgetKey === key);
|
|
@@ -43370,7 +43599,7 @@ class PraxisRelatedResourceOutletComponent {
|
|
|
43370
43599
|
</div>
|
|
43371
43600
|
}
|
|
43372
43601
|
</section>
|
|
43373
|
-
`, isInline: true, styles: [":host{display:block;min-width:0}.pdx-related-outlet{display:block;min-width:0;color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet__state{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:var(--pdx-related-outlet-gap, 12px);min-height:var(--pdx-related-outlet-min-height, 64px);padding:var(--pdx-related-outlet-padding, 12px);border:1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, .16));border-radius:var(--pdx-related-outlet-radius, 8px);background:var(--md-sys-color-surface-container-low, var(--md-sys-color-surface, transparent))}.pdx-related-outlet--compact .pdx-related-outlet__state{min-height:var(--pdx-related-outlet-compact-min-height, 48px);padding:var(--pdx-related-outlet-compact-padding, 8px 10px)}.pdx-related-outlet__state--ready{border-color:var(--md-sys-color-primary, currentColor)}.pdx-related-outlet__icon{display:inline-grid;place-items:center;width:32px;height:32px;color:var(--md-sys-color-primary, currentColor)}.pdx-related-outlet__state--busy .pdx-related-outlet__icon{color:var(--md-sys-color-secondary, currentColor)}.pdx-related-outlet__copy{display:grid;gap:2px;min-width:0}.pdx-related-outlet__copy h3,.pdx-related-outlet__copy p{margin:0}.pdx-related-outlet__copy h3{font:var(--md-sys-typescale-title-small, 600 .95rem/1.25rem system-ui);color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet__copy p{font:var(--md-sys-typescale-body-small, 400 .82rem/1.15rem system-ui);color:var(--md-sys-color-on-surface-variant, currentColor)}@media(max-width:600px){.pdx-related-outlet__state{grid-template-columns:auto minmax(0,1fr)}.pdx-related-outlet__state button{grid-column:1 / -1;justify-self:start}}\n"], dependencies: [{ kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i3
|
|
43602
|
+
`, isInline: true, styles: [":host{display:block;min-width:0}.pdx-related-outlet{display:block;min-width:0;color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet__state{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:var(--pdx-related-outlet-gap, 12px);min-height:var(--pdx-related-outlet-min-height, 64px);padding:var(--pdx-related-outlet-padding, 12px);border:1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, .16));border-radius:var(--pdx-related-outlet-radius, 8px);background:var(--md-sys-color-surface-container-low, var(--md-sys-color-surface, transparent))}.pdx-related-outlet--compact .pdx-related-outlet__state{min-height:var(--pdx-related-outlet-compact-min-height, 48px);padding:var(--pdx-related-outlet-compact-padding, 8px 10px)}.pdx-related-outlet__state--ready{border-color:var(--md-sys-color-primary, currentColor)}.pdx-related-outlet__icon{display:inline-grid;place-items:center;width:32px;height:32px;color:var(--md-sys-color-primary, currentColor)}.pdx-related-outlet__state--busy .pdx-related-outlet__icon{color:var(--md-sys-color-secondary, currentColor)}.pdx-related-outlet__copy{display:grid;gap:2px;min-width:0}.pdx-related-outlet__copy h3,.pdx-related-outlet__copy p{margin:0}.pdx-related-outlet__copy h3{font:var(--md-sys-typescale-title-small, 600 .95rem/1.25rem system-ui);color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet__copy p{font:var(--md-sys-typescale-body-small, 400 .82rem/1.15rem system-ui);color:var(--md-sys-color-on-surface-variant, currentColor)}@media(max-width:600px){.pdx-related-outlet__state{grid-template-columns:auto minmax(0,1fr)}.pdx-related-outlet__state button{grid-column:1 / -1;justify-self:start}}\n"], dependencies: [{ kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] });
|
|
43374
43603
|
}
|
|
43375
43604
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisRelatedResourceOutletComponent, decorators: [{
|
|
43376
43605
|
type: Component,
|
|
@@ -43424,6 +43653,1145 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
43424
43653
|
`, styles: [":host{display:block;min-width:0}.pdx-related-outlet{display:block;min-width:0;color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet__state{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:var(--pdx-related-outlet-gap, 12px);min-height:var(--pdx-related-outlet-min-height, 64px);padding:var(--pdx-related-outlet-padding, 12px);border:1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, .16));border-radius:var(--pdx-related-outlet-radius, 8px);background:var(--md-sys-color-surface-container-low, var(--md-sys-color-surface, transparent))}.pdx-related-outlet--compact .pdx-related-outlet__state{min-height:var(--pdx-related-outlet-compact-min-height, 48px);padding:var(--pdx-related-outlet-compact-padding, 8px 10px)}.pdx-related-outlet__state--ready{border-color:var(--md-sys-color-primary, currentColor)}.pdx-related-outlet__icon{display:inline-grid;place-items:center;width:32px;height:32px;color:var(--md-sys-color-primary, currentColor)}.pdx-related-outlet__state--busy .pdx-related-outlet__icon{color:var(--md-sys-color-secondary, currentColor)}.pdx-related-outlet__copy{display:grid;gap:2px;min-width:0}.pdx-related-outlet__copy h3,.pdx-related-outlet__copy p{margin:0}.pdx-related-outlet__copy h3{font:var(--md-sys-typescale-title-small, 600 .95rem/1.25rem system-ui);color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet__copy p{font:var(--md-sys-typescale-body-small, 400 .82rem/1.15rem system-ui);color:var(--md-sys-color-on-surface-variant, currentColor)}@media(max-width:600px){.pdx-related-outlet__state{grid-template-columns:auto minmax(0,1fr)}.pdx-related-outlet__state button{grid-column:1 / -1;justify-self:start}}\n"] }]
|
|
43425
43654
|
}], ctorParameters: () => [], propDecorators: { surface: [{ type: i0.Input, args: [{ isSignal: true, alias: "surface", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: false }] }], surfaceCatalog: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceCatalog", required: false }] }], discoverySource: [{ type: i0.Input, args: [{ isSignal: true, alias: "discoverySource", required: false }] }], parentLinks: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentLinks", required: false }] }], apiEndpointKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "apiEndpointKey", required: false }] }], apiUrlEntry: [{ type: i0.Input, args: [{ isSignal: true, alias: "apiUrlEntry", required: false }] }], parentRecord: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentRecord", required: false }] }], parentResourceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentResourceId", required: false }] }], parentIdentity: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentIdentity", required: false }] }], parentResourcePath: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentResourcePath", required: false }] }], presentation: [{ type: i0.Input, args: [{ isSignal: true, alias: "presentation", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], tableId: [{ type: i0.Input, args: [{ isSignal: true, alias: "tableId", required: false }] }], tableConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "tableConfig", required: false }] }], enableCustomization: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableCustomization", required: false }] }], authoringCapability: [{ type: i0.Input, args: [{ isSignal: true, alias: "authoringCapability", required: false }] }], emptyState: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyState", required: false }] }], queryContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "queryContext", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], stateReason: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateReason", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], strictValidation: [{ type: i0.Input, args: [{ isSignal: true, alias: "strictValidation", required: false }] }], ownerWidgetKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "ownerWidgetKey", required: false }] }], surfaceOpen: [{ type: i0.Output, args: ["surfaceOpen"] }], widgetEvent: [{ type: i0.Output, args: ["widgetEvent"] }], resourceEvent: [{ type: i0.Output, args: ["resourceEvent"] }] } });
|
|
43426
43655
|
|
|
43656
|
+
const DEFAULT_ICONS = [
|
|
43657
|
+
'search', 'close', 'check', 'add', 'remove', 'delete', 'edit', 'save', 'cancel', 'warning', 'error', 'info', 'help',
|
|
43658
|
+
'face', 'person', 'account_circle', 'people', 'group', 'settings', 'home', 'menu', 'more_horiz', 'more_vert', 'refresh', 'arrow_back', 'arrow_forward', 'expand_more', 'expand_less', 'open_in_full', 'fullscreen', 'open_in_new',
|
|
43659
|
+
'star', 'star_half', 'star_border', 'favorite', 'favorite_border', 'thumb_up', 'thumb_down', 'share', 'send', 'ios_share', 'download', 'upload', 'file_upload', 'file_download',
|
|
43660
|
+
'shopping_cart', 'shopping_bag', 'store', 'storefront', 'local_mall', 'local_offer', 'attach_money', 'money', 'payments', 'price_change', 'receipt', 'receipt_long', 'request_quote', 'point_of_sale', 'credit_card', 'payment',
|
|
43661
|
+
'event', 'date_range', 'schedule', 'alarm', 'watch_later', 'pending_actions',
|
|
43662
|
+
'location_on', 'location_city', 'map', 'public', 'language', 'place', 'pin_drop', 'route', 'near_me', 'navigation', 'layers', 'terrain',
|
|
43663
|
+
'email', 'call', 'phone', 'chat', 'forum', 'mark_email_unread', 'mark_chat_unread',
|
|
43664
|
+
'wifi', 'bluetooth', 'cloud', 'cloud_upload', 'cloud_download', 'cloud_done', 'cloud_queue', 'cloud_sync', 'backup', 'bolt', 'lock', 'lock_open', 'visibility', 'visibility_off', 'vpn_key', 'key', 'fingerprint', 'shield', 'security', 'admin_panel_settings', 'privacy_tip', 'policy', 'verified',
|
|
43665
|
+
'label', 'bookmark', 'book', 'description', 'article', 'note', 'assignment', 'assignment_turned_in', 'assignment_ind', 'grading', 'subject',
|
|
43666
|
+
'home_max', 'home_work', 'dashboard', 'analytics', 'assessment', 'insert_chart', 'bar_chart', 'show_chart', 'timeline', 'insights', 'pie_chart', 'donut_large', 'donut_small',
|
|
43667
|
+
'inventory', 'inventory_2', 'list', 'reorder', 'filter_list', 'sort', 'tune', 'settings_applications', 'build', 'build_circle', 'construction', 'bug_report', 'code', 'terminal', 'data_object', 'dataset', 'storage',
|
|
43668
|
+
'rule', 'rule_folder', 'folder', 'folder_open', 'create_new_folder', 'drive_file_move', 'drive_file_rename_outline',
|
|
43669
|
+
'text_fields', 'title', 'format_bold', 'format_italic', 'format_underlined', 'format_list_bulleted', 'format_list_numbered', 'insert_link', 'link', 'attach_file', 'attachment',
|
|
43670
|
+
'image', 'photo', 'photo_camera', 'collections', 'slideshow', 'movie', 'videocam', 'play_arrow', 'pause', 'stop', 'fast_forward', 'fast_rewind', 'skip_next', 'skip_previous', 'volume_up', 'volume_off', 'equalizer', 'music_note', 'library_music',
|
|
43671
|
+
'notifications', 'notifications_active', 'notifications_off', 'do_not_disturb',
|
|
43672
|
+
'airplanemode_active', 'train', 'directions_car', 'directions_bus', 'directions_bike', 'directions_walk', 'directions_boat', 'local_taxi',
|
|
43673
|
+
];
|
|
43674
|
+
class PraxisIconPickerComponent {
|
|
43675
|
+
data;
|
|
43676
|
+
dialogRef;
|
|
43677
|
+
value;
|
|
43678
|
+
icons = DEFAULT_ICONS;
|
|
43679
|
+
selected = new EventEmitter();
|
|
43680
|
+
cancel = new EventEmitter();
|
|
43681
|
+
searchInput;
|
|
43682
|
+
query = '';
|
|
43683
|
+
filtered = [];
|
|
43684
|
+
selectedFamily = 'mi';
|
|
43685
|
+
constructor(data, dialogRef) {
|
|
43686
|
+
this.data = data;
|
|
43687
|
+
this.dialogRef = dialogRef;
|
|
43688
|
+
if (data) {
|
|
43689
|
+
this.value = data.value;
|
|
43690
|
+
if (Array.isArray(data.icons) && data.icons.length)
|
|
43691
|
+
this.icons = data.icons;
|
|
43692
|
+
const fam = this.familyFromValue(this.value);
|
|
43693
|
+
if (fam) {
|
|
43694
|
+
this.selectedFamily = fam.family;
|
|
43695
|
+
this.value = fam.name;
|
|
43696
|
+
}
|
|
43697
|
+
}
|
|
43698
|
+
this.query = (this.value || '').trim();
|
|
43699
|
+
this.onFilter();
|
|
43700
|
+
}
|
|
43701
|
+
onFilter() {
|
|
43702
|
+
const q = (this.query || '').trim().toLowerCase();
|
|
43703
|
+
this.filtered = !q ? [...this.icons] : this.icons.filter(i => i.toLowerCase().includes(q));
|
|
43704
|
+
}
|
|
43705
|
+
choose(icon) {
|
|
43706
|
+
const val = this.buildValue(icon);
|
|
43707
|
+
this.value = icon;
|
|
43708
|
+
if (this.dialogRef)
|
|
43709
|
+
this.dialogRef.close(val);
|
|
43710
|
+
else
|
|
43711
|
+
this.selected.emit(val);
|
|
43712
|
+
}
|
|
43713
|
+
onEsc(ev) {
|
|
43714
|
+
if (this.dialogRef) {
|
|
43715
|
+
ev.stopPropagation();
|
|
43716
|
+
ev.preventDefault();
|
|
43717
|
+
this.onCancel();
|
|
43718
|
+
}
|
|
43719
|
+
}
|
|
43720
|
+
onGlobalKey(ev) {
|
|
43721
|
+
if (ev.key !== '/')
|
|
43722
|
+
return;
|
|
43723
|
+
const target = ev.target;
|
|
43724
|
+
const tag = (target?.tagName || '').toLowerCase();
|
|
43725
|
+
if (tag === 'input' || tag === 'textarea' || target?.isContentEditable) {
|
|
43726
|
+
return;
|
|
43727
|
+
}
|
|
43728
|
+
ev.preventDefault();
|
|
43729
|
+
this.focusSearch();
|
|
43730
|
+
}
|
|
43731
|
+
confirmTyped() {
|
|
43732
|
+
const name = (this.query || '').trim();
|
|
43733
|
+
if (!name)
|
|
43734
|
+
return;
|
|
43735
|
+
const val = this.buildValue(name);
|
|
43736
|
+
if (this.dialogRef)
|
|
43737
|
+
this.dialogRef.close(val);
|
|
43738
|
+
else
|
|
43739
|
+
this.selected.emit(val);
|
|
43740
|
+
}
|
|
43741
|
+
isSelectedIcon(icon) {
|
|
43742
|
+
return (this.value || '').trim() === icon;
|
|
43743
|
+
}
|
|
43744
|
+
onFamilyChange(val) {
|
|
43745
|
+
const v = (typeof val === 'string' && val) ? val : 'mi';
|
|
43746
|
+
this.selectedFamily = v;
|
|
43747
|
+
}
|
|
43748
|
+
clear() {
|
|
43749
|
+
this.value = '';
|
|
43750
|
+
if (this.dialogRef)
|
|
43751
|
+
this.dialogRef.close('');
|
|
43752
|
+
else
|
|
43753
|
+
this.selected.emit('');
|
|
43754
|
+
}
|
|
43755
|
+
onCancel() {
|
|
43756
|
+
if (this.dialogRef)
|
|
43757
|
+
this.dialogRef.close(undefined);
|
|
43758
|
+
else
|
|
43759
|
+
this.cancel.emit();
|
|
43760
|
+
}
|
|
43761
|
+
// Helpers for family/prefix handling
|
|
43762
|
+
buildValue(name) {
|
|
43763
|
+
const n = (name || '').trim();
|
|
43764
|
+
if (!n)
|
|
43765
|
+
return n;
|
|
43766
|
+
const fam = this.selectedFamily === 'ms' ? 'mso' : this.selectedFamily;
|
|
43767
|
+
return fam === 'mi' ? n : `${fam}:${n}`;
|
|
43768
|
+
}
|
|
43769
|
+
previewValue() {
|
|
43770
|
+
return this.buildValue((this.query || '').trim());
|
|
43771
|
+
}
|
|
43772
|
+
iconClassForFamily(fam) {
|
|
43773
|
+
if (fam === 'ms' || fam === 'mso')
|
|
43774
|
+
return 'material-symbols-outlined';
|
|
43775
|
+
if (fam === 'msr')
|
|
43776
|
+
return 'material-symbols-rounded';
|
|
43777
|
+
if (fam === 'mss')
|
|
43778
|
+
return 'material-symbols-sharp';
|
|
43779
|
+
return 'material-icons';
|
|
43780
|
+
}
|
|
43781
|
+
focusSearch() {
|
|
43782
|
+
this.searchInput?.nativeElement?.focus();
|
|
43783
|
+
}
|
|
43784
|
+
familyFromValue(v) {
|
|
43785
|
+
const s = (v || '').trim();
|
|
43786
|
+
const i = s.indexOf(':');
|
|
43787
|
+
if (i <= 0)
|
|
43788
|
+
return null;
|
|
43789
|
+
const p = s.slice(0, i).toLowerCase();
|
|
43790
|
+
const name = s.slice(i + 1).trim();
|
|
43791
|
+
if (p === 'ms' || p === 'mso')
|
|
43792
|
+
return { family: 'mso', name };
|
|
43793
|
+
if (p === 'msr')
|
|
43794
|
+
return { family: 'msr', name };
|
|
43795
|
+
if (p === 'mss')
|
|
43796
|
+
return { family: 'mss', name };
|
|
43797
|
+
return { family: 'mi', name };
|
|
43798
|
+
}
|
|
43799
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisIconPickerComponent, deps: [{ token: MAT_DIALOG_DATA, optional: true }, { token: i1$4.MatDialogRef, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
43800
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisIconPickerComponent, isStandalone: true, selector: "praxis-icon-picker", inputs: { value: "value", icons: "icons" }, outputs: { selected: "selected", cancel: "cancel" }, host: { listeners: { "document:keydown.escape": "onEsc($event)", "document:keydown": "onGlobalKey($event)" } }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }], ngImport: i0, template: `
|
|
43801
|
+
<div class="pip-root">
|
|
43802
|
+
<div class="pip-head">
|
|
43803
|
+
<mat-form-field appearance="outline" class="pip-search">
|
|
43804
|
+
<mat-label>Buscar ícone</mat-label>
|
|
43805
|
+
<input
|
|
43806
|
+
#searchInput
|
|
43807
|
+
matInput
|
|
43808
|
+
[(ngModel)]="query"
|
|
43809
|
+
placeholder="ex.: star, schedule"
|
|
43810
|
+
(ngModelChange)="onFilter()"
|
|
43811
|
+
(keydown.enter)="confirmTyped()"
|
|
43812
|
+
/>
|
|
43813
|
+
</mat-form-field>
|
|
43814
|
+
<button mat-stroked-button color="primary" (click)="clear()">
|
|
43815
|
+
<mat-icon>backspace</mat-icon>
|
|
43816
|
+
<span>Limpar</span>
|
|
43817
|
+
</button>
|
|
43818
|
+
<a mat-stroked-button href="https://fonts.google.com/icons" target="_blank" rel="noopener noreferrer" matTooltip="Abrir Material Icons">
|
|
43819
|
+
<mat-icon>open_in_new</mat-icon>
|
|
43820
|
+
<span>Material Icons</span>
|
|
43821
|
+
</a>
|
|
43822
|
+
<span class="pip-spacer"></span>
|
|
43823
|
+
<div class="pip-family" role="group" aria-label="Estilo do ícone">
|
|
43824
|
+
<mat-chip-listbox [value]="selectedFamily" (change)="onFamilyChange($event.value)">
|
|
43825
|
+
<mat-chip-option value="mi">Icons</mat-chip-option>
|
|
43826
|
+
<mat-chip-option value="mso">Outlined</mat-chip-option>
|
|
43827
|
+
<mat-chip-option value="msr">Rounded</mat-chip-option>
|
|
43828
|
+
<mat-chip-option value="mss">Sharp</mat-chip-option>
|
|
43829
|
+
</mat-chip-listbox>
|
|
43830
|
+
</div>
|
|
43831
|
+
@if (dialogRef) {
|
|
43832
|
+
<button mat-stroked-button (click)="onCancel()">Cancelar</button>
|
|
43833
|
+
}
|
|
43834
|
+
</div>
|
|
43835
|
+
<div class="pip-hint muted">
|
|
43836
|
+
Dica: Se não encontrar aqui, abra o site oficial, copie o nome do ícone e cole na busca. Você pode confirmar o nome digitado mesmo que não esteja na lista.
|
|
43837
|
+
</div>
|
|
43838
|
+
<div class="pip-stats">
|
|
43839
|
+
<span>{{ filtered.length }} resultado(s)</span>
|
|
43840
|
+
<span class="pip-shortcut">Atalho: pressione / para focar a busca</span>
|
|
43841
|
+
</div>
|
|
43842
|
+
<div class="pip-body" role="grid" aria-label="Ícones disponíveis">
|
|
43843
|
+
@for (ic of filtered; track ic) {
|
|
43844
|
+
<button class="pip-item" (click)="choose(ic)" [class.selected]="isSelectedIcon(ic)" [attr.aria-label]="'Selecionar ícone ' + ic">
|
|
43845
|
+
<mat-icon [ngClass]="iconClassForFamily(selectedFamily)">{{ ic }}</mat-icon>
|
|
43846
|
+
<span class="pip-name">{{ ic }}</span>
|
|
43847
|
+
</button>
|
|
43848
|
+
}
|
|
43849
|
+
</div>
|
|
43850
|
+
@if (!filtered.length) {
|
|
43851
|
+
<div class="pip-empty">
|
|
43852
|
+
Nenhum ícone encontrado. Você pode usar o nome digitado mesmo assim.
|
|
43853
|
+
</div>
|
|
43854
|
+
}
|
|
43855
|
+
<div class="pip-footer">
|
|
43856
|
+
<button mat-flat-button color="primary" (click)="confirmTyped()" [disabled]="!query.trim()" aria-label="Usar nome digitado">
|
|
43857
|
+
<mat-icon>check</mat-icon>
|
|
43858
|
+
Usar nome digitado
|
|
43859
|
+
</button>
|
|
43860
|
+
@if (query.trim()) {
|
|
43861
|
+
<span class="pip-typed">{{ previewValue() }}</span>
|
|
43862
|
+
}
|
|
43863
|
+
</div>
|
|
43864
|
+
</div>
|
|
43865
|
+
`, isInline: true, styles: [".pip-root{display:flex;flex-direction:column;min-width:340px;max-width:760px;max-height:80vh;overflow:hidden;padding:16px;color:var(--md-sys-color-on-surface)}.pip-head{display:flex;gap:12px;align-items:center;margin-bottom:12px;flex-wrap:wrap}.pip-search{flex:1;min-width:180px}.pip-spacer{flex:1}.pip-body{flex:1;overflow:auto;display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:10px;padding:4px}.pip-item{display:flex;gap:10px;align-items:center;justify-content:flex-start;padding:10px;border:1px solid var(--md-sys-color-outline-variant);border-radius:10px;background:var(--md-sys-color-surface);color:inherit;cursor:pointer;transition:background-color .18s ease,border-color .18s ease,box-shadow .18s ease}.pip-item:hover{background:var(--md-sys-color-surface-container)}.pip-item:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pip-item.selected{border-color:var(--md-sys-color-primary);box-shadow:0 0 0 2px var(--md-sys-color-primary)}.pip-name{font-size:12px;color:var(--md-sys-color-on-surface-variant);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pip-hint{font-size:12px;color:var(--md-sys-color-on-surface-variant);margin:-6px 0 8px}.pip-stats{display:flex;justify-content:space-between;gap:8px;font-size:12px;color:var(--md-sys-color-on-surface-variant);margin-bottom:8px}.pip-shortcut{opacity:.9}.pip-empty{padding:12px;border:1px dashed var(--md-sys-color-outline-variant);border-radius:10px;color:var(--md-sys-color-on-surface-variant);background:var(--md-sys-color-surface-container);margin-top:8px}.pip-footer{display:flex;gap:12px;align-items:center;margin-top:10px}.pip-typed{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px;color:var(--md-sys-color-on-surface)}.pip-family{display:flex;align-items:center}.pip-family .mat-mdc-chip-listbox{min-width:260px}.pip-root .mat-icon{font-family:Material Icons,Material Symbols Outlined,Material Symbols Rounded,Material Symbols Sharp!important;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24;color:currentColor}.material-symbols-outlined{font-family:Material Symbols Outlined;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}.material-symbols-rounded{font-family:Material Symbols Rounded;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}.material-symbols-sharp{font-family:Material Symbols Sharp;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i8$1.MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: i8$1.MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { 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"] }] });
|
|
43866
|
+
}
|
|
43867
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisIconPickerComponent, decorators: [{
|
|
43868
|
+
type: Component,
|
|
43869
|
+
args: [{ selector: 'praxis-icon-picker', standalone: true, imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, MatIconModule, MatButtonModule, MatChipsModule, MatDialogModule, MatTooltipModule], template: `
|
|
43870
|
+
<div class="pip-root">
|
|
43871
|
+
<div class="pip-head">
|
|
43872
|
+
<mat-form-field appearance="outline" class="pip-search">
|
|
43873
|
+
<mat-label>Buscar ícone</mat-label>
|
|
43874
|
+
<input
|
|
43875
|
+
#searchInput
|
|
43876
|
+
matInput
|
|
43877
|
+
[(ngModel)]="query"
|
|
43878
|
+
placeholder="ex.: star, schedule"
|
|
43879
|
+
(ngModelChange)="onFilter()"
|
|
43880
|
+
(keydown.enter)="confirmTyped()"
|
|
43881
|
+
/>
|
|
43882
|
+
</mat-form-field>
|
|
43883
|
+
<button mat-stroked-button color="primary" (click)="clear()">
|
|
43884
|
+
<mat-icon>backspace</mat-icon>
|
|
43885
|
+
<span>Limpar</span>
|
|
43886
|
+
</button>
|
|
43887
|
+
<a mat-stroked-button href="https://fonts.google.com/icons" target="_blank" rel="noopener noreferrer" matTooltip="Abrir Material Icons">
|
|
43888
|
+
<mat-icon>open_in_new</mat-icon>
|
|
43889
|
+
<span>Material Icons</span>
|
|
43890
|
+
</a>
|
|
43891
|
+
<span class="pip-spacer"></span>
|
|
43892
|
+
<div class="pip-family" role="group" aria-label="Estilo do ícone">
|
|
43893
|
+
<mat-chip-listbox [value]="selectedFamily" (change)="onFamilyChange($event.value)">
|
|
43894
|
+
<mat-chip-option value="mi">Icons</mat-chip-option>
|
|
43895
|
+
<mat-chip-option value="mso">Outlined</mat-chip-option>
|
|
43896
|
+
<mat-chip-option value="msr">Rounded</mat-chip-option>
|
|
43897
|
+
<mat-chip-option value="mss">Sharp</mat-chip-option>
|
|
43898
|
+
</mat-chip-listbox>
|
|
43899
|
+
</div>
|
|
43900
|
+
@if (dialogRef) {
|
|
43901
|
+
<button mat-stroked-button (click)="onCancel()">Cancelar</button>
|
|
43902
|
+
}
|
|
43903
|
+
</div>
|
|
43904
|
+
<div class="pip-hint muted">
|
|
43905
|
+
Dica: Se não encontrar aqui, abra o site oficial, copie o nome do ícone e cole na busca. Você pode confirmar o nome digitado mesmo que não esteja na lista.
|
|
43906
|
+
</div>
|
|
43907
|
+
<div class="pip-stats">
|
|
43908
|
+
<span>{{ filtered.length }} resultado(s)</span>
|
|
43909
|
+
<span class="pip-shortcut">Atalho: pressione / para focar a busca</span>
|
|
43910
|
+
</div>
|
|
43911
|
+
<div class="pip-body" role="grid" aria-label="Ícones disponíveis">
|
|
43912
|
+
@for (ic of filtered; track ic) {
|
|
43913
|
+
<button class="pip-item" (click)="choose(ic)" [class.selected]="isSelectedIcon(ic)" [attr.aria-label]="'Selecionar ícone ' + ic">
|
|
43914
|
+
<mat-icon [ngClass]="iconClassForFamily(selectedFamily)">{{ ic }}</mat-icon>
|
|
43915
|
+
<span class="pip-name">{{ ic }}</span>
|
|
43916
|
+
</button>
|
|
43917
|
+
}
|
|
43918
|
+
</div>
|
|
43919
|
+
@if (!filtered.length) {
|
|
43920
|
+
<div class="pip-empty">
|
|
43921
|
+
Nenhum ícone encontrado. Você pode usar o nome digitado mesmo assim.
|
|
43922
|
+
</div>
|
|
43923
|
+
}
|
|
43924
|
+
<div class="pip-footer">
|
|
43925
|
+
<button mat-flat-button color="primary" (click)="confirmTyped()" [disabled]="!query.trim()" aria-label="Usar nome digitado">
|
|
43926
|
+
<mat-icon>check</mat-icon>
|
|
43927
|
+
Usar nome digitado
|
|
43928
|
+
</button>
|
|
43929
|
+
@if (query.trim()) {
|
|
43930
|
+
<span class="pip-typed">{{ previewValue() }}</span>
|
|
43931
|
+
}
|
|
43932
|
+
</div>
|
|
43933
|
+
</div>
|
|
43934
|
+
`, styles: [".pip-root{display:flex;flex-direction:column;min-width:340px;max-width:760px;max-height:80vh;overflow:hidden;padding:16px;color:var(--md-sys-color-on-surface)}.pip-head{display:flex;gap:12px;align-items:center;margin-bottom:12px;flex-wrap:wrap}.pip-search{flex:1;min-width:180px}.pip-spacer{flex:1}.pip-body{flex:1;overflow:auto;display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:10px;padding:4px}.pip-item{display:flex;gap:10px;align-items:center;justify-content:flex-start;padding:10px;border:1px solid var(--md-sys-color-outline-variant);border-radius:10px;background:var(--md-sys-color-surface);color:inherit;cursor:pointer;transition:background-color .18s ease,border-color .18s ease,box-shadow .18s ease}.pip-item:hover{background:var(--md-sys-color-surface-container)}.pip-item:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pip-item.selected{border-color:var(--md-sys-color-primary);box-shadow:0 0 0 2px var(--md-sys-color-primary)}.pip-name{font-size:12px;color:var(--md-sys-color-on-surface-variant);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pip-hint{font-size:12px;color:var(--md-sys-color-on-surface-variant);margin:-6px 0 8px}.pip-stats{display:flex;justify-content:space-between;gap:8px;font-size:12px;color:var(--md-sys-color-on-surface-variant);margin-bottom:8px}.pip-shortcut{opacity:.9}.pip-empty{padding:12px;border:1px dashed var(--md-sys-color-outline-variant);border-radius:10px;color:var(--md-sys-color-on-surface-variant);background:var(--md-sys-color-surface-container);margin-top:8px}.pip-footer{display:flex;gap:12px;align-items:center;margin-top:10px}.pip-typed{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px;color:var(--md-sys-color-on-surface)}.pip-family{display:flex;align-items:center}.pip-family .mat-mdc-chip-listbox{min-width:260px}.pip-root .mat-icon{font-family:Material Icons,Material Symbols Outlined,Material Symbols Rounded,Material Symbols Sharp!important;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24;color:currentColor}.material-symbols-outlined{font-family:Material Symbols Outlined;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}.material-symbols-rounded{font-family:Material Symbols Rounded;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}.material-symbols-sharp{font-family:Material Symbols Sharp;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}\n"] }]
|
|
43935
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
43936
|
+
type: Optional
|
|
43937
|
+
}, {
|
|
43938
|
+
type: Inject,
|
|
43939
|
+
args: [MAT_DIALOG_DATA]
|
|
43940
|
+
}] }, { type: i1$4.MatDialogRef, decorators: [{
|
|
43941
|
+
type: Optional
|
|
43942
|
+
}] }], propDecorators: { value: [{
|
|
43943
|
+
type: Input
|
|
43944
|
+
}], icons: [{
|
|
43945
|
+
type: Input
|
|
43946
|
+
}], selected: [{
|
|
43947
|
+
type: Output
|
|
43948
|
+
}], cancel: [{
|
|
43949
|
+
type: Output
|
|
43950
|
+
}], searchInput: [{
|
|
43951
|
+
type: ViewChild,
|
|
43952
|
+
args: ['searchInput']
|
|
43953
|
+
}], onEsc: [{
|
|
43954
|
+
type: HostListener,
|
|
43955
|
+
args: ['document:keydown.escape', ['$event']]
|
|
43956
|
+
}], onGlobalKey: [{
|
|
43957
|
+
type: HostListener,
|
|
43958
|
+
args: ['document:keydown', ['$event']]
|
|
43959
|
+
}] } });
|
|
43960
|
+
|
|
43961
|
+
class IconPickerService {
|
|
43962
|
+
dialog = inject(MatDialog);
|
|
43963
|
+
settings = inject(SETTINGS_PANEL_BRIDGE, { optional: true });
|
|
43964
|
+
openDialog(opts) {
|
|
43965
|
+
const ref = this.dialog.open(PraxisIconPickerComponent, {
|
|
43966
|
+
width: '720px',
|
|
43967
|
+
data: { value: opts?.value, icons: opts?.icons },
|
|
43968
|
+
});
|
|
43969
|
+
return ref.afterClosed().toPromise();
|
|
43970
|
+
}
|
|
43971
|
+
async openPanel(opts) {
|
|
43972
|
+
const id = opts?.id || 'icon-picker';
|
|
43973
|
+
const title = opts?.title || 'Escolher ícone';
|
|
43974
|
+
if (!this.settings) {
|
|
43975
|
+
// Fallback to dialog-only mode when bridge is not available
|
|
43976
|
+
return this.openDialog({ value: opts?.value, icons: opts?.icons });
|
|
43977
|
+
}
|
|
43978
|
+
const ref = this.settings.open({ id: `praxis-icon-picker:${id}`, title, content: { component: PraxisIconPickerComponent, inputs: { value: opts?.value, icons: opts?.icons } } });
|
|
43979
|
+
return new Promise((resolve) => {
|
|
43980
|
+
let resolved = false;
|
|
43981
|
+
ref.applied$.subscribe((val) => { if (!resolved) {
|
|
43982
|
+
resolved = true;
|
|
43983
|
+
resolve(val);
|
|
43984
|
+
} });
|
|
43985
|
+
ref.saved$.subscribe((val) => { if (!resolved) {
|
|
43986
|
+
resolved = true;
|
|
43987
|
+
resolve(val);
|
|
43988
|
+
} });
|
|
43989
|
+
});
|
|
43990
|
+
}
|
|
43991
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: IconPickerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
43992
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: IconPickerService, providedIn: 'root' });
|
|
43993
|
+
}
|
|
43994
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: IconPickerService, decorators: [{
|
|
43995
|
+
type: Injectable,
|
|
43996
|
+
args: [{ providedIn: 'root' }]
|
|
43997
|
+
}] });
|
|
43998
|
+
|
|
43999
|
+
const EMPTY_FORM_VALUE = {
|
|
44000
|
+
title: '',
|
|
44001
|
+
subtitle: '',
|
|
44002
|
+
icon: '',
|
|
44003
|
+
mode: 'inline',
|
|
44004
|
+
presentation: 'drawer',
|
|
44005
|
+
compact: false,
|
|
44006
|
+
emptyState: {
|
|
44007
|
+
title: '',
|
|
44008
|
+
message: '',
|
|
44009
|
+
description: '',
|
|
44010
|
+
icon: '',
|
|
44011
|
+
tone: '',
|
|
44012
|
+
variant: '',
|
|
44013
|
+
alignment: '',
|
|
44014
|
+
density: '',
|
|
44015
|
+
iconContainer: '',
|
|
44016
|
+
},
|
|
44017
|
+
};
|
|
44018
|
+
const EMPTY_STATE_TEXT_FIELDS = ['title', 'message', 'description', 'icon'];
|
|
44019
|
+
const EMPTY_STATE_ENUM_FIELDS = [
|
|
44020
|
+
'tone',
|
|
44021
|
+
'variant',
|
|
44022
|
+
'alignment',
|
|
44023
|
+
'density',
|
|
44024
|
+
'iconContainer',
|
|
44025
|
+
];
|
|
44026
|
+
class PraxisRelatedResourceOutletConfigEditorComponent {
|
|
44027
|
+
inputs = input(null, ...(ngDevMode ? [{ debugName: "inputs" }] : /* istanbul ignore next */ []));
|
|
44028
|
+
widgetKey = input(undefined, ...(ngDevMode ? [{ debugName: "widgetKey" }] : /* istanbul ignore next */ []));
|
|
44029
|
+
widgetType = input(undefined, ...(ngDevMode ? [{ debugName: "widgetType" }] : /* istanbul ignore next */ []));
|
|
44030
|
+
form = new FormGroup({
|
|
44031
|
+
title: new FormControl('', { nonNullable: true }),
|
|
44032
|
+
subtitle: new FormControl('', { nonNullable: true }),
|
|
44033
|
+
icon: new FormControl('', { nonNullable: true }),
|
|
44034
|
+
mode: new FormControl('inline', { nonNullable: true }),
|
|
44035
|
+
presentation: new FormControl('drawer', { nonNullable: true }),
|
|
44036
|
+
compact: new FormControl(false, { nonNullable: true }),
|
|
44037
|
+
emptyState: new FormGroup({
|
|
44038
|
+
title: new FormControl('', { nonNullable: true }),
|
|
44039
|
+
message: new FormControl('', { nonNullable: true }),
|
|
44040
|
+
description: new FormControl('', { nonNullable: true }),
|
|
44041
|
+
icon: new FormControl('', { nonNullable: true }),
|
|
44042
|
+
tone: new FormControl('', { nonNullable: true }),
|
|
44043
|
+
variant: new FormControl('', { nonNullable: true }),
|
|
44044
|
+
alignment: new FormControl('', { nonNullable: true }),
|
|
44045
|
+
density: new FormControl('', { nonNullable: true }),
|
|
44046
|
+
iconContainer: new FormControl('', { nonNullable: true }),
|
|
44047
|
+
}),
|
|
44048
|
+
});
|
|
44049
|
+
isDirty$ = new BehaviorSubject(false);
|
|
44050
|
+
isValid$ = new BehaviorSubject(true);
|
|
44051
|
+
isBusy$ = new BehaviorSubject(false);
|
|
44052
|
+
i18n = inject(PraxisI18nService);
|
|
44053
|
+
iconPicker = inject(IconPickerService);
|
|
44054
|
+
persistedInputs = {};
|
|
44055
|
+
baselineFormValue = structuredClone(EMPTY_FORM_VALUE);
|
|
44056
|
+
constructor() {
|
|
44057
|
+
this.form.valueChanges
|
|
44058
|
+
.pipe(takeUntilDestroyed())
|
|
44059
|
+
.subscribe(() => this.publishState());
|
|
44060
|
+
effect(() => {
|
|
44061
|
+
this.initialize(this.inputs());
|
|
44062
|
+
});
|
|
44063
|
+
}
|
|
44064
|
+
getSettingsValue() {
|
|
44065
|
+
return { inputs: this.buildInputs() };
|
|
44066
|
+
}
|
|
44067
|
+
onSave() {
|
|
44068
|
+
return this.getSettingsValue();
|
|
44069
|
+
}
|
|
44070
|
+
reset() {
|
|
44071
|
+
this.form.reset(structuredClone(this.baselineFormValue), { emitEvent: false });
|
|
44072
|
+
this.publishState();
|
|
44073
|
+
}
|
|
44074
|
+
async selectIcon(target) {
|
|
44075
|
+
const control = target === 'outlet'
|
|
44076
|
+
? this.form.controls.icon
|
|
44077
|
+
: this.form.controls.emptyState.controls.icon;
|
|
44078
|
+
const selected = await this.iconPicker.openDialog({ value: control.value });
|
|
44079
|
+
if (selected !== undefined) {
|
|
44080
|
+
control.setValue(selected);
|
|
44081
|
+
}
|
|
44082
|
+
}
|
|
44083
|
+
t(key, fallback) {
|
|
44084
|
+
return this.i18n.t(key, undefined, fallback, RELATED_RESOURCE_OUTLET_I18N_NAMESPACE);
|
|
44085
|
+
}
|
|
44086
|
+
initialize(inputs) {
|
|
44087
|
+
this.persistedInputs = structuredClone(inputs ?? {});
|
|
44088
|
+
this.baselineFormValue = this.readFormValue(this.persistedInputs);
|
|
44089
|
+
this.form.reset(structuredClone(this.baselineFormValue), { emitEvent: false });
|
|
44090
|
+
this.publishState();
|
|
44091
|
+
}
|
|
44092
|
+
readFormValue(inputs) {
|
|
44093
|
+
const emptyState = this.objectValue(inputs['emptyState']);
|
|
44094
|
+
return {
|
|
44095
|
+
title: this.stringValue(inputs['title']),
|
|
44096
|
+
subtitle: this.stringValue(inputs['subtitle']),
|
|
44097
|
+
icon: this.stringValue(inputs['icon']),
|
|
44098
|
+
mode: inputs['mode'] === 'open-action' ? 'open-action' : 'inline',
|
|
44099
|
+
presentation: inputs['presentation'] === 'modal' ? 'modal' : 'drawer',
|
|
44100
|
+
compact: inputs['compact'] === true,
|
|
44101
|
+
emptyState: {
|
|
44102
|
+
title: this.stringValue(emptyState['title']),
|
|
44103
|
+
message: this.stringValue(emptyState['message']),
|
|
44104
|
+
description: this.stringValue(emptyState['description']),
|
|
44105
|
+
icon: this.stringValue(emptyState['icon']),
|
|
44106
|
+
tone: this.enumValue(emptyState['tone'], ['neutral', 'primary', 'secondary']),
|
|
44107
|
+
variant: this.enumValue(emptyState['variant'], ['card', 'inline', 'panel', 'transparent']),
|
|
44108
|
+
alignment: this.enumValue(emptyState['alignment'], ['start', 'center']),
|
|
44109
|
+
density: this.enumValue(emptyState['density'], ['compact', 'comfortable']),
|
|
44110
|
+
iconContainer: this.enumValue(emptyState['iconContainer'], ['none', 'circle', 'soft']),
|
|
44111
|
+
},
|
|
44112
|
+
};
|
|
44113
|
+
}
|
|
44114
|
+
buildInputs() {
|
|
44115
|
+
const next = structuredClone(this.persistedInputs);
|
|
44116
|
+
const current = this.form.getRawValue();
|
|
44117
|
+
this.applyTextChange(next, 'title', current.title, this.baselineFormValue.title);
|
|
44118
|
+
this.applyTextChange(next, 'subtitle', current.subtitle, this.baselineFormValue.subtitle);
|
|
44119
|
+
this.applyTextChange(next, 'icon', current.icon, this.baselineFormValue.icon);
|
|
44120
|
+
this.applyDefaultedChange(next, 'mode', current.mode, this.baselineFormValue.mode, 'inline');
|
|
44121
|
+
this.applyDefaultedChange(next, 'presentation', current.presentation, this.baselineFormValue.presentation, 'drawer');
|
|
44122
|
+
this.applyDefaultedChange(next, 'compact', current.compact, this.baselineFormValue.compact, false);
|
|
44123
|
+
this.applyEmptyStateChanges(next, current.emptyState);
|
|
44124
|
+
return next;
|
|
44125
|
+
}
|
|
44126
|
+
applyEmptyStateChanges(inputs, current) {
|
|
44127
|
+
const baseline = this.baselineFormValue.emptyState;
|
|
44128
|
+
const changed = EMPTY_STATE_TEXT_FIELDS.some((field) => current[field] !== baseline[field])
|
|
44129
|
+
|| EMPTY_STATE_ENUM_FIELDS.some((field) => current[field] !== baseline[field]);
|
|
44130
|
+
if (!changed) {
|
|
44131
|
+
return;
|
|
44132
|
+
}
|
|
44133
|
+
const existing = this.objectValue(inputs['emptyState']);
|
|
44134
|
+
const next = structuredClone(existing);
|
|
44135
|
+
for (const field of EMPTY_STATE_TEXT_FIELDS) {
|
|
44136
|
+
this.applyTextChange(next, field, current[field], baseline[field]);
|
|
44137
|
+
}
|
|
44138
|
+
for (const field of EMPTY_STATE_ENUM_FIELDS) {
|
|
44139
|
+
if (current[field] === baseline[field]) {
|
|
44140
|
+
continue;
|
|
44141
|
+
}
|
|
44142
|
+
if (current[field]) {
|
|
44143
|
+
next[field] = current[field];
|
|
44144
|
+
}
|
|
44145
|
+
else {
|
|
44146
|
+
delete next[field];
|
|
44147
|
+
}
|
|
44148
|
+
}
|
|
44149
|
+
if (Object.keys(next).length > 0) {
|
|
44150
|
+
inputs['emptyState'] = next;
|
|
44151
|
+
}
|
|
44152
|
+
else {
|
|
44153
|
+
delete inputs['emptyState'];
|
|
44154
|
+
}
|
|
44155
|
+
}
|
|
44156
|
+
applyTextChange(target, field, current, baseline) {
|
|
44157
|
+
if (current === baseline) {
|
|
44158
|
+
return;
|
|
44159
|
+
}
|
|
44160
|
+
const value = current.trim();
|
|
44161
|
+
if (value) {
|
|
44162
|
+
target[field] = value;
|
|
44163
|
+
}
|
|
44164
|
+
else {
|
|
44165
|
+
delete target[field];
|
|
44166
|
+
}
|
|
44167
|
+
}
|
|
44168
|
+
applyDefaultedChange(target, field, current, baseline, defaultValue) {
|
|
44169
|
+
if (current === baseline) {
|
|
44170
|
+
return;
|
|
44171
|
+
}
|
|
44172
|
+
if (current === defaultValue && !Object.prototype.hasOwnProperty.call(this.persistedInputs, field)) {
|
|
44173
|
+
delete target[field];
|
|
44174
|
+
return;
|
|
44175
|
+
}
|
|
44176
|
+
target[field] = current;
|
|
44177
|
+
}
|
|
44178
|
+
publishState() {
|
|
44179
|
+
this.isDirty$.next(JSON.stringify(this.form.getRawValue()) !== JSON.stringify(this.baselineFormValue));
|
|
44180
|
+
this.isValid$.next(this.form.valid);
|
|
44181
|
+
}
|
|
44182
|
+
objectValue(value) {
|
|
44183
|
+
return value && typeof value === 'object' && !Array.isArray(value)
|
|
44184
|
+
? value
|
|
44185
|
+
: {};
|
|
44186
|
+
}
|
|
44187
|
+
stringValue(value) {
|
|
44188
|
+
return typeof value === 'string' ? value : '';
|
|
44189
|
+
}
|
|
44190
|
+
enumValue(value, allowed) {
|
|
44191
|
+
return typeof value === 'string' && allowed.includes(value) ? value : '';
|
|
44192
|
+
}
|
|
44193
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisRelatedResourceOutletConfigEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
44194
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.14", type: PraxisRelatedResourceOutletConfigEditorComponent, isStandalone: true, selector: "praxis-related-resource-outlet-config-editor", inputs: { inputs: { classPropertyName: "inputs", publicName: "inputs", isSignal: true, isRequired: false, transformFunction: null }, widgetKey: { classPropertyName: "widgetKey", publicName: "widgetKey", isSignal: true, isRequired: false, transformFunction: null }, widgetType: { classPropertyName: "widgetType", publicName: "widgetType", isSignal: true, isRequired: false, transformFunction: null } }, providers: [providePraxisI18nConfig(RELATED_RESOURCE_OUTLET_I18N_CONFIG)], ngImport: i0, template: `
|
|
44195
|
+
<form
|
|
44196
|
+
class="pdx-related-outlet-editor"
|
|
44197
|
+
[formGroup]="form"
|
|
44198
|
+
data-testid="related-resource-outlet-config-editor"
|
|
44199
|
+
>
|
|
44200
|
+
<header class="pdx-related-outlet-editor__header">
|
|
44201
|
+
<span class="pdx-related-outlet-editor__header-icon" aria-hidden="true">
|
|
44202
|
+
<mat-icon fontIcon="account_tree" />
|
|
44203
|
+
</span>
|
|
44204
|
+
<span>
|
|
44205
|
+
<strong>{{ t('editor.title', 'Related resource presentation') }}</strong>
|
|
44206
|
+
<small>
|
|
44207
|
+
{{
|
|
44208
|
+
t(
|
|
44209
|
+
'editor.description',
|
|
44210
|
+
'Configure only the visual shell. The relationship and its data remain governed by metadata.'
|
|
44211
|
+
)
|
|
44212
|
+
}}
|
|
44213
|
+
</small>
|
|
44214
|
+
</span>
|
|
44215
|
+
</header>
|
|
44216
|
+
|
|
44217
|
+
<section class="pdx-related-outlet-editor__section" aria-labelledby="related-outlet-shell-title">
|
|
44218
|
+
<div class="pdx-related-outlet-editor__section-heading">
|
|
44219
|
+
<h3 id="related-outlet-shell-title">{{ t('editor.shell.title', 'Presentation') }}</h3>
|
|
44220
|
+
<p>{{ t('editor.shell.help', 'Copy and display choices for this outlet instance.') }}</p>
|
|
44221
|
+
</div>
|
|
44222
|
+
|
|
44223
|
+
<div class="pdx-related-outlet-editor__fields">
|
|
44224
|
+
<mat-form-field appearance="outline">
|
|
44225
|
+
<mat-label>{{ t('editor.field.title', 'Title') }}</mat-label>
|
|
44226
|
+
<input matInput formControlName="title" />
|
|
44227
|
+
</mat-form-field>
|
|
44228
|
+
|
|
44229
|
+
<mat-form-field appearance="outline">
|
|
44230
|
+
<mat-label>{{ t('editor.field.icon', 'Icon') }}</mat-label>
|
|
44231
|
+
<input matInput formControlName="icon" />
|
|
44232
|
+
<button
|
|
44233
|
+
mat-icon-button
|
|
44234
|
+
matSuffix
|
|
44235
|
+
type="button"
|
|
44236
|
+
(click)="selectIcon('outlet')"
|
|
44237
|
+
[attr.aria-label]="t('editor.field.icon.choose', 'Choose outlet icon')"
|
|
44238
|
+
>
|
|
44239
|
+
<mat-icon fontIcon="apps" />
|
|
44240
|
+
</button>
|
|
44241
|
+
</mat-form-field>
|
|
44242
|
+
|
|
44243
|
+
<mat-form-field appearance="outline" class="pdx-related-outlet-editor__wide">
|
|
44244
|
+
<mat-label>{{ t('editor.field.subtitle', 'Subtitle') }}</mat-label>
|
|
44245
|
+
<textarea matInput formControlName="subtitle" rows="2"></textarea>
|
|
44246
|
+
</mat-form-field>
|
|
44247
|
+
</div>
|
|
44248
|
+
|
|
44249
|
+
<div class="pdx-related-outlet-editor__choice-grid">
|
|
44250
|
+
<fieldset>
|
|
44251
|
+
<legend>{{ t('editor.field.mode', 'Display mode') }}</legend>
|
|
44252
|
+
<mat-button-toggle-group
|
|
44253
|
+
formControlName="mode"
|
|
44254
|
+
hideSingleSelectionIndicator
|
|
44255
|
+
[attr.aria-label]="t('editor.field.mode', 'Display mode')"
|
|
44256
|
+
>
|
|
44257
|
+
<mat-button-toggle value="inline">
|
|
44258
|
+
<mat-icon fontIcon="table_rows" aria-hidden="true" />
|
|
44259
|
+
{{ t('editor.field.mode.inline', 'Inline') }}
|
|
44260
|
+
</mat-button-toggle>
|
|
44261
|
+
<mat-button-toggle value="open-action">
|
|
44262
|
+
<mat-icon fontIcon="open_in_new" aria-hidden="true" />
|
|
44263
|
+
{{ t('editor.field.mode.openAction', 'Open action') }}
|
|
44264
|
+
</mat-button-toggle>
|
|
44265
|
+
</mat-button-toggle-group>
|
|
44266
|
+
</fieldset>
|
|
44267
|
+
|
|
44268
|
+
<fieldset>
|
|
44269
|
+
<legend>{{ t('editor.field.presentation', 'Open presentation') }}</legend>
|
|
44270
|
+
<mat-button-toggle-group
|
|
44271
|
+
formControlName="presentation"
|
|
44272
|
+
hideSingleSelectionIndicator
|
|
44273
|
+
[attr.aria-label]="t('editor.field.presentation', 'Open presentation')"
|
|
44274
|
+
>
|
|
44275
|
+
<mat-button-toggle value="drawer">
|
|
44276
|
+
<mat-icon fontIcon="view_sidebar" aria-hidden="true" />
|
|
44277
|
+
{{ t('editor.field.presentation.drawer', 'Drawer') }}
|
|
44278
|
+
</mat-button-toggle>
|
|
44279
|
+
<mat-button-toggle value="modal">
|
|
44280
|
+
<mat-icon fontIcon="web_asset" aria-hidden="true" />
|
|
44281
|
+
{{ t('editor.field.presentation.modal', 'Modal') }}
|
|
44282
|
+
</mat-button-toggle>
|
|
44283
|
+
</mat-button-toggle-group>
|
|
44284
|
+
</fieldset>
|
|
44285
|
+
</div>
|
|
44286
|
+
|
|
44287
|
+
</section>
|
|
44288
|
+
|
|
44289
|
+
<section
|
|
44290
|
+
class="pdx-related-outlet-editor__section"
|
|
44291
|
+
formGroupName="emptyState"
|
|
44292
|
+
aria-labelledby="related-outlet-empty-state-title"
|
|
44293
|
+
>
|
|
44294
|
+
<div class="pdx-related-outlet-editor__section-heading">
|
|
44295
|
+
<h3 id="related-outlet-empty-state-title">{{ t('editor.emptyState.title', 'Empty state') }}</h3>
|
|
44296
|
+
<p>
|
|
44297
|
+
{{
|
|
44298
|
+
t(
|
|
44299
|
+
'editor.emptyState.help',
|
|
44300
|
+
'Override presentation only. Actions, templates and contextual behavior remain untouched.'
|
|
44301
|
+
)
|
|
44302
|
+
}}
|
|
44303
|
+
</p>
|
|
44304
|
+
</div>
|
|
44305
|
+
|
|
44306
|
+
<div class="pdx-related-outlet-editor__fields">
|
|
44307
|
+
<mat-form-field appearance="outline">
|
|
44308
|
+
<mat-label>{{ t('editor.emptyState.field.title', 'Title') }}</mat-label>
|
|
44309
|
+
<input matInput formControlName="title" />
|
|
44310
|
+
</mat-form-field>
|
|
44311
|
+
|
|
44312
|
+
<mat-form-field appearance="outline">
|
|
44313
|
+
<mat-label>{{ t('editor.emptyState.field.icon', 'Icon') }}</mat-label>
|
|
44314
|
+
<input matInput formControlName="icon" />
|
|
44315
|
+
<button
|
|
44316
|
+
mat-icon-button
|
|
44317
|
+
matSuffix
|
|
44318
|
+
type="button"
|
|
44319
|
+
(click)="selectIcon('emptyState')"
|
|
44320
|
+
[attr.aria-label]="t('editor.emptyState.field.icon.choose', 'Choose empty-state icon')"
|
|
44321
|
+
>
|
|
44322
|
+
<mat-icon fontIcon="apps" />
|
|
44323
|
+
</button>
|
|
44324
|
+
</mat-form-field>
|
|
44325
|
+
|
|
44326
|
+
<mat-form-field appearance="outline" class="pdx-related-outlet-editor__wide">
|
|
44327
|
+
<mat-label>{{ t('editor.emptyState.field.message', 'Message') }}</mat-label>
|
|
44328
|
+
<input matInput formControlName="message" />
|
|
44329
|
+
</mat-form-field>
|
|
44330
|
+
|
|
44331
|
+
<mat-form-field appearance="outline" class="pdx-related-outlet-editor__wide">
|
|
44332
|
+
<mat-label>{{ t('editor.emptyState.field.description', 'Description') }}</mat-label>
|
|
44333
|
+
<textarea matInput formControlName="description" rows="2"></textarea>
|
|
44334
|
+
</mat-form-field>
|
|
44335
|
+
|
|
44336
|
+
</div>
|
|
44337
|
+
|
|
44338
|
+
<div class="pdx-related-outlet-editor__appearance-grid">
|
|
44339
|
+
<fieldset class="pdx-related-outlet-editor__appearance-cluster">
|
|
44340
|
+
<legend>{{ t('editor.emptyState.field.tone', 'Tone') }}</legend>
|
|
44341
|
+
<mat-button-toggle-group
|
|
44342
|
+
formControlName="tone"
|
|
44343
|
+
hideSingleSelectionIndicator
|
|
44344
|
+
[attr.aria-label]="t('editor.emptyState.field.tone', 'Tone')"
|
|
44345
|
+
>
|
|
44346
|
+
<mat-button-toggle value="">
|
|
44347
|
+
<mat-icon fontIcon="auto_awesome" aria-hidden="true" />
|
|
44348
|
+
{{ t('editor.value.derived.short', 'Auto') }}
|
|
44349
|
+
</mat-button-toggle>
|
|
44350
|
+
<mat-button-toggle value="neutral">
|
|
44351
|
+
<mat-icon fontIcon="contrast" aria-hidden="true" />
|
|
44352
|
+
{{ t('editor.value.tone.neutral', 'Neutral') }}
|
|
44353
|
+
</mat-button-toggle>
|
|
44354
|
+
<mat-button-toggle value="primary">
|
|
44355
|
+
<mat-icon fontIcon="stars" aria-hidden="true" />
|
|
44356
|
+
{{ t('editor.value.tone.primary', 'Primary') }}
|
|
44357
|
+
</mat-button-toggle>
|
|
44358
|
+
<mat-button-toggle value="secondary">
|
|
44359
|
+
<mat-icon fontIcon="palette" aria-hidden="true" />
|
|
44360
|
+
{{ t('editor.value.tone.secondary', 'Secondary') }}
|
|
44361
|
+
</mat-button-toggle>
|
|
44362
|
+
</mat-button-toggle-group>
|
|
44363
|
+
</fieldset>
|
|
44364
|
+
|
|
44365
|
+
<fieldset class="pdx-related-outlet-editor__appearance-cluster pdx-related-outlet-editor__appearance-cluster--wide">
|
|
44366
|
+
<legend>{{ t('editor.emptyState.field.variant', 'Variant') }}</legend>
|
|
44367
|
+
<mat-button-toggle-group
|
|
44368
|
+
formControlName="variant"
|
|
44369
|
+
hideSingleSelectionIndicator
|
|
44370
|
+
[attr.aria-label]="t('editor.emptyState.field.variant', 'Variant')"
|
|
44371
|
+
>
|
|
44372
|
+
<mat-button-toggle value="">
|
|
44373
|
+
<mat-icon fontIcon="auto_awesome" aria-hidden="true" />
|
|
44374
|
+
{{ t('editor.value.derived.short', 'Auto') }}
|
|
44375
|
+
</mat-button-toggle>
|
|
44376
|
+
<mat-button-toggle value="inline">
|
|
44377
|
+
<mat-icon fontIcon="view_stream" aria-hidden="true" />
|
|
44378
|
+
{{ t('editor.value.variant.inline', 'Inline') }}
|
|
44379
|
+
</mat-button-toggle>
|
|
44380
|
+
<mat-button-toggle value="card">
|
|
44381
|
+
<mat-icon fontIcon="crop_square" aria-hidden="true" />
|
|
44382
|
+
{{ t('editor.value.variant.card', 'Card') }}
|
|
44383
|
+
</mat-button-toggle>
|
|
44384
|
+
<mat-button-toggle value="panel">
|
|
44385
|
+
<mat-icon fontIcon="view_agenda" aria-hidden="true" />
|
|
44386
|
+
{{ t('editor.value.variant.panel', 'Panel') }}
|
|
44387
|
+
</mat-button-toggle>
|
|
44388
|
+
<mat-button-toggle value="transparent">
|
|
44389
|
+
<mat-icon fontIcon="layers_clear" aria-hidden="true" />
|
|
44390
|
+
{{ t('editor.value.variant.transparent', 'Transparent') }}
|
|
44391
|
+
</mat-button-toggle>
|
|
44392
|
+
</mat-button-toggle-group>
|
|
44393
|
+
</fieldset>
|
|
44394
|
+
|
|
44395
|
+
<fieldset class="pdx-related-outlet-editor__appearance-cluster">
|
|
44396
|
+
<legend>{{ t('editor.emptyState.field.alignment', 'Alignment') }}</legend>
|
|
44397
|
+
<mat-button-toggle-group
|
|
44398
|
+
formControlName="alignment"
|
|
44399
|
+
hideSingleSelectionIndicator
|
|
44400
|
+
[attr.aria-label]="t('editor.emptyState.field.alignment', 'Alignment')"
|
|
44401
|
+
>
|
|
44402
|
+
<mat-button-toggle value="">
|
|
44403
|
+
<mat-icon fontIcon="auto_awesome" aria-hidden="true" />
|
|
44404
|
+
{{ t('editor.value.derived.short', 'Auto') }}
|
|
44405
|
+
</mat-button-toggle>
|
|
44406
|
+
<mat-button-toggle value="start">
|
|
44407
|
+
<mat-icon fontIcon="format_align_left" aria-hidden="true" />
|
|
44408
|
+
{{ t('editor.value.alignment.start', 'Start') }}
|
|
44409
|
+
</mat-button-toggle>
|
|
44410
|
+
<mat-button-toggle value="center">
|
|
44411
|
+
<mat-icon fontIcon="format_align_center" aria-hidden="true" />
|
|
44412
|
+
{{ t('editor.value.alignment.center', 'Center') }}
|
|
44413
|
+
</mat-button-toggle>
|
|
44414
|
+
</mat-button-toggle-group>
|
|
44415
|
+
</fieldset>
|
|
44416
|
+
|
|
44417
|
+
<div class="pdx-related-outlet-editor__appearance-cluster pdx-related-outlet-editor__density-cluster">
|
|
44418
|
+
<fieldset>
|
|
44419
|
+
<legend>{{ t('editor.emptyState.field.density', 'Density') }}</legend>
|
|
44420
|
+
<mat-button-toggle-group
|
|
44421
|
+
formControlName="density"
|
|
44422
|
+
hideSingleSelectionIndicator
|
|
44423
|
+
[attr.aria-label]="t('editor.emptyState.field.density', 'Density')"
|
|
44424
|
+
>
|
|
44425
|
+
<mat-button-toggle value="">
|
|
44426
|
+
<mat-icon fontIcon="auto_awesome" aria-hidden="true" />
|
|
44427
|
+
{{ t('editor.value.derived.short', 'Auto') }}
|
|
44428
|
+
</mat-button-toggle>
|
|
44429
|
+
<mat-button-toggle value="compact">
|
|
44430
|
+
<mat-icon fontIcon="density_small" aria-hidden="true" />
|
|
44431
|
+
{{ t('editor.value.density.compact', 'Compact') }}
|
|
44432
|
+
</mat-button-toggle>
|
|
44433
|
+
<mat-button-toggle value="comfortable">
|
|
44434
|
+
<mat-icon fontIcon="density_medium" aria-hidden="true" />
|
|
44435
|
+
{{ t('editor.value.density.comfortable', 'Comfortable') }}
|
|
44436
|
+
</mat-button-toggle>
|
|
44437
|
+
</mat-button-toggle-group>
|
|
44438
|
+
</fieldset>
|
|
44439
|
+
<mat-slide-toggle [formControl]="form.controls.compact">
|
|
44440
|
+
{{ t('editor.field.compact', 'Use compact empty and loading states') }}
|
|
44441
|
+
</mat-slide-toggle>
|
|
44442
|
+
</div>
|
|
44443
|
+
|
|
44444
|
+
<fieldset class="pdx-related-outlet-editor__appearance-cluster">
|
|
44445
|
+
<legend>{{ t('editor.emptyState.field.iconContainer', 'Icon container') }}</legend>
|
|
44446
|
+
<mat-button-toggle-group
|
|
44447
|
+
formControlName="iconContainer"
|
|
44448
|
+
hideSingleSelectionIndicator
|
|
44449
|
+
[attr.aria-label]="t('editor.emptyState.field.iconContainer', 'Icon container')"
|
|
44450
|
+
>
|
|
44451
|
+
<mat-button-toggle value="">
|
|
44452
|
+
<mat-icon fontIcon="auto_awesome" aria-hidden="true" />
|
|
44453
|
+
{{ t('editor.value.derived.short', 'Auto') }}
|
|
44454
|
+
</mat-button-toggle>
|
|
44455
|
+
<mat-button-toggle value="none">
|
|
44456
|
+
<mat-icon fontIcon="block" aria-hidden="true" />
|
|
44457
|
+
{{ t('editor.value.iconContainer.none', 'None') }}
|
|
44458
|
+
</mat-button-toggle>
|
|
44459
|
+
<mat-button-toggle value="circle">
|
|
44460
|
+
<mat-icon fontIcon="circle" aria-hidden="true" />
|
|
44461
|
+
{{ t('editor.value.iconContainer.circle', 'Circle') }}
|
|
44462
|
+
</mat-button-toggle>
|
|
44463
|
+
<mat-button-toggle value="soft">
|
|
44464
|
+
<mat-icon fontIcon="blur_on" aria-hidden="true" />
|
|
44465
|
+
{{ t('editor.value.iconContainer.soft', 'Soft') }}
|
|
44466
|
+
</mat-button-toggle>
|
|
44467
|
+
</mat-button-toggle-group>
|
|
44468
|
+
</fieldset>
|
|
44469
|
+
</div>
|
|
44470
|
+
</section>
|
|
44471
|
+
|
|
44472
|
+
<aside class="pdx-related-outlet-editor__boundary" role="note">
|
|
44473
|
+
<mat-icon fontIcon="lock" aria-hidden="true" />
|
|
44474
|
+
<span>
|
|
44475
|
+
<strong>{{ t('editor.boundary.title', 'Relationship is read-only here') }}</strong>
|
|
44476
|
+
<small>
|
|
44477
|
+
{{
|
|
44478
|
+
t(
|
|
44479
|
+
'editor.boundary.description',
|
|
44480
|
+
'Resource paths, parent bindings, operations, filters and child table configuration stay with their canonical owners.'
|
|
44481
|
+
)
|
|
44482
|
+
}}
|
|
44483
|
+
</small>
|
|
44484
|
+
</span>
|
|
44485
|
+
</aside>
|
|
44486
|
+
</form>
|
|
44487
|
+
`, isInline: true, styles: [":host{display:block;color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet-editor{display:grid;gap:var(--pdx-spacing-lg, 24px);padding:var(--pdx-spacing-md, 16px)}.pdx-related-outlet-editor__header,.pdx-related-outlet-editor__boundary{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:start;gap:var(--pdx-spacing-sm, 12px)}.pdx-related-outlet-editor__header-icon{display:inline-grid;place-items:center;width:40px;height:40px;border-radius:var(--md-sys-shape-corner-medium, 12px);color:var(--md-sys-color-primary, currentColor);background:var(--md-sys-color-primary-container, transparent)}.pdx-related-outlet-editor__header strong,.pdx-related-outlet-editor__boundary strong,.pdx-related-outlet-editor__header small,.pdx-related-outlet-editor__boundary small{display:block}.pdx-related-outlet-editor__header strong{font:var(--md-sys-typescale-title-medium, 600 1rem/1.4 system-ui)}.pdx-related-outlet-editor__header small,.pdx-related-outlet-editor__boundary small,.pdx-related-outlet-editor__section-heading p{color:var(--md-sys-color-on-surface-variant, currentColor)}.pdx-related-outlet-editor__section{display:grid;gap:var(--pdx-spacing-md, 16px)}.pdx-related-outlet-editor__section-heading h3,.pdx-related-outlet-editor__section-heading p{margin:0}.pdx-related-outlet-editor__section-heading h3{font:var(--md-sys-typescale-title-small, 600 .95rem/1.3 system-ui)}.pdx-related-outlet-editor__section-heading p{margin-top:4px;font:var(--md-sys-typescale-body-small, 400 .82rem/1.35 system-ui)}.pdx-related-outlet-editor__fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--pdx-spacing-sm, 12px)}.pdx-related-outlet-editor__wide{grid-column:1 / -1}.pdx-related-outlet-editor__choice-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--pdx-spacing-md, 16px)}.pdx-related-outlet-editor__appearance-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,280px),1fr));gap:var(--pdx-spacing-sm, 12px)}.pdx-related-outlet-editor__appearance-cluster{display:grid;align-content:start;gap:var(--pdx-spacing-sm, 12px);min-width:0}.pdx-related-outlet-editor__appearance-cluster--wide{grid-column:1 / -1}.pdx-related-outlet-editor__appearance-cluster mat-button-toggle-group{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,132px),1fr))}.pdx-related-outlet-editor__appearance-cluster mat-button-toggle{min-height:44px}.pdx-related-outlet-editor__density-cluster{gap:var(--pdx-spacing-md, 16px)}fieldset{min-width:0;margin:0;padding:0;border:0}legend{margin-bottom:8px;font:var(--md-sys-typescale-label-large, 500 .88rem/1.2 system-ui)}mat-button-toggle-group{width:100%}mat-button-toggle{flex:1 1 0}mat-button-toggle mat-icon{margin-right:6px}.pdx-related-outlet-editor__boundary{padding:var(--pdx-spacing-sm, 12px);border:1px solid var(--md-sys-color-outline-variant, currentColor);border-radius:var(--md-sys-shape-corner-medium, 12px);background:var(--md-sys-color-surface-container-low, transparent)}.pdx-related-outlet-editor__boundary mat-icon{color:var(--md-sys-color-on-surface-variant, currentColor)}@media(max-width:640px){.pdx-related-outlet-editor__fields,.pdx-related-outlet-editor__choice-grid{grid-template-columns:minmax(0,1fr)}.pdx-related-outlet-editor__wide{grid-column:auto}mat-button-toggle-group{display:grid}}@media(max-width:420px){.pdx-related-outlet-editor__appearance-cluster mat-button-toggle-group{grid-template-columns:minmax(0,1fr)}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1$2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i3$1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i3$1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i7.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
44488
|
+
}
|
|
44489
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisRelatedResourceOutletConfigEditorComponent, decorators: [{
|
|
44490
|
+
type: Component,
|
|
44491
|
+
args: [{ selector: 'praxis-related-resource-outlet-config-editor', imports: [
|
|
44492
|
+
ReactiveFormsModule,
|
|
44493
|
+
MatButtonModule,
|
|
44494
|
+
MatButtonToggleModule,
|
|
44495
|
+
MatFormFieldModule,
|
|
44496
|
+
MatIconModule,
|
|
44497
|
+
MatInputModule,
|
|
44498
|
+
MatSlideToggleModule,
|
|
44499
|
+
], providers: [providePraxisI18nConfig(RELATED_RESOURCE_OUTLET_I18N_CONFIG)], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
44500
|
+
<form
|
|
44501
|
+
class="pdx-related-outlet-editor"
|
|
44502
|
+
[formGroup]="form"
|
|
44503
|
+
data-testid="related-resource-outlet-config-editor"
|
|
44504
|
+
>
|
|
44505
|
+
<header class="pdx-related-outlet-editor__header">
|
|
44506
|
+
<span class="pdx-related-outlet-editor__header-icon" aria-hidden="true">
|
|
44507
|
+
<mat-icon fontIcon="account_tree" />
|
|
44508
|
+
</span>
|
|
44509
|
+
<span>
|
|
44510
|
+
<strong>{{ t('editor.title', 'Related resource presentation') }}</strong>
|
|
44511
|
+
<small>
|
|
44512
|
+
{{
|
|
44513
|
+
t(
|
|
44514
|
+
'editor.description',
|
|
44515
|
+
'Configure only the visual shell. The relationship and its data remain governed by metadata.'
|
|
44516
|
+
)
|
|
44517
|
+
}}
|
|
44518
|
+
</small>
|
|
44519
|
+
</span>
|
|
44520
|
+
</header>
|
|
44521
|
+
|
|
44522
|
+
<section class="pdx-related-outlet-editor__section" aria-labelledby="related-outlet-shell-title">
|
|
44523
|
+
<div class="pdx-related-outlet-editor__section-heading">
|
|
44524
|
+
<h3 id="related-outlet-shell-title">{{ t('editor.shell.title', 'Presentation') }}</h3>
|
|
44525
|
+
<p>{{ t('editor.shell.help', 'Copy and display choices for this outlet instance.') }}</p>
|
|
44526
|
+
</div>
|
|
44527
|
+
|
|
44528
|
+
<div class="pdx-related-outlet-editor__fields">
|
|
44529
|
+
<mat-form-field appearance="outline">
|
|
44530
|
+
<mat-label>{{ t('editor.field.title', 'Title') }}</mat-label>
|
|
44531
|
+
<input matInput formControlName="title" />
|
|
44532
|
+
</mat-form-field>
|
|
44533
|
+
|
|
44534
|
+
<mat-form-field appearance="outline">
|
|
44535
|
+
<mat-label>{{ t('editor.field.icon', 'Icon') }}</mat-label>
|
|
44536
|
+
<input matInput formControlName="icon" />
|
|
44537
|
+
<button
|
|
44538
|
+
mat-icon-button
|
|
44539
|
+
matSuffix
|
|
44540
|
+
type="button"
|
|
44541
|
+
(click)="selectIcon('outlet')"
|
|
44542
|
+
[attr.aria-label]="t('editor.field.icon.choose', 'Choose outlet icon')"
|
|
44543
|
+
>
|
|
44544
|
+
<mat-icon fontIcon="apps" />
|
|
44545
|
+
</button>
|
|
44546
|
+
</mat-form-field>
|
|
44547
|
+
|
|
44548
|
+
<mat-form-field appearance="outline" class="pdx-related-outlet-editor__wide">
|
|
44549
|
+
<mat-label>{{ t('editor.field.subtitle', 'Subtitle') }}</mat-label>
|
|
44550
|
+
<textarea matInput formControlName="subtitle" rows="2"></textarea>
|
|
44551
|
+
</mat-form-field>
|
|
44552
|
+
</div>
|
|
44553
|
+
|
|
44554
|
+
<div class="pdx-related-outlet-editor__choice-grid">
|
|
44555
|
+
<fieldset>
|
|
44556
|
+
<legend>{{ t('editor.field.mode', 'Display mode') }}</legend>
|
|
44557
|
+
<mat-button-toggle-group
|
|
44558
|
+
formControlName="mode"
|
|
44559
|
+
hideSingleSelectionIndicator
|
|
44560
|
+
[attr.aria-label]="t('editor.field.mode', 'Display mode')"
|
|
44561
|
+
>
|
|
44562
|
+
<mat-button-toggle value="inline">
|
|
44563
|
+
<mat-icon fontIcon="table_rows" aria-hidden="true" />
|
|
44564
|
+
{{ t('editor.field.mode.inline', 'Inline') }}
|
|
44565
|
+
</mat-button-toggle>
|
|
44566
|
+
<mat-button-toggle value="open-action">
|
|
44567
|
+
<mat-icon fontIcon="open_in_new" aria-hidden="true" />
|
|
44568
|
+
{{ t('editor.field.mode.openAction', 'Open action') }}
|
|
44569
|
+
</mat-button-toggle>
|
|
44570
|
+
</mat-button-toggle-group>
|
|
44571
|
+
</fieldset>
|
|
44572
|
+
|
|
44573
|
+
<fieldset>
|
|
44574
|
+
<legend>{{ t('editor.field.presentation', 'Open presentation') }}</legend>
|
|
44575
|
+
<mat-button-toggle-group
|
|
44576
|
+
formControlName="presentation"
|
|
44577
|
+
hideSingleSelectionIndicator
|
|
44578
|
+
[attr.aria-label]="t('editor.field.presentation', 'Open presentation')"
|
|
44579
|
+
>
|
|
44580
|
+
<mat-button-toggle value="drawer">
|
|
44581
|
+
<mat-icon fontIcon="view_sidebar" aria-hidden="true" />
|
|
44582
|
+
{{ t('editor.field.presentation.drawer', 'Drawer') }}
|
|
44583
|
+
</mat-button-toggle>
|
|
44584
|
+
<mat-button-toggle value="modal">
|
|
44585
|
+
<mat-icon fontIcon="web_asset" aria-hidden="true" />
|
|
44586
|
+
{{ t('editor.field.presentation.modal', 'Modal') }}
|
|
44587
|
+
</mat-button-toggle>
|
|
44588
|
+
</mat-button-toggle-group>
|
|
44589
|
+
</fieldset>
|
|
44590
|
+
</div>
|
|
44591
|
+
|
|
44592
|
+
</section>
|
|
44593
|
+
|
|
44594
|
+
<section
|
|
44595
|
+
class="pdx-related-outlet-editor__section"
|
|
44596
|
+
formGroupName="emptyState"
|
|
44597
|
+
aria-labelledby="related-outlet-empty-state-title"
|
|
44598
|
+
>
|
|
44599
|
+
<div class="pdx-related-outlet-editor__section-heading">
|
|
44600
|
+
<h3 id="related-outlet-empty-state-title">{{ t('editor.emptyState.title', 'Empty state') }}</h3>
|
|
44601
|
+
<p>
|
|
44602
|
+
{{
|
|
44603
|
+
t(
|
|
44604
|
+
'editor.emptyState.help',
|
|
44605
|
+
'Override presentation only. Actions, templates and contextual behavior remain untouched.'
|
|
44606
|
+
)
|
|
44607
|
+
}}
|
|
44608
|
+
</p>
|
|
44609
|
+
</div>
|
|
44610
|
+
|
|
44611
|
+
<div class="pdx-related-outlet-editor__fields">
|
|
44612
|
+
<mat-form-field appearance="outline">
|
|
44613
|
+
<mat-label>{{ t('editor.emptyState.field.title', 'Title') }}</mat-label>
|
|
44614
|
+
<input matInput formControlName="title" />
|
|
44615
|
+
</mat-form-field>
|
|
44616
|
+
|
|
44617
|
+
<mat-form-field appearance="outline">
|
|
44618
|
+
<mat-label>{{ t('editor.emptyState.field.icon', 'Icon') }}</mat-label>
|
|
44619
|
+
<input matInput formControlName="icon" />
|
|
44620
|
+
<button
|
|
44621
|
+
mat-icon-button
|
|
44622
|
+
matSuffix
|
|
44623
|
+
type="button"
|
|
44624
|
+
(click)="selectIcon('emptyState')"
|
|
44625
|
+
[attr.aria-label]="t('editor.emptyState.field.icon.choose', 'Choose empty-state icon')"
|
|
44626
|
+
>
|
|
44627
|
+
<mat-icon fontIcon="apps" />
|
|
44628
|
+
</button>
|
|
44629
|
+
</mat-form-field>
|
|
44630
|
+
|
|
44631
|
+
<mat-form-field appearance="outline" class="pdx-related-outlet-editor__wide">
|
|
44632
|
+
<mat-label>{{ t('editor.emptyState.field.message', 'Message') }}</mat-label>
|
|
44633
|
+
<input matInput formControlName="message" />
|
|
44634
|
+
</mat-form-field>
|
|
44635
|
+
|
|
44636
|
+
<mat-form-field appearance="outline" class="pdx-related-outlet-editor__wide">
|
|
44637
|
+
<mat-label>{{ t('editor.emptyState.field.description', 'Description') }}</mat-label>
|
|
44638
|
+
<textarea matInput formControlName="description" rows="2"></textarea>
|
|
44639
|
+
</mat-form-field>
|
|
44640
|
+
|
|
44641
|
+
</div>
|
|
44642
|
+
|
|
44643
|
+
<div class="pdx-related-outlet-editor__appearance-grid">
|
|
44644
|
+
<fieldset class="pdx-related-outlet-editor__appearance-cluster">
|
|
44645
|
+
<legend>{{ t('editor.emptyState.field.tone', 'Tone') }}</legend>
|
|
44646
|
+
<mat-button-toggle-group
|
|
44647
|
+
formControlName="tone"
|
|
44648
|
+
hideSingleSelectionIndicator
|
|
44649
|
+
[attr.aria-label]="t('editor.emptyState.field.tone', 'Tone')"
|
|
44650
|
+
>
|
|
44651
|
+
<mat-button-toggle value="">
|
|
44652
|
+
<mat-icon fontIcon="auto_awesome" aria-hidden="true" />
|
|
44653
|
+
{{ t('editor.value.derived.short', 'Auto') }}
|
|
44654
|
+
</mat-button-toggle>
|
|
44655
|
+
<mat-button-toggle value="neutral">
|
|
44656
|
+
<mat-icon fontIcon="contrast" aria-hidden="true" />
|
|
44657
|
+
{{ t('editor.value.tone.neutral', 'Neutral') }}
|
|
44658
|
+
</mat-button-toggle>
|
|
44659
|
+
<mat-button-toggle value="primary">
|
|
44660
|
+
<mat-icon fontIcon="stars" aria-hidden="true" />
|
|
44661
|
+
{{ t('editor.value.tone.primary', 'Primary') }}
|
|
44662
|
+
</mat-button-toggle>
|
|
44663
|
+
<mat-button-toggle value="secondary">
|
|
44664
|
+
<mat-icon fontIcon="palette" aria-hidden="true" />
|
|
44665
|
+
{{ t('editor.value.tone.secondary', 'Secondary') }}
|
|
44666
|
+
</mat-button-toggle>
|
|
44667
|
+
</mat-button-toggle-group>
|
|
44668
|
+
</fieldset>
|
|
44669
|
+
|
|
44670
|
+
<fieldset class="pdx-related-outlet-editor__appearance-cluster pdx-related-outlet-editor__appearance-cluster--wide">
|
|
44671
|
+
<legend>{{ t('editor.emptyState.field.variant', 'Variant') }}</legend>
|
|
44672
|
+
<mat-button-toggle-group
|
|
44673
|
+
formControlName="variant"
|
|
44674
|
+
hideSingleSelectionIndicator
|
|
44675
|
+
[attr.aria-label]="t('editor.emptyState.field.variant', 'Variant')"
|
|
44676
|
+
>
|
|
44677
|
+
<mat-button-toggle value="">
|
|
44678
|
+
<mat-icon fontIcon="auto_awesome" aria-hidden="true" />
|
|
44679
|
+
{{ t('editor.value.derived.short', 'Auto') }}
|
|
44680
|
+
</mat-button-toggle>
|
|
44681
|
+
<mat-button-toggle value="inline">
|
|
44682
|
+
<mat-icon fontIcon="view_stream" aria-hidden="true" />
|
|
44683
|
+
{{ t('editor.value.variant.inline', 'Inline') }}
|
|
44684
|
+
</mat-button-toggle>
|
|
44685
|
+
<mat-button-toggle value="card">
|
|
44686
|
+
<mat-icon fontIcon="crop_square" aria-hidden="true" />
|
|
44687
|
+
{{ t('editor.value.variant.card', 'Card') }}
|
|
44688
|
+
</mat-button-toggle>
|
|
44689
|
+
<mat-button-toggle value="panel">
|
|
44690
|
+
<mat-icon fontIcon="view_agenda" aria-hidden="true" />
|
|
44691
|
+
{{ t('editor.value.variant.panel', 'Panel') }}
|
|
44692
|
+
</mat-button-toggle>
|
|
44693
|
+
<mat-button-toggle value="transparent">
|
|
44694
|
+
<mat-icon fontIcon="layers_clear" aria-hidden="true" />
|
|
44695
|
+
{{ t('editor.value.variant.transparent', 'Transparent') }}
|
|
44696
|
+
</mat-button-toggle>
|
|
44697
|
+
</mat-button-toggle-group>
|
|
44698
|
+
</fieldset>
|
|
44699
|
+
|
|
44700
|
+
<fieldset class="pdx-related-outlet-editor__appearance-cluster">
|
|
44701
|
+
<legend>{{ t('editor.emptyState.field.alignment', 'Alignment') }}</legend>
|
|
44702
|
+
<mat-button-toggle-group
|
|
44703
|
+
formControlName="alignment"
|
|
44704
|
+
hideSingleSelectionIndicator
|
|
44705
|
+
[attr.aria-label]="t('editor.emptyState.field.alignment', 'Alignment')"
|
|
44706
|
+
>
|
|
44707
|
+
<mat-button-toggle value="">
|
|
44708
|
+
<mat-icon fontIcon="auto_awesome" aria-hidden="true" />
|
|
44709
|
+
{{ t('editor.value.derived.short', 'Auto') }}
|
|
44710
|
+
</mat-button-toggle>
|
|
44711
|
+
<mat-button-toggle value="start">
|
|
44712
|
+
<mat-icon fontIcon="format_align_left" aria-hidden="true" />
|
|
44713
|
+
{{ t('editor.value.alignment.start', 'Start') }}
|
|
44714
|
+
</mat-button-toggle>
|
|
44715
|
+
<mat-button-toggle value="center">
|
|
44716
|
+
<mat-icon fontIcon="format_align_center" aria-hidden="true" />
|
|
44717
|
+
{{ t('editor.value.alignment.center', 'Center') }}
|
|
44718
|
+
</mat-button-toggle>
|
|
44719
|
+
</mat-button-toggle-group>
|
|
44720
|
+
</fieldset>
|
|
44721
|
+
|
|
44722
|
+
<div class="pdx-related-outlet-editor__appearance-cluster pdx-related-outlet-editor__density-cluster">
|
|
44723
|
+
<fieldset>
|
|
44724
|
+
<legend>{{ t('editor.emptyState.field.density', 'Density') }}</legend>
|
|
44725
|
+
<mat-button-toggle-group
|
|
44726
|
+
formControlName="density"
|
|
44727
|
+
hideSingleSelectionIndicator
|
|
44728
|
+
[attr.aria-label]="t('editor.emptyState.field.density', 'Density')"
|
|
44729
|
+
>
|
|
44730
|
+
<mat-button-toggle value="">
|
|
44731
|
+
<mat-icon fontIcon="auto_awesome" aria-hidden="true" />
|
|
44732
|
+
{{ t('editor.value.derived.short', 'Auto') }}
|
|
44733
|
+
</mat-button-toggle>
|
|
44734
|
+
<mat-button-toggle value="compact">
|
|
44735
|
+
<mat-icon fontIcon="density_small" aria-hidden="true" />
|
|
44736
|
+
{{ t('editor.value.density.compact', 'Compact') }}
|
|
44737
|
+
</mat-button-toggle>
|
|
44738
|
+
<mat-button-toggle value="comfortable">
|
|
44739
|
+
<mat-icon fontIcon="density_medium" aria-hidden="true" />
|
|
44740
|
+
{{ t('editor.value.density.comfortable', 'Comfortable') }}
|
|
44741
|
+
</mat-button-toggle>
|
|
44742
|
+
</mat-button-toggle-group>
|
|
44743
|
+
</fieldset>
|
|
44744
|
+
<mat-slide-toggle [formControl]="form.controls.compact">
|
|
44745
|
+
{{ t('editor.field.compact', 'Use compact empty and loading states') }}
|
|
44746
|
+
</mat-slide-toggle>
|
|
44747
|
+
</div>
|
|
44748
|
+
|
|
44749
|
+
<fieldset class="pdx-related-outlet-editor__appearance-cluster">
|
|
44750
|
+
<legend>{{ t('editor.emptyState.field.iconContainer', 'Icon container') }}</legend>
|
|
44751
|
+
<mat-button-toggle-group
|
|
44752
|
+
formControlName="iconContainer"
|
|
44753
|
+
hideSingleSelectionIndicator
|
|
44754
|
+
[attr.aria-label]="t('editor.emptyState.field.iconContainer', 'Icon container')"
|
|
44755
|
+
>
|
|
44756
|
+
<mat-button-toggle value="">
|
|
44757
|
+
<mat-icon fontIcon="auto_awesome" aria-hidden="true" />
|
|
44758
|
+
{{ t('editor.value.derived.short', 'Auto') }}
|
|
44759
|
+
</mat-button-toggle>
|
|
44760
|
+
<mat-button-toggle value="none">
|
|
44761
|
+
<mat-icon fontIcon="block" aria-hidden="true" />
|
|
44762
|
+
{{ t('editor.value.iconContainer.none', 'None') }}
|
|
44763
|
+
</mat-button-toggle>
|
|
44764
|
+
<mat-button-toggle value="circle">
|
|
44765
|
+
<mat-icon fontIcon="circle" aria-hidden="true" />
|
|
44766
|
+
{{ t('editor.value.iconContainer.circle', 'Circle') }}
|
|
44767
|
+
</mat-button-toggle>
|
|
44768
|
+
<mat-button-toggle value="soft">
|
|
44769
|
+
<mat-icon fontIcon="blur_on" aria-hidden="true" />
|
|
44770
|
+
{{ t('editor.value.iconContainer.soft', 'Soft') }}
|
|
44771
|
+
</mat-button-toggle>
|
|
44772
|
+
</mat-button-toggle-group>
|
|
44773
|
+
</fieldset>
|
|
44774
|
+
</div>
|
|
44775
|
+
</section>
|
|
44776
|
+
|
|
44777
|
+
<aside class="pdx-related-outlet-editor__boundary" role="note">
|
|
44778
|
+
<mat-icon fontIcon="lock" aria-hidden="true" />
|
|
44779
|
+
<span>
|
|
44780
|
+
<strong>{{ t('editor.boundary.title', 'Relationship is read-only here') }}</strong>
|
|
44781
|
+
<small>
|
|
44782
|
+
{{
|
|
44783
|
+
t(
|
|
44784
|
+
'editor.boundary.description',
|
|
44785
|
+
'Resource paths, parent bindings, operations, filters and child table configuration stay with their canonical owners.'
|
|
44786
|
+
)
|
|
44787
|
+
}}
|
|
44788
|
+
</small>
|
|
44789
|
+
</span>
|
|
44790
|
+
</aside>
|
|
44791
|
+
</form>
|
|
44792
|
+
`, styles: [":host{display:block;color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet-editor{display:grid;gap:var(--pdx-spacing-lg, 24px);padding:var(--pdx-spacing-md, 16px)}.pdx-related-outlet-editor__header,.pdx-related-outlet-editor__boundary{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:start;gap:var(--pdx-spacing-sm, 12px)}.pdx-related-outlet-editor__header-icon{display:inline-grid;place-items:center;width:40px;height:40px;border-radius:var(--md-sys-shape-corner-medium, 12px);color:var(--md-sys-color-primary, currentColor);background:var(--md-sys-color-primary-container, transparent)}.pdx-related-outlet-editor__header strong,.pdx-related-outlet-editor__boundary strong,.pdx-related-outlet-editor__header small,.pdx-related-outlet-editor__boundary small{display:block}.pdx-related-outlet-editor__header strong{font:var(--md-sys-typescale-title-medium, 600 1rem/1.4 system-ui)}.pdx-related-outlet-editor__header small,.pdx-related-outlet-editor__boundary small,.pdx-related-outlet-editor__section-heading p{color:var(--md-sys-color-on-surface-variant, currentColor)}.pdx-related-outlet-editor__section{display:grid;gap:var(--pdx-spacing-md, 16px)}.pdx-related-outlet-editor__section-heading h3,.pdx-related-outlet-editor__section-heading p{margin:0}.pdx-related-outlet-editor__section-heading h3{font:var(--md-sys-typescale-title-small, 600 .95rem/1.3 system-ui)}.pdx-related-outlet-editor__section-heading p{margin-top:4px;font:var(--md-sys-typescale-body-small, 400 .82rem/1.35 system-ui)}.pdx-related-outlet-editor__fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--pdx-spacing-sm, 12px)}.pdx-related-outlet-editor__wide{grid-column:1 / -1}.pdx-related-outlet-editor__choice-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--pdx-spacing-md, 16px)}.pdx-related-outlet-editor__appearance-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,280px),1fr));gap:var(--pdx-spacing-sm, 12px)}.pdx-related-outlet-editor__appearance-cluster{display:grid;align-content:start;gap:var(--pdx-spacing-sm, 12px);min-width:0}.pdx-related-outlet-editor__appearance-cluster--wide{grid-column:1 / -1}.pdx-related-outlet-editor__appearance-cluster mat-button-toggle-group{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,132px),1fr))}.pdx-related-outlet-editor__appearance-cluster mat-button-toggle{min-height:44px}.pdx-related-outlet-editor__density-cluster{gap:var(--pdx-spacing-md, 16px)}fieldset{min-width:0;margin:0;padding:0;border:0}legend{margin-bottom:8px;font:var(--md-sys-typescale-label-large, 500 .88rem/1.2 system-ui)}mat-button-toggle-group{width:100%}mat-button-toggle{flex:1 1 0}mat-button-toggle mat-icon{margin-right:6px}.pdx-related-outlet-editor__boundary{padding:var(--pdx-spacing-sm, 12px);border:1px solid var(--md-sys-color-outline-variant, currentColor);border-radius:var(--md-sys-shape-corner-medium, 12px);background:var(--md-sys-color-surface-container-low, transparent)}.pdx-related-outlet-editor__boundary mat-icon{color:var(--md-sys-color-on-surface-variant, currentColor)}@media(max-width:640px){.pdx-related-outlet-editor__fields,.pdx-related-outlet-editor__choice-grid{grid-template-columns:minmax(0,1fr)}.pdx-related-outlet-editor__wide{grid-column:auto}mat-button-toggle-group{display:grid}}@media(max-width:420px){.pdx-related-outlet-editor__appearance-cluster mat-button-toggle-group{grid-template-columns:minmax(0,1fr)}}\n"] }]
|
|
44793
|
+
}], ctorParameters: () => [], propDecorators: { inputs: [{ type: i0.Input, args: [{ isSignal: true, alias: "inputs", required: false }] }], widgetKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "widgetKey", required: false }] }], widgetType: [{ type: i0.Input, args: [{ isSignal: true, alias: "widgetType", required: false }] }] } });
|
|
44794
|
+
|
|
43427
44795
|
const PRAXIS_RELATED_RESOURCE_OUTLET_PORTS = [
|
|
43428
44796
|
{
|
|
43429
44797
|
id: 'parentResourceId',
|
|
@@ -43549,6 +44917,15 @@ const PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA = {
|
|
|
43549
44917
|
{ name: 'resourceEvent', type: 'PraxisResourceEvent', description: 'Promove eventos canonicos emitidos pelo widget filho materializado.' },
|
|
43550
44918
|
],
|
|
43551
44919
|
ports: PRAXIS_RELATED_RESOURCE_OUTLET_PORTS,
|
|
44920
|
+
configEditor: {
|
|
44921
|
+
component: PraxisRelatedResourceOutletConfigEditorComponent,
|
|
44922
|
+
title: 'Related resource presentation',
|
|
44923
|
+
},
|
|
44924
|
+
authoringManifestRef: {
|
|
44925
|
+
componentId: 'praxis-related-resource-outlet',
|
|
44926
|
+
version: '1.0.0',
|
|
44927
|
+
source: 'PRAXIS_RELATED_RESOURCE_OUTLET_AUTHORING_MANIFEST',
|
|
44928
|
+
},
|
|
43552
44929
|
tags: ['resource', 'surface', 'related-resource', 'runtime', 'metadata-driven'],
|
|
43553
44930
|
lib: '@praxisui/core',
|
|
43554
44931
|
};
|
|
@@ -43563,6 +44940,297 @@ function providePraxisRelatedResourceOutletMetadata() {
|
|
|
43563
44940
|
};
|
|
43564
44941
|
}
|
|
43565
44942
|
|
|
44943
|
+
const nullableTextSchema = {
|
|
44944
|
+
oneOf: [{ type: 'string' }, { type: 'null' }],
|
|
44945
|
+
};
|
|
44946
|
+
const presentationValidators = [
|
|
44947
|
+
'component-config-editor-respected',
|
|
44948
|
+
'editor-round-trip-preserve',
|
|
44949
|
+
];
|
|
44950
|
+
const PRAXIS_RELATED_RESOURCE_OUTLET_AUTHORING_MANIFEST = {
|
|
44951
|
+
schemaVersion: '1.0.0',
|
|
44952
|
+
componentId: 'praxis-related-resource-outlet',
|
|
44953
|
+
ownerPackage: '@praxisui/core',
|
|
44954
|
+
configSchemaId: 'PraxisRelatedResourceOutletPresentationInputs',
|
|
44955
|
+
manifestVersion: '1.0.0',
|
|
44956
|
+
runtimeInputs: [
|
|
44957
|
+
{ name: 'title', type: 'string | null', description: 'Optional visual title override.' },
|
|
44958
|
+
{ name: 'subtitle', type: 'string | null', description: 'Optional visual subtitle override.' },
|
|
44959
|
+
{ name: 'icon', type: 'string | null', description: 'Optional visual icon override.' },
|
|
44960
|
+
{ name: 'mode', type: "'inline' | 'open-action'", allowedValues: ['inline', 'open-action'], description: 'Outlet display mode.' },
|
|
44961
|
+
{ name: 'presentation', type: "'drawer' | 'modal'", allowedValues: ['drawer', 'modal'], description: 'Host-mediated presentation used by open-action mode.' },
|
|
44962
|
+
{ name: 'compact', type: 'boolean', allowedValues: [true, false], description: 'Compact visual density for non-materialized states.' },
|
|
44963
|
+
{
|
|
44964
|
+
name: 'emptyState',
|
|
44965
|
+
type: 'PraxisRelatedResourceOutletEmptyStatePresentation',
|
|
44966
|
+
description: 'Closed presentation-only empty-state subset. Actions, templates and contexts are not authorable here.',
|
|
44967
|
+
},
|
|
44968
|
+
],
|
|
44969
|
+
editableTargets: [
|
|
44970
|
+
{
|
|
44971
|
+
kind: 'relatedResourceOutletPresentation',
|
|
44972
|
+
resolver: 'component-config',
|
|
44973
|
+
description: 'Persisted visual shell inputs owned by the Related Resource Outlet config editor.',
|
|
44974
|
+
},
|
|
44975
|
+
{
|
|
44976
|
+
kind: 'relatedResourceOutletEmptyStatePresentation',
|
|
44977
|
+
resolver: 'component-config',
|
|
44978
|
+
description: 'Persisted presentation-only emptyState subset; opaque empty-state fields are preserved unchanged.',
|
|
44979
|
+
},
|
|
44980
|
+
],
|
|
44981
|
+
operations: [
|
|
44982
|
+
{
|
|
44983
|
+
operationId: 'related-resource-outlet.presentation.set-title',
|
|
44984
|
+
title: 'Set related-resource title',
|
|
44985
|
+
description: 'Sets only the persisted visual title; relationship metadata and runtime context remain unchanged.',
|
|
44986
|
+
scope: 'global',
|
|
44987
|
+
targetKind: 'relatedResourceOutletPresentation',
|
|
44988
|
+
target: {
|
|
44989
|
+
kind: 'relatedResourceOutletPresentation',
|
|
44990
|
+
resolver: 'component-config',
|
|
44991
|
+
ambiguityPolicy: 'fail',
|
|
44992
|
+
required: false,
|
|
44993
|
+
},
|
|
44994
|
+
inputSchema: {
|
|
44995
|
+
type: 'object',
|
|
44996
|
+
additionalProperties: false,
|
|
44997
|
+
required: ['value'],
|
|
44998
|
+
properties: { value: nullableTextSchema },
|
|
44999
|
+
},
|
|
45000
|
+
effects: [{ kind: 'set-value', path: 'title', inputPath: 'value' }],
|
|
45001
|
+
destructive: false,
|
|
45002
|
+
requiresConfirmation: false,
|
|
45003
|
+
validators: presentationValidators,
|
|
45004
|
+
affectedPaths: ['title'],
|
|
45005
|
+
submissionImpact: 'visual-only',
|
|
45006
|
+
preconditions: ['component-config-loaded'],
|
|
45007
|
+
},
|
|
45008
|
+
{
|
|
45009
|
+
operationId: 'related-resource-outlet.presentation.set-subtitle',
|
|
45010
|
+
title: 'Set related-resource subtitle',
|
|
45011
|
+
description: 'Sets only the persisted visual subtitle; relationship metadata and runtime context remain unchanged.',
|
|
45012
|
+
scope: 'global',
|
|
45013
|
+
targetKind: 'relatedResourceOutletPresentation',
|
|
45014
|
+
target: {
|
|
45015
|
+
kind: 'relatedResourceOutletPresentation',
|
|
45016
|
+
resolver: 'component-config',
|
|
45017
|
+
ambiguityPolicy: 'fail',
|
|
45018
|
+
required: false,
|
|
45019
|
+
},
|
|
45020
|
+
inputSchema: {
|
|
45021
|
+
type: 'object',
|
|
45022
|
+
additionalProperties: false,
|
|
45023
|
+
required: ['value'],
|
|
45024
|
+
properties: { value: nullableTextSchema },
|
|
45025
|
+
},
|
|
45026
|
+
effects: [{ kind: 'set-value', path: 'subtitle', inputPath: 'value' }],
|
|
45027
|
+
destructive: false,
|
|
45028
|
+
requiresConfirmation: false,
|
|
45029
|
+
validators: presentationValidators,
|
|
45030
|
+
affectedPaths: ['subtitle'],
|
|
45031
|
+
submissionImpact: 'visual-only',
|
|
45032
|
+
preconditions: ['component-config-loaded'],
|
|
45033
|
+
},
|
|
45034
|
+
{
|
|
45035
|
+
operationId: 'related-resource-outlet.presentation.set-icon',
|
|
45036
|
+
title: 'Set related-resource icon',
|
|
45037
|
+
description: 'Sets only the persisted visual icon; relationship metadata and runtime context remain unchanged.',
|
|
45038
|
+
scope: 'global',
|
|
45039
|
+
targetKind: 'relatedResourceOutletPresentation',
|
|
45040
|
+
target: {
|
|
45041
|
+
kind: 'relatedResourceOutletPresentation',
|
|
45042
|
+
resolver: 'component-config',
|
|
45043
|
+
ambiguityPolicy: 'fail',
|
|
45044
|
+
required: false,
|
|
45045
|
+
},
|
|
45046
|
+
inputSchema: {
|
|
45047
|
+
type: 'object',
|
|
45048
|
+
additionalProperties: false,
|
|
45049
|
+
required: ['value'],
|
|
45050
|
+
properties: { value: nullableTextSchema },
|
|
45051
|
+
},
|
|
45052
|
+
effects: [{ kind: 'set-value', path: 'icon', inputPath: 'value' }],
|
|
45053
|
+
destructive: false,
|
|
45054
|
+
requiresConfirmation: false,
|
|
45055
|
+
validators: presentationValidators,
|
|
45056
|
+
affectedPaths: ['icon'],
|
|
45057
|
+
submissionImpact: 'visual-only',
|
|
45058
|
+
preconditions: ['component-config-loaded'],
|
|
45059
|
+
},
|
|
45060
|
+
{
|
|
45061
|
+
operationId: 'related-resource-outlet.presentation.set-mode',
|
|
45062
|
+
title: 'Set related-resource display mode',
|
|
45063
|
+
description: 'Selects inline rendering or a host-mediated open action without changing the relationship or its operation.',
|
|
45064
|
+
scope: 'global',
|
|
45065
|
+
targetKind: 'relatedResourceOutletPresentation',
|
|
45066
|
+
target: {
|
|
45067
|
+
kind: 'relatedResourceOutletPresentation',
|
|
45068
|
+
resolver: 'component-config',
|
|
45069
|
+
ambiguityPolicy: 'fail',
|
|
45070
|
+
required: false,
|
|
45071
|
+
},
|
|
45072
|
+
inputSchema: {
|
|
45073
|
+
type: 'object',
|
|
45074
|
+
additionalProperties: false,
|
|
45075
|
+
required: ['value'],
|
|
45076
|
+
properties: { value: { enum: ['inline', 'open-action'] } },
|
|
45077
|
+
},
|
|
45078
|
+
effects: [{ kind: 'set-value', path: 'mode', inputPath: 'value' }],
|
|
45079
|
+
destructive: false,
|
|
45080
|
+
requiresConfirmation: false,
|
|
45081
|
+
validators: presentationValidators,
|
|
45082
|
+
affectedPaths: ['mode'],
|
|
45083
|
+
submissionImpact: 'visual-only',
|
|
45084
|
+
preconditions: ['component-config-loaded'],
|
|
45085
|
+
},
|
|
45086
|
+
{
|
|
45087
|
+
operationId: 'related-resource-outlet.presentation.set-open-presentation',
|
|
45088
|
+
title: 'Set related-resource open presentation',
|
|
45089
|
+
description: 'Selects drawer or modal for the host-mediated open payload without changing target resource semantics.',
|
|
45090
|
+
scope: 'global',
|
|
45091
|
+
targetKind: 'relatedResourceOutletPresentation',
|
|
45092
|
+
target: {
|
|
45093
|
+
kind: 'relatedResourceOutletPresentation',
|
|
45094
|
+
resolver: 'component-config',
|
|
45095
|
+
ambiguityPolicy: 'fail',
|
|
45096
|
+
required: false,
|
|
45097
|
+
},
|
|
45098
|
+
inputSchema: {
|
|
45099
|
+
type: 'object',
|
|
45100
|
+
additionalProperties: false,
|
|
45101
|
+
required: ['value'],
|
|
45102
|
+
properties: { value: { enum: ['drawer', 'modal'] } },
|
|
45103
|
+
},
|
|
45104
|
+
effects: [{ kind: 'set-value', path: 'presentation', inputPath: 'value' }],
|
|
45105
|
+
destructive: false,
|
|
45106
|
+
requiresConfirmation: false,
|
|
45107
|
+
validators: presentationValidators,
|
|
45108
|
+
affectedPaths: ['presentation'],
|
|
45109
|
+
submissionImpact: 'visual-only',
|
|
45110
|
+
preconditions: ['component-config-loaded'],
|
|
45111
|
+
},
|
|
45112
|
+
{
|
|
45113
|
+
operationId: 'related-resource-outlet.presentation.set-compact',
|
|
45114
|
+
title: 'Set compact related-resource states',
|
|
45115
|
+
description: 'Changes only the visual density of non-materialized outlet states.',
|
|
45116
|
+
scope: 'global',
|
|
45117
|
+
targetKind: 'relatedResourceOutletPresentation',
|
|
45118
|
+
target: {
|
|
45119
|
+
kind: 'relatedResourceOutletPresentation',
|
|
45120
|
+
resolver: 'component-config',
|
|
45121
|
+
ambiguityPolicy: 'fail',
|
|
45122
|
+
required: false,
|
|
45123
|
+
},
|
|
45124
|
+
inputSchema: {
|
|
45125
|
+
type: 'object',
|
|
45126
|
+
additionalProperties: false,
|
|
45127
|
+
required: ['value'],
|
|
45128
|
+
properties: { value: { type: 'boolean' } },
|
|
45129
|
+
},
|
|
45130
|
+
effects: [{ kind: 'set-value', path: 'compact', inputPath: 'value' }],
|
|
45131
|
+
destructive: false,
|
|
45132
|
+
requiresConfirmation: false,
|
|
45133
|
+
validators: presentationValidators,
|
|
45134
|
+
affectedPaths: ['compact'],
|
|
45135
|
+
submissionImpact: 'visual-only',
|
|
45136
|
+
preconditions: ['component-config-loaded'],
|
|
45137
|
+
},
|
|
45138
|
+
{
|
|
45139
|
+
operationId: 'related-resource-outlet.presentation.configure-empty-state',
|
|
45140
|
+
title: 'Configure related-resource empty-state presentation',
|
|
45141
|
+
description: 'Merges only the closed presentation subset; actions, contexts, images, templates and unknown fields remain opaque.',
|
|
45142
|
+
scope: 'global',
|
|
45143
|
+
targetKind: 'relatedResourceOutletEmptyStatePresentation',
|
|
45144
|
+
target: {
|
|
45145
|
+
kind: 'relatedResourceOutletEmptyStatePresentation',
|
|
45146
|
+
resolver: 'component-config',
|
|
45147
|
+
ambiguityPolicy: 'fail',
|
|
45148
|
+
required: false,
|
|
45149
|
+
},
|
|
45150
|
+
inputSchema: {
|
|
45151
|
+
type: 'object',
|
|
45152
|
+
additionalProperties: false,
|
|
45153
|
+
minProperties: 1,
|
|
45154
|
+
properties: {
|
|
45155
|
+
title: nullableTextSchema,
|
|
45156
|
+
message: nullableTextSchema,
|
|
45157
|
+
description: nullableTextSchema,
|
|
45158
|
+
icon: nullableTextSchema,
|
|
45159
|
+
tone: { oneOf: [{ enum: ['neutral', 'primary', 'secondary'] }, { type: 'null' }] },
|
|
45160
|
+
variant: { oneOf: [{ enum: ['card', 'inline', 'panel', 'transparent'] }, { type: 'null' }] },
|
|
45161
|
+
alignment: { oneOf: [{ enum: ['start', 'center'] }, { type: 'null' }] },
|
|
45162
|
+
density: { oneOf: [{ enum: ['compact', 'comfortable'] }, { type: 'null' }] },
|
|
45163
|
+
iconContainer: { oneOf: [{ enum: ['none', 'circle', 'soft'] }, { type: 'null' }] },
|
|
45164
|
+
},
|
|
45165
|
+
},
|
|
45166
|
+
effects: [{ kind: 'merge-object', path: 'emptyState' }],
|
|
45167
|
+
destructive: false,
|
|
45168
|
+
requiresConfirmation: false,
|
|
45169
|
+
validators: presentationValidators,
|
|
45170
|
+
affectedPaths: [
|
|
45171
|
+
'emptyState.title',
|
|
45172
|
+
'emptyState.message',
|
|
45173
|
+
'emptyState.description',
|
|
45174
|
+
'emptyState.icon',
|
|
45175
|
+
'emptyState.tone',
|
|
45176
|
+
'emptyState.variant',
|
|
45177
|
+
'emptyState.alignment',
|
|
45178
|
+
'emptyState.density',
|
|
45179
|
+
'emptyState.iconContainer',
|
|
45180
|
+
],
|
|
45181
|
+
submissionImpact: 'visual-only',
|
|
45182
|
+
preconditions: ['component-config-loaded'],
|
|
45183
|
+
},
|
|
45184
|
+
],
|
|
45185
|
+
validators: [
|
|
45186
|
+
{
|
|
45187
|
+
validatorId: 'component-config-editor-respected',
|
|
45188
|
+
level: 'error',
|
|
45189
|
+
code: 'RELATED_RESOURCE_OUTLET_CONFIG_EDITOR_RESPECTED',
|
|
45190
|
+
description: 'Only paths owned by the published config editor may be authored.',
|
|
45191
|
+
},
|
|
45192
|
+
{
|
|
45193
|
+
validatorId: 'editor-round-trip-preserve',
|
|
45194
|
+
level: 'error',
|
|
45195
|
+
code: 'RELATED_RESOURCE_OUTLET_EDITOR_ROUND_TRIP_PRESERVE',
|
|
45196
|
+
description: 'Save and reopen must preserve runtime, relationship, Table-owned and unknown persisted inputs without drift.',
|
|
45197
|
+
},
|
|
45198
|
+
],
|
|
45199
|
+
roundTripRequirements: [
|
|
45200
|
+
'Opening the editor must never materialize runtime inputs or mutate the persisted widget definition.',
|
|
45201
|
+
'Apply, Save, Reset and Reopen must preserve every input outside the presentation-only editor boundary byte-for-byte.',
|
|
45202
|
+
'parentResourceId, surfaceId, surface, parentRecord, queryContext, state, relationship semantics and tableConfig are never authorable by this manifest.',
|
|
45203
|
+
'Unknown root inputs and unknown or behavior-bearing emptyState fields remain opaque and are preserved unchanged.',
|
|
45204
|
+
],
|
|
45205
|
+
examples: [
|
|
45206
|
+
{
|
|
45207
|
+
id: 'set-related-resource-shell',
|
|
45208
|
+
request: 'Show the related participants inline with the title Participants and compact states.',
|
|
45209
|
+
operationId: 'related-resource-outlet.presentation.set-title',
|
|
45210
|
+
params: { value: 'Participants' },
|
|
45211
|
+
isPositive: true,
|
|
45212
|
+
},
|
|
45213
|
+
{
|
|
45214
|
+
id: 'set-related-resource-empty-state-copy',
|
|
45215
|
+
request: 'Use No participants yet as the empty-state title.',
|
|
45216
|
+
operationId: 'related-resource-outlet.presentation.configure-empty-state',
|
|
45217
|
+
params: { title: 'No participants yet' },
|
|
45218
|
+
isPositive: true,
|
|
45219
|
+
},
|
|
45220
|
+
{
|
|
45221
|
+
id: 'reject-related-resource-relationship-authoring',
|
|
45222
|
+
request: 'Change the child resource path, parent field, filter operation and tableConfig from this outlet editor.',
|
|
45223
|
+
operationId: 'related-resource-outlet.presentation.configure-empty-state',
|
|
45224
|
+
params: {
|
|
45225
|
+
childResourcePath: 'operations/participants',
|
|
45226
|
+
childParentField: 'missionId',
|
|
45227
|
+
tableConfig: { columns: [] },
|
|
45228
|
+
},
|
|
45229
|
+
isPositive: false,
|
|
45230
|
+
},
|
|
45231
|
+
],
|
|
45232
|
+
};
|
|
45233
|
+
|
|
43566
45234
|
class EmptyStateCardComponent {
|
|
43567
45235
|
icon = 'tab';
|
|
43568
45236
|
title = 'Sem configuração disponível';
|
|
@@ -43771,7 +45439,7 @@ class ResourceQuickConnectComponent {
|
|
|
43771
45439
|
</small>
|
|
43772
45440
|
}
|
|
43773
45441
|
</div>
|
|
43774
|
-
`, isInline: true, styles: [".pdx-quick-connect{display:grid;gap:12px;padding:12px;border-radius:12px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface)}.pdx-quick-connect__hint{color:var(--md-sys-color-on-surface-variant);font-size:.9rem}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type:
|
|
45442
|
+
`, isInline: true, styles: [".pdx-quick-connect{display:grid;gap:12px;padding:12px;border-radius:12px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface)}.pdx-quick-connect__hint{color:var(--md-sys-color-on-surface-variant);font-size:.9rem}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }] });
|
|
43775
45443
|
}
|
|
43776
45444
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: ResourceQuickConnectComponent, decorators: [{
|
|
43777
45445
|
type: Component,
|
|
@@ -43802,349 +45470,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
43802
45470
|
type: Input
|
|
43803
45471
|
}] } });
|
|
43804
45472
|
|
|
43805
|
-
const DEFAULT_ICONS = [
|
|
43806
|
-
'search', 'close', 'check', 'add', 'remove', 'delete', 'edit', 'save', 'cancel', 'warning', 'error', 'info', 'help',
|
|
43807
|
-
'face', 'person', 'account_circle', 'people', 'group', 'settings', 'home', 'menu', 'more_horiz', 'more_vert', 'refresh', 'arrow_back', 'arrow_forward', 'expand_more', 'expand_less', 'open_in_full', 'fullscreen', 'open_in_new',
|
|
43808
|
-
'star', 'star_half', 'star_border', 'favorite', 'favorite_border', 'thumb_up', 'thumb_down', 'share', 'send', 'ios_share', 'download', 'upload', 'file_upload', 'file_download',
|
|
43809
|
-
'shopping_cart', 'shopping_bag', 'store', 'storefront', 'local_mall', 'local_offer', 'attach_money', 'money', 'payments', 'price_change', 'receipt', 'receipt_long', 'request_quote', 'point_of_sale', 'credit_card', 'payment',
|
|
43810
|
-
'event', 'date_range', 'schedule', 'alarm', 'watch_later', 'pending_actions',
|
|
43811
|
-
'location_on', 'location_city', 'map', 'public', 'language', 'place', 'pin_drop', 'route', 'near_me', 'navigation', 'layers', 'terrain',
|
|
43812
|
-
'email', 'call', 'phone', 'chat', 'forum', 'mark_email_unread', 'mark_chat_unread',
|
|
43813
|
-
'wifi', 'bluetooth', 'cloud', 'cloud_upload', 'cloud_download', 'cloud_done', 'cloud_queue', 'cloud_sync', 'backup', 'bolt', 'lock', 'lock_open', 'visibility', 'visibility_off', 'vpn_key', 'key', 'fingerprint', 'shield', 'security', 'admin_panel_settings', 'privacy_tip', 'policy', 'verified',
|
|
43814
|
-
'label', 'bookmark', 'book', 'description', 'article', 'note', 'assignment', 'assignment_turned_in', 'assignment_ind', 'grading', 'subject',
|
|
43815
|
-
'home_max', 'home_work', 'dashboard', 'analytics', 'assessment', 'insert_chart', 'bar_chart', 'show_chart', 'timeline', 'insights', 'pie_chart', 'donut_large', 'donut_small',
|
|
43816
|
-
'inventory', 'inventory_2', 'list', 'reorder', 'filter_list', 'sort', 'tune', 'settings_applications', 'build', 'build_circle', 'construction', 'bug_report', 'code', 'terminal', 'data_object', 'dataset', 'storage',
|
|
43817
|
-
'rule', 'rule_folder', 'folder', 'folder_open', 'create_new_folder', 'drive_file_move', 'drive_file_rename_outline',
|
|
43818
|
-
'text_fields', 'title', 'format_bold', 'format_italic', 'format_underlined', 'format_list_bulleted', 'format_list_numbered', 'insert_link', 'link', 'attach_file', 'attachment',
|
|
43819
|
-
'image', 'photo', 'photo_camera', 'collections', 'slideshow', 'movie', 'videocam', 'play_arrow', 'pause', 'stop', 'fast_forward', 'fast_rewind', 'skip_next', 'skip_previous', 'volume_up', 'volume_off', 'equalizer', 'music_note', 'library_music',
|
|
43820
|
-
'notifications', 'notifications_active', 'notifications_off', 'do_not_disturb',
|
|
43821
|
-
'airplanemode_active', 'train', 'directions_car', 'directions_bus', 'directions_bike', 'directions_walk', 'directions_boat', 'local_taxi',
|
|
43822
|
-
];
|
|
43823
|
-
class PraxisIconPickerComponent {
|
|
43824
|
-
data;
|
|
43825
|
-
dialogRef;
|
|
43826
|
-
value;
|
|
43827
|
-
icons = DEFAULT_ICONS;
|
|
43828
|
-
selected = new EventEmitter();
|
|
43829
|
-
cancel = new EventEmitter();
|
|
43830
|
-
searchInput;
|
|
43831
|
-
query = '';
|
|
43832
|
-
filtered = [];
|
|
43833
|
-
selectedFamily = 'mi';
|
|
43834
|
-
constructor(data, dialogRef) {
|
|
43835
|
-
this.data = data;
|
|
43836
|
-
this.dialogRef = dialogRef;
|
|
43837
|
-
if (data) {
|
|
43838
|
-
this.value = data.value;
|
|
43839
|
-
if (Array.isArray(data.icons) && data.icons.length)
|
|
43840
|
-
this.icons = data.icons;
|
|
43841
|
-
const fam = this.familyFromValue(this.value);
|
|
43842
|
-
if (fam) {
|
|
43843
|
-
this.selectedFamily = fam.family;
|
|
43844
|
-
this.value = fam.name;
|
|
43845
|
-
}
|
|
43846
|
-
}
|
|
43847
|
-
this.query = (this.value || '').trim();
|
|
43848
|
-
this.onFilter();
|
|
43849
|
-
}
|
|
43850
|
-
onFilter() {
|
|
43851
|
-
const q = (this.query || '').trim().toLowerCase();
|
|
43852
|
-
this.filtered = !q ? [...this.icons] : this.icons.filter(i => i.toLowerCase().includes(q));
|
|
43853
|
-
}
|
|
43854
|
-
choose(icon) {
|
|
43855
|
-
const val = this.buildValue(icon);
|
|
43856
|
-
this.value = icon;
|
|
43857
|
-
if (this.dialogRef)
|
|
43858
|
-
this.dialogRef.close(val);
|
|
43859
|
-
else
|
|
43860
|
-
this.selected.emit(val);
|
|
43861
|
-
}
|
|
43862
|
-
onEsc(ev) {
|
|
43863
|
-
if (this.dialogRef) {
|
|
43864
|
-
ev.stopPropagation();
|
|
43865
|
-
ev.preventDefault();
|
|
43866
|
-
this.onCancel();
|
|
43867
|
-
}
|
|
43868
|
-
}
|
|
43869
|
-
onGlobalKey(ev) {
|
|
43870
|
-
if (ev.key !== '/')
|
|
43871
|
-
return;
|
|
43872
|
-
const target = ev.target;
|
|
43873
|
-
const tag = (target?.tagName || '').toLowerCase();
|
|
43874
|
-
if (tag === 'input' || tag === 'textarea' || target?.isContentEditable) {
|
|
43875
|
-
return;
|
|
43876
|
-
}
|
|
43877
|
-
ev.preventDefault();
|
|
43878
|
-
this.focusSearch();
|
|
43879
|
-
}
|
|
43880
|
-
confirmTyped() {
|
|
43881
|
-
const name = (this.query || '').trim();
|
|
43882
|
-
if (!name)
|
|
43883
|
-
return;
|
|
43884
|
-
const val = this.buildValue(name);
|
|
43885
|
-
if (this.dialogRef)
|
|
43886
|
-
this.dialogRef.close(val);
|
|
43887
|
-
else
|
|
43888
|
-
this.selected.emit(val);
|
|
43889
|
-
}
|
|
43890
|
-
isSelectedIcon(icon) {
|
|
43891
|
-
return (this.value || '').trim() === icon;
|
|
43892
|
-
}
|
|
43893
|
-
onFamilyChange(val) {
|
|
43894
|
-
const v = (typeof val === 'string' && val) ? val : 'mi';
|
|
43895
|
-
this.selectedFamily = v;
|
|
43896
|
-
}
|
|
43897
|
-
clear() {
|
|
43898
|
-
this.value = '';
|
|
43899
|
-
if (this.dialogRef)
|
|
43900
|
-
this.dialogRef.close('');
|
|
43901
|
-
else
|
|
43902
|
-
this.selected.emit('');
|
|
43903
|
-
}
|
|
43904
|
-
onCancel() {
|
|
43905
|
-
if (this.dialogRef)
|
|
43906
|
-
this.dialogRef.close(undefined);
|
|
43907
|
-
else
|
|
43908
|
-
this.cancel.emit();
|
|
43909
|
-
}
|
|
43910
|
-
// Helpers for family/prefix handling
|
|
43911
|
-
buildValue(name) {
|
|
43912
|
-
const n = (name || '').trim();
|
|
43913
|
-
if (!n)
|
|
43914
|
-
return n;
|
|
43915
|
-
const fam = this.selectedFamily === 'ms' ? 'mso' : this.selectedFamily;
|
|
43916
|
-
return fam === 'mi' ? n : `${fam}:${n}`;
|
|
43917
|
-
}
|
|
43918
|
-
previewValue() {
|
|
43919
|
-
return this.buildValue((this.query || '').trim());
|
|
43920
|
-
}
|
|
43921
|
-
iconClassForFamily(fam) {
|
|
43922
|
-
if (fam === 'ms' || fam === 'mso')
|
|
43923
|
-
return 'material-symbols-outlined';
|
|
43924
|
-
if (fam === 'msr')
|
|
43925
|
-
return 'material-symbols-rounded';
|
|
43926
|
-
if (fam === 'mss')
|
|
43927
|
-
return 'material-symbols-sharp';
|
|
43928
|
-
return 'material-icons';
|
|
43929
|
-
}
|
|
43930
|
-
focusSearch() {
|
|
43931
|
-
this.searchInput?.nativeElement?.focus();
|
|
43932
|
-
}
|
|
43933
|
-
familyFromValue(v) {
|
|
43934
|
-
const s = (v || '').trim();
|
|
43935
|
-
const i = s.indexOf(':');
|
|
43936
|
-
if (i <= 0)
|
|
43937
|
-
return null;
|
|
43938
|
-
const p = s.slice(0, i).toLowerCase();
|
|
43939
|
-
const name = s.slice(i + 1).trim();
|
|
43940
|
-
if (p === 'ms' || p === 'mso')
|
|
43941
|
-
return { family: 'mso', name };
|
|
43942
|
-
if (p === 'msr')
|
|
43943
|
-
return { family: 'msr', name };
|
|
43944
|
-
if (p === 'mss')
|
|
43945
|
-
return { family: 'mss', name };
|
|
43946
|
-
return { family: 'mi', name };
|
|
43947
|
-
}
|
|
43948
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisIconPickerComponent, deps: [{ token: MAT_DIALOG_DATA, optional: true }, { token: i1$4.MatDialogRef, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
43949
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisIconPickerComponent, isStandalone: true, selector: "praxis-icon-picker", inputs: { value: "value", icons: "icons" }, outputs: { selected: "selected", cancel: "cancel" }, host: { listeners: { "document:keydown.escape": "onEsc($event)", "document:keydown": "onGlobalKey($event)" } }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }], ngImport: i0, template: `
|
|
43950
|
-
<div class="pip-root">
|
|
43951
|
-
<div class="pip-head">
|
|
43952
|
-
<mat-form-field appearance="outline" class="pip-search">
|
|
43953
|
-
<mat-label>Buscar ícone</mat-label>
|
|
43954
|
-
<input
|
|
43955
|
-
#searchInput
|
|
43956
|
-
matInput
|
|
43957
|
-
[(ngModel)]="query"
|
|
43958
|
-
placeholder="ex.: star, schedule"
|
|
43959
|
-
(ngModelChange)="onFilter()"
|
|
43960
|
-
(keydown.enter)="confirmTyped()"
|
|
43961
|
-
/>
|
|
43962
|
-
</mat-form-field>
|
|
43963
|
-
<button mat-stroked-button color="primary" (click)="clear()">
|
|
43964
|
-
<mat-icon>backspace</mat-icon>
|
|
43965
|
-
<span>Limpar</span>
|
|
43966
|
-
</button>
|
|
43967
|
-
<a mat-stroked-button href="https://fonts.google.com/icons" target="_blank" rel="noopener noreferrer" matTooltip="Abrir Material Icons">
|
|
43968
|
-
<mat-icon>open_in_new</mat-icon>
|
|
43969
|
-
<span>Material Icons</span>
|
|
43970
|
-
</a>
|
|
43971
|
-
<span class="pip-spacer"></span>
|
|
43972
|
-
<div class="pip-family" role="group" aria-label="Estilo do ícone">
|
|
43973
|
-
<mat-chip-listbox [value]="selectedFamily" (change)="onFamilyChange($event.value)">
|
|
43974
|
-
<mat-chip-option value="mi">Icons</mat-chip-option>
|
|
43975
|
-
<mat-chip-option value="mso">Outlined</mat-chip-option>
|
|
43976
|
-
<mat-chip-option value="msr">Rounded</mat-chip-option>
|
|
43977
|
-
<mat-chip-option value="mss">Sharp</mat-chip-option>
|
|
43978
|
-
</mat-chip-listbox>
|
|
43979
|
-
</div>
|
|
43980
|
-
@if (dialogRef) {
|
|
43981
|
-
<button mat-stroked-button (click)="onCancel()">Cancelar</button>
|
|
43982
|
-
}
|
|
43983
|
-
</div>
|
|
43984
|
-
<div class="pip-hint muted">
|
|
43985
|
-
Dica: Se não encontrar aqui, abra o site oficial, copie o nome do ícone e cole na busca. Você pode confirmar o nome digitado mesmo que não esteja na lista.
|
|
43986
|
-
</div>
|
|
43987
|
-
<div class="pip-stats">
|
|
43988
|
-
<span>{{ filtered.length }} resultado(s)</span>
|
|
43989
|
-
<span class="pip-shortcut">Atalho: pressione / para focar a busca</span>
|
|
43990
|
-
</div>
|
|
43991
|
-
<div class="pip-body" role="grid" aria-label="Ícones disponíveis">
|
|
43992
|
-
@for (ic of filtered; track ic) {
|
|
43993
|
-
<button class="pip-item" (click)="choose(ic)" [class.selected]="isSelectedIcon(ic)" [attr.aria-label]="'Selecionar ícone ' + ic">
|
|
43994
|
-
<mat-icon [ngClass]="iconClassForFamily(selectedFamily)">{{ ic }}</mat-icon>
|
|
43995
|
-
<span class="pip-name">{{ ic }}</span>
|
|
43996
|
-
</button>
|
|
43997
|
-
}
|
|
43998
|
-
</div>
|
|
43999
|
-
@if (!filtered.length) {
|
|
44000
|
-
<div class="pip-empty">
|
|
44001
|
-
Nenhum ícone encontrado. Você pode usar o nome digitado mesmo assim.
|
|
44002
|
-
</div>
|
|
44003
|
-
}
|
|
44004
|
-
<div class="pip-footer">
|
|
44005
|
-
<button mat-flat-button color="primary" (click)="confirmTyped()" [disabled]="!query.trim()" aria-label="Usar nome digitado">
|
|
44006
|
-
<mat-icon>check</mat-icon>
|
|
44007
|
-
Usar nome digitado
|
|
44008
|
-
</button>
|
|
44009
|
-
@if (query.trim()) {
|
|
44010
|
-
<span class="pip-typed">{{ previewValue() }}</span>
|
|
44011
|
-
}
|
|
44012
|
-
</div>
|
|
44013
|
-
</div>
|
|
44014
|
-
`, isInline: true, styles: [".pip-root{display:flex;flex-direction:column;min-width:340px;max-width:760px;max-height:80vh;overflow:hidden;padding:16px;color:var(--md-sys-color-on-surface)}.pip-head{display:flex;gap:12px;align-items:center;margin-bottom:12px;flex-wrap:wrap}.pip-search{flex:1;min-width:180px}.pip-spacer{flex:1}.pip-body{flex:1;overflow:auto;display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:10px;padding:4px}.pip-item{display:flex;gap:10px;align-items:center;justify-content:flex-start;padding:10px;border:1px solid var(--md-sys-color-outline-variant);border-radius:10px;background:var(--md-sys-color-surface);color:inherit;cursor:pointer;transition:background-color .18s ease,border-color .18s ease,box-shadow .18s ease}.pip-item:hover{background:var(--md-sys-color-surface-container)}.pip-item:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pip-item.selected{border-color:var(--md-sys-color-primary);box-shadow:0 0 0 2px var(--md-sys-color-primary)}.pip-name{font-size:12px;color:var(--md-sys-color-on-surface-variant);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pip-hint{font-size:12px;color:var(--md-sys-color-on-surface-variant);margin:-6px 0 8px}.pip-stats{display:flex;justify-content:space-between;gap:8px;font-size:12px;color:var(--md-sys-color-on-surface-variant);margin-bottom:8px}.pip-shortcut{opacity:.9}.pip-empty{padding:12px;border:1px dashed var(--md-sys-color-outline-variant);border-radius:10px;color:var(--md-sys-color-on-surface-variant);background:var(--md-sys-color-surface-container);margin-top:8px}.pip-footer{display:flex;gap:12px;align-items:center;margin-top:10px}.pip-typed{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px;color:var(--md-sys-color-on-surface)}.pip-family{display:flex;align-items:center}.pip-family .mat-mdc-chip-listbox{min-width:260px}.pip-root .mat-icon{font-family:Material Icons,Material Symbols Outlined,Material Symbols Rounded,Material Symbols Sharp!important;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24;color:currentColor}.material-symbols-outlined{font-family:Material Symbols Outlined;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}.material-symbols-rounded{font-family:Material Symbols Rounded;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}.material-symbols-sharp{font-family:Material Symbols Sharp;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i8$1.MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: i8$1.MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { 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"] }] });
|
|
44015
|
-
}
|
|
44016
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisIconPickerComponent, decorators: [{
|
|
44017
|
-
type: Component,
|
|
44018
|
-
args: [{ selector: 'praxis-icon-picker', standalone: true, imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, MatIconModule, MatButtonModule, MatChipsModule, MatDialogModule, MatTooltipModule], template: `
|
|
44019
|
-
<div class="pip-root">
|
|
44020
|
-
<div class="pip-head">
|
|
44021
|
-
<mat-form-field appearance="outline" class="pip-search">
|
|
44022
|
-
<mat-label>Buscar ícone</mat-label>
|
|
44023
|
-
<input
|
|
44024
|
-
#searchInput
|
|
44025
|
-
matInput
|
|
44026
|
-
[(ngModel)]="query"
|
|
44027
|
-
placeholder="ex.: star, schedule"
|
|
44028
|
-
(ngModelChange)="onFilter()"
|
|
44029
|
-
(keydown.enter)="confirmTyped()"
|
|
44030
|
-
/>
|
|
44031
|
-
</mat-form-field>
|
|
44032
|
-
<button mat-stroked-button color="primary" (click)="clear()">
|
|
44033
|
-
<mat-icon>backspace</mat-icon>
|
|
44034
|
-
<span>Limpar</span>
|
|
44035
|
-
</button>
|
|
44036
|
-
<a mat-stroked-button href="https://fonts.google.com/icons" target="_blank" rel="noopener noreferrer" matTooltip="Abrir Material Icons">
|
|
44037
|
-
<mat-icon>open_in_new</mat-icon>
|
|
44038
|
-
<span>Material Icons</span>
|
|
44039
|
-
</a>
|
|
44040
|
-
<span class="pip-spacer"></span>
|
|
44041
|
-
<div class="pip-family" role="group" aria-label="Estilo do ícone">
|
|
44042
|
-
<mat-chip-listbox [value]="selectedFamily" (change)="onFamilyChange($event.value)">
|
|
44043
|
-
<mat-chip-option value="mi">Icons</mat-chip-option>
|
|
44044
|
-
<mat-chip-option value="mso">Outlined</mat-chip-option>
|
|
44045
|
-
<mat-chip-option value="msr">Rounded</mat-chip-option>
|
|
44046
|
-
<mat-chip-option value="mss">Sharp</mat-chip-option>
|
|
44047
|
-
</mat-chip-listbox>
|
|
44048
|
-
</div>
|
|
44049
|
-
@if (dialogRef) {
|
|
44050
|
-
<button mat-stroked-button (click)="onCancel()">Cancelar</button>
|
|
44051
|
-
}
|
|
44052
|
-
</div>
|
|
44053
|
-
<div class="pip-hint muted">
|
|
44054
|
-
Dica: Se não encontrar aqui, abra o site oficial, copie o nome do ícone e cole na busca. Você pode confirmar o nome digitado mesmo que não esteja na lista.
|
|
44055
|
-
</div>
|
|
44056
|
-
<div class="pip-stats">
|
|
44057
|
-
<span>{{ filtered.length }} resultado(s)</span>
|
|
44058
|
-
<span class="pip-shortcut">Atalho: pressione / para focar a busca</span>
|
|
44059
|
-
</div>
|
|
44060
|
-
<div class="pip-body" role="grid" aria-label="Ícones disponíveis">
|
|
44061
|
-
@for (ic of filtered; track ic) {
|
|
44062
|
-
<button class="pip-item" (click)="choose(ic)" [class.selected]="isSelectedIcon(ic)" [attr.aria-label]="'Selecionar ícone ' + ic">
|
|
44063
|
-
<mat-icon [ngClass]="iconClassForFamily(selectedFamily)">{{ ic }}</mat-icon>
|
|
44064
|
-
<span class="pip-name">{{ ic }}</span>
|
|
44065
|
-
</button>
|
|
44066
|
-
}
|
|
44067
|
-
</div>
|
|
44068
|
-
@if (!filtered.length) {
|
|
44069
|
-
<div class="pip-empty">
|
|
44070
|
-
Nenhum ícone encontrado. Você pode usar o nome digitado mesmo assim.
|
|
44071
|
-
</div>
|
|
44072
|
-
}
|
|
44073
|
-
<div class="pip-footer">
|
|
44074
|
-
<button mat-flat-button color="primary" (click)="confirmTyped()" [disabled]="!query.trim()" aria-label="Usar nome digitado">
|
|
44075
|
-
<mat-icon>check</mat-icon>
|
|
44076
|
-
Usar nome digitado
|
|
44077
|
-
</button>
|
|
44078
|
-
@if (query.trim()) {
|
|
44079
|
-
<span class="pip-typed">{{ previewValue() }}</span>
|
|
44080
|
-
}
|
|
44081
|
-
</div>
|
|
44082
|
-
</div>
|
|
44083
|
-
`, styles: [".pip-root{display:flex;flex-direction:column;min-width:340px;max-width:760px;max-height:80vh;overflow:hidden;padding:16px;color:var(--md-sys-color-on-surface)}.pip-head{display:flex;gap:12px;align-items:center;margin-bottom:12px;flex-wrap:wrap}.pip-search{flex:1;min-width:180px}.pip-spacer{flex:1}.pip-body{flex:1;overflow:auto;display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:10px;padding:4px}.pip-item{display:flex;gap:10px;align-items:center;justify-content:flex-start;padding:10px;border:1px solid var(--md-sys-color-outline-variant);border-radius:10px;background:var(--md-sys-color-surface);color:inherit;cursor:pointer;transition:background-color .18s ease,border-color .18s ease,box-shadow .18s ease}.pip-item:hover{background:var(--md-sys-color-surface-container)}.pip-item:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pip-item.selected{border-color:var(--md-sys-color-primary);box-shadow:0 0 0 2px var(--md-sys-color-primary)}.pip-name{font-size:12px;color:var(--md-sys-color-on-surface-variant);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pip-hint{font-size:12px;color:var(--md-sys-color-on-surface-variant);margin:-6px 0 8px}.pip-stats{display:flex;justify-content:space-between;gap:8px;font-size:12px;color:var(--md-sys-color-on-surface-variant);margin-bottom:8px}.pip-shortcut{opacity:.9}.pip-empty{padding:12px;border:1px dashed var(--md-sys-color-outline-variant);border-radius:10px;color:var(--md-sys-color-on-surface-variant);background:var(--md-sys-color-surface-container);margin-top:8px}.pip-footer{display:flex;gap:12px;align-items:center;margin-top:10px}.pip-typed{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px;color:var(--md-sys-color-on-surface)}.pip-family{display:flex;align-items:center}.pip-family .mat-mdc-chip-listbox{min-width:260px}.pip-root .mat-icon{font-family:Material Icons,Material Symbols Outlined,Material Symbols Rounded,Material Symbols Sharp!important;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24;color:currentColor}.material-symbols-outlined{font-family:Material Symbols Outlined;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}.material-symbols-rounded{font-family:Material Symbols Rounded;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}.material-symbols-sharp{font-family:Material Symbols Sharp;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}\n"] }]
|
|
44084
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
44085
|
-
type: Optional
|
|
44086
|
-
}, {
|
|
44087
|
-
type: Inject,
|
|
44088
|
-
args: [MAT_DIALOG_DATA]
|
|
44089
|
-
}] }, { type: i1$4.MatDialogRef, decorators: [{
|
|
44090
|
-
type: Optional
|
|
44091
|
-
}] }], propDecorators: { value: [{
|
|
44092
|
-
type: Input
|
|
44093
|
-
}], icons: [{
|
|
44094
|
-
type: Input
|
|
44095
|
-
}], selected: [{
|
|
44096
|
-
type: Output
|
|
44097
|
-
}], cancel: [{
|
|
44098
|
-
type: Output
|
|
44099
|
-
}], searchInput: [{
|
|
44100
|
-
type: ViewChild,
|
|
44101
|
-
args: ['searchInput']
|
|
44102
|
-
}], onEsc: [{
|
|
44103
|
-
type: HostListener,
|
|
44104
|
-
args: ['document:keydown.escape', ['$event']]
|
|
44105
|
-
}], onGlobalKey: [{
|
|
44106
|
-
type: HostListener,
|
|
44107
|
-
args: ['document:keydown', ['$event']]
|
|
44108
|
-
}] } });
|
|
44109
|
-
|
|
44110
|
-
class IconPickerService {
|
|
44111
|
-
dialog = inject(MatDialog);
|
|
44112
|
-
settings = inject(SETTINGS_PANEL_BRIDGE, { optional: true });
|
|
44113
|
-
openDialog(opts) {
|
|
44114
|
-
const ref = this.dialog.open(PraxisIconPickerComponent, {
|
|
44115
|
-
width: '720px',
|
|
44116
|
-
data: { value: opts?.value, icons: opts?.icons },
|
|
44117
|
-
});
|
|
44118
|
-
return ref.afterClosed().toPromise();
|
|
44119
|
-
}
|
|
44120
|
-
async openPanel(opts) {
|
|
44121
|
-
const id = opts?.id || 'icon-picker';
|
|
44122
|
-
const title = opts?.title || 'Escolher ícone';
|
|
44123
|
-
if (!this.settings) {
|
|
44124
|
-
// Fallback to dialog-only mode when bridge is not available
|
|
44125
|
-
return this.openDialog({ value: opts?.value, icons: opts?.icons });
|
|
44126
|
-
}
|
|
44127
|
-
const ref = this.settings.open({ id: `praxis-icon-picker:${id}`, title, content: { component: PraxisIconPickerComponent, inputs: { value: opts?.value, icons: opts?.icons } } });
|
|
44128
|
-
return new Promise((resolve) => {
|
|
44129
|
-
let resolved = false;
|
|
44130
|
-
ref.applied$.subscribe((val) => { if (!resolved) {
|
|
44131
|
-
resolved = true;
|
|
44132
|
-
resolve(val);
|
|
44133
|
-
} });
|
|
44134
|
-
ref.saved$.subscribe((val) => { if (!resolved) {
|
|
44135
|
-
resolved = true;
|
|
44136
|
-
resolve(val);
|
|
44137
|
-
} });
|
|
44138
|
-
});
|
|
44139
|
-
}
|
|
44140
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: IconPickerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
44141
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: IconPickerService, providedIn: 'root' });
|
|
44142
|
-
}
|
|
44143
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: IconPickerService, decorators: [{
|
|
44144
|
-
type: Injectable,
|
|
44145
|
-
args: [{ providedIn: 'root' }]
|
|
44146
|
-
}] });
|
|
44147
|
-
|
|
44148
45473
|
/** Optional DI token used by SchemaViewer when input is not provided. */
|
|
44149
45474
|
const SCHEMA_VIEWER_CONTEXT = new InjectionToken('SCHEMA_VIEWER_CONTEXT');
|
|
44150
45475
|
|
|
@@ -45059,4 +46384,4 @@ function provideHookWhitelist(allowed) {
|
|
|
45059
46384
|
* Generated bundle index. Do not edit.
|
|
45060
46385
|
*/
|
|
45061
46386
|
|
|
45062
|
-
export { API_CONFIG_STORAGE_OPTIONS, API_URL, ASYNC_CONFIG_STORAGE, AllowedFileTypes, AnalyticsPresentationResolver, AnalyticsSchemaContractService, AnalyticsStatsRequestBuilderService, ApiConfigStorage, ApiEndpoint, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, BUILTIN_SHELL_PRESETS, COMPONENT_METADATA_REGISTRY_I18N_CONFIG, COMPONENT_METADATA_REGISTRY_I18N_NAMESPACE, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentKeyService, ComponentMetadataRegistry, ComponentRuntimeProfileService, CompositionRuntimeFacade, CompositionValidatorService, ConsoleLoggerSink, CrudOperationResolutionService, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_JSON_LOGIC_OPERATORS, DEFAULT_TABLE_CONFIG, DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK, DOMAIN_CATALOG_CONTEXT_HINT_SCHEMA_VERSION, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DomainCatalogService, DomainKnowledgeService, DomainRuleService, DynamicFormService, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EDITORIAL_ALLOWED_CONTENT_FORMATS, EDITORIAL_COMPLIANCE_PRESETS, EDITORIAL_EXTERNAL_LINK_REL, EDITORIAL_FORM_TEMPLATE_CATALOG, EDITORIAL_HTML_ENABLED, EDITORIAL_MARKDOWN_IMAGES_ENABLED, EDITORIAL_SOLUTION_CATALOG, EDITORIAL_SOLUTION_PRESETS, EDITORIAL_THEME_PRESETS, EDITORIAL_WIDGET_CONVENTION_INPUTS, EDITORIAL_WIDGET_TAG, EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE, EVENT_REGISTRATION_EDITORIAL_SOLUTION, EVENT_REGISTRATION_EDITORIAL_TEMPLATE, EmptyStateCardComponent, EnterpriseRuntimeContextService, ErrorMessageService, FIELD_METADATA_CAPABILITIES, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, FIELD_SELECTOR_REGISTRY_OVERRIDES, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FieldSelectorRegistry, FormHooksRegistry, GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_UI_SCHEMAS, GLOBAL_ANALYTICS_SERVICE, GLOBAL_API_CLIENT, GLOBAL_CONFIG, GLOBAL_DIALOG_SERVICE, GLOBAL_ROUTE_GUARD_RESOLVER, GLOBAL_SURFACE_SERVICE, GLOBAL_TOAST_SERVICE, GenericCrudService, GlobalActionService, GlobalConfigService, INLINE_FILTER_ALIAS_TOKENS, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_SET, INLINE_FILTER_CONTROL_TYPE_VALUES, INLINE_FILTER_TOKEN_TO_BASE_CONTROL_TYPE, INLINE_FILTER_TOKEN_TO_CONTROL_TYPE, IconPickerService, IconPosition, IconSize, LOGGER_LEVEL_BY_ENV, LOGGER_LEVEL_PRIORITY, LoadingOrchestrator, LocalConnectionStorage, LocalStorageAsyncAdapter, LocalStorageCacheAdapter, LocalStorageConfigService, LoggerService, LoggerThrottleTracker, LoggerWarnOnceTracker, MemoryCacheAdapter, NestedPortCatalogService, NestedWidgetConfigAccessor, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, ObservabilityDashboardService, OverlayDeciderService, PRAXIS_ACTION_CONTROL_DEFAULTS, PRAXIS_ACTION_CONTROL_VARS, PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS, PRAXIS_COLLECTION_EXPORT_PROVIDER, PRAXIS_COLLECTION_SEARCH_DEFAULTS, PRAXIS_COLLECTION_SEARCH_VARS, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY, PRAXIS_EXPORT_FORMULA_PREFIXES, PRAXIS_EXPORT_SECURITY_POLICY, PRAXIS_FOOTER_LINKS_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_HERO_BANNER_METADATA, PRAXIS_I18N_CONFIG, PRAXIS_I18N_TRANSLATOR, PRAXIS_JSON_LOGIC_OPERATORS, PRAXIS_LAYER_SCALE_DEFAULTS, PRAXIS_LAYER_SCALE_VARS, PRAXIS_LEGAL_NOTICE_METADATA, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_QUERY_FILTER_EXPRESSION_SCHEMA_VERSION, PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA, PRAXIS_RELATED_RESOURCE_OUTLET_PORTS, PRAXIS_RICH_TEXT_BLOCK_METADATA, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, PRAXIS_TABLE_DETAIL_RESOURCE_RESOLVER, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_THEME_SURFACE_DEFAULTS, PRAXIS_THEME_SURFACE_VARS, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCollectionExportService, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisHttpCollectionExportProvider, PraxisI18nService, PraxisIconButtonComponent, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRelatedResourceOutletComponent, PraxisResourceIdentityComponent, PraxisRichTextBlockComponent, PraxisRuntimeComponentObservationRegistryService, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RelatedResourceSurfaceResolverService, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceRecordOpenError, ResourceRecordOpenService, ResourceSurfaceOpenAdapterService, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_DRAWER_CONTENT_DATA, SURFACE_DRAWER_REF, SURFACE_NAVIGATION_I18N_CONFIG, SURFACE_NAVIGATION_I18N_NAMESPACE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SurfaceBindingRuntimeService, SurfaceNavigationError, SurfaceOpenActionEditorComponent, SurfaceOpenMaterializerService, SurfaceOutletRegistryService, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, assertPraxisCollectionExportArtifact, assertPraxisRuntimeComponentObservationSerializable, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisActionControlCss, buildPraxisCollectionSearchCss, buildPraxisEffectDistinctKey, buildPraxisLayerScaleCss, buildPraxisThemeSurfaceCss, buildSchemaId, buildSchemaIdStorageKeySegment, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, classifyEntityLookupResult, clonePraxisRuntimeComponentObservation, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createFieldLayoutItem, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, domainKnowledgeTimelineToRichContentDocument, domainRuleTimelineToRichContentDocument, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, escapePraxisExportCell, evaluateFieldAccess, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getFormColumnFieldNames, getFormLayoutFieldNames, getGlobalActionCatalog, getGlobalActionPayloadActualType, getGlobalActionPayloadTypeIssue, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getPraxisTableCellVisualizationConstraint, getPraxisTableCellVisualizationGuidance, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isDomainRuleSnapshotProblemResponse, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisI18nMessageDescriptor, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, isProgrammaticDateRangePreset, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isStaticDateRangePreset, isSurfaceNavigationError, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, materializeFormLayoutFromMetadata, materializeResourceIdentity, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldAccessMetadata, normalizeFieldConstraints, normalizeFieldPresentation, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef$1 as normalizeGlobalActionRef, normalizeLayoutPolicy, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, normalizePraxisEffectPolicy, normalizePraxisPresentationVisualization, normalizePraxisQueryFilterExpression, normalizePraxisQueryFilterNode, normalizeReactiveDeterminations, normalizeResourceAvailabilityReasonCode, normalizeResourceIdentityContract, normalizeStart, normalizeSurfaceOperationContext, normalizeUnknownError, normalizeWidgetEventPath, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, projectGroupedCommandPartialRows, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisCollectionExportProvider, providePraxisDynamicPageMetadata, providePraxisEnterpriseRuntimeContext, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpCollectionExportProvider, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisJsonLogicOperatorOverride, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRelatedResourceOutletMetadata, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, readPraxisExportValue, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, registerPraxisRuntimeComponentObservation, removeDiacritics, renderPraxisPresentationVisualizationHtml, reportTelemetryHookFactory, requiredCheckedValidator, requiredPresenceValidator, resolveBuiltinPresets, resolveColumnTypeFromFieldDefinition, resolveControlTypeAlias, resolveDateRangeShortcutPreset, resolveDateRangeShortcutPresets, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveFieldPresentation, resolveGroupedCommandPartialRowSpans, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolvePraxisI18nDocument, resolveResourceAvailabilityReasonKey, resolveResourceIdentityContract, resolveSpan, resolveTextMaskFormat, resolveTextMaskFormatFromFieldDefinition, resolveValuePresentation, resolveValuePresentationLocale, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToExcel, serializePraxisCollectionToJson, slugify, staticDateRangePresetToPreset, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateSurfaceNavigationRejected, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withFormConfigSections, withMessage, withPraxisHttpLoading };
|
|
46387
|
+
export { API_CONFIG_STORAGE_OPTIONS, API_URL, ASYNC_CONFIG_STORAGE, AllowedFileTypes, AnalyticsPresentationResolver, AnalyticsSchemaContractService, AnalyticsStatsRequestBuilderService, ApiConfigStorage, ApiEndpoint, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, BUILTIN_SHELL_PRESETS, COMPONENT_METADATA_REGISTRY_I18N_CONFIG, COMPONENT_METADATA_REGISTRY_I18N_NAMESPACE, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentAuthoringManifestProjectionError, ComponentKeyService, ComponentMetadataRegistry, ComponentRuntimeProfileService, CompositionRuntimeFacade, CompositionValidatorService, ConsoleLoggerSink, CrudOperationResolutionService, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_JSON_LOGIC_OPERATORS, DEFAULT_TABLE_CONFIG, DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK, DOMAIN_CATALOG_CONTEXT_HINT_SCHEMA_VERSION, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DomainCatalogService, DomainKnowledgeService, DomainRuleService, DynamicFormService, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EDITORIAL_ALLOWED_CONTENT_FORMATS, EDITORIAL_COMPLIANCE_PRESETS, EDITORIAL_EXTERNAL_LINK_REL, EDITORIAL_FORM_TEMPLATE_CATALOG, EDITORIAL_HTML_ENABLED, EDITORIAL_MARKDOWN_IMAGES_ENABLED, EDITORIAL_SOLUTION_CATALOG, EDITORIAL_SOLUTION_PRESETS, EDITORIAL_THEME_PRESETS, EDITORIAL_WIDGET_CONVENTION_INPUTS, EDITORIAL_WIDGET_TAG, EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE, EVENT_REGISTRATION_EDITORIAL_SOLUTION, EVENT_REGISTRATION_EDITORIAL_TEMPLATE, EmptyStateCardComponent, EnterpriseRuntimeContextService, ErrorMessageService, FIELD_METADATA_CAPABILITIES, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, FIELD_SELECTOR_REGISTRY_OVERRIDES, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FieldSelectorRegistry, FormHooksRegistry, GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_UI_SCHEMAS, GLOBAL_ANALYTICS_SERVICE, GLOBAL_API_CLIENT, GLOBAL_CONFIG, GLOBAL_DIALOG_SERVICE, GLOBAL_ROUTE_GUARD_RESOLVER, GLOBAL_SURFACE_SERVICE, GLOBAL_TOAST_SERVICE, GenericCrudService, GlobalActionService, GlobalConfigService, INLINE_FILTER_ALIAS_TOKENS, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_SET, INLINE_FILTER_CONTROL_TYPE_VALUES, INLINE_FILTER_TOKEN_TO_BASE_CONTROL_TYPE, INLINE_FILTER_TOKEN_TO_CONTROL_TYPE, IconPickerService, IconPosition, IconSize, LOGGER_LEVEL_BY_ENV, LOGGER_LEVEL_PRIORITY, LoadingOrchestrator, LocalConnectionStorage, LocalStorageAsyncAdapter, LocalStorageCacheAdapter, LocalStorageConfigService, LoggerService, LoggerThrottleTracker, LoggerWarnOnceTracker, MemoryCacheAdapter, NestedPortCatalogService, NestedWidgetConfigAccessor, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, ObservabilityDashboardService, OverlayDeciderService, PRAXIS_ACTION_CONTROL_DEFAULTS, PRAXIS_ACTION_CONTROL_VARS, PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS, PRAXIS_COLLECTION_EXPORT_PROVIDER, PRAXIS_COLLECTION_SEARCH_DEFAULTS, PRAXIS_COLLECTION_SEARCH_VARS, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY, PRAXIS_EXPORT_FORMULA_PREFIXES, PRAXIS_EXPORT_SECURITY_POLICY, PRAXIS_FOOTER_LINKS_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_HERO_BANNER_METADATA, PRAXIS_I18N_CONFIG, PRAXIS_I18N_TRANSLATOR, PRAXIS_JSON_LOGIC_OPERATORS, PRAXIS_LAYER_SCALE_DEFAULTS, PRAXIS_LAYER_SCALE_VARS, PRAXIS_LEGAL_NOTICE_METADATA, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_QUERY_FILTER_EXPRESSION_SCHEMA_VERSION, PRAXIS_RELATED_RESOURCE_OUTLET_AUTHORING_MANIFEST, PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA, PRAXIS_RELATED_RESOURCE_OUTLET_PORTS, PRAXIS_RICH_TEXT_BLOCK_METADATA, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, PRAXIS_TABLE_DETAIL_RESOURCE_RESOLVER, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_THEME_SURFACE_DEFAULTS, PRAXIS_THEME_SURFACE_VARS, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCollectionExportService, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisHttpCollectionExportProvider, PraxisI18nService, PraxisIconButtonComponent, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRelatedResourceOutletComponent, PraxisRelatedResourceOutletConfigEditorComponent, PraxisResourceIdentityComponent, PraxisRichTextBlockComponent, PraxisRuntimeComponentObservationRegistryService, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RelatedResourceSurfaceResolverService, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceRecordOpenError, ResourceRecordOpenService, ResourceSurfaceOpenAdapterService, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_DRAWER_CONTENT_DATA, SURFACE_DRAWER_REF, SURFACE_NAVIGATION_I18N_CONFIG, SURFACE_NAVIGATION_I18N_NAMESPACE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SurfaceBindingRuntimeService, SurfaceNavigationError, SurfaceOpenActionEditorComponent, SurfaceOpenMaterializerService, SurfaceOutletRegistryService, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, assertPraxisCollectionExportArtifact, assertPraxisRuntimeComponentObservationSerializable, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisActionControlCss, buildPraxisCollectionSearchCss, buildPraxisEffectDistinctKey, buildPraxisLayerScaleCss, buildPraxisThemeSurfaceCss, buildSchemaId, buildSchemaIdStorageKeySegment, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, classifyEntityLookupResult, clonePraxisRuntimeComponentObservation, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createFieldLayoutItem, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, domainKnowledgeTimelineToRichContentDocument, domainRuleTimelineToRichContentDocument, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, escapePraxisExportCell, evaluateFieldAccess, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getFormColumnFieldNames, getFormLayoutFieldNames, getGlobalActionCatalog, getGlobalActionPayloadActualType, getGlobalActionPayloadTypeIssue, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getPraxisTableCellVisualizationConstraint, getPraxisTableCellVisualizationGuidance, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isDomainRuleSnapshotProblemResponse, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisI18nMessageDescriptor, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, isProgrammaticDateRangePreset, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isStaticDateRangePreset, isSurfaceNavigationError, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, materializeFormLayoutFromMetadata, materializeResourceIdentity, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldAccessMetadata, normalizeFieldConstraints, normalizeFieldPresentation, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef$1 as normalizeGlobalActionRef, normalizeLayoutPolicy, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, normalizePraxisEffectPolicy, normalizePraxisPresentationVisualization, normalizePraxisQueryFilterExpression, normalizePraxisQueryFilterNode, normalizeReactiveDeterminations, normalizeResourceAvailabilityReasonCode, normalizeResourceIdentityContract, normalizeStart, normalizeSurfaceOperationContext, normalizeUnknownError, normalizeWidgetEventPath, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, projectComponentAuthoringManifest, projectGroupedCommandPartialRows, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisCollectionExportProvider, providePraxisDynamicPageMetadata, providePraxisEnterpriseRuntimeContext, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpCollectionExportProvider, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisJsonLogicOperatorOverride, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRelatedResourceOutletMetadata, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, readPraxisExportValue, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, registerPraxisRuntimeComponentObservation, removeDiacritics, renderPraxisPresentationVisualizationHtml, reportTelemetryHookFactory, requiredCheckedValidator, requiredPresenceValidator, resolveBuiltinPresets, resolveColumnTypeFromFieldDefinition, resolveControlTypeAlias, resolveDateRangeShortcutPreset, resolveDateRangeShortcutPresets, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveFieldPresentation, resolveGroupedCommandPartialRowSpans, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolvePraxisI18nDocument, resolveResourceAvailabilityReasonKey, resolveResourceIdentityContract, resolveSpan, resolveTextMaskFormat, resolveTextMaskFormatFromFieldDefinition, resolveValuePresentation, resolveValuePresentationLocale, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToExcel, serializePraxisCollectionToJson, slugify, staticDateRangePresetToPreset, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateSurfaceNavigationRejected, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withFormConfigSections, withMessage, withPraxisHttpLoading };
|