Repository: ambari Updated Branches: refs/heads/trunk d729ce3fb -> e1caac3aa
AMBARI-13332. User Timezone setting fixes (onechiporenko) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/e1caac3a Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/e1caac3a Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/e1caac3a Branch: refs/heads/trunk Commit: e1caac3aaa6e719bed91ab0cde814c14347288ed Parents: d729ce3 Author: Oleg Nechiporenko <onechipore...@apache.org> Authored: Wed Oct 7 12:18:10 2015 +0300 Committer: Oleg Nechiporenko <onechipore...@apache.org> Committed: Wed Oct 7 12:18:10 2015 +0300 ---------------------------------------------------------------------- .../global/user_settings_controller.js | 50 +++++++++++++++++--- ambari-web/app/messages.js | 4 +- ambari-web/app/styles/application.less | 11 ++++- ambari-web/app/templates/common/settings.hbs | 20 +++++--- ambari-web/app/utils/date.js | 28 +++++++++++ 5 files changed, 98 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/e1caac3a/ambari-web/app/controllers/global/user_settings_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/global/user_settings_controller.js b/ambari-web/app/controllers/global/user_settings_controller.js index 1748ea2..ef53d81 100644 --- a/ambari-web/app/controllers/global/user_settings_controller.js +++ b/ambari-web/app/controllers/global/user_settings_controller.js @@ -18,6 +18,8 @@ var App = require('app'); +var dateUtils = require('utils/date'); + /** * Controller for user settings * Allows to get them from persist and update them to the persist @@ -47,11 +49,47 @@ App.UserSettingsController = Em.Controller.extend(App.UserPref, { }, timezone: { name: prefix + 'timezone-' + loginName, - defaultValue: '' + defaultValue: dateUtils.detectUserTimezone() } }; }.property('App.router.loginName'), + init: function () { + this.set('timezonesFormatted', this._parseTimezones()); + this._super(); + }, + + /** + * + * @private + * @method _parseTimezones + * @return {{utcOffset: number, label: string, value: string}[]} + */ + _parseTimezones: function () { + return dateUtils.getAllTimezoneNames().map(function (timeZoneName) { + var zone = moment(new Date()).tz(timeZoneName); + var offset = zone.format('Z'); + return { + utcOffset: zone.utcOffset(), + label: '(UTC' + offset + ') ' + timeZoneName, + value: timeZoneName + }; + }).sort(function (zoneA, zoneB) { + if (zoneA.utcOffset === zoneB.utcOffset) { + if (zoneA.value === zoneB.value) { + return 0; + } + return zoneA.value < zoneB.value ? -1 : 1; + } + else { + if(zoneA.utcOffset === zoneB.utcOffset) { + return 0; + } + return zoneA.utcOffset < zoneB.utcOffset ? -1 : 1; + } + }); + }, + /** * Load some user's setting from the persist * If <code>persistKey</code> is not provided, all settings are loaded @@ -152,11 +190,11 @@ App.UserSettingsController = Em.Controller.extend(App.UserPref, { var self = this; var curValue = null; var keys = this.get('userSettingsKeys'); + var timezonesFormatted = this.get('timezonesFormatted'); this.dataLoading().done(function (response) { var initValue = JSON.parse(response[keys.show_bg.name]); - var initTimezone = JSON.parse(response[keys.timezone.name]); - + var initTimezone = timezonesFormatted.findProperty('value', JSON.parse(response[keys.timezone.name])); return App.ModalPopup.show({ header: Em.I18n.t('common.userSettings'), @@ -172,9 +210,9 @@ App.UserSettingsController = Em.Controller.extend(App.UserPref, { }.observes('isNotShowBgChecked'), /** - * @type {string[]} + * @type {{label: string, value: string}} */ - timezonesList: [''].concat(moment.tz.names()) + timezonesList: timezonesFormatted }), @@ -191,7 +229,7 @@ App.UserSettingsController = Em.Controller.extend(App.UserPref, { } if (!App.get('testMode')) { self.postUserPref('show_bg', curValue); - self.postUserPref('timezone', this.get('selectedTimezone')); + self.postUserPref('timezone', this.get('selectedTimezone.value')); } if (this.needsPageRefresh()) { location.reload(); http://git-wip-us.apache.org/repos/asf/ambari/blob/e1caac3a/ambari-web/app/messages.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js index 14df65e..ab9a874 100644 --- a/ambari-web/app/messages.js +++ b/ambari-web/app/messages.js @@ -39,9 +39,11 @@ Em.I18n.translations = { 'app.settings':'Settings', 'app.manageAmbari': 'Manage Ambari', 'app.aboutAmbari':'About', - 'app.settings.selectTimezone': 'Select your timezone', + 'app.settings.selectTimezone': 'Timezone', 'app.settings.notshowBgOperationsPopup': 'Do not show the Background Operations dialog when starting an operation', 'app.settings.notShowBgOperations': 'Do not show this dialog again when starting a background operation', + 'app.settings.categories.general': 'General', + 'app.settings.categories.locale': 'Locale', 'app.aboutAmbari.getInvolved': 'Get involved!', 'app.aboutAmbari.version': 'Version', http://git-wip-us.apache.org/repos/asf/ambari/blob/e1caac3a/ambari-web/app/styles/application.less ---------------------------------------------------------------------- diff --git a/ambari-web/app/styles/application.less b/ambari-web/app/styles/application.less index 46e3d4a..fcc4863 100644 --- a/ambari-web/app/styles/application.less +++ b/ambari-web/app/styles/application.less @@ -3741,8 +3741,17 @@ table.graphs { } .admin-user-settings { + hr { + margin: 5px 0; + } + select { + width: auto; + } + .setting-wrapper { + margin-bottom: 20px; + } .checkbox { - margin: 0px; + margin: 0; } } /*End Admin*/ http://git-wip-us.apache.org/repos/asf/ambari/blob/e1caac3a/ambari-web/app/templates/common/settings.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/common/settings.hbs b/ambari-web/app/templates/common/settings.hbs index cd1dd44..2254c17 100644 --- a/ambari-web/app/templates/common/settings.hbs +++ b/ambari-web/app/templates/common/settings.hbs @@ -17,20 +17,26 @@ }} <div class="admin-user-settings"> - <div> + <div class="setting-wrapper"> + <h4>{{t app.settings.categories.general}}</h4> + <hr /> <label> {{view Ember.Checkbox checkedBinding="view.isNotShowBgChecked" class="checkbox"}} {{t app.settings.notshowBgOperationsPopup}} </label> </div> - <div> + <div class="setting-wrapper"> + <h4>{{t app.settings.categories.locale}}</h4> + <hr /> <label> {{t app.settings.selectTimezone}} - {{view Em.Select - contentBinding="view.timezonesList" - selectionBinding="view.parentView.selectedTimezone" - class="group-select select-group-box" - }} + {{view Em.Select + contentBinding="view.timezonesList" + optionLabelPath="content.label" + optionValuePath="content.value" + selectionBinding="view.parentView.selectedTimezone" + class="group-select select-group-box" + }} </label> </div> </div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/e1caac3a/ambari-web/app/utils/date.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/utils/date.js b/ambari-web/app/utils/date.js index f6d98f5..84b67f9 100644 --- a/ambari-web/app/utils/date.js +++ b/ambari-web/app/utils/date.js @@ -210,5 +210,33 @@ module.exports = { duration = endTime - startTime; } return duration; + }, + + /** + * Load list of timezones from moment.tz + * Zones "Etc/*" are excluded + * @returns {object[]} + */ + getAllTimezoneNames: function () { + return moment.tz.names().filter(function (timeZoneName) { + return !timeZoneName.startsWith('Etc/'); + }); + }, + + /** + * Try detect user's timezone using timezoneOffset and moment.tz + * @returns {string} + */ + detectUserTimezone: function () { + var timezoneOffset = new Date().getTimezoneOffset(); + var timezoneNames = this.getAllTimezoneNames(); + for (var i = 0; i < timezoneNames.length; i++) { + var zone = moment.tz.zone(timezoneNames[i]); + if (zone.offsets.contains(timezoneOffset)) { + return timezoneNames[i]; + } + } + return ''; } + };