@praxisui/core 8.0.0-beta.19 → 8.0.0-beta.20

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.
@@ -53,6 +53,179 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
53
53
  ` }]
54
54
  }] });
55
55
 
56
+ function isEntityLookupResultSelectable(result) {
57
+ return result?.extra?.selectable !== false;
58
+ }
59
+ function isEntityLookupPayloadMode(value) {
60
+ return (value === 'id' ||
61
+ value === 'entityRef' ||
62
+ value === 'ids' ||
63
+ value === 'entityRefs');
64
+ }
65
+ function isEntityLookupSinglePayloadMode(value) {
66
+ return value === 'id' || value === 'entityRef';
67
+ }
68
+ function isEntityLookupMultiplePayloadMode(value) {
69
+ return value === 'ids' || value === 'entityRefs';
70
+ }
71
+ function isLookupFilterFieldType(value) {
72
+ return (value === 'text' ||
73
+ value === 'enum' ||
74
+ value === 'date' ||
75
+ value === 'number' ||
76
+ value === 'reference');
77
+ }
78
+ function isLookupFilterOperator(value) {
79
+ return (value === 'contains' ||
80
+ value === 'startsWith' ||
81
+ value === 'equals' ||
82
+ value === 'in' ||
83
+ value === 'before' ||
84
+ value === 'after' ||
85
+ value === 'between' ||
86
+ value === 'gt' ||
87
+ value === 'gte' ||
88
+ value === 'lt' ||
89
+ value === 'lte');
90
+ }
91
+ function isLookupDialogSize(value) {
92
+ return (value === 'sm' ||
93
+ value === 'md' ||
94
+ value === 'lg' ||
95
+ value === 'xl' ||
96
+ value === 'full');
97
+ }
98
+ function normalizeLookupFilterRequest(filter) {
99
+ return {
100
+ field: String(filter.field ?? '').trim(),
101
+ operator: filter.operator,
102
+ value: filter.value,
103
+ };
104
+ }
105
+ function serializeOptionSourceFilterRequest(filter, options) {
106
+ const filters = (options?.filters ?? [])
107
+ .map(normalizeLookupFilterRequest)
108
+ .filter((item) => !!item.field && isLookupFilterOperator(item.operator));
109
+ const search = normalizeOptionSourceText(options?.search);
110
+ const sort = normalizeOptionSourceText(options?.sort);
111
+ const includeIds = (options?.includeIds ?? []).filter((value) => value !== null && value !== undefined);
112
+ const request = {};
113
+ if (filter !== undefined) {
114
+ request.filter = filter ?? null;
115
+ }
116
+ if (filters.length) {
117
+ request.filters = filters;
118
+ }
119
+ if (search) {
120
+ request.search = search;
121
+ }
122
+ if (sort) {
123
+ request.sort = sort;
124
+ }
125
+ if (includeIds.length) {
126
+ request.includeIds = includeIds;
127
+ }
128
+ return request;
129
+ }
130
+ function normalizeOptionSourceText(value) {
131
+ const normalized = String(value ?? '').trim();
132
+ return normalized ? normalized : undefined;
133
+ }
134
+ function resolveEntityLookupPayloadMode(payloadMode, multiple) {
135
+ if (multiple) {
136
+ if (payloadMode === 'entityRef') {
137
+ return 'entityRefs';
138
+ }
139
+ if (payloadMode === 'id') {
140
+ return 'ids';
141
+ }
142
+ if (payloadMode === 'ids' || payloadMode === 'entityRefs') {
143
+ return payloadMode;
144
+ }
145
+ return 'ids';
146
+ }
147
+ if (payloadMode === 'ids') {
148
+ return 'id';
149
+ }
150
+ if (payloadMode === 'entityRefs') {
151
+ return 'entityRef';
152
+ }
153
+ if (payloadMode === 'id' || payloadMode === 'entityRef') {
154
+ return payloadMode;
155
+ }
156
+ return 'id';
157
+ }
158
+ function isEntityLookupPayloadModeCompatible(payloadMode, multiple) {
159
+ return multiple
160
+ ? isEntityLookupMultiplePayloadMode(payloadMode)
161
+ : isEntityLookupSinglePayloadMode(payloadMode);
162
+ }
163
+ function serializeEntityLookupValueForPayload(value, options = {}) {
164
+ const payloadMode = resolveEntityLookupPayloadMode(options.payloadMode, options.multiple);
165
+ switch (payloadMode) {
166
+ case 'id':
167
+ return extractEntityLookupId(value);
168
+ case 'entityRef':
169
+ return buildEntityLookupEntityRef(value, options.entityType);
170
+ case 'ids':
171
+ return collectEntityLookupIds(value);
172
+ case 'entityRefs':
173
+ return collectEntityLookupEntityRefs(value, options.entityType);
174
+ default:
175
+ return value;
176
+ }
177
+ }
178
+ function classifyEntityLookupResult(result, context) {
179
+ if (isEntityLookupResultSelectable(result)) {
180
+ return 'selectable';
181
+ }
182
+ return context?.allowRetainInvalidExistingValue ? 'legacy' : 'blocked';
183
+ }
184
+ function asEntityLookupArray(value) {
185
+ return Array.isArray(value) ? value : [];
186
+ }
187
+ function extractEntityLookupId(value) {
188
+ if (value === null || value === undefined || value === '') {
189
+ return value;
190
+ }
191
+ if (typeof value !== 'object' || Array.isArray(value)) {
192
+ return value;
193
+ }
194
+ return Object.prototype.hasOwnProperty.call(value, 'id')
195
+ ? value.id
196
+ : value;
197
+ }
198
+ function collectEntityLookupIds(value) {
199
+ return asEntityLookupArray(value)
200
+ .map((item) => extractEntityLookupId(item))
201
+ .filter((item) => item !== null && item !== undefined && item !== '');
202
+ }
203
+ function buildEntityLookupEntityRef(value, entityType) {
204
+ const id = extractEntityLookupId(value);
205
+ if (id === null || id === undefined || id === '') {
206
+ return id;
207
+ }
208
+ const explicitType = typeof value === 'object' &&
209
+ value !== null &&
210
+ !Array.isArray(value) &&
211
+ typeof value['type'] === 'string' &&
212
+ String(value['type']).trim()
213
+ ? String(value['type']).trim()
214
+ : undefined;
215
+ const normalizedFallbackType = String(entityType ?? '').trim() || undefined;
216
+ const entityRef = { id: id };
217
+ const resolvedType = explicitType || normalizedFallbackType;
218
+ if (resolvedType) {
219
+ entityRef.type = resolvedType;
220
+ }
221
+ return entityRef;
222
+ }
223
+ function collectEntityLookupEntityRefs(value, entityType) {
224
+ return asEntityLookupArray(value)
225
+ .map((item) => buildEntityLookupEntityRef(item, entityType))
226
+ .filter((item) => item !== null && item !== undefined && item !== '');
227
+ }
228
+
56
229
  var ApiEndpoint;
57
230
  (function (ApiEndpoint) {
58
231
  ApiEndpoint["Default"] = "default";
@@ -638,6 +811,45 @@ const VALUE_PRESENTATION_STYLES = new Set([
638
811
  'full',
639
812
  'compact',
640
813
  ]);
814
+ const OPTION_SOURCE_TYPES = new Set([
815
+ 'RESOURCE_ENTITY',
816
+ 'DISTINCT_DIMENSION',
817
+ 'CATEGORICAL_BUCKET',
818
+ 'LIGHT_LOOKUP',
819
+ 'STATIC_CANONICAL',
820
+ ]);
821
+ const OPTION_SOURCE_SEARCH_MODES = new Set([
822
+ 'none',
823
+ 'starts-with',
824
+ 'contains',
825
+ 'exact',
826
+ ]);
827
+ const LOOKUP_OPEN_DETAIL_MODES = new Set([
828
+ 'samePage',
829
+ 'newTab',
830
+ 'drawer',
831
+ 'modal',
832
+ ]);
833
+ const LOOKUP_FILTER_FIELD_TYPES = new Set([
834
+ 'text',
835
+ 'enum',
836
+ 'date',
837
+ 'number',
838
+ 'reference',
839
+ ]);
840
+ const LOOKUP_FILTER_OPERATORS = new Set([
841
+ 'contains',
842
+ 'startsWith',
843
+ 'equals',
844
+ 'in',
845
+ 'before',
846
+ 'after',
847
+ 'between',
848
+ 'gt',
849
+ 'gte',
850
+ 'lt',
851
+ 'lte',
852
+ ]);
641
853
  /**
642
854
  * SchemaNormalizerService
643
855
  * -----------------------
@@ -906,10 +1118,276 @@ class SchemaNormalizerService {
906
1118
  detail.routeTemplate = String(value.routeTemplate);
907
1119
  }
908
1120
  if (value.openDetailMode !== undefined) {
909
- detail.openDetailMode = String(value.openDetailMode);
1121
+ const openDetailMode = this.parseLookupOpenDetailMode(value.openDetailMode);
1122
+ if (openDetailMode) {
1123
+ detail.openDetailMode = openDetailMode;
1124
+ }
910
1125
  }
911
1126
  return Object.keys(detail).length ? detail : undefined;
912
1127
  }
1128
+ parseLookupCreate(value) {
1129
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
1130
+ return undefined;
1131
+ }
1132
+ const create = {};
1133
+ if (value.hrefTemplate !== undefined) {
1134
+ create.hrefTemplate = String(value.hrefTemplate);
1135
+ }
1136
+ if (value.routeTemplate !== undefined) {
1137
+ create.routeTemplate = String(value.routeTemplate);
1138
+ }
1139
+ if (value.openMode !== undefined) {
1140
+ const openMode = this.parseLookupOpenDetailMode(value.openMode);
1141
+ if (openMode) {
1142
+ create.openMode = openMode;
1143
+ }
1144
+ }
1145
+ return Object.keys(create).length ? create : undefined;
1146
+ }
1147
+ parseLookupFilterOperatorArray(value) {
1148
+ if (!Array.isArray(value)) {
1149
+ return [];
1150
+ }
1151
+ const normalized = value.map((item) => String(item ?? '').trim());
1152
+ if (normalized.some((item) => !item || !LOOKUP_FILTER_OPERATORS.has(item))) {
1153
+ return [];
1154
+ }
1155
+ return normalized
1156
+ .filter((item, index) => normalized.indexOf(item) === index)
1157
+ .map((item) => item);
1158
+ }
1159
+ parseLookupSortDirection(value) {
1160
+ const normalized = String(value ?? '').trim().toLowerCase();
1161
+ if (normalized === 'asc' || normalized === 'desc') {
1162
+ return normalized;
1163
+ }
1164
+ return undefined;
1165
+ }
1166
+ parseLookupDialogSize(value) {
1167
+ const normalized = String(value ?? '').trim();
1168
+ if (normalized === 'sm' ||
1169
+ normalized === 'md' ||
1170
+ normalized === 'lg' ||
1171
+ normalized === 'xl' ||
1172
+ normalized === 'full') {
1173
+ return normalized;
1174
+ }
1175
+ return undefined;
1176
+ }
1177
+ parseLookupDialog(value) {
1178
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
1179
+ return undefined;
1180
+ }
1181
+ const dialog = {};
1182
+ if (value.enabled !== undefined) {
1183
+ dialog.enabled = this.parseBoolean(value.enabled);
1184
+ }
1185
+ if (value.title !== undefined) {
1186
+ const title = String(value.title).trim();
1187
+ if (title) {
1188
+ dialog.title = title;
1189
+ }
1190
+ }
1191
+ if (value.size !== undefined) {
1192
+ const size = this.parseLookupDialogSize(value.size);
1193
+ if (size) {
1194
+ dialog.size = size;
1195
+ }
1196
+ }
1197
+ if (value.previewPanel !== undefined) {
1198
+ dialog.previewPanel = this.parseBoolean(value.previewPanel);
1199
+ }
1200
+ if (value.allowColumnChooser !== undefined) {
1201
+ dialog.allowColumnChooser = this.parseBoolean(value.allowColumnChooser);
1202
+ }
1203
+ if (value.allowSavedViews !== undefined) {
1204
+ dialog.allowSavedViews = this.parseBoolean(value.allowSavedViews);
1205
+ }
1206
+ if (Array.isArray(value.resultColumns)) {
1207
+ const resultColumns = value.resultColumns
1208
+ .map((item) => this.parseLookupResultColumn(item))
1209
+ .filter((item) => !!item);
1210
+ if (resultColumns.length) {
1211
+ dialog.resultColumns = resultColumns;
1212
+ }
1213
+ }
1214
+ if (value.openActionLabel !== undefined) {
1215
+ const openActionLabel = String(value.openActionLabel).trim();
1216
+ if (openActionLabel) {
1217
+ dialog.openActionLabel = openActionLabel;
1218
+ }
1219
+ }
1220
+ if (value.applyActionLabel !== undefined) {
1221
+ const applyActionLabel = String(value.applyActionLabel).trim();
1222
+ if (applyActionLabel) {
1223
+ dialog.applyActionLabel = applyActionLabel;
1224
+ }
1225
+ }
1226
+ if (value.cancelActionLabel !== undefined) {
1227
+ const cancelActionLabel = String(value.cancelActionLabel).trim();
1228
+ if (cancelActionLabel) {
1229
+ dialog.cancelActionLabel = cancelActionLabel;
1230
+ }
1231
+ }
1232
+ return Object.keys(dialog).length ? dialog : undefined;
1233
+ }
1234
+ parseLookupResultColumn(value) {
1235
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
1236
+ return undefined;
1237
+ }
1238
+ const field = String(value.field ?? '').trim();
1239
+ if (!field) {
1240
+ return undefined;
1241
+ }
1242
+ const column = { field };
1243
+ if (value.label !== undefined) {
1244
+ const label = String(value.label).trim();
1245
+ if (label) {
1246
+ column.label = label;
1247
+ }
1248
+ }
1249
+ if (value.kind !== undefined) {
1250
+ const kind = String(value.kind).trim();
1251
+ if (kind === 'code' ||
1252
+ kind === 'label' ||
1253
+ kind === 'description' ||
1254
+ kind === 'status' ||
1255
+ kind === 'disabledReason' ||
1256
+ kind === 'custom') {
1257
+ column.kind = kind;
1258
+ }
1259
+ }
1260
+ if (value.width !== undefined) {
1261
+ const width = String(value.width).trim();
1262
+ if (width) {
1263
+ column.width = width;
1264
+ }
1265
+ }
1266
+ return column;
1267
+ }
1268
+ parseLookupFilterDefinition(value) {
1269
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
1270
+ return undefined;
1271
+ }
1272
+ const field = String(value.field ?? '').trim();
1273
+ const type = String(value.type ?? '').trim();
1274
+ if (!field || !LOOKUP_FILTER_FIELD_TYPES.has(type)) {
1275
+ return undefined;
1276
+ }
1277
+ const operators = this.parseLookupFilterOperatorArray(value.operators);
1278
+ if (!operators.length) {
1279
+ return undefined;
1280
+ }
1281
+ const definition = {
1282
+ field,
1283
+ type,
1284
+ operators,
1285
+ };
1286
+ if (value.label !== undefined) {
1287
+ definition.label = String(value.label);
1288
+ }
1289
+ const defaultOperator = String(value.defaultOperator ?? '').trim();
1290
+ if (defaultOperator && operators.includes(defaultOperator)) {
1291
+ definition.defaultOperator = defaultOperator;
1292
+ }
1293
+ if (value.optionsSource !== undefined) {
1294
+ const optionsSource = String(value.optionsSource).trim();
1295
+ if (optionsSource) {
1296
+ definition.optionsSource = optionsSource;
1297
+ }
1298
+ }
1299
+ if (value.required !== undefined) {
1300
+ definition.required = this.parseBoolean(value.required);
1301
+ }
1302
+ if (value.hidden !== undefined) {
1303
+ definition.hidden = this.parseBoolean(value.hidden);
1304
+ }
1305
+ return definition;
1306
+ }
1307
+ parseDefaultFilters(value) {
1308
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
1309
+ return undefined;
1310
+ }
1311
+ const normalized = Object.entries(value).reduce((acc, [key, item]) => {
1312
+ const normalizedKey = String(key).trim();
1313
+ if (!normalizedKey) {
1314
+ return acc;
1315
+ }
1316
+ const values = Array.isArray(item)
1317
+ ? item.filter((entry) => entry !== undefined)
1318
+ : item === undefined
1319
+ ? []
1320
+ : [item];
1321
+ if (values.length) {
1322
+ acc[normalizedKey] = values;
1323
+ }
1324
+ return acc;
1325
+ }, {});
1326
+ return Object.keys(normalized).length ? normalized : undefined;
1327
+ }
1328
+ parseLookupFiltering(value) {
1329
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
1330
+ return undefined;
1331
+ }
1332
+ const filtering = {};
1333
+ if (value.availableFilters !== undefined) {
1334
+ const availableFilters = Array.isArray(value.availableFilters)
1335
+ ? value.availableFilters
1336
+ .map((item) => this.parseLookupFilterDefinition(item))
1337
+ .filter((item) => !!item)
1338
+ : [];
1339
+ if (availableFilters.length) {
1340
+ filtering.availableFilters = availableFilters;
1341
+ }
1342
+ }
1343
+ const defaultFilters = this.parseDefaultFilters(value.defaultFilters);
1344
+ if (defaultFilters) {
1345
+ filtering.defaultFilters = defaultFilters;
1346
+ }
1347
+ if (value.sortOptions !== undefined && Array.isArray(value.sortOptions)) {
1348
+ const sortOptions = value.sortOptions
1349
+ .map((item) => {
1350
+ if (!item || typeof item !== 'object' || Array.isArray(item)) {
1351
+ return undefined;
1352
+ }
1353
+ const key = String(item.key ?? '').trim();
1354
+ const field = String(item.field ?? '').trim();
1355
+ const direction = this.parseLookupSortDirection(item.direction);
1356
+ if (!key || !field || !direction) {
1357
+ return undefined;
1358
+ }
1359
+ return {
1360
+ key,
1361
+ field,
1362
+ direction,
1363
+ ...(item.label !== undefined ? { label: String(item.label) } : {}),
1364
+ };
1365
+ })
1366
+ .filter((item) => !!item);
1367
+ if (sortOptions.length) {
1368
+ filtering.sortOptions = sortOptions;
1369
+ }
1370
+ }
1371
+ if (value.defaultSort !== undefined) {
1372
+ const defaultSort = String(value.defaultSort).trim();
1373
+ if (defaultSort) {
1374
+ filtering.defaultSort = defaultSort;
1375
+ }
1376
+ }
1377
+ if (value.quickFilterFields !== undefined) {
1378
+ const quickFilterFields = this.parseNonBlankStringArray(value.quickFilterFields);
1379
+ if (quickFilterFields.length) {
1380
+ filtering.quickFilterFields = quickFilterFields;
1381
+ }
1382
+ }
1383
+ if (value.searchPlaceholder !== undefined) {
1384
+ const searchPlaceholder = String(value.searchPlaceholder).trim();
1385
+ if (searchPlaceholder) {
1386
+ filtering.searchPlaceholder = searchPlaceholder;
1387
+ }
1388
+ }
1389
+ return Object.keys(filtering).length ? filtering : undefined;
1390
+ }
913
1391
  /** Parse option arrays into `{ key, value }` objects. */
914
1392
  parseOptions(value) {
915
1393
  if (!Array.isArray(value)) {
@@ -934,8 +1412,12 @@ class SchemaNormalizerService {
934
1412
  if (!optionSource.key) {
935
1413
  return undefined;
936
1414
  }
937
- if (value.type !== undefined)
938
- optionSource.type = String(value.type);
1415
+ if (value.type !== undefined) {
1416
+ const optionSourceType = this.parseOptionSourceType(value.type);
1417
+ if (optionSourceType) {
1418
+ optionSource.type = optionSourceType;
1419
+ }
1420
+ }
939
1421
  if (value.resourcePath !== undefined) {
940
1422
  optionSource.resourcePath = String(value.resourcePath);
941
1423
  }
@@ -994,11 +1476,22 @@ class SchemaNormalizerService {
994
1476
  if (detail) {
995
1477
  optionSource.detail = detail;
996
1478
  }
1479
+ const create = this.parseLookupCreate(value.create);
1480
+ if (create) {
1481
+ optionSource.create = create;
1482
+ }
1483
+ const filtering = this.parseLookupFiltering(value.filtering);
1484
+ if (filtering) {
1485
+ optionSource.filtering = filtering;
1486
+ }
997
1487
  if (value.excludeSelfField !== undefined) {
998
1488
  optionSource.excludeSelfField = this.parseBoolean(value.excludeSelfField);
999
1489
  }
1000
1490
  if (value.searchMode !== undefined) {
1001
- optionSource.searchMode = String(value.searchMode);
1491
+ const searchMode = this.parseOptionSourceSearchMode(value.searchMode);
1492
+ if (searchMode) {
1493
+ optionSource.searchMode = searchMode;
1494
+ }
1002
1495
  }
1003
1496
  if (value.pageSize !== undefined && !Number.isNaN(Number(value.pageSize))) {
1004
1497
  optionSource.pageSize = Number(value.pageSize);
@@ -1008,6 +1501,18 @@ class SchemaNormalizerService {
1008
1501
  }
1009
1502
  return optionSource;
1010
1503
  }
1504
+ parseOptionSourceType(value) {
1505
+ const normalized = String(value ?? '').trim().toUpperCase();
1506
+ return OPTION_SOURCE_TYPES.has(normalized) ? normalized : undefined;
1507
+ }
1508
+ parseOptionSourceSearchMode(value) {
1509
+ const normalized = String(value ?? '').trim();
1510
+ return OPTION_SOURCE_SEARCH_MODES.has(normalized) ? normalized : undefined;
1511
+ }
1512
+ parseLookupOpenDetailMode(value) {
1513
+ const normalized = String(value ?? '').trim();
1514
+ return LOOKUP_OPEN_DETAIL_MODES.has(normalized) ? normalized : undefined;
1515
+ }
1011
1516
  parseValuePresentation(value) {
1012
1517
  if (!value || typeof value !== 'object' || Array.isArray(value)) {
1013
1518
  return undefined;
@@ -1537,6 +2042,54 @@ class SchemaNormalizerService {
1537
2042
  if (ui.filter !== undefined) {
1538
2043
  field.filter = ui.filter;
1539
2044
  }
2045
+ if (ui.dialog !== undefined) {
2046
+ const dialog = this.parseLookupDialog(ui.dialog);
2047
+ if (dialog) {
2048
+ field.dialog = dialog;
2049
+ }
2050
+ }
2051
+ if (ui.detailActionLabel !== undefined) {
2052
+ const detailActionLabel = String(ui.detailActionLabel).trim();
2053
+ if (detailActionLabel) {
2054
+ field.detailActionLabel = detailActionLabel;
2055
+ }
2056
+ }
2057
+ if (ui.copyCodeActionLabel !== undefined) {
2058
+ const copyCodeActionLabel = String(ui.copyCodeActionLabel).trim();
2059
+ if (copyCodeActionLabel) {
2060
+ field.copyCodeActionLabel = copyCodeActionLabel;
2061
+ }
2062
+ }
2063
+ if (ui.copyIdActionLabel !== undefined) {
2064
+ const copyIdActionLabel = String(ui.copyIdActionLabel).trim();
2065
+ if (copyIdActionLabel) {
2066
+ field.copyIdActionLabel = copyIdActionLabel;
2067
+ }
2068
+ }
2069
+ if (ui.createActionLabel !== undefined) {
2070
+ const createActionLabel = String(ui.createActionLabel).trim();
2071
+ if (createActionLabel) {
2072
+ field.createActionLabel = createActionLabel;
2073
+ }
2074
+ }
2075
+ if (ui.actions && typeof ui.actions === 'object' && !Array.isArray(ui.actions)) {
2076
+ const actions = {};
2077
+ if (ui.actions.showDetail !== undefined) {
2078
+ actions.showDetail = this.parseBoolean(ui.actions.showDetail);
2079
+ }
2080
+ if (ui.actions.showCopyCode !== undefined) {
2081
+ actions.showCopyCode = this.parseBoolean(ui.actions.showCopyCode);
2082
+ }
2083
+ if (ui.actions.showCopyId !== undefined) {
2084
+ actions.showCopyId = this.parseBoolean(ui.actions.showCopyId);
2085
+ }
2086
+ if (ui.actions.showCreate !== undefined) {
2087
+ actions.showCreate = this.parseBoolean(ui.actions.showCreate);
2088
+ }
2089
+ if (Object.keys(actions).length) {
2090
+ field.actions = actions;
2091
+ }
2092
+ }
1540
2093
  if (ui.filterOptions !== undefined) {
1541
2094
  field.filterOptions = Array.isArray(ui.filterOptions)
1542
2095
  ? [...ui.filterOptions]
@@ -2406,6 +2959,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
2406
2959
  }], ctorParameters: () => [] });
2407
2960
 
2408
2961
  const SCHEMA_CACHE_GLOBAL_CONFIG_READY_TIMEOUT_MS = 1200;
2962
+ function isCrudConfigureOptions(value) {
2963
+ return typeof value === 'object' && value !== null;
2964
+ }
2409
2965
  /**
2410
2966
  * Serviço genérico para operações CRUD em APIs REST padronizadas.
2411
2967
  *
@@ -2503,7 +3059,7 @@ class GenericCrudService {
2503
3059
  if (!resourcePath || !resourcePath.trim()) {
2504
3060
  throw new Error(this.errorMessages.emptyResourcePath);
2505
3061
  }
2506
- const configureOptions = typeof endpointKeyOrOptions === 'object' && endpointKeyOrOptions !== null
3062
+ const configureOptions = isCrudConfigureOptions(endpointKeyOrOptions)
2507
3063
  ? endpointKeyOrOptions
2508
3064
  : { endpointKey: endpointKeyOrOptions };
2509
3065
  const nextEndpointKey = configureOptions.endpointKey ?? this.currentEndpointKey;
@@ -2583,10 +3139,10 @@ class GenericCrudService {
2583
3139
  * Fluxo de schemas (grid e filtro)
2584
3140
  *
2585
3141
  * - Grid/Lista (colunas e metadados do DTO principal):
2586
- * 1) getSchema() chama GET {resource}/schemas (ex.: /api/human-resources/funcionarios/schemas)
2587
- * 2) O backend responde 302 para /schemas/filtered com query params:
2588
- * - path: {basePath}/all (ex.: /api/human-resources/funcionarios/all)
2589
- * - operation: get
3142
+ * 1) getSchema() deriva a superfície canônica de busca/listagem do recurso
3143
+ * 2) Em seguida chama /schemas/filtered com query params:
3144
+ * - path: {basePath}/filter (ex.: /api/human-resources/funcionarios/filter)
3145
+ * - operation: post
2590
3146
  * - schemaType: response
2591
3147
  * 3) O serviço normaliza o schema retornado (x-ui) para montagem de grids e formulários.
2592
3148
  *
@@ -2604,8 +3160,8 @@ class GenericCrudService {
2604
3160
  * Obtém o schema (metadados) do recurso, útil para construção dinâmica de grids e formulários.
2605
3161
  *
2606
3162
  * Fluxo:
2607
- * - Faz GET {resource}/schemas; o backend redireciona (302) para /schemas/filtered
2608
- * com path={basePath}/all, operation=get, schemaType=response.
3163
+ * - Chama /schemas/filtered para a superfície canônica de busca/listagem:
3164
+ * path={basePath}/filter, operation=post, schemaType=response.
2609
3165
  * - O resultado é normalizado e usado para montar colunas de grid e formulários (x-ui).
2610
3166
  *
2611
3167
  * Exemplo:
@@ -2621,10 +3177,12 @@ class GenericCrudService {
2621
3177
  // Armazena a URL para referência posterior
2622
3178
  this._schemaUrl = url;
2623
3179
  console.debug('[CRUD:Service] getSchema:url', { url });
2624
- // Derivar path para o /schemas/filtered do grid (response schema)
3180
+ // Derivar path para o /schemas/filtered do grid (response schema).
3181
+ // Plataformas corporativas devem usar a superfície de busca/listagem governada,
3182
+ // não endpoints irrestritos de coleção como /all.
2625
3183
  const schemaPathBase = this.schemaUrl().replace(/\/schemas$/, '');
2626
- const path = `${schemaPathBase}/all`;
2627
- const operation = 'get';
3184
+ const path = `${schemaPathBase}/filter`;
3185
+ const operation = 'post';
2628
3186
  const schemaType = 'response';
2629
3187
  // Tenant e locale
2630
3188
  const tenant = this.globalConfig.getTenant();
@@ -3380,27 +3938,26 @@ class GenericCrudService {
3380
3938
  let params = new HttpParams()
3381
3939
  .set('page', pageable.pageNumber)
3382
3940
  .set('size', pageable.pageSize);
3383
- pageable.sort?.forEach((s) => (params = params.append('sort', s)));
3384
- opts?.includeIds?.forEach((id) => {
3385
- params = params.append('includeIds', String(id));
3386
- });
3387
- if (opts?.search) {
3388
- params = params.set('search', opts.search);
3389
- }
3390
3941
  this.ensureConfigured();
3391
3942
  const entry = this.resolveEndpointEntry(opts?.endpointKey);
3392
3943
  const base = `${this.getResourceBaseUrl(opts)}/option-sources/${encodeURIComponent(sourceKey)}/options`;
3393
3944
  const url = `${base}/filter`;
3394
3945
  const normalizedCriteria = this.normalizeRangeCriteria(criteria);
3946
+ const requestBody = serializeOptionSourceFilterRequest(normalizedCriteria, {
3947
+ filters: opts?.filters,
3948
+ search: opts?.search,
3949
+ sort: opts?.sortKey,
3950
+ includeIds: opts?.includeIds,
3951
+ });
3395
3952
  const observeVersion = !!opts?.observeVersionHeader;
3396
3953
  const req$ = observeVersion
3397
- ? this.http.post(url, normalizedCriteria, {
3954
+ ? this.http.post(url, requestBody, {
3398
3955
  params,
3399
3956
  observe: 'response',
3400
3957
  headers: composeHeadersWithVersion(entry),
3401
3958
  context: opts?.httpContext,
3402
3959
  })
3403
- : this.http.post(url, normalizedCriteria, {
3960
+ : this.http.post(url, requestBody, {
3404
3961
  params,
3405
3962
  headers: composeHeadersWithVersion(entry),
3406
3963
  context: opts?.httpContext,
@@ -4938,8 +5495,11 @@ class PraxisI18nService {
4938
5495
  return fallback || 'pt-BR';
4939
5496
  }
4940
5497
  t(key, params, fallback, namespace) {
5498
+ return this.tForLocale(this.getLocale(), key, params, fallback, namespace);
5499
+ }
5500
+ tForLocale(locale, key, params, fallback, namespace) {
4941
5501
  const message = this.translateExternally(key, params, fallback)
4942
- ?? this.lookup(key, this.getLocale(), namespace)
5502
+ ?? this.lookup(key, locale, namespace)
4943
5503
  ?? this.lookup(key, this.getFallbackLocale(), namespace)
4944
5504
  ?? fallback
4945
5505
  ?? key;
@@ -5219,12 +5779,17 @@ class ComponentMetadataRegistry {
5219
5779
  };
5220
5780
  });
5221
5781
  const normPorts = meta.ports?.map((port) => this.clonePortContract(port));
5782
+ const normInsertionPresets = meta.insertionPresets?.map((preset) => ({
5783
+ ...preset,
5784
+ ...(preset.inputs ? { inputs: JSON.parse(JSON.stringify(preset.inputs)) } : {}),
5785
+ }));
5222
5786
  return {
5223
5787
  ...meta,
5224
5788
  id: normalizedId,
5225
5789
  inputs: normInputs,
5226
5790
  outputs: normOutputs,
5227
5791
  ports: normPorts,
5792
+ insertionPresets: normInsertionPresets,
5228
5793
  };
5229
5794
  }
5230
5795
  normalizeEditorialDescriptor(meta) {
@@ -5654,6 +6219,17 @@ const GLOBAL_ACTION_UI_SCHEMAS = [
5654
6219
  },
5655
6220
  ],
5656
6221
  },
6222
+ {
6223
+ id: 'navigation.openRoute',
6224
+ label: 'Abrir rota interna',
6225
+ fields: [
6226
+ { key: 'path', label: 'Caminho', type: 'text', required: true, placeholder: '/clientes/detalhe' },
6227
+ { key: 'query', label: 'Query (JSON)', type: 'json', rows: 3 },
6228
+ { key: 'fragment', label: 'Fragmento', type: 'text', placeholder: 'aba' },
6229
+ { key: 'replaceUrl', label: 'Substituir URL atual', type: 'toggle' },
6230
+ { key: 'state', label: 'State (JSON)', type: 'json', rows: 3 },
6231
+ ],
6232
+ },
5657
6233
  {
5658
6234
  id: 'dialog.alert',
5659
6235
  label: 'Alerta simples',
@@ -6045,6 +6621,7 @@ class GlobalActionService {
6045
6621
  }
6046
6622
  return { success: false, error: 'Window not available' };
6047
6623
  });
6624
+ this.register('navigation.openRoute', async (payload) => this.handleNavigationOpenRoute(payload));
6048
6625
  this.register('dialog.alert', async (payload) => {
6049
6626
  if (!this.dialog)
6050
6627
  return { success: false, error: 'Dialog service not available' };
@@ -6154,6 +6731,36 @@ class GlobalActionService {
6154
6731
  return { success: false, error: err?.message || String(err) };
6155
6732
  }
6156
6733
  }
6734
+ async handleNavigationOpenRoute(payload) {
6735
+ const url = this.buildNavigationUrl(payload);
6736
+ if (!url)
6737
+ return { success: false, error: 'Missing path' };
6738
+ try {
6739
+ if (this.router) {
6740
+ await this.router.navigateByUrl(url, {
6741
+ replaceUrl: !!payload?.replaceUrl,
6742
+ state: payload?.state,
6743
+ });
6744
+ return { success: true };
6745
+ }
6746
+ if (typeof window !== 'undefined' && window.location) {
6747
+ if (payload?.replaceUrl && typeof window.location.replace === 'function') {
6748
+ window.location.replace(url);
6749
+ }
6750
+ else if (typeof window.location.assign === 'function') {
6751
+ window.location.assign(url);
6752
+ }
6753
+ else {
6754
+ window.location.href = url;
6755
+ }
6756
+ return { success: true };
6757
+ }
6758
+ return { success: false, error: 'Router not available' };
6759
+ }
6760
+ catch (err) {
6761
+ return { success: false, error: err?.message || String(err) };
6762
+ }
6763
+ }
6157
6764
  async handleRouteRegister(payload) {
6158
6765
  if (!this.router)
6159
6766
  return { success: false, error: 'Router not available' };
@@ -6226,6 +6833,36 @@ class GlobalActionService {
6226
6833
  catch { }
6227
6834
  return { success: true };
6228
6835
  }
6836
+ buildNavigationUrl(payload) {
6837
+ const rawPath = String(payload?.path || '').trim();
6838
+ if (!rawPath)
6839
+ return '';
6840
+ const path = rawPath.split('?')[0].split('#')[0].trim();
6841
+ if (!path)
6842
+ return '';
6843
+ const normalizedPath = path.startsWith('/') ? path : `/${path}`;
6844
+ const query = this.buildQueryString(payload?.query);
6845
+ const fragment = this.buildFragment(payload?.fragment);
6846
+ return `${normalizedPath}${query}${fragment}`;
6847
+ }
6848
+ buildQueryString(query) {
6849
+ if (!query)
6850
+ return '';
6851
+ const params = new URLSearchParams();
6852
+ for (const [key, value] of Object.entries(query)) {
6853
+ if (value === undefined || value === null)
6854
+ continue;
6855
+ params.set(key, String(value));
6856
+ }
6857
+ const serialized = params.toString();
6858
+ return serialized ? `?${serialized}` : '';
6859
+ }
6860
+ buildFragment(fragment) {
6861
+ const raw = String(fragment || '').trim();
6862
+ if (!raw)
6863
+ return '';
6864
+ return `#${encodeURIComponent(raw.replace(/^#/, ''))}`;
6865
+ }
6229
6866
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: GlobalActionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
6230
6867
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: GlobalActionService, providedIn: 'root' });
6231
6868
  }
