From 29ced53bcbc8feb8d681e24cf2ba2bb5ea0d5178 Mon Sep 17 00:00:00 2001 From: EdwinBetanc0urt Date: Wed, 5 Feb 2020 19:16:40 -0400 Subject: [PATCH] fix: Multiple requests block the browser. (#313) --- src/api/ADempiere/data.js | 4 +- src/components/ADempiere/DataTable/index.vue | 25 ++-- src/components/ADempiere/Field/FieldMixin.js | 1 - .../ADempiere/Field/FieldSelect.vue | 54 ++++---- src/components/ADempiere/Field/FieldYesNo.vue | 18 ++- src/components/ADempiere/Field/index.vue | 11 +- src/components/ADempiere/Panel/index.vue | 74 ++++++----- src/store/modules/ADempiere/data.js | 2 +- src/store/modules/ADempiere/panel.js | 120 ++++++++---------- src/store/modules/ADempiere/window.js | 28 ++-- src/utils/ADempiere/dictionaryUtils.js | 45 ++++--- src/views/ADempiere/Window/index.vue | 87 +++++++++---- 12 files changed, 254 insertions(+), 215 deletions(-) diff --git a/src/api/ADempiere/data.js b/src/api/ADempiere/data.js index 3eab8864..363d86ec 100644 --- a/src/api/ADempiere/data.js +++ b/src/api/ADempiere/data.js @@ -78,7 +78,7 @@ export function getEntity({ tableName, recordId, recordUuid }) { * @param {string} whereClause * @param {array} conditionsList * @param {string} orderByClause - * @param {string} nextPageToken + * @param {string} pageToken */ export function getEntitiesList({ tableName, @@ -86,7 +86,7 @@ export function getEntitiesList({ whereClause, conditionsList = [], orderByClause, - nextPageToken: pageToken, + pageToken, pageSize }) { return Instance.call(this).requestListEntities({ diff --git a/src/components/ADempiere/DataTable/index.vue b/src/components/ADempiere/DataTable/index.vue index 7baededa..b6c8afe2 100644 --- a/src/components/ADempiere/DataTable/index.vue +++ b/src/components/ADempiere/DataTable/index.vue @@ -304,19 +304,21 @@ export default { } }, data() { + const activeName = [] + if (this.$route.query.action) { + activeName.push('1') + } return { top: 0, left: 0, isOption: {}, - focusTable: false, currentRow: null, currentTable: 0, visible: this.getShowContextMenuTable, searchTable: '', // text from search defaultMaxPagination: 50, menuTable: '1', - activeName: this.$route.query.action === 'advancedQuery' ? ['1'] : [], - isFixed: false, + activeName, isLoadPanelFromServer: false, rowStyle: { height: '52px' }, sortable: null, @@ -552,11 +554,11 @@ export default { }, methods: { actionAdvancedQuery() { - if (this.activeName.length) { - this.activeName = [] - } else { - this.activeName = ['1'] + const activeNames = [] + if (!this.activeName.length) { + activeNames.push('1') } + this.activeName = activeNames }, setCurrent(row) { this.$refs.multipleTable.setCurrentRow(row) @@ -625,9 +627,6 @@ export default { }) }, sortFields, - handleChange(val) { - val = !val - }, headerLabel(field) { if (field.isMandatory || field.isMandatoryFromLogic) { return '* ' + field.name @@ -763,10 +762,6 @@ export default { }) } }, - fixedPanel() { - this.showTableSearch = false - this.isFixed = !this.isFixed - }, async getList() { this.oldgetDataDetail = this.getterDataRecords.map(v => v.id) this.newgetDataDetail = this.oldgetDataDetail.slice() @@ -807,7 +802,7 @@ export default { classReturn += 'cell-no-edit' } if (field.componentPath === 'FieldNumber') { - classReturn += 'cell-align-right' + classReturn += ' cell-align-right' } // return 'cell-edit' return classReturn diff --git a/src/components/ADempiere/Field/FieldMixin.js b/src/components/ADempiere/Field/FieldMixin.js index 8f9e282b..908ff592 100644 --- a/src/components/ADempiere/Field/FieldMixin.js +++ b/src/components/ADempiere/Field/FieldMixin.js @@ -71,7 +71,6 @@ export const fieldMixin = { isSendCallout = false } if (this.metadata.isAdvancedQuery) { - isSendToServer = false isSendCallout = false } diff --git a/src/components/ADempiere/Field/FieldSelect.vue b/src/components/ADempiere/Field/FieldSelect.vue index c7d8774a..7fa7b531 100644 --- a/src/components/ADempiere/Field/FieldSelect.vue +++ b/src/components/ADempiere/Field/FieldSelect.vue @@ -136,41 +136,47 @@ export default { }, 'metadata.value'(value) { if (!this.metadata.inTable) { - if (!this.options.some(option => option.key === value)) { - this.value = value - this.getDataLookupItem() + if (this.metadata.displayed) { + if (!this.options.some(option => option.key === value)) { + this.value = value + this.getDataLookupItem() + } } this.value = value } }, 'metadata.displayColumn'(value) { - if (!this.isEmptyValue(this.value)) { - if (!this.isEmptyValue(value)) { - // verify if exists to add - if (!this.findLabel(this.value)) { - this.options.push({ - key: this.value, - label: value - }) + if (this.metadata.displayed) { + if (!this.isEmptyValue(this.value)) { + if (!this.isEmptyValue(value)) { + // verify if exists to add + if (!this.findLabel(this.value)) { + this.options.push({ + key: this.value, + label: value + }) + } } } } } }, beforeMount() { - this.options = this.getterLookupAll - if (!this.isEmptyValue(this.value) && this.metadata.panelType !== 'table') { - if (!this.findLabel(this.value)) { - if (!this.isEmptyValue(this.metadata.displayColumn)) { - // verify if exists to add - this.options.push({ - key: this.value, - label: this.metadata.displayColumn - }) - } else { - if (!this.isPanelWindow || (this.isPanelWindow && - (this.isEmptyValue(this.metadata.optionCRUD) || this.metadata.optionCRUD === 'create-new'))) { - this.getDataLookupItem() + if (this.metadata.displayed) { + this.options = this.getterLookupAll + if (!this.isEmptyValue(this.value) && this.metadata.panelType !== 'table') { + if (!this.findLabel(this.value)) { + if (!this.isEmptyValue(this.metadata.displayColumn)) { + // verify if exists to add + this.options.push({ + key: this.value, + label: this.metadata.displayColumn + }) + } else { + if (!this.isPanelWindow || (this.isPanelWindow && + (this.isEmptyValue(this.metadata.optionCRUD) || this.metadata.optionCRUD === 'create-new'))) { + this.getDataLookupItem() + } } } } diff --git a/src/components/ADempiere/Field/FieldYesNo.vue b/src/components/ADempiere/Field/FieldYesNo.vue index aaf161e4..936c2611 100644 --- a/src/components/ADempiere/Field/FieldYesNo.vue +++ b/src/components/ADempiere/Field/FieldYesNo.vue @@ -4,8 +4,8 @@ v-model="value" :inactive-text="$t('components.switchInactiveText')" :active-text="$t('components.switchActiveText')" - true-value="true" - false-value="false" + :true-value="true" + :false-value="false" :disabled="isDisabled" @change="preHandleChange" /> @@ -42,6 +42,9 @@ export default { }, value(value, oldValue) { if (typeof value !== 'boolean') { + if (value === 'N' || value === 'n') { + value = false + } this.value = Boolean(value) } this.preHandleChange('NotSend') @@ -58,16 +61,21 @@ export default { } }, isReadOnlyForm(value) { - var fieldReadOnlyForm = FIELD_READ_ONLY_FORM.find(item => item.columnName === this.metadata.columnName) + const fieldReadOnlyForm = FIELD_READ_ONLY_FORM.find(item => item.columnName === this.metadata.columnName) // columnName: IsActive, Processed, Processing if (fieldReadOnlyForm && fieldIsDisplayed(this.metadata)) { + const fieldsExcludes = [] + // if isChangedAllForm it does not exclude anything, otherwise it excludes this columnName + if (fieldReadOnlyForm.isChangedAllForm) { + fieldsExcludes.push(this.metadata.columnName) + } + this.$store.dispatch('changeFieldAttributesBoolean', { containerUuid: this.metadata.containerUuid, fieldsIncludes: [], attribute: 'isReadOnlyFromForm', valueAttribute: Boolean(fieldReadOnlyForm.valueIsReadOnlyForm !== value), - // if isChangedAllForm it does not exclude anything, otherwise it excludes this columnName - fieldsExcludes: fieldReadOnlyForm.isChangedAllForm ? [] : [this.metadata.columnName], + fieldsExcludes, currenValue: value }) } diff --git a/src/components/ADempiere/Field/index.vue b/src/components/ADempiere/Field/index.vue index 0fbd0d18..e6b3d924 100644 --- a/src/components/ADempiere/Field/index.vue +++ b/src/components/ADempiere/Field/index.vue @@ -278,10 +278,13 @@ export default { } // edit mode is diferent to create new - const editMode = (!this.inTable && this.field.optionCRUD !== 'create-new') || (this.inTable && !this.isEmptyValue(this.field.recordUuid)) - return (!this.field.isUpdateable && editMode) || (isUpdateableAllFields || this.field.isReadOnlyFromForm) - } - if (this.panelType === 'browser') { + let isWithRecord = this.field.optionCRUD !== 'create-new' + if (this.inTable) { + isWithRecord = !this.isEmptyValue(this.field.recordUuid) + } + + return (!this.field.isUpdateable && isWithRecord) || (isUpdateableAllFields || this.field.isReadOnlyFromForm) + } else if (this.panelType === 'browser') { if (this.inTable) { // browser result return this.field.isReadOnly diff --git a/src/components/ADempiere/Panel/index.vue b/src/components/ADempiere/Panel/index.vue index c711d6ec..a7b1a9e7 100644 --- a/src/components/ADempiere/Panel/index.vue +++ b/src/components/ADempiere/Panel/index.vue @@ -53,9 +53,10 @@ -
+
{ - if (!res.includes(currentValue.groupAssigned)) { - res.push(currentValue.groupAssigned) + groupsList = fieldsList + .reduce((groupsList, currentValue) => { + if (!groupsList.includes(currentValue.groupAssigned)) { + groupsList.push(currentValue.groupAssigned) } - return res + return groupsList }, []) .map(itemGroup => { return { groupFinal: itemGroup, - metadataFields: arr.filter(itemField => { + metadataFields: fieldsList.filter(itemField => { return itemField.groupAssigned === itemGroup }) } @@ -596,26 +599,21 @@ export default { } // count and add the field numbers according to your group - Object.keys(res).forEach(key => { - let count = 0 - const typeG = res[key].metadataFields[0].typeGroupAssigned - res[key].numberFields = res[key].metadataFields.length - res[key].typeGroup = typeG - res[key].numberFields = res[key].metadataFields.length + groupsList.forEach(groupFields => { + const typeG = groupFields.metadataFields[0].typeGroupAssigned + groupFields.typeGroup = typeG - res[key].metadataFields.forEach((element, index) => { - if (element.isDisplayed) { - count++ - } + const fieldsDisplayed = groupFields.metadataFields.filter(field => { + return fieldIsDisplayed(field) }) - if ((this.groupTab.groupType === 'T' && this.groupTab.groupName === res[key].groupFinal) || - (this.groupTab.groupType !== 'T' && res[key].typeGroup !== 'T')) { + if ((this.groupTab.groupType === 'T' && this.groupTab.groupName === groupFields.groupFinal) || + (this.groupTab.groupType !== 'T' && groupFields.typeGroup !== 'T')) { this.groupsView = this.groupsView + 1 } - res[key].activeFields = count + groupFields.activeFields = fieldsDisplayed.length }) - return res + return groupsList }, setTagsViewTitle(actionValue) { if (actionValue === 'create-new' || actionValue === '') { @@ -623,7 +621,7 @@ export default { } else if (actionValue === 'advancedQuery') { this.tagTitle.action = this.$t('tagsView.advancedQuery') } else { - var field = this.fieldList.find(fieldItem => fieldItem.isIdentifier) + const field = this.fieldList.find(fieldItem => fieldItem.isIdentifier) if (field) { if (this.dataRecords[field.columnName]) { this.tagTitle.action = this.dataRecords[field.columnName] @@ -635,7 +633,7 @@ export default { } } if (this.isPanelWindow) { - var tempRoute = Object.assign({}, this.$route, { title: `${this.tagTitle.base} - ${this.tagTitle.action}` }) + const tempRoute = Object.assign({}, this.$route, { title: `${this.tagTitle.base} - ${this.tagTitle.action}` }) this.$store.dispatch('tagsView/updateVisitedView', tempRoute) } }, @@ -645,8 +643,8 @@ export default { dataTransfer.setData('Text', '') }, changePanelRecord(uuidRecord) { - if (uuidRecord !== 'create-new' && uuidRecord !== 'reference' && uuidRecord !== 'advancedQuery' && uuidRecord !== 'criteria') { - var recordSelected = this.$store.getters.getDataRecordsList(this.containerUuid).find(record => record.UUID === uuidRecord) + if (!['create-new', 'reference', 'advancedQuery', 'criteria'].includes(uuidRecord)) { + const recordSelected = this.$store.getters.getDataRecordsList(this.containerUuid).find(record => record.UUID === uuidRecord) if (recordSelected) { this.dataRecords = recordSelected this.$store.dispatch('notifyPanelChange', { diff --git a/src/store/modules/ADempiere/data.js b/src/store/modules/ADempiere/data.js index e28d3fc0..bcf0d44e 100644 --- a/src/store/modules/ADempiere/data.js +++ b/src/store/modules/ADempiere/data.js @@ -498,7 +498,7 @@ const data = { whereClause, conditionsList, orderByClause, - nextPageToken + pageToken: nextPageToken }) .then(dataResponse => { const recordsList = dataResponse.recordsList.map(itemRecord => { diff --git a/src/store/modules/ADempiere/panel.js b/src/store/modules/ADempiere/panel.js index 8604969e..a1377161 100644 --- a/src/store/modules/ADempiere/panel.js +++ b/src/store/modules/ADempiere/panel.js @@ -24,18 +24,10 @@ const panel = { payload.panel = payload.newPanel }, changeFieldLogic(state, payload) { - if (payload.isDisplayedFromLogic !== undefined) { - payload.field.isDisplayedFromLogic = payload.isDisplayedFromLogic - } - if (payload.isMandatoryFromLogic !== undefined) { - payload.field.isMandatoryFromLogic = payload.isMandatoryFromLogic - } - if (payload.isReportFromLogic !== undefined) { - payload.field.isReportFromLogic = payload.isReportFromLogic - } - if (payload.parsedDefaultValue !== undefined) { - payload.field.parsedDefaultValue = payload.parsedDefaultValue - } + payload.field.isDisplayedFromLogic = Boolean(payload.isDisplayedFromLogic) + payload.field.isMandatoryFromLogic = Boolean(payload.isMandatoryFromLogic) + payload.field.isReportFromLogic = Boolean(payload.isReportFromLogic) + payload.field.parsedDefaultValue = payload.parsedDefaultValue }, dictionaryResetCache(state) { state.panel = [] @@ -550,8 +542,57 @@ const panel = { } if (isSendToServer) { - // TODO: refactory for it and change for a standard method - if (!getters.isNotReadyForSubmit(containerUuid)) { + if (panelType === 'table' || isAdvancedQuery) { + if (field.isShowedFromUser && (field.oldValue !== field.value || + ['NULL', 'NOT_NULL'].includes(field.operator) || + field.operator !== field.oldOperator)) { + // change action to advanced query on field value is changed in this panel + if (router.currentRoute.query.action !== 'advancedQuery') { + router.push({ + query: { + ...router.currentRoute.query, + action: 'advancedQuery' + } + }) + } + dispatch('getObjectListFromCriteria', { + parentUuid, + containerUuid, + tableName: panel.tableName, + query: panel.query, + whereClause: panel.whereClause, + conditionsList: getters.getParametersToServer({ + containerUuid, + isAdvancedQuery: true, + isEvaluateMandatory: false + }) + }) + .then(response => { + commit('changeField', { + field, + newField: { + ...field, + oldOperator: field.operator + } + }) + if (response && response.length) { + dispatch('notifyPanelChange', { + parentUuid, + containerUuid, + isAdvancedQuery: false, + newValues: response[0], + isSendToServer: false, + isSendCallout: true, + panelType: 'window' + }) + } + }) + .catch(error => { + console.warn(`Error getting Advanced Query (notifyFieldChange): ${error.message}. Code: ${error.code}.`) + }) + } + } else if (!getters.isNotReadyForSubmit(containerUuid)) { + // TODO: refactory for it and change for a standard method if (field.panelType === 'browser' && fieldIsDisplayed(field)) { dispatch('getBrowserSearch', { containerUuid, @@ -621,57 +662,6 @@ const panel = { type: 'info' }) } - } else { - if (panelType === 'table' || isAdvancedQuery) { - if (field.isShowedFromUser && (field.oldValue !== field.value || - ['NULL', 'NOT_NULL'].includes(field.operator) || - field.operator !== field.oldOperator)) { - // change action to advanced query on field value is changed in this panel - if (router.currentRoute.query.action !== 'advancedQuery') { - router.push({ - query: { - ...router.currentRoute.query, - action: 'advancedQuery' - } - }) - } - dispatch('getObjectListFromCriteria', { - parentUuid, - containerUuid, - tableName: panel.tableName, - query: panel.query, - whereClause: panel.whereClause, - conditionsList: getters.getParametersToServer({ - containerUuid, - isAdvancedQuery: true, - isEvaluateMandatory: false - }) - }) - .then(response => { - commit('changeField', { - field, - newField: { - ...field, - oldOperator: field.operator - } - }) - if (response && response.length) { - dispatch('notifyPanelChange', { - parentUuid, - containerUuid, - isAdvancedQuery: false, - newValues: response[0], - isSendToServer: false, - isSendCallout: true, - panelType: 'window' - }) - } - }) - .catch(error => { - console.warn(`Error getting Advanced Query (notifyFieldChange): ${error.message}. Code: ${error.code}.`) - }) - } - } } }, changeDependentFieldsList({ commit, dispatch, getters }, { diff --git a/src/store/modules/ADempiere/window.js b/src/store/modules/ADempiere/window.js index 0de5a933..79b54933 100644 --- a/src/store/modules/ADempiere/window.js +++ b/src/store/modules/ADempiere/window.js @@ -230,7 +230,7 @@ const window = { message: language.t('login.unexpectedError'), type: 'error' }) - console.warn(`Dictionary Window (State Window) - Error ${error.code}: ${error.message}`) + console.warn(`Dictionary Window (State Window) - Error ${error.code}: ${error.message}.`) }) }, getTabAndFieldFromServer({ dispatch, getters }, { @@ -271,19 +271,21 @@ const window = { return fieldItem }) - // Get dependent fields - fieldsList - .filter(field => field.parentFieldsList && field.isActive) - .forEach((field, index, list) => { - field.parentFieldsList.forEach(parentColumnName => { - var parentField = list.find(parentField => { - return parentField.columnName === parentColumnName && parentColumnName !== field.columnName + if (!isAdvancedQuery) { + // Get dependent fields + fieldsList + .filter(field => field.parentFieldsList && field.isActive) + .forEach((field, index, list) => { + field.parentFieldsList.forEach(parentColumnName => { + const parentField = list.find(parentField => { + return parentField.columnName === parentColumnName && parentColumnName !== field.columnName + }) + if (parentField) { + parentField.dependentFieldsList.push(field.columnName) + } }) - if (parentField) { - parentField.dependentFieldsList.push(field.columnName) - } }) - }) + } if (!fieldsList.find(field => field.columnName === 'UUID')) { const attributesOverwrite = { @@ -321,7 +323,7 @@ const window = { message: language.t('login.unexpectedError'), type: 'error' }) - console.warn(`Dictionary Tab (State Window) - Error ${error.code}: ${error.message}`) + console.warn(`Dictionary Tab (State Window) - Error ${error.code}: ${error.message}.`) }) }, changeShowedDetailWindow({ commit, state }, { diff --git a/src/utils/ADempiere/dictionaryUtils.js b/src/utils/ADempiere/dictionaryUtils.js index 041cc72c..35d8ca9b 100644 --- a/src/utils/ADempiere/dictionaryUtils.js +++ b/src/utils/ADempiere/dictionaryUtils.js @@ -101,11 +101,11 @@ export function generateField(fieldToGenerate, moreAttributes, typeRange = false parsedDefaultValue, parsedDefaultValueTo, // logics to app - isDisplayedFromLogic: fieldToGenerate.isDisplayed, - isReadOnlyFromLogic: undefined, - isMandatoryFromLogic: undefined, + isDisplayedFromLogic: Boolean(fieldToGenerate.isDisplayed), + isReadOnlyFromLogic: Boolean(fieldToGenerate.isReadOnly), + isMandatoryFromLogic: Boolean(fieldToGenerate.isMandatory), // - parentFieldsList: getParentFields(fieldToGenerate), + parentFieldsList: [], dependentFieldsList: [], // TODO: Add support on server // app attributes @@ -124,21 +124,28 @@ export function generateField(fieldToGenerate, moreAttributes, typeRange = false } // evaluate simple logics without context - if (field.displayLogic.trim() !== '' && !field.displayLogic.includes('@')) { - field.isDisplayedFromLogic = evaluator.evaluateLogic({ - type: 'displayed', - logic: field.displayLogic - }) - } - if (field.mandatoryLogic.trim() !== '' && !field.mandatoryLogic.includes('@')) { - field.isMandatoryFromLogic = evaluator.evaluateLogic({ - logic: field.mandatoryLogic - }) - } - if (field.readOnlyLogic.trim() !== '' && !field.readOnlyLogic.includes('@')) { - field.isReadOnlyFromLogic = evaluator.evaluateLogic({ - logic: field.readOnlyLogic - }) + if (!field.isAdvancedQuery) { + field.parentFieldsList = getParentFields(fieldToGenerate) + + if (field.displayLogic.trim() !== '' && !field.displayLogic.includes('@')) { + field.isDisplayedFromLogic = evaluator.evaluateLogic({ + type: 'displayed', + logic: field.displayLogic + }) + field.isDisplayedFromLogic = Boolean(field.isDisplayedFromLogic) + } + if (field.mandatoryLogic.trim() !== '' && !field.mandatoryLogic.includes('@')) { + field.isMandatoryFromLogic = evaluator.evaluateLogic({ + logic: field.mandatoryLogic + }) + field.isMandatoryFromLogic = Boolean(field.isMandatoryFromLogic) + } + if (field.readOnlyLogic.trim() !== '' && !field.readOnlyLogic.includes('@')) { + field.isReadOnlyFromLogic = evaluator.evaluateLogic({ + logic: field.readOnlyLogic + }) + field.isReadOnlyFromLogic = Boolean(field.isReadOnlyFromLogic) + } } // Sizes from panel and groups diff --git a/src/views/ADempiere/Window/index.vue b/src/views/ADempiere/Window/index.vue index 06b8c220..988dc466 100644 --- a/src/views/ADempiere/Window/index.vue +++ b/src/views/ADempiere/Window/index.vue @@ -5,7 +5,7 @@ > - +