diff --git a/package.json b/package.json index b4d0f48d..c5aac262 100644 --- a/package.json +++ b/package.json @@ -46,9 +46,9 @@ "dependencies": { "@adempiere/grpc-access-client": "^1.1.8", "@adempiere/grpc-data-client": "^2.2.3", - "@adempiere/grpc-pos-client": "^1.0.4", "@adempiere/grpc-dictionary-client": "^1.3.9", "@adempiere/grpc-enrollment-client": "^1.0.7", + "@adempiere/grpc-pos-client": "^1.0.7", "autoprefixer": "^9.5.1", "axios": "0.18.0", "clipboard": "2.0.4", diff --git a/src/api/ADempiere/pos.js b/src/api/ADempiere/pos.js index ef731774..e08627f5 100644 --- a/src/api/ADempiere/pos.js +++ b/src/api/ADempiere/pos.js @@ -1,15 +1,17 @@ import { getLanguage } from '@/lang/index' -import { getToken } from '@/utils/auth' +import { getToken, getCurrentOrganization, getCurrentWarehouse } from '@/utils/auth' import POS from '@adempiere/grpc-pos-client' import { BUSINESS_DATA_ADDRESS } from '@/api/ADempiere/constants' // Get Instance for connection function Instance() { - return new POS( - BUSINESS_DATA_ADDRESS, - getToken(), - getLanguage() || 'en_US' - ) + return new POS({ + host: BUSINESS_DATA_ADDRESS, + sessionUuid: getToken(), + organizationUuid: getCurrentOrganization(), + warehouseUuid: getCurrentWarehouse(), + language: getLanguage() || 'en_US' + }) } export function getProductPrice({ diff --git a/src/components/ADempiere/Field/FieldBinary.vue b/src/components/ADempiere/Field/FieldBinary.vue index a64b87de..23d1f19b 100644 --- a/src/components/ADempiere/Field/FieldBinary.vue +++ b/src/components/ADempiere/Field/FieldBinary.vue @@ -6,7 +6,7 @@ :on-remove="handleRemove" :on-success="handleSuccess" :on-error="handleError" - class="image-uploader" + :class="'image-uploader ' + metadata.cssClassName" action="https://jsonplaceholder.typicode.com/posts/" :disabled="isDisabled" @change="preHandleChange" diff --git a/src/components/ADempiere/Field/FieldColor.vue b/src/components/ADempiere/Field/FieldColor.vue index 4fbe72e7..2b8249c6 100644 --- a/src/components/ADempiere/Field/FieldColor.vue +++ b/src/components/ADempiere/Field/FieldColor.vue @@ -4,6 +4,7 @@ v-model="value" show-alpha :disabled="isDisabled" + :class="metadata.cssClassName" @change="preHandleChange" /> diff --git a/src/components/ADempiere/Field/FieldDate.vue b/src/components/ADempiere/Field/FieldDate.vue index 02a86f9f..0ff5e6ba 100644 --- a/src/components/ADempiere/Field/FieldDate.vue +++ b/src/components/ADempiere/Field/FieldDate.vue @@ -10,10 +10,10 @@ :start-placeholder="$t('components.dateStartPlaceholder')" :end-placeholder="$t('components.dateEndPlaceholder')" unlink-panels - class="date-base" + :class="'date-base ' + metadata.cssClassName" :readonly="Boolean(metadata.readonly)" :disabled="isDisabled" - :picker-options="typePicker === 'daterange' ? pickerOptionsDateRange : pickerOptionsDate" + :picker-options="pickerOptions" @change="preHandleChange" /> @@ -137,6 +137,12 @@ export default { .replace(/[aA]/gi, '') } return undefined + }, + pickerOptions() { + if (this.typePicker === 'daterange') { + return this.pickerOptionsDateRange + } + return this.pickerOptionsDate } }, watch: { diff --git a/src/components/ADempiere/Field/FieldImage.vue b/src/components/ADempiere/Field/FieldImage.vue index be9a700c..4f2e213f 100644 --- a/src/components/ADempiere/Field/FieldImage.vue +++ b/src/components/ADempiere/Field/FieldImage.vue @@ -6,7 +6,7 @@ :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload" :disabled="isDisabled" - class="avatar-uploader" + :class="'avatar-uploader ' + metadata.cssClassName" > diff --git a/src/components/ADempiere/Field/FieldNumber.vue b/src/components/ADempiere/Field/FieldNumber.vue index 6c4ccea1..946719d0 100644 --- a/src/components/ADempiere/Field/FieldNumber.vue +++ b/src/components/ADempiere/Field/FieldNumber.vue @@ -10,7 +10,7 @@ :disabled="isDisabled" :precision="precision" controls-position="right" - :class="'display-type-amount'" + :class="'display-type-amount ' + metadata.cssClassName" @change="preHandleChange" @blur="changeValue" @keydown.native="calculateValue" diff --git a/src/components/ADempiere/Field/FieldSelect.vue b/src/components/ADempiere/Field/FieldSelect.vue index 8180a7d3..b9b56e29 100644 --- a/src/components/ADempiere/Field/FieldSelect.vue +++ b/src/components/ADempiere/Field/FieldSelect.vue @@ -6,7 +6,7 @@ :placeholder="metadata.help" :loading="isLoading" value-key="key" - :class="classStyle" + :class="classStyle + ' ' + metadata.cssClassName" clearable :multiple="isSelectMultiple" :allow-create="metadata.isSelectCreated" diff --git a/src/components/ADempiere/Field/FieldSelectMultiple.vue b/src/components/ADempiere/Field/FieldSelectMultiple.vue index 14b195df..9704afa0 100644 --- a/src/components/ADempiere/Field/FieldSelectMultiple.vue +++ b/src/components/ADempiere/Field/FieldSelectMultiple.vue @@ -5,7 +5,7 @@ filterable allow-create :placeholder="metadata.help" - class="custom-field-select custom-field-select-multiple" + :class="'custom-field-select custom-field-select-multiple ' + metadata.cssClassName" @change="preHandleChange" > -
+
diff --git a/src/components/ADempiere/Field/chatTextLong.vue b/src/components/ADempiere/Field/chatTextLong.vue index 5a347f4a..b473b3c7 100644 --- a/src/components/ADempiere/Field/chatTextLong.vue +++ b/src/components/ADempiere/Field/chatTextLong.vue @@ -8,13 +8,10 @@ import 'tui-editor/dist/tui-editor.css' // editor ui import 'tui-editor/dist/tui-editor-contents.css' // editor content import 'codemirror/lib/codemirror.css' // codemirror import Editor from 'tui-editor' - import { getLanguage } from '@/lang' -// import { fieldMixin } from '@/components/ADempiere/Field/FieldMixin' export default { name: 'ChatTextLong', - // mixins: [fieldMixin], props: { id: { type: String, @@ -137,15 +134,14 @@ export default { }) }, preHandleChange(value) { - var comment = value if (this.clean) { - this.$store.dispatch('setchatText', comment) - .then((responseComment) => { + this.$store.dispatch('setchatText', value) + .then(responseComment => { this.$store.dispatch('setMarkDown', false) this.$store.dispatch('setchatText', '') }) } else { - this.$store.dispatch('setchatText', comment) + this.$store.dispatch('setchatText', value) } }, addReanOnlyChanges() { @@ -176,6 +172,7 @@ export default { } } + diff --git a/src/components/ADempiere/Form/formMixin.js b/src/components/ADempiere/Form/formMixin.js index a2720f28..eae42edd 100644 --- a/src/components/ADempiere/Form/formMixin.js +++ b/src/components/ADempiere/Form/formMixin.js @@ -14,10 +14,10 @@ export default { }, data() { return { - metadataList: [], + fieldsList: [], panelMetadata: {}, isLoaded: false, - panelType: 'custom' + panelType: 'form' } }, computed: { @@ -25,35 +25,137 @@ export default { return this.$store.getters.getPanel(this.metadata.containerUuid) } }, + created() { + this.getPanel() + }, methods: { createFieldFromDefinition, createFieldFromDictionary, - getPanel() { + async getPanel() { const panel = this.getterPanel if (panel) { - this.metadataList = panel.fieldList + this.fieldsList = panel.fieldList this.isLoaded = true } else { - this.setFieldsList() + await this.generateFieldsList() this.$store.dispatch('addPanel', { ...this.metadata, uuid: this.metadata.containerUuid, panelType: this.panelType, - fieldList: this.metadataList + fieldList: this.fieldsList }) .then(responsePanel => { - this.metadataList = responsePanel.fieldList + this.fieldsList = responsePanel.fieldList this.$store.dispatch('changeFormAttribute', { containerUuid: this.metadata.containerUuid, attributeName: 'fieldList', - attributeValue: this.metadataList + attributeValue: this.fieldsList }) }) .finally(() => { this.isLoaded = true }) } + }, + generateFieldsList() { + let sequence = 0 + const incrementSequence = (newValue) => { + if (newValue) { + sequence = newValue + } + sequence = sequence + 10 + return sequence + } + + return new Promise(resolve => { + const additionalAttributes = { + containerUuid: this.metadata.containerUuid, + isEvaluateValueChanges: false, + panelType: this.panelType + } + + const fieldsListFromDictionary = [] + const fieldsListFromMetadata = [] + + this.fieldsList.forEach(fieldElement => { + if (fieldElement.isFromDictionary) { + // set sequence + if (fieldElement.overwriteDefinition) { + if (this.isEmptyValue(fieldElement.overwriteDefinition.sequence)) { + fieldElement.overwriteDefinition.sequence = incrementSequence() + } else { + incrementSequence(fieldElement.overwriteDefinition.sequence) + } + } else { + fieldElement.overwriteDefinition = {} + fieldElement.overwriteDefinition.sequence = incrementSequence() + } + + fieldsListFromDictionary.push( + this.createFieldFromDictionary({ + ...fieldElement, + ...additionalAttributes + }) + ) + } else { + // set sequence + if (fieldElement.definition) { + if (this.isEmptyValue(fieldElement.definition.sequence)) { + fieldElement.definition.sequence = incrementSequence() + } else { + incrementSequence(fieldElement.definition.sequence) + } + } else { + fieldElement.definition = {} + fieldElement.definition.sequence = incrementSequence() + } + + fieldsListFromMetadata.push( + this.createFieldFromDefinition({ + ...fieldElement, + ...additionalAttributes + }) + ) + } + }) + let fieldsList = fieldsListFromMetadata + + if (this.isEmptyValue(fieldsListFromDictionary)) { + this.fieldsList = fieldsList + resolve(fieldsList) + this.isLoaded = true + } else { + Promise.all(fieldsListFromDictionary) + .then(responsefields => { + fieldsList = fieldsList.concat(responsefields) + resolve(fieldsList) + this.fieldsList = fieldsList + this.isLoaded = true + }) + } + }) + }, + // Set value for one field from panel + // use example: setValue('ProductName', 'Patio Fun') + setValue(columnName, value) { + this.$store.dispatch('notifyFieldChange', { + containerUuid: this.metadata.containerUuid, + panelType: this.metadata.panelType, + columnName, + newValue: value + }) + }, + // Set values for all list of columns + // Use example: setValues(values) + setValues({ values = {}, withOutColumnNames = [] }) { + this.$store.dispatch('notifyPanelChange', { + containerUuid: this.metadata.containerUuid, + panelType: this.metadata.panelType, + newValues: values, + withOutColumnNames, + isChangedAllValues: true + }) } } } diff --git a/src/store/modules/ADempiere/browser.js b/src/store/modules/ADempiere/browser.js index 182b75ee..50411838 100644 --- a/src/store/modules/ADempiere/browser.js +++ b/src/store/modules/ADempiere/browser.js @@ -35,7 +35,8 @@ const browser = { const panelType = 'browser' const additionalAttributes = { containerUuid, - panelType + panelType, + isEvaluateValueChanges: true } const { query, diff --git a/src/store/modules/ADempiere/panel.js b/src/store/modules/ADempiere/panel.js index 6ae7a57f..899b9a45 100644 --- a/src/store/modules/ADempiere/panel.js +++ b/src/store/modules/ADempiere/panel.js @@ -85,7 +85,7 @@ const panel = { count++ } } else { - if (['browser', 'process', 'report', 'custom'].includes(panelType) || + if (['browser', 'process', 'report', 'form'].includes(panelType) || panelType === 'window' && params.isParentTab) { dispatch('setContext', { parentUuid: params.parentUuid, @@ -393,6 +393,7 @@ const panel = { * @param {object} fieldList, field list of panel * @param {object} newValues, values to set in panel * @param {boolean} isSendToServer, indicate if changes send to server + * @param {boolean} isChangedAllValues, check if it changes all the values of the fields, if it does not exist, set an empty value */ notifyPanelChange({ dispatch, getters, rootGetters }, { parentUuid, @@ -407,7 +408,8 @@ const panel = { isPrivateAccess = false, fieldList = [], isChangeFromCallout = false, - isChangeMultipleFields = true + isChangeMultipleFields = true, + isChangedAllValues = false }) { return new Promise(resolve => { if (!fieldList.length) { @@ -422,7 +424,12 @@ const panel = { // Evaluate with hasOwnProperty if exits this value if (!newValues.hasOwnProperty(actionField.columnName)) { - return + if (!isChangedAllValues || withOutColumnNames.includes(actionField.columnName)) { + // breaks if this value does not exist or ignore with out column names + return + } + // set empty value and continue + newValues[actionField.columnName] = undefined } if (isChangeFromCallout && @@ -630,7 +637,7 @@ const panel = { } // the field has not changed, then the action is broken - if (newValue === field.value && isEmptyValue(displayColumn) && !isAdvancedQuery) { + if (newValue === field.value && isEmptyValue(displayColumn) && field.isEvaluateValueChanges) { resolve() return } diff --git a/src/store/modules/ADempiere/window.js b/src/store/modules/ADempiere/window.js index 9e35e3e8..7e53e92e 100644 --- a/src/store/modules/ADempiere/window.js +++ b/src/store/modules/ADempiere/window.js @@ -259,7 +259,8 @@ const window = { tableName: tabResponse.tableName, // isReadOnlyFromForm: false, - isAdvancedQuery + isAdvancedQuery, + isEvaluateValueChanges: !isAdvancedQuery } let isWithUuidField = false // indicates it contains the uuid field diff --git a/src/utils/ADempiere/dictionaryUtils.js b/src/utils/ADempiere/dictionaryUtils.js index e2f9dd32..9a71807a 100644 --- a/src/utils/ADempiere/dictionaryUtils.js +++ b/src/utils/ADempiere/dictionaryUtils.js @@ -244,6 +244,7 @@ export function generateProcess({ processToGenerate, containerUuidAssociated = u processId: processToGenerate.id, processName: processToGenerate.name, containerUuid: processToGenerate.uuid, + isEvaluateValueChanges: true, panelType } diff --git a/src/utils/ADempiere/lookupFactory.js b/src/utils/ADempiere/lookupFactory.js index 2ddd7a84..42b1ca89 100644 --- a/src/utils/ADempiere/lookupFactory.js +++ b/src/utils/ADempiere/lookupFactory.js @@ -108,7 +108,7 @@ export function createFieldFromDictionary({ function getFactoryFromField({ containerUuid, field, - overwriteDefinition + overwriteDefinition = {} }) { const fieldDefinition = { displayType: field.displayType, @@ -152,62 +152,14 @@ function getFactoryFromField({ 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 - } + contextInfo: field.contextInfo, + // Overwrite definition + ...overwriteDefinition } + // Convert it return createFieldFromDefinition({ - containerUuid: containerUuid, + containerUuid, columnName: field.columnName, definition: fieldDefinition }) @@ -218,6 +170,7 @@ export function createFieldFromDefinition({ parentUuid, containerUuid, columnName, + panelType = 'form', definition = {} }) { if (!isEmptyValue(definition)) { @@ -270,6 +223,7 @@ export function createFieldFromDefinition({ definition.reference = reference } return getFieldTemplate({ + panelType, ...definition, isShowedFromUser: true, isCustomField: true, diff --git a/src/views/ADempiere/Form/index.vue b/src/views/ADempiere/Form/index.vue index d16b0019..f75ad53a 100644 --- a/src/views/ADempiere/Form/index.vue +++ b/src/views/ADempiere/Form/index.vue @@ -41,7 +41,6 @@ diff --git a/src/views/ADempiere/TestView/fieldsList.js b/src/views/ADempiere/TestView/fieldsList.js new file mode 100644 index 00000000..6fe28fc5 --- /dev/null +++ b/src/views/ADempiere/TestView/fieldsList.js @@ -0,0 +1,83 @@ +import { URL, TEXT, NUMBER, INTEGER, TEXT_LONG, TABLE_DIRECT } from '@/utils/ADempiere/references' + +export default [ + // URL + { + columnName: 'URL', + definition: { + name: 'Web', + displayType: URL.id + } + }, + // From Field UUID + { + isFromDictionary: true, + fieldUuid: '8ceabe8a-fb40-11e8-a479-7a0060f0aa01' + }, + // From Column UUID + { + isFromDictionary: true, + columnUuid: '8b4bbb7e-fb40-11e8-a479-7a0060f0aa01' + }, + // From Element Column Name + { + isFromDictionary: true, + elementColumnName: 'M_RMA_ID' + }, + // From Table and Column Name + { + tableName: 'C_BPartner', + columnName: 'PaymentRule', + isFromDictionary: true, + overwriteDefinition: { + isMandatory: true + } + }, + // Table direct + // To be define + { + columnName: 'C_Currency_ID', + definition: { + name: 'Currency', + displayType: TABLE_DIRECT.id, + keyColumn: 'C_Currency.C_Currency_ID', + directQuery: 'SELECT C_Currency.C_Currency_ID,NULL,C_Currency.ISO_Code,C_Currency.IsActive FROM C_Currency WHERE C_Currency.C_Currency_ID=?', + query: 'SELECT C_Currency.C_Currency_ID,NULL,C_Currency.ISO_Code,C_Currency.IsActive FROM C_Currency ORDER BY 3' + } + }, + // Text + { + columnName: 'Name', + definition: { + name: 'Only Name', + displayType: TEXT.id, + displayLogic: '@URL@!""' + } + }, + // Amount + { + columnName: 'Amount', + definition: { + name: 'Amount for it', + displayType: NUMBER.id, + readOnlyLogic: '@C_Currency_ID@<>""' + } + }, + // Integer + { + columnName: 'SeqNo', + definition: { + name: 'Sequence for record', + displayType: INTEGER.id, + mandatoryLogic: '@URL@!""' + } + }, + // Text Long + { + columnName: 'Description', + definition: { + name: 'Only Description', + displayType: TEXT_LONG.id + } + } +] diff --git a/src/views/ADempiere/TestView/index.vue b/src/views/ADempiere/TestView/index.vue index df7e5682..1eac1c87 100644 --- a/src/views/ADempiere/TestView/index.vue +++ b/src/views/ADempiere/TestView/index.vue @@ -1,213 +1,163 @@ + + +