From a229f80e22fc34134a3ce7470ea94dd03118da44 Mon Sep 17 00:00:00 2001 From: Andris Reinman Date: Wed, 1 Jun 2016 16:36:24 +0300 Subject: [PATCH] Added support for relative date ranges in segments --- app.js | 1 - config/default.toml | 1 + index.js | 1 - lib/models/segments.js | 43 +++++++++++++++--- lib/models/users.js | 4 +- public/css/mailtrain.css | 14 ++++++ routes/campaigns.js | 2 +- views/campaigns/view.hbs | 2 +- views/layout.hbs | 1 + views/lists/segments/rule-configure.hbs | 55 ++++++++++++++++++++++- views/lists/segments/rule-edit.hbs | 59 +++++++++++++++++++++++-- 11 files changed, 169 insertions(+), 14 deletions(-) create mode 100644 public/css/mailtrain.css diff --git a/app.js b/app.js index 92050075..22eba2fb 100644 --- a/app.js +++ b/app.js @@ -212,5 +212,4 @@ app.use((err, req, res, next) => { }); }); - module.exports = app; diff --git a/config/default.toml b/config/default.toml index 181bcc32..816a07ca 100644 --- a/config/default.toml +++ b/config/default.toml @@ -41,6 +41,7 @@ enabled=false host="localhost" port=6379 db=5 +# password="" [verp] enabled=false diff --git a/index.js b/index.js index 78de9a72..4b0fde8a 100644 --- a/index.js +++ b/index.js @@ -32,7 +32,6 @@ app.set('port', port); let server = http.createServer(app); - // Check if database needs upgrading before starting the server dbcheck(err => { if (err) { diff --git a/lib/models/segments.js b/lib/models/segments.js index 8fdb2f5d..8efd9b55 100644 --- a/lib/models/segments.js +++ b/lib/models/segments.js @@ -140,7 +140,9 @@ module.exports.get = (id, callback) => { case 'number': case 'date': case 'birthday': - if (rule.value.range) { + if (rule.value.relativeRange) { + rule.formatted = (rule.value.start ? rule.value.start + ' days ' + (rule.value.startDirection ? 'after' : 'before') + ' today' : 'today') + ' … ' + (rule.value.end ? rule.value.end + ' days ' + (rule.value.endDirection ? 'after' : 'before') + ' today' : 'today'); + } else if (rule.value.range) { rule.formatted = (rule.value.start || '') + ' … ' + (rule.value.end || ''); } else { rule.formatted = rule.value.value || ''; @@ -294,7 +296,15 @@ module.exports.createRule = (segmentId, rule, callback) => { case 'date': case 'birthday': case 'number': - if (rule.range) { + if (column.type === 'date' && rule.range === 'relative') { + value = { + relativeRange: true, + start: Number(rule.startRelative) || 0, + startDirection: Number(rule.startDirection) ? 1 : 0, + end: Number(rule.endRelative) || 0, + endDirection: Number(rule.endDirection) ? 1 : 0 + }; + } else if (rule.range === 'yes') { value = { range: true, start: rule.start, @@ -389,7 +399,9 @@ module.exports.getRule = (id, callback) => { case 'number': case 'date': case 'birthday': - if (rule.value.range) { + if (rule.value.relativeRange) { + rule.formatted = (rule.value.start ? rule.value.start + ' days ' + (rule.value.startDirection ? 'after' : 'before') + ' today' : 'today') + ' … ' + (rule.value.end ? rule.value.end + ' days ' + (rule.value.endDirection ? 'after' : 'before') + ' today' : 'today'); + } else if (rule.value.range) { rule.formatted = (rule.value.start || '') + ' … ' + (rule.value.end || ''); } else { rule.formatted = rule.value.value || ''; @@ -445,7 +457,15 @@ module.exports.updateRule = (id, rule, callback) => { case 'date': case 'birthday': case 'number': - if (rule.range) { + if (column.type === 'date' && rule.range === 'relative') { + value = { + relativeRange: true, + start: Number(rule.startRelative) || 0, + startDirection: Number(rule.startDirection) ? 1 : 0, + end: Number(rule.endRelative) || 0, + endDirection: Number(rule.endDirection) ? 1 : 0 + }; + } else if (rule.range === 'yes') { value = { range: true, start: rule.start, @@ -527,6 +547,11 @@ module.exports.getQuery = (id, prefix, callback) => { let query = []; let values = []; + let getRelativeDate = (days, direction) => { + let date = new Date(Date.now() + (direction ? 1 : -1) * days * 24 * 3600 * 1000); + return date.toISOString().substr(0, 10); + }; + let getDate = (value, nextDay) => { let parts = value.trim().split(/\D/); let year = Number(parts.shift()) || 0; @@ -579,7 +604,15 @@ module.exports.getQuery = (id, prefix, callback) => { } break; case 'date': - if (rule.value.range) { + if (rule.value.relativeRange) { + // start + query.push(prefix + '`' + rule.columnType.column + '` >= ?'); + values.push(getDate(getRelativeDate(rule.value.start, rule.value.startDirection))); + + // end + query.push(prefix + '`' + rule.columnType.column + '` < ?'); + values.push(getDate(getRelativeDate(rule.value.end, rule.value.endDirection), true)); + } else if (rule.value.range) { if (rule.value.start) { query.push(prefix + '`' + rule.columnType.column + '` >= ?'); values.push(getDate(rule.value.start)); diff --git a/lib/models/users.js b/lib/models/users.js index c178659b..62f8c10e 100644 --- a/lib/models/users.js +++ b/lib/models/users.js @@ -87,8 +87,10 @@ module.exports.authenticate = (username, password, callback) => { if (!result) { return callback(null, false); } + + let user = tools.convertKeys(rows[0]); return callback(null, { - id: rows[0].id, + id: user.id, username }); }); diff --git a/public/css/mailtrain.css b/public/css/mailtrain.css new file mode 100644 index 00000000..79e94191 --- /dev/null +++ b/public/css/mailtrain.css @@ -0,0 +1,14 @@ +.glyphicon.spinning { + animation: spin 1s infinite linear; + -webkit-animation: spin2 1s infinite linear; +} + +@keyframes spin { + from { transform: scale(1) rotate(0deg); } + to { transform: scale(1) rotate(360deg); } +} + +@-webkit-keyframes spin2 { + from { -webkit-transform: rotate(0deg); } + to { -webkit-transform: rotate(360deg); } +} diff --git a/routes/campaigns.js b/routes/campaigns.js index e93e24dd..e23b897c 100644 --- a/routes/campaigns.js +++ b/routes/campaigns.js @@ -263,7 +263,7 @@ router.post('/ajax', (req, res) => { if (data.scheduled && data.scheduled > new Date()) { return 'Scheduled'; } - return 'Sending'; + return ' Sending…'; case 3: return 'Finished'; case 4: diff --git a/views/campaigns/view.hbs b/views/campaigns/view.hbs index 21ddb5cd..58e3c470 100644 --- a/views/campaigns/view.hbs +++ b/views/campaigns/view.hbs @@ -229,7 +229,7 @@ -

