1
0
mirror of https://github.com/PanJiaChen/vue-element-admin.git synced 2025-08-11 05:11:59 +08:00
2020-03-11 21:33:31 -04:00

1333 lines
44 KiB
JavaScript

// Vuex file for store all related to panel and fields
// Use it for handle events for changes and put context, also can be
// used for hadle isDisplayed logic, read only logic and mandatory logic
// The scope is use panel as storage of:
// - Window: Just need storage tab and fields
// - Process & Report: Always save a panel and parameters
// - Smart Browser: Can have a search panel, table panel and process panel
import { isEmptyValue, parsedValueComponent } from '@/utils/ADempiere/valueUtils'
import evaluator, { parseContext } from '@/utils/ADempiere/contextUtils'
import { showMessage } from '@/utils/ADempiere/notification'
import { assignedGroup, fieldIsDisplayed } from '@/utils/ADempiere/dictionaryUtils'
import router from '@/router'
import language from '@/lang'
const panel = {
state: {
panel: []
},
mutations: {
addPanel(state, payload) {
state.panel.push(payload)
},
changePanel(state, payload) {
payload.panel = payload.newPanel
},
changeFieldLogic(state, payload) {
if (payload.isDisplayedFromLogic !== undefined && payload.isDisplayedFromLogic !== null) {
payload.field.isDisplayedFromLogic = Boolean(payload.isDisplayedFromLogic)
}
payload.field.isMandatoryFromLogic = Boolean(payload.isMandatoryFromLogic)
payload.field.isReadOnlyFromLogic = Boolean(payload.isReadOnlyFromLogic)
payload.field.parsedDefaultValue = payload.parsedDefaultValue
},
dictionaryResetCache(state) {
state.panel = []
},
changeField(state, payload) {
payload.field = payload.newField
},
changeFieldValue(state, payload) {
payload.field.oldValue = payload.field.value
payload.field.value = payload.newValue
if (payload.isChangedOldValue) {
payload.field.oldValue = payload.newValue
}
payload.field.valueTo = payload.valueTo
payload.field.displayColumn = payload.displayColumn
},
changeFieldValueToNull(state, payload) {
payload.field.oldValue = payload.value
payload.field.value = payload.value
payload.field.valueTo = payload.value
payload.field.displayColumn = payload.value
}
},
actions: {
addPanel({ commit, dispatch, getters }, params) {
let keyColumn = ''
let selectionColumn = []
let identifierColumns = []
let count = 0
if (params.fieldList) {
params.fieldList.forEach(itemField => {
if (itemField.isKey) {
keyColumn = itemField.columnName
}
if (itemField.isSelectionColumn) {
selectionColumn.push(itemField.columnName)
}
if (itemField.isIdentifier) {
identifierColumns.push({
columnName: itemField.columnName,
identifierSequence: itemField.identifierSequence,
componentPath: itemField.componentPath
})
}
if (params.panelType === 'table' || params.isAdvancedQuery) {
itemField.isShowedFromUser = false
if (count < 2 && itemField.isSelectionColumn && itemField.sequence >= 10) {
itemField.isShowedFromUser = true
count++
}
} else {
if (['browser', 'process', 'report'].includes(params.panelType) ||
params.panelType === 'window' && params.isParentTab) {
dispatch('setContext', {
parentUuid: params.parentUuid,
containerUuid: params.uuid,
columnName: itemField.columnName,
value: itemField.value
})
}
}
})
let orderBy = 'sequence'
if ((params.panelType === 'window' && !params.isParentTab) || params.panelType === 'browser') {
orderBy = 'seqNoGrid'
}
params.fieldList = assignedGroup({
fieldsList: params.fieldList,
orderBy
})
}
params.keyColumn = keyColumn
if (params.isSortTab) {
const panelParent = getters.getPanel(params.tabAssociatedUuid)
selectionColumn = selectionColumn.concat(panelParent.selectionColumn)
identifierColumns = identifierColumns.concat(panelParent.identifierColumns)
params.fieldLinkColumnName = panelParent.fieldLinkColumnName
params.keyColumn = panelParent.keyColumn
}
params.selectionColumn = selectionColumn
params.identifierColumns = identifierColumns
.sort((itemA, itemB) => {
return itemA.identifierSequence - itemB.identifierSequence
})
params.recordUuid = null
// show/hidden optionals columns to table
params.isShowedTableOptionalColumns = false
commit('addPanel', params)
},
/**
* Used by components/fields/filterFields
*/
changeFieldShowedFromUser({ commit, dispatch, getters }, {
containerUuid,
isAdvancedQuery,
fieldsUser,
groupField
}) {
const panel = getters.getPanel(containerUuid, isAdvancedQuery)
const newPanel = panel
let isChangedDisplayedWithValue = false
newPanel.fieldList = panel.fieldList.map(itemField => {
const isShowedOriginal = itemField.isShowedFromUser
if (groupField === itemField.groupAssigned) {
itemField.isShowedFromUser = false
if (fieldsUser.includes(itemField.columnName)) {
itemField.isShowedFromUser = true
}
}
if (!isChangedDisplayedWithValue) {
// if isShowedFromUser was changed, and field has some value, the SmartBrowser
// or AdvancedQuery must send the parameters to update the search result
if ((isShowedOriginal !== itemField.isShowedFromUser && !isEmptyValue(itemField.value)) ||
(isAdvancedQuery && ['NULL', 'NOT_NULL'].includes(itemField.operator))) {
isChangedDisplayedWithValue = true
}
}
return itemField
})
commit('changePanel', {
panel,
newPanel
})
if (isChangedDisplayedWithValue) {
// Updated record result
if (panel.panelType === 'browser') {
dispatch('getBrowserSearch', {
containerUuid,
isClearSelection: true
})
} else if (panel.panelType === 'table' || panel.isAdvancedQuery) {
dispatch('getObjectListFromCriteria', {
parentUuid: panel.parentUuid,
containerUuid,
tableName: panel.tableName,
query: panel.query,
whereClause: panel.whereClause,
conditionsList: getters.getParametersToServer({
containerUuid,
isAdvancedQuery,
isEvaluateMandatory: false
})
})
.catch(error => {
console.warn(`Error getting Advanced Query (changeFieldShowedFromUser): ${error.message}. Code: ${error.code}.`)
})
}
}
},
/**
* Change some attribute boolean from fields in panel
* @param {string} containerUuid
* @param {string} fieldList
* @param {string} attribute
* @param {boolean} valueAttribute
* @param {array} fieldsIncludes fields to set valueAttribute
* @param {array} fieldsExcludes fields to dont change
*/
changeFieldAttributesBoolean({ commit, getters }, {
containerUuid,
isAdvancedQuery = false,
attribute,
valueAttribute,
fieldsIncludes = [],
fieldsExcludes = []
}) {
const panel = getters.getPanel(containerUuid, isAdvancedQuery)
const newPanel = panel
newPanel.fieldList = panel.fieldList.map(itemField => {
// not change exlude field
if (fieldsExcludes && fieldsExcludes.length && fieldsExcludes.includes(itemField.columnName)) {
return itemField
}
// if it field is included to change value
if (fieldsIncludes && fieldsIncludes.length && fieldsIncludes.includes(itemField.columnName)) {
itemField[attribute] = valueAttribute
return itemField
}
// changed current value by opposite set value
itemField[attribute] = !valueAttribute
return itemField
})
commit('changePanel', {
panel,
newPanel
})
},
/**
* @param {string} containerUuid
* @param {array} fieldsList
*/
showOnlyMandatoryColumns({ dispatch, getters }, {
containerUuid,
fieldsList = []
}) {
if (fieldsList.length <= 0) {
fieldsList = getters.getFieldsListFromPanel(containerUuid)
}
const fieldsIncludes = fieldsList.filter(fieldItem => {
const isMandatory = fieldItem.isMandatory || fieldItem.isMandatoryFromLogic
if (isMandatory) {
return true
}
}).map(fieldItem => {
return fieldItem.columnName
})
dispatch('changeFieldAttributesBoolean', {
containerUuid,
fieldsIncludes,
attribute: 'isShowedTableFromUser',
valueAttribute: true
})
},
/**
* @param {string} containerUuid
* @param {array} fieldList
*/
showAllAvailableColumns({ dispatch, getters }, {
containerUuid,
fieldsList = []
}) {
if (fieldsList.length <= 0) {
fieldsList = getters.getFieldsListFromPanel(containerUuid)
}
const fieldsIncludes = fieldsList.filter(fieldItem => {
const isDisplayed = fieldItem.isDisplayed && fieldItem.isDisplayedFromLogic && !fieldItem.isKey
// Verify for displayed and is active
return fieldItem.isActive && isDisplayed
}).map(fieldItem => {
return fieldItem.columnName
})
dispatch('changeFieldAttributesBoolean', {
containerUuid,
fieldsIncludes,
attribute: 'isShowedTableFromUser',
valueAttribute: true
})
},
/**
* Set default values to panel
* @param {string} parentUuid
* @param {string} containerUuid
* @param {string} panelType
* @param {boolean} isNewRecord
* @param {array} fieldList
* TODO: Evaluate if it is necessary to parse the default values
*/
resetPanelToNew({ commit, dispatch, getters }, {
parentUuid,
containerUuid,
panelType = 'window',
isNewRecord = false
}) {
return new Promise(resolve => {
const panel = getters.getPanel(containerUuid)
const defaultAttributes = getters.getParsedDefaultValues({
parentUuid,
containerUuid,
fieldsList: panel.fieldList
})
if (panelType === 'window' && isNewRecord) {
// redirect to create new record
const oldRoute = router.app._route
router.push({
name: oldRoute.name,
params: {
...oldRoute.params
},
query: {
...oldRoute.query,
action: 'create-new'
}
})
showMessage({
message: language.t('data.createNewRecord'),
type: 'info'
})
panel.fieldList.forEach(fieldToBlanck => {
commit('changeFieldValueToNull', {
field: fieldToBlanck,
value: undefined
})
})
if (panel.isTabsChildren) {
// delete records tabs children when change record uuid
dispatch('deleteRecordContainer', {
viewUuid: parentUuid,
withOut: [containerUuid],
isNew: true
})
}
}
dispatch('notifyPanelChange', {
parentUuid,
containerUuid,
panelType,
fieldList: panel.fieldList,
newValues: defaultAttributes,
isSendToServer: false,
// if isNewRecord active callouts, if window is closed no send callout
isSendCallout: isNewRecord,
isPrivateAccess: false
})
resolve(defaultAttributes)
})
},
/**
* Changed panel when receive or reset panel to new record
* @param {string} parentUuid
* @param {string} containerUuid
* @param {object} fieldList, field list of panel
* @param {object} newValues, values to set in panel
* @param {boolean} isSendToServer, indicate if changes send to server
*/
notifyPanelChange({ dispatch, getters, rootGetters }, {
parentUuid,
containerUuid,
newValues = {},
isSendToServer = true,
isShowedField = false,
panelType = 'window',
withOutColumnNames = [],
isSendCallout = true,
isAdvancedQuery = false,
isPrivateAccess = false,
fieldList = [],
isChangeFromCallout = false
}) {
if (!fieldList.length) {
fieldList = getters.getFieldsListFromPanel(containerUuid, isAdvancedQuery)
}
let fieldsShowed = []
fieldList.forEach(actionField => {
if (actionField.isShowedFromUser) {
fieldsShowed.push(actionField.columnName)
}
// Evaluate with hasOwnProperty if exits this value
if (!newValues.hasOwnProperty(actionField.columnName)) {
return
}
if (isChangeFromCallout && actionField.componentPath === 'FieldSelect' && !newValues.hasOwnProperty(`DisplayColumn_${actionField.columnName}`)) {
const lookup = getters.getLookupItem({
parentUuid: parentUuid,
containerUuid: containerUuid,
directQuery: actionField.reference.directQuery,
tableName: actionField.reference.tableName,
value: newValues[actionField.columnName]
})
if (isEmptyValue(lookup)) {
dispatch('getLookupItemFromServer', {
parentUuid: parentUuid,
containerUuid: containerUuid,
tableName: actionField.reference.tableName,
directQuery: actionField.reference.parsedDirectQuery,
value: newValues[actionField.columnName]
})
.then(response => {
if (!isEmptyValue(response)) {
dispatch('notifyFieldChange', {
isSendToServer,
isSendCallout,
isAdvancedQuery,
panelType,
parentUuid,
containerUuid,
columnName: actionField.columnName,
displayColumn: response.label,
newValue: newValues[actionField.columnName],
valueTo: newValues[`${actionField.columnName}_To`],
fieldList,
field: actionField,
withOutColumnNames,
isChangedOldValue: true // defines if set oldValue with newValue instead of current value
})
}
})
} else {
newValues[`DisplayColumn_${actionField.columnName}`] = lookup.label
}
}
dispatch('notifyFieldChange', {
isSendToServer,
isSendCallout,
isAdvancedQuery,
panelType,
parentUuid,
containerUuid,
columnName: actionField.columnName,
displayColumn: newValues[`DisplayColumn_${actionField.columnName}`],
newValue: newValues[actionField.columnName],
valueTo: newValues[`${actionField.columnName}_To`],
fieldList,
field: actionField,
withOutColumnNames,
isChangedOldValue: true // defines if set oldValue with newValue instead of current value
})
})
// show fields in query
if (isShowedField && !isEmptyValue(newValues)) {
// join column names without duplicating it
fieldsShowed = Array.from(new Set([
...fieldsShowed,
...Object.keys(newValues)
]))
dispatch('changeFieldAttributesBoolean', {
containerUuid,
attribute: 'isShowedFromUser',
valueAttribute: true,
fieldsIncludes: fieldsShowed
})
}
if (panelType === 'window') {
dispatch('setIsloadContext', {
containerUuid
})
if (isPrivateAccess) {
const tableName = rootGetters.getTableNameFromTab(parentUuid, containerUuid)
// TODO: Add current id and new id to comparison
if (!isEmptyValue(newValues[`${tableName}_ID`])) {
dispatch('getPrivateAccessFromServer', {
tableName,
recordId: newValues[`${tableName}_ID`],
userUuid: rootGetters['user/getUserUuid']
})
}
}
}
},
/**
* TODO: Add fieldAttributes
* @param {string} parentUuid
* @param {string} containerUuid
* @param {string} panelType
* @param {boolean} isAdvancedQuery
* @param {string} columnName
* @param {mixin} newValue
* @param {mixin} valueTo
* @param {string} displayColumn, only used for lookup
* @param {boolean} isSendToServer
* @param {boolean} isSendCallout
* @param {boolean} isChangedOldValue
* @param {array} withOutColumnNames
*/
notifyFieldChange({ commit, dispatch, getters }, {
parentUuid, containerUuid, panelType = 'window', isAdvancedQuery = false,
columnName, newValue, valueTo, displayColumn,
isSendToServer = true, isSendCallout = true,
isChangedOldValue = false, withOutColumnNames = []
}) {
const panel = getters.getPanel(containerUuid, isAdvancedQuery)
const { fieldList } = panel
// get field
const field = fieldList.find(fieldItem => fieldItem.columnName === columnName)
if (!(panelType === 'table' || isAdvancedQuery)) {
if (!['IN', 'NOT_IN'].includes(field.operator)) {
newValue = parsedValueComponent({
fieldType: field.componentPath,
referenceType: field.referenceType,
value: newValue
})
if (field.isRange) {
valueTo = parsedValueComponent({
fieldType: field.componentPath,
referenceType: field.referenceType,
value: valueTo
})
}
}
// Call context management
dispatch('setContext', {
parentUuid,
containerUuid,
columnName,
value: newValue
})
// request context info field
if ((!isEmptyValue(field.value) || !isEmptyValue(newValue)) && !isEmptyValue(field.contextInfo) && !isEmptyValue(field.contextInfo.sqlStatement)) {
var isSQL = false
var sqlStatement = field.contextInfo.sqlStatement
if (sqlStatement.includes('@')) {
if (sqlStatement.includes('@SQL=')) {
isSQL = true
}
sqlStatement = parseContext({
parentUuid,
containerUuid,
columnName,
value: sqlStatement,
isSQL: isSQL
}).value
if (isSQL && String(sqlStatement) === '[object Object]') {
sqlStatement = sqlStatement.query
}
}
dispatch('getContextInfoValueFromServer', {
parentUuid,
containerUuid,
contextInfoUuid: field.contextInfo.uuid,
columnName: columnName,
sqlStatement: sqlStatement
})
.then(response => {
if (!isEmptyValue(response) && !isEmptyValue(response.messageText)) {
field.contextInfo.isActive = true
field.contextInfo.messageText.msgText = response.messageText
field.contextInfo.messageText.msgTip = response.messageTip
}
})
}
// Change Dependents
dispatch('changeDependentFieldsList', {
parentUuid,
containerUuid,
dependentFieldsList: field.dependentFieldsList,
fieldsList: fieldList,
isSendToServer
})
}
// the field has not changed, then the action is broken
if (newValue === field.value && isEmptyValue(displayColumn) && !isAdvancedQuery) {
return
}
commit('changeFieldValue', {
field,
newValue,
valueTo,
displayColumn,
isChangedOldValue
})
// request callouts
if (field.panelType === 'window' && isSendCallout) {
if (!withOutColumnNames.includes(field.columnName) && !isEmptyValue(newValue) && !isEmptyValue(field.callout)) {
withOutColumnNames.push(field.columnName)
dispatch('getCallout', {
parentUuid,
containerUuid,
tableName: panel.tableName,
columnName: field.columnName,
callout: field.callout,
value: newValue,
oldValue: field.oldValue,
withOutColumnNames
})
}
}
if (isSendToServer) {
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'
}
})
}
commit('changeField', {
field,
newField: {
...field,
oldOperator: field.operator
}
})
dispatch('getObjectListFromCriteria', {
parentUuid,
containerUuid,
tableName: panel.tableName,
query: panel.query,
whereClause: panel.whereClause,
conditionsList: getters.getParametersToServer({
containerUuid,
isAdvancedQuery: true,
isEvaluateMandatory: false
})
})
.then(response => {
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,
isClearSelection: true
})
}
if (field.panelType === 'window' && fieldIsDisplayed(field)) {
const uuid = getters.getUuid(containerUuid)
if (isEmptyValue(uuid)) {
dispatch('createNewEntity', {
parentUuid,
containerUuid
})
.then(() => {
// change old value so that it is not send in the next update
commit('changeFieldValue', {
field,
newValue,
valueTo,
displayColumn,
isChangedOldValue: true
})
})
.catch(error => {
showMessage({
message: error.message,
type: 'error'
})
console.warn(`Create Entity Error ${error.code}: ${error.message}.`)
})
} else {
dispatch('updateCurrentEntity', {
containerUuid,
recordUuid: uuid
})
.then(response => {
// change old value so that it is not send in the next update
showMessage({
message: language.t('notifications.updateFields') + field.name,
type: 'success'
})
commit('changeFieldValue', {
field,
newValue,
valueTo,
displayColumn,
isChangedOldValue: true
})
// change value in table
dispatch('notifyRowTableChange', {
containerUuid,
row: response,
isEdit: false,
isParent: true
})
})
}
}
} else {
const fieldsEmpty = getters.getFieldListEmptyMandatory({
containerUuid,
fieldsList: fieldList
})
showMessage({
message: language.t('notifications.mandatoryFieldMissing') + fieldsEmpty,
type: 'info'
})
}
}
},
changeDependentFieldsList({ commit, dispatch, getters }, {
parentUuid,
containerUuid,
dependentFieldsList = [],
fieldsList = [],
isSendToServer
}) {
if (isEmptyValue(dependentFieldsList)) {
// breaks if there are no field dependencies
return
}
if (!fieldsList.length) {
fieldsList = getters.getFieldsListFromPanel(containerUuid)
}
const dependentsList = fieldsList.filter(fieldItem => {
return dependentFieldsList.includes(fieldItem.columnName)
})
// Iterate for change logic
dependentsList.forEach(fieldDependent => {
// isDisplayed Logic
let isDisplayedFromLogic, isMandatoryFromLogic, isReadOnlyFromLogic, defaultValue
if (fieldDependent.displayLogic.trim() !== '') {
isDisplayedFromLogic = evaluator.evaluateLogic({
context: getters,
parentUuid,
containerUuid,
logic: fieldDependent.displayLogic,
type: 'displayed'
})
}
// Mandatory Logic
if (fieldDependent.mandatoryLogic.trim() !== '') {
isMandatoryFromLogic = evaluator.evaluateLogic({
context: getters,
parentUuid,
containerUuid,
logic: fieldDependent.mandatoryLogic
})
}
// Read Only Logic
if (fieldDependent.readOnlyLogic.trim() !== '') {
isReadOnlyFromLogic = evaluator.evaluateLogic({
context: getters,
parentUuid,
containerUuid,
logic: fieldDependent.readOnlyLogic
})
}
// Default Value
if (fieldDependent.defaultValue.trim() !== '' &&
fieldDependent.defaultValue.includes('@') &&
String(fieldDependent.defaultValue).trim() !== '-1') {
defaultValue = parseContext({
parentUuid,
containerUuid,
value: fieldDependent.defaultValue
}).value
if (isSendToServer && defaultValue !== fieldDependent.defaultValue) {
dispatch('getRecordBySQL', {
field: fieldDependent,
query: defaultValue
})
.then(response => {
dispatch('notifyFieldChange', {
parentUuid,
containerUuid,
panelType: fieldDependent.panelType,
columnName: fieldDependent.columnName,
newValue: response.key
})
})
}
}
commit('changeFieldLogic', {
field: fieldDependent,
isDisplayedFromLogic,
isMandatoryFromLogic,
isReadOnlyFromLogic,
parsedDefaultValue: defaultValue
})
})
},
getPanelAndFields({ dispatch }, {
parentUuid,
containerUuid,
panelType,
routeToDelete,
isAdvancedQuery = false
}) {
let executeAction
switch (panelType) {
case 'process':
case 'report':
executeAction = 'getProcessFromServer'
break
case 'browser':
executeAction = 'getBrowserFromServer'
break
case 'window':
case 'table':
default:
executeAction = 'getTabAndFieldFromServer'
break
}
return dispatch(executeAction, {
parentUuid,
containerUuid,
panelType,
isAdvancedQuery,
routeToDelete
})
.then(panelResponse => {
return panelResponse
})
.catch(error => {
return {
...error,
moreInfo: `Dictionary getPanelAndFields ${panelType} (State Panel).`
}
})
},
changePanelAttributesBoolean({ commit, getters }, {
containerUuid,
attributeName,
attributeValue
}) {
const panel = getters.getPanel(containerUuid)
const newPanel = panel
if (isEmptyValue(attributeValue)) {
newPanel[attributeName] = !panel[attributeName]
} else {
newPanel[attributeName] = attributeValue
}
commit('changePanel', {
panel: panel,
newPanel: newPanel
})
},
/**
* Change a attribute in field state
* @param {string} attributeName
* @param {mixed} attributeValue
* @param {boolean|object} multipleAttributes
*/
changeFieldAttribure({ commit, getters }, {
containerUuid,
isAdvancedQuery,
columnName,
field,
attributeName,
attributeValue,
multipleAttributes = false
}) {
if (isEmptyValue(field)) {
field = getters.getFieldFromColumnName({ containerUuid, isAdvancedQuery, columnName })
}
let newField = field
if (multipleAttributes) {
newField = {
...newField,
multipleAttributes
}
} else {
newField[attributeName] = attributeValue
}
commit('changeField', {
field,
newField
})
},
dictionaryResetCache({ commit }) {
commit('dictionaryResetCache')
commit('dictionaryResetCacheContext')
commit('dictionaryResetCacheContextMenu')
commit('dictionaryResetCacheWindow')
commit('dictionaryResetCacheProcess')
commit('dictionaryResetCacheBrowser')
}
},
getters: {
getPanel: (state) => (containerUuid, isAdvancedQuery = false) => {
return state.panel.find(item => {
return item.uuid === containerUuid && (!isAdvancedQuery || (isAdvancedQuery && item.isAdvancedQuery))
})
},
getFieldsListFromPanel: (state, getters) => (containerUuid, isAdvancedQuery = false) => {
const panel = getters.getPanel(containerUuid, isAdvancedQuery)
if (panel === undefined) {
return []
}
return panel.fieldList
},
getFieldFromColumnName: (state, getters) => ({ containerUuid, isAdvancedQuery, columnName }) => {
return getters.getFieldsListFromPanel(containerUuid, isAdvancedQuery).find(itemField => {
return itemField.columnName === columnName
})
},
/**
* Determinate if panel is ready fron send, all fiedls mandatory and displayed with values
* @param {string} containerUuid
* @param {object} row, data to compare if is table
* @returns {object}
*/
isNotReadyForSubmit: (state, getters) => (containerUuid, row) => {
const field = getters.getFieldsListFromPanel(containerUuid).find(fieldItem => {
const isMandatory = fieldItem.isMandatory || fieldItem.isMandatoryFromLogic
var value = fieldItem.value
// used when evaluate data in table
if (row) {
value = row[fieldItem.columnName]
}
if (fieldIsDisplayed(fieldItem) && isMandatory && isEmptyValue(value)) {
return true
}
})
return field
},
// Obtain empty obligatory fields
getFieldListEmptyMandatory: (state, getters) => ({
containerUuid,
fieldsList = [],
isEvaluateShowed = true,
row
}) => {
if (fieldsList.length <= 0) {
fieldsList = getters.getFieldsListFromPanel(containerUuid)
}
// all optionals (not mandatory) fields
fieldsList = fieldsList.filter(fieldItem => {
const isMandatory = fieldItem.isMandatory || fieldItem.isMandatoryFromLogic
if (isMandatory) {
if (isEvaluateShowed) {
return fieldIsDisplayed(fieldItem)
}
return isMandatory
}
})
fieldsList = fieldsList.filter(fieldItem => {
let value = fieldItem.value
// used when evaluate data in table
if (row) {
value = row[fieldItem.columnName]
}
return isEmptyValue(value)
})
return fieldsList.map(fieldItem => {
return fieldItem.name
})
},
/**
* Show all available fields not mandatory to show, used in components panel/filterFields.vue
* @param {string} containerUuid
* @param {boolean} isEvaluateShowed
*/
getFieldsListNotMandatory: (state, getters) => ({ containerUuid, isEvaluateShowed = true }) => {
// all optionals (not mandatory) fields
return getters.getFieldsListFromPanel(containerUuid).filter(fieldItem => {
const isMandatory = fieldItem.isMandatory || fieldItem.isMandatoryFromLogic
if (!isMandatory) {
if (isEvaluateShowed) {
return fieldIsDisplayed(fieldItem)
}
return !isMandatory
}
})
},
getUuid: (state, getters) => (containerUuid) => {
const fieldUuid = getters.getColumnNamesAndValues({
containerUuid: containerUuid,
isObjectReturn: true,
isAddDisplayColumn: true
})
if (fieldUuid) {
return fieldUuid.UUID
}
return undefined
},
/**
* @param {string} containerUuid, unique identifier of the panel to search your list of fields
* @param {string} propertyName, property name to return its value (value, oldValue)
* @param {boolean} isObjectReturn, define if is an object to return, else arraylist return
* @param {boolean} isEvaluateValues, define if evaluate emty values
* @param {boolean} isAddDisplayColumn, define if return display columns
* @param {boolean} isAddRangeColumn, define if return rangue columns_To
* @param {array} withOut, define if return display columns
* @param {array} isEvaluatedChangedValue, define if return only fields with values changes
* @returns {array|object}
*/
getColumnNamesAndValues: (state, getters) => ({
containerUuid,
propertyName = 'value',
isObjectReturn = false,
isEvaluateValues = false,
isAddDisplayColumn = false,
isAddRangeColumn = false,
withOut = [],
isEvaluatedChangedValue = false,
fieldList = []
}) => {
if (!fieldList.length) {
fieldList = getters.getFieldsListFromPanel(containerUuid)
}
let attributesList = fieldList
const attributesObject = {}
const displayColumnsList = []
const rangeColumnsList = []
if (withOut.length || isEvaluatedChangedValue || isEvaluateValues) {
attributesList = attributesList.filter(fieldItem => {
// columns to exclude
if (withOut.includes(fieldItem.columnName)) {
return false
}
// if value is changed
if (isEvaluatedChangedValue && fieldItem.value === fieldItem.oldValue) {
return false
}
// TODO: Evaluate valueTo for range
if (isEvaluateValues && isEmptyValue(fieldItem.value)) {
return false
}
return true
})
}
attributesList = attributesList
.map(fieldItem => {
const valueToReturn = fieldItem[propertyName]
attributesObject[fieldItem.columnName] = valueToReturn
// Add display columns if field has value
if (fieldItem[propertyName] && fieldItem.displayColumn) {
attributesObject[`DisplayColumn_${fieldItem.columnName}`] = fieldItem.displayColumn
displayColumnsList.push({
columnName: `DisplayColumn_${fieldItem.columnName}`,
value: fieldItem.displayColumn
})
}
// add range columns
if (isAddRangeColumn && fieldItem.isRange) {
attributesObject[`${fieldItem.columnName}_To`] = fieldItem.valueTo
rangeColumnsList.push({
columnName: `${fieldItem.columnName}_To`,
value: fieldItem.valueTo
})
}
return {
columnName: fieldItem.columnName,
value: valueToReturn
}
})
if (isAddDisplayColumn) {
attributesList = attributesList.concat(displayColumnsList, rangeColumnsList)
}
if (isObjectReturn) {
return attributesObject
}
return attributesList
},
getParsedDefaultValues: (state, getters) => ({
parentUuid,
containerUuid,
isGetServer = true,
fieldsList = []
}) => {
if (!fieldsList.length) {
fieldsList = getters.getFieldsListFromPanel(containerUuid)
}
const attributesObject = {}
fieldsList
.map(fieldItem => {
let isSQL = false
let valueToReturn = fieldItem.parsedDefaultValue
if (String(fieldItem.defaultValue).includes('@')) {
if (String(fieldItem.defaultValue).includes('@SQL=') && isGetServer) {
isSQL = true
}
valueToReturn = parseContext({
parentUuid: parentUuid,
containerUuid: containerUuid,
columnName: fieldItem.columnName,
value: fieldItem.defaultValue,
isSQL
})
}
valueToReturn = parsedValueComponent({
fieldType: fieldItem.componentPath,
referenceType: fieldItem.referenceType,
isMandatory: fieldItem.isMandatory,
value: String(valueToReturn) === '[object Object]' && valueToReturn.isSQL ? valueToReturn : String(valueToReturn) === '[object Object]' ? valueToReturn.value : valueToReturn
})
attributesObject[fieldItem.columnName] = valueToReturn
// add display column to default
if (fieldItem.componentPath === 'FieldSelect' && fieldItem.value === valueToReturn) {
attributesObject[`DisplayColumn_${fieldItem.columnName}`] = fieldItem.displayColumn
}
return {
columnName: fieldItem.columnName,
value: valueToReturn,
isSQL: isSQL
}
})
return attributesObject
},
getFieldsIsDisplayed: (state, getters) => (containerUuid) => {
const fieldList = getters.getFieldsListFromPanel(containerUuid)
var fieldsIsDisplayed = []
var fieldsNotDisplayed = []
if (fieldList.length) {
fieldsIsDisplayed = fieldList.filter(itemField => {
const isMandatory = itemField.isMandatory && itemField.isMandatoryFromLogic
if (fieldIsDisplayed(itemField) && (isMandatory || itemField.isShowedFromUser)) {
return true
}
fieldsNotDisplayed.push(itemField)
})
}
return {
fieldIsDisplayed: fieldsIsDisplayed,
fieldsNotDisplayed: fieldsNotDisplayed,
totalField: fieldList.length,
isDisplayed: Boolean(fieldsIsDisplayed.length)
}
},
getParametersToShare: (state, getters) => ({
containerUuid,
withOut = [],
isOnlyDisplayed = false,
isAdvancedQuery = false
}) => {
let fieldList = getters.getFieldsListFromPanel(containerUuid, isAdvancedQuery)
let attributesListLink = ''
if (withOut.length) {
fieldList = fieldList.filter(fieldItem => {
// columns to exclude
if (withOut.includes(fieldItem.columnName)) {
return false
}
return true
})
}
if (isOnlyDisplayed) {
fieldList = fieldList.filter(fieldItem => {
const isMandatory = Boolean(fieldItem.isMandatory || fieldItem.isMandatoryFromLogic) && !isAdvancedQuery
const isDisplayed = fieldIsDisplayed(fieldItem) && (fieldItem.isShowedFromUser || isMandatory)
if (isDisplayed) {
return true
}
return false
})
}
fieldList.map(fieldItem => {
// assign values
var value = fieldItem.value
var valueTo = fieldItem.valueTo
if (!isEmptyValue(value)) {
if (['FieldDate', 'FieldTime'].includes(fieldItem.componentPath)) {
value = value.getTime()
}
attributesListLink += `${fieldItem.columnName}=${encodeURIComponent(value)}&`
}
if (fieldItem.isRange && !isEmptyValue(valueTo)) {
if (['FieldDate', 'FieldTime'].includes(fieldItem.componentPath)) {
valueTo = valueTo.getTime()
}
attributesListLink += `${fieldItem.columnName}_To=${encodeURIComponent(valueTo)}&`
}
})
return attributesListLink.slice(0, -1)
},
/**
* Getter converter selection params with value format
* [{ columname: name key, value: value to send, operator }]
*/
getParametersToServer: (state, getters) => ({
containerUuid,
row,
fieldList = [],
withOutColumnNames = [],
isEvaluateDisplayed = true,
isEvaluateMandatory = true,
isAdvancedQuery = false
}) => {
if (fieldList.length <= 0) {
fieldList = getters.getFieldsListFromPanel(containerUuid, isAdvancedQuery)
}
const parametersRange = []
// filter fields
let parametersList = fieldList
.filter(fieldItem => {
// columns to exclude
if (withOutColumnNames.includes(fieldItem.columnName)) {
return false
}
// exclude key column if is new
if (row && row.isNew && fieldItem.isKey) {
return false
}
const isMandatory = Boolean(fieldItem.isMandatory || fieldItem.isMandatoryFromLogic)
// mandatory fields
if (isEvaluateMandatory && fieldItem.panelType !== 'browser') {
if (isMandatory && !isAdvancedQuery) {
return true
}
}
// evaluate displayed fields
if (isEvaluateDisplayed) {
let isDisplayed = fieldIsDisplayed(fieldItem) && (fieldItem.isShowedFromUser || isMandatory)
if (isAdvancedQuery) {
isDisplayed = fieldItem.isShowedFromUser
}
if (isDisplayed) {
if (row) {
if (!isEmptyValue(row[fieldItem.columnName])) {
return true
}
} else {
if (!isEmptyValue(fieldItem.value) || (isAdvancedQuery &&
['NULL', 'NOT_NULL'].includes(fieldItem.operator))) {
return true
}
}
}
}
return false
})
// conever parameters
parametersList = parametersList
.map(parameterItem => {
let value = row ? row[parameterItem.columnName] : parameterItem.value
const valueTo = row ? row[`${parameterItem.columnName}_To`] : parameterItem.valueTo
let values = []
if (isAdvancedQuery && ['IN', 'NOT_IN'].includes(parameterItem.operator)) {
if (Array.isArray(value)) {
values = value.map(itemValue => {
const isMandatory = !isAdvancedQuery && (parameterItem.isMandatory || parameterItem.isMandatoryFromLogic)
return parsedValueComponent({
fieldType: parameterItem.componentPath,
value: itemValue,
referenceType: parameterItem.referenceType,
isMandatory
})
})
} else {
values.push(value)
}
value = undefined
}
// only to fields type Time, Datea and DateTime
if (parameterItem.isRange && parameterItem.componentPath !== 'FieldNumber') {
parametersRange.push({
columnName: `${parameterItem.columnName}_To`,
value: valueTo
})
}
return {
columnName: parameterItem.columnName,
value,
isRange: parameterItem.isRange,
values,
operator: isAdvancedQuery ? parameterItem.operator : undefined
}
})
parametersList = parametersList.concat(parametersRange)
return parametersList
}
}
}
export default panel