idea-toolbox
Version:
IDEA's utility functions
173 lines (172 loc) • 7.04 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CustomFieldMeta = void 0;
const resource_model_1 = require("./resource.model");
const customFieldTypes_enum_1 = require("./customFieldTypes.enum");
const label_model_1 = require("./label.model");
const suggestion_model_1 = require("./suggestion.model");
/**
* Metadata of a custom field.
*/
class CustomFieldMeta extends resource_model_1.Resource {
load(x, languages) {
super.load(x, languages);
if (x.teamId)
this.teamId = this.clean(x.teamId, String);
if (x.fieldId)
this.fieldId = this.clean(x.fieldId, String);
this.name = new label_model_1.Label(x.name, languages);
this.description = new label_model_1.Label(x.description, languages);
this.type = this.clean(x.type, String, customFieldTypes_enum_1.CustomFieldTypes.STRING);
switch (this.type) {
case customFieldTypes_enum_1.CustomFieldTypes.STRING:
case customFieldTypes_enum_1.CustomFieldTypes.TEXT:
this.default = this.clean(x.default, String);
break;
case customFieldTypes_enum_1.CustomFieldTypes.ENUM:
this.default = this.clean(x.default, String);
this.enum = this.cleanArray(x.enum, String);
this.enumLabels = {};
if (x.enumLabels)
this.enum.forEach(e => (this.enumLabels[e] = new label_model_1.Label(x.enumLabels[e], languages)));
break;
case customFieldTypes_enum_1.CustomFieldTypes.NUMBER:
this.default = this.clean(x.default, Number);
this.min = this.clean(x.min, Number);
this.max = this.clean(x.max, Number);
break;
case customFieldTypes_enum_1.CustomFieldTypes.BOOLEAN:
this.default = this.clean(x.default, Boolean, false);
break;
}
this.obligatory = this.clean(x.obligatory, Boolean);
this.icon = this.clean(x.icon, String);
}
safeLoad(newData, safeData, languages) {
super.safeLoad(newData, safeData, languages);
if (safeData.teamId)
this.teamId = safeData.teamId;
if (safeData.fieldId)
this.fieldId = safeData.fieldId;
}
validate(languages) {
const e = super.validate();
if (this.name.validate(languages).length)
e.push('name');
if (this.type === customFieldTypes_enum_1.CustomFieldTypes.ENUM && !(this.enum && this.enum.length))
e.push('enum');
return e;
}
/**
* Set a default value for the field, based on its type.
* @return the determinated default value, based on the type
*/
fieldDefaultValue() {
let field = this.default || null;
// if a default value is not set, force based on type
if (!field)
switch (this.type) {
case customFieldTypes_enum_1.CustomFieldTypes.STRING:
case customFieldTypes_enum_1.CustomFieldTypes.TEXT:
case customFieldTypes_enum_1.CustomFieldTypes.ENUM:
field = null;
break;
case customFieldTypes_enum_1.CustomFieldTypes.NUMBER:
field = 0;
break;
case customFieldTypes_enum_1.CustomFieldTypes.BOOLEAN:
field = false;
break;
}
return field;
}
/**
* Load a value based on the field configuration.
* @param newField the value to load
*/
loadField(newField) {
let field;
switch (this.type) {
case customFieldTypes_enum_1.CustomFieldTypes.STRING:
case customFieldTypes_enum_1.CustomFieldTypes.TEXT:
case customFieldTypes_enum_1.CustomFieldTypes.ENUM:
field = this.clean(newField, String);
break;
case customFieldTypes_enum_1.CustomFieldTypes.NUMBER:
field = this.clean(newField, Number, 0);
break;
case customFieldTypes_enum_1.CustomFieldTypes.BOOLEAN:
field = this.clean(newField, Boolean);
break;
default:
field = null;
}
return field;
}
/**
* Validate a field value, based on the field configuration.
* @param field the value to check
* @return return false in case of error
*/
validateField(field) {
// obligatory fields check
if (this.obligatory)
switch (this.type) {
case customFieldTypes_enum_1.CustomFieldTypes.STRING:
case customFieldTypes_enum_1.CustomFieldTypes.TEXT:
case customFieldTypes_enum_1.CustomFieldTypes.ENUM:
if (!field || !String(field).length)
return false;
break;
case customFieldTypes_enum_1.CustomFieldTypes.NUMBER:
if ((!field && field !== 0) || isNaN(field))
return false;
break;
case customFieldTypes_enum_1.CustomFieldTypes.BOOLEAN:
if (!field)
return false;
break;
}
// interval check
if (this.type === customFieldTypes_enum_1.CustomFieldTypes.NUMBER) {
if (this.min !== null && this.min !== undefined)
if (field < this.min)
return false;
if (this.max !== null && this.max !== undefined)
if (field > this.max)
return false;
}
// enum check
if (this.type === customFieldTypes_enum_1.CustomFieldTypes.ENUM) {
if (field && !this.enum.some(x => x === field))
return false;
}
// return the value cleaned and forced
return true;
}
/**
* Get the label to show for the enum, based on the translations available; if none, returns the key.
*/
getEnumElement(enumKey, language, languages) {
if (this.type !== customFieldTypes_enum_1.CustomFieldTypes.ENUM)
return null;
if (!this.enumLabels ||
!this.enumLabels[enumKey] ||
!(this.enumLabels[enumKey] instanceof label_model_1.Label) ||
!language ||
!languages)
return enumKey;
else
return this.enumLabels[enumKey].translate(language, languages) || enumKey;
}
/**
* Get the enum in the form of array of Suggestions.
*/
getEnumAsSuggestion(language, languages) {
if (this.type !== customFieldTypes_enum_1.CustomFieldTypes.ENUM)
return [];
else
return this.enum.map(e => new suggestion_model_1.Suggestion({ value: e, name: this.getEnumElement(e, language, languages) }));
}
}
exports.CustomFieldMeta = CustomFieldMeta;