mirror of
https://github.com/PanJiaChen/vue-element-admin.git
synced 2025-08-12 22:29:59 +08:00
387 lines
10 KiB
Vue
387 lines
10 KiB
Vue
<template>
|
|
<div>
|
|
<el-popover
|
|
ref="businessPartnerCreate"
|
|
v-model="showsPopovers.isShowCreate"
|
|
placement="right"
|
|
width="400"
|
|
trigger="click"
|
|
>
|
|
<business-partner-create
|
|
v-if="showsPopovers.isShowCreate"
|
|
:parent-metadata="parentMetadata"
|
|
:shows-popovers="showsPopovers"
|
|
/>
|
|
</el-popover>
|
|
|
|
<el-popover
|
|
ref="businessPartnersList"
|
|
v-model="showsPopovers.isShowList"
|
|
placement="right"
|
|
width="800"
|
|
trigger="click"
|
|
>
|
|
<!-- v-if="showsPopovers.isShowList" -->
|
|
<business-partners-list
|
|
:parent-metadata="parentMetadata"
|
|
:shows-popovers="showsPopovers"
|
|
/>
|
|
</el-popover>
|
|
|
|
<el-form-item>
|
|
<template slot="label">
|
|
Business Partner
|
|
<i
|
|
v-popover:businessPartnerCreate
|
|
class="el-icon-circle-plus"
|
|
/>
|
|
<i
|
|
v-popover:businessPartnersList
|
|
class="el-icon-search"
|
|
/>
|
|
</template>
|
|
|
|
<el-autocomplete
|
|
v-model="displayedValue"
|
|
:placeholder="$t('quickAccess.searchWithEnter')"
|
|
:fetch-suggestions="localSearch"
|
|
clearable
|
|
value-key="name"
|
|
style="width: 100%;"
|
|
popper-class="custom-field-bpartner-info"
|
|
@clear="setBusinessPartner(blankBPartner, false)"
|
|
@keyup.enter.native="getBPartnerWithEnter"
|
|
@select="handleSelect"
|
|
@focus="setNewDisplayedValue"
|
|
@blur="setOldDisplayedValue"
|
|
>
|
|
<template
|
|
slot="prefix"
|
|
>
|
|
<i
|
|
class="el-icon-user-solid el-input__icon"
|
|
/>
|
|
</template>
|
|
|
|
<template slot-scope="props">
|
|
<div class="header">
|
|
<b>{{ props.item.name }} </b>
|
|
</div>
|
|
<span class="info">
|
|
{{ props.item.value }}
|
|
</span>
|
|
</template>
|
|
</el-autocomplete>
|
|
</el-form-item>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
/**
|
|
* This component is made to be the prototype of the Business Partner search field
|
|
* TODO: Before creating you must make a search for all the filled fields.
|
|
*/
|
|
import { requestGetBusinessPartner } from '@/api/ADempiere/system-core.js'
|
|
import BusinessPartnerCreate from './businessPartnerCreate'
|
|
import BusinessPartnersList from './businessPartnersList'
|
|
import BParterMixin from './mixinBusinessPartner.js'
|
|
const { setBusinessPartner } = BParterMixin.methods
|
|
const { searchBPartnerList } = BusinessPartnersList.methods
|
|
import { trimPercentage } from '@/utils/ADempiere/valueFormat.js'
|
|
|
|
export default {
|
|
name: 'FieldBusinessPartner',
|
|
components: {
|
|
BusinessPartnerCreate,
|
|
BusinessPartnersList
|
|
},
|
|
props: {
|
|
parentMetadata: {
|
|
type: Object,
|
|
default: () => {}
|
|
},
|
|
showsPopovers: {
|
|
type: Object,
|
|
default: () => {
|
|
return {
|
|
isShowCreate: false,
|
|
isShowList: false
|
|
}
|
|
}
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
controlDisplayed: this.displayedValue,
|
|
timeOut: null
|
|
}
|
|
},
|
|
computed: {
|
|
value: {
|
|
get() {
|
|
return this.$store.getters.getValueOfField({
|
|
containerUuid: this.parentMetadata.containerUuid,
|
|
columnName: 'C_BPartner_ID' // this.parentMetadata.columnName
|
|
})
|
|
},
|
|
set(value) {
|
|
this.$store.commit('updateValueOfField', {
|
|
containerUuid: this.parentMetadata.containerUuid,
|
|
columnName: 'C_BPartner_ID', // this.parentMetadata.columnName,
|
|
value
|
|
})
|
|
}
|
|
},
|
|
displayedValue: {
|
|
get() {
|
|
return this.$store.getters.getValueOfField({
|
|
containerUuid: this.parentMetadata.containerUuid,
|
|
// DisplayColumn_'ColumnName'
|
|
columnName: 'DisplayColumn_C_BPartner_ID' // this.parentMetadata.displayColumnName
|
|
})
|
|
},
|
|
set(value) {
|
|
this.$store.commit('updateValueOfField', {
|
|
containerUuid: this.parentMetadata.containerUuid,
|
|
// DisplayColumn_'ColumnName'
|
|
columnName: 'DisplayColumn_C_BPartner_ID', // this.parentMetadata.displayColumnName,
|
|
value
|
|
})
|
|
}
|
|
},
|
|
recordsBusinessPartners() {
|
|
return this.$store.getters.getBusinessPartnersList
|
|
},
|
|
blankBPartner() {
|
|
return {
|
|
uuid: undefined,
|
|
id: undefined,
|
|
name: undefined
|
|
}
|
|
}
|
|
},
|
|
methods: {
|
|
setBusinessPartner,
|
|
searchBPartnerList,
|
|
setNewDisplayedValue() {
|
|
const displayValue = this.displayedValue
|
|
if (this.controlDisplayed !== displayValue) {
|
|
this.controlDisplayed = displayValue
|
|
}
|
|
},
|
|
setOldDisplayedValue() {
|
|
if (this.controlDisplayed !== this.displayedValue) {
|
|
this.displayedValue = this.controlDisplayed
|
|
}
|
|
},
|
|
localSearch(stringToMatch, callBack) {
|
|
if (this.isEmptyValue(stringToMatch)) {
|
|
// not show list
|
|
callBack([])
|
|
return
|
|
}
|
|
|
|
const recordsList = this.recordsBusinessPartners
|
|
let results = recordsList
|
|
if (stringToMatch) {
|
|
const parsedValue = trimPercentage(stringToMatch.toLowerCase().trim())
|
|
|
|
results = recordsList.filter(rowBPartner => {
|
|
for (const columnBPartner in rowBPartner) {
|
|
const valueToCompare = String(rowBPartner[columnBPartner]).toLowerCase()
|
|
|
|
if (valueToCompare.includes(parsedValue)) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
})
|
|
|
|
// Remote search
|
|
if (this.isEmptyValue(results) && String(stringToMatch.length > 3)) {
|
|
clearTimeout(this.timeOut)
|
|
|
|
this.timeOut = setTimeout(() => {
|
|
this.remoteSearch(stringToMatch)
|
|
.then(remoteResponse => {
|
|
callBack(remoteResponse)
|
|
})
|
|
}, 2000)
|
|
return
|
|
}
|
|
}
|
|
|
|
// call callback function to return suggestions
|
|
callBack(results)
|
|
},
|
|
remoteSearch(searchValue) {
|
|
return new Promise(resolve => {
|
|
const message = {
|
|
message: 'Sin resultados coincidentes con la busqueda',
|
|
type: 'info',
|
|
showClose: true
|
|
}
|
|
|
|
this.$store.dispatch('listBPartnerFromServer', {
|
|
pageNumber: 1,
|
|
searchValue
|
|
})
|
|
.then(() => {
|
|
const recordsList = this.recordsBusinessPartners
|
|
|
|
if (this.isEmptyValue(recordsList)) {
|
|
this.$message(message)
|
|
}
|
|
|
|
resolve(recordsList)
|
|
})
|
|
.catch(error => {
|
|
console.warn(error.message)
|
|
|
|
this.$message(message)
|
|
resolve([])
|
|
})
|
|
})
|
|
},
|
|
handleSelect(selectedValue) {
|
|
let businessPartner = selectedValue
|
|
if (this.isEmptyValue(businessPartner)) {
|
|
businessPartner = this.blankBPartner
|
|
}
|
|
|
|
this.setBusinessPartner(businessPartner, false)
|
|
},
|
|
onClose() {
|
|
this.showsPopovers.isShowCreate = true
|
|
},
|
|
// TODO: Improve the handling of the event, if given an option to not search
|
|
getBPartnerWithEnter(event) {
|
|
const value = String(event.target.value).trim()
|
|
|
|
// Get one element
|
|
// this.getBPartner(value)
|
|
|
|
const createBP = () => {
|
|
this.$store.commit('updateValueOfField', {
|
|
containerUuid: 'Business-Partner-Create',
|
|
columnName: 'Name',
|
|
value
|
|
})
|
|
this.$store.commit('updateValueOfField', {
|
|
containerUuid: 'Business-Partner-Create',
|
|
columnName: 'Value',
|
|
value
|
|
})
|
|
|
|
this.showsPopovers.isShowList = false
|
|
this.showsPopovers.isShowCreate = true
|
|
}
|
|
|
|
this.searchBPartnerList({
|
|
searchValue: `%${value}%`
|
|
}, false)
|
|
.then(responseBPartnerList => {
|
|
const records = responseBPartnerList.length
|
|
|
|
if (records <= 0) {
|
|
// open create (without records)
|
|
createBP()
|
|
this.controlDisplayed = ''
|
|
} else if (records === 1) {
|
|
// set unique match
|
|
this.setBusinessPartner(responseBPartnerList[0], false)
|
|
this.controlDisplayed = responseBPartnerList[0].name
|
|
} else {
|
|
// show list with macth's
|
|
const columnName = 'Name' // Value
|
|
// if (Number.isNaN(Number(value))) {
|
|
// columnName = 'Name'
|
|
// }
|
|
this.$store.commit('updateValuesOfContainer', {
|
|
containerUuid: 'Business-Partner-List',
|
|
attributes: [{
|
|
columnName,
|
|
value: `%${value}%`
|
|
}]
|
|
})
|
|
|
|
this.showsPopovers.isShowList = true
|
|
this.showsPopovers.isShowCreate = false
|
|
}
|
|
})
|
|
.catch(error => {
|
|
// create bpartner with typing values
|
|
createBP()
|
|
console.warn(error)
|
|
})
|
|
},
|
|
getBPartner(value) {
|
|
if (this.isEmptyValue(value)) {
|
|
this.$message({
|
|
type: 'warning',
|
|
message: this.$t('notifications.fieldCannotBeEmpty'),
|
|
duration: 1500,
|
|
showClose: true
|
|
})
|
|
return
|
|
}
|
|
|
|
requestGetBusinessPartner({
|
|
searchValue: value
|
|
})
|
|
.then(responseBPartner => {
|
|
// set id, uuid and name
|
|
this.setBusinessPartner(responseBPartner, false)
|
|
})
|
|
.catch(error => {
|
|
const message = this.$t('businessPartner.notFound') + ' ' + this.$t('data.createNewRecord')
|
|
this.$message({
|
|
type: 'info',
|
|
message,
|
|
duration: 1500,
|
|
// showClose: true, // TODO: does not activate callback to display create form if closed with click
|
|
onClose: this.onClose
|
|
})
|
|
|
|
this.setBusinessPartner({
|
|
...this.blankBPartner,
|
|
name: value
|
|
})
|
|
|
|
this.$store.commit('updateValueOfField', {
|
|
containerUuid: 'Business-Partner-Create',
|
|
columnName: 'Name',
|
|
value
|
|
})
|
|
this.$store.commit('updateValueOfField', {
|
|
containerUuid: 'Business-Partner-Create',
|
|
columnName: 'Value',
|
|
value
|
|
})
|
|
console.info(`Error get Business Partner. Message: ${error.message}, code ${error.code}.`)
|
|
})
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scope>
|
|
.custom-field-bpartner-info {
|
|
li {
|
|
line-height: normal;
|
|
padding: 15px;
|
|
|
|
.header {
|
|
text-overflow: ellipsis;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.info {
|
|
color: #7e7e7e;
|
|
float: left;
|
|
font-size: 12px;
|
|
}
|
|
}
|
|
}
|
|
</style>
|