Browse Source

feat: show nested tables primary value in notification email

Signed-off-by: Pranav C <pranavxc@gmail.com>
pull/645/head
Pranav C 3 years ago
parent
commit
d0d743008a
  1. 123
      packages/nocodb/src/lib/noco/common/BaseModel.ts
  2. 11
      packages/nocodb/src/lib/noco/common/formSubmissionEmailTemplate.ts

123
packages/nocodb/src/lib/noco/common/BaseModel.ts

@ -98,35 +98,10 @@ class BaseModel<T extends BaseApiBuilder<any>> extends BaseModelSql {
.filter(a => a[1])
.map(a => a[0]);
if (emails?.length) {
const transformedData = data;
for (const col of this.columns) {
if (col.uidt === 'Attachment') {
if (typeof transformedData[col._cn] === 'string') {
transformedData[col._cn] = JSON.parse(transformedData[col._cn]);
}
transformedData[col._cn] = (transformedData[col._cn] || [])
.map(attachment => {
if (
[
'jpeg',
'gif',
'png',
'apng',
'svg',
'bmp',
'ico',
'jpg'
].includes(attachment.title.split('.').pop())
) {
return `<a href="${attachment.url}" target="_blank"><img height="50px" src="${attachment.url}"/></a>`;
}
return `<a href="${attachment.url}" target="_blank">${attachment.title}</a>`;
})
.join('&nbsp;');
} else if (typeof transformedData[col._cn] === 'object') {
transformedData[col._cn] = JSON.stringify(transformedData[col._cn]);
}
}
const transformedData = this._transformSubmittedFormDataForEmail(
data,
formView
);
// todo: notification template
this.emailAdapter?.mailSend({
to: emails.join(','),
@ -225,6 +200,96 @@ class BaseModel<T extends BaseApiBuilder<any>> extends BaseModelSql {
}
}
private _transformSubmittedFormDataForEmail(data, formView) {
const transformedData = { ...data };
for (const col of this.columns) {
if (!formView.query_params?.showFields?.[col._cn]) {
delete transformedData[col._cn];
continue;
}
if (col.uidt === 'Attachment') {
if (typeof transformedData[col._cn] === 'string') {
transformedData[col._cn] = JSON.parse(transformedData[col._cn]);
}
transformedData[col._cn] = (transformedData[col._cn] || [])
.map(attachment => {
if (
[
'jpeg',
'gif',
'png',
'apng',
'svg',
'bmp',
'ico',
'jpg'
].includes(attachment.title.split('.').pop())
) {
return `<a href="${attachment.url}" target="_blank"><img height="50px" src="${attachment.url}"/></a>`;
}
return `<a href="${attachment.url}" target="_blank">${attachment.title}</a>`;
})
.join('&nbsp;');
} else if (
transformedData[col._cn] &&
typeof transformedData[col._cn] === 'object'
) {
transformedData[col._cn] = JSON.stringify(transformedData[col._cn]);
}
}
for (const virtual of this.virtualColumns) {
const hidden = !formView.query_params?.showFields?.[virtual._cn];
if (virtual.bt) {
const prop = `${virtual.bt._rtn}Read`;
if (hidden) {
delete transformedData[prop];
} else {
transformedData[prop] =
transformedData?.[prop]?.[
this.builder
.getMeta(virtual.bt.rtn)
?.columns?.find(c => c.pv)?._cn
];
}
} else if (virtual.hm) {
const prop = `${virtual.hm._tn}List`;
if (hidden) {
delete transformedData[prop];
} else {
transformedData[prop] = transformedData?.[prop]
?.map(
r =>
r[
this.builder.getMeta(virtual.hm.tn)?.columns?.find(c => c.pv)
?._cn
]
)
.join(', ');
}
} else if (virtual.mm) {
const prop = `${virtual.mm._rtn}MMList`;
if (hidden) {
delete transformedData[prop];
} else {
transformedData[prop] = transformedData?.[prop]
?.map(
r =>
r[
this.builder.getMeta(virtual.mm.tn)?.columns?.find(c => c.pv)
?._cn
]
)
.join(', ');
}
}
}
return transformedData;
}
private async handleHttpWebHook(apiMeta, apiReq, data) {
try {
const req = this.axiosRequestMake(apiMeta, apiReq, data);

11
packages/nocodb/src/lib/noco/common/formSubmissionEmailTemplate.ts

@ -129,7 +129,7 @@ export default `<!doctype html>
<tr>
<td style="font-family: sans-serif; font-size: 14px;padding: 20px 5px 10px 5px; " colspan="2">
<a href="https://www.nocodb.com/" target="_blank">
<a href="https://github.com/nocodb/nocodb" target="_blank">
<img src="https://www.nocodb.com/brand/x1.png" alt="NocoDB" width="70" style=" vertical-align: middle"> <h2 style="margin-left: 10px;display: inline-block">NocoDB</h2>
</a>
</td>
@ -140,7 +140,9 @@ export default `<!doctype html>
</td>
</tr>
<% Object.keys(data).forEach(function(prop) { %>
<% Object.keys(data).forEach(function(prop) {
if(data[prop] !== null && data[prop] !== undefined && data[prop] !== ''){
%>
<tr>
<td style="font-family: sans-serif; font-size: 14px; vertical-align: top;padding: 20px 5px 20px 5px;text-transform: capitalize "
valign="top">
@ -151,7 +153,8 @@ export default `<!doctype html>
<%- data[prop] %>
</td>
</tr>
<% }); %>
<% }
}); %>
</table>
</td>
</tr>
@ -178,7 +181,7 @@ export default `<!doctype html>
<td class="content-block powered-by"
style="font-family: sans-serif; vertical-align: top; padding-bottom: 10px; padding-top: 10px; color: #999999; font-size: 12px; text-align: center;"
valign="top" align="center">
<a href="http://nocodb.com/">NocoDB</a>
<a href="https://github.com/nocodb/nocodb">NocoDB</a>
<!-- Powered by <a href="http://htmlemail.io">HTMLemail</a>.-->
</td>
</tr>

Loading…
Cancel
Save