Adds user settings/preferences page
Adds a home for viewing and editing user preferences at a new client route: /settings/. This is first in a series of changes to bring preferences editing to PolyGerrit. At this point the settings page is read-only and mostly un-styled. Introduces the gr-settings-view element which is added to gr-app in the same manner as the other main PolyGerrit views. Introduces the /settings route which will display the new view, or redirect to login if the user is not authenticated. Adds a link to user settings in the gr-account-dropdown. Bug: Issue 3911 Change-Id: Ib164502d586518876737c6d333c8940f2898dad4
This commit is contained in:
@@ -82,6 +82,7 @@ limitations under the License.
|
|||||||
<div>[[account.email]]</div>
|
<div>[[account.email]]</div>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
<li><a href$="[[_computeRelativeURL('/settings')]]">Settings</a></li>
|
||||||
<li><a href$="[[_computeRelativeURL('/switch-account')]]">Switch account</a></li>
|
<li><a href$="[[_computeRelativeURL('/switch-account')]]">Switch account</a></li>
|
||||||
<li><a href$="[[_computeRelativeURL('/logout')]]">Sign out</a></li>
|
<li><a href$="[[_computeRelativeURL('/logout')]]">Sign out</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -132,6 +132,16 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
page(/^\/settings\/?/, function(data) {
|
||||||
|
restAPI.getLoggedIn().then(function(loggedIn) {
|
||||||
|
if (loggedIn) {
|
||||||
|
app.params = {view: 'gr-settings-view'};
|
||||||
|
} else {
|
||||||
|
page.show('/login/' + encodeURIComponent(data.canonicalPath));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
page.start();
|
page.start();
|
||||||
});
|
});
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ limitations under the License.
|
|||||||
<link rel="import" href="./change-list/gr-dashboard-view/gr-dashboard-view.html">
|
<link rel="import" href="./change-list/gr-dashboard-view/gr-dashboard-view.html">
|
||||||
<link rel="import" href="./change/gr-change-view/gr-change-view.html">
|
<link rel="import" href="./change/gr-change-view/gr-change-view.html">
|
||||||
<link rel="import" href="./diff/gr-diff-view/gr-diff-view.html">
|
<link rel="import" href="./diff/gr-diff-view/gr-diff-view.html">
|
||||||
|
<link rel="import" href="./settings/gr-settings-view/gr-settings-view.html">
|
||||||
|
|
||||||
<link rel="import" href="./shared/gr-overlay/gr-overlay.html">
|
<link rel="import" href="./shared/gr-overlay/gr-overlay.html">
|
||||||
<link rel="import" href="./shared/gr-rest-api-interface/gr-rest-api-interface.html">
|
<link rel="import" href="./shared/gr-rest-api-interface/gr-rest-api-interface.html">
|
||||||
@@ -109,6 +110,9 @@ limitations under the License.
|
|||||||
params="[[params]]"
|
params="[[params]]"
|
||||||
change-view-state="{{_viewState.changeView}}"></gr-diff-view>
|
change-view-state="{{_viewState.changeView}}"></gr-diff-view>
|
||||||
</template>
|
</template>
|
||||||
|
<template is="dom-if" if="[[_showSettingsView]]" restamp="true">
|
||||||
|
<gr-settings-view></gr-settings-view>
|
||||||
|
</template>
|
||||||
<div id="errorView" class="errorView" hidden>
|
<div id="errorView" class="errorView" hidden>
|
||||||
<div class="errorEmoji">[[_lastError.emoji]]</div>
|
<div class="errorEmoji">[[_lastError.emoji]]</div>
|
||||||
<div class="errorText">[[_lastError.text]]</div>
|
<div class="errorText">[[_lastError.text]]</div>
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
_showDashboardView: Boolean,
|
_showDashboardView: Boolean,
|
||||||
_showChangeView: Boolean,
|
_showChangeView: Boolean,
|
||||||
_showDiffView: Boolean,
|
_showDiffView: Boolean,
|
||||||
|
_showSettingsView: Boolean,
|
||||||
_viewState: Object,
|
_viewState: Object,
|
||||||
_lastError: Object,
|
_lastError: Object,
|
||||||
},
|
},
|
||||||
@@ -102,6 +103,7 @@
|
|||||||
this.set('_showDashboardView', view === 'gr-dashboard-view');
|
this.set('_showDashboardView', view === 'gr-dashboard-view');
|
||||||
this.set('_showChangeView', view === 'gr-change-view');
|
this.set('_showChangeView', view === 'gr-change-view');
|
||||||
this.set('_showDiffView', view === 'gr-diff-view');
|
this.set('_showDiffView', view === 'gr-diff-view');
|
||||||
|
this.set('_showSettingsView', view === 'gr-settings-view');
|
||||||
},
|
},
|
||||||
|
|
||||||
_loadPlugins: function(plugins) {
|
_loadPlugins: function(plugins) {
|
||||||
@@ -130,6 +132,7 @@
|
|||||||
'_showDashboardView',
|
'_showDashboardView',
|
||||||
'_showChangeView',
|
'_showChangeView',
|
||||||
'_showDiffView',
|
'_showDiffView',
|
||||||
|
'_showSettingsView',
|
||||||
].forEach(function(showProp) {
|
].forEach(function(showProp) {
|
||||||
this.set(showProp, false);
|
this.set(showProp, false);
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
|
|||||||
@@ -0,0 +1,96 @@
|
|||||||
|
<!--
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<link rel="import" href="../../../bower_components/polymer/polymer.html">
|
||||||
|
<link rel="import" href="../../shared/gr-date-formatter/gr-date-formatter.html">
|
||||||
|
<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
|
||||||
|
|
||||||
|
<dom-module id="gr-settings-view">
|
||||||
|
<template>
|
||||||
|
<style>
|
||||||
|
:host {
|
||||||
|
background-color: var(--view-background-color);
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
fieldset {
|
||||||
|
border: none;
|
||||||
|
display: table;
|
||||||
|
}
|
||||||
|
section {
|
||||||
|
display: table-row;
|
||||||
|
}
|
||||||
|
section:not(:first-of-type) {
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
section:not(:first-of-type) .title,
|
||||||
|
section:not(:first-of-type) .value {
|
||||||
|
padding-top: .5em;
|
||||||
|
}
|
||||||
|
.title,
|
||||||
|
.value {
|
||||||
|
display: table-cell;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
.title {
|
||||||
|
color: #666;
|
||||||
|
font-weight: bold;
|
||||||
|
padding-right: .5em;
|
||||||
|
}
|
||||||
|
.loading {
|
||||||
|
color: #666;
|
||||||
|
padding: 1em var(--default-horizontal-margin);
|
||||||
|
}
|
||||||
|
@media only screen and (max-width: 50em) {
|
||||||
|
.loading {
|
||||||
|
padding: 0 var(--default-horizontal-margin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div class="loading" hidden$="[[!_loading]]">Loading...</div>
|
||||||
|
<div hidden$="[[_loading]]" hidden>
|
||||||
|
<h1>User Settings</h1>
|
||||||
|
<h2>Profile</h2>
|
||||||
|
<fieldset>
|
||||||
|
<section>
|
||||||
|
<span class="title">ID</span>
|
||||||
|
<span class="value">[[account._account_id]]</span>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<span class="title">Name</span>
|
||||||
|
<span class="value">[[account.name]]</span>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<span class="title">Email</span>
|
||||||
|
<span class="value">[[account.email]]</span>
|
||||||
|
</section>
|
||||||
|
<section hidden$="[[!account.username]]">
|
||||||
|
<span class="title">Username</span>
|
||||||
|
<span class="value">[[account.username]]</span>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<span class="title">Registered</span>
|
||||||
|
<span class="value">
|
||||||
|
<gr-date-formatter
|
||||||
|
date-str="[[account.registered_on]]"></gr-date-formatter>
|
||||||
|
</span>
|
||||||
|
</section>
|
||||||
|
</fieldset>
|
||||||
|
</div>
|
||||||
|
<gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
|
||||||
|
</template>
|
||||||
|
<script src="../../../scripts/util.js"></script>
|
||||||
|
<script src="gr-settings-view.js"></script>
|
||||||
|
</dom-module>
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
// 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';
|
||||||
|
|
||||||
|
Polymer({
|
||||||
|
is: 'gr-settings-view',
|
||||||
|
|
||||||
|
properties: {
|
||||||
|
account: {
|
||||||
|
type: Object,
|
||||||
|
value: function() { return {}; },
|
||||||
|
},
|
||||||
|
prefs: {
|
||||||
|
type: Object,
|
||||||
|
value: function() { return {}; },
|
||||||
|
},
|
||||||
|
_loading: {
|
||||||
|
type: Boolean,
|
||||||
|
value: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
attached: function() {
|
||||||
|
var promises = [];
|
||||||
|
|
||||||
|
promises.push(this.$.restAPI.getAccount().then(function(account) {
|
||||||
|
this.account = account;
|
||||||
|
}.bind(this)));
|
||||||
|
|
||||||
|
promises.push(this.$.restAPI.getPreferences().then(function(prefs) {
|
||||||
|
this.prefs = prefs;
|
||||||
|
}.bind(this)));
|
||||||
|
|
||||||
|
Promise.all(promises).then(function() {
|
||||||
|
this._loading = false;
|
||||||
|
}.bind(this));
|
||||||
|
},
|
||||||
|
|
||||||
|
_computeRegistered: function(registered) {
|
||||||
|
if (!registered) { return ''; }
|
||||||
|
return util.parseDate(registered).toGMTString();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
})();
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<!--
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
|
||||||
|
<title>gr-settings-view</title>
|
||||||
|
|
||||||
|
<script src="../../../bower_components/webcomponentsjs/webcomponents.min.js"></script>
|
||||||
|
<script src="../../../bower_components/web-component-tester/browser.js"></script>
|
||||||
|
|
||||||
|
<link rel="import" href="../../../bower_components/iron-test-helpers/iron-test-helpers.html">
|
||||||
|
<link rel="import" href="gr-settings-view.html">
|
||||||
|
|
||||||
|
<test-fixture id="basic">
|
||||||
|
<template>
|
||||||
|
<gr-settings-view></gr-settings-view>
|
||||||
|
</template>
|
||||||
|
</test-fixture>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
suite('gr-settings-view tests', function() {
|
||||||
|
var element;
|
||||||
|
var account;
|
||||||
|
var preferences;
|
||||||
|
|
||||||
|
setup(function(done) {
|
||||||
|
account = {
|
||||||
|
_account_id: 123,
|
||||||
|
name: 'user name',
|
||||||
|
email: 'user@email',
|
||||||
|
username: 'user username',
|
||||||
|
registered: '2000-01-01 00:00:00.000000000',
|
||||||
|
};
|
||||||
|
preferences = {time_format: 'HHMM_12'};
|
||||||
|
|
||||||
|
stub('gr-rest-api-interface', {
|
||||||
|
getLoggedIn: function() { return Promise.resolve(true); },
|
||||||
|
getAccount: function() { return Promise.resolve(account); },
|
||||||
|
getPreferences: function() { return Promise.resolve(preferences); },
|
||||||
|
});
|
||||||
|
element = fixture('basic');
|
||||||
|
|
||||||
|
// Allow the element to render.
|
||||||
|
element.async(done, 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('render', function() {
|
||||||
|
assert.isFalse(element._loading);
|
||||||
|
|
||||||
|
var sections = element.$$('fieldset').querySelectorAll('section');
|
||||||
|
|
||||||
|
function valueOf(title) {
|
||||||
|
var titleEl;
|
||||||
|
for (var i = 0; i < sections.length; i++) {
|
||||||
|
titleEl = sections[i].querySelector('.title');
|
||||||
|
if (titleEl.textContent === title) {
|
||||||
|
return sections[i].querySelector('.value').textContent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.equal(valueOf('ID'), account._account_id);
|
||||||
|
assert.equal(valueOf('Name'), account.name);
|
||||||
|
assert.equal(valueOf('Email'), account.email);
|
||||||
|
assert.equal(valueOf('Username'), account.username);
|
||||||
|
assert.equal(element._computeRegistered(element.account.registered),
|
||||||
|
'Sat, 01 Jan 2000 00:00:00 GMT');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@@ -52,6 +52,7 @@ limitations under the License.
|
|||||||
'diff/gr-diff/gr-diff_test.html',
|
'diff/gr-diff/gr-diff_test.html',
|
||||||
'diff/gr-patch-range-select/gr-patch-range-select_test.html',
|
'diff/gr-patch-range-select/gr-patch-range-select_test.html',
|
||||||
'diff/gr-selection-action-box/gr-selection-action-box_test.html',
|
'diff/gr-selection-action-box/gr-selection-action-box_test.html',
|
||||||
|
'settings/gr-settings-view/gr-settings-view_test.html',
|
||||||
'shared/gr-account-label/gr-account-label_test.html',
|
'shared/gr-account-label/gr-account-label_test.html',
|
||||||
'shared/gr-account-link/gr-account-link_test.html',
|
'shared/gr-account-link/gr-account-link_test.html',
|
||||||
'shared/gr-alert/gr-alert_test.html',
|
'shared/gr-alert/gr-alert_test.html',
|
||||||
|
|||||||
Reference in New Issue
Block a user