1
0
mirror of https://github.com/PanJiaChen/vue-element-admin.git synced 2025-08-12 22:29:59 +08:00
Yamel Senih 9d59700aa5
Improves/reduce create form (#457)
* improves: Reduce and more easy create news Forms.

* fix: Overwrite template metadata component with metadata prop from mixin

* Add search from server for product price inquiry

* add isEvaluateValueChanges.

* Add support to latest version from POS client

* Add clean for all fields

* add style with prop cssClassName

* Add style for components

* fix subscribe mutation's and add set value and set values.

* Change error by info for form

Co-authored-by: Edwin Betancourt <EdwinBetanc0urt@hotmail.com>
2020-04-23 20:26:18 -04:00

155 lines
4.2 KiB
Vue

<template>
<el-tooltip v-model="isShowed" :manual="true" :content="valueToDisplay" placement="top" effect="light">
<el-input-number
:ref="metadata.columnName"
v-model="value"
type="number"
:min="minValue"
:max="maxValue"
:placeholder="metadata.help"
:disabled="isDisabled"
:precision="precision"
controls-position="right"
:class="'display-type-amount ' + metadata.cssClassName"
@change="preHandleChange"
@blur="changeValue"
@keydown.native="calculateValue"
@keyup.enter.native="changeValue"
/>
</el-tooltip>
</template>
<script>
import { fieldMixin } from '@/components/ADempiere/Field/FieldMixin'
import { FIELDS_DECIMALS } from '@/utils/ADempiere/references'
export default {
name: 'FieldNumber',
mixins: [fieldMixin],
data() {
// value render
let value = this.metadata.value
if (this.metadata.inTable) {
value = this.valueModel
}
value = this.validateValue(value)
return {
value: value,
showControls: true,
operation: '',
expression: /[\d\/.()%\*\+\-]/gim,
valueToDisplay: '',
isShowed: false
}
},
computed: {
maxValue() {
if (this.isEmptyValue(this.metadata.valueMax)) {
return Infinity
}
return Number(this.metadata.valueMax)
},
minValue() {
if (this.isEmptyValue(this.metadata.valueMin)) {
return -Infinity
}
return Number(this.metadata.valueMin)
},
precision() {
// Amount, Costs+Prices, Number
if (FIELDS_DECIMALS.includes(this.metadata.displayType)) {
return 2
}
return undefined
}
},
watch: {
// enable to dataTable records
valueModel(value) {
if (this.metadata.inTable) {
this.value = this.validateValue(value)
}
},
'metadata.value'(value) {
if (!this.metadata.inTable) {
this.value = this.validateValue(value)
}
}
},
methods: {
validateValue(value) {
if (this.isEmptyValue(value) || isNaN(value)) {
return undefined
}
return Number(value)
},
calculateValue(event) {
const isAllowed = event.key.match(this.expression)
if (isAllowed) {
const result = this.calculationValue(this.value, event)
if (!this.isEmptyValue(result)) {
this.valueToDisplay = result
this.isShowed = true
} else {
this.valueToDisplay = '...'
this.isShowed = true
}
} else if (!isAllowed && event.key === 'Backspace') {
if (String(this.value).slice(0, -1) > 0) {
event.preventDefault()
const newValue = String(this.value).slice(0, -1)
const result = this.calculationValue(newValue, event)
if (!this.isEmptyValue(result)) {
this.value = this.validateValue(result)
this.valueToDisplay = result
this.isShowed = true
} else {
this.valueToDisplay = '...'
this.isShowed = true
}
}
} else if (!isAllowed && event.key === 'Delete') {
if (String(this.value).slice(-1) > 0) {
event.preventDefault()
const newValue = String(this.value).slice(-1)
const result = this.calculationValue(newValue, event)
if (!this.isEmptyValue(result)) {
this.value = this.validateValue(result)
this.valueToDisplay = result
this.isShowed = true
} else {
this.valueToDisplay = '...'
this.isShowed = true
}
}
} else {
event.preventDefault()
}
},
changeValue() {
if (!this.isEmptyValue(this.valueToDisplay) && this.valueToDisplay !== '...') {
const result = this.validateValue(this.valueToDisplay)
this.preHandleChange(result)
}
this.clearVariables()
this.isShowed = false
}
}
}
</script>
<style lang="scss">
/* if is controls width 100% in container */
.el-input-number, .el-input {
width: 100% !important; /* ADempiere Custom */
}
/** Amount reference **/
.display-type-amount {
text-align: right !important;
input, .el-input__inner {
text-align: right !important;
}
}
</style>