structra-ui 0.2.77 → 0.2.79

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.
@@ -8937,6 +8937,24 @@ function normalizarQueryPainelLista(query, todas, valorSeleccionado, compareWith
8937
8937
  }
8938
8938
  return q;
8939
8939
  }
8940
+ /** Remove entradas repetidas pelo `value` (ex.: valor persistido + resultados da pesquisa). */
8941
+ function dedupeUiSelectOptionsByValue(opcoes, compareWith = (a, b) => String(a ?? '') === String(b ?? '')) {
8942
+ const out = [];
8943
+ for (const o of opcoes) {
8944
+ const v = o.value;
8945
+ const idx = out.findIndex((x) => compareWith(x.value, v));
8946
+ if (idx < 0) {
8947
+ out.push(o);
8948
+ continue;
8949
+ }
8950
+ const prevLab = (out[idx].label ?? '').trim();
8951
+ const nextLab = (o.label ?? '').trim();
8952
+ if (!prevLab && nextLab) {
8953
+ out[idx] = o;
8954
+ }
8955
+ }
8956
+ return out;
8957
+ }
8940
8958
  function filtrarUiSelectOptionsPorQuery(opcoes, query) {
8941
8959
  const q = query.trim().toLowerCase();
8942
8960
  if (!q) {
@@ -8953,16 +8971,16 @@ function filtrarUiSelectOptionsPainelComValorPersistente(todas, ev, valorSelecci
8953
8971
  const filtered = opts?.filtrarPorTexto === false ? [...todas] : filtrarUiSelectOptionsPorQuery(todas, queryNorm);
8954
8972
  const v = valorSeleccionado?.trim();
8955
8973
  if (!v) {
8956
- return filtered;
8974
+ return dedupeUiSelectOptionsByValue(filtered, compareWith);
8957
8975
  }
8958
8976
  const sel = todas.find((o) => compareWith(o.value, v));
8959
8977
  if (!sel) {
8960
8978
  return filtered;
8961
8979
  }
8962
8980
  if (filtered.some((o) => compareWith(o.value, v))) {
8963
- return filtered;
8981
+ return dedupeUiSelectOptionsByValue(filtered, compareWith);
8964
8982
  }
8965
- return [sel, ...filtered];
8983
+ return dedupeUiSelectOptionsByValue([sel, ...filtered], compareWith);
8966
8984
  }
8967
8985
 
8968
8986
  /**
@@ -14332,13 +14350,9 @@ const HOME_CONSULTA_LISTA_PATHS_PARA_LIMPAR_CACHE_INLINE = new Set([
14332
14350
  /** Estado definido pelo botão «novo registro» ao lado do campo (`FieldCadastroRedirectButtonComponent`). */
14333
14351
  const STRUCTRA_CADASTRO_INLINE_RETURN_KEY = 'structraCadastroInlineReturn';
14334
14352
  /**
14335
- * Chave em `history.state` definida pelo botão «voltar» (topbar) ao sair de um cadastro para a
14336
- * lista correspondente. Sinaliza à `consulta-base-page` para invalidar o cache em memória da
14337
- * lista antes do `ngOnInit` decidir o modo de carga garante que o utilizador os dados
14338
- * actualizados (linhas inseridas/alteradas/removidas) sem servir cache antigo.
14339
- *
14340
- * Comportamento base Structra: voltar do cadastro **sempre** recarrega o grid; outras formas
14341
- * de chegar à consulta (menu, refresh, link directo) continuam a aproveitar o cache.
14353
+ * Chave em `history.state` para forçar invalidação do cache da lista (opt-in explícito).
14354
+ * Comportamento base Structra desde v0.2.x: voltar do cadastro repõe snapshot/patch em memória;
14355
+ * use esta chave quando precisar de reload completo (ex.: fluxo legado ou refresh manual via router state).
14342
14356
  */
14343
14357
  const STRUCTRA_CONSULTA_FORCE_REFRESH_KEY = 'structraConsultaForceRefresh';
14344
14358
  /** Resultado enviado ao voltar ao formulário origem (salvar / cancelar / exclusão + cancelamento UX). */
@@ -14703,11 +14717,16 @@ function navegarVoltarLista(router, listaUrl, navVoltarSemRecarregarKey) {
14703
14717
  /**
14704
14718
  * Após gravar, envia a linha para merge na lista — mesma convenção que a consulta (`navLinhaGravadaKey`).
14705
14719
  */
14706
- function navegarVoltarListaComLinha(router, listaUrl, navLinhaGravadaKey, linha) {
14720
+ function navegarVoltarListaComLinha(router, listaUrl, navLinhaGravadaKey, linha, navVoltarSemRecarregarKey) {
14721
+ const state = {};
14722
+ if (navVoltarSemRecarregarKey) {
14723
+ state[navVoltarSemRecarregarKey] = true;
14724
+ }
14707
14725
  if (navLinhaGravadaKey != null && linha !== undefined) {
14708
- return router.navigateByUrl(listaUrl, {
14709
- state: { [navLinhaGravadaKey]: linha },
14710
- });
14726
+ state[navLinhaGravadaKey] = linha;
14727
+ }
14728
+ if (Object.keys(state).length > 0) {
14729
+ return router.navigateByUrl(listaUrl, { state });
14711
14730
  }
14712
14731
  return router.navigateByUrl(listaUrl);
14713
14732
  }
@@ -23513,6 +23532,228 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
23513
23532
  args: [{ providedIn: 'root' }]
23514
23533
  }] });
23515
23534
 
23535
+ /** TTL por defeito para sessão de consulta em memória (volta do cadastro). */
23536
+ const STRUCTRA_CONSULTA_GRID_STATE_TTL_MS_DEFAULT = 120_000;
23537
+
23538
+ function normalizeRoutePath(path) {
23539
+ let p = path.trim().split('?')[0];
23540
+ if (p.length > 1 && p.endsWith('/')) {
23541
+ p = p.slice(0, -1);
23542
+ }
23543
+ return p;
23544
+ }
23545
+ function cloneSessionState(state) {
23546
+ try {
23547
+ return structuredClone(state);
23548
+ }
23549
+ catch {
23550
+ return JSON.parse(JSON.stringify(state));
23551
+ }
23552
+ }
23553
+ /**
23554
+ * Chave estável: tenant + entidade (chaveConsulta) + rota da listagem.
23555
+ */
23556
+ function buildConsultaGridStateSessionKey(parts) {
23557
+ const tenant = (parts.tenantId ?? '').trim().toLowerCase() || '_';
23558
+ const entity = parts.chaveConsulta.trim().toLowerCase() || 'consulta';
23559
+ const route = normalizeRoutePath(parts.routePath) || '/';
23560
+ const body = `${tenant}\u001e${route}`;
23561
+ return `${entity}${CONSULTA_LISTA_CACHE_NS_SEP}${body}`;
23562
+ }
23563
+ /**
23564
+ * Cache central em memória do estado da consulta (lista, filtros, paginação) para repor
23565
+ * ao voltar do cadastro sem novo fetch — complementa snapshot gRPC e `history.state`.
23566
+ */
23567
+ class StructraConsultaGridStateService {
23568
+ constructor() {
23569
+ this.sessions = new ConsultaPageCache();
23570
+ this.pendingPatches = new Map();
23571
+ }
23572
+ buildSessionKey(parts) {
23573
+ return buildConsultaGridStateSessionKey(parts);
23574
+ }
23575
+ saveSession(key, state, ttlMs = STRUCTRA_CONSULTA_GRID_STATE_TTL_MS_DEFAULT) {
23576
+ const ns = state.chaveConsulta.trim().toLowerCase() || 'consulta';
23577
+ const now = Date.now();
23578
+ this.sessions.pruneExpired(ns, ttlMs, now);
23579
+ this.sessions.set(key, cloneSessionState(state), ns, 32, now);
23580
+ }
23581
+ getSession(key, chaveConsulta, ttlMs = STRUCTRA_CONSULTA_GRID_STATE_TTL_MS_DEFAULT) {
23582
+ const ns = chaveConsulta.trim().toLowerCase() || 'consulta';
23583
+ const now = Date.now();
23584
+ this.sessions.pruneExpired(ns, ttlMs, now);
23585
+ const hit = this.sessions.get(key, ttlMs, now);
23586
+ return hit ? cloneSessionState(hit) : undefined;
23587
+ }
23588
+ hasValidSession(key, chaveConsulta, ttlMs = STRUCTRA_CONSULTA_GRID_STATE_TTL_MS_DEFAULT) {
23589
+ const ns = chaveConsulta.trim().toLowerCase() || 'consulta';
23590
+ const now = Date.now();
23591
+ this.sessions.pruneExpired(ns, ttlMs, now);
23592
+ return this.sessions.hasValid(key, ttlMs, now);
23593
+ }
23594
+ markReturnFromCadastroPending(key, chaveConsulta, ttlMs) {
23595
+ const session = this.getSession(key, chaveConsulta, ttlMs);
23596
+ if (!session) {
23597
+ return;
23598
+ }
23599
+ this.saveSession(key, { ...session, returnFromCadastroPending: true }, ttlMs);
23600
+ }
23601
+ clearSession(key) {
23602
+ this.sessions.delete(key);
23603
+ }
23604
+ clearForConsulta(chaveConsulta) {
23605
+ const slug = chaveConsulta.trim().toLowerCase();
23606
+ if (!slug) {
23607
+ return;
23608
+ }
23609
+ this.pendingPatches.delete(slug);
23610
+ this.sessions.clearNamespace(slug);
23611
+ }
23612
+ clearAll() {
23613
+ this.sessions.clear();
23614
+ this.pendingPatches.clear();
23615
+ }
23616
+ queuePendingPatch(patch) {
23617
+ const chave = patch.chaveConsulta.trim().toLowerCase();
23618
+ if (!chave) {
23619
+ return;
23620
+ }
23621
+ this.pendingPatches.set(chave, {
23622
+ ...patch,
23623
+ chaveConsulta: chave,
23624
+ timestamp: Date.now(),
23625
+ });
23626
+ }
23627
+ peekPendingPatch(chaveConsulta) {
23628
+ const chave = chaveConsulta.trim().toLowerCase();
23629
+ const hit = this.pendingPatches.get(chave);
23630
+ return hit ? { ...hit } : undefined;
23631
+ }
23632
+ consumePendingPatch(chaveConsulta) {
23633
+ const chave = chaveConsulta.trim().toLowerCase();
23634
+ const hit = this.pendingPatches.get(chave);
23635
+ if (!hit) {
23636
+ return undefined;
23637
+ }
23638
+ this.pendingPatches.delete(chave);
23639
+ return { ...hit };
23640
+ }
23641
+ clearPendingPatch(chaveConsulta) {
23642
+ this.pendingPatches.delete(chaveConsulta.trim().toLowerCase());
23643
+ }
23644
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: StructraConsultaGridStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
23645
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: StructraConsultaGridStateService, providedIn: 'root' }); }
23646
+ }
23647
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: StructraConsultaGridStateService, decorators: [{
23648
+ type: Injectable,
23649
+ args: [{ providedIn: 'root' }]
23650
+ }] });
23651
+
23652
+ const STRUCTRA_CONSULTA_GRID_STATE_TENANT_RESOLVER = new InjectionToken('STRUCTRA_CONSULTA_GRID_STATE_TENANT_RESOLVER');
23653
+ /** Emite quando a sessão deve limpar caches de consulta (logout, troca de tenant). */
23654
+ const STRUCTRA_CONSULTA_GRID_STATE_SESSION_RESET = new InjectionToken('STRUCTRA_CONSULTA_GRID_STATE_SESSION_RESET');
23655
+
23656
+ /**
23657
+ * Activa {@link StructraConsultaGridStateService} e liga reset de sessão (logout / troca de tenant).
23658
+ */
23659
+ function provideStructraConsultaGridState() {
23660
+ return makeEnvironmentProviders([
23661
+ {
23662
+ provide: ENVIRONMENT_INITIALIZER,
23663
+ multi: true,
23664
+ useFactory: () => {
23665
+ const gridState = inject(StructraConsultaGridStateService);
23666
+ const reset = inject(STRUCTRA_CONSULTA_GRID_STATE_SESSION_RESET, { optional: true });
23667
+ return () => {
23668
+ reset?.subscribe(() => gridState.clearAll());
23669
+ };
23670
+ },
23671
+ },
23672
+ ]);
23673
+ }
23674
+
23675
+ function idsEquivalentes(a, b) {
23676
+ return a.trim().toLowerCase() === b.trim().toLowerCase();
23677
+ }
23678
+ function cloneItems(items) {
23679
+ try {
23680
+ return structuredClone(items);
23681
+ }
23682
+ catch {
23683
+ return JSON.parse(JSON.stringify(items));
23684
+ }
23685
+ }
23686
+ /**
23687
+ * Aplica patch local à lista da consulta após gravar/excluir/cancelar no cadastro.
23688
+ */
23689
+ function applyConsultaListaPatch(items, patch, options) {
23690
+ const getId = options.getIdItem;
23691
+ const base = cloneItems(items);
23692
+ if (patch.kind === 'return-only') {
23693
+ return { items: base, applied: true, unsafe: false };
23694
+ }
23695
+ if (patch.kind === 'deleted') {
23696
+ const id = String(patch.idRemovido ?? '').trim();
23697
+ if (!id) {
23698
+ return { items: base, applied: false, unsafe: true };
23699
+ }
23700
+ const next = base.filter((u) => !idsEquivalentes(getId(u), id));
23701
+ if (next.length === base.length) {
23702
+ return { items: base, applied: false, unsafe: true };
23703
+ }
23704
+ return { items: next, applied: true, unsafe: false };
23705
+ }
23706
+ const rawItem = patch.item;
23707
+ if (rawItem == null || typeof rawItem !== 'object') {
23708
+ return { items: base, applied: false, unsafe: true };
23709
+ }
23710
+ const linha = rawItem;
23711
+ const idLinha = getId(linha);
23712
+ if (!idLinha.trim()) {
23713
+ return { items: base, applied: false, unsafe: true };
23714
+ }
23715
+ const matches = options.itemMatchesConsulta?.(linha) ?? true;
23716
+ const idx = base.findIndex((u) => idsEquivalentes(getId(u), idLinha));
23717
+ if (patch.kind === 'updated') {
23718
+ if (idx < 0) {
23719
+ if (!matches) {
23720
+ return { items: base, applied: false, unsafe: true };
23721
+ }
23722
+ return { items: [linha, ...base], applied: true, unsafe: false };
23723
+ }
23724
+ if (!matches) {
23725
+ const next = base.filter((_, i) => i !== idx);
23726
+ return { items: next, applied: true, unsafe: false };
23727
+ }
23728
+ const next = base.map((u, i) => (i === idx ? linha : u));
23729
+ return { items: next, applied: true, unsafe: false };
23730
+ }
23731
+ if (patch.kind === 'created') {
23732
+ if (idx >= 0) {
23733
+ const next = base.map((u, i) => (i === idx ? linha : u));
23734
+ return { items: next, applied: true, unsafe: false };
23735
+ }
23736
+ if (!matches) {
23737
+ return { items: base, applied: false, unsafe: true };
23738
+ }
23739
+ return { items: [linha, ...base], applied: true, unsafe: false };
23740
+ }
23741
+ return { items: base, applied: false, unsafe: true };
23742
+ }
23743
+ function consultaCadastroPatchKindFromModo(modo) {
23744
+ return modo === 'novo' ? 'created' : 'updated';
23745
+ }
23746
+
23747
+ /** Chaves `history.state` para lista ↔ cadastro quando não há entrada no registry legacy. */
23748
+ function consultaNavKeysStructra(slug) {
23749
+ const s = slug.trim().toLowerCase() || 'cadastro';
23750
+ return {
23751
+ linhaGravada: `structra:consulta:${s}:linha-gravada`,
23752
+ voltarSemRecarregar: `structra:consulta:${s}:voltar-sem-recarregar`,
23753
+ idExcluido: `structra:consulta:${s}:id-excluido`,
23754
+ };
23755
+ }
23756
+
23516
23757
  /**
23517
23758
  * Factory que devolve o utilizador actual (ex.: `() => auth.getUser()`).
23518
23759
  * Sobrescrever na app com `deps` + `useFactory` ligado ao serviço de auth.
@@ -25025,16 +25266,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
25025
25266
  args: ['cadastroValorAtivoNg', { read: NgModel }]
25026
25267
  }] } });
25027
25268
 
25028
- /** Chaves `history.state` para lista ↔ cadastro quando não há entrada no registry legacy. */
25029
- function consultaNavKeysStructra(slug) {
25030
- const s = slug.trim().toLowerCase() || 'cadastro';
25031
- return {
25032
- linhaGravada: `structra:consulta:${s}:linha-gravada`,
25033
- voltarSemRecarregar: `structra:consulta:${s}:voltar-sem-recarregar`,
25034
- idExcluido: `structra:consulta:${s}:id-excluido`,
25035
- };
25036
- }
25037
-
25038
25269
  /** Menu «⋯» do select «Filtro» quando há preset seleccionado. */
