dataease/frontend/src/views/dataset/data/UnionView.vue

352 lines
12 KiB
Vue
Raw Normal View History

<template>
<el-row>
2021-07-06 19:26:15 +08:00
<el-button v-if="hasDataPermission('manage',param.privileges)" size="mini" @click="showUnionEdit">{{ $t('dataset.add_union') }}</el-button>
<el-row>
<el-table
size="mini"
:data="unionData"
2021-05-12 16:39:53 +08:00
:height="height"
border
style="width: 100%;margin-top: 10px;"
>
<el-table-column
prop="sourceTableName"
:label="$t('dataset.source_table')"
/>
<el-table-column
prop="sourceTableFieldName"
:label="$t('dataset.source_field')"
/>
<el-table-column
prop="sourceUnionRelation"
:label="$t('dataset.union_relation')"
>
<template slot-scope="scope">
<span style="font-size: 12px;">
<span v-if="scope.row.sourceUnionRelation === '1:N'">{{ $t('dataset.left_join') }}</span>
<span v-if="scope.row.sourceUnionRelation === 'N:1'">{{ $t('dataset.right_join') }}</span>
<span v-if="scope.row.sourceUnionRelation === '1:1'">{{ $t('dataset.inner_join') }}</span>
<span v-if="scope.row.sourceUnionRelation === 'N:N'">{{ $t('dataset.full_join') }}</span>
</span>
</template>
</el-table-column>
<el-table-column
prop="targetTableName"
:label="$t('dataset.target_table')"
/>
<el-table-column
prop="targetTableFieldName"
:label="$t('dataset.target_field')"
/>
<el-table-column
2021-05-12 16:39:53 +08:00
align="left"
:label="$t('dataset.operate')"
>
<template slot-scope="scope">
2021-07-06 19:26:15 +08:00
<el-button v-if="hasDataPermission('manage',param.privileges)" type="text" size="mini" @click="edit(scope.row)">{{ $t('dataset.edit') }}</el-button>
<el-button v-if="hasDataPermission('manage',param.privileges)" type="text" size="mini" @click="deleteUnion(scope.row)">{{ $t('dataset.delete') }}</el-button>
</template>
</el-table-column>
</el-table>
</el-row>
<el-dialog
v-dialogDrag
:title="$t('dataset.union_setting')"
:visible="editUnion"
:show-close="false"
width="600px"
class="dialog-css"
>
<el-row style="display: flex;align-items: center;justify-content: center;">
<el-col :span="6">
<p class="table-name-css" :title="table.name">{{ table.name }}</p>
<el-select v-model="union.sourceTableFieldId" :placeholder="$t('dataset.pls_slc_union_field')" filterable clearable size="mini">
<el-option
v-for="item in sourceFieldOption"
:key="item.id"
:label="item.name"
:value="item.id"
>
<span>
<span v-if="item.deType === 0">
<svg-icon v-if="item.deType === 0" icon-class="field_text" class="field-icon-text" />
</span>
<span v-if="item.deType === 1">
<svg-icon v-if="item.deType === 1" icon-class="field_time" class="field-icon-time" />
</span>
<span v-if="item.deType === 2 || item.deType === 3">
<svg-icon v-if="item.deType === 2 || item.deType === 3" icon-class="field_value" class="field-icon-value" />
</span>
<span v-if="item.deType === 5">
<svg-icon v-if="item.deType === 5" icon-class="field_location" class="field-icon-location" />
</span>
</span>
<span>
{{ item.name }}
</span>
</el-option>
</el-select>
</el-col>
<el-col :span="6">
<el-radio-group v-model="union.sourceUnionRelation" size="mini" style="display: block;width: 100%;text-align: center;">
<el-radio class="union-relation-css" label="1:N">{{ $t('dataset.left_join') }}</el-radio>
<el-radio class="union-relation-css" label="N:1">{{ $t('dataset.right_join') }}</el-radio>
<el-radio class="union-relation-css" label="1:1">{{ $t('dataset.inner_join') }}</el-radio>
<!-- <el-radio class="union-relation-css" label="N:N">{{ $t('dataset.full_join') }}</el-radio>-->
</el-radio-group>
</el-col>
<el-col :span="6">
<el-popover
2021-05-08 10:36:06 +08:00
ref="targetTable"
placement="bottom"
2021-05-08 10:36:06 +08:00
width="500"
trigger="click"
>
<dataset-group-selector-tree :fix-height="true" show-mode="union" :custom-type="customType" :mode="table.mode" @getTable="getTable" />
<el-button slot="reference" size="mini" style="width: 100%;">
<p class="table-name-css" :title="targetTable.name || $t('dataset.pls_slc_union_table')">{{ targetTable.name || $t('dataset.pls_slc_union_table') }}</p>
</el-button>
</el-popover>
<el-select v-model="union.targetTableFieldId" :placeholder="$t('dataset.pls_slc_union_field')" filterable clearable size="mini">
<el-option
v-for="item in targetFieldOption"
:key="item.id"
:label="item.name"
:value="item.id"
>
<span>
<span v-if="item.deType === 0">
<svg-icon v-if="item.deType === 0" icon-class="field_text" class="field-icon-text" />
</span>
<span v-if="item.deType === 1">
<svg-icon v-if="item.deType === 1" icon-class="field_time" class="field-icon-time" />
</span>
<span v-if="item.deType === 2 || item.deType === 3">
<svg-icon v-if="item.deType === 2 || item.deType === 3" icon-class="field_value" class="field-icon-value" />
</span>
<span v-if="item.deType === 5">
<svg-icon v-if="item.deType === 5" icon-class="field_location" class="field-icon-location" />
</span>
</span>
<span>
{{ item.name }}
</span>
</el-option>
</el-select>
</el-col>
</el-row>
<div slot="footer" class="dialog-footer">
<el-button size="mini" @click="closeUnion">{{ $t('dataset.cancel') }}</el-button>
<el-button type="primary" size="mini" @click="saveUnion">{{ $t('dataset.confirm') }}</el-button>
</div>
</el-dialog>
</el-row>
</template>
<script>
import { post, fieldList } from '../../../api/dataset/dataset'
import DatasetGroupSelectorTree from '../common/DatasetGroupSelectorTree'
export default {
name: 'UnionView',
components: { DatasetGroupSelectorTree },
props: {
table: {
type: Object,
required: true
2021-07-06 19:26:15 +08:00
},
param: {
type: Object,
required: true
}
},
data() {
return {
2021-05-12 16:39:53 +08:00
height: 500,
union: {
id: null,
sourceTableId: this.table.id,
sourceTableFieldId: '',
sourceUnionRelation: '',
targetTableId: '',
targetTableFieldId: '',
targetUnionRelation: ''
},
unionData: [],
editUnion: false,
sourceFieldOption: [],
2021-05-08 10:36:06 +08:00
targetFieldOption: [],
targetTable: {},
customType: ['db', 'sql', 'excel']
}
},
watch: {
'table': function() {
this.initUnion()
}
},
mounted() {
2021-05-12 16:39:53 +08:00
this.calHeight()
this.initUnion()
},
methods: {
2021-05-12 16:39:53 +08:00
calHeight() {
const that = this
setTimeout(function() {
const currentHeight = document.documentElement.clientHeight
that.height = currentHeight - 56 - 30 - 26 - 25 - 55 - 38 - 28 - 10
}, 10)
},
initUnion() {
2021-05-10 15:22:36 +08:00
if (this.table.id) {
if (this.table.mode === 0) {
this.customType = ['db']
}
2021-05-10 15:22:36 +08:00
post('dataset/union/listByTableId/' + this.table.id, {}).then(response => {
// console.log(response)
this.unionData = response.data
})
}
},
showUnionEdit() {
// 校验同步状态
// post('/dataset/table/checkDorisTableIsExists/' + this.table.id, {}, true).then(response => {
// if (response.data) {
this.union.sourceTableId = this.table.id
fieldList(this.table.id).then(response => {
this.sourceFieldOption = response.data
})
this.editUnion = true
// } else {
// this.$message({
// type: 'error',
// message: this.$t('dataset.invalid_table_check'),
// showClose: true
// })
// }
// })
},
saveUnion() {
2021-05-10 15:22:36 +08:00
// console.log(this.union)
if (!this.union.sourceTableFieldId || !this.union.sourceUnionRelation || !this.union.targetTableId || !this.union.targetTableFieldId) {
this.$message({
type: 'error',
message: this.$t('dataset.pls_setting_union_success'),
showClose: true
})
return
}
this.union.targetUnionRelation = this.union.sourceUnionRelation.split('').reverse().join('')
post('dataset/union/save', this.union).then(response => {
this.$message({
type: 'success',
message: this.$t('dataset.save_success'),
showClose: true
})
this.closeUnion()
this.initUnion()
})
},
closeUnion() {
this.editUnion = false
this.resetUnion()
},
resetUnion() {
this.union = {
id: null,
sourceTableId: this.table.id,
sourceTableFieldId: '',
sourceUnionRelation: '',
targetTableId: '',
targetTableFieldId: '',
targetUnionRelation: ''
}
this.targetTable = {}
},
edit(item) {
this.union = JSON.parse(JSON.stringify(item))
2021-05-08 10:36:06 +08:00
this.targetTable.name = this.union.targetTableName
fieldList(this.union.targetTableId).then(response => {
this.targetFieldOption = response.data
this.showUnionEdit()
})
},
deleteUnion(item) {
this.$confirm(this.$t('dataset.confirm_delete'), this.$t('dataset.tips'), {
confirmButtonText: this.$t('dataset.confirm'),
cancelButtonText: this.$t('dataset.cancel'),
type: 'warning'
}).then(() => {
post('dataset/union/delete/' + item.id, {}).then(response => {
this.$message({
type: 'success',
message: this.$t('dataset.delete_success'),
showClose: true
})
this.initUnion()
})
})
},
getTable(param) {
// console.log(param)
2021-05-10 15:22:36 +08:00
if (param.id === this.table.id) {
this.$message({
type: 'error',
message: this.$t('dataset.can_not_union_self'),
showClose: true
})
return
}
if (this.table.mode === 0) {
if (param.dataSourceId !== this.table.dataSourceId) {
this.$message({
type: 'error',
message: this.$t('dataset.can_not_union_diff_datasource'),
showClose: true
})
return
}
}
2021-05-08 10:36:06 +08:00
this.targetTable = param
this.union.targetTableId = param.id
this.union.targetTableFieldId = ''
fieldList(param.id).then(response => {
this.targetFieldOption = response.data
})
2021-05-08 10:36:06 +08:00
this.$refs['targetTable'].doClose()
}
}
}
</script>
<style scoped>
.table-name-css{
margin: 4px 2px;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
.union-relation-css{
display: block;
width: 100%;
padding: 4px 10px;
}
.dialog-css>>>.el-dialog__title {
font-size: 14px;
}
.dialog-css >>> .el-dialog__header {
padding: 20px 20px 0;
}
.dialog-css >>> .el-dialog__body {
padding: 10px 20px 20px;
}
</style>