RLR弹窗实现自定义编辑表格的功能

This commit is contained in:
renpy 2023-08-31 19:36:06 +08:00
parent c33fb7ecc3
commit 9812c461ab
4 changed files with 244 additions and 67 deletions

View File

@ -0,0 +1,50 @@
<template>
<div class="editable-cell">
<div v-if="editable" class="editable-cell-input-wrapper">
<a-input ref="myInput" :value="value" @change="handleChange" @blur="handleBlur" />
</div>
<div v-else class="editable-cell-text-wrapper" @click="handleCellClick">
{{ value || ' ' }}
</div>
</div>
</template>
<script>
export default {
props: {
text: String,
},
data() {
return {
value: this.text,
editable: false,
};
},
methods: {
handleCellClick() {
console.log("点击单元格");
this.editable = true
this.$nextTick(() => {
this.$refs.myInput.focus()
this.$refs.myInput.select()
})
},
handleChange(e) {
this.value = e.target.value
},
handleBlur() {
this.editable = false
this.$emit('change', this.value);
},
},
}
</script>
<style lang="less" scoped>
/deep/.ant-input{
padding: 0;
}
.editable-cell-text-wrapper {
min-height: 32px;
}
</style>

View File

@ -10,48 +10,56 @@ const columns = [
{
title: 'Index',
dataIndex: 'key',
align: 'center',
align: 'left',
customRender: (text,record,index) => `${index+1}`,//
},
{
title: 'Energy(keV)',
dataIndex: 'energy',
align: 'center'
align: 'left',
scopedSlots: { customRender: 'energy' }
},
{
title: 'Energy_err(%)',
dataIndex: 'energyErr',
align: 'center'
align: 'left',
scopedSlots: { customRender: 'energyErr' },
},
{
title: 'Net Area',
dataIndex: 'netArea',
align: 'center'
align: 'left',
scopedSlots: { customRender: 'netArea' },
},
{
title: 'Area_err(%)',
dataIndex: 'areaErr',
align: 'center'
align: 'left',
scopedSlots: { customRender: 'areaErr' },
},
{
title: 'NetCountRate',
dataIndex: 'netCountRate',
align: 'center'
align: 'left',
scopedSlots: { customRender: 'netCountRate' },
},
{
title: 'NCRate_err(%)',
dataIndex: 'ncRateErr',
align: 'center'
align: 'left',
scopedSlots: { customRender: 'ncRateErr' },
},
{
title: 'LC',
dataIndex: 'lc',
align: 'center'
align: 'left',
scopedSlots: { customRender: 'lc' },
},
{
title: 'Significance',
dataIndex: 'significance',
align: 'center'
align: 'left',
scopedSlots: { customRender: 'significance' },
}
]
@ -60,28 +68,16 @@ export default {
TableWithOperators
},
props: {
allData: {
type: Object,
default: ()=>{}
tableData: {
type: Array,
default: ()=>[]
},
},
watch: {
allData: {
handler(val) {
console.log(val);
},
deep: true,
immediate:true
}
},
data() {
this.columns = columns
return {
list: []
list: this.tableData
}
},
mounted () {
this.list = this.allData.peakFit
},
}
}
</script>

View File

