1
0
mirror of https://github.com/PanJiaChen/vue-element-admin.git synced 2025-08-13 07:04:21 +08:00

240 lines
6.0 KiB
JavaScript

import { isEmptyValue } from '@/utils/ADempiere/valueUtils'
import evaluator from '@/utils/ADempiere/evaluator'
import store from '@/store'
export default evaluator
// get context state from vuex store
export const getContext = ({
parentUuid,
containerUuid,
columnName
}) => {
return store.getters.getContext({
parentUuid,
containerUuid,
columnName
})
}
/**
* Extracts the associated fields from the logics or default values
* @param {string} displayLogic
* @param {string} mandatoryLogic
* @param {string} readOnlyLogic
* @param {object} reference
* @param {string} defaultValue
* @returns {array} List column name of parent fields
*/
export function getParentFields({
displayLogic,
mandatoryLogic,
readOnlyLogic,
reference,
defaultValue
}) {
const parentFields = Array.from(new Set([
// For Display logic
...evaluator.parseDepends(displayLogic),
// For Mandatory Logic
...evaluator.parseDepends(mandatoryLogic),
// For Read Only Logic
...evaluator.parseDepends(readOnlyLogic),
// For Default Value
...evaluator.parseDepends(defaultValue)
]))
// Validate reference
if (!isEmptyValue(reference)) {
parentFields.push(...evaluator.parseDepends(reference.validationCode))
}
return parentFields
}
/**
* Parse Context String
* @param {string} value: (REQUIRED) String to parsing
* @param {string} parentUuid: (REQUIRED from Window) UUID Window
* @param {string} containerUuid: (REQUIRED) UUID Tab, Process, SmartBrowser, Report and Form
* @param {string} columnName: (Optional if exists in value) Column name to search in context
* @param {boolean} isBooleanToString, convert boolean values to string ('Y' or 'N')
* @param {boolean} isSQL
* @param {boolean} isSOTrxMenu
*/
export function parseContext({
parentUuid,
containerUuid,
columnName,
value,
isSQL = false,
isBooleanToString = false,
isSOTrxMenu
}) {
let isError = false
const errorsList = []
value = String(value)
if (isEmptyValue(value)) {
return {
value: undefined,
isError: true,
errorsList: []
}
}
if (value.includes('@SQL=')) {
value = value.replace('@SQL=', '')
}
// const instances = value.length - value.replace('@', '').length
// if ((instances > 0) && (instances % 2) !== 0) { // could be an email address
// return value
// }
let token, contextInfo
let inString = value
let outString = ''
let firstIndexTag = inString.indexOf('@')
const convertBooleanToString = (booleanValue) => {
if (booleanValue) {
return 'Y'
}
return 'N'
}
while (firstIndexTag !== -1) {
outString = outString + inString.substring(0, firstIndexTag) // up to @
inString = inString.substring(firstIndexTag + 1, inString.length) // from first @
const secondIndexTag = inString.indexOf('@') // next @
// no exists second tag
if (secondIndexTag < 0) {
console.info(`No second tag: ${inString}`)
return {
value: undefined,
isError: true,
errorsList,
isSQL
}
}
token = inString.substring(0, secondIndexTag)
columnName = token
contextInfo = getContext({
parentUuid,
containerUuid,
columnName
}) // get context
if ((isBooleanToString || isSQL) && typeof contextInfo === 'boolean') {
contextInfo = convertBooleanToString(contextInfo)
}
if (isEmptyValue(contextInfo) &&
(token.startsWith('#') || token.startsWith('$'))) {
contextInfo = getContext({
columnName
}) // get global context
}
// menu attribute isEmptyValue isSOTrx
if (!isEmptyValue(isSOTrxMenu) && token === 'IsSOTrx' && isEmptyValue(contextInfo)) {
contextInfo = isSOTrxMenu
if (isBooleanToString || isSQL) {
contextInfo = convertBooleanToString(contextInfo)
}
}
if (contextInfo === undefined || contextInfo.length === 0) {
// console.info(`No Context for: ${token}`)
isError = true
errorsList.push(token)
} else {
if (['object', 'boolean'].includes(typeof contextInfo)) {
outString = contextInfo
} else {
outString = outString + contextInfo // replace context with Context
}
}
inString = inString.substring(secondIndexTag + 1, inString.length) // from second @
firstIndexTag = inString.indexOf('@')
}
if (!['object', 'boolean'].includes(typeof contextInfo)) {
outString = outString + inString // add the rest of the string
}
if (isSQL) {
return {
errorsList,
isError,
isSQL,
query: outString,
value: contextInfo
}
}
return {
errorsList,
isError,
isSQL,
value: outString
}
} // parseContext
/**
* Get Preference.
* <pre>
* 0) Current Setting
* 1) Window Preference
* 2) Global Preference
* 3) Login settings
* 4) Accounting settings
* </pre>
* @param {string} parentUuid UUID Window
* @param {string} containerUuid UUID Tab, Process, SmartBrowser, Report and Form
* @param {string} columnName (context) Entity to search
* @return preference value
*/
export function getPreference({
parentUuid,
containerUuid,
columnName
}) {
let retValue
if (isEmptyValue(columnName)) {
console.warn('Require Context ColumnName')
return retValue
}
// USER PREFERENCES
// View Preferences
if (parentUuid && containerUuid) {
retValue = getContext({
parentUuid: 'P' + parentUuid,
containerUuid,
columnName: columnName
})
if (!isEmptyValue(retValue)) {
return retValue
}
}
// Global Preferences
retValue = getContext({
columnName: 'P|' + columnName
})
if (!isEmptyValue(retValue)) {
return retValue
}
// SYSTEM PREFERENCES
// Login setting
// get # globals context only window
retValue = getContext({
columnName: '#' + columnName
})
if (!isEmptyValue(retValue)) {
return retValue
}
// Accounting setting
retValue = getContext({
columnName: '$' + columnName
})
return retValue
} // getPreference