Add segment support to triggers frontend

This commit is contained in:
Jonas Düver 2018-04-25 18:15:14 +02:00
parent ae7a8eb72d
commit 006e4aa116
5 changed files with 132 additions and 74 deletions

View file

@ -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,52 +83,69 @@ 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');
} }
fields.list(list.id, (err, fieldList) => {
if (err && !fieldList) { segments.get(segmentId, (err, segment) => {
fieldList = []; if (segmentId > 0 && err) {
req.flash('danger', err && err.message || err || _('Error while finding selected segment'));
return res.redirect('/triggers/create-select');
} }
data.columns = triggers.defaultColumns.concat(fieldList.filter(field => fields.genericTypes[field.type] === 'date')).map(field => ({ segments.subscribers(segmentId, true, (err, segmentSubscribers) => {
column: field.column, if (segmentId > 0 && err) {
name: field.name, req.flash('danger', err && err.message || err || _('Error while finding selected segment'));
selected: data.column === field.column return res.redirect('/triggers/create-select');
}));
campaigns.list(0, 300, (err, campaignList) => {
if (err) {
return next(err);
} }
data.sourceCampaigns = (campaignList || []).filter(campaign => campaign.list === list.id).map(campaign => ({ fields.list(list.id, (err, fieldList) => {
id: campaign.id, if (err && !fieldList) {
name: campaign.name, fieldList = [];
selected: Number(data.sourceCampaign) === campaign.id }
}));
data.destCampaigns = (campaignList || []).filter(campaign => campaign.list === list.id && campaign.type === 4).map(campaign => ({ data.columns = triggers.defaultColumns.concat(fieldList.filter(field => fields.genericTypes[field.type] === 'date')).map(field => ({
id: campaign.id, column: field.column,
name: campaign.name, name: field.name,
selected: Number(data.destCampaign) === campaign.id selected: data.column === field.column
})); }));
data.list = list; campaigns.list(0, 300, (err, campaignList) => {
data.isSubscription = data.rule === 'subscription' || !data.rule; if (err) {
data.isCampaign = data.rule === 'campaign'; return next(err);
}
data.campaignOptions = triggers.defaultCampaignEvents.map(evt => ({ data.sourceCampaigns = (campaignList || []).filter(campaign => campaign.list === list.id).map(campaign => ({
option: evt.option, id: campaign.id,
name: evt.name, name: campaign.name,
selected: Number(data.sourceCampaign) === evt.option selected: Number(data.sourceCampaign) === campaign.id
})); }));
data.isSend = true; data.destCampaigns = (campaignList || []).filter(campaign => campaign.list === list.id && (segmentId <= 0 || campaign.segment === segmentId) && campaign.type === 4).map(campaign => ({
id: campaign.id,
name: campaign.name,
selected: Number(data.destCampaign) === campaign.id
}));
res.render('triggers/create', data); data.list = list;
data.segment = segment;
data.segmentSubscribers = segmentSubscribers;
data.isSubscription = data.rule === 'subscription' || !data.rule;
data.isCampaign = data.rule === 'campaign';
data.campaignOptions = triggers.defaultCampaignEvents.map(evt => ({
option: evt.option,
name: evt.name,
selected: Number(data.sourceCampaign) === evt.option
}));
data.isSend = true;
res.render('triggers/create', data);
});
});
}); });
}); });
}); });
@ -154,51 +180,73 @@ 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');
} }
fields.list(list.id, (err, fieldList) => {
if (err && !fieldList) { segments.get(trigger.segment, (err, segment) => {
fieldList = []; 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;
} }
campaigns.list(0, 300, (err, campaignList) => { segments.subscribers(segmentId, true, (err, segmentSubscribers) => {
if (err) { if (trigger.segment > 0 && err) {
return next(err); req.flash('danger', err && err.message || err || _('Error while finding selected segment subscribers'));
return res.redirect('/triggers');
} }
trigger.sourceCampaigns = (campaignList || []).filter(campaign => campaign.list === list.id).map(campaign => ({ fields.list(list.id, (err, fieldList) => {
id: campaign.id, if (err && !fieldList) {
name: campaign.name, fieldList = [];
selected: Number(trigger.sourceCampaign) === campaign.id }
}));
trigger.destCampaigns = (campaignList || []).filter(campaign => campaign.list === list.id && campaign.type === 4).map(campaign => ({ campaigns.list(0, 300, (err, campaignList) => {
id: campaign.id, if (err) {
name: campaign.name, return next(err);
selected: Number(trigger.destCampaign) === campaign.id }
}));
trigger.list = list; trigger.sourceCampaigns = (campaignList || []).filter(campaign => campaign.list === list.id).map(campaign => ({
trigger.isSubscription = trigger.rule === 'subscription' || !trigger.rule; id: campaign.id,
trigger.isCampaign = trigger.rule === 'campaign'; name: campaign.name,
selected: Number(trigger.sourceCampaign) === campaign.id
}));
trigger.columns = triggers.defaultColumns.concat(fieldList.filter(field => fields.genericTypes[field.type] === 'date')).map(field => ({ trigger.destCampaigns = (campaignList || []).filter(campaign => campaign.list === list.id && campaign.type === 4).map(campaign => ({
column: field.column, id: campaign.id,
name: field.name, name: campaign.name,
selected: trigger.isSubscription && trigger.column === field.column selected: Number(trigger.destCampaign) === campaign.id
})); }));
trigger.campaignOptions = triggers.defaultCampaignEvents.map(evt => ({ trigger.list = list;
option: evt.option, trigger.segment = segment;
name: evt.name, trigger.segmentSubscribers = segmentSubscribers;
selected: trigger.isCampaign && trigger.column === evt.option trigger.isSubscription = trigger.rule === 'subscription' || !trigger.rule;
})); trigger.isCampaign = trigger.rule === 'campaign';
if (trigger.rule !== 'subscription') { trigger.columns = triggers.defaultColumns.concat(fieldList.filter(field => fields.genericTypes[field.type] === 'date')).map(field => ({
trigger.column = null; column: field.column,
} name: field.name,
selected: trigger.isSubscription && trigger.column === field.column
}));
trigger.isSend = true; trigger.campaignOptions = triggers.defaultCampaignEvents.map(evt => ({
option: evt.option,
name: evt.name,
selected: trigger.isCampaign && trigger.column === evt.option
}));
res.render('triggers/edit', trigger); if (trigger.rule !== 'subscription') {
trigger.column = null;
}
trigger.isSend = true;
res.render('triggers/edit', trigger);
});
});
}); });
}); });
}); });

View file

@ -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"> &mdash; {{subscribers}} {{#translate}}subscribers{{/translate}}</span> {{name}} <span class="text-muted"> &mdash; {{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>

View file

@ -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>

View file

@ -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>

View file

@ -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}}}