1
0
mirror of https://github.com/PanJiaChen/vue-element-admin.git synced 2025-08-10 12:01:57 +08:00
Sofia Calderon 0b0d6a5f00
Inserted line breaks in side menu (#915)
* changed hover styling of card

* improved styling of menu cards

* other minor styling improvements in cards layout

* Fields always have same size

* style fix active-inactive text in yes-no-field

* moved popover to own component

* refactored labelPopover

* added info icon to label

* truncated placeholder

* bugfix - added missing method back in

* set resizable in textareas to false

* style fix for context info

* fixes due to merge form develop

* reverted padding for context info box

* inserted line breaks in side menu
2021-06-11 17:19:30 -04:00

368 lines
10 KiB
Vue

<!--
ADempiere-Vue (Frontend) for ADempiere ERP & CRM Smart Business Solution
Copyright (C) 2017-Present E.R.P. Consultores y Asociados, C.A.
Contributor(s): Yamel Senih ysenih@erpya.com www.erpya.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https:www.gnu.org/licenses/>.
-->
<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-->
<div v-if="!inTable">
<el-col
v-if="isDisplayed"
key="is-panel-template"
:xs="24"
:sm="12"
:md="8"
:lg="8"
:xl="8"
:class="classField"
>
<el-form-item>
<template slot="label">
<field-options
:metadata="fieldAttributes"
/>
</template>
<component
:is="componentRender"
:id="field.panelType !== 'form' ? field.columnName : ''"
:ref="field.columnName"
:metadata="fieldAttributes"
:value-model="recordDataFields"
/>
</el-form-item>
</el-col>
</div>
<component
:is="componentRender"
v-else
:id="field.panelType !== 'form' ? field.columnName : ''"
key="is-table-template"
:class="classField"
:metadata="fieldAttributes"
:value-model="recordDataFields"
:in-table="true"
/>
</template>
<script>
import { evalutateTypeField, fieldIsDisplayed } from '@/utils/ADempiere/dictionaryUtils'
import FieldOptions from '@/components/ADempiere/Field/FieldOptions'
/**
* 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: {
FieldOptions
},
props: {
// 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: {
isMobile() {
return this.$store.state.app.device === 'mobile'
},
// load the component that is indicated in the attributes of received property
componentRender() {
if (this.isEmptyValue(this.field.componentPath || !this.field.isSupported)) {
return () => import('@/components/ADempiere/Field/FieldText')
}
if (this.isSelectCreated) {
return () => import('@/components/ADempiere/Field/FieldSelectMultiple')
}
let field
switch (this.field.componentPath) {
case 'FieldAutocomplete':
field = () => import('@/components/ADempiere/Field/FieldAutocomplete')
break
case 'FieldBinary':
field = () => import('@/components/ADempiere/Field/FieldBinary')
break
case 'FieldButton':
field = () => import('@/components/ADempiere/Field/FieldButton')
break
case 'FieldColor':
field = () => import('@/components/ADempiere/Field/FieldColor')
break
case 'FieldDate':
field = () => import('@/components/ADempiere/Field/FieldDate')
break
case 'FieldImage':
field = () => import('@/components/ADempiere/Field/FieldImage')
break
case 'FieldLocation':
field = () => import('@/components/ADempiere/Field/FieldLocation')
break
case 'FieldLocator':
field = () => import('@/components/ADempiere/Field/FieldLocator')
break
case 'FieldNumber':
field = () => import('@/components/ADempiere/Field/FieldNumber')
break
case 'FieldSelect':
field = () => import('@/components/ADempiere/Field/FieldSelect')
break
case 'FieldText':
field = () => import('@/components/ADempiere/Field/FieldText')
break
case 'FieldTextLong':
field = () => import('@/components/ADempiere/Field/FieldTextLong')
break
case 'FieldTime':
field = () => import('@/components/ADempiere/Field/FieldTime')
break
case 'FieldYesNo':
field = () => import('@/components/ADempiere/Field/FieldYesNo')
break
}
return field
},
fieldAttributes() {
return {
...this.field,
inTable: this.inTable,
isPanelWindow: this.isPanelWindow,
isAdvancedQuery: this.isAdvancedQuery,
// DOM properties
required: this.isMandatory,
readonly: this.isReadOnly,
displayed: this.isDisplayed,
disabled: !this.field.isActive,
isSelectCreated: this.isSelectCreated,
placeholder: this.field.help ? this.field.help.slice(0, 40) + '...' : ''
}
},
isDisplayed() {
if (this.isAdvancedQuery) {
return this.field.isShowedFromUser
}
return fieldIsDisplayed(this.field) &&
(this.isMandatory || this.field.isShowedFromUser || this.inTable)
},
isMandatory() {
if (this.isAdvancedQuery) {
return false
}
return this.field.isMandatory || this.field.isMandatoryFromLogic
},
isPanelWindow() {
return this.field.panelType === 'window'
},
preferenceClientId() {
if (this.isPanelWindow) {
return this.$store.getters.getPreferenceClientId
}
return undefined
},
/**
* Idicate if field is read only
* TODO: Create common method to evaluate isReadOnly
*/
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.isPanelWindow) {
// TODO: Evaluate record uuid without route.action
// edit mode is diferent to create new
let isWithRecord = this.field.recordUuid !== 'create-new'
// evaluate context
if ((this.preferenceClientId !== this.metadataField.clientId) && isWithRecord) {
return true
}
if (this.field.isAlwaysUpdateable) {
return false
}
if (this.field.isProcessingContext || this.field.isProcessedContext) {
return true
}
if (this.inTable) {
isWithRecord = !this.isEmptyValue(this.field.recordUuid)
}
return (!this.field.isUpdateable && isWithRecord) ||
(isUpdateableAllFields || this.field.isReadOnlyFromForm)
} else if (this.field.panelType === 'browser') {
if (this.inTable) {
// browser result
return this.field.isReadOnly
}
// query criteria
return this.field.isReadOnlyFromLogic
}
// other type of panels (process/report)
return Boolean(isUpdateableAllFields)
},
isFieldOnly() {
if (this.inTable || this.field.isFieldOnly) {
return undefined
}
return this.field.name
},
isSelectCreated() {
return this.isAdvancedQuery &&
['IN', 'NOT_IN'].includes(this.field.operator) &&
!['FieldBinary', 'FieldDate', 'FieldSelect', 'FieldYesNo'].includes(this.field.componentPath)
},
getWidth() {
return this.$store.getters.getWidthLayout
},
classField() {
if (this.inTable) {
return 'in-table'
}
return ''
},
},
watch: {
metadataField(value) {
this.field = value
}
},
created() {
// assined field with prop
this.field = this.metadataField
if (this.field.isCustomField && !this.field.componentPath) {
let componentReference = evalutateTypeField(this.field.displayType)
if (this.isEmptyValue(componentReference)) {
componentReference = {
componentPath: 'FieldText'
}
}
this.field = {
...this.metadataField,
isActive: true,
isDisplayed: true,
isDisplayedFromLogic: true,
isShowedFromUser: true,
//
componentPath: componentReference.componentPath
}
}
},
methods: {
focusField() {
if (this.field.handleRequestFocus || (this.field.displayed && !this.field.readonly)) {
this.$refs[this.field.columnName].requestFocus()
}
}
}
}
</script>
<style lang="scss">
/**
* Separation between elements (item) of the form
*/
.el-form-item {
margin-bottom: 10px !important;
margin-left: 10px;
// this.field.isShowedRecordNavigation
margin-right: 10px;
}
/**
* Maximum height to avoid distorting the field list
*/
.el-form-item__content {
max-height: 36px !important;
}
/**
* 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;
}
/**
* Min height all text area, not into table
*/
.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;
}
.el-submenu__title {
padding: 0;
}
.el-submenu .el-submenu__icon-arrow {
visibility: hidden;
}
</style>