@@ -8356,6 +8993,12 @@ function mapFieldDefinitionToMetadata(field) {
8356
8993
  'iconStyle',
8357
8994
  'iconFontSize',
8358
8995
  'filterField',
8996
+ 'dialog',
8997
+ 'detailActionLabel',
8998
+ 'copyCodeActionLabel',
8999
+ 'copyIdActionLabel',
9000
+ 'createActionLabel',
9001
+ 'actions',
8359
9002
  ];
8360
9003
  for (const prop of simpleProps) {
8361
9004
  const value = field[prop];
@@ -10499,8 +11142,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
10499
11142
  const DEFAULT_SERVICE_KEY = 'praxis-service';
10500
11143
  const DEFAULT_RELEASE_LIMIT = 50;
10501
11144
  const DEFAULT_ITEM_LIMIT = 5;
10502
- const RELEASES_HREF = 'praxis/config/domain-catalog/releases';
10503
- const ITEMS_HREF = 'praxis/config/domain-catalog/items';
11145
+ const RELEASES_HREF = '/api/praxis/config/domain-catalog/releases';
11146
+ const ITEMS_HREF = '/api/praxis/config/domain-catalog/items';
10504
11147
  class DomainCatalogService {
10505
11148
  http = inject(HttpClient);
10506
11149
  discovery = inject(ResourceDiscoveryService);
@@ -10594,11 +11237,83 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
10594
11237
  args: [{ providedIn: 'any' }]
10595
11238
  }] });
