mirror of
https://github.com/PanJiaChen/vue-element-admin.git
synced 2025-08-10 20:39:48 +08:00
feat: Add default table to replace data table. (#942)
* feat: Add default table to replace data table. * fix eslint * use formatPrice and formatQuantity
This commit is contained in:
parent
69ba12d833
commit
415ece6e36
126
src/components/ADempiere/DefaultTable/CellInfo.vue
Normal file
126
src/components/ADempiere/DefaultTable/CellInfo.vue
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
<template>
|
||||||
|
<el-tag
|
||||||
|
v-if="isDocumentStatus"
|
||||||
|
key="document-status"
|
||||||
|
:type="documentStatus"
|
||||||
|
disable-transitions
|
||||||
|
>
|
||||||
|
{{ displayedValue }}
|
||||||
|
</el-tag>
|
||||||
|
|
||||||
|
<span v-else key="info-value">
|
||||||
|
{{ displayedValue }}
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { defineComponent, computed } from '@vue/composition-api'
|
||||||
|
|
||||||
|
import { COLUMNS_NAME_DOCUMENT_STATUS, FIELDS_CURRENCY } from '@/utils/ADempiere/references.js'
|
||||||
|
import { typeValue } from '@/utils/ADempiere/valueUtils.js'
|
||||||
|
import {
|
||||||
|
formatField, formatPrice, formatQuantity, convertBooleanToTranslationLang
|
||||||
|
} from '@/utils/ADempiere/valueFormat.js'
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'CellInfo',
|
||||||
|
|
||||||
|
props: {
|
||||||
|
fieldAttributes: {
|
||||||
|
type: Object,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
dataRow: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
setup(props, { root }) {
|
||||||
|
const { columnName } = props.fieldAttributes
|
||||||
|
const fieldValue = props.dataRow[columnName]
|
||||||
|
|
||||||
|
const isDocumentStatus = computed(() => {
|
||||||
|
return COLUMNS_NAME_DOCUMENT_STATUS.includes(columnName)
|
||||||
|
})
|
||||||
|
|
||||||
|
const displayedValue = computed(() => {
|
||||||
|
return formatValue(props.dataRow, props.fieldAttributes)
|
||||||
|
})
|
||||||
|
|
||||||
|
const documentStatus = computed(() => {
|
||||||
|
return root.tagStatus(fieldValue)
|
||||||
|
})
|
||||||
|
|
||||||
|
const formatNumber = ({ displayType, value }) => {
|
||||||
|
if (root.isEmptyValue(value)) {
|
||||||
|
value = 0
|
||||||
|
}
|
||||||
|
// Amount, Costs+Prices
|
||||||
|
if (FIELDS_CURRENCY.includes(displayType)) {
|
||||||
|
return formatPrice(value)
|
||||||
|
}
|
||||||
|
return formatQuantity(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {object} row, row data
|
||||||
|
* @param {object} field, field with attributes
|
||||||
|
*/
|
||||||
|
const formatValue = (row, field) => {
|
||||||
|
const { componentPath, displayColumnName, displayType } = field
|
||||||
|
|
||||||
|
let valueToShow
|
||||||
|
switch (componentPath) {
|
||||||
|
case 'FieldDate':
|
||||||
|
case 'FieldTime': {
|
||||||
|
let cell = fieldValue
|
||||||
|
if (typeValue(cell) === 'DATE') {
|
||||||
|
cell = cell.getTime()
|
||||||
|
}
|
||||||
|
// replace number timestamp value for date
|
||||||
|
valueToShow = formatField(cell, displayType)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'FieldNumber':
|
||||||
|
if (root.isEmptyValue(fieldValue)) {
|
||||||
|
valueToShow = undefined
|
||||||
|
break
|
||||||
|
}
|
||||||
|
valueToShow = formatNumber({
|
||||||
|
displayType,
|
||||||
|
value: fieldValue
|
||||||
|
})
|
||||||
|
break
|
||||||
|
|
||||||
|
case 'FieldSelect':
|
||||||
|
valueToShow = row[displayColumnName]
|
||||||
|
if (root.isEmptyValue(valueToShow) && fieldValue === 0) {
|
||||||
|
valueToShow = field.defaultValue
|
||||||
|
break
|
||||||
|
}
|
||||||
|
break
|
||||||
|
|
||||||
|
case 'FieldYesNo':
|
||||||
|
// replace boolean true-false value for 'Yes' or 'Not' ('Si' or 'No' for spanish)
|
||||||
|
valueToShow = convertBooleanToTranslationLang(fieldValue)
|
||||||
|
break
|
||||||
|
|
||||||
|
default:
|
||||||
|
valueToShow = fieldValue
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
return valueToShow
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
// computeds
|
||||||
|
isDocumentStatus,
|
||||||
|
documentStatus,
|
||||||
|
displayedValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
179
src/components/ADempiere/DefaultTable/index.vue
Normal file
179
src/components/ADempiere/DefaultTable/index.vue
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
<!--
|
||||||
|
ADempiere-Vue (Frontend) for ADempiere ERP & CRM Smart Business Solution
|
||||||
|
Copyright (C) 2017-Present E.R.P. Consultores y Asociados, C.A.
|
||||||
|
Contributor(s): Edwin Betancourt EdwinBetanc0urt@outlook.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>
|
||||||
|
<el-main style="padding: 0px !important; overflow: hidden;">
|
||||||
|
<el-table
|
||||||
|
ref="multipleTable"
|
||||||
|
style="width: 100%"
|
||||||
|
border
|
||||||
|
:row-key="keyColumn"
|
||||||
|
reserve-selection
|
||||||
|
highlight-current-row
|
||||||
|
:data="[]"
|
||||||
|
:element-loading-text="$t('notifications.loading')"
|
||||||
|
element-loading-background="rgba(255, 255, 255, 0.8)"
|
||||||
|
@row-click="handleRowClick"
|
||||||
|
>
|
||||||
|
<!-- column with the checkbox -->
|
||||||
|
<el-table-column
|
||||||
|
type="selection"
|
||||||
|
:prop="keyColumn"
|
||||||
|
fixed
|
||||||
|
min-width="50"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<template v-for="(fieldAttributes, key) in fieldsList">
|
||||||
|
<el-table-column
|
||||||
|
v-if="isDisplayed(fieldAttributes)"
|
||||||
|
:key="key"
|
||||||
|
:label="headerLabel(fieldAttributes)"
|
||||||
|
:column-key="fieldAttributes.columnName"
|
||||||
|
:prop="fieldAttributes.columnName"
|
||||||
|
sortable
|
||||||
|
min-width="200"
|
||||||
|
:fixed="fieldAttributes.isFixedTableColumn"
|
||||||
|
>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<!-- formatted displayed value -->
|
||||||
|
<cell-info
|
||||||
|
:field-attributes="fieldAttributes"
|
||||||
|
:data-row="scope.row"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</template>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<!-- pagination table, set custom or use default change page method -->
|
||||||
|
<custom-pagination
|
||||||
|
:total="0"
|
||||||
|
:current-page="1"
|
||||||
|
:selection="0"
|
||||||
|
:handle-change-page="handleChangePage"
|
||||||
|
/>
|
||||||
|
</el-main>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { defineComponent, computed } from '@vue/composition-api'
|
||||||
|
|
||||||
|
import FieldDefinition from '@/components/ADempiere/Field'
|
||||||
|
import CellInfo from './CellInfo'
|
||||||
|
import CustomPagination from '@/components/ADempiere/Pagination'
|
||||||
|
import { fieldIsDisplayed } from '@/utils/ADempiere/dictionaryUtils'
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'DefaultTable',
|
||||||
|
|
||||||
|
components: {
|
||||||
|
CellInfo,
|
||||||
|
CustomPagination,
|
||||||
|
FieldDefinition
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
parentUuid: {
|
||||||
|
type: String,
|
||||||
|
default: undefined
|
||||||
|
},
|
||||||
|
containerUuid: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
setup(props, { root }) {
|
||||||
|
const panelMetadata = computed(() => {
|
||||||
|
return root.$store.getters.getPanel(props.containerUuid)
|
||||||
|
})
|
||||||
|
|
||||||
|
const keyColumn = computed(() => {
|
||||||
|
if (panelMetadata.value) {
|
||||||
|
return panelMetadata.value.keyColumn
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const fieldsList = computed(() => {
|
||||||
|
const panel = panelMetadata.value
|
||||||
|
if (panel && panel.fieldsList) {
|
||||||
|
return panel.fieldsList
|
||||||
|
}
|
||||||
|
return []
|
||||||
|
})
|
||||||
|
|
||||||
|
const handleRowClick = (row, column, event) => {
|
||||||
|
// this.currentTable = this.recordsData.findIndex(item => item.UUID === row.UUID)
|
||||||
|
// if (this.uuidCurrentRecordSelected !== row.UUID) {
|
||||||
|
// this.uuidCurrentRecordSelected = row.UUID
|
||||||
|
// // disabled rollback when change route
|
||||||
|
// // root.$store.dispatch('setDataLog', {})
|
||||||
|
// }
|
||||||
|
const tableName = panelMetadata.value.tableName
|
||||||
|
// TODO: Replace with general dispatch to set current record
|
||||||
|
root.$router.push({
|
||||||
|
name: root.$route.name,
|
||||||
|
query: {
|
||||||
|
...root.$route.query,
|
||||||
|
action: row.UUID
|
||||||
|
},
|
||||||
|
params: {
|
||||||
|
...root.$router.params,
|
||||||
|
tableName,
|
||||||
|
recordId: row[`${tableName}_ID`]
|
||||||
|
}
|
||||||
|
}, () => {})
|
||||||
|
// root.$store.commit('setCurrentRecord', row)
|
||||||
|
}
|
||||||
|
|
||||||
|
const headerLabel = (field) => {
|
||||||
|
if (field.isMandatory || field.isMandatoryFromLogic) {
|
||||||
|
return '* ' + field.name
|
||||||
|
}
|
||||||
|
|
||||||
|
return field.name
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify is displayed column/field in table
|
||||||
|
*/
|
||||||
|
const isDisplayed = (field) => {
|
||||||
|
return fieldIsDisplayed(field, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* custom method to handle change page
|
||||||
|
*/
|
||||||
|
const handleChangePage = () => {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
// computeds
|
||||||
|
keyColumn,
|
||||||
|
panelMetadata,
|
||||||
|
fieldsList,
|
||||||
|
// methods
|
||||||
|
headerLabel,
|
||||||
|
handleChangePage,
|
||||||
|
handleRowClick,
|
||||||
|
isDisplayed
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
@ -626,6 +626,11 @@ export const COLUMNS_NAME_READ_ONLY = [
|
|||||||
COLUMN_PROCESSING.columnName
|
COLUMN_PROCESSING.columnName
|
||||||
]
|
]
|
||||||
|
|
||||||
|
export const COLUMNS_NAME_DOCUMENT_STATUS = [
|
||||||
|
'DocStatus',
|
||||||
|
'O_DocStatus'
|
||||||
|
]
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fields with this column name, changed all fields is read only
|
* Fields with this column name, changed all fields is read only
|
||||||
*/
|
*/
|
||||||
|
@ -58,10 +58,9 @@
|
|||||||
</el-collapse-item>
|
</el-collapse-item>
|
||||||
</el-collapse>
|
</el-collapse>
|
||||||
|
|
||||||
<data-table
|
<!-- result of records in the table -->
|
||||||
|
<default-table
|
||||||
:container-uuid="browserUuid"
|
:container-uuid="browserUuid"
|
||||||
:panel-type="panelType"
|
|
||||||
:metadata="browserMetadata"
|
|
||||||
/>
|
/>
|
||||||
</el-main>
|
</el-main>
|
||||||
</el-container>
|
</el-container>
|
||||||
@ -83,14 +82,14 @@ import ContextMenu from '@/components/ADempiere/ContextMenu'
|
|||||||
import ModalDialog from '@/components/ADempiere/Dialog'
|
import ModalDialog from '@/components/ADempiere/Dialog'
|
||||||
import TitleAndHelp from '@/components/ADempiere/TitleAndHelp'
|
import TitleAndHelp from '@/components/ADempiere/TitleAndHelp'
|
||||||
import PanelDefinition from '@/components/ADempiere/PanelDefinition'
|
import PanelDefinition from '@/components/ADempiere/PanelDefinition'
|
||||||
import DataTable from '@/components/ADempiere/DataTable'
|
import DefaultTable from '@/components/ADempiere/DefaultTable'
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'BrowserView',
|
name: 'BrowserView',
|
||||||
|
|
||||||
components: {
|
components: {
|
||||||
ContextMenu,
|
ContextMenu,
|
||||||
DataTable,
|
DefaultTable,
|
||||||
ModalDialog,
|
ModalDialog,
|
||||||
PanelDefinition,
|
PanelDefinition,
|
||||||
TitleAndHelp
|
TitleAndHelp
|
||||||
|
Loading…
x
Reference in New Issue
Block a user