Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	frontend/src/views/chart/chart/util.js
#	frontend/src/views/chart/view/ChartEdit.vue
#	frontend/src/views/chart/view/ChartStyle.vue
This commit is contained in:
wangjiahao
2022-05-23 13:31:03 +08:00
33 changed files with 1775 additions and 130 deletions

View File

@@ -10,6 +10,7 @@ import {
getSlider,
getAnalyse
} from '@/views/chart/chart/common/common_antv'
import { antVCustomColor } from '@/views/chart/chart/util'
export function baseBarOptionAntV(plot, container, chart, action, isGroup, isStack) {
// theme
@@ -98,6 +99,8 @@ export function baseBarOptionAntV(plot, container, chart, action, isGroup, isSta
} else {
delete options.isStack
}
// custom color
options.color = antVCustomColor(chart)
// 开始渲染
if (plot) {
@@ -198,6 +201,8 @@ export function hBaseBarOptionAntV(plot, container, chart, action, isGroup, isSt
} else {
delete options.isStack
}
// custom color
options.color = antVCustomColor(chart)
// 开始渲染
if (plot) {

View File

@@ -1,5 +1,6 @@
import { getLabel, getLegend, getPadding, getTheme, getTooltip } from '@/views/chart/chart/common/common_antv'
import { Funnel } from '@antv/g2plot'
import { antVCustomColor } from '@/views/chart/chart/util'
export function baseFunnelOptionAntV(plot, container, chart, action) {
// theme
@@ -62,6 +63,8 @@ export function baseFunnelOptionAntV(plot, container, chart, action) {
const s = JSON.parse(JSON.stringify(customAttr.size))
}
}
// custom color
options.color = antVCustomColor(chart)
// 开始渲染
if (plot) {

View File

@@ -10,6 +10,7 @@ import {
getSlider,
getAnalyse
} from '@/views/chart/chart/common/common_antv'
import { antVCustomColor } from '@/views/chart/chart/util'
export function baseLineOptionAntV(plot, container, chart, action) {
// theme
@@ -90,6 +91,8 @@ export function baseLineOptionAntV(plot, container, chart, action) {
}
}
}
// custom color
options.color = antVCustomColor(chart)
// 开始渲染
if (plot) {
@@ -184,6 +187,8 @@ export function baseAreaOptionAntV(plot, container, chart, action) {
}
}
}
// custom color
options.color = antVCustomColor(chart)
// 开始渲染
if (plot) {

View File

@@ -7,6 +7,7 @@ import {
} from '@/views/chart/chart/common/common_antv'
import { Pie, Rose } from '@antv/g2plot'
import { antVCustomColor } from '@/views/chart/chart/util'
export function basePieOptionAntV(plot, container, chart, action) {
// theme
@@ -84,6 +85,8 @@ export function basePieOptionAntV(plot, container, chart, action) {
options.innerRadius = parseFloat(parseInt(s.pieInnerRadius) / 100)
}
}
// custom color
options.color = antVCustomColor(chart)
// 开始渲染
if (plot) {
@@ -165,6 +168,8 @@ export function basePieRoseOptionAntV(plot, container, chart, action) {
options.innerRadius = parseFloat(parseInt(s.pieInnerRadius) / 100)
}
}
// custom color
options.color = antVCustomColor(chart)
// 开始渲染
if (plot) {

View File

@@ -1,5 +1,6 @@
import { getLabel, getLegend, getPadding, getTheme, getTooltip } from '@/views/chart/chart/common/common_antv'
import { Radar } from '@antv/g2plot'
import { antVCustomColor } from '@/views/chart/chart/util'
export function baseRadarOptionAntV(plot, container, chart, action) {
// theme
@@ -132,6 +133,9 @@ export function baseRadarOptionAntV(plot, container, chart, action) {
options.xAxis = xAxis
options.yAxis = yAxis
// custom color
options.color = antVCustomColor(chart)
// 开始渲染
if (plot) {
plot.destroy()

View File

@@ -11,6 +11,7 @@ import {
} from '@/views/chart/chart/common/common_antv'
import { Scatter } from '@antv/g2plot'
import { antVCustomColor } from '@/views/chart/chart/util'
export function baseScatterOptionAntV(plot, container, chart, action) {
// theme
@@ -86,6 +87,8 @@ export function baseScatterOptionAntV(plot, container, chart, action) {
options.shape = s.scatterSymbol
}
}
// custom color
options.color = antVCustomColor(chart)
// 开始渲染
if (plot) {

View File

@@ -2263,3 +2263,124 @@ export function customSort(custom, data) {
return joinArr.concat(subArr)
}
export function customColor(custom, res, colors) {
const result = []
for (let i = 0; i < res.length; i++) {
const r = res[i]
let flag = false
for (let j = 0; j < custom.length; j++) {
const c = custom[j]
if (r.name === c.name) {
flag = true
result.push(c)
}
}
if (!flag) {
result.push(r)
}
}
return result
}
export function getColors(chart, colors, reset) {
// 自定义颜色,先按照没有设定的情况,并排好序,当做最终结果
let seriesColors = []
let series
if (chart.type.includes('stack')) {
if (chart.data) {
const data = chart.data.datas
const stackData = []
for (let i = 0; i < data.length; i++) {
const s = data[i]
stackData.push(s.category)
}
const sArr = stackData.filter(function(item, index, stackData) {
return stackData.indexOf(item, 0) === index
})
for (let i = 0; i < sArr.length; i++) {
const s = sArr[i]
seriesColors.push({
name: s,
color: colors[i % colors.length],
isCustom: false
})
}
}
} else if (chart.type.includes('bar') || chart.type.includes('line') || chart.type.includes('scatter') || chart.type.includes('radar')) {
if (Object.prototype.toString.call(chart.yaxis) === '[object Array]') {
series = JSON.parse(JSON.stringify(chart.yaxis))
} else {
series = JSON.parse(chart.yaxis)
}
for (let i = 0; i < series.length; i++) {
const s = series[i]
seriesColors.push({
name: s.name,
color: colors[i % colors.length],
isCustom: false
})
}
} else {
if (chart.data) {
const data = chart.data.datas
// data 的维度值,需要根据自定义顺序排序
// let customSortData
// if (Object.prototype.toString.call(chart.customSort) === '[object Array]') {
// customSortData = JSON.parse(JSON.stringify(chart.customSort))
// } else {
// customSortData = JSON.parse(chart.customSort)
// }
// if (customSortData && customSortData.length > 0) {
// data = customSort(customSortData, data)
// }
for (let i = 0; i < data.length; i++) {
const s = data[i]
seriesColors.push({
name: s.field,
color: colors[i % colors.length],
isCustom: false
})
}
}
}
// 如果有自定义,则与上述中的结果合并。
// rescustom以custom为准去掉res中不存在的并将custom中name一样的color赋值给res不存在的name即新增值使用i % colors.length从配色方案中选
if (!reset) {
let sc = null
if (Object.prototype.toString.call(chart.customAttr) === '[object Object]') {
sc = JSON.parse(JSON.stringify(chart.customAttr)).color.seriesColors
} else {
sc = JSON.parse(chart.customAttr).color.seriesColors
}
if (sc && sc.length > 0) {
seriesColors = customColor(sc, seriesColors)
}
// 根据isCustom字段修正color
for (let i = 0; i < seriesColors.length; i++) {
if (!seriesColors[i].isCustom) {
seriesColors[i].color = colors[i % colors.length]
}
}
}
return seriesColors
}
export function antVCustomColor(chart) {
const colors = []
if (chart.customAttr) {
const customAttr = JSON.parse(chart.customAttr)
// color
if (customAttr.color) {
const c = JSON.parse(JSON.stringify(customAttr.color))
const customColors = getColors(chart, c.colors, false)
for (let i = 0; i < customColors.length; i++) {
colors.push(hexColorToRGBA(customColors[i].color, c.alpha))
}
}
}
return colors
}

View File

@@ -0,0 +1,416 @@
<template>
<div style="width: 100%">
<el-col>
<el-form ref="colorForm" :model="colorForm" label-width="80px" size="mini">
<div>
<el-form-item
v-show="chart.type && !chart.type.includes('table') && !chart.type.includes('text') && chart.type !== 'label'"
:label="$t('chart.color_case')"
class="form-item"
>
<el-popover
placement="bottom"
width="400"
trigger="click"
>
<div style="padding: 6px 10px;">
<div>
<span class="color-label">{{ $t('chart.system_case') }}</span>
<el-select
v-model="colorForm.value"
:placeholder="$t('chart.pls_slc_color_case')"
size="mini"
@change="changeColorOption"
>
<el-option
v-for="option in colorCases"
:key="option.value"
:label="option.name"
:value="option.value"
style="display: flex;align-items: center;"
>
<div style="float: left">
<span
v-for="(c,index) in option.colors"
:key="index"
:style="{width: '20px',height: '20px',float: 'left',backgroundColor: c}"
/>
</div>
<span style="margin-left: 4px;">{{ option.name }}</span>
</el-option>
</el-select>
<el-button size="mini" type="text" style="margin-left: 2px;" @click="resetCustomColor">
{{ $t('commons.reset') }}
</el-button>
</div>
<div style="display: flex;align-items: center;margin-top: 10px;">
<span class="color-label" />
<span>
<!-- 色系自定义-->
<!-- <el-radio-group v-model="customColor" class="color-type">-->
<!-- <el-radio v-for="(c,index) in colorForm.colors" :key="index" :label="c" style="padding: 2px;" @change="switchColor(index)">-->
<!-- <span :style="{width: '20px',height: '20px',display:'inline-block',backgroundColor: c}" />-->
<!-- </el-radio>-->
<!-- </el-radio-group>-->
<span v-for="(c,index) in colorForm.colors" :key="index" style="padding: 2px;">
<span :style="{width: '20px',height: '20px',display:'inline-block',backgroundColor: c}" />
</span>
</span>
</div>
<!-- 色系自定义-->
<!-- <div style="display: flex;align-items: center;margin-top: 10px;">-->
<!-- <span class="color-label" />-->
<!-- <span>-->
<!-- <el-color-picker v-model="customColor" class="color-picker-style" :predefine="predefineColors" @change="switchColorCase" />-->
<!-- </span>-->
<!-- </div>-->
<div class="custom-color-style">
<div
v-for="(item,index) in colorForm.seriesColors"
:key="index"
style="display: flex;align-items: center;margin: 2px 0;"
>
<span class="span-label" :title="item.name">{{ item.name }}</span>
<el-color-picker
v-model="item.color"
class="color-picker-style"
:predefine="predefineColors"
@change="switchCustomColor(index)"
/>
</div>
</div>
</div>
<div slot="reference" style="cursor: pointer;margin-top: 2px;width: 180px;">
<span
v-for="(c,index) in colorForm.colors"
:key="index"
:style="{width: '20px',height: '20px',display:'inline-block',backgroundColor: c}"
/>
</div>
</el-popover>
</el-form-item>
<el-form-item
v-show="(chart.type && (chart.type.includes('text') || chart.type === 'label')) || sourceType==='panelTable'"
:label="$t('chart.quota_color')"
class="form-item"
>
<el-color-picker
v-model="colorForm.quotaColor"
class="color-picker-style"
:predefine="predefineColors"
@change="changeColorCase"
/>
</el-form-item>
<el-form-item
v-show="(chart.type && chart.type.includes('text') || chart.type === 'label') || sourceType==='panelTable'"
:label="$t('chart.dimension_color')"
class="form-item"
>
<el-color-picker
v-model="colorForm.dimensionColor"
class="color-picker-style"
:predefine="predefineColors"
@change="changeColorCase"
/>
</el-form-item>
</div>
<el-form-item
v-show="chart.type && !chart.type.includes('text') && chart.type !== 'label'"
:label="$t('chart.not_alpha')"
class="form-item form-item-slider"
>
<el-slider
v-model="colorForm.alpha"
show-input
:show-input-controls="false"
input-size="mini"
@change="changeColorCase"
/>
</el-form-item>
</el-form>
</el-col>
</div>
</template>
<script>
import { COLOR_PANEL, DEFAULT_COLOR_CASE } from '../../chart/chart'
import { getColors } from '@/views/chart/chart/util'
export default {
name: 'ColorSelectorExt',
props: {
param: {
type: Object,
required: false
},
chart: {
type: Object,
required: true
},
sourceType: {
type: String,
default: 'view',
required: false
}
},
data() {
return {
colorCases: [
{
name: this.$t('chart.color_default'),
value: 'default',
colors: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc']
},
{
name: this.$t('chart.color_retro'),
value: 'retro',
colors: ['#0780cf', '#765005', '#fa6d1d', '#0e2c82', '#b6b51f', '#da1f18', '#701866', '#f47a75', '#009db2']
},
{
name: this.$t('chart.color_elegant'),
value: 'elegant',
colors: ['#95a2ff', '#fa8080', '#ffc076', '#fae768', '#87e885', '#3cb9fc', '#73abf5', '#cb9bff', '#434348']
},
{
name: this.$t('chart.color_future'),
value: 'future',
colors: ['#63b2ee', '#76da91', '#f8cb7f', '#f89588', '#7cd6cf', '#9192ab', '#7898e1', '#efa666', '#eddd86']
},
{
name: this.$t('chart.color_gradual'),
value: 'gradual',
colors: ['#71ae46', '#96b744', '#c4cc38', '#ebe12a', '#eab026', '#e3852b', '#d85d2a', '#ce2626', '#ac2026']
},
{
name: this.$t('chart.color_simple'),
value: 'simple',
colors: ['#929fff', '#9de0ff', '#ffa897', '#af87fe', '#7dc3fe', '#bb60b2', '#433e7c', '#f47a75', '#009db2']
},
{
name: this.$t('chart.color_business'),
value: 'business',
colors: ['#194f97', '#555555', '#bd6b08', '#00686b', '#c82d31', '#625ba1', '#898989', '#9c9800', '#007f54']
},
{
name: this.$t('chart.color_gentle'),
value: 'gentle',
colors: ['#5b9bd5', '#ed7d31', '#70ad47', '#ffc000', '#4472c4', '#91d024', '#b235e6', '#02ae75', '#5b9bd5']
},
{
name: this.$t('chart.color_technology'),
value: 'technology',
colors: ['#05f8d6', '#0082fc', '#fdd845', '#22ed7c', '#09b0d3', '#1d27c9', '#f9e264', '#f47a75', '#009db2']
},
{
name: this.$t('chart.color_light'),
value: 'light',
colors: ['#884898', '#808080', '#82ae46', '#00a3af', '#ef8b07', '#007bbb', '#9d775f', '#fae800', '#5f9b3c']
},
{
name: this.$t('chart.color_classical'),
value: 'classical',
colors: ['#007bbb', '#ffdb4f', '#dd4b4b', '#2ca9e1', '#ef8b07', '#4a488e', '#82ae46', '#dd4b4b', '#bb9581']
},
{
name: this.$t('chart.color_fresh'),
value: 'fresh',
colors: ['#5f9b3c', '#75c24b', '#83d65f', '#aacf53', '#c7dc68', '#d8e698', '#e0ebaf', '#bbc8e6', '#e5e5e5']
},
{
name: this.$t('chart.color_energy'),
value: 'energy',
colors: ['#ef8b07', '#2a83a2', '#f07474', '#c55784', '#274a78', '#7058a3', '#0095d9', '#75c24b', '#808080']
},
{
name: this.$t('chart.color_red'),
value: 'red',
colors: ['#ff0000', '#ef8b07', '#4c6cb3', '#f8e944', '#69821b', '#9c5ec3', '#00ccdf', '#f07474', '#bb9581']
},
{
name: this.$t('chart.color_fast'),
value: 'fast',
colors: ['#fae800', '#00c039', '#0482dc', '#bb9581', '#ff7701', '#9c5ec3', '#00ccdf', '#00c039', '#ff7701']
},
{
name: this.$t('chart.color_spiritual'),
value: 'spiritual',
colors: ['#00a3af', '#4da798', '#57baaa', '#62d0bd', '#6ee4d0', '#86e7d6', '#aeede1', '#bde1e6', '#e5e5e5']
}
],
colorForm: JSON.parse(JSON.stringify(DEFAULT_COLOR_CASE)),
customColor: null,
colorIndex: 0,
predefineColors: COLOR_PANEL
}
},
computed: {
panelInfo() {
return this.$store.state.panel.panelInfo
}
},
watch: {
'chart.id': {
handler: function() {
this.customColor = null
this.colorIndex = 0
}
},
'chart': {
handler: function() {
this.init()
}
}
},
mounted() {
this.init()
},
methods: {
changeColorOption() {
const that = this
const items = this.colorCases.filter(ele => {
return ele.value === that.colorForm.value
})
// const val = JSON.parse(JSON.stringify(this.colorForm))
// val.value = items[0].value
// val.colors = items[0].colors
// this.colorForm.value = items[0].value
this.colorForm.colors = JSON.parse(JSON.stringify(items[0].colors))
this.customColor = this.colorForm.colors[0]
this.colorIndex = 0
// reset custom color
this.colorForm.seriesColors = []
this.initCustomColor(true)
this.changeColorCase()
},
changeColorCase() {
this.$emit('onColorChange', this.colorForm)
// this.customColor = null
// this.colorIndex = 0
},
init() {
const chart = JSON.parse(JSON.stringify(this.chart))
if (chart.customAttr) {
let customAttr = null
if (Object.prototype.toString.call(chart.customAttr) === '[object Object]') {
customAttr = JSON.parse(JSON.stringify(chart.customAttr))
} else {
customAttr = JSON.parse(chart.customAttr)
}
if (customAttr.color) {
this.colorForm = customAttr.color
if (!this.customColor) {
this.customColor = this.colorForm.colors[0]
this.colorIndex = 0
}
this.colorForm.tableBorderColor = this.colorForm.tableBorderColor ? this.colorForm.tableBorderColor : DEFAULT_COLOR_CASE.tableBorderColor
this.initCustomColor()
}
}
},
switchColor(index) {
this.colorIndex = index
},
switchColorCase() {
this.colorForm.colors[this.colorIndex] = this.customColor
this.$emit('onColorChange', this.colorForm)
},
switchCustomColor(index) {
this.colorForm.seriesColors[index].isCustom = true
this.switchColorCase()
},
resetCustomColor() {
this.changeColorOption()
},
initCustomColor(reset) {
const chart = JSON.parse(JSON.stringify(this.chart))
this.colorForm.seriesColors = getColors(chart, this.colorForm.colors, reset)
}
}
}
</script>
<style scoped>
.shape-item {
padding: 6px;
border: none;
width: 100%;
display: flex;
justify-content: space-between;
align-items: center
}
.form-item-slider >>> .el-form-item__label {
font-size: 12px;
line-height: 38px;
}
.form-item >>> .el-form-item__label {
font-size: 12px;
}
.el-select-dropdown__item {
padding: 0 20px;
}
span {
font-size: 12px
}
.el-form-item {
margin-bottom: 6px;
}
.color-picker-style {
cursor: pointer;
z-index: 1003;
}
.color-label {
display: inline-block;
width: 60px;
}
.color-type >>> .el-radio__input {
display: none;
}
.el-radio {
margin: 0 2px 0 0 !important;
border: 1px solid transparent;
}
.el-radio >>> .el-radio__label {
padding-left: 0;
}
.el-radio.is-checked {
border: 1px solid #0a7be0;
}
.span-label {
width: 100px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
display: inline-block;
}
.custom-color-style {
height: 300px;
overflow-y: auto;
padding: 4px;
border: 1px solid #e6e6e6;
}
</style>

View File

@@ -822,6 +822,7 @@ export default {
view.customFilter = JSON.stringify([])
view.drillFields = JSON.stringify([])
view.extBubble = JSON.stringify([])
view.viewFields = JSON.stringify([])
this.setChartDefaultOptions(view)
const _this = this
post('/chart/view/newOne/' + this.panelInfo.id, view, true).then(response => {

View File

@@ -658,6 +658,8 @@
:chart="chart"
:properties="chartProperties"
:property-inner-all="chartPropertyInnerAll"
:dimension-data="dimensionData"
:quota-data="quotaData"
@calcStyle="calcStyle"
@onColorChange="onColorChange"
@onSizeChange="onSizeChange"
@@ -1083,6 +1085,7 @@ export default {
yaxisExt: [],
extStack: [],
drillFields: [],
viewFields: [],
extBubble: [],
show: true,
type: 'bar',
@@ -1535,6 +1538,7 @@ export default {
this.view = JSON.parse(JSON.stringify(view))
// stringify json param
view.xaxis = JSON.stringify(view.xaxis)
view.viewFields = JSON.stringify(view.viewFields)
view.xaxisExt = JSON.stringify(view.xaxisExt)
view.yaxis = JSON.stringify(view.yaxis)
view.yaxisExt = JSON.stringify(view.yaxisExt)
@@ -1594,6 +1598,7 @@ export default {
const view = this.buildParam(true, 'chart', false, switchType)
if (!view) return
viewEditSave(this.panelInfo.id, view).then(() => {
this.getData(this.param.id)
bus.$emit('view-in-cache', { type: 'propChange', viewId: this.param.id })
})
},
@@ -1602,6 +1607,7 @@ export default {
// 将视图传入echart...组件
const view = JSON.parse(JSON.stringify(this.view))
view.xaxis = JSON.stringify(this.view.xaxis)
view.viewFields = JSON.stringify(this.view.viewFields)
view.xaxisExt = JSON.stringify(this.view.xaxisExt)
view.yaxis = JSON.stringify(this.view.yaxis)
view.yaxisExt = JSON.stringify(this.view.yaxisExt)
@@ -1666,6 +1672,7 @@ export default {
}).then(response => {
this.initTableData(response.data.tableId)
this.view = JSON.parse(JSON.stringify(response.data))
this.view.viewFields = this.view.viewFields ? JSON.parse(this.view.viewFields) : []
this.view.xaxis = this.view.xaxis ? JSON.parse(this.view.xaxis) : []
this.view.xaxisExt = this.view.xaxisExt ? JSON.parse(this.view.xaxisExt) : []
this.view.yaxis = this.view.yaxis ? JSON.parse(this.view.yaxis) : []
@@ -1716,6 +1723,7 @@ export default {
this.initTableData(response.data.tableId)
}
this.view = JSON.parse(JSON.stringify(response.data))
this.view.viewFields = this.view.viewFields ? JSON.parse(this.view.viewFields) : []
this.view.xaxis = this.view.xaxis ? JSON.parse(this.view.xaxis) : []
this.view.xaxisExt = this.view.xaxisExt ? JSON.parse(this.view.xaxisExt) : []
this.view.yaxis = this.view.yaxis ? JSON.parse(this.view.yaxis) : []
@@ -2412,6 +2420,8 @@ export default {
this.view.customAttr.label.position = 'middle'
}
}
// reset custom colors
this.view.customAttr.color.seriesColors = []
},
valueFormatter(item) {

View File

@@ -5,7 +5,7 @@
style="overflow:auto;border-right: 1px solid #e6e6e6;height: 100%;width: 100%;"
class="attr-style theme-border-class"
:component-name="view.type + '-style'"
:obj="{view, param, chart}"
:obj="{view, param, chart, dimensionData, quotaData}"
/>
<div
v-else
@@ -29,8 +29,17 @@
<el-row>
<span class="padding-lr">{{ $t('chart.shape_attr') }}</span>
<el-collapse v-model="attrActiveNames" class="style-collapse">
<el-collapse-item name="color" :title="$t('chart.color')">
<color-selector-ext
v-if="view.render && view.render === 'antv' && (view.type.includes('bar') || view.type.includes('line') || view.type.includes('pie') || view.type === 'funnel' || view.type === 'radar' || view.type === 'scatter')"
:param="param"
class="attr-selector"
:chart="chart"
@onColorChange="onColorChange"
/>
<el-collapse-item name="color" v-show="showPropertiesCollapse(['color-selector'])" :title="$t('chart.color')">
<color-selector
v-else
:param="param"
class="attr-selector"
:chart="chart"
@@ -274,6 +283,7 @@
<script>
import PluginCom from '@/views/system/plugin/PluginCom'
import ColorSelector from '@/views/chart/components/shape-attr/ColorSelector'
import ColorSelectorExt from '@/views/chart/components/shape-attr/ColorSelectorExt'
import SizeSelector from '@/views/chart/components/shape-attr/SizeSelector'
import SizeSelectorAntV from '@/views/chart/components/shape-attr/SizeSelectorAntV'
import LabelSelector from '@/views/chart/components/shape-attr/LabelSelector'
@@ -315,7 +325,13 @@ export default {
TotalCfg,
TooltipSelectorAntV,
TooltipSelector,
LabelSelectorAntV, LabelSelector, SizeSelectorAntV, SizeSelector, ColorSelector, PluginCom
LabelSelectorAntV,
LabelSelector,
SizeSelectorAntV,
SizeSelector,
ColorSelector,
PluginCom,
ColorSelectorExt
},
props: {
chart: {
@@ -334,6 +350,14 @@ export default {
type: Array,
required: true
},
dimensionData: {
type: Array,
required: true
},
quotaData: {
type: Array,
required: true
},
propertyInnerAll: {
type: Object,
required: true
@@ -358,7 +382,7 @@ export default {
},
methods: {
showProperties(property) {
return this.properties.includes(property)
return this.properties && this.properties.length && this.properties.includes(property)
},
showPropertiesCollapse(propertiesInfo) {
let includeCount = 0

View File

@@ -0,0 +1,294 @@
<template>
<layout-content>
<template v-slot:header>
<el-icon name="back" class="back-button" @click.native="backToList"/>
{{
params && params.id && params.showModel && params.showModel === 'show' && !canEdit ? $t('driver.show_info') : $t('driver.modify')
}}
<el-button v-if="canEdit" size="mini" style="float: right;"type="primary" @click="save">{{ $t('commons.save') }}
</el-button>
<el-button v-else size="mini" style="float: right;" type="primary" @click="changeEdit">{{ $t('commons.edit') }}
</el-button>
</template>
<div>
<el-form
ref="driverForm"
:model="driverForm"
:rules="rule"
size="small"
:disabled="params && params.id && params.showModel && params.showModel === 'show' && !canEdit"
label-width="180px"
label-position="right"
>
<el-form-item :label="$t('commons.name')" prop="name">
<el-input v-model="driverForm.name" autocomplete="off"/>
</el-form-item>
<el-form-item :label="$t('commons.description')" prop="desc">
<el-input v-model="driverForm.desc" autocomplete="off"/>
</el-form-item>
<el-form-item :label="$t('datasource.type')" prop="type">
<el-select
v-model="driverForm.type"
:placeholder="$t('datasource.please_choose_type')"
class="select-width"
disabled
filterable
>
<el-option
v-for="item in dsTypes"
:key="item.type"
:label="item.name"
:value="item.type"
/>
</el-select>
</el-form-item>
<!-- <el-form-item :label="$t('driver.driver')" >-->
<!-- <el-select-->
<!-- v-model="driverForm.driverClass"-->
<!-- :placeholder="$t('driver.please_choose_driver')"-->
<!-- class="select-width"-->
<!-- filterable-->
<!-- >-->
<!-- <el-option-->
<!-- v-for="item in driverClassList"-->
<!-- :key="item"-->
<!-- :label="item"-->
<!-- :value="item"-->
<!-- />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item :label="$t('driver.driver')" >
<el-input v-model="driverForm.driverClass" autocomplete="off"/>
</el-form-item>
</el-form>
<el-upload
:action="baseUrl+'driver/file/upload'"
:multiple="true"
:show-file-list="false"
:file-list="fileList"
:data="params"
accept=".jar"
:before-upload="beforeUpload"
:on-success="uploadSuccess"
:on-error="uploadFail"
name="file"
:headers="headers"
style="float: right;"
>
<el-button size="mini" type="primary" style="float: right;" :disabled="uploading">
<span v-if="!uploading" style="font-size: 12px;">{{ $t('dataset.upload_file') }}</span>
<span v-if="uploading" style="font-size: 12px;"><i class="el-icon-loading" /> {{ $t('dataset.uploading') }}</span>
</el-button>
</el-upload>
<fu-table :data="driverFiles">
<el-table-column prop="fileName" :label="$t('driver.file_name')"/>
<el-table-column prop="version" :label="$t('driver.version')"/>
<fu-table-operations :buttons="buttons" :label="$t('commons.operating')" fix/>
</fu-table>
</div>
</layout-content>
</template>
<script>
import LayoutContent from '@/components/business/LayoutContent'
import i18n from '@/lang/index'
import ApiHttpRequestForm from '@/views/system/datasource/ApiHttpRequestForm'
import DsConfiguration from "@/views/system/datasource/DsConfiguration";
import PluginCom from '@/views/system/plugin/PluginCom'
import {deleteDriverFile, listDriverDetails, updateDriver} from "@/api/system/datasource";
import {delUser} from "@/api/system/user";
import {$alert} from "@/utils/message";
import store from "@/store";
import {getToken} from "@/utils/auth";
const token = getToken()
export default {
name: 'DriverForm',
components: {
DsConfiguration,
LayoutContent,
ApiHttpRequestForm,
PluginCom
},
props: {
params: {
type: Object,
default: null
},
tData: {
type: Array,
default: null
},
dsTypes: {
type: Array,
default: null
}
},
data() {
return {
disabled: false,
driverForm: {
id:'',
name: '',
desc: '',
type: '',
driverClass: ''
},
datasourceType: {},
driverClassList: [],
rule: {
name: [{required: true, message: i18n.t('datasource.input_name'), trigger: 'blur'},
{min: 2, max: 50, message: i18n.t('datasource.input_limit_2_25', [2, 25]), trigger: 'blur'}],
desc: [{required: true, message: i18n.t('datasource.input_name'), trigger: 'blur'},
{min: 2, max: 200, message: i18n.t('datasource.input_limit_2_25', [2, 25]), trigger: 'blur'}],
type: [{required: true, message: i18n.t('datasource.please_choose_type'), trigger: 'blur'}]
},
canEdit: false,
driverFiles: [],
btnDisabled: false,
buttons: [
{
label: this.$t('commons.delete'), icon: 'el-icon-delete', type: 'danger', click: this.deleteDriverFile,
disabled: this.btnDisabled
}
],
uploading: false,
baseUrl: process.env.VUE_APP_BASE_API,
headers: { Authorization: token, 'Accept-Language': i18n.locale.replace('_', '-') },
fileList: []
}
},
created() {
const row = this.params
this.driverForm = JSON.parse(JSON.stringify(row))
this.disabled = this.params && this.params.id && this.params.showModel && this.params.showModel === 'show' && !this.canEdit
this.listDriverDetails()
},
mounted() {
},
methods: {
beforeUpload(file) {
this.uploading = true
},
uploadSuccess(response, file, fileList) {
this.uploading = false
this.listDriverDetails()
},
uploadFail(response, file, fileList) {
let myError = response.toString()
myError = myError.replace('Error: ', '')
if(myError.indexOf('AuthenticationException') >= 0){
const message = i18n.t('login.tokenError')
$alert(message, () => {
store.dispatch('user/logout').then(() => {
location.reload()
})
}, {
confirmButtonText: i18n.t('login.re_login'),
showClose: false
})
return
}
const errorMessage = JSON.parse(myError).message
this.uploading = false
this.$message({
type: 'error',
message: errorMessage,
showClose: true
})
},
deleteDriverFile(row){
deleteDriverFile(row).then(res => {
this.$success(this.$t('commons.delete_success'))
this.listDriverDetails()
})
},
listDriverDetails(){
listDriverDetails(this.driverForm.id).then(res => {
this.driverFiles = res.data
this.driverClassList = []
this.driverFiles.forEach(driverFile => {
this.driverClassList = this.driverClassList.concat(driverFile.driverClass.split(','))
})
})
},
changeEdit() {
this.canEdit = true
this.formType = 'modify'
this.disabled = this.params && this.params.id && this.params.showModel && this.params.showModel === 'show' && !this.canEdit
},
save(){
updateDriver(this.driverForm).then(res => {
this.$success(i18n.t('commons.success'))
this.canEdit = false
})
},
reset() {
this.$refs.dsForm.resetFields()
},
backToList() {
this.$emit('switch-component', {})
},
refreshType(form) {
this.$emit('refresh-type', DsForm)
},
handleClick(tab, event) {}
}
}
</script>
<style scoped>
.el-input {
width: 300px;
}
.el-select {
width: 300px;
}
.ms-http-input {
width: 500px;
margin-top: 5px;
}
.tip {
padding: 3px 5px;
font-size: 16px;
border-radius: 0;
border-left: 4px solid #409EFF;
margin: 5px 5px 10px 5px;
}
.el-select >>> input {
padding-right: 10px;
}
.el-select >>> .el-input__suffix {
right: 0;
}
.dialog-css >>> .el-dialog__header {
padding: 10px 20px 0px;
}
.dialog-css >>> .el-dialog__body {
padding: 10px 20px 10px;
}
.dialog-footer >>> .el-dialog__footer {
padding: 10px 10px 10px;
}
</style>

View File

@@ -3,13 +3,13 @@
<el-row>
<el-col>
<el-form
ref="DsConfig"
:model="form"
:rules="rule"
size="small"
:disabled="disabled"
label-width="180px"
label-position="right"
ref="DsConfig"
:model="form"
:rules="rule"
size="small"
:disabled="disabled"
label-width="180px"
label-position="right"
>
<el-form-item v-if="form.type == 'api'" :label="$t('datasource.data_table')">
<el-col>
@@ -77,7 +77,8 @@
</div>
<el-form-item :label="$t('datasource.data_path')" prop="dataPath">
<el-input :placeholder="$t('datasource.data_path_desc')" v-model="apiItem.dataPath" autocomplete="off"/>
<el-input :placeholder="$t('datasource.data_path_desc')" v-model="apiItem.dataPath"
autocomplete="off"/>
</el-form-item>
</el-form>
</el-row>
@@ -103,7 +104,10 @@
</el-tabs>
</el-row>
<div slot="footer" class="dialog-footer">
<el-button @click="next" :disabled="disabledNext" v-show="active === 1">{{ $t('fu.steps.next') }}</el-button>
<el-button @click="next" :disabled="disabledNext" v-show="active === 1">{{
$t('fu.steps.next')
}}
</el-button>
<el-button @click="before" v-show="active === 2">{{ $t('fu.steps.prev') }}</el-button>
<el-button @click="saveItem" v-show="active === 2">{{ $t('commons.save') }}</el-button>
</div>
@@ -125,20 +129,55 @@
<el-input v-model="form.configuration.dataBase" autocomplete="off"/>
</el-form-item>
<el-form-item v-if="form.type=='oracle' && form.type !== 'api'" :label="$t('datasource.oracle_connection_type')"
<el-form-item v-if="form.type=='oracle' && form.type !== 'api'"
:label="$t('datasource.oracle_connection_type')"
prop="configuration.connectionType">
<el-radio v-model="form.configuration.connectionType" label="sid">{{ $t('datasource.oracle_sid') }}</el-radio>
<el-radio v-model="form.configuration.connectionType" label="sid">{{
$t('datasource.oracle_sid')
}}
</el-radio>
<el-radio v-model="form.configuration.connectionType" label="serviceName">
{{ $t('datasource.oracle_service_name') }}
</el-radio>
</el-form-item>
<el-form-item v-if="form.type !== 'es' && form.type !== 'api'"
<el-form-item v-if="form.type=='hive' " :label="$t('datasource.auth_method')">
<el-select
v-model="form.configuration.authMethod"
class="select-width"
>
<el-option
v-for="item in authMethodList"
:key="item.id"
:label="item.label"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item v-if="form.type === 'hive' && form.configuration.authMethod === 'kerberos'"
:label="$t('datasource.client_principal')">
<el-input v-model="form.configuration.username" autocomplete="off"/>
</el-form-item>
<el-form-item v-if="form.type === 'hive' && form.configuration.authMethod === 'kerberos'"
:label="$t('datasource.keytab_Key_path')">
<el-input v-model="form.configuration.password" autocomplete="off" show-password/>
<p>
{{$t('datasource.kerbers_info')}}
</p>
</el-form-item>
<span v-if="form.type === 'hive' && form.configuration.authMethod === 'kerberos'">
</span>
<el-form-item v-if="form.type !== 'es' && form.type !== 'api' && form.configuration.authMethod !== 'kerberos'"
:label="$t('datasource.user_name')">
<el-input v-model="form.configuration.username" autocomplete="off"/>
</el-form-item>
<el-form-item v-if="form.type !== 'es' && form.type !== 'api'"
<el-form-item v-if="form.type !== 'es' && form.type !== 'api' && form.configuration.authMethod !== 'kerberos'"
:label="$t('datasource.password')">
<el-input v-model="form.configuration.password" autocomplete="off" show-password/>
</el-form-item>
@@ -164,21 +203,26 @@
</el-form-item>
<el-form-item
v-if="form.type=='oracle' || form.type=='sqlServer' || form.type=='pg' || form.type=='redshift' || form.type=='db2'">
<el-button icon="el-icon-plus" size="mini" @click="getSchema()">{{ $t('datasource.get_schema') }}</el-button>
v-if="form.type=='oracle' || form.type=='sqlServer' || form.type=='pg' || form.type=='redshift' || form.type=='db2'">
<el-button icon="el-icon-plus" size="mini" @click="getSchema()">{{
$t('datasource.get_schema')
}}
</el-button>
</el-form-item>
<el-form-item
v-if="form.type=='oracle' || form.type=='sqlServer' || form.type=='pg' || form.type=='redshift' || form.type=='db2'"
:label="$t('datasource.schema')">
<el-select v-model="form.configuration.schema" filterable :placeholder="$t('datasource.please_choose_schema')"
v-if="form.type=='oracle' || form.type=='sqlServer' || form.type=='pg' || form.type=='redshift' || form.type=='db2'"
:label="$t('datasource.schema')">
<el-select v-model="form.configuration.schema" filterable
:placeholder="$t('datasource.please_choose_schema')"
class="select-width">
<el-option v-for="item in schemas" :key="item" :label="item" :value="item"/>
</el-select>
</el-form-item>
<el-form-item v-if="form.type=='oracle'" :label="$t('datasource.charset')">
<el-select v-model="form.configuration.charset" filterable :placeholder="$t('datasource.please_choose_charset')"
<el-select v-model="form.configuration.charset" filterable
:placeholder="$t('datasource.please_choose_charset')"
class="select-width">
<el-option v-for="item in datasourceType.charset" :key="item" :label="item" :value="item"/>
</el-select>
@@ -208,7 +252,6 @@
<script>
import i18n from "@/lang";
import {checkApiDatasource, getSchema} from "@/api/system/datasource";
import ApiHttpRequestForm from '@/views/system/datasource/ApiHttpRequestForm'
@@ -367,15 +410,20 @@ export default {
{label: this.$t('dataset.location'), value: 5}
],
height: 500,
disabledNext: false
disabledNext: false,
authMethodList: [
{
id: 'passwd',
label: i18n.t('datasource.passwd')
}, {
id: 'kerberos',
label: 'Kerberos'
}]
}
},
created() {
},
watch: {
},
watch: {},
methods: {
getSchema() {
this.$refs.DsConfig.validate(valid => {

View File

@@ -41,6 +41,23 @@
</el-select>
</el-form-item>
<el-form-item v-if="datasourceType.isJdbc" :label="$t('driver.driver')">
<el-select
v-model="form.configuration.customDriver"
:placeholder="$t('driver.please_choose_driver')"
class="select-width"
filterable
>
<el-option
v-for="item in driverList"
:key="item.id"
:label="item.name"
:value="item.id"
:disabled="!item.driverClass"
/>
</el-select>
</el-form-item>
<ds-configuration ref="dsConfig" v-if="!datasourceType.isPlugin" :datasource-type='datasourceType' :form="form" :disabled="params && params.id && params.showModel && params.showModel === 'show' && !canEdit"></ds-configuration>
<plugin-com ref="pluginDsConfig" v-if="datasourceType.isPlugin" :component-name="datasourceType.type" :obj="{form, disabled }" />
@@ -70,7 +87,15 @@
<script>
import LayoutContent from '@/components/business/LayoutContent'
import {addDs, editDs, getSchema, validateDs, validateDsById, checkApiDatasource} from '@/api/system/datasource'
import {
addDs,
editDs,
getSchema,
validateDs,
validateDsById,
checkApiDatasource,
listDriverByType
} from '@/api/system/datasource'
import {$confirm} from '@/utils/message'
import i18n from '@/lang/index'
import ApiHttpRequestForm from '@/views/system/datasource/ApiHttpRequestForm'
@@ -227,7 +252,8 @@ export default {
{label: this.$t('dataset.location'), value: 5}
],
height: 500,
disabledNext: false
disabledNext: false,
driverList: []
}
},
@@ -235,7 +261,7 @@ export default {
if (this.params && this.params.id) {
const row = this.params
this.edit(row)
this.changeType()
this.changeType(true)
} else {
this.create()
if (this.params && this.params.type) {
@@ -492,13 +518,19 @@ export default {
}
})
},
changeType() {
changeType(init) {
for (let i = 0; i < this.dsTypes.length; i++) {
if (this.dsTypes[i].type === this.form.type) {
if(this.form.type !== 'api'){
if(this.form.type !== 'api' && !init){
this.form.configuration.extraParams = this.dsTypes[i].extraParams
}
this.datasourceType = this.dsTypes[i]
if(this.datasourceType.isJdbc){
listDriverByType(this.datasourceType.type).then(res => {
this.driverList = res.data
this.driverList.push({id: 'default', name: 'Default', driverClass:'Default'})
})
}
}
}
},

View File

@@ -22,7 +22,8 @@ import DeMainContainer from '@/components/dataease/DeMainContainer'
import DeContainer from '@/components/dataease/DeContainer'
import DeAsideContainer from '@/components/dataease/DeAsideContainer'
import DsTree from './DsTree'
import DsForm from './form'
import DsForm from './DsForm'
import DriverForm from "./DriverForm";
import DataHome from './DataHome'
export default {
@@ -56,6 +57,12 @@ export default {
this.tData = tData
this.dsTypes = dsTypes
break
case 'DriverForm':
this.component = DriverForm
this.param = componentParam
this.tData = tData
this.dsTypes = dsTypes
break
default:
this.component = DataHome
this.param = null

View File

@@ -1,20 +1,15 @@
<template xmlns:el-col="http://www.w3.org/1999/html">
<el-col class="tree-style">
<el-col>
<el-row class="title-css">
<span class="title-text">
{{ $t('commons.datasource') }}
</span>
<el-button
icon="el-icon-plus"
type="text"
size="mini"
style="float: right;"
@click="addFolder"
/>
<el-row>
<el-tabs v-model="showView" @tab-click="changeTab" type="card">
<el-tab-pane v-for="(item, index) in editableTabs" :key="item.name" :label="item.title" :name="item.name">
</el-tab-pane>
</el-tabs>
</el-row>
<el-row>
<el-button icon="el-icon-plus" type="text" size="mini" style="float: left;" @click="addFolder"/>
</el-row>
<el-divider />
<el-row>
<el-form>
<el-form-item class="form-item">
@@ -44,16 +39,16 @@
<span slot-scope="{ node, data }" class="custom-tree-node-list father">
<span style="display: flex;flex: 1;width: 0;">
<span v-if="data.type !== 'folder' && data.status !== 'Error' && data.status !== 'Warning'">
<svg-icon icon-class="datasource" class="ds-icon-scene" />
<svg-icon icon-class="datasource" class="ds-icon-scene"/>
</span>
<span v-if="data.status === 'Error'">
<svg-icon icon-class="exclamationmark" class="ds-icon-scene" />
<svg-icon icon-class="exclamationmark" class="ds-icon-scene"/>
</span>
<span v-if="data.status === 'Warning'">
<svg-icon icon-class="exclamationmark2" class="ds-icon-scene" />
<svg-icon icon-class="exclamationmark2" class="ds-icon-scene"/>
</span>
<span v-if="data.type === 'folder'">
<i class="el-icon-folder" />
<i class="el-icon-folder"/>
</span>
<span
v-if=" data.status === 'Error'"
@@ -110,11 +105,57 @@
</el-tree>
</div>
</el-col>
<el-dialog v-dialogDrag :title="dialogTitle" :visible="editDriver" :show-close="false" width="50%" append-to-body>
<el-form ref="driverForm" :model="driverForm" label-position="right" label-width="100px" :rules="rule">
<el-form-item :label="$t('commons.name')" prop="name">
<el-input v-model="driverForm.name"/>
</el-form-item>
<el-form-item :label="$t('commons.description')" prop="desc">
<el-input v-model="driverForm.desc"/>
</el-form-item>
<el-form-item :label="$t('datasource.type')" prop="type">
<el-select
v-model="driverForm.type"
:placeholder="$t('datasource.please_choose_type')"
class="select-width"
:disabled="disabledModifyType"
filterable
>
<el-option
v-for="item in dsTypes"
:key="item.type"
:label="item.name"
:value="item.type"
/>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button size="mini" @click="close()">{{ $t('commons.cancel') }}</el-button>
<el-button type="primary" size="mini" @click="saveDriver(driverForm)">{{ $t('commons.save') }}
</el-button>
</div>
</el-dialog>
</el-col>
</el-col>
</template>
<script>
import { listDatasource, listDatasourceByType, delDs, listDatasourceType } from '@/api/system/datasource'
import {mapGetters} from 'vuex'
import i18n from "@/lang";
import {
listDatasource,
listDatasourceByType,
delDs,
listDatasourceType,
listDrivers,
addDriver,
delDriver,
listDriverByType
} from '@/api/system/datasource'
export default {
name: 'DsTree',
@@ -130,7 +171,27 @@ export default {
tData: [],
dsTypes: [],
showSearchInput: false,
key: ''
key: '',
showView: 'Datasource',
dialogTitle: '',
editDriver: false,
driverForm: {
name: '',
desc: '',
type: ''
},
disabledModifyType: false,
rule: {
name: [{required: true, message: i18n.t('datasource.input_name'), trigger: 'blur'},
{min: 2, max: 50, message: i18n.t('datasource.input_limit_2_25', [2, 25]), trigger: 'blur'}],
desc: [{required: true, message: i18n.t('datasource.input_name'), trigger: 'blur'},
{min: 2, max: 200, message: i18n.t('datasource.input_limit_2_25', [2, 25]), trigger: 'blur'}],
type: [{required: true, message: i18n.t('datasource.please_choose_type'), trigger: 'blur'}]
},
editableTabs: [{
title: i18n.t('commons.datasource'),
name: 'Datasource'
}]
}
},
watch: {
@@ -138,14 +199,22 @@ export default {
this.$refs.myDsTree.filter(val)
}
},
computed: {
...mapGetters([
'user'
])
},
created() {
this.queryTreeDatas()
this.datasourceTypes()
if (this.user.isAdmin) {
this.editableTabs.push({
title: i18n.t('driver.mgm'),
name: 'Driver'
})
}
},
// mounted() {
// this.queryTreeDatas()
// this.datasourceTypes()
// },
methods: {
filterNode(value, data) {
if (!value) return true
@@ -159,9 +228,16 @@ export default {
this.showSearchInput = false
},
queryTreeDatas() {
listDatasource().then(res => {
this.tData = this.buildTree(res.data)
})
if (this.showView === 'Datasource') {
listDatasource().then(res => {
this.tData = this.buildTree(res.data)
})
}
if (this.showView === 'Driver') {
listDrivers().then(res => {
this.tData = this.buildTree(res.data)
})
}
},
datasourceTypes() {
listDatasourceType().then(res => {
@@ -169,8 +245,9 @@ export default {
})
},
refreshType(datasource) {
const method = this.showView === 'Datasource' ? listDatasourceByType : listDriverByType
let typeData = []
listDatasourceByType(datasource.type).then(res => {
method(datasource.type).then(res => {
typeData = this.buildTree(res.data)
if (typeData.length === 0) {
const index = this.tData.findIndex(item => {
@@ -220,10 +297,31 @@ export default {
},
addFolder() {
this.switchMain('DsForm', {}, this.tData, this.dsTypes)
if (this.showView === 'Driver') {
this.dialogTitle = this.$t('driver.driver')
this.editDriver = true
// this.switchMain('DriverForm', {}, this.tData, this.dsTypes)
} else {
this.switchMain('DsForm', {}, this.tData, this.dsTypes)
}
},
changeTab() {
this.expandedArray = []
this.tData = []
this.queryTreeDatas()
},
addFolderWithType(data) {
this.switchMain('DsForm', { type: data.id }, this.tData, this.dsTypes)
if (this.showView === 'Driver') {
this.driverForm.type = data.id
this.dialogTitle = this.$t('driver.driver')
// this.editDriver = false
this.editDriver = true
// this.switchMain(switchMain'DriverForm', {}, this.tData, this.dsTypes)
} else {
this.switchMain('DsForm', {type: data.id}, this.tData, this.dsTypes)
}
},
nodeClick(node, data) {
if (node.type === 'folder') return
@@ -231,7 +329,7 @@ export default {
},
clickFileMore(param) {
const { optType, data } = param
const {optType, data} = param
switch (optType) {
case 'edit':
this.edit(data)
@@ -244,14 +342,18 @@ export default {
}
},
beforeClickFile(optType, data, node) {
return { optType, data, node }
return {optType, data, node}
},
edit(row) {
this.switchMain('DsForm', row, this.tData, this.dsTypes)
},
showInfo(row) {
const param = { ...row.data, ...{ showModel: 'show' }}
this.switchMain('DsForm', param, this.tData, this.dsTypes)
const param = {...row.data, ...{showModel: 'show'}}
if (this.showView === 'Datasource') {
this.switchMain('DsForm', param, this.tData, this.dsTypes)
} else {
this.switchMain('DriverForm', param, this.tData, this.dsTypes)
}
},
_handleDelete(datasource) {
this.$confirm(this.$t('datasource.delete_warning'), '', {
@@ -259,8 +361,9 @@ export default {
cancelButtonText: this.$t('commons.cancel'),
type: 'warning'
}).then(() => {
const parma = { type: datasource.type, id: datasource.id }
delDs(parma).then(res => {
const parma = {type: datasource.type, id: datasource.id}
const method = this.showView === 'Datasource' ? delDs : delDriver
method(parma).then(res => {
if (res.success) {
this.$success(this.$t('commons.delete_success'))
this.switchMain('DataHome', {}, this.tData, this.dsTypes)
@@ -301,7 +404,33 @@ export default {
})
})
})
}
},
close() {
this.$refs['driverForm'].resetFields()
this.editDriver = false
this.driverForm = {
name: '',
desc: '',
type: ''
}
},
saveDriver(driverForm) {
this.$refs['driverForm'].validate((valid) => {
if (valid) {
addDriver(driverForm).then(res => {
this.$message({
message: this.$t('dataset.save_success'),
type: 'success',
showClose: true
})
this.refreshType(driverForm)
this.close()
})
} else {
return false
}
})
},
}
}
</script>

View File

@@ -8,7 +8,6 @@
@search="search"
>
<template #toolbar>
<el-upload
:action="baseUrl+'api/plugin/upload'"
:multiple="false"