Files
docupulse/static/js/settings/email_templates.js

258 lines
11 KiB
JavaScript

// Template variables mapping
const templateVariables = {
'Account Created': {
'user.username': 'The username of the created account',
'user.email': 'The email address of the created account',
'user.company': 'The company name of the user',
'user.position': 'The position of the user in their company',
'created_at': 'The date and time when the account was created',
'site.company_name': 'The name of your company',
'site.company_website': 'Your company website URL',
'setup_link': 'The link to set up the user\'s password (expires in 24 hours)',
'created_by': 'The name of the admin who created the account'
},
'Password Reset': {
'user.username': 'The username of the account',
'user.email': 'The email address of the account',
'reset_link': 'The password reset link',
'expiry_time': 'The time when the reset link expires',
'site.company_name': 'The name of your company',
'site.company_website': 'Your company website URL'
},
'Account Deleted': {
'user.username': 'The username of the deleted account',
'user.email': 'The email address of the deleted account',
'deleted_at': 'The date and time of deletion',
'deleted_by': 'The username of the admin who deleted the account',
'site.company_name': 'The name of your company',
'site.company_website': 'Your company website URL'
},
'Account Updated': {
'user.username': 'The username of the updated account',
'user.email': 'The email address of the account',
'updated_fields': 'The fields that were updated',
'updated_at': 'The date and time of the update',
'updated_by': 'The username of who made the update',
'site.company_name': 'The name of your company',
'site.company_website': 'Your company website URL'
},
'Room Invite': {
'user.username': 'The username of the invited user',
'user.email': 'The email address of the invited user',
'room.name': 'The name of the room',
'room.description': 'The description of the room',
'inviter.username': 'The username of the user who sent the invite',
'inviter.email': 'The email address of the inviter',
'invite_link': 'The link to accept the room invite',
'site.company_name': 'The name of your company',
'site.company_website': 'Your company website URL'
},
'Room Invite Removed': {
'user.username': 'The username of the user',
'user.email': 'The email address of the user',
'room.name': 'The name of the room',
'room.description': 'The description of the room',
'remover.username': 'The username of the user who removed the invite',
'remover.email': 'The email address of the remover',
'removed_at': 'The date and time when the invite was removed',
'site.company_name': 'The name of your company',
'site.company_website': 'Your company website URL'
},
'Conversation Invite': {
'user.username': 'The username of the invited user',
'user.email': 'The email address of the invited user',
'conversation.name': 'The name of the conversation',
'conversation.description': 'The description of the conversation',
'inviter.username': 'The username of the user who sent the invite',
'inviter.email': 'The email address of the inviter',
'invite_link': 'The link to accept the conversation invite',
'site.company_name': 'The name of your company',
'site.company_website': 'Your company website URL'
},
'Conversation Invite Removed': {
'user.username': 'The username of the user',
'user.email': 'The email address of the user',
'conversation.name': 'The name of the conversation',
'conversation.description': 'The description of the conversation',
'remover.username': 'The username of the user who removed the invite',
'remover.email': 'The email address of the remover',
'removed_at': 'The date and time when the invite was removed',
'site.company_name': 'The name of your company',
'site.company_website': 'Your company website URL'
},
'Conversation Message': {
'user.username': 'The username of the recipient',
'user.email': 'The email address of the recipient',
'sender.username': 'The username of the message sender',
'sender.email': 'The email address of the sender',
'message.content': 'The content of the message',
'message.created_at': 'The date and time when the message was sent',
'conversation.name': 'The name of the conversation',
'conversation.description': 'The description of the conversation',
'message_link': 'The link to view the message',
'site.company_name': 'The name of your company',
'site.company_website': 'Your company website URL'
}
};
// Function to update available variables display
function updateAvailableVariables(templateType) {
const variables = templateVariables[templateType] || {};
const variableList = document.getElementById('variableList');
const availableVariables = document.getElementById('availableVariables');
if (Object.keys(variables).length === 0) {
availableVariables.style.display = 'none';
return;
}
let html = '<div class="row">';
for (const [variable, description] of Object.entries(variables)) {
html += `
<div class="col-md-6 mb-2">
<div class="card h-100">
<div class="card-body p-2">
<code class="text-primary">{{ '{{ ' }}${variable}{{ ' }}' }}</code>
<p class="text-muted small mb-0">${description}</p>
</div>
</div>
</div>
`;
}
html += '</div>';
variableList.innerHTML = html;
availableVariables.style.display = 'block';
}
// Initialize on page load
document.addEventListener('DOMContentLoaded', function() {
// Initialize Summernote
$('#templateBody').summernote({
height: 300,
toolbar: [
['style', ['style']],
['font', ['bold', 'underline', 'italic', 'clear']],
['color', ['color']],
['para', ['ul', 'ol', 'paragraph']],
['table', ['table']],
['insert', ['link']],
['view', ['fullscreen', 'codeview', 'help']]
],
styleTags: ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'],
placeholder: 'Enter your email template content here...',
callbacks: {
onImageUpload: function(files) {
// Disable image upload for email templates
return false;
}
},
popover: {
image: [],
link: [],
air: []
}
});
// Handle template selection
$('#templateSelect').on('change', function() {
const selectedOption = this.options[this.selectedIndex];
const subject = selectedOption.dataset.subject || '';
const body = selectedOption.dataset.body || '';
const templateType = selectedOption.dataset.type || '';
// Show the template editor
$('#templateEditor').show();
// Update the form fields
$('#templateSubject').val(subject);
$('#templateBody').summernote('code', body);
updateAvailableVariables(templateType);
});
// Check for initially selected template
const templateSelect = document.getElementById('templateSelect');
if (templateSelect.value) {
const selectedOption = templateSelect.options[templateSelect.selectedIndex];
const templateType = selectedOption.dataset.type || '';
updateAvailableVariables(templateType);
// Show the template editor if a template is initially selected
$('#templateEditor').show();
}
// Handle template save
$('#templateForm').on('submit', function(event) {
event.preventDefault();
const templateId = $('#templateSelect').val();
const subject = $('#templateSubject').val();
const body = $('#templateBody').summernote('code');
if (!templateId) {
alert('Please select a template first');
return;
}
// Show loading state
const saveButton = this.querySelector('button[type="submit"]');
const originalText = saveButton.innerHTML;
saveButton.disabled = true;
saveButton.innerHTML = '<i class="fas fa-spinner fa-spin me-2"></i>Saving...';
// Get CSRF token from meta tag
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;
// Send AJAX request
fetch(`/settings/email-templates/${templateId}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'X-CSRF-Token': csrfToken,
'X-Requested-With': 'XMLHttpRequest'
},
body: JSON.stringify({
subject: subject,
body: body
})
})
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
})
.then(data => {
if (data.error) {
throw new Error(data.error);
}
// Show success message
const alert = document.createElement('div');
alert.className = 'alert alert-success alert-dismissible fade show mt-3';
alert.innerHTML = `
<i class="fas fa-check-circle me-2"></i>Template saved successfully
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
`;
document.querySelector('.card-body').appendChild(alert);
// Update the select option's data attributes
const option = document.getElementById('templateSelect').options[document.getElementById('templateSelect').selectedIndex];
option.dataset.subject = subject;
option.dataset.body = body;
})
.catch(error => {
// Show error message
const alert = document.createElement('div');
alert.className = 'alert alert-danger alert-dismissible fade show mt-3';
alert.innerHTML = `
<i class="fas fa-exclamation-circle me-2"></i>${error.message || 'Failed to save template'}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
`;
document.querySelector('.card-body').appendChild(alert);
})
.finally(() => {
// Restore button state
saveButton.disabled = false;
saveButton.innerHTML = originalText;
});
});
});