From 0fc09eb89e9e760159135b1ac1b8a66a30e3689c Mon Sep 17 00:00:00 2001 From: ShineKOT <1917095344@qq.com> Date: Thu, 29 May 2025 15:03:41 +0800 Subject: [PATCH 1/7] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E5=88=97=E8=BF=87=E6=BB=A4=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 4 + .../grid-column-header.scss | 24 +++ .../grid-column-header/grid-column-header.tsx | 156 +++++++++++++++++- 3 files changed, 182 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e76b0401..58d772797 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ ## [Unreleased] +### Added + +- 新增表格列过滤功能 + ## [0.7.40-alpha.21] - 2025-05-28 ### Added diff --git a/src/control/grid/grid-column/grid-column-header/grid-column-header.scss b/src/control/grid/grid-column/grid-column-header/grid-column-header.scss index 3863f9979..f48e25a22 100644 --- a/src/control/grid/grid-column/grid-column-header/grid-column-header.scss +++ b/src/control/grid/grid-column/grid-column-header/grid-column-header.scss @@ -7,4 +7,28 @@ gap: getCssVar(spacing, extra-tight); align-items: center; } + + @include e(filter) { + @include m(icon) { + height: 23px; + visibility: visible; + color: getCssVar(color, text, 3); + margin-left: getCssVar(spacing, extra, tight); + @include when(active) { + color: getCssVar(color, primary); + } + } + } + + @include e(popover) { + @include m(editor) { + padding-bottom: getCssVar(spacing, tight); + border-bottom: 1px solid getCssVar(color, border); + } + @include m(bottom) { + display: flex; + align-items: center; + float: right; + } + } } diff --git a/src/control/grid/grid-column/grid-column-header/grid-column-header.tsx b/src/control/grid/grid-column/grid-column-header/grid-column-header.tsx index 6fd74ef14..c9f69c6c3 100644 --- a/src/control/grid/grid-column/grid-column-header/grid-column-header.tsx +++ b/src/control/grid/grid-column/grid-column-header/grid-column-header.tsx @@ -1,6 +1,15 @@ -import { PropType, defineComponent } from 'vue'; +import { + h, + ref, + PropType, + computed, + onUnmounted, + defineComponent, + resolveComponent, +} from 'vue'; import { GridColumnController } from '@ibiz-template/runtime'; -import { useNamespace } from '@ibiz-template/vue3-util'; +import { useClickOutside, useNamespace } from '@ibiz-template/vue3-util'; +import { OnClickOutsideResult, eventPath } from '@ibiz-template/core'; import { IDEGridColumn } from '@ibiz/model-core'; import './grid-column-header.scss'; @@ -19,10 +28,100 @@ export const GridColumnHeader = defineComponent({ setup(props) { const ns = useNamespace('grid-column-header'); const c = props.controller; + const content = ref(); + const visible = ref(false); + const curValue = ref(); + + const filterValue = computed(() => { + return c.filterName ? c.grid.state.columnFilter[c.filterName] : undefined; + }); + + let funcs: OnClickOutsideResult | undefined; + + /** + * 显示 + * + * @return {*} {void} + */ + const onShow = (): void => { + if (funcs) return funcs.proceed(); + funcs = useClickOutside(content, evt => { + const classList: string[] = []; + eventPath(evt).forEach(e => { + if (e && (e as IData).classList) { + classList.push(...(e as IData).classList); + } + }); + if (classList.includes('el-popper')) return; + visible.value = false; + }); + }; + + /** + * 隐藏 + * + */ + const onHide = (): void => { + // 停止监听 + curValue.value = filterValue.value; + funcs?.pause(); + }; + + /** + * 过滤值改变 + * + * @param {unknown} val + * @param {string} [_name] + */ + const onFilterChange = (val: unknown, _name?: string): void => { + curValue.value = val; + }; + + /** + * 筛选 + * + */ + const onScreen = (): void => { + visible.value = false; + c.handleColumnScreen(curValue.value); + }; + + /** + * 重置 + * + */ + const onReset = (): void => { + curValue.value = undefined; + onScreen(); + }; + + /** + * 点击 + * + * @param {MouseEvent} e + */ + const onClick = (e: MouseEvent): void => { + e.stopPropagation(); + visible.value = true; + }; + + onUnmounted(() => { + funcs?.stop(); + }); return { c, ns, + visible, + content, + curValue, + filterValue, + onShow, + onHide, + onReset, + onClick, + onScreen, + onFilterChange, }; }, render() { @@ -37,6 +136,59 @@ export const GridColumnHeader = defineComponent({ {this.c.model.caption} + {this.c.filterEditorProvider && ( + + {{ + reference: () => { + return ( + + ); + }, + default: () => { + return ( +
+
+ {h( + resolveComponent( + this.c.filterEditorProvider!.gridEditor, + ), + { + data: {}, + autoFocus: true, + value: this.curValue, + onChange: this.onFilterChange, + controller: this.c.filterEditor, + }, + )} +
+
+ + {ibiz.i18n.t('app.search')} + + + {ibiz.i18n.t('app.reset')} + +
+
+ ); + }, + }} +
+ )} ); }, -- Gitee From a1e521993ba9aa708332cb78cf09e0484309d18a Mon Sep 17 00:00:00 2001 From: ShineKOT <1917095344@qq.com> Date: Thu, 29 May 2025 17:54:35 +0800 Subject: [PATCH 2/7] =?UTF-8?q?feat=EF=BC=9A=E6=96=B0=E5=A2=9E=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=EF=BC=8C=E5=88=97=E8=A1=A8=E6=94=AF=E6=8C=81=E8=A1=8C?= =?UTF-8?q?=E6=98=8E=E7=BB=86=E5=86=85=E7=BD=AE=E5=AF=BC=E8=88=AA=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../control-navigation/control-navigation.tsx | 16 +--- .../provider/navigation-base.provider.ts | 85 ++--------------- src/control/grid/grid/grid.tsx | 88 +++++++++++------ src/control/list/list.scss | 11 ++- src/control/list/list.tsx | 94 ++++++++++++++----- 6 files changed, 154 insertions(+), 141 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 58d772797..6aa8efbc4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ ### Added - 新增表格列过滤功能 +- 新增表格,列表支持行明细内置导航模式 ## [0.7.40-alpha.21] - 2025-05-28 diff --git a/src/common/control-navigation/control-navigation.tsx b/src/common/control-navigation/control-navigation.tsx index 5ab69f80a..cafdc2d3c 100644 --- a/src/common/control-navigation/control-navigation.tsx +++ b/src/common/control-navigation/control-navigation.tsx @@ -6,11 +6,11 @@ import { h, ref, Ref, + watch, PropType, + onMounted, defineComponent, resolveComponent, - watch, - onMounted, } from 'vue'; import { getNavigationProvider } from './provider'; import './control-navigation.scss'; @@ -33,9 +33,6 @@ export const IBizControlNavigation = defineComponent({ const outerWrapper: Ref = ref(null); - // 内置导航视图是否是重定向视图 - const isEmbedCtrlNav: Ref = ref(false); - const { navViewPos, controlParam, @@ -90,7 +87,7 @@ export const IBizControlNavigation = defineComponent({ watch( () => provider.navViewMsg.value, - async (newVal, oldVal) => { + (newVal, oldVal) => { // 如果是重绘模式或导航视图改变 则重绘 if ( navRenderMode === 'REDRAW' || @@ -99,10 +96,6 @@ export const IBizControlNavigation = defineComponent({ ) { navViewMsg.value = newVal; } else { - const viewModel = await ibiz.hub.getAppView(newVal.viewId!); - if (viewModel && viewModel.viewType === 'DEREDIRECTVIEW') { - isEmbedCtrlNav.value = true; - } navViewMsg.value = { context: newVal.context, params: newVal.params, @@ -138,7 +131,8 @@ export const IBizControlNavigation = defineComponent({ if (!navViewMsg.value.viewId) return; return h(resolveComponent('IBizViewShell'), { ...navViewMsg.value, - isEmbedCtrlNav: isEmbedCtrlNav.value, + isEmbedCtrlNav: + props.controller.navViewModel?.viewType === 'DEREDIRECTVIEW', class: ns.e('nav-view'), }); } diff --git a/src/common/control-navigation/provider/navigation-base.provider.ts b/src/common/control-navigation/provider/navigation-base.provider.ts index 578db01e1..d609db4f0 100644 --- a/src/common/control-navigation/provider/navigation-base.provider.ts +++ b/src/common/control-navigation/provider/navigation-base.provider.ts @@ -1,12 +1,9 @@ import { Ref, ref } from 'vue'; import { - IMDControlEvent, INavViewMsg, + IMDControlEvent, MDControlController, - calcDeCodeNameById, - calcNavParams, } from '@ibiz-template/runtime'; -import { IDER1N, IMDControl, INavigatable } from '@ibiz/model-core'; /** * 导航适配器 @@ -30,14 +27,6 @@ export class NavgationBaseProvider { */ keyName = 'srfkey'; - /** - * 模型 - * - * @type {IMDControl} - * @memberof NavgationBaseProvider - */ - model: IMDControl; - /** * 导航视图信息 * @@ -52,7 +41,6 @@ export class NavgationBaseProvider { * @memberof NavgationBaseProvider */ constructor(protected controller: MDControlController) { - this.model = controller.model; if (controller.state.enableNavView) { controller.evt.on('onNavDataChange', evt => { this.onNavDataChange(evt); @@ -63,47 +51,6 @@ export class NavgationBaseProvider { } } - /** - * 解析参数 - * - * @param {(INavigatable & { appDataEntityId?: string })} XDataModel - * @param {IData} data - * @param {IContext} context - * @param {IParams} params - * @return {*} {{ context: IContext; params: IParams }} - * @memberof NavgationBaseProvider - */ - prepareParams( - XDataModel: INavigatable & { appDataEntityId?: string }, - data: IData, - context: IContext, - params: IParams, - ): { context: IContext; params: IParams } { - const { - navDER, - navFilter, - navigateContexts, - navigateParams, - appDataEntityId, - } = XDataModel; - const model = { - deName: appDataEntityId ? calcDeCodeNameById(appDataEntityId) : undefined, - navFilter, - pickupDEFName: (navDER as IDER1N)?.pickupDEFName, - navContexts: navigateContexts, - navParams: navigateParams, - }; - const originParams = { - context, - params, - data, - }; - const { resultContext, resultParams } = calcNavParams(model, originParams); - const tempContext = Object.assign(context.clone(), resultContext); - const tempParams = { ...resultParams }; - return { context: tempContext, params: tempParams }; - } - /** * 通过栈数据导航 * @@ -134,31 +81,17 @@ export class NavgationBaseProvider { * @memberof NavgationBaseProvider */ onNavDataChange(event: IMDControlEvent['onNavDataChange']['event']): void { - const { navData, context, params } = event; + const { navData } = event; // 数据变更才重新导航 if (this.navViewMsg.value?.key !== navData[this.keyName]) { this.navStack.unshift(navData[this.keyName]); - this.navViewMsg.value = this.getNavViewMsg(navData, context, params); + const { context, params } = this.controller.calcNavParams(navData); + this.navViewMsg.value = { + params, + context, + key: navData[this.keyName], + viewId: this.controller.navViewModel?.id, + }; } } - - /** - * 获取导航视图信息 - * - * @param {IData} data - * @param {IContext} context - * @param {IParams} params - * @return {*} {INavViewMsg} - * @memberof NavgationBaseProvider - */ - getNavViewMsg(data: IData, context: IContext, params: IParams): INavViewMsg { - const viewModelId = (this.model as INavigatable).navAppViewId; - const result = this.prepareParams(this.model, data, context, params); - return { - key: data[this.keyName], - context: result.context, - params: result.params, - viewId: viewModelId, - }; - } } diff --git a/src/control/grid/grid/grid.tsx b/src/control/grid/grid/grid.tsx index 2ada6c957..d77e72e16 100644 --- a/src/control/grid/grid/grid.tsx +++ b/src/control/grid/grid/grid.tsx @@ -2,22 +2,22 @@ import { useUIStore, useNamespace, + IBizCustomRender, useControlController, hasEmptyPanelRenderer, - IBizCustomRender, } from '@ibiz-template/vue3-util'; import { - defineComponent, - onUnmounted, - PropType, - VNode, - renderSlot, - VNodeArrayChildren, - computed, + h, ref, watch, + VNode, + PropType, + computed, + renderSlot, + onUnmounted, + defineComponent, resolveComponent, - h, + VNodeArrayChildren, } from 'vue'; import { IDEGrid, @@ -26,11 +26,11 @@ import { IUIActionGroupDetail, } from '@ibiz/model-core'; import { - GridController, - GridFieldColumnController, GridRowState, - IControlProvider, ScriptFactory, + GridController, + IControlProvider, + GridFieldColumnController, } from '@ibiz-template/runtime'; import { NOOP, showTitle } from '@ibiz-template/core'; import { createUUID } from 'qx-util'; @@ -38,9 +38,9 @@ import { isNotNil } from 'ramda'; import { IGridProps, useAppGridBase, - useGridHeaderStyle, - useGridDraggable, useITableEvent, + useGridDraggable, + useGridHeaderStyle, } from './grid-control.util'; import { useRowEditPopover } from '../row-edit-popover/use-row-edit-popover'; import { usePagination } from '../../../util'; @@ -498,6 +498,7 @@ export const GridControl = defineComponent({ ); }; + // 绘制表格列 const renderTableColumn = ( model: IDEGridColumn, @@ -551,6 +552,35 @@ export const GridControl = defineComponent({ ); }; + /** + * 绘制行明细 + * + * @return {*} + */ + const renderRowDetail = () => { + const { navAppViewId, navViewHeight } = c.model; + if (navAppViewId && c.state.showRowDetail) + return ( + + {{ + default: ({ row }: IData): VNode | null => { + const { context, params } = c.calcNavParams(row); + const style = { + height: navViewHeight ? `${navViewHeight}px` : 'auto', + }; + return h(resolveComponent('IBizViewShell'), { + style, + params, + context, + viewId: navAppViewId, + class: ns.b('row-detail-view'), + }); + }, + }} + + ); + }; + onUnmounted(() => { zIndex.decrement(); if (cleanup !== NOOP) cleanup(); @@ -597,32 +627,33 @@ export const GridControl = defineComponent({ return { c, ns, - sysCssName, tableRef, tableData, + sysCssName, + defaultSort, renderColumns, - renderTableColumn, - onDbRowClick, + headerCssVars, + infiniteScroll, + infiniteScrollKey, + isLodeMoreDisabled, onRowClick, - onSelectionChange, + spanMethod, onSortChange, + onDbRowClick, onPageChange, - onPageSizeChange, - onPageRefresh, - handleRowClassName, - handleHeaderCellClassName, renderNoData, summaryMethod, - spanMethod, headerDragend, renderPopover, - defaultSort, + onPageRefresh, + renderRowDetail, + onPageSizeChange, + renderTableColumn, + onSelectionChange, + handleRowClassName, renderBatchToolBar, - headerCssVars, renderDragIconColumn, - isLodeMoreDisabled, - infiniteScroll, - infiniteScrollKey, + handleHeaderCellClassName, }; }, render() { @@ -689,6 +720,7 @@ export const GridControl = defineComponent({ align='center' > ), + this.renderRowDetail(), this.renderColumns.map((model, index) => { return this.renderTableColumn(model, index); }), diff --git a/src/control/list/list.scss b/src/control/list/list.scss index badd2292b..90f77d2b1 100644 --- a/src/control/list/list.scss +++ b/src/control/list/list.scss @@ -10,11 +10,11 @@ $control-list: ( @include b(control-list-item) { flex-grow: 1; - cursor: pointer; min-height: getCssVar(control-list, item-height); padding: getCssVar(control-list, padding); font-weight: getCssVar(control-list, font-weight); color: getCssVar(control-list, text-color); + cursor: pointer; background-color: getCssVar(control-list, item-bg-color); } @@ -79,7 +79,7 @@ $control-list: ( border-bottom: 1px solid getCssVar(color, border); } } - .#{bem(control-list-scroll-item)}:last-of-type { + .#{bem(row-detail)}:last-of-type .#{bem(control-list-scroll-item)} { border-bottom: none; } } @@ -106,6 +106,13 @@ $control-list: ( margin-left: getCssVar(spacing, tight); } + @include e(icon) { + flex-shrink: 0; + margin-left: getCssVar(spacing, tight); + color: getCssVar(color, text-2); + cursor: pointer; + } + &:hover { background-color: getCssVar(control-list, hover-bg-color); } diff --git a/src/control/list/list.tsx b/src/control/list/list.tsx index 81b2df615..b46d3bccf 100644 --- a/src/control/list/list.tsx +++ b/src/control/list/list.tsx @@ -1,3 +1,4 @@ +/* eslint-disable no-return-assign */ /* eslint-disable no-nested-ternary */ import { hasEmptyPanelRenderer, @@ -249,37 +250,82 @@ export const ListControl = defineComponent({ } }; + /** + * 绘制行明细 + * + * @param {IData} item + * @return {*} + */ + const renderRowDetail = (item: IData) => { + const { navAppViewId, navViewHeight } = c.model; + const { context, params } = c.calcNavParams(item); + const style = { + height: navViewHeight ? `${navViewHeight}px` : 'auto', + }; + return ( + + ); + }; + + const renderItem = (item: IData) => { + const cardStyle = ns.cssVarBlock({ + 'item-bg-color': `${item.bgcolor || ''}`, + 'text-color': `${item.fontcolor || ''}`, + 'hover-bg-color': `${item.hovercolor || ''}`, + 'active-bg-color': `${item.activecolor || ''}`, + }); + const panel = props.modelData.itemLayoutPanel; + return ( +
+ {c.model.controlStyle === 'EXTVIEW2' && !c.state.singleSelect && ( + toggleSelection(item)} + /> + )} + {c.model.navAppViewId && c.state.showRowDetail && ( + (item.__isExpand = !item.__isExpand)} + > + )} + {panel ? renderPanelItem(item, panel) : renderDefaultItem(item)} +
+ ); + }; + /** * 绘制列表项 * * @param {IData[]} items */ const renderListItems = (items: IData[]) => { - const panel = props.modelData.itemLayoutPanel; - + const { navAppViewId } = c.model; return items.map(item => { - const cardStyle = ns.cssVarBlock({ - 'item-bg-color': `${item.bgcolor || ''}`, - 'text-color': `${item.fontcolor || ''}`, - 'hover-bg-color': `${item.hovercolor || ''}`, - 'active-bg-color': `${item.activecolor || ''}`, - }); - return ( -
- {c.model.controlStyle === 'EXTVIEW2' && !c.state.singleSelect && ( - toggleSelection(item)} - /> - )} - {panel ? renderPanelItem(item, panel) : renderDefaultItem(item)} -
- ); + if (navAppViewId && c.state.showRowDetail) + return ( +
+ {renderItem(item)} + {item.__isExpand && renderRowDetail(item)} +
+ ); + return renderItem(item); }); }; -- Gitee From 1d29f14aff176e239c84a28bf7f4ef7a36c2c433 Mon Sep 17 00:00:00 2001 From: ShineKOT <1917095344@qq.com> Date: Thu, 29 May 2025 18:17:22 +0800 Subject: [PATCH 3/7] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../provider/navigation-base.provider.ts | 83 +++++++++++++++++-- 1 file changed, 75 insertions(+), 8 deletions(-) diff --git a/src/common/control-navigation/provider/navigation-base.provider.ts b/src/common/control-navigation/provider/navigation-base.provider.ts index d609db4f0..8d9165c60 100644 --- a/src/common/control-navigation/provider/navigation-base.provider.ts +++ b/src/common/control-navigation/provider/navigation-base.provider.ts @@ -1,9 +1,12 @@ import { Ref, ref } from 'vue'; import { INavViewMsg, + calcNavParams, IMDControlEvent, MDControlController, + calcDeCodeNameById, } from '@ibiz-template/runtime'; +import { IDER1N, IMDControl, INavigatable } from '@ibiz/model-core'; /** * 导航适配器 @@ -27,6 +30,14 @@ export class NavgationBaseProvider { */ keyName = 'srfkey'; + /** + * 模型 + * + * @type {IMDControl} + * @memberof NavgationBaseProvider + */ + model: IMDControl; + /** * 导航视图信息 * @@ -41,6 +52,7 @@ export class NavgationBaseProvider { * @memberof NavgationBaseProvider */ constructor(protected controller: MDControlController) { + this.model = controller.model; if (controller.state.enableNavView) { controller.evt.on('onNavDataChange', evt => { this.onNavDataChange(evt); @@ -51,6 +63,47 @@ export class NavgationBaseProvider { } } + /** + * 解析参数 + * + * @param {(INavigatable & { appDataEntityId?: string })} XDataModel + * @param {IData} data + * @param {IContext} context + * @param {IParams} params + * @return {*} {{ context: IContext; params: IParams }} + * @memberof NavgationBaseProvider + */ + prepareParams( + XDataModel: INavigatable & { appDataEntityId?: string }, + data: IData, + context: IContext, + params: IParams, + ): { context: IContext; params: IParams } { + const { + navDER, + navFilter, + navigateContexts, + navigateParams, + appDataEntityId, + } = XDataModel; + const model = { + deName: appDataEntityId ? calcDeCodeNameById(appDataEntityId) : undefined, + navFilter, + pickupDEFName: (navDER as IDER1N)?.pickupDEFName, + navContexts: navigateContexts, + navParams: navigateParams, + }; + const originParams = { + context, + params, + data, + }; + const { resultContext, resultParams } = calcNavParams(model, originParams); + const tempContext = Object.assign(context.clone(), resultContext); + const tempParams = { ...resultParams }; + return { context: tempContext, params: tempParams }; + } + /** * 通过栈数据导航 * @@ -81,17 +134,31 @@ export class NavgationBaseProvider { * @memberof NavgationBaseProvider */ onNavDataChange(event: IMDControlEvent['onNavDataChange']['event']): void { - const { navData } = event; + const { navData, context, params } = event; // 数据变更才重新导航 if (this.navViewMsg.value?.key !== navData[this.keyName]) { this.navStack.unshift(navData[this.keyName]); - const { context, params } = this.controller.calcNavParams(navData); - this.navViewMsg.value = { - params, - context, - key: navData[this.keyName], - viewId: this.controller.navViewModel?.id, - }; + this.navViewMsg.value = this.getNavViewMsg(navData, context, params); } } + + /** + * 获取导航视图信息 + * + * @param {IData} data + * @param {IContext} context + * @param {IParams} params + * @return {*} {INavViewMsg} + * @memberof NavgationBaseProvider + */ + getNavViewMsg(data: IData, context: IContext, params: IParams): INavViewMsg { + const viewModelId = (this.model as INavigatable).navAppViewId; + const result = this.prepareParams(this.model, data, context, params); + return { + key: data[this.keyName], + context: result.context, + params: result.params, + viewId: viewModelId, + }; + } } -- Gitee From 558c9b900cc45c36046109c222289ab4c25f883c Mon Sep 17 00:00:00 2001 From: ShineKOT <1917095344@qq.com> Date: Thu, 29 May 2025 19:20:36 +0800 Subject: [PATCH 4/7] =?UTF-8?q?feat:=20appUtil=E6=96=B0=E5=A2=9E=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=BA=94=E7=94=A8=E4=B8=8A=E4=B8=8B=E6=96=87=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=91=E9=80=81appdata=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E6=9C=AA=E6=90=BA=E5=B8=A6=E5=BA=94=E7=94=A8=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E6=96=87=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 5 +++++ src/panel-component/user-message/user-message.tsx | 3 +-- src/util/app-util/app-util.ts | 13 ++++++++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6aa8efbc4..86f70fffb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,11 @@ - 新增表格列过滤功能 - 新增表格,列表支持行明细内置导航模式 +- appUtil新增获取应用上下文 + +### Fixed + +- 修复发送appdata请求未携带应用上下文问题 ## [0.7.40-alpha.21] - 2025-05-28 diff --git a/src/panel-component/user-message/user-message.tsx b/src/panel-component/user-message/user-message.tsx index 8986733b7..d19bddae7 100644 --- a/src/panel-component/user-message/user-message.tsx +++ b/src/panel-component/user-message/user-message.tsx @@ -35,7 +35,6 @@ export const UserMessage = defineComponent({ setup(props) { const ns = useNamespace('user-message'); const c = props.controller; - const noticeController = ibiz.hub.notice; const showPopover = ref(false); @@ -72,7 +71,7 @@ export const UserMessage = defineComponent({ }; const verifyAuthentication = async () => { - const res = await ibiz.net.get('/appdata'); + const res = await ibiz.net.get('/appdata', ibiz.appUtil.getAppContext()); if (res.ok) { ibiz.appData = res.data; updateDevToolConfig(); diff --git a/src/util/app-util/app-util.ts b/src/util/app-util/app-util.ts index 896a1dcbb..3f9ecc5ad 100644 --- a/src/util/app-util/app-util.ts +++ b/src/util/app-util/app-util.ts @@ -24,7 +24,7 @@ import { IPortalAsyncAction, } from '@ibiz-template/core'; import { AxiosProgressEvent } from 'axios'; -import { useUIStore } from '@ibiz-template/vue3-util'; +import { route2routePath, useUIStore } from '@ibiz-template/vue3-util'; import { calcAiToolbarItemsByAc } from '../ai-util/ai-util'; export class AppUtil implements IAppUtil { @@ -170,6 +170,17 @@ export class AppUtil implements IAppUtil { throw new Error('Method not implemented.'); } + /** + * 获取应用上下文 + * + * @return {*} {(IParams | undefined)} + * @memberof AppUtil + */ + getAppContext(): IParams | undefined { + const routePath = route2routePath(this.router.currentRoute.value); + return routePath.appContext; + } + /** * 校验密码 * -- Gitee From ce3c670739d6f50bd43a00391659e095712e9886 Mon Sep 17 00:00:00 2001 From: ShineKOT <1917095344@qq.com> Date: Thu, 29 May 2025 19:25:42 +0800 Subject: [PATCH 5/7] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../grid/grid-column/grid-column-header/grid-column-header.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/control/grid/grid-column/grid-column-header/grid-column-header.tsx b/src/control/grid/grid-column/grid-column-header/grid-column-header.tsx index c9f69c6c3..23c8c7259 100644 --- a/src/control/grid/grid-column/grid-column-header/grid-column-header.tsx +++ b/src/control/grid/grid-column/grid-column-header/grid-column-header.tsx @@ -33,7 +33,8 @@ export const GridColumnHeader = defineComponent({ const curValue = ref(); const filterValue = computed(() => { - return c.filterName ? c.grid.state.columnFilter[c.filterName] : undefined; + const filterName = (c.model as IData).filterEditor?.id?.toLowerCase(); + return filterName ? c.grid.state.columnFilter[filterName] : undefined; }); let funcs: OnClickOutsideResult | undefined; -- Gitee From 50182304d73ca655a92cca97415cd09b730e06e2 Mon Sep 17 00:00:00 2001 From: ShineKOT <1917095344@qq.com> Date: Thu, 29 May 2025 19:28:15 +0800 Subject: [PATCH 6/7] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../control-navigation/control-navigation.tsx | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/common/control-navigation/control-navigation.tsx b/src/common/control-navigation/control-navigation.tsx index cafdc2d3c..34eb274cc 100644 --- a/src/common/control-navigation/control-navigation.tsx +++ b/src/common/control-navigation/control-navigation.tsx @@ -7,8 +7,10 @@ import { ref, Ref, watch, + watch, PropType, onMounted, + onMounted, defineComponent, resolveComponent, } from 'vue'; @@ -33,6 +35,9 @@ export const IBizControlNavigation = defineComponent({ const outerWrapper: Ref = ref(null); + // 内置导航视图是否是重定向视图 + const isEmbedCtrlNav: Ref = ref(false); + const { navViewPos, controlParam, @@ -87,7 +92,7 @@ export const IBizControlNavigation = defineComponent({ watch( () => provider.navViewMsg.value, - (newVal, oldVal) => { + async (newVal, oldVal) => { // 如果是重绘模式或导航视图改变 则重绘 if ( navRenderMode === 'REDRAW' || @@ -96,6 +101,10 @@ export const IBizControlNavigation = defineComponent({ ) { navViewMsg.value = newVal; } else { + const viewModel = await ibiz.hub.getAppView(newVal.viewId!); + if (viewModel && viewModel.viewType === 'DEREDIRECTVIEW') { + isEmbedCtrlNav.value = true; + } navViewMsg.value = { context: newVal.context, params: newVal.params, @@ -131,8 +140,7 @@ export const IBizControlNavigation = defineComponent({ if (!navViewMsg.value.viewId) return; return h(resolveComponent('IBizViewShell'), { ...navViewMsg.value, - isEmbedCtrlNav: - props.controller.navViewModel?.viewType === 'DEREDIRECTVIEW', + isEmbedCtrlNav: isEmbedCtrlNav.value, class: ns.e('nav-view'), }); } -- Gitee From 61ef3c5e61f3f0ce51df302c663bc38eef782f18 Mon Sep 17 00:00:00 2001 From: ShineKOT <1917095344@qq.com> Date: Thu, 29 May 2025 19:29:42 +0800 Subject: [PATCH 7/7] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/control-navigation/control-navigation.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/common/control-navigation/control-navigation.tsx b/src/common/control-navigation/control-navigation.tsx index 34eb274cc..d46d30e4f 100644 --- a/src/common/control-navigation/control-navigation.tsx +++ b/src/common/control-navigation/control-navigation.tsx @@ -7,10 +7,8 @@ import { ref, Ref, watch, - watch, PropType, onMounted, - onMounted, defineComponent, resolveComponent, } from 'vue'; -- Gitee