UNPKG

idea-toolbox

Version:
173 lines (172 loc) 7.04 kB
"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;