|
@@ -1,163 +1,243 @@
|
|
|
<template>
|
|
|
<div>
|
|
|
- <vxe-grid ref="xGrid" v-bind="gridOptions" v-on="gridEvents">
|
|
|
- <template #operate="{ row }">
|
|
|
- <template v-if="hasActiveEditRow(row)">
|
|
|
- <vxe-button content="取消" @click="clearRowEvent"></vxe-button>
|
|
|
- <vxe-button status="primary" content="保存" @click="saveRowEvent(row)"></vxe-button>
|
|
|
- </template>
|
|
|
- <template v-else>
|
|
|
- <vxe-button content="编辑" @click="editRowEvent(row)"></vxe-button>
|
|
|
- </template>
|
|
|
- <vxe-button status="danger" content="删除" @click="removeRowEvent(row)"></vxe-button>
|
|
|
+ <vxe-toolbar>
|
|
|
+ <template #buttons>
|
|
|
+ <vxe-button icon="vxe-icon-square-plus" @click="insertEvent()">新增</vxe-button>
|
|
|
</template>
|
|
|
+ </vxe-toolbar>
|
|
|
+ <vxe-table
|
|
|
+ border
|
|
|
+ show-overflow
|
|
|
+ ref="tableRef"
|
|
|
+ height="300"
|
|
|
+ :column-config="{resizable: true}"
|
|
|
+ :row-config="{isHover: true}"
|
|
|
+ :data="tableData"
|
|
|
+ @cell-dblclick="cellDBLClickEvent">
|
|
|
+ <vxe-column type="seq" width="60"></vxe-column>
|
|
|
+ <vxe-column field="name" title="Name"></vxe-column>
|
|
|
+ <vxe-column field="sex" title="Sex" :formatter="formatterSex"></vxe-column>
|
|
|
+ <vxe-column field="age" title="Age"></vxe-column>
|
|
|
+ <vxe-column field="address" title="Address" show-overflow></vxe-column>
|
|
|
+ <vxe-column title="操作" width="100" show-overflow>
|
|
|
+ <template #default="{ row }">
|
|
|
+ <vxe-button mode="text" icon="vxe-icon-edit" @click="editEvent(row)"></vxe-button>
|
|
|
+ <vxe-button mode="text" icon="vxe-icon-delete" @click="removeEvent(row)"></vxe-button>
|
|
|
+ </template>
|
|
|
+ </vxe-column>
|
|
|
+ </vxe-table>
|
|
|
|
|
|
- <template #Name_edit="{ row }">
|
|
|
- <vxe-input v-model="row.Name"></vxe-input>
|
|
|
- </template>
|
|
|
- <template #DailyDataHeader_edit="{ row }">
|
|
|
- <vxe-input v-model="row.DailyDataHeader"></vxe-input>
|
|
|
- </template>
|
|
|
- <template #WeeklyDataHeader_edit="{ row }">
|
|
|
- <vxe-input v-model="row.WeeklyDataHeader"></vxe-input>
|
|
|
- </template>
|
|
|
- <template #MonthlyDataHeader_edit="{ row }">
|
|
|
- <vxe-input v-model="row.MonthlyDataHeader"></vxe-input>
|
|
|
- </template>
|
|
|
- <template #CreationTime_edit="{ row }">
|
|
|
- <vxe-input v-model="row.CreationTime"></vxe-input>
|
|
|
+ <vxe-modal v-model="showEdit" :title="selectRow ? '编辑&保存' : '新增&保存'" width="800" min-width="600" min-height="300" :loading="submitLoading" resize destroy-on-close>
|
|
|
+ <template #default>
|
|
|
+ <vxe-form :data="formData" :rules="formRules" title-align="right" title-width="100" @submit="submitEvent">
|
|
|
+ <vxe-form-item title="Basic information" title-align="left" :title-width="200" :span="24" :title-prefix="{icon: 'vxe-icon-comment'}"></vxe-form-item>
|
|
|
+ <vxe-form-item field="name" title="Name" :span="12" :item-render="{}">
|
|
|
+ <template #default="{ data }">
|
|
|
+ <vxe-input v-model="data.name" placeholder="请输入名称"></vxe-input>
|
|
|
+ </template>
|
|
|
+ </vxe-form-item>
|
|
|
+ <vxe-form-item field="nickname" title="Nickname" :span="12" :item-render="{}">
|
|
|
+ <template #default="{ data }">
|
|
|
+ <vxe-input v-model="data.name" placeholder="请输入名称"></vxe-input>
|
|
|
+ </template>
|
|
|
+ </vxe-form-item>
|
|
|
+ <vxe-form-item field="role" title="Role" :span="12" :item-render="{}">
|
|
|
+ <template #default="{ data }">
|
|
|
+ <vxe-input v-model="data.name" placeholder="请输入角色"></vxe-input>
|
|
|
+ </template>
|
|
|
+ </vxe-form-item>
|
|
|
+ <vxe-form-item field="sex" title="Sex" :span="12" :item-render="{}">
|
|
|
+ <template #default="{ data }">
|
|
|
+ <vxe-select v-model="data.sex" transfer>
|
|
|
+ <vxe-option v-for="item in sexList" :key="item.value" :value="item.value" :label="item.label"></vxe-option>
|
|
|
+ </vxe-select>
|
|
|
+ </template>
|
|
|
+ </vxe-form-item>
|
|
|
+ <vxe-form-item field="age" title="Age" :span="12" :item-render="{}">
|
|
|
+ <template #default="{ data }">
|
|
|
+ <vxe-input v-model="data.age" type="number" placeholder="请输入年龄"></vxe-input>
|
|
|
+ </template>
|
|
|
+ </vxe-form-item>
|
|
|
+ <vxe-form-item field="flag1" title="是否单身" :span="12" :item-render="{}">
|
|
|
+ <template #default="{ data }">
|
|
|
+ <vxe-radio-group v-model="data.flag1">
|
|
|
+ <vxe-radio label="Y" content="是"></vxe-radio>
|
|
|
+ <vxe-radio label="N" content="否"></vxe-radio>
|
|
|
+ </vxe-radio-group>
|
|
|
+ </template>
|
|
|
+ </vxe-form-item>
|
|
|
+ <vxe-form-item field="checkedList" title="可选信息" :visible-method="visibleMethod" :span="24" :item-render="{}">
|
|
|
+ <template #default="{ data }">
|
|
|
+ <vxe-checkbox-group v-model="data.checkedList">
|
|
|
+ <vxe-checkbox label="1" content="运动、跑步"></vxe-checkbox>
|
|
|
+ <vxe-checkbox label="2" content="听音乐"></vxe-checkbox>
|
|
|
+ <vxe-checkbox label="3" content="爬山"></vxe-checkbox>
|
|
|
+ <vxe-checkbox label="4" content="吃美食"></vxe-checkbox>
|
|
|
+ </vxe-checkbox-group>
|
|
|
+ </template>
|
|
|
+ </vxe-form-item>
|
|
|
+ <vxe-form-item title="Other information" title-align="left" :title-width="200" :span="24" :title-prefix="{message: '请填写必填项', icon: 'vxe-icon-info-circle-fill'}"></vxe-form-item>
|
|
|
+ <vxe-form-item field="num" title="Number" :span="12" :item-render="{}">
|
|
|
+ <template #default="{ data }">
|
|
|
+ <vxe-input v-model="data.num" type="number" placeholder="请输入数值"></vxe-input>
|
|
|
+ </template>
|
|
|
+ </vxe-form-item>
|
|
|
+ <vxe-form-item field="date3" title="Date" :span="12" :item-render="{}">
|
|
|
+ <template #default="{ data }">
|
|
|
+ <vxe-input v-model="data.date3" type="date" placeholder="请选择日期" transfer></vxe-input>
|
|
|
+ </template>
|
|
|
+ </vxe-form-item>
|
|
|
+ <vxe-form-item field="address" title="Date" :span="24" :item-render="{}" :title-suffix="{message: '提示信息!!', icon: 'vxe-icon-question-circle-fill'}">
|
|
|
+ <template #default="{ data }">
|
|
|
+ <vxe-textarea v-model="data.address" :autosize="{minRows: 2, maxRows: 4}"></vxe-textarea>
|
|
|
+ </template>
|
|
|
+ </vxe-form-item>
|
|
|
+ <vxe-form-item align="center" title-align="left" :span="24">
|
|
|
+ <template #default>
|
|
|
+ <vxe-button type="submit">提交</vxe-button>
|
|
|
+ <vxe-button type="reset">重置</vxe-button>
|
|
|
+ </template>
|
|
|
+ </vxe-form-item>
|
|
|
+ </vxe-form>
|
|
|
</template>
|
|
|
- </vxe-grid>
|
|
|
+ </vxe-modal>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script lang="ts" setup>
|
|
|
-import { ref, reactive } from 'vue'
|
|
|
-import { VXETable, VxeGridInstance, VxeGridProps, VxeGridListeners } from 'vxe-table'
|
|
|
+import { reactive, ref } from 'vue'
|
|
|
+import { VXETable, VxeTableInstance, VxeColumnPropTypes, VxeFormPropTypes, VxeFormItemPropTypes, VxeTableEvents } from 'vxe-table'
|
|
|
|
|
|
interface RowVO {
|
|
|
- Name: string
|
|
|
- DailyDataHeader: string
|
|
|
- WeeklyDataHeader: string
|
|
|
- MonthlyDataHeader: string
|
|
|
- CreationTime: number
|
|
|
+ id: number
|
|
|
+ name: string
|
|
|
+ nickname: string
|
|
|
+ role: string
|
|
|
+ sex: string
|
|
|
+ sex2: string[]
|
|
|
+ num: number
|
|
|
+ num1: number
|
|
|
+ age: number
|
|
|
+ flag1: boolean
|
|
|
+ address: string
|
|
|
+ date12: string
|
|
|
+ date13: string
|
|
|
+ date3: string
|
|
|
+ checkedList: any[]
|
|
|
}
|
|
|
|
|
|
-const xGrid = ref<VxeGridInstance<RowVO>>()
|
|
|
-
|
|
|
-const gridOptions = reactive<VxeGridProps<RowVO>>({
|
|
|
- border: true,
|
|
|
- keepSource: true,
|
|
|
- showOverflow: true,
|
|
|
- height: 530,
|
|
|
- loading: false,
|
|
|
- columnConfig: {
|
|
|
- resizable: true
|
|
|
- },
|
|
|
- pagerConfig: {
|
|
|
- enabled: true,
|
|
|
- total: 0,
|
|
|
- currentPage: 1,
|
|
|
- pageSize: 10,
|
|
|
- pageSizes: [10, 20, 50, 100, 200, 500]
|
|
|
- },
|
|
|
- editConfig: {
|
|
|
- trigger: 'manual',
|
|
|
- mode: 'row',
|
|
|
- showStatus: true
|
|
|
- },
|
|
|
- columns: [
|
|
|
- { field: 'Name', title: '模板名称', editRender: { autofocus: '.vxe-input--inner' }, slots: { edit: 'Name_edit' } },
|
|
|
- { field: 'DailyDataHeader', title: '日数据表头', editRender: { autofocus: '.vxe-input--inner' }, slots: { edit: 'DailyDataHeader_edit' } },
|
|
|
- { field: 'WeeklyDataHeader', title: '周数据表头', editRender: {}, slots: { edit: 'WeeklyDataHeader_edit' } },
|
|
|
- { field: 'MonthlyDataHeader', title: '月数据表头', editRender: {}, slots: { edit: 'MonthlyDataHeader_edit' } },
|
|
|
- { field: 'CreationTime', title: '创建时间', editRender: {}, slots: { edit: 'CreationTime_edit' } },
|
|
|
- { title: '操作', width: 300, slots: { default: 'operate' } }
|
|
|
- ],
|
|
|
- data: []
|
|
|
+const tableRef = ref<VxeTableInstance<RowVO>>()
|
|
|
+
|
|
|
+const formData = reactive({
|
|
|
+ name: '',
|
|
|
+ nickname: '',
|
|
|
+ role: '',
|
|
|
+ sex: '',
|
|
|
+ age: 0,
|
|
|
+ num: 0,
|
|
|
+ checkedList: [] as any[],
|
|
|
+ flag1: false,
|
|
|
+ date3: '',
|
|
|
+ address: ''
|
|
|
})
|
|
|
|
|
|
+const submitLoading = ref(false)
|
|
|
+const showEdit = ref(false)
|
|
|
+const selectRow = ref<RowVO | null>()
|
|
|
+const tableData = ref<RowVO[]>([])
|
|
|
|
|
|
-const findList = () => {
|
|
|
- gridOptions.loading = true
|
|
|
- setTimeout(() => {
|
|
|
- gridOptions.loading = false
|
|
|
- if (gridOptions.pagerConfig) {
|
|
|
- gridOptions.pagerConfig.total = 10
|
|
|
- }
|
|
|
- gridOptions.data = [
|
|
|
- {
|
|
|
- Name: 'John Brown',
|
|
|
- DailyDataHeader: 'New York No. 1 Lake Park',
|
|
|
- WeeklyDataHeader: 'New York No. 1 Lake Park',
|
|
|
- MonthlyDataHeader: 'New York No. 1 Lake Park',
|
|
|
- 'CreationTime': '2016-10-03',
|
|
|
- },
|
|
|
- {
|
|
|
- Name: 'Jim Green',
|
|
|
- DailyDataHeader: 'London No. 1 Lake Park',
|
|
|
- WeeklyDataHeader: 'London No. 1 Lake Park',
|
|
|
- MonthlyDataHeader: 'London No. 1 Lake Park',
|
|
|
- 'CreationTime': '2016-10-01',
|
|
|
- },
|
|
|
- ]
|
|
|
- }, 300)
|
|
|
-}
|
|
|
+const sexList = ref([
|
|
|
+ { label: '女', value: '0' },
|
|
|
+ { label: '男', value: '1' }
|
|
|
+])
|
|
|
|
|
|
-const gridEvents: VxeGridListeners<RowVO> = {
|
|
|
- pageChange ({ currentPage, pageSize }) {
|
|
|
- if (gridOptions.pagerConfig) {
|
|
|
- gridOptions.pagerConfig.currentPage = currentPage
|
|
|
- gridOptions.pagerConfig.pageSize = pageSize
|
|
|
- }
|
|
|
- findList()
|
|
|
- }
|
|
|
+const formRules = reactive<VxeFormPropTypes.Rules>({
|
|
|
+ name: [
|
|
|
+ { required: true, message: '请输入名称' },
|
|
|
+ { min: 3, max: 5, message: '长度在 3 到 5 个字符' }
|
|
|
+ ],
|
|
|
+ nickname: [
|
|
|
+ { required: true, message: '请输入昵称' }
|
|
|
+ ],
|
|
|
+ sex: [
|
|
|
+ { required: true, message: '请选择性别' }
|
|
|
+ ]
|
|
|
+})
|
|
|
+
|
|
|
+const formatterSex: VxeColumnPropTypes.Formatter<RowVO> = ({ cellValue }) => {
|
|
|
+ const item = sexList.value.find(item => item.value === cellValue)
|
|
|
+ return item ? item.label : ''
|
|
|
}
|
|
|
|
|
|
-const hasActiveEditRow = (row: RowVO) => {
|
|
|
- const $grid = xGrid.value
|
|
|
- if ($grid) {
|
|
|
- return $grid.isEditByRow(row)
|
|
|
- }
|
|
|
- return false
|
|
|
+const visibleMethod: VxeFormItemPropTypes.VisibleMethod = ({ data }) => {
|
|
|
+ return data.flag1 === 'Y'
|
|
|
}
|
|
|
|
|
|
-const editRowEvent = (row: RowVO) => {
|
|
|
- const $grid = xGrid.value
|
|
|
- if ($grid) {
|
|
|
- $grid.setEditRow(row)
|
|
|
- }
|
|
|
+const insertEvent = () => {
|
|
|
+ Object.assign(formData, {
|
|
|
+ name: '',
|
|
|
+ nickname: '',
|
|
|
+ role: '',
|
|
|
+ sex: '',
|
|
|
+ age: 0,
|
|
|
+ num: 0,
|
|
|
+ checkedList: [],
|
|
|
+ flag1: false,
|
|
|
+ date3: '',
|
|
|
+ address: ''
|
|
|
+ })
|
|
|
+ selectRow.value = null
|
|
|
+ showEdit.value = true
|
|
|
}
|
|
|
|
|
|
-const clearRowEvent = () => {
|
|
|
- const $grid = xGrid.value
|
|
|
- if ($grid) {
|
|
|
- $grid.clearEdit()
|
|
|
- }
|
|
|
+const editEvent = (row: RowVO) => {
|
|
|
+ Object.assign(formData, row)
|
|
|
+ selectRow.value = row
|
|
|
+ showEdit.value = true
|
|
|
}
|
|
|
|
|
|
-const saveRowEvent = async (row: RowVO) => {
|
|
|
- const $grid = xGrid.value
|
|
|
- if ($grid) {
|
|
|
- await $grid.clearEdit()
|
|
|
- gridOptions.loading = true
|
|
|
- // 模拟异步保存
|
|
|
- setTimeout(() => {
|
|
|
- gridOptions.loading = false
|
|
|
- VXETable.modal.message({ content: `${JSON.stringify(row)}`, status: 'success' })
|
|
|
- }, 300)
|
|
|
- }
|
|
|
+const cellDBLClickEvent: VxeTableEvents.CellDblclick<RowVO> = ({ row }) => {
|
|
|
+ editEvent(row)
|
|
|
}
|
|
|
|
|
|
-const removeRowEvent = async (row: RowVO) => {
|
|
|
+const removeEvent = async (row: RowVO) => {
|
|
|
const type = await VXETable.modal.confirm('您确定要删除该数据?')
|
|
|
- const $grid = xGrid.value
|
|
|
- if ($grid) {
|
|
|
- if (type === 'confirm') {
|
|
|
- await $grid.remove(row)
|
|
|
+ if (type === 'confirm') {
|
|
|
+ const $table = tableRef.value
|
|
|
+ if ($table) {
|
|
|
+ $table.remove(row)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-findList()
|
|
|
-</script>
|
|
|
+const submitEvent = () => {
|
|
|
+ submitLoading.value = true
|
|
|
+ setTimeout(() => {
|
|
|
+ const $table = tableRef.value
|
|
|
+ if ($table) {
|
|
|
+ submitLoading.value = false
|
|
|
+ showEdit.value = false
|
|
|
+ if (selectRow.value) {
|
|
|
+ VXETable.modal.message({ content: '保存成功', status: 'success' })
|
|
|
+ Object.assign(selectRow.value, formData)
|
|
|
+ } else {
|
|
|
+ VXETable.modal.message({ content: '新增成功', status: 'success' })
|
|
|
+ $table.insert({ ...formData })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, 500)
|
|
|
+}
|
|
|
+
|
|
|
+setTimeout(() => {
|
|
|
+ const list: RowVO[] = [
|
|
|
+ { id: 10001, name: 'Test1', nickname: 'T1', role: 'Develop', sex: '0', sex2: ['0'], num: 40, num1: 40, age: 28, flag1: false, address: 'Shenzhen', date3: '', date12: '', date13: '', checkedList: [] },
|
|
|
+ { id: 10002, name: 'Test2', nickname: 'T2', role: 'Designer', sex: '1', sex2: ['0', '1'], num: 40, num1: 20, age: 22, flag1: false, address: 'Guangzhou', date3: '', date12: '', date13: '2020-08-20', checkedList: [] },
|
|
|
+ { id: 10003, name: 'Test3', nickname: 'T3', role: 'Test', sex: '0', sex2: ['1'], num: 4, num1: 200, age: 32, flag1: true, address: 'Shanghai', date3: '', date12: '2020-09-10', date13: '', checkedList: [] },
|
|
|
+ { id: 10004, name: 'Test4', nickname: 'T4', role: 'Designer', sex: '1', sex2: ['0'], num: 3, num1: 30, age: 23, flag1: false, address: 'Shenzhen', date3: '', date12: '', date13: '2020-12-04', checkedList: [] },
|
|
|
+ { id: 10004, name: 'Test5', nickname: 'T5', role: 'Designer', sex: '1', sex2: ['1'], num: 40, num1: 30, age: 26, flag1: true, address: 'Shenzhen', date3: '', date12: '', date13: '', checkedList: [] },
|
|
|
+ { id: 10004, name: 'Test6', nickname: 'T6', role: 'Designer', sex: '1', sex2: ['1'], num: 5, num1: 30, age: 28, flag1: false, address: 'BeiJing', date3: '', date12: '', date13: '2020-09-04', checkedList: [] },
|
|
|
+ { id: 10004, name: 'Test7', nickname: 'T7', role: 'Designer', sex: '1', sex2: ['1'], num: 40, num1: 30, age: 30, flag1: false, address: 'BeiJing', date3: '', date12: '', date13: '2020-04-10', checkedList: [] }
|
|
|
+ ]
|
|
|
+ tableData.value = list
|
|
|
+}, 100)
|
|
|
+</script>
|