From d94189d1532a7d2816a0c0c2a6ca8f7587f08a18 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 9 Nov 2023 15:38:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=8B=E6=8B=89=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=E5=99=A8=E8=AE=BE=E7=BD=AE=E4=B8=BA=E5=BF=85=E5=A1=AB=E9=80=89?= =?UTF-8?q?=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../canvas/components/editor/DeEditor.vue | 5 +- .../canvas/components/editor/Preview.vue | 5 +- .../canvas/customComponent/UserView.vue | 60 +++++++++++++++---- .../src/components/dataease/DeOutWidget.vue | 23 ++++++- .../src/components/widget/bean/Condition.js | 1 + .../components/widget/deWidget/DeSelect.vue | 13 ++-- core/frontend/src/store/index.js | 5 +- .../src/views/panel/filter/FilterDialog.vue | 26 ++++++-- .../panel/filter/filterMain/FilterFoot.vue | 6 ++ .../panel/filter/filterMain/FilterHead.vue | 18 +++++- 10 files changed, 134 insertions(+), 28 deletions(-) diff --git a/core/frontend/src/components/canvas/components/editor/DeEditor.vue b/core/frontend/src/components/canvas/components/editor/DeEditor.vue index 3d8fb883b1..7340198ee3 100644 --- a/core/frontend/src/components/canvas/components/editor/DeEditor.vue +++ b/core/frontend/src/components/canvas/components/editor/DeEditor.vue @@ -1258,7 +1258,10 @@ export default { } param = wrapperChild.getCondition && wrapperChild.getCondition() const condition = formatCondition(param) - const vValid = valueValid(condition) + let vValid = valueValid(condition) + const required = element.options.attrs.required + condition.requiredInvalid = required && !vValid + vValid = vValid || required const filterComponentId = condition.componentId const conditionCanvasId = wrapperChild.getCanvasId && wrapperChild.getCanvasId() Object.keys(result).forEach(viewId => { diff --git a/core/frontend/src/components/canvas/components/editor/Preview.vue b/core/frontend/src/components/canvas/components/editor/Preview.vue index 835e6d7652..357c632813 100644 --- a/core/frontend/src/components/canvas/components/editor/Preview.vue +++ b/core/frontend/src/components/canvas/components/editor/Preview.vue @@ -593,7 +593,10 @@ export default { } param = wrapperChild.getCondition && wrapperChild.getCondition() const condition = formatCondition(param) - const vValid = valueValid(condition) + let vValid = valueValid(condition) + const required = element.options.attrs.required + condition.requiredInvalid = required && !vValid + vValid = vValid || required const filterComponentId = condition.componentId const conditionCanvasId = wrapperChild.getCanvasId && wrapperChild.getCanvasId() Object.keys(result).forEach(viewId => { diff --git a/core/frontend/src/components/canvas/customComponent/UserView.vue b/core/frontend/src/components/canvas/customComponent/UserView.vue index 4e7c078f90..3e834e3222 100644 --- a/core/frontend/src/components/canvas/customComponent/UserView.vue +++ b/core/frontend/src/components/canvas/customComponent/UserView.vue @@ -28,8 +28,15 @@ {{ $t('chart.chart_error_tips') }} +
+
+ {{ view.unReadyMsg }},{{ $t('chart.chart_show_error') }} +
+ {{ $t('chart.chart_error_tips') }} +
+
{ - if (f instanceof Promise) { - unReadyList.push(f) - } else { - readyList.push(f) - } - }) + const group = this.groupFilter(this.filters) + const unReadyList = group.unReady + const readyList = group.ready if (unReadyList.length) { Promise.all(this.filters.filter(f => f instanceof Promise)).then(fList => { this.filter.filter = readyList.concat(fList) @@ -622,6 +622,34 @@ export default { } }, methods: { + groupFilter(filters) { + const result = { + ready: [], + unReady: [] + } + filters.forEach(f => { + if (f instanceof Promise) { + result.unReady.push(f) + } else { + result.ready.push(f) + } + }) + return result + }, + groupRequiredInvalid(filters) { + const result = { + ready: [], + unReady: [] + } + filters.forEach(f => { + if (f.requiredInvalid) { + result.unReady.push(f) + } else { + result.ready.push(f) + } + }) + return result + }, equalsAny, tabSwitch(tabCanvasId) { if (this.charViewS2ShowFlag && tabCanvasId === this.canvasId && this.$refs[this.element.propValue.id]) { @@ -791,6 +819,15 @@ export default { }, getData(id, cache = true, dataBroadcast = false) { if (id) { + const filters = this.filter.filter + const group = this.groupRequiredInvalid(filters) + if (group.unReady?.length) { + this.view.unReadyMsg = '请先完成必填项过滤器!' + this.getDataLoading = false + return + } else { + this.view.unReadyMsg = '' + } if (this.getDataLoading || Vue.prototype.$currentHttpRequestList.get(`/chart/view/getData/${id}/${this.panelInfo.id}`)) { const url = `/chart/view/getData/${id}/${this.panelInfo.id}` Vue.prototype.$cancelRequest(url) @@ -812,6 +849,7 @@ export default { if (!token && linkToken) { method = viewInfo } + const requestInfo = { ...this.filter, cache: cache, diff --git a/core/frontend/src/components/dataease/DeOutWidget.vue b/core/frontend/src/components/dataease/DeOutWidget.vue index 3b7cbd8e73..d68712a26c 100644 --- a/core/frontend/src/components/dataease/DeOutWidget.vue +++ b/core/frontend/src/components/dataease/DeOutWidget.vue @@ -26,9 +26,12 @@
-
+
+
+ * +
@@ -270,6 +279,16 @@ export default { overflow: auto hidden; letter-spacing: 0px !important; width: 100%; + .widget-required { + width: calc(100% - 10px) !important; + float: left !important; + } + .widget-required-symbol { + color: #f54a45; + height: 40px; + line-height: 40px; + float: right; + } } .condition-content-container { diff --git a/core/frontend/src/components/widget/bean/Condition.js b/core/frontend/src/components/widget/bean/Condition.js index bf5ca5f799..5b73e602f0 100644 --- a/core/frontend/src/components/widget/bean/Condition.js +++ b/core/frontend/src/components/widget/bean/Condition.js @@ -13,5 +13,6 @@ export class Condition { this.viewIds = viewIds this.parameters = parameters this.isTree = isTree || false + this.requiredInvalid = false } } diff --git a/core/frontend/src/components/widget/deWidget/DeSelect.vue b/core/frontend/src/components/widget/deWidget/DeSelect.vue index fa5cddcb81..2d5020a517 100644 --- a/core/frontend/src/components/widget/deWidget/DeSelect.vue +++ b/core/frontend/src/components/widget/deWidget/DeSelect.vue @@ -143,6 +143,11 @@ export default { }, watch: { + 'value': function(val, old) { + if (!this.inDraw) { + this.$emit('widget-value-changed', val) + } + }, 'viewIds': function(value, old) { if (typeof value === 'undefined' || value === old) return this.fillFirstValue() @@ -214,6 +219,9 @@ export default { if (!token && linkToken) { method = linkMultFieldValues } + if (!this.element.options.attrs.fieldId) { + return + } const param = { fieldIds: this.element.options.attrs.fieldId.split(this.separator), sort: this.element.options.attrs.sort } if (this.panelInfo.proxy) { param.userId = this.panelInfo.proxy @@ -474,14 +482,9 @@ export default { }