Merge "Use --deemphasized-text-color in context expander"
diff --git a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.html b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.html
index 3779402..61df877 100644
--- a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.html
+++ b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.html
@@ -87,7 +87,7 @@
</style>
<style include="gr-form-styles"></style>
<fieldset id="section"
- class$="gr-form-styles [[_computeSectionClass(editing, _editingRef, _deleted)]]">
+ class$="gr-form-styles [[_computeSectionClass(editing, canUpload, ownerOf, _editingRef, _deleted)]]">
<div id="mainContainer">
<div class="header">
<div class="name">
diff --git a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.js b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.js
index 4574e11..6fb7b0e 100644
--- a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.js
+++ b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.js
@@ -54,6 +54,8 @@
value: false,
observer: '_handleEditingChanged',
},
+ canUpload: Boolean,
+ ownerOf: Array,
_originalId: String,
_editingRef: {
type: Boolean,
@@ -214,9 +216,13 @@
this.$.editRefInput.focus();
},
- _computeSectionClass(editing, editingRef, deleted) {
+ _isEditEnabled(canUpload, ownerOf, sectionId) {
+ return canUpload || ownerOf.indexOf(sectionId) >= 0;
+ },
+
+ _computeSectionClass(editing, canUpload, ownerOf, editingRef, deleted) {
const classList = [];
- if (editing) {
+ if (editing && this._isEditEnabled(canUpload, ownerOf, this.section.id)) {
classList.push('editing');
}
if (editingRef) {
diff --git a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section_test.html b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section_test.html
index ad401b8..21a426f 100644
--- a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section_test.html
@@ -272,26 +272,37 @@
test('_computeSectionClass', () => {
let editingRef = false;
+ let canUpload = false;
+ let ownerOf = [];
let editing = false;
let deleted = false;
- assert.equal(element._computeSectionClass(editing, editingRef, deleted),
- '');
+ assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+ editingRef, deleted), '');
editing = true;
- assert.equal(element._computeSectionClass(editing, editingRef, deleted),
- 'editing');
+ assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+ editingRef, deleted), '');
+
+ ownerOf = ['refs/*'];
+ assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+ editingRef, deleted), 'editing');
+
+ ownerOf = [];
+ canUpload = true;
+ assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+ editingRef, deleted), 'editing');
editingRef = true;
- assert.equal(element._computeSectionClass(editing, editingRef, deleted),
- 'editing editingRef');
+ assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+ editingRef, deleted), 'editing editingRef');
deleted = true;
- assert.equal(element._computeSectionClass(editing, editingRef, deleted),
- 'editing editingRef deleted');
+ assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+ editingRef, deleted), 'editing editingRef deleted');
editingRef = false;
- assert.equal(element._computeSectionClass(editing, editingRef, deleted),
- 'editing deleted');
+ assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+ editingRef, deleted), 'editing deleted');
});
test('_computeEditBtnClass', () => {
@@ -356,6 +367,8 @@
assert.isFalse(element.$.section.classList.contains('deleted'));
assert.isTrue(element.$.editBtn.classList.contains('global'));
element.editing = true;
+ element.canUpload = true;
+ element.ownerOf = [];
assert.equal(getComputedStyle(element.$.editBtn).display, 'none');
});
});
@@ -382,6 +395,9 @@
assert.isFalse(element.$.section.classList.contains('deleted'));
assert.isFalse(element.$.editBtn.classList.contains('global'));
element.editing = true;
+ element.canUpload = true;
+ element.ownerOf = [];
+ flushAsynchronousOperations();
assert.notEqual(getComputedStyle(element.$.editBtn).display, 'none');
});
@@ -440,6 +456,8 @@
});
test('edit section reference', () => {
+ element.canUpload = true;
+ element.ownerOf = [];
element.section = {id: 'refs/for/bar', value: {permissions: {}}};
assert.isFalse(element.$.section.classList.contains('editing'));
element.editing = true;
@@ -486,6 +504,8 @@
test('remove section', () => {
element.editing = true;
+ element.canUpload = true;
+ element.ownerOf = [];
assert.isFalse(element._deleted);
assert.isNotOk(element.section.value.deleted);
MockInteractions.tap(element.$.deleteBtn);
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.html b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.html
index 4df4efd..f718806 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.html
+++ b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.html
@@ -38,7 +38,8 @@
#inheritsFrom,
#editInheritFromInput,
.editing #inheritFromName,
- .weblinks{
+ .weblinks,
+ .editing .invisible{
display: none;
}
#inheritsFrom.show {
@@ -97,9 +98,14 @@
on-tap="_handleEdit">[[_editOrCancel(_editing)]]</gr-button>
<gr-button id="saveBtn"
primary
+ class$="[[_computeSaveBtnClass(_ownerOf)]]"
+ on-tap="_handleSave"
+ disabled$="[[!_modified]]">Save</gr-button>
+ <gr-button id="saveReviewBtn"
+ primary
+ class$="[[_computeSaveReviewBtnClass(_canUpload)]]"
on-tap="_handleSaveForReview"
- disabled$="[[!_modified]]">
- Save for review</gr-button>
+ disabled$="[[!_modified]]">Save for review</gr-button>
<template
is="dom-repeat"
items="{{_sections}}"
@@ -110,7 +116,9 @@
capabilities="[[_capabilities]]"
section="{{section}}"
labels="[[_labels]]"
+ can-upload="[[_canUpload]]"
editing="[[_editing]]"
+ owner-of="[[_ownerOf]]"
groups="[[_groups]]"
on-added-section-removed="_handleAddedSectionRemoved"></gr-access-section>
</template>
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.js b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.js
index b9d6a66..24d0c62 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.js
+++ b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.js
@@ -135,12 +135,18 @@
_repoChanged(repo) {
if (!repo) { return Promise.resolve(); }
+ return this._reload(repo);
+ },
+
+ _reload(repo) {
const promises = [];
const errFn = response => {
this.fire('page-error', {response});
};
+ this._editing = false;
+
// Always reset sections when a project changes.
this._sections = [];
promises.push(this.$.restAPI.getRepoAccessRights(repo, errFn)
@@ -386,7 +392,7 @@
.editReference();
},
- _handleSaveForReview() {
+ _getObjforSave() {
const addRemoveObj = this._computeAddAndRemove();
// If there are no changes, don't actually save.
if (!Object.keys(addRemoveObj.add).length &&
@@ -403,19 +409,33 @@
if (addRemoveObj.parent) {
obj.parent = addRemoveObj.parent;
}
- return this.$.restAPI.setProjectAccessRightsForReview(this.repo, obj)
+ return obj;
+ },
+
+ _handleSave() {
+ const obj = this._getObjforSave();
+ if (!obj) { return; }
+ return this.$.restAPI.setRepoAccessRights(this.repo, obj)
+ .then(() => {
+ this._reload(this.repo);
+ });
+ },
+
+ _handleSaveForReview() {
+ const obj = this._getObjforSave();
+ if (!obj) { return; }
+ return this.$.restAPI.setRepoAccessRightsForReview(this.repo, obj)
.then(change => {
Gerrit.Nav.navigateToChange(change);
});
},
- _computeShowSaveClass(editing) {
- if (!editing) { return ''; }
- return 'visible';
+ _computeSaveReviewBtnClass(canUpload) {
+ return !canUpload ? 'invisible' : '';
},
- _computeEditingClass(editing) {
- return editing ? 'editing': '';
+ _computeSaveBtnClass(ownerOf) {
+ return ownerOf.length < 0 ? 'invisible' : '';
},
_computeMainClass(ownerOf, canUpload, editing) {
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access_test.html b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access_test.html
index 8771550..e5b0a25 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access_test.html
@@ -119,6 +119,8 @@
repoStub = sandbox.stub(element.$.restAPI, 'getRepo').returns(
Promise.resolve(repoRes));
element._loading = false;
+ element._ownerOf = [];
+ element._canUpload = false;
});
teardown(() => {
@@ -258,8 +260,9 @@
});
suite('with defined sections', () => {
- const testEditSaveCancelBtns = () => {
+ const testEditSaveCancelBtns = (shouldShowSave, shouldShowSaveReview) => {
// Edit button is visible and Save button is hidden.
+ assert.equal(getComputedStyle(element.$.saveReviewBtn).display, 'none');
assert.equal(getComputedStyle(element.$.saveBtn).display, 'none');
assert.notEqual(getComputedStyle(element.$.editBtn).display, 'none');
assert.equal(element.$.editBtn.innerText, 'EDIT');
@@ -278,14 +281,26 @@
// Edit button changes to Cancel button, and Save button is visible but
// disabled.
assert.equal(element.$.editBtn.innerText, 'CANCEL');
- assert.notEqual(getComputedStyle(element.$.saveBtn).display, 'none');
- assert.isTrue(element.$.saveBtn.disabled);
+ if (shouldShowSaveReview) {
+ assert.notEqual(getComputedStyle(element.$.saveReviewBtn).display,
+ 'none');
+ assert.isTrue(element.$.saveReviewBtn.disabled);
+ }
+ if (shouldShowSave) {
+ assert.notEqual(getComputedStyle(element.$.saveBtn).display, 'none');
+ assert.isTrue(element.$.saveBtn.disabled);
+ }
assert.notEqual(getComputedStyle(element.$$('#editInheritFromInput'))
.display, 'none');
// Save button should be enabled after access is modified
element.fire('access-modified');
- assert.isFalse(element.$.saveBtn.disabled);
+ if (shouldShowSaveReview) {
+ assert.isFalse(element.$.saveReviewBtn.disabled);
+ }
+ if (shouldShowSave) {
+ assert.isFalse(element.$.saveBtn.disabled);
+ }
};
setup(() => {
@@ -308,19 +323,25 @@
assert.equal(element._sections.length, 0);
});
- test('button visibility for non admin', () => {
- assert.equal(getComputedStyle(element.$.saveBtn).display, 'none');
+ test('button visibility for non ref owner', () => {
+ assert.equal(getComputedStyle(element.$.saveReviewBtn).display, 'none');
assert.equal(getComputedStyle(element.$.editBtn).display, 'none');
});
- test('button visibility for non admin with upload privilege', () => {
+ test('button visibility for non ref owner with upload privilege', () => {
element._canUpload = true;
- testEditSaveCancelBtns();
+ testEditSaveCancelBtns(false, true);
});
- test('button visibility for admin', () => {
+ test('button visibility for ref owner', () => {
element._ownerOf = ['refs/for/*'];
- testEditSaveCancelBtns();
+ testEditSaveCancelBtns(true, false);
+ });
+
+ test('button visibility for ref owner and upload', () => {
+ element._ownerOf = ['refs/for/*'];
+ element._canUpload = true;
+ testEditSaveCancelBtns(true, false);
});
test('_handleAccessModified called with event fired', () => {
@@ -342,7 +363,7 @@
test('_handleSaveForReview', () => {
const saveStub =
- sandbox.stub(element.$.restAPI, 'setProjectAccessRightsForReview');
+ sandbox.stub(element.$.restAPI, 'setRepoAccessRightsForReview');
sandbox.stub(element, '_computeAddAndRemove').returns({
add: {},
remove: {},
@@ -1046,7 +1067,7 @@
Promise.resolve(JSON.parse(JSON.stringify(accessRes))));
sandbox.stub(Gerrit.Nav, 'navigateToChange');
const saveForReviewStub = sandbox.stub(element.$.restAPI,
- 'setProjectAccessRightsForReview')
+ 'setRepoAccessRightsForReview')
.returns(Promise.resolve({_number: 1}));
element.repo = 'test-repo';
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
index da7a16a..487d8c8 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
@@ -368,9 +368,11 @@
</label>
</div>
<div class="editFileControls showOnEdit">
- <gr-edit-file-controls
- class$="[[_computeClass('', file.__path)]]"
- file-path="[[file.__path]]"></gr-edit-file-controls>
+ <template is="dom-if" if="[[editMode]]">
+ <gr-edit-file-controls
+ class$="[[_computeClass('', file.__path)]]"
+ file-path="[[file.__path]]"></gr-edit-file-controls>
+ </template>
</div>
<div class="show-hide">
<label class="show-hide" data-path$="[[file.__path]]"
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.html b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.html
index 3f656ae..df3f04f 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.html
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.html
@@ -1542,12 +1542,17 @@
});
test('editing actions', () => {
+ // Edit controls are guarded behind a dom-if initially and not rendered.
+ assert.isNotOk(Polymer.dom(element.root)
+ .querySelector('gr-edit-file-controls'));
+
element.editMode = true;
+ flushAsynchronousOperations();
+
+ // Commit message should not have edit controls.
const editControls =
Polymer.dom(element.root).querySelectorAll('.row:not(.header)')
.map(row => row.querySelector('gr-edit-file-controls'));
-
- // Commit message should not have edit controls.
assert.isTrue(editControls[0].classList.contains('invisible'));
});
diff --git a/polygerrit-ui/app/elements/diff/gr-selection-action-box/gr-selection-action-box.html b/polygerrit-ui/app/elements/diff/gr-selection-action-box/gr-selection-action-box.html
index 3209d63..633530f 100644
--- a/polygerrit-ui/app/elements/diff/gr-selection-action-box/gr-selection-action-box.html
+++ b/polygerrit-ui/app/elements/diff/gr-selection-action-box/gr-selection-action-box.html
@@ -29,9 +29,6 @@
position: absolute;
white-space: nowrap;
}
- #tooltip {
- --tooltip-background-color: rgba(22, 22, 22, .9);
- }
</style>
<gr-tooltip
id="tooltip"
diff --git a/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.html b/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.html
index b47d5a4..5817fb7 100644
--- a/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.html
+++ b/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.html
@@ -29,7 +29,7 @@
* HOW THEY ARE USED IN THE CODE.
*/
:host([toast]) {
- background-color: #333;
+ background-color: var(--tooltip-background-color);
bottom: 1.25rem;
border-radius: 3px;
box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
@@ -45,6 +45,7 @@
transform: translateY(0);
}
.text {
+ color: var(--tooltip-text-color);
display: inline-block;
max-height: 10rem;
max-width: 80vw;
@@ -52,7 +53,7 @@
word-break: break-all;
}
.action {
- color: #a1c2fa;
+ color: var(--link-color);
font-family: var(--font-family-bold);
margin-left: 1em;
text-decoration: none;
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.html b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.html
index 42bfc6a..d9fdc59 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.html
@@ -351,6 +351,16 @@
return Gerrit.awaitPluginsLoaded();
});
+ test('plugin install errors shows toasts', () => {
+ const alertStub = sandbox.stub();
+ document.addEventListener('show-alert', alertStub);
+ Gerrit._setPluginsCount(1);
+ Gerrit.install(() => {}, '0.0pre-alpha');
+ return Gerrit.awaitPluginsLoaded().then(() => {
+ assert.isTrue(alertStub.calledOnce);
+ });
+ });
+
test('installGwt calls _pluginInstalled', () => {
sandbox.stub(Gerrit, '_pluginInstalled');
Gerrit.installGwt('http://test.com/plugins/testplugin/static/test.js');
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-public-js-api.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-public-js-api.js
index 60e07e0..ef20206 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-public-js-api.js
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-public-js-api.js
@@ -34,7 +34,7 @@
CHANGE_SCREEN_BELOW_CHANGE_INFO_BLOCK: 'change-metadata-item',
};
- const PLUGIN_LOADING_TIMEOUT_MS = 10000;
+ const PLUGIN_LOADING_TIMEOUT_MS = 60000;
let _restAPI;
const getRestAPI = () => {
@@ -552,11 +552,6 @@
};
Gerrit._pluginLoadingTimeout = function() {
- document.dispatchEvent(new CustomEvent('show-alert', {
- detail: {
- message: 'Plugins loading timeout. Check the console for errors.',
- },
- }));
console.error(`Failed to load plugins: ${Object.keys(_pluginsPending)}`);
Gerrit._setPluginsPending([]);
};
@@ -580,7 +575,12 @@
};
Gerrit._pluginInstallError = function(message) {
- console.log(`Plugin install error: ${message}`);
+ document.dispatchEvent(new CustomEvent('show-alert', {
+ detail: {
+ message: `Plugin install error: ${message}`,
+ },
+ }));
+ console.info(`Plugin install error: ${message}`);
Gerrit._setPluginsCount(_pluginsPendingCount - 1);
};
diff --git a/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav.js b/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav.js
index 909cb9a..9ccff600 100644
--- a/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav.js
+++ b/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav.js
@@ -35,9 +35,7 @@
_handleBodyScroll() {
if (this._headerHeight === undefined) {
let top = this._getOffsetTop(this);
- // Don't want to include the element that wraps around the nav, start
- // with its parent.
- for (let offsetParent = this._getOffsetParent(this.offsetParent);
+ for (let offsetParent = this.offsetParent;
offsetParent;
offsetParent = this._getOffsetParent(offsetParent)) {
top += this._getOffsetTop(offsetParent);
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.js b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.js
index a9fd05c..b5e7e40 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.js
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.js
@@ -1228,7 +1228,7 @@
repoInfo);
},
- setProjectAccessRightsForReview(projectName, projectInfo) {
+ setRepoAccessRightsForReview(projectName, projectInfo) {
return this.send(
'PUT', `/projects/${encodeURIComponent(projectName)}/access:review`,
projectInfo).then(response => this.getResponseObject(response));
diff --git a/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.html b/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.html
index 12a8f1c..9947d61 100644
--- a/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.html
+++ b/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.html
@@ -25,9 +25,9 @@
--gr-tooltip-arrow-size: .5em;
--gr-tooltip-arrow-center-offset: 0;
- background-color: var(--tooltip-background-color, #333);
+ background-color: var(--tooltip-background-color);
box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
- color: #fff;
+ color: var(--tooltip-text-color);
font-size: var(--font-size-small);
position: absolute;
z-index: 1000;
@@ -53,11 +53,11 @@
width: 0;
}
.arrowPositionAbove {
- border-top: var(--gr-tooltip-arrow-size) solid var(--tooltip-background-color, #333);
+ border-top: var(--gr-tooltip-arrow-size) solid var(--tooltip-background-color);
bottom: -var(--gr-tooltip-arrow-size);
}
.arrowPositionBelow {
- border-bottom: var(--gr-tooltip-arrow-size) solid var(--tooltip-background-color, #333);
+ border-bottom: var(--gr-tooltip-arrow-size) solid var(--tooltip-background-color);
top: -var(--gr-tooltip-arrow-size);
}
</style>
diff --git a/polygerrit-ui/app/styles/app-theme.html b/polygerrit-ui/app/styles/app-theme.html
index 64af9dc..70395e2 100644
--- a/polygerrit-ui/app/styles/app-theme.html
+++ b/polygerrit-ui/app/styles/app-theme.html
@@ -87,6 +87,9 @@
--edit-mode-background-color: #ebf5fb;
+ --tooltip-background-color: #333;
+ --tooltip-text-color: #fff;
+
--syntax-default-color: var(--primary-text-color);
--syntax-meta-color: #FF1717;
--syntax-keyword-color: #9E0069;