client side bug fixed

This commit is contained in:
Malini 2025-11-19 17:46:49 +05:30
parent 2aa572ad1f
commit d3f55c830f
2 changed files with 69 additions and 221 deletions

View File

@ -2668,238 +2668,80 @@ const CompanyProfile = () => {
return profiles[deletingRow];
}, [deletingRow, profiles]);
// Enhanced Import Function with Validation
const handleImport = async () => {
if (!file) {
const errorMsg = "Please select a CSV file to import.";
setImportError(errorMsg);
const handleImport = async () => {
if (!file) {
const msg = "Please select a CSV file to import.";
setImportError(msg);
setToastData({ message: msg, type: "error" });
return;
}
setImportLoading(true);
setImportError("");
try {
await validateFile(file);
const formData = new FormData();
formData.append("file", file);
const response = await uploadCompanyProfileCSV(formData);
const { status, message, errors } = response || {};
// Convert backend error object readable string
const formattedErrors = errors
?.map((e) => `Row ${e.row}: ${e.error}`)
.join(", ");
// FAILED
if (status === false) {
const finalError =
formattedErrors || message || "Upload failed due to server error.";
setImportError(finalError);
setToastData({
message: errorMsg,
message: finalError,
type: "error",
});
throw new Error(errorMsg);
return;
}
try {
setImportLoading(true);
setImportError("");
// SUCCESS
setToastData({
message: message || "File uploaded successfully!",
type: "success",
});
// Re-validate file before upload
await validateFile(file);
// window.location.reload();
} catch (error) {
console.error("Upload error:", error);
const formData = new FormData();
formData.append("file", file);
const backend = error?.response?.data;
console.log('FormData entries before upload:');
for (let pair of formData.entries()) {
console.log(pair[0] + ': ', pair[1]);
}
const formattedErrors = backend?.errors
?.map((e) => `Row ${e.row}: ${e.error}`)
.join(", ");
let response;
let successMessage = "Company profiles imported successfully!";
const errorMessage =
formattedErrors ||
backend?.message ||
backend?.error ||
error?.message ||
"Upload failed. Please try again.";
try {
console.log('Attempting first upload...');
response = await uploadCompanyProfileCSV(formData);
successMessage = response.message || successMessage;
} catch (firstError) {
console.log('First upload attempt failed, trying alternative:', firstError);
try {
console.log('Attempting alternative upload...');
response = await uploadCompanyProfileCSVAlternative(formData);
successMessage = response.message || successMessage;
} catch (secondError) {
console.log('Alternative upload also failed:', secondError);
let detailedErrorMessage = "Upload failed. Please try again.";
let validationErrorCount = 1; // Default count
// Extract validation error count from response if available
if (secondError.response?.data) {
const responseData = secondError.response.data;
// Try to extract validation error count from different response structures
if (responseData.validation_errors) {
validationErrorCount = responseData.validation_errors.length || 1;
} else if (responseData.errors) {
validationErrorCount = responseData.errors.length || 1;
} else if (responseData.details && Array.isArray(responseData.details)) {
validationErrorCount = responseData.details.length || 1;
} else if (typeof responseData === 'string') {
// Try to extract count from error message
const countMatch = responseData.match(/(\d+)\s*validation errors?/i);
if (countMatch) {
validationErrorCount = parseInt(countMatch[1]) || 1;
}
}
}
if (secondError.response?.data?.message) {
detailedErrorMessage = secondError.response.data.message;
} else if (secondError.message) {
if (secondError.message.includes("Request failed with status code")) {
if (secondError.response?.data) {
const responseData = secondError.response.data;
if (typeof responseData === 'string' && responseData.includes("Duplicate Establishment IDs")) {
detailedErrorMessage = responseData;
} else if (responseData.error) {
detailedErrorMessage = responseData.error;
} else if (responseData.details) {
detailedErrorMessage = responseData.details;
} else {
detailedErrorMessage = "Data already exists in the system. Please remove or update the duplicate entries and try again.";
}
} else {
detailedErrorMessage = "Server error occurred during upload. Please try again.";
}
} else {
detailedErrorMessage = secondError.message;
}
}
setImportError(errorMessage);
setToastData({
message: errorMessage,
type: "error",
});
} finally {
setImportLoading(false);
}
};
// Enhanced validation error detection with dynamic count
if (detailedErrorMessage.includes("No file uploaded") ||
detailedErrorMessage.includes("No file found")) {
detailedErrorMessage = "Please select a valid CSV file to upload.";
} else if (detailedErrorMessage.includes("token") ||
detailedErrorMessage.includes("auth") ||
detailedErrorMessage.includes("Authentication")) {
detailedErrorMessage = "Authentication failed. Please check your login credentials.";
} else if (detailedErrorMessage.includes("400") ||
detailedErrorMessage.includes("Bad Request")) {
detailedErrorMessage = "Invalid file format or missing required data. Please check your CSV file.";
} else if (detailedErrorMessage.includes("Duplicate Establishment IDs") ||
detailedErrorMessage.includes("duplicate") ||
detailedErrorMessage.includes("already exist")) {
detailedErrorMessage = "Duplicate Establishment IDs found (in file or already exist in system). Resolve and re-upload.";
} else if (detailedErrorMessage.includes("validation error") ||
detailedErrorMessage.includes("validation errors") ||
detailedErrorMessage.includes("No establishments imported") ||
detailedErrorMessage.includes("HS Codes do not exist") ||
detailedErrorMessage.includes("HS Code")) {
// Format validation error with dynamic count and HS code message
detailedErrorMessage = `Import failed. ${validationErrorCount} HS Codes in your file do not exist in the Product Master. Please use the correct HS Code and try again.`;
}
throw new Error(detailedErrorMessage);
}
}
// Check if the response indicates validation errors
if (response && (response.message?.includes("validation error") ||
response.message?.includes("validation errors") ||
response.message?.includes("No establishments imported") ||
response.message?.includes("HS Codes do not exist") ||
response.message?.includes("HS Code"))) {
let validationErrorCount = 1;
// Extract count from response if available
if (response.validation_errors) {
validationErrorCount = response.validation_errors.length || 1;
} else if (response.errors) {
validationErrorCount = response.errors.length || 1;
}
const validationErrorMessage = `Import failed. ${validationErrorCount} HS Codes in your file do not exist in the Product Master. Please use the correct HS Code and try again.`;
// Show validation error in red
setImportError(validationErrorMessage);
setToastData({
message: validationErrorMessage,
type: "error",
});
throw new Error(validationErrorMessage);
}
// Show success message
setToastData({
message: successMessage,
type: "success",
});
closeImportModal();
setImportLoading(true); // Show loader while refreshing data
try {
// Refresh the data
const res = await fetchEstablishments();
const payload = res?.data ?? res;
const records = Array.isArray(payload?.data)
? payload.data
: Array.isArray(payload)
? payload
: [];
setProfiles(records.map(mapApiEstablishmentToProfile));
setTotalItems(records.length);
// Refresh the page immediately
window.location.reload();
} catch (refreshErr) {
console.log("Error refreshing data:", refreshErr);
} finally {
setIsLoading(false);
}
return response;
} catch (error) {
console.error("Error importing CSV:", error);
let errorMessage = error.message || "Upload failed. Please try again.";
if (errorMessage.includes("Request failed with status code")) {
const parts = errorMessage.split("Request failed with status code");
if (parts.length > 1) {
const actualError = parts[1].replace(/^\d+\s*/, '').trim();
if (actualError && actualError.length > 0) {
errorMessage = actualError;
} else {
errorMessage = "Server error occurred. Please try again.";
}
}
}
// Enhanced error message handling for validation errors with dynamic count
if (errorMessage.includes("expired") || errorMessage.includes("Authentication")) {
errorMessage = "Authentication failed. Please check your login credentials.";
}
if (errorMessage.includes("Duplicate Establishment IDs") ||
errorMessage.includes("duplicate") ||
errorMessage.includes("already exist")) {
errorMessage = "Duplicate Establishment IDs found (in file or already exist in system). Resolve and re-upload.";
}
if (errorMessage.includes("validation error") ||
errorMessage.includes("validation errors") ||
errorMessage.includes("No establishments imported") ||
errorMessage.includes("HS Codes do not exist") ||
errorMessage.includes("HS Code")) {
let validationErrorCount = 1;
// Try to extract count from existing error message
const countMatch = errorMessage.match(/(\d+)\s*validation errors?/i);
if (countMatch) {
validationErrorCount = parseInt(countMatch[1]) || 1;
}
errorMessage = `Import failed. ${validationErrorCount} HS Code${validationErrorCount > 1 ? "s" : ""} in your file ${validationErrorCount > 1 ? "do" : "does"} not exist in the Product Master. Please use the correct HS Code${validationErrorCount > 1 ? "s" : ""} and try again.`;
}
setImportError(errorMessage);
setToastData({
message: errorMessage,
type: "error",
});
throw error;
} finally {
setImportLoading(false);
}
};
return (
<div className="bg-white w-full rounded-lg shadow-sm ring-1 ring-[#E5E7EB]">

View File

@ -1367,10 +1367,16 @@ const IsicHsCodes = () => {
</label>
<input
type="text"
inputMode="numeric"
pattern="[0-9]*"
value={form.code}
onChange={handleFormChange("code")}
onChange={(e) => {
// Only allow numbers
const value = e.target.value.replace(/\D/g, '');
handleFormChange("code")({ target: { value } });
}}
disabled={modalMode === "view"}
className="w-full px-3 py-2 text-sm border border-[#CBA344] rounded-md focus:outline-none focus:ring-1 focus:ring-[#92722A] focus:border-[#92722A]"
className="w-full px-3 py-2 text-sm border border-[#CBA344] rounded-md focus:outline-none focus:ring-1 focus:ring-[#92722A] focus:border-[#92722A] [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none"
placeholder="Enter HS Code"
/>
</div>