Refactor reference validation in PosDepartmentStepMobileButtonNextStep.vue

- Simplified reference resolution logic with a new `resolveReferenceFromSources` helper.
- Replaced error popups with `Swal`-based prompts for better user interaction.
- Enhanced `validateReferenceRequirements` to handle missing references more gracefully.
- Improved step flow by integrating `finalizeStep1` for streamlined completion.
This commit is contained in:
Jeppe Bundgaard
2025-09-18 13:04:03 +02:00
parent 319e3ee9b3
commit c8b0d591e6
@@ -6,6 +6,7 @@ import { SessionUser } from "@/components/session/token/SessionUser.vue";
import GenericButton from "@/components/viewport/page/templates/generic/graphics/GenericButton.vue";
import ContinueArrow from "@/components/viewport/elements/icons/ContinueArrow.vue";
import { vehicles, metadata, getCustomerId, popups, resetPos, actionButtons } from "../objects/PosDepartmentStepMobileFlow.vue";
import Swal from "sweetalert2";
const selectCustomerString = `${SessionUser.objects.global.language.select} ${SessionUser.objects.global.language.customer.toLowerCase()}`;
const props = defineProps({
@@ -27,20 +28,85 @@ const updateNotes = () => {
SessionUser.objects.orders.set.notes(order_id.value, order_notes.value);
}
// Helpers: extracted for clarity and reuse
const isNonEmptyString = (val) => typeof val === 'string' && val.trim().length > 0;
const resolveReferenceFromSources = () => {
// 1) Metadata reference
const metaRef = metadata.getReference?.();
if (isNonEmptyString(metaRef)) return metaRef.trim();
// 2) Local reactive reference field
if (isNonEmptyString(reference.value)) return reference.value.trim();
// 3) Vehicle #1 reference (fallback)
const vehicleRef = vehicles.get(1)?.reference;
if (isNonEmptyString(vehicleRef)) return String(vehicleRef).trim();
return null;
};
const promptForReference = async (initialValue = '') => {
const result = await Swal.fire({
title: 'Reference Number Required',
text: 'The selected customer requires a reference number to proceed. Please provide a reference number.',
input: 'text',
inputLabel: 'Reference',
inputValue: initialValue,
showCancelButton: true,
confirmButtonText: 'Save',
cancelButtonText: 'Cancel',
preConfirm: (newReference) => {
if (!isNonEmptyString(newReference)) {
Swal.showValidationMessage('Reference cannot be empty');
}
return newReference;
}
});
if (result.isConfirmed && isNonEmptyString(result.value)) {
return result.value.trim();
}
return null;
};
// Refactored main function
const validateReferenceRequirements = async () => {
// Load customer attributes
await loadCustomerAttributes();
// Check if the customer has the required attributes
const requiresReference = hasAttribute('requiresReferenceNumber');
if (requiresReference && (!metadata.getReference() || metadata.getReference().length < 1)) {
popups.select('error', {
title: 'Reference Number Required',
message: 'The selected customer requires a reference number to proceed. Please provide a reference number and try again.',
});
const customerRequiresReference = hasAttribute('requiresReferenceNumber');
// Try to resolve an existing reference from known sources
const resolvedRef = resolveReferenceFromSources();
if (isNonEmptyString(resolvedRef)) {
// Ensure both local ref and metadata are synchronized
if (reference.value !== resolvedRef) reference.value = resolvedRef;
if (metadata.getReference() !== resolvedRef) metadata.setReference(resolvedRef);
return true;
}
// If customer does not require a reference, we are good even if none was resolved
if (!customerRequiresReference) {
return true;
}
// Prompt user for a reference if required and none available
try {
const enteredRef = await promptForReference(reference.value ?? '');
if (isNonEmptyString(enteredRef)) {
reference.value = enteredRef;
metadata.setReference(enteredRef);
console.warn('New reference set:', enteredRef);
onClick(); // Retry the click action
return true;
}
console.warn('Reference number is required but was not provided. Aborting operation.');
return false;
} catch (error) {
console.warn('An error occurred while setting the reference number:', error);
return false;
}
return true;
}
};
const step1 = () => {
/** This function can be used to perform any specific actions for step 1 */
@@ -49,14 +115,21 @@ const step1 = () => {
reg_2.value = vehicles.vehicle_2.value?.reg || "";
reg_3.value = vehicles.vehicle_3.value?.reg || "";
// We only need to check if the customer requires reference, if the field is empty.
validateReferenceRequirements().then((isValid: boolean) => {
if (!isValid) {
console.warn('Customer does not have the required attributes to proceed. Aborting step 1.');
return;
}
}).catch((error: any) => {
console.warn('An error occurred while validating customer attributes gracefully:', error);
});
if (!isNonEmptyString(reference.value)) {
validateReferenceRequirements().then((isValid) => {
if (!isValid) {
// The requirements were not met, do not proceed.
return;
}
// Proceed with setting reference and notes
finalizeStep1();
});
} else {
// Reference is already filled, just finalize step 1
finalizeStep1();
}
};
const finalizeStep1 = () => {
if (metadata.getReference() && metadata.getReference().length >= 1) {
// If there is no reference, set it to the registration number of vehicle 1
reference.value = metadata.getReference();