// 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 */ 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, 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) { 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)}`; }, _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) { 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.rule.value.deleted = true; this.dispatchEvent(new CustomEvent('access-modified', {bubbles: true})); }, _handleUndoRemove() { this._deleted = false; delete this.rule.value.deleted; }, _handleUndoChange() { 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); }, }); })();