Update product import output json

This commit is contained in:
2025-09-23 11:46:46 -04:00
parent 2fe7fd5b2f
commit 24aee1db90

View File

@@ -8,6 +8,7 @@ import { motion } from "framer-motion";
import { useQuery } from "@tanstack/react-query";
import config from "@/config";
import { Loader2 } from "lucide-react";
import type { DataValue, FieldType, Result } from "@/components/product-import/types";
// Define base fields without dynamic options
const BASE_IMPORT_FIELDS = [
{
@@ -343,7 +344,11 @@ const BASE_IMPORT_FIELDS = [
export function Import() {
const [isOpen, setIsOpen] = useState(false);
const [importedData, setImportedData] = useState<any[] | null>(null);
type ImportFieldKey = (typeof BASE_IMPORT_FIELDS)[number]["key"];
type NormalizedProduct = Record<ImportFieldKey | "product_images", string | string[] | boolean | null>;
type ImportResult = Result<string> & { all?: Result<string>["validData"] };
const [importedData, setImportedData] = useState<NormalizedProduct[] | null>(null);
const [selectedCompany, setSelectedCompany] = useState<string | null>(null);
const [selectedLine, setSelectedLine] = useState<string | null>(null);
const [startFromScratch, setStartFromScratch] = useState(false);
@@ -390,7 +395,6 @@ export function Import() {
// Handle field value changes
const handleFieldChange = (field: string, value: any) => {
console.log('Field change:', field, value);
if (field === "company") {
setSelectedCompany(value);
setSelectedLine(null); // Reset line when company changes
@@ -412,7 +416,6 @@ export function Import() {
options: fieldOptions.companies || [],
},
onChange: (value: string) => {
console.log('Company selected:', value);
handleFieldChange("company", value);
},
};
@@ -424,7 +427,6 @@ export function Import() {
options: productLines || [],
},
onChange: (value: string) => {
console.log('Line selected:', value);
handleFieldChange("line", value);
},
disabled: !selectedCompany,
@@ -507,11 +509,76 @@ export function Import() {
}
});
const handleData = async (data: any, file: File) => {
const getDefaultValue = (fieldType: FieldType): string | string[] | boolean | null => {
switch (fieldType.type) {
case "multi-select":
case "multi-input":
return [];
case "checkbox":
return false;
default:
return null;
}
};
const normalizeValue = (value: DataValue, fieldType: FieldType): string | string[] | boolean | null => {
if (value === undefined || value === null || value === "") {
return getDefaultValue(fieldType);
}
if (fieldType.type === "multi-select" || fieldType.type === "multi-input") {
if (Array.isArray(value)) {
return value.length ? value : [];
}
if (typeof value === "string") {
const separator = fieldType.separator ?? ",";
return value
.split(separator)
.map((part) => part.trim())
.filter(Boolean);
}
return [];
}
if (Array.isArray(value)) {
return value.length ? value : [];
}
if (typeof value === "boolean") {
return value;
}
return String(value);
};
const handleData = async (data: ImportResult, _file: File) => {
try {
console.log("Imported Data:", data);
console.log("File:", file);
setImportedData(data);
const rows = (data.all?.length ? data.all : data.validData) ?? [];
const formattedRows: NormalizedProduct[] = rows.map((row) => {
const baseValues = importFields.reduce((acc, field) => {
const rawRow = row as Record<string, DataValue>;
acc[field.key as ImportFieldKey] = normalizeValue(rawRow[field.key], field.fieldType);
return acc;
}, {} as Record<ImportFieldKey, string | string[] | boolean | null>);
const rawProductImages = (row as Record<string, unknown>).product_images;
let normalizedProductImages: string | string[] | boolean | null = null;
if (Array.isArray(rawProductImages)) {
normalizedProductImages = rawProductImages;
} else if (typeof rawProductImages === "string" && rawProductImages.trim().length > 0) {
normalizedProductImages = rawProductImages;
}
return {
...baseValues,
product_images: normalizedProductImages,
} as NormalizedProduct;
});
setImportedData(formattedRows);
setIsOpen(false);
toast.success("Data imported successfully");
} catch (error) {