10596
11239
 
10597
- const DEFINITIONS_HREF = 'praxis/config/domain-rules/definitions';
10598
- const MATERIALIZATIONS_HREF = 'praxis/config/domain-rules/materializations';
11240
+ const CHANGE_SETS_HREF = '/api/praxis/config/domain-knowledge/change-sets';
11241
+ class DomainKnowledgeService {
11242
+ http = inject(HttpClient);
11243
+ discovery = inject(ResourceDiscoveryService);
11244
+ createChangeSet(request, options = {}) {
11245
+ return this.http.post(this.discovery.resolveHref(CHANGE_SETS_HREF, options), request, { headers: this.resolveHeaders(options) });
11246
+ }
11247
+ listChangeSets(filters = {}, options = {}) {
11248
+ return this.http.get(this.discovery.resolveHref(CHANGE_SETS_HREF, options), {
11249
+ params: this.buildParams(filters),
11250
+ headers: this.resolveHeaders(options),
11251
+ });
11252
+ }
11253
+ getChangeSet(changeSetId, options = {}) {
11254
+ return this.http.get(this.discovery.resolveHref(`${CHANGE_SETS_HREF}/${encodeURIComponent(changeSetId)}`, options), { headers: this.resolveHeaders(options) });
11255
+ }
11256
+ validateChangeSet(changeSetId, options = {}) {
11257
+ return this.http.post(this.discovery.resolveHref(`${CHANGE_SETS_HREF}/${encodeURIComponent(changeSetId)}/validate`, options), null, { headers: this.resolveHeaders(options) });
11258
+ }
11259
+ transitionChangeSetStatus(changeSetId, request, options = {}) {
11260
+ return this.http.patch(this.discovery.resolveHref(`${CHANGE_SETS_HREF}/${encodeURIComponent(changeSetId)}/status`, options), request, { headers: this.resolveHeaders(options) });
11261
+ }
11262
+ applyChangeSet(changeSetId, options = {}) {
11263
+ return this.http.post(this.discovery.resolveHref(`${CHANGE_SETS_HREF}/${encodeURIComponent(changeSetId)}/apply`, options), null, { headers: this.resolveHeaders(options) });
11264
+ }
11265
+ getChangeSetTimeline(changeSetId, options = {}) {
11266
+ return this.http.get(this.discovery.resolveHref(`${CHANGE_SETS_HREF}/${encodeURIComponent(changeSetId)}/timeline`, options), { headers: this.resolveHeaders(options) });
11267
+ }
11268
+ buildParams(filters) {
11269
+ let params = new HttpParams();
11270
+ Object.entries(filters).forEach(([key, value]) => {
11271
+ if (value !== undefined && value !== null && value !== '') {
11272
+ params = params.set(key, String(value));
11273
+ }
11274
+ });
11275
+ return params;
11276
+ }
11277
+ resolveHeaders(options) {
11278
+ if (options.headers instanceof HttpHeaders) {
11279
+ return options.headers;
11280
+ }
11281
+ const entryHeaders = buildHeaders(this.discovery.resolveApiEntry(options));
11282
+ const explicitHeaders = options.headers ? buildHeaders({ headers: options.headers }) : undefined;
11283
+ if (!entryHeaders) {
11284
+ return explicitHeaders;
11285
+ }
11286
+ if (!explicitHeaders) {
11287
+ return entryHeaders;
11288
+ }
11289
+ let merged = entryHeaders;
11290
+ for (const key of explicitHeaders.keys()) {
11291
+ const values = explicitHeaders.getAll(key);
11292
+ if (values) {
11293
+ merged = merged.set(key, values);
11294
+ }
11295
+ }
11296
+ return merged;
11297
+ }
11298
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: DomainKnowledgeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
11299
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: DomainKnowledgeService, providedIn: 'any' });
11300
+ }
11301
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: DomainKnowledgeService, decorators: [{
11302
+ type: Injectable,
11303
+ args: [{ providedIn: 'any' }]
11304
+ }] });
11305
+
11306
+ const DEFINITIONS_HREF = '/api/praxis/config/domain-rules/definitions';
11307
+ const INTAKE_HREF = '/api/praxis/config/domain-rules/intake';
11308
+ const SIMULATIONS_HREF = '/api/praxis/config/domain-rules/simulations';
11309
+ const PUBLICATIONS_HREF = '/api/praxis/config/domain-rules/publications';
11310
+ const MATERIALIZATIONS_HREF = '/api/praxis/config/domain-rules/materializations';
10599
11311
  class DomainRuleService {
10600
11312
  http = inject(HttpClient);
10601
11313
  discovery = inject(ResourceDiscoveryService);
11314
+ intake(request, options = {}) {
11315
+ return this.http.post(this.discovery.resolveHref(INTAKE_HREF, options), request, { headers: this.resolveHeaders(options) });
11316
+ }
10602
11317
  createDefinition(request, options = {}) {
10603
11318
  return this.http.post(this.discovery.resolveHref(DEFINITIONS_HREF, options), request, { headers: this.resolveHeaders(options) });
10604
11319
  }
@@ -10608,6 +11323,18 @@ class DomainRuleService {
10608
11323
  headers: this.resolveHeaders(options),
10609
11324
  });
