1
0
mirror of https://github.com/PanJiaChen/vue-element-admin.git synced 2025-08-12 22:29:59 +08:00
elsiosanchez da08c71f01
Add the workflow phases sequence (#346)
* indicate new row

* add focus in field text

* add workflow line

* delete console.log

* width the step

* confi the width

* add width fixed

* add scroll

* minimal  change

* add the vue-resize library to control panel behavior

* change version

* add List Status Document

* process the document status from the workflow line

* change name file

Co-authored-by: Edwin Betancourt <EdwinBetanc0urt@hotmail.com>
2020-02-27 19:28:21 -04:00

403 lines
11 KiB
Vue

<template>
<!--
this v-show is to indicate that if the field is not shown,
therefore you should not leave the column size spacing of your
<el-col></el-col> container-->
<el-col
v-if="!inTable"
v-show="isDisplayed"
key="is-panel-template"
:xs="sizeFieldResponsive.xs"
:sm="sizeFieldResponsive.sm"
:md="sizeFieldResponsive.md"
:lg="sizeFieldResponsive.lg"
:xl="sizeFieldResponsive.xl"
:class="classField"
>
<el-form-item
:required="isMandatory()"
>
<template slot="label">
<field-operator-comparison
v-if="isAdvancedQuery && isDisplayed"
key="is-field-operator-comparison"
:field-attributes="fieldAttributes"
:field-value="field.value"
/>
<field-context-info
v-else-if="isContextInfo"
key="is-field-context-info"
:field-attributes="fieldAttributes"
:field-value="field.value"
/>
<span v-else key="is-field-name">
{{ isFieldOnly() }}
</span>
<field-document-status
v-if="isDocuemntStatus"
:field="fieldAttributes"
/>
<field-translated
v-if="field.isTranslated && !isAdvancedQuery"
:field-attributes="fieldAttributes"
:record-uuid="field.recordUuid"
/>
</template>
<component
:is="componentRender"
:ref="field.columnName"
:metadata="fieldAttributes"
:value-model="recordDataFields"
/>
</el-form-item>
</el-col>
<component
:is="componentRender"
v-else
key="is-table-template"
:class="classField"
:metadata="fieldAttributes"
:value-model="recordDataFields"
:in-table="true"
/>
</template>
<script>
import FieldContextInfo from '@/components/ADempiere/Field/fieldPopovers/fieldContextInfo'
import FieldDocumentStatus from '@/components/ADempiere/Field/fieldPopovers/fieldDocumentStatus'
import FieldOperatorComparison from '@/components/ADempiere/Field/fieldPopovers/fieldOperatorComparison'
import FieldTranslated from '@/components/ADempiere/Field/fieldPopovers/fieldTranslated'
import { FIELD_ONLY } from '@/components/ADempiere/Field/references'
import { DEFAULT_SIZE } from '@/components/ADempiere/Field/fieldSize'
import { fieldIsDisplayed } from '@/utils/ADempiere/dictionaryUtils'
import { showMessage } from '@/utils/ADempiere/notification'
/**
* This is the base component for linking the components according to the
* reference (or type of visualization) of each field
*/
export default {
name: 'FieldDefinition',
components: {
FieldContextInfo,
FieldDocumentStatus,
FieldOperatorComparison,
FieldTranslated
},
props: {
parentUuid: {
type: String,
default: ''
},
containerUuid: {
type: String,
default: ''
},
panelType: {
type: String,
default: 'window'
},
// receives the property that is an object with all the attributes
metadataField: {
type: Object,
default: () => ({})
},
recordDataFields: {
type: [Number, String, Boolean, Array, Object, Date],
default: undefined
},
inGroup: {
type: Boolean,
default: false
},
inTable: {
type: Boolean,
default: false
},
isAdvancedQuery: {
type: Boolean,
default: false
}
},
data() {
return {
field: {}
}
},
computed: {
// load the component that is indicated in the attributes of received property
componentRender() {
if (this.isSelectCreated) {
return () => import(`@/components/ADempiere/Field/FieldSelectMultiple`)
}
return () => import(`@/components/ADempiere/Field/${this.field.componentPath}`)
},
fieldAttributes() {
return {
...this.field,
panelType: this.panelType,
inTable: this.inTable,
isAdvancedQuery: this.isAdvancedQuery,
// DOM properties
required: this.isMandatory(),
readonly: this.isReadOnly(),
displayed: this.isDisplayed,
disabled: !this.field.isActive,
isSelectCreated: this.isSelectCreated
}
},
isDisplayed() {
if (this.isAdvancedQuery) {
return this.field.isShowedFromUser
}
return fieldIsDisplayed(this.field) && (this.isMandatory() || this.field.isShowedFromUser || this.inTable)
},
isSelectCreated() {
return this.isAdvancedQuery &&
!['FieldBinary', 'FieldDate', 'FieldSelect', 'FieldYesNo'].includes(this.field.componentPath) &&
['IN', 'NOT_IN'].includes(this.field.operator)
},
getWidth() {
return this.$store.getters.getWidthLayout
},
classField() {
if (this.inTable) {
return 'in-table'
}
return ''
},
getterIsShowedRecordNavigation() {
if (this.panelType === 'window') {
return this.$store.getters.getIsShowedRecordNavigation(this.parentUuid)
}
return false
},
sizeFieldResponsive() {
if (!this.isDisplayed) {
return DEFAULT_SIZE
}
const sizeField = this.field.sizeFieldFromType.size
const newSizes = {}
// in table set max width, used by browser result and tab children of window
if (this.inTable) {
newSizes.xs = 24
newSizes.sm = 24
newSizes.md = 24
newSizes.lg = 24
newSizes.xl = 24
return newSizes
}
if (this.isAdvancedQuery) {
newSizes.xs = 24
newSizes.sm = 24
newSizes.md = 12
newSizes.lg = 12
newSizes.xl = 12
return newSizes
}
if (this.panelType === 'window') {
if (this.field.componentPath === 'FieldTextLong') {
return sizeField
}
// two columns if is mobile or desktop and show record navigation
if (this.getWidth <= 768 || (this.getWidth >= 768 && this.getterIsShowedRecordNavigation)) {
newSizes.xs = 12
newSizes.sm = 12
newSizes.md = 12
newSizes.lg = 12
newSizes.xl = 12
return newSizes
} else if (this.inGroup && this.getWidth >= 992) {
newSizes.xs = sizeField.xs
newSizes.sm = sizeField.sm * 2
if (this.getWidth <= 1199) {
newSizes.md = sizeField.md
} else {
newSizes.md = sizeField.md * 2
}
if (this.field.groupAssigned !== '') {
newSizes.lg = sizeField.lg * 2
newSizes.xl = sizeField.xl * 2
} else {
newSizes.lg = sizeField.lg
newSizes.xl = sizeField.xl
}
return newSizes
}
return sizeField
}
return sizeField
},
getterContextProcessing() {
const processing = this.$store.getters.getContextProcessing(this.parentUuid)
if (processing === true || processing === 'Y') {
return true
}
return false
},
getterContextProcessed() {
const processed = this.$store.getters.getContextProcessed(this.parentUuid)
if (processed === true || processed === 'Y') {
return true
}
return false
},
processOrderUuid() {
return this.$store.getters.getOrders
},
isDocuemntStatus() {
if (this.panelType === 'window') {
if (this.field.columnName === 'DocStatus' && !this.isEmptyValue(this.processOrderUuid)) {
return true
}
}
return false
},
isContextInfo() {
if (!this.isAdvancedQuery) {
return (this.field.contextInfo && this.field.contextInfo.isActive) || this.field.reference.windowsList.length
}
return false
}
},
watch: {
metadataField(value) {
this.field = value
}
},
created() {
// assined field with prop
this.field = this.metadataField
},
methods: {
showMessage,
isReadOnly() {
if (this.isAdvancedQuery) {
if (['NULL', 'NOT_NULL'].includes(this.field.operator)) {
return true
}
return false
}
if (!this.field.isActive) {
return true
}
const isUpdateableAllFields = this.field.isReadOnly || this.field.isReadOnlyFromLogic
if (this.panelType === 'window') {
if (this.field.isAlwaysUpdateable) {
return false
}
if (this.getterContextProcessing) {
return true
}
if (this.getterContextProcessed) {
return true
}
// TODO: Evaluate record uuid without route.action
// edit mode is diferent to create new
let isWithRecord = this.field.recordUuid !== 'create-new'
if (this.inTable) {
isWithRecord = !this.isEmptyValue(this.field.recordUuid)
}
return (!this.field.isUpdateable && isWithRecord) || (isUpdateableAllFields || this.field.isReadOnlyFromForm)
} else if (this.panelType === 'browser') {
if (this.inTable) {
// browser result
return this.field.isReadOnly
}
// query criteria
return this.field.isReadOnlyFromLogic
}
// other type of panels (process/report)
return isUpdateableAllFields
},
isMandatory() {
if (this.isAdvancedQuery) {
return false
}
return this.field.isMandatory || this.field.isMandatoryFromLogic
},
isFieldOnly() {
if (this.inTable || this.field.isFieldOnly || this.verifyIsFieldOnly()) {
return undefined
}
return this.field.name
},
/**
* TODO: Evaluate the current field with the only fields contained in the
* constant FIELD_ONLY
* @return {boolean}
*/
verifyIsFieldOnly() {
const field = FIELD_ONLY.find(itemField => {
if (this.field.displayType === itemField.id) {
return true
}
})
return Boolean(field)
},
focusField() {
if (this.isDisplayed && this.isMandatory() && !this.isReadOnly()) {
this.$refs[this.field.columnName].activeFocus()
}
}
}
}
</script>
<style lang="scss">
.custom-tittle-popover {
font-size: 14px;
font-weight: bold;
float: left;
}
/**
* Separation between elements (item) of the form
*/
.el-form-item {
margin-bottom: 10px !important;
margin-left: 10px;
margin-right: 10px;
}
/**
* Reduce the spacing between the form element and its label
*/
.el-form--label-top .el-form-item__label {
padding-bottom: 0px !important;
}
.in-table {
margin-bottom: 0px !important;
margin-left: 0px;
margin-right: 0px;
}
/* Global Styles */
.el-textarea__inner:not(.in-table) {
min-height: 36px !important;
/*
height: 36px auto !important;
max-height: 54.2333px !important;
*/
}
/**
* Reduce the spacing between the form element and its label
*/
.el-form--label-top .el-form-item__label {
padding-bottom: 0px !important;
}
.pre-formatted {
white-space: pre;
}
</style>