bug fixed

This commit is contained in:
Malini 2026-03-03 14:00:53 +05:30
parent ba4e4f9b6a
commit 5135c4dd48
2 changed files with 90 additions and 46 deletions

View File

@ -1603,10 +1603,25 @@ useEffect(() => {
const errors = { ...formErrors };
const fieldKey = `${fieldName}_${productIndex}`;
if (!value || value.toString().trim() === '') {
errors[fieldKey] = 'This field is required';
// Check if this is a mandatory quantity or cost field
const mandatoryQuantityFields = ['janQuantity', 'febQuantity', 'marQuantity', 'aprQuantity', 'mayQuantity', 'junQuantity'];
const mandatoryCostFields = ['janCost', 'febCost', 'marCost', 'aprCost', 'mayCost', 'junCost'];
const isMandatoryQuantityOrCost = mandatoryQuantityFields.includes(fieldName) || mandatoryCostFields.includes(fieldName);
if (isMandatoryQuantityOrCost) {
// For mandatory quantity and cost fields, value must be greater than 0
if (!value || value.toString().trim() === '' || parseFloat(value) <= 0) {
errors[fieldKey] = 'Required';
} else {
delete errors[fieldKey];
}
} else {
delete errors[fieldKey];
// For other fields, just check if not empty
if (!value || value.toString().trim() === '') {
errors[fieldKey] = 'This field is required';
} else {
delete errors[fieldKey];
}
}
setFormErrors(errors);
@ -1617,52 +1632,49 @@ useEffect(() => {
const validateForm = () => {
const errors = {};
let isValid = true;
let hasFieldErrors = false;
// Check if all available products have been added
const availableProductsCount = productOptions.length;
const currentProductsCount = products.length;
const remainingProducts = availableProductsCount - currentProductsCount;
if (currentProductsCount < availableProductsCount) {
errors['products_general'] = 'Please complete all products to continue.';
isValid = false;
}
// First validate all individual fields for each product
products.forEach((product, index) => {
// Only validate fields that are marked as mandatory (with asterisk in UI)
// Product selection is mandatory
if (!product.product) {
errors[`product_${index}`] = 'Product is required';
isValid = false;
hasFieldErrors = true;
}
// Unit selection is mandatory
if (!product.unit) {
if (!product.unit || product.unit === '') {
errors[`unit_${index}`] = 'Unit is required';
isValid = false;
hasFieldErrors = true;
}
// Annual installed capacity is mandatory
if (!product.capacity || product.capacity === '0' || parseFloat(product.capacity) === 0) {
// Annual installed capacity is mandatory (0 should be valid)
if (!product.capacity || product.capacity === '') {
errors[`capacity_${index}`] = 'Capacity is required';
isValid = false;
hasFieldErrors = true;
}
// Only quantity fields with asterisk (*) are mandatory (current and next quarter)
const mandatoryQuantityFields = ['janQuantity', 'febQuantity', 'marQuantity', 'aprQuantity', 'mayQuantity', 'junQuantity'];
mandatoryQuantityFields.forEach(field => {
if (!product[field] || product[field] === '0' || parseFloat(product[field]) === 0) {
if (!product[field] || product[field] === '' || parseFloat(product[field]) <= 0) {
errors[`${field}_${index}`] = 'Required';
isValid = false;
hasFieldErrors = true;
}
});
// Only value fields with asterisk (*) are mandatory (current and next quarter)
const mandatoryCostFields = ['janCost', 'febCost', 'marCost', 'aprCost', 'mayCost', 'junCost'];
mandatoryCostFields.forEach(field => {
if (!product[field] || product[field] === '0' || parseFloat(product[field]) === 0) {
if (!product[field] || product[field] === '' || parseFloat(product[field]) <= 0) {
errors[`${field}_${index}`] = 'Required';
isValid = false;
hasFieldErrors = true;
}
});
@ -1673,6 +1685,7 @@ useEffect(() => {
if (product.variationReason === null || product.variationReason === undefined || product.variationReason === '') {
errors[`variationReason_${index}`] = 'Reason for variation is required when cost variation exceeds ±10%';
isValid = false;
hasFieldErrors = true;
}
// If "Other" is selected, validate the other variation reason field
@ -1685,12 +1698,26 @@ useEffect(() => {
if (isOtherSelected && (!product.otherVariationReason || product.otherVariationReason.trim() === '')) {
errors[`otherVariationReason_${index}`] = 'Please specify the reason for variation';
isValid = false;
hasFieldErrors = true;
}
}
});
// Only check product count if there are no field errors
if (!hasFieldErrors) {
// Check if all available products have been added
const availableProductsCount = productOptions.length;
const currentProductsCount = products.length;
const remainingProducts = availableProductsCount - currentProductsCount;
if (currentProductsCount < availableProductsCount) {
errors['products_general'] = 'Please complete all products to continue.';
isValid = false;
}
}
setFormErrors(errors);
return isValid;
return { isValid, hasFieldErrors, errors };
};
// Validation function for Save as Draft - requires at least one field to be filled
@ -1743,32 +1770,20 @@ useEffect(() => {
};
const handleNext = () => {
// First run validation to get errors
const errors = {};
let isValid = true;
// Check if all available products have been added
const availableProductsCount = productOptions.length;
const currentProductsCount = products.length;
// Run validation to get errors and field error status
const validation = validateForm();
if (currentProductsCount < availableProductsCount) {
errors['products_general'] = 'Please complete all products to continue.';
isValid = false;
}
// Update formErrors state
setFormErrors(errors);
if (isValid) {
if (validation.isValid) {
onNext();
} else {
// Show toast notification for validation error
if (errors['products_general']) {
setValidationErrorMessage(errors['products_general']);
// Only show toast for product count error if there are no field errors
if (!validation.hasFieldErrors && validation.errors['products_general']) {
setValidationErrorMessage(validation.errors['products_general']);
setShowValidationErrorToast(true);
}
// Scroll to first error
const firstErrorKey = Object.keys(errors)[0];
const firstErrorKey = Object.keys(validation.errors)[0];
if (firstErrorKey) {
const element = document.querySelector(`[data-field="${firstErrorKey}"]`);
if (element) {
@ -1871,6 +1886,18 @@ useEffect(() => {
// Create a copy of the current products array to work with
let updatedProducts = [...products];
// Clear error for this field when value is entered
const newErrors = { ...formErrors };
const fieldIndex = products.findIndex(p => p.id === id);
const errorKey = `${field}_${fieldIndex}`;
// Debug logging
if (newErrors[errorKey] && value && value !== '') {
delete newErrors[errorKey];
setFormErrors(newErrors);
}
// Format value for cost fields to treat last two digits as decimals
if (field.endsWith('Cost') && value !== '') {
// Remove all non-digit characters
@ -2095,12 +2122,29 @@ useEffect(() => {
const productIndex = products.findIndex(p => p.id === id);
if (productIndex !== -1) {
const errorKey = `${field}_${productIndex}`;
if (formErrors[errorKey] && value) {
const newErrors = { ...formErrors };
delete newErrors[errorKey];
setFormErrors(newErrors);
const newErrors = { ...formErrors };
// Check if this is a mandatory quantity or cost field
const mandatoryQuantityFields = ['janQuantity', 'febQuantity', 'marQuantity', 'aprQuantity', 'mayQuantity', 'junQuantity'];
const mandatoryCostFields = ['janCost', 'febCost', 'marCost', 'aprCost', 'mayCost', 'junCost'];
const isMandatoryQuantityOrCost = mandatoryQuantityFields.includes(field) || mandatoryCostFields.includes(field);
if (isMandatoryQuantityOrCost) {
// For mandatory quantity and cost fields, validate that value is greater than 0
if (!value || value.toString().trim() === '' || parseFloat(value) <= 0) {
newErrors[errorKey] = 'Required';
} else {
delete newErrors[errorKey];
}
} else {
// For other fields, just clear error if value exists
if (formErrors[errorKey] && value) {
delete newErrors[errorKey];
}
}
setFormErrors(newErrors);
// Real-time validation for variation reason when cost fields change
const costFields = ['octCost', 'novCost', 'decCost', 'janCost', 'febCost', 'marCost'];
if (costFields.includes(field)) {

View File

@ -491,7 +491,7 @@ const EditCompanyProfile = () => {
if (allowedAddCount === 0) {
setProductLimitMessage(`Maximum of ${MAX_TOTAL_SELECTED_PRODUCTS} products can be selected.`);
} else {
setProductLimitMessage(`You can add up to ${allowedAddCount} new product${allowedAddCount !== 1 ? 's' : ''}.`);
setProductLimitMessage(`You have reached the maximum limit`);
}
return;
}
@ -1182,7 +1182,7 @@ const EditCompanyProfile = () => {
if (newlyAddedCheckedCount >= allowedAddCount) {
return (
<p className="text-xs text-[#B91C1C] mt-1">You can add up to {allowedAddCount} new product{allowedAddCount !== 1 ? 's' : ''}.</p>
<p className="text-xs text-[#B91C1C] mt-1">You have reached the maximum limit.</p>
);
}
@ -1194,7 +1194,7 @@ const EditCompanyProfile = () => {
if (allowedAddCount < MAX_NEW_PRODUCTS_PER_ACTION) {
return (
<p className="text-xs text-[#B91C1C] mt-1">You can add up to {allowedAddCount} new product{allowedAddCount !== 1 ? 's' : ''}.</p>
<p className="text-xs text-[#B91C1C] mt-1">You have reached the maximum limit.</p>
);
}