blob: bfa8832a990f6d2463ba1ee44b1ae9b1d3aa3fcb [file] [log] [blame]
/**
* @license
* Copyright (C) 2018 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-repo-plugin-config',
/**
* Fired when the plugin config changes.
*
* @event plugin-config-changed
*/
properties: {
/** @type {?} */
pluginData: Object,
/** @type {Array} */
_pluginConfigOptions: {
type: Array,
computed: '_computePluginConfigOptions(pluginData.*)',
},
},
behaviors: [
Gerrit.RepoPluginConfig,
],
_computePluginConfigOptions(dataRecord) {
if (!dataRecord || !dataRecord.base || !dataRecord.base.config) {
return [];
}
const {config} = dataRecord.base;
return Object.keys(config).map(_key => ({_key, info: config[_key]}));
},
_isArray(type) {
return type === this.ENTRY_TYPES.ARRAY;
},
_isBoolean(type) {
return type === this.ENTRY_TYPES.BOOLEAN;
},
_isList(type) {
return type === this.ENTRY_TYPES.LIST;
},
_isString(type) {
// Treat numbers like strings for simplicity.
return type === this.ENTRY_TYPES.STRING ||
type === this.ENTRY_TYPES.INT ||
type === this.ENTRY_TYPES.LONG;
},
_computeDisabled(editable) {
return editable === 'false';
},
/**
* @param {string} value - fallback to 'false' if undefined
*/
_computeChecked(value = 'false') {
return JSON.parse(value);
},
_handleStringChange(e) {
const el = Polymer.dom(e).localTarget;
const _key = el.getAttribute('data-option-key');
const configChangeInfo =
this._buildConfigChangeInfo(el.value, _key);
this._handleChange(configChangeInfo);
},
_handleListChange(e) {
const el = Polymer.dom(e).localTarget;
const _key = el.getAttribute('data-option-key');
const configChangeInfo =
this._buildConfigChangeInfo(el.value, _key);
this._handleChange(configChangeInfo);
},
_handleBooleanChange(e) {
const el = Polymer.dom(e).localTarget;
const _key = el.getAttribute('data-option-key');
const configChangeInfo =
this._buildConfigChangeInfo(JSON.stringify(el.checked), _key);
this._handleChange(configChangeInfo);
},
_buildConfigChangeInfo(value, _key) {
const info = this.pluginData.config[_key];
info.value = value;
return {
_key,
info,
notifyPath: `${_key}.value`,
};
},
_handleArrayChange({detail}) {
this._handleChange(detail);
},
_handleChange({_key, info, notifyPath}) {
const {name, config} = this.pluginData;
/** @type {Object} */
const detail = {
name,
config: Object.assign(config, {[_key]: info}, {}),
notifyPath: `${name}.${notifyPath}`,
};
this.dispatchEvent(new CustomEvent(
this.PLUGIN_CONFIG_CHANGED, {detail, bubbles: true, composed: true}));
},
});
})();