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

414 lines
12 KiB
JavaScript

// A simple class for make easy lookup for dynamic forms from ADempiere Meta-Data
// note that it can be used for create meta-data for lookups
// Field component: this component is created dinamically from meta-data and can be used for
// many form incluyed Window/Tab/Fields, Process and Smart Browsers
// The aproach for this file is allows define field type manual and allows get metadata from server
// Exists many attributes fro handle behavior of field, the follow is a example:
// General:
// - columnName:
// - name:
// - help
// - inTable:
// - isAdvancedQuery:
// - isMandatory:
// - isMandatoryFromLogic
// - isReadOnly:
// - isDisplayed:
// - isShowedFromUser
// - isActive:
// - isSelectCreated:
// - isAlwaysUpdateable:
// - parentUuid:
// - containerUuid:
// - value:
// Lookup:
// - query:
// - directQuery:
// - tableName:
// Date and Time:
// - isRange
// - vFormat
// - valueTo
// - valueMax
// - valueMin
// Number:
// - isRange
// - valueTo
// - valueMax
// - valueMin
// Text:
// - isEncrypted
// - fieldLength
// Select:
// - isSelectCreated (created from ui for multi-selection)
// - query
// - directQuery
// - tableName
// - displayColumn
// - defaultValue
import { TEXT, TABLE_DIRECT } from '@/utils/ADempiere/references'
import { evalutateTypeField } from '@/utils/ADempiere/dictionaryUtils'
import { isEmptyValue } from '@/utils/ADempiere/valueUtils'
import evaluator, { getContext, getParentFields } from '@/utils/ADempiere/contextUtils'
import FIELDS_DISPLAY_SIZES, { DEFAULT_SIZE } from '@/components/ADempiere/Field/fieldSize'
import store from '@/store'
// Create a Field from UUID based on server meta-data
export function createFieldFromDictionary({
containerUuid,
fieldUuid,
columnUuid,
elementUuid,
elementColumnName,
tableName,
columnName,
overwriteDefinition
}) {
let field
if (fieldUuid) {
field = store.getters.getFieldFromUuid(fieldUuid)
} else if (columnUuid) {
field = store.getters.getFieldFromColumnUuid(columnUuid)
} else if (elementUuid) {
field = store.getters.getFieldFromElementUuid(elementUuid)
} if (elementColumnName) {
field = store.getters.getFieldFromElementColumnName(elementColumnName)
} else if (tableName && columnName) {
field = store.getters.getFieldFromElementColumnName({
tableName,
columnName
})
}
if (!isEmptyValue(field)) {
return getFactoryFromField({ containerUuid, field })
}
return new Promise(resolve => {
store.dispatch('getFieldFromServer', {
fieldUuid,
columnUuid,
elementUuid,
elementColumnName,
tableName,
columnName
})
.then(response => {
resolve(getFactoryFromField({
containerUuid,
field: response,
overwriteDefinition
}))
}).catch(error => {
console.warn(`LookupFactory: Get Field From Server (State) - Error ${error.code}: ${error.message}.`)
})
})
}
// Convert field getted from server to factory
function getFactoryFromField({
containerUuid,
field,
overwriteDefinition
}) {
const fieldDefinition = {
displayType: field.displayType,
tableName: field.reference.tableName,
directQuery: field.directQuery,
query: field.reference.query,
keyColumnName: field.reference.keyColumnName,
validationCode: field.reference.validationCode,
windowsList: field.reference.windowsList,
id: field.id,
uuid: field.uuid,
name: field.name,
description: field.description,
help: field.help,
fieldGroup: field.fieldGroup,
isFieldOnly: field.isFieldOnly,
isRange: field.isRange,
isSameLine: field.isSameLine,
sequence: field.sequence,
seqNoGrid: field.seqNoGrid,
isIdentifier: field.isIdentifier,
isKey: field.isKey,
isSelectionColumn: field.isSelectionColumn,
isUpdateable: field.isUpdateable,
formatPattern: field.formatPattern,
vFormat: field.vFormat,
defaultValue: field.defaultValue,
defaultValueTo: field.defaultValueTo,
valueMin: field.valueMin,
valueMax: field.valueMax,
isActive: field.isActive,
isMandatory: field.isMandatory,
isReadOnly: field.isReadOnly,
isDisplayedFromLogic: field.isDisplayedFromLogic,
isReadOnlyFromLogic: field.isReadOnlyFromLogic,
isMandatoryFromLogic: field.isMandatoryFromLogic,
callout: field.callout,
isQueryCriteria: field.isQueryCriteria,
displayLogic: field.displayLogic,
mandatoryLogic: field.mandatoryLogic,
readOnlyLogic: field.readOnlyLogic,
parentFieldsList: field.parentFieldsList,
dependentFieldsList: field.dependentFieldsList,
contextInfo: field.contextInfo
}
// Overwrite definition
if (!isEmptyValue(overwriteDefinition)) {
if (!isEmptyValue(overwriteDefinition.isQueryCriteria)) {
fieldDefinition.isQueryCriteria = overwriteDefinition.isQueryCriteria
}
if (!isEmptyValue(overwriteDefinition.isMandatory)) {
fieldDefinition.isMandatory = overwriteDefinition.isMandatory
}
if (!isEmptyValue(overwriteDefinition.isReadOnly)) {
fieldDefinition.isReadOnly = overwriteDefinition.isReadOnly
}
if (!isEmptyValue(overwriteDefinition.isSelectionColumn)) {
fieldDefinition.isSelectionColumn = overwriteDefinition.isSelectionColumn
}
if (!isEmptyValue(overwriteDefinition.isUpdateable)) {
fieldDefinition.isUpdateable = overwriteDefinition.isUpdateable
}
if (!isEmptyValue(overwriteDefinition.isFieldOnly)) {
fieldDefinition.isFieldOnly = overwriteDefinition.isFieldOnly
}
if (!isEmptyValue(overwriteDefinition.isRange)) {
fieldDefinition.isRange = overwriteDefinition.isRange
}
if (!isEmptyValue(overwriteDefinition.displayLogic)) {
fieldDefinition.displayLogic = overwriteDefinition.displayLogic
}
if (!isEmptyValue(overwriteDefinition.mandatoryLogic)) {
fieldDefinition.mandatoryLogic = overwriteDefinition.mandatoryLogic
}
if (!isEmptyValue(overwriteDefinition.readOnlyLogic)) {
fieldDefinition.readOnlyLogic = overwriteDefinition.readOnlyLogic
}
if (!isEmptyValue(overwriteDefinition.formatPattern)) {
fieldDefinition.formatPattern = overwriteDefinition.formatPattern
}
if (!isEmptyValue(overwriteDefinition.vFormat)) {
fieldDefinition.vFormat = overwriteDefinition.vFormat
}
if (!isEmptyValue(overwriteDefinition.defaultValue)) {
fieldDefinition.defaultValue = overwriteDefinition.defaultValue
}
if (!isEmptyValue(overwriteDefinition.defaultValueTo)) {
fieldDefinition.defaultValueTo = overwriteDefinition.defaultValueTo
}
if (!isEmptyValue(overwriteDefinition.displayType)) {
fieldDefinition.displayType = overwriteDefinition.displayType
}
if (!isEmptyValue(overwriteDefinition.size)) {
fieldDefinition.size = overwriteDefinition.size
}
}
// Convert it
return createFieldFromDefinition({
containerUuid: containerUuid,
columnName: field.columnName,
definition: fieldDefinition
})
}
// Create a field, it assumed that you define all behavior from source code
export function createFieldFromDefinition({
parentUuid,
containerUuid,
columnName,
definition = {}
}) {
if (!isEmptyValue(definition)) {
if (isEmptyValue(definition.displayType)) {
definition.displayType = TEXT.id
} else if (definition.displayType === TABLE_DIRECT.id &&
isEmptyValue(definition.tableName) &&
columnName.indexOf('_ID') > 0) {
definition.tableName = columnName.replace('_ID', '')
}
if (isEmptyValue(definition.isActive)) {
definition.isActive = true
}
if (isEmptyValue(definition.isDisplayed)) {
definition.isDisplayed = true
}
if (isEmptyValue(definition.isDisplayedFromLogic)) {
definition.isDisplayedFromLogic = true
}
if (isEmptyValue(definition.isReadOnly)) {
definition.isReadOnly = false
}
if (isEmptyValue(definition.isMandatory)) {
definition.isMandatory = false
}
if (isEmptyValue(definition.sequence)) {
definition.sequence = 0
if (definition.isDisplayed) {
definition.sequence = 10
}
}
let reference = {}
if (!isEmptyValue(definition.directQuery) || !isEmptyValue(definition.query)) {
reference = {
directQuery: definition.directQuery,
query: definition.query,
tableName: definition.tableName || undefined,
keyColumnName: definition.keyColumnName || undefined,
validationCode: definition.validationCode || undefined,
windowsList: definition.windowsList || []
}
delete definition.directQuery
delete definition.query
delete definition.tableName
delete definition.validationCode
delete definition.windowsList
}
definition.reference = reference
}
return getFieldTemplate({
...definition,
isShowedFromUser: true,
isCustomField: true,
parentUuid,
containerUuid,
columnName
})
}
// Default template for injected fields
export function getFieldTemplate(overwriteDefinition) {
let displayType = 10
if (!isEmptyValue(overwriteDefinition.displayType)) {
displayType = overwriteDefinition.displayType
}
const componentReference = evalutateTypeField(displayType)
const referenceType = componentReference.alias[0]
// set size from displayed, max 24
let size = DEFAULT_SIZE.size
if (!isEmptyValue(overwriteDefinition.size)) {
size = overwriteDefinition.size
delete overwriteDefinition.size
if (typeof size === 'number') {
size = {
xs: size,
sm: size,
md: size,
lg: size,
xl: size
}
}
} else {
const sizeComponent = FIELDS_DISPLAY_SIZES.find(item => {
return item.type === componentReference.type
})
if (!isEmptyValue(sizeComponent)) {
size = sizeComponent.size
}
}
const sizeFieldFromType = {
type: referenceType,
size
}
const fieldTemplateMetadata = {
id: 0,
uuid: '',
name: '',
description: '',
help: '',
columnName: '',
fieldGroup: {
name: '',
fieldGroupType: ''
},
displayType,
componentPath: componentReference.type,
referenceType,
isFieldOnly: false,
isRange: false,
isSameLine: false,
sequence: 0,
seqNoGrid: 0,
isIdentifier: 0,
isKey: false,
isSelectionColumn: false,
isUpdateable: true,
formatPattern: undefined,
VFormat: undefined,
value: undefined,
valueTo: undefined,
defaultValue: undefined,
parsedDefaultValue: undefined,
defaultValueTo: undefined,
parsedDefaultValueTo: undefined,
valueMin: undefined,
valueMax: undefined,
//
isDisplayed: false,
isActive: true,
isMandatory: false,
isReadOnly: false,
isDisplayedFromLogic: undefined,
isReadOnlyFromLogic: undefined,
isMandatoryFromLogic: undefined,
// browser attributes
callout: undefined,
isQueryCriteria: false,
displayLogic: undefined,
mandatoryLogic: undefined,
readOnlyLogic: undefined,
parentFieldsList: undefined,
dependentFieldsList: [],
reference: {
tableName: '',
keyColumnName: '',
query: '',
directQuery: '',
validationCode: '',
windowsList: []
},
contextInfo: undefined,
isShowedFromUser: false,
isFixedTableColumn: false,
sizeFieldFromType,
...overwriteDefinition
}
// get parsed parent fields list
fieldTemplateMetadata.parentFieldsList = getParentFields(fieldTemplateMetadata)
// evaluate logics
const setEvaluateLogics = {
parentUuid: fieldTemplateMetadata.parentUuid,
containerUuid: fieldTemplateMetadata.containerUuid,
context: getContext
}
if (!isEmptyValue(fieldTemplateMetadata.displayLogic)) {
fieldTemplateMetadata.isDisplayedFromLogic = evaluator.evaluateLogic({
...setEvaluateLogics,
logic: fieldTemplateMetadata.displayLogic
})
}
if (!isEmptyValue(fieldTemplateMetadata.mandatoryLogic)) {
fieldTemplateMetadata.isMandatoryFromLogic = evaluator.evaluateLogic({
...setEvaluateLogics,
logic: fieldTemplateMetadata.mandatoryLogic
})
}
if (!isEmptyValue(fieldTemplateMetadata.readOnlyLogic)) {
fieldTemplateMetadata.isReadOnlyFromLogic = evaluator.evaluateLogic({
...setEvaluateLogics,
logic: fieldTemplateMetadata.readOnlyLogic
})
}
return fieldTemplateMetadata
}