From 7870fdbfab1f5392630495f898701f44525f059f Mon Sep 17 00:00:00 2001 From: EdwinBetanc0urt Date: Fri, 31 Jan 2020 12:53:04 -0400 Subject: [PATCH] feat: Add operators comparison to advanced search. (#287) * feat: Add operators comparison to advanced search. * Set is null and not null operator. * Add multiple values to IN and NOT IN operators. * Add component render to set values to IN and NOT IN operators. * Add IN and NOT IN operators in date component. * Fix attribute comparison (isAdvancedQuery). --- src/api/ADempiere/data.js | 25 ++- src/components/ADempiere/Field/FieldDate.vue | 44 ++++- .../ADempiere/Field/FieldSelect.vue | 47 +++++- .../ADempiere/Field/FieldSelectMultiple.vue | 34 ++++ .../Field/fieldOperatorComparison.vue | 98 +++++++++++ .../ADempiere/Field/fieldTranslated.vue | 38 ++--- src/components/ADempiere/Field/index.vue | 41 +++-- src/lang/ADempiere/en.js | 18 +- src/lang/ADempiere/es.js | 16 ++ src/store/modules/ADempiere/data.js | 8 +- src/store/modules/ADempiere/panel.js | 154 +++++++++++------- src/store/modules/ADempiere/windowControl.js | 10 +- src/utils/ADempiere/dataUtils.js | 109 +++++++++++++ src/utils/ADempiere/dictionaryUtils.js | 6 +- src/utils/ADempiere/valueUtils.js | 2 +- 15 files changed, 531 insertions(+), 119 deletions(-) create mode 100644 src/components/ADempiere/Field/FieldSelectMultiple.vue create mode 100644 src/components/ADempiere/Field/fieldOperatorComparison.vue create mode 100644 src/utils/ADempiere/dataUtils.js diff --git a/src/api/ADempiere/data.js b/src/api/ADempiere/data.js index eb48b9d2..57669a89 100644 --- a/src/api/ADempiere/data.js +++ b/src/api/ADempiere/data.js @@ -76,7 +76,7 @@ export function getEntity({ tableName, recordId, recordUuid }) { * @param {string} tableName * @param {string} query * @param {string} whereClause - * @param {array} conditions + * @param {array} conditionsList * @param {string} orderByClause * @param {string} nextPageToken */ @@ -84,7 +84,7 @@ export function getEntitiesList({ tableName, query, whereClause, - conditions: conditionsList = [], + conditionsList = [], orderByClause, nextPageToken: pageToken, pageSize @@ -100,6 +100,27 @@ export function getEntitiesList({ }) } +/** + * Get all operator or get key value type from value + * @param {number} keyToFind + EQUAL = 0; + NOT_EQUAL = 1; + LIKE = 2; + NOT_LIKE = 3; + GREATER = 4; + GREATER_EQUAL = 5; + LESS = 6; + LESS_EQUAL = 7; + BETWEEN = 8; + NOT_NULL = 9; + NULL = 10; + IN = 11; + NOT_IN = 12; + */ +export function getConditionOperators(keyToFind) { + return Instance.call(this).getConditionOperators(keyToFind) +} + /** * Rollback entity (Create, Update, Delete) * @param {string} tableName diff --git a/src/components/ADempiere/Field/FieldDate.vue b/src/components/ADempiere/Field/FieldDate.vue index 72b71ae0..8e9a87fb 100644 --- a/src/components/ADempiere/Field/FieldDate.vue +++ b/src/components/ADempiere/Field/FieldDate.vue @@ -98,15 +98,18 @@ export default { }, computed: { typePicker() { - let range = '' - let time = '' - if (String(this.metadata.displayType) === String(16)) { - time = 'time' + let picker = 'date' + if (['IN', 'NOT_IN'].includes(this.metadata.operator) && this.metadata.isAdvancedQuery) { + picker += 's' + return picker + } + if (this.metadata.displayType === 16) { + picker += 'time' } if (this.metadata.isRange && !this.metadata.inTable) { - range = 'range' + picker += 'range' } - return 'date' + time + range + return picker }, /** * Parse the date format to be compatible with element-ui @@ -150,9 +153,30 @@ export default { parsedDateValue(value) { // not return undefined to v-model if (this.isEmptyValue(value)) { + if (['IN', 'NOT_IN'].includes(this.metadata.operator) && this.metadata.isAdvancedQuery) { + return [] + } return null } + if (['IN', 'NOT_IN'].includes(this.metadata.operator) && this.metadata.isAdvancedQuery) { + if (Array.isArray(value)) { + value = value.map(itemValue => { + if (typeof itemValue === 'object') { + return itemValue.toUTCString() + } + return itemValue + }) + } else { + const tempValue = [] + if (!this.isEmptyValue(value)) { + tempValue.push(value) + } + value = tempValue + } + return value + } + // instance date from long value if (typeof value === 'number') { value = new Date(value).toUTCString() @@ -177,6 +201,14 @@ export default { let startValue, endValue startValue = value + if (this.typePicker === 'dates') { + if (Array.isArray(value)) { + value = value.map(itemValue => new Date(itemValue)) + } + this.handleChange(value) + return + } + if (this.metadata.isRange && !this.metadata.inTable && Array.isArray(value)) { startValue = value[0] endValue = value[1] diff --git a/src/components/ADempiere/Field/FieldSelect.vue b/src/components/ADempiere/Field/FieldSelect.vue index 821b9453..c7d8774a 100644 --- a/src/components/ADempiere/Field/FieldSelect.vue +++ b/src/components/ADempiere/Field/FieldSelect.vue @@ -6,8 +6,11 @@ :placeholder="metadata.help" :loading="isLoading" value-key="key" - class="select-base" + :class="classStyle" clearable + :multiple="isSelectMultiple" + :allow-create="metadata.isSelectCreated" + :collapse-tags="!isSelectMultiple" :disabled="isDisabled" @change="preHandleChange" @visible-change="getDataLookupList" @@ -60,6 +63,16 @@ export default { isMobile() { return this.$store.state.app.device === 'mobile' }, + isSelectMultiple() { + return ['IN', 'NOT_IN'].includes(this.metadata.operator) && this.metadata.isAdvancedQuery + }, + classStyle() { + let styleClass = 'custom-field-select' + if (this.isSelectMultiple) { + styleClass += ' custom-field-select-multiple' + } + return styleClass + }, getterLookupItem() { if (this.isEmptyValue(this.metadata.reference.directQuery)) { return this.blanckOption @@ -99,6 +112,23 @@ export default { } }, watch: { + isSelectMultiple(isMultiple) { + if (isMultiple) { + const valueInArray = [] + if (!this.isEmptyValue(this.value)) { + valueInArray.push(this.value) + } + this.value = valueInArray + } else { + if (Array.isArray(this.value)) { + if (this.value.length) { + this.value = this.value[0] + } else { + this.value = undefined + } + } + } + }, valueModel(value) { if (this.metadata.inTable) { this.value = value @@ -159,7 +189,8 @@ export default { return selected }, async getDataLookupItem() { - if (this.isEmptyValue(this.metadata.reference.directQuery)) { + if (this.isEmptyValue(this.metadata.reference.directQuery) || + (this.metadata.isAdvancedQuery && this.isSelectMultiple)) { return } this.isLoading = true @@ -234,8 +265,16 @@ export default { } - diff --git a/src/components/ADempiere/Field/FieldSelectMultiple.vue b/src/components/ADempiere/Field/FieldSelectMultiple.vue new file mode 100644 index 00000000..14b195df --- /dev/null +++ b/src/components/ADempiere/Field/FieldSelectMultiple.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/components/ADempiere/Field/fieldOperatorComparison.vue b/src/components/ADempiere/Field/fieldOperatorComparison.vue new file mode 100644 index 00000000..10d4eb30 --- /dev/null +++ b/src/components/ADempiere/Field/fieldOperatorComparison.vue @@ -0,0 +1,98 @@ + + + diff --git a/src/components/ADempiere/Field/fieldTranslated.vue b/src/components/ADempiere/Field/fieldTranslated.vue index 65cedea9..e4e6c114 100644 --- a/src/components/ADempiere/Field/fieldTranslated.vue +++ b/src/components/ADempiere/Field/fieldTranslated.vue @@ -9,10 +9,10 @@ >
- {{ name }} + {{ fieldAttributes.name }} -