modules/frontend/app/services/LegacyTable.service.js (164 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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. */ // TODO: Refactor this service for legacy tables with more than one input field. /** * @param {ReturnType<typeof import('./LegacyUtils.service').default>} LegacyUtils * @param {ReturnType<typeof import('./Focus.service').default>} Focus * @param {import('./ErrorPopover.service').default} ErrorPopover */ export default function service(LegacyUtils, Focus, ErrorPopover) { function _model(item, field) { let path = field.path; if (_.isNil(path) || _.isNil(item)) return item; path = path.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties path = path.replace(/^\./, ''); // strip a leading dot const segs = path.split('.'); let root = item; while (segs.length > 0) { const pathStep = segs.shift(); if (typeof root[pathStep] === 'undefined') root[pathStep] = {}; root = root[pathStep]; } return root; } const table = {name: 'none', editIndex: -1}; function _tableReset() { delete table.field; table.name = 'none'; table.editIndex = -1; ErrorPopover.hide(); } function _tableSaveAndReset() { const field = table.field; const save = LegacyUtils.isDefined(field) && LegacyUtils.isDefined(field.save); if (!save || !LegacyUtils.isDefined(field) || field.save(field, table.editIndex, true)) { _tableReset(); return true; } return false; } function _tableState(field, editIndex, specName) { table.field = field; table.name = specName || field.model; table.editIndex = editIndex; } function _tableUI(tbl) { const ui = tbl.ui; return ui ? ui : tbl.type; } function _tableFocus(focusId, index) { Focus.move((index < 0 ? 'new' : 'cur') + focusId + (index >= 0 ? index : '')); } function _tablePairValue(filed, index) { return index < 0 ? {key: filed.newKey, value: filed.newValue} : { key: filed.curKey, value: filed.curValue }; } function _tableStartEdit(item, tbl, index, save) { _tableState(tbl, index); const val = _.get(_model(item, tbl), tbl.model)[index]; const ui = _tableUI(tbl); tbl.save = save; if (ui === 'table-pair') { tbl.curKey = val[tbl.keyName]; tbl.curValue = val[tbl.valueName]; _tableFocus('Key' + tbl.focusId, index); } else if (ui === 'table-db-fields') { tbl.curDatabaseFieldName = val.databaseFieldName; tbl.curDatabaseFieldType = val.databaseFieldType; tbl.curJavaFieldName = val.javaFieldName; tbl.curJavaFieldType = val.javaFieldType; _tableFocus('DatabaseFieldName' + tbl.focusId, index); } else if (ui === 'table-indexes') { tbl.curIndexName = val.name; tbl.curIndexType = val.indexType; tbl.curIndexFields = val.fields; _tableFocus(tbl.focusId, index); } } function _tableNewItem(tbl) { _tableState(tbl, -1); const ui = _tableUI(tbl); if (ui === 'table-pair') { tbl.newKey = null; tbl.newValue = null; _tableFocus('Key' + tbl.focusId, -1); } else if (ui === 'table-db-fields') { tbl.newDatabaseFieldName = null; tbl.newDatabaseFieldType = null; tbl.newJavaFieldName = null; tbl.newJavaFieldType = null; _tableFocus('DatabaseFieldName' + tbl.focusId, -1); } else if (ui === 'table-indexes') { tbl.newIndexName = null; tbl.newIndexType = 'SORTED'; tbl.newIndexFields = null; _tableFocus(tbl.focusId, -1); } } return { tableState: _tableState, tableReset: _tableReset, tableSaveAndReset: _tableSaveAndReset, tableNewItem: _tableNewItem, tableNewItemActive(tbl) { return table.name === tbl.model && table.editIndex < 0; }, tableEditing(tbl, index) { return table.name === tbl.model && table.editIndex === index; }, tableEditedRowIndex() { return table.editIndex; }, tableField() { return table.field; }, tableStartEdit: _tableStartEdit, tableRemove(item, field, index) { _tableReset(); _.get(_model(item, field), field.model).splice(index, 1); }, tablePairValue: _tablePairValue, tablePairSave(pairValid, item, field, index, stopEdit) { const valid = pairValid(item, field, index, stopEdit); if (valid) { const pairValue = _tablePairValue(field, index); let pairModel = {}; const container = _.get(item, field.model); if (index < 0) { pairModel[field.keyName] = pairValue.key; pairModel[field.valueName] = pairValue.value; if (container) container.push(pairModel); else _.set(item, field.model, [pairModel]); if (!stopEdit) _tableNewItem(field); } else { pairModel = container[index]; pairModel[field.keyName] = pairValue.key; pairModel[field.valueName] = pairValue.value; if (!stopEdit) { if (index < container.length - 1) _tableStartEdit(item, field, index + 1); else _tableNewItem(field); } } } return valid || stopEdit; }, tablePairSaveVisible(field, index) { const pairValue = _tablePairValue(field, index); return !LegacyUtils.isEmptyString(pairValue.key) && !LegacyUtils.isEmptyString(pairValue.value); }, tableFocusInvalidField(index, id) { _tableFocus(id, index); return false; }, tableFieldId(index, id) { return (index < 0 ? 'new' : 'cur') + id + (index >= 0 ? index : ''); } }; } service.$inject = ['IgniteLegacyUtils', 'IgniteFocus', 'IgniteErrorPopover'];