25039
25270
  const CONSULTA_FILTRO_PRESET_CONTEXT_MENU_ID = 'consulta-filtro-preset-context';
25040
25271
  const CTX_MENU_EDITAR_FILTRO_PRESET = 'ctx-editar-filtro-preset';
@@ -25057,6 +25288,10 @@ class ConsultaBasePageComponent {
25057
25288
  this.navContentReady = inject(STRUCTRA_SHELL_NAV_CONTENT_READY);
25058
25289
  this.injector = inject(Injector);
25059
25290
  this.listaMemoriaCache = inject(ConsultaListaMemoriaCacheService);
25291
+ this.gridState = inject(StructraConsultaGridStateService);
25292
+ this.gridStateTenantResolver = inject(STRUCTRA_CONSULTA_GRID_STATE_TENANT_RESOLVER, {
25293
+ optional: true,
25294
+ });
25060
25295
  this.router = inject(Router);
25061
25296
  this.routeReuse = inject(CONSULTA_ROUTE_REUSE, { optional: true }) ?? NO_OP_CONSULTA_ROUTE_REUSE;
25062
25297
  this.bp = inject(BreakpointObserver);
@@ -25077,7 +25312,10 @@ class ConsultaBasePageComponent {
25077
25312
  chaveConsulta: chave,
25078
25313
  returnUrl: this.router.url,
25079
25314
  navVoltarSemRecarregarKey: navKeys.voltarSemRecarregar,
25080
- flushScroll: () => this.scrollPreserveHostDetach?.flush(),
25315
+ flushScroll: () => {
25316
+ this.persistirEstadoGridConsulta();
25317
+ this.scrollPreserveHostDetach?.flush();
25318
+ },
25081
25319
  };
25082
25320
  }, ...(ngDevMode ? [{ debugName: "gridNavigatePreserve" }] : /* istanbul ignore next */ []));
25083
25321
  this.cadastroFiltroDialog = viewChild.required(ConsultaCadastroFiltroDialogComponent);
