From 18722ce4340ba178322f5d71599c95534b0b797f Mon Sep 17 00:00:00 2001 From: Jin Mao <50581550+jinmao88@users.noreply.github.com> Date: Mon, 31 Mar 2025 10:17:42 +0800 Subject: [PATCH] feat: sidebar button config (#5818) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 新增 PreferenceCheckboxItem 组件 * feat(preferences): 添加侧边栏按钮配置功能 * feat: 新增按钮点击事件触发功能 * feat(SidebarPreferences): 新增侧边栏折叠按钮与固定按钮配置 * feat(ui): 新增侧边栏固定按钮及配置选项 * fix(test): 修正侧边栏配置项缺失问题 --- .../__snapshots__/config.test.ts.snap | 2 + packages/@core/preferences/src/config.ts | 2 + packages/@core/preferences/src/types.ts | 4 ++ .../src/components/layout-sidebar.vue | 10 ++- .../@core/ui-kit/layout-ui/src/vben-layout.ts | 10 +++ .../ui-kit/layout-ui/src/vben-layout.vue | 4 ++ .../components/button/check-button-group.vue | 3 +- packages/effects/layouts/src/basic/layout.vue | 2 + .../preferences/blocks/checkbox-item.vue | 63 +++++++++++++++++++ .../preferences/blocks/layout/sidebar.vue | 35 +++++++++++ .../preferences/preferences-drawer.vue | 9 ++- 11 files changed, 138 insertions(+), 6 deletions(-) create mode 100644 packages/effects/layouts/src/widgets/preferences/blocks/checkbox-item.vue diff --git a/packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap b/packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap index d537d22e..17f8dc58 100644 --- a/packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap +++ b/packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap @@ -68,10 +68,12 @@ exports[`defaultPreferences immutability test > should not modify the config obj "sidebar": { "autoActivateChild": false, "collapsed": false, + "collapsedButton": true, "collapsedShowTitle": false, "enable": true, "expandOnHover": true, "extraCollapse": false, + "fixedButton": true, "hidden": false, "width": 224, }, diff --git a/packages/@core/preferences/src/config.ts b/packages/@core/preferences/src/config.ts index 2c3f6586..4910637b 100644 --- a/packages/@core/preferences/src/config.ts +++ b/packages/@core/preferences/src/config.ts @@ -68,10 +68,12 @@ const defaultPreferences: Preferences = { sidebar: { autoActivateChild: false, collapsed: false, + collapsedButton: true, collapsedShowTitle: false, enable: true, expandOnHover: true, extraCollapse: false, + fixedButton: true, hidden: false, width: 224, }, diff --git a/packages/@core/preferences/src/types.ts b/packages/@core/preferences/src/types.ts index 9c7e87bc..babdaef0 100644 --- a/packages/@core/preferences/src/types.ts +++ b/packages/@core/preferences/src/types.ts @@ -132,6 +132,8 @@ interface SidebarPreferences { autoActivateChild: boolean; /** 侧边栏是否折叠 */ collapsed: boolean; + /** 侧边栏折叠按钮是否可见 */ + collapsedButton: boolean; /** 侧边栏折叠时,是否显示title */ collapsedShowTitle: boolean; /** 侧边栏是否可见 */ @@ -140,6 +142,8 @@ interface SidebarPreferences { expandOnHover: boolean; /** 侧边栏扩展区域是否折叠 */ extraCollapse: boolean; + /** 侧边栏固定按钮是否可见 */ + fixedButton: boolean; /** 侧边栏是否隐藏 - css */ hidden: boolean; /** 侧边栏宽度 */ diff --git a/packages/@core/ui-kit/layout-ui/src/components/layout-sidebar.vue b/packages/@core/ui-kit/layout-ui/src/components/layout-sidebar.vue index a6a08c6a..214658d3 100644 --- a/packages/@core/ui-kit/layout-ui/src/components/layout-sidebar.vue +++ b/packages/@core/ui-kit/layout-ui/src/components/layout-sidebar.vue @@ -65,9 +65,14 @@ interface Props { show?: boolean; /** * 显示折叠按钮 - * @default false + * @default true */ showCollapseButton?: boolean; + /** + * 显示固定按钮 + * @default true + */ + showFixedButton?: boolean; /** * 主题 */ @@ -95,6 +100,7 @@ const props = withDefaults(defineProps(), { paddingTop: 0, show: true, showCollapseButton: true, + showFixedButton: true, zIndex: 0, }); @@ -267,7 +273,7 @@ function handleMouseleave() { @mouseleave="handleMouseleave" >
diff --git a/packages/@core/ui-kit/layout-ui/src/vben-layout.ts b/packages/@core/ui-kit/layout-ui/src/vben-layout.ts index f7dd39cd..9b77ba96 100644 --- a/packages/@core/ui-kit/layout-ui/src/vben-layout.ts +++ b/packages/@core/ui-kit/layout-ui/src/vben-layout.ts @@ -106,6 +106,11 @@ interface VbenLayoutProps { * @default false */ sidebarCollapse?: boolean; + /** + * 侧边菜单折叠按钮 + * @default true + */ + sidebarCollapsedButton?: boolean; /** * 侧边菜单是否折叠时,是否显示title * @default true @@ -121,6 +126,11 @@ interface VbenLayoutProps { * @default 48 */ sidebarExtraCollapsedWidth?: number; + /** + * 侧边菜单折叠按钮是否固定 + * @default true + */ + sidebarFixedButton?: boolean; /** * 侧边栏是否隐藏 * @default false diff --git a/packages/@core/ui-kit/layout-ui/src/vben-layout.vue b/packages/@core/ui-kit/layout-ui/src/vben-layout.vue index 0d3ae55f..e9e98dd4 100644 --- a/packages/@core/ui-kit/layout-ui/src/vben-layout.vue +++ b/packages/@core/ui-kit/layout-ui/src/vben-layout.vue @@ -49,8 +49,10 @@ const props = withDefaults(defineProps(), { headerVisible: true, isMobile: false, layout: 'sidebar-nav', + sidebarCollapsedButton: true, sidebarCollapseShowTitle: false, sidebarExtraCollapsedWidth: 60, + sidebarFixedButton: true, sidebarHidden: false, sidebarMixedWidth: 80, sidebarTheme: 'dark', @@ -487,6 +489,8 @@ const idMainContent = ELEMENT_ID_MAIN_CONTENT; v-model:expand-on-hovering="sidebarExpandOnHovering" v-model:extra-collapse="sidebarExtraCollapse" v-model:extra-visible="sidebarExtraVisible" + :show-collapse-button="sidebarCollapsedButton" + :show-fixed-button="sidebarFixedButton" :collapse-width="getSideCollapseWidth" :dom-visible="!isMobile" :extra-width="sidebarExtraWidth" diff --git a/packages/@core/ui-kit/shadcn-ui/src/components/button/check-button-group.vue b/packages/@core/ui-kit/shadcn-ui/src/components/button/check-button-group.vue index a7477f07..39b3ab81 100644 --- a/packages/@core/ui-kit/shadcn-ui/src/components/button/check-button-group.vue +++ b/packages/@core/ui-kit/shadcn-ui/src/components/button/check-button-group.vue @@ -20,7 +20,7 @@ const props = withDefaults(defineProps(), { showIcon: true, size: 'middle', }); - +const emit = defineEmits(['btnClick']); const btnDefaultProps = computed(() => { return { ...objectOmit(props, ['options', 'btnClass', 'size', 'disabled']), @@ -90,6 +90,7 @@ async function onBtnClick(value: ValueType) { innerValue.value = [value]; modelValue.value = value; } + emit('btnClick', value); }