Add segment support to triggers frontend
This commit is contained in:
parent
ae7a8eb72d
commit
006e4aa116
5 changed files with 132 additions and 74 deletions
|
@ -5,6 +5,7 @@ let router = new express.Router();
|
||||||
let triggers = require('../lib/models/triggers');
|
let triggers = require('../lib/models/triggers');
|
||||||
let campaigns = require('../lib/models/campaigns');
|
let campaigns = require('../lib/models/campaigns');
|
||||||
let lists = require('../lib/models/lists');
|
let lists = require('../lib/models/lists');
|
||||||
|
let segments = require('../lib/models/segments');
|
||||||
let fields = require('../lib/models/fields');
|
let fields = require('../lib/models/fields');
|
||||||
let striptags = require('striptags');
|
let striptags = require('striptags');
|
||||||
let passport = require('../lib/passport');
|
let passport = require('../lib/passport');
|
||||||
|
@ -58,15 +59,23 @@ router.get('/create-select', passport.csrfProtection, (req, res, next) => {
|
||||||
});
|
});
|
||||||
|
|
||||||
router.post('/create-select', passport.parseForm, passport.csrfProtection, (req, res) => {
|
router.post('/create-select', passport.parseForm, passport.csrfProtection, (req, res) => {
|
||||||
if (!req.body.list) {
|
// Check if req.body.list is in correct format ("listId:segmentId")
|
||||||
|
if (!req.body.list || !/([\d]+):([\d]+)/.test(req.body.list)) {
|
||||||
req.flash('danger', _('Could not find selected list'));
|
req.flash('danger', _('Could not find selected list'));
|
||||||
return res.redirect('/triggers/create-select');
|
return res.redirect('/triggers/create-select');
|
||||||
}
|
}
|
||||||
res.redirect('/triggers/' + encodeURIComponent(req.body.list) + '/create');
|
|
||||||
|
let listId = parseInt(req.body.list.split(':')[0]);
|
||||||
|
let segmentId = parseInt(req.body.list.split(':')[1]);
|
||||||
|
|
||||||
|
res.redirect('/triggers/' + encodeURIComponent(listId) + '/' + encodeURIComponent(segmentId) + '/create');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
router.get('/:listId/create', passport.csrfProtection, (req, res, next) => {
|
router.get('/:listId/:segmentId/create', passport.csrfProtection, (req, res, next) => {
|
||||||
|
let listId = parseInt(req.params.listId);
|
||||||
|
let segmentId = parseInt(req.params.segmentId);
|
||||||
|
|
||||||
let data = tools.convertKeys(req.query, {
|
let data = tools.convertKeys(req.query, {
|
||||||
skip: ['layout']
|
skip: ['layout']
|
||||||
});
|
});
|
||||||
|
@ -74,11 +83,24 @@ router.get('/:listId/create', passport.csrfProtection, (req, res, next) => {
|
||||||
data.csrfToken = req.csrfToken();
|
data.csrfToken = req.csrfToken();
|
||||||
data.days = Math.max(Number(data.days) || 1, 1);
|
data.days = Math.max(Number(data.days) || 1, 1);
|
||||||
|
|
||||||
lists.get(req.params.listId, (err, list) => {
|
lists.get(listId, (err, list) => {
|
||||||
if (err || !list) {
|
if (err || !list) {
|
||||||
req.flash('danger', err && err.message || err || _('Could not find selected list'));
|
req.flash('danger', err && err.message || err || _('Could not find selected list'));
|
||||||
return res.redirect('/triggers/create-select');
|
return res.redirect('/triggers/create-select');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
segments.get(segmentId, (err, segment) => {
|
||||||
|
if (segmentId > 0 && err) {
|
||||||
|
req.flash('danger', err && err.message || err || _('Error while finding selected segment'));
|
||||||
|
return res.redirect('/triggers/create-select');
|
||||||
|
}
|
||||||
|
|
||||||
|
segments.subscribers(segmentId, true, (err, segmentSubscribers) => {
|
||||||
|
if (segmentId > 0 && err) {
|
||||||
|
req.flash('danger', err && err.message || err || _('Error while finding selected segment'));
|
||||||
|
return res.redirect('/triggers/create-select');
|
||||||
|
}
|
||||||
|
|
||||||
fields.list(list.id, (err, fieldList) => {
|
fields.list(list.id, (err, fieldList) => {
|
||||||
if (err && !fieldList) {
|
if (err && !fieldList) {
|
||||||
fieldList = [];
|
fieldList = [];
|
||||||
|
@ -101,13 +123,15 @@ router.get('/:listId/create', passport.csrfProtection, (req, res, next) => {
|
||||||
selected: Number(data.sourceCampaign) === campaign.id
|
selected: Number(data.sourceCampaign) === campaign.id
|
||||||
}));
|
}));
|
||||||
|
|
||||||
data.destCampaigns = (campaignList || []).filter(campaign => campaign.list === list.id && campaign.type === 4).map(campaign => ({
|
data.destCampaigns = (campaignList || []).filter(campaign => campaign.list === list.id && (segmentId <= 0 || campaign.segment === segmentId) && campaign.type === 4).map(campaign => ({
|
||||||
id: campaign.id,
|
id: campaign.id,
|
||||||
name: campaign.name,
|
name: campaign.name,
|
||||||
selected: Number(data.destCampaign) === campaign.id
|
selected: Number(data.destCampaign) === campaign.id
|
||||||
}));
|
}));
|
||||||
|
|
||||||
data.list = list;
|
data.list = list;
|
||||||
|
data.segment = segment;
|
||||||
|
data.segmentSubscribers = segmentSubscribers;
|
||||||
data.isSubscription = data.rule === 'subscription' || !data.rule;
|
data.isSubscription = data.rule === 'subscription' || !data.rule;
|
||||||
data.isCampaign = data.rule === 'campaign';
|
data.isCampaign = data.rule === 'campaign';
|
||||||
|
|
||||||
|
@ -123,6 +147,8 @@ router.get('/:listId/create', passport.csrfProtection, (req, res, next) => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
router.post('/create', passport.parseForm, passport.csrfProtection, (req, res) => {
|
router.post('/create', passport.parseForm, passport.csrfProtection, (req, res) => {
|
||||||
|
@ -154,6 +180,24 @@ router.get('/edit/:id', passport.csrfProtection, (req, res, next) => {
|
||||||
req.flash('danger', err && err.message || err || _('Could not find selected list'));
|
req.flash('danger', err && err.message || err || _('Could not find selected list'));
|
||||||
return res.redirect('/triggers');
|
return res.redirect('/triggers');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
segments.get(trigger.segment, (err, segment) => {
|
||||||
|
if (trigger.segment > 0 && err) {
|
||||||
|
req.flash('danger', err && err.message || err || _('Error while finding selected segment'));
|
||||||
|
return res.redirect('/triggers');
|
||||||
|
}
|
||||||
|
|
||||||
|
let segmentId = 0;
|
||||||
|
if (trigger.segment > 0) {
|
||||||
|
segmentId = segment.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
segments.subscribers(segmentId, true, (err, segmentSubscribers) => {
|
||||||
|
if (trigger.segment > 0 && err) {
|
||||||
|
req.flash('danger', err && err.message || err || _('Error while finding selected segment subscribers'));
|
||||||
|
return res.redirect('/triggers');
|
||||||
|
}
|
||||||
|
|
||||||
fields.list(list.id, (err, fieldList) => {
|
fields.list(list.id, (err, fieldList) => {
|
||||||
if (err && !fieldList) {
|
if (err && !fieldList) {
|
||||||
fieldList = [];
|
fieldList = [];
|
||||||
|
@ -177,6 +221,8 @@ router.get('/edit/:id', passport.csrfProtection, (req, res, next) => {
|
||||||
}));
|
}));
|
||||||
|
|
||||||
trigger.list = list;
|
trigger.list = list;
|
||||||
|
trigger.segment = segment;
|
||||||
|
trigger.segmentSubscribers = segmentSubscribers;
|
||||||
trigger.isSubscription = trigger.rule === 'subscription' || !trigger.rule;
|
trigger.isSubscription = trigger.rule === 'subscription' || !trigger.rule;
|
||||||
trigger.isCampaign = trigger.rule === 'campaign';
|
trigger.isCampaign = trigger.rule === 'campaign';
|
||||||
|
|
||||||
|
@ -203,6 +249,8 @@ router.get('/edit/:id', passport.csrfProtection, (req, res, next) => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
router.post('/edit', passport.parseForm, passport.csrfProtection, (req, res) => {
|
router.post('/edit', passport.parseForm, passport.csrfProtection, (req, res) => {
|
||||||
|
|
|
@ -17,9 +17,19 @@
|
||||||
<select class="form-control" name="list" required>
|
<select class="form-control" name="list" required>
|
||||||
<option value=""> –– {{#translate}}Select{{/translate}} ––</option>
|
<option value=""> –– {{#translate}}Select{{/translate}} ––</option>
|
||||||
{{#each listItems}}
|
{{#each listItems}}
|
||||||
<option value="{{id}}">
|
<option value="{{id}}:0">
|
||||||
{{name}} <span class="text-muted"> — {{subscribers}} {{#translate}}subscribers{{/translate}}</span>
|
{{name}} <span class="text-muted"> — {{subscribers}} {{#translate}}subscribers{{/translate}}</span>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
|
{{#if segments}}
|
||||||
|
<optgroup label="{{name}} segments">
|
||||||
|
{{#each segments}}
|
||||||
|
<option value="{{../id}}:{{id}}" {{#if selected}} selected {{/if}}>
|
||||||
|
{{../name}}: {{name}}
|
||||||
|
</option>
|
||||||
|
{{/each}}
|
||||||
|
</optgroup>
|
||||||
|
{{/if}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-2 control-label">{{#translate}}List{{/translate}}</label>
|
<label class="col-sm-2 control-label">{{#translate}}List{{/translate}}</label>
|
||||||
<div class="col-sm-10">
|
<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>
|
<p class="form-control-static"><a href="/lists/view/{{list.id}}">{{list.name}}</a> <span class="text-muted"> {{#if segment.id}}– <a href="/lists/view/{{list.id}}?segment={{segment.id}}">{{segment.name}}</a>{{/if}} <span class="text-muted"> – {{#if segment.id}} {{segmentSubscribers}} {{else}} {{list.subscribers}} {{/if}} {{#translate}}subscribers{{/translate}}</span><input id="segmentId" name="segmentId" type="hidden" value="{{segment.id}}"></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-2 control-label">{{#translate}}List{{/translate}}</label>
|
<label class="col-sm-2 control-label">{{#translate}}List{{/translate}}</label>
|
||||||
<div class="col-sm-10">
|
<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>
|
<p class="form-control-static"><a href="/lists/view/{{list.id}}">{{list.name}}</a> <span class="text-muted"> {{#if segment.id}}– <a href="/lists/view/{{list.id}}?segment={{segment.id}}">{{segment.name}}</a>{{/if}} <span class="text-muted"> – {{#if segment.id}} {{segmentSubscribers}} {{else}} {{list.subscribers}} {{/if}} {{#translate}}subscribers{{/translate}}</span><input id="segmentId" name="segmentId" type="hidden" value="{{segment.id}}"></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -64,7 +64,7 @@
|
||||||
{{description}}
|
{{description}}
|
||||||
</td>
|
</td>
|
||||||
<td class="text-info">
|
<td class="text-info">
|
||||||
<a href="/lists/view/{{list}}">{{listName}}</a>
|
<a href="/lists/view/{{list}}">{{listName}}</a>{{#if segment}} - <a href="/lists/view/{{list}}?segment={{segment}}">{{segmentName}}</a>{{/if}}
|
||||||
</td>
|
</td>
|
||||||
<td class="text-info">
|
<td class="text-info">
|
||||||
{{{formatted}}}
|
{{{formatted}}}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue