diff --git a/frontend/src/components/canvas/components/Editor/Preview.vue b/frontend/src/components/canvas/components/Editor/Preview.vue index 3c33311250..d75ab4a966 100644 --- a/frontend/src/components/canvas/components/Editor/Preview.vue +++ b/frontend/src/components/canvas/components/Editor/Preview.vue @@ -80,7 +80,7 @@ import UserViewDialog from '@/components/canvas/custom-component/UserViewDialog' import CanvasOptBar from '@/components/canvas/components/Editor/CanvasOptBar' import UserViewMobileDialog from '@/components/canvas/custom-component/UserViewMobileDialog' import bus from '@/utils/bus' -import { buildFilterMap } from '@/utils/conditionUtil' +import { buildFilterMap, buildViewKeyMap, formatCondition, valueValid, viewIdMatch } from '@/utils/conditionUtil' import { hasDataPermission } from '@/utils/permission' const erd = elementResizeDetectorMaker() @@ -171,7 +171,8 @@ export default { showChartTableInfo: {}, showChartInfoType: 'details', // 布局展示 1.pc pc端布局 2.mobile 移动端布局 - terminal: 'pc' + terminal: 'pc', + buttonFilterMap: null } }, created() { @@ -256,7 +257,7 @@ export default { 'isClickComponent' ]), filterMap() { - const map = buildFilterMap(this.componentData) + const map = this.buttonFilterMap || buildFilterMap(this.componentData) return map } }, @@ -283,14 +284,79 @@ export default { if (this.terminal === 'mobile') { this.initMobileCanvas() } + bus.$on('trigger-search-button', this.triggerSearchButton) }, beforeDestroy() { erd.uninstall(this.$refs.canvasInfoTemp) erd.uninstall(this.$refs.canvasInfoMain) clearInterval(this.timer) eventBus.$off('openChartDetailsDialog', this.openChartDetailsDialog) + bus.$on('trigger-search-button', this.triggerSearchButton) }, methods: { + triggerSearchButton() { + this.buttonFilterMap = this.buildButtonFilterMap(this.componentData) + }, + buildButtonFilterMap(panelItems) { + const result = { + buttonExist: false, + relationFilterIds: [], + filterMap: { + + } + } + if (!panelItems || !panelItems.length) return result + let sureButtonItem = null + result.buttonExist = panelItems.some(item => { + if (item.type === 'custom-button' && item.serviceName === 'buttonSureWidget') { + sureButtonItem = item + return true + } + }) + + if (!result.buttonExist) return result + + const customRange = sureButtonItem.options.attrs.customRange + + const allFilters = panelItems.filter(item => item.type === 'custom') + + const matchFilters = customRange && allFilters.filter(item => sureButtonItem.options.attrs.filterIds.includes(item.id)) || allFilters + + result.relationFilterIds = matchFilters.map(item => item.id) + + let viewKeyMap = buildViewKeyMap(panelItems) + viewKeyMap = this.buildViewKeyFilters(matchFilters, viewKeyMap) + result.filterMap = viewKeyMap + return result + }, + buildViewKeyFilters(panelItems, result) { + const refs = this.$refs + panelItems.forEach((element, index) => { + if (element.type !== 'custom') { + return true + } + + let param = null + const wrapperChild = refs['wrapperChild'][index] + param = wrapperChild.getCondition && wrapperChild.getCondition() + const condition = formatCondition(param) + const vValid = valueValid(condition) + const filterComponentId = condition.componentId + Object.keys(result).forEach(viewId => { + const vidMatch = viewIdMatch(condition.viewIds, viewId) + const viewFilters = result[viewId] + let j = viewFilters.length + while (j--) { + const filter = viewFilters[j] + if (filter.componentId === filterComponentId) { + viewFilters.splice(j, 1) + } + } + vidMatch && vValid && viewFilters.push(condition) + }) + }) + return result + }, _isMobile() { const flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i) this.terminal = flag ? 'mobile' : 'pc' diff --git a/frontend/src/components/canvas/components/Editor/SettingMenu.vue b/frontend/src/components/canvas/components/Editor/SettingMenu.vue index bb1dfb377c..ce84def1ea 100644 --- a/frontend/src/components/canvas/components/Editor/SettingMenu.vue +++ b/frontend/src/components/canvas/components/Editor/SettingMenu.vue @@ -5,7 +5,7 @@ {{ $t('panel.edit') }} - {{ $t('panel.copy') }} + {{ $t('panel.copy') }} {{ $t('panel.delete') }} @@ -73,7 +73,7 @@ export default { edit() { if (this.curComponent.type === 'custom') { bus.$emit('component-dialog-edit', 'update') - }else if (this.curComponent.type === 'custom-button') { + } else if (this.curComponent.type === 'custom-button') { bus.$emit('button-dialog-edit') } else if (this.curComponent.type === 'v-text' || this.curComponent.type === 'de-rich-text' || this.curComponent.type === 'rect-shape') { bus.$emit('component-dialog-style') diff --git a/frontend/src/components/canvas/components/Editor/index.vue b/frontend/src/components/canvas/components/Editor/index.vue index ba85549b82..e807fb3543 100644 --- a/frontend/src/components/canvas/components/Editor/index.vue +++ b/frontend/src/components/canvas/components/Editor/index.vue @@ -61,7 +61,7 @@ @editComponent="editComponent(index,item)" > { + if (item.type === 'custom-button' && item.serviceName === 'buttonSureWidget') { + sureButtonItem = item + return true + } + }) + + if (!result.buttonExist) return result + + const customRange = sureButtonItem.options.attrs.customRange + + const allFilters = panelItems.filter(item => item.type === 'custom') + + const matchFilters = customRange && allFilters.filter(item => sureButtonItem.options.attrs.filterIds.includes(item.id)) || allFilters + + result.relationFilterIds = matchFilters.map(item => item.id) + + let viewKeyMap = buildViewKeyMap(panelItems) + viewKeyMap = this.buildViewKeyFilters(matchFilters, viewKeyMap) + result.filterMap = viewKeyMap + return result + }, + buildViewKeyFilters(panelItems, result) { + const refs = this.$refs + panelItems.forEach((element, index) => { + if (element.type !== 'custom') { + return true + } + + let param = null + const wrapperChild = refs['wrapperChild'][index] + param = wrapperChild.getCondition && wrapperChild.getCondition() + const condition = formatCondition(param) + const vValid = valueValid(condition) + const filterComponentId = condition.componentId + Object.keys(result).forEach(viewId => { + const vidMatch = viewIdMatch(condition.viewIds, viewId) + const viewFilters = result[viewId] + let j = viewFilters.length + while (j--) { + const filter = viewFilters[j] + if (filter.componentId === filterComponentId) { + viewFilters.splice(j, 1) + } + } + vidMatch && vValid && viewFilters.push(condition) + }) + }) + return result + }, pluginEditHandler({ e, id }) { let index = -1 for (let i = 0; i < this.componentData.length; i++) { diff --git a/frontend/src/components/dataease/DeOutWidget.vue b/frontend/src/components/dataease/DeOutWidget.vue index a185ebe983..1eb1320159 100644 --- a/frontend/src/components/dataease/DeOutWidget.vue +++ b/frontend/src/components/dataease/DeOutWidget.vue @@ -27,7 +27,7 @@ :is="element.component" v-if="element.type==='custom'" :id="'component' + element.id" - ref="deOutWidget" + ref="filter-ref" class="component-custom" :out-style="element.style" :element="element" @@ -152,6 +152,12 @@ export default { alignItems: 'center' } } + }, + getCondition() { + if (this.$refs && this.$refs['filter-ref'] && this.$refs['filter-ref'].getCondition) { + return this.$refs['filter-ref'].getCondition() + } + return null } } } diff --git a/frontend/src/components/widget/DeWidget/DeButton.vue b/frontend/src/components/widget/DeWidget/DeButton.vue index e9a309cae9..b3af43a56d 100644 --- a/frontend/src/components/widget/DeWidget/DeButton.vue +++ b/frontend/src/components/widget/DeWidget/DeButton.vue @@ -6,12 +6,14 @@ :round="options.attrs.round" :plain="options.attrs.plain" :size="size" + @click="triggerSearch" > {{ options.value }} diff --git a/frontend/src/components/widget/DeWidget/DeDate.vue b/frontend/src/components/widget/DeWidget/DeDate.vue index c6aa2c46d5..92db04d2e8 100644 --- a/frontend/src/components/widget/DeWidget/DeDate.vue +++ b/frontend/src/components/widget/DeWidget/DeDate.vue @@ -170,13 +170,17 @@ export default { search() { this.setCondition() }, - setCondition() { + getCondition() { const param = { component: this.element, value: this.formatFilterValue(), operator: this.operator } param.value = this.formatValues(param.value) + return param + }, + setCondition() { + const param = this.getCondition() this.inDraw && this.$store.commit('addViewFilter', param) }, dateChange(value) { diff --git a/frontend/src/components/widget/DeWidget/DeInputSearch.vue b/frontend/src/components/widget/DeWidget/DeInputSearch.vue index bfe7c4a624..2e1b9f751e 100644 --- a/frontend/src/components/widget/DeWidget/DeInputSearch.vue +++ b/frontend/src/components/widget/DeWidget/DeInputSearch.vue @@ -91,12 +91,16 @@ export default { } this.setCondition() }, - setCondition() { + getCondition() { const param = { component: this.element, value: !this.value ? [] : Array.isArray(this.value) ? this.value : [this.value], operator: this.operator } + return param + }, + setCondition() { + const param = this.getCondition() this.inDraw && this.$store.commit('addViewFilter', param) }, setEdit() { diff --git a/frontend/src/components/widget/DeWidget/DeNumberRange.vue b/frontend/src/components/widget/DeWidget/DeNumberRange.vue index c56ce9358f..e0f6210e89 100644 --- a/frontend/src/components/widget/DeWidget/DeNumberRange.vue +++ b/frontend/src/components/widget/DeWidget/DeNumberRange.vue @@ -194,13 +194,33 @@ export default { }) }) }, - setCondition() { + getCondition() { const param = { component: this.element, - // value: !this.values ? [] : Array.isArray(this.values) ? this.values : [this.values], value: [this.form.min, this.form.max], operator: this.operator } + if (this.form.min && this.form.max) { + return param + } + if (!this.form.min && !this.form.max) { + param.value = [] + return param + } + if (this.form.min) { + param.value = [this.form.min] + param.operator = 'ge' + return param + } + if (this.form.max) { + param.value = [this.form.max] + param.operator = 'le' + return param + } + return param + }, + setCondition() { + const param = this.getCondition() if (this.form.min && this.form.max) { this.inDraw && this.$store.commit('addViewFilter', param) diff --git a/frontend/src/components/widget/DeWidget/DeSelect.vue b/frontend/src/components/widget/DeWidget/DeSelect.vue index 6e0096b4c7..64f00b2ccd 100644 --- a/frontend/src/components/widget/DeWidget/DeSelect.vue +++ b/frontend/src/components/widget/DeWidget/DeSelect.vue @@ -276,13 +276,16 @@ export default { this.handleElTagStyle() }) }, - - setCondition() { + getCondition() { const param = { component: this.element, value: this.formatFilterValue(), operator: this.operator } + return param + }, + setCondition() { + const param = this.getCondition() this.inDraw && this.$store.commit('addViewFilter', param) }, formatFilterValue() { diff --git a/frontend/src/components/widget/DeWidget/DeSelectGrid.vue b/frontend/src/components/widget/DeWidget/DeSelectGrid.vue index a727d0d84d..0524278392 100644 --- a/frontend/src/components/widget/DeWidget/DeSelectGrid.vue +++ b/frontend/src/components/widget/DeWidget/DeSelectGrid.vue @@ -273,13 +273,16 @@ export default { } this.setCondition() }, - - setCondition() { + getCondition() { const param = { component: this.element, value: this.formatFilterValue(), operator: this.operator } + return param + }, + setCondition() { + const param = this.getCondition() this.inDraw && this.$store.commit('addViewFilter', param) }, formatFilterValue() { diff --git a/frontend/src/components/widget/DeWidget/DeSelectTree.vue b/frontend/src/components/widget/DeWidget/DeSelectTree.vue index 204cf98bba..db847c33f4 100644 --- a/frontend/src/components/widget/DeWidget/DeSelectTree.vue +++ b/frontend/src/components/widget/DeWidget/DeSelectTree.vue @@ -279,7 +279,7 @@ export default { this.setCondition() }, - setCondition() { + getCondition() { const val = this.formatFilterValue() const param = { @@ -288,6 +288,11 @@ export default { operator: this.operator, isTree: true } + return param + }, + + setCondition() { + const param = this.getCondition() this.inDraw && this.$store.commit('addViewFilter', param) }, formatFilterValue() { diff --git a/frontend/src/components/widget/serviceImpl/ButtonSureServiceImpl.js b/frontend/src/components/widget/serviceImpl/ButtonSureServiceImpl.js index e107121d86..e8c0bc79db 100644 --- a/frontend/src/components/widget/serviceImpl/ButtonSureServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/ButtonSureServiceImpl.js @@ -24,7 +24,8 @@ const drawPanel = { round: false, plain: true, customRange: false, - filterIds: [] + filterIds: [], + autoTrigger: true }, value: '查询' }, diff --git a/frontend/src/utils/conditionUtil.js b/frontend/src/utils/conditionUtil.js index 93b5a0ff01..f4299073bd 100644 --- a/frontend/src/utils/conditionUtil.js +++ b/frontend/src/utils/conditionUtil.js @@ -51,8 +51,8 @@ export const formatLinkageCondition = obj => { return condition } -export const buildFilterMap = panelItems => { - const viewIdMatch = (viewIds, viewId) => !viewIds || viewIds.length === 0 || viewIds.includes(viewId) +export const viewIdMatch = (viewIds, viewId) => !viewIds || viewIds.length === 0 || viewIds.includes(viewId) +export const buildViewKeyMap = panelItems => { const result = {} panelItems.forEach(element => { if (element.type === 'view') { @@ -66,12 +66,18 @@ export const buildFilterMap = panelItems => { }) } }) - panelItems.forEach(element => { + return result +} + +export const buildViewKeyFilters = (panelItems, result) => { + panelItems.forEach((element, index) => { if (element.type !== 'custom') { return true } + + let param = null const widget = ApplicationContext.getService(element.serviceName) - const param = widget.getParam(element) + param = widget.getParam(element) const condition = formatCondition(param) const vValid = valueValid(condition) const filterComponentId = condition.componentId @@ -90,3 +96,9 @@ export const buildFilterMap = panelItems => { }) return result } +export const buildFilterMap = panelItems => { + let result = buildViewKeyMap(panelItems) + + result = buildViewKeyFilters(panelItems, result) + return result +} diff --git a/frontend/src/views/panel/filter/ButtonDialog.vue b/frontend/src/views/panel/filter/ButtonDialog.vue index e5a05bbb39..ab2b9fb514 100644 --- a/frontend/src/views/panel/filter/ButtonDialog.vue +++ b/frontend/src/views/panel/filter/ButtonDialog.vue @@ -1,23 +1,25 @@