10610
11325
  }
11326
+ transitionDefinitionStatus(definitionId, request, options = {}) {
11327
+ return this.http.patch(this.discovery.resolveHref(`${DEFINITIONS_HREF}/${encodeURIComponent(definitionId)}/status`, options), request, { headers: this.resolveHeaders(options) });
11328
+ }
11329
+ getDefinitionTimeline(definitionId, options = {}) {
11330
+ return this.http.get(this.discovery.resolveHref(`${DEFINITIONS_HREF}/${encodeURIComponent(definitionId)}/timeline`, options), { headers: this.resolveHeaders(options) });
11331
+ }
11332
+ simulate(request, options = {}) {
11333
+ return this.http.post(this.discovery.resolveHref(SIMULATIONS_HREF, options), request, { headers: this.resolveHeaders(options) });
11334
+ }
11335
+ publish(request, options = {}) {
11336
+ return this.http.post(this.discovery.resolveHref(PUBLICATIONS_HREF, options), request, { headers: this.resolveHeaders(options) });
11337
+ }
10611
11338
  createMaterialization(request, options = {}) {
10612
11339
  return this.http.post(this.discovery.resolveHref(MATERIALIZATIONS_HREF, options), request, { headers: this.resolveHeaders(options) });
10613
11340
  }
@@ -10617,6 +11344,9 @@ class DomainRuleService {
10617
11344
  headers: this.resolveHeaders(options),
10618
11345
  });
