diff --git a/core/frontend/src/components/canvas/components/editor/ComponentWrapper.vue b/core/frontend/src/components/canvas/components/editor/ComponentWrapper.vue
index ebcfcf0084..b67ff70527 100644
--- a/core/frontend/src/components/canvas/components/editor/ComponentWrapper.vue
+++ b/core/frontend/src/components/canvas/components/editor/ComponentWrapper.vue
@@ -48,6 +48,7 @@
:h="config.style.height"
:search-count="searchCount"
:canvas-id="canvasId"
+ @filter-loaded="filterLoaded"
/>
@@ -155,7 +156,7 @@ import eventBus from '@/components/canvas/utils/eventBus'
import elementResizeDetectorMaker from 'element-resize-detector'
import CanvasOptBar from '@/components/canvas/components/editor/CanvasOptBar'
import bus from '@/utils/bus'
-import { buildFilterMap, buildViewKeyMap, formatCondition, valueValid, viewIdMatch } from '@/utils/conditionUtil'
+import { buildFilterMap, buildViewKeyMap, formatCondition, valueValid, viewIdMatch, buildAfterFilterLoaded } from '@/utils/conditionUtil'
import { hasDataPermission } from '@/utils/permission'
import { activeWatermark } from '@/components/canvas/tools/watermark'
import { proxyUserLoginInfo, userLoginInfo } from '@/api/systemInfo/userLogin'
@@ -461,6 +462,9 @@ export default {
bus.$off('trigger-reset-button', this.triggerResetButton)
},
methods: {
+ filterLoaded(p) {
+ buildAfterFilterLoaded(this.componentData, this.filterMap, p)
+ },
getWrapperChildRefs() {
return this.$refs['viewWrapperChild']
},
diff --git a/core/frontend/src/components/canvas/customComponent/UserView.vue b/core/frontend/src/components/canvas/customComponent/UserView.vue
index 28b88e8b10..becace60e6 100644
--- a/core/frontend/src/components/canvas/customComponent/UserView.vue
+++ b/core/frontend/src/components/canvas/customComponent/UserView.vue
@@ -599,7 +599,23 @@ export default {
this.refId = uuid.v1
if (this.element && this.element.propValue && this.element.propValue.viewId) {
// 如果watch.filters 已经进行数据初始化时候,此处放弃数据初始化
-
+ const unReadyList = []
+ const readyList = []
+ this.filters.forEach(f => {
+ if (f instanceof Promise) {
+ unReadyList.push(f)
+ } else {
+ readyList.push(f)
+ }
+ })
+ if (unReadyList.length) {
+ Promise.all(this.filters.filter(f => f instanceof Promise)).then(fList => {
+ readyList.concat(fList)
+ this.filter.filters = readyList
+ this.getData(this.element.propValue.viewId, false)
+ })
+ return
+ }
this.getData(this.element.propValue.viewId, false)
}
},
diff --git a/core/frontend/src/components/dataease/DeOutWidget.vue b/core/frontend/src/components/dataease/DeOutWidget.vue
index 6daf889bd6..3b7cbd8e73 100644
--- a/core/frontend/src/components/dataease/DeOutWidget.vue
+++ b/core/frontend/src/components/dataease/DeOutWidget.vue
@@ -49,6 +49,7 @@
:element="element"
:in-draw="inDraw"
:in-screen="inScreen"
+ @filter-loaded="filterLoaded"
/>
@@ -180,6 +181,9 @@ export default {
this.$set(this.element.style, 'innerBgColor', innerBgColor || '')
},
methods: {
+ filterLoaded(p) {
+ this.$emit('filter-loaded', p)
+ },
getComponentId() {
return this.element.id
},
diff --git a/core/frontend/src/components/widget/deWidget/DeSelect.vue b/core/frontend/src/components/widget/deWidget/DeSelect.vue
index 1aa8f2ba68..1a00faf14b 100644
--- a/core/frontend/src/components/widget/deWidget/DeSelect.vue
+++ b/core/frontend/src/components/widget/deWidget/DeSelect.vue
@@ -133,6 +133,9 @@ export default {
},
isCustomSortWidget() {
return this.element.serviceName === 'textSelectWidget'
+ },
+ selectFirst() {
+ return this.element.serviceName === 'textSelectWidget' && this.element.options.attrs.selectFirst
}
},
@@ -286,16 +289,26 @@ export default {
},
initLoad() {
this.value = this.fillValueDerfault()
- this.initOptions()
- if (this.element.options.value) {
+ this.initOptions(this.fillFirstSelected)
+ if (this.element.options.value && !this.selectFirst) {
this.value = this.fillValueDerfault()
this.changeValue(this.value)
}
},
+ fillFirstSelected() {
+ if (this.selectFirst && this.data?.length) {
+ this.element.options.value = this.data[0]['id']
+ this.value = this.fillValueDerfault()
+ this.$emit('filter-loaded', {
+ componentId: this.element.id,
+ val: this.value
+ })
+ }
+ },
refreshLoad() {
this.initOptions()
},
- initOptions() {
+ initOptions(cb) {
this.data = []
if (this.element.options.attrs.fieldId) {
let method = multFieldValues
@@ -310,6 +323,7 @@ export default {
}).then(res => {
this.data = this.optionData(res.data)
bus.$emit('valid-values-change', true)
+ cb && cb()
}).catch(e => {
bus.$emit('valid-values-change', false)
})
diff --git a/core/frontend/src/components/widget/serviceImpl/TextSelectServiceImpl.js b/core/frontend/src/components/widget/serviceImpl/TextSelectServiceImpl.js
index 3d052e2823..455db68835 100644
--- a/core/frontend/src/components/widget/serviceImpl/TextSelectServiceImpl.js
+++ b/core/frontend/src/components/widget/serviceImpl/TextSelectServiceImpl.js
@@ -87,8 +87,13 @@ class TextSelectServiceImpl extends WidgetService {
})
}
- getParam(element) {
- const value = this.fillValueDerfault(element)
+ getParam(element, val) {
+ let value = null
+ if (!val) {
+ value = this.fillValueDerfault(element)
+ } else {
+ value = [val]
+ }
const param = {
component: element,
value: !value ? [] : Array.isArray(value) ? value : value.toString().split(','),
diff --git a/core/frontend/src/utils/conditionUtil.js b/core/frontend/src/utils/conditionUtil.js
index 56a91e9b68..4a4d170278 100644
--- a/core/frontend/src/utils/conditionUtil.js
+++ b/core/frontend/src/utils/conditionUtil.js
@@ -79,6 +79,7 @@ export const buildViewKeyFilters = (panelItems, result) => {
if (element.type !== 'custom') {
return true
}
+ const selectFirst = element.serviceName === 'textSelectWidget' && element.options.attrs.selectFirst
let param = null
const widget = ApplicationContext.getService(element.serviceName)
@@ -88,15 +89,28 @@ export const buildViewKeyFilters = (panelItems, result) => {
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)
+ if (vidMatch && selectFirst) {
+
+ const promise = new Promise(resolve => {
+ cbParam => {
+ const newCondition = buildAfterFilterLoaded1(element, cbParam)
+ resolve(newCondition)
+ }
+ })
+ promise.componentId = filterComponentId
+ // promise.cb =
+ result[viewId].push(promise)
+ } else {
+ 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)
}
- vidMatch && vValid && viewFilters.push(condition)
})
})
return result
@@ -108,6 +122,41 @@ export const buildFilterMap = panelItems => {
return result
}
+const getElementById = (componentId, panelItems) => {
+ for (let index = 0; index < panelItems.length; index++) {
+ const element = panelItems[index]
+ if (element.id === componentId) {
+ return element
+ }
+ }
+ return null
+}
+const buildAfterFilterLoaded1 = (element, p) => {
+ const widget = ApplicationContext.getService(element.serviceName)
+ const param = widget.getParam(element, p.val)
+ const condition = formatCondition(param)
+ return condition
+}
+export const buildAfterFilterLoaded = (panelItems, originMap, p) => {
+ const componentId = p.componentId
+ const element = getElementById(componentId, panelItems)
+ let param = null
+ const widget = ApplicationContext.getService(element.serviceName)
+ param = widget.getParam(element, p.val)
+ const condition = formatCondition(param)
+ const vValid = valueValid(condition)
+ Object.keys(originMap).forEach(viewId => {
+ const conditions = originMap[viewId]
+ if (conditions?.length) {
+ conditions.forEach(condition => {
+ if (condition instanceof Promise && condition.componentId === componentId && vValid) {
+ condition.resolve(condition)
+ }
+ })
+ }
+ })
+}
+
export const fillElementsFilter = (panelItems, filterMap) => {
panelItems.forEach(element => {
if (element.type === 'view') {
diff --git a/core/frontend/src/views/panel/filter/FilterDialog.vue b/core/frontend/src/views/panel/filter/FilterDialog.vue
index 457650e75b..3d4b187d4f 100644
--- a/core/frontend/src/views/panel/filter/FilterDialog.vue
+++ b/core/frontend/src/views/panel/filter/FilterDialog.vue
@@ -278,7 +278,10 @@
:active-name="activeName"
/>
-
+
diff --git a/core/frontend/src/views/panel/filter/filterMain/FilterFoot.vue b/core/frontend/src/views/panel/filter/filterMain/FilterFoot.vue
index 998cff9015..85a8b39a2a 100644
--- a/core/frontend/src/views/panel/filter/filterMain/FilterFoot.vue
+++ b/core/frontend/src/views/panel/filter/filterMain/FilterFoot.vue
@@ -8,6 +8,14 @@
>
{{ $t('dynamic_time.set_default') }}
+
+ 首项
+