@ -1,57 +1,34 @@
<template>
<div>
<div class="operators">
<a-button type="primary">Insert Before</a-button>
<a-button type="primary">Insert After</a-button>
<a-button type="primary">Delete</a-button>
<a-button type="primary" @click="insertBefore">Insert Before</a-button>
<a-button type="primary" @click="insertAfter">Insert After</a-button>
<a-button type="primary" @click="handleDelete">Delete</a-button>
</div>
<a-table
size="small"
:class="list.length ? 'has-data' : ''"
rowKey="id"
:class="dataSource.length ? 'has-data' : ''"
:columns="columns"
:dataSource="list"
:dataSource="dataSource"
:pagination="false"
:scroll="{ y: 470 }"
:customRow="customRow"
>
</a-table>
<template v-for="col in columns" :slot="col.dataIndex" slot-scope="text, record">
<editable-cell :text="text" :key="col.id" @change="onCellChange(record.id, col.dataIndex, $event)" />
</template>
</a-table>
</div>
</template>
<script>
const columns = [
{
title: 'Nuclide1',
dataIndex: 'nuclide1',
align: 'center'
},
{
title: 'Nuclide2',
dataIndex: 'nuclide2',
align: 'center'
},
{
title: 'Ratio',
dataIndex: 'ratio',
align: 'center'
},
{
title: 'Ratio_err(%)',
dataIndex: 'ratioErr',
align: 'center'
},
{
title: 'Reference Time',
dataIndex: 'referenceTime',
align: 'center'
},
{
title: 'Zero Time',
dataIndex: 'zeroTime',
align: 'center'
}
]
import EditableCell from './EditableCell.vue';
export default {
components: {
EditableCell,
},
props: {
columns: {
type: Array,
@ -61,7 +38,136 @@ export default {
type: Array,
required: true
}
}
},
data() {
return {
selectedKey: "",
dataSource: this.list,
isEmpty:false
}
},
mounted() {
this.dataSource.forEach((item, index) => {
item.id = this.guid()
})
this.initList()
},
methods: {
guid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0,
v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
},
// /
customRow(record, index) {
const that = this;
return {
class: that.selectedKey==record.id ? 'ant-table-row-selected' : '',
on: {
click: () => {
console.log("选中行",record.id);
that.selectedKey = record.id
}
}
}
},
initList() {
let arr = []
let keys = 0
this.dataSource.forEach((item,index) => {
let num = 0
keys=Object.keys(item).length
Object.keys(item).forEach(key => {
if (item[key]!=="") {
num++
}
})
arr[index] = num
})
let idx = arr.findIndex(cont => {
return cont!==keys
})
if (idx>-1) {
this.isEmpty = true
} else {
this.isEmpty = false
}
sessionStorage.setItem("isCellEmpty",this.isEmpty)
},
insertBefore() {
this.initList()
if (this.isEmpty) {
this.$message.warning("Please finishi ti edit new inserted row first.")
} else {
let obj = {
id: this.guid(),
energy: "",
energyErr: "",
netArea: "",
areaErr: "",
netCountRate: "",
ncRateErr: "",
lc: "",
significance: ""
}
if (this.selectedKey) {
let idx = this.dataSource.findIndex(item => {
return item.id === this.selectedKey
})
this.dataSource.splice(idx, 0, obj)
} else {
this.dataSource.unshift(obj)
}
sessionStorage.setItem("isCellEmpty",true)
this.selectedKey = obj.id
}
},
insertAfter() {
if (this.isEmpty) {
this.$message.warning("Please finishi ti edit new inserted row first.")
} else {
let obj = {
id:this.guid(),
energy: "",
energyErr: "",
netArea: "",
areaErr: "",
netCountRate: "",
ncRateErr: "",
lc: "",
significance: ""
}
if (this.selectedKey) {
let idx = this.dataSource.findIndex(item => {
return item.id === this.selectedKey
})
this.dataSource.splice(idx+1, 0, obj)
} else {
this.dataSource.push(obj)
}
sessionStorage.setItem("isCellEmpty",true)
this.selectedKey = obj.id
}
},
handleDelete() {
let idx = this.list.findIndex(item => {
return item.id === this.selectedKey
})
console.log(idx);
this.dataSource.splice(idx,1)
},
onCellChange(id, dataIndex, value) {
const dataSource = [...this.dataSource];
const target = dataSource.find(item => item.id === id);
if (target) {
target[dataIndex] = value;
this.dataSource = dataSource;
}
this.initList()
}
},
}
</script>

View File

@ -8,7 +8,7 @@
:class="activeKey == index ? 'active' : ''"
v-for="(tab, index) in tabs"
:key="index"
@click="activeKey = index"
@click="handleChangeView(index)"
>
{{ tab }}
</div>
@ -35,7 +35,7 @@
<peaks-method :allData="allInfo" />
</template>
<template v-if="activeKey == 6">
<peak-fit :allData="allInfo" />
<peak-fit :tableData="allInfo.peakFit" />
</template>
<template v-if="activeKey == 7">
<g-analysis-methods :allData="allInfo" />
@ -68,6 +68,12 @@
</div>
</div>
</a-spin>
<div slot="custom-footer" style="text-align: center;">
<a-space :size="20">
<a-button type="primary" @click="handleSave">Save</a-button>
<a-button @click="visible = false">Cancel</a-button>
</a-space>
</div>
</custom-modal>
</template>
@ -143,7 +149,26 @@ export default {
allInfo: {}
}
},
mounted () {
sessionStorage.setItem("isCellEmpty",false);
},
methods: {
handleSave() {
let val = sessionStorage.getItem("isCellEmpty")
if (val=="false") {
this.visible = false
} else {
this.$message.warning("Please finishi ti edit new inserted row first.")
}
},
handleChangeView(index) {
let val = sessionStorage.getItem("isCellEmpty")
if (val=="false") {
this.activeKey = index
} else {
this.$message.warning("Please finishi ti edit new inserted row first.")
}
},
beforeModalOpen() {
this.activeKey = 0
this.getGammaViewRLR();