Sending…

+

Sending…

{{/if}} {{/if}} diff --git a/views/layout.hbs b/views/layout.hbs index 3eff00a4..57f22c7c 100644 --- a/views/layout.hbs +++ b/views/layout.hbs @@ -19,6 +19,7 @@ + {{#if useEditor}} diff --git a/views/lists/segments/rule-configure.hbs b/views/lists/segments/rule-configure.hbs index 5c89cf33..d0659bbe 100644 --- a/views/lists/segments/rule-configure.hbs +++ b/views/lists/segments/rule-configure.hbs @@ -81,7 +81,7 @@
@@ -123,6 +123,59 @@ + +
+
+ +
+
+ +
+
+
+
+

From

+
+
+
+ +
+ days + +
+
+
+
+

to

+
+
+
+ +
+ days + +
+
+
+
+
+
{{/if}} {{#if columnTypeBirthday}} diff --git a/views/lists/segments/rule-edit.hbs b/views/lists/segments/rule-edit.hbs index e0c2c4ce..cd17e794 100644 --- a/views/lists/segments/rule-edit.hbs +++ b/views/lists/segments/rule-edit.hbs @@ -86,7 +86,7 @@
@@ -114,7 +114,7 @@
- +
@@ -122,7 +122,60 @@
- + +
+
+ + + + +
+
+ +
+
+ +
+
+
+
+

From

+
+
+
+ +
+ days + +
+
+
+
+

to

+
+
+
+ +
+ days + +