10619
11346
  }
11347
+ transitionMaterializationStatus(materializationId, request, options = {}) {
11348
+ return this.http.patch(this.discovery.resolveHref(`${MATERIALIZATIONS_HREF}/${encodeURIComponent(materializationId)}/status`, options), request, { headers: this.resolveHeaders(options) });
11349
+ }
10620
11350
  buildParams(filters) {
10621
11351
  let params = new HttpParams();
10622
11352
  Object.entries(filters).forEach(([key, value]) => {
@@ -13283,6 +14013,28 @@ const PRAXIS_GLOBAL_ACTION_CATALOG = [
13283
14013
  example: { url: 'https://example.com' },
13284
14014
  },
13285
14015
  },
14016
+ {
14017
+ id: 'navigation.openRoute',
14018
+ label: 'Abrir rota interna',
14019
+ icon: 'route',
14020
+ description: 'Navega para uma rota interna do host.',
14021
+ payloadSchema: {
14022
+ type: 'object',
14023
+ properties: {
14024
+ path: { type: 'string', description: 'Caminho interno da rota.' },
14025
+ query: { type: 'object', description: 'Parâmetros da query string.' },
14026
+ fragment: { type: 'string', description: 'Fragmento/hash opcional.' },
14027
+ replaceUrl: { type: 'boolean', description: 'Substitui a URL atual no histórico.' },
14028
+ state: { type: 'object', description: 'Estado opcional da navegação.' },
14029
+ },
14030
+ required: ['path'],
14031
+ example: {
14032
+ path: '/clientes/detalhe',
14033
+ query: { id: '${item.id}' },
14034
+ replaceUrl: false,
14035
+ },
14036
+ },
14037
+ },
13286
14038
  {
13287
14039
  id: 'dialog.alert',
13288
14040
  label: 'Dialog Alert',
@@ -13335,7 +14087,7 @@ const PRAXIS_GLOBAL_ACTION_CATALOG = [
13335
14087
  id: 'surface.open',
13336
14088
  label: 'Abrir Surface',
13337
14089
  icon: 'open_in_new',
13338
- description: 'Abre modal ou drawer com um widget registrado e bindings dinâmicos.',
14090
+ description: 'Abre modal ou drawer com um widget registrado e bindings dinâmicos. Use payload.* como envelope canônico do evento e runtime.* quando precisar de estado direto do host.',
13339
14091
  payloadSchema: {
13340
14092
  type: 'object',
13341
14093
  properties: {
@@ -13345,7 +14097,10 @@ const PRAXIS_GLOBAL_ACTION_CATALOG = [
13345
14097
  icon: { type: 'string', description: 'Ícone opcional da surface.' },
13346
14098
  size: { type: 'object', description: 'Configuração opcional de tamanho da surface.' },
13347
14099
  widget: { type: 'object', description: 'WidgetDefinition do componente a ser renderizado.' },
13348
- bindings: { type: 'array', description: 'Bindings declarativos aplicados sobre widget.inputs.*.' },
14100
+ bindings: {
14101
+ type: 'array',
14102
+ description: 'Bindings declarativos aplicados sobre widget.inputs.*. Prefira payload.* para o envelope canônico do evento e runtime.* para estado direto do host.',
14103
+ },
13349
14104
  context: { type: 'object', description: 'Contexto explícito adicional exposto ao runtime de bindings.' },
13350
14105
  },
13351
14106
  required: ['presentation', 'widget'],
@@ -13517,6 +14272,7 @@ const SURFACE_OPEN_I18N_CONFIG = {
13517
14272
  'editor.bindings.remove': 'Remover binding',
13518
14273
  'editor.bindings.empty': 'Nenhum binding configurado ainda.',
13519
14274
  'editor.bindings.suggestedSources': 'Origens sugeridas: {{value}}',
14275
+ 'editor.bindings.sourceSemantics': 'Use payload.* para o envelope canônico do evento e runtime.* quando precisar do estado direto exposto pelo componente de origem.',
13520
14276
  'editor.bindings.suggestedTargets': 'Destinos sugeridos: {{value}}',
13521
14277
  'editor.context.title': 'Contexto extra',
13522
14278
  'editor.context.label': 'context (JSON)',
@@ -13565,6 +14321,7 @@ const SURFACE_OPEN_I18N_CONFIG = {
13565
14321
  'editor.bindings.remove': 'Remove binding',
13566
14322
  'editor.bindings.empty': 'No bindings configured yet.',
13567
14323
  'editor.bindings.suggestedSources': 'Suggested sources: {{value}}',
14324
+ 'editor.bindings.sourceSemantics': 'Use payload.* for the canonical event envelope and runtime.* when you need direct host state exposed by the source component.',
13568
14325
  'editor.bindings.suggestedTargets': 'Suggested targets: {{value}}',
13569
14326
  'editor.context.title': 'Extra context',
13570
14327
  'editor.context.label': 'context (JSON)',
@@ -16825,7 +17582,183 @@ function createPersistedPage(identity, page, opts) {
16825
17582
 
16826
17583
  // Global Dialog domain types for GlobalConfig (kept independent of @praxisui/dialog types)
16827
17584
 
16828
- const DOMAIN_CATALOG_CONTEXT_HINT_SCHEMA_VERSION = 'praxis.ai.context-hints.domain-catalog/v0.1';
17585
+ const DOMAIN_CATALOG_CONTEXT_HINT_SCHEMA_VERSION = 'praxis.ai.context-hints.domain-catalog/v0.2';
17586
+
17587
+ const DEFAULT_TITLE$1 = 'Governed knowledge timeline';
17588
+ const DEFAULT_EMPTY_TEXT$1 = 'No safe timeline events published for this change-set.';
17589
+ function domainKnowledgeTimelineToRichContentDocument(timeline, options = {}) {
17590
+ return {
17591
+ kind: 'praxis.rich-content',
17592
+ version: '1.0.0',
17593
+ nodes: [
17594
+ {
17595
+ type: 'timeline',
17596
+ id: `domain-knowledge-timeline:${timeline.changeSetId}`,
17597
+ title: options.title ?? DEFAULT_TITLE$1,
17598
+ emptyText: options.emptyText ?? DEFAULT_EMPTY_TEXT$1,
17599
+ orientation: 'vertical',
17600
+ position: 'right',
17601
+ connectorVariant: 'solid',
17602
+ connectorColor: 'neutral',
17603
+ markerVariant: 'icon',
17604
+ markerColor: 'info',
17605
+ markerStyle: 'filled',
17606
+ items: timeline.events
17607
+ .filter(isSafeTimelineEvent$1)
17608
+ .map((event, index) => mapTimelineEvent$1(event, index)),
17609
+ },
17610
+ ],
17611
+ };
17612
+ }
17613
+ function isSafeTimelineEvent$1(event) {
17614
+ return event.visibility === 'safe';
17615
+ }
17616
+ function mapTimelineEvent$1(event, index) {
17617
+ const target = formatTarget$1(event);
17618
+ const operations = formatOperations(event);
17619
+ const meta = [target, operations].filter((value) => Boolean(value)).join(' | ');
17620
+ return {
17621
+ id: `domain-knowledge-timeline-event:${index}:${event.eventType}`,
17622
+ title: event.summary || event.eventType,
17623
+ subtitle: event.actor ? `${event.actorType ?? 'actor'}: ${event.actor}` : event.actorType ?? undefined,
17624
+ opposite: event.occurredAt ?? undefined,
17625
+ meta: meta || undefined,
17626
+ badge: event.validationStatus ?? event.status ?? event.eventType,
17627
+ icon: iconForEvent$1(event.eventType),
17628
+ markerColor: markerColorForEvent$1(event.eventType),
17629
+ connectorColor: markerColorForEvent$1(event.eventType),
17630
+ };
17631
+ }
17632
+ function formatTarget$1(event) {
17633
+ const keys = event.targetConceptKeys?.filter(Boolean) ?? [];
17634
+ if (!keys.length) {
17635
+ return null;
17636
+ }
17637
+ return `${keys.length} governed concept${keys.length === 1 ? '' : 's'}`;
17638
+ }
17639
+ function formatOperations(event) {
17640
+ const operationTypes = event.operationTypes?.filter(Boolean) ?? [];
17641
+ if (!operationTypes.length && event.operationCount == null) {
17642
+ return null;
17643
+ }
17644
+ const count = event.operationCount == null ? null : `${event.operationCount} operation${event.operationCount === 1 ? '' : 's'}`;
17645
+ const types = operationTypes.length ? operationTypes.join(', ') : null;
17646
+ return [count, types].filter((value) => Boolean(value)).join(': ') || null;
17647
+ }
17648
+ function iconForEvent$1(eventType) {
17649
+ if (eventType.includes('applied')) {
17650
+ return 'published_with_changes';
17651
+ }
17652
+ if (eventType.includes('approved')) {
17653
+ return 'verified';
17654
+ }
17655
+ if (eventType.includes('rejected')) {
17656
+ return 'block';
17657
+ }
17658
+ if (eventType.includes('validation')) {
17659
+ return 'rule';
17660
+ }
17661
+ if (eventType.includes('created')) {
17662
+ return 'add_circle';
17663
+ }
17664
+ return 'timeline';
17665
+ }
17666
+ function markerColorForEvent$1(eventType) {
17667
+ if (eventType.includes('applied')) {
17668
+ return 'success';
17669
+ }
17670
+ if (eventType.includes('approved')) {
17671
+ return 'primary';
17672
+ }
17673
+ if (eventType.includes('rejected')) {
17674
+ return 'error';
17675
+ }
17676
+ if (eventType.includes('validation')) {
17677
+ return 'warning';
17678
+ }
17679
+ if (eventType.includes('created')) {
17680
+ return 'info';
17681
+ }
17682
+ return 'neutral';
17683
+ }
17684
+
17685
+ const DEFAULT_TITLE = 'Governed decision timeline';
17686
+ const DEFAULT_EMPTY_TEXT = 'No safe timeline events published for this decision.';
17687
+ function domainRuleTimelineToRichContentDocument(timeline, options = {}) {
17688
+ return {
17689
+ kind: 'praxis.rich-content',
17690
+ version: '1.0.0',
17691
+ nodes: [
17692
+ {
17693
+ type: 'timeline',
17694
+ id: `domain-rule-timeline:${timeline.ruleDefinitionId}`,
17695
+ title: options.title ?? DEFAULT_TITLE,
17696
+ emptyText: options.emptyText ?? DEFAULT_EMPTY_TEXT,
17697
+ orientation: 'vertical',
17698
+ position: 'right',
17699
+ connectorVariant: 'solid',
17700
+ connectorColor: 'neutral',
17701
+ markerVariant: 'icon',
17702
+ markerColor: 'info',
17703
+ markerStyle: 'filled',
17704
+ items: timeline.events
17705
+ .filter(isSafeTimelineEvent)
17706
+ .map((event, index) => mapTimelineEvent(event, index)),
17707
+ },
17708
+ ],
17709
+ };
17710
+ }
17711
+ function isSafeTimelineEvent(event) {
17712
+ return event.visibility === 'safe';
17713
+ }
17714
+ function mapTimelineEvent(event, index) {
17715
+ const target = formatTarget(event);
17716
+ const sourceHash = event.sourceHash ? `sourceHash: ${event.sourceHash}` : null;
17717
+ const meta = [target, sourceHash].filter((value) => Boolean(value)).join(' | ');
17718
+ return {
17719
+ id: `domain-rule-timeline-event:${index}:${event.eventType}`,
17720
+ title: event.summary || event.eventType,
17721
+ subtitle: event.actor ? `${event.actorType ?? 'actor'}: ${event.actor}` : event.actorType ?? undefined,
17722
+ opposite: event.occurredAt ?? undefined,
17723
+ meta: meta || undefined,
17724
+ badge: event.targetLayer ?? event.eventType,
17725
+ icon: iconForEvent(event.eventType),
17726
+ markerColor: markerColorForEvent(event.eventType),
17727
+ connectorColor: markerColorForEvent(event.eventType),
17728
+ };
17729
+ }
17730
+ function formatTarget(event) {
17731
+ const parts = [
17732
+ event.targetLayer,
17733
+ event.targetArtifactType,
17734
+ event.targetArtifactKey,
17735
+ ].filter((value) => Boolean(value));
17736
+ return parts.length ? parts.join(' / ') : null;
17737
+ }
17738
+ function iconForEvent(eventType) {
17739
+ if (eventType.includes('materialization')) {
17740
+ return 'deployed_code';
17741
+ }
17742
+ if (eventType.includes('approved') || eventType.includes('activated')) {
17743
+ return 'verified';
17744
+ }
17745
+ if (eventType.includes('created')) {
17746
+ return 'add_circle';
17747
+ }
17748
+ return 'timeline';
17749
+ }
17750
+ function markerColorForEvent(eventType) {
17751
+ if (eventType.includes('materialization') || eventType.includes('activated')) {
17752
+ return 'success';
17753
+ }
17754
+ if (eventType.includes('approved')) {
17755
+ return 'primary';
17756
+ }
17757
+ if (eventType.includes('created')) {
17758
+ return 'info';
17759
+ }
17760
+ return 'neutral';
17761
+ }
16829
17762
 
16830
17763
  function normalizeRecord(record) {
16831
17764
  if (!record || typeof record !== 'object')
@@ -18161,6 +19094,9 @@ class SurfaceOpenActionEditorComponent {
18161
19094
  {{ t('editor.bindings.suggestedSources', 'Suggested sources: {{value}}', { value: bindingSourceSuggestionsPreview }) }}
18162
19095
  </div>
18163
19096
  }
19097
+ <div>
19098
+ {{ t('editor.bindings.sourceSemantics', 'Use payload.* for the canonical event envelope and runtime.* for direct host state when the source component exposes it.') }}
19099
+ </div>
18164
19100
  @if (bindingTargetSuggestionsPreview) {
18165
19101
  <div>
18166
19102
  {{ t('editor.bindings.suggestedTargets', 'Suggested targets: {{value}}', { value: bindingTargetSuggestionsPreview }) }}
@@ -18515,6 +19451,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
18515
19451
  {{ t('editor.bindings.suggestedSources', 'Suggested sources: {{value}}', { value: bindingSourceSuggestionsPreview }) }}
18516
19452
  </div>
18517
19453
  }
19454
+ <div>
19455
+ {{ t('editor.bindings.sourceSemantics', 'Use payload.* for the canonical event envelope and runtime.* for direct host state when the source component exposes it.') }}
19456
+ </div>
18518
19457
  @if (bindingTargetSuggestionsPreview) {
18519
19458
  <div>
18520
19459
  {{ t('editor.bindings.suggestedTargets', 'Suggested targets: {{value}}', { value: bindingTargetSuggestionsPreview }) }}
@@ -19550,6 +20489,10 @@ const CAPS = [
19550
20489
  { path: 'page.widgets[].className', category: 'widgets', valueKind: 'string', description: 'Classe CSS opcional do widget.' },
19551
20490
  { path: 'page.widgets[].definition.id', category: 'widgets', valueKind: 'string', description: 'ID do componente do widget (ex: praxis-table).' },
19552
20491
  { path: 'page.widgets[].definition.inputs', category: 'widgets', valueKind: 'object', description: 'Inputs iniciais do widget.' },
20492
+ { path: 'page.widgets[].definition.inputs.hostCapabilities', category: 'widgets', valueKind: 'object', description: 'Capacidades runtime mediadas pelo host quando definition.id = praxis-rich-content. Nao pertence ao JSON persistido.' },
20493
+ { path: 'page.widgets[].definition.inputs.hostCapabilities.dispatchAction', category: 'widgets', valueKind: 'object', description: 'Dispatcher runtime para actionButton e actions declarativas de rich content hospedado na pagina.' },
20494
+ { path: 'page.widgets[].definition.inputs.hostCapabilities.isActionAvailable', category: 'widgets', valueKind: 'object', description: 'Resolver runtime de disponibilidade de actionId para rich content hospedado na pagina.' },
20495
+ { path: 'page.widgets[].definition.inputs.hostCapabilities.hasCapability', category: 'widgets', valueKind: 'object', description: 'Resolver runtime de capabilities como page.customization.enabled e page.widget.selected para rich content hospedado na pagina.' },
19553
20496
  { path: 'page.widgets[].definition.bindingOrder', category: 'widgets', valueKind: 'array', description: 'Ordem de binding de inputs.' },
19554
20497
  { path: 'page.widgets[].shell', category: 'shell', valueKind: 'object', description: 'Configuracao do shell do widget.' },
19555
20498
  { path: 'page.widgets[].shell.kind', category: 'shell', valueKind: 'enum', allowedValues: ENUMS.shellKind, description: 'Tipo de shell.' },
@@ -19651,7 +20594,7 @@ const CAPS = [
19651
20594
  { path: 'page.deviceLayouts.mobile.widgetOverrides.<widgetKey>.hidden', category: 'layout', valueKind: 'boolean', description: 'Oculta o widget em mobile.' },
19652
20595
  ];
19653
20596
  const DYNAMIC_PAGE_AI_CAPABILITIES = {
19654
- version: 'v1.1',
20597
+ version: 'v1.2',
19655
20598
  enums: ENUMS,
19656
20599
  targets: ['praxis-dynamic-page'],
19657
20600
  notes: [
@@ -19663,6 +20606,7 @@ const DYNAMIC_PAGE_AI_CAPABILITIES = {
19663
20606
  'Para remocao/replace, use flags {_remove:true} ou {_replace:true} no item.',
19664
20607
  'Para renomear um link, inclua {_beforeKey:"link-id-anterior"} no item.',
19665
20608
  'Inputs de widgets dependem do componente (ex: praxis-table, praxis-dynamic-form). Evite inventar campos; prefira pedir confirmacao.',
20609
+ 'Quando page.widgets[].definition.id for praxis-rich-content, o host praxis-dynamic-page injeta hostCapabilities em runtime para actions e capability gating; nao serialize funcoes nem tente persistir page.widgets[].definition.inputs.hostCapabilities.',
19666
20610
  'Use ids estaveis para links e keys estaveis para widgets.',
19667
20611
  'Nested component ports usam endpoint component-port com nestedPath; o owner em ref.widget continua sendo o widget top-level.',
19668
20612
  'Objetivo: compor widgets e relacionamentos canonicos (ex.: master-detail).',
@@ -20307,6 +21251,7 @@ const DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK = {
20307
21251
  'resourcePath sempre e o path base do recurso (sem /filter, /all).',
20308
21252
  'Praxis Table gera colunas dinamicamente a partir do resourcePath quando columns nao forem definidas.',
20309
21253
  'Praxis Dynamic Form gera campos dinamicamente a partir do resourcePath quando config nao for definida.',
21254
+ 'Quando um widget praxis-rich-content estiver hospedado na pagina, definition.inputs.document continua sendo o contrato persistido; hostCapabilities e injetado somente em runtime pelo praxis-dynamic-page para actions e capability gating.',
20310
21255
  'Praxis List pode filtrar via config.dataSource.query (enviado para /filter).',
20311
21256
  'Quando houver recursos secundarios (ex.: enderecos), use contextHints.addressResourcePath.',
20312
21257
  'Exemplo master-detail: tabela emite rowClick -> form.resourceId via transform pick-path payload.row.id.',
@@ -20348,8 +21293,8 @@ const DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK = {
20348
21293
  mode: 'enum',
20349
21294
  options: [
20350
21295
  {
20351
- value: 'praxis.ai.context-hints.domain-catalog/v0.1',
20352
- label: 'Domain Catalog context hint contract v0.1',
21296
+ value: 'praxis.ai.context-hints.domain-catalog/v0.2',
21297
+ label: 'Domain Catalog context hint contract v0.2',
20353
21298
  },
20354
21299
  ],
20355
21300
  },
@@ -20388,6 +21333,21 @@ const DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK = {
20388
21333
  { value: 'ai-access-control', label: 'Evaluate AI data visibility and usage constraints' },
20389
21334
  ],
20390
21335
  },
21336
+ 'contextHints.domainCatalog.recommendedAuthoringFlow': {
21337
+ mode: 'enum',
21338
+ options: [
21339
+ { value: 'shared_rule_authoring', label: 'Route the task to shared semantic rule authoring' },
21340
+ { value: 'component_authoring', label: 'Keep the task in component authoring' },
21341
+ { value: 'ui_composition_authoring', label: 'Route the task to UI composition authoring' },
21342
+ ],
21343
+ },
21344
+ 'contextHints.domainCatalog.recommendedRuleType': {
21345
+ mode: 'enum',
21346
+ options: [
21347
+ { value: 'governance', label: 'Governance or compliance shared rule' },
21348
+ { value: 'selection_eligibility', label: 'Selection eligibility shared rule' },
21349
+ ],
21350
+ },
20391
21351
  'contextHints.domainCatalog.relationships': {
20392
21352
  mode: 'suggested',
20393
21353
  options: [
@@ -20466,7 +21426,9 @@ const DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK = {
20466
21426
  patchTemplate: {
20467
21427
  contextHints: {
20468
21428
  domainCatalog: {
20469
- schemaVersion: 'praxis.ai.context-hints.domain-catalog/v0.1',
21429
+ schemaVersion: 'praxis.ai.context-hints.domain-catalog/v0.2',
21430
+ recommendedAuthoringFlow: 'shared_rule_authoring',
21431
+ recommendedRuleType: 'privacy',
20470
21432
  serviceKey: '<serviceKey>',
20471
21433
  resourceKey: '<resourceKey>',
20472
21434
  type: 'governance',
@@ -20500,7 +21462,7 @@ const DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK = {
20500
21462
  'Domain Catalog is a runtime semantic/governance context source, not a FormConfig rule store.',
20501
21463
  'Use DomainCatalogService for read-only lookup of domain vocabulary, relationships and governance items.',
20502
21464
  'LLM tasks must treat aiUsage.visibility and complianceTags as prompt/data-access constraints before generating patches.',
20503
- 'Use contextHints.domainCatalog with schemaVersion praxis.ai.context-hints.domain-catalog/v0.1 to share runtime semantic retrieval intent between frontend and backend.',
21465
+ 'Use contextHints.domainCatalog with schemaVersion praxis.ai.context-hints.domain-catalog/v0.2 to share runtime semantic retrieval intent between frontend and backend.',
20504
21466
  'Shared domain rules may be referenced by resourceKey and catalog release, but should not be copied into component JSON unless intentionally materialized by a backend policy.',
20505
21467
  ],
20506
21468
  };
@@ -21476,7 +22438,7 @@ function renderInlineMarkdown(text) {
21476
22438
  escaped = escaped.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>');
21477
22439
  escaped = escaped.replace(/\*([^*]+)\*/g, '<em>$1</em>');
21478
22440
  placeholders.forEach((value, token) => {
21479
- escaped = escaped.replaceAll(token, value);
22441
+ escaped = escaped.split(token).join(value);
21480
22442
  });
21481
22443
  return escaped;
21482
22444
  }
@@ -23587,15 +24549,24 @@ class WidgetPageStateRuntimeService {
23587
24549
  }
23588
24550
  if (typeof node === 'string') {
23589
24551
  const exact = node.match(/^\s*\$\{([^}]+)\}\s*$/);
23590
- if (exact)
23591
- return this.readPath(env, exact[1].trim());
24552
+ if (exact) {
24553
+ const path = exact[1].trim();
24554
+ const value = this.readPath(env, path);
24555
+ return value !== undefined || this.isPageStateTemplatePath(path) ? value : node;
24556
+ }
23592
24557
  return node.replace(/\$\{([^}]+)\}/g, (_match, path) => {
23593
- const value = this.readPath(env, String(path).trim());
23594
- return value != null ? String(value) : '';
24558
+ const normalizedPath = String(path).trim();
24559
+ const value = this.readPath(env, normalizedPath);
24560
+ if (value != null)
24561
+ return String(value);
24562
+ return this.isPageStateTemplatePath(normalizedPath) ? '' : `\${${path}}`;
23595
24563
  });
23596
24564
  }
23597
24565
  return node;
23598
24566
  }
24567
+ isPageStateTemplatePath(path) {
24568
+ return /^(state|values|derived|context)(\.|$)/.test(path.trim());
24569
+ }
23599
24570
  normalizeDependencyPath(path) {
23600
24571
  if (typeof path !== 'string')
23601
24572
  return '';
@@ -24438,16 +25409,23 @@ class TransformRuntimeService {
24438
25409
  return hash.toString(36);
24439
25410
  }
24440
25411
  toJsonLogicValue(value) {
24441
- if (value === null
24442
- || typeof value === 'string'
24443
- || typeof value === 'number'
24444
- || typeof value === 'boolean') {
24445
- return value;
25412
+ switch (typeof value) {
25413
+ case 'string':
25414
+ case 'number':
25415
+ case 'boolean':
25416
+ return value;
25417
+ case 'undefined':
25418
+ return null;
25419
+ default:
25420
+ break;
25421
+ }
25422
+ if (value === null) {
25423
+ return null;
24446
25424
  }
24447
25425
  if (Array.isArray(value) || (value && typeof value === 'object')) {
24448
25426
  return value;
24449
25427
  }
24450
- return value == null ? null : String(value);
25428
+ return String(value);
24451
25429
  }
24452
25430
  }
24453
25431
 
@@ -25869,16 +26847,23 @@ function looksLikePath(value) {
25869
26847
  return /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\[\d+\])*$/.test(value);
25870
26848
  }
25871
26849
  function toJsonLogicValue(value) {
25872
- if (value === null
25873
- || typeof value === 'string'
25874
- || typeof value === 'number'
25875
- || typeof value === 'boolean') {
25876
- return value;
26850
+ switch (typeof value) {
26851
+ case 'string':
26852
+ case 'number':
26853
+ case 'boolean':
26854
+ return value;
26855
+ case 'undefined':
26856
+ return null;
26857
+ default:
26858
+ break;
26859
+ }
26860
+ if (value === null) {
26861
+ return null;
25877
26862
  }
25878
26863
  if (Array.isArray(value) || (value && typeof value === 'object')) {
25879
26864
  return clone(value);
25880
26865
  }
25881
- return value == null ? null : String(value);
26866
+ return String(value);
25882
26867
  }
25883
26868
  function clone(value) {
25884
26869
  if (value == null || typeof value !== 'object') {
@@ -26621,15 +27606,115 @@ class DynamicWidgetPageComponent {
26621
27606
  pageStateEffective: this.cloneStateValues(runtime.effectiveValues),
26622
27607
  };
26623
27608
  return this.cloneWidgets(widgets).map((widget) => {
27609
+ const runtimeEnrichedWidget = this.enrichRuntimeWidgetInputs(widget, runtime);
26624
27610
  if (!widget.shell) {
26625
- return widget;
27611
+ return runtimeEnrichedWidget;
26626
27612
  }
26627
27613
  return {
26628
- ...widget,
27614
+ ...runtimeEnrichedWidget,
26629
27615
  shell: this.resolveTemplate(widget.shell, templateContext),
26630
27616
  };
26631
27617
  });
26632
27618
  }
27619
+ enrichRuntimeWidgetInputs(widget, runtime) {
27620
+ if (widget.definition?.id !== 'praxis-rich-content') {
27621
+ return widget;
27622
+ }
27623
+ return {
27624
+ ...widget,
27625
+ definition: {
27626
+ ...widget.definition,
27627
+ inputs: {
27628
+ ...(widget.definition.inputs || {}),
27629
+ hostCapabilities: this.buildRichContentHostCapabilities(widget.key, runtime),
27630
+ },
27631
+ },
27632
+ };
27633
+ }
27634
+ buildRichContentHostCapabilities(widgetKey, runtime) {
27635
+ return {
27636
+ dispatchAction: (actionId, payload) => this.dispatchRichContentAction(widgetKey, actionId, payload),
27637
+ isActionAvailable: (actionId) => this.isRichContentActionAvailable(widgetKey, actionId),
27638
+ hasCapability: (capabilityId) => this.hasRichContentCapability(widgetKey, capabilityId, runtime),
27639
+ };
27640
+ }
27641
+ dispatchRichContentAction(widgetKey, actionId, payload) {
27642
+ if (!actionId) {
27643
+ return;
27644
+ }
27645
+ if (this.globalActions.has(actionId)) {
27646
+ void this.globalActions.execute(actionId, payload, {
27647
+ sourceId: widgetKey,
27648
+ widgetKey,
27649
+ payload: {
27650
+ widgetKey,
27651
+ actionId,
27652
+ payload,
27653
+ pageContext: this.mergedContext,
27654
+ pageState: this.cloneStateValues(this.pageRuntime?.effectiveValues || {}),
27655
+ },
27656
+ meta: {
27657
+ origin: 'dynamic-page.rich-content',
27658
+ componentId: 'praxis-dynamic-page',
27659
+ },
27660
+ });
27661
+ return;
27662
+ }
27663
+ this.onWidgetEvent(widgetKey, {
27664
+ ownerWidgetKey: widgetKey,
27665
+ sourceComponentId: 'praxis-rich-content',
27666
+ output: 'customAction',
27667
+ payload: {
27668
+ actionId,
27669
+ payload,
27670
+ globalAction: {
27671
+ actionId,
27672
+ payload,
27673
+ },
27674
+ },
27675
+ });
27676
+ }
27677
+ isRichContentActionAvailable(widgetKey, actionId) {
27678
+ if (!actionId) {
27679
+ return false;
27680
+ }
27681
+ const hasGlobalAction = this.globalActions &&
27682
+ typeof this.globalActions.has === 'function'
27683
+ ? this.globalActions.has(actionId)
27684
+ : false;
27685
+ if (hasGlobalAction) {
27686
+ return true;
27687
+ }
27688
+ const widget = this.widgets().find((candidate) => candidate.key === widgetKey);
27689
+ return !!widget;
27690
+ }
27691
+ hasRichContentCapability(widgetKey, capabilityId, runtime) {
27692
+ switch (capabilityId) {
27693
+ case 'page.customization.enabled':
27694
+ return !!this.enableCustomization;
27695
+ case 'page.customization.disabled':
27696
+ return !this.enableCustomization;
27697
+ case 'page.layout.canvas':
27698
+ return this.isCanvasMode();
27699
+ case 'page.layout.flow':
27700
+ return !this.isCanvasMode();
27701
+ case 'page.state.available':
27702
+ return !!runtime;
27703
+ case 'page.autoPersist.enabled':
27704
+ return !!this.autoPersist;
27705
+ case 'page.autoPersist.disabled':
27706
+ return !this.autoPersist;
27707
+ case 'page.widget.selected':
27708
+ return this.selectedCanvasWidgetKey === widgetKey;
27709
+ case 'page.widget.configurable': {
27710
+ const widget = this.widgets().find((candidate) => candidate.key === widgetKey);
27711
+ const widgetType = widget?.definition?.id || '';
27712
+ return !!this.componentMetadata?.get(widgetType)?.configEditor;
27713
+ }
27714
+ default:
27715
+ return false;
27716
+ }
27717
+ }
26633
27718
  resolveComponentBindingPath(portId, bindingPath) {
26634
27719
  const normalizedPortId = String(portId || '').trim();
26635
27720
  const normalizedBindingPath = String(bindingPath || '').trim();
@@ -28668,7 +29753,7 @@ const PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA = {
28668
29753
  selector: 'praxis-dynamic-page',
28669
29754
  component: DynamicWidgetPageComponent,
28670
29755
  friendlyName: 'Dynamic Page',
28671
- description: 'Pagina dinamica com widgets e composition.links em layout de grid responsivo.',
29756
+ description: 'Pagina dinamica com widgets e composition.links em layout responsivo, incluindo mediacao runtime para rich-content hospedado.',
28672
29757
  icon: 'dashboard',
28673
29758
  inputs: [
28674
29759
  { name: 'page', type: 'WidgetPageDefinition', description: 'Definicao da pagina (widgets, layout e composition.links).' },
@@ -30127,4 +31212,4 @@ function provideHookWhitelist(allowed) {
30127
31212
  * Generated bundle index. Do not edit.
30128
31213
  */
30129
31214
 
30130
- 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, 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_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, 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, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, assertPraxisCollectionExportArtifact, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisLayerScaleCss, buildSchemaId, buildSchemaIdStorageKeySegment, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createFieldLayoutItem, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, 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, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, 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, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef, normalizePath, normalizePraxisDataQueryContext, 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, removeDiacritics, reportTelemetryHookFactory, requiredCheckedValidator, resolveBuiltinPresets, resolveControlTypeAlias, resolveDefaultValuePresentationFormat, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolveResourceAvailabilityReasonKey, resolveSpan, resolveValuePresentation, resolveValuePresentationLocale, serializePraxisCollectionToCsv, serializePraxisCollectionToJson, slugify, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withMessage, withPraxisHttpLoading };
31215
+ 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_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, 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, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, assertPraxisCollectionExportArtifact, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisLayerScaleCss, buildSchemaId, buildSchemaIdStorageKeySegment, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, classifyEntityLookupResult, 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, 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, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, 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, removeDiacritics, reportTelemetryHookFactory, requiredCheckedValidator, resolveBuiltinPresets, resolveControlTypeAlias, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolveResourceAvailabilityReasonKey, resolveSpan, 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 };