From bc2bd5d2bccaafab92375fede801ced0f56fff90 Mon Sep 17 00:00:00 2001 From: EdwinBetanc0urt Date: Wed, 13 Nov 2024 14:42:28 -0400 Subject: [PATCH] fix: Save changes before process document. --- src/api/ADempiere/userInterface/entities.ts | 4 +- .../convenienceButtons/SaveRecordButton.vue | 15 ++-- .../convenienceButtons/documentAction.vue | 82 +++++++++++++++++-- src/components/ADempiere/TabManager/index.vue | 6 +- .../modules/ADempiere/documentManager.js | 7 +- src/store/modules/ADempiere/persistence.js | 6 +- .../ADempiere/constants/systemColumns.js | 8 ++ 7 files changed, 104 insertions(+), 24 deletions(-) diff --git a/src/api/ADempiere/userInterface/entities.ts b/src/api/ADempiere/userInterface/entities.ts index ba4dbfeac7e..818c2b4b9a4 100644 --- a/src/api/ADempiere/userInterface/entities.ts +++ b/src/api/ADempiere/userInterface/entities.ts @@ -84,7 +84,7 @@ export function createEntity({ * @param {object} keyColumns */ export function updateEntity({ - reccordId, + recordId, tabId, recordAttributes = {}, keyColumns = {} @@ -94,7 +94,7 @@ export function updateEntity({ ...keyColumns } return request({ - url: `/user-interface/entities/${tabId}/${reccordId}`, + url: `/user-interface/entities/${tabId}/${recordId}`, method: 'patch', data: { attributes: attributes diff --git a/src/components/ADempiere/TabManager/convenienceButtons/SaveRecordButton.vue b/src/components/ADempiere/TabManager/convenienceButtons/SaveRecordButton.vue index f92b2abeb2f..5605b2a1417 100644 --- a/src/components/ADempiere/TabManager/convenienceButtons/SaveRecordButton.vue +++ b/src/components/ADempiere/TabManager/convenienceButtons/SaveRecordButton.vue @@ -114,15 +114,20 @@ export default defineComponent({ return isExistsChanges.value }) - const reccordId = computed(() => { + const recordId = computed(() => { const { table } = tabAttributes.value const { key_columns, table_name } = table const currentReccord = store.getters.getTabCurrentRow({ containerUuid: tabAttributes.value.containerUuid }) - if (!isEmptyValue(currentReccord[table_name + '_ID'])) return currentReccord[table_name + '_ID'] - if (!isEmptyValue(key_columns)) return currentReccord[key_columns[key_columns.length - 1]] - return 1 + if (!isEmptyValue(currentReccord[table_name + '_ID'])) { + return currentReccord[table_name + '_ID'] + } + if (!isEmptyValue(key_columns)) { + const keyIndex = key_columns.length - 1 + return currentReccord[key_columns.at(keyIndex)] + } + return -1 }) function saveChanges() { @@ -150,7 +155,7 @@ export default defineComponent({ tabId: tabAttributes.value.internal_id, tableName: tabAttributes.value.table_name, recordUuid: recordUuid.value, - reccordId: reccordId.value + recordId: recordId.value }) .then(response => { const { diff --git a/src/components/ADempiere/TabManager/convenienceButtons/documentAction.vue b/src/components/ADempiere/TabManager/convenienceButtons/documentAction.vue index ad57588079b..982ee3577bb 100644 --- a/src/components/ADempiere/TabManager/convenienceButtons/documentAction.vue +++ b/src/components/ADempiere/TabManager/convenienceButtons/documentAction.vue @@ -108,7 +108,7 @@ type="primary" class="button-base-icon" icon="el-icon-check" - @click="sendAction()" + @click="startDocumentAction()" /> @@ -131,7 +131,10 @@ import language from '@/lang' import store from '@/store' // Constants -import { DOCUMENT_ACTION, DOCUMENT_STATUS } from '@/utils/ADempiere/constants/systemColumns' +import { + COLUMNNAME_DocAction, COLUMNNAME_DocStatus, + LOG_COLUMNS_NAME_LIST +} from '@/utils/ADempiere/constants/systemColumns' import { DISPLAY_COLUMN_PREFIX } from '@/utils/ADempiere/dictionaryUtils' // Components and Mixins @@ -144,6 +147,7 @@ import { refreshRecord } from '@/utils/ADempiere/dictionary/window' import { isRunableDocumentAction } from '@/utils/ADempiere/dictionary/workflow' +import { showMessage } from '@/utils/ADempiere/notification' export default defineComponent({ name: 'DocumentAction', @@ -204,7 +208,7 @@ export default defineComponent({ return store.getters.getValueOfFieldOnContainer({ parentUuid: props.parentUuid, containerUuid, - columnName: DOCUMENT_STATUS + columnName: COLUMNNAME_DocStatus }) }) @@ -212,7 +216,7 @@ export default defineComponent({ return store.getters.getValueOfFieldOnContainer({ parentUuid: props.parentUuid, containerUuid, - columnName: DOCUMENT_ACTION + columnName: COLUMNNAME_DocAction }) }) @@ -220,7 +224,7 @@ export default defineComponent({ return store.getters.getValueOfFieldOnContainer({ containerUuid: props.parentUuid, // tab uuid // containerUuid, - columnName: DISPLAY_COLUMN_PREFIX + DOCUMENT_ACTION + columnName: DISPLAY_COLUMN_PREFIX + COLUMNNAME_DocAction }) }) @@ -254,7 +258,7 @@ export default defineComponent({ if (isEmptyValue(defaultDocumentAction.value)) { return store.getters.getValueOfFieldOnContainer({ containerUuid: props.tabAttributes.uuid, - columnName: DOCUMENT_ACTION + columnName: COLUMNNAME_DocAction }) } return defaultDocumentAction.value.value @@ -279,7 +283,7 @@ export default defineComponent({ const currentDocStatusDisplayedValue = computed(() => { const displayedValue = store.getters.getValueOfFieldOnContainer({ containerUuid, - columnName: DISPLAY_COLUMN_PREFIX + DOCUMENT_STATUS + columnName: DISPLAY_COLUMN_PREFIX + COLUMNNAME_DocStatus }) if (!isEmptyValue(displayedValue)) { return displayedValue @@ -385,9 +389,69 @@ export default defineComponent({ store.dispatch('fieldListInfo', { info }) } - function sendAction() { + const isExistsChanges = computed(() => { + const persistenceValues = store.getters.getPersistenceAttributesChanges({ + parentUuid: props.parentUuid, + containerUuid: props.tabAttributes.uuid, + recordUuid: recordUuid.value + }) + return !isEmptyValue(persistenceValues) + }) + + const emptyMandatoryFields = computed(() => { + return store.getters.getTabFieldsEmptyMandatory({ + parentUuid: props.parentUuid, + containerUuid: props.tabAttributes.uuid, + formatReturn: false + }).filter(itemField => { + // omit send to server (to create or update) columns manage by backend + return itemField.is_always_updateable || + !LOG_COLUMNS_NAME_LIST.includes(itemField.columnName) + }).map(itemField => { + return itemField.name + }) + }) + + function startDocumentAction() { isVisibleDocAction.value = false isLoadingActions.value = true + + if (isExistsChanges.value) { + const emptyMandatory = emptyMandatoryFields.value.join(', ') + if (!isEmptyValue(emptyMandatory)) { + showMessage({ + message: language.t('notifications.mandatoryFieldMissing') + emptyMandatory, + type: 'info' + }) + isLoadingActions.value = false + return + } + + return store.dispatch('flushPersistenceQueue', { + parentUuid: props.parentUuid, + containerUuid: props.tabAttributes.uuid, + tabId: props.tabAttributes.internal_id, + tableName: props.tabAttributes.table_name, + recordUuid: recordUuid.value, + recordId: recordId.value + }) + .then(response => { + processDocumentWithAction() + }) + .catch(error => { + isLoadingActions.value = false + // console.error('Error saving record', error.message) + showMessage({ + message: error.message, + type: 'error' + }) + }) + } + processDocumentWithAction() + } + + function processDocumentWithAction() { + isLoadingActions.value = true store.dispatch('runDocumentActionOnServer', { parentUuid: props.parentUuid, containerUuid, @@ -476,7 +540,7 @@ export default defineComponent({ // Methods displayDocumentActions, handleCommandActions, - sendAction, + startDocumentAction, message } } diff --git a/src/components/ADempiere/TabManager/index.vue b/src/components/ADempiere/TabManager/index.vue index 16d8a997db3..3ea784da2ab 100644 --- a/src/components/ADempiere/TabManager/index.vue +++ b/src/components/ADempiere/TabManager/index.vue @@ -378,7 +378,7 @@ export default defineComponent({ return {} }) - const reccordId = computed(() => { + const recordId = computed(() => { if (isEmptyValue(currentTabPanelInfo.value)) return 1 const { table } = currentTabPanelInfo.value const { key_columns, table_name } = table @@ -1053,7 +1053,7 @@ export default defineComponent({ tabId: currentTab.internal_id, tableName: currentTab.table_name, recordUuid: undefined, - reccordId: -1 + recordId: -1 }) .then(response => { const { @@ -1147,7 +1147,7 @@ export default defineComponent({ containerInfo, currentTabPanelInfo, emptyMandatoryFields, - reccordId, + recordId, // methods theAction, handleClick, diff --git a/src/store/modules/ADempiere/documentManager.js b/src/store/modules/ADempiere/documentManager.js index e576e1f63f5..79eb0696cf5 100644 --- a/src/store/modules/ADempiere/documentManager.js +++ b/src/store/modules/ADempiere/documentManager.js @@ -19,7 +19,9 @@ import Vue from 'vue' // Constants -import { DOCUMENT_STATUS } from '@/utils/ADempiere/constants/systemColumns' +import { + COLUMNNAME_DocStatus +} from '@/utils/ADempiere/constants/systemColumns' // API Request Methods import { @@ -177,6 +179,7 @@ const documentManager = { if (isError) { type = 'error' + console.warn(`Error Run Doc Action: ${text}.`) } showNotification({ @@ -204,7 +207,7 @@ const documentManager = { const documentStatus = getters.getValueOfFieldOnContainer({ // parentUuid: parentUuid, containerUuid: containerUuid, - columnName: DOCUMENT_STATUS + columnName: COLUMNNAME_DocStatus }) if (!isEmptyValue(documentStatus)) { diff --git a/src/store/modules/ADempiere/persistence.js b/src/store/modules/ADempiere/persistence.js index a62feabfa02..bb9c56a5df5 100644 --- a/src/store/modules/ADempiere/persistence.js +++ b/src/store/modules/ADempiere/persistence.js @@ -236,7 +236,7 @@ const persistence = { parentUuid, containerUuid, tabId, - reccordId, + recordId, tableName, recordUuid, attributesList @@ -281,7 +281,7 @@ const persistence = { if (!isEmptyValue(recordUuid) && recordUuid !== 'create-new') { // Update existing entity // if (key_columns.length > 1) { - // reccordId = 0 + // recordId = 0 // } const recordAttributes = {} attributesList.forEach(attribute => { @@ -321,7 +321,7 @@ const persistence = { }) } return updateEntity({ - reccordId, + recordId, tabId, recordUuid, recordAttributes, diff --git a/src/utils/ADempiere/constants/systemColumns.js b/src/utils/ADempiere/constants/systemColumns.js index f6ebf0a285a..45a2a0d53cd 100644 --- a/src/utils/ADempiere/constants/systemColumns.js +++ b/src/utils/ADempiere/constants/systemColumns.js @@ -54,9 +54,17 @@ export const VALUE = 'Value' export const DOCUMENT_NO = 'DocumentNo' +/** + * @deprecated + */ export const DOCUMENT_STATUS = 'DocStatus' +export const COLUMNNAME_DocStatus = 'DocStatus' +/** + * @deprecated + */ export const DOCUMENT_ACTION = 'DocAction' +export const COLUMNNAME_DocAction = 'DocAction' export const STD_PRECISION = 'StdPrecision'