bulk export
This commit is contained in:
parent
3bab4e4c56
commit
a06863562c
1 changed files with 110 additions and 2 deletions
|
|
@ -218,6 +218,105 @@ const AdminProductsPage = () => {
|
|||
XLSX.writeFile(workbook, 'products_upload_template.xlsx');
|
||||
};
|
||||
|
||||
// Handle export all products
|
||||
const handleExportAllProducts = () => {
|
||||
if (!products || products.length === 0) {
|
||||
// Show notification if no products to export
|
||||
alert("No products to export");
|
||||
return;
|
||||
}
|
||||
|
||||
// Create headers (same as template, for consistency)
|
||||
const headers = [
|
||||
'name',
|
||||
'description',
|
||||
'categoryName',
|
||||
'price',
|
||||
'stockQuantity',
|
||||
'weightGrams',
|
||||
'lengthCm',
|
||||
'widthCm',
|
||||
'heightCm',
|
||||
'origin',
|
||||
'age',
|
||||
'materialType',
|
||||
'color',
|
||||
'stockNotification_enabled',
|
||||
'stockNotification_email',
|
||||
'stockNotification_threshold',
|
||||
'tags'
|
||||
];
|
||||
|
||||
// Format the product data for Excel
|
||||
const formattedData = products.map(product => {
|
||||
// Extract stock notification values if they exist
|
||||
let stockNotificationEnabled = 'FALSE';
|
||||
let stockNotificationEmail = '';
|
||||
let stockNotificationThreshold = '';
|
||||
|
||||
if (product.stock_notification) {
|
||||
try {
|
||||
const notification =
|
||||
typeof product.stock_notification === 'string'
|
||||
? JSON.parse(product.stock_notification)
|
||||
: product.stock_notification;
|
||||
|
||||
stockNotificationEnabled = notification.enabled ? 'TRUE' : 'FALSE';
|
||||
stockNotificationEmail = notification.email || '';
|
||||
stockNotificationThreshold = notification.threshold || '';
|
||||
} catch (e) {
|
||||
console.error('Error parsing stock notification:', e);
|
||||
}
|
||||
}
|
||||
|
||||
// Convert tags array to comma-separated string if it exists
|
||||
const tagsString = Array.isArray(product.tags)
|
||||
? product.tags.join(',')
|
||||
: (product.tags || '');
|
||||
|
||||
// Return array in the same order as headers
|
||||
return [
|
||||
product.name || '',
|
||||
product.description || '',
|
||||
product.category_name || '',
|
||||
product.price || '',
|
||||
product.stock_quantity || '',
|
||||
product.weight_grams || '',
|
||||
product.length_cm || '',
|
||||
product.width_cm || '',
|
||||
product.height_cm || '',
|
||||
product.origin || '',
|
||||
product.age || '',
|
||||
product.material_type || '',
|
||||
product.color || '',
|
||||
stockNotificationEnabled,
|
||||
stockNotificationEmail,
|
||||
stockNotificationThreshold,
|
||||
tagsString
|
||||
];
|
||||
});
|
||||
|
||||
// Add headers as first row
|
||||
const data = [headers, ...formattedData];
|
||||
|
||||
// Create Excel workbook and add the data
|
||||
const worksheet = XLSX.utils.aoa_to_sheet(data);
|
||||
const workbook = XLSX.utils.book_new();
|
||||
XLSX.utils.book_append_sheet(workbook, worksheet, 'Products');
|
||||
|
||||
// Add column widths for better readability
|
||||
const colWidths = [];
|
||||
headers.forEach(() => colWidths.push({ wch: 15 }));
|
||||
worksheet['!cols'] = colWidths;
|
||||
|
||||
// Generate filename with current date
|
||||
const date = new Date().toISOString().split('T')[0]; // YYYY-MM-DD format
|
||||
const filename = `products_export_${date}.xlsx`;
|
||||
|
||||
// Write Excel file and trigger download
|
||||
XLSX.writeFile(workbook, filename);
|
||||
};
|
||||
|
||||
// Handle open upload dialog
|
||||
const handleOpenUploadDialog = () => {
|
||||
resetUploadState();
|
||||
|
|
@ -434,7 +533,16 @@ const AdminProductsPage = () => {
|
|||
Download Template
|
||||
</Button>
|
||||
</Tooltip>
|
||||
|
||||
<Tooltip title="Export all current products to Excel">
|
||||
<Button
|
||||
variant="outlined"
|
||||
color="primary"
|
||||
startIcon={<DownloadIcon />}
|
||||
onClick={handleExportAllProducts}
|
||||
>
|
||||
Export All Products
|
||||
</Button>
|
||||
</Tooltip>
|
||||
<Tooltip title="Upload products in bulk from a CSV or Excel file">
|
||||
<Button
|
||||
variant="outlined"
|
||||
|
|
@ -442,7 +550,7 @@ const AdminProductsPage = () => {
|
|||
startIcon={<UploadIcon />}
|
||||
onClick={handleOpenUploadDialog}
|
||||
>
|
||||
Upload Bulk Assets
|
||||
Upload Bulk Products
|
||||
</Button>
|
||||
</Tooltip>
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue