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:
+91
-18
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user