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 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ formTitle }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+