@praxisui/core 9.0.0-beta.22 → 9.0.0-beta.26
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/ai/component-registry.json +4 -4
- package/fesm2022/praxisui-core.mjs +878 -202
- package/package.json +1 -1
- package/types/praxisui-core.d.ts +169 -19
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Component, InjectionToken, Injectable, inject, Inject, Optional, makeEnvironmentProviders, signal, computed, DestroyRef, ENVIRONMENT_INITIALIZER,
|
|
2
|
+
import { Component, InjectionToken, Injectable, inject, Inject, Optional, makeEnvironmentProviders, APP_INITIALIZER, signal, computed, DestroyRef, ENVIRONMENT_INITIALIZER, ErrorHandler, EventEmitter, Output, Input, ChangeDetectionStrategy, Directive, SecurityContext, ViewContainerRef, SimpleChange, ContentChild, HostBinding, HostListener, ViewChildren, ViewChild } from '@angular/core';
|
|
3
3
|
import * as i1 from '@angular/common/http';
|
|
4
4
|
import { HttpHeaders, HttpClient, HttpParams, HttpResponse, HttpContextToken, HTTP_INTERCEPTORS, withInterceptors } from '@angular/common/http';
|
|
5
5
|
import { of, defer, throwError, from, EMPTY, BehaviorSubject, firstValueFrom, Subject, map as map$1, switchMap as switchMap$1 } from 'rxjs';
|
|
@@ -12118,6 +12118,162 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
12118
12118
|
args: [{ providedIn: 'any' }]
|
|
12119
12119
|
}] });
|
|
12120
12120
|
|
|
12121
|
+
const PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS = new InjectionToken('PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS');
|
|
12122
|
+
const PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY = new InjectionToken('PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY');
|
|
12123
|
+
function providePraxisEnterpriseRuntimeContext(options = {}) {
|
|
12124
|
+
const normalized = {
|
|
12125
|
+
...options,
|
|
12126
|
+
includeGlobalFetchHeaders: options.includeGlobalFetchHeaders ?? true,
|
|
12127
|
+
blocking: options.blocking ?? false,
|
|
12128
|
+
errorPolicy: options.errorPolicy ?? 'ignore',
|
|
12129
|
+
};
|
|
12130
|
+
return [
|
|
12131
|
+
{ provide: PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS, useValue: normalized },
|
|
12132
|
+
{
|
|
12133
|
+
provide: PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY,
|
|
12134
|
+
useFactory: (service) => {
|
|
12135
|
+
let promise = null;
|
|
12136
|
+
return () => {
|
|
12137
|
+
if (promise)
|
|
12138
|
+
return promise;
|
|
12139
|
+
promise = service.ready().then(() => undefined);
|
|
12140
|
+
return promise;
|
|
12141
|
+
};
|
|
12142
|
+
},
|
|
12143
|
+
deps: [EnterpriseRuntimeContextService],
|
|
12144
|
+
},
|
|
12145
|
+
{
|
|
12146
|
+
provide: APP_INITIALIZER,
|
|
12147
|
+
multi: true,
|
|
12148
|
+
useFactory: (ready) => () => normalized.blocking ? ready() : undefined,
|
|
12149
|
+
deps: [PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY],
|
|
12150
|
+
},
|
|
12151
|
+
];
|
|
12152
|
+
}
|
|
12153
|
+
|
|
12154
|
+
class EnterpriseRuntimeContextService {
|
|
12155
|
+
http = inject(HttpClient);
|
|
12156
|
+
apiUrl = inject(API_URL, { optional: true });
|
|
12157
|
+
options = inject(PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS, {
|
|
12158
|
+
optional: true,
|
|
12159
|
+
});
|
|
12160
|
+
contextSubject = new BehaviorSubject(null);
|
|
12161
|
+
loadPromise = null;
|
|
12162
|
+
contextChanges$ = this.contextSubject.asObservable();
|
|
12163
|
+
get snapshot() {
|
|
12164
|
+
return this.contextSubject.value;
|
|
12165
|
+
}
|
|
12166
|
+
ready() {
|
|
12167
|
+
if (this.contextSubject.value) {
|
|
12168
|
+
return Promise.resolve(this.contextSubject.value);
|
|
12169
|
+
}
|
|
12170
|
+
if (this.loadPromise) {
|
|
12171
|
+
return this.loadPromise;
|
|
12172
|
+
}
|
|
12173
|
+
this.loadPromise = this.load()
|
|
12174
|
+
.catch((error) => {
|
|
12175
|
+
if ((this.options?.errorPolicy ?? 'ignore') === 'fail') {
|
|
12176
|
+
throw error;
|
|
12177
|
+
}
|
|
12178
|
+
return null;
|
|
12179
|
+
})
|
|
12180
|
+
.finally(() => {
|
|
12181
|
+
this.loadPromise = null;
|
|
12182
|
+
});
|
|
12183
|
+
return this.loadPromise;
|
|
12184
|
+
}
|
|
12185
|
+
refresh() {
|
|
12186
|
+
this.loadPromise = null;
|
|
12187
|
+
return this.load().catch((error) => {
|
|
12188
|
+
if ((this.options?.errorPolicy ?? 'ignore') === 'fail') {
|
|
12189
|
+
throw error;
|
|
12190
|
+
}
|
|
12191
|
+
return null;
|
|
12192
|
+
});
|
|
12193
|
+
}
|
|
12194
|
+
headers(fallback) {
|
|
12195
|
+
return {
|
|
12196
|
+
...this.normalizeHeaders(fallback ?? {}),
|
|
12197
|
+
...this.normalizeHeaders(this.headersFromSnapshot(this.contextSubject.value)),
|
|
12198
|
+
};
|
|
12199
|
+
}
|
|
12200
|
+
async load() {
|
|
12201
|
+
const context = await firstValueFrom(this.http.get(this.endpoint(), {
|
|
12202
|
+
headers: this.requestHeaders(),
|
|
12203
|
+
}));
|
|
12204
|
+
this.contextSubject.next(context ?? null);
|
|
12205
|
+
return context ?? null;
|
|
12206
|
+
}
|
|
12207
|
+
endpoint() {
|
|
12208
|
+
const configured = this.options?.endpoint?.trim();
|
|
12209
|
+
if (configured) {
|
|
12210
|
+
return configured.replace(/\/+$/, '');
|
|
12211
|
+
}
|
|
12212
|
+
const defaultEntry = this.apiUrl?.['default'];
|
|
12213
|
+
const base = defaultEntry ? buildApiUrl(defaultEntry) : '';
|
|
12214
|
+
if (base) {
|
|
12215
|
+
return `${base}/praxis/runtime/context`;
|
|
12216
|
+
}
|
|
12217
|
+
return '/api/praxis/runtime/context';
|
|
12218
|
+
}
|
|
12219
|
+
requestHeaders() {
|
|
12220
|
+
const merged = this.normalizeHeaders({
|
|
12221
|
+
...(this.options?.includeGlobalFetchHeaders ?? true ? this.globalFetchHeaders() : {}),
|
|
12222
|
+
...(this.options?.headersFactory?.() ?? {}),
|
|
12223
|
+
});
|
|
12224
|
+
let headers = new HttpHeaders();
|
|
12225
|
+
for (const [key, value] of Object.entries(merged)) {
|
|
12226
|
+
if (value) {
|
|
12227
|
+
headers = headers.set(key, value);
|
|
12228
|
+
}
|
|
12229
|
+
}
|
|
12230
|
+
return headers;
|
|
12231
|
+
}
|
|
12232
|
+
globalFetchHeaders() {
|
|
12233
|
+
try {
|
|
12234
|
+
const factory = globalThis.PAX_FETCH_HEADERS;
|
|
12235
|
+
return factory?.() ?? {};
|
|
12236
|
+
}
|
|
12237
|
+
catch {
|
|
12238
|
+
return {};
|
|
12239
|
+
}
|
|
12240
|
+
}
|
|
12241
|
+
headersFromSnapshot(context) {
|
|
12242
|
+
if (!context) {
|
|
12243
|
+
return {};
|
|
12244
|
+
}
|
|
12245
|
+
return {
|
|
12246
|
+
'X-Tenant-ID': context.activeTenant?.tenantId,
|
|
12247
|
+
'X-User-ID': context.user?.userId,
|
|
12248
|
+
'X-Env': context.environment ?? undefined,
|
|
12249
|
+
'Accept-Language': context.locale ?? undefined,
|
|
12250
|
+
'X-Timezone': context.timezone ?? undefined,
|
|
12251
|
+
'X-Praxis-Profile-ID': context.activeProfileId ?? undefined,
|
|
12252
|
+
'X-Praxis-Module-Key': context.activeModuleKey ?? undefined,
|
|
12253
|
+
};
|
|
12254
|
+
}
|
|
12255
|
+
normalizeHeaders(headers) {
|
|
12256
|
+
const normalized = {};
|
|
12257
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
12258
|
+
if (typeof value !== 'string') {
|
|
12259
|
+
continue;
|
|
12260
|
+
}
|
|
12261
|
+
const trimmed = value.trim();
|
|
12262
|
+
if (!trimmed) {
|
|
12263
|
+
continue;
|
|
12264
|
+
}
|
|
12265
|
+
normalized[key] = trimmed;
|
|
12266
|
+
}
|
|
12267
|
+
return normalized;
|
|
12268
|
+
}
|
|
12269
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EnterpriseRuntimeContextService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
12270
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EnterpriseRuntimeContextService, providedIn: 'root' });
|
|
12271
|
+
}
|
|
12272
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EnterpriseRuntimeContextService, decorators: [{
|
|
12273
|
+
type: Injectable,
|
|
12274
|
+
args: [{ providedIn: 'root' }]
|
|
12275
|
+
}] });
|
|
12276
|
+
|
|
12121
12277
|
function clonePraxisRuntimeComponentObservation(observation) {
|
|
12122
12278
|
assertPraxisRuntimeComponentObservationSerializable(observation);
|
|
12123
12279
|
return JSON.parse(JSON.stringify(observation));
|
|
@@ -12640,9 +12796,10 @@ class SurfaceOpenMaterializerService {
|
|
|
12640
12796
|
: null;
|
|
12641
12797
|
if (collectionData) {
|
|
12642
12798
|
if (this.shouldPreserveCollectionPresentation(payload)) {
|
|
12799
|
+
const preservedPayload = this.ensureCollectionTableSelectionContract(payload);
|
|
12643
12800
|
return {
|
|
12644
|
-
...
|
|
12645
|
-
context: this.mergeMaterializationContext(
|
|
12801
|
+
...preservedPayload,
|
|
12802
|
+
context: this.mergeMaterializationContext(preservedPayload, {
|
|
12646
12803
|
readUrl,
|
|
12647
12804
|
dataShape: 'array',
|
|
12648
12805
|
recordCount: collectionData.length,
|
|
@@ -12666,18 +12823,24 @@ class SurfaceOpenMaterializerService {
|
|
|
12666
12823
|
if (data && typeof data === 'object' && !Array.isArray(data)) {
|
|
12667
12824
|
const objectData = data;
|
|
12668
12825
|
if (payload.widget.id === 'praxis-dynamic-form') {
|
|
12669
|
-
const schemaFields = await this.resolveSchemaFields(payload, discoveryOptions);
|
|
12670
12826
|
return {
|
|
12671
12827
|
...payload,
|
|
12672
12828
|
widget: {
|
|
12673
12829
|
...payload.widget,
|
|
12674
12830
|
inputs: {
|
|
12675
12831
|
...this.projectMaterializedFormInputs(payload.widget.inputs || {}),
|
|
12676
|
-
configPersistenceStrategy: 'input-first',
|
|
12677
12832
|
mode: payload.widget.inputs?.['mode'] || 'view',
|
|
12678
12833
|
initialValue: objectData,
|
|
12679
12834
|
resourceId,
|
|
12680
|
-
|
|
12835
|
+
layoutPolicy: payload.widget.inputs?.['layoutPolicy'] || {
|
|
12836
|
+
source: 'schema',
|
|
12837
|
+
intent: 'detail',
|
|
12838
|
+
preset: 'compactPresentation',
|
|
12839
|
+
lifecycle: 'live',
|
|
12840
|
+
persistence: 'transient',
|
|
12841
|
+
schemaOperation: 'detail',
|
|
12842
|
+
schemaType: 'response',
|
|
12843
|
+
},
|
|
12681
12844
|
},
|
|
12682
12845
|
},
|
|
12683
12846
|
context: this.mergeMaterializationContext(payload, {
|
|
@@ -12715,11 +12878,14 @@ class SurfaceOpenMaterializerService {
|
|
|
12715
12878
|
'resourceId',
|
|
12716
12879
|
'apiEndpointKey',
|
|
12717
12880
|
'apiUrlEntry',
|
|
12881
|
+
'schemaUrl',
|
|
12882
|
+
'readUrl',
|
|
12718
12883
|
'submitUrl',
|
|
12719
12884
|
'submitMethod',
|
|
12720
12885
|
'responseSchemaUrl',
|
|
12721
12886
|
'customEndpoints',
|
|
12722
12887
|
'configPersistenceStrategy',
|
|
12888
|
+
'layoutPolicy',
|
|
12723
12889
|
'mode',
|
|
12724
12890
|
'actions',
|
|
12725
12891
|
'enableCustomization',
|
|
@@ -12727,6 +12893,7 @@ class SurfaceOpenMaterializerService {
|
|
|
12727
12893
|
'readonlyModeGlobal',
|
|
12728
12894
|
'disabledModeGlobal',
|
|
12729
12895
|
'presentationModeGlobal',
|
|
12896
|
+
'fieldIconPolicy',
|
|
12730
12897
|
'visibleGlobal',
|
|
12731
12898
|
'layout',
|
|
12732
12899
|
'backConfig',
|
|
@@ -12740,186 +12907,6 @@ class SurfaceOpenMaterializerService {
|
|
|
12740
12907
|
]);
|
|
12741
12908
|
return Object.fromEntries(Object.entries(inputs).filter(([key]) => supported.has(key)));
|
|
12742
12909
|
}
|
|
12743
|
-
buildLocalFormConfig(data, schemaFields = []) {
|
|
12744
|
-
const fields = this.buildMaterializedFormFields(data, schemaFields);
|
|
12745
|
-
const sections = this.buildMaterializedFormSections(fields);
|
|
12746
|
-
return {
|
|
12747
|
-
sections,
|
|
12748
|
-
fieldMetadata: fields,
|
|
12749
|
-
};
|
|
12750
|
-
}
|
|
12751
|
-
buildMaterializedFormFields(data, schemaFields) {
|
|
12752
|
-
const schemaByName = new Map(schemaFields
|
|
12753
|
-
.filter((field) => !!field?.name)
|
|
12754
|
-
.map((field) => [field.name, field]));
|
|
12755
|
-
const orderedNames = schemaFields.length
|
|
12756
|
-
? [
|
|
12757
|
-
...schemaFields
|
|
12758
|
-
.filter((field) => field?.name && Object.prototype.hasOwnProperty.call(data, field.name))
|
|
12759
|
-
.sort((left, right) => (left.order ?? Number.MAX_SAFE_INTEGER) - (right.order ?? Number.MAX_SAFE_INTEGER))
|
|
12760
|
-
.map((field) => field.name),
|
|
12761
|
-
...Object.keys(data).filter((key) => !schemaByName.has(key)),
|
|
12762
|
-
]
|
|
12763
|
-
: Object.keys(data);
|
|
12764
|
-
return orderedNames
|
|
12765
|
-
.filter((key, index, keys) => keys.indexOf(key) === index)
|
|
12766
|
-
.filter((key) => this.shouldRenderMaterializedFormField(key, data[key], schemaByName.get(key), data))
|
|
12767
|
-
.map((key) => {
|
|
12768
|
-
const field = schemaByName.get(key);
|
|
12769
|
-
if (field) {
|
|
12770
|
-
return {
|
|
12771
|
-
...mapFieldDefinitionToMetadata({
|
|
12772
|
-
...field,
|
|
12773
|
-
hidden: false,
|
|
12774
|
-
formHidden: false,
|
|
12775
|
-
readOnly: true,
|
|
12776
|
-
}),
|
|
12777
|
-
readOnly: true,
|
|
12778
|
-
};
|
|
12779
|
-
}
|
|
12780
|
-
return {
|
|
12781
|
-
name: key,
|
|
12782
|
-
label: this.humanizeFieldName(key),
|
|
12783
|
-
controlType: this.inferFormControlType(data[key]),
|
|
12784
|
-
readOnly: true,
|
|
12785
|
-
};
|
|
12786
|
-
});
|
|
12787
|
-
}
|
|
12788
|
-
buildMaterializedFormSections(fields) {
|
|
12789
|
-
const groups = new Map();
|
|
12790
|
-
for (const field of fields) {
|
|
12791
|
-
const group = String(field.group || '').trim() || 'Detalhes';
|
|
12792
|
-
groups.set(group, [...(groups.get(group) || []), field]);
|
|
12793
|
-
}
|
|
12794
|
-
return Array.from(groups.entries()).map(([group, groupFields], sectionIndex) => {
|
|
12795
|
-
const fieldNames = groupFields.map((field) => field.name);
|
|
12796
|
-
const rows = this.chunk(fieldNames, 2).map((names, rowIndex) => ({
|
|
12797
|
-
id: `row-${sectionIndex + 1}-${rowIndex + 1}`,
|
|
12798
|
-
columns: names.map((name) => ({
|
|
12799
|
-
id: `col-${name}`,
|
|
12800
|
-
fields: [name],
|
|
12801
|
-
})),
|
|
12802
|
-
}));
|
|
12803
|
-
return {
|
|
12804
|
-
id: this.stableSectionId(group, sectionIndex),
|
|
12805
|
-
title: group,
|
|
12806
|
-
rows,
|
|
12807
|
-
};
|
|
12808
|
-
});
|
|
12809
|
-
}
|
|
12810
|
-
shouldRenderMaterializedFormField(key, value, field, data) {
|
|
12811
|
-
if (!key || key.startsWith('_'))
|
|
12812
|
-
return false;
|
|
12813
|
-
if (field?.hidden === true)
|
|
12814
|
-
return false;
|
|
12815
|
-
if (this.isTechnicalRelationIdField(key, field, data))
|
|
12816
|
-
return false;
|
|
12817
|
-
if (this.isDuplicateMediaUrlField(key, value, field, data))
|
|
12818
|
-
return false;
|
|
12819
|
-
if (field?.formHidden === true && !this.isResolvedDisplayCompanionField(key, data)) {
|
|
12820
|
-
return false;
|
|
12821
|
-
}
|
|
12822
|
-
if (value == null)
|
|
12823
|
-
return true;
|
|
12824
|
-
return typeof value !== 'object' || value instanceof Date;
|
|
12825
|
-
}
|
|
12826
|
-
isTechnicalRelationIdField(key, field, data) {
|
|
12827
|
-
if (key === 'id' || !/Id$/.test(key))
|
|
12828
|
-
return false;
|
|
12829
|
-
const base = key.slice(0, -2);
|
|
12830
|
-
const hasDisplayCompanion = this.hasDisplayCompanion(base, data);
|
|
12831
|
-
if (!hasDisplayCompanion)
|
|
12832
|
-
return false;
|
|
12833
|
-
const controlType = String(field?.controlType || '').toLowerCase();
|
|
12834
|
-
return Boolean(field?.endpoint
|
|
12835
|
-
|| field?.resourcePath
|
|
12836
|
-
|| field?.optionSource
|
|
12837
|
-
|| controlType.includes('select')
|
|
12838
|
-
|| field?.tableHidden === true);
|
|
12839
|
-
}
|
|
12840
|
-
isResolvedDisplayCompanionField(key, data) {
|
|
12841
|
-
const base = this.resolveDisplayCompanionBase(key);
|
|
12842
|
-
return !!base && Object.prototype.hasOwnProperty.call(data, `${base}Id`);
|
|
12843
|
-
}
|
|
12844
|
-
resolveDisplayCompanionBase(key) {
|
|
12845
|
-
const suffixes = ['Nome', 'Name', 'Label', 'Descricao', 'Description', 'Title', 'Text'];
|
|
12846
|
-
const suffix = suffixes.find((candidate) => key.endsWith(candidate));
|
|
12847
|
-
return suffix ? key.slice(0, -suffix.length) : null;
|
|
12848
|
-
}
|
|
12849
|
-
hasDisplayCompanion(base, data) {
|
|
12850
|
-
const suffixes = ['Nome', 'Name', 'Label', 'Descricao', 'Description', 'Title', 'Text'];
|
|
12851
|
-
return suffixes.some((suffix) => {
|
|
12852
|
-
const value = data[`${base}${suffix}`];
|
|
12853
|
-
return value != null && String(value).trim().length > 0;
|
|
12854
|
-
});
|
|
12855
|
-
}
|
|
12856
|
-
isDuplicateMediaUrlField(key, value, field, data) {
|
|
12857
|
-
if (typeof value !== 'string' || !this.looksLikeMediaUrlField(key, field)) {
|
|
12858
|
-
return false;
|
|
12859
|
-
}
|
|
12860
|
-
return Object.entries(data).some(([candidateKey, candidateValue]) => {
|
|
12861
|
-
if (candidateKey === key || candidateValue !== value) {
|
|
12862
|
-
return false;
|
|
12863
|
-
}
|
|
12864
|
-
return this.looksLikeAvatarFieldName(candidateKey);
|
|
12865
|
-
});
|
|
12866
|
-
}
|
|
12867
|
-
looksLikeMediaUrlField(key, field) {
|
|
12868
|
-
const type = String(field?.type || '').toLowerCase();
|
|
12869
|
-
const controlType = String(field?.controlType || '').toLowerCase();
|
|
12870
|
-
const normalized = key.toLowerCase();
|
|
12871
|
-
return Boolean(type === 'url'
|
|
12872
|
-
|| controlType.includes('url')
|
|
12873
|
-
|| normalized.includes('url')
|
|
12874
|
-
|| normalized.includes('foto')
|
|
12875
|
-
|| normalized.includes('photo')
|
|
12876
|
-
|| normalized.includes('image')
|
|
12877
|
-
|| normalized.includes('imagem'));
|
|
12878
|
-
}
|
|
12879
|
-
looksLikeAvatarFieldName(key) {
|
|
12880
|
-
const normalized = key.toLowerCase();
|
|
12881
|
-
return normalized.includes('avatar') || normalized.includes('portrait');
|
|
12882
|
-
}
|
|
12883
|
-
inferFormControlType(value) {
|
|
12884
|
-
if (typeof value === 'boolean')
|
|
12885
|
-
return 'checkbox';
|
|
12886
|
-
if (typeof value === 'number')
|
|
12887
|
-
return 'numericTextBox';
|
|
12888
|
-
if (typeof value === 'string') {
|
|
12889
|
-
if (/^\d{4}-\d{2}-\d{2}$/.test(value))
|
|
12890
|
-
return 'dateInput';
|
|
12891
|
-
if (/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(value))
|
|
12892
|
-
return 'email';
|
|
12893
|
-
}
|
|
12894
|
-
return 'input';
|
|
12895
|
-
}
|
|
12896
|
-
humanizeFieldName(key) {
|
|
12897
|
-
return key
|
|
12898
|
-
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
12899
|
-
.replace(/[_-]+/g, ' ')
|
|
12900
|
-
.replace(/\s+/g, ' ')
|
|
12901
|
-
.trim()
|
|
12902
|
-
.replace(/^./, (char) => char.toUpperCase());
|
|
12903
|
-
}
|
|
12904
|
-
stableSectionId(group, index) {
|
|
12905
|
-
if (group === 'Detalhes') {
|
|
12906
|
-
return 'details';
|
|
12907
|
-
}
|
|
12908
|
-
const normalized = group
|
|
12909
|
-
.normalize('NFD')
|
|
12910
|
-
.replace(/[\u0300-\u036f]/g, '')
|
|
12911
|
-
.toLowerCase()
|
|
12912
|
-
.replace(/[^a-z0-9]+/g, '-')
|
|
12913
|
-
.replace(/^-+|-+$/g, '');
|
|
12914
|
-
return normalized || `details-${index + 1}`;
|
|
12915
|
-
}
|
|
12916
|
-
chunk(items, size) {
|
|
12917
|
-
const result = [];
|
|
12918
|
-
for (let index = 0; index < items.length; index += size) {
|
|
12919
|
-
result.push(items.slice(index, index + size));
|
|
12920
|
-
}
|
|
12921
|
-
return result;
|
|
12922
|
-
}
|
|
12923
12910
|
shouldMaterializeItemReadProjection(payload) {
|
|
12924
12911
|
const surface = payload.context?.['surface'];
|
|
12925
12912
|
const kind = String(surface?.['kind'] || '').toUpperCase();
|
|
@@ -13002,6 +12989,8 @@ class SurfaceOpenMaterializerService {
|
|
|
13002
12989
|
bindingOrder: [
|
|
13003
12990
|
'tableId',
|
|
13004
12991
|
'componentInstanceId',
|
|
12992
|
+
'configPersistenceStrategy',
|
|
12993
|
+
'resourcePath',
|
|
13005
12994
|
'title',
|
|
13006
12995
|
'subtitle',
|
|
13007
12996
|
'icon',
|
|
@@ -13009,11 +12998,17 @@ class SurfaceOpenMaterializerService {
|
|
|
13009
12998
|
'config',
|
|
13010
12999
|
'enableCustomization',
|
|
13011
13000
|
],
|
|
13001
|
+
outputs: {
|
|
13002
|
+
rowClick: 'emit',
|
|
13003
|
+
selectionChange: 'emit',
|
|
13004
|
+
widgetEvent: 'emit',
|
|
13005
|
+
},
|
|
13012
13006
|
inputs: {
|
|
13013
13007
|
...tableInputOverrides,
|
|
13014
13008
|
resourcePath: '',
|
|
13015
13009
|
tableId: String(previousInputs['tableId'] || this.stableSurfaceId(payload)),
|
|
13016
13010
|
componentInstanceId: `${this.stableSurfaceId(payload)}.${resourceId}`,
|
|
13011
|
+
configPersistenceStrategy: previousInputs['configPersistenceStrategy'] ?? 'volatile',
|
|
13017
13012
|
title: payload.title,
|
|
13018
13013
|
subtitle: payload.subtitle,
|
|
13019
13014
|
icon: payload.icon,
|
|
@@ -13029,6 +13024,52 @@ class SurfaceOpenMaterializerService {
|
|
|
13029
13024
|
}),
|
|
13030
13025
|
};
|
|
13031
13026
|
}
|
|
13027
|
+
ensureCollectionTableSelectionContract(payload) {
|
|
13028
|
+
if (payload.widget?.id !== 'praxis-table') {
|
|
13029
|
+
return payload;
|
|
13030
|
+
}
|
|
13031
|
+
const inputs = payload.widget.inputs || {};
|
|
13032
|
+
return {
|
|
13033
|
+
...payload,
|
|
13034
|
+
widget: {
|
|
13035
|
+
...payload.widget,
|
|
13036
|
+
outputs: {
|
|
13037
|
+
...(payload.widget.outputs || {}),
|
|
13038
|
+
rowClick: 'emit',
|
|
13039
|
+
selectionChange: 'emit',
|
|
13040
|
+
widgetEvent: 'emit',
|
|
13041
|
+
},
|
|
13042
|
+
inputs: {
|
|
13043
|
+
...inputs,
|
|
13044
|
+
config: this.ensureTableSelectionConfig(inputs['config']),
|
|
13045
|
+
},
|
|
13046
|
+
},
|
|
13047
|
+
};
|
|
13048
|
+
}
|
|
13049
|
+
ensureTableSelectionConfig(config) {
|
|
13050
|
+
if (!config || typeof config !== 'object' || Array.isArray(config)) {
|
|
13051
|
+
return config;
|
|
13052
|
+
}
|
|
13053
|
+
const tableConfig = config;
|
|
13054
|
+
const rawBehavior = tableConfig['behavior'];
|
|
13055
|
+
const behavior = (rawBehavior && typeof rawBehavior === 'object' && !Array.isArray(rawBehavior)
|
|
13056
|
+
? rawBehavior
|
|
13057
|
+
: {});
|
|
13058
|
+
if (behavior['selection'] && typeof behavior['selection'] === 'object') {
|
|
13059
|
+
return config;
|
|
13060
|
+
}
|
|
13061
|
+
return {
|
|
13062
|
+
...tableConfig,
|
|
13063
|
+
behavior: {
|
|
13064
|
+
...behavior,
|
|
13065
|
+
selection: {
|
|
13066
|
+
enabled: true,
|
|
13067
|
+
type: 'single',
|
|
13068
|
+
mode: 'both',
|
|
13069
|
+
},
|
|
13070
|
+
},
|
|
13071
|
+
};
|
|
13072
|
+
}
|
|
13032
13073
|
projectTableInputs(inputs) {
|
|
13033
13074
|
const supported = new Set([
|
|
13034
13075
|
'tableId',
|
|
@@ -13065,6 +13106,11 @@ class SurfaceOpenMaterializerService {
|
|
|
13065
13106
|
behavior: {
|
|
13066
13107
|
localDataMode: { enabled: true },
|
|
13067
13108
|
pagination: { enabled: true, pageSize: 10 },
|
|
13109
|
+
selection: {
|
|
13110
|
+
enabled: true,
|
|
13111
|
+
type: 'single',
|
|
13112
|
+
mode: 'both',
|
|
13113
|
+
},
|
|
13068
13114
|
},
|
|
13069
13115
|
};
|
|
13070
13116
|
}
|
|
@@ -16247,10 +16293,16 @@ const VISUALIZATION_TONES = new Set([
|
|
|
16247
16293
|
'critical',
|
|
16248
16294
|
]);
|
|
16249
16295
|
const TABLE_SAFE_KINDS = new Set([
|
|
16296
|
+
'line',
|
|
16297
|
+
'area',
|
|
16298
|
+
'column',
|
|
16250
16299
|
'comparison',
|
|
16251
16300
|
'stackedBar',
|
|
16301
|
+
'radial',
|
|
16302
|
+
'harveyBall',
|
|
16252
16303
|
'bullet',
|
|
16253
16304
|
'delta',
|
|
16305
|
+
'processFlow',
|
|
16254
16306
|
]);
|
|
16255
16307
|
function normalizePraxisPresentationVisualization(value) {
|
|
16256
16308
|
if (!value || typeof value !== 'object') {
|
|
@@ -16265,6 +16317,7 @@ function normalizePraxisPresentationVisualization(value) {
|
|
|
16265
16317
|
const size = normalizeEnum$1(value.size, VISUALIZATION_SIZES);
|
|
16266
16318
|
const tone = normalizeEnum$1(value.tone, VISUALIZATION_TONES);
|
|
16267
16319
|
const ariaLabel = normalizeText$1(value.ariaLabel);
|
|
16320
|
+
const valueSuffix = normalizeText$1(value.valueSuffix);
|
|
16268
16321
|
return {
|
|
16269
16322
|
kind,
|
|
16270
16323
|
fallbackText,
|
|
@@ -16272,8 +16325,10 @@ function normalizePraxisPresentationVisualization(value) {
|
|
|
16272
16325
|
...(size ? { size } : {}),
|
|
16273
16326
|
...(tone ? { tone } : {}),
|
|
16274
16327
|
...(ariaLabel ? { ariaLabel } : {}),
|
|
16328
|
+
...(valueSuffix ? { valueSuffix } : {}),
|
|
16275
16329
|
...(Object.prototype.hasOwnProperty.call(value, 'value') ? { value: value.value } : {}),
|
|
16276
16330
|
...(normalizeExpression(value.valueExpr, 'valueExpr') ?? {}),
|
|
16331
|
+
...(normalizeExpression(value.valueSuffixExpr, 'valueSuffixExpr') ?? {}),
|
|
16277
16332
|
...(normalizeNumber(value.total, 'total') ?? {}),
|
|
16278
16333
|
...(normalizeExpression(value.totalExpr, 'totalExpr') ?? {}),
|
|
16279
16334
|
...(normalizeNumber(value.target, 'target') ?? {}),
|
|
@@ -16311,6 +16366,18 @@ function renderPraxisPresentationVisualizationHtml(value, options = {}) {
|
|
|
16311
16366
|
return renderBulletVisualizationHtml(visualization, options);
|
|
16312
16367
|
case 'delta':
|
|
16313
16368
|
return renderDeltaVisualizationHtml(visualization, options);
|
|
16369
|
+
case 'radial':
|
|
16370
|
+
return renderRadialVisualizationHtml(visualization, options);
|
|
16371
|
+
case 'harveyBall':
|
|
16372
|
+
return renderHarveyBallVisualizationHtml(visualization, options);
|
|
16373
|
+
case 'line':
|
|
16374
|
+
return renderLineVisualizationHtml(visualization, options);
|
|
16375
|
+
case 'area':
|
|
16376
|
+
return renderAreaVisualizationHtml(visualization, options);
|
|
16377
|
+
case 'column':
|
|
16378
|
+
return renderColumnVisualizationHtml(visualization, options);
|
|
16379
|
+
case 'processFlow':
|
|
16380
|
+
return renderProcessFlowVisualizationHtml(visualization, options);
|
|
16314
16381
|
default:
|
|
16315
16382
|
return `<span class="pfx-micro-viz__fallback">${escapeHtml$1(visualization.fallbackText)}</span>`;
|
|
16316
16383
|
}
|
|
@@ -16357,26 +16424,61 @@ function renderStackedBarVisualizationHtml(visualization, options) {
|
|
|
16357
16424
|
<span class="pfx-micro-viz__meta">${meta}</span>
|
|
16358
16425
|
</span>`;
|
|
16359
16426
|
}
|
|
16427
|
+
function resolveBulletMax(visualization) {
|
|
16428
|
+
const thresholds = visualization.thresholds ?? [];
|
|
16429
|
+
const values = [
|
|
16430
|
+
toFiniteNumber(visualization.value) ?? 0,
|
|
16431
|
+
visualization.target ?? 0,
|
|
16432
|
+
visualization.total ?? 0,
|
|
16433
|
+
...thresholds.map(t => t.value)
|
|
16434
|
+
].filter(v => Number.isFinite(v) && v > 0);
|
|
16435
|
+
return Math.max(...values, 100);
|
|
16436
|
+
}
|
|
16360
16437
|
function renderBulletVisualizationHtml(visualization, options) {
|
|
16361
16438
|
const currentValue = toFiniteNumber(visualization.value) ?? 0;
|
|
16362
|
-
const
|
|
16439
|
+
const max = resolveBulletMax(visualization);
|
|
16363
16440
|
const target = toFiniteNumber(visualization.target);
|
|
16364
|
-
const targetLeft = target === undefined ? null : percent(target,
|
|
16441
|
+
const targetLeft = target === undefined ? null : percent(target, max);
|
|
16442
|
+
const isTable = visualization.surface === 'table-cell';
|
|
16443
|
+
// thresholds
|
|
16444
|
+
const thresholds = visualization.thresholds ?? [];
|
|
16445
|
+
let previous = 0;
|
|
16446
|
+
const bands = thresholds.map(t => {
|
|
16447
|
+
const current = Math.max(t.value, previous);
|
|
16448
|
+
const left = max > 0 ? percent(previous, max) : '0';
|
|
16449
|
+
const width = max > 0 ? percent(current - previous, max) : '0';
|
|
16450
|
+
previous = current;
|
|
16451
|
+
return { left, width, tone: t.tone ?? 'info' };
|
|
16452
|
+
}).filter(b => parseFloat(b.width) > 0);
|
|
16453
|
+
const bandsHtml = bands.map(b => `<span class="pfx-micro-bullet__range" data-tone="${escapeHtml$1(b.tone)}" style="left: ${b.left}%; width: ${b.width}%;"></span>`).join('');
|
|
16454
|
+
const topHtml = isTable ? '' : `
|
|
16455
|
+
<div class="pfx-micro-bullet__top">
|
|
16456
|
+
<span class="pfx-micro-bullet__label">${escapeHtml$1(visualization.fallbackText)}</span>
|
|
16457
|
+
<span class="pfx-micro-bullet__value">
|
|
16458
|
+
${escapeHtml$1(formatMicroNumber(currentValue, options.locale))}
|
|
16459
|
+
${target === undefined ? '' : `<span class="pfx-micro-bullet__target-val">/ Target: ${escapeHtml$1(formatMicroNumber(target, options.locale))}</span>`}
|
|
16460
|
+
</span>
|
|
16461
|
+
</div>`;
|
|
16462
|
+
const bottomHtml = isTable ? '' : `
|
|
16463
|
+
<div class="pfx-micro-bullet__bottom">
|
|
16464
|
+
<span>${escapeHtml$1(formatMicroNumber(visualization.baseline ?? 0, options.locale))}</span>
|
|
16465
|
+
<span>${escapeHtml$1(formatMicroNumber(max, options.locale))}</span>
|
|
16466
|
+
</div>`;
|
|
16365
16467
|
return `
|
|
16366
16468
|
<span class="pfx-micro-viz pfx-micro-viz__bullet" data-tone="${escapeHtml$1(visualization.tone ?? 'info')}" role="img" aria-label="${escapeHtml$1(visualization.ariaLabel ?? visualization.fallbackText)}">
|
|
16367
|
-
|
|
16368
|
-
|
|
16369
|
-
${
|
|
16370
|
-
|
|
16371
|
-
|
|
16372
|
-
<span>${escapeHtml$1(formatMicroNumber(currentValue, options.locale))}</span>
|
|
16373
|
-
${target === undefined ? '' : `<span>${escapeHtml$1(formatMicroNumber(target, options.locale))}</span>`}
|
|
16469
|
+
${topHtml}
|
|
16470
|
+
<span class="pfx-micro-bullet__track">
|
|
16471
|
+
${bandsHtml}
|
|
16472
|
+
<span class="pfx-micro-bullet__actual" data-tone="${escapeHtml$1(visualization.tone ?? 'info')}" style="width: ${percent(currentValue, max)}%;"></span>
|
|
16473
|
+
${targetLeft === null ? '' : `<span class="pfx-micro-bullet__target" style="left: ${targetLeft}%;"></span>`}
|
|
16374
16474
|
</span>
|
|
16475
|
+
${bottomHtml}
|
|
16375
16476
|
</span>`;
|
|
16376
16477
|
}
|
|
16377
16478
|
function renderDeltaVisualizationHtml(visualization, options) {
|
|
16378
16479
|
const value = toFiniteNumber(visualization.value);
|
|
16379
|
-
const
|
|
16480
|
+
const direction = value === undefined ? 'neutral' : value < 0 ? 'down' : value > 0 ? 'up' : 'neutral';
|
|
16481
|
+
const symbol = direction === 'up' ? '▲' : direction === 'down' ? '▼' : '→';
|
|
16380
16482
|
const tone = visualization.tone ??
|
|
16381
16483
|
(value === undefined
|
|
16382
16484
|
? 'neutral'
|
|
@@ -16385,12 +16487,19 @@ function renderDeltaVisualizationHtml(visualization, options) {
|
|
|
16385
16487
|
: value > 0
|
|
16386
16488
|
? 'success'
|
|
16387
16489
|
: 'neutral');
|
|
16490
|
+
const valueSuffix = visualization.valueSuffix ?? '';
|
|
16388
16491
|
const text = value === undefined
|
|
16389
16492
|
? visualization.fallbackText
|
|
16390
|
-
: formatMicroNumber(value, options.locale)
|
|
16493
|
+
: `${formatMicroNumber(Math.abs(value), options.locale)}${valueSuffix}`;
|
|
16494
|
+
const directionLabel = direction === 'up'
|
|
16495
|
+
? 'up'
|
|
16496
|
+
: direction === 'down'
|
|
16497
|
+
? 'down'
|
|
16498
|
+
: 'stable';
|
|
16499
|
+
const aria = visualization.ariaLabel ?? `${visualization.fallbackText}: ${directionLabel} ${text}`;
|
|
16391
16500
|
return `
|
|
16392
|
-
<span class="pfx-micro-viz pfx-micro-viz__delta" data-tone="${escapeHtml$1(tone)}" role="img" aria-label="${escapeHtml$1(
|
|
16393
|
-
<span class="pfx-micro-viz__delta-symbol">${symbol}</span>
|
|
16501
|
+
<span class="pfx-micro-viz pfx-micro-viz__delta" data-tone="${escapeHtml$1(tone)}" data-direction="${escapeHtml$1(direction)}" role="img" aria-label="${escapeHtml$1(aria)}">
|
|
16502
|
+
<span class="pfx-micro-viz__delta-symbol" aria-hidden="true">${symbol}</span>
|
|
16394
16503
|
<span>${escapeHtml$1(text)}</span>
|
|
16395
16504
|
</span>`;
|
|
16396
16505
|
}
|
|
@@ -16505,6 +16614,268 @@ function normalizeText$1(value) {
|
|
|
16505
16614
|
const trimmed = value.trim();
|
|
16506
16615
|
return trimmed.length ? trimmed : undefined;
|
|
16507
16616
|
}
|
|
16617
|
+
function renderRadialVisualizationHtml(visualization, options) {
|
|
16618
|
+
const value = toFiniteNumber(visualization.value) ?? 0;
|
|
16619
|
+
const total = visualization.total && visualization.total > 0 ? visualization.total : 100;
|
|
16620
|
+
const pct = Math.max(0, Math.min(100, (value / total) * 100));
|
|
16621
|
+
const tone = visualization.tone ?? 'info';
|
|
16622
|
+
const dashArray = `${pct.toFixed(1)}, 100`;
|
|
16623
|
+
const pctText = `${Math.round(pct)}%`;
|
|
16624
|
+
const aria = visualization.ariaLabel ?? `${visualization.fallbackText} (${pctText})`;
|
|
16625
|
+
const isTable = visualization.surface === 'table-cell';
|
|
16626
|
+
const svgText = isTable
|
|
16627
|
+
? ''
|
|
16628
|
+
: `<text x="18" y="21" class="pfx-micro-radial-svg__text">${escapeHtml$1(pctText)}</text>`;
|
|
16629
|
+
const externalText = isTable
|
|
16630
|
+
? `<span class="pfx-micro-radial-value">${escapeHtml$1(pctText)}</span>`
|
|
16631
|
+
: '';
|
|
16632
|
+
return `
|
|
16633
|
+
<span class="pfx-micro-viz pfx-micro-viz__radial" data-tone="${escapeHtml$1(tone)}" role="img" aria-label="${escapeHtml$1(aria)}">
|
|
16634
|
+
<svg class="pfx-micro-radial-svg" viewBox="0 0 36 36">
|
|
16635
|
+
<circle class="pfx-micro-radial-svg__track" cx="18" cy="18" r="15.9155" />
|
|
16636
|
+
<circle class="pfx-micro-radial-svg__bar" cx="18" cy="18" r="15.9155" stroke-dasharray="${dashArray}" transform="rotate(-90 18 18)" />
|
|
16637
|
+
${svgText}
|
|
16638
|
+
</svg>
|
|
16639
|
+
${externalText}
|
|
16640
|
+
</span>`;
|
|
16641
|
+
}
|
|
16642
|
+
function renderHarveyBallVisualizationHtml(visualization, options) {
|
|
16643
|
+
const value = toFiniteNumber(visualization.value) ?? 0;
|
|
16644
|
+
const total = visualization.total && visualization.total > 0 ? visualization.total : 100;
|
|
16645
|
+
const pct = Math.max(0, Math.min(100, (value / total) * 100));
|
|
16646
|
+
const tone = visualization.tone ?? 'info';
|
|
16647
|
+
const strokeLength = pct * 0.50265;
|
|
16648
|
+
const dashArray = `${strokeLength.toFixed(3)} 50.265`;
|
|
16649
|
+
const aria = visualization.ariaLabel ?? `${visualization.fallbackText} (${Math.round(pct)}%)`;
|
|
16650
|
+
return `
|
|
16651
|
+
<span class="pfx-micro-viz pfx-micro-viz__harvey" data-tone="${escapeHtml$1(tone)}" role="img" aria-label="${escapeHtml$1(aria)}">
|
|
16652
|
+
<svg class="pfx-micro-harvey-svg" viewBox="0 0 36 36">
|
|
16653
|
+
<circle class="pfx-micro-harvey-svg__track" cx="18" cy="18" r="16" />
|
|
16654
|
+
<circle class="pfx-micro-harvey-svg__bar" cx="18" cy="18" r="8" stroke-dasharray="${dashArray}" transform="rotate(-90 18 18)" />
|
|
16655
|
+
</svg>
|
|
16656
|
+
<span class="pfx-micro-harvey-fraction">
|
|
16657
|
+
<strong>${escapeHtml$1(formatMicroNumber(value, options.locale))}</strong>
|
|
16658
|
+
<span class="pfx-separator">/</span>
|
|
16659
|
+
<span class="pfx-total">${escapeHtml$1(formatMicroNumber(total, options.locale))}</span>
|
|
16660
|
+
</span>
|
|
16661
|
+
</span>`;
|
|
16662
|
+
}
|
|
16663
|
+
function getPointsCoordinates(points, width, height, padding) {
|
|
16664
|
+
if (points.length < 2)
|
|
16665
|
+
return [];
|
|
16666
|
+
const values = points.map(p => p.value);
|
|
16667
|
+
const minVal = Math.min(...values);
|
|
16668
|
+
const maxVal = Math.max(...values);
|
|
16669
|
+
const valRange = maxVal - minVal === 0 ? 1 : maxVal - minVal;
|
|
16670
|
+
return points.map((p, index) => {
|
|
16671
|
+
const x = padding + (index / (points.length - 1)) * (width - 2 * padding);
|
|
16672
|
+
const y = height - padding - ((p.value - minVal) / valRange) * (height - 2 * padding);
|
|
16673
|
+
return { x, y };
|
|
16674
|
+
});
|
|
16675
|
+
}
|
|
16676
|
+
function renderLineVisualizationHtml(visualization, options) {
|
|
16677
|
+
const points = visualization.points ?? [];
|
|
16678
|
+
const tone = visualization.tone ?? 'info';
|
|
16679
|
+
if (points.length < 2) {
|
|
16680
|
+
return renderFallbackVisualizationHtml(visualization, tone);
|
|
16681
|
+
}
|
|
16682
|
+
const width = 100;
|
|
16683
|
+
const height = 30;
|
|
16684
|
+
const padding = 4;
|
|
16685
|
+
const coords = getPointsCoordinates(points, width, height, padding);
|
|
16686
|
+
const pathD = coords.map((c, i) => `${i === 0 ? 'M' : 'L'} ${c.x.toFixed(1)} ${c.y.toFixed(1)}`).join(' ');
|
|
16687
|
+
// Highlight extreme/boundary values
|
|
16688
|
+
let minIdx = 0;
|
|
16689
|
+
let maxIdx = 0;
|
|
16690
|
+
for (let i = 1; i < points.length; i++) {
|
|
16691
|
+
if (points[i].value < points[minIdx].value)
|
|
16692
|
+
minIdx = i;
|
|
16693
|
+
if (points[i].value > points[maxIdx].value)
|
|
16694
|
+
maxIdx = i;
|
|
16695
|
+
}
|
|
16696
|
+
const markers = [
|
|
16697
|
+
{ x: coords[0].x, y: coords[0].y, tone: points[0].tone ?? tone },
|
|
16698
|
+
{ x: coords[coords.length - 1].x, y: coords[coords.length - 1].y, tone: points[points.length - 1].tone ?? tone }
|
|
16699
|
+
];
|
|
16700
|
+
if (minIdx !== 0 && minIdx !== coords.length - 1) {
|
|
16701
|
+
markers.push({ x: coords[minIdx].x, y: coords[minIdx].y, tone: points[minIdx].tone ?? 'danger' });
|
|
16702
|
+
}
|
|
16703
|
+
if (maxIdx !== 0 && maxIdx !== coords.length - 1) {
|
|
16704
|
+
markers.push({ x: coords[maxIdx].x, y: coords[maxIdx].y, tone: points[maxIdx].tone ?? 'success' });
|
|
16705
|
+
}
|
|
16706
|
+
const circlesHtml = markers.map(c => `<circle cx="${c.x.toFixed(1)}" cy="${c.y.toFixed(1)}" r="2.5" class="pfx-micro-trend__marker" data-tone="${escapeHtml$1(c.tone)}" />`).join('');
|
|
16707
|
+
const isTable = visualization.surface === 'table-cell';
|
|
16708
|
+
const firstPoint = points[0];
|
|
16709
|
+
const lastPoint = points[points.length - 1];
|
|
16710
|
+
const leftHtml = isTable ? '' : `
|
|
16711
|
+
<div class="pfx-micro-trend__label-col pfx-micro-trend__label-col--start">
|
|
16712
|
+
<span class="pfx-micro-trend__value">${escapeHtml$1(formatMicroNumber(firstPoint.value, options.locale))}</span>
|
|
16713
|
+
${firstPoint.label ? `<span class="pfx-micro-trend__label">${escapeHtml$1(firstPoint.label)}</span>` : ''}
|
|
16714
|
+
</div>`;
|
|
16715
|
+
const rightHtml = isTable ? '' : `
|
|
16716
|
+
<div class="pfx-micro-trend__label-col pfx-micro-trend__label-col--end">
|
|
16717
|
+
<span class="pfx-micro-trend__value">${escapeHtml$1(formatMicroNumber(lastPoint.value, options.locale))}</span>
|
|
16718
|
+
${lastPoint.label ? `<span class="pfx-micro-trend__label">${escapeHtml$1(lastPoint.label)}</span>` : ''}
|
|
16719
|
+
</div>`;
|
|
16720
|
+
return `
|
|
16721
|
+
<span class="pfx-micro-viz-container">
|
|
16722
|
+
${leftHtml}
|
|
16723
|
+
<span class="pfx-micro-viz pfx-micro-viz__line" data-tone="${escapeHtml$1(tone)}" role="img" aria-label="${escapeHtml$1(visualization.ariaLabel ?? visualization.fallbackText)}">
|
|
16724
|
+
<svg class="pfx-micro-line__svg" viewBox="0 0 100 30">
|
|
16725
|
+
<path class="pfx-micro-line__path" d="${pathD}" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
|
|
16726
|
+
${circlesHtml}
|
|
16727
|
+
</svg>
|
|
16728
|
+
</span>
|
|
16729
|
+
${rightHtml}
|
|
16730
|
+
</span>`;
|
|
16731
|
+
}
|
|
16732
|
+
function renderAreaVisualizationHtml(visualization, options) {
|
|
16733
|
+
const points = visualization.points ?? [];
|
|
16734
|
+
const tone = visualization.tone ?? 'info';
|
|
16735
|
+
if (points.length < 2) {
|
|
16736
|
+
return renderFallbackVisualizationHtml(visualization, tone);
|
|
16737
|
+
}
|
|
16738
|
+
const width = 100;
|
|
16739
|
+
const height = 30;
|
|
16740
|
+
const padding = 4;
|
|
16741
|
+
const coords = getPointsCoordinates(points, width, height, padding);
|
|
16742
|
+
const lineD = coords.map((c, i) => `${i === 0 ? 'M' : 'L'} ${c.x.toFixed(1)} ${c.y.toFixed(1)}`).join(' ');
|
|
16743
|
+
const firstX = coords[0].x.toFixed(1);
|
|
16744
|
+
const lastX = coords[coords.length - 1].x.toFixed(1);
|
|
16745
|
+
const areaD = `${lineD} L ${lastX} ${height} L ${firstX} ${height} Z`;
|
|
16746
|
+
// Highlight extreme/boundary values
|
|
16747
|
+
let minIdx = 0;
|
|
16748
|
+
let maxIdx = 0;
|
|
16749
|
+
for (let i = 1; i < points.length; i++) {
|
|
16750
|
+
if (points[i].value < points[minIdx].value)
|
|
16751
|
+
minIdx = i;
|
|
16752
|
+
if (points[i].value > points[maxIdx].value)
|
|
16753
|
+
maxIdx = i;
|
|
16754
|
+
}
|
|
16755
|
+
const markers = [
|
|
16756
|
+
{ x: coords[0].x, y: coords[0].y, tone: points[0].tone ?? tone },
|
|
16757
|
+
{ x: coords[coords.length - 1].x, y: coords[coords.length - 1].y, tone: points[points.length - 1].tone ?? tone }
|
|
16758
|
+
];
|
|
16759
|
+
if (minIdx !== 0 && minIdx !== coords.length - 1) {
|
|
16760
|
+
markers.push({ x: coords[minIdx].x, y: coords[minIdx].y, tone: points[minIdx].tone ?? 'danger' });
|
|
16761
|
+
}
|
|
16762
|
+
if (maxIdx !== 0 && maxIdx !== coords.length - 1) {
|
|
16763
|
+
markers.push({ x: coords[maxIdx].x, y: coords[maxIdx].y, tone: points[maxIdx].tone ?? 'success' });
|
|
16764
|
+
}
|
|
16765
|
+
const circlesHtml = markers.map(c => `<circle cx="${c.x.toFixed(1)}" cy="${c.y.toFixed(1)}" r="2.5" class="pfx-micro-trend__marker" data-tone="${escapeHtml$1(c.tone)}" />`).join('');
|
|
16766
|
+
const isTable = visualization.surface === 'table-cell';
|
|
16767
|
+
const firstPoint = points[0];
|
|
16768
|
+
const lastPoint = points[points.length - 1];
|
|
16769
|
+
const leftHtml = isTable ? '' : `
|
|
16770
|
+
<div class="pfx-micro-trend__label-col pfx-micro-trend__label-col--start">
|
|
16771
|
+
<span class="pfx-micro-trend__value">${escapeHtml$1(formatMicroNumber(firstPoint.value, options.locale))}</span>
|
|
16772
|
+
${firstPoint.label ? `<span class="pfx-micro-trend__label">${escapeHtml$1(firstPoint.label)}</span>` : ''}
|
|
16773
|
+
</div>`;
|
|
16774
|
+
const rightHtml = isTable ? '' : `
|
|
16775
|
+
<div class="pfx-micro-trend__label-col pfx-micro-trend__label-col--end">
|
|
16776
|
+
<span class="pfx-micro-trend__value">${escapeHtml$1(formatMicroNumber(lastPoint.value, options.locale))}</span>
|
|
16777
|
+
${lastPoint.label ? `<span class="pfx-micro-trend__label">${escapeHtml$1(lastPoint.label)}</span>` : ''}
|
|
16778
|
+
</div>`;
|
|
16779
|
+
return `
|
|
16780
|
+
<span class="pfx-micro-viz-container">
|
|
16781
|
+
${leftHtml}
|
|
16782
|
+
<span class="pfx-micro-viz pfx-micro-viz__area" data-tone="${escapeHtml$1(tone)}" role="img" aria-label="${escapeHtml$1(visualization.ariaLabel ?? visualization.fallbackText)}">
|
|
16783
|
+
<svg class="pfx-micro-area__svg" viewBox="0 0 100 30">
|
|
16784
|
+
<path class="pfx-micro-area__fill" d="${areaD}" fill="currentColor" fill-opacity="0.15" />
|
|
16785
|
+
<path class="pfx-micro-area__path" d="${lineD}" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
|
|
16786
|
+
${circlesHtml}
|
|
16787
|
+
</svg>
|
|
16788
|
+
</span>
|
|
16789
|
+
${rightHtml}
|
|
16790
|
+
</span>`;
|
|
16791
|
+
}
|
|
16792
|
+
function renderColumnVisualizationHtml(visualization, options) {
|
|
16793
|
+
const points = visualization.points ?? [];
|
|
16794
|
+
const tone = visualization.tone ?? 'info';
|
|
16795
|
+
if (points.length === 0) {
|
|
16796
|
+
return renderFallbackVisualizationHtml(visualization, tone);
|
|
16797
|
+
}
|
|
16798
|
+
const width = 100;
|
|
16799
|
+
const height = 30;
|
|
16800
|
+
const padding = 4;
|
|
16801
|
+
const values = points.map(p => p.value);
|
|
16802
|
+
const maxVal = Math.max(...values, 0);
|
|
16803
|
+
const minVal = Math.min(...values, 0);
|
|
16804
|
+
const valRange = maxVal - minVal === 0 ? 1 : maxVal - minVal;
|
|
16805
|
+
const colWidth = Math.max(2, (width - 2 * padding) / points.length - 2);
|
|
16806
|
+
const columnsHtml = points.map((p, i) => {
|
|
16807
|
+
const x = padding + i * ((width - 2 * padding) / points.length) + 1;
|
|
16808
|
+
const rectHeight = Math.max(2, ((p.value - minVal) / valRange) * (height - 2 * padding));
|
|
16809
|
+
const rectY = height - padding - rectHeight;
|
|
16810
|
+
const itemTone = p.tone ?? tone;
|
|
16811
|
+
return `<rect class="pfx-micro-column__bar" x="${x.toFixed(1)}" y="${rectY.toFixed(1)}" width="${colWidth.toFixed(1)}" height="${rectHeight.toFixed(1)}" fill="currentColor" data-tone="${escapeHtml$1(itemTone)}" />`;
|
|
16812
|
+
}).join('');
|
|
16813
|
+
const isTable = visualization.surface === 'table-cell';
|
|
16814
|
+
const firstPoint = points[0];
|
|
16815
|
+
const lastPoint = points[points.length - 1];
|
|
16816
|
+
const leftHtml = isTable ? '' : `
|
|
16817
|
+
<div class="pfx-micro-trend__label-col pfx-micro-trend__label-col--start">
|
|
16818
|
+
<span class="pfx-micro-trend__value">${escapeHtml$1(formatMicroNumber(firstPoint.value, options.locale))}</span>
|
|
16819
|
+
${firstPoint.label ? `<span class="pfx-micro-trend__label">${escapeHtml$1(firstPoint.label)}</span>` : ''}
|
|
16820
|
+
</div>`;
|
|
16821
|
+
const rightHtml = isTable ? '' : `
|
|
16822
|
+
<div class="pfx-micro-trend__label-col pfx-micro-trend__label-col--end">
|
|
16823
|
+
<span class="pfx-micro-trend__value">${escapeHtml$1(formatMicroNumber(lastPoint.value, options.locale))}</span>
|
|
16824
|
+
${lastPoint.label ? `<span class="pfx-micro-trend__label">${escapeHtml$1(lastPoint.label)}</span>` : ''}
|
|
16825
|
+
</div>`;
|
|
16826
|
+
return `
|
|
16827
|
+
<span class="pfx-micro-viz-container">
|
|
16828
|
+
${leftHtml}
|
|
16829
|
+
<span class="pfx-micro-viz pfx-micro-viz__column" data-tone="${escapeHtml$1(tone)}" role="img" aria-label="${escapeHtml$1(visualization.ariaLabel ?? visualization.fallbackText)}">
|
|
16830
|
+
<svg class="pfx-micro-column__svg" viewBox="0 0 100 30">
|
|
16831
|
+
${columnsHtml}
|
|
16832
|
+
</svg>
|
|
16833
|
+
</span>
|
|
16834
|
+
${rightHtml}
|
|
16835
|
+
</span>`;
|
|
16836
|
+
}
|
|
16837
|
+
function renderProcessFlowVisualizationHtml(visualization, options) {
|
|
16838
|
+
const items = visualization.items ?? [];
|
|
16839
|
+
if (items.length === 0) {
|
|
16840
|
+
return renderFallbackVisualizationHtml(visualization, visualization.tone ?? 'neutral');
|
|
16841
|
+
}
|
|
16842
|
+
const isTable = visualization.surface === 'table-cell';
|
|
16843
|
+
const stepLabels = items.map((item, index) => item.label ?? item.id ?? `${index + 1}`);
|
|
16844
|
+
const aria = visualization.ariaLabel ?? `${visualization.fallbackText}: ${stepLabels.join(' > ')}`;
|
|
16845
|
+
const stepsHtml = items.map((item, index) => {
|
|
16846
|
+
const itemTone = item.tone ?? 'neutral';
|
|
16847
|
+
const itemState = item.state ?? '';
|
|
16848
|
+
const isLast = index === items.length - 1;
|
|
16849
|
+
const itemLabel = stepLabels[index];
|
|
16850
|
+
const label = !isTable && item.label ? `<span class="pfx-micro-step__label">${escapeHtml$1(item.label)}</span>` : '';
|
|
16851
|
+
const connector = !isLast ? `<span class="pfx-micro-step__connector" data-tone="${escapeHtml$1(itemTone)}"></span>` : '';
|
|
16852
|
+
const stepCircle = `
|
|
16853
|
+
<span class="pfx-micro-step__node" data-tone="${escapeHtml$1(itemTone)}" aria-hidden="true">
|
|
16854
|
+
${item.icon ? `<span class="material-icons pfx-micro-step__icon" aria-hidden="true">${escapeHtml$1(item.icon)}</span>` : `${index + 1}`}
|
|
16855
|
+
</span>`;
|
|
16856
|
+
return `
|
|
16857
|
+
<div class="pfx-micro-step" data-state="${escapeHtml$1(itemState)}" data-tone="${escapeHtml$1(itemTone)}">
|
|
16858
|
+
<div class="pfx-micro-step__node-wrapper" title="${escapeHtml$1(itemLabel)}">
|
|
16859
|
+
${stepCircle}
|
|
16860
|
+
${label}
|
|
16861
|
+
</div>
|
|
16862
|
+
${connector}
|
|
16863
|
+
</div>`;
|
|
16864
|
+
}).join('');
|
|
16865
|
+
return `
|
|
16866
|
+
<span class="pfx-micro-viz pfx-micro-viz__process" role="img" aria-label="${escapeHtml$1(aria)}">
|
|
16867
|
+
${stepsHtml}
|
|
16868
|
+
</span>`;
|
|
16869
|
+
}
|
|
16870
|
+
function renderFallbackVisualizationHtml(visualization, tone) {
|
|
16871
|
+
return `
|
|
16872
|
+
<span
|
|
16873
|
+
class="pfx-micro-viz pfx-micro-viz__fallback"
|
|
16874
|
+
data-tone="${escapeHtml$1(tone)}"
|
|
16875
|
+
role="img"
|
|
16876
|
+
aria-label="${escapeHtml$1(visualization.ariaLabel ?? visualization.fallbackText)}"
|
|
16877
|
+
>${escapeHtml$1(visualization.fallbackText)}</span>`;
|
|
16878
|
+
}
|
|
16508
16879
|
|
|
16509
16880
|
const TONES = new Set([
|
|
16510
16881
|
'neutral',
|
|
@@ -20207,6 +20578,274 @@ const ValidationPattern = {
|
|
|
20207
20578
|
CUSTOM: '',
|
|
20208
20579
|
};
|
|
20209
20580
|
|
|
20581
|
+
function materializeFormLayoutFromMetadata(fields, options = {}) {
|
|
20582
|
+
const policy = normalizeLayoutPolicy(options.policy);
|
|
20583
|
+
const visibleFields = normalizeFields(fields, options.includeHidden === true);
|
|
20584
|
+
const groupedFields = groupFields(visibleFields);
|
|
20585
|
+
const sections = groupedFields.map(([groupKey, groupFields], sectionIndex) => createSection(groupKey, groupFields, sectionIndex, policy, options));
|
|
20586
|
+
return ensureIds({
|
|
20587
|
+
sections,
|
|
20588
|
+
fieldMetadata: fieldsForPolicy(visibleFields, policy),
|
|
20589
|
+
metadata: {
|
|
20590
|
+
version: '1.0.0',
|
|
20591
|
+
lastUpdated: new Date(),
|
|
20592
|
+
source: 'schema',
|
|
20593
|
+
generatedLayoutPreset: policy.preset,
|
|
20594
|
+
schemaLayoutPolicy: policy,
|
|
20595
|
+
...(policy.preset === 'compactPresentation'
|
|
20596
|
+
? { presentationDensity: 'compact' }
|
|
20597
|
+
: {}),
|
|
20598
|
+
},
|
|
20599
|
+
});
|
|
20600
|
+
}
|
|
20601
|
+
function normalizeLayoutPolicy(policy) {
|
|
20602
|
+
const intent = policy?.intent ?? (policy?.preset === 'groupedCommand' ? 'command' : 'detail');
|
|
20603
|
+
const preset = policy?.preset ?? (intent === 'command' ? 'groupedCommand' : 'compactPresentation');
|
|
20604
|
+
return {
|
|
20605
|
+
source: policy?.source ?? 'authored',
|
|
20606
|
+
preset,
|
|
20607
|
+
intent,
|
|
20608
|
+
lifecycle: policy?.lifecycle ?? 'initial',
|
|
20609
|
+
persistence: policy?.persistence ?? 'authorable',
|
|
20610
|
+
detachBehavior: policy?.detachBehavior ?? 'none',
|
|
20611
|
+
schemaOperation: policy?.schemaOperation,
|
|
20612
|
+
schemaType: policy?.schemaType,
|
|
20613
|
+
};
|
|
20614
|
+
}
|
|
20615
|
+
function normalizeFields(fields, includeHidden) {
|
|
20616
|
+
return (fields || [])
|
|
20617
|
+
.filter((field) => !!field?.name)
|
|
20618
|
+
.filter((field) => includeHidden || !isFormHidden(field))
|
|
20619
|
+
.sort(compareFields);
|
|
20620
|
+
}
|
|
20621
|
+
function isFormHidden(field) {
|
|
20622
|
+
const anyField = field;
|
|
20623
|
+
return anyField.formHidden === true || anyField.hidden === true || anyField.visible === false;
|
|
20624
|
+
}
|
|
20625
|
+
function groupFields(fields) {
|
|
20626
|
+
const groups = new Map();
|
|
20627
|
+
for (const field of fields) {
|
|
20628
|
+
const groupKey = normalizeGroupLabel(field.group);
|
|
20629
|
+
groups.set(groupKey, [...(groups.get(groupKey) || []), field]);
|
|
20630
|
+
}
|
|
20631
|
+
return Array.from(groups.entries()).sort(([, left], [, right]) => compareGroupFields(left, right));
|
|
20632
|
+
}
|
|
20633
|
+
function createSection(groupKey, groupFields, sectionIndex, policy, options) {
|
|
20634
|
+
const title = groupKey === 'default'
|
|
20635
|
+
? options.defaultSectionTitle || 'Informacoes'
|
|
20636
|
+
: groupKey;
|
|
20637
|
+
const sectionId = stableSectionId(groupKey);
|
|
20638
|
+
const presentationRole = resolvePresentationRole(groupKey, groupFields, options.presentationRoleMap);
|
|
20639
|
+
return {
|
|
20640
|
+
id: sectionId,
|
|
20641
|
+
title,
|
|
20642
|
+
...(policy.preset === 'compactPresentation'
|
|
20643
|
+
? {
|
|
20644
|
+
icon: resolvePresentationSectionIcon(presentationRole),
|
|
20645
|
+
sectionHeader: {
|
|
20646
|
+
mode: 'icon',
|
|
20647
|
+
size: 'sm',
|
|
20648
|
+
fallbackIcon: resolvePresentationSectionIcon(presentationRole),
|
|
20649
|
+
},
|
|
20650
|
+
className: [
|
|
20651
|
+
'pdx-presentation-section',
|
|
20652
|
+
`pdx-presentation-section--${presentationRole}`,
|
|
20653
|
+
].join(' '),
|
|
20654
|
+
presentationRole,
|
|
20655
|
+
appearance: 'plain',
|
|
20656
|
+
}
|
|
20657
|
+
: {}),
|
|
20658
|
+
rows: policy.preset === 'groupedCommand'
|
|
20659
|
+
? createCommandRows(groupFields, sectionId)
|
|
20660
|
+
: createPresentationRows(groupFields, sectionId),
|
|
20661
|
+
};
|
|
20662
|
+
}
|
|
20663
|
+
function createPresentationRows(fields, sectionId) {
|
|
20664
|
+
const rows = [];
|
|
20665
|
+
let pending = [];
|
|
20666
|
+
let pendingSpan = 0;
|
|
20667
|
+
let rowIndex = 0;
|
|
20668
|
+
const flush = () => {
|
|
20669
|
+
if (!pending.length)
|
|
20670
|
+
return;
|
|
20671
|
+
rows.push({ id: `${sectionId}-row-${++rowIndex}`, columns: pending });
|
|
20672
|
+
pending = [];
|
|
20673
|
+
pendingSpan = 0;
|
|
20674
|
+
};
|
|
20675
|
+
for (const field of fields) {
|
|
20676
|
+
const span = hasExplicitWidth(field)
|
|
20677
|
+
? resolveCommandSpan(field)
|
|
20678
|
+
: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 };
|
|
20679
|
+
const mdSpan = span.md ?? 12;
|
|
20680
|
+
const column = {
|
|
20681
|
+
id: `${sectionId}-col-${field.name}`,
|
|
20682
|
+
fields: [field.name],
|
|
20683
|
+
items: [{ id: `${sectionId}-item-${field.name}`, kind: 'field', fieldName: field.name }],
|
|
20684
|
+
span,
|
|
20685
|
+
};
|
|
20686
|
+
if (mdSpan >= 12) {
|
|
20687
|
+
flush();
|
|
20688
|
+
pending = [column];
|
|
20689
|
+
flush();
|
|
20690
|
+
continue;
|
|
20691
|
+
}
|
|
20692
|
+
if (pendingSpan + mdSpan > 12) {
|
|
20693
|
+
flush();
|
|
20694
|
+
}
|
|
20695
|
+
pending.push(column);
|
|
20696
|
+
pendingSpan += mdSpan;
|
|
20697
|
+
}
|
|
20698
|
+
flush();
|
|
20699
|
+
return rows;
|
|
20700
|
+
}
|
|
20701
|
+
function createCommandRows(fields, sectionId) {
|
|
20702
|
+
const rows = [];
|
|
20703
|
+
let pending = [];
|
|
20704
|
+
let pendingSpan = 0;
|
|
20705
|
+
let rowIndex = 0;
|
|
20706
|
+
const flush = () => {
|
|
20707
|
+
if (!pending.length)
|
|
20708
|
+
return;
|
|
20709
|
+
rows.push({ id: `${sectionId}-row-${++rowIndex}`, columns: pending });
|
|
20710
|
+
pending = [];
|
|
20711
|
+
pendingSpan = 0;
|
|
20712
|
+
};
|
|
20713
|
+
for (const field of fields) {
|
|
20714
|
+
const span = resolveCommandSpan(field);
|
|
20715
|
+
const mdSpan = span.md ?? 12;
|
|
20716
|
+
const column = {
|
|
20717
|
+
id: `${sectionId}-col-${field.name}`,
|
|
20718
|
+
fields: [field.name],
|
|
20719
|
+
items: [{ id: `${sectionId}-item-${field.name}`, kind: 'field', fieldName: field.name }],
|
|
20720
|
+
span,
|
|
20721
|
+
};
|
|
20722
|
+
if (mdSpan >= 12) {
|
|
20723
|
+
flush();
|
|
20724
|
+
pending = [column];
|
|
20725
|
+
flush();
|
|
20726
|
+
continue;
|
|
20727
|
+
}
|
|
20728
|
+
if (pendingSpan + mdSpan > 12) {
|
|
20729
|
+
flush();
|
|
20730
|
+
}
|
|
20731
|
+
pending.push(column);
|
|
20732
|
+
pendingSpan += mdSpan;
|
|
20733
|
+
}
|
|
20734
|
+
flush();
|
|
20735
|
+
return rows;
|
|
20736
|
+
}
|
|
20737
|
+
function resolveCommandSpan(field) {
|
|
20738
|
+
const rawWidth = field.width;
|
|
20739
|
+
const numericWidth = typeof rawWidth === 'number'
|
|
20740
|
+
? rawWidth
|
|
20741
|
+
: typeof rawWidth === 'string' && /^\d+$/.test(rawWidth.trim())
|
|
20742
|
+
? Number(rawWidth.trim())
|
|
20743
|
+
: null;
|
|
20744
|
+
if (numericWidth != null && Number.isFinite(numericWidth)) {
|
|
20745
|
+
const span = Math.max(1, Math.min(12, Math.round(numericWidth)));
|
|
20746
|
+
return {
|
|
20747
|
+
xs: 12,
|
|
20748
|
+
sm: span >= 6 ? 12 : 6,
|
|
20749
|
+
md: span,
|
|
20750
|
+
lg: span,
|
|
20751
|
+
xl: span,
|
|
20752
|
+
};
|
|
20753
|
+
}
|
|
20754
|
+
const width = String(rawWidth || '').toLowerCase();
|
|
20755
|
+
const controlType = String(field.controlType || field.type || '').toLowerCase();
|
|
20756
|
+
if (width === 'full' ||
|
|
20757
|
+
width === 'xl' ||
|
|
20758
|
+
controlType.includes('textarea') ||
|
|
20759
|
+
controlType.includes('rich') ||
|
|
20760
|
+
controlType.includes('file') ||
|
|
20761
|
+
controlType.includes('autocomplete') ||
|
|
20762
|
+
controlType.includes('lookup')) {
|
|
20763
|
+
return { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 };
|
|
20764
|
+
}
|
|
20765
|
+
if (width === 'lg')
|
|
20766
|
+
return { xs: 12, sm: 12, md: 8, lg: 8, xl: 8 };
|
|
20767
|
+
if (width === 'md')
|
|
20768
|
+
return { xs: 12, sm: 12, md: 6, lg: 6, xl: 6 };
|
|
20769
|
+
if (width === 'sm')
|
|
20770
|
+
return { xs: 12, sm: 6, md: 4, lg: 4, xl: 4 };
|
|
20771
|
+
if (width === 'xs' || controlType.includes('checkbox') || controlType.includes('toggle')) {
|
|
20772
|
+
return { xs: 12, sm: 6, md: 3, lg: 3, xl: 3 };
|
|
20773
|
+
}
|
|
20774
|
+
return { xs: 12, sm: 12, md: 6, lg: 6, xl: 6 };
|
|
20775
|
+
}
|
|
20776
|
+
function hasExplicitWidth(field) {
|
|
20777
|
+
const rawWidth = field.width;
|
|
20778
|
+
return rawWidth !== undefined && rawWidth !== null && String(rawWidth).trim() !== '';
|
|
20779
|
+
}
|
|
20780
|
+
function fieldsForPolicy(fields, policy) {
|
|
20781
|
+
if (policy.preset !== 'compactPresentation') {
|
|
20782
|
+
return fields;
|
|
20783
|
+
}
|
|
20784
|
+
return fields.map((field) => ({
|
|
20785
|
+
...field,
|
|
20786
|
+
readOnly: true,
|
|
20787
|
+
presentationMode: field.presentationMode ?? true,
|
|
20788
|
+
valuePresentation: {
|
|
20789
|
+
...(field.valuePresentation || {}),
|
|
20790
|
+
density: (field.valuePresentation || {}).density ?? 'compact',
|
|
20791
|
+
},
|
|
20792
|
+
}));
|
|
20793
|
+
}
|
|
20794
|
+
function compareGroupFields(left, right) {
|
|
20795
|
+
return compareFields(left[0], right[0]);
|
|
20796
|
+
}
|
|
20797
|
+
function compareFields(left, right) {
|
|
20798
|
+
const leftOrder = typeof left?.order === 'number' ? left.order : Number.MAX_SAFE_INTEGER;
|
|
20799
|
+
const rightOrder = typeof right?.order === 'number' ? right.order : Number.MAX_SAFE_INTEGER;
|
|
20800
|
+
if (leftOrder !== rightOrder)
|
|
20801
|
+
return leftOrder - rightOrder;
|
|
20802
|
+
return String(left?.name || '').localeCompare(String(right?.name || ''));
|
|
20803
|
+
}
|
|
20804
|
+
function normalizeGroupLabel(group) {
|
|
20805
|
+
const value = String(group || '').trim();
|
|
20806
|
+
return value || 'default';
|
|
20807
|
+
}
|
|
20808
|
+
function resolvePresentationRole(groupName, fields, map) {
|
|
20809
|
+
const direct = map?.[groupName];
|
|
20810
|
+
if (direct)
|
|
20811
|
+
return direct;
|
|
20812
|
+
const normalized = stableToken(groupName);
|
|
20813
|
+
if (normalized.includes('ident'))
|
|
20814
|
+
return 'identity';
|
|
20815
|
+
if (normalized.includes('marc') || normalized.includes('status'))
|
|
20816
|
+
return 'markers';
|
|
20817
|
+
if (normalized.includes('regra') || normalized.includes('rule'))
|
|
20818
|
+
return 'rules';
|
|
20819
|
+
if (fields.some((field) => String(field.controlType || '').toLowerCase().includes('checkbox'))) {
|
|
20820
|
+
return 'markers';
|
|
20821
|
+
}
|
|
20822
|
+
return 'default';
|
|
20823
|
+
}
|
|
20824
|
+
function resolvePresentationSectionIcon(role) {
|
|
20825
|
+
switch (role) {
|
|
20826
|
+
case 'identity':
|
|
20827
|
+
return 'badge';
|
|
20828
|
+
case 'rules':
|
|
20829
|
+
return 'rule';
|
|
20830
|
+
case 'markers':
|
|
20831
|
+
return 'fact_check';
|
|
20832
|
+
default:
|
|
20833
|
+
return 'info';
|
|
20834
|
+
}
|
|
20835
|
+
}
|
|
20836
|
+
function stableSectionId(groupName) {
|
|
20837
|
+
const token = stableToken(groupName) || 'default';
|
|
20838
|
+
return `section-${token}`;
|
|
20839
|
+
}
|
|
20840
|
+
function stableToken(value) {
|
|
20841
|
+
return String(value || '')
|
|
20842
|
+
.normalize('NFD')
|
|
20843
|
+
.replace(/[\u0300-\u036f]/g, '')
|
|
20844
|
+
.toLowerCase()
|
|
20845
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
20846
|
+
.replace(/^-+|-+$/g, '');
|
|
20847
|
+
}
|
|
20848
|
+
|
|
20210
20849
|
function resolveSpan(span) {
|
|
20211
20850
|
const xs = clamp(span?.xs ?? 12, 'xs');
|
|
20212
20851
|
const sm = clamp(span?.sm ?? xs, 'sm');
|
|
@@ -25768,7 +26407,19 @@ class DynamicWidgetLoaderDirective {
|
|
|
25768
26407
|
const defaultOrderMap = {
|
|
25769
26408
|
'praxis-table': ['tableId', 'componentInstanceId', 'configPersistenceStrategy', 'resourcePath', 'data', 'config'],
|
|
25770
26409
|
'praxis-crud': ['crudId', 'componentInstanceId', 'metadata'],
|
|
25771
|
-
'praxis-dynamic-form': [
|
|
26410
|
+
'praxis-dynamic-form': [
|
|
26411
|
+
'formId',
|
|
26412
|
+
'componentInstanceId',
|
|
26413
|
+
'resourcePath',
|
|
26414
|
+
'schemaUrl',
|
|
26415
|
+
'submitUrl',
|
|
26416
|
+
'submitMethod',
|
|
26417
|
+
'apiEndpointKey',
|
|
26418
|
+
'apiUrlEntry',
|
|
26419
|
+
'initialValue',
|
|
26420
|
+
'mode',
|
|
26421
|
+
'layoutPolicy',
|
|
26422
|
+
],
|
|
25772
26423
|
'praxis-tabs': ['tabsId', 'componentInstanceId', 'configPersistenceStrategy', 'config'],
|
|
25773
26424
|
'praxis-list': ['listId', 'componentInstanceId', 'enableCustomization', 'config'],
|
|
25774
26425
|
'praxis-expansion': ['expansionId', 'componentInstanceId', 'config'],
|
|
@@ -32072,9 +32723,16 @@ class DynamicWidgetPageComponent {
|
|
|
32072
32723
|
origin: 'dynamic-page.rich-content',
|
|
32073
32724
|
componentId: 'praxis-dynamic-page',
|
|
32074
32725
|
},
|
|
32726
|
+
}).then((result) => {
|
|
32727
|
+
if (!result?.success) {
|
|
32728
|
+
this.emitRichContentCustomAction(widgetKey, actionId, payload);
|
|
32729
|
+
}
|
|
32075
32730
|
});
|
|
32076
32731
|
return;
|
|
32077
32732
|
}
|
|
32733
|
+
this.emitRichContentCustomAction(widgetKey, actionId, payload);
|
|
32734
|
+
}
|
|
32735
|
+
emitRichContentCustomAction(widgetKey, actionId, payload) {
|
|
32078
32736
|
this.onWidgetEvent(widgetKey, {
|
|
32079
32737
|
ownerWidgetKey: widgetKey,
|
|
32080
32738
|
sourceComponentId: 'praxis-rich-content',
|
|
@@ -35038,6 +35696,8 @@ class PraxisSurfaceHostComponent {
|
|
|
35038
35696
|
*/
|
|
35039
35697
|
renderTitleInsideBody = false;
|
|
35040
35698
|
widgetEvent = new EventEmitter();
|
|
35699
|
+
rowClick = new EventEmitter();
|
|
35700
|
+
selectionChange = new EventEmitter();
|
|
35041
35701
|
beforeWidgetLoader;
|
|
35042
35702
|
mainWidgetLoader;
|
|
35043
35703
|
afterWidgetLoader;
|
|
@@ -35151,13 +35811,19 @@ class PraxisSurfaceHostComponent {
|
|
|
35151
35811
|
}
|
|
35152
35812
|
}
|
|
35153
35813
|
onSlotWidgetEvent(ownerWidgetKey, event) {
|
|
35814
|
+
if (event.output === 'rowClick') {
|
|
35815
|
+
this.rowClick.emit(event.payload);
|
|
35816
|
+
}
|
|
35817
|
+
if (event.output === 'selectionChange') {
|
|
35818
|
+
this.selectionChange.emit(event.payload);
|
|
35819
|
+
}
|
|
35154
35820
|
this.widgetEvent.emit({
|
|
35155
35821
|
...event,
|
|
35156
35822
|
ownerWidgetKey: event.ownerWidgetKey || ownerWidgetKey,
|
|
35157
35823
|
});
|
|
35158
35824
|
}
|
|
35159
35825
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisSurfaceHostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
35160
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisSurfaceHostComponent, isStandalone: true, selector: "praxis-surface-host", inputs: { title: "title", subtitle: "subtitle", icon: "icon", beforeWidget: "beforeWidget", widget: "widget", afterWidget: "afterWidget", context: "context", strictValidation: "strictValidation", renderTitleInsideBody: "renderTitleInsideBody" }, outputs: { widgetEvent: "widgetEvent" }, viewQueries: [{ propertyName: "beforeWidgetLoader", first: true, predicate: ["beforeWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }, { propertyName: "mainWidgetLoader", first: true, predicate: ["mainWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }, { propertyName: "afterWidgetLoader", first: true, predicate: ["afterWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }], usesOnChanges: true, ngImport: i0, template: `
|
|
35826
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisSurfaceHostComponent, isStandalone: true, selector: "praxis-surface-host", inputs: { title: "title", subtitle: "subtitle", icon: "icon", beforeWidget: "beforeWidget", widget: "widget", afterWidget: "afterWidget", context: "context", strictValidation: "strictValidation", renderTitleInsideBody: "renderTitleInsideBody" }, outputs: { widgetEvent: "widgetEvent", rowClick: "rowClick", selectionChange: "selectionChange" }, viewQueries: [{ propertyName: "beforeWidgetLoader", first: true, predicate: ["beforeWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }, { propertyName: "mainWidgetLoader", first: true, predicate: ["mainWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }, { propertyName: "afterWidgetLoader", first: true, predicate: ["afterWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }], usesOnChanges: true, ngImport: i0, template: `
|
|
35161
35827
|
<div class="pdx-surface-host">
|
|
35162
35828
|
@if (subtitle || (title && renderTitleInsideBody)) {
|
|
35163
35829
|
<header class="pdx-surface-host__header">
|
|
@@ -35184,6 +35850,7 @@ class PraxisSurfaceHostComponent {
|
|
|
35184
35850
|
[ownerWidgetKey]="beforeWidgetKey"
|
|
35185
35851
|
[context]="context"
|
|
35186
35852
|
[strictValidation]="strictValidation"
|
|
35853
|
+
[autoWireOutputs]="true"
|
|
35187
35854
|
(widgetEvent)="onSlotWidgetEvent(beforeWidgetKey, $event)"
|
|
35188
35855
|
></ng-container>
|
|
35189
35856
|
</div>
|
|
@@ -35196,6 +35863,7 @@ class PraxisSurfaceHostComponent {
|
|
|
35196
35863
|
[ownerWidgetKey]="mainWidgetKey"
|
|
35197
35864
|
[context]="context"
|
|
35198
35865
|
[strictValidation]="strictValidation"
|
|
35866
|
+
[autoWireOutputs]="true"
|
|
35199
35867
|
(widgetEvent)="onSlotWidgetEvent(mainWidgetKey, $event)"
|
|
35200
35868
|
></ng-container>
|
|
35201
35869
|
}
|
|
@@ -35208,6 +35876,7 @@ class PraxisSurfaceHostComponent {
|
|
|
35208
35876
|
[ownerWidgetKey]="afterWidgetKey"
|
|
35209
35877
|
[context]="context"
|
|
35210
35878
|
[strictValidation]="strictValidation"
|
|
35879
|
+
[autoWireOutputs]="true"
|
|
35211
35880
|
(widgetEvent)="onSlotWidgetEvent(afterWidgetKey, $event)"
|
|
35212
35881
|
></ng-container>
|
|
35213
35882
|
</div>
|
|
@@ -35245,6 +35914,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
35245
35914
|
[ownerWidgetKey]="beforeWidgetKey"
|
|
35246
35915
|
[context]="context"
|
|
35247
35916
|
[strictValidation]="strictValidation"
|
|
35917
|
+
[autoWireOutputs]="true"
|
|
35248
35918
|
(widgetEvent)="onSlotWidgetEvent(beforeWidgetKey, $event)"
|
|
35249
35919
|
></ng-container>
|
|
35250
35920
|
</div>
|
|
@@ -35257,6 +35927,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
35257
35927
|
[ownerWidgetKey]="mainWidgetKey"
|
|
35258
35928
|
[context]="context"
|
|
35259
35929
|
[strictValidation]="strictValidation"
|
|
35930
|
+
[autoWireOutputs]="true"
|
|
35260
35931
|
(widgetEvent)="onSlotWidgetEvent(mainWidgetKey, $event)"
|
|
35261
35932
|
></ng-container>
|
|
35262
35933
|
}
|
|
@@ -35269,6 +35940,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
35269
35940
|
[ownerWidgetKey]="afterWidgetKey"
|
|
35270
35941
|
[context]="context"
|
|
35271
35942
|
[strictValidation]="strictValidation"
|
|
35943
|
+
[autoWireOutputs]="true"
|
|
35272
35944
|
(widgetEvent)="onSlotWidgetEvent(afterWidgetKey, $event)"
|
|
35273
35945
|
></ng-container>
|
|
35274
35946
|
</div>
|
|
@@ -35296,6 +35968,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
35296
35968
|
type: Input
|
|
35297
35969
|
}], widgetEvent: [{
|
|
35298
35970
|
type: Output
|
|
35971
|
+
}], rowClick: [{
|
|
35972
|
+
type: Output
|
|
35973
|
+
}], selectionChange: [{
|
|
35974
|
+
type: Output
|
|
35299
35975
|
}], beforeWidgetLoader: [{
|
|
35300
35976
|
type: ViewChild,
|
|
35301
35977
|
args: ['beforeWidgetLoader', { read: DynamicWidgetLoaderDirective }]
|
|
@@ -36765,4 +37441,4 @@ function provideHookWhitelist(allowed) {
|
|
|
36765
37441
|
* Generated bundle index. Do not edit.
|
|
36766
37442
|
*/
|
|
36767
37443
|
|
|
36768
|
-
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, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentKeyService, ComponentMetadataRegistry, CompositionRuntimeFacade, 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, 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_COLLECTION_EXPORT_HTTP_OPTIONS, PRAXIS_COLLECTION_EXPORT_PROVIDER, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, 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_RICH_TEXT_BLOCK_METADATA, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCollectionExportService, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisHttpCollectionExportProvider, PraxisI18nService, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRichTextBlockComponent, PraxisRuntimeComponentObservationRegistryService, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceSurfaceOpenAdapterService, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SurfaceBindingRuntimeService, SurfaceOpenActionEditorComponent, SurfaceOpenMaterializerService, 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, buildPraxisEffectDistinctKey, buildPraxisLayerScaleCss, 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, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getFormColumnFieldNames, getFormLayoutFieldNames, getGlobalActionCatalog, getGlobalActionPayloadActualType, getGlobalActionPayloadTypeIssue, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldConstraints, normalizeFieldPresentation, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef$1 as normalizeGlobalActionRef, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, normalizePraxisEffectPolicy, normalizePraxisPresentationVisualization, normalizePraxisQueryFilterExpression, normalizePraxisQueryFilterNode, normalizeResourceAvailabilityReasonCode, normalizeStart, normalizeUnknownError, normalizeWidgetEventPath, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisCollectionExportProvider, providePraxisDynamicPageMetadata, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpCollectionExportProvider, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisJsonLogicOperatorOverride, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, readPraxisExportValue, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, registerPraxisRuntimeComponentObservation, removeDiacritics, renderPraxisPresentationVisualizationHtml, reportTelemetryHookFactory, requiredCheckedValidator, requiredPresenceValidator, resolveBuiltinPresets, resolveColumnTypeFromFieldDefinition, resolveControlTypeAlias, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveFieldPresentation, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolveResourceAvailabilityReasonKey, resolveSpan, resolveTextMaskFormat, resolveTextMaskFormatFromFieldDefinition, resolveValuePresentation, resolveValuePresentationLocale, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToJson, slugify, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withMessage, withPraxisHttpLoading };
|
|
37444
|
+
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, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentKeyService, ComponentMetadataRegistry, CompositionRuntimeFacade, 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_COLLECTION_EXPORT_HTTP_OPTIONS, PRAXIS_COLLECTION_EXPORT_PROVIDER, 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_RICH_TEXT_BLOCK_METADATA, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCollectionExportService, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisHttpCollectionExportProvider, PraxisI18nService, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRichTextBlockComponent, PraxisRuntimeComponentObservationRegistryService, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceSurfaceOpenAdapterService, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SurfaceBindingRuntimeService, SurfaceOpenActionEditorComponent, SurfaceOpenMaterializerService, 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, buildPraxisEffectDistinctKey, buildPraxisLayerScaleCss, 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, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getFormColumnFieldNames, getFormLayoutFieldNames, getGlobalActionCatalog, getGlobalActionPayloadActualType, getGlobalActionPayloadTypeIssue, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, materializeFormLayoutFromMetadata, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldConstraints, normalizeFieldPresentation, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef$1 as normalizeGlobalActionRef, normalizeLayoutPolicy, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, normalizePraxisEffectPolicy, normalizePraxisPresentationVisualization, normalizePraxisQueryFilterExpression, normalizePraxisQueryFilterNode, normalizeResourceAvailabilityReasonCode, normalizeStart, normalizeUnknownError, normalizeWidgetEventPath, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, 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, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, readPraxisExportValue, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, registerPraxisRuntimeComponentObservation, removeDiacritics, renderPraxisPresentationVisualizationHtml, reportTelemetryHookFactory, requiredCheckedValidator, requiredPresenceValidator, resolveBuiltinPresets, resolveColumnTypeFromFieldDefinition, resolveControlTypeAlias, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveFieldPresentation, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolveResourceAvailabilityReasonKey, resolveSpan, resolveTextMaskFormat, resolveTextMaskFormatFromFieldDefinition, resolveValuePresentation, resolveValuePresentationLocale, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToJson, slugify, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withMessage, withPraxisHttpLoading };
|