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 => `| ${escapeHtml(c.label)} | `).join('')}
${rows.map(row => `${columns.map(c => `| ${escapeHtml(getPath(row, c.key))} | `).join('')}
`).join('')}
`
+ return `${columns.map(c => `| ${escapeHtml(c.label)} | `).join('')}
${rows.map(row => `${columns.map(c => `| ${escapeHtml(getPath(row, c.key ?? c.path))} | `).join('')}
`).join('')}
`
}
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, />Packing)
+ assert.match(html, />6\.7 TPH)
+ assert.doesNotMatch(html, /\[object Object\]/)
+})