|
@@ -78,8 +78,10 @@
|
|
|
<ProposalPricingTab
|
|
<ProposalPricingTab
|
|
|
v-model="form.pavao"
|
|
v-model="form.pavao"
|
|
|
v-model:enabled="form.pavao_enabled"
|
|
v-model:enabled="form.pavao_enabled"
|
|
|
|
|
+ field-prefix="pavao"
|
|
|
:product-options="productOptions"
|
|
:product-options="productOptions"
|
|
|
section-label="Pavão"
|
|
section-label="Pavão"
|
|
|
|
|
+ :validation-errors="validationErrors"
|
|
|
/>
|
|
/>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
@@ -90,9 +92,11 @@
|
|
|
<ProposalPricingTab
|
|
<ProposalPricingTab
|
|
|
v-model="form.irrecusavel"
|
|
v-model="form.irrecusavel"
|
|
|
v-model:enabled="form.irrecusavel_enabled"
|
|
v-model:enabled="form.irrecusavel_enabled"
|
|
|
|
|
+ field-prefix="irrecusavel"
|
|
|
:product-options="productOptions"
|
|
:product-options="productOptions"
|
|
|
section-label="Irrecusável"
|
|
section-label="Irrecusável"
|
|
|
show-condition
|
|
show-condition
|
|
|
|
|
+ :validation-errors="validationErrors"
|
|
|
/>
|
|
/>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
@@ -319,37 +323,49 @@ const onOKClick = async () => {
|
|
|
quantity_classes: form.quantity_classes,
|
|
quantity_classes: form.quantity_classes,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- await execute(() => {
|
|
|
|
|
- if (!props.package?.id) {
|
|
|
|
|
- return createUnitPackage(payload);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ await execute(() => {
|
|
|
|
|
+ if (!props.package?.id) {
|
|
|
|
|
+ return createUnitPackage(payload);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- const changedFields = getUpdatedFields.value;
|
|
|
|
|
- const updatePayload = {};
|
|
|
|
|
|
|
+ const changedFields = getUpdatedFields.value;
|
|
|
|
|
+ const updatePayload = {};
|
|
|
|
|
|
|
|
- const directKeys = ["name", "quantity_classes"];
|
|
|
|
|
|
|
+ const directKeys = ["name", "quantity_classes"];
|
|
|
|
|
|
|
|
- for (const key of directKeys) {
|
|
|
|
|
- if (key in changedFields) {
|
|
|
|
|
- updatePayload[key] = payload[key];
|
|
|
|
|
|
|
+ for (const key of directKeys) {
|
|
|
|
|
+ if (key in changedFields) {
|
|
|
|
|
+ updatePayload[key] = payload[key];
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if ("class_duration_hours" in changedFields) {
|
|
|
|
|
- updatePayload.class_duration_minutes =
|
|
|
|
|
- payload.class_duration_minutes;
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- // Pavão/Irrecusável têm validação cruzada entre campos (par exclusivo de
|
|
|
|
|
- // checkbox) e um sinal explícito de "removido" (null) — vão sempre inteiros.
|
|
|
|
|
- updatePayload.pavao = payload.pavao;
|
|
|
|
|
- updatePayload.irrecusavel = payload.irrecusavel;
|
|
|
|
|
|
|
+ if ("class_duration_hours" in changedFields) {
|
|
|
|
|
+ updatePayload.class_duration_minutes =
|
|
|
|
|
+ payload.class_duration_minutes;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- return updateUnitPackage(
|
|
|
|
|
- props.package.id,
|
|
|
|
|
- updatePayload,
|
|
|
|
|
- );
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ // Pavão/Irrecusável têm validação cruzada entre campos (par exclusivo de
|
|
|
|
|
+ // checkbox) e um sinal explícito de "removido" (null) — vão sempre inteiros.
|
|
|
|
|
+ updatePayload.pavao = payload.pavao;
|
|
|
|
|
+ updatePayload.irrecusavel = payload.irrecusavel;
|
|
|
|
|
+
|
|
|
|
|
+ return updateUnitPackage(
|
|
|
|
|
+ props.package.id,
|
|
|
|
|
+ updatePayload,
|
|
|
|
|
+ );
|
|
|
|
|
+ });
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ // Se o erro veio de dentro de Pavão/Irrecusável, troca pra aba certa —
|
|
|
|
|
+ // senão a mensagem fica escondida numa tab que não está visível.
|
|
|
|
|
+ const errorKeys = Object.keys(validationErrors);
|
|
|
|
|
+
|
|
|
|
|
+ if (errorKeys.some((key) => key.startsWith("pavao."))) {
|
|
|
|
|
+ currentTab.value = "pavao";
|
|
|
|
|
+ } else if (errorKeys.some((key) => key.startsWith("irrecusavel."))) {
|
|
|
|
|
+ currentTab.value = "irrecusavel";
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
onMounted(async () => {
|
|
onMounted(async () => {
|