diff --git a/CHANGELOG.md b/CHANGELOG.md index b3818ca2f49de519ae71c2867c9bd0c72e1a7b98..f3bf41af0e5e4cf9f2368cf78e7e9b40a23096b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,17 @@ ## [Unreleased] +### Changed + +- 实体首页视图默认显示信息栏 +- 树节点上下文菜单样式统一 +- 抽取drtab部件样式主题 +- 面包屑组件添加是否显示首页参数、首页标题改为应用标题 + +### Fixed + +- 修复面包屑缓存计算异常 + ## [0.7.38-alpha.7] - 2024-09-18 ### Added diff --git a/src/control/drtab/drtab.scss b/src/control/drtab/drtab.scss index 379fbce4d3557c3900c02a47c354d80bf6a4ff77..3ff93bf03325e707b6b7adf11f9253219e187470 100644 --- a/src/control/drtab/drtab.scss +++ b/src/control/drtab/drtab.scss @@ -1,5 +1,11 @@ -@include b(control-drtab) { +$control-drtab: ( + 'active-color': getCssVar('color', 'primary'), + 'hover-color': getCssVar('color', 'text', 0), + 'hover-bg-color': transparent, +); +@include b(control-drtab) { + @include set-component-css-var('control-drtab', $control-drtab); @include e(counter) { margin-left: getCssVar(spacing, tight); } @@ -14,7 +20,7 @@ .el-tabs__nav { .el-tabs__active-bar { - background-color: getCssVar('color', 'primary'); + background-color: getCssVar('control-drtab', 'active-color'); } .el-tabs__item { @@ -22,11 +28,12 @@ color: getCssVar('color', 'text', 2); &:hover { - color: getCssVar('color', 'text', 0); + color: getCssVar('control-drtab', 'hover-color'); + background-color: getCssVar('control-drtab', 'hover-bg-color'); } &.is-active { - color: getCssVar('color', 'primary'); + color: getCssVar('control-drtab', 'active-color'); } &.is-top { diff --git a/src/control/tree/tree.scss b/src/control/tree/tree.scss index 4fae60238d44ecfa422a4ee366b27d1bc8a75f67..2753a72cce5dedc7b82754504da621284f858663 100644 --- a/src/control/tree/tree.scss +++ b/src/control/tree/tree.scss @@ -20,8 +20,13 @@ $control-treeview-node: ( $control-treeview-context-menu: ( width: 30px, - padding: getCssVar(spacing, extra-tight) 0, - item-padding: getCssVar(spacing, tight) getCssVar(spacing, base), + padding: getCssVar(spacing, tight) getCssVar(spacing, none), + item-padding: getCssVar(spacing, tight) getCssVar(spacing, base-loose), + item-height: 40px, + border-radius: getCssVar(spacing, none), + bg-color: getCssVar(color, bg, 3), + hover-color: getCssVar(color, fill, 0), + text-color: getCssVar(color, text, 2), ); $control-treeview-quick-search: ( @@ -96,11 +101,22 @@ $control-treeview-tree: ( // 树节点上下文菜单样式 @include b(control-treeview-context-menu) { @include set-component-css-var(control-treeview-context-menu, $control-treeview-context-menu); + &.mx-context-menu { padding: getCssVar(control-treeview-context-menu, padding); + background-color: getCssVar(control-treeview-context-menu, bg-color); + border-radius: getCssVar(control-treeview-context-menu, border-radius); + + --mx-menu-text: #{getCssVar(control-treeview-context-menu, text-color)}; .mx-context-menu-item { + height: getCssVar(control-treeview-context-menu, item-height); padding: getCssVar(control-treeview-context-menu, item-padding); + + &:hover { + color: getCssVar(control-treeview-context-menu, text-color); + background-color: getCssVar(control-treeview-context-menu, hover-color); + } } } } diff --git a/src/panel-component/nav-breadcrumb/nav-breadcrumb.controller.ts b/src/panel-component/nav-breadcrumb/nav-breadcrumb.controller.ts index 48ada9a8ca8de9cd1bbe973c12070f5e66fa9107..0ce9d482573a1e73a4ef851d586befda4002949c 100644 --- a/src/panel-component/nav-breadcrumb/nav-breadcrumb.controller.ts +++ b/src/panel-component/nav-breadcrumb/nav-breadcrumb.controller.ts @@ -51,6 +51,13 @@ export class NavBreadcrumbController extends PanelItemController */ navMode: 'router' | 'menu' | 'store' = 'router'; + /** + * @description 是否显示应用标题 + * @type {boolean} + * @memberof NavBreadcrumbController + */ + showHome: boolean = true; + /** * @description 面包屑服务 * @type {NavBreadcrumbService} @@ -89,7 +96,9 @@ export class NavBreadcrumbController extends PanelItemController await super.onInit(); this.handleRawItemParams(); this.navMode = this.rawItemParams.navmode || 'router'; - this.service = new NavBreadcrumbService(this.navMode); + this.separator = this.rawItemParams.separator || '/'; + this.showHome = this.rawItemParams.showhome === 'true'; + this.service = new NavBreadcrumbService(this.navMode, this.panel.context); if (['router', 'store'].includes(this.navMode)) { ibiz.util.viewStack.evt.on('change', event => { const { type, view } = event; @@ -139,7 +148,9 @@ export class NavBreadcrumbController extends PanelItemController if (chacheItem) { // 首页特殊处理 if (chacheItem.viewName === ibiz.hub.defaultAppIndexViewName) { - this.service.setChache([{ ...getIndexBreadcrumb(), fullPath }]); + this.service.setChache([ + { ...getIndexBreadcrumb(this.panel.context), fullPath }, + ]); this.resetBreadcrumbs(); return; } @@ -263,12 +274,12 @@ export class NavBreadcrumbController extends PanelItemController viewName: item.id!, }; }); - items.unshift(getIndexBreadcrumb()); + items.unshift(getIndexBreadcrumb(this.panel.context)); this.service.setChache(items); this.resetBreadcrumbs(); } else { // 未找到应用功能时只绘制首页 - this.service.setChache([getIndexBreadcrumb()]); + this.service.setChache([getIndexBreadcrumb(this.panel.context)]); this.resetBreadcrumbs(); } this.appmenu.evt.on('onClick', (data: IData) => { @@ -283,7 +294,7 @@ export class NavBreadcrumbController extends PanelItemController }; } }); - items.unshift(getIndexBreadcrumb()); + items.unshift(getIndexBreadcrumb(this.panel.context)); this.service.setChache(items); this.resetBreadcrumbs(); }); @@ -334,7 +345,7 @@ export class NavBreadcrumbController extends PanelItemController fullPath: '', }); } - items.unshift(getIndexBreadcrumb()); + items.unshift(getIndexBreadcrumb(this.panel.context)); this.service.setChache(items); this.resetBreadcrumbs(); } diff --git a/src/panel-component/nav-breadcrumb/nav-breadcrumb.scss b/src/panel-component/nav-breadcrumb/nav-breadcrumb.scss index caef0da242ffd9c875512d9fb9327ef61dfef98f..7409efba685ec2871a706c329e68f1991f0b5cf5 100644 --- a/src/panel-component/nav-breadcrumb/nav-breadcrumb.scss +++ b/src/panel-component/nav-breadcrumb/nav-breadcrumb.scss @@ -1,5 +1,5 @@ $nav-breadcrumb: ( - 'padding': getCssVar('spacing', 'base-loose'), + 'padding': getCssVar('spacing', 'base-loose') getCssVar('spacing', 'base-loose') 0, 'link-color': getCssVar('color', 'link'), 'disabled-color': getCssVar('color', 'text', 0), ); diff --git a/src/panel-component/nav-breadcrumb/nav-breadcrumb.service.ts b/src/panel-component/nav-breadcrumb/nav-breadcrumb.service.ts index 5db75382941eedabf00e95837654dfb4cf39d5d5..770d32b535cbbbbfedfda4c3d4ba0f8e70821922 100644 --- a/src/panel-component/nav-breadcrumb/nav-breadcrumb.service.ts +++ b/src/panel-component/nav-breadcrumb/nav-breadcrumb.service.ts @@ -16,7 +16,10 @@ export class NavBreadcrumbService { */ private chache: BreadcrumbMsg[] = []; - constructor(public readonly navMode: 'router' | 'menu' | 'store') {} + constructor( + public readonly navMode: 'router' | 'menu' | 'store', + private context: IContext, + ) {} /** * @description 添加缓存项 @@ -105,7 +108,7 @@ export class NavBreadcrumbService { // 首页视图特殊处理 const { viewName = '', fullPath = '' } = data; if (viewName === 'index') { - return getIndexBreadcrumb(); + return getIndexBreadcrumb(this.context); } const item = this.chache.find( x => diff --git a/src/panel-component/nav-breadcrumb/nav-breadcrumb.tsx b/src/panel-component/nav-breadcrumb/nav-breadcrumb.tsx index 82bf1051a70dcfa572b678472c571db3f3111bcb..ff4ced32c09df181507f4197d1ca82957cef2820 100644 --- a/src/panel-component/nav-breadcrumb/nav-breadcrumb.tsx +++ b/src/panel-component/nav-breadcrumb/nav-breadcrumb.tsx @@ -40,7 +40,13 @@ export const NavBreadcrumb = defineComponent({ const items = computed(() => { const { breadcrumbItems } = c.state; - return breadcrumbItems.filter(x => x.caption); + let result = breadcrumbItems.filter(x => x.caption); + if (!c.showHome) { + result = result.filter( + x => x.viewName !== ibiz.hub.defaultAppIndexViewName, + ); + } + return result; }); return { ns, c, items }; diff --git a/src/panel-component/nav-breadcrumb/nav-breadcrumb.util.ts b/src/panel-component/nav-breadcrumb/nav-breadcrumb.util.ts index 9a90345923c3351761b0216717c61282e6469325..d4703bd4c5dc3570bc946a2ba639b089d6c2a1ff 100644 --- a/src/panel-component/nav-breadcrumb/nav-breadcrumb.util.ts +++ b/src/panel-component/nav-breadcrumb/nav-breadcrumb.util.ts @@ -9,11 +9,13 @@ import { BreadcrumbMsg } from './nav-breadcrumb.state'; * @export * @return {*} {BreadcrumbMsg} */ -export function getIndexBreadcrumb(): BreadcrumbMsg { +export function getIndexBreadcrumb(context: IContext): BreadcrumbMsg { + const app = ibiz.hub.getApp(context.srfappid); + const caption = app.model.caption; return { viewName: ibiz.hub.defaultAppIndexViewName, fullPath: '/', - caption: ibiz.i18n.t('panelComponent.navBreadcrumb.home'), + caption, }; } diff --git a/src/panel-component/nav-pos-index/nav-pos-index.controller.ts b/src/panel-component/nav-pos-index/nav-pos-index.controller.ts index 63f16fe3e521b15fe10127246d28ae9bbc26c6c2..3391cfd68f920a4fc0592bb0b3caf1bbdaf41786 100644 --- a/src/panel-component/nav-pos-index/nav-pos-index.controller.ts +++ b/src/panel-component/nav-pos-index/nav-pos-index.controller.ts @@ -261,6 +261,12 @@ export class NavPosIndexController extends PanelItemController { dataInfo, }); }); + view.evt.on('onActivated', () => { + this.navBreadcrumb!.updateViewInfo(key, { + viewName: view.model.codeName!, + caption: view.model.caption, + }); + }); } } diff --git a/src/view-engine/de-index-view-engine.ts b/src/view-engine/de-index-view-engine.ts index 03df48101b9564e55f05e16aa9af63884c81eeb4..295f8bf941f4fbe0b229298e1327c624c84c0c22 100644 --- a/src/view-engine/de-index-view-engine.ts +++ b/src/view-engine/de-index-view-engine.ts @@ -3,6 +3,7 @@ import { IDEIndexViewState, IDEIndexViewEvent, IDRBarController, + EventBase, } from '@ibiz-template/runtime'; import { IAppDEIndexView } from '@ibiz/model-core'; import { EditViewEngine } from './edit-view.engine'; @@ -57,4 +58,24 @@ export class DEIndexViewEngine extends EditViewEngine { this.view.slotProps.drbar.srfnav = this.view.state.srfnav; this.view.slotProps.drbar.hideEditItem = true; } + + /** + * @description 监控form事件 + * @param {EventBase} event + * @memberof DEIndexViewEngine + */ + formDataStateChange(event: EventBase): void { + const { evt } = this.view; + const formDeId = this.form.model.appDataEntityId; + const data = event.data[0]; + this.toolbar?.calcButtonState(data, formDeId); + // 实体首页视图显示信息栏模型缺失,默认显示 + if (data.srfkey) { + evt.emit('onViewInfoChange', { dataInfo: data.srfmajortext || '' }); + } else { + evt.emit('onViewInfoChange', { + dataInfo: ibiz.i18n.t('app.newlyBuild'), + }); + } + } } diff --git a/src/view-engine/edit-view.engine.ts b/src/view-engine/edit-view.engine.ts index ba862316b8b162ff94146d6895b884e92fd36657..7a69c28b186e7c5caaa5570ebbf6706c808a3068 100644 --- a/src/view-engine/edit-view.engine.ts +++ b/src/view-engine/edit-view.engine.ts @@ -146,6 +146,27 @@ export class EditViewEngine extends ViewEngineBase { modal.hooks.shouldDismiss.tapPromise(this.modalEventHook); } + /** + * @description 监控form事件 + * @param {EventBase} event + * @memberof EditViewEngine + */ + formDataStateChange(event: EventBase): void { + const { model, evt } = this.view; + const formDeId = this.form.model.appDataEntityId; + const data = event.data[0]; + this.toolbar?.calcButtonState(data, formDeId); + if (model.showDataInfoBar) { + if (data.srfkey) { + evt.emit('onViewInfoChange', { dataInfo: data.srfmajortext || '' }); + } else { + evt.emit('onViewInfoChange', { + dataInfo: ibiz.i18n.t('app.newlyBuild'), + }); + } + } + } + async onMounted(): Promise { await super.onMounted(); @@ -153,24 +174,8 @@ export class EditViewEngine extends ViewEngineBase { const { model, evt } = this.view; - // 监控form事件 - const formDeId = this.form.model.appDataEntityId; - const formDataStateChange = (event: EventBase): void => { - const data = event.data[0]; - this.toolbar?.calcButtonState(data, formDeId); - if (model.showDataInfoBar) { - if (data.srfkey) { - evt.emit('onViewInfoChange', { dataInfo: data.srfmajortext || '' }); - } else { - evt.emit('onViewInfoChange', { - dataInfo: ibiz.i18n.t('app.newlyBuild'), - }); - } - } - }; - this.form.evt.on('onLoadSuccess', event => { - formDataStateChange(event); + this.formDataStateChange(event); // 更新视图作用域数据和srfreadonly数据 const data = event.data[0]; this.view.state.srfactiveviewdata = data; @@ -180,7 +185,7 @@ export class EditViewEngine extends ViewEngineBase { evt.emit('onDataChange', { ...event, actionType: 'LOAD' }); }); this.form.evt.on('onLoadDraftSuccess', event => { - formDataStateChange(event); + this.formDataStateChange(event); evt.emit('onDataChange', { ...event, actionType: 'LOADDRAFT' }); }); this.form.evt.on('onSaveSuccess', event => { @@ -190,11 +195,11 @@ export class EditViewEngine extends ViewEngineBase { if (this.view.context[deName] !== formData.srfkey) { this.view.context[deName] = formData.srfkey; } - formDataStateChange(event); + this.formDataStateChange(event); evt.emit('onDataChange', { ...event, actionType: 'SAVE' }); }); this.form.evt.on('onRemoveSuccess', event => { - formDataStateChange(event); + this.formDataStateChange(event); evt.emit('onDataChange', { ...event, actionType: 'REMOVE' }); });