UNPKG

comindware.core.ui

Version:

Comindware Core UI provides the basic components like editors, lists, dropdowns, popups that we so desperately need while creating Marionette-based single-page applications.

170 lines (146 loc) 7.07 kB
export default { translitePrimer: new Map([ ['А', 'A'], ['а', 'a'], ['Б', 'B'], ['б', 'b'], ['В', 'V'], ['в', 'v'], ['Г', 'G'], ['г', 'g'], ['Д', 'D'], ['д', 'd'], ['Е', 'E'], ['е', 'e'], ['Ё', 'Yo'], ['ё', 'yo'], ['Ж', 'Zh'], ['ж', 'zh'], ['З', 'Z'], ['з', 'z'], ['И', 'I'], ['и', 'i'], ['Й', 'Y'], ['й', 'y'], ['К', 'K'], ['к', 'k'], ['Л', 'L'], ['л', 'l'], ['М', 'M'], ['м', 'm'], ['Н', 'N'], ['н', 'n'], ['О', 'O'], ['о', 'o'], ['П', 'P'], ['п', 'p'], ['Р', 'R'], ['р', 'r'], ['С', 'S'], ['с', 's'], ['Т', 'T'], ['т', 't'], ['У', 'U'], ['у', 'u'], ['Ф', 'F'], ['ф', 'f'], ['Х', 'Kh'], ['х', 'kh'], ['Ц', 'Ts'], ['ц', 'ts'], ['Ч', 'Ch'], ['ч', 'ch'], ['Ш', 'Sh'], ['ш', 'sh'], ['Щ', 'Sch'], ['щ', 'sch'], ['Ъ', '"'], ['ъ', '"'], ['Ы', 'Y'], ['ы', 'y'], ['Ь', "'"], ['ь', "'"], ['Э', 'E'], ['э', 'e'], ['Ю', 'Yu'], ['ю', 'yu'], ['Я', 'Ya'], ['я', 'ya'], [' ', '_'], ['Ä', 'A'], ['ä', 'a'], ['É', 'E'], ['é', 'e'], ['Ö', 'O'], ['ö', 'o'], ['Ü', 'U'], ['ü', 'u'], ['ß', 's'] ]), initializeTransliteration(options) { if (options.schema) { if (this.isShemaNew(options.schema)) { options.schema = this.setOptionsToFieldsOfNewSchema(options.schema, options.transliteratedFields, options.inputSettings); } else { this.setOptionsToComputedTransliteratedFields(options.schema, options.transliteratedFields, options.inputSettings); } } if (options.model) { this.extendComputed(options.model, options.transliteratedFields, options.schema || options.schemaForExtendComputed); options.model.computedFields = new Backbone.ComputedFields(options.model); } return { schema: options.schema, model: options.model, transliteratedFields: options.transliteratedFields }; }, setOptionsToComputedTransliteratedFields(schema, transliteratedFields = {name: 'alias'}, inputSettings = { changeMode: 'blur', autocommit: true, forceCommit: true, transliteratorChangedSomeProperties: true }) { let computedRelatedFields = Object.values(transliteratedFields); computedRelatedFields = computedRelatedFields.concat(Object.keys(transliteratedFields).filter(name => !(schema[name] && schema[name].allowEmptyValue))); computedRelatedFields.forEach((input) => { if (!schema[input]) { console.warn(`Transliterator: schema has no input '${input}'`); return; } Object.keys(inputSettings).forEach((propetry) => { if (schema[input][propetry] !== undefined && !schema[input].transliteratorChangedSomeProperties) { console.warn(`Transliterator: Property '${propetry}' of input '${input}' was overwritten`); } }); Object.assign(schema[input], inputSettings); }); return schema; }, setOptionsToFieldsOfNewSchema(newSchema, transliteratedFields, inputSettings) { this.setOptionsToComputedTransliteratedFields(this.mapNewSchemaToOld(newSchema), transliteratedFields, inputSettings); return newSchema; }, isShemaNew(schema) { return Array.isArray(schema); }, mapNewSchemaToOld(newSchema, initObject = {}) { return newSchema.reduce((oldShema, input) => { oldShema[input.key] = input; return oldShema; }, initObject); }, mapOldSchemaToNew(oldShema, initArray = []) { initArray.length = 0; return Object.entries(oldShema).reduce((newSchema, keyValue) => { const key = keyValue[0]; const input = keyValue[1]; input.key = input.key || key; newSchema.push(input); return newSchema; }, initArray); }, systemNameFiltration(string) { if (!string) { return ''; } const str = this.translite(string); let firstIsDigit = true; const nonLatinReg = /[^a-zA-Z_]/g; const nonLatinDigitReg = /[^a-zA-Z0-9_]/g; return Array.from(str).map(char => { firstIsDigit && (firstIsDigit = nonLatinReg.test(char)); return char.replace(firstIsDigit ? nonLatinReg : nonLatinDigitReg, ''); }).join(''); }, getTranslitToSystemName() { if (!this.__translitToSystemName) { this.__translitToSystemName = Object.create(null); this.translitePrimer.forEach((value, key) => { const err = Core.form.repository.validators.systemName()(value); this.__translitToSystemName[key] = err ? '' : value; }); } return this.__translitToSystemName; }, extendComputed(model, transliteratedFields = {name: 'alias'}, schema = {}) { const computed = model.computed = model.computed || {}; const required = function(name) { return function(fields) { if (fields[name]) { return fields[name]; } return this.previous(name); }; }; const getTranslite = (name, alias) => (fields) => { if (fields[alias]) { return schema[alias] && schema[alias].returnRawValue ? fields[alias] : this.systemNameFiltration(fields[alias]); } return this.systemNameFiltration(fields[name]); }; Object.entries(transliteratedFields).forEach((keyValue) => { const name = keyValue[0]; const alias = keyValue[1]; if (computed[name] && !computed[name].transliteratedFieldsClass) { console.warn(`Transliterator: computed is not fully extended, computed[${name}] is exist in model!`); return; } if (computed[alias] && !computed[alias].transliteratedFieldsClass) { console.warn(`Transliterator: computed is not fully extended, computed[${alias}] is exist in model!`); return; } if (!(schema[name] && schema[name].allowEmptyValue)) { computed[name] = { depends: [name], get: required(name), transliteratedFieldsClass: 'name' //flag for separate from original computed }; } computed[alias] = { depends: [name, alias], get: getTranslite(name, alias), transliteratedFieldsClass: 'alias' }; }); return model; }, translite(text) { return String(text).replace(/[а-яё]/gi, ruChar => this.getTranslitToSystemName()[ruChar] || ''); } };