mirror of
https://github.com/PanJiaChen/vue-element-admin.git
synced 2025-08-10 12:01:57 +08:00
* Separate Services - Dictionary: dictionary - Common request: common - ADempiere Generic API:common/api - Dashboard Content: dashboard - Dashboard favorites: dashboard/addons/user - Dashboard Pending Documents: dashboard/addons/tasks - User Management: user - User enrollment: user/enrollment - User Log: user/log - Workflow metadata: workflow - User Interface Common logic: user-interface/common - User Interface Window tools: user-interface/window - User Interface Smart Browser tools: user-interface/smart-browser - User Interface Process tools: user-interface/process - User Interface Attachment Management: user-interface/component/attachment - User Interface Components Preference: user-interface/component/preference - User Interface Components Private Access: user-interface/component/private-access - User Interface Components Record Access: user-interface/component/record-access - User Interface Components Notes: user-interface/component/notes - User Interface Components Translation: user-interface/component/translation - User Interface Forms / POS: form/addons/point-of-sales * Minor change * Remove persistence * Untrack files * Remove persistence * resolve conflicts * Update files
460 lines
15 KiB
JavaScript
460 lines
15 KiB
JavaScript
import { requestWindowMetadata } from '@/api/ADempiere/dictionary/window'
|
|
import { showMessage } from '@/utils/ADempiere/notification'
|
|
import { isEmptyValue } from '@/utils/ADempiere/valueUtils'
|
|
import language from '@/lang'
|
|
import router from '@/router'
|
|
import { generateField } from '@/utils/ADempiere/dictionaryUtils'
|
|
import { getFieldTemplate } from '@/utils/ADempiere/lookupFactory'
|
|
|
|
const initStateWindow = {
|
|
window: [],
|
|
windowIndex: 0,
|
|
panelRight: ''
|
|
}
|
|
|
|
const window = {
|
|
state: initStateWindow,
|
|
mutations: {
|
|
addWindow(state, payload) {
|
|
state.window.push(payload)
|
|
state.windowIndex++
|
|
},
|
|
dictionaryResetCacheWindow(state) {
|
|
state = initStateWindow
|
|
},
|
|
setCurrentTab(state, payload) {
|
|
payload.window.currentTab = payload.tab
|
|
payload.window.currentTabUuid = payload.tab.uuid
|
|
},
|
|
changeWindowAttribute(state, payload) {
|
|
let value = payload.attributeValue
|
|
if (payload.attributeNameControl) {
|
|
value = payload.window[payload.attributeNameControl]
|
|
}
|
|
payload.window[payload.attributeName] = value
|
|
},
|
|
changeTabAttribute(state, payload) {
|
|
let value = payload.attributeValue
|
|
if (payload.attributeNameControl) {
|
|
value = payload.tab[payload.attributeNameControl]
|
|
}
|
|
payload.tab[payload.attributeName] = value
|
|
},
|
|
setPanelRight(state, payload) {
|
|
state.panelRight = payload
|
|
}
|
|
},
|
|
actions: {
|
|
/**
|
|
* Get Window metadata from server
|
|
* @param {string} windowUuid
|
|
* @param {number} windowId
|
|
* @param {object} routeToDelete, route to close in tagView when fail
|
|
*/
|
|
getWindowFromServer({ commit, state, dispatch }, {
|
|
windowUuid,
|
|
windowId,
|
|
routeToDelete
|
|
}) {
|
|
return requestWindowMetadata({
|
|
uuid: windowUuid,
|
|
id: windowId
|
|
})
|
|
.then(responseWindow => {
|
|
const firstTabTableName = responseWindow.tabs[0].tableName
|
|
const firstTabUuid = responseWindow.tabs[0].uuid
|
|
const tabsListParent = []
|
|
const tabsListChildren = []
|
|
|
|
const tabsSequence = []
|
|
// indexes related to visualization
|
|
let tabParentIndex = 0
|
|
let tabChildrenIndex = 0
|
|
// TODO Add source tab on the server for tabs Translation and Sort
|
|
const tabs = responseWindow.tabs.filter(itemTab => {
|
|
if (itemTab.isSortTab) {
|
|
// TODO: Add convert tab as process function
|
|
tabsSequence.push({
|
|
uuid: itemTab.uuid,
|
|
id: itemTab.id,
|
|
parentUuid: windowUuid,
|
|
containerUuid: itemTab.uuid,
|
|
parentTabUuid: itemTab.parentTabUuid,
|
|
panelType: 'window',
|
|
type: 'sequence',
|
|
isSortTab: itemTab.isSortTab,
|
|
name: itemTab.name,
|
|
description: itemTab.description,
|
|
tableName: itemTab.tableName,
|
|
sortOrderColumnName: itemTab.sortOrderColumnName, // order column
|
|
sortYesNoColumnName: itemTab.sortYesNoColumnName // included column
|
|
})
|
|
}
|
|
// TODO: Add support to isAdvancedTab and isHasTree
|
|
return !itemTab.isTranslationTab
|
|
}).map((tabItem, index, list) => {
|
|
// let tab = tabItem
|
|
const tab = {
|
|
...tabItem,
|
|
containerUuid: tabItem.uuid,
|
|
parentUuid: windowUuid,
|
|
windowUuid,
|
|
tabGroup: tabItem.fieldGroup,
|
|
firstTabUuid,
|
|
// relations
|
|
isParentTab: Boolean(firstTabTableName === tabItem.tableName),
|
|
// app properties
|
|
isAssociatedTabSequence: false, // show modal with order tab
|
|
isShowedRecordNavigation: !(tabItem.isSingleRow),
|
|
isLoadFieldsList: false,
|
|
index // this index is not related to the index in which the tabs are displayed
|
|
}
|
|
delete tab.processesList
|
|
|
|
// action is dispatch used in vuex
|
|
let actions = []
|
|
actions.push({
|
|
// action to set default values and enable fields not isUpdateable
|
|
name: language.t('window.newRecord'),
|
|
processName: language.t('window.newRecord'),
|
|
type: 'dataAction',
|
|
action: 'setDefaultValues',
|
|
uuidParent: windowUuid,
|
|
disabled: !tab.isInsertRecord || tab.isReadOnly
|
|
}, {
|
|
// action to delete record selected
|
|
name: language.t('window.deleteRecord'),
|
|
processName: language.t('window.deleteRecord'),
|
|
type: 'dataAction',
|
|
action: 'deleteEntity',
|
|
uuidParent: windowUuid,
|
|
disabled: tab.isReadOnly
|
|
}, {
|
|
// action to undo create, update, delete record
|
|
name: language.t('data.undo'),
|
|
processName: language.t('data.undo'),
|
|
type: 'dataAction',
|
|
action: 'undoModifyData',
|
|
uuidParent: windowUuid,
|
|
disabled: false
|
|
}, {
|
|
name: language.t('data.lockRecord'),
|
|
processName: language.t('data.lockRecord'),
|
|
type: 'dataAction',
|
|
action: 'lockRecord',
|
|
disabled: false,
|
|
hidden: true,
|
|
tableName: '',
|
|
recordId: null
|
|
}, {
|
|
name: language.t('data.unlockRecord'),
|
|
processName: language.t('data.unlockRecord'),
|
|
type: 'dataAction',
|
|
action: 'unlockRecord',
|
|
disabled: false,
|
|
hidden: true,
|
|
tableName: '',
|
|
recordId: null
|
|
})
|
|
|
|
if (tab.isSortTab) {
|
|
const tabParent = list.find(itemTab => itemTab.tableName === tab.tableName && !itemTab.isSortTab)
|
|
if (tabParent) {
|
|
tab.tabAssociatedUuid = tabParent.uuid // tab source uuid
|
|
tab.tabAssociatedName = tabParent.name // tab source name
|
|
}
|
|
} else {
|
|
// add tabs sequence associated as process in tab source
|
|
let orderTabs = tabsSequence.filter(itemTab => itemTab.tableName === tab.tableName)
|
|
if (orderTabs.length) {
|
|
orderTabs = orderTabs.map(itemTab => {
|
|
return {
|
|
...itemTab,
|
|
// appication attributes
|
|
tabAssociatedUuid: tab.uuid, // tab source
|
|
tabAssociatedName: tab.name, // tab source
|
|
action: 'orderSequence',
|
|
panelType: 'window',
|
|
type: 'application'
|
|
}
|
|
})
|
|
actions = actions.concat(orderTabs)
|
|
tab.isAssociatedTabSequence = true
|
|
tab.tabsOrder = orderTabs
|
|
}
|
|
}
|
|
|
|
// get processess associated in tab
|
|
if (!isEmptyValue(tabItem.processes)) {
|
|
const processList = tabItem.processes.map(processItem => {
|
|
// TODO: No list of parameters
|
|
// add process associated in vuex store
|
|
// dispatch('addProcessAssociated', {
|
|
// processToGenerate: processItem,
|
|
// containerUuidAssociated: tabItem.uuid
|
|
// })
|
|
return {
|
|
id: processItem.id,
|
|
uuid: processItem.uuid,
|
|
name: processItem.name,
|
|
type: 'process',
|
|
panelType: 'process',
|
|
description: processItem.description,
|
|
help: processItem.help,
|
|
isReport: processItem.isReport,
|
|
isDirectPrint: processItem.isDirectPrint,
|
|
containerUuidAssociated: tabItem.uuid,
|
|
parentUuidAssociated: windowUuid,
|
|
panelTypeAssociated: 'window'
|
|
}
|
|
})
|
|
actions = actions.concat(processList)
|
|
}
|
|
// Add process menu
|
|
dispatch('setContextMenu', {
|
|
containerUuid: tab.uuid,
|
|
actions
|
|
})
|
|
|
|
if (tab.isParentTab) {
|
|
tab.tabParentIndex = tabParentIndex
|
|
tabParentIndex++
|
|
tabsListParent.push(tab)
|
|
return tab
|
|
}
|
|
if (!tab.isSortTab) {
|
|
tab.tabChildrenIndex = tabChildrenIndex
|
|
tabChildrenIndex++
|
|
tabsListChildren.push(tab)
|
|
}
|
|
return tab
|
|
})
|
|
|
|
const newWindow = {
|
|
...responseWindow,
|
|
tabsList: tabs,
|
|
currentTab: tabsListParent[0],
|
|
tabsListParent,
|
|
tabsListChildren,
|
|
// app attributes
|
|
currentTabUuid: tabsListParent[0].uuid,
|
|
firstTab: tabsListParent[0],
|
|
firstTabUuid,
|
|
windowIndex: state.windowIndex + 1,
|
|
// App properties
|
|
isShowedTabsChildren: Boolean(tabsListChildren.length),
|
|
isShowedRecordNavigation: undefined,
|
|
isShowedAdvancedQuery: false
|
|
}
|
|
commit('addWindow', newWindow)
|
|
return newWindow
|
|
})
|
|
.catch(error => {
|
|
router.push({
|
|
path: '/dashboard'
|
|
}, () => {})
|
|
dispatch('tagsView/delView', routeToDelete)
|
|
showMessage({
|
|
message: language.t('login.unexpectedError'),
|
|
type: 'error'
|
|
})
|
|
console.warn(`Dictionary Window (State Window) - Error ${error.code}: ${error.message}.`)
|
|
})
|
|
},
|
|
getFieldsFromTab({ dispatch, getters }, {
|
|
parentUuid,
|
|
containerUuid,
|
|
// tabId,
|
|
panelType = 'window',
|
|
panelMetadata: tabMetadata = {},
|
|
isAdvancedQuery = false
|
|
}) {
|
|
return new Promise(resolve => {
|
|
if (isEmptyValue(tabMetadata)) {
|
|
tabMetadata = getters.getTab(parentUuid, containerUuid)
|
|
}
|
|
|
|
const additionalAttributes = {
|
|
parentUuid,
|
|
containerUuid,
|
|
isShowedFromUser: true,
|
|
panelType,
|
|
//
|
|
tableName: tabMetadata.tableName, // @deprecated
|
|
tabTableName: tabMetadata.tableName,
|
|
tabQuery: tabMetadata.query,
|
|
tabWhereClause: tabMetadata.whereClause,
|
|
//
|
|
isReadOnlyFromForm: false,
|
|
isAdvancedQuery,
|
|
isEvaluateValueChanges: !isAdvancedQuery
|
|
}
|
|
|
|
let isWithUuidField = false // indicates it contains the uuid field
|
|
let fieldLinkColumnName
|
|
|
|
// Convert and add to app attributes
|
|
const fieldsList = tabMetadata.fields.map((fieldItem, index) => {
|
|
fieldItem = generateField({
|
|
fieldToGenerate: fieldItem,
|
|
moreAttributes: {
|
|
...additionalAttributes,
|
|
fieldsListIndex: index
|
|
}
|
|
})
|
|
|
|
if (!isWithUuidField && fieldItem.columnName === 'UUID') {
|
|
isWithUuidField = true
|
|
}
|
|
|
|
if (fieldItem.isParent) {
|
|
fieldLinkColumnName = fieldItem.columnName
|
|
}
|
|
|
|
return fieldItem
|
|
})
|
|
|
|
let isTabsChildren = false
|
|
if (!isAdvancedQuery) {
|
|
const window = getters.getWindow(parentUuid)
|
|
isTabsChildren = Boolean(window.tabsListChildren.length)
|
|
}
|
|
|
|
if (!isWithUuidField) {
|
|
const fieldUuid = getFieldTemplate({
|
|
...additionalAttributes,
|
|
isShowedFromUser: false,
|
|
name: 'UUID',
|
|
columnName: 'UUID',
|
|
componentPath: 'FieldText'
|
|
})
|
|
fieldsList.push(fieldUuid)
|
|
}
|
|
|
|
// panel for save on store
|
|
const panel = {
|
|
...tabMetadata,
|
|
containerUuid,
|
|
isAdvancedQuery,
|
|
fieldLinkColumnName,
|
|
fieldsList,
|
|
panelType,
|
|
// app attributes
|
|
isLoadFieldsList: true,
|
|
isShowedTotals: false,
|
|
isTabsChildren // to delete records assiciated
|
|
}
|
|
|
|
dispatch('addPanel', panel)
|
|
resolve(panel)
|
|
|
|
dispatch('changeTabAttribute', {
|
|
tab: tabMetadata,
|
|
// replace if is 'table_'
|
|
parentUuid,
|
|
containerUuid,
|
|
attributeName: 'isLoadFieldsList',
|
|
attributeValue: true
|
|
})
|
|
})
|
|
},
|
|
setCurrentTab({ commit, getters }, {
|
|
parentUuid,
|
|
containerUuid,
|
|
window,
|
|
tab
|
|
}) {
|
|
if (isEmptyValue(window)) {
|
|
window = getters.getWindow(parentUuid)
|
|
}
|
|
if (isEmptyValue(tab)) {
|
|
tab = window.tabsList.find(itemTab => itemTab.uuid === containerUuid)
|
|
}
|
|
|
|
commit('setCurrentTab', {
|
|
window,
|
|
tab
|
|
})
|
|
},
|
|
changeWindowAttribute({ commit, getters }, {
|
|
parentUuid,
|
|
window,
|
|
attributeName,
|
|
attributeNameControl,
|
|
attributeValue
|
|
}) {
|
|
if (isEmptyValue(window)) {
|
|
window = getters.getWindow(parentUuid)
|
|
}
|
|
|
|
commit('changeWindowAttribute', {
|
|
parentUuid,
|
|
window,
|
|
attributeName,
|
|
attributeNameControl,
|
|
attributeValue
|
|
})
|
|
},
|
|
changeTabAttribute({ commit, getters }, {
|
|
parentUuid,
|
|
containerUuid,
|
|
tab,
|
|
attributeName,
|
|
attributeNameControl,
|
|
attributeValue
|
|
}) {
|
|
if (isEmptyValue(tab)) {
|
|
tab = getters.getTab(parentUuid, containerUuid)
|
|
}
|
|
commit('changeTabAttribute', {
|
|
tab,
|
|
attributeName,
|
|
attributeValue,
|
|
attributeNameControl
|
|
})
|
|
}
|
|
},
|
|
getters: {
|
|
getWindow: (state) => (windowUuid) => {
|
|
return state.window.find(
|
|
item => item.uuid === windowUuid
|
|
)
|
|
},
|
|
getIsShowedRecordNavigation: (state, getters) => (windowUuid) => {
|
|
const window = getters.getWindow(windowUuid)
|
|
if (window) {
|
|
return window.isShowedRecordNavigation
|
|
}
|
|
return window
|
|
},
|
|
getPanelRight: (state) => {
|
|
return state.panelRight
|
|
},
|
|
getTab: (state, getters) => (windowUuid, tabUuid) => {
|
|
const window = getters.getWindow(windowUuid)
|
|
if (window) {
|
|
return window.tabsList.find(tabItem => {
|
|
return tabItem.uuid === tabUuid
|
|
})
|
|
}
|
|
return window
|
|
},
|
|
getCurrentTab: (state, getters) => (windowUuid) => {
|
|
const window = getters.getWindow(windowUuid)
|
|
if (window) {
|
|
return window.tabsList.find(tabItem => {
|
|
return tabItem.uuid === window.currentTabUuid
|
|
})
|
|
}
|
|
return {
|
|
isInsertRecord: false
|
|
}
|
|
},
|
|
getTableNameFromTab: (state, getters) => (windowUuid, tabUuid) => {
|
|
return getters.getTab(windowUuid, tabUuid).tableName
|
|
}
|
|
}
|
|
}
|
|
|
|
export default window
|