From 115ac462cce66197753bfe5b04383426aca5d2e4 Mon Sep 17 00:00:00 2001 From: Patrick Koch Date: Fri, 28 Apr 2017 16:19:50 +0000 Subject: [PATCH] Adds configurable TZ for frontend date display * Initial crack at #42 --- Gruntfile.js | 2 ++ bower.json | 3 ++- htdocs/assets/js/main.js | 1 + htdocs/assets/js/util.js | 18 +++++++++++++++--- htdocs/assets/js/views/admin.js | 15 +++++++++++++-- htdocs/assets/templates/admin.html | 16 +++++++++++++--- phplib/REST/Admin.php | 5 +++++ phplib/User.php | 1 + 8 files changed, 52 insertions(+), 9 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index a064b22..152aad2 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -49,6 +49,7 @@ module.exports = function(grunt) { select2: 'libs/select2', tablesorter: 'libs/tablesorter', moment: 'libs/moment', + "moment-timezone": 'libs/moment-timezone', autosize: 'libs/autosize', dragula: 'libs/dragula', mousetrap: 'libs/mousetrap', @@ -133,6 +134,7 @@ module.exports = function(grunt) { {nonull: true, src: 'bower_components/backbone/backbone.js', dest: 'htdocs/assets/js/libs/backbone.js'}, {nonull: true, src: 'bower_components/routefilter/dist/backbone.routefilter.js', dest: 'htdocs/assets/js/libs/backbone.routefilter.js'}, {nonull: true, src: 'bower_components/moment/moment.js', dest: 'htdocs/assets/js/libs/moment.js'}, + {nonull: true, src: 'bower_components/moment-timezone/builds/moment-timezone-with-data.js', dest: 'htdocs/assets/js/libs/moment-timezone.js'}, {nonull: true, src: 'bower_components/false/false.js', dest: 'htdocs/assets/js/libs/false.js'}, ], }, diff --git a/bower.json b/bower.json index 76e014b..cbceb01 100644 --- a/bower.json +++ b/bower.json @@ -38,6 +38,7 @@ "underscore": "~1.8.3", "uri.js": "~1.16.0", "dragula.js": "dragula#^3.7.0", - "Chart.js": "~2.1.6" + "Chart.js": "~2.1.6", + "moment-timezone": "^0.5.13" } } diff --git a/htdocs/assets/js/main.js b/htdocs/assets/js/main.js index 8372955..de84fa3 100644 --- a/htdocs/assets/js/main.js +++ b/htdocs/assets/js/main.js @@ -24,6 +24,7 @@ require.config({ select2: 'libs/select2', tablesorter: 'libs/tablesorter', moment: 'libs/moment', + "moment-timezone": 'libs/moment-timezone', dragula: 'libs/dragula', autosize: 'libs/autosize', mousetrap: 'libs/mousetrap', diff --git a/htdocs/assets/js/util.js b/htdocs/assets/js/util.js index cd46355..75c0f88 100644 --- a/htdocs/assets/js/util.js +++ b/htdocs/assets/js/util.js @@ -4,15 +4,27 @@ define(function(require) { _ = require('underscore'), URI = require('uri'), Autosize = require('autosize'), - CodeMirror = require('codemirror'); + CodeMirror = require('codemirror'), + Moment = require('moment'), + Data = require('data'); + // loads tz data + require('moment-timezone'); // Turn a timestamp into a datestring. - var formatDate = function(ts, options) { + var formatDate = function(ts) { if(ts === 0) { return 'N/A'; } - return (new Date(parseInt(ts, 10) * 1000)).toUTCString(); + var date = new Moment(new Date(parseInt(ts, 10) * 1000)); + + if (Data.User.Defaults.timezone) { + // get default user timezone setting. + date.tz(Data.User.Defaults.timezone); + } else { + date.tz(Moment.tz.guess()); + } + return date.format("ddd, DD MMM YYYY HH:mm:ss z"); // Thu, 27 Apr 2017 21:42:31 GMT }; // Turn a number into a timestring. diff --git a/htdocs/assets/js/views/admin.js b/htdocs/assets/js/views/admin.js index e5f8cae..b5731a1 100644 --- a/htdocs/assets/js/views/admin.js +++ b/htdocs/assets/js/views/admin.js @@ -1,10 +1,14 @@ "use strict"; define(function(require) { - var View = require('view'), + var _ = require('underscore'), + View = require('view'), NavbarView = require('views/navbar'), Templates = require('templates'), Config = require('config'), - Util = require('util'); + Util = require('util'), + Moment = require('moment'); + // load in tz data + require('moment-timezone'); var AdminNavbarView = NavbarView.extend({ @@ -25,6 +29,13 @@ define(function(require) { url: Config.api_root + 'admin', success: this.cbLoaded(function(resp) { this.data = resp; + + // prep tz data for display + this.data['timezones'] = _.map(Moment.tz.names(), function(tz){ + return {timezone: tz, selected: (tz === this.data['timezone'])}; + }, this); + this.data['timezones'].unshift({timezone: '', selected: ('' === this.data['timezone']) }); + this.render(); }), complete: $.proxy(this.App.hideLoader, this.App) diff --git a/htdocs/assets/templates/admin.html b/htdocs/assets/templates/admin.html index f7d7c2e..e98ae33 100644 --- a/htdocs/assets/templates/admin.html +++ b/htdocs/assets/templates/admin.html @@ -15,7 +15,16 @@
-
+
+
+ +
+ +

-
+

-
+

+
diff --git a/phplib/REST/Admin.php b/phplib/REST/Admin.php index 5e93d9f..3918a71 100644 --- a/phplib/REST/Admin.php +++ b/phplib/REST/Admin.php @@ -12,6 +12,7 @@ class Admin_REST extends REST { const T_INT = 1; const T_EMAIL = 2; const T_STR = 3; + const T_TZ = 4; public static $FIELDS = [ 'cron_enabled' => self::T_BOOL, @@ -23,6 +24,7 @@ class Admin_REST extends REST { 'from_error_email' => self::T_EMAIL, 'default_email' => self::T_EMAIL, 'announcement' => self::T_STR, + 'timezone' => self::T_TZ, ]; public function checkAuthorization() { @@ -59,6 +61,9 @@ public function POST(array $get, array $data) { break; case self::T_STR: break; + case self::T_TZ: + # todo validate with json data from moment-timezone + break; } if(!$ok) { diff --git a/phplib/User.php b/phplib/User.php index 58c3450..4af4cbb 100644 --- a/phplib/User.php +++ b/phplib/User.php @@ -27,6 +27,7 @@ protected static function generateSchema() { 'admin' => [static::T_BOOL, null, false], 'settings' => [static::T_OBJ, null, []], 'api_key' => [static::T_STR, null, ''], + 'timezone' => [static::T_STR, null, (new DBConfig())['timezone']], ]; }