Files
gerrit/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view.js
Patrick Hiesel 006578f7da Add frontend code for email format user preference
This change adds all required frontend code for both GWT UI and
Polygerrit as well as docs for the user preferenced introduced by
Change I190644732.

Feature: Issue 5349
Change-Id: I94353380fbd5208cebb7fe8946fb4c4100c8d054
2017-03-06 16:13:59 +01:00

360 lines
9.4 KiB
JavaScript

// Copyright (C) 2016 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
(function() {
'use strict';
var PREFS_SECTION_FIELDS = [
'changes_per_page',
'date_format',
'time_format',
'email_strategy',
'diff_view',
'expand_inline_diffs',
'email_format',
];
Polymer({
is: 'gr-settings-view',
/**
* Fired when the title of the page should change.
*
* @event title-change
*/
/**
* Fired with email confirmation text.
*
* @event show-alert
*/
properties: {
prefs: {
type: Object,
value: function() { return {}; },
},
params: {
type: Object,
value: function() { return {}; },
},
_accountInfoMutable: Boolean,
_accountInfoChanged: Boolean,
_diffPrefs: Object,
_changeTableColumnsNotDisplayed: Array,
_localPrefs: {
type: Object,
value: function() { return {}; },
},
_localChangeTableColumns: {
type: Array,
value: function() { return []; },
},
_localMenu: {
type: Array,
value: function() { return []; },
},
_loading: {
type: Boolean,
value: true,
},
_changeTableChanged: {
type: Boolean,
value: false,
},
_prefsChanged: {
type: Boolean,
value: false,
},
_diffPrefsChanged: {
type: Boolean,
value: false,
},
_menuChanged: {
type: Boolean,
value: false,
},
_watchedProjectsChanged: {
type: Boolean,
value: false,
},
_keysChanged: {
type: Boolean,
value: false,
},
_newEmail: String,
_addingEmail: {
type: Boolean,
value: false,
},
_lastSentVerificationEmail: {
type: String,
value: null,
},
_serverConfig: Object,
_headerHeight: Number,
/**
* For testing purposes.
*/
_loadingPromise: Object,
},
behaviors: [
Gerrit.ChangeTableBehavior,
],
observers: [
'_handlePrefsChanged(_localPrefs.*)',
'_handleDiffPrefsChanged(_diffPrefs.*)',
'_handleMenuChanged(_localMenu.splices)',
'_handleChangeTableChanged(_localChangeTableColumns)',
],
attached: function() {
this.fire('title-change', {title: 'Settings'});
var promises = [
this.$.accountInfo.loadData(),
this.$.watchedProjectsEditor.loadData(),
this.$.groupList.loadData(),
this.$.httpPass.loadData(),
];
promises.push(this.$.restAPI.getPreferences().then(function(prefs) {
this.prefs = prefs;
this._copyPrefs('_localPrefs', 'prefs');
this._cloneMenu();
this._cloneChangeTableColumns();
}.bind(this)));
promises.push(this.$.restAPI.getDiffPreferences().then(function(prefs) {
this._diffPrefs = prefs;
}.bind(this)));
promises.push(this.$.restAPI.getConfig().then(function(config) {
this._serverConfig = config;
if (this._serverConfig.sshd) {
return this.$.sshEditor.loadData();
}
}.bind(this)));
if (this.params.emailToken) {
promises.push(this.$.restAPI.confirmEmail(this.params.emailToken).then(
function(message) {
if (message) {
this.fire('show-alert', {message: message});
}
this.$.emailEditor.loadData();
}.bind(this)));
} else {
promises.push(this.$.emailEditor.loadData());
}
this._loadingPromise = Promise.all(promises).then(function() {
this._loading = false;
}.bind(this));
this.listen(window, 'scroll', '_handleBodyScroll');
},
detached: function() {
this.unlisten(window, 'scroll', '_handleBodyScroll');
},
reloadAccountDetail: function() {
Promise.all([
this.$.accountInfo.loadData(),
this.$.emailEditor.loadData(),
]);
},
_handleBodyScroll: function(e) {
if (this._headerHeight === undefined) {
var top = this.$.settingsNav.offsetTop;
for (var offsetParent = this.$.settingsNav.offsetParent;
offsetParent;
offsetParent = offsetParent.offsetParent) {
top += offsetParent.offsetTop;
}
this._headerHeight = top;
}
this.$.settingsNav.classList.toggle('pinned',
window.scrollY >= this._headerHeight);
},
_isLoading: function() {
return this._loading || this._loading === undefined;
},
_copyPrefs: function(to, from) {
for (var i = 0; i < PREFS_SECTION_FIELDS.length; i++) {
this.set([to, PREFS_SECTION_FIELDS[i]],
this[from][PREFS_SECTION_FIELDS[i]]);
}
},
_cloneMenu: function() {
var menu = [];
this.prefs.my.forEach(function(item) {
menu.push({
name: item.name,
url: item.url,
target: item.target,
});
});
this._localMenu = menu;
},
_cloneChangeTableColumns: function() {
var columns = this.prefs.change_table;
if (columns.length === 0) {
columns = this.columnNames;
this._changeTableColumnsNotDisplayed = [];
} else {
this._changeTableColumnsNotDisplayed = this.getComplementColumns(
this.prefs.change_table);
}
this._localChangeTableColumns = columns;
},
_formatChangeTableColumns: function(changeTableArray) {
return changeTableArray.map(function(item) {
return {column: item};
});
},
_handleChangeTableChanged: function() {
if (this._isLoading()) { return; }
this._changeTableChanged = true;
},
_handlePrefsChanged: function(prefs) {
if (this._isLoading()) { return; }
this._prefsChanged = true;
},
_handleDiffPrefsChanged: function() {
if (this._isLoading()) { return; }
this._diffPrefsChanged = true;
},
_handleExpandInlineDiffsChanged: function() {
this.set('_localPrefs.expand_inline_diffs',
this.$.expandInlineDiffs.checked);
},
_handleMenuChanged: function() {
if (this._isLoading()) { return; }
this._menuChanged = true;
},
_handleSaveAccountInfo: function() {
this.$.accountInfo.save();
},
_handleSavePreferences: function() {
this._copyPrefs('prefs', '_localPrefs');
return this.$.restAPI.savePreferences(this.prefs).then(function() {
this._prefsChanged = false;
}.bind(this));
},
_handleLineWrappingChanged: function() {
this.set('_diffPrefs.line_wrapping', this.$.lineWrapping.checked);
},
_handleShowTabsChanged: function() {
this.set('_diffPrefs.show_tabs', this.$.showTabs.checked);
},
_handleShowTrailingWhitespaceChanged: function() {
this.set('_diffPrefs.show_whitespace_errors',
this.$.showTrailingWhitespace.checked);
},
_handleSyntaxHighlightingChanged: function() {
this.set('_diffPrefs.syntax_highlighting',
this.$.syntaxHighlighting.checked);
},
_handleSaveChangeTable: function() {
this.set('prefs.change_table', this._localChangeTableColumns);
this._cloneChangeTableColumns();
return this.$.restAPI.savePreferences(this.prefs).then(function() {
this._changeTableChanged = false;
}.bind(this));
},
_handleSaveDiffPreferences: function() {
return this.$.restAPI.saveDiffPreferences(this._diffPrefs)
.then(function() {
this._diffPrefsChanged = false;
}.bind(this));
},
_handleSaveMenu: function() {
this.set('prefs.my', this._localMenu);
this._cloneMenu();
return this.$.restAPI.savePreferences(this.prefs).then(function() {
this._menuChanged = false;
}.bind(this));
},
_handleSaveWatchedProjects: function() {
this.$.watchedProjectsEditor.save();
},
_computeHeaderClass: function(changed) {
return changed ? 'edited' : '';
},
_handleSaveEmails: function() {
this.$.emailEditor.save();
},
_handleNewEmailKeydown: function(e) {
if (e.keyCode === 13) { // Enter
e.stopPropagation();
this._handleAddEmailButton();
}
},
_isNewEmailValid: function(newEmail) {
return newEmail.indexOf('@') !== -1;
},
_computeAddEmailButtonEnabled: function(newEmail, addingEmail) {
return this._isNewEmailValid(newEmail) && !addingEmail;
},
_handleAddEmailButton: function() {
if (!this._isNewEmailValid(this._newEmail)) { return; }
this._addingEmail = true;
this.$.restAPI.addAccountEmail(this._newEmail).then(function(response) {
this._addingEmail = false;
// If it was unsuccessful.
if (response.status < 200 || response.status >= 300) { return; }
this._lastSentVerificationEmail = this._newEmail;
this._newEmail = '';
}.bind(this));
},
});
})();