feat: Add id as reserved field in templates, campaigns and workflows
This commit is contained in:
@@ -275,6 +275,7 @@ export class Actions {
|
|||||||
// These are always available for template rendering
|
// These are always available for template rendering
|
||||||
const dataWithSystemVars = {
|
const dataWithSystemVars = {
|
||||||
...mergedData,
|
...mergedData,
|
||||||
|
id: contact.id,
|
||||||
email: contact.email,
|
email: contact.email,
|
||||||
data: mergedData, // Also available as nested data for {{data.fieldName}} syntax
|
data: mergedData, // Also available as nested data for {{data.fieldName}} syntax
|
||||||
unsubscribeUrl: `${DASHBOARD_URI}/unsubscribe/${contact.id}`,
|
unsubscribeUrl: `${DASHBOARD_URI}/unsubscribe/${contact.id}`,
|
||||||
|
|||||||
@@ -451,6 +451,7 @@ export class CampaignService {
|
|||||||
const contactData =
|
const contactData =
|
||||||
contact.data && typeof contact.data === 'object' && !Array.isArray(contact.data) ? contact.data : {};
|
contact.data && typeof contact.data === 'object' && !Array.isArray(contact.data) ? contact.data : {};
|
||||||
const variables = {
|
const variables = {
|
||||||
|
id: contact.id,
|
||||||
email: contact.email,
|
email: contact.email,
|
||||||
...contactData,
|
...contactData,
|
||||||
data: contactData,
|
data: contactData,
|
||||||
|
|||||||
@@ -221,7 +221,15 @@ export class ContactService {
|
|||||||
for (const [key, value] of Object.entries(data)) {
|
for (const [key, value] of Object.entries(data)) {
|
||||||
// Skip reserved system-generated fields
|
// Skip reserved system-generated fields
|
||||||
// These fields are dynamically added during template rendering and cannot be overridden
|
// These fields are dynamically added during template rendering and cannot be overridden
|
||||||
const reservedFields = ['plunk_id', 'plunk_email', 'email', 'unsubscribeUrl', 'subscribeUrl', 'manageUrl'];
|
const reservedFields = [
|
||||||
|
'plunk_id',
|
||||||
|
'plunk_email',
|
||||||
|
'id',
|
||||||
|
'email',
|
||||||
|
'unsubscribeUrl',
|
||||||
|
'subscribeUrl',
|
||||||
|
'manageUrl',
|
||||||
|
];
|
||||||
if (reservedFields.includes(key)) {
|
if (reservedFields.includes(key)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -333,6 +333,7 @@ export class EmailService {
|
|||||||
subject: email.subject,
|
subject: email.subject,
|
||||||
body: email.body,
|
body: email.body,
|
||||||
data: {
|
data: {
|
||||||
|
id: email.contact.id,
|
||||||
email: email.contact.email,
|
email: email.contact.email,
|
||||||
...contactData,
|
...contactData,
|
||||||
data: contactData,
|
data: contactData,
|
||||||
|
|||||||
@@ -545,6 +545,7 @@ export class WorkflowExecutionService {
|
|||||||
: {};
|
: {};
|
||||||
|
|
||||||
const variables = {
|
const variables = {
|
||||||
|
id: contact.id,
|
||||||
email: contact.email,
|
email: contact.email,
|
||||||
...contactData,
|
...contactData,
|
||||||
...executionContext,
|
...executionContext,
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ interface EmailEditorProps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const commonVariables = [
|
const commonVariables = [
|
||||||
|
{name: 'id', description: 'Contact ID'},
|
||||||
{name: 'email', description: 'Recipient email address'},
|
{name: 'email', description: 'Recipient email address'},
|
||||||
{name: 'unsubscribeUrl', description: 'Unsubscribe link'},
|
{name: 'unsubscribeUrl', description: 'Unsubscribe link'},
|
||||||
{name: 'subscribeUrl', description: 'Subscribe link'},
|
{name: 'subscribeUrl', description: 'Subscribe link'},
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ export const VariableMention = Mention.configure({
|
|||||||
|
|
||||||
items: ({query}) => {
|
items: ({query}) => {
|
||||||
const safeVariables = Array.isArray(availableVariables) ? availableVariables : [];
|
const safeVariables = Array.isArray(availableVariables) ? availableVariables : [];
|
||||||
const allVariables = ['email', 'unsubscribeUrl', 'subscribeUrl', 'manageUrl', 'locale', ...safeVariables];
|
const allVariables = ['id', 'email', 'unsubscribeUrl', 'subscribeUrl', 'manageUrl', 'locale', ...safeVariables];
|
||||||
const uniqueVariables = Array.from(new Set(allVariables)).filter(v => typeof v === 'string');
|
const uniqueVariables = Array.from(new Set(allVariables)).filter(v => typeof v === 'string');
|
||||||
|
|
||||||
if (!query) {
|
if (!query) {
|
||||||
|
|||||||
Reference in New Issue
Block a user