@@ -25364,14 +25602,8 @@ class ConsultaBasePageComponent {
25364
25602
  static { this.CONSULTA_MULTISELECT_IDS_VAZIO = []; }
25365
25603
  ngOnInit() {
25366
25604
  /**
25367
- * Voltar do cadastro (botão da topbar): `home.voltarParaListaCadastro` põe a chave
25368
- * {@link STRUCTRA_CONSULTA_FORCE_REFRESH_KEY} em `history.state`. Aqui invalidamos o cache
25369
- * em memória da lista para garantir que o `tentarHidratarListaDoCacheSincrono` mais
25370
- * abaixo não devolve dados antigos — assim o utilizador vê sempre os registos
25371
- * inseridos/alterados/removidos depois do fetch real.
25372
- *
25373
- * Outras formas de chegar à consulta (menu, link directo, refresh) não passam esta chave
25374
- * e continuam a aproveitar o cache em memória.
25605
+ * Opt-in explícito (`STRUCTRA_CONSULTA_FORCE_REFRESH_KEY` em `history.state`) para invalidar
25606
+ * cache da lista e forçar fetch. Voltar normal do cadastro usa patch em memória / grid state.
25375
25607
  */
25376
25608
  this.consumirForceRefreshDoHistoryState();
25377
25609
  const rt = this.runtime();
@@ -25430,17 +25662,40 @@ class ConsultaBasePageComponent {
25430
25662
  }
25431
25663
  /**
25432
25664
  * Voltar do cadastro (`skip-fetch`): repor itens **antes** de ir à rede pelos presets/metadata.
25433
- * Assim a grelha não fica um frame vazio com o mesmo «ritmo» que a abertura inicial com skeleton.
25665
+ * Grid state + patch têm prioridade sobre `history.state`/snapshot legado evita repor lista
25666
+ * stale e descartar o patch enfileirado no save.
25434
25667
  */
25435
- const mode = rt.onConsultaStartup?.({
25436
- setItems: (items) => {
25437
- this.chaveListaExibidaNaUi = null;
25438
- this.items.set(items);
25439
- },
25440
- filtroUi: this.filtroUiServidor(),
25441
- }) ?? 'fetch';
25668
+ let mode = this.tentarRestaurarGridStateDoCadastro();
25669
+ if (mode === 'fetch') {
25670
+ mode = this.tentarSkipFetchComPatchNoSnapshotServico();
25671
+ }
25672
+ if (mode === 'fetch') {
25673
+ if (this.detectarRetornoDoCadastro()) {
25674
+ this.limparSomenteListaMemoriaCache();
25675
+ }
25676
+ mode =
25677
+ rt.onConsultaStartup?.({
25678
+ setItems: (items) => {
25679
+ this.chaveListaExibidaNaUi = null;
25680
+ this.items.set(items);
25681
+ },
25682
+ filtroUi: this.filtroUiServidor(),
25683
+ }) ?? 'fetch';
25684
+ }
25685
+ const patchMode = this.tentarAplicarPatchPendenteAosItemsActuais();
25686
+ if (patchMode === 'skip-fetch') {
25687
+ mode = 'skip-fetch';
25688
+ }
25689
+ else if (mode === 'skip-fetch' && patchMode === 'patch-failed') {
25690
+ /**
25691
+ * Snapshot/`history.state` repôs lista antiga mas o patch enfileirado no save falhou
25692
+ * (ex.: `linhaSalvaParaLista` omisso) — força fetch em vez de ficar com dados stale.
25693
+ */
25694
+ mode = 'fetch';
25695
+ this.limparSomenteListaMemoriaCache();
25696
+ }
25442
25697
  if (mode === 'skip-fetch') {
25443
- this.limparCacheListaConsulta();
25698
+ this.limparSomenteListaMemoriaCache();
25444
25699
  }
25445
25700
  if (mode === 'fetch') {
25446
25701
  this.tentarHidratarListaDoCacheSincrono();
@@ -25492,7 +25747,9 @@ class ConsultaBasePageComponent {
25492
25747
  filtroUi = this.filtroUiServidor();
25493
25748
  }
25494
25749
  else {
25495
- this.limparCacheListaConsulta();
25750
+ if (mode !== 'skip-fetch') {
25751
+ this.limparCacheListaConsulta();
25752
+ }
25496
25753
  try {
25497
25754
  const b = await rt.loadConsultaBundleAsync();
25498
25755
  presetList = b.presets;
@@ -25956,6 +26213,7 @@ class ConsultaBasePageComponent {
25956
26213
  if (link == null || link === '') {
25957
26214
  return;
25958
26215
  }
26216
+ this.persistirEstadoGridConsulta();
25959
26217
  const key = buildRouteReuseKeyFromNovoRouterLink(link);
25960
26218
  if (key !== '') {
25961
26219
  this.routeReuse.invalidateRouteReuseKey(key);
@@ -26012,12 +26270,242 @@ class ConsultaBasePageComponent {
26012
26270
  this.presets.set(list);
26013
26271
  }
26014
26272
  limparCacheListaConsulta() {
26273
+ this.limparSomenteListaMemoriaCache();
26274
+ const ns = this.runtimeConsulta().consultaListaCacheNamespace?.trim();
26275
+ if (ns) {
26276
+ this.gridState.clearForConsulta(ns);
26277
+ }
26278
+ }
26279
+ /** Invalida só páginas em memória da lista — preserva sessão/patch do grid state. */
26280
+ limparSomenteListaMemoriaCache() {
26015
26281
  const ns = this.runtimeConsulta().consultaListaCacheNamespace?.trim();
26016
- if (ns)
26282
+ if (ns) {
26017
26283
  this.listaMemoriaCache.clearConsulta(ns);
26284
+ }
26018
26285
  this.ultimaChaveOrdenacaoListaCache = null;
26019
26286
  this.chaveListaExibidaNaUi = null;
26020
26287
  }
26288
+ resolveNavVoltarSemRecarregarKey() {
26289
+ const chave = this.runtimeConsulta().consultaListaCacheNamespace?.trim();
26290
+ if (!chave) {
26291
+ return undefined;
26292
+ }
26293
+ return consultaNavKeysStructra(chave).voltarSemRecarregar;
26294
+ }
26295
+ historyTemVoltarSemRecarregar() {
26296
+ const key = this.resolveNavVoltarSemRecarregarKey();
26297
+ if (!key) {
26298
+ return false;
26299
+ }
26300
+ try {
26301
+ const navSt = history.state;
26302
+ return navSt != null && typeof navSt === 'object' && navSt[key] === true;
26303
+ }
26304
+ catch {
26305
+ return false;
26306
+ }
26307
+ }
26308
+ detectarRetornoDoCadastro() {
26309
+ const chave = this.runtimeConsulta().consultaListaCacheNamespace?.trim();
26310
+ if (!chave) {
26311
+ return false;
26312
+ }
26313
+ if (this.gridState.peekPendingPatch(chave)) {
26314
+ return true;
26315
+ }
26316
+ return this.historyTemVoltarSemRecarregar();
26317
+ }
26318
+ aplicarPatchPendenteAItems(items, patch, appliedConsultaOverride) {
26319
+ const rt = this.runtimeConsulta();
26320
+ const getIdItem = (item) => String(item.id ?? '');
26321
+ const appliedSnap = appliedConsultaOverride !== undefined ? appliedConsultaOverride : this.appliedConsulta();
26322
+ const presetSnap = appliedSnap
26323
+ ? this.presets().find((p) => p.id === appliedSnap.presetId)
26324
+ : undefined;
26325
+ const result = applyConsultaListaPatch(items, patch, {
26326
+ getIdItem,
26327
+ itemMatchesConsulta: patch.kind === 'return-only' || !appliedSnap || !presetSnap?.itens?.length
26328
+ ? undefined
26329
+ : (item) => rt.itemPassaConsulta(item, presetSnap.itens, appliedSnap.valores),
26330
+ });
26331
+ if (patch.kind !== 'return-only' && (!result.applied || result.unsafe)) {
26332
+ return null;
26333
+ }
26334
+ return result.items;
26335
+ }
26336
+ /**
26337
+ * Fallback quando a sessão de grid state falhou mas o cadastro enfileirou patch —
26338
+ * repõe snapshot gRPC e aplica merge local (sem fetch).
26339
+ */
26340
+ tentarSkipFetchComPatchNoSnapshotServico() {
26341
+ const chave = this.runtimeConsulta().consultaListaCacheNamespace?.trim();
26342
+ if (!chave) {
26343
+ return 'fetch';
26344
+ }
26345
+ const patch = this.gridState.peekPendingPatch(chave);
26346
+ if (!patch || patch.kind === 'return-only') {
26347
+ return 'fetch';
26348
+ }
26349
+ const snap = this.runtimeConsulta().lerSnapshotListaConsulta?.() ?? null;
26350
+ if (snap == null) {
26351
+ return 'fetch';
26352
+ }
26353
+ const consumed = this.gridState.consumePendingPatch(chave);
26354
+ if (!consumed) {
26355
+ return 'fetch';
26356
+ }
26357
+ const next = this.aplicarPatchPendenteAItems(snap, consumed);
26358
+ if (next == null) {
26359
+ return 'fetch';
26360
+ }
26361
+ this.items.set(next);
26362
+ this.runtimeConsulta().onListaAlteradaLocalmente?.(next);
26363
+ this.limparHistoryVoltarSemRecarregarSePresente();
26364
+ return 'skip-fetch';
26365
+ }
26366
+ /**
26367
+ * Última tentativa: `onConsultaStartup` repôs snapshot antigo (voltarSemRecarregar) —
26368
+ * aplica patch enfileirado no save antes de aceitar skip-fetch.
26369
+ */
26370
+ tentarAplicarPatchPendenteAosItemsActuais() {
26371
+ const chave = this.runtimeConsulta().consultaListaCacheNamespace?.trim();
26372
+ if (!chave) {
26373
+ return 'no-patch';
26374
+ }
26375
+ const patch = this.gridState.consumePendingPatch(chave);
26376
+ if (!patch) {
26377
+ return 'no-patch';
26378
+ }
26379
+ const next = this.aplicarPatchPendenteAItems(this.items(), patch);
26380
+ if (next == null) {
26381
+ return 'patch-failed';
26382
+ }
26383
+ this.items.set(next);
26384
+ this.runtimeConsulta().onListaAlteradaLocalmente?.(next);
26385
+ this.limparHistoryVoltarSemRecarregarSePresente();
26386
+ return 'skip-fetch';
26387
+ }
26388
+ resolveGridStateTenantId() {
26389
+ return this.gridStateTenantResolver?.() ?? null;
26390
+ }
26391
+ buildGridStateSessionKey() {
26392
+ const chave = this.runtimeConsulta().consultaListaCacheNamespace?.trim();
26393
+ if (!chave) {
26394
+ return null;
26395
+ }
26396
+ const routePath = this.router.url.split('?')[0] ?? '';
26397
+ return this.gridState.buildSessionKey({
26398
+ tenantId: this.resolveGridStateTenantId(),
26399
+ chaveConsulta: chave,
26400
+ routePath,
26401
+ });
26402
+ }
26403
+ /** Grava estado completo da consulta antes de sair para cadastro (patch ao voltar). */
26404
+ persistirEstadoGridConsulta() {
26405
+ const rt = this.runtimeConsulta();
26406
+ const chave = rt.consultaListaCacheNamespace?.trim();
26407
+ if (!chave) {
26408
+ return;
26409
+ }
26410
+ const sessionKey = this.buildGridStateSessionKey();
26411
+ if (!sessionKey) {
26412
+ return;
26413
+ }
26414
+ const slice = this.resolveConsultaListaQuerySlice();
26415
+ const cacheKey = this.montarCacheKeyListaOuNull(undefined, slice);
26416
+ const applied = this.appliedConsulta();
26417
+ this.gridState.saveSession(sessionKey, {
26418
+ items: this.items(),
26419
+ total: this.items().length,
26420
+ chrome: {
26421
+ consultaPresetId: this.consultaPresetId(),
26422
+ consultaValores: { ...this.consultaValores() },
26423
+ appliedConsulta: applied
26424
+ ? { presetId: applied.presetId, valores: { ...applied.valores } }
26425
+ : null,
26426
+ painelFiltroRecolhido: this.painelFiltroRecolhido(),
26427
+ },
26428
+ querySlice: slice,
26429
+ listaCacheKey: cacheKey,
26430
+ routePath: this.router.url.split('?')[0] ?? '',
26431
+ chaveConsulta: chave,
26432
+ tenantId: this.resolveGridStateTenantId(),
26433
+ timestamp: Date.now(),
26434
+ returnFromCadastroPending: true,
26435
+ });
26436
+ }
26437
+ /**
26438
+ * Fallback quando `history.state` não traz patch — repõe sessão gravada ao sair para cadastro.
26439
+ */
26440
+ tentarRestaurarGridStateDoCadastro() {
26441
+ const rt = this.runtimeConsulta();
26442
+ const chave = rt.consultaListaCacheNamespace?.trim();
26443
+ if (!chave) {
26444
+ return 'fetch';
26445
+ }
26446
+ const sessionKey = this.buildGridStateSessionKey();
26447
+ if (!sessionKey || !this.gridState.hasValidSession(sessionKey, chave)) {
26448
+ return 'fetch';
26449
+ }
26450
+ const session = this.gridState.getSession(sessionKey, chave);
26451
+ const pendingPatch = this.gridState.peekPendingPatch(chave);
26452
+ const voltarSemRecarregar = this.historyTemVoltarSemRecarregar();
26453
+ const deveRestaurarSessao = session != null &&
26454
+ (session.returnFromCadastroPending || pendingPatch != null || voltarSemRecarregar);
26455
+ if (!deveRestaurarSessao) {
26456
+ return 'fetch';
26457
+ }
26458
+ const sessionState = session;
26459
+ let items = sessionState.items;
26460
+ const patch = this.gridState.consumePendingPatch(chave);
26461
+ if (patch) {
26462
+ const next = this.aplicarPatchPendenteAItems(items, patch, sessionState.chrome.appliedConsulta);
26463
+ if (next == null) {
26464
+ return 'fetch';
26465
+ }
26466
+ items = next;
26467
+ }
26468
+ this.chaveListaExibidaNaUi = sessionState.listaCacheKey;
26469
+ this.consultaPresetId.set(sessionState.chrome.consultaPresetId);
26470
+ this.consultaValores.set({ ...sessionState.chrome.consultaValores });
26471
+ this.appliedConsulta.set(sessionState.chrome.appliedConsulta
26472
+ ? {
26473
+ presetId: sessionState.chrome.appliedConsulta.presetId,
26474
+ valores: { ...sessionState.chrome.appliedConsulta.valores },
26475
+ }
26476
+ : null);
26477
+ if (sessionState.chrome.painelFiltroRecolhido !== undefined) {
26478
+ this.painelFiltroRecolhido.set(sessionState.chrome.painelFiltroRecolhido);
26479
+ }
26480
+ this.items.set(items);
26481
+ rt.onListaAlteradaLocalmente?.(items);
26482
+ this.gridState.saveSession(sessionKey, {
26483
+ ...sessionState,
26484
+ items,
26485
+ returnFromCadastroPending: false,
26486
+ timestamp: Date.now(),
26487
+ });
26488
+ this.limparHistoryVoltarSemRecarregarSePresente();
26489
+ return 'skip-fetch';
26490
+ }
26491
+ limparHistoryVoltarSemRecarregarSePresente() {
26492
+ const key = this.resolveNavVoltarSemRecarregarKey();
26493
+ if (!key) {
26494
+ return;
26495
+ }
26496
+ try {
26497
+ const navSt = history.state;
26498
+ if (!navSt || typeof navSt !== 'object' || navSt[key] !== true) {
26499
+ return;
26500
+ }
26501
+ const rest = { ...navSt };
26502
+ delete rest[key];
26503
+ history.replaceState(rest, '');
26504
+ }
26505
+ catch {
26506
+ /* SSR / ambiente sem history */
26507
+ }
26508
+ }
26021
26509
  /**
26022
26510
  * Detecta {@link STRUCTRA_CONSULTA_FORCE_REFRESH_KEY} em `history.state` (posto pelo botão
26023
26511
  * voltar do cadastro) e, se presente, invalida o cache em memória da lista e remove a chave
@@ -26287,6 +26775,7 @@ class ConsultaBasePageComponent {
26287
26775
  }
26288
26776
  }
26289
26777
  editar(row) {
26778
+ this.persistirEstadoGridConsulta();
26290
26779
  this.runtimeConsulta().editar?.(row);
26291
26780
  }
26292
26781
  async duplicar(row) {
@@ -26850,6 +27339,10 @@ function buildConsultaPageRuntime(config, deps) {
26850
27339
  onListaAlteradaLocalmente: config.onListaAlteradaLocalmente
26851
27340
  ? (items) => config.onListaAlteradaLocalmente(items)
26852
27341
  : (items) => atualizarSnapshotListaNoServico(items),
27342
+ lerSnapshotListaConsulta: () => {
27343
+ const snap = config.listaConsulta?.getSnapshotConsulta();
27344
+ return snap != null ? [...snap] : null;
27345
+ },
26853
27346
  toastTitleLista,
26854
27347
  toastTitleListaAviso,
26855
27348
  toastTitleFiltros,
@@ -31050,6 +31543,52 @@ function buildCadastroPageRuntime(config, deps, options) {
31050
31543
  };
31051
31544
  const inlineResultKey = inlineCfg?.resultStateKey ?? STRUCTRA_CADASTRO_INLINE_RESULT_KEY;
31052
31545
  const listaUrlNavegacao = () => resolveCadastroListaUrlParaNavegacao(config.listaUrl, deps.router.url);
31546
+ const gridState = inj
31547
+ ? runInInjectionContext(inj, () => inject(StructraConsultaGridStateService, { optional: true }))
31548
+ : undefined;
31549
+ const routeReuse = inj
31550
+ ? runInInjectionContext(inj, () => inject(CONSULTA_ROUTE_REUSE, { optional: true }) ?? NO_OP_CONSULTA_ROUTE_REUSE)
31551
+ : NO_OP_CONSULTA_ROUTE_REUSE;
31552
+ const invalidateConsultaListaRouteReuse = (listaUrl) => {
31553
+ const key = buildRouteReuseKeyFromAppPathname((listaUrl.split('?')[0] ?? '').trim());
31554
+ if (key) {
31555
+ routeReuse.invalidateRouteReuseKey(key);
31556
+ }
31557
+ };
31558
+ const resolveLinhaSalvaParaPatchConsulta = (res) => {
31559
+ const mapped = config.linhaSalvaParaLista?.(res);
31560
+ if (mapped != null && typeof mapped === 'object') {
31561
+ return mapped;
31562
+ }
31563
+ if (cadastroResponseEntityId(res) != null) {
31564
+ return res;
31565
+ }
31566
+ return undefined;
31567
+ };
31568
+ const queueConsultaGridPatch = (kind, payload) => {
31569
+ const chave = config.consultaChaveConsulta?.trim();
31570
+ if (!chave || !gridState) {
31571
+ return;
31572
+ }
31573
+ gridState.queuePendingPatch({
31574
+ kind,
31575
+ chaveConsulta: chave,
31576
+ listaUrl: listaUrlNavegacao(),
31577
+ ...(payload?.item !== undefined ? { item: payload.item } : {}),
31578
+ ...(payload?.idRemovido ? { idRemovido: payload.idRemovido } : {}),
31579
+ });
31580
+ };
31581
+ const consultaChaveNormalizada = () => config.consultaChaveConsulta?.trim().toLowerCase() ?? '';
31582
+ const temPatchConsultaSalvoPendente = () => {
31583
+ const chave = consultaChaveNormalizada();
31584
+ if (!chave || !gridState) {
31585
+ return false;
31586
+ }
31587
+ const pending = gridState.peekPendingPatch(chave);
31588
+ return (pending != null &&
31589
+ pending.kind !== 'return-only' &&
31590
+ pending.kind !== 'deleted');
31591
+ };
31053
31592
  const resolverIdEdicaoParaSalvar = () => {
31054
31593
  if (contextId) {
31055
31594
  const v = String(contextId() ?? '').trim();
@@ -31109,6 +31648,12 @@ function buildCadastroPageRuntime(config, deps, options) {
31109
31648
  invalidateCadastroCachesParaEstaFolha();
31110
31649
  config.onSalvarSuccess?.();
31111
31650
  const host = resolveInlineHost();
31651
+ if (!host) {
31652
+ const linhaSalva = resolveLinhaSalvaParaPatchConsulta(res);
31653
+ queueConsultaGridPatch(consultaCadastroPatchKindFromModo(modoGravacao), {
31654
+ item: linhaSalva,
31655
+ });
31656
+ }
31112
31657
  if (host) {
31113
31658
  let mapped = inlineCfg?.mapSaveResult?.(res, modoGravacao);
31114
31659
  if (mapped === undefined) {
@@ -31155,7 +31700,9 @@ function buildCadastroPageRuntime(config, deps, options) {
31155
31700
  }
31156
31701
  else if (config.navegarParaConsultaAposSalvar === true) {
31157
31702
  const linha = config.linhaSalvaParaLista?.(res);
31158
- await navegarVoltarListaComLinha(deps.router, listaUrlNavegacao(), config.navLinhaGravadaKey, linha);
31703
+ const lista = listaUrlNavegacao();
31704
+ invalidateConsultaListaRouteReuse(lista);
31705
+ await navegarVoltarListaComLinha(deps.router, lista, config.navLinhaGravadaKey, linha, config.navVoltarSemRecarregarKey);
31159
31706
  }
31160
31707
  else if (gravarComoNovo) {
31161
31708
  const newId = cadastroResponseEntityId(res);
@@ -31204,6 +31751,10 @@ function buildCadastroPageRuntime(config, deps, options) {
31204
31751
  }
31205
31752
  const lista = listaUrlNavegacao().trim();
31206
31753
  if (lista !== '') {
31754
+ if (!temPatchConsultaSalvoPendente()) {
31755
+ queueConsultaGridPatch('return-only');
31756
+ }
31757
+ invalidateConsultaListaRouteReuse(lista);
31207
31758
  void navegarVoltarLista(deps.router, lista, config.navVoltarSemRecarregarKey);
31208
31759
  return;
31209
31760
  }
@@ -31319,10 +31870,15 @@ function buildCadastroPageRuntime(config, deps, options) {
31319
31870
  }
31320
31871
  }
31321
31872
  else if (config.navIdRemovidoKey) {
31322
- void navegarVoltarListaComIdRemovido(deps.router, listaUrlNavegacao(), config.navIdRemovidoKey, eid, config.navVoltarSemRecarregarKey);
31873
+ const listaExcluir = listaUrlNavegacao();
31874
+ queueConsultaGridPatch('deleted', { idRemovido: eid });
31875
+ invalidateConsultaListaRouteReuse(listaExcluir);
31876
+ void navegarVoltarListaComIdRemovido(deps.router, listaExcluir, config.navIdRemovidoKey, eid, config.navVoltarSemRecarregarKey);
31323
31877
  }
31324
31878
  else {
31325
- void navegarVoltarLista(deps.router, listaUrlNavegacao(), config.navVoltarSemRecarregarKey);
31879
+ const listaExcluir = listaUrlNavegacao();
31880
+ invalidateConsultaListaRouteReuse(listaExcluir);
31881
+ void navegarVoltarLista(deps.router, listaExcluir, config.navVoltarSemRecarregarKey);
31326
31882
  }
31327
31883
  }
31328
31884
  catch (err) {
@@ -31849,16 +32405,13 @@ function createCadastroInlineReferencePart(config) {
31849
32405
  const painel = opcoesPainel();
31850
32406
  const selId = String(idSelecionadoParaCtx() ?? '').trim();
31851
32407
  if (!selId) {
31852
- return painel;
31853
- }
31854
- if (painel.some((o) => compareSelectValor(o.value, selId))) {
31855
- return painel;
32408
+ return dedupeUiSelectOptionsByValue(painel, compareSelectValor);
31856
32409
  }
31857
32410
  const cached = opcoes().find((o) => compareSelectValor(o.value, selId));
31858
32411
  if (cached) {
31859
- return [cached, ...painel];
32412
+ return dedupeUiSelectOptionsByValue([cached, ...painel], compareSelectValor);
31860
32413
  }
31861
- return painel;
32414
+ return dedupeUiSelectOptionsByValue(painel, compareSelectValor);
31862
32415
  }, ...(ngDevMode ? [{ debugName: "optionsParaUi" }] : /* istanbul ignore next */ []));
31863
32416
  const contextMenuItems = computed(() => {
31864
32417
  if (!resolveAcoesReferencia().contextMenuIdEfectivo) {
@@ -36839,6 +37392,7 @@ function createCadastroPadraoConfig(opts) {
36839
37392
  (typeof service.toListItem === 'function'
36840
37393
  ? (dto) => service.toListItem(dto)
36841
37394
  : undefined);
37395
+ const svcChaveConsulta = service.chaveConsulta?.trim();
36842
37396
  const initCadastroResolved = resolveInitCadastroFn(service, initCadastroOpt, initCadastroMethod);
36843
37397
  const svcCol = service;
36844
37398
  const cadastroCollectionPageMerged = rest.cadastroCollectionPage ??
@@ -36857,6 +37411,7 @@ function createCadastroPadraoConfig(opts) {
36857
37411
  ...(mapUser != null ? { mapFormValue: mapUser } : {}),
36858
37412
  mapErro: mapErroMerged,
36859
37413
  ...(linhaMerged != null ? { linhaSalvaParaLista: linhaMerged } : {}),
37414
+ ...(svcChaveConsulta ? { consultaChaveConsulta: svcChaveConsulta } : {}),
36860
37415
  };
36861
37416
  }
36862
37417
  /**
@@ -38330,6 +38885,10 @@ class CadastroMetadataPageStateBase {
38330
38885
  navLinhaGravadaKey: nav.linhaGravada,
38331
38886
  navVoltarSemRecarregarKey: nav.voltarSemRecarregar,
38332
38887
  navIdRemovidoKey: nav.idExcluido,
38888
+ consultaChaveConsulta: this.config.consultaChaveConsulta?.trim() ||
38889
+ pageId.serviceKey?.trim() ||
38890
+ pageId.entityName?.trim() ||
38891
+ undefined,
38333
38892
  toastTitle,
38334
38893
  mensagemSalvoNovo: crudMessages.createSuccessMessage,
38335
38894
  mensagemSalvoEdicao: crudMessages.updateSuccessMessage,
@@ -38848,6 +39407,11 @@ class CadastroPadraoPageBase extends CadastroMetadataPageBase {
38848
39407
  });
38849
39408
  }
38850
39409
  }
39410
+ /**
39411
+ * Hook após concluir uma fase de persistência de coleções (`savePhase`).
39412
+ * Usado p.ex. para recalcular totais após save paralelo de serviços/peças.
39413
+ */
39414
+ async afterCollectionSavePhase(_phase, _ctx, _parentId, _persistedInPhase) { }
38851
39415
  /**
38852
39416
  * Persiste deltas declarados em {@link cadastroCollectionSaveHandlers} depois da capa gravada.
38853
39417
  * Sobrescrever `aposSalvarAntesToast` na página deve chamar `await super.aposSalvarAntesToast(ctx)` primeiro.
@@ -38862,46 +39426,93 @@ class CadastroPadraoPageBase extends CadastroMetadataPageBase {
38862
39426
  return;
38863
39427
  }
38864
39428
  const registry = this.cadastro()?.uiRegistry;
39429
+ const phases = new Map();
38865
39430
  for (const h of handlers) {
38866
- const ck = h.collectionKey;
38867
- const ctl = ctx.form.get(ck);
38868
- if (!(ctl instanceof FormArray)) {
38869
- continue;
39431
+ const phase = h.savePhase ?? 0;
39432
+ const list = phases.get(phase) ?? [];
39433
+ list.push(h);
39434
+ phases.set(phase, list);
39435
+ }
39436
+ const sortedPhases = [...phases.keys()].sort((a, b) => a - b);
39437
+ for (const phase of sortedPhases) {
39438
+ const phaseHandlers = phases.get(phase) ?? [];
39439
+ const jobs = [];
39440
+ for (const h of phaseHandlers) {
39441
+ const job = this.persistirColecaoCadastro(ctx, parentId, registry, h);
39442
+ if (job) {
39443
+ jobs.push(job);
39444
+ }
38870
39445
  }
38871
- const fa = ctl;
38872
- const hidratada = registry?.isCollectionRemoteHydrated(ck) ?? false;
38873
- const removidos = this.cadastroObterOuCriarRemovidos(ck);
38874
- if (ctx.modoGravacao === 'editar' &&
38875
- h.skipWhenNotHydratedOnEdit === true &&
38876
- !hidratada &&
38877
- fa.length === 0 &&
38878
- removidos.size === 0) {
38879
- continue;
39446
+ const persistedInPhase = jobs.length > 0;
39447
+ if (jobs.length === 1) {
39448
+ await jobs[0];
39449
+ }
39450
+ else if (jobs.length > 1) {
39451
+ await Promise.all(jobs);
38880
39452
  }
38881
- if (fa.length === 0 && removidos.size === 0) {
39453
+ await this.afterCollectionSavePhase(phase, ctx, parentId, persistedInPhase);
39454
+ }
39455
+ }
39456
+ persistirColecaoCadastro(ctx, parentId, registry, h) {
39457
+ const ck = h.collectionKey;
39458
+ const ctl = ctx.form.get(ck);
39459
+ if (!(ctl instanceof FormArray)) {
39460
+ return null;
39461
+ }
39462
+ const fa = ctl;
39463
+ const hidratada = registry?.isCollectionRemoteHydrated(ck) ?? false;
39464
+ const removidos = this.cadastroObterOuCriarRemovidos(ck);
39465
+ if (ctx.modoGravacao === 'editar' &&
39466
+ h.skipWhenNotHydratedOnEdit === true &&
39467
+ !hidratada &&
39468
+ fa.length === 0 &&
39469
+ removidos.size === 0) {
39470
+ return null;
39471
+ }
39472
+ if (fa.length === 0 && removidos.size === 0) {
39473
+ return null;
39474
+ }
39475
+ const upserts = [];
39476
+ for (let i = 0; i < fa.length; i++) {
39477
+ const row = fa.at(i);
39478
+ if (!(row instanceof FormGroup)) {
38882
39479
  continue;
38883
39480
  }
38884
- const upserts = [];
38885
- for (let i = 0; i < fa.length; i++) {
38886
- const row = fa.at(i);
38887
- if (!(row instanceof FormGroup)) {
38888
- continue;
38889
- }
38890
- const raw = row.getRawValue();
38891
- const u = h.buildUpsert(raw);
38892
- if (u != null) {
38893
- upserts.push(u);
38894
- }
39481
+ const raw = row.getRawValue();
39482
+ const u = h.buildUpsert(raw);
39483
+ if (u != null) {
39484
+ upserts.push(u);
38895
39485
  }
38896
- await h.persist({
38897
- parentId,
38898
- response: ctx.response,
38899
- form: ctx.form,
38900
- upserts,
38901
- removerItemIds: [...removidos],
38902
- });
39486
+ }
39487
+ return h
39488
+ .persist({
39489
+ parentId,
39490
+ response: ctx.response,
39491
+ form: ctx.form,
39492
+ upserts,
39493
+ removerItemIds: [...removidos],
39494
+ deferRecalcularTotais: h.deferRecalcularTotais === true,
39495
+ })
39496
+ .then(() => {
38903
39497
  removidos.clear();
39498
+ });
39499
+ }
39500
+ colecaoCadastroTeraPersistencia(ctx, collectionKey, skipWhenNotHydratedOnEdit = true) {
39501
+ const ctl = ctx.form.get(collectionKey);
39502
+ if (!(ctl instanceof FormArray)) {
39503
+ return false;
38904
39504
  }
39505
+ const registry = this.cadastro()?.uiRegistry;
39506
+ const hidratada = registry?.isCollectionRemoteHydrated(collectionKey) ?? false;
39507
+ const removidos = this.cadastroObterOuCriarRemovidos(collectionKey);
39508
+ if (ctx.modoGravacao === 'editar' &&
39509
+ skipWhenNotHydratedOnEdit &&
39510
+ !hidratada &&
39511
+ ctl.length === 0 &&
39512
+ removidos.size === 0) {
39513
+ return false;
39514
+ }
39515
+ return ctl.length > 0 || removidos.size > 0;
38905
39516
  }
38906
39517
  cadastroObterOuCriarRemovidos(collectionKey) {
38907
39518
  let s = this.cadastroRemovidosPorColecao.get(collectionKey);
@@ -41038,14 +41649,18 @@ class FormCollectionComponent {
41038
41649
  return true;
41039
41650
  }, ...(ngDevMode ? [{ debugName: "mostrarPaginacaoRemota" }] : /* istanbul ignore next */ []));
41040
41651
  /**
41041
- * Skeleton na grelha no carregamento inicial do formulário (`loading`); durante troca de página remota
41042
- * mantêm-se as linhas até à resposta (evita repor paginação AG Grid para uma página).
41652
+ * Skeleton na grelha enquanto o formulário ou a 1.ª página remota da coleção carrega;
41653
+ * durante troca de página remota mantêm-se as linhas até à resposta.
41043
41654
  */
41044
41655
  this.collectionDataGridLoading = computed(() => {
41045
- if (!this.mostrarPaginacaoRemota()) {
41046
- return this.gridLoading();
41656
+ if (this.loading()) {
41657
+ return true;
41658
+ }
41659
+ const st = this.pagingEstadoRemoto();
41660
+ if (st?.loading !== true) {
41661
+ return false;
41047
41662
  }
41048
- return this.loading();
41663
+ return this.gridRows().length === 0;
41049
41664
  }, ...(ngDevMode ? [{ debugName: "collectionDataGridLoading" }] : /* istanbul ignore next */ []));
41050
41665
  this.agGridPageSize = computed(() => {
41051
41666
  if (this.mostrarPaginacaoRemota()) {
@@ -45896,5 +46511,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
45896
46511
  * Generated bundle index. Do not edit.
45897
46512
  */
45898
46513
 
45899
- export { ADAPTIVE_DATA_VIEW_MOBILE_QUERY, APP_SIDEBAR_LABEL_REVEAL_LAG_MS, APP_SIDEBAR_LAYOUT_DURATION_MS, APP_SIDEBAR_NAV_REVEAL_TOTAL_MS, APP_THEME_BASE_CLASS, APP_THEME_IDS, ActionMenuComponent, AdaptiveDataViewComponent, AdminLoginPageComponent, AdminLoginShellComponent, StructraSidebarUserPanelComponent as AdminSidebarUserPanelComponent, AlertComponent, AnchoredOverlayComponent, AppBreadcrumbComponent, AppDialogComponent, AppLibLightBlockScrollStrategy, AppShellComponent, AppShellSidebarTemplateDirective, AppShellSidebarToggleComponent, AppSidebarBottomActionsSlotDirective, AppSidebarBottomActionsTemplateDirective, AppSidebarBrandDirective, AppSidebarComponent, AppSidebarFooterSlotDirective, AppSidebarFooterTemplateDirective, AppSidebarHeaderSlotDirective, AppSidebarHeaderTemplateDirective, AppSidebarToolbarDirective, AppSidebarUserInfoSlotDirective, AppSidebarUserInfoTemplateDirective, AppTheme, AppThemeService, AppTopbarComponent, AppUserMenuComponent, StructraAppVersionService as AppVersionService, BR_ESTADOS_NOME_SIGLA, ButtonType as BaseButtonType, ButtonVariant as BaseButtonVariant, BaseFieldComponent, BaseFieldDirective, BooleanFieldDirective, ButtonComponent, ButtonRadius, ButtonSize, ButtonType, ButtonVariant, CADASTRO_COLLAPSIBLE_REMOTE_LOAD_DELAY_MS, CADASTRO_DUPLICATE_FLAG_STATE, CADASTRO_DUPLICATE_SOURCE_ID_STATE, CADASTRO_FOCO_COLUNA_APOS_RESUMO_MS, CADASTRO_FORM_COLLECTION_REMOVE_ITEM_CONFIRM, CADASTRO_INVALIDATE_ROUTE_SNAPSHOT, CADASTRO_PAGE_SUBTITULO_PADRAO, CADASTRO_PAGE_TITULO_NOVO_PADRAO, CADASTRO_PESSOA_INLINE_DESTINO_URL_FRAGMENTS, CADASTRO_REFERENCIA_DIALOG_CONTEXT, CADASTRO_REFERENCIA_DIALOG_PAGE_CONFIG, CADASTRO_REFERENCIA_ROUTE_ACCESS, CADASTRO_REFERENCIA_ROUTE_ACCESS_PERMISSIVE, CADASTRO_RESUMO_FIELD_NAVIGATE_DEFER_MS, CADASTRO_TOAST_TITLE_PADRAO, CADASTRO_VALIDATION_SUMMARY_PINNED, CADASTRO_VALIDATION_SUMMARY_STATIC, CATEGORIAS_NAV_ID_EXCLUIDO, CATEGORIAS_NAV_LINHA_GRAVADA, CATEGORIAS_NAV_VOLTAR_SEM_RECARREGAR, CLIENTES_NAV_ID_EXCLUIDO, CLIENTES_NAV_LINHA_GRAVADA, CLIENTES_NAV_VOLTAR_SEM_RECARREGAR, CONSULTA_DATETIME_KEYS_ISO_PARA_FMT, CONSULTA_DOCUMENTO_GRID_KEYS_ISO_PARA_FMT, CONSULTA_FILTROS_SESSAO_USER, CONSULTA_GRID_OPTS_DATAS_PADRAO, CONSULTA_LISTA_CACHE_MAX_PAGINAS_DEFAULT, CONSULTA_LISTA_CACHE_NS_SEP, CONSULTA_LISTA_CACHE_TTL_MS_DEFAULT, CONSULTA_MOBILE_LAYOUT_MEDIA_QUERY, CONSULTA_MULTISELECT_LABEL_STUB, CONSULTA_OPTIONS_LISTAR_RESOLVER, CONSULTA_PEDIDOS_GRID_OPTS, CONSULTA_PHONE_GRID_KEYS_ISO_PARA_FMT, CONSULTA_PRESET_SELECT_EMPTY_OPTIONS_MESSAGE_DESKTOP, CONSULTA_PRESET_SELECT_EMPTY_OPTIONS_MESSAGE_MOBILE, CONSULTA_PRODUTOS_GRID_OPTS, CONSULTA_ROUTE_REUSE, CONSULTA_SERVIDOR_LISTA_QUERY_DEFAULTS, CONSULTA_TOPBAR_SLOT, CadastroBasePageComponent, CadastroCollectionGridColumnFormat, CadastroCollectionReferenciaHostService, CadastroCollectionRuntime, CadastroEnumOptionsRegistry, CadastroFieldRendererComponent, CadastroFieldRuntime, CadastroFieldsBaseComponent, CadastroFormDraftCacheService, CadastroFormLoadingSkeletonComponent, CadastroMetadataPageBase, CadastroMetadataPageComponent, CadastroMetadataPageServiceBase, CadastroMetadataPageShellLayoutComponent, CadastroMetadataPageStateBase, CadastroMetadataShellPageComponent, CadastroPadraoPageBase, CadastroReferenceRegistry, CadastroReferenciaDialogBridgeRegistry, CadastroReferenciaDialogHostComponent, CadastroReferenciaDialogService, CadastroReferenciaOpenMode, CadastroRuntime, CadastroRuntimeRegistry, CadastroSectionPanelLayout, CardListComponent, CepFieldComponent, CheckboxFieldComponent, ColorPickerFieldComponent, ComponentType, ConfirmDialogComponent, ConfirmDialogService, ConsoleLogComponent, ConsultaBasePageComponent, ConsultaCadastroFiltroDialogComponent, ConsultaCardCampoPapel, ConsultaCardFieldFormat, ConsultaCatalogBundleHelper, ConsultaFiltroPresetToolbarComponent, ConsultaFiltrosSessaoService, ConsultaGridColumnFormat, ConsultaGridOrderDirection, ConsultaListaMemoriaCacheService, ConsultaPadraoPageBase, ConsultaPageCache, ConsultaPageLoadingSkeletonComponent, ContainerLayoutSize, ContextMenuComponent, CpfCnpjFieldComponent, DEFAULT_STRUCTRA_APP_VERSION_API_PATH, DEFAULT_STRUCTRA_APP_VERSION_FALLBACK, DEFAULT_STRUCTRA_COOKIE_NOTICE_ACCEPT_LABEL, DEFAULT_STRUCTRA_COOKIE_NOTICE_DESCRIPTION, DEFAULT_STRUCTRA_COOKIE_NOTICE_STORAGE_KEY, DEFAULT_STRUCTRA_COOKIE_NOTICE_TITLE, DEFAULT_STRUCTRA_SHELL_SCROLL_RESTORATION_OPTIONS, DEFAULT_STRUCTRA_SHELL_SIDEBAR_COLLAPSED_STORAGE_KEY, DROPDOWN_SEARCH_LOCAL_PAGE_SIZE, DashboardSectionComponent, DataCardComponent, DataGridComponent, DataListComponent, DataToolbarComponent, DateFieldComponent, DecimalFieldComponent, DetailsFieldComponent, DetailsViewComponent, DialogFooterDirective, DividerComponent, DrawerComponent, DrawerSide, DrawerSize, DropdownBaseComponent, DropdownMenuComponent, DropdownMultiOptionFieldBase, DropdownOptionFieldBase, DropdownSearchFieldComponent, ENM_STATUS_OPCOES_SELECT, EmptyStateComponent, EnmStatus, FIELD_MOBILE_LAYOUT_QUERY, FILE_PREVIEW_UNAVAILABLE_MESSAGE, FORM_CONTAINER_STATE_STORAGE_PREFIX, FORNECEDORES_NAV_ID_EXCLUIDO, FORNECEDORES_NAV_LINHA_GRAVADA, FORNECEDORES_NAV_VOLTAR_SEM_RECARREGAR, FieldCadastroRedirectButtonComponent, FileUploadFieldComponent, FileUploadType, FormActionsAlign, FormActionsComponent, FormColComponent, FormCollectionComponent, FormCollectionLayout, FormGroupComponent, FormGroupVariant, FormLayoutGap, FormRowAlign, FormRowComponent, FormRowJustify, FormSectionAlign, FormSectionComponent, FormSectionRadius, FormSectionVariant, FormTabComponent, FormTabsComponent, GridLayoutConsultaService, ImagePreviewPanelComponent, InputMaskFieldComponent, IntegerFieldComponent, LAYOUT_STACK_SIDE_BY_SIDE, LAYOUT_STACK_STACKED, LayoutStackAlign, LayoutStackComponent, LayoutStackDirection, LayoutStackItemAlign, LibDialogSize, ListItemComponent, LoadingDialogComponent, LoadingDialogService, MaskedTextFieldBase, MenuDividerComponent, MenuDropdownPlacement, MenuGroupComponent, MenuListComponent, MultiselectFieldComponent, NO_OP_CONSULTA_ROUTE_REUSE, NO_OP_CONSULTA_TOPBAR_SLOT, NgControlFieldDirective, OPS_BOOL, OPS_DATA, OPS_TEXTO, OPS_TEXTO_MULTISELECT, ORIGEM_CADASTRO_INLINE_PESSOA, OnboardingChecklistComponent, OverlayPlacement, PDF_IFRAME_VIEWER_HASH, PEDIDOS_NAV_ID_EXCLUIDO, PEDIDOS_NAV_LINHA_GRAVADA, PEDIDOS_NAV_VOLTAR_SEM_RECARREGAR, PERMISSION_GROUP_OUTROS_KEY, PERMISSION_GROUP_OUTROS_LABEL, PERMISSION_GROUP_OUTROS_ORDER, PESSOAS_NAV_LINHA_GRAVADA, PESSOAS_NAV_VOLTAR_SEM_RECARREGAR, PHONE_BR_LANDLINE_MASK, PHONE_BR_MOBILE_MASK, PRODUTOS_NAV_ID_EXCLUIDO, PRODUTOS_NAV_LINHA_GRAVADA, PRODUTOS_NAV_VOLTAR_SEM_RECARREGAR, StructraPageFooterComponent as PageFooterComponent, PasswordFieldComponent, PermissionGroupTabComponent, PermissionGroupTabsComponent, PhoneFieldComponent, PopoverBodyTemplateDirective, PopoverComponent, PopoverFooterTemplateDirective, PopoverTriggerDirective, ReferenceOptionPreset, STRUCTRA_ADMIN_ROUTE_REDIRECT_CACHE_PREFIX, STRUCTRA_ADMIN_ROUTE_REDIRECT_LOGIN_ID_CACHE_KEY, STRUCTRA_APP_VERSION_CONFIG, STRUCTRA_CADASTRO_INLINE_RESULT_KEY, STRUCTRA_CADASTRO_INLINE_RETURN_KEY, STRUCTRA_CONSULTA_FORCE_REFRESH_KEY, STRUCTRA_COOKIE_NOTICE_CONFIG, STRUCTRA_DEDICATED_BACK_TO_TOP_SELECTOR, STRUCTRA_GRID_LAYOUT_API_BASE_RESOLVER, STRUCTRA_GRID_LAYOUT_AUTH_HEADERS_RESOLVER, STRUCTRA_GRID_LAYOUT_TENANT_RESOLVER, STRUCTRA_INLINE_FORM_DRAFT_PENDING_PREFIX, STRUCTRA_KANBAN_DESKTOP_MIN_WIDTH, STRUCTRA_MIDIA_PUBLIC_BASE_RESOLVER, STRUCTRA_MIDIA_UPLOAD_TRANSPORT, STRUCTRA_PAGE_CACHE_SCOPE_SEP, STRUCTRA_PAGE_FOOTER_CONFIG, STRUCTRA_PAGE_FOOTER_PARTS, STRUCTRA_PAGE_STATE_ACTIVE_TAB_PREFIX, STRUCTRA_REPORT_DEFAULT_PAGE_SIZE, STRUCTRA_REPORT_TRANSPORT, STRUCTRA_SCROLL_SESSION_RESET, STRUCTRA_SCROLL_TENANT_RESOLVER, STRUCTRA_SHELL_NAV_CONTENT_READY, STRUCTRA_SHELL_SCROLL_RESTORATION_OPTIONS, STRUCTRA_SHELL_TOPBAR_TITLE_SKELETON, STRUCTRA_SIMULATED_LOADING_DELAY_MS, STRUCTRA_THEME_DARK_CLASS, STRUCTRA_THEME_IDS, STRUCTRA_UI, ScriptEditorFieldComponent, SelectFieldComponent, SkeletonBlockComponent, SkeletonCardComponent, SkeletonFieldShellComponent, SkeletonListComponent, SkeletonStatCardComponent, SkeletonTableComponent, SkeletonTextComponent, StatCardComponent, StatusBadgeComponent, StructraAdminRouteRedirectPageBase, StructraAppVersionService, StructraBackToTopButtonComponent, StructraCookieNoticeComponent, StructraCookieNoticeService, StructraKanbanDragAutoScrollController, StructraPageCacheService, StructraPageComponentOutletComponent, StructraPageComponentRegistry, StructraPageFooterComponent, StructraPageStateCacheService, StructraPreserveScrollDirective, StructraProgressOverlayComponent, StructraReportEmptyStateComponent, StructraReportFilterPanelComponent, StructraReportLoadingSkeletonComponent, StructraReportPageBaseComponent, StructraReportPageComponent, StructraReportPaginatorComponent, StructraReportPreviewHeaderComponent, StructraReportTableComponent, StructraReportTreeCacheService, StructraReportTreeComponent, StructraReportTreeSkeletonComponent, StructraReportViewerComponent, ScriptEditorFieldComponent as StructraScriptEditorComponent, StructraScrollStateService, StructraShellScrollRestorationService, StructraShellTopbarSlotService, AppSidebarBottomActionsTemplateDirective as StructraSidebarBottomActionsDirective, AppSidebarFooterTemplateDirective as StructraSidebarFooterDirective, AppSidebarHeaderTemplateDirective as StructraSidebarHeaderDirective, AppSidebarUserInfoTemplateDirective as StructraSidebarUserInfoDirective, StructraSidebarUserPanelComponent, StructraTreeExpandStateService, SwitchFieldComponent, THEME_PRIMARY_COLOR_LABEL_PT_BR, TOAST_REGISTRO_EXCLUIDO_SUCESSO, TableEmptyStateComponent, TableToolbarComponent, TextFieldComponent, TextareaFieldComponent, ThemeDirective, ToastHostComponent, ToastService, TooltipComponent, TooltipPanelTemplateDirective, TreeViewComponent, USUARIOS_CONSULTA_GRID_OPTS, USUARIOS_NAV_ID_EXCLUIDO, USUARIOS_NAV_LINHA_GRAVADA, USUARIOS_NAV_VOLTAR_SEM_RECARREGAR, VENDEDORES_NAV_ID_EXCLUIDO, VENDEDORES_NAV_LINHA_GRAVADA, VENDEDORES_NAV_VOLTAR_SEM_RECARREGAR, ValidationSummaryComponent, agruparCamposMetadataPorSecao, agruparPermissionTabs, anchoredOverlayPositions, aplicarNormalizacaoMultiselectIdsNoPartial, aplicarProdutoDtoNoFormulario, appendCadastroPageActiveTabQuery, appendPdfIframeViewerParams, applyCadastroCollectionArrayValidators, applyCadastroModoSenhaNovos, applyCollectionValidationSummaryNavigation, applyCollectionValueToFormArray, applyEntityToCadastroFormByMetadata, applyOptionalThemeHostClasses, applyPickedCalendarDate, attachStructraScrollPreserve, buildCadastroFiltroDialogItensGridRows, buildCadastroMetadataShellRuntime, buildCadastroPageActiveTabPageKey, buildCadastroPageActiveTabPageKeyFromLayout, buildCadastroPageRuntime, buildCadastroRedirectReturnUrl, buildCadastroReferenciaDialogContext, buildCatalogoStubConsultaRuntime, buildConsultaConfirmDuplicarLinhaFromLayout, buildConsultaConfirmRemoverLinhaFromLayout, buildConsultaDefaultIsItemGuard, buildConsultaListaCacheKey, buildConsultaPageMetadataUnified, buildConsultaPageRuntime, buildDecimalBrDisplay, buildDecimalBrParseString, buildDefaultConsultaMapCardFromColunasGrid, buildEmptyStateOverlayHtml, buildFormContainerStateStorageKey, buildFormGroupFromCadastroCampos, buildGridNavigateUrl, buildHistoryStateAfterReturningFromNestedInlineChild, buildInlineReturnStateForChildCadastro, buildNovoFormDefaultsFromCampos, buildReportRowCardMap, buildRouteReuseKeyFromAppPathname, buildRouteReuseKeyFromNovoRouterLink, buildStructraAdminRouteRedirectCacheKey, buildStructraAdminRouteRedirectChildUrl, buildStructraPageCacheCadastroInitKey, buildStructraPageCacheRouteScope, buildStructraPageFooterParts, buildStructraSidebarTemplateContext, buildValidationMetaFromCadastroCampos, cadastroBuildImageUploadMetadata, cadastroCampoBlocoEditorOcupaLinhaInteira, cadastroCampoBooleanOcupaLinhaInteira, cadastroCampoMetadataDtoFromPartial, cadastroCampoMetadataEhBoolean, cadastroCampoMetadataLarguraCompacta, cadastroCampoMetadataLarguraFixaCss, cadastroCampoReferenciaMetadataDtoFromPartial, cadastroCampoRuleMaxLength, cadastroCampoScriptEditorLanguage, cadastroCampoScriptEditorMinHeight, cadastroCampoValidacaoDtoFromPartial, cadastroCampoWrapperWidthCss, cadastroCollectionEditorGridColumns, cadastroCollectionMaxItemsValidator, cadastroCollectionMinItemsValidator, cadastroConfirmExcluirPartialFromLayout, cadastroContainerLayoutSizeDoRecord, cadastroContainerPathJoin, cadastroCrudMessagesDoFormLayout, cadastroDeclarativeSnapshotDtoFromPartial, cadastroEnsureSingleBooleanInCollection, cadastroFieldsPerRowDoRecord, cadastroFlattenContainerRaw, cadastroFormDraftEnabledDoLayout, cadastroFormGridColumns, cadastroFormLayoutComoRecord, cadastroFormLayoutDoBundle, cadastroFormLayoutDoRuntime, cadastroFormLayoutPreserveActiveTab, cadastroFormPageLayoutFromPartial, cadastroGcd, cadastroGetCollectionItemControl, cadastroGridColumnSpanForFieldIndex, cadastroGridDenominadorTracks, cadastroGridTemplateColumnsLinhaUnicaSeAplicavel, cadastroInferExtensaoArquivo, cadastroInferImageContentType, cadastroLcm, cadastroMetadataDtoParaValidacaoLike, cadastroNavKeysStructra, cadastroNomeArquivoDaUploadUrl, cadastroNormalizarUploadUrlPorPrefixo, cadastroPageActionDtoFromPartial, cadastroPageActionsPorRegiao, cadastroPageActiveTabToRestore, cadastroPageComponentDtoFromPartial, cadastroPageComponentsPorRegiao, cadastroPageIdentityDoFormLayout, cadastroPageOverlayDtoFromPartial, cadastroPageShellAtivo, cadastroPageShellTabsKeepAliveFromLayout, cadastroPageTabDtoFromPartial, cadastroPageTabsOrdenados, cadastroPainelMaxWidthCss, cadastroRawBooleanDeep, cadastroRawNumber, cadastroRawString, cadastroReferenceEntryFromListarService, cadastroReferenciaOpenModeFromWire, cadastroReindexarCollectionOrdem, cadastroResolveId, cadastroSecaoFormGroupDense, cadastroSecaoPersisteExpandedState, cadastroSecaoRenderizaInlineDentroDoPai, cadastroSecaoSegmentosIntercalados, cadastroSecaoSegmentosParaRender, cadastroSecaoUsaFormGroup, cadastroSecaoUsaFormGroupComoBlocoVisual, cadastroSecaoUsaSuperficieDeclarativa, cadastroSingleBooleanCollectionBinding, cadastroTitulosEfectivosDoFormLayout, cadastroToastTitleEfectivoDoFormLayout, cadastroToolbarButtonDtoFromPartial, cadastroToolbarVisibilityDoFormLayout, cadastroUseBackToTopButtonFromLayout, cadastroValidationSummaryFlagsDoRecord, cadastroValidationSummaryPinnedFromFlags, cadastroWireCollectionOrdemReindexOnAdd, cadastroWireCollectionOrdemReindexOnAddRemove, cadastroWireCollectionOrdemReindexOnRemove, campoMetadataVisivelNoModo, caretIndexFromIntegerDigitCount, caretIndexFromSemantic, carregarOpcoesMultiselectViaSpec, cepMaskCompleteValidator, clearRequiredValidatorsOnReadOnlyCadastroFields, clearStructraCadastroInlineReturnSessionCacheForTests, clearStructraCadastroSessionStorageOnLogout, coerceDecimalPtBr, coerceReportBoolean, collectValidationSummaryItems, colunasGridTemFormatacaoDeclarativa, computeReferenciaHasMore, consoleLogLevelClass, consultaCampoMetadataDtoFromPartial, consultaCardCampoDtoFromPartial, consultaFiltroValorDataSomenteDia, consultaGridColunaDtoFromPartial, consultaGridColunaKeyParaCampoLinha, consultaGridConfigDtoFromPartial, consultaPassaItem, consultaPassaTodosItens, consultaUsuariosMetadataReplyFromPartial, consumeCadastroInlineFormDraftPendingRestore, consumeConsultaPendingGridReturn, consumeGridReturnVoltarKeyForUrl, consumirResultadoCadastroInlineCampoPessoaId, consumirResultadoCadastroInlineCampoReferencia, cpfCnpjMaskCompleteValidator, createCadastroDialogActivatedRoute, createCadastroMetadataPageConfig, createCadastroPadraoConfig, createCadastroRuntime, createCollectionFormArray, createCollectionItemFormGroup, createConsultaListaItemGuardFromFiltroUi, createConsultaOptionsListarResolver, createConsultaPadraoRuntime, createConsultaPresetSelectEmptyOptionsMessageSignal, createConsultaPresetStorageApi, createGrpcSaveRequestMapper, createInlineHostNavigation, createMapCardFromConsultaColunasGrid, createMapGridRowFromConsultaColunasGrid, createSaveRequestFromPartialMapper, criarDraftInlinePessoa, decimalPtBrNaoNegativoValidator, decimalPtBrToNullableNumber, defaultIsConsultaListItemMinimo, defaultParseLinhaGravadaJson, deleteConfirmPageConfigFromPartial, deriveCadastroTituloEditar, deriveConsultaListaItemGuardPropsFromFiltroUi, duplicateConfigFromLayout, duplicatePageConfigFromPartial, enrichCadastroReferenciaDialogPageConfig, ensureCadastroCollectionMinItems, ensureCadastroFormControlsFromMetadata, escapeHtml, evaluateStructraPageVisibleExpression, executarConsultaServidorComPreset, extractConsultaListaCacheNamespace, extractDecimalBrParts, fileIsLikelyImage, fileMatchesAccept, filtrarSecoesMetadataPorModo, filtrarUiSelectOptionsPainelComValorPersistente, filtrarUiSelectOptionsPorQuery, findCadastroCampoByKey, findFirstReportLeafId, findReportTreeLabel, fixedDigitsMaskCompleteValidator, flattenCadastroMetadataSecoes, fmtDataPt, fmtDocumentoCelulaConsultaGrid, formatAcceptForDisplay, formatDateTimePtBr, formatDecimalBr, formatDocumentoPessoaParaExibicao, formatFileSizeBytes, formatIntegerThousandsBr, formatMaskDigits, formatPhoneBr, formatReportPreviewTitulo, formatUiFieldDateValue, getFilePreviewKind, getStructraActionsByGroup, getThemeClass, getThemeClassList, getThemePrimaryColorLabelPtBr, getThemeTokenClass, gridNavigateIconClass, hexParaColorInput, inferCadastroItemFieldsFromPlainRows, inferCadastroListaUrlFallback, initialCadastroControlValue, injectEffectiveThemeId, isCadastroDuplicateNavigation, isCollectionField, isCollectionLikeField, isConsultaCardAutoSubtitleExcluded, isLegacyDarkThemeId, isLegacyFormContainerStateStorageKey, isLegacyNomeDocumentoReferencePreset, isReadonlyCollectionField, isReportBooleanColumn, isReportGroupNode, isReportNowrapColumn, isValidPhoneBr, libDialogPanelClasses, listaUrlFromRotaCadastro, listarItensCadastroReferencia, listarTodosPaginado, loadPresetsJson, loadStructraAdminRouteRedirectTarget, mapCadastroFormRawToPayload, mapConsultaGridColunasParaDataGrid, mapConsultaMetadataParaFiltroUi, mapErroTransporteParaMensagem as mapErroListaDefault, mapErroTransporteParaMensagem, mapEstadosToOptions, mapFiltroSalvoParaConsultaPreset, mapGridNavigateFromColuna, mapListarItensParaMultiselectOpcoes, mapReportTreeToTreeViewNodes, mapReportTreeToTreeViewNodesForSelection, markCadastroInlineFormDraftPendingRestore, markConsultaPendingGridReturn, maskDigitCount, mergeCadastroConfirmExcluir, mergeConsultaGridRowFormattingFromColunasGrid, mergeConsultaMultiselectOpcoesComSeleccionados, mergeDocumentoFmtNaLinhaConsulta, mergeMapConsultaGridColunasOptsComColumnFormat, mergeNovoIdEmListaSelecionada, mergeStructraShellScrollRestorationOptions, metadataCampoParaChaveLinhaCliente, modoPermissaoReferenciaFromWire, montarFiltrosGrpcPreset, montarFiltrosServidorPreset, montarHierarquiaSecoesMetadata, multiselectIdListRequiredValidator, multiselectMaxItemsValidator, navegarAposLoginAdmin, navegarVoltarLista, navegarVoltarListaComIdRemovido, navegarVoltarListaComLinha, navigateCadastroDuplicate, navigateCommandsFromRotaAlterar, navigateCommandsFromRotaNovo, navigateFromGrid, nomeSalvarParaPayloadComPessoa, normalizarArvoreSecoesMetadata, normalizarCaminhoLoginAdmin, normalizarHexCor, normalizarItensParaGravarServidorCadastro, normalizarListaIdsMultiselect, normalizarOperadorConsultaParaEnvioServidor, normalizarRotaReferencia, normalizarStructraAction, normalizarStructraActionGroup, normalizarStructraActionGroups, normalizeCadastroAppPath, normalizeCadastroCampoMetadataWire, normalizeCadastroInitRouteIdParam, normalizeCadastroItemEditorDecimalControls, normalizeCadastroReferenciaDialogRotaKey, normalizeCadastroRouteForContainerState, normalizeConsoleLogLevel, normalizeFormDateValue, normalizePhoneBr, normalizeStructraAdminPath, normalizeStructraScrollRoute, normalizeStructraTheme, novoPathCommandsFromRota, onlyDigits, operadorConsultaComValorUnicoComparacao, operadorConsultaDatetimeUsaDatePicker, operadoresConsultaCampo, operadoresPorTipo, ordenarFiltroItens, ordenarStructraActions, parseDecimalBr, parseIntegerString, parseUiFieldDateValue, patchFormFromEntidadeRecord, permissionTabsUsamGruposVerticais, permissoesReferenciaMetadata, persistStructraCookieNoticeAccepted, persistStructraShellSidebarCollapsed, phoneBrDynamicMaskCompleteValidator, phoneBrMaskCompleteValidator, phoneBrMaskFromDigits, pickCadastroPageActiveTabExplicit, pickTabKeyLinkedToSummaryItems, podeNavegarGridColuna, precisaValor, precisaValorFinal, provideAppPageFooter, provideAppVersion, provideStructraAppVersion, provideStructraCadastroReferenciaDialogRoot, provideStructraCookieNotice, provideStructraPageFooter, provideStructraScrollState, provideStructraShellScrollRestoration, provideStructraTreeExpandState, qtdCriteriosPresetParaSkeleton, readCadastroDuplicateSourceId, readCadastroPageActiveTabFromNavigationState, readCadastroPageActiveTabFromUrl, readFormContainerCollapsedFromStorage, readStructraAdminRouteRedirectTarget, readStructraCadastroInlineReturn, readStructraShellSidebarCollapsed, referenciaAbreEmDialog, referenciaOpenModeRaw, referenciaUsesLegacyRegistryMapper, registerCadastroReferenceEntries, registerCadastroReferenceListSources, registerCadastroReferenciaDialogBridges, registerStructraBuiltinPageComponents, replaceProdutoCadastroFormControls, reportColumnWidthStyle, reportExistsInTree, reportTableHasFixedWidths, resetStructraCadastroReferenciaDialogRootForTests, resolveCadastroCollectionMinItems, resolveCadastroListaUrlParaNavegacao, resolveCadastroPageActiveTabKey, resolveCadastroReferenciaMapOptions, resolveConsultaEditActionLabelFromGridConfig, resolveConsultaListaQuerySliceFromGridConfig, resolveConsultaNavKeysFromPageLayout, resolveConsultaNovoRouterLinkFromLayout, resolveConsultaRouteEditBaseFromLayout, resolveConsultaToastTitleLista, resolveControlAtPath, resolveFormContainerCollapsed, resolveInitialReportId, resolveReferenciaOpcaoLabel, resolveReportPreviewSubtitulo, resolveStructraAdminMenuUrl, resolveStructraAppVersionConfig, resolveStructraCookieNoticeConfig, resolveStructraPageCacheCadastroScope, resolveStructraPageInputExpression, resolveStructraPageInputs, resolveStructraShellScrollContainer, resolverAcoesReferenciaPorRota, resolverValorOpcaoPorRotuloNormalizado, resumoValorMultiselectFiltro, rotaListaReferencia, rotuloEnmStatus, rotuloNomeDocumentoLista, rotuloOperadorConsulta, rotuloPessoaLista, runStructraSimulatedLoadingDelay, sanitizeDecimalBrInput, sanitizeIntegerDigits, sanitizeRecordForCadastroDuplicate, savePresetsJson, scheduleRemoteCollectionHydrationAfterSectionExpand, secaoMetadataEhContainerPlain, secaoTemConteudoVisivel, secaoTemCorpoParaRender, sectionHasVisibleInvalid, semanticCaretAt, semanticIntegerDigitCountLeft, serializeCollectionFormArray, shouldDeferInitialRemoteCollectionLoad, shouldSkipCadastroPageActiveTabCacheWrite, shouldSkipStructraAdminMenuNavigation, stripStructraCadastroInlineResultFromHistory, stripToDigits, structraActionButtonVariant, structraCadastroInlineResultTemIdSalvo, structraCadastroInlineResultTemReferenciaExcluida, structraCookieNoticeWasAccepted, structraElementScrolls, structraHasValue, structraIsFilledString, structraIsFormGroup, structraIsValidPort, structraParseNumberOrNull, structraReadFormValue, structraReadNestedValue, structraTrimString, subscribeMarkForCheckOnInvalidUiRefresh, subtreeHasVisibleInvalid, syncStructraCadastroInlineReturnSessionCache, tabWarningFromLinkedSummaryItems, tipoCampoMetadataParaUi, tipoValorApi, toCadastroReferenceListPageResult, toConsoleLogLineView, toConsoleLogLineViews, toUiSelectOptionsFromMetadata, uiSelectOpcaoIdNomeDocumento, uiSelectOpcoesDePessoas, validationLikeFromCampoMetadata, validatorsFromCampo, writeFormContainerCollapsedToStorage };
46514
+ export { ADAPTIVE_DATA_VIEW_MOBILE_QUERY, APP_SIDEBAR_LABEL_REVEAL_LAG_MS, APP_SIDEBAR_LAYOUT_DURATION_MS, APP_SIDEBAR_NAV_REVEAL_TOTAL_MS, APP_THEME_BASE_CLASS, APP_THEME_IDS, ActionMenuComponent, AdaptiveDataViewComponent, AdminLoginPageComponent, AdminLoginShellComponent, StructraSidebarUserPanelComponent as AdminSidebarUserPanelComponent, AlertComponent, AnchoredOverlayComponent, AppBreadcrumbComponent, AppDialogComponent, AppLibLightBlockScrollStrategy, AppShellComponent, AppShellSidebarTemplateDirective, AppShellSidebarToggleComponent, AppSidebarBottomActionsSlotDirective, AppSidebarBottomActionsTemplateDirective, AppSidebarBrandDirective, AppSidebarComponent, AppSidebarFooterSlotDirective, AppSidebarFooterTemplateDirective, AppSidebarHeaderSlotDirective, AppSidebarHeaderTemplateDirective, AppSidebarToolbarDirective, AppSidebarUserInfoSlotDirective, AppSidebarUserInfoTemplateDirective, AppTheme, AppThemeService, AppTopbarComponent, AppUserMenuComponent, StructraAppVersionService as AppVersionService, BR_ESTADOS_NOME_SIGLA, ButtonType as BaseButtonType, ButtonVariant as BaseButtonVariant, BaseFieldComponent, BaseFieldDirective, BooleanFieldDirective, ButtonComponent, ButtonRadius, ButtonSize, ButtonType, ButtonVariant, CADASTRO_COLLAPSIBLE_REMOTE_LOAD_DELAY_MS, CADASTRO_DUPLICATE_FLAG_STATE, CADASTRO_DUPLICATE_SOURCE_ID_STATE, CADASTRO_FOCO_COLUNA_APOS_RESUMO_MS, CADASTRO_FORM_COLLECTION_REMOVE_ITEM_CONFIRM, CADASTRO_INVALIDATE_ROUTE_SNAPSHOT, CADASTRO_PAGE_SUBTITULO_PADRAO, CADASTRO_PAGE_TITULO_NOVO_PADRAO, CADASTRO_PESSOA_INLINE_DESTINO_URL_FRAGMENTS, CADASTRO_REFERENCIA_DIALOG_CONTEXT, CADASTRO_REFERENCIA_DIALOG_PAGE_CONFIG, CADASTRO_REFERENCIA_ROUTE_ACCESS, CADASTRO_REFERENCIA_ROUTE_ACCESS_PERMISSIVE, CADASTRO_RESUMO_FIELD_NAVIGATE_DEFER_MS, CADASTRO_TOAST_TITLE_PADRAO, CADASTRO_VALIDATION_SUMMARY_PINNED, CADASTRO_VALIDATION_SUMMARY_STATIC, CATEGORIAS_NAV_ID_EXCLUIDO, CATEGORIAS_NAV_LINHA_GRAVADA, CATEGORIAS_NAV_VOLTAR_SEM_RECARREGAR, CLIENTES_NAV_ID_EXCLUIDO, CLIENTES_NAV_LINHA_GRAVADA, CLIENTES_NAV_VOLTAR_SEM_RECARREGAR, CONSULTA_DATETIME_KEYS_ISO_PARA_FMT, CONSULTA_DOCUMENTO_GRID_KEYS_ISO_PARA_FMT, CONSULTA_FILTROS_SESSAO_USER, CONSULTA_GRID_OPTS_DATAS_PADRAO, CONSULTA_LISTA_CACHE_MAX_PAGINAS_DEFAULT, CONSULTA_LISTA_CACHE_NS_SEP, CONSULTA_LISTA_CACHE_TTL_MS_DEFAULT, CONSULTA_MOBILE_LAYOUT_MEDIA_QUERY, CONSULTA_MULTISELECT_LABEL_STUB, CONSULTA_OPTIONS_LISTAR_RESOLVER, CONSULTA_PEDIDOS_GRID_OPTS, CONSULTA_PHONE_GRID_KEYS_ISO_PARA_FMT, CONSULTA_PRESET_SELECT_EMPTY_OPTIONS_MESSAGE_DESKTOP, CONSULTA_PRESET_SELECT_EMPTY_OPTIONS_MESSAGE_MOBILE, CONSULTA_PRODUTOS_GRID_OPTS, CONSULTA_ROUTE_REUSE, CONSULTA_SERVIDOR_LISTA_QUERY_DEFAULTS, CONSULTA_TOPBAR_SLOT, CadastroBasePageComponent, CadastroCollectionGridColumnFormat, CadastroCollectionReferenciaHostService, CadastroCollectionRuntime, CadastroEnumOptionsRegistry, CadastroFieldRendererComponent, CadastroFieldRuntime, CadastroFieldsBaseComponent, CadastroFormDraftCacheService, CadastroFormLoadingSkeletonComponent, CadastroMetadataPageBase, CadastroMetadataPageComponent, CadastroMetadataPageServiceBase, CadastroMetadataPageShellLayoutComponent, CadastroMetadataPageStateBase, CadastroMetadataShellPageComponent, CadastroPadraoPageBase, CadastroReferenceRegistry, CadastroReferenciaDialogBridgeRegistry, CadastroReferenciaDialogHostComponent, CadastroReferenciaDialogService, CadastroReferenciaOpenMode, CadastroRuntime, CadastroRuntimeRegistry, CadastroSectionPanelLayout, CardListComponent, CepFieldComponent, CheckboxFieldComponent, ColorPickerFieldComponent, ComponentType, ConfirmDialogComponent, ConfirmDialogService, ConsoleLogComponent, ConsultaBasePageComponent, ConsultaCadastroFiltroDialogComponent, ConsultaCardCampoPapel, ConsultaCardFieldFormat, ConsultaCatalogBundleHelper, ConsultaFiltroPresetToolbarComponent, ConsultaFiltrosSessaoService, ConsultaGridColumnFormat, ConsultaGridOrderDirection, ConsultaListaMemoriaCacheService, ConsultaPadraoPageBase, ConsultaPageCache, ConsultaPageLoadingSkeletonComponent, ContainerLayoutSize, ContextMenuComponent, CpfCnpjFieldComponent, DEFAULT_STRUCTRA_APP_VERSION_API_PATH, DEFAULT_STRUCTRA_APP_VERSION_FALLBACK, DEFAULT_STRUCTRA_COOKIE_NOTICE_ACCEPT_LABEL, DEFAULT_STRUCTRA_COOKIE_NOTICE_DESCRIPTION, DEFAULT_STRUCTRA_COOKIE_NOTICE_STORAGE_KEY, DEFAULT_STRUCTRA_COOKIE_NOTICE_TITLE, DEFAULT_STRUCTRA_SHELL_SCROLL_RESTORATION_OPTIONS, DEFAULT_STRUCTRA_SHELL_SIDEBAR_COLLAPSED_STORAGE_KEY, DROPDOWN_SEARCH_LOCAL_PAGE_SIZE, DashboardSectionComponent, DataCardComponent, DataGridComponent, DataListComponent, DataToolbarComponent, DateFieldComponent, DecimalFieldComponent, DetailsFieldComponent, DetailsViewComponent, DialogFooterDirective, DividerComponent, DrawerComponent, DrawerSide, DrawerSize, DropdownBaseComponent, DropdownMenuComponent, DropdownMultiOptionFieldBase, DropdownOptionFieldBase, DropdownSearchFieldComponent, ENM_STATUS_OPCOES_SELECT, EmptyStateComponent, EnmStatus, FIELD_MOBILE_LAYOUT_QUERY, FILE_PREVIEW_UNAVAILABLE_MESSAGE, FORM_CONTAINER_STATE_STORAGE_PREFIX, FORNECEDORES_NAV_ID_EXCLUIDO, FORNECEDORES_NAV_LINHA_GRAVADA, FORNECEDORES_NAV_VOLTAR_SEM_RECARREGAR, FieldCadastroRedirectButtonComponent, FileUploadFieldComponent, FileUploadType, FormActionsAlign, FormActionsComponent, FormColComponent, FormCollectionComponent, FormCollectionLayout, FormGroupComponent, FormGroupVariant, FormLayoutGap, FormRowAlign, FormRowComponent, FormRowJustify, FormSectionAlign, FormSectionComponent, FormSectionRadius, FormSectionVariant, FormTabComponent, FormTabsComponent, GridLayoutConsultaService, ImagePreviewPanelComponent, InputMaskFieldComponent, IntegerFieldComponent, LAYOUT_STACK_SIDE_BY_SIDE, LAYOUT_STACK_STACKED, LayoutStackAlign, LayoutStackComponent, LayoutStackDirection, LayoutStackItemAlign, LibDialogSize, ListItemComponent, LoadingDialogComponent, LoadingDialogService, MaskedTextFieldBase, MenuDividerComponent, MenuDropdownPlacement, MenuGroupComponent, MenuListComponent, MultiselectFieldComponent, NO_OP_CONSULTA_ROUTE_REUSE, NO_OP_CONSULTA_TOPBAR_SLOT, NgControlFieldDirective, OPS_BOOL, OPS_DATA, OPS_TEXTO, OPS_TEXTO_MULTISELECT, ORIGEM_CADASTRO_INLINE_PESSOA, OnboardingChecklistComponent, OverlayPlacement, PDF_IFRAME_VIEWER_HASH, PEDIDOS_NAV_ID_EXCLUIDO, PEDIDOS_NAV_LINHA_GRAVADA, PEDIDOS_NAV_VOLTAR_SEM_RECARREGAR, PERMISSION_GROUP_OUTROS_KEY, PERMISSION_GROUP_OUTROS_LABEL, PERMISSION_GROUP_OUTROS_ORDER, PESSOAS_NAV_LINHA_GRAVADA, PESSOAS_NAV_VOLTAR_SEM_RECARREGAR, PHONE_BR_LANDLINE_MASK, PHONE_BR_MOBILE_MASK, PRODUTOS_NAV_ID_EXCLUIDO, PRODUTOS_NAV_LINHA_GRAVADA, PRODUTOS_NAV_VOLTAR_SEM_RECARREGAR, StructraPageFooterComponent as PageFooterComponent, PasswordFieldComponent, PermissionGroupTabComponent, PermissionGroupTabsComponent, PhoneFieldComponent, PopoverBodyTemplateDirective, PopoverComponent, PopoverFooterTemplateDirective, PopoverTriggerDirective, ReferenceOptionPreset, STRUCTRA_ADMIN_ROUTE_REDIRECT_CACHE_PREFIX, STRUCTRA_ADMIN_ROUTE_REDIRECT_LOGIN_ID_CACHE_KEY, STRUCTRA_APP_VERSION_CONFIG, STRUCTRA_CADASTRO_INLINE_RESULT_KEY, STRUCTRA_CADASTRO_INLINE_RETURN_KEY, STRUCTRA_CONSULTA_FORCE_REFRESH_KEY, STRUCTRA_CONSULTA_GRID_STATE_SESSION_RESET, STRUCTRA_CONSULTA_GRID_STATE_TENANT_RESOLVER, STRUCTRA_CONSULTA_GRID_STATE_TTL_MS_DEFAULT, STRUCTRA_COOKIE_NOTICE_CONFIG, STRUCTRA_DEDICATED_BACK_TO_TOP_SELECTOR, STRUCTRA_GRID_LAYOUT_API_BASE_RESOLVER, STRUCTRA_GRID_LAYOUT_AUTH_HEADERS_RESOLVER, STRUCTRA_GRID_LAYOUT_TENANT_RESOLVER, STRUCTRA_INLINE_FORM_DRAFT_PENDING_PREFIX, STRUCTRA_KANBAN_DESKTOP_MIN_WIDTH, STRUCTRA_MIDIA_PUBLIC_BASE_RESOLVER, STRUCTRA_MIDIA_UPLOAD_TRANSPORT, STRUCTRA_PAGE_CACHE_SCOPE_SEP, STRUCTRA_PAGE_FOOTER_CONFIG, STRUCTRA_PAGE_FOOTER_PARTS, STRUCTRA_PAGE_STATE_ACTIVE_TAB_PREFIX, STRUCTRA_REPORT_DEFAULT_PAGE_SIZE, STRUCTRA_REPORT_TRANSPORT, STRUCTRA_SCROLL_SESSION_RESET, STRUCTRA_SCROLL_TENANT_RESOLVER, STRUCTRA_SHELL_NAV_CONTENT_READY, STRUCTRA_SHELL_SCROLL_RESTORATION_OPTIONS, STRUCTRA_SHELL_TOPBAR_TITLE_SKELETON, STRUCTRA_SIMULATED_LOADING_DELAY_MS, STRUCTRA_THEME_DARK_CLASS, STRUCTRA_THEME_IDS, STRUCTRA_UI, ScriptEditorFieldComponent, SelectFieldComponent, SkeletonBlockComponent, SkeletonCardComponent, SkeletonFieldShellComponent, SkeletonListComponent, SkeletonStatCardComponent, SkeletonTableComponent, SkeletonTextComponent, StatCardComponent, StatusBadgeComponent, StructraAdminRouteRedirectPageBase, StructraAppVersionService, StructraBackToTopButtonComponent, StructraConsultaGridStateService, StructraCookieNoticeComponent, StructraCookieNoticeService, StructraKanbanDragAutoScrollController, StructraPageCacheService, StructraPageComponentOutletComponent, StructraPageComponentRegistry, StructraPageFooterComponent, StructraPageStateCacheService, StructraPreserveScrollDirective, StructraProgressOverlayComponent, StructraReportEmptyStateComponent, StructraReportFilterPanelComponent, StructraReportLoadingSkeletonComponent, StructraReportPageBaseComponent, StructraReportPageComponent, StructraReportPaginatorComponent, StructraReportPreviewHeaderComponent, StructraReportTableComponent, StructraReportTreeCacheService, StructraReportTreeComponent, StructraReportTreeSkeletonComponent, StructraReportViewerComponent, ScriptEditorFieldComponent as StructraScriptEditorComponent, StructraScrollStateService, StructraShellScrollRestorationService, StructraShellTopbarSlotService, AppSidebarBottomActionsTemplateDirective as StructraSidebarBottomActionsDirective, AppSidebarFooterTemplateDirective as StructraSidebarFooterDirective, AppSidebarHeaderTemplateDirective as StructraSidebarHeaderDirective, AppSidebarUserInfoTemplateDirective as StructraSidebarUserInfoDirective, StructraSidebarUserPanelComponent, StructraTreeExpandStateService, SwitchFieldComponent, THEME_PRIMARY_COLOR_LABEL_PT_BR, TOAST_REGISTRO_EXCLUIDO_SUCESSO, TableEmptyStateComponent, TableToolbarComponent, TextFieldComponent, TextareaFieldComponent, ThemeDirective, ToastHostComponent, ToastService, TooltipComponent, TooltipPanelTemplateDirective, TreeViewComponent, USUARIOS_CONSULTA_GRID_OPTS, USUARIOS_NAV_ID_EXCLUIDO, USUARIOS_NAV_LINHA_GRAVADA, USUARIOS_NAV_VOLTAR_SEM_RECARREGAR, VENDEDORES_NAV_ID_EXCLUIDO, VENDEDORES_NAV_LINHA_GRAVADA, VENDEDORES_NAV_VOLTAR_SEM_RECARREGAR, ValidationSummaryComponent, agruparCamposMetadataPorSecao, agruparPermissionTabs, anchoredOverlayPositions, aplicarNormalizacaoMultiselectIdsNoPartial, aplicarProdutoDtoNoFormulario, appendCadastroPageActiveTabQuery, appendPdfIframeViewerParams, applyCadastroCollectionArrayValidators, applyCadastroModoSenhaNovos, applyCollectionValidationSummaryNavigation, applyCollectionValueToFormArray, applyConsultaListaPatch, applyEntityToCadastroFormByMetadata, applyOptionalThemeHostClasses, applyPickedCalendarDate, attachStructraScrollPreserve, buildCadastroFiltroDialogItensGridRows, buildCadastroMetadataShellRuntime, buildCadastroPageActiveTabPageKey, buildCadastroPageActiveTabPageKeyFromLayout, buildCadastroPageRuntime, buildCadastroRedirectReturnUrl, buildCadastroReferenciaDialogContext, buildCatalogoStubConsultaRuntime, buildConsultaConfirmDuplicarLinhaFromLayout, buildConsultaConfirmRemoverLinhaFromLayout, buildConsultaDefaultIsItemGuard, buildConsultaGridStateSessionKey, buildConsultaListaCacheKey, buildConsultaPageMetadataUnified, buildConsultaPageRuntime, buildDecimalBrDisplay, buildDecimalBrParseString, buildDefaultConsultaMapCardFromColunasGrid, buildEmptyStateOverlayHtml, buildFormContainerStateStorageKey, buildFormGroupFromCadastroCampos, buildGridNavigateUrl, buildHistoryStateAfterReturningFromNestedInlineChild, buildInlineReturnStateForChildCadastro, buildNovoFormDefaultsFromCampos, buildReportRowCardMap, buildRouteReuseKeyFromAppPathname, buildRouteReuseKeyFromNovoRouterLink, buildStructraAdminRouteRedirectCacheKey, buildStructraAdminRouteRedirectChildUrl, buildStructraPageCacheCadastroInitKey, buildStructraPageCacheRouteScope, buildStructraPageFooterParts, buildStructraSidebarTemplateContext, buildValidationMetaFromCadastroCampos, cadastroBuildImageUploadMetadata, cadastroCampoBlocoEditorOcupaLinhaInteira, cadastroCampoBooleanOcupaLinhaInteira, cadastroCampoMetadataDtoFromPartial, cadastroCampoMetadataEhBoolean, cadastroCampoMetadataLarguraCompacta, cadastroCampoMetadataLarguraFixaCss, cadastroCampoReferenciaMetadataDtoFromPartial, cadastroCampoRuleMaxLength, cadastroCampoScriptEditorLanguage, cadastroCampoScriptEditorMinHeight, cadastroCampoValidacaoDtoFromPartial, cadastroCampoWrapperWidthCss, cadastroCollectionEditorGridColumns, cadastroCollectionMaxItemsValidator, cadastroCollectionMinItemsValidator, cadastroConfirmExcluirPartialFromLayout, cadastroContainerLayoutSizeDoRecord, cadastroContainerPathJoin, cadastroCrudMessagesDoFormLayout, cadastroDeclarativeSnapshotDtoFromPartial, cadastroEnsureSingleBooleanInCollection, cadastroFieldsPerRowDoRecord, cadastroFlattenContainerRaw, cadastroFormDraftEnabledDoLayout, cadastroFormGridColumns, cadastroFormLayoutComoRecord, cadastroFormLayoutDoBundle, cadastroFormLayoutDoRuntime, cadastroFormLayoutPreserveActiveTab, cadastroFormPageLayoutFromPartial, cadastroGcd, cadastroGetCollectionItemControl, cadastroGridColumnSpanForFieldIndex, cadastroGridDenominadorTracks, cadastroGridTemplateColumnsLinhaUnicaSeAplicavel, cadastroInferExtensaoArquivo, cadastroInferImageContentType, cadastroLcm, cadastroMetadataDtoParaValidacaoLike, cadastroNavKeysStructra, cadastroNomeArquivoDaUploadUrl, cadastroNormalizarUploadUrlPorPrefixo, cadastroPageActionDtoFromPartial, cadastroPageActionsPorRegiao, cadastroPageActiveTabToRestore, cadastroPageComponentDtoFromPartial, cadastroPageComponentsPorRegiao, cadastroPageIdentityDoFormLayout, cadastroPageOverlayDtoFromPartial, cadastroPageShellAtivo, cadastroPageShellTabsKeepAliveFromLayout, cadastroPageTabDtoFromPartial, cadastroPageTabsOrdenados, cadastroPainelMaxWidthCss, cadastroRawBooleanDeep, cadastroRawNumber, cadastroRawString, cadastroReferenceEntryFromListarService, cadastroReferenciaOpenModeFromWire, cadastroReindexarCollectionOrdem, cadastroResolveId, cadastroSecaoFormGroupDense, cadastroSecaoPersisteExpandedState, cadastroSecaoRenderizaInlineDentroDoPai, cadastroSecaoSegmentosIntercalados, cadastroSecaoSegmentosParaRender, cadastroSecaoUsaFormGroup, cadastroSecaoUsaFormGroupComoBlocoVisual, cadastroSecaoUsaSuperficieDeclarativa, cadastroSingleBooleanCollectionBinding, cadastroTitulosEfectivosDoFormLayout, cadastroToastTitleEfectivoDoFormLayout, cadastroToolbarButtonDtoFromPartial, cadastroToolbarVisibilityDoFormLayout, cadastroUseBackToTopButtonFromLayout, cadastroValidationSummaryFlagsDoRecord, cadastroValidationSummaryPinnedFromFlags, cadastroWireCollectionOrdemReindexOnAdd, cadastroWireCollectionOrdemReindexOnAddRemove, cadastroWireCollectionOrdemReindexOnRemove, campoMetadataVisivelNoModo, caretIndexFromIntegerDigitCount, caretIndexFromSemantic, carregarOpcoesMultiselectViaSpec, cepMaskCompleteValidator, clearRequiredValidatorsOnReadOnlyCadastroFields, clearStructraCadastroInlineReturnSessionCacheForTests, clearStructraCadastroSessionStorageOnLogout, coerceDecimalPtBr, coerceReportBoolean, collectValidationSummaryItems, colunasGridTemFormatacaoDeclarativa, computeReferenciaHasMore, consoleLogLevelClass, consultaCadastroPatchKindFromModo, consultaCampoMetadataDtoFromPartial, consultaCardCampoDtoFromPartial, consultaFiltroValorDataSomenteDia, consultaGridColunaDtoFromPartial, consultaGridColunaKeyParaCampoLinha, consultaGridConfigDtoFromPartial, consultaNavKeysStructra, consultaPassaItem, consultaPassaTodosItens, consultaUsuariosMetadataReplyFromPartial, consumeCadastroInlineFormDraftPendingRestore, consumeConsultaPendingGridReturn, consumeGridReturnVoltarKeyForUrl, consumirResultadoCadastroInlineCampoPessoaId, consumirResultadoCadastroInlineCampoReferencia, cpfCnpjMaskCompleteValidator, createCadastroDialogActivatedRoute, createCadastroMetadataPageConfig, createCadastroPadraoConfig, createCadastroRuntime, createCollectionFormArray, createCollectionItemFormGroup, createConsultaListaItemGuardFromFiltroUi, createConsultaOptionsListarResolver, createConsultaPadraoRuntime, createConsultaPresetSelectEmptyOptionsMessageSignal, createConsultaPresetStorageApi, createGrpcSaveRequestMapper, createInlineHostNavigation, createMapCardFromConsultaColunasGrid, createMapGridRowFromConsultaColunasGrid, createSaveRequestFromPartialMapper, criarDraftInlinePessoa, decimalPtBrNaoNegativoValidator, decimalPtBrToNullableNumber, dedupeUiSelectOptionsByValue, defaultIsConsultaListItemMinimo, defaultParseLinhaGravadaJson, deleteConfirmPageConfigFromPartial, deriveCadastroTituloEditar, deriveConsultaListaItemGuardPropsFromFiltroUi, duplicateConfigFromLayout, duplicatePageConfigFromPartial, enrichCadastroReferenciaDialogPageConfig, ensureCadastroCollectionMinItems, ensureCadastroFormControlsFromMetadata, escapeHtml, evaluateStructraPageVisibleExpression, executarConsultaServidorComPreset, extractConsultaListaCacheNamespace, extractDecimalBrParts, fileIsLikelyImage, fileMatchesAccept, filtrarSecoesMetadataPorModo, filtrarUiSelectOptionsPainelComValorPersistente, filtrarUiSelectOptionsPorQuery, findCadastroCampoByKey, findFirstReportLeafId, findReportTreeLabel, fixedDigitsMaskCompleteValidator, flattenCadastroMetadataSecoes, fmtDataPt, fmtDocumentoCelulaConsultaGrid, formatAcceptForDisplay, formatDateTimePtBr, formatDecimalBr, formatDocumentoPessoaParaExibicao, formatFileSizeBytes, formatIntegerThousandsBr, formatMaskDigits, formatPhoneBr, formatReportPreviewTitulo, formatUiFieldDateValue, getFilePreviewKind, getStructraActionsByGroup, getThemeClass, getThemeClassList, getThemePrimaryColorLabelPtBr, getThemeTokenClass, gridNavigateIconClass, hexParaColorInput, inferCadastroItemFieldsFromPlainRows, inferCadastroListaUrlFallback, initialCadastroControlValue, injectEffectiveThemeId, isCadastroDuplicateNavigation, isCollectionField, isCollectionLikeField, isConsultaCardAutoSubtitleExcluded, isLegacyDarkThemeId, isLegacyFormContainerStateStorageKey, isLegacyNomeDocumentoReferencePreset, isReadonlyCollectionField, isReportBooleanColumn, isReportGroupNode, isReportNowrapColumn, isValidPhoneBr, libDialogPanelClasses, listaUrlFromRotaCadastro, listarItensCadastroReferencia, listarTodosPaginado, loadPresetsJson, loadStructraAdminRouteRedirectTarget, mapCadastroFormRawToPayload, mapConsultaGridColunasParaDataGrid, mapConsultaMetadataParaFiltroUi, mapErroTransporteParaMensagem as mapErroListaDefault, mapErroTransporteParaMensagem, mapEstadosToOptions, mapFiltroSalvoParaConsultaPreset, mapGridNavigateFromColuna, mapListarItensParaMultiselectOpcoes, mapReportTreeToTreeViewNodes, mapReportTreeToTreeViewNodesForSelection, markCadastroInlineFormDraftPendingRestore, markConsultaPendingGridReturn, maskDigitCount, mergeCadastroConfirmExcluir, mergeConsultaGridRowFormattingFromColunasGrid, mergeConsultaMultiselectOpcoesComSeleccionados, mergeDocumentoFmtNaLinhaConsulta, mergeMapConsultaGridColunasOptsComColumnFormat, mergeNovoIdEmListaSelecionada, mergeStructraShellScrollRestorationOptions, metadataCampoParaChaveLinhaCliente, modoPermissaoReferenciaFromWire, montarFiltrosGrpcPreset, montarFiltrosServidorPreset, montarHierarquiaSecoesMetadata, multiselectIdListRequiredValidator, multiselectMaxItemsValidator, navegarAposLoginAdmin, navegarVoltarLista, navegarVoltarListaComIdRemovido, navegarVoltarListaComLinha, navigateCadastroDuplicate, navigateCommandsFromRotaAlterar, navigateCommandsFromRotaNovo, navigateFromGrid, nomeSalvarParaPayloadComPessoa, normalizarArvoreSecoesMetadata, normalizarCaminhoLoginAdmin, normalizarHexCor, normalizarItensParaGravarServidorCadastro, normalizarListaIdsMultiselect, normalizarOperadorConsultaParaEnvioServidor, normalizarRotaReferencia, normalizarStructraAction, normalizarStructraActionGroup, normalizarStructraActionGroups, normalizeCadastroAppPath, normalizeCadastroCampoMetadataWire, normalizeCadastroInitRouteIdParam, normalizeCadastroItemEditorDecimalControls, normalizeCadastroReferenciaDialogRotaKey, normalizeCadastroRouteForContainerState, normalizeConsoleLogLevel, normalizeFormDateValue, normalizePhoneBr, normalizeStructraAdminPath, normalizeStructraScrollRoute, normalizeStructraTheme, novoPathCommandsFromRota, onlyDigits, operadorConsultaComValorUnicoComparacao, operadorConsultaDatetimeUsaDatePicker, operadoresConsultaCampo, operadoresPorTipo, ordenarFiltroItens, ordenarStructraActions, parseDecimalBr, parseIntegerString, parseUiFieldDateValue, patchFormFromEntidadeRecord, permissionTabsUsamGruposVerticais, permissoesReferenciaMetadata, persistStructraCookieNoticeAccepted, persistStructraShellSidebarCollapsed, phoneBrDynamicMaskCompleteValidator, phoneBrMaskCompleteValidator, phoneBrMaskFromDigits, pickCadastroPageActiveTabExplicit, pickTabKeyLinkedToSummaryItems, podeNavegarGridColuna, precisaValor, precisaValorFinal, provideAppPageFooter, provideAppVersion, provideStructraAppVersion, provideStructraCadastroReferenciaDialogRoot, provideStructraConsultaGridState, provideStructraCookieNotice, provideStructraPageFooter, provideStructraScrollState, provideStructraShellScrollRestoration, provideStructraTreeExpandState, qtdCriteriosPresetParaSkeleton, readCadastroDuplicateSourceId, readCadastroPageActiveTabFromNavigationState, readCadastroPageActiveTabFromUrl, readFormContainerCollapsedFromStorage, readStructraAdminRouteRedirectTarget, readStructraCadastroInlineReturn, readStructraShellSidebarCollapsed, referenciaAbreEmDialog, referenciaOpenModeRaw, referenciaUsesLegacyRegistryMapper, registerCadastroReferenceEntries, registerCadastroReferenceListSources, registerCadastroReferenciaDialogBridges, registerStructraBuiltinPageComponents, replaceProdutoCadastroFormControls, reportColumnWidthStyle, reportExistsInTree, reportTableHasFixedWidths, resetStructraCadastroReferenciaDialogRootForTests, resolveCadastroCollectionMinItems, resolveCadastroListaUrlParaNavegacao, resolveCadastroPageActiveTabKey, resolveCadastroReferenciaMapOptions, resolveConsultaEditActionLabelFromGridConfig, resolveConsultaListaQuerySliceFromGridConfig, resolveConsultaNavKeysFromPageLayout, resolveConsultaNovoRouterLinkFromLayout, resolveConsultaRouteEditBaseFromLayout, resolveConsultaToastTitleLista, resolveControlAtPath, resolveFormContainerCollapsed, resolveInitialReportId, resolveReferenciaOpcaoLabel, resolveReportPreviewSubtitulo, resolveStructraAdminMenuUrl, resolveStructraAppVersionConfig, resolveStructraCookieNoticeConfig, resolveStructraPageCacheCadastroScope, resolveStructraPageInputExpression, resolveStructraPageInputs, resolveStructraShellScrollContainer, resolverAcoesReferenciaPorRota, resolverValorOpcaoPorRotuloNormalizado, resumoValorMultiselectFiltro, rotaListaReferencia, rotuloEnmStatus, rotuloNomeDocumentoLista, rotuloOperadorConsulta, rotuloPessoaLista, runStructraSimulatedLoadingDelay, sanitizeDecimalBrInput, sanitizeIntegerDigits, sanitizeRecordForCadastroDuplicate, savePresetsJson, scheduleRemoteCollectionHydrationAfterSectionExpand, secaoMetadataEhContainerPlain, secaoTemConteudoVisivel, secaoTemCorpoParaRender, sectionHasVisibleInvalid, semanticCaretAt, semanticIntegerDigitCountLeft, serializeCollectionFormArray, shouldDeferInitialRemoteCollectionLoad, shouldSkipCadastroPageActiveTabCacheWrite, shouldSkipStructraAdminMenuNavigation, stripStructraCadastroInlineResultFromHistory, stripToDigits, structraActionButtonVariant, structraCadastroInlineResultTemIdSalvo, structraCadastroInlineResultTemReferenciaExcluida, structraCookieNoticeWasAccepted, structraElementScrolls, structraHasValue, structraIsFilledString, structraIsFormGroup, structraIsValidPort, structraParseNumberOrNull, structraReadFormValue, structraReadNestedValue, structraTrimString, subscribeMarkForCheckOnInvalidUiRefresh, subtreeHasVisibleInvalid, syncStructraCadastroInlineReturnSessionCache, tabWarningFromLinkedSummaryItems, tipoCampoMetadataParaUi, tipoValorApi, toCadastroReferenceListPageResult, toConsoleLogLineView, toConsoleLogLineViews, toUiSelectOptionsFromMetadata, uiSelectOpcaoIdNomeDocumento, uiSelectOpcoesDePessoas, validationLikeFromCampoMetadata, validatorsFromCampo, writeFormContainerCollapsedToStorage };
45900
46515
  //# sourceMappingURL=structra-ui.mjs.map