Add email template image header edition

This commit is contained in:
Ivan Diaz 2018-11-14 22:53:46 -03:00
parent 614b5a1a67
commit 8654433702
30 changed files with 129 additions and 34 deletions

View File

@ -1,5 +1,6 @@
import React from 'react';
import _ from 'lodash';
import {connect} from 'react-redux';
import i18n from 'lib-app/i18n';
import API from 'lib-app/api-call';
@ -18,6 +19,8 @@ import SubmitButton from 'core-components/submit-button';
class AdminPanelEmailTemplates extends React.Component {
state = {
headerImage: '',
loadingHeaderImage: false,
loadingList: true,
loadingTemplate: false,
templates: [],
@ -36,6 +39,7 @@ class AdminPanelEmailTemplates extends React.Component {
componentDidMount() {
this.retrieveMailTemplateList();
this.retrieveHeaderImage();
}
render() {
@ -49,11 +53,19 @@ class AdminPanelEmailTemplates extends React.Component {
renderContent() {
return (
<div className="row">
<div className="col-md-3">
<Listing {...this.getListingProps()}/>
<div>
<div className="row">
<div className="col-md-3">
<Listing {...this.getListingProps()}/>
</div>
{(this.state.selectedIndex != -1) ? this.renderForm() : null}
</div>
{(this.state.selectedIndex != -1) ? this.renderForm() : null}
<Form values={{headerImage: this.state.headerImage}} onChange={form => this.setState({headerImage: form.headerImage})} onSubmit={this.onHeaderImageSubmit.bind(this)}>
<div className="admin-panel-email-templates__image-container">
<FormField className="admin-panel-email-templates__image-header-url" label={i18n('IMAGE_HEADER_URL')} name="headerImage" required fieldProps={{size: 'large'}} />
<SubmitButton className="admin-panel-email-templates__image-header-submit" type="secondary" size="small">{i18n('SAVE')}</SubmitButton>
</div>
</Form>
</div>
);
}
@ -148,6 +160,21 @@ class AdminPanelEmailTemplates extends React.Component {
}
}
onHeaderImageSubmit(form) {
this.setState({
loadingHeaderImage: true,
});
API.call({
path: '/system/edit-settings',
data: {
'mail-template-header-image': form['headerImage']
}
}).then(() => this.setState({
loadingHeaderImage: false,
}))
}
onFormSubmit(form) {
const {selectedIndex, language, templates} = this.state;
@ -169,26 +196,26 @@ class AdminPanelEmailTemplates extends React.Component {
this.setState({
loadingForm: false,
});
switch(response.message) {
case 'INVALID_SUBJECT':
this.setState({
errors: {subject: 'Invalid syntax'}
errors: {subject: i18n('INVALID_SYNTAX')}
});
break;
case 'INVALID_TEXT_1':
this.setState({
errors: {text1: 'Invalid syntax'}
errors: {text1: i18n('INVALID_SYNTAX')}
});
break;
case 'INVALID_TEXT_2':
this.setState({
errors: {text2: 'Invalid syntax'}
errors: {text2: i18n('INVALID_SYNTAX')}
});
break;
case 'INVALID_TEXT_3':
this.setState({
errors: {text3: 'Invalid syntax'}
errors: {text3: i18n('INVALID_SYNTAX')}
});
break;
}
@ -246,6 +273,15 @@ class AdminPanelEmailTemplates extends React.Component {
templates: result.data
}));
}
retrieveHeaderImage() {
API.call({
path: '/system/get-settings',
data: {allSettings: 1}
}).then(result => this.setState({
headerImage: result.data['mail-template-header-image']
}));
}
}
export default AdminPanelEmailTemplates;

View File

@ -1,3 +1,5 @@
@import "../../../../scss/vars";
.admin-panel-email-templates {
&__text-area {
@ -23,4 +25,13 @@
display: inline-block;
margin-left: 10px;
}
&__image-container {
background-color: $very-light-grey;
display: flex;
justify-content: space-between;
align-items: center;
padding: 5px 20px;
margin-top: 20px;
}
}

View File

@ -177,6 +177,7 @@ export default {
'HOME': 'Inicio',
'TICKET_NUMBER': 'Número do chamado',
'NEXT': 'Próximo',
'SUBJECT': 'Sujeito',
'SEND_EMAIL_ON_NEW_TICKET': 'Enviar email para cada novo ticket',
'STAFF_UPDATED': 'Membro da equipe atualizado',
'UPDATE': 'Atualizar',
@ -187,6 +188,7 @@ export default {
'PRIVATE': 'privado',
'ENABLE_USER': 'Ativar usuário',
'DISABLE_USER': 'Desativar usuário',
'IMAGE_HEADER_URL': 'URL do cabeçalho da imagem',
'CHART_CREATE_TICKET': 'Chamados criados',
'CHART_CLOSE': 'Chamados fechados',
@ -332,6 +334,7 @@ export default {
'ERRORS_FOUND': 'Erros encontrados',
'ERROR_IMAGE_SIZE': 'Nenhuma imagem pode ter um tamanho maior que {size} MB',
'USER_DISABLED': 'Esta conta está desativada.',
'INVALID_SYNTAX': 'Sintaxe inválida.',
//MESSAGES
'SIGNUP_SUCCESS': 'Você se registrou com sucesso em nosso sistema de suporte.',

View File

@ -177,6 +177,7 @@ export default {
'HOME': '家',
'TICKET_NUMBER': '票號',
'NEXT': '下一個',
'SUBJECT': '学科',
'SEND_EMAIL_ON_NEW_TICKET': '电子邮件为每个新票',
'STAFF_UPDATED': '工作人员已更新',
'UPDATE': '更新',
@ -187,6 +188,7 @@ export default {
'PRIVATE': '私人的',
'ENABLE_USER': '启用用户',
'DISABLE_USER': '禁用用户',
'IMAGE_HEADER_URL': '图片标题网址',
'CHART_CREATE_TICKET': '已創建門票',
'CHART_CLOSE': '門票已關閉',
@ -332,6 +334,7 @@ export default {
'ERRORS_FOUND': '發現錯誤',
'ERROR_IMAGE_SIZE': '没有图像的大小可以超过{size}MB',
'USER_DISABLED': '此帐户已被停用。',
'INVALID_SYNTAX': '无效的语法。',
//MESSAGES
'SIGNUP_SUCCESS': '您已在我們的支持系統中成功註冊',

View File

@ -177,6 +177,7 @@ export default {
'HOME': 'Home',
'TICKET_NUMBER': 'Ticketnummer',
'NEXT': 'Nächstes',
'SUBJECT': 'Gegenstand',
'SEND_EMAIL_ON_NEW_TICKET': 'E-Mail für jedes neues Ticket',
'STAFF_UPDATED': 'Mitarbeiter wurde aktualisiert',
'UPDATE': 'Aktualisierung',
@ -187,6 +188,7 @@ export default {
'PRIVATE': 'Privatgelände',
'ENABLE_USER': 'Benutzer aktivieren',
'DISABLE_USER': 'Benutzer deaktivieren',
'IMAGE_HEADER_URL': 'URL des Image-Headers',
'CHART_CREATE_TICKET': 'Tickets erstellt',
'CHART_CLOSE': 'Tickets geschlossen',
@ -332,6 +334,7 @@ export default {
'ERRORS_FOUND': 'Fehler gefunden!',
'ERROR_IMAGE_SIZE': 'Kein Bild darf größer als {size} MB sein',
'USER_DISABLED': 'Dieser Account ist deaktiviert.',
'INVALID_SYNTAX': 'Ungültiger Satzbau.',
//MESSAGES
'SIGNUP_SUCCESS': 'Sie haben sich erfolgreich in unserem Support-System registriert.',

View File

@ -177,6 +177,7 @@ export default {
'HOME': 'Home',
'TICKET_NUMBER': 'Ticket number',
'NEXT': 'Next',
'SUBJECT': 'Subject',
'SEND_EMAIL_ON_NEW_TICKET': 'Send email on new ticket',
'STAFF_UPDATED': 'Staff member has been updated',
'UPDATE': 'Update',
@ -187,6 +188,7 @@ export default {
'PRIVATE': 'Private',
'ENABLE_USER': 'Enable User',
'DISABLE_USER': 'Disable User',
'IMAGE_HEADER_URL': 'Image header URL',
'CHART_CREATE_TICKET': 'Tickets created',
'CHART_CLOSE': 'Tickets closed',
@ -332,6 +334,7 @@ export default {
'ERRORS_FOUND': 'Errors found',
'ERROR_IMAGE_SIZE': 'No image can have a size greater than {size} MB',
'USER_DISABLED': 'This account is disabled.',
'INVALID_SYNTAX': 'Invalid syntax.',
//MESSAGES
'SIGNUP_SUCCESS': 'You have registered successfully in our support system.',

View File

@ -177,6 +177,7 @@ export default {
'HOME': 'Inicio',
'TICKET_NUMBER': 'Número de Ticket',
'NEXT': 'Siguiente',
'SUBJECT': 'Asunto',
'SEND_EMAIL_ON_NEW_TICKET': 'Enviar email por cada nuevo ticket',
'STAFF_UPDATED': 'Miembro de Staff actualizado',
'UPDATE': 'Actualizar',
@ -187,6 +188,7 @@ export default {
'PRIVATE': 'privado',
'ENABLE_USER': 'Habilitar usuario',
'DISABLE_USER': 'Deshabilitar usuario',
'IMAGE_HEADER_URL': 'URL del encabezado de la imagen',
'CHART_CREATE_TICKET': 'Tickets creados',
'CHART_CLOSE': 'Tickets cerrados',
@ -330,6 +332,8 @@ export default {
'INVALID_EMAIL_OR_TICKET_NUMBER': 'Email o numero de ticket inválido',
'INVALID_FILE': 'Archivo inválido',
'ERRORS_FOUND': 'Se encontraron errores',
'USER_DISABLED': 'Esta cuenta está deshabilitada.',
'INVALID_SYNTAX': 'Sintaxis inválida.',
//MESSAGES
'SIGNUP_SUCCESS': 'Se ha registrado con éxito en nuestro sistema de soporte.',
@ -356,7 +360,6 @@ export default {
'SUCCESS_IMPORTING_CSV_DESCRIPTION': 'El archivo CSV se ha importado correctamente',
'SUCCESS_DELETING_ALL_USERS': 'Los usuarios se han eliminado correctamente',
'ERROR_IMAGE_SIZE': 'Ninguna imagen puede tener un tamaño superior a {size} MB',
'USER_DISABLED': 'Esta cuenta está deshabilitada.',
'LAST_7_DAYS': 'Últimos 7 dias',
'LAST_30_DAYS': 'Últimos 30 dias',

View File

@ -177,6 +177,7 @@ export default {
'HOME': 'Accueil',
'TICKET_NUMBER': 'Numéro de ticket',
'NEXT': 'Suivant',
'SUBJECT': 'Assujettir',
'SEND_EMAIL_ON_NEW_TICKET': 'Envoyer un e-mail pour chaque nouveau ticket',
'STAFF_UPDATED': 'Le membre du personnel a été mis à jour',
'UPDATE': 'Mettre à jour',
@ -187,6 +188,7 @@ export default {
'PRIVATE': 'privé',
'ENABLE_USER': 'Activer l\'utilisateur',
'DISABLE_USER': 'Désactiver l\'utilisateur',
'IMAGE_HEADER_URL': 'URL de l\'en-tête de l\'image',
'CHART_CREATE_TICKET': 'Tickets créés',
'CHART_CLOSE': 'Tickets fermés',
@ -332,6 +334,7 @@ export default {
'ERRORS_FOUND': 'Des erreurs sont survenues',
'ERROR_IMAGE_SIZE': 'Aucune image ne peut avoir une taille supérieure à {size} MB',
'USER_DISABLED': 'Ce compte est désactivé.',
'INVALID_SYNTAX': 'Syntaxe invalide.',
//MESSAGES
'SIGNUP_SUCCESS': 'Vous êtes inscrit avec succès dans notre système de support.',

View File

@ -177,6 +177,7 @@
'HOME': 'Σπίτι',
'TICKET_NUMBER': 'Αριθμός εισιτηρίου',
'NEXT': 'Επόμενο',
'SUBJECT': 'Θέμα',
'SEND_EMAIL_ON_NEW_TICKET': 'Στείλτε μήνυμα ηλκετορνικού ταχυδρομείου στο νέο εισιτήριο',
'STAFF_UPDATED': 'Το μέλος προσωπικού έχει ενημερωθεί',
'UPDATE': 'Ενημέρωση',
@ -187,6 +188,7 @@
'PRIVATE': 'ιδιωτικός',
'ENABLE_USER': 'Ενεργοποίηση χρήστη',
'DISABLE_USER': 'Απενεργοποίηση χρήστη',
'IMAGE_HEADER_URL': 'Διεύθυνση URL κεφαλίδας εικόνας',
'CHART_CREATE_TICKET': 'Τα εισιτήρια δημιουργήθηκαν',
'CHART_CLOSE': 'Τα εισιτήρια κλείσανε',
@ -332,6 +334,7 @@
'ERRORS_FOUND': 'Βρέθηκαν Σφάλματα',
'ERROR_IMAGE_SIZE': 'Καμία εικόνα δεν μπορεί να έχει μέγεθος μεγαλύτερο από {size} MB',
'USER_DISABLED': 'Αυτός ο λογαριασμός είναι απενεργοποιημένος.',
'INVALID_SYNTAX': 'Μη έγκυρη σύνταξη.',
//MESSAGES
'SIGNUP_SUCCESS': 'Έχετε εγγραφεί με επιτυχία στο σύστημα υποστήριξης μας.',

View File

@ -177,6 +177,7 @@ export default {
'HOME': 'घर',
'TICKET_NUMBER': 'टिकट नंबर',
'NEXT': 'आगामी',
'SUBJECT': 'विषय',
'SEND_EMAIL_ON_NEW_TICKET': 'एक ईमेल भेजने के लिए प्रत्येक नए टिकट',
'STAFF_UPDATED': 'स्टाफ सदस्य को अद्यतन किया गया है',
'UPDATE': 'अद्यतन',
@ -187,6 +188,7 @@ export default {
'PRIVATE': 'निजी',
'ENABLE_USER': 'उपयोगकर्ता सक्षम करें',
'DISABLE_USER': 'उपयोगकर्ता को अक्षम करें',
'IMAGE_HEADER_URL': 'छवि शीर्षलेख यूआरएल',
'CHART_CREATE_TICKET': 'टिकट बनाया',
'CHART_CLOSE': 'टिकट बंद कर दिया',
@ -332,6 +334,7 @@ export default {
'ERRORS_FOUND': 'त्रुटियां मिलीं',
'ERROR_IMAGE_SIZE': 'कोई छवि {size} एमबी से अधिक आकार नहीं हो सकती है',
'USER_DISABLED': 'यह खाता अक्षम है।',
'INVALID_SYNTAX': 'अवैध वाक्य रचना।',
//MESSAGES
'SIGNUP_SUCCESS': 'आप हमारे समर्थन प्रणाली में सफलतापूर्वक दर्ज कर लिया है।',

View File

@ -177,6 +177,7 @@ export default {
'HOME': 'Home',
'TICKET_NUMBER': 'Ticket numero',
'NEXT': 'Prossimo',
'SUBJECT': 'Soggetto',
'SEND_EMAIL_ON_NEW_TICKET': 'Invia e-mail al nuovo ticket',
'STAFF_UPDATED': 'Il membro del personale è stato aggiornato',
'UPDATE': 'Aggiornare',
@ -187,6 +188,7 @@ export default {
'PRIVATE': 'privato',
'ENABLE_USER': 'Abilita utente',
'DISABLE_USER': 'Disabilita utente',
'IMAGE_HEADER_URL': 'URL dell\'intestazione dell\'immagine',
'CHART_CREATE_TICKET': 'Tickets creato',
'CHART_CLOSE': 'Tickets chiuso',
@ -332,6 +334,7 @@ export default {
'ERRORS_FOUND': 'Trovati errori',
'ERROR_IMAGE_SIZE': 'Nessuna immagine può avere una dimensione superiore a {size} MB',
'USER_DISABLED': 'Questo account è disabilitato.',
'INVALID_SYNTAX': 'Sintassi non valida.',
//MESSAGES
'SIGNUP_SUCCESS': 'È stato registrato con successo nel nostro sistema di supporto.',

View File

@ -177,6 +177,7 @@ export default {
'HOME': 'ホーム',
'TICKET_NUMBER': 'チケット番号',
'NEXT': '次',
'SUBJECT': '件名',
'SEND_EMAIL_ON_NEW_TICKET': 'メールを送信毎に新しいチケット',
'STAFF_UPDATED': 'スタッフメンバーが更新されました',
'UPDATE': '更新',
@ -187,6 +188,7 @@ export default {
'PRIVATE': 'プライベート',
'ENABLE_USER': 'ユーザーを有効にする',
'DISABLE_USER': 'ユーザーを無効にする',
'IMAGE_HEADER_URL': '画像のヘッダーURL',
'CHART_CREATE_TICKET': '作成されたチケット',
'CHART_CLOSE': 'チケットが閉じられました',
@ -332,6 +334,7 @@ export default {
'ERRORS_FOUND': 'エラーが見つかりました',
'ERROR_IMAGE_SIZE': 'イメージのサイズが{size} MBを超えることはできません',
'USER_DISABLED': 'このアカウントは無効です。',
'INVALID_SYNTAX': '無効な構文。',
//MESSAGES
'SIGNUP_SUCCESS': 'あなたは私たちのサポートシステムに正常に登録しました。',

View File

@ -177,6 +177,7 @@ export default {
'HOME': 'Home',
'TICKET_NUMBER': 'Incidentnummer',
'NEXT': 'Volgende',
'SUBJECT': 'Bedrijf',
'SEND_EMAIL_ON_NEW_TICKET': 'Stuur e-mail bij nieuw incident',
'STAFF_UPDATED': 'Medewerker is gewijzigd',
'UPDATE': 'Update',
@ -187,6 +188,7 @@ export default {
'PRIVATE': 'privaat',
'ENABLE_USER': 'Schakel gebruiker in',
'DISABLE_USER': 'Gebruiker uitschakelen',
'IMAGE_HEADER_URL': 'Image header URL',
'CHART_CREATE_TICKET': 'Aangemaakte incidenten',
'CHART_CLOSE': 'Gesloten incidenten',
@ -332,6 +334,7 @@ export default {
'ERRORS_FOUND': 'Er is een fout opgetreden',
'ERROR_IMAGE_SIZE': 'Geen enkele afbeelding kan groter zijn dan {size} MB',
'USER_DISABLED': 'Dit account is uitgeschakeld.',
'INVALID_SYNTAX': 'Ongeldige syntaxis.',
//MESSAGES
'SIGNUP_SUCCESS': 'U hebt zich succesvol geregistreerd in ons ondersteuningssysteem.',

View File

@ -177,6 +177,7 @@ export default {
'HOME': 'Casa',
'TICKET_NUMBER': 'Número do bilhete',
'NEXT': 'Próximo',
'SUBJECT': 'Sujeito',
'SEND_EMAIL_ON_NEW_TICKET': 'Enviar email para cada novo ticket',
'STAFF_UPDATED': 'Membro da equipe foi atualizado',
'UPDATE': 'Actualizar',
@ -187,6 +188,7 @@ export default {
'PRIVATE': 'privado',
'ENABLE_USER': 'Ativar usuário',
'DISABLE_USER': 'Desativar usuário',
'IMAGE_HEADER_URL': 'URL do cabeçalho da imagem',
'CHART_CREATE_TICKET': 'Ingressos criados',
'CHART_CLOSE': 'Ingressos fechados',
@ -332,6 +334,7 @@ export default {
'ERRORS_FOUND': 'Erros encontrados',
'ERROR_IMAGE_SIZE': 'Nenhuma imagem pode ter um tamanho maior que {size} MB',
'USER_DISABLED': 'Esta conta está desativada.',
'INVALID_SYNTAX': 'Sintaxe inválida.',
//MESSAGES
'SIGNUP_SUCCESS': 'Você se registrou com sucesso em nosso sistema de suporte.',

View File

@ -177,6 +177,7 @@ export default {
'HOME': 'Главная',
'TICKET_NUMBER': 'Номер билета',
'NEXT': 'следующий',
'SUBJECT': 'Предмет',
'SEND_EMAIL_ON_NEW_TICKET': 'Отправить письмо на новый билет',
'STAFF_UPDATED': 'Сотрудник обновлен',
'UPDATE': 'Обновить',
@ -187,6 +188,7 @@ export default {
'PRIVATE': 'частный',
'ENABLE_USER': 'Включить пользователя',
'DISABLE_USER': 'Отключить пользователя',
'IMAGE_HEADER_URL': 'URL заголовка изображения',
'CHART_CREATE_TICKET': 'Билеты создано',
'CHART_CLOSE': ' Билеты закрыты',
@ -332,6 +334,7 @@ export default {
'ERRORS_FOUND': 'Ошибки найдены',
'ERROR_IMAGE_SIZE': 'Изображение не может иметь размер больше {size} МБ',
'USER_DISABLED': 'Эта учетная запись отключена.',
'INVALID_SYNTAX': 'Недопустимый синтаксис.',
//MESSAGES
'SIGNUP_SUCCESS': 'Вы успешно зарегистрировались в нашей системе поддержки.',

View File

@ -177,6 +177,7 @@ export default {
'HOME': 'Ev',
'TICKET_NUMBER': 'Bilet numarası',
'NEXT': 'Sonraki',
'SUBJECT': 'konu',
'SEND_EMAIL_ON_NEW_TICKET': 'Yeni biletle e-posta gönder',
'STAFF_UPDATED': 'Çalışanlar güncellendi',
'UPDATE': 'Güncelleştirme',
@ -187,6 +188,7 @@ export default {
'PRIVATE': 'gizli',
'ENABLE_USER': 'Kullanıcıyı Etkinleştir',
'DISABLE_USER': 'Kullanıcıyı Devre Dışı Bırak',
'IMAGE_HEADER_URL': 'Resim başlığı URL\'si',
'CHART_CREATE_TICKET': 'Biletler oluşturuldu',
'CHART_CLOSE': 'Biletler kapandı',
@ -332,6 +334,7 @@ export default {
'ERRORS_FOUND': 'Hatalar bulundu',
'ERROR_IMAGE_SIZE': 'Hiçbir resmin boyutu {size} MB\'den büyük olabilir',
'USER_DISABLED': 'Bu hesap devre dışı.',
'INVALID_SYNTAX': 'Geçersiz sözdizimi.',
//MESSAGES
'SIGNUP_SUCCESS': 'Destek sistemimize başarılı bir şekilde kayıt oldunuz.',

View File

@ -49,7 +49,8 @@ class EditSettingsController extends Controller {
'allow-attachments',
'max-size',
'title',
'url'
'url',
'mail-template-header-image'
];
foreach($settings as $setting) {

View File

@ -53,7 +53,8 @@ class GetSettingsController extends Controller {
'departments' => Department::getDepartmentNames(),
'supportedLanguages' => Language::getSupportedLanguages(),
'allowedLanguages' => Language::getAllowedLanguages(),
'session-prefix' => Setting::getSetting('session-prefix')
'session-prefix' => Setting::getSetting('session-prefix')->getValue(),
'mail-template-header-image' => Setting::getSetting('mail-template-header-image')->getValue()
];
} else {
$settingsList = [
@ -70,7 +71,7 @@ class GetSettingsController extends Controller {
'supportedLanguages' => Language::getSupportedLanguages(),
'allowedLanguages' => Language::getAllowedLanguages(),
'user-system-enabled' => intval(Setting::getSetting('user-system-enabled')->getValue()),
'session-prefix' => Setting::getSetting('session-prefix')
'session-prefix' => Setting::getSetting('session-prefix')->getValue()
];
}
}

View File

@ -88,7 +88,8 @@ class InitSettingsController extends Controller {
'file-gap' => Hashing::generateRandomPrime(100000, 999999),
'file-first-number' => Hashing::generateRandomNumber(100000, 999999),
'file-quantity' => 0,
'session-prefix' => 'opensupports-'.Hashing::generateRandomToken().'_'
'session-prefix' => 'opensupports-'.Hashing::generateRandomToken().'_',
'mail-template-header-image' => 'http://opensupports.com/logo.png'
]);
}

View File

@ -302,8 +302,8 @@
<center>
<table cellpadding="0" cellspacing="0" width="600" class="w320">
<tr>
<td style="vertical-align: middle;">
<a href="http://www.opensupports.com/" target="_blank"><img height="47" src="http://opensupports.com/logo.png" alt="logo"></a>
<td style="vertical-align: middle;padding: 15px 0;">
<img src="{{IMAGE_HEADER_URL}}" alt="logo">
</td>
</tr>
</table>

View File

@ -302,8 +302,8 @@
<center>
<table cellpadding="0" cellspacing="0" width="600" class="w320">
<tr>
<td style="vertical-align: middle;">
<a href="http://www.opensupports.com/" target="_blank"><img height="47" src="http://opensupports.com/logo.png" alt="logo"></a>
<td style="vertical-align: middle;padding: 15px 0;">
<img src="{{IMAGE_HEADER_URL}}" alt="logo">
</td>
</tr>
</table>

View File

@ -302,8 +302,8 @@
<center>
<table cellpadding="0" cellspacing="0" width="600" class="w320">
<tr>
<td style="vertical-align: middle;">
<a href="http://www.opensupports.com/" target="_blank"><img height="47" src="http://opensupports.com/logo.png" alt="logo"></a>
<td style="vertical-align: middle;padding: 15px 0;">
<img src="{{IMAGE_HEADER_URL}}" alt="logo">
</td>
</tr>
</table>

View File

@ -302,8 +302,8 @@
<center>
<table cellpadding="0" cellspacing="0" width="600" class="w320">
<tr>
<td style="vertical-align: middle;">
<a href="http://www.opensupports.com/" target="_blank"><img height="47" src="http://opensupports.com/logo.png" alt="logo"></a>
<td style="vertical-align: middle;padding: 15px 0;">
<img src="{{IMAGE_HEADER_URL}}" alt="logo">
</td>
</tr>
</table>

View File

@ -302,8 +302,8 @@
<center>
<table cellpadding="0" cellspacing="0" width="600" class="w320">
<tr>
<td style="vertical-align: middle;">
<a href="http://www.opensupports.com/" target="_blank"><img height="47" src="http://opensupports.com/logo.png" alt="logo"></a>
<td style="vertical-align: middle;padding: 15px 0;">
<img src="{{IMAGE_HEADER_URL}}" alt="logo">
</td>
</tr>
</table>

View File

@ -302,9 +302,9 @@
<center>
<table cellpadding="0" cellspacing="0" width="600" class="w320">
<tr>
<td style="vertical-align: middle;">
<td style="vertical-align: middle;padding: 15px 0;">
<img src="{{IMAGE_HEADER_URL}}" alt="logo">
</td>
<a href="http://www.opensupports.com/" target="_blank"><img height="47" src="http://opensupports.com/logo.png" alt="logo"></a>
</tr>
</table>
</center>

View File

@ -302,8 +302,8 @@
<center>
<table cellpadding="0" cellspacing="0" width="600" class="w320">
<tr>
<td style="vertical-align: middle;">
<a href="http://www.opensupports.com/" target="_blank"><img height="47" src="http://opensupports.com/logo.png" alt="logo"></a>
<td style="vertical-align: middle;padding: 15px 0;">
<img src="{{IMAGE_HEADER_URL}}" alt="logo">
</td>
</tr>
</table>

View File

@ -302,8 +302,8 @@
<center>
<table cellpadding="0" cellspacing="0" width="600" class="w320">
<tr>
<td style="vertical-align: middle;">
<a href="http://www.opensupports.com/" target="_blank"><img height="47" src="http://opensupports.com/logo.png" alt="logo"></a>
<td style="vertical-align: middle;padding: 15px 0;">
<img src="{{IMAGE_HEADER_URL}}" alt="logo">
</td>
</tr>
</table>

View File

@ -302,8 +302,8 @@
<center>
<table cellpadding="0" cellspacing="0" width="600" class="w320">
<tr>
<td style="vertical-align: middle;">
<a href="http://www.opensupports.com/" target="_blank"><img height="47" src="http://opensupports.com/logo.png" alt="logo"></a>
<td style="vertical-align: middle;padding: 15px 0;">
<img src="{{IMAGE_HEADER_URL}}" alt="logo">
</td>
</tr>
</table>

View File

@ -302,8 +302,8 @@
<center>
<table cellpadding="0" cellspacing="0" width="600" class="w320">
<tr>
<td style="vertical-align: middle;">
<a href="http://www.opensupports.com/" target="_blank"><img height="47" src="http://opensupports.com/logo.png" alt="logo"></a>
<td style="vertical-align: middle;padding: 15px 0;">
<img src="{{IMAGE_HEADER_URL}}" alt="logo">
</td>
</tr>
</table>

View File

@ -78,6 +78,9 @@ class MailTemplate extends DataStore {
$matches[] = '{{' . $this->template . '_MATCH_' . ($key + 1) . '}}';
}
$matches[] = '{{IMAGE_HEADER_URL}}';
$texts[] = Setting::getSetting('mail-template-header-image')->value;
$body = str_replace($matches, $texts, file_get_contents($templateFilePaths[$this->template]));
return $this->compileString($body, $config);