From 1126c00c1fbad721d10b5e097f12bb852420c0b3 Mon Sep 17 00:00:00 2001 From: Edwin Betancourt Date: Tue, 25 Feb 2020 09:05:02 -0400 Subject: [PATCH] fix: #347 Loses values when create entity using callout generate error or warning. (#348) * fix loses values when using callout or generate error create entity. * fix undefined method. * Remover comments un data table component * Delete comments in dictionary utils --- .../DataTable/menu/menuTableMixin.js | 4 + src/store/modules/ADempiere/calloutControl.js | 27 +- src/store/modules/ADempiere/data.js | 378 +++++++++--------- src/store/modules/ADempiere/windowControl.js | 50 ++- src/utils/ADempiere/dictionaryUtils.js | 1 + 5 files changed, 250 insertions(+), 210 deletions(-) diff --git a/src/components/ADempiere/DataTable/menu/menuTableMixin.js b/src/components/ADempiere/DataTable/menu/menuTableMixin.js index a6759e12..d631c2e7 100644 --- a/src/components/ADempiere/DataTable/menu/menuTableMixin.js +++ b/src/components/ADempiere/DataTable/menu/menuTableMixin.js @@ -2,6 +2,7 @@ import { supportedTypes, exportFileFromJson, exportFileZip } from '@/utils/ADemp import { showNotification } from '@/utils/ADempiere/notification' import { recursiveTreeSearch } from '@/utils/ADempiere/valueUtils' import { FIELDS_QUANTITY } from '@/components/ADempiere/Field/references' +import { sortFields } from '@/utils/ADempiere/dictionaryUtils' export const menuTableMixin = { props: { @@ -84,6 +85,8 @@ export const menuTableMixin = { if (this.panelType === 'browser') { sortAttribute = 'seqNoGrid' } + // TODO: Change to destructuring and add isParent attribure to change + // orderBy sequence value to seqNoGrid value if isParent is false return this.sortFields( this.panelMetadata.fieldList, sortAttribute @@ -164,6 +167,7 @@ export const menuTableMixin = { }, methods: { showNotification, + sortFields, closeMenu() { // TODO: Validate to dispatch one action this.$store.dispatch('showMenuTable', { diff --git a/src/store/modules/ADempiere/calloutControl.js b/src/store/modules/ADempiere/calloutControl.js index 45ba9308..8d69cc96 100644 --- a/src/store/modules/ADempiere/calloutControl.js +++ b/src/store/modules/ADempiere/calloutControl.js @@ -16,17 +16,10 @@ const callOutControl = { oldValue }) { const window = rootGetters.getWindow(parentUuid) - let attributesList = [] - if (inTable) { - attributesList = rootGetters.getParametersToServer({ - containerUuid, - row - }) - } else { - attributesList = rootGetters.getParametersToServer({ - containerUuid - }) - } + const attributesList = rootGetters.getParametersToServer({ + containerUuid, + row + }) return runCallOutRequest({ windowUuid: parentUuid, @@ -40,13 +33,11 @@ const callOutControl = { windowNo: window.windowIndex }) .then(calloutResponse => { - const newValues = {} - Object.keys(calloutResponse.values).forEach(key => { - if (calloutResponse.values[key] !== undefined) { - newValues[key] = calloutResponse.values[key] - } - }) if (inTable) { + const newValues = { + ...row, + ...calloutResponse.values + } dispatch('notifyRowTableChange', { parentUuid, containerUuid, @@ -58,7 +49,7 @@ const callOutControl = { parentUuid, containerUuid, panelType: 'window', - newValues, + newValues: calloutResponse.values, isSendToServer: false, withOutColumnNames, isSendCallout: false, diff --git a/src/store/modules/ADempiere/data.js b/src/store/modules/ADempiere/data.js index 3e7b5f59..7c9f15e2 100644 --- a/src/store/modules/ADempiere/data.js +++ b/src/store/modules/ADempiere/data.js @@ -127,169 +127,186 @@ const data = { * @param {boolean} isPanelValues, define if used values form panel * @param {boolean} isEdit, define if used values form panel */ - addNewRow({ commit, getters, rootGetters, dispatch }, parameters) { - const { parentUuid, containerUuid, isPanelValues = false, isEdit = true, isNew = true } = parameters - let { fieldList = [] } = parameters - - const tabPanel = rootGetters.getPanel(containerUuid) - - if (!fieldList.length) { - fieldList = tabPanel.fieldList - } - + addNewRow({ commit, getters, rootGetters, dispatch }, { + parentUuid, + containerUuid, + isPanelValues = false, + isEdit = true, + isNew = true, + fieldList, + row + }) { + const dataStore = getters.getDataRecordsList(containerUuid) let values = {} - // add row with default values to create new record - if (isPanelValues) { - // add row with values used from record in panel - values = rootGetters.getColumnNamesAndValues({ - containerUuid, - propertyName: 'value', - isObjectReturn: true, - isAddDisplayColumn: true, + const currentNewRow = dataStore.find(itemData => { + return isEmptyValue(itemData.UUID) && itemData.isNew + }) + + if (!isEmptyValue(currentNewRow)) { + values = currentNewRow + return values + } if (isEmptyValue(row)) { + const tabPanel = rootGetters.getPanel(containerUuid) + + if (isEmptyValue(fieldList)) { + fieldList = tabPanel.fieldList + } + // add row with default values to create new record + if (isPanelValues) { + // add row with values used from record in panel + values = rootGetters.getColumnNamesAndValues({ + containerUuid, + propertyName: 'value', + isObjectReturn: true, + isAddDisplayColumn: true, + fieldList + }) + } else { + values = rootGetters.getParsedDefaultValues({ + parentUuid, + containerUuid, + fieldList + }) + } + values.isNew = isNew + values.isEdit = isEdit + values.isSendServer = false + + // get the link column name from the tab + let linkColumnName = tabPanel.linkColumnName + if (isEmptyValue(linkColumnName)) { + // get the link column name from field list + linkColumnName = tabPanel.fieldLinkColumnName + } + + let valueLink + // get context value if link column exists and does not exist in row + if (!isEmptyValue(linkColumnName)) { + valueLink = rootGetters.getContext({ + parentUuid, + containerUuid, + columnName: linkColumnName + }) + if (!isEmptyValue(valueLink)) { + valueLink = parseInt(valueLink, 10) + } + } + + // get display column + if (fieldList.length) { fieldList - }) - } else { - values = rootGetters.getParsedDefaultValues({ - parentUuid, - containerUuid, - fieldList - }) - } - values.isNew = isNew - values.isEdit = isEdit - values.isSendServer = false - - // get the link column name from the tab - var linkColumnName = tabPanel.linkColumnName - if (isEmptyValue(linkColumnName)) { - // get the link column name from field list - linkColumnName = tabPanel.fieldLinkColumnName - } - - var valueLink - // get context value if link column exists and does not exist in row - if (!isEmptyValue(linkColumnName)) { - valueLink = rootGetters.getContext({ - parentUuid, - containerUuid, - columnName: linkColumnName - }) - } - if (!isEmptyValue(valueLink)) { - valueLink = parseInt(valueLink, 10) - } - - // get display column - if (fieldList.length) { - fieldList - // TODO: Evaluate if is field is read only and FieldSelect - .filter(itemField => itemField.componentPath === 'FieldSelect' || String(values[itemField.columnName]) === '[object Object]') - .forEach(itemField => { - var valueGetDisplayColumn = values[itemField.columnName] - if (String(values[itemField.columnName]) === '[object Object]' && itemField.componentPath === 'FieldSelect') { - values[itemField.columnName] = ' ' - values[`DisplayColumn_${itemField.columnName}`] = ' ' - } else if (String(values[itemField.columnName]) === '[object Object]' && itemField.componentPath === 'FieldNumber') { - values[itemField.columnName] = 0 - } - // overwrite value with column link - if (!isEmptyValue(linkColumnName) && linkColumnName === itemField.columnName) { - valueGetDisplayColumn = valueLink - if (isEmptyValue(values[itemField.columnName])) { - values[itemField.columnName] = valueGetDisplayColumn + // TODO: Evaluate if is field is read only and FieldSelect + .filter(itemField => itemField.componentPath === 'FieldSelect' || String(values[itemField.columnName]) === '[object Object]') + .forEach(itemField => { + let valueGetDisplayColumn = values[itemField.columnName] + if (String(values[itemField.columnName]) === '[object Object]') { + if (itemField.componentPath === 'FieldSelect') { + values[itemField.columnName] = ' ' + values[`DisplayColumn_${itemField.columnName}`] = ' ' + } else if (itemField.componentPath === 'FieldNumber') { + values[itemField.columnName] = 0 + } } - } - - // break this itineration if is empty - if (isEmptyValue(valueGetDisplayColumn)) { - return - } - // always the values for these types of fields are integers - if (['TableDirect'].includes(itemField.referenceType)) { - valueGetDisplayColumn = parseInt(valueGetDisplayColumn, 10) - } else { - if (!isNaN(valueGetDisplayColumn)) { - valueGetDisplayColumn = parseInt(valueGetDisplayColumn, 10) + // overwrite value with column link + if (!isEmptyValue(linkColumnName) && linkColumnName === itemField.columnName) { + valueGetDisplayColumn = valueLink + if (isEmptyValue(values[itemField.columnName])) { + values[itemField.columnName] = valueGetDisplayColumn + } } - } - if (!isEmptyValue(valueGetDisplayColumn) && String(valueGetDisplayColumn) === '[object Object]' && valueGetDisplayColumn.isSQL) { - // get value from direct Query - dispatch('getRecordBySQL', { - query: valueGetDisplayColumn.query, - field: itemField - }) - .then(defaultValue => { - if (itemField.componentPath === 'FieldSelect') { - values[itemField.columnName] = defaultValue.key - values[`DisplayColumn_${itemField.columnName}`] = defaultValue.label - } else { - values[itemField.columnName] = defaultValue.key - dispatch('notifyRowTableChange', { - parentUuid, - containerUuid, - isNew, - isEdit, - row: values - }) - } - }) - return - } - // get label (DisplayColumn) from vuex store - const options = rootGetters.getLookupAll({ - parentUuid, - containerUuid, - tableName: itemField.reference.tableName, - query: itemField.reference.query, - directQuery: itemField.reference.directQuery, - value: valueGetDisplayColumn - }) - const option = options.find(itemOption => itemOption.key === valueGetDisplayColumn) - // if there is a lookup option, assign the display column with the label - if (option) { - values[`DisplayColumn_${itemField.columnName}`] = option.label - if (isEmptyValue(option.label) && !itemField.isMandatory) { - values[itemField.columnName] = undefined - } - return - } - if (linkColumnName === itemField.columnName) { - // get context value if link column exists and does not exist in row - const nameParent = rootGetters.getContext({ - parentUuid, - containerUuid, - columnName: 'Name' - }) - if (nameParent) { - values[`DisplayColumn_${itemField.columnName}`] = nameParent + // break this itineration if is empty + if (isEmptyValue(valueGetDisplayColumn)) { return } - } - // get from server - dispatch('getLookupItemFromServer', { - parentUuid, - containerUuid, - tableName: itemField.reference.tableName, - directQuery: itemField.reference.directQuery, - value: valueGetDisplayColumn - }) - .then(responseLookup => { - dispatch('addDisplayColumn', { - containerUuid, - columnName: itemField.columnName, - displayColumn: responseLookup.label + // always the values for these types of fields are integers + if (['TableDirect'].includes(itemField.referenceType)) { + valueGetDisplayColumn = parseInt(valueGetDisplayColumn, 10) + } else { + if (!isNaN(valueGetDisplayColumn)) { + valueGetDisplayColumn = parseInt(valueGetDisplayColumn, 10) + } + } + if (!isEmptyValue(valueGetDisplayColumn) && String(valueGetDisplayColumn) === '[object Object]' && valueGetDisplayColumn.isSQL) { + // get value from direct Query + dispatch('getRecordBySQL', { + query: valueGetDisplayColumn.query, + field: itemField }) + .then(defaultValue => { + if (itemField.componentPath === 'FieldSelect') { + values[itemField.columnName] = defaultValue.key + values[`DisplayColumn_${itemField.columnName}`] = defaultValue.label + } else { + values[itemField.columnName] = defaultValue.key + dispatch('notifyRowTableChange', { + parentUuid, + containerUuid, + isNew, + isEdit, + row: values + }) + } + }) + return + } + // get label (DisplayColumn) from vuex store + const options = rootGetters.getLookupAll({ + parentUuid, + containerUuid, + tableName: itemField.reference.tableName, + query: itemField.reference.query, + directQuery: itemField.reference.directQuery, + value: valueGetDisplayColumn }) - }) + + const option = options.find(itemOption => itemOption.key === valueGetDisplayColumn) + // if there is a lookup option, assign the display column with the label + if (option) { + values[`DisplayColumn_${itemField.columnName}`] = option.label + if (isEmptyValue(option.label) && !itemField.isMandatory) { + values[itemField.columnName] = undefined + } + return + } + if (linkColumnName === itemField.columnName) { + // get context value if link column exists and does not exist in row + const nameParent = rootGetters.getContext({ + parentUuid, + containerUuid, + columnName: 'Name' + }) + if (nameParent) { + values[`DisplayColumn_${itemField.columnName}`] = nameParent + return + } + } + // get from server + dispatch('getLookupItemFromServer', { + parentUuid, + containerUuid, + tableName: itemField.reference.tableName, + directQuery: itemField.reference.directQuery, + value: valueGetDisplayColumn + }) + .then(responseLookup => { + dispatch('addDisplayColumn', { + containerUuid, + columnName: itemField.columnName, + displayColumn: responseLookup.label + }) + }) + }) + } + + // overwrite value with column link + if (isEmptyValue(values[linkColumnName])) { + values[linkColumnName] = valueLink + } + } else { + values = row } - // overwrite value with column link - if (isEmptyValue(values[linkColumnName])) { - values[linkColumnName] = valueLink - } - - const dataStore = getters.getDataRecordsList(containerUuid) commit('addNewRow', { values, data: dataStore @@ -395,7 +412,7 @@ const data = { withOut = [], isNew = false }) { - var setNews = [] + const setNews = [] const record = state.recordSelection.filter(itemRecord => { // ignore this uuid if (withOut.includes(itemRecord.containerUuid)) { @@ -632,13 +649,18 @@ const data = { * @param {objec} objectParams.isEdit, if the row displayed to edit mode * @param {objec} objectParams.isNew, if insert data to new row */ - notifyRowTableChange({ commit, getters, rootGetters }, objectParams) { - const { parentUuid, containerUuid, isEdit = true } = objectParams - var currentValues = {} - if (objectParams.hasOwnProperty('row')) { - currentValues = objectParams.row + notifyRowTableChange({ commit, getters, rootGetters }, { + parentUuid, + containerUuid, + isEdit = true, + isNew, + row + }) { + let values = {} + if (row) { + values = row } else { - currentValues = rootGetters.getColumnNamesAndValues({ + values = rootGetters.getColumnNamesAndValues({ parentUuid, containerUuid, propertyName: 'value', @@ -647,27 +669,34 @@ const data = { }) } - var row = getters.getRowData(objectParams.containerUuid, currentValues.UUID) + const currentRow = getters.getRowData(containerUuid, values.UUID) - var newRow = { - ...currentValues, + const newRow = { + ...values, // ...objectParams.row, isEdit } commit('notifyRowTableChange', { - isNew: objectParams.isNew, + isNew, newRow, - row + row: currentRow }) }, - notifyCellTableChange({ commit, state, dispatch, rootGetters }, parameters) { - const { - parentUuid, containerUuid, field, panelType = 'window', - isSendToServer = true, columnName, rowKey, keyColumn, newValue, - displayColumn, withOutColumnNames = [], isSendCallout = true - } = parameters - + notifyCellTableChange({ commit, state, dispatch, rootGetters }, { + parentUuid, + containerUuid, + field, + columnName, + rowKey, + keyColumn, + panelType = 'window', + isSendToServer = true, + isSendCallout = true, + newValue, + displayColumn, + withOutColumnNames = [] + }) { const recordSelection = state.recordSelection.find(recordItem => { return recordItem.containerUuid === containerUuid }) @@ -730,13 +759,6 @@ const data = { containerUuid, row }) - .then(() => { - // refresh record list - dispatch('getDataListTab', { - parentUuid, - containerUuid - }) - }) } } else { const fieldsEmpty = rootGetters.getFieldListEmptyMandatory({ diff --git a/src/store/modules/ADempiere/windowControl.js b/src/store/modules/ADempiere/windowControl.js index 0a6f76ac..d630a13e 100644 --- a/src/store/modules/ADempiere/windowControl.js +++ b/src/store/modules/ADempiere/windowControl.js @@ -172,7 +172,7 @@ const windowControl = { }) }) }, - createEntityFromTable({ commit, getters, rootGetters }, { + createEntityFromTable({ commit, dispatch, getters, rootGetters }, { parentUuid, containerUuid, row @@ -187,8 +187,9 @@ const windowControl = { const { tableName, isParentTab } = rootGetters.getPanel(containerUuid) // TODO: Add support to Binary columns (BinaryData) - const columnsToDontSend = ['BinaryData', 'isSendServer', 'isEdit'] + const columnsToDontSend = ['BinaryData', 'isEdit', 'isNew', 'isSendServer'] + // TODO: Evaluate peformance without filter using delete(prop) before convert object to array // attributes or fields let finalAttributes = convertObjectToArrayPairs(row) finalAttributes = finalAttributes.filter(itemAttribute => { @@ -206,6 +207,8 @@ const windowControl = { tableName, attributesList: finalAttributes }) + + let isError = false return createEntity({ tableName, attributesList: finalAttributes @@ -239,9 +242,22 @@ const windowControl = { message: error.message, type: 'error' }) - console.warn(`Create Entity Table Error ${error.code}: ${error.message}`) + console.warn(`Create Entity Table Error ${error.code}: ${error.message}.`) + isError = true }) .finally(() => { + if (isError) { + dispatch('addNewRow', { + containerUuid, + row + }) + } else { + // refresh record list + dispatch('getDataListTab', { + parentUuid, + containerUuid + }) + } commit('deleteInCreate', { containerUuid, tableName, @@ -332,15 +348,15 @@ const windowControl = { }) }, updateCurrentEntityFromTable({ rootGetters }, { - parentUuid, containerUuid, row }) { const { tableName, fieldList } = rootGetters.getPanel(containerUuid) // TODO: Add support to Binary columns (BinaryData) - const columnsToDontSend = ['BinaryData', 'isSendServer', 'isEdit'] + const columnsToDontSend = ['BinaryData', 'isEdit', 'isNew', 'isSendServer'] + // TODO: Evaluate peformance without filter using delete(prop) before convert object to array // attributes or fields let finalAttributes = convertObjectToArrayPairs(row) finalAttributes = finalAttributes.filter(itemAttribute => { @@ -367,7 +383,7 @@ const windowControl = { message: error.message, type: 'error' }) - console.warn(`Update Entity Table Error ${error.code}: ${error.message}`) + console.warn(`Update Entity Table Error ${error.code}: ${error.message}.`) }) }, /** @@ -596,14 +612,20 @@ const windowControl = { * @param {boolean} isRefreshPanel, if main panel is updated with new response data * @param {boolean} isLoadAllRecords, if main panel is updated with new response data */ - getDataListTab({ dispatch, rootGetters }, parameters) { - const { - parentUuid, containerUuid, recordUuid, - referenceWhereClause = '', columnName, value, criteria, - isRefreshPanel = false, isLoadAllRecords = false, isReference = false, - isShowNotification = true - } = parameters - let { isAddRecord = false } = parameters + getDataListTab({ dispatch, rootGetters }, { + parentUuid, + containerUuid, + recordUuid, + referenceWhereClause = '', + columnName, + value, + criteria, + isAddRecord = false, + isLoadAllRecords = false, + isRefreshPanel = false, + isReference = false, + isShowNotification = true + }) { const tab = rootGetters.getTab(parentUuid, containerUuid) let parsedQuery = tab.query diff --git a/src/utils/ADempiere/dictionaryUtils.js b/src/utils/ADempiere/dictionaryUtils.js index b63c8dc0..3a0d2306 100644 --- a/src/utils/ADempiere/dictionaryUtils.js +++ b/src/utils/ADempiere/dictionaryUtils.js @@ -471,6 +471,7 @@ export function assignedGroup(fieldList, assignedGroup) { if (fieldList === undefined || fieldList.length <= 0) { return fieldList } + fieldList = sortFields(fieldList, 'sequence', 'asc', fieldList[0].panelType) let firstChangeGroup = false