173 lines
4.3 KiB
Vue
173 lines
4.3 KiB
Vue
<script>
|
|
import AiDialogBtn from "dui/packages/layout/AiDialogBtn.vue";
|
|
import Template from "../../../../project/sass/apps/AppAskForm/components/Template.vue";
|
|
|
|
export default {
|
|
name: "tableEditor",
|
|
components: {Template, AiDialogBtn},
|
|
model: {
|
|
event: "input",
|
|
prop: "tableData"
|
|
},
|
|
props: {
|
|
label: String,
|
|
tableData: {default: () => []},
|
|
configs: {default: () => []}
|
|
},
|
|
data() {
|
|
return {
|
|
records: [],
|
|
form: {}
|
|
}
|
|
},
|
|
computed: {
|
|
option() {
|
|
return {
|
|
size: 'mini',
|
|
filterDic: true,
|
|
cellBtn: true,
|
|
menuWidth: 120,
|
|
addBtn: false,
|
|
columnBtn: false,
|
|
refreshBtn: false,
|
|
border: true,
|
|
delBtnText: " ",
|
|
editBtnText: " ",
|
|
saveBtnText: " ",
|
|
saveBtnIcon: "el-icon-check",
|
|
cancelBtnText: " ",
|
|
cancelBtnIcon: "el-icon-close",
|
|
column: this.configs.map(e => {
|
|
const item = this.$copy(e)
|
|
delete item.$index
|
|
delete item.$cellEdit
|
|
return {...item, cell: true}
|
|
})
|
|
}
|
|
},
|
|
columns:v=>v.configs
|
|
},
|
|
methods: {
|
|
rowSave(form, done) {
|
|
this.$emit("input", this.records)
|
|
this.$emit("data", this.getFormatData())
|
|
done()
|
|
},
|
|
rowDel(form, index) {
|
|
this.$confirm("是否要删除该行?").then(() => {
|
|
this.records.splice(index, 1)
|
|
this.$emit("data", this.getFormatData())
|
|
}).catch(() => 0)
|
|
},
|
|
getFormatData() {
|
|
return this.configs.map((c, i) => {
|
|
const item = {name: c.label}
|
|
this.records.map((row, j) => item[`v${j || ""}`] = row[`c${i || ""}`])
|
|
return item
|
|
})
|
|
},
|
|
addColumn() {
|
|
return this.$refs.addColumn.validate().then(() => {
|
|
const cols = this.$copy(this.configs)
|
|
const prop = `c${cols.length}`
|
|
cols.push({label: this.form.label, prop})
|
|
return this.$emit("update:configs", cols)
|
|
})
|
|
}
|
|
},
|
|
created() {
|
|
this.records = this.tableData.map(e => ({$cellEdit: true, ...e}))
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<section class="tableEditor">
|
|
<avue-crud :option="option" :data="records" @row-save="rowSave" @row-cancel="rowSave" @row-del="rowDel">
|
|
<template v-for="c in columns" :slot="`${c.prop}Header`" slot-scope="{column = {}}">
|
|
<el-input class="headerInput" v-model="column.label" clearable placeholder="请输入列名" @change="$emit('update:configs', columns)"/>
|
|
</template>
|
|
<template v-if="label" v-slot:menuLeft>
|
|
<div class="label" v-text="label"/>
|
|
</template>
|
|
<template v-slot:menuRight>
|
|
<div class="flex">
|
|
<ai-dialog-btn dialogTitle="增加列" appendToBody :submit="addColumn" @closed="form={}" width="400px">
|
|
<div slot="btn" class="el-icon-plus pointer">增加列</div>
|
|
<el-form ref="addColumn" :model="form" size="small" labelWidth="60px">
|
|
<el-form-item label="列名" :rule="{required:true, message:'请输入列名'}">
|
|
<el-input v-model="form.label" clearable placeholder="请输入列名"/>
|
|
</el-form-item>
|
|
</el-form>
|
|
</ai-dialog-btn>
|
|
<div class="el-icon-plus pointer mar-l8" @click="records.push({$cellEdit: true})">增加数据</div>
|
|
</div>
|
|
</template>
|
|
</avue-crud>
|
|
</section>
|
|
</template>
|
|
<style scoped lang="scss">
|
|
.tableEditor {
|
|
width: 100%;
|
|
height: auto;
|
|
margin-bottom: 10px;
|
|
|
|
:deep(.avue-crud__body) {
|
|
background-color: transparent;
|
|
|
|
.avue-crud__header, .el-table, tr {
|
|
background-color: transparent;
|
|
}
|
|
|
|
.avue-crud__header {
|
|
min-height: unset;
|
|
}
|
|
|
|
.el-table__cell {
|
|
color: white;
|
|
background-color: #1D2127;
|
|
|
|
input:disabled {
|
|
background-color: transparent;
|
|
border-color: transparent;
|
|
color: white;
|
|
padding: 0;
|
|
}
|
|
|
|
&:last-of-type {
|
|
border-left: 1px solid #fff;
|
|
}
|
|
}
|
|
|
|
.label {
|
|
width: 60px;
|
|
color: #FFFFFF;
|
|
font-size: 12px;
|
|
text-align: right;
|
|
}
|
|
|
|
.el-icon-plus {
|
|
font-size: 12px;
|
|
color: $primaryColor;
|
|
line-height: 18px;
|
|
|
|
&:before {
|
|
margin-right: 4px;
|
|
}
|
|
}
|
|
}
|
|
|
|
&:last-of-type {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
:deep(.headerInput) {
|
|
.el-input__inner {
|
|
padding: 0;
|
|
border: none;
|
|
background: transparent;
|
|
}
|
|
}
|
|
}
|
|
</style>
|