提交 7cdc0c22 authored 作者: wangjiahao's avatar wangjiahao

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

# Conflicts: # frontend/src/components/canvas/custom-component/UserView.vue
package io.dataease.controller.panel.api; package io.dataease.controller.panel.api;
import io.dataease.base.domain.ChartView;
import io.dataease.controller.sys.base.BaseGridRequest; import io.dataease.controller.sys.base.BaseGridRequest;
import io.dataease.dto.panel.PanelViewDto; import io.dataease.dto.panel.PanelViewDto;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
...@@ -20,6 +22,11 @@ public interface ViewApi { ...@@ -20,6 +22,11 @@ public interface ViewApi {
List<PanelViewDto> tree(BaseGridRequest request); List<PanelViewDto> tree(BaseGridRequest request);
@ApiOperation("根据仪表板Id查询视图")
@PostMapping("/viewsWithIds")
List<ChartView> viewsWithIds(List<String> viewIds);
......
package io.dataease.controller.panel.server; package io.dataease.controller.panel.server;
import io.dataease.base.domain.ChartView;
import io.dataease.commons.utils.AuthUtils; import io.dataease.commons.utils.AuthUtils;
import io.dataease.controller.panel.api.ViewApi; import io.dataease.controller.panel.api.ViewApi;
import io.dataease.controller.sys.base.BaseGridRequest; import io.dataease.controller.sys.base.BaseGridRequest;
import io.dataease.controller.sys.base.ConditionEntity; import io.dataease.controller.sys.base.ConditionEntity;
import io.dataease.dto.panel.PanelViewDto; import io.dataease.dto.panel.PanelViewDto;
import io.dataease.dto.panel.po.PanelViewPo; import io.dataease.dto.panel.po.PanelViewPo;
import io.dataease.service.chart.ChartViewService;
import io.dataease.service.panel.PanelViewService; import io.dataease.service.panel.PanelViewService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
...@@ -20,6 +23,9 @@ public class ViewServer implements ViewApi { ...@@ -20,6 +23,9 @@ public class ViewServer implements ViewApi {
@Autowired @Autowired
private PanelViewService panelViewService; private PanelViewService panelViewService;
@Autowired
private ChartViewService chartViewService;
/** /**
* 为什么查两次? * 为什么查两次?
* 因为left join 会导致全表扫描 * 因为left join 会导致全表扫描
...@@ -40,4 +46,10 @@ public class ViewServer implements ViewApi { ...@@ -40,4 +46,10 @@ public class ViewServer implements ViewApi {
List<PanelViewDto> panelViewDtos = panelViewService.buildTree(groups, views); List<PanelViewDto> panelViewDtos = panelViewService.buildTree(groups, views);
return panelViewDtos; return panelViewDtos;
} }
@Override
public List<ChartView> viewsWithIds(@RequestBody List<String> viewIds) {
return chartViewService.viewsByIds(viewIds);
}
} }
...@@ -170,7 +170,11 @@ public class ChartViewService { ...@@ -170,7 +170,11 @@ public class ChartViewService {
x.add(a.toString()); x.add(a.toString());
for (int i = xAxis.size(); i < xAxis.size() + yAxis.size(); i++) { for (int i = xAxis.size(); i < xAxis.size() + yAxis.size(); i++) {
int j = i - xAxis.size(); int j = i - xAxis.size();
series.get(j).getData().add(new BigDecimal(StringUtils.isEmpty(d[i]) ? "0" : d[i])); try {
series.get(j).getData().add(new BigDecimal(StringUtils.isEmpty(d[i]) ? "0" : d[i]));
} catch (Exception e) {
series.get(j).getData().add(new BigDecimal(0));
}
} }
} }
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
...@@ -316,4 +320,10 @@ public class ChartViewService { ...@@ -316,4 +320,10 @@ public class ChartViewService {
} }
return map; return map;
} }
public List<ChartView> viewsByIds(List<String> viewIds){
ChartViewExample example = new ChartViewExample();
example.createCriteria().andIdIn(viewIds);
return chartViewMapper.selectByExample(example);
}
} }
...@@ -8,3 +8,12 @@ export function tree(data) { ...@@ -8,3 +8,12 @@ export function tree(data) {
data data
}) })
} }
export function viewsWithIds(data) {
return request({
url: '/api/panelView/viewsWithIds',
method: 'post',
loading: true,
data
})
}
...@@ -319,7 +319,8 @@ export default { ...@@ -319,7 +319,8 @@ export default {
setConditionValue(obj) { setConditionValue(obj) {
const { component, value, operator } = obj const { component, value, operator } = obj
const fieldId = component.options.attrs.fieldId const fieldId = component.options.attrs.fieldId
const condition = new Condition(component.id, fieldId, operator, value, null) const viewIds = component.options.attrs.viewIds
const condition = new Condition(component.id, fieldId, operator, value, viewIds)
this.addCondition(condition) this.addCondition(condition)
}, },
addCondition(condition) { addCondition(condition) {
......
...@@ -13,27 +13,24 @@ ...@@ -13,27 +13,24 @@
export default { export default {
props: { props: {
options: { element: {
type: Object, type: Object,
default: null default: null
},
inDraw: {
type: Boolean,
default: true
} }
}, },
data() { data() {
return { return {
options: null,
operator: 'eq',
values: null
} }
}, },
mounted() { created() {
this.$nextTick(() => { this.options = this.element.options
// this.defaultOptions = Object.assign({}, this.options)
// const dom = this.$refs[this.options.refId]
// for (const key in this.options.attrs) {
// if (Object.hasOwnProperty.call(this.defaultOptions.attrs, key)) {
// const element = this.defaultOptions.attrs[key]
// dom.$props[key] = element
// }
// }
})
} }
} }
</script> </script>
......
...@@ -14,10 +14,24 @@ ...@@ -14,10 +14,24 @@
export default { export default {
props: { props: {
options: { element: {
type: Object, type: Object,
default: null default: null
},
inDraw: {
type: Boolean,
default: true
} }
},
data() {
return {
options: null,
operator: 'eq',
values: null
}
},
created() {
this.options = this.element.options
} }
} }
</script> </script>
......
<script>
import { ApplicationContext } from '@/utils/ApplicationContext'
import store from '@/store'
export default {
name: 'DeDrawingWidget',
functional: true,
props: {
serviceName: {
type: String,
default: null
}
},
render(createElement, context) {
const widgetInfo = ApplicationContext.getService(context.props.serviceName)
// const widgetInfo = context.props.widgetInfo
const dialogInfo = widgetInfo.getDialogPanel && widgetInfo.getDialogPanel() || null
const drawInfo = widgetInfo.getDrawPanel && widgetInfo.getDrawPanel() || null
const curComponent = store.state.curComponent
if (!dialogInfo) {
throw new Error('系统错误')
}
return createElement(dialogInfo.component, {
props: {
element: curComponent || drawInfo || dialogInfo
},
style: context.data.style,
on: {
'value-change': value => {
context.listeners['filter-value-change'] && context.listeners['filter-value-change'](value)
}
}
},
context.data,
context.children
)
}
}
</script>
<template> <template>
<el-input v-if="options!== null && options.attrs!==null" v-model="options.value" style="width:260px;" :placeholder="options.attrs.placeholder"> <el-input v-if="options!== null && options.attrs!==null" v-model="options.value" style="width: 260px" :placeholder="options.attrs.placeholder">
<el-button slot="append" icon="el-icon-search" /> <el-button slot="append" icon="el-icon-search" />
</el-input> </el-input>
...@@ -11,20 +11,24 @@ ...@@ -11,20 +11,24 @@
export default { export default {
props: { props: {
options: { element: {
type: Object, type: Object,
default: null default: null
},
inDraw: {
type: Boolean,
default: true
} }
}, },
data() { data() {
return { return {
options: null,
operator: 'eq',
values: null
} }
}, },
mounted() { created() {
this.$nextTick(() => { this.options = this.element.options
})
} }
} }
</script> </script>
......
...@@ -11,10 +11,24 @@ ...@@ -11,10 +11,24 @@
export default { export default {
props: { props: {
options: { element: {
type: Object, type: Object,
default: null default: null
},
inDraw: {
type: Boolean,
default: true
} }
},
data() {
return {
options: null,
operator: 'eq',
values: null
}
},
created() {
this.options = this.element.options
} }
} }
</script> </script>
......
<template> <template>
<el-select v-if="options!== null && options.attrs!==null" v-model="options.value" :style="element.style" :placeholder="options.attrs.placeholder" @change="changeValue"> <el-select v-if="options!== null && options.attrs!==null" v-model="values" :multiple="options.attrs.multiple" :placeholder="options.attrs.placeholder" @change="changeValue">
<el-option <el-option
v-for="item in options.attrs.datas" v-for="item in options.attrs.datas"
:key="item[options.attrs.key]" :key="item[options.attrs.key]"
...@@ -28,12 +28,17 @@ export default { ...@@ -28,12 +28,17 @@ export default {
data() { data() {
return { return {
options: null, options: null,
operator: 'eq' operator: 'eq',
values: null
} }
}, },
watch: { watch: {
'element.style': function(value) { 'options.attrs.multiple': function(value) {
// console.log(value) if (value) {
this.values = []
} else {
this.values = null
}
} }
}, },
......
<template>
<el-select v-if="options!== null && options.attrs!==null" v-model="values" :multiple="options.attrs.multiple" :placeholder="options.attrs.placeholder" @change="changeValue">
<el-option
v-for="item in options.attrs.datas"
:key="item[options.attrs.key]"
:label="item[options.attrs.label]"
:value="item[options.attrs.value]"
/>
</el-select>
</template>
<script>
export default {
props: {
element: {
type: Object,
default: null
},
inDraw: {
type: Boolean,
default: true
}
},
data() {
return {
options: null,
operator: 'eq',
values: null
}
},
watch: {
'options.attrs.multiple': function(value) {
if (value) {
this.values = []
} else {
this.values = null
}
}
},
created() {
this.options = this.element.options
},
mounted() {
this.$nextTick(() => {
})
},
methods: {
changeValue(value) {
this.inDraw && this.$emit('set-condition-value', { component: this.element, value: [value], operator: this.operator })
}
}
}
</script>
<style lang="scss" scoped>
</style>
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
<el-card <el-card
v-show="showSeason" v-show="showSeason"
class="box-card" class="box-card"
style="width:322px;padding: 0 3px 20px;margin-top:10px;position:fixed;z-index:9999" style="width:322px !important;padding: 0 3px 20px;margin-top:10px;position:fixed;z-index:9999"
> >
<div slot="header" class="clearfix" style="text-align:center;padding:0"> <div slot="header" class="clearfix" style="text-align:center;padding:0">
<button <button
......
...@@ -31,8 +31,8 @@ requireComponent.keys().forEach(fileName => { ...@@ -31,8 +31,8 @@ requireComponent.keys().forEach(fileName => {
) )
}) })
// const req = require.context('./serviceImpl', false, /\.js$/) const req = require.context('./serviceImpl', false, /\.js$/)
const req = require.context('./drawServiceImpl', false, /\.js$/) // const req = require.context('./drawServiceImpl', false, /\.js$/)
const requireAll = requireContext => requireContext.keys() const requireAll = requireContext => requireContext.keys()
const widgets = {} const widgets = {}
......
import store from '@/store'
export const commonStyle = {
rotate: 0,
opacity: 1
}
export const commonAttr = {
animations: [],
events: {},
groupStyle: {}, // 当一个组件成为 Group 的子组件时使用
isLock: false // 是否锁定组件
}
export class DrawWidgetService {
constructor(options) {
this.options = options
this.name = options.name
// this.leftPanelPath = 'application/addLeftWidget'
// this.dialogPanelPath = 'application/addDialogWidget'
// this.drawPanelPath = 'application/addDrawWidget'
this.storeWidget()
}
/**
* 存储数据到本地
* @param {本地存储路径} path
* @param {要存储的数据} data
*/
store(path, data) {
store.dispatch(path, data)
}
getLeftPanel() {
return this.initLeftPanel()
}
getDialogPanel() {
return this.initFilterDialog()
}
getDrawPanel() {
let drawPanel = this.initDrawPanel()
drawPanel.serviceName = this.options.name
drawPanel.style = Object.assign(drawPanel.style, commonStyle)
drawPanel = Object.assign(drawPanel, commonAttr)
if (this.filterDialog) {
const dialogOptions = this.getDialogPanel()
drawPanel = Object.assign(drawPanel, dialogOptions)
}
return drawPanel
}
storeWidget() {
this.store('application/loadBean', { key: this.name, value: this })
}
}
...@@ -12,20 +12,42 @@ export const commonAttr = { ...@@ -12,20 +12,42 @@ export const commonAttr = {
} }
export class WidgetService { export class WidgetService {
constructor(options) { constructor(options) {
this.options = options
this.name = options.name this.name = options.name
options = { ...commonAttr, ...options } // this.leftPanelPath = 'application/addLeftWidget'
Object.assign(this, options) // this.dialogPanelPath = 'application/addDialogWidget'
this.style = { ...commonStyle, ...options.style } // this.drawPanelPath = 'application/addDrawWidget'
this.type = 'custom'
this.storeWidget() this.storeWidget()
} }
storeWidget() { /**
store.dispatch('application/loadBean', { key: this.name, value: this }) * 存储数据到本地
* @param {本地存储路径} path
* @param {要存储的数据} data
*/
store(path, data) {
store.dispatch(path, data)
}
getLeftPanel() {
return this.initLeftPanel()
} }
initWidget() {
console.log('this is initWidget') getDialogPanel() {
return this.initFilterDialog()
} }
toDrawWidget() {
console.log('this is toDrawWidget') getDrawPanel() {
let drawPanel = this.initDrawPanel()
drawPanel.serviceName = this.options.name
drawPanel.style = Object.assign(drawPanel.style, commonStyle)
drawPanel = Object.assign(drawPanel, commonAttr)
if (this.filterDialog) {
const dialogOptions = this.getDialogPanel()
drawPanel = Object.assign(drawPanel, dialogOptions)
}
return drawPanel
}
storeWidget() {
this.store('application/loadBean', { key: this.name, value: this })
} }
} }
import { WidgetService } from '../service/WidgetService' import { WidgetService } from '../service/WidgetService'
const defaultOptions = {
name: 'buttonSureWidget', const leftPanel = {
icon: 'iconfont icon-chaxunsousuo', icon: 'iconfont icon-chaxunsousuo',
label: '确定', label: '确定',
defaultClass: 'time-filter'
}
const drawPanel = {
type: 'custom',
style: { style: {
width: 100, width: 300,
height: 34, height: 35,
borderWidth: '',
borderColor: '',
borderRadius: '',
fontSize: 14, fontSize: 14,
fontWeight: 500, fontWeight: 500,
lineHeight: '', lineHeight: '',
letterSpacing: 0, letterSpacing: 0,
textAlign: '', textAlign: '',
color: '', color: ''
backgroundColor: ''
}, },
defaultClass: 'time-filter',
component: 'de-button',
options: { options: {
refId: '1234567890',
attrs: { attrs: {
type: 'primary', type: 'primary',
round: true round: true
}, },
value: '测试按钮' value: '测试按钮'
} },
component: 'de-button'
} }
class ButtonSureServiceImpl extends WidgetService { class ButtonSureServiceImpl extends WidgetService {
constructor(options) { constructor(options = {}) {
Object.assign(options, defaultOptions) Object.assign(options, { name: 'buttonSureWidget' })
super(options) super(options)
this.filterDialog = false
this.showSwitch = false
} }
initWidget() { initLeftPanel() {
// console.log('this is first initWidget') const value = JSON.parse(JSON.stringify(leftPanel))
} return value
toDrawWidget() {
// console.log('this is first toDrawWidget')
} }
// 移动到画布之前回掉
beforeToDraw() {
initDrawPanel() {
const value = JSON.parse(JSON.stringify(drawPanel))
return value
} }
} }
const buttonSureServiceImpl = new ButtonSureServiceImpl({ name: 'buttonSureWidget' }) const buttonSureServiceImpl = new ButtonSureServiceImpl()
export default buttonSureServiceImpl export default buttonSureServiceImpl
import { DrawWidgetService } from '../service/DrawWidgetService' import { WidgetService } from '../service/WidgetService'
const leftPanel = { const leftPanel = {
// name: 'text-select',
icon: 'iconfont icon-xialakuang', icon: 'iconfont icon-xialakuang',
label: '文本下拉', label: '数字下拉',
defaultClass: 'text-filter' defaultClass: 'text-filter'
} }
const dialogPanel = { const dialogPanel = {
options: { options: {
refId: '1234567890',
attrs: { attrs: {
multiple: false, multiple: false,
placeholder: '请选择', placeholder: '请选择',
...@@ -27,8 +25,8 @@ const dialogPanel = { ...@@ -27,8 +25,8 @@ const dialogPanel = {
const drawPanel = { const drawPanel = {
type: 'custom', type: 'custom',
style: { style: {
width: 200, width: 300,
height: 22, height: 35,
fontSize: 14, fontSize: 14,
fontWeight: 500, fontWeight: 500,
lineHeight: '', lineHeight: '',
...@@ -39,9 +37,9 @@ const drawPanel = { ...@@ -39,9 +37,9 @@ const drawPanel = {
component: 'de-select' component: 'de-select'
} }
class MySelectImpl extends DrawWidgetService { class NumberSelectServiceImpl extends WidgetService {
constructor(options = {}) { constructor(options = {}) {
Object.assign(options, { name: 'mySelectWidget' }) Object.assign(options, { name: 'numberSelectWidget' })
super(options) super(options)
this.filterDialog = true this.filterDialog = true
this.showSwitch = true this.showSwitch = true
...@@ -50,7 +48,6 @@ class MySelectImpl extends DrawWidgetService { ...@@ -50,7 +48,6 @@ class MySelectImpl extends DrawWidgetService {
initLeftPanel() { initLeftPanel() {
const value = JSON.parse(JSON.stringify(leftPanel)) const value = JSON.parse(JSON.stringify(leftPanel))
return value return value
// console.log('this is first initWidget')
} }
initFilterDialog() { initFilterDialog() {
...@@ -65,7 +62,7 @@ class MySelectImpl extends DrawWidgetService { ...@@ -65,7 +62,7 @@ class MySelectImpl extends DrawWidgetService {
filterFieldMethod(fields) { filterFieldMethod(fields) {
return fields.filter(field => { return fields.filter(field => {
return field['deType'] === 0 return field['deType'] === 2
}) })
} }
...@@ -79,5 +76,5 @@ class MySelectImpl extends DrawWidgetService { ...@@ -79,5 +76,5 @@ class MySelectImpl extends DrawWidgetService {
}) })
} }
} }
const mySelectImpl = new MySelectImpl() const numberSelectServiceImpl = new NumberSelectServiceImpl()
export default mySelectImpl export default numberSelectServiceImpl
import { WidgetService } from '../service/WidgetService' import { WidgetService } from '../service/WidgetService'
const defaultOptions = {
name: 'textInputWidget', const leftPanel = {
icon: 'iconfont icon-shuru', icon: 'iconfont icon-shuru',
label: '文本搜索', label: '文本搜索',
defaultClass: 'text-filter'
}
const dialogPanel = {
options: {
attrs: {
placeholder: '请选择'
},
value: ''
},
defaultClass: 'text-filter',
component: 'de-input-search'
}
const drawPanel = {
type: 'custom',
style: { style: {
width: 100, width: 300,
height: 34, height: 35,
borderWidth: '',
borderColor: '',
borderRadius: '',
fontSize: 14, fontSize: 14,
fontWeight: 500, fontWeight: 500,
lineHeight: '', lineHeight: '',
letterSpacing: 0, letterSpacing: 0,
textAlign: '', textAlign: '',
color: '', color: ''
backgroundColor: ''
},
defaultClass: 'text-filter',
component: 'de-input-search',
options: {
refId: '1234567890',
attrs: {
placeholder: '请输入关键字'
},
value: ''
}, },
filterDialog: true component: 'de-input-search'
} }
class TextInputServiceImpl extends WidgetService { class TextInputServiceImpl extends WidgetService {
constructor(options) { constructor(options = {}) {
Object.assign(options, defaultOptions) Object.assign(options, { name: 'textInputWidget' })
super(options) super(options)
this.filterDialog = true
this.showSwitch = false
} }
initWidget() { initLeftPanel() {
// console.log('this is first initWidget') const value = JSON.parse(JSON.stringify(leftPanel))
} return value
toDrawWidget() {
// console.log('this is first toDrawWidget')
} }
// 移动到画布之前回掉
beforeToDraw() {
initFilterDialog() {
const value = JSON.parse(JSON.stringify(dialogPanel))
return value
} }
dynamicStype() {
return { initDrawPanel() {
'background-color': 'rgba(35,190,239,.1)' const value = JSON.parse(JSON.stringify(drawPanel))
} return value
} }
filterFieldMethod(fields) { filterFieldMethod(fields) {
return fields.filter(field => { return fields.filter(field => {
return field['deType'] === 0 return field['deType'] === 0
}) })
} }
// dynamicIconStype() {
// return {
// color: '#23beef'
// }
// }
} }
const textInputServiceImpl = new TextInputServiceImpl({ name: 'textInputWidget' }) const textInputServiceImpl = new TextInputServiceImpl()
export default textInputServiceImpl export default textInputServiceImpl
import { WidgetService } from '../service/WidgetService' import { WidgetService } from '../service/WidgetService'
const defaultOptions = {
name: 'textSelectWidget', const leftPanel = {
icon: 'iconfont icon-xialakuang', icon: 'iconfont icon-xialakuang',
label: '文本下拉', label: '文本下拉',
style: { defaultClass: 'text-filter'
width: 200, }
height: 22,
fontSize: 14, const dialogPanel = {
fontWeight: 500,
lineHeight: '',
letterSpacing: 0,
textAlign: '',
color: ''
},
options: { options: {
refId: '1234567890',
attrs: { attrs: {
multiple: false, multiple: false,
placeholder: '请选择', placeholder: '请选择',
...@@ -26,29 +20,44 @@ const defaultOptions = { ...@@ -26,29 +20,44 @@ const defaultOptions = {
value: '' value: ''
}, },
defaultClass: 'text-filter', defaultClass: 'text-filter',
component: 'de-select', component: 'de-select'
filterDialog: true }
const drawPanel = {
type: 'custom',
style: {
width: 300,
height: 35,
fontSize: 14,
fontWeight: 500,
lineHeight: '',
letterSpacing: 0,
textAlign: '',
color: ''
},
component: 'de-select'
} }
class TextSelectServiceImpl extends WidgetService { class TextSelectServiceImpl extends WidgetService {
constructor(options) { constructor(options = {}) {
Object.assign(options, defaultOptions) Object.assign(options, { name: 'textSelectWidget' })
super(options) super(options)
this.filterDialog = true
this.showSwitch = true
} }
initWidget() { initLeftPanel() {
// console.log('this is first initWidget') const value = JSON.parse(JSON.stringify(leftPanel))
} return value
toDrawWidget() {
// console.log('this is first toDrawWidget')
} }
// 移动到画布之前回掉
beforeToDraw() {
initFilterDialog() {
const value = JSON.parse(JSON.stringify(dialogPanel))
return value
} }
setOptionDatas(data) { initDrawPanel() {
this.options.attrs.datas = data const value = JSON.parse(JSON.stringify(drawPanel))
return value
} }
filterFieldMethod(fields) { filterFieldMethod(fields) {
...@@ -56,6 +65,16 @@ class TextSelectServiceImpl extends WidgetService { ...@@ -56,6 +65,16 @@ class TextSelectServiceImpl extends WidgetService {
return field['deType'] === 0 return field['deType'] === 0
}) })
} }
optionDatas(datas) {
if (!datas) return null
return datas.map(item => {
return {
id: item,
text: item
}
})
}
} }
const textSelectServiceImpl = new TextSelectServiceImpl({ name: 'textSelectWidget' }) const textSelectServiceImpl = new TextSelectServiceImpl()
export default textSelectServiceImpl export default textSelectServiceImpl
import { WidgetService } from '../service/WidgetService' import { WidgetService } from '../service/WidgetService'
const defaultOptions = {
name: 'timeDateRangeWidget', const leftPanel = {
icon: 'iconfont icon-riqi', icon: 'iconfont icon-riqi',
label: '日期范围', label: '日期范围',
style: { defaultClass: 'time-filter'
width: 200, }
height: 22,
fontSize: 14, const dialogPanel = {
fontWeight: 500,
lineHeight: '',
letterSpacing: 0,
textAlign: '',
color: ''
},
options: { options: {
refId: '1234567890',
attrs: { attrs: {
type: 'daterange', type: 'daterange',
rangeSeparator: '至', rangeSeparator: '至',
...@@ -24,25 +17,45 @@ const defaultOptions = { ...@@ -24,25 +17,45 @@ const defaultOptions = {
value: '' value: ''
}, },
defaultClass: 'time-filter', defaultClass: 'time-filter',
component: 'de-date', component: 'de-date'
filterDialog: true }
const drawPanel = {
type: 'custom',
style: {
width: 300,
height: 35,
fontSize: 14,
fontWeight: 500,
lineHeight: '',
letterSpacing: 0,
textAlign: '',
color: ''
},
component: 'de-date'
} }
class TimeDateRangeServiceImpl extends WidgetService { class TimeDateRangeServiceImpl extends WidgetService {
constructor(options) { constructor(options = {}) {
Object.assign(options, defaultOptions) Object.assign(options, { name: 'timeDateRangeWidget' })
super(options) super(options)
this.filterDialog = true
this.showSwitch = false
} }
initWidget() { initLeftPanel() {
const value = JSON.parse(JSON.stringify(leftPanel))
return value
// console.log('this is first initWidget') // console.log('this is first initWidget')
} }
toDrawWidget() {
// console.log('this is first toDrawWidget') initFilterDialog() {
const value = JSON.parse(JSON.stringify(dialogPanel))
return value
} }
// 移动到画布之前回掉
beforeToDraw() {
initDrawPanel() {
const value = JSON.parse(JSON.stringify(drawPanel))
return value
} }
filterFieldMethod(fields) { filterFieldMethod(fields) {
return fields.filter(field => { return fields.filter(field => {
...@@ -50,5 +63,5 @@ class TimeDateRangeServiceImpl extends WidgetService { ...@@ -50,5 +63,5 @@ class TimeDateRangeServiceImpl extends WidgetService {
}) })
} }
} }
const timeDateRangeServiceImpl = new TimeDateRangeServiceImpl({ name: 'timeDateRangeWidget' }) const timeDateRangeServiceImpl = new TimeDateRangeServiceImpl()
export default timeDateRangeServiceImpl export default timeDateRangeServiceImpl
import { WidgetService } from '../service/WidgetService' import { WidgetService } from '../service/WidgetService'
const defaultOptions = {
name: 'timeDateWidget', const leftPanel = {
icon: 'iconfont icon-ri', icon: 'iconfont icon-ri',
label: '日期', label: '日期',
style: { defaultClass: 'time-filter'
width: 200, }
height: 22,
fontSize: 14, const dialogPanel = {
fontWeight: 500,
lineHeight: '',
letterSpacing: 0,
textAlign: '',
color: ''
},
options: { options: {
refId: '1234567890',
attrs: { attrs: {
type: 'date', type: 'date',
placeholder: '请选择日期' placeholder: '请选择日期'
}, },
value: '' value: ''
}, },
defaultClass: 'time-filter', defaultClass: 'time-filter',
component: 'de-date', component: 'de-date'
filterDialog: true }
const drawPanel = {
type: 'custom',
style: {
width: 300,
height: 35,
fontSize: 14,
fontWeight: 500,
lineHeight: '',
letterSpacing: 0,
textAlign: '',
color: ''
},
component: 'de-date'
} }
class TimeDateServiceImpl extends WidgetService { class TimeDateServiceImpl extends WidgetService {
constructor(options) { constructor(options = {}) {
Object.assign(options, defaultOptions) Object.assign(options, { name: 'timeDateWidget' })
super(options) super(options)
this.filterDialog = true
this.showSwitch = false
} }
initWidget() { initLeftPanel() {
const value = JSON.parse(JSON.stringify(leftPanel))
return value
// console.log('this is first initWidget') // console.log('this is first initWidget')
} }
toDrawWidget() {
// console.log('this is first toDrawWidget') initFilterDialog() {
const value = JSON.parse(JSON.stringify(dialogPanel))
return value
} }
// 移动到画布之前回掉
beforeToDraw() {
initDrawPanel() {
const value = JSON.parse(JSON.stringify(drawPanel))
return value
} }
filterFieldMethod(fields) { filterFieldMethod(fields) {
return fields.filter(field => { return fields.filter(field => {
......
import { WidgetService } from '../service/WidgetService' import { WidgetService } from '../service/WidgetService'
const defaultOptions = {
name: 'timeMonthWidget', const leftPanel = {
icon: 'iconfont icon-yue', icon: 'iconfont icon-yue',
label: '年月', label: '年月',
style: { defaultClass: 'time-filter'
width: 200, }
height: 22,
fontSize: 14, const dialogPanel = {
fontWeight: 500,
lineHeight: '',
letterSpacing: 0,
textAlign: '',
color: ''
},
options: { options: {
refId: '1234567890',
attrs: { attrs: {
type: 'month', type: 'month',
placeholder: '请选择年月' placeholder: '请选择年月'
...@@ -22,25 +15,45 @@ const defaultOptions = { ...@@ -22,25 +15,45 @@ const defaultOptions = {
value: '' value: ''
}, },
defaultClass: 'time-filter', defaultClass: 'time-filter',
component: 'de-date', component: 'de-date'
filterDialog: true }
const drawPanel = {
type: 'custom',
style: {
width: 300,
height: 35,
fontSize: 14,
fontWeight: 500,
lineHeight: '',
letterSpacing: 0,
textAlign: '',
color: ''
},
component: 'de-date'
} }
class TimeMonthServiceImpl extends WidgetService { class TimeMonthServiceImpl extends WidgetService {
constructor(options) { constructor(options = {}) {
Object.assign(options, defaultOptions) Object.assign(options, { name: 'timeMonthWidget' })
super(options) super(options)
this.filterDialog = true
this.showSwitch = false
} }
initWidget() { initLeftPanel() {
const value = JSON.parse(JSON.stringify(leftPanel))
return value
// console.log('this is first initWidget') // console.log('this is first initWidget')
} }
toDrawWidget() {
// console.log('this is first toDrawWidget') initFilterDialog() {
const value = JSON.parse(JSON.stringify(dialogPanel))
return value
} }
// 移动到画布之前回掉
beforeToDraw() {
initDrawPanel() {
const value = JSON.parse(JSON.stringify(drawPanel))
return value
} }
filterFieldMethod(fields) { filterFieldMethod(fields) {
return fields.filter(field => { return fields.filter(field => {
...@@ -48,5 +61,5 @@ class TimeMonthServiceImpl extends WidgetService { ...@@ -48,5 +61,5 @@ class TimeMonthServiceImpl extends WidgetService {
}) })
} }
} }
const timeMonthServiceImpl = new TimeMonthServiceImpl({ name: 'timeMonthWidget' }) const timeMonthServiceImpl = new TimeMonthServiceImpl()
export default timeMonthServiceImpl export default timeMonthServiceImpl
import { WidgetService } from '../service/WidgetService' import { WidgetService } from '../service/WidgetService'
const defaultOptions = {
name: 'timeQuarterWidget', const leftPanel = {
icon: 'iconfont icon-jidu', icon: 'iconfont icon-jidu',
label: '季度', label: '季度',
defaultClass: 'time-filter'
}
const dialogPanel = {
options: {
attrs: {
placeholder: '请选择季度'
},
value: ''
},
defaultClass: 'time-filter',
component: 'de-quarter'
}
const drawPanel = {
type: 'custom',
style: { style: {
width: 200, width: 300,
height: 22, height: 35,
fontSize: 14, fontSize: 14,
fontWeight: 500, fontWeight: 500,
lineHeight: '', lineHeight: '',
...@@ -13,34 +28,31 @@ const defaultOptions = { ...@@ -13,34 +28,31 @@ const defaultOptions = {
textAlign: '', textAlign: '',
color: '' color: ''
}, },
options: { component: 'de-quarter'
refId: '1234567890',
attrs: {
placeholder: '请选择季度'
},
value: ''
},
defaultClass: 'time-filter',
component: 'de-quarter',
filterDialog: true
} }
class TimeQuarterServiceImpl extends WidgetService { class TimeQuarterServiceImpl extends WidgetService {
constructor(options) { constructor(options = {}) {
Object.assign(options, defaultOptions) Object.assign(options, { name: 'timeQuarterWidget' })
super(options) super(options)
this.filterDialog = true
this.showSwitch = false
} }
initWidget() { initLeftPanel() {
const value = JSON.parse(JSON.stringify(leftPanel))
return value
// console.log('this is first initWidget') // console.log('this is first initWidget')
} }
toDrawWidget() {
// console.log('this is first toDrawWidget') initFilterDialog() {
const value = JSON.parse(JSON.stringify(dialogPanel))
return value
} }
// 移动到画布之前回掉
beforeToDraw() {
initDrawPanel() {
const value = JSON.parse(JSON.stringify(drawPanel))
return value
} }
filterFieldMethod(fields) { filterFieldMethod(fields) {
return fields.filter(field => { return fields.filter(field => {
...@@ -48,5 +60,5 @@ class TimeQuarterServiceImpl extends WidgetService { ...@@ -48,5 +60,5 @@ class TimeQuarterServiceImpl extends WidgetService {
}) })
} }
} }
const timeQuarterServiceImpl = new TimeQuarterServiceImpl({ name: 'timeQuarterWidget' }) const timeQuarterServiceImpl = new TimeQuarterServiceImpl()
export default timeQuarterServiceImpl export default timeQuarterServiceImpl
import { WidgetService } from '../service/WidgetService' import { WidgetService } from '../service/WidgetService'
const defaultOptions = {
name: 'timeYearWidget', const leftPanel = {
icon: 'iconfont icon-nian', icon: 'iconfont icon-nian',
label: '年份', label: '年份',
style: { defaultClass: 'time-filter'
width: 200, }
height: 22,
fontSize: 14, const dialogPanel = {
fontWeight: 500,
lineHeight: '',
letterSpacing: 0,
textAlign: '',
color: ''
},
options: { options: {
refId: '1234567890',
attrs: { attrs: {
type: 'year', type: 'year',
placeholder: '请选择年份' placeholder: '请选择年份'
...@@ -22,25 +15,45 @@ const defaultOptions = { ...@@ -22,25 +15,45 @@ const defaultOptions = {
value: '' value: ''
}, },
defaultClass: 'time-filter', defaultClass: 'time-filter',
component: 'de-date', component: 'de-date'
filterDialog: true }
const drawPanel = {
type: 'custom',
style: {
width: 300,
height: 35,
fontSize: 14,
fontWeight: 500,
lineHeight: '',
letterSpacing: 0,
textAlign: '',
color: ''
},
component: 'de-date'
} }
class TimeYearServiceImpl extends WidgetService { class TimeYearServiceImpl extends WidgetService {
constructor(options) { constructor(options = {}) {
Object.assign(options, defaultOptions) Object.assign(options, { name: 'timeYearWidget' })
super(options) super(options)
this.filterDialog = true
this.showSwitch = false
} }
initWidget() { initLeftPanel() {
const value = JSON.parse(JSON.stringify(leftPanel))
return value
// console.log('this is first initWidget') // console.log('this is first initWidget')
} }
toDrawWidget() {
// console.log('this is first toDrawWidget') initFilterDialog() {
const value = JSON.parse(JSON.stringify(dialogPanel))
return value
} }
// 移动到画布之前回掉
beforeToDraw() {
initDrawPanel() {
const value = JSON.parse(JSON.stringify(drawPanel))
return value
} }
filterFieldMethod(fields) { filterFieldMethod(fields) {
...@@ -49,5 +62,5 @@ class TimeYearServiceImpl extends WidgetService { ...@@ -49,5 +62,5 @@ class TimeYearServiceImpl extends WidgetService {
}) })
} }
} }
const timeYearServiceImpl = new TimeYearServiceImpl({ name: 'timeYearWidget' }) const timeYearServiceImpl = new TimeYearServiceImpl()
export default timeYearServiceImpl export default timeYearServiceImpl
...@@ -97,7 +97,7 @@ ...@@ -97,7 +97,7 @@
<div style="text-align: end !important;margin: 0 15px !important;"> <div style="text-align: end !important;margin: 0 15px !important;">
<span slot="footer"> <span slot="footer">
<el-button @click="cancelFilter">取 消</el-button> <el-button @click="cancelFilter">取 消</el-button>
<el-button type="primary" @click="sureFilter">确 定</el-button> <el-button :disabled="!currentFilterCom.options.attrs.fieldId" type="primary" @click="sureFilter">确 定</el-button>
</span> </span>
</div> </div>
</el-dialog> </el-dialog>
...@@ -342,6 +342,7 @@ export default { ...@@ -342,6 +342,7 @@ export default {
}, },
reFreshComponent(component) { reFreshComponent(component) {
this.currentFilterCom = component this.currentFilterCom = component
this.$forceUpdate()
}, },
eidtDialog() { eidtDialog() {
const serviceName = this.curComponent.serviceName const serviceName = this.curComponent.serviceName
......
...@@ -110,12 +110,36 @@ ...@@ -110,12 +110,36 @@
v-model="componentInfo.options.attrs.multiple" v-model="componentInfo.options.attrs.multiple"
active-text="多选" active-text="多选"
inactive-text="单选" inactive-text="单选"
@change="multipleChange"
/> />
</div> </div>
</el-col> </el-col>
<el-col :span="16"><div class="filter-options-right"> <el-col :span="16"><div class="filter-options-right">
<el-checkbox v-model="customRange"><span> 自定义控制范围 </span> </el-checkbox> <el-checkbox v-model="customRange"><span> 自定义控制范围 </span> </el-checkbox>
<i :class="{'i-filter-active': customRange, 'i-filter-inactive': !customRange}" class="el-icon-setting i-filter" @click="showFilterRange" />
<el-popover
v-model="popovervisible"
placement="bottom-end"
:disabled="!customRange"
width="200"
>
<div class="view-container-class">
<el-checkbox-group v-model="checkedViews" @change="checkedViewsChange">
<el-checkbox v-for="(item ) in viewInfos" :key="item.id" :label="item.id" border>
<span>
<svg-icon :icon-class="item.type" class="chart-icon" />
<span style="margin-left: 6px">{{ item.name }}</span>
</span>
</el-checkbox>
</el-checkbox-group>
</div>
<!-- <div style="text-align: right; margin: 0">
<el-button size="mini" type="text" @click="popovervisible=false">取消</el-button>
<el-button type="primary" size="mini" @click="popovervisible=false">确定</el-button>
</div> -->
<i slot="reference" :class="{'i-filter-active': customRange, 'i-filter-inactive': !customRange}" class="el-icon-setting i-filter" />
</el-popover>
<!-- <el-checkbox disabled>备选项</el-checkbox> --> <!-- <el-checkbox disabled>备选项</el-checkbox> -->
</div> </div>
...@@ -147,8 +171,10 @@ import DeContainer from '@/components/dataease/DeContainer' ...@@ -147,8 +171,10 @@ import DeContainer from '@/components/dataease/DeContainer'
import DeAsideContainer from '@/components/dataease/DeAsideContainer' import DeAsideContainer from '@/components/dataease/DeAsideContainer'
import draggable from 'vuedraggable' import draggable from 'vuedraggable'
import DragItem from '@/components/DragItem' import DragItem from '@/components/DragItem'
import { mapState } from 'vuex'
// import { ApplicationContext } from '@/utils/ApplicationContext' // import { ApplicationContext } from '@/utils/ApplicationContext'
import { groupTree, loadTable, fieldList, fieldValues } from '@/api/dataset/dataset' import { groupTree, loadTable, fieldList, fieldValues } from '@/api/dataset/dataset'
import { viewsWithIds } from '@/api/panel/view'
export default { export default {
name: 'FilterDialog', name: 'FilterDialog',
components: { components: {
...@@ -169,6 +195,7 @@ export default { ...@@ -169,6 +195,7 @@ export default {
default: null default: null
} }
}, },
data() { data() {
return { return {
activeName: 'dataset', activeName: 'dataset',
...@@ -186,22 +213,45 @@ export default { ...@@ -186,22 +213,45 @@ export default {
selectField: [], selectField: [],
widget: null, widget: null,
fieldValues: [], fieldValues: [],
customRange: false customRange: false,
popovervisible: false,
viewInfos: [],
checkedViews: []
} }
}, },
computed: {
panelInfo() {
return this.$store.state.panel.panelInfo
},
...mapState([
'componentData',
'curComponent',
'isClickComponent',
'canvasStyleData',
'curComponentIndex'
])
},
watch: { watch: {
selectField(values) { selectField(values) {
if (values && values.length > 0) { if (values && values.length > 0) {
const value = values[0] const value = values[0]
const fieldId = value.id const fieldId = value.id
const info = this.componentInfo if (this.widget && this.widget.optionDatas) {
this.widget && fieldValues(fieldId).then(res => { fieldValues(fieldId).then(res => {
info.options.attrs.datas = this.widget.optionDatas(res.data) this.componentInfo.options.attrs.datas = this.widget.optionDatas(res.data)
info.options.attrs.fieldId = fieldId this.componentInfo.options.attrs.fieldId = fieldId
info.options.attrs.dragItems = values this.componentInfo.options.attrs.dragItems = values
this.$emit('re-fresh-component', info) this.$emit('re-fresh-component', this.componentInfo)
}) })
} else {
this.componentInfo.options.attrs.fieldId = fieldId
this.componentInfo.options.attrs.dragItems = values
this.$emit('re-fresh-component', this.componentInfo)
}
} else if (this.componentInfo && this.componentInfo.options.attrs.fieldId) {
this.componentInfo.options.attrs.fieldId = null
this.$emit('re-fresh-component', this.componentInfo)
} }
} }
}, },
...@@ -213,9 +263,26 @@ export default { ...@@ -213,9 +263,26 @@ export default {
if (this.componentInfo && this.componentInfo.options.attrs.dragItems) { if (this.componentInfo && this.componentInfo.options.attrs.dragItems) {
this.selectField = this.componentInfo.options.attrs.dragItems this.selectField = this.componentInfo.options.attrs.dragItems
} }
this.loadViews()
}, },
methods: { methods: {
loadViews() {
const viewIds = this.componentData
.filter(item => item.type === 'view' && item.propValue && item.propValue.viewId)
.map(item => item.propValue.viewId)
viewsWithIds(viewIds).then(res => {
const datas = res.data
// for (let index = 0; index < 4; index++) {
// datas = datas.concat(datas)
// }
// datas.forEach(item => item.name += 'aaaaaaaaabbbbb')
this.viewInfos = datas
})
},
handleNodeClick(data) { handleNodeClick(data) {
if (data.type === 'scene') { if (data.type === 'scene') {
this.showSceneTable(data) this.showSceneTable(data)
...@@ -334,11 +401,16 @@ export default { ...@@ -334,11 +401,16 @@ export default {
const index = tag.index const index = tag.index
this.selectField.splice(index, 1) this.selectField.splice(index, 1)
}, },
showFilterRange() {
// 如果不是自定义范围 直接返回 multipleChange(value) {
if (!this.customRange) { // this.componentInfo.options.attrs.multiple = value
return // this.componentInfo.options.value = null
} this.$emit('re-fresh-component', this.componentInfo)
},
checkedViewsChange(values) {
this.componentInfo.options.attrs.viewIds = values
this.$emit('re-fresh-component', this.componentInfo)
} }
} }
} }
...@@ -484,4 +556,18 @@ export default { ...@@ -484,4 +556,18 @@ export default {
cursor: pointer!important; cursor: pointer!important;
} }
.view-container-class {
min-height: 150px;
max-height: 200px;
width: 100%;
overflow-y: auto;
overflow-x: hidden;
word-break:break-all;
position: relative;
>>> label {
width: 100%;
}
}
</style> </style>
...@@ -36,28 +36,31 @@ export default { ...@@ -36,28 +36,31 @@ export default {
return { return {
componentList, componentList,
panelInfo: this.$store.state.panel.panelInfo, panelInfo: this.$store.state.panel.panelInfo,
// widgetSubjects: {
// '文本过滤组件': [
// 'mySelectWidget'
// ]
// }
widgetSubjects: { widgetSubjects: {
'时间过滤组件': [
'timeYearWidget',
'timeMonthWidget',
// 'timeQuarterWidget',
'timeDateWidget',
'timeDateRangeWidget'
],
'文本过滤组件': [ '文本过滤组件': [
'mySelectWidget' 'textSelectWidget',
'textInputWidget'
],
'数字过滤组件': [
'numberSelectWidget'
],
'按钮': [
'buttonSureWidget'
] ]
} }
// widgetSubjects: {
// '时间过滤组件': [
// 'timeYearWidget',
// 'timeMonthWidget',
// 'timeQuarterWidget',
// 'timeDateWidget',
// 'timeDateRangeWidget'
// ],
// '文本过滤组件': [
// 'textSelectWidget',
// 'textInputWidget'
// ],
// '按钮': [
// 'buttonSureWidget'
// ]
// }
} }
}, },
created() { created() {
...@@ -186,6 +189,24 @@ export default { ...@@ -186,6 +189,24 @@ export default {
color: #fff; color: #fff;
} }
} }
.tree-filter {
background-color: rgba(22,160,132,.1);
.filter-widget-icon {
color: #37b4aa;
}
.filter-widget-text {
color: #3d4d66;
}
}
.tree-filter:hover {
background-color: #37b4aa;
.filter-widget-icon {
color: #37b4aa;
}
.filter-widget-text {
color: #fff;
}
}
.filter-widget-icon { .filter-widget-icon {
width: 40px; width: 40px;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论