New project structure

Beta of extract.js for extracting english locale
This commit is contained in:
Tomas Bures 2018-11-18 15:38:52 +01:00
parent e18d2b2f84
commit 2edbd67205
247 changed files with 6405 additions and 4237 deletions

View file

@ -0,0 +1 @@
{{{body}}}

View file

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="icon" href="/static/favicon.ico">
<title>Mailtrain</title>
<link rel="stylesheet" href="/static/css/narrow.css">
</head>
<body>
{{{body}}}
{{> tracking_scripts}}
</body>
</html>

View file

@ -0,0 +1 @@
{{{message}}}

View file

@ -0,0 +1,35 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="{{#translate}}Self hosted email newsletter app{{/translate}}">
<link rel="shortcut icon" href="{{publicPath}}favicon.ico" type="image/x-icon" />
<link rel="icon" href="{{publicPath}}static/favicon.ico">
<title>Mailtrain</title>
<link rel="stylesheet" href="{{publicPath}}static/bootstrap/themes/united.min.css">
<script src="{{publicPath}}static/jquery-2.2.1.min.js"></script>
<script src="{{publicPath}}static/bootstrap/js/bootstrap.min.js"></script>
{{#if mailtrainConfig}}
<script>
{{#if reactCsrfToken}}window.csfrToken = '{{reactCsrfToken}}';{{/if}}
window.mailtrainConfig = {{{mailtrainConfig}}};
</script>
{{#each scriptFiles}}
<script src="{{this}}"></script>
{{/each}}
{{/if}}
</head>
<body>
{{{body}}}
</body>
</html>

View file

@ -0,0 +1,6 @@
<div id="root"></div>
<script>
document.addEventListener('DOMContentLoaded', function() {
MailtrainReactBody.default();
});
</script>

View file

@ -0,0 +1,35 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="{{#translate}}Self hosted email newsletter app{{/translate}}">
<link rel="shortcut icon" href="{{publicPath}}favicon.ico" type="image/x-icon" />
<link rel="icon" href="{{publicPath}}static/favicon.ico">
<title>Mailtrain</title>
<link rel="stylesheet" href="{{publicPath}}static/bootstrap/themes/united.min.css">
<script src="{{publicPath}}static/jquery-2.2.1.min.js"></script>
<script src="{{publicPath}}static/bootstrap/js/bootstrap.min.js"></script>
{{#if mailtrainConfig}}
<script>
{{#if reactCsrfToken}}window.csfrToken = '{{reactCsrfToken}}';{{/if}}
window.mailtrainConfig = {{{mailtrainConfig}}};
</script>
{{#each scriptFiles}}
<script src="{{this}}"></script>
{{/each}}
{{/if}}
</head>
<body>
{{{body}}}
</body>
</html>

View file

@ -0,0 +1,6 @@
<div id="root"></div>
<script>
document.addEventListener('DOMContentLoaded', function() {
MailtrainReactBody.default();
});
</script>

6
server/views/error.hbs Normal file
View file

@ -0,0 +1,6 @@
<h1>{{message}}</h1>
<h2>{{error.status}}</h2>
{{#if error.stack}}
<pre>{{error.stack}}</pre>
{{/if}}

View file

@ -0,0 +1,33 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="{{#translate}}Self hosted email newsletter app{{/translate}}">
<link rel="shortcut icon" href="{{publicPath}}favicon.ico" type="image/x-icon" />
<link rel="icon" href="{{publicPath}}static/favicon.ico">
<title>Mailtrain</title>
<script src="{{publicPath}}static/jquery-2.2.1.min.js"></script>
{{#if mailtrainConfig}}
<script>
{{#if reactCsrfToken}}window.csfrToken = '{{reactCsrfToken}}';{{/if}}
window.mailtrainConfig = {{{mailtrainConfig}}};
</script>
{{#each scriptFiles}}
<script src="{{this}}"></script>
{{/each}}
{{/if}}
</head>
<body class="grapesjs-body">
{{{body}}}
</body>
</html>

View file

@ -0,0 +1,6 @@
<div id="root"></div>
<script>
document.addEventListener('DOMContentLoaded', function() {
MailtrainReactBody.default();
});
</script>

43
server/views/layout.hbs Normal file
View file

@ -0,0 +1,43 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="{{#translate}}Self hosted email newsletter app{{/translate}}">
<link rel="shortcut icon" href="{{publicPath}}favicon.ico" type="image/x-icon" />
<link rel="icon" href="/static/favicon.ico">
<title>Mailtrain
{{#if title}} | {{title}}{{/if}}
</title>
<link rel="stylesheet" href="/static/bootstrap/themes/united.min.css">
<link rel="stylesheet" href="/static/css/footer.css">
<link rel="stylesheet" href="/static/css/mailtrain.css">
<script src="/static/jquery-2.2.1.min.js"></script>
<script src="/static/bootstrap/js/bootstrap.min.js"></script>
{{#if mailtrainConfig}}
<script>
{{#if reactCsrfToken}}window.csfrToken = '{{reactCsrfToken}}';{{/if}}
window.mailtrainConfig = {{{mailtrainConfig}}};
</script>
{{#each scriptFiles}}
<script src="{{this}}"></script>
{{/each}}
{{/if}}
</head>
<body class="{{bodyClass}}">
{{{body}}}
{{> tracking_scripts}}
</body>
</html>

View file

@ -0,0 +1,58 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="{{#translate}}Self hosted email newsletter app{{/translate}}">
<link rel="shortcut icon" href="{{publicPath}}favicon.ico" type="image/x-icon" />
<link rel="icon" href="{{publicPath}}static/favicon.ico">
<title>Mailtrain</title>
<script src="{{publicPath}}static/mosaico/vendor/jquery.min.js"></script>
<script src="{{publicPath}}static/mosaico/vendor/jquery-migrate.min.js"></script>
<script src="{{publicPath}}static/mosaico/vendor/knockout.js"></script>
<script src="{{publicPath}}static/mosaico/vendor/jquery-ui.min.js"></script>
<script src="{{publicPath}}static/mosaico/vendor/jquery.ui.touch-punch.min.js"></script>
<script src="{{publicPath}}static/mosaico/vendor/load-image.all.min.js"></script>
<script src="{{publicPath}}static/mosaico/vendor/canvas-to-blob.min.js"></script>
<script src="{{publicPath}}static/mosaico/vendor/jquery.iframe-transport.js"></script>
<script src="{{publicPath}}static/mosaico/vendor/jquery.fileupload.js"></script>
<script src="{{publicPath}}static/mosaico/vendor/jquery.fileupload-process.js"></script>
<script src="{{publicPath}}static/mosaico/vendor/jquery.fileupload-image.js"></script>
<script src="{{publicPath}}static/mosaico/vendor/jquery.fileupload-validate.js"></script>
<script src="{{publicPath}}static/mosaico/vendor/knockout-jqueryui.min.js"></script>
<script src="{{publicPath}}static/mosaico/vendor/tinymce.min.js"></script>
<script src="{{publicPath}}static/mosaico/mosaico.min.js?v=0.16"></script>
{{#if languageStrings}}<script> window.mosaicoLanguageStrings = {{{languageStrings}}}; </script>{{/if}}
<script> window.mosaicoPlugins = []; </script>
<script> window.mosaicoHTMLPostRenderers = []; </script>
{{#if editorConfig.customscripts}}
{{#each editorConfig.customscripts}}
<script src="{{this}}"></script>
{{/each}}
{{/if}}
<script>
window.csfrToken = '{{reactCsrfToken}}';
window.mailtrainConfig = {{{mailtrainConfig}}};
</script>
{{#each scriptFiles}}
<script src="{{this}}"></script>
{{/each}}
<link rel="stylesheet" href="{{publicPath}}static/mosaico/mosaico-material.min.css?v=0.10" />
<link rel="stylesheet" href="{{publicPath}}static/mosaico/vendor/notoregular/stylesheet.css" />
</head>
<body class="mo-standalone">
{{{body}}}
</body>
</html>

View file

@ -0,0 +1,6 @@
<div id="root"></div>
<script>
document.addEventListener('DOMContentLoaded', function() {
MailtrainReactBody.default();
});
</script>

View file

@ -0,0 +1,18 @@
{{#if uaCode}}
<script>
(function(i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function() {
(i[r].q = i[r].q || []).push(arguments)
}, i[r].l = 1 * new Date();
a = s.createElement(o),
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m)
})(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');
ga('create', '{{uaCode}}', 'auto');
ga('send', 'pageview');
</script>
{{/if}}

6
server/views/root.hbs Normal file
View file

@ -0,0 +1,6 @@
<div id="root"></div>
<script>
document.addEventListener('DOMContentLoaded', function() {
MailtrainReactBody.default();
});
</script>

View file

@ -0,0 +1 @@
{{flash_messages}}

View file

@ -0,0 +1,62 @@
<mjml>
<mj-head>
<mj-title>{{title}}</mj-title>
<mj-font name="Lato" href="https://fonts.googleapis.com/css?family=Lato:400,700,400italic" />
<mj-attributes>
<mj-all font-size="15px" color="#2D3E4F" font-family="Lato, Helvetica, Arial, sans-serif" />
<mj-class name="h1" font-size="42px" line-height="68px" color="#b4bcc2" />
<mj-class name="h3" font-size="24px" line-height="32px" />
<mj-class name="p" font-size="15px" line-height="24px" />
<mj-class name="small" font-size="12px" line-height="16px" color="#999999" />
<mj-class name="hr" border-width="1px" border-style="solid" border-color="#e4e5e6" />
<mj-class name="button" font-size="16px" background-color="#2D3E4F" color="white" align="left" inner-padding="16px 24px" border-radius="6px" />
<mj-class name="footer-text" font-size="12px" line-height="18px" color="#999999" />
</mj-attributes>
</mj-head>
<mj-body>
<mj-container width="560" background-color="#ffffff">
<mj-raw>
{{#if isWeb}}
<style>
{{{formInputStyle}}}
.alert { max-width: 520px; font-family: Lato, Helvetica, Arial, sans-serif; }
</style>
{{/if}}
</mj-raw>
<mj-section padding-bottom="0">
<mj-column>
<mj-text mj-class="h1">
{{title}}
</mj-text>
<mj-divider mj-class="hr"/>
</mj-column>
</mj-section>
<mj-raw>
{{#if isWeb}}
{{> subscription_flash_messages}}
{{/if}}
</mj-raw>
{{{body}}}
<mj-section padding-top="0">
<mj-column>
<mj-text mj-class="small" font-style="italic">
<!-- POST ADDRESS -->
</mj-text>
</mj-column>
</mj-section>
<mj-raw>
{{#if isWeb}}
<!-- fixes https://github.com/mjmlio/mjml/issues/359 -->
{{> subscription_footer_scripts btnBgColor='#2D3E4F' btnBgColorHover='#1A242F'}}
{{/if}}
</mj-raw>
</mj-container>
</mj-body>
</mjml>

View file

@ -0,0 +1,24 @@
<mj-section>
<mj-column>
<mj-text mj-class="h3">
{{#translate}}Email address already registered{{/translate}}
</mj-text>
<mj-text mj-class="p">
{{#translate}}We have received a subscription request. Your email address is however already registered.{{/translate}}.
</mj-text>
<mj-text mj-class="p">
{{#translate}}If you received this email by mistake, simply delete it. Your existing subscription won't be affected.{{/translate}}
</mj-text>
<mj-text mj-class="p">
{{#translate}}If you want to modify your subscription then you can {{/translate}}
<a href="{{preferencesUrl}}">{{#translate}}manage your preferences{{/translate}}</a> {{#translate}}or{{/translate}} <a href="{{unsubscribeUrl}}">{{#translate}}unsubscribe here{{/translate}}</a>.
</mj-text>
<mj-button mj-class="button" href="{{homepage}}">
{{#translate}}Return to our website{{/translate}}
</mj-button>
<mj-text mj-class="p">
{{#translate}}For questions about this list, please contact:{{/translate}}
<br/><a href="mailto:{{contactAddress}}">{{contactAddress}}</a>
</mj-text>
</mj-column>
</mj-section>

View file

@ -0,0 +1,18 @@
{{{title}}}
{{#translate}}Email address already registered{{/translate}}
================================
{{#translate}}We have received a subscription request. Your email address is however already registered.{{/translate}}
{{#translate}}If you received this email by mistake, simply delete it. Your existing subscription won't be affected.{{/translate}}
{{#translate}}If you want to modify your subscription then you can:{{/translate}}
{{#translate}}manage your preferences{{/translate}}: {{preferencesUrl}}
- {{#translate}}or{{/translate}} -
{{#translate}}unsubscribe here{{/translate}}: {{unsubscribeUrl}}
{{#translate}}For questions about this list, please contact:{{/translate}}
{{{contactAddress}}}

View file

@ -0,0 +1,17 @@
<mj-section>
<mj-column>
<mj-text mj-class="h3">
{{#translate}}Please Confirm Subscription Address Change{{/translate}}
</mj-text>
<mj-button mj-class="button" href="{{confirmUrl}}">
{{#translate}}Yes, subscribe this email address to the list{{/translate}}
</mj-button>
<mj-text mj-class="p">
{{#translate}}If you received this email by mistake, simply delete it. You won't be subscribed if you don't click the confirmation link above.{{/translate}}
</mj-text>
<mj-text mj-class="p">
{{#translate}}For questions about this list, please contact:{{/translate}}
<br/><a href="mailto:{{contactAddress}}">{{contactAddress}}</a>
</mj-text>
</mj-column>
</mj-section>

View file

@ -0,0 +1,10 @@
{{{title}}}
{{#translate}}Please Confirm Subscription Address Change{{/translate}}
==========================================
{{#translate}}Yes, subscribe this email address to the list{{/translate}}: {{{confirmUrl}}}
{{#translate}}If you received this email by mistake, simply delete it. You won't be subscribed unless you click the confirmation link above.{{/translate}}
{{#translate}}For questions about this list, please contact:{{/translate}}
{{{contactAddress}}}

View file

@ -0,0 +1,17 @@
<mj-section>
<mj-column>
<mj-text mj-class="h3">
{{#translate}}Please Confirm Subscription{{/translate}}
</mj-text>
<mj-button mj-class="button" href="{{confirmUrl}}">
{{#translate}}Yes, subscribe me to this list{{/translate}}
</mj-button>
<mj-text mj-class="p">
{{#translate}}If you received this email by mistake, simply delete it. You won't be subscribed if you don't click the confirmation link above.{{/translate}}
</mj-text>
<mj-text mj-class="p">
{{#translate}}For questions about this list, please contact:{{/translate}}
<br/><a href="mailto:{{contactAddress}}">{{contactAddress}}</a>
</mj-text>
</mj-column>
</mj-section>

View file

@ -0,0 +1,10 @@
{{{title}}}
{{#translate}}Please Confirm Subscription{{/translate}}
===========================
{{#translate}}Yes, subscribe me to this list{{/translate}}: {{{confirmUrl}}}
{{#translate}}If you received this email by mistake, simply delete it. You won't be subscribed unless you click the confirmation link above.{{/translate}}
{{#translate}}For questions about this list, please contact:{{/translate}}
{{{contactAddress}}}

View file

@ -0,0 +1,17 @@
<mj-section>
<mj-column>
<mj-text mj-class="h3">
{{#translate}}Please Confirm Unsubscription{{/translate}}
</mj-text>
<mj-button mj-class="button" href="{{confirmUrl}}">
{{#translate}}Yes, unsubscribe me from this list{{/translate}}
</mj-button>
<mj-text mj-class="p">
{{#translate}}If you received this email by mistake, simply delete it. You won't be unsubscribed if you don't click the confirmation link above.{{/translate}}
</mj-text>
<mj-text mj-class="p">
{{#translate}}For questions about this list, please contact:{{/translate}}
<br/><a href="mailto:{{contactAddress}}">{{contactAddress}}</a>
</mj-text>
</mj-column>
</mj-section>

View file

@ -0,0 +1,10 @@
{{{title}}}
{{#translate}}Please Confirm Subscription{{/translate}}
===========================
{{#translate}}Yes, unsubscribe me from this list{{/translate}}: {{{confirmUrl}}}
{{#translate}}If you received this email by mistake, simply delete it. You won't be unsubscribed unless you click the confirmation link above.{{/translate}}
{{#translate}}For questions about this list, please contact:{{/translate}}
{{{contactAddress}}}

View file

@ -0,0 +1,18 @@
<mj-section>
<mj-column>
<mj-text mj-class="h3">
{{#translate}}Subscription Confirmed{{/translate}}
</mj-text>
<mj-text mj-class="p">
{{#translate}}Your subscription to our list has been confirmed{{/translate}}. {{#translate}}If you want to modify your subscription then you can {{/translate}}
<a href="{{preferencesUrl}}">{{#translate}}manage your preferences{{/translate}}</a> {{#translate}}or{{/translate}} <a href="{{unsubscribeUrl}}">{{#translate}}unsubscribe here{{/translate}}</a>.
</mj-text>
<mj-button mj-class="button" href="{{homepage}}">
{{#translate}}Return to our website{{/translate}}
</mj-button>
<mj-text mj-class="p">
{{#translate}}For questions about this list, please contact:{{/translate}}
<br/><a href="mailto:{{contactAddress}}">{{contactAddress}}</a>
</mj-text>
</mj-column>
</mj-section>

View file

@ -0,0 +1,16 @@
{{{title}}}
{{#translate}}Subscription Confirmed{{/translate}}
======================
{{#translate}}Your subscription to our list has been confirmed.{{/translate}}
{{#translate}}If you want to modify your subscription then you can:{{/translate}}
{{#translate}}manage your preferences{{/translate}}: {{preferencesUrl}}
- {{#translate}}or{{/translate}} -
{{#translate}}unsubscribe here{{/translate}}: {{unsubscribeUrl}}
{{#translate}}For questions about this list, please contact:{{/translate}}
{{{contactAddress}}}

View file

@ -0,0 +1,17 @@
<mj-section>
<mj-column>
<mj-text mj-class="h3">
{{#translate}}You Are Now Unsubscribed{{/translate}}
</mj-text>
<mj-text mj-class="p">
{{#translate}}We have removed your email address from our list{{/translate}}. {{#translate}}If you unsubscribed by mistake, you can re-subscribe at:{{/translate}}
</mj-text>
<mj-button mj-class="button" href="{{subscribeUrl}}">
{{#translate}}Subscribe{{/translate}}
</mj-button>
<mj-text mj-class="p">
{{#translate}}For questions about this list, please contact:{{/translate}}
<br/><a href="mailto:{{contactAddress}}">{{contactAddress}}</a>
</mj-text>
</mj-column>
</mj-section>

View file

@ -0,0 +1,12 @@
{{{title}}}
{{#translate}}You Are Now Unsubscribed{{/translate}}
========================
{{#translate}}We have removed your email address from our list.{{/translate}}
{{#translate}}If you unsubscribed by mistake, you can re-subscribe at:{{/translate}}
{{#translate}}Subscribe{{/translate}}: {{subscribeUrl}}
{{#translate}}For questions about this list, please contact:{{/translate}}
{{{contactAddress}}}

View file

@ -0,0 +1,154 @@
{{#each customFields}}
{{#if typeSubscriptionEmail}}
<div class="form-group email">
<label for="EMAIL">{{#translate}}Email Address{{/translate}}</label>
{{#if ../isManagePreferences}}
<div class="input-group">
<input type="email" name="EMAIL" id="email" placeholder="" value="{{../email}}" readonly>
<div class="input-group-addon"><a href="/subscription/{{../lcid}}/manage-address/{{../cid}}">{{#translate}}want to change it?{{/translate}}</a></div>
</div>
{{else}}
<input type="email" name="EMAIL" id="email" placeholder="" value="{{../email}}" required>
{{/if}}
</div>
{{/if}}
{{#if typeText}}
<div class="form-group text {{key}}">
<label for="{{key}}">{{name}}</label>
<input type="text" name="{{key}}" value="{{value}}">
</div>
{{/if}}
{{#if typeNumber}}
<div class="form-group number {{key}}">
<label for="{{key}}">{{name}}</label>
<input type="number" name="{{key}}" value="{{value}}">
</div>
{{/if}}
{{#if typeWebsite}}
<div class="form-group url {{key}}">
<label for="{{key}}">{{name}}</label>
<input type="url" name="{{key}}" value="{{value}}">
</div>
{{/if}}
{{#if typeLongtext}}
<div class="form-group longtext {{key}}">
<label for="{{key}}">{{name}}</label>
<textarea rows="3" name="{{key}}">{{value}}</textarea>
</div>
{{/if}}
{{#if typeJson}}
<div class="form-group json {{key}}">
<label for="{{key}}">{{name}}</label>
<textarea class="gpg-text" rows="3" name="{{key}}" placeholder="{&quot;data&quot;:&quot;value&quot;}">{{value}}</textarea>
</div>
{{/if}}
{{#if typeGpg}}
<div class="form-group gpg {{key}}">
<label for="{{key}}">{{name}}</label>
{{#if ../hasPubkey}}
<button class="btn-download-pubkey" type="submit" form="download-pubkey">{{#translate}}Download signature verification key{{/translate}}</button>
{{/if}}
<textarea class="form-control gpg-text" rows="4" name="{{key}}" placeholder="{{#translate}}Begins with{{/translate}} &#39;-----BEGIN PGP PUBLIC KEY BLOCK-----&#39;">{{value}}</textarea>
<span class="help-block">
{{#translate}}Insert your GPG public key here to encrypt messages sent to your address{{/translate}} <em>({{#translate}}optional{{/translate}})</em>
</span>
</div>
{{/if}}
{{#if typeDateUs}}
<div class="form-group date fm-date-us {{key}}">
<label for="{{key}}">{{name}}</label>
<input type="text" name="{{key}}" placeholder="MM/DD/YYYY" value="{{value}}">
</div>
{{/if}}
{{#if typeDateEur}}
<div class="form-group date fm-date-eur {{key}}">
<label for="{{key}}">{{name}}</label>
<input type="text" name="{{key}}" placeholder="DD/MM/YYYY" value="{{value}}">
</div>
{{/if}}
{{#if typeBirthdayUs}}
<div class="form-group date fm-birthday-us {{key}}">
<label for="{{key}}">{{name}}</label>
<input type="text" name="{{key}}" placeholder="MM/DD" value="{{value}}">
</div>
{{/if}}
{{#if typeBirthdayEur}}
<div class="form-group date fm-birthday-eur {{key}}">
<label for="{{key}}">{{name}}</label>
<input type="text" name="{{key}}" placeholder="DD/MM" value="{{value}}">
</div>
{{/if}}
{{#if typeDropdownGrouped }}
<div class="form-group dropdown {{key}}">
<label for="{{key}}">{{name}}</label>
<select name="{{key}}" class="form-control">
<option value="">
{{#translate}}Select{{/translate}}
</option>
{{#each options}}
<option value="{{key}}" {{#if value}} selected {{/if}}>{{name}}</option>
{{/each}}
</select>
</div>
{{/if}}
{{#if typeRadioGrouped}}
<div class="form-group radio {{key}}">
<label for="{{key}}">{{name}}</label>
{{#each options}}
<label class="label-radio">
<input type="radio" name="{{../key}}" value="{{key}}" {{#if value}} checked {{/if}}> {{name}}
</label>
{{/each}}
</div>
{{/if}}
{{#if typeCheckboxGrouped}}
<div class="form-group checkbox">
<label>{{name}}</label>
{{#each options}}
<label class="label-checkbox">
<input type="checkbox" name="{{key}}" value="1" {{#if value}} checked {{/if}}> {{name}}
</label>
{{/each}}
</div>
{{/if}}
{{#if typeDropdownEnum }}
<div class="form-group dropdown {{key}}">
<label for="{{key}}">{{name}}</label>
<select name="{{key}}" class="form-control">
<option value="">
{{#translate}}Select{{/translate}}
</option>
{{#each options}}
<option value="{{key}}" {{#if value}} selected {{/if}}>{{name}}</option>
{{/each}}
</select>
</div>
{{/if}}
{{#if typeRadioEnum}}
<div class="form-group radio {{key}}">
<label for="{{key}}">{{name}}</label>
{{#each options}}
<label class="label-radio">
<input type="radio" name="{{../key}}" value="{{key}}" {{#if value}} checked {{/if}}> {{name}}
</label>
{{/each}}
</div>
{{/if}}
{{/each}}

View file

@ -0,0 +1,14 @@
{{{flashMessages}}}
{{#if isConfirmNotice}}
<div class="alert alert-warning js-warning" role="alert">
<strong>{{#translate}}Warning!{{/translate}}</strong> {{#translate}}If JavaScript was not enabled then no confirmation message was sent{{/translate}}
</div>
{{/if}}
{{#if needsJsWarning}}
<div class="alert alert-danger js-warning" role="alert">
<strong>{{#translate}}Warning!{{/translate}}</strong>
{{#translate}}JavaScript must be enabled in order for this form to work{{/translate}}
</div>
{{/if}}

View file

@ -0,0 +1,61 @@
<script>
(function () {
var forEach = function (array, callback, scope) {
for (var i = 0; i < array.length; i++) {
callback.call(scope, i, array[i]);
}
};
forEach(document.querySelectorAll('.js-warning'), function(i, el) {
el.style.display = 'none';
});
forEach(document.querySelectorAll('a[href="#submit"]'), function(i, a) {
a.onclick = function() {
var form = document.getElementById('main-form');
form && form.submit();
return false;
};
});
if (typeof moment !== 'undefined' && moment.tz) {
forEach(document.querySelectorAll('.tz-detect'), function(i, el) {
el.value = moment.tz.guess() || '';
});
}
// Fixes MJML Button until they do ...
// https://github.com/mjmlio/mjml/issues/359
var btnBgColor = '{{btnBgColor}}';
var btnBgColorHover = '{{btnBgColorHover}}';
if (btnBgColor) {
var s = document.createElement('style');
var c = document.createTextNode(
'.td-btn:hover { background-color: ' + btnBgColorHover + '; }' +
'.td-btn { cursor: pointer !important; }' +
'.a-btn { background-color: transparent !important; }'
);
s.appendChild(c);
document.getElementsByTagName('head')[0].appendChild(s);
forEach(document.querySelectorAll('a'), function(i, a) {
if (a.parentNode.getAttribute('bgcolor') === btnBgColor) {
a.target = '_self';
a.className += 'a-btn';
a.parentNode.className += 'td-btn';
a.parentNode.onclick = function() {
a.click();
};
}
});
}
})();
</script>
<!-- custom scripts from config -->
{{#each customSubscriptionScripts}}
<script src="{{this}}"></script>
{{/each}}
{{> tracking_scripts}}

View file

@ -0,0 +1,22 @@
<form id="main-form" method="post" action="/subscription/{{lcid}}/manage-address">
<input type="hidden" name="_csrf" value="{{csrfToken}}">
<input type="hidden" name="cid" value="{{cid}}">
<div class="form-group email">
<label for="EMAIL">{{#translate}}Existing Email Address{{/translate}}</label>
<input type="email" name="EMAIL" id="email" placeholder="" value="{{email}}" readonly>
</div>
<div class="form-group email">
<label for="EMAIL_NEW">{{#translate}}New Email Address{{/translate}}</label>
<input type="email" name="EMAIL_NEW" id="email-new" placeholder="{{#translate}}Your new email address{{/translate}}" value="{{email}}">
</div>
<p>
{{#translate}}You will receive a confirmation request to your new email address that you need to accept before your email is actually changed{{/translate}}
</p>
<button type="submit" style="position: absolute; top: -9999px; left: -9999px;">{{#translate}}Update Email Address{{/translate}}</button>
</form>

View file

@ -0,0 +1,19 @@
{{#if hasPubkey}}
<form method="post" id="download-pubkey" action="/subscription/publickey" style="display: none;">
<input type="hidden" name="_csrf" value="{{csrfToken}}">
<input type="hidden" name="cid" value="{{cid}}">
</form>
{{/if}}
<form id="main-form" method="post" action="/subscription/{{lcid}}/manage">
<input type="hidden" name="_csrf" value="{{csrfToken}}">
<input type="hidden" name="cid" value="{{cid}}">
<input type="hidden" class="tz-detect" name="tz" id="tz" value="{{tz}}">
{{> subscription_custom_fields}}
<button type="submit" style="position: absolute; top: -9999px; left: -9999px;">{{#translate}}Update Profile{{/translate}}</button>
</form>
<script src="/moment/moment.min.js"></script>
<script src="/moment/moment-timezone-with-data.min.js"></script>

View file

@ -0,0 +1,25 @@
{{#if hasPubkey}}
<form method="post" id="download-pubkey" action="/subscription/publickey" style="display: none;">
<input type="hidden" name="_csrf" value="{{csrfToken}}">
<input type="hidden" name="cid" value="{{cid}}">
</form>
{{/if}}
<form id="main-form" method="post" action="/subscription/{{cid}}/subscribe">
<input type="hidden" name="_csrf" value="{{csrfToken}}">
<input type="hidden" class="tz-detect" name="tz" id="tz" value="{{tz}}">
<input type="hidden" name="address" value="">
<input type="hidden" name="sub" id="sub" value="">
<input type="hidden" name="ucid" value="{{ucid}}">
{{> subscription_custom_fields}}
<button type="submit" style="position: absolute; top: -9999px; left: -9999px;">{{#translate}}Subscribe to list{{/translate}}</button>
</form>
<script>
document.getElementById('sub').value = new Date().getTime();
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.12.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.3/moment-timezone-with-data.min.js"></script>

View file

@ -0,0 +1,13 @@
<form method="post" id="main-form" action="/subscription/{{lcid}}/unsubscribe">
<input type="hidden" name="_csrf" value="{{csrfToken}}">
<input type="hidden" name="campaign" value="{{campaign}}">
<input type="hidden" name="ucid" value="{{ucid}}">
<div class="form-group">
<label for="email">{{#translate}}Email address{{/translate}}</label>
<input type="email" name="email" id="email" placeholder="" value="{{email}}" readonly>
</div>
<button type="submit" style="position: absolute; top: -9999px; left: -9999px;">{{#translate}}Unsubscribe{{/translate}}</button>
</form>

View file

@ -0,0 +1,13 @@
<mj-section>
<mj-column>
<mj-text mj-class="h3">
{{#translate}}Almost Finished{{/translate}}
</mj-text>
<mj-text mj-class="p">
{{#translate}}We need to confirm your email address. To complete the subscription process, please click the link in the email we just sent you.{{/translate}}
</mj-text>
<mj-button mj-class="button" href="{{homepage}}">
{{#translate}}Return to our website{{/translate}}
</mj-button>
</mj-column>
</mj-section>

View file

@ -0,0 +1,13 @@
<mj-section>
<mj-column>
<mj-text mj-class="h3">
{{#translate}}Almost Finished{{/translate}}
</mj-text>
<mj-text mj-class="p">
{{#translate}}We need to confirm your email address. To complete the unsubscription process, please click the link in the email we just sent you.{{/translate}}
</mj-text>
<mj-button mj-class="button" href="{{homepage}}">
{{#translate}}Return to our website{{/translate}}
</mj-button>
</mj-column>
</mj-section>

View file

@ -0,0 +1,13 @@
<mj-section>
<mj-column>
<mj-text mj-class="h3">
{{#translate}}Update Your Email Address{{/translate}}
</mj-text>
<mj-text>
{{> subscription_manage_address_form}}
</mj-text>
<mj-button mj-class="button" href="#submit">
{{#translate}}Update Email Address{{/translate}}
</mj-button>
</mj-column>
</mj-section>

View file

@ -0,0 +1,16 @@
<mj-section>
<mj-column>
<mj-text mj-class="h3">
{{#translate}}Update Your Preferences{{/translate}}
</mj-text>
<mj-text>
{{> subscription_manage_form}}<!-- don't indent me! -->
</mj-text>
<mj-button mj-class="button" href="#submit">
{{#translate}}Update Profile{{/translate}}
</mj-button>
<mj-text mj-class="p">
<a href="/subscription/{{lcid}}/unsubscribe/{{cid}}">{{#translate}}Unsubscribe{{/translate}}</a>
</mj-text>
</mj-column>
</mj-section>

View file

@ -0,0 +1,13 @@
<mj-section>
<mj-column>
<mj-text mj-class="h3">
{{#translate}}Online Unsubscription Is Not Possible{{/translate}}
</mj-text>
<mj-text mj-class="p">
{{#translate}}Please contact us at{{/translate}} <a href="mailto:{{contactAddress}}">{{contactAddress}}</a> {{#translate}}to get removed from the list{{/translate}}.
</mj-text>
<mj-button mj-class="button" href="{{homepage}}">
{{#translate}}Return to our website{{/translate}}
</mj-button>
</mj-column>
</mj-section>

View file

@ -0,0 +1,13 @@
<mj-section>
<mj-column>
<mj-text mj-class="h3">
{{#translate}}Subscribe to List{{/translate}}
</mj-text>
<mj-text>
{{> subscription_subscribe_form}}<!-- don't indent me! -->
</mj-text>
<mj-button mj-class="button" href="#submit">
{{#translate}}Subscribe to list{{/translate}}
</mj-button>
</mj-column>
</mj-section>

View file

@ -0,0 +1,13 @@
<mj-section>
<mj-column>
<mj-text mj-class="h3">
{{#translate}}Subscription Confirmed{{/translate}}
</mj-text>
<mj-text mj-class="p">
{{#translate}}Your subscription to our list has been confirmed.{{/translate}}<br>{{#translate}}Thank you for subscribing!{{/translate}}
</mj-text>
<mj-button mj-class="button" href="{{homepage}}">
{{#translate}}Return to our website{{/translate}}
</mj-button>
</mj-column>
</mj-section>

View file

@ -0,0 +1,13 @@
<mj-section>
<mj-column>
<mj-text mj-class="h3">
{{#translate}}Unsubscribe{{/translate}}
</mj-text>
<mj-text>
{{> subscription_unsubscribe_form}}
</mj-text>
<mj-button mj-class="button" href="#submit">
{{#translate}}Unsubscribe{{/translate}}
</mj-button>
</mj-column>
</mj-section>

View file

@ -0,0 +1,13 @@
<mj-section>
<mj-column>
<mj-text mj-class="h3">
{{#translate}}Unsubscribe Successful{{/translate}}
</mj-text>
<mj-text mj-class="p">
{{#translate}}You have been removed from:{{/translate}} {{title}}.
</mj-text>
<mj-button mj-class="button" href="{{homepage}}">
{{#translate}}Return to our website{{/translate}}
</mj-button>
</mj-column>
</mj-section>

View file

@ -0,0 +1,13 @@
<mj-section>
<mj-column>
<mj-text mj-class="h3">
{{#translate}}Profile Updated{{/translate}}
</mj-text>
<mj-text mj-class="p">
{{#translate}}Your profile information has been updated.{{/translate}}
</mj-text>
<mj-button mj-class="button" href="{{homepage}}">
{{#translate}}Return to our website{{/translate}}
</mj-button>
</mj-column>
</mj-section>

View file

@ -0,0 +1,35 @@
<div id="mailtrain-subscription-widget-{{cid}}" class="mailtrain-subscription-widget">
{{#if hasPubkey}}
<form method="post" id="download-pubkey" action="{{publicKeyUrl}}" style="display: none;">
<input type="hidden" name="cid" value="{{cid}}">
</form>
{{/if}}
<h3>{{title}}</h3>
<form class="form" method="post" action="{{subscribeUrl}}">
<input type="hidden" class="tz-detect" name="tz" value="">
<input type="hidden" name="address" value="">
<input type="hidden" class="sub-time" name="sub" value="">
{{> subscription_custom_fields}}
<button type="submit">{{#translate}}Subscribe to list{{/translate}}</button>
</form>
<div class="status"></div>
<div style="display: none;">
<div class="spinner" data-status-template="spinner">
<p>{{#translate}}Sending ...{{/translate}}</p>
</div>
<div class="info" data-status-template="already-subscribed">
<p>{{#translate}}It looks like you are already subscribed to this list.{{/translate}}</p>
</div>
<div class="success" data-status-template="confirm-notice">
<h4>{{#translate}}Almost Finished{{/translate}}</h4>
<p>{{#translate}}We need to confirm your email address. To complete the subscription process, please click the link in the email we just sent you.{{/translate}}</p>
</div>
<div class="error" data-status-template="error">
<p>{message}</p>
</div>
</div>
</div>