Obsoleting some old files
Transition to SPA-style client Basis for Mosaico template editor
This commit is contained in:
parent
7750232716
commit
c85f2d4440
942 changed files with 86311 additions and 967 deletions
|
@ -1 +0,0 @@
|
|||
{{{body}}}
|
|
@ -1,48 +0,0 @@
|
|||
<!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">
|
||||
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
|
||||
<meta name="description" content="{{#translate}}Self hosted email newsletter app{{/translate}}">
|
||||
<meta name="author" content="Andris Reinman">
|
||||
<link rel="icon" href="/favicon.ico">
|
||||
|
||||
<title>Mailtrain</title>
|
||||
|
||||
<!-- Bootstrap core CSS -->
|
||||
<!--
|
||||
<link rel="stylesheet" href="/bootstrap/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
|
||||
-->
|
||||
|
||||
<!-- -->
|
||||
<link rel="stylesheet" href="/bootstrap/themes/flatly.min.css" integrity="sha384-GtWr4mgKIG0HYWHu8/xcLo4DnouVrY7hPd7ZH6T3dobUR8XyHwF1VFWZ1yOVT8wi" crossorigin="anonymous">
|
||||
<!-- -->
|
||||
|
||||
<link rel="stylesheet" href="/css/narrow.css">
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<div class="header clearfix">
|
||||
<h3 class="text-muted">{{campaign.subject}}</h3>
|
||||
</div>
|
||||
|
||||
{{flash_messages}} {{{body}}}
|
||||
|
||||
</div>
|
||||
|
||||
<script src="/javascript/jquery-2.2.1.min.js" integrity="sha384-8C+3bW/ArbXinsJduAjm9O7WNnuOcO+Bok/VScRYikawtvz4ZPrpXtGfKIewM9dK" crossorigin="anonymous"></script>
|
||||
<script src="/bootstrap/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
|
||||
|
||||
|
||||
{{> tracking_scripts}}
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -1 +0,0 @@
|
|||
{{{message}}}
|
|
@ -1,19 +0,0 @@
|
|||
{{{message}}}
|
||||
|
||||
{{#if attachments}}
|
||||
<ul class="list-group">
|
||||
{{#each attachments}}
|
||||
<li class="list-group-item">
|
||||
<span class="badge">{{size}}</span>
|
||||
<form method="post" action="/archive/attachment/download">
|
||||
<input type="hidden" name="_csrf" value="{{../csrfToken}}">
|
||||
<input type="hidden" name="campaign" value="{{../campaign.cid}}" />
|
||||
<input type="hidden" name="list" value="{{../list.cid}}" />
|
||||
<input type="hidden" name="subscription" value="{{../subscription.cid}}" />
|
||||
<input type="hidden" name="attachment" value="{{id}}" />
|
||||
<button type="submit" class="btn btn-link btn-xs"><i class="glyphicon glyphicon-cloud-download"></i> {{filename}}</button>
|
||||
</form>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{/if}}
|
|
@ -1,41 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Blacklist{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{#translate}}Blacklist{{/translate}}</h2>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/blacklist/ajax/add">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="next" value="/blacklist">
|
||||
<div class="form-group">
|
||||
<div class="col-sm-4 col-xs-8">
|
||||
<input type="text" class="form-control input-md" name="email" id="add-email-input" value="" placeholder="{{#translate}}Add email to blacklist{{/translate}}">
|
||||
</div>
|
||||
<button type="submit" class="btn btn-success"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span>{{#translate}}Add{{/translate}}</button>
|
||||
</div>
|
||||
<p class="help-block">A blacklisted email address will not receive messages from any campaign. The blacklist does not apply to transactional messages.</p>
|
||||
</form>
|
||||
|
||||
<form class="form-horizontal" id="delete-email-form" method="post" action="/blacklist/ajax/delete">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="next" value="/blacklist">
|
||||
<input type="hidden" name="email" id="delete-email-input" value="">
|
||||
</form>
|
||||
|
||||
<hr>
|
||||
<div class="table-responsive">
|
||||
<table data-topic-url="/blacklist" data-sort-column="1" data-sort-order="desc" class="table table-bordered table-hover data-table-ajax display nowrap" width="100%" data-row-sort="0,1,0">
|
||||
<thead>
|
||||
<th class="col-md-1">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Email{{/translate}}
|
||||
</th>
|
||||
<th class="col-md-1">
|
||||
|
||||
</th>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
|
@ -1,54 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/campaigns">{{#translate}}Campaigns{{/translate}}</a></li>
|
||||
{{#if parent}}
|
||||
<li><a href="/campaigns/view/{{parent.id}}">{{parent.name}}</a></li>
|
||||
{{/if}}
|
||||
<li><a href="/campaigns/view/{{id}}">{{name}}</a></li>
|
||||
<li class="active">{{#translate}}Blacklisted info{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2><span class="glyphicon glyphicon-inbox" aria-hidden="true"></span> {{name}} <small>{{#translate}}Blacklisted info{{/translate}}</small> <a class="btn btn-default btn-xs" href="/campaigns/view/{{id}}?tab=overview" role="button"><span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span> {{#translate}}View campaign{{/translate}}</a></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
{{#if description}}
|
||||
<div class="well well-sm">{{{description}}}</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="table-responsive">
|
||||
|
||||
<div class="panel panel-info">
|
||||
<!-- Default panel contents -->
|
||||
<div class="panel-heading">{{#translate}}Subscribers who blacklisted by global blacklist:{{/translate}}</div>
|
||||
<div class="panel-body">
|
||||
<div class="table-responsive">
|
||||
<table data-topic-url="/campaigns/status" data-topic-id="{{id}}/5" data-sort-column="1" data-sort-order="asc" class="table table-bordered table-hover data-table-ajax display nowrap" width="100%" data-row-sort="0,1,1,1,0,1,0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="col-md-1">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Address{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}First Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Last Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Reason{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Time{{/translate}}
|
||||
</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -1,54 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/campaigns">{{#translate}}Campaigns{{/translate}}</a></li>
|
||||
{{#if parent}}
|
||||
<li><a href="/campaigns/view/{{parent.id}}">{{parent.name}}</a></li>
|
||||
{{/if}}
|
||||
<li><a href="/campaigns/view/{{id}}">{{name}}</a></li>
|
||||
<li class="active">{{#translate}}Bounced info{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2><span class="glyphicon glyphicon-inbox" aria-hidden="true"></span> {{name}} <small>{{#translate}}Bounced info{{/translate}}</small> <a class="btn btn-default btn-xs" href="/campaigns/view/{{id}}?tab=overview" role="button"><span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span> {{#translate}}View campaign{{/translate}}</a></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
{{#if description}}
|
||||
<div class="well well-sm">{{{description}}}</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="table-responsive">
|
||||
|
||||
<div class="panel panel-info">
|
||||
<!-- Default panel contents -->
|
||||
<div class="panel-heading">{{#translate}}Subscribers who bounced and were unsubscribed:{{/translate}}</div>
|
||||
<div class="panel-body">
|
||||
<div class="table-responsive">
|
||||
<table data-topic-url="/campaigns/status" data-topic-id="{{id}}/3" data-sort-column="1" data-sort-order="asc" class="table table-bordered table-hover data-table-ajax display nowrap" width="100%" data-row-sort="0,1,1,1,0,1,0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="col-md-1">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Address{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}First Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Last Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}SMTP response{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Bounce time{{/translate}}
|
||||
</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -1,46 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Campaigns{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<div class="pull-right">
|
||||
<div class="btn-group">
|
||||
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
{{#translate}}Create Campaign{{/translate}} <span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a href="/campaigns/create"><i class="glyphicon glyphicon-plus"></i> {{#translate}}Regular Campaign{{/translate}}</a></li>
|
||||
<li><a href="/campaigns/create?type=rss"><i class="glyphicon glyphicon-signal"></i> {{#translate}}RSS Campaign{{/translate}}</a></li>
|
||||
<li><a href="/campaigns/create?type=triggered"><i class="glyphicon glyphicon-console"></i> {{#translate}}Triggered Campaign{{/translate}}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h2>{{#translate}}Campaigns{{/translate}}</h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table data-topic-url="/campaigns" data-sort-column="4" data-sort-order="desc" class="table table-bordered table-hover data-table-ajax display nowrap" width="100%" data-row-sort="0,1,0,1,1,0">
|
||||
<thead>
|
||||
<th style="width: 1%">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Description{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Status{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Created{{/translate}}
|
||||
</th>
|
||||
<th style="width: 1%">
|
||||
|
||||
</th>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
|
@ -1,126 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/campaigns">{{#translate}}Campaigns{{/translate}}</a></li>
|
||||
{{#if parent}}
|
||||
<li><a href="/campaigns/view/{{parent.id}}">{{parent.name}}</a></li>
|
||||
{{/if}}
|
||||
<li><a href="/campaigns/view/{{id}}">{{name}}</a></li>
|
||||
<li class="active">{{#translate}}Link info{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2><span class="glyphicon glyphicon-inbox" aria-hidden="true"></span> {{name}} <small>{{#translate}}Link info{{/translate}}</small> <a class="btn btn-default btn-xs" href="/campaigns/view/{{id}}?tab=links" role="button"><span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span> {{#translate}}View campaign{{/translate}}</a></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
{{#if description}}
|
||||
<div class="well well-sm">{{{description}}}</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover">
|
||||
<thead>
|
||||
<th>
|
||||
{{#translate}}URL{{/translate}}
|
||||
</th>
|
||||
<th class="col-md-1">
|
||||
{{#translate}}Clicks{{/translate}}
|
||||
</th>
|
||||
<th class="col-md-1">
|
||||
{{#translate}}% of clicks{{/translate}}
|
||||
</th>
|
||||
<th class="col-md-1">
|
||||
{{#translate}}% of messages{{/translate}}
|
||||
</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="success">
|
||||
{{#if aggregated}}
|
||||
<th>
|
||||
{{#translate}}Aggregated clicks{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{clicks}}
|
||||
</th>
|
||||
<th>
|
||||
–
|
||||
</th>
|
||||
<th>
|
||||
CTR {{clicksRate}}%
|
||||
</th>
|
||||
{{else}}
|
||||
<td>
|
||||
<a href="{{link.url}}">{{link.short}}</a>
|
||||
</td>
|
||||
<td>
|
||||
{{link.clicks}}
|
||||
</td>
|
||||
<td>
|
||||
{{link.relPercentage}}
|
||||
</td>
|
||||
<td>
|
||||
{{link.totalPercentage}}
|
||||
</td>
|
||||
{{/if}}
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<div class="panel panel-info">
|
||||
<!-- Default panel contents -->
|
||||
<div class="panel-heading">{{#if aggregated}}{{#translate}}Subscribers who clicked on a link:{{/translate}}{{else}}{{#translate}}Subscribers who clicked on this link:{{/translate}}{{/if}}</div>
|
||||
<div class="panel-body">
|
||||
{{#unless aggregated}}
|
||||
<div class="table-responsive">
|
||||
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
|
||||
<table class="table table-bordered table-hover data-piechart-ajax display nowrap">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
{{#translate}}Stats by country{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Stats by device type{{/translate}}
|
||||
</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>
|
||||
<div class="data-stats-pie-chart" data-topic-url="/campaigns/clicked" data-column="country" data-topic-id="{{id}}/{{link.id}}"></div>
|
||||
</th>
|
||||
<th>
|
||||
<div class="data-stats-pie-chart" data-topic-url="/campaigns/clicked" data-column="device_type" data-topic-id="{{id}}/{{link.id}}"></div>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
{{/unless}}
|
||||
<div class="table-responsive">
|
||||
<table data-topic-url="/campaigns/clicked" data-topic-id="{{id}}/{{link.id}}" data-sort-column="1" data-sort-order="asc" class="table table-bordered table-hover data-table-ajax display nowrap" width="100%" data-row-sort="0,1,1,1,1,1,0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="col-md-1">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Address{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}First Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Last Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}First click time{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Click count{{/translate}}
|
||||
</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -1,54 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/campaigns">{{#translate}}Campaigns{{/translate}}</a></li>
|
||||
{{#if parent}}
|
||||
<li><a href="/campaigns/view/{{parent.id}}">{{parent.name}}</a></li>
|
||||
{{/if}}
|
||||
<li><a href="/campaigns/view/{{id}}">{{name}}</a></li>
|
||||
<li class="active">{{#translate}}Complained info{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2><span class="glyphicon glyphicon-inbox" aria-hidden="true"></span> {{name}} <small>{{#translate}}Complained info{{/translate}}</small> <a class="btn btn-default btn-xs" href="/campaigns/view/{{id}}?tab=overview" role="button"><span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span> {{#translate}}View campaign{{/translate}}</a></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
{{#if description}}
|
||||
<div class="well well-sm">{{{description}}}</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="table-responsive">
|
||||
|
||||
<div class="panel panel-info">
|
||||
<!-- Default panel contents -->
|
||||
<div class="panel-heading">{{#translate}}Subscribers who complained and were unsubscribed:{{/translate}}</div>
|
||||
<div class="panel-body">
|
||||
<div class="table-responsive">
|
||||
<table data-topic-url="/campaigns/status" data-topic-id="{{id}}/4" data-sort-column="1" data-sort-order="asc" class="table table-bordered table-hover data-table-ajax display nowrap" width="100%" data-row-sort="0,1,1,1,0,1,0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="col-md-1">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Address{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}First Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Last Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}SMTP response{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Complain time{{/translate}}
|
||||
</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -1,107 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/campaigns">{{#translate}}Campaigns{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Create RSS Campaign{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{#translate}}Create RSS Campaign{{/translate}}</h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
{{#translate}}RSS campaign sets up a tracker against selected RSS feed address. Whenever a new entry is found from this feed it is sent to selected list as an email message.{{/translate}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/campaigns/create">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="type" value="rss">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="name" class="col-sm-2 control-label">{{#translate}}Name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control input-lg" name="name" id="name" value="{{name}}" placeholder="{{#translate}}Campaign Name{{/translate}}" autofocus required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="description" class="col-sm-2 control-label">{{#translate}}Description{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control" rows="3" name="description" id="description">{{description}}</textarea>
|
||||
<span class="help-block">{{#translate}}HTML is allowed{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="list" class="col-sm-2 control-label">{{#translate}}List{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" id="list" name="list" required>
|
||||
<option value=""> –– {{#translate}}Select{{/translate}} –– </option>
|
||||
{{#each listItems}}
|
||||
<option value="{{id}}" {{#if selected}} selected {{/if}}>
|
||||
{{name}} <span class="text-muted"> — {{subscribers}} {{#translate}}subscribers{{/translate}}</span>
|
||||
</option>
|
||||
|
||||
{{#if segments}}
|
||||
<optgroup label="{{name}} segments">
|
||||
{{#each segments}}
|
||||
<option value="{{../id}}:{{id}}" {{#if selected}} selected {{/if}}>
|
||||
{{../name}}: {{name}}
|
||||
</option>
|
||||
{{/each}}
|
||||
</optgroup>
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="source-url" class="col-sm-2 control-label">{{#translate}}RSS Feed Url{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="url" class="form-control" name="source-url" id="source-url" value="{{sourceUrl}}" placeholder="http://example.com/rss.php" required>
|
||||
<span class="help-block">{{#translate}}New entries from this RSS URL are sent out to list subscribers as email messages{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<label for="from" class="col-sm-2 control-label">{{#translate}}Email "from name"{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="from" id="from" value="{{from}}" placeholder="{{#translate}}This is the name your emails will come from{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="address" class="col-sm-2 control-label">{{#translate}}Email "from" address{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="email" class="form-control" name="address" id="address" value="{{address}}" placeholder="{{#translate}}This is the address people will send replies to{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-offset-2">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="open-tracking-disabled" value="1" {{#if openTrackingDisabled}} checked {{/if}}> {{#translate}}Disable opened tracking{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-offset-2">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="click-tracking-disabled" value="1" {{#if clickTrackingDisabled}} checked {{/if}}> {{#translate}}Disable clicked tracking{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-plus"></i> {{#translate}}Create RSS Campaign{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,127 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/campaigns">{{#translate}}Campaigns{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Create Triggered Campaign{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{#translate}}Create Triggered Campaign{{/translate}}</h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/campaigns/create">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="type" value="triggered">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="name" class="col-sm-2 control-label">{{#translate}}Name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control input-lg" name="name" id="name" value="{{name}}" placeholder="{{#translate}}Campaign Name{{/translate}}" autofocus required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="description" class="col-sm-2 control-label">{{#translate}}Description{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control" rows="3" name="description" id="description">{{description}}</textarea>
|
||||
<span class="help-block">{{#translate}}HTML is allowed{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="list" class="col-sm-2 control-label">{{#translate}}List{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" id="list" name="list" required>
|
||||
<option value=""> –– {{#translate}}Select{{/translate}} –– </option>
|
||||
{{#each listItems}}
|
||||
<option value="{{id}}" {{#if selected}} selected {{/if}}>
|
||||
{{name}} <span class="text-muted"> — {{subscribers}} {{#translate}}subscribers{{/translate}}</span>
|
||||
</option>
|
||||
|
||||
{{#if segments}}
|
||||
<optgroup label="{{name}} segments">
|
||||
{{#each segments}}
|
||||
<option value="{{../id}}:{{id}}" {{#if selected}} selected {{/if}}>
|
||||
{{../name}}: {{name}}
|
||||
</option>
|
||||
{{/each}}
|
||||
</optgroup>
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="template" class="col-sm-2 control-label">{{#translate}}Template{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
|
||||
<p class="form-control-static">
|
||||
{{#translate}}Select a template:{{/translate}}
|
||||
</p>
|
||||
<div>
|
||||
<select class="form-control" id="template" name="template">
|
||||
<option value=""> –– {{#translate}}Select{{/translate}} –– </option>
|
||||
{{#each templateItems}}
|
||||
<option value="{{id}}" {{#if selected}} selected {{/if}}>
|
||||
{{name}}
|
||||
</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
<span class="help-block">{{#translate}}Selecting a template creates a campaign specific copy from it{{/translate}}</span>
|
||||
</div>
|
||||
<p class="form-control-static">
|
||||
{{#translate}}Or alternatively use an URL as the message content source:{{/translate}}
|
||||
</p>
|
||||
<div>
|
||||
<input type="url" class="form-control" name="source-url" id="source-url" value="{{sourceUrl}}" placeholder="http://example.com/message-render.php">
|
||||
<span class="help-block">{{#translate}}If a message is sent then this URL will be POSTed to using Merge Tags as POST body. Use this if you want to generate the HTML message yourself{{/translate}}</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<label for="from" class="col-sm-2 control-label">{{#translate}}Email "from name"{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="from" id="from" value="{{from}}" placeholder="{{#translate}}This is the name your emails will come from{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="address" class="col-sm-2 control-label">{{#translate}}Email "from" address{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="email" class="form-control" name="address" id="address" value="{{address}}" placeholder="{{#translate}}This is the address people will send replies to{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="subject" class="col-sm-2 control-label">{{#translate}}Email "subject line"{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="subject" id="subject" value="{{subject}}" placeholder="{{#translate}}Keep it relevant and non-spammy{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-offset-2">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="open-tracking-disabled" value="1" {{#if openTrackingDisabled}} checked {{/if}}> {{#translate}}Disable opened tracking{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-offset-2">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="click-tracking-disabled" value="1" {{#if clickTrackingDisabled}} checked {{/if}}> {{#translate}}Disable clicked tracking{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-plus"></i> {{#translate}}Create Campaign{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,133 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/campaigns">{{#translate}}Campaigns{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Create Campaign{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{#translate}}Create Campaign{{/translate}}</h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/campaigns/create">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="type" value="normal">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="name" class="col-sm-2 control-label">{{#translate}}Name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control input-lg" name="name" id="name" value="{{name}}" placeholder="{{#translate}}Campaign Name{{/translate}}" autofocus required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="description" class="col-sm-2 control-label">{{#translate}}Description{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control" rows="3" name="description" id="description">{{description}}</textarea>
|
||||
<span class="help-block">{{#translate}}HTML is allowed{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="list" class="col-sm-2 control-label">{{#translate}}List{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" id="list" name="list" required>
|
||||
<option value=""> –– {{#translate}}Select{{/translate}} –– </option>
|
||||
{{#each listItems}}
|
||||
<option value="{{id}}" {{#if selected}} selected {{/if}}>
|
||||
{{name}} <span class="text-muted"> — {{subscribers}} {{#translate}}subscribers{{/translate}}</span>
|
||||
</option>
|
||||
|
||||
{{#if segments}}
|
||||
<optgroup label="{{name}} segments">
|
||||
{{#each segments}}
|
||||
<option value="{{../id}}:{{id}}" {{#if selected}} selected {{/if}}>
|
||||
{{../name}}: {{name}}
|
||||
</option>
|
||||
{{/each}}
|
||||
</optgroup>
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="template" class="col-sm-2 control-label">{{#translate}}Template{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
|
||||
<p class="form-control-static">
|
||||
{{#translate}}Select a template:{{/translate}}
|
||||
</p>
|
||||
<div>
|
||||
<select class="form-control" id="template" name="template">
|
||||
<option value=""> –– {{#translate}}Select{{/translate}} –– </option>
|
||||
{{#each templateItems}}
|
||||
<option value="{{id}}" {{#if selected}} selected {{/if}}>
|
||||
{{name}}
|
||||
</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
<span class="help-block">{{#translate}}Selecting a template creates a campaign specific copy from it{{/translate}}</span>
|
||||
</div>
|
||||
<p class="form-control-static">
|
||||
{{#translate}}Or alternatively use an URL as the message content source:{{/translate}}
|
||||
</p>
|
||||
<div>
|
||||
<input type="url" class="form-control" name="source-url" id="source-url" value="{{sourceUrl}}" placeholder="http://example.com/message-render.php">
|
||||
<span class="help-block">{{#translate}}If a message is sent then this URL will be POSTed to using Merge Tags as POST body. Use this if you want to generate the HTML message yourself{{/translate}}</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<label for="from" class="col-sm-2 control-label">{{#translate}}Email "from name"{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="from" id="from" value="{{from}}" placeholder="{{#translate}}This is the name your emails will come from{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="address" class="col-sm-2 control-label">{{#translate}}Email "from" address{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="email" class="form-control" name="address" id="address" value="{{address}}" placeholder="{{#translate}}This is the address people will send replies to unless reply-to address is set{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="address" class="col-sm-2 control-label">{{#translate}}Email "reply-to" address{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="email" class="form-control" name="reply-to" id="reply-to" value="{{replyTo}}" placeholder="{{#translate}}If set, this is the address people will send replies to{{/translate}}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="subject" class="col-sm-2 control-label">{{#translate}}Email "subject line"{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="subject" id="subject" value="{{subject}}" placeholder="{{#translate}}Keep it relevant and non-spammy{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-offset-2">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="open-tracking-disabled" value="1" {{#if openTrackingDisabled}} checked {{/if}}> {{#translate}}Disable opened tracking{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-offset-2">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="click-tracking-disabled" value="1" {{#if clickTrackingDisabled}} checked {{/if}}> {{#translate}}Disable clicked tracking{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-plus"></i> {{#translate}}Create Campaign{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,54 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/campaigns">{{#translate}}Campaigns{{/translate}}</a></li>
|
||||
{{#if parent}}
|
||||
<li><a href="/campaigns/view/{{parent.id}}">{{parent.name}}</a></li>
|
||||
{{/if}}
|
||||
<li><a href="/campaigns/view/{{id}}">{{name}}</a></li>
|
||||
<li class="active">{{#translate}}Delivered info{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2><span class="glyphicon glyphicon-inbox" aria-hidden="true"></span> {{name}} <small>{{#translate}}Delivered info{{/translate}}</small> <a class="btn btn-default btn-xs" href="/campaigns/view/{{id}}?tab=overview" role="button"><span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span> {{#translate}}View campaign{{/translate}}</a></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
{{#if description}}
|
||||
<div class="well well-sm">{{{description}}}</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="table-responsive">
|
||||
|
||||
<div class="panel panel-info">
|
||||
<!-- Default panel contents -->
|
||||
<div class="panel-heading">{{#translate}}Subscribers who received the message and did not bounce/unsubscribe:{{/translate}}</div>
|
||||
<div class="panel-body">
|
||||
<div class="table-responsive">
|
||||
<table data-topic-url="/campaigns/status" data-topic-id="{{id}}/1" data-sort-column="1" data-sort-order="asc" class="table table-bordered table-hover data-table-ajax display nowrap" width="100%" data-row-sort="0,1,1,1,0,1,0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="col-md-1">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Address{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}First Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Last Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}SMTP response{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Delivery time{{/translate}}
|
||||
</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -1,139 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/campaigns">{{#translate}}Campaigns{{/translate}}</a></li>
|
||||
{{#if parent}}
|
||||
<li><a href="/campaigns/view/{{parent.id}}">{{parent.name}}</a></li>
|
||||
{{/if}}
|
||||
<li><a href="/campaigns/view/{{id}}">{{name}}</a></li>
|
||||
<li class="active">{{#translate}}Edit RSS Campaign{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{#translate}}Edit RSS Campaign{{/translate}} <a class="btn btn-default btn-xs" href="/campaigns/view/{{id}}" role="button"><span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span> {{#translate}}View campaign{{/translate}}</a></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
{{#translate}}RSS campaign sets up a tracker against selected RSS feed address. Whenever a new entry is found from this feed it is sent to selected list as an email message.{{/translate}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form method="post" class="delete-form" id="campaigns-delete" action="/campaigns/delete">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
</form>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/campaigns/edit">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
|
||||
<fieldset>
|
||||
<legend>
|
||||
{{#translate}}General Settings{{/translate}}
|
||||
</legend>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="name" class="col-sm-2 control-label">{{#translate}}Name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control input-lg" name="name" id="name" value="{{name}}" placeholder="{{#translate}}Campaign Name{{/translate}}" autofocus required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="description" class="col-sm-2 control-label">{{#translate}}Description{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control" rows="3" name="description" id="description">{{description}}</textarea>
|
||||
<span class="help-block">{{#translate}}HTML is allowed{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="list" class="col-sm-2 control-label">{{#translate}}List{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" id="list" name="list" required>
|
||||
<option value=""> –– {{#translate}}Select{{/translate}} –– </option>
|
||||
{{#each listItems}}
|
||||
<option value="{{id}}" {{#if selected}} selected {{/if}}>
|
||||
{{name}} <span class="text-muted"> — {{subscribers}} {{#translate}}subscribers{{/translate}}</span>
|
||||
</option>
|
||||
|
||||
{{#if segments}}
|
||||
<optgroup label="{{name}} segments">
|
||||
{{#each segments}}
|
||||
<option value="{{../id}}:{{id}}" {{#if selected}} selected {{/if}}>
|
||||
{{../name}}: {{name}}
|
||||
</option>
|
||||
{{/each}}
|
||||
</optgroup>
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="template" class="col-sm-2 control-label">{{#translate}}RSS Feed Url{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="url" class="form-control" name="source-url" id="source-url" value="{{sourceUrl}}" placeholder="http://example.com/rss.php" required>
|
||||
<span class="help-block">{{#translate}}New entries from this RSS URL are sent out to list subscribers as email messages{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{> merge_tag_reference}}
|
||||
|
||||
{{#if disableWysiwyg}}
|
||||
{{> codeeditor}}
|
||||
{{else}}
|
||||
{{> summernote}}
|
||||
{{/if}}
|
||||
|
||||
<div class="form-group" style="margin-top: -15px;">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<span class="help-block">{{#translate}}Use special merge tag [RSS_ENTRY] to mark the position for the RSS post content. Additionally you can use any valid merge tag as well.{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<label for="from" class="col-sm-2 control-label">{{#translate}}Email "from name"{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="from" id="from" value="{{from}}" placeholder="{{#translate}}This is the name your emails will come from{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="address" class="col-sm-2 control-label">{{#translate}}Email "from" address{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="email" class="form-control" name="address" id="address" value="{{address}}" placeholder="{{#translate}}This is the address people will send replies to{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-offset-2">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="open-tracking-disabled" value="1" {{#if openTrackingDisabled}} checked {{/if}}> {{#translate}}Disable opened tracking{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-offset-2">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="click-tracking-disabled" value="1" {{#if clickTrackingDisabled}} checked {{/if}}> {{#translate}}Disable clicked tracking{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</fieldset>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="pull-right">
|
||||
<button type="submit" form="campaigns-delete" class="btn btn-danger"><i class="glyphicon glyphicon-remove"></i> {{#translate}}Delete Campaign{{/translate}}</button>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-ok"></i> {{#translate}}Update{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,166 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/campaigns">{{#translate}}Campaigns{{/translate}}</a></li>
|
||||
{{#if parent}}
|
||||
<li><a href="/campaigns/view/{{parent.id}}">{{parent.name}}</a></li>
|
||||
{{/if}}
|
||||
<li><a href="/campaigns/view/{{id}}">{{name}}</a></li>
|
||||
<li class="active">{{#translate}}Edit Triggered Campaign{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{#translate}}Edit Triggered Campaign{{/translate}} <a class="btn btn-default btn-xs" href="/campaigns/view/{{id}}" role="button"><span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span> {{#translate}}View campaign{{/translate}}</a></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form method="post" class="delete-form" id="campaigns-delete" action="/campaigns/delete">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
</form>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/campaigns/edit">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
<input type="hidden" name="type" value="triggered" />
|
||||
|
||||
<div>
|
||||
|
||||
<!-- Nav tabs -->
|
||||
<ul class="nav nav-tabs" role="tablist">
|
||||
<li role="presentation" class="{{#if showGeneral}}active{{/if}}"><a href="#general" aria-controls="general" role="tab" data-toggle="tab">{{#translate}}General{{/translate}}</a></li>
|
||||
<li role="presentation" class="{{#if showTemplate}}active{{/if}}"><a href="#template" aria-controls="template" role="tab" data-toggle="tab">{{#translate}}Template{{/translate}}</a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
<div role="tabpanel" class="tab-pane {{#if showGeneral}}active{{/if}}" id="general">
|
||||
|
||||
<p></p>
|
||||
|
||||
<fieldset>
|
||||
<legend>
|
||||
{{#translate}}General Settings{{/translate}}
|
||||
</legend>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="name" class="col-sm-2 control-label">{{#translate}}Name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control input-lg" name="name" id="name" value="{{name}}" placeholder="{{#translate}}Campaign Name{{/translate}}" autofocus required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="description" class="col-sm-2 control-label">{{#translate}}Description{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control" rows="3" name="description" id="description">{{description}}</textarea>
|
||||
<span class="help-block">{{#translate}}HTML is allowed{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="list" class="col-sm-2 control-label">{{#translate}}List{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" id="list" name="list" required>
|
||||
<option value=""> –– {{#translate}}Select{{/translate}} –– </option>
|
||||
{{#each listItems}}
|
||||
<option value="{{id}}" {{#if selected}} selected {{/if}}>
|
||||
{{name}} <span class="text-muted"> — {{subscribers}} {{#translate}}subscribers{{/translate}}</span>
|
||||
</option>
|
||||
|
||||
{{#if segments}}
|
||||
<optgroup label="{{name}} segments">
|
||||
{{#each segments}}
|
||||
<option value="{{../id}}:{{id}}" {{#if selected}} selected {{/if}}>
|
||||
{{../name}}: {{name}}
|
||||
</option>
|
||||
{{/each}}
|
||||
</optgroup>
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<label for="from" class="col-sm-2 control-label">{{#translate}}Email "from name"{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="from" id="from" value="{{from}}" placeholder="{{#translate}}This is the name your emails will come from{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="address" class="col-sm-2 control-label">{{#translate}}Email "from" address{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="email" class="form-control" name="address" id="address" value="{{address}}" placeholder="{{#translate}}This is the address people will send replies to{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="subject" class="col-sm-2 control-label">{{#translate}}Email "subject line"{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="subject" id="subject" value="{{subject}}" placeholder="{{#translate}}Keep it relevant and non-spammy{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-offset-2">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="open-tracking-disabled" value="1" {{#if openTrackingDisabled}} checked {{/if}}> {{#translate}}Disable opened tracking{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-offset-2">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="click-tracking-disabled" value="1" {{#if clickTrackingDisabled}} checked {{/if}}> {{#translate}}Disable clicked tracking{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</fieldset>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane {{#if showTemplate}}active{{/if}}" id="template">
|
||||
|
||||
<p></p>
|
||||
|
||||
<fieldset>
|
||||
<legend>
|
||||
{{#translate}}Template Settings{{/translate}}
|
||||
</legend>
|
||||
|
||||
{{#if sourceUrl}}
|
||||
<div class="form-group">
|
||||
<label for="source-url" class="col-sm-2 control-label">{{#translate}}Template URL{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="url" class="form-control" name="source-url" id="source-url" value="{{sourceUrl}}" placeholder="http://example.com/message-render.php">
|
||||
<span class="help-block">{{#translate}}If a message is sent then this URL will be POSTed to using Merge Tags as POST body. Use this if you want to generate the HTML message yourself{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
|
||||
{{> merge_tag_reference}}
|
||||
|
||||
{{> plaintext}}
|
||||
|
||||
{{#if disableWysiwyg}}
|
||||
{{> codeeditor}}
|
||||
{{else}}
|
||||
{{> (lookup . 'editorName') }}
|
||||
{{/if}}
|
||||
|
||||
{{/if}}
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="pull-right">
|
||||
<button type="submit" form="campaigns-delete" class="btn btn-danger"><i class="glyphicon glyphicon-remove"></i> {{#translate}}Delete Campaign{{/translate}}</button>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-ok"></i> {{#translate}}Update{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,243 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/campaigns">{{#translate}}Campaigns{{/translate}}</a></li>
|
||||
{{#if parent}}
|
||||
<li><a href="/campaigns/view/{{parent.id}}">{{parent.name}}</a></li>
|
||||
{{/if}}
|
||||
<li><a href="/campaigns/view/{{id}}">{{name}}</a></li>
|
||||
<li class="active">{{#translate}}Edit Campaign{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{#translate}}Edit Campaign{{/translate}} <a class="btn btn-default btn-xs" href="/campaigns/view/{{id}}" role="button"><span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span> {{#translate}}View campaign{{/translate}}</a></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form method="post" class="delete-form" id="campaigns-delete" action="/campaigns/delete">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
</form>
|
||||
|
||||
{{#each attachments}}
|
||||
<form method="post" id="attachment-download-{{id}}" action="/campaigns/attachment/download">
|
||||
<input type="hidden" name="_csrf" value="{{../csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{../id}}" />
|
||||
<input type="hidden" name="attachment" value="{{id}}" />
|
||||
</form>
|
||||
<form method="post" class="delete-form" id="attachment-delete-{{id}}" action="/campaigns/attachment/delete">
|
||||
<input type="hidden" name="_csrf" value="{{../csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{../id}}" />
|
||||
<input type="hidden" name="attachment" value="{{id}}" />
|
||||
</form>
|
||||
{{/each}}
|
||||
|
||||
<form class="form-horizontal" method="post" action="/campaigns/edit">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
|
||||
<div>
|
||||
<!-- Nav tabs -->
|
||||
<ul class="nav nav-tabs" role="tablist">
|
||||
<li role="presentation" class="{{#if showGeneral}}active{{/if}}"><a href="#general" aria-controls="general" role="tab" data-toggle="tab">{{#translate}}General{{/translate}}</a></li>
|
||||
<li role="presentation" class="{{#if showTemplate}}active{{/if}}"><a href="#template" aria-controls="template" role="tab" data-toggle="tab">{{#translate}}Template{{/translate}}</a></li>
|
||||
<li role="presentation" class="{{#if showAttachments}}active{{/if}}"><a href="#attachments" aria-controls="attachments" role="tab" data-toggle="tab">{{#translate}}Attachments{{/translate}}{{#if attachments}} <span class="badge">{{attachments.length}}</span>{{/if}}</a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
<div role="tabpanel" class="tab-pane {{#if showGeneral}}active{{/if}}" id="general">
|
||||
|
||||
<p></p>
|
||||
|
||||
<fieldset>
|
||||
<legend>
|
||||
{{#translate}}General Settings{{/translate}}
|
||||
</legend>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="name" class="col-sm-2 control-label">{{#translate}}Name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control input-lg" name="name" id="name" value="{{name}}" placeholder="{{#translate}}Campaign Name{{/translate}}" autofocus required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="description" class="col-sm-2 control-label">{{#translate}}Description{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control" rows="3" name="description" id="description">{{description}}</textarea>
|
||||
<span class="help-block">{{#translate}}HTML is allowed{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="list" class="col-sm-2 control-label">{{#translate}}List{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" id="list" name="list" required>
|
||||
<option value=""> –– {{#translate}}Select{{/translate}} –– </option>
|
||||
{{#each listItems}}
|
||||
<option value="{{id}}" {{#if selected}} selected {{/if}}>
|
||||
{{name}} <span class="text-muted"> — {{subscribers}} {{#translate}}subscribers{{/translate}}</span>
|
||||
</option>
|
||||
|
||||
{{#if segments}}
|
||||
<optgroup label="{{name}} segments">
|
||||
{{#each segments}}
|
||||
<option value="{{../id}}:{{id}}" {{#if selected}} selected {{/if}}>
|
||||
{{../name}}: {{name}}
|
||||
</option>
|
||||
{{/each}}
|
||||
</optgroup>
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<label for="from" class="col-sm-2 control-label">{{#translate}}Email "from name"{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="from" id="from" value="{{from}}" placeholder="{{#translate}}This is the name your emails will come from{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="address" class="col-sm-2 control-label">{{#translate}}Email "from" address{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="email" class="form-control" name="address" id="address" value="{{address}}" placeholder="{{#translate}}This is the address people will send replies to unless reply-to address is set{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="reply-to" class="col-sm-2 control-label">{{#translate}}Email "reply-to" address{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="email" class="form-control" name="reply-to" id="reply-to" value="{{replyTo}}" placeholder="{{#translate}}If set, this is the address people will send replies to{{/translate}}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="subject" class="col-sm-2 control-label">{{#translate}}Email "subject line"{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="subject" id="subject" value="{{subject}}" placeholder="{{#translate}}Keep it relevant and non-spammy{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-offset-2">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="open-tracking-disabled" value="1" {{#if openTrackingDisabled}} checked {{/if}}> {{#translate}}Disable opened tracking{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-offset-2">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="click-tracking-disabled" value="1" {{#if clickTrackingDisabled}} checked {{/if}}> {{#translate}}Disable clicked tracking{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane {{#if showTemplate}}active{{/if}}" id="template">
|
||||
<p></p>
|
||||
|
||||
<fieldset>
|
||||
<legend>
|
||||
{{#translate}}Template Settings{{/translate}}
|
||||
</legend>
|
||||
|
||||
{{#if sourceUrl}}
|
||||
<div class="form-group">
|
||||
<label for="source-url" class="col-sm-2 control-label">{{#translate}}Template URL{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="url" class="form-control" name="source-url" id="source-url" value="{{sourceUrl}}" placeholder="http://example.com/message-render.php">
|
||||
<span class="help-block">{{#translate}}If a message is sent then this URL will be POSTed to using Merge Tags as POST body. Use this if you want to generate the HTML message yourself{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
|
||||
{{> merge_tag_reference}}
|
||||
|
||||
{{> plaintext}}
|
||||
|
||||
{{#if disableWysiwyg}}
|
||||
{{> codeeditor}}
|
||||
{{else}}
|
||||
{{> (lookup . 'editorName') }}
|
||||
{{/if}}
|
||||
|
||||
{{/if}}
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<div role="tabpanel" class="tab-pane {{#if showAttachments}}active{{/if}}" id="attachments">
|
||||
|
||||
<p></p>
|
||||
|
||||
|
||||
<fieldset>
|
||||
<legend>
|
||||
{{#translate}}Attachments{{/translate}}
|
||||
</legend>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover">
|
||||
<thead>
|
||||
<th class="col-md-1">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}File{{/translate}}
|
||||
</th>
|
||||
<th class="col-md-1">
|
||||
{{#translate}}Size{{/translate}}
|
||||
</th>
|
||||
<th class="col-md-1">
|
||||
|
||||
</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#if attachments}}
|
||||
{{#each attachments}}
|
||||
<tr>
|
||||
<td>
|
||||
{{index}}
|
||||
</td>
|
||||
<td>
|
||||
<button type="submit" form="attachment-download-{{id}}" class="btn btn-link btn-xs"><i class="glyphicon glyphicon-cloud-download"></i> {{filename}}</button>
|
||||
</td>
|
||||
<td>
|
||||
{{size}}
|
||||
</td>
|
||||
<td>
|
||||
<button type="submit" form="attachment-delete-{{id}}" class="btn btn-danger btn-xs"><i class="glyphicon glyphicon-remove"></i> Delete</button>
|
||||
</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
{{else}}
|
||||
<tr>
|
||||
<td colspan="4">
|
||||
{{#translate}}No data available in table{{/translate}}
|
||||
</td>
|
||||
</tr>
|
||||
{{/if}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="pull-right">
|
||||
<a class="btn btn-info btn-sm" href="/campaigns/attachment/{{id}}" role="button"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> {{#translate}}Add Attachment{{/translate}}</a>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<hr/>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="pull-right">
|
||||
<button type="submit" form="campaigns-delete" class="btn btn-danger"><i class="glyphicon glyphicon-remove"></i> {{#translate}}Delete Campaign{{/translate}}</button>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-ok"></i> {{#translate}}Update{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,78 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/campaigns">{{#translate}}Campaigns{{/translate}}</a></li>
|
||||
{{#if parent}}
|
||||
<li><a href="/campaigns/view/{{parent.id}}">{{parent.name}}</a></li>
|
||||
{{/if}}
|
||||
<li><a href="/campaigns/view/{{id}}">{{name}}</a></li>
|
||||
<li class="active">{{#translate}}Opened info{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2><span class="glyphicon glyphicon-inbox" aria-hidden="true"></span> {{name}} <small>{{#translate}}Opened info{{/translate}}</small> <a class="btn btn-default btn-xs" href="/campaigns/view/{{id}}?tab=overview" role="button"><span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span> {{#translate}}View campaign{{/translate}}</a></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
{{#if description}}
|
||||
<div class="well well-sm">{{{description}}}</div>
|
||||
{{/if}}
|
||||
|
||||
|
||||
<div class="table-responsive">
|
||||
|
||||
<div class="panel panel-info">
|
||||
<!-- Default panel contents -->
|
||||
<div class="panel-heading">{{#translate}}Subscribers who opened this message:{{/translate}}</div>
|
||||
<div class="panel-body">
|
||||
<div class="table-responsive">
|
||||
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
|
||||
<table class="table table-bordered table-hover data-piechart-ajax display nowrap">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
{{#translate}}Stats by country{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Stats by device type{{/translate}}
|
||||
</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>
|
||||
<div class="data-stats-pie-chart" data-topic-url="/campaigns/clicked" data-column="country" data-topic-id="{{id}}/-1"></div>
|
||||
</th>
|
||||
<th>
|
||||
<div class="data-stats-pie-chart" data-topic-url="/campaigns/clicked" data-column="device_type" data-topic-id="{{id}}/-1"></div>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table data-topic-url="/campaigns/clicked" data-topic-id="{{id}}/-1" data-sort-column="1" data-sort-order="asc" class="table table-bordered table-hover data-table-ajax display nowrap" width="100%" data-row-sort="0,1,1,1,1,1,0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="col-md-1">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Address{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}First Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Last Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}First open{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Opened count{{/translate}}
|
||||
</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -1,54 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/campaigns">{{#translate}}Campaigns{{/translate}}</a></li>
|
||||
{{#if parent}}
|
||||
<li><a href="/campaigns/view/{{parent.id}}">{{parent.name}}</a></li>
|
||||
{{/if}}
|
||||
<li><a href="/campaigns/view/{{id}}">{{name}}</a></li>
|
||||
<li class="active">{{#translate}}Unsubscribed info{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2><span class="glyphicon glyphicon-inbox" aria-hidden="true"></span> {{name}} <small>{{#translate}}Unsubscribed info{{/translate}}</small> <a class="btn btn-default btn-xs" href="/campaigns/view/{{id}}?tab=overview" role="button"><span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span> {{#translate}}View campaign{{/translate}}</a></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
{{#if description}}
|
||||
<div class="well well-sm">{{{description}}}</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="table-responsive">
|
||||
|
||||
<div class="panel panel-info">
|
||||
<!-- Default panel contents -->
|
||||
<div class="panel-heading">{{#translate}}Subscribers who unsubscribed:{{/translate}}</div>
|
||||
<div class="panel-body">
|
||||
<div class="table-responsive">
|
||||
<table data-topic-url="/campaigns/status" data-topic-id="{{id}}/2" data-sort-column="1" data-sort-order="asc" class="table table-bordered table-hover data-table-ajax display nowrap" width="100%" data-row-sort="0,1,1,1,0,1,0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="col-md-1">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Address{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}First Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Last Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}SMTP response{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Unsubscribed{{/translate}}
|
||||
</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -1,31 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/campaigns">{{#translate}}Campaigns{{/translate}}</a></li>
|
||||
{{#if parent}}
|
||||
<li><a href="/campaigns/view/{{parent.id}}">{{parent.name}}</a></li>
|
||||
{{/if}}
|
||||
<li><a href="/campaigns/view/{{id}}">{{name}}</a></li>
|
||||
<li><a href="/campaigns/edit/{{id}}?tab=attachments">{{#translate}}Edit Campaign{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Add Attachment{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{#translate}}Edit Campaign{{/translate}} <a class="btn btn-default btn-xs" href="/campaigns/view/{{id}}" role="button"><span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span> {{#translate}}View campaign{{/translate}}</a></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/campaigns/attachment" enctype="multipart/form-data">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
<div class="form-group">
|
||||
<label for="attachment" class="col-sm-2 control-label">Upload new</label>
|
||||
<div class="col-sm-6">
|
||||
<input type="file" class="form-control" name="attachment" id="attachment" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-cloud-upload"></i> {{#translate}}Upload{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,463 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/campaigns">{{#translate}}Campaigns{{/translate}}</a></li>
|
||||
{{#if parent}}
|
||||
<li><a href="/campaigns/view/{{parent.id}}">{{parent.name}}</a></li>
|
||||
{{/if}}
|
||||
<li class="active">{{name}}</li>
|
||||
</ol>
|
||||
|
||||
<div class="pull-right">
|
||||
<a class="btn btn-primary" href="/campaigns/edit/{{id}}" role="button"><span class="glyphicon glyphicon-wrench" aria-hidden="true"></span> {{#translate}}Edit Campaign{{/translate}}</a>
|
||||
</div>
|
||||
|
||||
<h2><span class="glyphicon glyphicon-inbox" aria-hidden="true"></span> {{name}}</h2>
|
||||
|
||||
<hr>
|
||||
|
||||
{{#if description}}
|
||||
<div class="well well-sm">{{{description}}}</div>
|
||||
{{/if}}
|
||||
|
||||
<!-- Nav tabs -->
|
||||
<ul class="nav nav-tabs" role="tablist">
|
||||
<li role="presentation" class="{{#if showOverview}}active{{/if}}"><a href="#overview" aria-controls="overview" role="tab" data-toggle="tab">{{#translate}}Overview{{/translate}}</a></li>
|
||||
{{#if links}}
|
||||
<li role="presentation" class="{{#if showLinks}}active{{/if}}"><a href="#links" aria-controls="links" role="tab" data-toggle="tab">{{#translate}}Links{{/translate}}</a></li>
|
||||
{{/if}}
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
<div role="tabpanel" class="tab-pane {{#if showOverview}}active{{/if}}" id="overview">
|
||||
|
||||
<p></p>
|
||||
|
||||
<dl class="dl-horizontal">
|
||||
{{#if list}}
|
||||
<dt>{{#translate}}List{{/translate}}</dt>
|
||||
<dd>
|
||||
{{#if segment}}
|
||||
<a href="/lists/view/{{list.id}}?segment={{segment.id}}">{{list.name}}: {{segment.name}}</a>
|
||||
{{else}}
|
||||
<a href="/lists/view/{{list.id}}">{{list.name}}</a>
|
||||
{{/if}}
|
||||
</dd>
|
||||
|
||||
<dt>List subscribers</dt>
|
||||
<dd>
|
||||
{{#if segment}}
|
||||
{{segment.subscribers}}
|
||||
{{else}}
|
||||
{{list.subscribers}}
|
||||
{{/if}}
|
||||
</dd>
|
||||
{{/if}}
|
||||
|
||||
{{#if isRss}}
|
||||
<dt>{{#translate}}Feed URL{{/translate}}</dt>
|
||||
<dd><a href="{{sourceUrl}}">{{sourceUrl}}</a></dd>
|
||||
<dt>{{#translate}}Last check{{/translate}}</dt>
|
||||
<dd>
|
||||
{{#if lastCheck}}<span class="datestring" data-date="{{lastCheck}}" title="{{lastCheck}}">{{lastCheck}}</span>{{else}}
|
||||
{{#translate}}Not yet checked{{/translate}}{{/if}}
|
||||
{{#unless isActive}}<span class="text-muted">({{#translate}}activate campaign to start checking feed for new messages{{/translate}})</span>{{/unless}}
|
||||
</dd>
|
||||
{{#if checkStatus}}
|
||||
<dt>{{#translate}}RSS status{{/translate}}</dt>
|
||||
<dd>{{checkStatus}}</dd>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
{{#if from}}
|
||||
<dt>{{#translate}}Email "from name"{{/translate}}</dt>
|
||||
<dd>{{from}}</dd>
|
||||
{{/if}}
|
||||
|
||||
{{#if address}}
|
||||
<dt>{{#translate}}Email "from" address{{/translate}}</dt>
|
||||
<dd>{{address}}</dd>
|
||||
{{/if}}
|
||||
|
||||
{{#if replyTo}}
|
||||
<dt>{{#translate}}Email "reply-to" address{{/translate}}</dt>
|
||||
<dd>{{replyTo}}</dd>
|
||||
{{/if}}
|
||||
|
||||
{{#if subject}}
|
||||
<dt>{{#translate}}Email "subject line"{{/translate}}</dt>
|
||||
<dd>{{subject}}</dd>
|
||||
{{/if}}
|
||||
|
||||
{{#unless isRss}}
|
||||
|
||||
<dt>{{#translate}}Preview campaign as{{/translate}}</dt>
|
||||
<dd>
|
||||
<form method="post" action="/campaigns/preview/{{id}}" class="form-inline">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="campaign" value="{{cid}}">
|
||||
<input type="hidden" name="list" value="{{list.cid}}">
|
||||
<input type="hidden" name="listId" value="{{list.id}}">
|
||||
<div class="form-group">
|
||||
<select name="subscriber" class="form-control" required>
|
||||
{{#each testUsers}}
|
||||
<option value="{{cid}}">{{displayName}}</option>
|
||||
{{/each}}
|
||||
{{#if testUsers}}
|
||||
<optgroup label="Actions">
|
||||
<option value="_create">{{#translate}}Add new test user{{/translate}}…</option>
|
||||
</optgroup>
|
||||
{{else}}
|
||||
<option value="_create">{{#translate}}No test users yet, create one here{{/translate}}…</option>
|
||||
{{/if}}
|
||||
</select>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-default">{{#translate}}Go{{/translate}}</button>
|
||||
</form>
|
||||
</dd>
|
||||
|
||||
{{/unless}}
|
||||
</dl>
|
||||
|
||||
<hr />
|
||||
|
||||
<dl class="dl-horizontal">
|
||||
{{#unless isIdling}}
|
||||
|
||||
<dt>{{#translate}}Delivered{{/translate}} <a href="/campaigns/status/{{id}}/delivered" title="{{#translate}}List subscribers who received this message{{/translate}}"><span class="glyphicon glyphicon-zoom-in" aria-hidden="true"></span></a></dt>
|
||||
<dd>
|
||||
<div style="margin-bottom: 20px;">
|
||||
{{delivered}}
|
||||
</div>
|
||||
</dd>
|
||||
|
||||
<dt>{{#translate}}Blacklisted{{/translate}} <a href="/campaigns/status/{{id}}/blacklisted" title="{{#translate}}List subscribers who blacklisted by global blacklist{{/translate}}"><span class="glyphicon glyphicon-zoom-in" aria-hidden="true"></span></a></dt>
|
||||
<dd>
|
||||
<div style="margin-bottom: 20px;">
|
||||
{{blacklisted}}
|
||||
</div>
|
||||
</dd>
|
||||
|
||||
<dt>{{#translate}}Bounced{{/translate}} <a href="/campaigns/status/{{id}}/bounced" title="{{#translate}}List subscribers who bounced{{/translate}}"><span class="glyphicon glyphicon-zoom-in" aria-hidden="true"></span></a></dt>
|
||||
<dd>
|
||||
<div class="progress">
|
||||
<div class="progress-bar progress-bar-info" role="progressbar" aria-valuenow="{{bounceRate}}" aria-valuemin="0" aria-valuemax="100" style="min-width: 6em; width: {{bounceRate}}%;">
|
||||
{{bounced}} ({{bounceRate}}%)
|
||||
</div>
|
||||
</div>
|
||||
</dd>
|
||||
|
||||
<dt>{{#translate}}Complaints{{/translate}} <a href="/campaigns/status/{{id}}/complained" title="{{#translate}}List subscribers who complained for this message{{/translate}}"><span class="glyphicon glyphicon-zoom-in" aria-hidden="true"></span></a></dt>
|
||||
<dd>
|
||||
<div class="progress">
|
||||
<div class="progress-bar progress-bar-danger" role="progressbar" aria-valuenow="{{complaintRate}}" aria-valuemin="0" aria-valuemax="100" style="min-width: 6em; width: {{complaintRate}}%;">
|
||||
{{complained}} ({{complaintRate}}%)
|
||||
</div>
|
||||
</div>
|
||||
</dd>
|
||||
|
||||
<dt>{{#translate}}Unsubscribed{{/translate}} <a href="/campaigns/status/{{id}}/unsubscribed" title="{{#translate}}List subscribers who unsubscribed after this message{{/translate}}"><span class="glyphicon glyphicon-zoom-in" aria-hidden="true"></span></a></dt>
|
||||
<dd>
|
||||
<div class="progress">
|
||||
<div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="{{unsubscribeRate}}" aria-valuemin="0" aria-valuemax="100" style="min-width: 6em; width: {{unsubscribeRate}}%;">
|
||||
{{unsubscribed}} ({{unsubscribeRate}}%)
|
||||
</div>
|
||||
</div>
|
||||
</dd>
|
||||
|
||||
{{#unless openTrackingDisabled}}
|
||||
|
||||
<dt>{{#translate}}Opened{{/translate}} <a href="/campaigns/opened/{{id}}" title="{{#translate}}List subscribers who opened this message{{/translate}}"><span class="glyphicon glyphicon-zoom-in" aria-hidden="true"></span></a></dt>
|
||||
<dd>
|
||||
<div class="progress">
|
||||
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="{{openRate}}" aria-valuemin="0" aria-valuemax="100" style="min-width: 6em; width: {{openRate}}%;">
|
||||
{{opened}} ({{openRate}}%)
|
||||
</div>
|
||||
</div>
|
||||
</dd>
|
||||
{{/unless}}
|
||||
{{#unless clickTrackingDisabled}}
|
||||
<dt>{{#translate}}Clicked{{/translate}} <a href="/campaigns/clicked/{{id}}/all" title="{{#translate}}List subscribers who clicked on a link{{/translate}}"> <span class="glyphicon glyphicon-zoom-in" aria-hidden="true"></span></a></dt>
|
||||
<dd>
|
||||
<div class="progress">
|
||||
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="{{clicksRate}}" aria-valuemin="0" aria-valuemax="100" style="min-width: 6em; width: {{clicksRate}}%;">
|
||||
{{clicks}} ({{clicksRate}}%)
|
||||
</div>
|
||||
</div>
|
||||
</dd>
|
||||
|
||||
{{/unless}}
|
||||
{{/unless}}
|
||||
</dl>
|
||||
|
||||
{{#if isNormal}}
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
{{#if isIdling}}
|
||||
<form class="form-inline confirm-submit" data-confirm-message="{{#translate}}Are you sure? This action would start sending messages to the selected list{{/translate}}" method="post" action="/campaigns/send">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
|
||||
<div class="pull-right">
|
||||
<div class="form-group">
|
||||
<p class="form-control-static">{{#translate}}Delay sending{{/translate}}</p>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="input-group">
|
||||
<input type="number" class="form-control" name="delay-hours" id="delay-hours" placeholder="0">
|
||||
<div class="input-group-addon"> {{#translate}}hours{{/translate}}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="input-group">
|
||||
<input type="number" class="form-control" name="delay-minutes" id="delay-minutes" placeholder="0">
|
||||
<div class="input-group-addon"> {{#translate}}minutes{{/translate}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-success"><span class="glyphicon glyphicon-send" aria-hidden="true"></span> {{#translate}}Send to subscribers:{{/translate}}
|
||||
{{#if segment}}
|
||||
{{segment.subscribers}}
|
||||
{{else}}
|
||||
{{list.subscribers}}
|
||||
{{/if}}</button>
|
||||
</form>
|
||||
{{/if}}
|
||||
|
||||
{{#if isSending}}
|
||||
<!-- Indicate that this page needs refreshing after 20s. -->
|
||||
<div class="page-refresh" data-interval="20"></div>
|
||||
{{#if isScheduled}}
|
||||
<div class="pull-right">
|
||||
<form class="form-horizontal confirm-submit" data-confirm-message="{{#translate}}Are you sure? This action would reset scheduling{{/translate}}" method="post" action="/campaigns/reset">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
|
||||
<button type="submit" class="btn btn-danger"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span> {{#translate}}Cancel{{/translate}}
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
<h4>{{#translate}}Sending scheduled{{/translate}} <span class="datestring text-info" data-date="{{scheduled}}" title="{{scheduled}}">{{scheduled}}</span></h4>
|
||||
{{else}}
|
||||
<div class="pull-right">
|
||||
<form class="form-horizontal" method="post" action="/campaigns/pause">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
|
||||
<button type="submit" class="btn btn-info"><span class="glyphicon glyphicon-pause" aria-hidden="true"></span> {{#translate}}Pause{{/translate}}
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
<h4><span class="glyphicon glyphicon-refresh spinning"></span> {{#translate}}Sending{{/translate}}…</h4>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
{{#if isPaused}}
|
||||
<div class="pull-right">
|
||||
<form id="resume-sending" class="form-horizontal confirm-submit" data-confirm-message="{{#translate}}Are you sure? This action would resume sending messages to the selected list{{/translate}}" method="post" action="/campaigns/resume">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
</form>
|
||||
|
||||
<form id="reset-sending" class="confirm-submit" data-confirm-message="{{#translate}}Are you sure? This action would reset all stats about current progress{{/translate}}" method="post" action="/campaigns/reset">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
</form>
|
||||
|
||||
<button type="submit" form="resume-sending" class="btn btn-info"><span class="glyphicon glyphicon-play" aria-hidden="true"></span> {{#translate}}Resume{{/translate}}
|
||||
</button>
|
||||
|
||||
<button type="submit" form="reset-sending" class="btn btn-danger"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span> {{#translate}}Reset{{/translate}}
|
||||
</button>
|
||||
</div>
|
||||
<h4>Sending paused</h4>
|
||||
{{/if}}
|
||||
|
||||
{{#if isFinished}}
|
||||
<div class="pull-right">
|
||||
<form id="continue-sending" class="confirm-submit" data-confirm-message="{{#translate}}Are you sure? This action would resume sending messages to the selected list{{/translate}}" method="post" action="/campaigns/send">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
</form>
|
||||
|
||||
<form id="reset-sending" class="confirm-submit" data-confirm-message="{{#translate}}Are you sure? This action would reset all stats about current progress{{/translate}}" method="post" action="/campaigns/reset">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
</form>
|
||||
|
||||
<button type="submit" form="continue-sending" class="btn btn-info"><span class="glyphicon glyphicon-play" aria-hidden="true"></span> {{#translate}}Continue{{/translate}}
|
||||
</button>
|
||||
|
||||
<button type="submit" form="reset-sending" class="btn btn-danger"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span> {{#translate}}Reset{{/translate}}
|
||||
</button>
|
||||
|
||||
</div>
|
||||
<h4>{{#translate}}All messages sent! Hit "Continue" if you you want to send this campaign to new subscribers{{/translate}}</h4>
|
||||
{{/if}}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if isRss}}
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
{{#if isActive}}
|
||||
<div class="pull-right">
|
||||
<form id="inactivate-sending" class="confirm-submit" data-confirm-message="{{#translate}}Are you sure? This action would pause sending new entries in RSS feed as email messages to the selected list{{/translate}}" method="post" action="/campaigns/inactivate">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
</form>
|
||||
|
||||
<button type="submit" form="inactivate-sending" class="btn btn-warning"><span class="glyphicon glyphicon-pause" aria-hidden="true"></span> {{#translate}}Pause{{/translate}}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{{#translate}}Campaign status:{{/translate}} <span class="label label-primary">{{#translate}}ACTIVE{{/translate}}</span>
|
||||
{{else}}
|
||||
<div class="pull-right">
|
||||
<form id="activate-sending" class="confirm-submit" data-confirm-message="{{#translate}}Are you sure? This action would start sending new entries in RSS feed as email messages to the selected list{{/translate}}" method="post" action="/campaigns/activate">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
</form>
|
||||
|
||||
<button type="submit" form="activate-sending" class="btn btn-info"><span class="glyphicon glyphicon-play" aria-hidden="true"></span> {{#translate}}Activate{{/translate}}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{{#translate}}Campaign status:{{/translate}} <span class="label label-default">{{#translate}}INACTIVE{{/translate}}</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if isTriggered}}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
{{#translate}}This is a triggered campaign. Messages are only sent to subscribers that hit some trigger that invokes this campaign{{/translate}} (<a href="/triggers">{{#translate}}see more{{/translate}}</a>)
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
</div>
|
||||
{{#if links}}
|
||||
{{#unless trackingDisabled}}
|
||||
<div role="tabpanel" class="tab-pane {{#if showLinks}}active{{/if}}" id="links">
|
||||
|
||||
<p></p>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover">
|
||||
<thead>
|
||||
<th class="col-md-1">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}URL{{/translate}}
|
||||
</th>
|
||||
<th class="col-md-1">
|
||||
{{#translate}}Clicks{{/translate}}
|
||||
</th>
|
||||
<th class="col-md-1">
|
||||
{{#translate}}% of clicks{{/translate}}
|
||||
</th>
|
||||
<th class="col-md-1">
|
||||
{{#translate}}% of messages{{/translate}}
|
||||
</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#if links}}
|
||||
{{#each links}}
|
||||
<tr>
|
||||
<td>
|
||||
{{index}}
|
||||
</td>
|
||||
<td>
|
||||
<a href="{{url}}">{{short}}</a>
|
||||
</td>
|
||||
<td>
|
||||
<div class="pull-right">
|
||||
<a href="/campaigns/clicked/{{../id}}/{{id}}" title="{{#translate}}List subscribers who clicked this link{{/translate}}"><span class="glyphicon glyphicon-zoom-in" aria-hidden="true"></span></a>
|
||||
</div>
|
||||
{{clicks}}
|
||||
</td>
|
||||
<td>
|
||||
{{relPercentage}}
|
||||
</td>
|
||||
<td>
|
||||
{{totalPercentage}}
|
||||
</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
{{else}}
|
||||
<tr>
|
||||
<td colspan="5">
|
||||
{{#translate}}No data available in table{{/translate}}
|
||||
</td>
|
||||
</tr>
|
||||
{{/if}}
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>
|
||||
{{#translate}}Aggregated clicks{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
<div class="pull-right">
|
||||
<a href="/campaigns/clicked/{{id}}/all" title="{{#translate}}List subscribers who clicked on a link{{/translate}}"><span class="glyphicon glyphicon-zoom-in" aria-hidden="true"></span></a>
|
||||
</div>
|
||||
{{clicks}}
|
||||
</th>
|
||||
<th>
|
||||
–
|
||||
</th>
|
||||
<th>
|
||||
CTR {{clicksRate}}%
|
||||
</th>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
|
||||
<p class="text-muted">
|
||||
{{#translate}}Clicks are counted as unique subscribers that clicked on a specific link or on any link (in aggregated view){{/translate}}
|
||||
</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{{/unless}}
|
||||
{{/if}}
|
||||
|
||||
</div>
|
||||
|
||||
{{#if isRss}}
|
||||
<div class="table-responsive">
|
||||
<div class="well text-info">
|
||||
{{#translate}}If a new entry is found from campaign feed a new subcampaign is created of that entry and it will be listed here{{/translate}}
|
||||
</div>
|
||||
<table data-topic-url="/campaigns" data-sort-column="4" data-sort-order="desc" class="table table-bordered table-hover data-table-ajax display nowrap" data-topic-args="parent={{id}}" width="100%" data-row-sort="0,1,0,1,1,0">
|
||||
<thead>
|
||||
<th class="col-md-1">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Description{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Status{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Created{{/translate}}
|
||||
</th>
|
||||
<th class="col-md-1">
|
||||
|
||||
</th>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
{{/if}}
|
|
@ -1,18 +0,0 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>{{title}}</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h3>{{#translate}}Change your password{{/translate}}</h3>
|
||||
|
||||
<p>{{#translate}}We have received a password change request for your Mailtrain account:{{/translate}} <strong>{{username}}</strong>.</p>
|
||||
|
||||
<p><a href="{{confirmUrl}}" role="button">{{#translate}}Reset password{{/translate}}</a></p>
|
||||
|
||||
<p>{{#translate}}If you did not ask to change your password, then you can ignore this email and your password will not be changed.{{/translate}}</p>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -1,9 +0,0 @@
|
|||
{{{title}}}
|
||||
{{#translate}}Change your password{{/translate}}
|
||||
====================
|
||||
|
||||
{{#translate}}We have received a password change request for your Mailtrain account:{{/translate}} ({{{username}}}).
|
||||
|
||||
{{#translate}}Reset password{{/translate}}: {{{confirmUrl}}}
|
||||
|
||||
{{#translate}}If you did not ask to change your password, then you can ignore this email and your password will not be changed.{{/translate}}
|
|
@ -1,24 +0,0 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div>
|
||||
[RSS_ENTRY]
|
||||
</div>
|
||||
|
||||
<p>
|
||||
<a href="[LINK_PREFERENCES]" style="color: #666666; text-decoration: none;">{{#translate}}Preferences{{/translate}}</a>
|
||||
<span style="color: #444444;"> | </span>
|
||||
<a href="[LINK_UNSUBSCRIBE]" style="color: #666666; text-decoration: none;">{{#translate}}Unsubscribe{{/translate}}</a>
|
||||
<span style="color: #444444;"> | </span>
|
||||
<a href="[LINK_BROWSER]" style="color: #666666; text-decoration: none;">{{#translate}}View this email in your browser{{/translate}}</a>
|
||||
</p>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -1,32 +0,0 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<p>{{#translate}}Hey [FIRST_NAME/Customer],{{/translate}}</p>
|
||||
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed varius, leo a ullamcorper feugiat, ante purus sodales justo, a faucibus libero lacus a est.</p>
|
||||
|
||||
<p>Sed varius, leo a ullamcorper feugiat, ante purus sodales justo, a faucibus libero lacus a est. Aenean at mollis ipsum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed varius, leo a ullamcorper feugiat, ante purus sodales justo, a faucibus
|
||||
libero lacus a est.</p>
|
||||
|
||||
<p>{{#translate}}Cheers,{{/translate}}
|
||||
<br/> {{defaultSender}}
|
||||
</p>
|
||||
<p>
|
||||
{{defaultPostaddress}}
|
||||
<br/>
|
||||
<a href="[LINK_PREFERENCES]" style="color: #666666; text-decoration: none;">{{#translate}}Preferences{{/translate}}</a>
|
||||
<span style="color: #444444;"> | </span>
|
||||
<a href="[LINK_UNSUBSCRIBE]" style="color: #666666; text-decoration: none;">{{#translate}}Unsubscribe{{/translate}}</a>
|
||||
<span style="color: #444444;"> | </span>
|
||||
<a href="[LINK_BROWSER]" style="color: #666666; text-decoration: none;">{{#translate}}View this email in your browser{{/translate}}</a>
|
||||
</p>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -1,14 +0,0 @@
|
|||
{{#translate}}Hey [FIRST_NAME/Customer],{{/translate}}
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed varius, leo a ullamcorper feugiat, ante purus sodales justo, a faucibus libero lacus a est.
|
||||
|
||||
Sed varius, leo a ullamcorper feugiat, ante purus sodales justo, a faucibus libero lacus a est. Aenean at mollis ipsum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed varius, leo a ullamcorper feugiat, ante purus sodales justo, a faucibus libero lacus a est.
|
||||
|
||||
{{#translate}}Cheers,{{/translate}}
|
||||
{{defaultSender}}
|
||||
|
||||
{{defaultPostaddress}}
|
||||
|
||||
{{#translate}}Preferences{{/translate}}: [LINK_PREFERENCES]
|
||||
{{#translate}}Unsubscribe{{/translate}}: [LINK_UNSUBSCRIBE]
|
||||
{{#translate}}View this email in your browser{{/translate}}: [LINK_BROWSER]
|
|
@ -1,481 +0,0 @@
|
|||
<style>
|
||||
html,
|
||||
body {
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
iframe {
|
||||
user-select: none;
|
||||
-webkit-user-select: none;
|
||||
}
|
||||
|
||||
#gjs-wrapper {
|
||||
position: absolute;
|
||||
top: 34px;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#toast-container {
|
||||
top: auto !important;
|
||||
bottom: 5px;
|
||||
right: 325px;
|
||||
font-size: 13px;
|
||||
font-weight: lighter;
|
||||
}
|
||||
#toast-container > div,
|
||||
#toast-container > div:hover {
|
||||
box-shadow: 0 0 12px rgba(0, 0, 0, 0.1);
|
||||
font-family: Helvetica, sans-serif;
|
||||
}
|
||||
#toast-container > div {
|
||||
opacity: 0.95;
|
||||
}
|
||||
#merge-tag-reference-container {
|
||||
text-align: left;
|
||||
font-size: 14px;
|
||||
}
|
||||
#merge-tag-reference-container table th {
|
||||
padding: 5px 20px 5px 0;
|
||||
}
|
||||
|
||||
/* Fixed width sidebar */
|
||||
#gjs > .gjs-editor > .gjs-cv-canvas { width: 100% !important; padding-right: 300px !important; }
|
||||
#gjs-pn-views, #gjs-pn-views-container { width: 300px !important; }
|
||||
#gjs-pn-options { right: 300px !important; }
|
||||
#gjs-pn-commands { width: 100% !important; padding-right: 310px !important; }
|
||||
|
||||
/* Hide the fullscreen button - doesn't work from within our iFrame */
|
||||
#gjs-pn-options .gjs-pn-btn.fa.fa-arrows-alt { display: none !important; }
|
||||
|
||||
/* Hide pencil icon on image toolbar, issue #195 */
|
||||
.gjs-toolbar > div > div.fa-pencil { display: none; }
|
||||
</style>
|
||||
|
||||
|
||||
{{> editor_navbar}}
|
||||
|
||||
|
||||
<div id="gjs-wrapper">
|
||||
<div id="gjs" style="height: 0px; overflow: hidden"></div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Test Newsletter Form -->
|
||||
|
||||
<form id="test-form" class="test-form" action="/editorapi/test?editor=grapejs" method="post" style="display: none">
|
||||
<div class="putsmail-c">
|
||||
<div class="gjs-sm-property" style="font-size: 10px">
|
||||
Hello! I'm a placerholder message.
|
||||
<span class="form-status" style="opacity: 0">
|
||||
<i class="fa fa-refresh anim-spin" aria-hidden="true"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="gjs-sm-property">
|
||||
<div class="gjs-field">
|
||||
<span id="gjs-sm-input-holder">
|
||||
<input type="email" name="email" placeholder="Email" required>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="gjs-sm-property">
|
||||
<div class="gjs-field">
|
||||
<span id="gjs-sm-input-holder">
|
||||
<input type="text" name="subject" placeholder="Subject" required value="Test {{resource.name}}">
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<input type="hidden" name="html">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<button class="gjs-btn-prim gjs-btn-import" style="width: 100%">SEND</button>
|
||||
</form>
|
||||
|
||||
|
||||
<!-- Merge Tag Reference -->
|
||||
|
||||
{{#if resource.mergeTags}}
|
||||
<div id="merge-tag-reference-container" style="display: none">
|
||||
<table class="">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
Merge tag
|
||||
</th>
|
||||
<th>
|
||||
Description
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#each resource.mergeTags}}
|
||||
<tr>
|
||||
<th>
|
||||
[{{key}}]
|
||||
</th>
|
||||
<td>
|
||||
{{value}}
|
||||
</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
|
||||
<script>
|
||||
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': '{{csrfToken}}' } });
|
||||
|
||||
var serviceUrl = '{{{serviceUrl}}}';
|
||||
var resource = {{{stringifiedResource}}};
|
||||
|
||||
var config = (function(mode) {
|
||||
var c = {
|
||||
clearOnRender: true,
|
||||
height: '100%',
|
||||
storageManager: {
|
||||
type: 'none'
|
||||
},
|
||||
assetManager: {
|
||||
assets: [],
|
||||
upload: '/editorapi/upload?type={{type}}&id={{resource.id}}&editor={{editor.name}}',
|
||||
uploadText: 'Drop images here or click to upload',
|
||||
},
|
||||
container : '#gjs',
|
||||
fromElement: false,
|
||||
plugins: [],
|
||||
pluginsOpts: {},
|
||||
};
|
||||
|
||||
if (mode === 'mjml') {
|
||||
var serializer = new XMLSerializer();
|
||||
var doc = new DOMParser().parseFromString(resource.editorData.mjml, 'text/xml');
|
||||
|
||||
// convert relative to absolute urls
|
||||
['mj-wrapper', 'mj-section', 'mj-navbar', 'mj-hero', 'mj-image'].forEach(function(tagName) {
|
||||
var elements = doc.getElementsByTagName(tagName);
|
||||
|
||||
for (var i = 0; i < elements.length; i++) {
|
||||
var node = elements[i];
|
||||
var attrName = tagName === 'mj-image' ? 'src' : 'background-url';
|
||||
var url = node.getAttribute(attrName);
|
||||
|
||||
if (url && url.substring(0, 2) === './') {
|
||||
var absoluteUrl = serviceUrl + 'grapejs/templates/' + resource.editorData.template + '/' + url.substring(2);
|
||||
node.setAttribute(attrName, absoluteUrl);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var title = doc.getElementsByTagName('mj-title')[0];
|
||||
if (title) {
|
||||
title.textContent = resource.name;
|
||||
}
|
||||
|
||||
var head = doc.getElementsByTagName('mj-head')[0];
|
||||
var mjHead = head ? serializer.serializeToString(head) : '<mj-head></mj-head>';
|
||||
|
||||
var container = doc.getElementsByTagName('mj-container')[0];
|
||||
var mjContainer = container ? serializer.serializeToString(container) : '<mj-container></mj-container>';
|
||||
|
||||
c.plugins.push('gjs-mjml', 'gjs-preset-mjml');
|
||||
c.pluginsOpts['gjs-mjml'] = {
|
||||
preMjml: '<mjml>' + mjHead + '<mj-body>',
|
||||
postMjml: '</mj-body></mjml>',
|
||||
};
|
||||
c.components = mjContainer;
|
||||
}
|
||||
|
||||
if (mode === 'html') {
|
||||
c.plugins.push('gjs-preset-newsletter');
|
||||
c.pluginsOpts['gjs-preset-newsletter'] = {
|
||||
modalLabelImport: 'Paste all your code here below and click import',
|
||||
modalLabelExport: 'Copy the code and use it wherever you want',
|
||||
codeViewerTheme: 'material',
|
||||
importPlaceholder: '<table class="table"><tr><td class="cell">Hello world!</td></tr></table>',
|
||||
cellStyle: {
|
||||
'font-size': '12px',
|
||||
'font-weight': 300,
|
||||
'vertical-align': 'top',
|
||||
color: 'rgb(111, 119, 125)',
|
||||
margin: 0,
|
||||
padding: 0,
|
||||
}
|
||||
};
|
||||
c.components = resource.editorData.html || resource.html || '';
|
||||
c.style = resource.editorData.css || '';
|
||||
}
|
||||
|
||||
return c;
|
||||
})('{{editor.mode}}');
|
||||
|
||||
var editor = grapesjs.init(config);
|
||||
|
||||
$.getJSON('/editorapi/upload?type={{type}}&id={{resource.id}}&editor={{editor.name}}', function(data) {
|
||||
editor.AssetManager.add(data.files);
|
||||
});
|
||||
|
||||
function getMjml() {
|
||||
var c = config.pluginsOpts['gjs-mjml'];
|
||||
return c.preMjml + editor.getHtml() + c.postMjml;
|
||||
}
|
||||
|
||||
function getPreparedHtml(callback) {
|
||||
var html;
|
||||
|
||||
switch ('{{editor.mode}}') {
|
||||
case 'html':
|
||||
html = editor.runCommand('gjs-get-inlined-html');
|
||||
html = '<!doctype html><html><head><meta charset="utf-8"><title>{{resource.name}}</title></head><body>' + html + '</body></html>';
|
||||
break;
|
||||
case 'mjml':
|
||||
var mjml = editor.runCommand('mjml-get-code');
|
||||
mjml.errors.length && mjml.errors.forEach(function(err) {
|
||||
console.warn(err.formattedMessage);
|
||||
});
|
||||
html = mjml.html;
|
||||
break;
|
||||
}
|
||||
|
||||
var frame = document.createElement('iframe');
|
||||
frame.width = 2048;
|
||||
frame.height = 0;
|
||||
document.body.appendChild(frame);
|
||||
var frameDoc = frame.contentDocument || frame.contentWindow.document;
|
||||
|
||||
var isLocalImage = function(src) {
|
||||
var a1 = document.createElement('a');
|
||||
var a2 = document.createElement('a');
|
||||
a1.href = serviceUrl;
|
||||
a2.href = src;
|
||||
return a1.host === a2.host;
|
||||
};
|
||||
|
||||
frame.onload = function() {
|
||||
var imgs = frameDoc.querySelectorAll('img');
|
||||
|
||||
for (var i = 0; i < imgs.length; i++) {
|
||||
var img = imgs[i];
|
||||
var m = img.src.match(/\/editorapi\/img\?src=([^&]*)/);
|
||||
var encodedSrc = m && m[1] || encodeURIComponent(img.src);
|
||||
if (isLocalImage(decodeURIComponent(encodedSrc))) {
|
||||
img.src = '/editorapi/img?src=' + encodedSrc + '&method=resize¶ms=' + img.clientWidth + '%2C' + img.clientHeight;
|
||||
}
|
||||
}
|
||||
|
||||
html = '<!doctype html>' + frameDoc.documentElement.outerHTML;
|
||||
document.body.removeChild(frame);
|
||||
callback(html);
|
||||
};
|
||||
|
||||
frameDoc.open();
|
||||
frameDoc.write(html);
|
||||
frameDoc.close();
|
||||
}
|
||||
|
||||
|
||||
// Save Button
|
||||
|
||||
window.bridge = window.bridge || {};
|
||||
|
||||
$('#mt-save').on('click', function() {
|
||||
|
||||
if ($(this).hasClass('busy')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$(this).addClass('busy');
|
||||
|
||||
getPreparedHtml(function(html) {
|
||||
var editorData = '{{editor.mode}}' === 'mjml' ? {
|
||||
template: resource.editorData.template,
|
||||
mjml: getMjml(),
|
||||
} : {
|
||||
template: resource.editorData.template,
|
||||
css: editor.getCss(),
|
||||
html: editor.getHtml(),
|
||||
style: editor.getStyle(),
|
||||
components: editor.getComponents(),
|
||||
};
|
||||
|
||||
// TODO: Make templates and campaigns accept partial updates, i.e. don't require 'name' and 'list'
|
||||
var update = {
|
||||
id: resource.id,
|
||||
name: resource.name,
|
||||
{{#if resource.list}} list: resource.list, {{/if}}
|
||||
editorData: JSON.stringify(editorData),
|
||||
html: html,
|
||||
};
|
||||
|
||||
$.post('/editorapi/update?type={{type}}&editor={{editor.name}}', update, null, 'html')
|
||||
.success(function() {
|
||||
window.bridge.lastSavedHtml = html;
|
||||
toastr.success('Sucessfully saved');
|
||||
})
|
||||
.fail(function(data) {
|
||||
toastr.error(data.responseText || 'An error occured while saving the document');
|
||||
})
|
||||
.always(function() {
|
||||
setTimeout(function() {
|
||||
$('#mt-save').removeClass('busy');
|
||||
}, 200); // Don't save too fast
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
// Close Button
|
||||
|
||||
$('#mt-close').on('click', function() {
|
||||
if (confirm('Unsaved changes will be lost. Close now?') === true) {
|
||||
window.bridge.exit
|
||||
? window.bridge.exit()
|
||||
: window.location.href = '/{{type}}s/edit/{{resource.id}}?tab=template';
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// Commands
|
||||
|
||||
var mdlClass = 'gjs-mdl-dialog-sm';
|
||||
var pnm = editor.Panels;
|
||||
var cmdm = editor.Commands;
|
||||
var md = editor.Modal;
|
||||
|
||||
|
||||
// Test email command
|
||||
|
||||
var testContainer = document.getElementById('test-form');
|
||||
var testContentEl = testContainer.querySelector('input[name=html]');
|
||||
|
||||
cmdm.add('send-test', {
|
||||
run(editor, sender) {
|
||||
// TODO: Show a spinner
|
||||
getPreparedHtml(function(html) {
|
||||
sender.set('active', 0);
|
||||
var modalContent = md.getContentEl();
|
||||
var mdlDialog = document.querySelector('.gjs-mdl-dialog');
|
||||
testContentEl.value = html;
|
||||
mdlDialog.className += ' ' + mdlClass;
|
||||
testContainer.style.display = 'block';
|
||||
md.setTitle('Test your Newsletter');
|
||||
md.setContent(testContainer);
|
||||
md.open();
|
||||
md.getModel().once('change:open', function() {
|
||||
mdlDialog.className = mdlDialog.className.replace(mdlClass, '');
|
||||
//clean status
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
pnm.addButton('options', {
|
||||
id: 'send-test',
|
||||
className: 'fa fa-paper-plane',
|
||||
command: 'send-test',
|
||||
attributes: {
|
||||
'title': 'Test Newsletter',
|
||||
'data-tooltip-pos': 'bottom',
|
||||
},
|
||||
});
|
||||
|
||||
var statusFormElC = document.querySelector('.form-status');
|
||||
var statusFormEl = document.querySelector('.form-status i');
|
||||
|
||||
var ajaxTest = ajaxable(testContainer, { headers: { 'X-CSRF-TOKEN': '{{csrfToken}}' } })
|
||||
.onStart(function() {
|
||||
statusFormEl.className = 'fa fa-refresh anim-spin';
|
||||
statusFormElC.style.opacity = '1';
|
||||
statusFormElC.className = 'form-status';
|
||||
})
|
||||
.onResponse(function(res) {
|
||||
if (res.data) {
|
||||
statusFormElC.style.opacity = '0';
|
||||
statusFormEl.removeAttribute('data-tooltip');
|
||||
md.close();
|
||||
toastr.success('Testmail sent');
|
||||
} else if (res.errors) {
|
||||
statusFormEl.className = 'fa fa-exclamation-circle';
|
||||
statusFormEl.setAttribute('data-tooltip', res.errors);
|
||||
statusFormElC.className = 'form-status text-danger';
|
||||
toastr.error(res.errors);
|
||||
}
|
||||
});
|
||||
|
||||
// Remember testemail address
|
||||
|
||||
var isValidEmail = function(email) {
|
||||
return /\S+@\S+\.\S+/.test(email);
|
||||
};
|
||||
|
||||
if (isValidEmail(localStorage.getItem('testemail'))) {
|
||||
$('#test-form input[name=email]').val(localStorage.getItem('testemail'));
|
||||
}
|
||||
|
||||
$('#test-form').on('submit', function() {
|
||||
var email = $('#test-form input[name=email]').val();
|
||||
isValidEmail(email) && localStorage.setItem('testemail', email);
|
||||
});
|
||||
|
||||
|
||||
// Merge Tag Reference command
|
||||
|
||||
var mergeTagReferenceContainer = document.getElementById('merge-tag-reference-container');
|
||||
cmdm.add('open-merge-tag-reference', {
|
||||
run(editor, sender) {
|
||||
sender.set('active', 0);
|
||||
var mdlDialog = document.querySelector('.gjs-mdl-dialog');
|
||||
mdlDialog.className += ' gjs-mdl-dialog-lg';
|
||||
mergeTagReferenceContainer.style.display = 'block';
|
||||
md.setTitle('Merge tag reference');
|
||||
md.setContent(mergeTagReferenceContainer);
|
||||
md.open();
|
||||
md.getModel().once('change:open', function() {
|
||||
mdlDialog.className = mdlDialog.className.replace('gjs-mdl-dialog-lg', '');
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
pnm.addButton('options', {
|
||||
id: 'view-merge-tag-reference',
|
||||
className: 'fa fa-tags',
|
||||
command: 'open-merge-tag-reference',
|
||||
attributes: {
|
||||
'title': 'Merge tag reference',
|
||||
'data-tooltip-pos': 'bottom',
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
// Simple warn notifier
|
||||
|
||||
var origWarn = console.warn;
|
||||
toastr.options = {
|
||||
closeButton: true,
|
||||
preventDuplicates: true,
|
||||
showDuration: 250,
|
||||
hideDuration: 150
|
||||
};
|
||||
console.warn = function(msg) {
|
||||
toastr.warning(msg);
|
||||
origWarn(msg);
|
||||
};
|
||||
|
||||
|
||||
// Beautify tooltips
|
||||
|
||||
$(document).ready(function() {
|
||||
$('*[title]').each(function() {
|
||||
var el = $(this);
|
||||
var title = el.attr('title').trim();
|
||||
if (title) {
|
||||
el.attr('data-tooltip', el.attr('title'));
|
||||
el.attr('title', '');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
|
@ -1,34 +0,0 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>GrapesJS Newsletter Editor</title>
|
||||
|
||||
<link rel="stylesheet" href="/grapejs/dist/css/grapes.min.css?v=0.5.41">
|
||||
<link rel="stylesheet" href="/grapejs/dist/css/toastr.min.css?v=2.1.3">
|
||||
<link rel="stylesheet" href="/grapejs/dist/css/material.css">
|
||||
<link rel="stylesheet" href="/grapejs/dist/css/tooltip.css">
|
||||
|
||||
<script src="/javascript/jquery-2.2.1.min.js"></script>
|
||||
<script src="/grapejs/dist/js/grapes.min.js?v=0.5.41"></script>
|
||||
<script src="/grapejs/dist/js/toastr.min.js?v=2.1.3"></script>
|
||||
<script src="/grapejs/dist/js/ajaxable.min.js?v=0.2.3"></script>
|
||||
|
||||
{{#switch editor.mode}}
|
||||
{{#case "mjml"}}
|
||||
<link rel="stylesheet" href="/grapejs/dist/css/grapesjs-mjml.css?v=0.0.7">
|
||||
<script src="/grapejs/dist/js/grapesjs-mjml.min.js?v=0.0.7"></script>
|
||||
<script src="/grapejs/dist/js/grapesjs-preset-mjml.js"></script>
|
||||
{{/case}}
|
||||
{{#case "html"}}
|
||||
<link rel="stylesheet" href="/grapejs/dist/css/grapesjs-preset-newsletter.css?v=0.2.3">
|
||||
<script src="/grapejs/dist/js/grapesjs-preset-newsletter.min.js?v=0.2.3"></script>
|
||||
{{/case}}
|
||||
{{/switch}}
|
||||
</head>
|
||||
<body>
|
||||
|
||||
{{{body}}}
|
||||
|
||||
</body>
|
||||
</html>
|
133
views/index.hbs
133
views/index.hbs
|
@ -1,133 +0,0 @@
|
|||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<h2><span class="glyphicon glyphicon-list-alt"></span> {{#translate}}List Management{{/translate}}</h2>
|
||||
<p>{{#translate}}Mailtrain allows you to easily manage even very large lists. Million subscribers? Not a problem. You can add subscribers manually, through the API or import from a CSV file. All lists come with support for custom fields and merge tags as well.{{/translate}}</p>
|
||||
<button type="button" class="btn btn-default btn-xs" data-toggle="modal" data-target=".modal-list-management">{{#translate}}Show more{{/translate}}</button>
|
||||
{{> modal_carousel
|
||||
title='List Management'
|
||||
cls='modal-list-management'
|
||||
img01='/images/screenshots/lists/lists.png'
|
||||
img02='/images/screenshots/lists/view.png'
|
||||
img03='/images/screenshots/lists/subscription/edit.png'
|
||||
img04='/images/screenshots/subscription/create.png'
|
||||
img05='/images/screenshots/users/api.png'
|
||||
}}
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<h2><span class="glyphicon glyphicon-tasks"></span> {{#translate}}Custom Fields{{/translate}}</h2>
|
||||
<p>{{#translate}}Text fields, numbers, drop downs or checkboxes, Mailtrain has them all. Every custom field can be included in the generated newsletters through merge tags.{{/translate}} {{#translate}}Mailtrain also supports custom forms.{{/translate}}</p>
|
||||
<button type="button" class="btn btn-default btn-xs" data-toggle="modal" data-target=".modal-custom-fields">{{#translate}}Show more{{/translate}}</button>
|
||||
{{> modal_carousel
|
||||
title='Custom Fields'
|
||||
cls='modal-custom-fields'
|
||||
img01='/images/screenshots/fields/view.png'
|
||||
img02='/images/screenshots/fields/edit.png'
|
||||
img03='/images/screenshots/fields/edit-option.png'
|
||||
img04='/images/screenshots/forms/view.png'
|
||||
img05='/images/screenshots/forms/edit-mail-confirm.png'
|
||||
img06='/images/screenshots/forms/edit-fields.png'
|
||||
img07='/images/screenshots/subscription/create.png'
|
||||
img08='/images/screenshots/forms/edit-layout.png'
|
||||
img09='/images/screenshots/forms/edit-styles.png'
|
||||
}}
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<h2><span class="glyphicon glyphicon-filter"></span> {{#translate}}List Segmentation{{/translate}}</h2>
|
||||
<p>{{#translate}}Send messages only to list subscribers that match predefined segmentation rules. No need to create separate lists with small differences.{{/translate}}</p>
|
||||
<button type="button" class="btn btn-default btn-xs" data-toggle="modal" data-target=".modal-list-segmentation">{{#translate}}Show more{{/translate}}</button>
|
||||
{{> modal_carousel
|
||||
title='List Segmentation'
|
||||
cls='modal-list-segmentation'
|
||||
img01='/images/screenshots/segments/create.png'
|
||||
img02='/images/screenshots/segments/rules/create.png'
|
||||
img03='/images/screenshots/segments/rules/configure.png'
|
||||
img04='/images/screenshots/segments/view.png'
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<h2><span class="glyphicon glyphicon-star"></span> {{#translate}}RSS Campaigns{{/translate}}</h2>
|
||||
<p>{{#translate}}Setup Mailtrain to track RSS feeds and if a new entry is detected in a feed then Mailtrain auto-generates a new campaign using entry data as message contents and sends it to selected subscribers.{{/translate}}</p>
|
||||
<button type="button" class="btn btn-default btn-xs" data-toggle="modal" data-target=".modal-rss-campaigns">{{#translate}}Show more{{/translate}}</button>
|
||||
{{> modal_carousel
|
||||
title='RSS Campaigns'
|
||||
cls='modal-rss-campaigns'
|
||||
img01='/images/screenshots/campaigns/campaigns.png'
|
||||
img02='/images/screenshots/campaigns/create-rss.png'
|
||||
img03='/images/screenshots/campaigns/view-rss.png'
|
||||
}}
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<h2><span class="glyphicon glyphicon-lock"></span> {{#translate}}GPG Encryption{{/translate}}</h2>
|
||||
<p>{{#translate}}If a list has a custom field for a GPG Public Key set then subscribers can upload their GPG public key to receive encrypted messages from the list.{{/translate}}</p>
|
||||
<button type="button" class="btn btn-default btn-xs" data-toggle="modal" data-target=".modal-gpg-encryption">{{#translate}}Show more{{/translate}}</button>
|
||||
{{> modal_carousel
|
||||
title='GPG Encryption'
|
||||
cls='modal-gpg-encryption'
|
||||
img01='/images/screenshots/subscription/create.png'
|
||||
img02='/images/screenshots/settings.png'
|
||||
}}
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<h2><span class="glyphicon glyphicon-stats"></span> {{#translate}}Click Stats{{/translate}}</h2>
|
||||
<p>{{#translate}}After a campaign is sent, check individual click statistics for every link included in the message.{{/translate}}</p>
|
||||
<button type="button" class="btn btn-default btn-xs" data-toggle="modal" data-target=".modal-click-stats">{{#translate}}Show more{{/translate}}</button>
|
||||
{{> modal_carousel
|
||||
title='Click Stats'
|
||||
cls='modal-click-stats'
|
||||
img01='/images/screenshots/campaigns/view.png'
|
||||
img02='/images/screenshots/campaigns/view-links.png'
|
||||
img03='/images/screenshots/campaigns/clicked/view.png'
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<h2><span class="glyphicon glyphicon-edit"></span> {{#translate}}Template Editors{{/translate}}</h2>
|
||||
<p>{{#translate}}Mailtrain ships with GrapeJS and Mosaico built in, two advanced template editors. Mailtrain also offers a code editor if you prefer to handcraft the HTML yourself.{{/translate}}</p>
|
||||
<button type="button" class="btn btn-default btn-xs" data-toggle="modal" data-target=".modal-editors">{{#translate}}Show more{{/translate}}</button>
|
||||
{{> modal_carousel
|
||||
title='Template Editors'
|
||||
cls='modal-editors'
|
||||
img01='/images/screenshots/templates/create.png'
|
||||
img02='/images/screenshots/templates/edit/grapejs.png'
|
||||
img03='/images/screenshots/grapejs/editor-1.png'
|
||||
img04='/images/screenshots/grapejs/editor-2.png'
|
||||
img05='/images/screenshots/grapejs/editor-3.png'
|
||||
img06='/images/screenshots/templates/edit/mosaico.png'
|
||||
img07='/images/screenshots/mosaico/editor-1.png'
|
||||
img08='/images/screenshots/mosaico/editor-2.png'
|
||||
img09='/images/screenshots/mosaico/editor-3.png'
|
||||
}}
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<h2><span class="glyphicon glyphicon-send"></span> {{#translate}}Send via Any Provider{{/translate}}</h2>
|
||||
<p>{{#translate}}You can use any provider that supports SMTP protocol to send out your newsletters. Bounce and complaints handling via webhooks is supported for SES, SparkPost, SendGrid and Mailgun, also for Postfix and ZoneMTA.{{/translate}}</p>
|
||||
<button type="button" class="btn btn-default btn-xs" data-toggle="modal" data-target=".modal-send-via-any-provider">{{#translate}}Show more{{/translate}}</button>
|
||||
{{> modal_carousel
|
||||
title='Send via Any Provider'
|
||||
cls='modal-send-via-any-provider'
|
||||
img01='/images/screenshots/settings.png'
|
||||
}}
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<h2><span class="glyphicon glyphicon-cog"></span> {{#translate}}Automation{{/translate}}</h2>
|
||||
<p>{{#translate}}Define automation triggers to send specific messages when a user activates the trigger.{{/translate}}</p>
|
||||
<button type="button" class="btn btn-default btn-xs" data-toggle="modal" data-target=".modal-automation">{{#translate}}Show more{{/translate}}</button>
|
||||
{{> modal_carousel
|
||||
title='Automation'
|
||||
cls='modal-automation'
|
||||
img01='/images/screenshots/triggers/create-select.png'
|
||||
img02='/images/screenshots/triggers/create.png'
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p><br><br><br></p>
|
197
views/layout.hbs
197
views/layout.hbs
|
@ -7,200 +7,31 @@
|
|||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
<meta name="description" content="{{#translate}}Self hosted email newsletter app{{/translate}}">
|
||||
<meta name="author" content="Andris Reinman">
|
||||
<link rel="icon" href="/favicon.ico">
|
||||
<link rel="icon" href="/public/favicon.ico">
|
||||
|
||||
<title>Mailtrain
|
||||
{{#if title}} | {{title}}{{/if}}
|
||||
</title>
|
||||
|
||||
{{#if reactEntryPoint}}
|
||||
<link rel="stylesheet" href="/bootstrap/themes/united.min.css">
|
||||
<link rel="stylesheet" href="/css/footer.css">
|
||||
<link rel="stylesheet" href="/css/mailtrain.css">
|
||||
<script src="/javascript/jquery-2.2.1.min.js"></script>
|
||||
<script src="/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="/mailtrain/common.js"></script>
|
||||
<link rel="stylesheet" href="/public/bootstrap/themes/united.min.css">
|
||||
<link rel="stylesheet" href="/public/css/footer.css">
|
||||
<link rel="stylesheet" href="/public/css/mailtrain.css">
|
||||
<script src="/public/jquery-2.2.1.min.js"></script>
|
||||
<script src="/public/bootstrap/js/bootstrap.min.js"></script>
|
||||
|
||||
<script>
|
||||
window.csfrToken = '{{reactCsrfToken}}';
|
||||
window.mailtrainConfig = {{{mailtrainConfig}}};
|
||||
</script>
|
||||
{{#if mailtrainConfig}}
|
||||
<script>
|
||||
{{#if reactCsrfToken}}window.csfrToken = '{{reactCsrfToken}}';{{/if}}
|
||||
window.mailtrainConfig = {{{mailtrainConfig}}};
|
||||
</script>
|
||||
|
||||
<script src="/mailtrain/{{reactEntryPoint}}.js"></script>
|
||||
{{else}}
|
||||
<link rel="stylesheet" href="/bootstrap/themes/united.min.css">
|
||||
<link rel="stylesheet" href="/datatables/datatables.min.css">
|
||||
|
||||
<link rel="stylesheet" href="/datepicker/css/bootstrap-datepicker3.css">
|
||||
<link rel="stylesheet" href="/css/footer.css">
|
||||
<link rel="stylesheet" href="/css/mailtrain.css">
|
||||
|
||||
{{#if useEditor}}
|
||||
<link rel="stylesheet" href="/summernote/summernote.css">
|
||||
{{/if}}
|
||||
|
||||
{{#each customStyles}}
|
||||
<link rel="stylesheet" href="{{this}}">
|
||||
{{/each}}
|
||||
|
||||
{{#each customScripts}}
|
||||
<script src="{{this}}"></script>
|
||||
{{/each}}
|
||||
<script src="/mailtrain/common.js"></script>
|
||||
<script src="/mailtrain/root.js"></script>
|
||||
{{/if}}
|
||||
</head>
|
||||
|
||||
<body class="{{bodyClass}}">
|
||||
|
||||
<nav class="navbar navbar-default navbar-static-top">
|
||||
<div class="container-fluid">
|
||||
<!-- Brand and toggle get grouped for better mobile display -->
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
|
||||
<span class="sr-only">{{#translate}}Toggle navigation{{/translate}}</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<a class="navbar-brand" href="/"><i class="glyphicon glyphicon-envelope"></i> Mailtrain</a>
|
||||
</div>
|
||||
|
||||
<!-- Collect the nav links, forms, and other content for toggling -->
|
||||
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
|
||||
<ul class="nav navbar-nav">
|
||||
{{#each menu}}
|
||||
{{#if selected}}
|
||||
<li class="active"><a href="{{url}}">{{title}} <span class="sr-only">(current)</span></a></li>
|
||||
{{else}}
|
||||
<li><a href="{{url}}">{{title}}</a></li>
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
|
||||
{{#if admin }}
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Administration<span class="caret"></span></a>
|
||||
<ul class="dropdown-menu">
|
||||
<li>
|
||||
<a href="/users">
|
||||
<span class="glyphicon glyphicon-cog" aria-hidden="true"></span> {{#translate}}Users{{/translate}}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/namespaces">
|
||||
<span class="glyphicon glyphicon-cog" aria-hidden="true"></span> {{#translate}}Namespaces{{/translate}}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/settings">
|
||||
<span class="glyphicon glyphicon-cog" aria-hidden="true"></span> {{#translate}}Settings{{/translate}}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/blacklist">
|
||||
<span class="glyphicon glyphicon-ban-circle" aria-hidden="true"></span> {{#translate}}Blacklist{{/translate}}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/account/api">
|
||||
<span class="glyphicon glyphicon-retweet" aria-hidden="true"></span> {{#translate}}API{{/translate}}
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
{{/if}}
|
||||
|
||||
<li><a href="https://github.com/Mailtrain-org/mailtrain/wiki"><span class="glyphicon glyphicon-share-alt" aria-hidden="true"></span> {{#translate}}Wiki{{/translate}}</a></li>
|
||||
<li><a href="https://mailtrain.wordpress.com/"><span class="glyphicon glyphicon-share-alt" aria-hidden="true"></span> {{#translate}}Blog{{/translate}}</a></li>
|
||||
</ul>
|
||||
|
||||
|
||||
{{#if user }}
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
|
||||
<span class="glyphicon glyphicon-user" aria-hidden="true"></span> {{user.username}} <span class="caret"></span>
|
||||
</a>
|
||||
<ul class="dropdown-menu">
|
||||
<li>
|
||||
<a href="/account">
|
||||
<span class="glyphicon glyphicon-user" aria-hidden="true"></span> {{#translate}}Account{{/translate}}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/account/logout">
|
||||
<span class="glyphicon glyphicon-log-out" aria-hidden="true"></span> {{#translate}}Log out{{/translate}}
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
{{else}}
|
||||
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li>
|
||||
<a href="/account/login" role="button" aria-haspopup="true" aria-expanded="false">
|
||||
<span class="glyphicon glyphicon-log-in" aria-hidden="true"></span> {{#translate}}Sign in{{/translate}}
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
{{/if}}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Main jumbotron for a primary marketing message or call to action -->
|
||||
|
||||
{{#if indexPage}}
|
||||
<div class="jumbotron">
|
||||
<div class="container-fluid">
|
||||
<div class="pull-right col-md-4">
|
||||
{{{shoutout}}}
|
||||
</div>
|
||||
|
||||
<h1><img class="img-responsive" src="/mailtrain-header.png"></h1>
|
||||
<p>{{#translate}}Self Hosted Newsletter App Built on Top of Nodemailer{{/translate}}</p>
|
||||
<p>
|
||||
<a class="btn btn-info btn-md" href="https://github.com/Mailtrain-org/mailtrain" role="button"><span class="glyphicon glyphicon-cloud-download" aria-hidden="true"></span> {{#translate}}Source on GitHub{{/translate}}</a>
|
||||
|
||||
<a class="btn btn-success btn-md" href="http://mailtrain.org/subscription/EysIv8sAx" role="button"><span class="glyphicon glyphicon-envelope" aria-hidden="true"></span> {{#translate}}Subscribe to Our Newsletter{{/translate}}</a>
|
||||
</p>
|
||||
<div class="clearfix"></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="container-fluid">
|
||||
|
||||
{{flash_messages}} {{{body}}}
|
||||
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
<div class="container-fluid">
|
||||
<p class="text-muted">© 2018 <a href="https://mailtrain.org">Mailtrain.org</a>, <a href="mailto:info@mailtrain.org">info@mailtrain.org</a>. <a href="https://github.com/Mailtrain-org/mailtrain">{{#translate}}Source on GitHub{{/translate}}</a></p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
{{#unless reactEntryPoint}}
|
||||
<script src="/javascript/jquery-2.2.1.min.js"></script>
|
||||
<script src="/bootstrap/js/bootstrap.min.js"></script>
|
||||
|
||||
<script src="/datepicker/js/bootstrap-datepicker.min.js"></script>
|
||||
<script src="/datatables/datatables.min.js"></script>
|
||||
<script src="/moment/moment.min.js"></script>
|
||||
<script src="/javascript/tables.js"></script>
|
||||
<script src="/javascript/fetch.js"></script>
|
||||
|
||||
{{#if useEditor}}
|
||||
<script src="/ace/ace.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script src="/summernote/summernote.min.js"></script>
|
||||
<script src="/javascript/editor.js"></script>
|
||||
{{/if}}
|
||||
{{/unless}}
|
||||
{{{body}}}
|
||||
|
||||
{{> tracking_scripts}}
|
||||
|
||||
|
|
|
@ -1,60 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Create List{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{#translate}}Create List{{/translate}}</h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/lists/create">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<div class="form-group">
|
||||
<label for="name" class="col-sm-2 control-label">{{#translate}}Name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control input-lg" name="name" id="name" value="{{name}}" placeholder="{{#translate}}List Name{{/translate}}" autofocus required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="description" class="col-sm-2 control-label">{{#translate}}Description{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control" rows="3" name="description" id="description">{{description}}</textarea>
|
||||
<span class="help-block">{{#translate}}HTML is allowed{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<label for="default_form" class="col-sm-2 control-label">{{#translate}}Subscription{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="public_subscribe" value="1" {{#if publicSubscribe}} checked {{/if}}> {{#translate}}Allow public users to subscribe themselves{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="form-group">
|
||||
<label for="default_form" class="col-sm-2 control-label">{{#translate}}Unsubscription{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" id="unsubscription_mode" name="unsubscription_mode">
|
||||
{{#each unsubscriptionModeOptions}}
|
||||
<option value="{{value}}"{{#if selected}} selected{{/if}}>{{label}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
<span class="help-block">{{#translate}}Select how an unsuscription request by subscriber is handled.{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-plus"></i> {{#translate}}Create List{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,93 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li><a href="/lists/view/{{id}}">{{name}}</a></li>
|
||||
<li class="active">{{#translate}}Edit List{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{#translate}}Edit List{{/translate}} <a class="btn btn-default btn-xs" href="/lists/view/{{id}}" role="button"><span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span> {{#translate}}View List{{/translate}}</a></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form method="post" class="delete-form" id="lists-delete" action="/lists/delete">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}">
|
||||
</form>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/lists/edit">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
|
||||
<div class="form-group">
|
||||
<label for="name" class="col-sm-2 control-label">{{#translate}}Name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control input-lg" name="name" id="name" value="{{name}}" placeholder="{{#translate}}List Name{{/translate}}" autofocus required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="name" class="col-sm-2 control-label">{{#translate}}List ID{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" id="cid" value="{{cid}}" readonly>
|
||||
<span class="help-block">{{#translate}}This is the list ID displayed to the subscribers{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="description" class="col-sm-2 control-label">{{#translate}}Description{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control" rows="3" name="description" id="description">{{description}}</textarea>
|
||||
<span class="help-block">{{#translate}}HTML is allowed{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="default_form" class="col-sm-2 control-label">{{#translate}}Custom Form{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" id="default_form" name="default_form">
|
||||
<option value="0">{{#translate}}Default Mailtrain Form{{/translate}}</option>
|
||||
{{#each customForms}}
|
||||
<option value="{{id}}" {{#if selected}}selected{{/if}}>{{name}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
<span class="help-block">{{#translate}}The custom form used for this list. You can create a form <a href="/forms/{{id}}/create">here</a>.{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<label for="default_form" class="col-sm-2 control-label">{{#translate}}Subscription{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="public_subscribe" value="1" {{#if publicSubscribe}} checked {{/if}}> {{#translate}}Allow public users to subscribe themselves{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="form-group">
|
||||
<label for="default_form" class="col-sm-2 control-label">{{#translate}}Unsubscription{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" id="unsubscription_mode" name="unsubscription_mode">
|
||||
{{#each unsubscriptionModeOptions}}
|
||||
<option value="{{value}}"{{#if selected}} selected{{/if}}>{{label}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
<span class="help-block">{{#translate}}Select how an unsuscription request by subscriber is handled.{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="pull-right">
|
||||
<button type="submit" form="lists-delete" class="btn btn-danger"><i class="glyphicon glyphicon-remove"></i> {{#translate}}Delete List{{/translate}}</button>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-ok"></i> {{#translate}}Update{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,93 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li><a href="/lists/view/{{list.id}}">{{list.name}}</a></li>
|
||||
<li><a href="/fields/{{list.id}}">{{#translate}}Custom Fields{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Create Field{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{list.name}} <small>{{#translate}}Create Custom Field{{/translate}}</small></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/fields/{{list.id}}/create">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<div class="form-group">
|
||||
<label for="name" class="col-sm-2 control-label">{{#translate}}Field Name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control input-lg" name="name" id="name" value="{{name}}" placeholder="{{#translate}}Field Name{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="type" class="col-sm-2 control-label">{{#translate}}Field Type{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" name="type">
|
||||
<option value="text" {{#if selectedText}} selected {{/if}}>{{#translate}}Text{{/translate}}</option>
|
||||
<option value="number" {{#if selectedNumber}} selected {{/if}}>{{#translate}}Number{{/translate}}</option>
|
||||
<option value="website" {{#if selectedWebsite}} selected {{/if}}>{{#translate}}Website{{/translate}}</option>
|
||||
<option value="gpg" {{#if selectedGpg}} selected {{/if}}>{{#translate}}GPG Public Key{{/translate}}</option>
|
||||
<option value="longtext" {{#if selectedLongtext}} selected {{/if}}>{{#translate}}Multi-line text{{/translate}}</option>
|
||||
<option value="json" {{#if selectedJson}} selected {{/if}}>{{#translate}}JSON{{/translate}}</option>
|
||||
<optgroup label="{{#translate}}Date{{/translate}}">
|
||||
<option value="date-us" {{#if selectedDateUs}} selected {{/if}}>{{#translate}}Date (MM/DD/YYYY){{/translate}}</option>
|
||||
<option value="date-eur" {{#if selectedDateEur}} selected {{/if}}>{{#translate}}Date (DD/MM/YYYY){{/translate}}</option>
|
||||
</optgroup>
|
||||
<optgroup label="{{#translate}}Birthday{{/translate}}">
|
||||
<option value="birthday-us" {{#if selectedBirthdayUs}} selected {{/if}}>{{#translate}}Birthday (MM/DD){{/translate}}</option>
|
||||
<option value="birthday-eur" {{#if selectedBirthdayEur}} selected {{/if}}>{{#translate}}Birthday (DD/MM){{/translate}}</option>
|
||||
</optgroup>
|
||||
<optgroup label="{{#translate}}Grouped{{/translate}}">
|
||||
<option value="dropdown" {{#if selectedDropdown}} selected {{/if}}>{{#translate}}Drop Downs{{/translate}}</option>
|
||||
<option value="radio" {{#if selectedRadio}} selected {{/if}}>{{#translate}}Radio Buttons{{/translate}}</option>
|
||||
<option value="checkbox" {{#if selectedCheckbox}} selected {{/if}}>{{#translate}}Checkboxes{{/translate}}</option>
|
||||
</optgroup>
|
||||
<option value="option" {{#if selectedOption}} selected {{/if}}>{{#translate}}Option for a group value{{/translate}}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="group" class="col-sm-2 control-label">{{#translate}}Group{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" name="group">
|
||||
<option value=""> –– {{#translate}}Select{{/translate}} ––</option>
|
||||
{{#each groups}}
|
||||
<option value="{{id}}" {{#if selected}} selected {{/if}}>{{name}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
<span class="help-block">{{#translate}}Required for group options{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="default-value" class="col-sm-2 control-label">{{#translate}}Default merge tag value{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="default-value" id="default-value" value="{{field.defaultValue}}" placeholder="{{#translate}}Default merge tag value{{/translate}}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="group-template" class="col-sm-2 control-label">{{#translate}}Template{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control gpg-text" rows="3" name="group-template" id="group-template">{{field.groupTemplate}}</textarea>
|
||||
<span class="help-block">{{#translate}}For group elements like checkboxes you can control the appearance of the merge tag with an optional template. The template uses handlebars syntax and you can find all values from <code>\{{values}}</code> array, for example <code>\{{#each values}} \{{this}} \{{/each}}</code>. If template is not defined then multiple values are joined with commas. You can also use this template to render JSON values (if the JSON is an array then the array is exposed as <code>values</code>, otherwise you can access the JSON keys directly).{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-xs-4">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="visible" {{#if visible}} checked {{/if}}> {{#translate}}Visible{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-plus"></i> {{#translate}}Add Field{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,119 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li><a href="/lists/view/{{list.id}}">{{list.name}}</a></li>
|
||||
<li><a href="/fields/{{list.id}}">{{#translate}}Custom Fields{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Edit Field{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{list.name}} <small>{{#translate}}Edit Custom Field{{/translate}}</small> <a class="btn btn-default btn-xs" href="/fields/{{list.id}}" role="button"><span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span> {{#translate}}Back to fields{{/translate}}</a></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form method="post" class="delete-form" id="fields-delete" action="/fields/{{list.id}}/delete">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{field.id}}" />
|
||||
</form>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/fields/{{list.id}}/edit">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{field.id}}" />
|
||||
|
||||
<div class="form-group">
|
||||
<label for="name" class="col-sm-2 control-label">{{#translate}}Field Name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control input-lg" name="name" id="name" value="{{field.name}}" placeholder="{{#translate}}Field Name{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="type" class="col-sm-2 control-label">{{#translate}}Field Type{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" disabled>
|
||||
<option value="text" {{#if selectedText}} selected {{/if}}>{{#translate}}Text{{/translate}}</option>
|
||||
<option value="number" {{#if selectedNumber}} selected {{/if}}>{{#translate}}Number{{/translate}}</option>
|
||||
<option value="website" {{#if selectedWebsite}} selected {{/if}}>{{#translate}}Website{{/translate}}</option>
|
||||
<option value="gpg" {{#if selectedGpg}} selected {{/if}}>{{#translate}}GPG Public Key{{/translate}}</option>
|
||||
<option value="longtext" {{#if selectedLongtext}} selected {{/if}}>{{#translate}}Multi-line text{{/translate}}</option>
|
||||
<option value="json" {{#if selectedJson}} selected {{/if}}>{{#translate}}JSON{{/translate}}</option>
|
||||
<optgroup label="{{#translate}}Date{{/translate}}">
|
||||
<option value="date-us" {{#if selectedDateUs}} selected {{/if}}>{{#translate}}Date (MM/DD/YYYY){{/translate}}</option>
|
||||
<option value="date-eur" {{#if selectedDateEur}} selected {{/if}}>{{#translate}}Date (DD/MM/YYYY){{/translate}}</option>
|
||||
</optgroup>
|
||||
<optgroup label="{{#translate}}Birthday{{/translate}}">
|
||||
<option value="birthday-us" {{#if selectedBirthdayUs}} selected {{/if}}>{{#translate}}Birthday (MM/DD){{/translate}}</option>
|
||||
<option value="birthday-eur" {{#if selectedBirthdayEur}} selected {{/if}}>{{#translate}}Birthday (DD/MM){{/translate}}</option>
|
||||
</optgroup>
|
||||
<optgroup label="{{#translate}}Grouped{{/translate}}">
|
||||
<option value="dropdown" {{#if selectedDropdown}} selected {{/if}}>{{#translate}}Drop Downs{{/translate}}</option>
|
||||
<option value="radio" {{#if selectedRadio}} selected {{/if}}>{{#translate}}Radio Buttons{{/translate}}</option>
|
||||
<option value="checkbox" {{#if selectedCheckbox}} selected {{/if}}>{{#translate}}Checkboxes{{/translate}}</option>
|
||||
</optgroup>
|
||||
<option value="option" {{#if selectedOption}} selected {{/if}}>{{#translate}}Option for a group value{{/translate}}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{#if groups}}
|
||||
|
||||
<div class="form-group">
|
||||
<label for="group" class="col-sm-2 control-label">{{#translate}}Group{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" name="group">
|
||||
<option value=""> –– {{#translate}}Select{{/translate}} ––</option>
|
||||
{{#each groups}}
|
||||
<option value="{{id}}" {{#if selected}} selected {{/if}}>{{name}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
<span class="help-block">{{#translate}}Required for group options{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{/if}}
|
||||
|
||||
<div class="form-group">
|
||||
<label for="key" class="col-sm-2 control-label">{{#translate}}Merge tag{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control text-uppercase" name="key" id="key" value="{{field.key}}" placeholder="{{#translate}}Merge Tag{{/translate}}">
|
||||
<span class="help-block">{{#translate}}Put this tag in your content:{{/translate}} <strong>[{{#if field.key}}{{field.key}}{{else}}TAG_VALUE{{/if}}]</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{#if field.isGroup}}
|
||||
|
||||
<div class="form-group">
|
||||
<label for="group-template" class="col-sm-2 control-label">{{#translate}}Template{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control gpg-text" rows="3" name="group-template" id="description">{{field.groupTemplate}}</textarea>
|
||||
<span class="help-block">{{#translate}}For group elements like checkboxes you can control the appearance of the merge tag with an optional template. The template uses handlebars syntax and you can find all values from <code>\{{values}}</code> array, for example <code>\{{#each values}} \{{this}} \{{/each}}</code>. If template is not defined then multiple values are joined with commas. You can also use this template to render JSON values (if the JSON is an array then the array is exposed as <code>values</code>, otherwise you can access the JSON keys directly).{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{else}}
|
||||
<div class="form-group">
|
||||
<label for="default-value" class="col-sm-2 control-label">{{#translate}}Default merge tag value{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="default-value" id="default-value" value="{{field.defaultValue}}" placeholder="{{#translate}}Default merge tag value{{/translate}}">
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-xs-4">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="visible" {{#if field.visible}} checked {{/if}}> {{#translate}}Visible{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="pull-right">
|
||||
<button type="submit" form="fields-delete" class="btn btn-danger"><i class="glyphicon glyphicon-remove"></i> {{#translate}}Delete Field{{/translate}}</button>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-ok"></i> {{#translate}}Update{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,95 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li><a href="/lists/view/{{list.id}}">{{list.name}}</a></li>
|
||||
<li class="active">{{#translate}}Custom Fields{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<div class="pull-right">
|
||||
<a class="btn btn-primary" href="/fields/{{list.id}}/create" role="button"><i class="glyphicon glyphicon-plus"></i> {{#translate}}Create Custom Field{{/translate}}</a>
|
||||
</div>
|
||||
|
||||
<h2>{{list.name}} <small>{{#translate}}Custom Fields{{/translate}}</small></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover" data-row-sort="0,1,1,1,0,0">
|
||||
<thead>
|
||||
<th class="col-md-1">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Name{{/translate}}
|
||||
</th>
|
||||
<th class="col-md-2">
|
||||
{{#translate}}Type{{/translate}}
|
||||
</th>
|
||||
<th class="col-md-2">
|
||||
{{#translate}}Merge tag{{/translate}}
|
||||
</th>
|
||||
<th class="col-md-2">
|
||||
{{#translate}}Default merge tag value{{/translate}}
|
||||
</th>
|
||||
<th class="col-md-1">
|
||||
|
||||
</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#each rows}}
|
||||
<tr>
|
||||
<th scope="row">
|
||||
{{index}}
|
||||
</th>
|
||||
<td>
|
||||
<span class="glyphicon glyphicon-tasks" aria-hidden="true"></span> {{name}}
|
||||
</td>
|
||||
<td>
|
||||
{{type}}
|
||||
</td>
|
||||
<td>
|
||||
<strong>[{{key}}]</strong>
|
||||
</td>
|
||||
<td class="text-muted">
|
||||
{{defaultValue}}
|
||||
</td>
|
||||
<td>
|
||||
<span class="glyphicon glyphicon-wrench" aria-hidden="true"></span>
|
||||
<a href="/fields/{{../list.id}}/edit/{{id}}">
|
||||
{{#translate}}Edit{{/translate}}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{{#if options}}
|
||||
{{#each options}}
|
||||
<tr>
|
||||
<th scope="row">
|
||||
{{index}}
|
||||
</th>
|
||||
<td colspan="2">
|
||||
<span class="glyphicon glyphicon-record" aria-hidden="true"></span> {{name}}
|
||||
</td>
|
||||
<td>
|
||||
<strong>[{{key}}]</strong>
|
||||
</td>
|
||||
<td class="text-muted">
|
||||
{{defaultValue}}
|
||||
</td>
|
||||
<td>
|
||||
<span class="glyphicon glyphicon-wrench" aria-hidden="true"></span>
|
||||
<a href="/fields/{{../../list.id}}/edit/{{id}}">{{#translate}}Edit{{/translate}}</a>
|
||||
</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
{{#unless rows}}
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
{{#translate}}No data available in table{{/translate}}
|
||||
</td>
|
||||
</tr>
|
||||
{{/unless}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
|
@ -1,27 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li><a href="/lists/view/{{list.id}}">{{list.name}}</a></li>
|
||||
<li><a href="/forms/{{list.id}}">{{#translate}}Custom Forms{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Create Form{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{list.name}} <small>{{#translate}}Create Custom Form{{/translate}}</small></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/forms/{{list.id}}/create">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<div class="form-group">
|
||||
<label for="name" class="col-sm-2 control-label">{{#translate}}Form Name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control input-lg" name="name" id="name" value="{{name}}" placeholder="{{#translate}}Form Name{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-plus"></i> {{#translate}}Add Form{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,291 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li><a href="/lists/view/{{list.id}}">{{list.name}}</a></li>
|
||||
<li><a href="/forms/{{list.id}}">{{#translate}}Custom Forms{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Edit Form{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{list.name}} <small>{{#translate}}Edit Custom Form{{/translate}}</small> <a class="btn btn-default btn-xs" href="/forms/{{list.id}}" role="button"><span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span> {{#translate}}Back to forms{{/translate}}</a></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form method="post" class="delete-form" id="forms-delete" action="/forms/{{list.id}}/delete">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{form.id}}">
|
||||
</form>
|
||||
|
||||
<form class="form-horizontal" method="post" id="forms-update" action="/forms/{{list.id}}/edit">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{form.id}}">
|
||||
<input type="hidden" name="fields_shown_on_subscribe" value="{{form.fieldsShownOnSubscribe}}">
|
||||
<input type="hidden" name="fields_shown_on_manage" value="{{form.fieldsShownOnManage}}">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="name" class="col-sm-2 control-label">{{#translate}}Form Name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control input-lg" name="name" id="name" value="{{form.name}}" placeholder="{{#translate}}Form Name{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="form-description" class="col-sm-2 control-label">{{#translate}}Description{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control" id="form-description" name="description" rows="3" placeholder="{{#translate}}Optional comments about this form{{/translate}}">{{form.description}}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="previewLinks" class="col-sm-2 control-label">{{#translate}}Form Preview{{/translate}}</label>
|
||||
<div class="col-sm-10" id="previewLinks">
|
||||
<div class="help-block">
|
||||
<small>
|
||||
{{#translate}}Note: These links are solely for a quick preview. If you submit a preview form you'll get redirected to the list's default form.{{/translate}}
|
||||
</small>
|
||||
</div>
|
||||
<p>
|
||||
<a href="/subscription/{{list.cid}}?fid={{form.id}}" target="_blank">{{#translate}}Subscribe{{/translate}}</a>
|
||||
|
|
||||
<a href="/subscription/{{list.cid}}/confirm-subscription-notice?fid={{form.id}}" target="_blank">{{#translate}}Confirm Subscription Notice{{/translate}}</a>
|
||||
|
|
||||
<a href="/subscription/{{list.cid}}/confirm-unsubscription-notice?fid={{form.id}}" target="_blank">{{#translate}}Confirm Unsubscription Notice{{/translate}}</a>
|
||||
|
|
||||
<a href="/subscription/{{list.cid}}/subscribed-notice?fid={{form.id}}" target="_blank">{{#translate}}Subscribed Notice{{/translate}}</a>
|
||||
|
|
||||
<a href="/subscription/{{list.cid}}/updated-notice?fid={{form.id}}" target="_blank">{{#translate}}Updated Notice{{/translate}}</a>
|
||||
|
|
||||
<a href="/subscription/{{list.cid}}/unsubscribed-notice?fid={{form.id}}" target="_blank">{{#translate}}Unsubscribed Notice{{/translate}}</a>
|
||||
|
|
||||
<a href="/subscription/{{list.cid}}/manual-unsubscribe-notice?fid={{form.id}}" target="_blank">{{#translate}}Manual Unsubscribe Notice{{/translate}}</a>
|
||||
{{#if testUsers}}
|
||||
|
|
||||
<a href="/subscription/{{list.cid}}/unsubscribe/{{testUsers.0.cid}}?fid={{form.id}}&formTest=1" target="_blank">{{#translate}}Unsubscribe{{/translate}}</a>
|
||||
|
|
||||
<a href="/subscription/{{list.cid}}/manage/{{testUsers.0.cid}}?fid={{form.id}}" target="_blank">{{#translate}}Manage{{/translate}}</a>
|
||||
|
|
||||
<a href="/subscription/{{list.cid}}/manage-address/{{testUsers.0.cid}}?fid={{form.id}}" target="_blank">{{#translate}}Manage Address{{/translate}}</a>
|
||||
{{else}}
|
||||
|
|
||||
<small class="text-muted">{{#translate}}Create a test user for additional options{{/translate}}</small>
|
||||
{{/if}}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<p><br></p>
|
||||
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<ul class="nav nav-tabs" role="tablist">
|
||||
<li role="presentation" class="active"><a href="#templates" aria-controls="templates" role="tab" data-toggle="tab">{{#translate}}Templates{{/translate}}</a></li>
|
||||
<li role="presentation"><a href="#fields" aria-controls="fields" role="tab" data-toggle="tab">{{#translate}}Fields{{/translate}}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="tab-content">
|
||||
|
||||
<div role="tabpanel" class="tab-pane active" id="templates">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="form-header" class="col-sm-2 control-label">{{#translate}}Edit{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" id="templateSelect">
|
||||
{{#each templateOptgroups}}
|
||||
<optgroup label="{{label}}">
|
||||
{{#each opts}}
|
||||
<option value="{{name}}">{{label}}</option>
|
||||
{{/each}}
|
||||
</optgroup>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
var forceAceRender = function(name) {
|
||||
var div = $('.form-group.template.' + name).find('.ace_editor')[0];
|
||||
div.env && div.env.editor && div.env.editor.resize(true);
|
||||
};
|
||||
$('#templateSelect').on('change', function() {
|
||||
$('.form-group.template').hide();
|
||||
var name = $(this).val();
|
||||
$('.form-group.template.' + name).show();
|
||||
forceAceRender(name);
|
||||
});
|
||||
$('ul.nav-tabs > li > a').on('shown.bs.tab', function(e) {
|
||||
var id = $(e.target).attr('href').substr(1);
|
||||
id === 'templates' && forceAceRender($('#templateSelect').val());
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
{{#each templateOptgroups}}
|
||||
{{#each opts}}
|
||||
<div class="form-group template {{name}}" {{#unless isLayout}}style="display: none;"{{/unless}}>
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="help-block" style="margin-top: -8px;">
|
||||
<small>{{#if help}}{{{help}}}{{else}} {{/if}}</small>
|
||||
</div>
|
||||
<div class="code-editor-{{type}}" style="height: 700px; border: 1px solid #ccc;"></div>
|
||||
<input type="hidden" name="{{name}}" value="{{value}}">
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
{{/each}}
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Fields -->
|
||||
|
||||
<style>
|
||||
ul.fields {
|
||||
min-height: 54px;
|
||||
border: 1px dashed #ccc;
|
||||
margin: 0;
|
||||
padding: 11px 10px 10px;
|
||||
background: #efefef;
|
||||
}
|
||||
ul.fields li {
|
||||
list-style: none;
|
||||
margin: -1px 0 0;
|
||||
padding: 0 10px;
|
||||
background: #fff;
|
||||
border: 1px solid #ccc;
|
||||
line-height: 30px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
cursor: move;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
jQuery.get('/javascript/jquery-ui-1.12.1.min.js', undefined, function() {
|
||||
|
||||
$('.fieldsHiddenOnSubscribe, .fieldsShownOnSubscribe').sortable({
|
||||
connectWith: '.connectedSortableSubscribe'
|
||||
}).disableSelection();
|
||||
|
||||
$('.fieldsHiddenOnManage, .fieldsShownOnManage').sortable({
|
||||
connectWith: '.connectedSortableManage'
|
||||
}).disableSelection();
|
||||
|
||||
$('#forms-update').on('submit', function(e) {
|
||||
var s = [];
|
||||
var m = [];
|
||||
$('.fieldsShownOnSubscribe > li').each(function() {
|
||||
s.push($(this).data('field-id'));
|
||||
});
|
||||
$('.fieldsShownOnManage > li').each(function() {
|
||||
m.push($(this).data('field-id'));
|
||||
});
|
||||
$('input[name=fields_shown_on_subscribe]').val(s.join(','));
|
||||
$('input[name=fields_shown_on_manage]').val(m.join(','));
|
||||
});
|
||||
|
||||
}, 'script');
|
||||
});
|
||||
</script>
|
||||
|
||||
<div role="tabpanel" class="tab-pane" id="fields">
|
||||
<div class="form-group">
|
||||
<label for="form-fields" class="col-sm-2 control-label">{{#translate}}Form Fields{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<div class="row">
|
||||
|
||||
<div class="col-sm-6">
|
||||
<h6>{{#translate}}Fields hidden on subscription page:{{/translate}}</h6>
|
||||
<ul class="fields fieldsHiddenOnSubscribe connectedSortableSubscribe">
|
||||
{{#each fieldsHiddenOnSubscribe}}
|
||||
<li class="ui-state-default" data-field-id="{{id}}">
|
||||
{{name}}
|
||||
<span style="font-size: 10px; color: #aaa; float: right;">{{type}}</span>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
<h6>{{#translate}}Fields shown on subscription page:{{/translate}}</h6>
|
||||
<ul class="fields fieldsShownOnSubscribe connectedSortableSubscribe">
|
||||
{{#each fieldsShownOnSubscribe}}
|
||||
<li class="ui-state-default" data-field-id="{{id}}">
|
||||
{{name}}
|
||||
<span style="font-size: 10px; color: #aaa; float: right;">{{type}}</span>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
<br>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6">
|
||||
<h6>{{#translate}}Fields hidden on preferences page:{{/translate}}</h6>
|
||||
<ul class="fields fieldsHiddenOnManage connectedSortableManage">
|
||||
{{#each fieldsHiddenOnManage}}
|
||||
<li class="ui-state-default" data-field-id="{{id}}">
|
||||
{{name}}
|
||||
<span style="font-size: 10px; color: #aaa; float: right;">{{type}}</span>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
<h6>{{#translate}}Fields shown on preferences page:{{/translate}}</h6>
|
||||
<ul class="fields fieldsShownOnManage connectedSortableManage">
|
||||
{{#each fieldsShownOnManage}}
|
||||
<li class="ui-state-default" data-field-id="{{id}}">
|
||||
{{name}}
|
||||
<span style="font-size: 10px; color: #aaa; float: right;">{{type}}</span>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
<br>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- end .tab-content -->
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="pull-right">
|
||||
<button type="submit" form="forms-delete" class="btn btn-danger"><i class="glyphicon glyphicon-remove"></i> {{#translate}}Delete Form{{/translate}}</button>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-ok"></i> {{#translate}}Update{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
||||
<script src="/javascript/cookie.2.1.3.js"></script>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
|
||||
// Remember Tab
|
||||
var tab = Cookies.get('tab');
|
||||
tab && $('ul.nav-tabs > li > a[href="#' + tab + '"]').click();
|
||||
$('ul.nav-tabs > li > a').on('shown.bs.tab', function(e) {
|
||||
var id = $(e.target).attr('href').substr(1);
|
||||
Cookies.set('tab', id, { expires: 7, path: '' });
|
||||
});
|
||||
|
||||
// Remember Template
|
||||
var tmpl = Cookies.get('tmpl');
|
||||
tmpl && $('#templateSelect').val(tmpl).trigger('change');
|
||||
$('#templateSelect').on('change', function() {
|
||||
Cookies.set('tmpl', $(this).val(), { expires: 7, path: '' });
|
||||
});
|
||||
|
||||
$('a.mjml-documentation')
|
||||
.attr('href', 'https://mjml.io/documentation/')
|
||||
.attr('target', '_blank')
|
||||
.attr('rel', 'noreferrer')
|
||||
|
||||
});
|
||||
</script>
|
|
@ -1,87 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li><a href="/lists/view/{{list.id}}">{{list.name}}</a></li>
|
||||
<li class="active">{{#translate}}Custom Forms{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<div class="pull-right">
|
||||
<a class="btn btn-primary" href="/forms/{{list.id}}/create" role="button"><i class="glyphicon glyphicon-plus"></i> {{#translate}}Create Custom Form{{/translate}}</a>
|
||||
</div>
|
||||
|
||||
<h2>{{list.name}} <small>{{#translate}}Custom Forms{{/translate}}</small></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover">
|
||||
<thead>
|
||||
<th style="width: auto;" class="text-right">
|
||||
#
|
||||
</th>
|
||||
<th style="width: 30%;">
|
||||
{{#translate}}Name{{/translate}}
|
||||
</th>
|
||||
<th style="width: 60%;">
|
||||
{{#translate}}Description{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
|
||||
</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#each customForms}}
|
||||
<tr>
|
||||
<th scope="row" class="text-right">
|
||||
{{index}}
|
||||
</th>
|
||||
<td>
|
||||
{{#if isDefaultForm}}
|
||||
<span class="glyphicon glyphicon-star" style="color: #DE4320; font-size: .8em; font-weight: bold; padding-right: 2px;"></span>
|
||||
{{else}}
|
||||
<span class="glyphicon glyphicon-star-empty" style="color: #ccc; font-size: .8em; padding-right: 2px;"></span>
|
||||
{{/if}}
|
||||
{{name}}
|
||||
</td>
|
||||
<td class="text-muted">
|
||||
{{description}}
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<a href="/forms/{{../list.id}}/edit/{{id}}">
|
||||
{{#translate}}Edit{{/translate}}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
{{#unless customForms}}
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
{{#translate}}No data available in table{{/translate}}
|
||||
</td>
|
||||
</tr>
|
||||
{{/unless}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
||||
<form class="form-inline" method="post" action="/lists/edit?next=%2Fforms%2F{{list.id}}">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{list.id}}" />
|
||||
<input type="hidden" name="customFormChangeOnly" value="1" />
|
||||
|
||||
<div class="form-group">
|
||||
<label for="default_form" class="control-label" style="color: #666; font-weight: normal;">{{#translate}}The default form for this list is:{{/translate}}</label>
|
||||
|
||||
<select class="form-control input-sm" id="default_form" name="default_form">
|
||||
<option value="0">{{#translate}}Default Mailtrain Form{{/translate}}</option>
|
||||
{{#each customForms}}
|
||||
<option value="{{id}}" {{#if isDefaultForm}}selected{{/if}}>{{name}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
<button type="submit" class="btn btn-default btn-sm">{{#translate}}Update{{/translate}}</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
||||
<p><br></p>
|
|
@ -1,37 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Lists{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<div class="pull-right">
|
||||
<a class="btn btn-primary" href="/lists/create" role="button"><i class="glyphicon glyphicon-plus"></i> {{#translate}}Create List{{/translate}}</a>
|
||||
</div>
|
||||
|
||||
<h2>{{#translate}}Lists{{/translate}}</h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table data-topic-url="/lists" data-sort-column="1" data-sort-order="asc" class="table table-bordered table-hover data-table-ajax display nowrap" width="100%" data-row-sort="0,1,1,1,0,0">
|
||||
<thead>
|
||||
<th style="width: 1%">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}ID{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Subscribers{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Description{{/translate}}
|
||||
</th>
|
||||
<th style="width: 1%">
|
||||
|
||||
</th>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
|
@ -1,38 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li><a href="/lists/view/{{list.id}}">{{list.name}}</a></li>
|
||||
<li><a href="/segments/{{list.id}}">{{#translate}}Segments{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Create Segment{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{list.name}} <small>{{#translate}}Create Segment{{/translate}}</small></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/segments/{{list.id}}/create">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<div class="form-group">
|
||||
<label for="name" class="col-sm-2 control-label">{{#translate}}Segment Name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control input-lg" name="name" id="name" value="{{name}}" placeholder="{{#translate}}Segment Name{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="group" class="col-sm-2 control-label">{{#translate}}Rule match{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" name="type">
|
||||
<option value=""> –– {{#translate}}Select{{/translate}} ––</option>
|
||||
<option value="1" {{#if matchAll}} selected {{/if}}>{{#translate}}All rules must match{{/translate}}</option>
|
||||
<option value="2" {{#if matchAny}} selected {{/if}}>{{#translate}}Any rule can match{{/translate}}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-plus"></i> {{#translate}}Add Segment{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,48 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li><a href="/lists/view/{{list.id}}">{{list.name}}</a></li>
|
||||
<li><a href="/segments/{{list.id}}">{{#translate}}Segments{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Edit Segment{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{list.name}} <small>{{#translate}}Edit Segment{{/translate}}</small> <a class="btn btn-default btn-xs" href="/segments/{{list.id}}" role="button"><span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span> {{#translate}}Back to segments{{/translate}}</a></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form method="post" class="delete-form" id="segments-delete" action="/segments/{{list.id}}/delete">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
</form>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/segments/{{list.id}}/edit">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
|
||||
<div class="form-group">
|
||||
<label for="name" class="col-sm-2 control-label">{{#translate}}Segment Name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control input-lg" name="name" id="name" value="{{name}}" placeholder="{{#translate}}Segment Name{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="group" class="col-sm-2 control-label">{{#translate}}Rule match{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" name="type">
|
||||
<option value=""> –– {{#translate}}Select{{/translate}} ––</option>
|
||||
<option value="1" {{#if matchAll}} selected {{/if}}>{{#translate}}All rules must match{{/translate}}</option>
|
||||
<option value="2" {{#if matchAny}} selected {{/if}}>{{#translate}}Any rule can match{{/translate}}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="pull-right">
|
||||
<button type="submit" form="segments-delete" class="btn btn-danger"><i class="glyphicon glyphicon-remove"></i> {{#translate}}Delete Segment{{/translate}}</button>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-ok"></i> {{#translate}}Update{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,254 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li><a href="/lists/view/{{list.id}}">{{list.name}}</a></li>
|
||||
<li><a href="/segments/{{list.id}}">{{#translate}}Segments{{/translate}}</a></li>
|
||||
<li><a href="/segments/{{list.id}}/view/{{id}}">{{name}}</a></li>
|
||||
<li class="active">{{#translate}}Create Segment{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{list.name}} <small>{{#translate}}Create Rule{{/translate}}</small></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/segments/{{list.id}}/rules/{{id}}/create">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="column" value="{{column.column}}">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="column" class="col-sm-2 control-label">{{#translate}}Rule{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<p class="form-control-static"><strong>{{column.name}}</strong></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{#if columnTypeString}}
|
||||
<div class="form-group">
|
||||
<label for="value" class="col-sm-2 control-label">{{#translate}}Value{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="value" id="value" value="{{value.value}}" placeholder="{{#translate}}Value{{/translate}}">
|
||||
<span class="help-block">{{#translate}}Use % for wildcard character, e.g. "%test" to match all values that end with "test"{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if columnTypeNumber}}
|
||||
<div class="form-group">
|
||||
<label for="value" class="col-sm-2 control-label">{{#translate}}Value{{/translate}}</label>
|
||||
<div class="col-sm-10 radio">
|
||||
<label>
|
||||
<input type="radio" name="range" value="" {{#unless value.range}} checked {{/unless}}> {{#translate}}Use exact match{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-5">
|
||||
<input type="number" class="form-control" name="value" id="value" value="{{value.value}}" placeholder="0">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10 radio">
|
||||
<label>
|
||||
<input type="radio" name="range" value="yes" {{#if value.range}} checked {{/if}}> {{#translate}}Use range match{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10 radio">
|
||||
<div class="row">
|
||||
<div class="col-md-1">
|
||||
<p class="form-control-static">From</p>
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<input type="number" class="form-control" name="start" value="{{value.start}}" placeholder="0">
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<p class="form-control-static text-center">to</p>
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<input type="number" class="form-control" name="end" value="{{value.end}}" placeholder="0">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{/if}}
|
||||
|
||||
{{#if columnTypeDate}}
|
||||
<div class="form-group">
|
||||
<label for="value" class="col-sm-2 control-label">{{#translate}}Value{{/translate}}</label>
|
||||
<div class="col-sm-10 radio">
|
||||
<label>
|
||||
<input type="radio" name="range" value="" {{#unless value.range}} {{#unless value.relativeRange}} checked {{/unless}} {{/unless}}> {{#translate}}Use exact match{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-5">
|
||||
<div class="input-group date fm-date-generic">
|
||||
<input type="text" class="form-control" name="value" placeholder="YYYY-MM-DD" value="{{value.value}}"><span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10 radio">
|
||||
<label>
|
||||
<input type="radio" name="range" value="yes" {{#if value.range}} checked {{/if}}> {{#translate}}Use range match{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10 radio">
|
||||
<div class="row">
|
||||
<div class="col-md-1">
|
||||
<p class="form-control-static">From</p>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="input-group date fm-date-generic">
|
||||
<input type="text" class="form-control" name="start" placeholder="YYYY-MM-DD" value="{{value.start}}"><span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<p class="form-control-static text-center">to</p>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="input-group date fm-date-generic">
|
||||
<input type="text" class="form-control" name="end" placeholder="YYYY-MM-DD" value="{{value.end}}"><span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10 radio">
|
||||
<label>
|
||||
<input type="radio" name="range" value="relative" {{#if value.relativeRange}} checked {{/if}}> {{#translate}}Use relative range match{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10 radio">
|
||||
<div class="row">
|
||||
<div class="col-md-1">
|
||||
<p class="form-control-static">{{#translate}}From{{/translate}}</p>
|
||||
</div>
|
||||
<div class="col-md-4 form-inline">
|
||||
<div class="input-group">
|
||||
<input type="number" class="form-control" name="start-relative" placeholder="0" {{#if value.relativeRange}} value="{{value.start}}" {{/if}}>
|
||||
<div class="input-group-addon">
|
||||
{{#translate}}days{{/translate}}
|
||||
<select name="start-direction">
|
||||
<option value="0">
|
||||
{{#translate}}before today{{/translate}}
|
||||
</option>
|
||||
<option value="1" {{#if value.startDirection}} selected {{/if}}>
|
||||
{{#translate}}after today{{/translate}}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<p class="form-control-static text-center">{{#translate}}to{{/translate}}</p>
|
||||
</div>
|
||||
<div class="col-md-4 form-inline">
|
||||
<div class="input-group">
|
||||
<input type="number" class="form-control" name="end-relative" placeholder="0" {{#if value.relativeRange}} value="{{value.end}}" {{/if}}>
|
||||
<div class="input-group-addon">
|
||||
{{#translate}}days{{/translate}}
|
||||
<select name="end-direction">
|
||||
<option value="0">
|
||||
{{#translate}}before today{{/translate}}
|
||||
</option>
|
||||
<option value="1" {{#if value.endDirection}} selected {{/if}}>
|
||||
{{#translate}}after today{{/translate}}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if columnTypeBirthday}}
|
||||
<div class="form-group">
|
||||
<label for="value" class="col-sm-2 control-label">{{#translate}}Value{{/translate}}</label>
|
||||
<div class="col-sm-10 radio">
|
||||
<label>
|
||||
<input type="radio" name="range" value="" {{#unless isRange}} checked {{/unless}}> {{#translate}}Use exact match{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-5">
|
||||
<div class="input-group date fm-birthday-generic">
|
||||
<input type="text" class="form-control" name="value" placeholder="MM-DD" value="{{value.value}}"><span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10 radio">
|
||||
<label>
|
||||
<input type="radio" name="range" value="yes" {{#if isRange}} checked {{/if}}> {{#translate}}Use range match{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10 radio">
|
||||
<div class="row">
|
||||
<div class="col-md-1">
|
||||
<p class="form-control-static">{{#translate}}From{{/translate}}</p>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="input-group date fm-birthday-generic">
|
||||
<input type="text" class="form-control" name="start" placeholder="MM-DD" value="{{value.start}}"><span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<p class="form-control-static text-center">{{#translate}}to{{/translate}}</p>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="input-group date fm-birthday-generic">
|
||||
<input type="text" class="form-control" name="end" placeholder="MM-DD" value="{{value.end}}"><span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if columnTypeBoolean}}
|
||||
<div class="form-group">
|
||||
<label for="value" class="col-sm-2 control-label">{{#translate}}Value{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="value" value="yes" {{#if value.value}} checked {{/if}}> {{#translate}}Selected{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="value" value="" {{#unless value.value}} checked {{/unless}}> {{#translate}}Not selected{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{/if}}
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-plus"></i> {{#translate}}Add Rule{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,34 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li><a href="/lists/view/{{list.id}}">{{list.name}}</a></li>
|
||||
<li><a href="/segments/{{list.id}}">{{#translate}}Segments{{/translate}}</a></li>
|
||||
<li><a href="/segments/{{list.id}}/view/{{id}}">{{name}}</a></li>
|
||||
<li class="active">{{#translate}}Create Segment{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{list.name}} <small>{{#translate}}Create Rule{{/translate}}</small></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/segments/{{list.id}}/rules/{{id}}/next">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="column" class="col-sm-2 control-label">{{#translate}}Rule{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select id="column" class="form-control" name="column" required>
|
||||
<option value=""> –– {{#translate}}Select{{/translate}} ––</option>
|
||||
{{#each columns}}
|
||||
<option value="{{column}}" {{#if selected}} selected {{/if}}>{{name}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary"><span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span> {{#translate}}Next{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,262 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li><a href="/lists/view/{{list.id}}">{{list.name}}</a></li>
|
||||
<li><a href="/segments/{{list.id}}">{{#translate}}Segments{{/translate}}</a></li>
|
||||
<li><a href="/segments/{{list.id}}/view/{{segment.id}}">{{name}}</a></li>
|
||||
<li class="active">{{#translate}}Create Segment{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{list.name}} <small>{{#translate}}Create Rule{{/translate}}</small></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form method="post" class="delete-form" id="rule-delete" action="/segments/{{list.id}}/rules/{{segment.id}}/delete">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
</form>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/segments/{{list.id}}/rules/{{segment.id}}/edit">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="column" class="col-sm-2 control-label">{{#translate}}Rule{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<p class="form-control-static"><strong>{{column.name}}</strong></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{#if columnTypeString}}
|
||||
<div class="form-group">
|
||||
<label for="value" class="col-sm-2 control-label">{{#translate}}Value{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="value" id="value" value="{{value.value}}" placeholder="{{#translate}}Value{{/translate}}">
|
||||
<span class="help-block">{{#translate}}Use % for wildcard character, e.g. "%test" to match all values that end with "test"{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if columnTypeNumber}}
|
||||
<div class="form-group">
|
||||
<label for="value" class="col-sm-2 control-label">{{#translate}}Value{{/translate}}</label>
|
||||
<div class="col-sm-10 radio">
|
||||
<label>
|
||||
<input type="radio" name="range" value="" {{#unless value.range}} checked {{/unless}}> {{#translate}}Use exact match{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-5">
|
||||
<input type="number" class="form-control" name="value" id="value" value="{{value.value}}" placeholder="0">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10 radio">
|
||||
<label>
|
||||
<input type="radio" name="range" value="yes" {{#if value.range}} checked {{/if}}> {{#translate}}Use range match{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10 radio">
|
||||
<div class="row">
|
||||
<div class="col-md-1">
|
||||
<p class="form-control-static">{{#translate}}From{{/translate}}</p>
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<input type="number" class="form-control" name="start" value="{{value.start}}" placeholder="0">
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<p class="form-control-static text-center">{{#translate}}to{{/translate}}</p>
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<input type="number" class="form-control" name="end" value="{{value.end}}" placeholder="0">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{/if}}
|
||||
|
||||
{{#if columnTypeDate}}
|
||||
<div class="form-group">
|
||||
<label for="value" class="col-sm-2 control-label">{{#translate}}Value{{/translate}}</label>
|
||||
<div class="col-sm-10 radio">
|
||||
<label>
|
||||
<input type="radio" name="range" value="" {{#unless value.range}} {{#unless value.relativeRange}} checked {{/unless}} {{/unless}}> {{#translate}}Use exact match{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-5">
|
||||
<div class="input-group date fm-date-generic">
|
||||
<input type="text" class="form-control" name="value" placeholder="YYYY-MM-DD" value="{{value.value}}"><span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10 radio">
|
||||
<label>
|
||||
<input type="radio" name="range" value="yes" {{#if value.range}} checked {{/if}}> {{#translate}}Use range match{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10 radio">
|
||||
<div class="row">
|
||||
<div class="col-md-1">
|
||||
<p class="form-control-static">{{#translate}}From{{/translate}}</p>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="input-group date fm-date-generic">
|
||||
<input type="text" class="form-control" name="start" placeholder="YYYY-MM-DD" {{#if value.range}} value="{{value.start}}" {{/if}}><span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<p class="form-control-static text-center">{{#translate}}to{{/translate}}</p>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="input-group date fm-date-generic">
|
||||
<input type="text" class="form-control" name="end" placeholder="YYYY-MM-DD" {{#if value.range}} value="{{value.end}}" {{/if}}><span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10 radio">
|
||||
<label>
|
||||
<input type="radio" name="range" value="relative" {{#if value.relativeRange}} checked {{/if}}> {{#translate}}Use relative range match{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10 radio">
|
||||
<div class="row">
|
||||
<div class="col-md-1">
|
||||
<p class="form-control-static">{{#translate}}From{{/translate}}</p>
|
||||
</div>
|
||||
<div class="col-md-4 form-inline">
|
||||
<div class="input-group">
|
||||
<input type="number" class="form-control" name="start-relative" placeholder="0" {{#if value.relativeRange}} value="{{value.start}}" {{/if}}>
|
||||
<div class="input-group-addon">
|
||||
{{#translate}}days{{/translate}}
|
||||
<select name="start-direction">
|
||||
<option value="0">
|
||||
{{#translate}}before today{{/translate}}
|
||||
</option>
|
||||
<option value="1" {{#if value.startDirection}} selected {{/if}}>
|
||||
{{#translate}}after today{{/translate}}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<p class="form-control-static text-center">{{#translate}}to{{/translate}}</p>
|
||||
</div>
|
||||
<div class="col-md-4 form-inline">
|
||||
<div class="input-group">
|
||||
<input type="number" class="form-control" name="end-relative" placeholder="0" {{#if value.relativeRange}} value="{{value.end}}" {{/if}}>
|
||||
<div class="input-group-addon">
|
||||
{{#translate}}days{{/translate}}
|
||||
<select name="end-direction">
|
||||
<option value="0">
|
||||
{{#translate}}before today{{/translate}}
|
||||
</option>
|
||||
<option value="1" {{#if value.endDirection}} selected {{/if}}>
|
||||
{{#translate}}after today{{/translate}}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if columnTypeBirthday}}
|
||||
<div class="form-group">
|
||||
<label for="value" class="col-sm-2 control-label">{{#translate}}Value{{/translate}}</label>
|
||||
<div class="col-sm-10 radio">
|
||||
<label>
|
||||
<input type="radio" name="range" value="" {{#unless value.range}} checked {{/unless}}> {{#translate}}Use exact match{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-5">
|
||||
<div class="input-group date fm-birthday-generic">
|
||||
<input type="text" class="form-control" name="value" placeholder="MM-DD" value="{{value.value}}"><span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10 radio">
|
||||
<label>
|
||||
<input type="radio" name="range" value="yes" {{#if value.range}} checked {{/if}}> {{#translate}}Use range match{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10 radio">
|
||||
<div class="row">
|
||||
<div class="col-md-1">
|
||||
<p class="form-control-static">{{#translate}}From{{/translate}}</p>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="input-group date fm-birthday-generic">
|
||||
<input type="text" class="form-control" name="start" placeholder="MM-DD" value="{{value.start}}"><span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<p class="form-control-static text-center">{{#translate}}to{{/translate}}</p>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="input-group date fm-birthday-generic">
|
||||
<input type="text" class="form-control" name="end" placeholder="MM-DD" value="{{value.end}}"><span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if columnTypeBoolean}}
|
||||
<div class="form-group">
|
||||
<label for="value" class="col-sm-2 control-label">{{#translate}}Value{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="value" value="yes" {{#if value.value}} checked {{/if}}> {{#translate}}Selected{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="value" value="" {{#unless value.value}} checked {{/unless}}> {{#translate}}Not selected{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{/if}}
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="pull-right">
|
||||
<button type="submit" form="rule-delete" class="btn btn-danger"><i class="glyphicon glyphicon-remove"></i> {{#translate}}Delete Rule{{/translate}}</button>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-ok"></i> {{#translate}}Update{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,57 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li><a href="/lists/view/{{list.id}}">{{list.name}}</a></li>
|
||||
<li class="active">{{#translate}}Segments{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<div class="pull-right">
|
||||
<a class="btn btn-primary" href="/segments/{{list.id}}/create" role="button"><i class="glyphicon glyphicon-plus"></i> {{#translate}}Create Segment{{/translate}}</a>
|
||||
</div>
|
||||
|
||||
<h2>{{list.name}} <small>{{#translate}}Segments{{/translate}}</small></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover data-table display nowrap" width="100%" data-row-sort="0,1,1,0">
|
||||
<thead>
|
||||
<th class="col-md-1">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Name{{/translate}}
|
||||
</th>
|
||||
<th class="col-md-2">
|
||||
{{#translate}}Match{{/translate}}
|
||||
</th>
|
||||
<th class="col-md-1">
|
||||
|
||||
</th>
|
||||
</thead>
|
||||
{{#if rows}}
|
||||
<tbody>
|
||||
{{#each rows}}
|
||||
<tr>
|
||||
<th scope="row">
|
||||
{{index}}
|
||||
</th>
|
||||
<td>
|
||||
<span class="glyphicon glyphicon-filter" aria-hidden="true"></span>
|
||||
<a href="/segments/{{../list.id}}/view/{{id}}">{{name}}</a>
|
||||
</td>
|
||||
<td>
|
||||
{{type}}
|
||||
</td>
|
||||
<td>
|
||||
<span class="glyphicon glyphicon-wrench" aria-hidden="true"></span>
|
||||
<a href="/segments/{{../list.id}}/edit/{{id}}">
|
||||
{{#translate}}Edit{{/translate}}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
{{/if}}
|
||||
</table>
|
||||
</div>
|
|
@ -1,68 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li><a href="/lists/view/{{list.id}}">{{list.name}}</a></li>
|
||||
<li><a href="/segments/{{list.id}}">{{#translate}}Segments{{/translate}}</a></li>
|
||||
<li class="active">{{name}}</li>
|
||||
</ol>
|
||||
|
||||
<div class="pull-right">
|
||||
<a class="btn btn-primary" href="/segments/{{list.id}}/rules/{{id}}/create" role="button"><i class="glyphicon glyphicon-plus"></i> {{#translate}}Create Rule{{/translate}}</a>
|
||||
</div>
|
||||
|
||||
<h2>{{list.name}} <small><span class="glyphicon glyphicon-filter" aria-hidden="true"></span> {{#translate}}Segment{{/translate}} {{name}}</small></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="well well-sm">
|
||||
<div class="pull-right">
|
||||
<a class="btn btn-primary btn-sm" href="/segments/{{list.id}}/edit/{{id}}" role="button"><i class="glyphicon glyphicon-wrench"></i> {{#translate}}Edit Segment{{/translate}}</a>
|
||||
</div>
|
||||
{{#translate}}Match rules{{/translate}}: <span class="label label-default">{{type}}</span>
|
||||
<br /> {{#translate}}Matching subscribers{{/translate}}: <span class="label label-default">{{subscribers}}</span> (
|
||||
<a href="/lists/view/{{list.id}}?segment={{id}}">{{#translate}}show{{/translate}}</a>)
|
||||
<br />
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover data-table display nowrap" width="100%" data-row-sort="0,1,0,0">
|
||||
<thead>
|
||||
<th class="col-md-1">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Rule{{/translate}}
|
||||
</th>
|
||||
<th class="col-md-2">
|
||||
{{#translate}}Value{{/translate}}
|
||||
</th>
|
||||
<th class="col-md-1">
|
||||
|
||||
</th>
|
||||
</thead>
|
||||
{{#if rules}}
|
||||
<tbody>
|
||||
{{#each rules}}
|
||||
<tr>
|
||||
<th scope="row">
|
||||
{{index}}
|
||||
</th>
|
||||
<td>
|
||||
{{name}}
|
||||
</td>
|
||||
<td>
|
||||
{{formatted}}
|
||||
</td>
|
||||
<td>
|
||||
<span class="glyphicon glyphicon-wrench" aria-hidden="true"></span>
|
||||
<a href="/segments/{{../list.id}}/rules/{{../id}}/edit/{{id}}">
|
||||
{{#translate}}Edit{{/translate}}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
{{/if}}
|
||||
</table>
|
||||
</div>
|
|
@ -1,162 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li><a href="/lists/view/{{list.id}}">{{list.name}}</a></li>
|
||||
<li class="active">
|
||||
{{#translate}}Add subscriber{{/translate}}
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{list.name}} <small>{{#translate}}Add subscriber{{/translate}}</small></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/lists/subscription/add">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="list" value="{{list.id}}">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="email" class="col-sm-2 control-label">{{#translate}}Email Address{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="email" class="form-control input-lg" name="email" id="email" placeholder="" value="{{email}}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="first-name" class="col-sm-2 control-label">{{#translate}}First Name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="first-name" id="first-name" placeholder="" value="{{firstName}}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="last-name" class="col-sm-2 control-label">{{#translate}}Last Name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="last-name" id="last-name" placeholder="" value="{{lastName}}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{#each customFields}}
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{name}}</label>
|
||||
<div class="col-sm-10">
|
||||
{{#if typeText}}
|
||||
<input type="text" class="form-control" name="{{column}}" value="{{value}}">
|
||||
{{/if}}
|
||||
|
||||
{{#if typeNumber}}
|
||||
<input type="number" class="form-control" name="{{column}}" value="{{value}}">
|
||||
{{/if}}
|
||||
|
||||
{{#if typeWebsite}}
|
||||
<input type="url" class="form-control" name="{{column}}" value="{{value}}">
|
||||
{{/if}}
|
||||
|
||||
{{#if typeLongtext}}
|
||||
<textarea class="form-control" rows="3" name="{{column}}">{{value}}</textarea>
|
||||
{{/if}}
|
||||
|
||||
{{#if typeJson}}
|
||||
<textarea class="form-control gpg-text" rows="3" name="{{column}}" placeholder="{"data":"value"}">{{value}}</textarea>
|
||||
{{/if}}
|
||||
|
||||
{{#if typeGpg}}
|
||||
<textarea class="form-control gpg-text" rows="3" name="{{column}}" placeholder="{{#translate}}Begins with{{/translate}} '-----BEGIN PGP PUBLIC KEY BLOCK-----'">{{value}}</textarea>
|
||||
<span class="help-block">{{#translate}}Insert a GPG public key that will be used to encrypt messages sent this subscriber{{/translate}}</span>
|
||||
{{/if}}
|
||||
|
||||
{{#if typeDateUs}}
|
||||
<div class="input-group date fm-date-us">
|
||||
<input type="text" class="form-control" name="{{column}}" placeholder="MM/DD/YYYY" value="{{value}}"><span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if typeDateEur}}
|
||||
<div class="input-group date fm-date-eur">
|
||||
<input type="text" class="form-control" name="{{column}}" placeholder="DD/MM/YYYY" value="{{value}}"><span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if typeBirthdayUs}}
|
||||
<div class="input-group date fm-birthday-us">
|
||||
<input type="text" class="form-control" name="{{column}}" placeholder="MM/DD" value="{{value}}"><span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if typeBirthdayEur}}
|
||||
<div class="input-group date fm-birthday-eur">
|
||||
<input type="text" class="form-control" name="{{column}}" placeholder="DD/MM" value="{{value}}"><span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if typeDropdown}}
|
||||
<select name="{{key}}" class="form-control">
|
||||
<option value="">
|
||||
–– {{#translate}}Select{{/translate}} ––
|
||||
</option>
|
||||
{{#each options}}
|
||||
<option value="{{column}}" {{#if value}} selected {{/if}}>{{name}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
{{/if}}
|
||||
|
||||
{{#if typeRadio}}
|
||||
{{#each options}}
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="{{../key}}" value="{{column}}" {{#if value}} checked {{/if}}> {{name}}
|
||||
</label>
|
||||
</div>
|
||||
{{/each}}
|
||||
{{/if}}
|
||||
|
||||
{{#if typeCheckbox}}
|
||||
{{#each options}}
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="{{column}}" value="1" {{#if value}} checked {{/if}}> {{name}}
|
||||
</label>
|
||||
</div>
|
||||
{{/each}}
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
|
||||
<div class="form-group">
|
||||
<label for="tz" class="col-sm-2 control-label">{{#translate}}Timezone{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select name="tz" class="form-control">
|
||||
<option value="">
|
||||
–– {{#translate}}Select{{/translate}} ––
|
||||
</option>
|
||||
{{#each timezones}}
|
||||
<option value="{{key}}" {{#if selected}} selected {{/if}}>{{value}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="is-test" {{#if isTest}} checked {{/if}}> {{#translate}}Test user?{{/translate}}
|
||||
<span class="help-block">{{#translate}}If checked then this subscription can be used for previewing campaign messages{{/translate}}</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<p class="text-warning">
|
||||
{{#translate}}This person will not receive a confirmation email so make sure that you have permission to email them.{{/translate}}
|
||||
</p>
|
||||
|
||||
<button type="submit" class="btn btn-primary">{{#translate}}Subscribe{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,186 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li><a href="/lists/view/{{list.id}}">{{list.name}}</a></li>
|
||||
<li class="active">
|
||||
{{#translate}}Edit subscriber{{/translate}}
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{list.name}} <small>{{#translate}}Edit subscriber{{/translate}}</small> <a class="btn btn-default btn-xs" href="/lists/view/{{list.id}}" role="button"><span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span> {{#translate}}Back to list{{/translate}}</a></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form method="post" class="delete-form" id="subscriber-unsubscribe" action="/lists/subscription/unsubscribe">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="list" value="{{list.id}}">
|
||||
<input type="hidden" name="cid" value="{{cid}}">
|
||||
</form>
|
||||
|
||||
<form method="post" id="subscriber-blacklist" action="/blacklist/ajax/add">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="email" value="{{email}}">
|
||||
<input type="hidden" name="next" value="/lists/view/{{list.id}}">
|
||||
</form>
|
||||
|
||||
<form method="post" class="delete-form" id="subscriber-delete" action="/lists/subscription/delete">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="list" value="{{list.id}}">
|
||||
<input type="hidden" name="cid" value="{{cid}}">
|
||||
</form>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/lists/subscription/edit">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="list" value="{{list.id}}">
|
||||
<input type="hidden" name="cid" value="{{cid}}">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="email" class="col-sm-2 control-label">{{#translate}}Email address{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="email" class="form-control input-lg" name="email" id="email" placeholder="" value="{{email}}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="first-name" class="col-sm-2 control-label">{{#translate}}First Name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="first-name" id="first-name" placeholder="" value="{{firstName}}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="last-name" class="col-sm-2 control-label">{{#translate}}Last Name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="last-name" id="last-name" placeholder="" value="{{lastName}}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{#each customFields}}
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{name}}</label>
|
||||
<div class="col-sm-10">
|
||||
{{#if typeText}}
|
||||
<input type="text" class="form-control" name="{{column}}" value="{{value}}">
|
||||
{{/if}}
|
||||
|
||||
{{#if typeNumber}}
|
||||
<input type="number" class="form-control" name="{{column}}" value="{{value}}">
|
||||
{{/if}}
|
||||
|
||||
{{#if typeWebsite}}
|
||||
<input type="url" class="form-control" name="{{column}}" value="{{value}}">
|
||||
{{/if}}
|
||||
|
||||
{{#if typeLongtext}}
|
||||
<textarea class="form-control" rows="3" name="{{column}}">{{value}}</textarea>
|
||||
{{/if}}
|
||||
|
||||
{{#if typeJson}}
|
||||
<textarea class="form-control gpg-text" rows="3" name="{{column}}" placeholder="{"data":"value"}">{{value}}</textarea>
|
||||
{{/if}}
|
||||
|
||||
{{#if typeGpg}}
|
||||
<textarea class="form-control gpg-text" rows="3" name="{{column}}" placeholder="{{#translate}}Begins with{{/translate}} '-----BEGIN PGP PUBLIC KEY BLOCK-----'">{{value}}</textarea>
|
||||
<span class="help-block">{{#translate}}Insert a GPG public key that will be used to encrypt messages sent this subscriber{{/translate}}</span>
|
||||
{{/if}}
|
||||
|
||||
{{#if typeDateUs}}
|
||||
<div class="input-group date fm-date-us">
|
||||
<input type="text" class="form-control" name="{{column}}" placeholder="MM/DD/YYYY" value="{{value}}"><span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if typeDateEur}}
|
||||
<div class="input-group date fm-date-eur">
|
||||
<input type="text" class="form-control" name="{{column}}" placeholder="DD/MM/YYYY" value="{{value}}"><span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if typeBirthdayUs}}
|
||||
<div class="input-group date fm-birthday-us">
|
||||
<input type="text" class="form-control" name="{{column}}" placeholder="MM/DD" value="{{value}}"><span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if typeBirthdayEur}}
|
||||
<div class="input-group date fm-birthday-eur">
|
||||
<input type="text" class="form-control" name="{{column}}" placeholder="DD/MM" value="{{value}}"><span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if typeDropdown}}
|
||||
<select name="{{key}}" class="form-control">
|
||||
<option value="">
|
||||
–– {{#translate}}Select{{/translate}} ––
|
||||
</option>
|
||||
{{#each options}}
|
||||
<option value="{{column}}" {{#if value}} selected {{/if}}>{{name}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
{{/if}}
|
||||
|
||||
{{#if typeRadio}}
|
||||
{{#each options}}
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="{{../key}}" value="{{column}}" {{#if value}} checked {{/if}}> {{name}}
|
||||
</label>
|
||||
</div>
|
||||
{{/each}}
|
||||
{{/if}}
|
||||
|
||||
{{#if typeCheckbox}}
|
||||
<input type="hidden" name="origin_{{key}}" value="webform">
|
||||
{{#each options}}
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="{{column}}" value="1" {{#if value}} checked {{/if}}> {{name}}
|
||||
</label>
|
||||
</div>
|
||||
{{/each}}
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
|
||||
<div class="form-group">
|
||||
<label for="tz" class="col-sm-2 control-label">{{#translate}}Timezone{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select name="tz" class="form-control">
|
||||
<option value="">
|
||||
–– Select ––
|
||||
</option>
|
||||
{{#each timezones}}
|
||||
<option value="{{key}}" {{#if selected}} selected {{/if}}>{{value}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="is-test" {{#if isTest}} checked {{/if}}> {{#translate}}Test user?{{/translate}}
|
||||
<span class="help-block">{{#translate}}If checked then this subscription can be used for previewing campaign messages{{/translate}}</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="pull-right">
|
||||
<button type="submit" form="subscriber-blacklist" class="btn btn-danger"><span class="glyphicon glyphicon-ban-circle"></span>{{#translate}}Blacklist{{/translate}}</button>
|
||||
{{#if isSubscribed}}
|
||||
<button type="submit" form="subscriber-unsubscribe" class="btn btn-default"><i class="glyphicon glyphicon-ban-circle"></i> {{#translate}}Unsubscribe{{/translate}}</button>
|
||||
{{/if}}
|
||||
<button type="submit" form="subscriber-delete" class="btn btn-danger"><i class="glyphicon glyphicon-remove"></i> {{#translate}}Delete Subscription{{/translate}}</button>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-ok"></i> {{#translate}}Update{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,48 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li><a href="/lists/view/{{list.id}}">{{list.name}}</a></li>
|
||||
<li class="active">{{#translate}}Import status{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{list.name}} <small>{{#translate}}Failed addresses{{/translate}}</small> <a class="btn btn-default btn-xs" href="/lists/view/{{list.id}}" role="button"><span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span> {{#translate}}Back to list{{/translate}}</a></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="well">
|
||||
{{#translate}}Role-based addresses like postmaster@example.com are blocked when importing. Subscribers with role-based email addresses can join your list using the subscription form{{/translate}} (<a href="/subscription/{{list.cid}}">{{#translate}}see here{{/translate}}</a>).
|
||||
</div>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover display nowrap" width="100%">
|
||||
<thead>
|
||||
<th class="col-md-1">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Address{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Fail reason{{/translate}}
|
||||
</th>
|
||||
</thead>
|
||||
{{#if rows}}
|
||||
<tbody>
|
||||
{{#each rows}}
|
||||
<tr>
|
||||
<th scope="row">
|
||||
{{index}}
|
||||
</th>
|
||||
<td>
|
||||
<a href="mailto:{{email}}">{{email}}</a>
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<span class="text-danger">{{reason}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
{{/if}}
|
||||
</table>
|
||||
</div>
|
|
@ -1,55 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li><a href="/lists/view/{{list.id}}">{{list.name}}</a></li>
|
||||
<li class="active">{{#translate}}Import subscribers{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{list.name}} <small>{{#translate}}Import subscribers{{/translate}}</small></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/lists/subscription/import-confirm">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="list" value="{{list.id}}">
|
||||
<input type="hidden" name="import" value="{{id}}">
|
||||
|
||||
{{#each mapping.columns}}
|
||||
|
||||
<div class="form-group">
|
||||
<label for="column-{{@index}}" class="col-sm-2 control-label">{{this}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" id="column-{{@index}}" name="column-{{@index}}">
|
||||
<option value=""> –– {{#translate}}Select{{/translate}} –– </option>
|
||||
<option value="email">{{#translate}}Email address{{/translate}}</option>
|
||||
<option value="first_name">{{#translate}}First Name{{/translate}}</option>
|
||||
<option value="last_name">{{#translate}}Last Name{{/translate}}</option>
|
||||
<option value="tz">{{#translate}}Timezone{{/translate}}</option>
|
||||
{{#each ../customFields}}
|
||||
{{#if column}}
|
||||
<option value="{{column}}">{{name}}</option>
|
||||
{{else}}
|
||||
<optgroup label="{{name}}">
|
||||
{{#each options}}
|
||||
<option value="{{column}}">{{name}}</option>
|
||||
{{/each}}
|
||||
</optgroup>
|
||||
{{/if}}
|
||||
|
||||
{{/each}}
|
||||
</select>
|
||||
|
||||
<span id="helpBlock" class="help-block">{{#translate}}Example{{/translate}}: "{{lookup ../mapping.example @index}}"</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{/each}}
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary">{{#translate}}Start import{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,75 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li><a href="/lists/view/{{list.id}}">{{list.name}}</a></li>
|
||||
<li class="active">{{#translate}}Import subscribers{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{list.name}} <small>{{#translate}}Import subscribers{{/translate}}</small></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/lists/subscription/import" enctype="multipart/form-data">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="list" value="{{list.id}}">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="listimport" class="col-sm-2 control-label">{{#translate}}CSV File{{/translate}}</label>
|
||||
<div class="col-sm-6">
|
||||
<input type="file" class="form-control" name="listimport" id="listimport" required>
|
||||
<span class="help-block">{{#translate}}The first line must contain column headings{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="delimiter" class="col-sm-2 control-label">{{#translate}}CSV delimiter{{/translate}}</label>
|
||||
<div class="col-sm-1">
|
||||
<input type="text" class="form-control" name="delimiter" id="delimiter" placeholder="" value="{{delimiter}}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{#translate}}Categorize the imported subscribers as{{/translate}}:</label>
|
||||
<div class="col-sm-10">
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="type" id="type" value="subscribed" checked> {{#translate}}Subscribed{{/translate}} – <span class="text-muted">{{#translate}}Regular subscriber addresses{{/translate}}</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="type" id="type" value="force_subscribed"> {{#translate}}Subscribed (Force){{/translate}} – <span class="text-muted">{{#translate}}Regular subscriber addresses, resubscribe users that have unsubscribed{{/translate}}</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="type" id="type" value="unsubscribed"> {{#translate}}Unsubscribed{{/translate}} – <span class="text-muted">{{#translate}}Suppressed emails that will be unsubscribed from your list{{/translate}}</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{#translate}}Check imported emails{{/translate}}:</label>
|
||||
<div class="col-sm-6">
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="emailcheck" id="type" value="enabled" checked> {{#translate}}Enabled{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="emailcheck" id="type" value="disabled"> {{#translate}}Disabled{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary"><span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span> {{#translate}}Next{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,207 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/lists/">{{#translate}}Lists{{/translate}}</a></li>
|
||||
<li class="active">{{name}}</li>
|
||||
</ol>
|
||||
|
||||
<div class="pull-right">
|
||||
|
||||
<a class="btn btn-default" href="/subscription/{{cid}}" target="_blank" role="button"><span class="glyphicon glyphicon-share-alt" aria-hidden="true"></span> {{#translate}}Subscription Form{{/translate}}</a>
|
||||
|
||||
<div class="btn-group">
|
||||
<button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
{{#translate}}List Actions{{/translate}} <span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a href="/forms/{{id}}" role="button"><span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> {{#translate}}Custom Forms{{/translate}}</a></li>
|
||||
<li><a href="/fields/{{id}}" role="button"><span class="glyphicon glyphicon-tasks" aria-hidden="true"></span> {{#translate}}Custom Fields{{/translate}}</a></li>
|
||||
<li><a href="/segments/{{id}}" role="button"><span class="glyphicon glyphicon-filter" aria-hidden="true"></span> {{#translate}}Segments{{/translate}}</a></li>
|
||||
<li><a href="/lists/edit/{{id}}" role="button"><span class="glyphicon glyphicon-wrench" aria-hidden="true"></span> {{#translate}}Edit List{{/translate}}</a></li>
|
||||
<li><a href="/triggers/{{id}}/create" role="button"><span class="glyphicon glyphicon-console" aria-hidden="true"></span> {{#translate}}Create Trigger{{/translate}}</a></li>
|
||||
<li role="separator" class="divider"></li>
|
||||
<li><a href="/lists/subscription/{{id}}/add" role="button"><span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span> {{#translate}}Add Subscriber{{/translate}}</a></li>
|
||||
<li><a href="/lists/subscription/{{id}}/import" role="button"><span class="glyphicon glyphicon-cloud-upload" aria-hidden="true"></span> {{#translate}}Import Subscribers{{/translate}}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h2><span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span> {{name}}</h2>
|
||||
|
||||
<hr>
|
||||
|
||||
{{#if description}}
|
||||
<div class="well well-sm">{{{description}}}</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="well well-sm">
|
||||
{{#if useSegment}}
|
||||
<div class="pull-right">
|
||||
<a class="btn btn-primary btn-sm" href="/segments/{{id}}/edit/{{segment}}" role="button"><span class="glyphicon glyphicon-wrench" aria-hidden="true"></span> {{#translate}}Edit Segment{{/translate}}</a>
|
||||
</div>
|
||||
{{/if}}
|
||||
<form class="form-inline" method="get">
|
||||
<div class="form-group">
|
||||
<label for="exampleInputName2">{{#translate}}Segment{{/translate}}</label>
|
||||
|
||||
<select name="segment" class="form-control input-sm">
|
||||
<option value="0">All Subscriptions</option>
|
||||
{{#if segments}}
|
||||
<optgroup label="{{#translate}}Segments{{/translate}}">
|
||||
{{#each segments}}
|
||||
<option value="{{id}}" {{#if selected}} selected {{/if}}>{{name}}</option>
|
||||
{{/each}}
|
||||
</optgroup>
|
||||
{{/if}}
|
||||
<optgroup label="Actions">
|
||||
<option value="-1">{{#translate}}Create New Segment{{/translate}}…</option>
|
||||
</optgroup>
|
||||
</select>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-default btn-sm"><span class="glyphicon glyphicon-filter" aria-hidden="true"></span> {{#translate}}Filter{{/translate}}</button>
|
||||
</form>
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
|
||||
<!-- Nav tabs -->
|
||||
<ul class="nav nav-tabs" role="tablist">
|
||||
<li role="presentation" class="{{#if showSubscriptions}}active{{/if}}"><a href="/lists/view/{{id}}" aria-controls="subscriptions" role="tab">{{#translate}}Subscriptions{{/translate}}</a></li>
|
||||
<li role="presentation" class="{{#if showImports}}active{{/if}}"><a href="/lists/view/{{id}}?tab=imports" aria-controls="imports" role="tab">{{#translate}}Imports{{/translate}}</a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
<div role="tabpanel" class="tab-pane {{#if showSubscriptions}}active{{/if}}" id="subscriptions">
|
||||
{{#if showSubscriptions}}
|
||||
<p></p>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table data-topic-url="/lists" data-topic-id="{{id}}" data-sort-column="1" data-sort-order="asc" {{#if useSegment}} data-topic-args="segment={{useSegment}}" {{/if}} class="table table-bordered table-hover data-table-ajax display nowrap" width="100%" data-row-sort="0,1,1,1{{customSort}},1,1,0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Address{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}First Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Last Name{{/translate}}
|
||||
</th>
|
||||
{{#each customFields}}
|
||||
<th>
|
||||
{{name}}
|
||||
</th>
|
||||
{{/each}}
|
||||
<th>
|
||||
{{#translate}}Status{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Created{{/translate}}
|
||||
</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{{/if}}
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane {{#if showImports}}active{{/if}}" id="imports">
|
||||
{{#if showImports}}
|
||||
<p></p>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover">
|
||||
<thead>
|
||||
<th class="col-md-1">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Created{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Finished{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Type{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Added{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Updated{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Failed{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Status{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
|
||||
</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#if imports}}
|
||||
{{#each imports}}
|
||||
<tr>
|
||||
<th scope="row">
|
||||
{{index}}
|
||||
</th>
|
||||
|
||||
<td>
|
||||
<span class="datestring" data-date="{{created}}" title="{{created}}">{{created}}</span>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
{{#if finished}}
|
||||
<span class="datestring" data-date="{{finished}}" title="{{finished}}">{{finished}}</span>
|
||||
{{else}}
|
||||
No
|
||||
{{/if}}
|
||||
</td>
|
||||
|
||||
<td>
|
||||
{{importType}}
|
||||
</td>
|
||||
<td>
|
||||
{{new}}
|
||||
</td>
|
||||
<td>
|
||||
{{updated}}
|
||||
</td>
|
||||
<td>
|
||||
{{#if failed}}<a href="/lists/subscription/{{../id}}/import/{{id}}/failed">{{failed}}</a>{{else}}0 {{/if}}
|
||||
</td>
|
||||
<td class="{{#if error}}text-danger{{/if}}">
|
||||
{{#if error}}
|
||||
<strong><span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> {{importStatus}}</strong>
|
||||
{{else}}
|
||||
<strong>{{importStatus}}</strong>
|
||||
{{/if}}
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<form method="post" class="confirm-submit" data-confirm-message="{{#translate}}Are you sure? This action should only be called to resolve stalled imports{{/translate}}" action="/lists/subscription/import-restart">
|
||||
<input type="hidden" name="_csrf" value="{{../csrfToken}}">
|
||||
<input type="hidden" name="list" value="{{list}}">
|
||||
<input type="hidden" name="import" value="{{id}}">
|
||||
<button type="submit" class="btn btn-info btn-xs"><span class="glyphicon glyphicon-repeat" aria-hidden="true"></span> {{#translate}}Restart{{/translate}}</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
{{else}}
|
||||
<tr>
|
||||
<td colspan="9">
|
||||
{{#translate}}No data available in table{{/translate}}
|
||||
</td>
|
||||
</tr>
|
||||
{{/if}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
|
@ -1,276 +0,0 @@
|
|||
<style>
|
||||
html,
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
body {
|
||||
position: absolute;
|
||||
top: 34px;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#mt-navbar {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
top: -34px;
|
||||
}
|
||||
#mt-navbar .mt-logo {
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
#merge-tag-reference-container * {
|
||||
background: none;
|
||||
text-align: left;
|
||||
border: none;
|
||||
-webkit-user-select: text;
|
||||
-moz-user-select: text;
|
||||
-ms-user-select: text;
|
||||
user-select: text;
|
||||
}
|
||||
#merge-tag-reference-container th,
|
||||
#merge-tag-reference-container td {
|
||||
padding: 5px 10px 5px 0;
|
||||
height: 2em;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
{{> editor_navbar}}
|
||||
|
||||
|
||||
{{#if resource.mergeTags}}
|
||||
<div id="merge-tag-reference-container" title="{{#translate}}Merge tag reference{{/translate}}" style="display: none">
|
||||
<table class="">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
{{#translate}}Merge tag{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Description{{/translate}}
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#each resource.mergeTags}}
|
||||
<tr>
|
||||
<th>
|
||||
[{{key}}]
|
||||
</th>
|
||||
<td>
|
||||
{{value}}
|
||||
</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
|
||||
<script>
|
||||
$(function() {
|
||||
|
||||
if (!Mosaico.isCompatible()) {
|
||||
alert('Update your browser!');
|
||||
return;
|
||||
}
|
||||
|
||||
window.bridge = window.bridge || {};
|
||||
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': '{{csrfToken}}' } });
|
||||
|
||||
var uploadHost = window.location.protocol + '//' + window.location.host;
|
||||
var plugins = [];
|
||||
var config = {
|
||||
// Mosaico needs absolute URLs
|
||||
imgProcessorBackend: uploadHost + '/editorapi/img',
|
||||
titleToken: '{{#translate}}MOSAICO Responsive Email Designer{{/translate}}',
|
||||
fileuploadConfig: {
|
||||
url: uploadHost + '/editorapi/upload?type={{type}}&id={{resource.id}}&editor={{resource.editorName}}',
|
||||
},
|
||||
{{#if languageStrings}}
|
||||
strings: {{{languageStrings}}},
|
||||
{{/if}}
|
||||
};
|
||||
|
||||
|
||||
// Save Button
|
||||
|
||||
plugins.push(function(viewModel) {
|
||||
$(document).ready(function() {
|
||||
$('#mt-save').on('click', function() {
|
||||
if ($(this).hasClass('busy')) {
|
||||
return;
|
||||
}
|
||||
$(this).addClass('busy');
|
||||
|
||||
var html = viewModel.exportHTML();
|
||||
|
||||
$.post('/editorapi/update?type={{type}}&editor={{resource.editorName}}', {
|
||||
id: {{resource.id}},
|
||||
name: '{{resource.name}}',
|
||||
{{#if resource.list}} list: {{resource.list}}, {{/if}}
|
||||
html: html,
|
||||
editorData: JSON.stringify({
|
||||
template: '{{resource.editorData.template}}',
|
||||
model: viewModel.exportJSON(),
|
||||
metadata: viewModel.exportMetadata(),
|
||||
}),
|
||||
}, null, 'html')
|
||||
.success(function() {
|
||||
setTimeout(function() {
|
||||
window.bridge.lastSavedHtml = html;
|
||||
viewModel.notifier.success('{{#translate}}Sucessfully saved{{/translate}}');
|
||||
$(this).removeClass('busy');
|
||||
}.bind(this), 500); // Don't save too fast
|
||||
}.bind(this))
|
||||
.fail(function(data) {
|
||||
viewModel.notifier.error(data.responseText || '{{#translate}}An error occured while saving the document{{/translate}}');
|
||||
$(this).removeClass('busy');
|
||||
}.bind(this))
|
||||
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
// Close Button
|
||||
|
||||
plugins.push(function(viewModel) {
|
||||
$(document).ready(function() {
|
||||
$('#mt-close').on('click', function() {
|
||||
if (confirm('{{#translate}}Unsaved changes will be lost. Close now?{{/translate}}') === true) {
|
||||
window.bridge.exit
|
||||
? window.bridge.exit()
|
||||
: window.location.href = '/{{type}}s/edit/{{resource.id}}?tab=template';
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
// Download Button
|
||||
|
||||
plugins.push(function(viewModel) {
|
||||
viewModel.download = {
|
||||
name: 'Download', // Translated by Mosaico
|
||||
enabled: ko.observable(true),
|
||||
execute: function() {
|
||||
viewModel.download.enabled(false);
|
||||
viewModel.notifier.info(viewModel.t('Downloading...'));
|
||||
viewModel.exportHTMLtoTextarea('#downloadHtmlTextarea');
|
||||
var $downloadForm = $('#downloadForm');
|
||||
$downloadForm.attr('action', '/editorapi/download?editor={{resource.editorName}}');
|
||||
if (!$downloadForm.find('input[name=_csrf]').length) {
|
||||
$('<input>').attr({
|
||||
type: 'hidden',
|
||||
name: '_csrf',
|
||||
value: '{{csrfToken}}',
|
||||
}).appendTo($downloadForm);
|
||||
}
|
||||
$downloadForm.submit();
|
||||
viewModel.download.enabled(true);
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
// Test E-Mail Button
|
||||
|
||||
plugins.push(function(viewModel) {
|
||||
viewModel.test = {
|
||||
name: 'Test', // Translated by Mosaico
|
||||
enabled: ko.observable(true),
|
||||
isValidEmail: function(email) {
|
||||
return /\S+@\S+\.\S+/.test(email);
|
||||
},
|
||||
execute: function() {
|
||||
viewModel.test.enabled(false);
|
||||
var email = localStorage.getItem('testemail');
|
||||
if (!viewModel.test.isValidEmail(email)) {
|
||||
email = viewModel.t('Insert here the recipient email address');
|
||||
}
|
||||
email = prompt(viewModel.t('Test email address'), email);
|
||||
if (viewModel.test.isValidEmail(email)) {
|
||||
localStorage.setItem('testemail', email);
|
||||
$.post('/editorapi/test?editor={{resource.editorName}}', {
|
||||
email: email,
|
||||
subject: '[test] {{resource.name}}',
|
||||
html: viewModel.exportHTML(),
|
||||
}, null, 'html')
|
||||
.success(function() {
|
||||
viewModel.notifier.success(viewModel.t('Test email sent...'));
|
||||
})
|
||||
.fail(function() {
|
||||
viewModel.notifier.error(viewModel.t('Unexpected error talking to server: contact us!'));
|
||||
})
|
||||
.always(function() {
|
||||
viewModel.test.enabled(true);
|
||||
});
|
||||
} else {
|
||||
viewModel.test.enabled(true);
|
||||
email !== null && alert(viewModel.t('Invalid email address'));
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
// Merge Tag Reference
|
||||
|
||||
plugins.push(function(viewModel) {
|
||||
var addButton = function() {
|
||||
var $toobarRightButtons = $('#toolbar .rightButtons');
|
||||
if (!$toobarRightButtons.length) {
|
||||
setTimeout(addButton, 50);
|
||||
return;
|
||||
}
|
||||
$('<a title="{{#translate}}Tags{{/translate}}" id="btnMergeReference" class="ui-button ui-corner-all ui-widget" role="button">\
|
||||
<span class="ui-button-icon ui-icon fa fa-fw fa-tags"></span>\
|
||||
<span class="ui-button-icon-space"></span>{{#translate}}Tags{{/translate}}\
|
||||
</a>')
|
||||
.prependTo($toobarRightButtons)
|
||||
.css('color', 'white', '!important')
|
||||
.on('click', function() {
|
||||
$('#merge-tag-reference-container').dialog({
|
||||
modal: true,
|
||||
width: 'auto',
|
||||
draggable: true,
|
||||
resizable: false,
|
||||
appendTo: '#mo-body',
|
||||
closeText: '',
|
||||
});
|
||||
});
|
||||
};
|
||||
addButton();
|
||||
});
|
||||
|
||||
|
||||
// (Custom) HTML postRenderers
|
||||
|
||||
plugins.push(function(viewModel) {
|
||||
viewModel.originalExportHTML = viewModel.exportHTML;
|
||||
viewModel.exportHTML = function() {
|
||||
var html = viewModel.originalExportHTML();
|
||||
window.mosaicoHTMLPostRenderers.forEach(function(postRender) {
|
||||
html = postRender(html);
|
||||
});
|
||||
return html;
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
// Finally start Mosaico
|
||||
|
||||
Mosaico.start(
|
||||
config,
|
||||
uploadHost + '/{{resource.editorName}}/templates/{{resource.editorData.template}}/index.html',
|
||||
{{#if resource.editorData.metadata}} {{{resource.editorData.metadata}}} {{else}} undefined {{/if}},
|
||||
{{#if resource.editorData.model}} {{{resource.editorData.model}}} {{else}} undefined {{/if}},
|
||||
plugins.concat(window.mosaicoPlugins)
|
||||
);
|
||||
|
||||
});
|
||||
</script>
|
|
@ -1,40 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<meta name="viewport" content="width=1024, initial-scale=1">
|
||||
|
||||
<script src="dist/vendor/jquery.min.js"></script>
|
||||
<script src="dist/vendor/knockout.js"></script>
|
||||
<script src="dist/vendor/jquery-ui.min.js"></script>
|
||||
<script src="dist/vendor/jquery.ui.touch-punch.min.js"></script>
|
||||
<script src="dist/vendor/load-image.all.min.js"></script>
|
||||
<script src="dist/vendor/canvas-to-blob.min.js"></script>
|
||||
<script src="dist/vendor/jquery.iframe-transport.js"></script>
|
||||
<script src="dist/vendor/jquery.fileupload.js"></script>
|
||||
<script src="dist/vendor/jquery.fileupload-process.js"></script>
|
||||
<script src="dist/vendor/jquery.fileupload-image.js"></script>
|
||||
<script src="dist/vendor/jquery.fileupload-validate.js"></script>
|
||||
<script src="dist/vendor/knockout-jqueryui.min.js"></script>
|
||||
<script src="dist/vendor/tinymce.min.js"></script>
|
||||
|
||||
<script src="dist/mosaico.min.js?v=0.16"></script>
|
||||
|
||||
<script> window.mosaicoPlugins = []; </script>
|
||||
<script> window.mosaicoHTMLPostRenderers = []; </script>
|
||||
|
||||
{{#if editorConfig.customscripts}}
|
||||
{{#each editorConfig.customscripts}}
|
||||
<script src="{{this}}"></script>
|
||||
{{/each}}
|
||||
{{/if}}
|
||||
|
||||
<link rel="stylesheet" href="dist/mosaico-material.min.css?v=0.10" />
|
||||
<link rel="stylesheet" href="dist/vendor/notoregular/stylesheet.css" />
|
||||
</head>
|
||||
<body class="mo-standalone">
|
||||
|
||||
{{{body}}}
|
||||
|
||||
</body>
|
||||
</html>
|
56
views/mosaico/layout.hbs
Normal file
56
views/mosaico/layout.hbs
Normal file
|
@ -0,0 +1,56 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<meta name="viewport" content="width=1024, initial-scale=1">
|
||||
|
||||
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
|
||||
<link rel="icon" href="/favicon.ico" type="image/x-icon" />
|
||||
|
||||
<title>Mailtrain</title>
|
||||
|
||||
<script src="/public/mosaico/vendor/jquery.min.js"></script>
|
||||
<script src="/public/mosaico/vendor/jquery-migrate.min.js"></script>
|
||||
<script src="/public/mosaico/vendor/knockout.js"></script>
|
||||
<script src="/public/mosaico/vendor/jquery-ui.min.js"></script>
|
||||
<script src="/public/mosaico/vendor/jquery.ui.touch-punch.min.js"></script>
|
||||
<script src="/public/mosaico/vendor/load-image.all.min.js"></script>
|
||||
<script src="/public/mosaico/vendor/canvas-to-blob.min.js"></script>
|
||||
<script src="/public/mosaico/vendor/jquery.iframe-transport.js"></script>
|
||||
<script src="/public/mosaico/vendor/jquery.fileupload.js"></script>
|
||||
<script src="/public/mosaico/vendor/jquery.fileupload-process.js"></script>
|
||||
<script src="/public/mosaico/vendor/jquery.fileupload-image.js"></script>
|
||||
<script src="/public/mosaico/vendor/jquery.fileupload-validate.js"></script>
|
||||
<script src="/public/mosaico/vendor/knockout-jqueryui.min.js"></script>
|
||||
<script src="/public/mosaico/vendor/tinymce.min.js"></script>
|
||||
|
||||
<script src="/public/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>
|
||||
|
||||
<script src="/mailtrain/common.js"></script>
|
||||
<script src="/mailtrain/mosaico.js"></script>
|
||||
|
||||
<link rel="stylesheet" href="/public/mosaico/mosaico-material.min.css?v=0.10" />
|
||||
<link rel="stylesheet" href="/public/mosaico/vendor/notoregular/stylesheet.css" />
|
||||
</head>
|
||||
<body class="mo-standalone">
|
||||
{{{body}}}
|
||||
|
||||
{{> tracking_scripts}}
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
<div class="form-group">
|
||||
<label for="template-html" class="col-sm-2 control-label">{{#translate}}Template content (HTML){{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<div class="code-editor" id="template-html">{{html}}</div>
|
||||
<input type="hidden" name="html">
|
||||
</div>
|
||||
</div>
|
|
@ -1,89 +0,0 @@
|
|||
<style>
|
||||
body.noscroll {
|
||||
overflow: hidden;
|
||||
}
|
||||
#editor-frame,
|
||||
#editor-frame-loader {
|
||||
position: fixed;
|
||||
z-index: 10000;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border: none;
|
||||
}
|
||||
#editor-frame-loader {
|
||||
z-index: 10001;
|
||||
background: #eaeced;
|
||||
}
|
||||
#editor-frame-loader div {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: 62px; margin-left: -31px;
|
||||
height: 72px; margin-top: -36px;
|
||||
background: url('/mailtrain-header.png');
|
||||
-webkit-animation: pulsate 1.2s ease-out;
|
||||
animation: pulsate 1.2s ease-out;
|
||||
-webkit-animation-iteration-count: infinite;
|
||||
animation-iteration-count: infinite;
|
||||
}
|
||||
@-webkit-keyframes pulsate {
|
||||
0% { -webkit-transform: scale(0.1, 0.1); opacity: 0.5; }
|
||||
70% { opacity: 1.0; }
|
||||
100% { -webkit-transform: scale(1.2, 1.2); opacity: 0.0; }
|
||||
}
|
||||
@keyframes pulsate {
|
||||
0% { transform: scale(0.1, 0.1); opacity: 0.5; }
|
||||
70% { opacity: 1.0; }
|
||||
100% { transform: scale(1.2, 1.2); opacity: 0.0; }
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="editor-frame-loader" style="display: none;">
|
||||
<div></div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// campaign or template
|
||||
var type = window.location.pathname.split('/')[1].slice(0, -1);
|
||||
|
||||
var editorWindow;
|
||||
|
||||
var $editorFrame = $('<iframe id="editor-frame"/>')
|
||||
.attr('src', '/{{editorName}}/editor?id={{id}}&type=' + type)
|
||||
.on('load', function() {
|
||||
editorWindow = $editorFrame[0].contentWindow;
|
||||
editorWindow.bridge = editorWindow.bridge || {};
|
||||
editorWindow.bridge.exit = function() {
|
||||
closeEditor();
|
||||
}
|
||||
setTimeout(function() {
|
||||
$('#editor-frame-loader').hide();
|
||||
}, 300);
|
||||
});
|
||||
|
||||
var openEditor = function() {
|
||||
$('body').addClass('noscroll');
|
||||
$('#editor-frame-loader').show();
|
||||
$editorFrame.appendTo($('body'));
|
||||
}
|
||||
|
||||
var closeEditor = function() {
|
||||
$('body').removeClass('noscroll');
|
||||
$editorFrame = $editorFrame.detach();
|
||||
if (editorWindow.bridge.lastSavedHtml) {
|
||||
$('#template-html').val(editorWindow.bridge.lastSavedHtml);
|
||||
$('#html-preview-frame').attr('srcdoc', editorWindow.bridge.lastSavedHtml);
|
||||
$('#html-preview').show();
|
||||
}
|
||||
// Reload to discard unsaved changes
|
||||
$editorFrame.attr('src', '/{{editorName}}/editor?id={{id}}&type=' + type + '&cb=' + Math.random());
|
||||
}
|
||||
|
||||
$('#btn-open-{{editorName}}').on('click', function() {
|
||||
openEditor();
|
||||
});
|
||||
});
|
||||
</script>
|
|
@ -1,44 +0,0 @@
|
|||
<style>
|
||||
#mt-navbar {
|
||||
background: #DE4320;
|
||||
overflow: hidden;
|
||||
height: 34px;
|
||||
}
|
||||
.mt-logo {
|
||||
height: 24px;
|
||||
padding: 5px 0 5px 35px;
|
||||
-webkit-filter: brightness(0) invert(1);
|
||||
filter: brightness(0) invert(1);
|
||||
}
|
||||
.mt-btn {
|
||||
display: block;
|
||||
float: right;
|
||||
width: 150px;
|
||||
line-height: 34px;
|
||||
text-align: center;
|
||||
color: white;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
font-family: sans-serif;
|
||||
cursor: pointer;
|
||||
border-left: 1px solid #972E15;
|
||||
}
|
||||
.mt-btn:hover {
|
||||
background: #972E15;
|
||||
}
|
||||
#mt-save span:after {
|
||||
content: '{{#translate}}SAVE{{/translate}}';
|
||||
}
|
||||
#mt-save.busy span:after {
|
||||
content: '{{#translate}}SAVING{{/translate}}';
|
||||
}
|
||||
#mt-save.busy {
|
||||
background: #972E15;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="mt-navbar">
|
||||
<img class="mt-logo" src="/mailtrain-header.png">
|
||||
<a id="mt-close" class="mt-btn">{{#translate}}CLOSE{{/translate}}</a>
|
||||
<a id="mt-save" class="mt-btn"><span></span></a>
|
||||
</div>
|
|
@ -1,27 +0,0 @@
|
|||
<style>
|
||||
#btn-open-grapejs {
|
||||
background-color: #4E6A8A;
|
||||
border-color: #4E6A8A;
|
||||
padding-left: 36px;
|
||||
padding-right: 36px;
|
||||
}
|
||||
#btn-open-grapejs:hover {
|
||||
background-color: #394C61;
|
||||
border-color: #394C61;
|
||||
}
|
||||
</style>
|
||||
|
||||
{{> html_to_text}}
|
||||
|
||||
<input type="hidden" id="template-html" value="{{html}}">
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{#translate}}Template content (HTML){{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<a class="btn btn-lg btn-success" role="button" id="btn-open-grapejs">{{#translate}}Open GrapeJS{{/translate}}</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{> html_preview}}
|
||||
|
||||
{{> editor_bridge}}
|
|
@ -1,14 +0,0 @@
|
|||
<div class="form-group" id="html-preview" {{#unless html}}style="display: none;"{{/unless}}>
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<a role="button" data-toggle="collapse" href="#html-preview-toggle" aria-expanded="false" aria-controls="html-preview-toggle">{{#translate}}Toggle HTML preview{{/translate}}</a>
|
||||
<div class="collapse" id="html-preview-toggle">
|
||||
<h6 class="small text-muted">320x480px</h6>
|
||||
<iframe
|
||||
id="html-preview-frame"
|
||||
srcdoc="{{#if preparedHtml}}{{preparedHtml}}{{else}}{{html}}{{/if}}"
|
||||
width="320" height="480"
|
||||
style="border: 1px solid #ccc;">
|
||||
</iframe>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -1,41 +0,0 @@
|
|||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<span class="help-block">
|
||||
{{#translate}}To extract the text from HTML click <a id="html-to-plaintext-btn" role="button">here</a>.{{/translate}}
|
||||
<span id="html-to-plaintext-spinner" class="glyphicon glyphicon-refresh spinning hidden"></span>
|
||||
{{#translate}}Please note that your existing plaintext in the field above will be overwritten. This feature uses the <a href="http://premailer.dialect.ca/api" target="_blank" rel="noreferrer">Premailer API</a>, a third party service. Their Terms of Service and Privacy Policy apply.{{/translate}}
|
||||
<span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': '{{csrfToken}}' } });
|
||||
var $spinner = $('#html-to-plaintext-spinner');
|
||||
|
||||
$('#html-to-plaintext-btn').on('click', function() {
|
||||
var html = $('#template-html').val();
|
||||
|
||||
if (!html) {
|
||||
alert('Missing HTML content');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!$spinner.hasClass('hidden')) {
|
||||
return;
|
||||
}
|
||||
$spinner.removeClass('hidden');
|
||||
|
||||
$.post('/editorapi/html-to-text?editor={{editorName}}', { html: html }, null, 'html')
|
||||
.success(function(data) {
|
||||
$('#template-text').val(data);
|
||||
})
|
||||
.fail(function(data) {
|
||||
alert(data.responseText || '{{#translate}}An error occurred while talking to the server{{/translate}}');
|
||||
})
|
||||
.always(function() {
|
||||
$spinner.addClass('hidden');
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
|
@ -1,42 +0,0 @@
|
|||
{{#if mergeTags}}
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<a class="btn btn-default" role="button" data-toggle="collapse" href="#mergeReference" aria-expanded="false" aria-controls="mergeReference">{{#translate}}Merge tag reference{{/translate}}</a>
|
||||
<div class="collapse" id="mergeReference">
|
||||
<p style="margin-top: .8em;">
|
||||
{{#translate}}Merge tags are tags that are replaced before sending out the message. The format of the merge tag is the following: <code>[TAG_NAME]</code> or <code>[TAG_NAME/fallback]</code> where <code>fallback</code> is an optional text value used when <code>TAG_NAME</code> is empty.{{/translate}}
|
||||
</p>
|
||||
|
||||
<table class="table table-bordered table-condensed table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
{{#translate}}Merge tag{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Description{{/translate}}
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#each mergeTags}}
|
||||
<tr>
|
||||
<th scope="row">
|
||||
[{{key}}]
|
||||
</th>
|
||||
<td>
|
||||
{{value}}
|
||||
</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{{#if mergeTagReferenceFooterText}}
|
||||
<p>{{mergeTagReferenceFooterText}}</p>
|
||||
{{/if}}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
|
@ -1,122 +0,0 @@
|
|||
<style>
|
||||
#carousel-{{cls}} > * {
|
||||
z-index: 2;
|
||||
}
|
||||
#carousel-{{cls}}:after {
|
||||
display: block;
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
line-height: 500px;
|
||||
text-align: center;
|
||||
content: 'Loading ...';
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="modal fade {{cls}}" tabindex="-1" role="dialog">
|
||||
<div class="modal-dialog" style="width: auto; max-width: 1026px !important;" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<h4 class="modal-title">{{#translate}}{{title}}{{/translate}}</h4>
|
||||
</div>
|
||||
<div id="carousel-{{cls}}" class="carousel slide" data-interval="false" style="min-height: 500px;">
|
||||
<!-- Indicators -->
|
||||
<ol class="carousel-indicators">
|
||||
<li data-target="#carousel-{{cls}}" data-slide-to="0" class="active"></li>
|
||||
<li data-target="#carousel-{{cls}}" data-slide-to="1"></li>
|
||||
<li data-target="#carousel-{{cls}}" data-slide-to="2"></li>
|
||||
</ol>
|
||||
|
||||
<!-- Wrapper for slides -->
|
||||
<div class="carousel-inner" role="listbox">
|
||||
|
||||
{{#if img01}}
|
||||
<div class="item active">
|
||||
<img data-src="{{img01}}">
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if img02}}
|
||||
<div class="item">
|
||||
<img data-src="{{img02}}">
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if img03}}
|
||||
<div class="item">
|
||||
<img data-src="{{img03}}">
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if img04}}
|
||||
<div class="item">
|
||||
<img data-src="{{img04}}">
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if img05}}
|
||||
<div class="item">
|
||||
<img data-src="{{img05}}">
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if img06}}
|
||||
<div class="item">
|
||||
<img data-src="{{img06}}">
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if img07}}
|
||||
<div class="item">
|
||||
<img data-src="{{img07}}">
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if img08}}
|
||||
<div class="item">
|
||||
<img data-src="{{img08}}">
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if img09}}
|
||||
<div class="item">
|
||||
<img data-src="{{img09}}">
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if img10}}
|
||||
<div class="item">
|
||||
<img data-src="{{img10}}">
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
</div>
|
||||
|
||||
{{#if img02}}
|
||||
<!-- Controls -->
|
||||
<a class="left carousel-control" href="#carousel-{{cls}}" role="button" data-slide="prev">
|
||||
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
|
||||
<span class="sr-only">Previous</span>
|
||||
</a>
|
||||
<a class="right carousel-control" href="#carousel-{{cls}}" role="button" data-slide="next">
|
||||
<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
|
||||
<span class="sr-only">Next</span>
|
||||
</a>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
$('.modal.{{cls}}').on('show.bs.modal', function() {
|
||||
$(this).find('img[data-src]').each(function() {
|
||||
$(this).attr('src', $(this).data('src'));
|
||||
$(this).removeAttr('data-src');
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
|
@ -1,27 +0,0 @@
|
|||
<style>
|
||||
#btn-open-mosaico {
|
||||
background-color: #4E6A8A;
|
||||
border-color: #4E6A8A;
|
||||
padding-left: 36px;
|
||||
padding-right: 36px;
|
||||
}
|
||||
#btn-open-mosaico:hover {
|
||||
background-color: #394C61;
|
||||
border-color: #394C61;
|
||||
}
|
||||
</style>
|
||||
|
||||
{{> html_to_text}}
|
||||
|
||||
<input type="hidden" id="template-html" value="{{html}}">
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{#translate}}Template content (HTML){{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<a class="btn btn-lg btn-success" role="button" id="btn-open-mosaico">{{#translate}}Open Mosaico{{/translate}}</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{> html_preview}}
|
||||
|
||||
{{> editor_bridge}}
|
|
@ -1,6 +0,0 @@
|
|||
<div class="form-group">
|
||||
<label for="template-text" class="col-sm-2 control-label">{{#translate}}Template content (plaintext){{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control" id="template-text" name="text" rows="10">{{text}}</textarea>
|
||||
</div>
|
||||
</div>
|
|
@ -1,6 +0,0 @@
|
|||
<div class="form-group">
|
||||
<label for="template-html" class="col-sm-2 control-label">{{#translate}}Template content (HTML){{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control summernote" id="template-html" name="html" rows="8">{{html}}</textarea>
|
||||
</div>
|
||||
</div>
|
|
@ -1,22 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/reports">{{#translate}}Reports{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Create Report{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{#translate}}Create Report{{/translate}}</h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form class="form-horizontal" method="get" action="/reports/create">
|
||||
|
||||
{{> report_select_template }}
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-chevron-right"></i> {{#translate}}Next{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,23 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/reports">{{#translate}}Reports{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Create Report{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{#translate}}Create Report{{/translate}}</h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/reports/create">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
|
||||
{{> report_fields }}
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-plus"></i> {{#translate}}Create Report{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,34 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/reports">{{#translate}}Reports{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Edit Report{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{#translate}}Edit Report{{/translate}}</h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form method="post" class="delete-form" id="reports-delete" action="/reports/delete">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
</form>
|
||||
|
||||
|
||||
<form class="form-horizontal" method="post" action="/reports/edit">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
|
||||
{{> report_fields }}
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="pull-right">
|
||||
<button type="submit" form="reports-delete" class="btn btn-danger"><i class="glyphicon glyphicon-remove"></i> {{#translate}}Delete Report{{/translate}}</button>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-ok"></i> {{#translate}}Update{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</form>
|
|
@ -1,8 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/reports/">{{#translate}}Reports{{/translate}}</a></li>
|
||||
<li class="active">{{title}}</li>
|
||||
</ol>
|
||||
|
||||
<i>{{error}}</i>
|
||||
<pre>{{output}}</pre>
|
|
@ -1,73 +0,0 @@
|
|||
{{> report_select_template options="readonly" }}
|
||||
|
||||
<div class="form-group">
|
||||
<label for="name" class="col-sm-2 control-label">{{#translate}}Name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control input-lg" name="name" id="name" value="{{name}}" placeholder="{{#translate}}Report Name{{/translate}}" autofocus required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="description" class="col-sm-2 control-label">{{#translate}}Description{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control" rows="3" name="description" id="description">{{description}}</textarea>
|
||||
<span class="help-block">{{#translate}}HTML is allowed{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{#each userFields}}
|
||||
{{#switch type}}
|
||||
{{#case "campaign"}}
|
||||
<div class="form-group">
|
||||
<label for="description" class="col-sm-2 control-label">{{name}}</label>
|
||||
<div class="col-sm-10">
|
||||
<div class="table-responsive">
|
||||
<table data-topic-url="/campaigns/quicklist" data-sort-column="2" data-sort-order="desc" class="table table-bordered table-hover data-table-ajax data-table-{{#if isMulti}}multi{{/if}}selectable display nowrap" width="100%" data-row-sort="0,1,0,1">
|
||||
<thead>
|
||||
<th class="col-md-1">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Description{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Created{{/translate}}
|
||||
</th>
|
||||
</thead>
|
||||
</table>
|
||||
<input type="hidden" name="{{id}}Selection" value="{{value}}" />
|
||||
</div>
|
||||
<span class="help-block">{{#translate}}Select a campaign in the table above by clicking on the respective row number.{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
{{/case}}
|
||||
{{#case "list"}}
|
||||
<div class="form-group">
|
||||
<label for="description" class="col-sm-2 control-label">{{name}}</label>
|
||||
<div class="col-sm-10">
|
||||
<div class="table-responsive">
|
||||
<table data-topic-url="/lists/quicklist" data-sort-column="2" data-sort-order="asc" class="table table-bordered table-hover data-table-ajax data-table-{{#if isMulti}}multi{{/if}}selectable display nowrap" width="100%" data-row-sort="0,1,1">
|
||||
<thead>
|
||||
<th class="col-md-1">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Subscribers{{/translate}}
|
||||
</th>
|
||||
</thead>
|
||||
</table>
|
||||
<input type="hidden" name="{{id}}Selection" value="{{value}}" />
|
||||
</div>
|
||||
<span class="help-block">{{#translate}}Select a campaign in the table above by clicking on the respective row number.{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
{{/case}}
|
||||
{{/switch}}
|
||||
{{/each}}
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
<div class="form-group">
|
||||
<label for="name" class="col-sm-2 control-label">{{#translate}}Report Template{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" id="reportTemplate" name="reportTemplate" required {{options}}>
|
||||
<option value=""> –– {{#translate}}Select{{/translate}} –– </option>
|
||||
{{#each reportTemplates}}
|
||||
<option value="{{id}}" {{#if selected}} selected {{/if}}>{{name}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
|
@ -1,40 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Reports{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<div class="pull-right">
|
||||
<a class="btn btn-primary" href="/reports/create" role="button"><i class="glyphicon glyphicon-plus"></i> {{#translate}}Create Report{{/translate}}</a>
|
||||
|
||||
<a class="btn btn-primary" href="/report-templates" role="button">{{#translate}}Report Templates{{/translate}}</a>
|
||||
</div>
|
||||
|
||||
<h2>{{#translate}}Reports{{/translate}}</h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table data-topic-url="/reports" data-sort-column="2" data-sort-order="desc" class="table table-bordered table-hover data-table-ajax display nowrap" width="100%" data-row-sort="0,1,1,0,1,0">
|
||||
<thead>
|
||||
<th style="width: 1%">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Template{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Description{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Created{{/translate}}
|
||||
</th>
|
||||
<th style="width: 1%">
|
||||
|
||||
</th>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/reports/">{{#translate}}Reports{{/translate}}</a></li>
|
||||
<li class="active">{{title}}</li>
|
||||
</ol>
|
||||
|
||||
{{report}}
|
6
views/root.hbs
Normal file
6
views/root.hbs
Normal file
|
@ -0,0 +1,6 @@
|
|||
<div id="root"></div>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
MailtrainReactBody.default();
|
||||
});
|
||||
</script>
|
|
@ -1,441 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Settings{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{#translate}}Settings{{/translate}}</h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form method="post" id="smtp-verify" action="/settings/smtp-verify">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
</form>
|
||||
|
||||
<form class="form-horizontal" id="settings-form" method="post" action="/settings/update">
|
||||
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
|
||||
<fieldset>
|
||||
<legend>
|
||||
{{#translate}}General Settings{{/translate}}
|
||||
</legend>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="service-url" class="col-sm-2 control-label">{{#translate}}Service Address (URL){{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="url" class="form-control" name="service-url" id="service-url" placeholder="http://example.com/" value="{{serviceUrl}}" required>
|
||||
<span class="help-block">{{#translate}}Enter the URL this service can be reached from{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="admin-email" class="col-sm-2 control-label">{{#translate}}Admin Email{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="email" class="form-control" name="admin-email" id="admin-email" placeholder="admin@example.com" value="{{adminEmail}}" required>
|
||||
<span class="help-block">{{#translate}}Enter the email address that will be used as "from" for system messages{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="disable-wysiwyg" {{#if disableWysiwyg}} checked {{/if}}> {{#translate}}Disable WYSIWYG editor{{/translate}}
|
||||
<span class="help-block">{{#translate}}If checked then message editor displays HTML code without the preview{{/translate}}</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="disable-confirmations" {{#if disableConfirmations}} checked {{/if}}> {{#translate}}Disable subscription confirmation messages{{/translate}}
|
||||
<span class="help-block">{{#translate}}If checked then do not send a confirmation message that states the subscriber is now subscribed or unsubscribed. This does not disable double opt-in messages.{{/translate}}</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="ua-code" class="col-sm-2 control-label">{{#translate}}Tracking ID{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="ua-code" id="ua-code-url" placeholder="UA-XXXXX-XX" value="{{uaCode}}">
|
||||
<span class="help-block">{{#translate}}Enter Google Analytics tracking code{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="shoutout" class="col-sm-2 control-label">{{#translate}}Frontpage shout out{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control gpg-text" rows="3" id="shoutout" name="shoutout" placeholder="">{{shoutout}}</textarea>
|
||||
<span class="help-block">{{#translate}}HTML code shown in the front page header section{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>
|
||||
{{#translate}}Campaign defaults{{/translate}}
|
||||
</legend>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="default-sender" class="col-sm-2 control-label">{{#translate}}Sender name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="default-sender" id="default-sender" value="{{defaultSender}}" placeholder="{{#translate}}Sender name, eg. My Awesome Company Ltd.{{/translate}}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="default-postaddress" class="col-sm-2 control-label">{{#translate}}Default address{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="default-postaddress" id="default-postaddress" value="{{defaultPostaddress}}" placeholder="{{#translate}}Contact address to provide, eg. 1234 Main Street, Anywhere, MA 01234, USA{{/translate}}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<label for="default-from" class="col-sm-2 control-label">{{#translate}}Default "from name"{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="default-from" id="default-from" value="{{defaultFrom}}" placeholder="{{#translate}}This is the name your emails will come from{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="default-address" class="col-sm-2 control-label">{{#translate}}Default "from" email{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="email" class="form-control" name="default-address" id="default-address" value="{{defaultAddress}}" placeholder="{{#translate}}This is the address people will send replies to{{/translate}}" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="default-subject" class="col-sm-2 control-label">{{#translate}}Default "subject line"{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="default-subject" id="default-subject" value="{{defaultSubject}}" placeholder="{{#translate}}Keep it relevant and non-spammy{{/translate}}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="default-homepage" class="col-sm-2 control-label">{{#translate}}Default homepage (URL){{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="url" class="form-control" name="default-homepage" id="default-homepage" value="{{defaultHomepage}}" placeholder="{{#translate}}URL to redirect the subscribed users to, eg. http://example.com/{{/translate}}">
|
||||
<span class="help-block"> </span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>
|
||||
{{#translate}}Mailer Settings{{/translate}}
|
||||
</legend>
|
||||
|
||||
<p class="text-info">{{#translate}}These settings are required to send out e-mail messages{{/translate}}</p>
|
||||
|
||||
<div>
|
||||
<ul class="nav nav-tabs" role="tablist">
|
||||
<li role="presentation" class="{{#if useSMTP}} active {{/if}}"><a href="#smtp-settings" aria-controls="smtp-settings" role="tab" data-toggle="tab">{{#translate}}SMTP{{/translate}}</a></li>
|
||||
<li role="presentation" class="{{#if useSES}} active {{/if}}"><a href="#aws-ses" aria-controls="aws-ses" role="tab" data-toggle="tab">{{#translate}}AWS SES{{/translate}}</a></li>
|
||||
</ul>
|
||||
<div class="tab-content">
|
||||
<div role="tabpanel" class="tab-pane {{#if useSMTP}} active {{/if}}" id="smtp-settings">
|
||||
<p></p>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-xs-4">
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="mail-transport" id="transport-smtp" value="smtp" {{#if useSMTP}} checked {{/if}}>
|
||||
{{#translate}}Use SMTP for sending mail{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="smtp-hostname" class="col-sm-2 control-label">{{#translate}}Hostname{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="smtp-hostname" id="smtp-hostname" placeholder="Hostname, eg. smtp.example.com" value="{{smtpHostname}}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="smtp-port" class="col-sm-2 control-label">{{#translate}}Port{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="smtp-port" id="smtp-port" placeholder="{{#translate}}Port, eg. 465. Autodetected if left blank{{/translate}}" value="{{smtpPort}}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="smtp-encryption" class="col-sm-2 control-label">{{#translate}}Encryption{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" id="smtp-encryption" name="smtp-encryption">
|
||||
{{#each smtpEncryption}}
|
||||
<option value="{{key}}" {{#if checked}} selected {{/if}}>
|
||||
{{value}}
|
||||
{{#if description}} <span class="text-muted"> — {{description}}</span>{{/if}}
|
||||
</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-xs-4">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="smtp-disable-auth" {{#if smtpDisableAuth}} checked {{/if}}> {{#translate}}Disable SMTP authentication{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="smtp-user" class="col-sm-2 control-label">{{#translate}}Username{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="smtp-user" id="smtp-user" placeholder="{{#translate}}Username, eg. myaccount@example.com{{/translate}}" value="{{smtpUser}}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="smtp-pass" class="col-sm-2 control-label">{{#translate}}Password{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" class="form-control" name="smtp-pass" id="smtp-pass" placeholder="{{#translate}}Password{{/translate}}" value="{{smtpPass}}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane {{#if useSES}} active {{/if}}" id="aws-ses">
|
||||
<p></p>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-xs-4">
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="mail-transport" id="transport-ses" value="ses" {{#if useSES}} checked {{/if}}>
|
||||
{{#translate}}Use SES API for sending mail{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="ses-key" class="col-sm-2 control-label">{{#translate}}Access Key{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="ses-key" id="ses-key" placeholder="{{#translate}}AWS Access Key Id{{/translate}}" value="{{sesKey}}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="ses-secret" class="col-sm-2 control-label">{{#translate}}Secret Key{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" class="form-control" name="ses-secret" id="ses-secret" placeholder="{{#translate}}AWS Secret Access Key{{/translate}}" value="{{sesSecret}}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="ses-region" class="col-sm-2 control-label">{{#translate}}Region{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" id="ses-region" name="ses-region">
|
||||
{{#each sesRegion}}
|
||||
<option value="{{key}}" {{#if checked}} selected {{/if}}>
|
||||
{{value}}
|
||||
</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="form-group">
|
||||
<div class="text-right">
|
||||
<button type="submit" id="verify-button" form="smtp-verify" class="btn btn-info" data-loading-text="{{#translate}}Checking{{/translate}}…"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span> {{#translate}}Check Mailer config{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>
|
||||
{{#translate}}Advanced Mailer settings{{/translate}}
|
||||
</legend>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-xs-4">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="smtp-log" {{#if smtpLog}} checked {{/if}}> {{#translate}}Log SMTP transactions{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-xs-4">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="smtp-self-signed" {{#if smtpSelfSigned}} checked {{/if}}> {{#translate}}Allow self-signed certificates{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="smtp-max-connections" class="col-sm-2 control-label">{{#translate}}Max connections{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="smtp-max-connections" id="smtp-max-connections" placeholder="{{#translate}}The count of max connections, eg. 10{{/translate}}" value="{{smtpMaxConnections}}">
|
||||
<span class="help-block">{{#translate}}The count of maximum simultaneous connections to make against the SMTP server (defaults to 5). This limit is per sending process.{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="smtp-max-messages" class="col-sm-2 control-label">{{#translate}}Max messages{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="smtp-max-messages" id="smtp-max-messages" placeholder="{{#translate}}The count of max messages, eg. 100{{/translate}}" value="{{smtpMaxMessages}}">
|
||||
<span class="help-block">{{#translate}}The number of messages to send through a single connection before the connection is closed and reopened (defaults to 100){{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="smtp-throttling" class="col-sm-2 control-label">{{#translate}}Throttling{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="number" class="form-control" name="smtp-throttling" id="smtp-throttling" placeholder="{{#translate}}Messages per hour eg. 1000{{/translate}}" value="{{smtpThrottling}}">
|
||||
<span class="help-block">{{#translate}}Maximum number of messages to send in an hour. Leave empty or zero for no throttling. If your provider uses a different speed limit (messages/minute or messages/second) then convert this limit into messages/hour (1m/s => 3600m/h). This limit is per sending process.{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>
|
||||
{{#translate}}VERP bounce handling{{/translate}}
|
||||
</legend>
|
||||
|
||||
<p class="text-info">
|
||||
{{#translate}}Mailtrain is able to use VERP based routing to detect bounces. In this case the message is sent to the recipient using a custom VERP address as the return path of the message. If the message is not accepted a bounce email is sent to this special VERP address and thus a bounce is detected.{{/translate}}
|
||||
</p>
|
||||
|
||||
<p class="text-info">
|
||||
{{#translate}}To get VERP working you need to set up a DNS MX record that points to your Mailtrain hostname. You must also ensure that Mailtrain VERP interface is available from port 25 of your server (port 25 usually requires root user privileges). This way if anyone tries to send email to someuser@verp-hostname then the email should end up to this server.{{/translate}}
|
||||
</p>
|
||||
|
||||
<p class="text-warning">
|
||||
{{#translate}}VERP usually only works if you are using your own SMTP server. Regular relay services (SES, SparkPost, Gmail etc.) tend to remove the VERP address from the message.{{/translate}}
|
||||
</p>
|
||||
|
||||
{{#if verpEnabled}}
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-xs-4">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="verp-use" {{#if verpUse}} checked {{/if}}> {{#translate}}Use VERP to catch bounces{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="verp-hostname" class="col-sm-2 control-label">{{#translate}}Server hostname{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="verp-hostname" id="verp-hostname" placeholder="{{#translate}}The VERP server hostname, eg. bounces.example.com{{/translate}}" value="{{verpHostname}}">
|
||||
<span class="help-block">{{#translate}}VERP bounce handling server hostname. This hostname is used in the SMTP envelope FROM address and the MX DNS records should point to this server{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{else}}
|
||||
<div class="form-group">
|
||||
<div class="col-sm-10">
|
||||
<p class="form-control-static">{{#translate}}VERP bounce handling server is not enabled. Modify your server configuration file and restart server to enable it{{/translate}}</p>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>
|
||||
{{#translate}}GPG Signing{{/translate}}
|
||||
</legend>
|
||||
|
||||
<p>
|
||||
{{#translate}}Only messages that are encrypted can be signed. Subsribers who have not set up a GPG public key in their profile receive normal email messages. Users with GPG key set receive encrypted messages and if you have signing key also set, the messages are signed with this key.{{/translate}}
|
||||
</p>
|
||||
<p class="text-warning">
|
||||
{{#translate}}Do not use sensitive keys here. The private key and passphrase are not encrypted in the database.{{/translate}}
|
||||
</p>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="pgp-passphrase" class="col-sm-2 control-label">{{#translate}}Private Key Passphrase{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" class="form-control" name="pgp-passphrase" id="pgp-passphrase" placeholder="{{#translate}}Passphrase for the key if set{{/translate}}" value="{{pgpPassphrase}}">
|
||||
<span class="help-block">{{#translate}}Only fill this if your private key is encrypted with a passphrase{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="pgp-private-key" class="col-sm-2 control-label">{{#translate}}GPG Private Key{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control gpg-text" rows="3" id="pgp-private-key" name="pgp-private-key" placeholder="{{#translate}}Begins with{{/translate}} '-----BEGIN PGP PRIVATE KEY BLOCK-----'">{{pgpPrivateKey}}</textarea>
|
||||
<span class="help-block">{{#translate}}This value is optional. If you do not provide a private key GPG encrypted messages are sent without signing.{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>
|
||||
{{#translate}}DKIM Signing by ZoneMTA{{/translate}}
|
||||
</legend>
|
||||
|
||||
<p>
|
||||
{{#translate}}If you are using ZoneMTA then Mailtrain can provide a DKIM key for signing all outgoing messages. Other services usually provide their own means to DKIM sign your messages{{/translate}}
|
||||
</p>
|
||||
<p class="text-warning">
|
||||
{{#translate}}Do not use sensitive keys here. The private key is not encrypted in the database.{{/translate}}
|
||||
</p>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="pgp-passphrase" class="col-sm-2 control-label">{{#translate}}ZoneMTA DKIM API Key{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" class="form-control" name="dkim-api-key" id="dkim-api-key" placeholder="{{#translate}}Some secret value{{/translate}}" value="{{dkimApiKey}}">
|
||||
<span class="help-block">{{#translate}}Secret value known to ZoneMTA for requesting DKIM key information. If this value was generated by the Mailtrain installation script then you can keep it as it is{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="pgp-passphrase" class="col-sm-2 control-label">{{#translate}}DKIM domain{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="dkim-domain" id="dkim-domain" placeholder="{{#translate}}Domain name for the DKIM key{{/translate}}" value="{{dkimDomain}}">
|
||||
<span class="help-block">{{#translate}}Leave blank to use the sender email address domain{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="pgp-passphrase" class="col-sm-2 control-label">{{#translate}}DKIM key selector{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control" name="dkim-selector" id="dkim-selector" placeholder="{{#translate}}DKIM key selector{{/translate}}" value="{{dkimSelector}}">
|
||||
<span class="help-block">{{#translate}}Signing is disabled without a valid selector value{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="dkim-private-key" class="col-sm-2 control-label">{{#translate}}DKIM Private Key{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control gpg-text" rows="3" id="dkim-private-key" name="dkim-private-key" placeholder="{{#translate}}Begins with{{/translate}} '-----BEGIN RSA PRIVATE KEY-----'">{{dkimPrivateKey}}</textarea>
|
||||
<span class="help-block">{{#translate}}This value is optional. If you do not provide a private key then messages are not signed.{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</fieldset>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-ok"></i> {{#translate}}Update{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</form>
|
|
@ -1,92 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/templates/">{{#translate}}Templates{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Create Template{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{#translate}}Create Template{{/translate}}</h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/templates/create">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="template-name" class="col-sm-2 control-label">{{#translate}}Template name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control input-lg" name="name" id="template-name" value="{{name}}" placeholder="{{#translate}}Name for this template, eg. Newsletter{{/translate}}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="editor_name" class="col-sm-2 control-label">{{#translate}}HTML Editor{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" id="editor_name" name="editor_name">
|
||||
<option value=""> –– {{#translate}}Select{{/translate}} –– </option>
|
||||
{{#each editors}}
|
||||
<option value="{{name}}">{{label}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="editor-template">
|
||||
<div>
|
||||
<input type="hidden" name="text" value="{{text}}">
|
||||
<input type="hidden" name="html" value="{{html}}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="template-description" class="col-sm-2 control-label">{{#translate}}Description{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control" id="template-description" name="description" rows="3" placeholder="{{#translate}}Optional comments about this template{{/translate}}">{{description}}</textarea>
|
||||
<span class="help-block">{{#translate}}HTML is allowed{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-plus"></i> {{#translate}}Create Template{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
<div style="display: none">
|
||||
{{#each editors}}
|
||||
{{#if templates}}
|
||||
<div class="form-group" id="{{name}}-template">
|
||||
<label for="editor_data_{{name}}" class="col-sm-2 control-label">{{label}} {{#translate}}Template{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" id="editor_data_{{name}}" name="editor_data">
|
||||
{{#each templates}}
|
||||
<option value='{"template":"{{name}}"}'>{{label}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
|
||||
<div id="summernote-template">
|
||||
<input type="hidden" name="text" value="{{text}}">
|
||||
<input type="hidden" name="html" value="{{html}}">
|
||||
</div>
|
||||
|
||||
<div id="codeeditor-template">
|
||||
<input type="hidden" name="text" value="{{text}}">
|
||||
<input type="hidden" name="html" value="{{html}}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
$('select#editor_name').on('change', function() {
|
||||
var editor = this.value || 'summernote';
|
||||
$('#editor-template').children().first().replaceWith(
|
||||
$('#' + editor + '-template').clone()
|
||||
);
|
||||
});
|
||||
});
|
||||
</script>
|
|
@ -1,61 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/templates/">{{#translate}}Templates{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Edit Template{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{#translate}}Edit Template{{/translate}} <a class="btn btn-default btn-xs" href="/templates/" role="button"><span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span> {{#translate}}Back to templates{{/translate}}</a></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form method="post" class="delete-form" id="templates-delete" action="/templates/delete">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
</form>
|
||||
|
||||
<form method="post" class="duplicate-form" id="templates-duplicate" action="/templates/duplicate">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
</form>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/templates/edit">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
|
||||
<div class="form-group">
|
||||
<label for="template-name" class="col-sm-2 control-label">{{#translate}}Template name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control input-lg" name="name" id="template-name" value="{{name}}" placeholder="{{#translate}}Name for this template, eg. Newsletter{{/translate}}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{> merge_tag_reference mergeTagReferenceFooterText='In addition to that any custom field can have its own merge tag.'}}
|
||||
|
||||
{{> plaintext}}
|
||||
|
||||
{{#if disableWysiwyg}}
|
||||
{{> codeeditor}}
|
||||
{{else}}
|
||||
{{> (lookup . 'editorName') }}
|
||||
{{/if}}
|
||||
|
||||
<div class="form-group">
|
||||
<label for="template-description" class="col-sm-2 control-label">{{#translate}}Description{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control" id="template-description" name="description" rows="3" placeholder="{{#translate}}Optional comments about this template{{/translate}}">{{description}}</textarea>
|
||||
<span class="help-block">{{#translate}}HTML is allowed{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="pull-right">
|
||||
<button type="submit" form="templates-duplicate" class="btn btn-default"> {{#translate}}Duplicate{{/translate}}</button>
|
||||
<button type="submit" form="templates-delete" class="btn btn-danger"><i class="glyphicon glyphicon-remove"></i> {{#translate}}Delete Template{{/translate}}</button>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-ok"></i> {{#translate}}Update{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</form>
|
|
@ -1,31 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Templates{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<div class="pull-right">
|
||||
<a class="btn btn-primary" href="/templates/create" role="button"><i class="glyphicon glyphicon-plus"></i> {{#translate}}Create Template{{/translate}}</a>
|
||||
</div>
|
||||
|
||||
<h2>{{#translate}}Templates{{/translate}}</h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table data-topic-url="/templates" data-sort-column="1" data-sort-order="asc" class="table table-bordered table-hover data-table-ajax display nowrap" width="100%" data-row-sort="0,1,0,0">
|
||||
<thead>
|
||||
<th style="width: 1%">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Description{{/translate}}
|
||||
</th>
|
||||
<th style="width: 1%">
|
||||
|
||||
</th>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
|
@ -1,33 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/triggers/">{{#translate}}Automation Triggers{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Create Trigger{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{#translate}}Create Trigger{{/translate}} <small>{{#translate}}Select a list for the trigger{{/translate}}</small></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/triggers/create-select">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="group" class="col-sm-2 control-label">{{#translate}}List{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select class="form-control" name="list" required>
|
||||
<option value=""> –– {{#translate}}Select{{/translate}} ––</option>
|
||||
{{#each listItems}}
|
||||
<option value="{{id}}">
|
||||
{{name}} <span class="text-muted"> — {{subscribers}} {{#translate}}subscribers{{/translate}}</span>
|
||||
</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-triangle-right"></i> {{#translate}}Next{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
|
@ -1,162 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/triggers/">{{#translate}}Automation Triggers{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Create Trigger{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{#translate}}Create Trigger{{/translate}}</h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/triggers/create">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="list" value="{{list.id}}">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="trigger-name" class="col-sm-2 control-label">{{#translate}}Trigger name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control input-lg" name="name" id="trigger-name" value="{{name}}" placeholder="{{#translate}}Name for this trigger, eg. Inactive subscribers{{/translate}}" required autofocus>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="trigger-description" class="col-sm-2 control-label">{{#translate}}Description{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control" id="trigger-description" name="description" rows="3" placeholder="{{#translate}}Optional comments about this trigger{{/translate}}">{{description}}</textarea>
|
||||
<span class="help-block">{{#translate}}HTML is allowed{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{#translate}}List{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<p class="form-control-static"><a href="/lists/view/{{list.id}}">{{list.name}}</a> <span class="text-muted"> – {{list.subscribers}} {{#translate}}subscribers{{/translate}}</span></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<fieldset>
|
||||
<legend>
|
||||
{{#translate}}Trigger rule{{/translate}}
|
||||
</legend>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="trigger-days" class="col-sm-2 control-label">{{#translate}}Trigger fires{{/translate}}</label>
|
||||
<div class="col-sm-1">
|
||||
<input type="number" class="form-control" name="days" id="trigger-days" value="{{days}}" placeholder="1" required>
|
||||
</div>
|
||||
<div class="col-sm-1">
|
||||
<p class="form-control-static">{{#translate}}days after:{{/translate}}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-offset-2 panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="rule" value="subscription" {{#if isSubscription}} checked {{/if}}> {{#translate}}Subscription{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="column" class="col-sm-2 control-label">{{#translate}}Event{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select name="column" class="form-control">
|
||||
<option value="">
|
||||
–– {{#translate}}Select{{/translate}} ––
|
||||
</option>
|
||||
{{#each columns}}
|
||||
<option value="{{column}}" {{#if selected}} selected {{/if}}>{{name}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-offset-2 panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="rule" value="campaign" {{#if isCampaign}} checked {{/if}}> {{#translate}}Campaign{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="source-campaign" class="col-sm-2 control-label">{{#translate}}Campaign{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select name="source-campaign" class="form-control">
|
||||
<option value="">
|
||||
–– {{#translate}}Select{{/translate}} ––
|
||||
</option>
|
||||
{{#each sourceCampaigns}}
|
||||
<option value="{{id}}" {{#if selected}} selected {{/if}}>{{name}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="campaign-option" class="col-sm-2 control-label">{{#translate}}Event{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select name="campaign-option" id="campaign-option" class="form-control">
|
||||
<option value="">
|
||||
–– {{#translate}}Select{{/translate}} ––
|
||||
</option>
|
||||
{{#each campaignOptions}}
|
||||
<option value="{{option}}" {{#if selected}} selected {{/if}}>{{name}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>
|
||||
{{#translate}}Trigger action{{/translate}}
|
||||
</legend>
|
||||
|
||||
<div class="col-sm-offset-2 panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="action" value="send" {{#if isSend}} checked {{/if}}> {{#translate}}Send campaign{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="dest-campaign" class="col-sm-2 control-label">{{#translate}}Campaign{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select name="dest-campaign" class="form-control" required>
|
||||
<option value="">
|
||||
–– {{#translate}}Select{{/translate}} ––
|
||||
</option>
|
||||
{{#each destCampaigns}}
|
||||
<option value="{{id}}" {{#if selected}} selected {{/if}}>{{name}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</fieldset>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-plus"></i> {{#translate}}Create Trigger{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</form>
|
|
@ -1,177 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/triggers/">{{#translate}}Automation Triggers{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Edit Trigger{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<h2>{{#translate}}Edit Trigger{{/translate}} <a class="btn btn-default btn-xs" href="/triggers/" role="button"><span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span> {{#translate}}Back to triggers{{/translate}}</a></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<form method="post" class="delete-form" id="triggers-delete" action="/triggers/delete">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
</form>
|
||||
|
||||
<form class="form-horizontal" method="post" action="/triggers/edit">
|
||||
<input type="hidden" name="_csrf" value="{{csrfToken}}">
|
||||
<input type="hidden" name="id" value="{{id}}" />
|
||||
|
||||
<div class="form-group">
|
||||
<label for="trigger-name" class="col-sm-2 control-label">{{#translate}}Trigger name{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" class="form-control input-lg" name="name" id="trigger-name" value="{{name}}" placeholder="{{#translate}}Name for this trigger, eg. Inactive subscribers{{/translate}}" required autofocus>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="trigger-description" class="col-sm-2 control-label">{{#translate}}Description{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control" id="trigger-description" name="description" rows="3" placeholder="{{#translate}}Optional comments about this trigger{{/translate}}">{{description}}</textarea>
|
||||
<span class="help-block">{{#translate}}HTML is allowed{{/translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-offset-2">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="enabled" value="1" {{#if enabled}} checked {{/if}}> {{#translate}}Trigger is enabled{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">{{#translate}}List{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<p class="form-control-static"><a href="/lists/view/{{list.id}}">{{list.name}}</a> <span class="text-muted"> – {{list.subscribers}} {{#translate}}subscribers{{/translate}}</span></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<fieldset>
|
||||
<legend>
|
||||
{{#translate}}Trigger rule{{/translate}}
|
||||
</legend>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="trigger-days" class="col-sm-2 control-label">{{#translate}}Trigger fires{{/translate}}</label>
|
||||
<div class="col-sm-1">
|
||||
<input type="number" class="form-control" name="days" id="trigger-days" value="{{days}}" placeholder="1" required>
|
||||
</div>
|
||||
<div class="col-sm-1">
|
||||
<p class="form-control-static">{{#translate}}days after:{{/translate}}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-offset-2 panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="rule" value="subscription" {{#if isSubscription}} checked {{/if}}> {{#translate}}Subscription{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="column" class="col-sm-2 control-label">{{#translate}}Event{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select name="column" class="form-control">
|
||||
<option value="">
|
||||
–– {{#translate}}Select{{/translate}} ––
|
||||
</option>
|
||||
{{#each columns}}
|
||||
<option value="{{column}}" {{#if selected}} selected {{/if}}>{{name}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-offset-2 panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="rule" value="campaign" {{#if isCampaign}} checked {{/if}}> {{#translate}}Campaign{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="source-campaign" class="col-sm-2 control-label">{{#translate}}Campaign{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select name="source-campaign" class="form-control">
|
||||
<option value="">
|
||||
–– {{#translate}}Select{{/translate}} ––
|
||||
</option>
|
||||
{{#each sourceCampaigns}}
|
||||
<option value="{{id}}" {{#if selected}} selected {{/if}}>{{name}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="campaign-option" class="col-sm-2 control-label">{{#translate}}Event{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select name="campaign-option" id="campaign-option" class="form-control">
|
||||
<option value="">
|
||||
–– {{#translate}}Select{{/translate}} ––
|
||||
</option>
|
||||
{{#each campaignOptions}}
|
||||
<option value="{{option}}" {{#if selected}} selected {{/if}}>{{name}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>
|
||||
{{#translate}}Trigger action{{/translate}}
|
||||
</legend>
|
||||
|
||||
<div class="col-sm-offset-2 panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<div class="radio">
|
||||
<label>
|
||||
<input type="radio" name="action" value="send" {{#if isSend}} checked {{/if}}> {{#translate}}Send campaign{{/translate}}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="dest-campaign" class="col-sm-2 control-label">{{#translate}}Campaign{{/translate}}</label>
|
||||
<div class="col-sm-10">
|
||||
<select name="dest-campaign" class="form-control" required>
|
||||
<option value="">
|
||||
–– {{#translate}}Select{{/translate}} ––
|
||||
</option>
|
||||
{{#each destCampaigns}}
|
||||
<option value="{{id}}" {{#if selected}} selected {{/if}}>{{name}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="pull-right">
|
||||
<button type="submit" form="triggers-delete" class="btn btn-danger"><i class="glyphicon glyphicon-remove"></i> {{#translate}}Delete Trigger{{/translate}}</button>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-ok"></i> {{#translate}}Update{{/translate}}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</form>
|
|
@ -1,47 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li><a href="/triggers">{{#translate}}Automation Triggers{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Triggered{{/translate}} {{name}}</li>
|
||||
</ol>
|
||||
|
||||
<h2><span class="glyphicon glyphicon-inbox" aria-hidden="true"></span> {{name}} <small>{{#translate}}Triggered subscribers{{/translate}}</small></h2>
|
||||
|
||||
<hr>
|
||||
|
||||
{{#if description}}
|
||||
<div class="well well-sm">{{{description}}}</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="table-responsive">
|
||||
|
||||
<div class="panel panel-info">
|
||||
<!-- Default panel contents -->
|
||||
<div class="panel-heading">{{#translate}}Subscribers who caused this trigger to fire{{/translate}}:</div>
|
||||
<div class="panel-body">
|
||||
<div class="table-responsive">
|
||||
<table data-topic-url="/triggers/status" data-topic-id="{{id}}" data-sort-column="4" data-sort-order="desc" class="table table-bordered table-hover data-table-ajax display nowrap" width="100%" data-row-sort="0,1,1,1,1,0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="col-md-1">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Address{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}First Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Last Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Triggered time{{/translate}}
|
||||
</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -1,89 +0,0 @@
|
|||
<ol class="breadcrumb">
|
||||
<li><a href="/">{{#translate}}Home{{/translate}}</a></li>
|
||||
<li class="active">{{#translate}}Automation Triggers{{/translate}}</li>
|
||||
</ol>
|
||||
|
||||
<div class="pull-right">
|
||||
<a class="btn btn-primary" href="/triggers/create-select" role="button"><i class="glyphicon glyphicon-plus"></i> {{#translate}}Create Trigger{{/translate}}</a>
|
||||
</div>
|
||||
|
||||
<h2>{{#translate}}Automation Triggers{{/translate}}</h2>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover data-table display nowrap" width="100%" data-row-sort="0,1,1,0,1,0,1,1,0">
|
||||
<thead>
|
||||
<th class="col-md-1">
|
||||
#
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Name{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Status{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Description{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}List{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Trigger{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Target Campaign{{/translate}}
|
||||
</th>
|
||||
<th>
|
||||
{{#translate}}Triggered count{{/translate}}
|
||||
</th>
|
||||
<th class="col-md-1">
|
||||
|
||||
</th>
|
||||
</thead>
|
||||
{{#if rows}}
|
||||
<tbody>
|
||||
|
||||
{{#each rows}}
|
||||
<tr>
|
||||
<th scope="row">
|
||||
{{index}}
|
||||
</th>
|
||||
<td>
|
||||
<span class="glyphicon glyphicon-console" aria-hidden="true"></span> {{name}}
|
||||
</td>
|
||||
<td>
|
||||
{{#if enabled}}
|
||||
<span class="label label-success">{{#translate}}Enabled{{/translate}}</span>
|
||||
{{else}}
|
||||
<span class="label label-default">{{#translate}}Disabled{{/translate}}</span>
|
||||
{{/if}}
|
||||
</td>
|
||||
<td class="text-muted">
|
||||
{{description}}
|
||||
</td>
|
||||
<td class="text-info">
|
||||
<a href="/lists/view/{{list}}">{{listName}}</a>
|
||||
</td>
|
||||
<td class="text-info">
|
||||
{{{formatted}}}
|
||||
</td>
|
||||
<td class="text-info">
|
||||
<a href="/campaigns/view/{{destCampaign}}">{{destCampaignName}}</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="/triggers/status/{{id}}">{{count}}</a>
|
||||
</td>
|
||||
<td>
|
||||
<span class="glyphicon glyphicon-wrench" aria-hidden="true"></span>
|
||||
<a href="/triggers/edit/{{id}}">
|
||||
{{#translate}}Edit{{/translate}}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
{{/if}}
|
||||
</table>
|
||||
</div>
|
Loading…
Add table
Add a link
Reference in a new issue