aefd5ef63b
Change-Id: Ia20cb6a08043ad3f962f7f79d6b1bcc31401612c
246 lines
6.3 KiB
JavaScript
246 lines
6.3 KiB
JavaScript
/**
|
|
* @license
|
|
* Copyright (C) 2017 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';
|
|
|
|
/**
|
|
* Fired when the rule has been modified or removed.
|
|
*
|
|
* @event access-modified
|
|
*/
|
|
|
|
/**
|
|
* Fired when a rule that was previously added was removed.
|
|
* @event added-rule-removed
|
|
*/
|
|
|
|
const PRIORITY_OPTIONS = [
|
|
'BATCH',
|
|
'INTERACTIVE',
|
|
];
|
|
|
|
const Action = {
|
|
ALLOW: 'ALLOW',
|
|
DENY: 'DENY',
|
|
BLOCK: 'BLOCK',
|
|
};
|
|
|
|
const DROPDOWN_OPTIONS = [Action.ALLOW, Action.DENY, Action.BLOCK];
|
|
|
|
const ForcePushOptions = {
|
|
ALLOW: [
|
|
{name: 'Allow pushing (but not force pushing)', value: false},
|
|
{name: 'Allow pushing with or without force', value: true},
|
|
],
|
|
BLOCK: [
|
|
{name: 'Block pushing with or without force', value: false},
|
|
{name: 'Block force pushing', value: true},
|
|
],
|
|
};
|
|
|
|
const FORCE_EDIT_OPTIONS = [
|
|
{
|
|
name: 'No Force Edit',
|
|
value: false,
|
|
},
|
|
{
|
|
name: 'Force Edit',
|
|
value: true,
|
|
},
|
|
];
|
|
|
|
Polymer({
|
|
is: 'gr-rule-editor',
|
|
|
|
properties: {
|
|
/** @type {?} */
|
|
label: Object,
|
|
editing: {
|
|
type: Boolean,
|
|
value: false,
|
|
observer: '_handleEditingChanged',
|
|
},
|
|
groupId: String,
|
|
groupName: String,
|
|
permission: String,
|
|
/** @type {?} */
|
|
rule: {
|
|
type: Object,
|
|
notify: true,
|
|
},
|
|
section: String,
|
|
|
|
_deleted: {
|
|
type: Boolean,
|
|
value: false,
|
|
},
|
|
_originalRuleValues: Object,
|
|
},
|
|
|
|
behaviors: [
|
|
Gerrit.AccessBehavior,
|
|
Gerrit.BaseUrlBehavior,
|
|
Gerrit.URLEncodingBehavior,
|
|
],
|
|
|
|
observers: [
|
|
'_handleValueChange(rule.value.*)',
|
|
],
|
|
|
|
listeners: {
|
|
'access-saved': '_handleAccessSaved',
|
|
},
|
|
|
|
ready() {
|
|
// Called on ready rather than the observer because when new rules are
|
|
// added, the observer is triggered prior to being ready.
|
|
if (!this.rule) { return; } // Check needed for test purposes.
|
|
this._setupValues(this.rule);
|
|
},
|
|
|
|
_setupValues(rule) {
|
|
if (!rule.value) {
|
|
this._setDefaultRuleValues();
|
|
}
|
|
this._setOriginalRuleValues(rule.value);
|
|
},
|
|
|
|
_computeForce(permission, action) {
|
|
if (this.permissionValues.push.id === permission &&
|
|
action !== Action.DENY) {
|
|
return true;
|
|
}
|
|
|
|
return this.permissionValues.editTopicName.id === permission;
|
|
},
|
|
|
|
_computeForceClass(permission, action) {
|
|
return this._computeForce(permission, action) ? 'force' : '';
|
|
},
|
|
|
|
_computeGroupPath(group) {
|
|
return `${this.getBaseUrl()}/admin/groups/${this.encodeURL(group, true)}`;
|
|
},
|
|
|
|
_handleAccessSaved() {
|
|
// Set a new 'original' value to keep track of after the value has been
|
|
// saved.
|
|
this._setOriginalRuleValues(this.rule.value);
|
|
},
|
|
|
|
_handleEditingChanged(editing, editingOld) {
|
|
// Ignore when editing gets set initially.
|
|
if (!editingOld) { return; }
|
|
// Restore original values if no longer editing.
|
|
if (!editing) {
|
|
this._handleUndoChange();
|
|
}
|
|
},
|
|
|
|
_computeSectionClass(editing, deleted) {
|
|
const classList = [];
|
|
if (editing) {
|
|
classList.push('editing');
|
|
}
|
|
if (deleted) {
|
|
classList.push('deleted');
|
|
}
|
|
return classList.join(' ');
|
|
},
|
|
|
|
_computeForceOptions(permission, action) {
|
|
if (permission === this.permissionValues.push.id) {
|
|
if (action === Action.ALLOW) {
|
|
return ForcePushOptions.ALLOW;
|
|
} else if (action === Action.BLOCK) {
|
|
return ForcePushOptions.BLOCK;
|
|
} else {
|
|
return [];
|
|
}
|
|
} else if (permission === this.permissionValues.editTopicName.id) {
|
|
return FORCE_EDIT_OPTIONS;
|
|
}
|
|
return [];
|
|
},
|
|
|
|
_getDefaultRuleValues(permission, label) {
|
|
const ruleAction = Action.ALLOW;
|
|
const value = {};
|
|
if (permission === 'priority') {
|
|
value.action = PRIORITY_OPTIONS[0];
|
|
return value;
|
|
} else if (label) {
|
|
value.min = label.values[0].value;
|
|
value.max = label.values[label.values.length - 1].value;
|
|
} else if (this._computeForce(permission, ruleAction)) {
|
|
value.force =
|
|
this._computeForceOptions(permission, ruleAction)[0].value;
|
|
}
|
|
value.action = DROPDOWN_OPTIONS[0];
|
|
return value;
|
|
},
|
|
|
|
_setDefaultRuleValues() {
|
|
this.set('rule.value', this._getDefaultRuleValues(this.permission,
|
|
this.label));
|
|
},
|
|
|
|
_computeOptions(permission) {
|
|
if (permission === 'priority') {
|
|
return PRIORITY_OPTIONS;
|
|
}
|
|
return DROPDOWN_OPTIONS;
|
|
},
|
|
|
|
_handleRemoveRule() {
|
|
if (this.rule.value.added) {
|
|
this.dispatchEvent(new CustomEvent('added-rule-removed',
|
|
{bubbles: true}));
|
|
}
|
|
this._deleted = true;
|
|
this.rule.value.deleted = true;
|
|
this.dispatchEvent(new CustomEvent('access-modified', {bubbles: true}));
|
|
},
|
|
|
|
_handleUndoRemove() {
|
|
this._deleted = false;
|
|
delete this.rule.value.deleted;
|
|
},
|
|
|
|
_handleUndoChange() {
|
|
// gr-permission will take care of removing rules that were added but
|
|
// unsaved. We need to keep the added bit for the filter.
|
|
if (this.rule.value.added) { return; }
|
|
this.set('rule.value', Object.assign({}, this._originalRuleValues));
|
|
this._deleted = false;
|
|
delete this.rule.value.deleted;
|
|
delete this.rule.value.modified;
|
|
},
|
|
|
|
_handleValueChange() {
|
|
if (!this._originalRuleValues) { return; }
|
|
this.rule.value.modified = true;
|
|
// Allows overall access page to know a change has been made.
|
|
this.dispatchEvent(new CustomEvent('access-modified', {bubbles: true}));
|
|
},
|
|
|
|
_setOriginalRuleValues(value) {
|
|
this._originalRuleValues = Object.assign({}, value);
|
|
},
|
|
});
|
|
})();
|