import { bindData } from "./dynamicBinder";
function generateTextElement(el, data) {
const fontWeight = el.bold ? "bold" : el.fontWeight || "normal";
const fontStyle = el.italic ? "italic" : "normal";
const textDecoration = el.underline ? "underline" : "none";
return `
${bindData(el.text, data)}
`;
}
function generateImageElement(el, data) {
if (!el.src) return '';
return `
`;
}
function generateQRCodeElement(el, data) {
// For HTML export, we'll use a QR code API or placeholder
const qrData = encodeURIComponent(bindData(el.data, data));
const qrUrl = `https://api.qrserver.com/v1/create-qr-code/?size=${el.size}x${el.size}&data=${qrData}`;
return `
`;
}
function generateLineElement(el) {
return `
`;
}
function generateRectangleElement(el) {
return `
`;
}
function generateTableElement(el, data) {
const visibleColumns = el.columns.filter(col => col.visible);
const tableData = data?.tableData || el.sampleData || [];
let tableHtml = `
`;
// Header row
visibleColumns.forEach(col => {
tableHtml += `
|
${col.label}
|
`;
});
tableHtml += `
`;
// Data rows
if (el.showSampleData && tableData.length > 0) {
tableData.forEach(row => {
tableHtml += '';
visibleColumns.forEach(col => {
const cellValue = bindData(row[col.key] || '', data);
tableHtml += `
|
${cellValue}
|
`;
});
tableHtml += '
';
});
}
tableHtml += `
`;
return tableHtml;
}
function generateSummaryElement(el, data) {
const visibleFields = el.fields.filter(field => field.visible);
let summaryHtml = `
`;
visibleFields.forEach((field, index) => {
const yPos = index * (el.fontSize + el.spacing);
const value = bindData(`{{${field.key}}}`, data);
summaryHtml += `
${field.label}:
${value}
`;
});
summaryHtml += '
';
return summaryHtml;
}
export function generateHtml(template, data = {}) {
const elementsHtml = template.elements
.map((el) => {
switch (el.type) {
case "text":
return generateTextElement(el, data);
case "image":
return generateImageElement(el, data);
case "qrcode":
return generateQRCodeElement(el, data);
case "line":
return generateLineElement(el);
case "rectangle":
return generateRectangleElement(el);
case "table":
return generateTableElement(el, data);
case "summary":
return generateSummaryElement(el, data);
default:
return "";
}
})
.join("");
return `
Invoice
${elementsHtml}
`;
}