blob: 7feb129bc0efe9810dd4b30d9db6f7a2151f7e5d [file] [log] [blame]
/*
* 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.
*/
export const Widget = {
CHECKBOX: 'checkbox',
INPUT: 'input',
TEXTAREA: 'textarea',
OPTION: 'option',
BTN_GROUP: 'btn-group',
};
export const ValueType = {
INT: 'int',
FLOAT: 'float',
BOOLEAN: 'boolean',
STRING: 'string',
JSON: 'JSON',
};
export const TableColumnType = {
STRING: 'string',
BOOLEAN: 'boolean',
NUMBER: 'number',
DATE: 'date',
OBJECT: 'object',
NUMBER_STR: 'numberStr',
};
export const DefaultTableColumnType = TableColumnType.STRING;
export function isInputWidget(spec) {
return spec.widget === Widget.INPUT;
}
export function isOptionWidget(spec) {
return spec.widget === Widget.OPTION;
}
export function isCheckboxWidget(spec) {
return spec.widget === Widget.CHECKBOX;
}
export function isTextareaWidget(spec) {
return spec.widget === Widget.TEXTAREA;
}
export function isBtnGroupWidget(spec) {
return spec.widget === Widget.BTN_GROUP;
}
export function resetTableOptionConfig(config) {
delete config.tableOptionSpecHash;
config.tableOptionSpecHash = {};
delete config.tableOptionValue;
config.tableOptionValue = {};
delete config.tableColumnTypeState.names;
config.tableColumnTypeState.names = {};
config.updated = false;
return config;
}
export function initializeTableConfig(config, tableOptionSpecs) {
if (typeof config.tableOptionValue === 'undefined') {
config.tableOptionValue = {};
}
if (typeof config.tableGridState === 'undefined') {
config.tableGridState = {};
}
if (typeof config.tableColumnTypeState === 'undefined') {
config.tableColumnTypeState = {};
}
// should remove `$$hashKey` using angular.toJson
const newSpecHash = JSON.stringify(JSON.parse(angular.toJson(tableOptionSpecs)));
const previousSpecHash = config.tableOptionSpecHash;
// check whether spec is updated or not
if (typeof previousSpecHash === 'undefined' || (previousSpecHash !== newSpecHash)) {
resetTableOptionConfig(config);
config.tableOptionSpecHash = newSpecHash;
config.initialized = true;
// reset all persisted option values if spec is updated
for (let i = 0; i < tableOptionSpecs.length; i++) {
const option = tableOptionSpecs[i];
config.tableOptionValue[option.name] = option.defaultValue;
}
}
return config;
}
export function parseTableOption(specs, persistedTableOption) {
/** copy original params */
let parsed;
try {
parsed = JSON.parse(JSON.stringify(persistedTableOption));
} catch (e) {
// if not able to parse fall back to default values coming from specs
parsed = {};
for (let spec of specs) {
parsed[spec['name']] = spec['defaultValue'];
}
}
for (let i = 0; i < specs.length; i++) {
const s = specs[i];
const name = s.name;
if (s.valueType === ValueType.INT &&
typeof parsed[name] !== 'number') {
try {
parsed[name] = parseInt(parsed[name]);
} catch (error) {
parsed[name] = s.defaultValue;
}
} else if (s.valueType === ValueType.FLOAT &&
typeof parsed[name] !== 'number') {
try {
parsed[name] = parseFloat(parsed[name]);
} catch (error) {
parsed[name] = s.defaultValue;
}
} else if (s.valueType === ValueType.BOOLEAN) {
if (parsed[name] === 'false') {
parsed[name] = false;
} else if (parsed[name] === 'true') {
parsed[name] = true;
} else if (typeof parsed[name] !== 'boolean') {
parsed[name] = s.defaultValue;
}
} else if (s.valueType === ValueType.JSON) {
if (parsed[name] !== null && typeof parsed[name] !== 'object') {
try {
parsed[name] = JSON.parse(parsed[name]);
} catch (error) {
parsed[name] = s.defaultValue;
}
} else if (parsed[name] === null) {
parsed[name] = s.defaultValue;
}
}
}
return parsed;
}
export function isColumnNameUpdated(prevColumnNames, newColumnNames) {
if (typeof prevColumnNames === 'undefined') {
return true;
}
let columnNameUpdated = false;
for (let prevColName in prevColumnNames) {
if (!newColumnNames[prevColName]) {
return true;
}
}
if (!columnNameUpdated) {
for (let newColName in newColumnNames) {
if (!prevColumnNames[newColName]) {
return true;
}
}
}
return false;
}
export function updateColumnTypeState(columns, config, columnDefs) {
const columnTypeState = config.tableColumnTypeState;
if (!columnTypeState) {
return;
}
// compare objects because order might be changed
const prevColumnNames = columnTypeState.names || {};
const newColumnNames = columns.reduce((acc, c) => {
const prevColumnType = prevColumnNames[c.name];
// use previous column type if exists
if (prevColumnType) {
acc[c.name] = prevColumnType;
} else {
acc[c.name] = DefaultTableColumnType;
}
return acc;
}, {});
let columnNameUpdated = isColumnNameUpdated(prevColumnNames, newColumnNames);
if (columnNameUpdated) {
columnTypeState.names = newColumnNames;
columnTypeState.updated = true;
}
// update `columnDefs[n].type`
for (let i = 0; i < columnDefs.length; i++) {
const colName = columnDefs[i].name;
columnDefs[i].type = columnTypeState.names[colName];
}
}