404 lines
9.8 KiB
Vue
404 lines
9.8 KiB
Vue
<template>
|
|
<div style="width: 100%;">
|
|
<el-col>
|
|
<el-form
|
|
ref="markForm"
|
|
:model="markForm"
|
|
label-width="40px"
|
|
size="mini"
|
|
>
|
|
|
|
<el-form-item
|
|
class="form-item"
|
|
:label="$t('chart.mark_field')"
|
|
>
|
|
<el-select
|
|
v-model="markForm.fieldId"
|
|
style="width: 100%;"
|
|
clearable
|
|
:placeholder="($t('commons.please_select') + $t('chart.mark_field'))"
|
|
@change="changeFields"
|
|
>
|
|
|
|
<el-option-group
|
|
v-for="group in fieldOptions"
|
|
:key="group.label"
|
|
:label="group.label"
|
|
>
|
|
<el-option
|
|
v-for="item in group.options"
|
|
:key="item.id"
|
|
:label="item.name"
|
|
:value="item.id"
|
|
:disabled="item.disabled"
|
|
/>
|
|
</el-option-group>
|
|
</el-select>
|
|
</el-form-item>
|
|
|
|
<el-form-item
|
|
v-for="(condition, index) in markForm.conditions"
|
|
:key="index"
|
|
:label="$t('chart.mark_value')"
|
|
class="form-item"
|
|
>
|
|
<el-col
|
|
class="col-start"
|
|
:span="6"
|
|
>
|
|
<el-select
|
|
v-model="condition.calc"
|
|
placeholder="请选择"
|
|
@change="changeMarkAttr('conditions')"
|
|
>
|
|
<el-option
|
|
v-for="item in currentCalcOption"
|
|
:key="item.value"
|
|
:label="item.label"
|
|
:value="item.value"
|
|
/>
|
|
</el-select>
|
|
</el-col>
|
|
<el-col
|
|
v-if="condition.calc === 'between'"
|
|
class="col-center"
|
|
:span="10"
|
|
>
|
|
<el-input
|
|
v-model="condition.startv"
|
|
class="number-range-input"
|
|
placeholder=""
|
|
@input="changeMarkAttr('conditions')"
|
|
/>
|
|
<span
|
|
class="number-range-span"
|
|
style="padding: 0 2px;"
|
|
>-</span>
|
|
<el-input
|
|
v-model="condition.endv"
|
|
class="number-range-input"
|
|
placeholder=""
|
|
@input="changeMarkAttr('conditions')"
|
|
/>
|
|
</el-col>
|
|
<el-col
|
|
v-else
|
|
class="col-center"
|
|
:span="10"
|
|
>
|
|
<el-input
|
|
v-model="condition.value"
|
|
placeholder=""
|
|
@input="changeMarkAttr('conditions')"
|
|
/>
|
|
</el-col>
|
|
<el-col
|
|
class="col-center"
|
|
:span="6"
|
|
>
|
|
<de-icon-picker
|
|
v-model="condition.icon"
|
|
:options="iconOptions"
|
|
:color="condition.color"
|
|
size="mini"
|
|
@change="changeMarkAttr('conditions')"
|
|
@set-color="c => {setConditionColor(index, c)}"
|
|
/>
|
|
</el-col>
|
|
<el-col
|
|
class="col-end"
|
|
:span="2"
|
|
>
|
|
<div>
|
|
<div
|
|
v-if="markForm.conditions.length > 1"
|
|
class="i-row-container"
|
|
:class="index === (markForm.conditions.length - 1) ? 'flex-column': ''"
|
|
>
|
|
<i
|
|
class="ope-item el-icon-minus"
|
|
@click.stop="del(index)"
|
|
/>
|
|
</div>
|
|
<div
|
|
v-if="index === (markForm.conditions.length - 1)"
|
|
class="i-row-container"
|
|
:class="markForm.conditions.length > 1 ? 'flex-column': ''"
|
|
>
|
|
<i
|
|
class="ope-item el-icon-plus"
|
|
@click.stop="add"
|
|
/>
|
|
</div>
|
|
</div>
|
|
</el-col>
|
|
</el-form-item>
|
|
</el-form>
|
|
|
|
</el-col>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import { DEFAULT_MARK } from '../../chart/chart'
|
|
import DeIconPicker from '@/components/deIconPicker'
|
|
import deSvgIcons from '@/deicons'
|
|
export default {
|
|
name: 'MapMarkSelector',
|
|
components: { DeIconPicker },
|
|
props: {
|
|
param: {
|
|
type: Object,
|
|
required: true
|
|
},
|
|
chart: {
|
|
type: Object,
|
|
required: true
|
|
},
|
|
dimensionData: {
|
|
type: Array,
|
|
required: true
|
|
},
|
|
quotaData: {
|
|
type: Array,
|
|
required: true
|
|
},
|
|
view: {
|
|
type: Object,
|
|
required: true
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
markForm: JSON.parse(JSON.stringify(DEFAULT_MARK)),
|
|
values: null,
|
|
|
|
calcOptions: [{
|
|
value: 'eq',
|
|
label: '等于',
|
|
type: 'String'
|
|
}, {
|
|
value: 'contain',
|
|
label: '包含',
|
|
type: 'String'
|
|
}, {
|
|
value: 'uncontain',
|
|
label: '不包含',
|
|
type: 'String'
|
|
}, {
|
|
value: 'start',
|
|
label: '开头是',
|
|
type: 'String'
|
|
}, {
|
|
value: 'end',
|
|
label: '结尾是',
|
|
type: 'String'
|
|
}, {
|
|
value: 'eq',
|
|
label: '=',
|
|
type: 'Number'
|
|
}, {
|
|
value: 'ne',
|
|
label: '!=',
|
|
type: 'Number'
|
|
}, {
|
|
value: 'gt',
|
|
label: '>',
|
|
type: 'Number'
|
|
}, {
|
|
value: 'ge',
|
|
label: '>=',
|
|
type: 'Number'
|
|
}, {
|
|
value: 'lt',
|
|
label: '<',
|
|
type: 'Number'
|
|
}, {
|
|
value: 'le',
|
|
label: '<=',
|
|
type: 'Number'
|
|
}, {
|
|
value: 'between',
|
|
label: 'between',
|
|
type: 'Number'
|
|
}
|
|
],
|
|
iconOptions: {
|
|
FontAwesome: false,
|
|
ElementUI: false,
|
|
addIconList: [],
|
|
removeIconList: []
|
|
}
|
|
}
|
|
},
|
|
computed: {
|
|
fieldOptions() {
|
|
const xaxis = this.view.xaxis
|
|
const yaxis = this.view.yaxis
|
|
const locationIds = this.view.viewFields.filter(item => item.busiType === 'locationXaxis' || item.busiType === 'locationYaxis').map(item => item.id)
|
|
const xIds = xaxis ? xaxis.map(item => item.id) : []
|
|
const yIds = yaxis ? yaxis.map(item => item.id) : []
|
|
const disableIds = [...xIds, ...yIds, ...locationIds]
|
|
|
|
return [
|
|
{
|
|
label: this.$t('chart.dimension'),
|
|
options: this.dimensionData && this.dimensionData.map(item => {
|
|
item.disabled = disableIds.includes(item.id)
|
|
return item
|
|
})
|
|
},
|
|
{
|
|
label: this.$t('chart.quota'),
|
|
options: this.quotaData && this.quotaData.map(item => {
|
|
item.disabled = disableIds.includes(item.id)
|
|
return item
|
|
})
|
|
}
|
|
]
|
|
},
|
|
currentCalcOption() {
|
|
const field = this.getField(this.markForm.fieldId)
|
|
if (!field) {
|
|
return []
|
|
}
|
|
const numberType = [2, 3]
|
|
const excludeCalcType = numberType.includes(field.deType) ? 'String' : 'Number'
|
|
return this.calcOptions.filter(option => option.type !== excludeCalcType)
|
|
}
|
|
|
|
},
|
|
watch: {
|
|
'chart': {
|
|
handler: function() {
|
|
this.initData()
|
|
}
|
|
}
|
|
},
|
|
mounted() {
|
|
this.initData()
|
|
this.loadSvg()
|
|
},
|
|
methods: {
|
|
setConditionColor(index, color) {
|
|
this.markForm.conditions[index].color = color
|
|
this.changeMarkAttr('conditions')
|
|
},
|
|
loadSvg() {
|
|
this.iconOptions.addIconList = [...this.iconOptions.addIconList, ...deSvgIcons]
|
|
},
|
|
initData() {
|
|
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.mark) {
|
|
this.markForm = customAttr.mark
|
|
}
|
|
}
|
|
},
|
|
|
|
add() {
|
|
const newRow = {
|
|
fieldId: this.markForm.fieldId,
|
|
calc: 'eq',
|
|
value: '',
|
|
icon: '',
|
|
color: 'rgba(255, 0, 0, 1)'
|
|
}
|
|
this.markForm.conditions.push(newRow)
|
|
},
|
|
del(index) {
|
|
this.markForm.conditions.splice(index, 1)
|
|
this.changeMarkAttr('modifyName')
|
|
},
|
|
|
|
changeMarkAttr(modifyName) {
|
|
this.markForm['modifyName'] = modifyName
|
|
this.$emit('onMarkChange', this.markForm)
|
|
},
|
|
getField(fieldId) {
|
|
const fields = [...JSON.parse(JSON.stringify(this.dimensionData)), ...JSON.parse(JSON.stringify(this.quotaData))]
|
|
return fields.find(item => item.id === fieldId)
|
|
},
|
|
changeFields(fieldId) {
|
|
const baseConditions = [
|
|
{
|
|
fieldId: fieldId,
|
|
calc: 'eq',
|
|
value: '',
|
|
icon: '',
|
|
color: 'rgba(255, 0, 0, 1.0)'
|
|
}
|
|
]
|
|
this.view.viewFields = this.view.viewFields.filter(item => item.busiType !== 'daxis')
|
|
if (fieldId) {
|
|
this.markForm.conditions = JSON.parse(JSON.stringify(baseConditions))
|
|
|
|
const field = this.getField(fieldId)
|
|
if (field) {
|
|
field.busiType = 'daxis'
|
|
this.view.viewFields.push(field)
|
|
}
|
|
} else {
|
|
this.markForm.conditions = []
|
|
}
|
|
|
|
this.changeMarkAttr('fieldId')
|
|
}
|
|
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
|
|
.color-picker-style{
|
|
cursor: pointer;
|
|
z-index: 1003;
|
|
}
|
|
.col-end {
|
|
text-align: end;
|
|
}
|
|
.col-center {
|
|
padding: 0 5px;
|
|
}
|
|
.ope-item {
|
|
height: 100%;
|
|
line-height: 100%;
|
|
background-color: #FFFFFF;
|
|
background-image: none;
|
|
border: 1px solid #DCDFE6;
|
|
-webkit-box-sizing: border-box;
|
|
box-sizing: border-box;
|
|
|
|
}
|
|
.i-row-container {
|
|
width: 15px;
|
|
font-size: 12px !important;
|
|
float: right;
|
|
i {
|
|
cursor: pointer;
|
|
&:hover {
|
|
color: var(--primary, #3370ff);
|
|
border-color: var(--primary, #3370ff);
|
|
}
|
|
}
|
|
}
|
|
.flex-column {
|
|
display: flex;
|
|
flex: none;
|
|
flex-direction: column;
|
|
}
|
|
.number-range-input {
|
|
width: 45%;
|
|
}
|
|
.number-range-span {
|
|
padding: 0 2px;
|
|
}
|
|
</style>
|