diff --git a/server/templateEngine.js b/server/templateEngine.js index 5fdab3b..fc7c9e4 100644 --- a/server/templateEngine.js +++ b/server/templateEngine.js @@ -177,7 +177,7 @@ function renderTable(block, data, theme) { const allowBreak = block?.style?.allowPageBreak === true const compact = theme.reportDensity === 'compact' || block?.style?.compact === true const classes = ['table-wrap', allowBreak ? 'allow-break' : '', compact ? 'compact-table' : ''].filter(Boolean).join(' ') - return `
${columns.map(c => ``).join('')}${rows.map(row => `${columns.map(c => ``).join('')}`).join('')}
${escapeHtml(c.label)}
${escapeHtml(getPath(row, c.key))}
` + return `
${columns.map(c => ``).join('')}${rows.map(row => `${columns.map(c => ``).join('')}`).join('')}
${escapeHtml(c.label)}
${escapeHtml(getPath(row, c.key ?? c.path))}
` } function blockHtml(block, data, theme) { @@ -259,7 +259,7 @@ function emailTable(block, data, theme) { const cellStyle = `padding:${cellPadding}px;border-bottom:1px solid ${theme.borderColor};color:${theme.textColor};text-align:left;vertical-align:top;` return ` ${columns.map(column => `${escapeHtml(column.label)}`).join('')} - ${rows.map(row => `${columns.map(column => `${escapeHtml(getPath(row, column.key))}`).join('')}`).join('')} + ${rows.map(row => `${columns.map(column => `${escapeHtml(getPath(row, column.key ?? column.path))}`).join('')}`).join('')} ` } @@ -337,7 +337,7 @@ function emailBlockText(block, data) { const columns = Array.isArray(p.columns) ? p.columns : [] if (!Array.isArray(rows) || !columns.length) return '' const header = columns.map(column => textValue(column.label)).join(' | ') - const body = rows.map(row => columns.map(column => textValue(getPath(row, column.key))).join(' | ')).join('\n') + const body = rows.map(row => columns.map(column => textValue(getPath(row, column.key ?? column.path))).join(' | ')).join('\n') return [header, body].filter(Boolean).join('\n') } case 'spacer': diff --git a/server/templateEngine.test.js b/server/templateEngine.test.js index 0c181f8..5935288 100644 --- a/server/templateEngine.test.js +++ b/server/templateEngine.test.js @@ -285,3 +285,24 @@ test('email spacer renders safely', () => { }, {}) assert.match(html, /height:32px/) }) + + +test('tables accept path as well as key for column bindings', () => { + const template = { + blocks: [{ + type: 'table', + props: { + rowsPath: 'areas', + columns: [ + { label: 'Area', path: 'area' }, + { label: 'Actual', path: 'actual' } + ] + } + }] + } + const data = { areas: [{ area: 'Packing', actual: '6.7 TPH' }] } + const html = renderReportHtml(template, data) + assert.match(html, />Packing6\.7 TPH