diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 76705895..37fb552d 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,5 +1,9 @@ # Changelog +## 1.8.2 2016-05-13 + + * Added missing views for subscribers who clicked on any link and subscribers who opened the message + ## 1.8.1 2016-05-13 * Fixed an issue in API diff --git a/package.json b/package.json index ead450a7..12a73c72 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mailtrain", "private": true, - "version": "1.8.1", + "version": "1.8.2", "description": "Self hosted email newsletter app", "main": "index.js", "scripts": { diff --git a/routes/campaigns.js b/routes/campaigns.js index bd9f66c8..48c37967 100644 --- a/routes/campaigns.js +++ b/routes/campaigns.js @@ -348,6 +348,31 @@ router.get('/view/:id', passport.csrfProtection, (req, res) => { }); }); +router.get('/opened/:id', passport.csrfProtection, (req, res) => { + campaigns.get(req.params.id, true, (err, campaign) => { + if (err || !campaign) { + req.flash('danger', err && err.message || err || 'Could not find campaign with specified ID'); + return res.redirect('/campaigns'); + } + + lists.get(campaign.list, (err, list) => { + if (err || !campaign) { + req.flash('danger', err && err.message || err); + return res.redirect('/campaigns'); + } + + campaign.csrfToken = req.csrfToken(); + campaign.list = list; + + // show only messages that weren't bounced as delivered + campaign.delivered = campaign.delivered - campaign.bounced; + campaign.clicksRate = campaign.delivered ? Math.round((campaign.clicks / campaign.delivered) * 100) : 0; + + res.render('campaigns/opened', campaign); + }); + }); +}); + router.get('/clicked/:id/:linkId', passport.csrfProtection, (req, res) => { campaigns.get(req.params.id, true, (err, campaign) => { if (err || !campaign) { @@ -366,26 +391,33 @@ router.get('/clicked/:id/:linkId', passport.csrfProtection, (req, res) => { // show only messages that weren't bounced as delivered campaign.delivered = campaign.delivered - campaign.bounced; + campaign.clicksRate = campaign.delivered ? Math.round((campaign.clicks / campaign.delivered) * 100) : 0; - campaigns.getLinks(campaign.id, req.params.linkId, (err, links) => { - if (err) { - // ignore - } - let index = 0; - campaign.link = (links || []).map(link => { - link.index = ++index; - link.totalPercentage = campaign.delivered ? Math.round(((link.clicks / campaign.delivered) * 100) * 1000) / 1000 : 0; - link.relPercentage = campaign.clicks ? Math.round(((link.clicks / campaign.clicks) * 100) * 1000) / 1000 : 0; - link.short = link.url.replace(/^https?:\/\/(www.)?/i, ''); - if (link.short > 63) { - link.short = link.short.substr(0, 60) + '…'; - } - return link; - }).shift(); - campaign.showOverview = true; + if (req.params.linkId === 'all') { + campaign.aggregated = true; + campaign.link = { + id: 0 + }; res.render('campaigns/clicked', campaign); - }); - + } else { + campaigns.getLinks(campaign.id, req.params.linkId, (err, links) => { + if (err) { + // ignore + } + let index = 0; + campaign.link = (links || []).map(link => { + link.index = ++index; + link.totalPercentage = campaign.delivered ? Math.round(((link.clicks / campaign.delivered) * 100) * 1000) / 1000 : 0; + link.relPercentage = campaign.clicks ? Math.round(((link.clicks / campaign.clicks) * 100) * 1000) / 1000 : 0; + link.short = link.url.replace(/^https?:\/\/(www.)?/i, ''); + if (link.short > 63) { + link.short = link.short.substr(0, 60) + '…'; + } + return link; + }).shift(); + res.render('campaigns/clicked', campaign); + }); + } }); }); }); diff --git a/views/campaigns/clicked.hbs b/views/campaigns/clicked.hbs index 6a5c4590..bb20f755 100644 --- a/views/campaigns/clicked.hbs +++ b/views/campaigns/clicked.hbs @@ -34,25 +34,40 @@ - - {{link.short}} - - - {{link.clicks}} - - - {{link.relPercentage}} - - - {{link.totalPercentage}} - + {{#if aggregated}} + + Aggregated clicks + + + {{clicks}} + + + – + + + CTR {{clicksRate}}% + + {{else}} + + {{link.short}} + + + {{link.clicks}} + + + {{link.relPercentage}} + + + {{link.totalPercentage}} + + {{/if}}
-
Subscribers who clicked on this link:
+
{{#if aggregated}}Subscribers who clicked on a link:{{else}}Subscribers who clicked on this link:{{/if}}
diff --git a/views/campaigns/opened.hbs b/views/campaigns/opened.hbs new file mode 100644 index 00000000..9e59be96 --- /dev/null +++ b/views/campaigns/opened.hbs @@ -0,0 +1,54 @@ + + +

{{name}} Opened info View campaign

+ +
+ +{{#if description}} +
{{{description}}}
+{{/if}} + +
+ +
+ +
Subscribers who opened this message:
+
+
+
+ + + + + + + + + + + +
+ # + + Address + + First Name + + Last Name + + First open + + Opened count +
+
+
+
+ diff --git a/views/campaigns/view.hbs b/views/campaigns/view.hbs index bec02b86..88252046 100644 --- a/views/campaigns/view.hbs +++ b/views/campaigns/view.hbs @@ -100,7 +100,7 @@
Unsubscribed
{{unsubscribed}}
-
Opened
+
Opened
@@ -109,7 +109,7 @@
-
Clicked
+
Clicked
@@ -322,6 +322,9 @@ Aggregated clicks +
+ +
{{clicks}}