@praxisui/settings-panel 9.0.65 → 9.0.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -228,6 +228,12 @@ Regras do contrato:
228
228
  - `Save` usa `onSave()` quando existir, usa `getSettingsValue()` como fallback, emite `saved$` e fecha com motivo `save`.
229
229
  - `Reset` e destrutivo, exige confirmacao, chama `reset()` quando existir e emite `reset$`.
230
230
  - `Apply` e `Save` continuam bloqueados por `dirty=false`, `valid=false` ou `busy=true`.
231
+ - A validade e a disponibilidade são conferidas novamente depois de produzir o valor,
232
+ inclusive após resolução de Promise/Observable em `onSave()`. Uma reprovação tardia
233
+ não emite `applied$`/`saved$`, não marca sucesso e não fecha o rascunho.
234
+ O editor deve publicar a reprovação em `isValid$`; `null` sozinho não é um veto
235
+ universal, pois o significado do documento pertence ao editor consumidor.
236
+ Um provider bem-sucedido pode limpar seu próprio dirty antes de retornar o valor.
231
237
  - O editor hospedado deve implementar `SettingsValueProvider` quando o fluxo for autoral.
232
238
  - Inputs persistidos do editor devem permanecer serializaveis.
233
239
  - `diagnostics` controla somente a visibilidade dos diagnosticos do shell (`statusMessage`, motivo de desabilitacao, busy e estado invalido); ele nao altera as regras de bloqueio de `Apply`/`Save`.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-09-06T00:12:27.419Z",
3
+ "generatedAt": "2026-09-06T19:09:46.917Z",
4
4
  "packageName": "@praxisui/settings-panel",
5
- "packageVersion": "9.0.65",
5
+ "packageVersion": "9.0.66",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 1,
@@ -758,6 +758,10 @@ class SettingsPanelComponent {
758
758
  if (!this.canApply)
759
759
  return;
760
760
  const value = this.contentRef?.instance?.getSettingsValue?.();
761
+ // Producing a value can synchronously invalidate the provider. Do not
762
+ // publish a preview based only on the state captured before validation.
763
+ if (value === undefined || !this.isValid || this.isBusy || !this.interactionActive)
764
+ return;
761
765
  this.ref.apply(value);
762
766
  }
763
767
  onSave() {
@@ -782,7 +786,9 @@ class SettingsPanelComponent {
782
786
  }
783
787
  }
784
788
  emitSave(value) {
785
- if (value === undefined)
789
+ // Recheck after synchronous validation or asynchronous completion. Dirty
790
+ // may legitimately be cleared by a successful provider; it is not a veto.
791
+ if (value === undefined || !this.isValid || this.isBusy || !this.interactionActive || this.destroyRef.destroyed)
786
792
  return;
787
793
  this.lastSavedAt = Date.now();
788
794
  this.isDirty = false;
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@praxisui/settings-panel",
3
- "version": "9.0.65",
3
+ "version": "9.0.66",
4
4
  "description": "Settings panel for Praxis UI libraries: open editors for configuration at runtime and persist settings.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
7
7
  "@angular/core": "^21.0.0",
8
8
  "@angular/cdk": "^21.0.0",
9
9
  "@angular/material": "^21.0.0",
10
- "@praxisui/ai": "^9.0.65",
11
- "@praxisui/core": "^9.0.65",
12
- "@praxisui/dynamic-fields": "^9.0.65",
10
+ "@praxisui/ai": "^9.0.66",
11
+ "@praxisui/core": "^9.0.66",
12
+ "@praxisui/dynamic-fields": "^9.0.66",
13
13
  "rxjs": "~7.8.0"
14
14
  },
15
15
  "dependencies": {