blob: 7f1a24541bb684a7fcac1420279ac7f5b9f3b2df [file] [log] [blame]
// 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';
const PRIORITY_OPTIONS = [
'BATCH',
'INTERACTIVE',
];
const DROPDOWN_OPTIONS = [
'ALLOW',
'DENY',
'BLOCK',
];
const FORCE_PUSH_OPTIONS = [
{
name: 'No Force Push',
value: false,
},
{
name: 'Force Push',
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,
},
groupId: String,
groupName: String,
permission: String,
/** @type {?} */
rule: {
type: Object,
notify: true,
},
section: String,
_modified: {
type: Boolean,
value: false,
},
_originalRuleValues: Object,
_deleted: {
type: Boolean,
value: false,
},
},
behaviors: [
Gerrit.AccessBehavior,
Gerrit.BaseUrlBehavior,
Gerrit.URLEncodingBehavior,
],
observers: [
'_handleValueChange(rule.value.*)',
],
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) {
return this.permissionValues.push.id === permission ||
this.permissionValues.editTopicName.id === permission;
},
_computeForceClass(permission) {
return this._computeForce(permission) ? 'force' : '';
},
_computeGroupPath(group) {
return `${this.getBaseUrl()}/admin/groups/${this.encodeURL(group, true)}`;
},
_computeSectionClass(editing, deleted) {
const classList = [];
if (editing) {
classList.push('editing');
}
if (deleted) {
classList.push('deleted');
}
return classList.join(' ');
},
_computeForceOptions(permission) {
if (permission === this.permissionValues.push.id) {
return FORCE_PUSH_OPTIONS;
} else if (permission === this.permissionValues.editTopicName.id) {
return FORCE_EDIT_OPTIONS;
}
return [];
},
_getDefaultRuleValues(permission, label) {
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)) {
value.force = this._computeForceOptions(permission)[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() {
this._deleted = true;
this.set('rule.value.deleted', true);
},
_handleUndoRemove() {
this._deleted = false;
delete this.rule.value.deleted;
},
_handleUndoChange() {
this.set('rule.value', Object.assign({}, this._originalRuleValues));
this._modified = false;
},
_handleValueChange() {
if (!this._originalRuleValues) { return; }
this._modified = true;
},
_setOriginalRuleValues(value) {
this._originalRuleValues = Object.assign({}, value);
},
_computeModifiedClass(modified) {
return modified ? 'modified' : '';
},
});
})();