Skip to content

Commit 59a8ce9

Browse files
committed
feat: tabs adds new window opening and maximizing/restore capabilities
1 parent f98f504 commit 59a8ce9

File tree

6 files changed

+70
-25
lines changed

6 files changed

+70
-25
lines changed

packages/@core/forward/preferences/src/use-preferences.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,22 @@ function usePreferences() {
138138
return enable && globalPreferences;
139139
});
140140

141+
/**
142+
* @zh_CN 内容是否已经最大化
143+
* 排除 full-content模式
144+
*/
145+
const contentIsMaximize = computed(() => {
146+
const headerIsHidden = preferences.header.hidden;
147+
const sidebarIsHidden = preferences.sidebar.hidden;
148+
149+
return headerIsHidden && sidebarIsHidden && !isFullContent.value;
150+
});
151+
141152
return {
142153
authPanelCenter,
143154
authPanelLeft,
144155
authPanelRight,
156+
contentIsMaximize,
145157
diffPreference,
146158
globalLockScreenShortcutKey,
147159
globalLogoutShortcutKey,

packages/@core/locales/src/langs/en-US.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,10 @@
184184
"closeLeft": "Close Left Tabs",
185185
"closeRight": "Close Right Tabs",
186186
"closeOther": "Close Other Tabs",
187-
"closeAll": "Close All Tabs"
187+
"closeAll": "Close All Tabs",
188+
"openInNewWindow": "Open in New Window",
189+
"maximize": "Maximize",
190+
"restoreMaximize": "Restore"
188191
}
189192
},
190193
"navigationMenu": {

packages/@core/locales/src/langs/zh-CN.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,10 @@
184184
"closeLeft": "关闭左侧标签页",
185185
"closeRight": "关闭右侧标签页",
186186
"closeOther": "关闭其它标签页",
187-
"closeAll": "关闭全部标签页"
187+
"closeAll": "关闭全部标签页",
188+
"openInNewWindow": "在新窗口打开",
189+
"maximize": "最大化",
190+
"restoreMaximize": "还原"
188191
}
189192
},
190193
"navigationMenu": {

packages/@core/shared/iconify/src/material.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ export const IcRoundArrowBackIosNew = createIconifyIcon(
7979

8080
export const IcRoundMultipleStop = createIconifyIcon('ic:round-multiple-stop');
8181

82+
export const IcRoundTableView = createIconifyIcon('ic:round-table-view');
83+
8284
export const IcRoundRefresh = createIconifyIcon('ic:round-refresh');
8385

8486
export const IcRoundCreditScore = createIconifyIcon('ic:round-credit-score');

packages/business/layouts/src/basic/tabbar/tabbar-tools.vue

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
import { computed } from 'vue';
33
import { useRoute } from 'vue-router';
44
5-
import { preferences, updatePreferences } from '@vben-core/preferences';
5+
import { preferences } from '@vben-core/preferences';
66
import { TabsToolMore, TabsToolScreen } from '@vben-core/tabs-ui';
77
8-
import { useTabs } from './use-tabs';
8+
import { updateContentScreen, useTabs } from './use-tabs';
99
1010
const route = useRoute();
1111
@@ -14,26 +14,15 @@ const { createContextMenus } = useTabs();
1414
const menus = computed(() => {
1515
return createContextMenus(route);
1616
});
17-
18-
function handleScreenChange(screen: boolean) {
19-
updatePreferences({
20-
header: {
21-
hidden: !!screen,
22-
},
23-
sidebar: {
24-
hidden: !!screen,
25-
},
26-
});
27-
}
2817
</script>
2918

3019
<template>
3120
<div class="flex-center h-full">
3221
<TabsToolMore :menus="menus" />
3322
<TabsToolScreen
3423
:screen="preferences.sidebar.hidden"
35-
@change="handleScreenChange"
36-
@update:screen="handleScreenChange"
24+
@change="updateContentScreen"
25+
@update:screen="updateContentScreen"
3726
/>
3827
</div>
3928
</template>

packages/business/layouts/src/basic/tabbar/use-tabs.ts

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,42 @@ import { useRoute, useRouter } from 'vue-router';
1010

1111
import {
1212
IcRoundClose,
13+
IcRoundFitScreen,
1314
IcRoundMultipleStop,
1415
IcRoundRefresh,
16+
IcRoundTableView,
17+
IcTwotoneFitScreen,
1518
MdiArrowExpandHorizontal,
1619
MdiFormatHorizontalAlignLeft,
1720
MdiFormatHorizontalAlignRight,
1821
MdiPin,
1922
MdiPinOff,
2023
} from '@vben-core/iconify';
2124
import { $t, useI18n } from '@vben-core/locales';
25+
import { updatePreferences, usePreferences } from '@vben-core/preferences';
2226
import {
2327
storeToRefs,
2428
useCoreAccessStore,
2529
useCoreTabbarStore,
2630
} from '@vben-core/stores';
27-
import { filterTree } from '@vben-core/toolkit';
31+
import { filterTree, openWindow } from '@vben-core/toolkit';
32+
33+
function updateContentScreen(screen: boolean) {
34+
updatePreferences({
35+
header: {
36+
hidden: !!screen,
37+
},
38+
sidebar: {
39+
hidden: !!screen,
40+
},
41+
});
42+
}
2843

2944
function useTabs() {
3045
const router = useRouter();
3146
const route = useRoute();
3247
const accessStore = useCoreAccessStore();
48+
const { contentIsMaximize } = usePreferences();
3349
const coreTabbarStore = useCoreTabbarStore();
3450
const { accessMenus } = storeToRefs(accessStore);
3551

@@ -136,11 +152,36 @@ function useTabs() {
136152
},
137153
icon: affixTab ? MdiPinOff : MdiPin,
138154
key: 'affix',
139-
separator: true,
140155
text: affixTab
141156
? $t('preferences.tabbar.contextMenu.unpin')
142157
: $t('preferences.tabbar.contextMenu.pin'),
143158
},
159+
{
160+
handler: async () => {
161+
const { hash, origin } = location;
162+
const path = tab.fullPath;
163+
const fullPath = path.startsWith('/') ? path : `/${path}`;
164+
const url = `${origin}${hash ? '/#' : ''}${fullPath}`;
165+
openWindow(url, { target: '_blank' });
166+
},
167+
icon: IcRoundTableView,
168+
key: 'open-in-new-window',
169+
text: $t('preferences.tabbar.contextMenu.openInNewWindow'),
170+
},
171+
{
172+
handler: async () => {
173+
if (!contentIsMaximize.value) {
174+
await router.push(tab.fullPath);
175+
}
176+
updateContentScreen(!contentIsMaximize.value);
177+
},
178+
icon: contentIsMaximize.value ? IcRoundFitScreen : IcTwotoneFitScreen,
179+
key: contentIsMaximize.value ? 'restore-maximize' : 'maximize',
180+
separator: true,
181+
text: contentIsMaximize.value
182+
? $t('preferences.tabbar.contextMenu.restoreMaximize')
183+
: $t('preferences.tabbar.contextMenu.maximize'),
184+
},
144185
{
145186
disabled: closeLeftDisabled,
146187
handler: async () => {
@@ -178,11 +219,6 @@ function useTabs() {
178219
key: 'close-all',
179220
text: $t('preferences.tabbar.contextMenu.closeAll'),
180221
},
181-
// {
182-
// icon: 'icon-[material-symbols--back-to-tab-sharp]',
183-
// key: 'close-all',
184-
// text: '新窗口打开',
185-
// },
186222
];
187223
return menus;
188224
};
@@ -204,4 +240,4 @@ function useTabs() {
204240
};
205241
}
206242

207-
export { useTabs };
243+
export { updateContentScreen, useTabs };

0 commit comments

Comments
 (0)