feature/ai-search #2

Open
mmintel wants to merge 171 commits from feature/ai-search into main
43 changed files with 147 additions and 117 deletions
Showing only changes of commit dd27f77c71 - Show all commits
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+50 -20
View File
@@ -104,46 +104,76 @@ function generateExcelForProduct(product: ProductData): Buffer {
const workbook = XLSX.utils.book_new(); const workbook = XLSX.utils.book_new();
const l = product.locale === 'de'; const l = product.locale === 'de';
// Single sheet: all cross-sections from all voltage tables combined const allRows: any[][] = [];
const hasMultipleVoltages = product.voltageTables.length > 1;
const allRows: string[][] = [];
// Build unified header row // --- 1. Product Meta Data ---
// Use columns from the first voltage table (they're the same across tables) allRows.push([product.title]);
const refTable = product.voltageTables[0]; const categoriesLine = product.categories.join(' • ');
if (!refTable) { if (categoriesLine) {
// No voltage tables — create a minimal info sheet allRows.push([l ? 'Kategorien:' : 'Categories:', categoriesLine]);
const ws = XLSX.utils.aoa_to_sheet([ }
[product.title], if (product.sku) {
[l ? 'Keine Querschnittsdaten verfügbar' : 'No cross-section data available'], allRows.push([l ? 'Artikelnummer:' : 'SKU:', product.sku]);
]); }
ws['!cols'] = [{ wch: 40 }]; allRows.push([]); // blank row
XLSX.utils.book_append_sheet(workbook, ws, product.title.substring(0, 31));
return Buffer.from(XLSX.write(workbook, { type: 'buffer', bookType: 'xlsx' })); // --- 2. Application / Description ---
if (product.description) {
allRows.push([l ? 'ANWENDUNG' : 'APPLICATION']);
allRows.push([product.description]);
allRows.push([]); // blank row
} }
// --- 3. Technical Specifications ---
if (product.technicalItems && product.technicalItems.length > 0) {
allRows.push([l ? 'TECHNISCHE DATEN' : 'TECHNICAL DATA']);
for (const item of product.technicalItems) {
const val = item.unit ? `${item.value} ${item.unit}` : item.value;
allRows.push([item.label, val]);
}
allRows.push([]); // blank row
}
// --- 4. Cross-section Configurations ---
const hasMultipleVoltages = product.voltageTables.length > 1;
if (product.voltageTables.length > 0) {
allRows.push([l ? 'KONFIGURATIONEN' : 'CONFIGURATIONS']);
const refTable = product.voltageTables[0];
const headers: string[] = [ const headers: string[] = [
l ? 'Querschnitt' : 'Cross-section', l ? 'Querschnitt' : 'Cross-section',
...(hasMultipleVoltages ? [l ? 'Spannung' : 'Voltage'] : []), ...(hasMultipleVoltages ? [l ? 'Spannung' : 'Voltage'] : []),
...refTable.columns.map(c => c.label), ...refTable.columns.map((c) => c.label),
]; ];
allRows.push(headers); allRows.push(headers);
// Merge rows from all voltage tables
for (const table of product.voltageTables) { for (const table of product.voltageTables) {
for (let rowIdx = 0; rowIdx < table.crossSections.length; rowIdx++) { for (let rowIdx = 0; rowIdx < table.crossSections.length; rowIdx++) {
const row: string[] = [ const row: string[] = [
table.crossSections[rowIdx], table.crossSections[rowIdx],
...(hasMultipleVoltages ? [table.voltageLabel] : []), ...(hasMultipleVoltages ? [table.voltageLabel] : []),
...table.columns.map(c => c.get(rowIdx) || '-'), ...table.columns.map((c) => c.get(rowIdx) || '-'),
]; ];
allRows.push(row); allRows.push(row);
} }
} }
} else {
allRows.push([l ? 'Keine Querschnittsdaten verfügbar' : 'No cross-section data available']);
}
const ws = XLSX.utils.aoa_to_sheet(allRows); const ws = XLSX.utils.aoa_to_sheet(allRows);
// Auto-width: first col wider for cross-section labels
ws['!cols'] = headers.map((_, i) => ({ wch: i === 0 ? 30 : 18 })); // Auto-width: Col 0 wide for description, headers.
ws['!cols'] = [
{ wch: 45 },
{ wch: 20 },
{ wch: 15 },
{ wch: 15 },
{ wch: 15 },
{ wch: 15 },
{ wch: 15 },
{ wch: 15 },
];
const sheetName = product.title.substring(0, 31); const sheetName = product.title.substring(0, 31);
XLSX.utils.book_append_sheet(workbook, ws, sheetName); XLSX.utils.book_append_sheet(workbook, ws, sheetName);