jky-component-lib 0.0.65 → 0.0.67
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/components.d.ts +1 -0
- package/dist/es/components.js +4 -1
- package/dist/es/index.js +15 -0
- package/dist/es/package.json.js +1 -1
- package/dist/es/page-header/PageHeader.vue.js +2 -2
- package/dist/es/page-header/PopoverMenu.vue.js +2 -2
- package/dist/es/style.css +146 -0
- package/dist/es/styles.css +1 -1
- package/dist/es/tabs/TabContent.vue.d.ts +16 -0
- package/dist/es/tabs/TabContent.vue.js +65 -0
- package/dist/es/tabs/TabContent.vue3.js +5 -0
- package/dist/es/tabs/Tabs.vue.d.ts +46 -0
- package/dist/es/tabs/Tabs.vue.js +275 -0
- package/dist/es/tabs/Tabs.vue3.js +5 -0
- package/dist/es/tabs/index.d.ts +9 -0
- package/dist/es/tabs/index.js +8 -0
- package/dist/es/tabs/routeListener.d.ts +19 -0
- package/dist/es/tabs/routeListener.js +26 -0
- package/dist/es/tabs/style.css +29 -0
- package/dist/es/tabs/useTabs.d.ts +27 -0
- package/dist/es/tabs/useTabs.js +59 -0
- package/dist/es/tabs/useTabsStore.d.ts +53 -0
- package/dist/es/tabs/useTabsStore.js +208 -0
- package/dist/lib/components.d.ts +1 -0
- package/dist/lib/components.js +4 -1
- package/dist/lib/index.js +15 -0
- package/dist/lib/package.json.js +1 -1
- package/dist/lib/page-header/PageHeader.vue.js +3 -3
- package/dist/lib/page-header/PopoverMenu.vue.js +2 -2
- package/dist/lib/style.css +146 -0
- package/dist/lib/styles.css +1 -1
- package/dist/lib/tabs/TabContent.vue.d.ts +16 -0
- package/dist/lib/tabs/TabContent.vue.js +65 -0
- package/dist/lib/tabs/TabContent.vue3.js +5 -0
- package/dist/lib/tabs/Tabs.vue.d.ts +46 -0
- package/dist/lib/tabs/Tabs.vue.js +275 -0
- package/dist/lib/tabs/Tabs.vue3.js +5 -0
- package/dist/lib/tabs/index.d.ts +9 -0
- package/dist/lib/tabs/index.js +8 -0
- package/dist/lib/tabs/routeListener.d.ts +19 -0
- package/dist/lib/tabs/routeListener.js +26 -0
- package/dist/lib/tabs/style.css +29 -0
- package/dist/lib/tabs/useTabs.d.ts +27 -0
- package/dist/lib/tabs/useTabs.js +59 -0
- package/dist/lib/tabs/useTabsStore.d.ts +53 -0
- package/dist/lib/tabs/useTabsStore.js +208 -0
- package/package.json +10 -2
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
import { defineComponent, useAttrs, inject, shallowRef, computed, onMounted, provide, openBlock, createBlock, unref, mergeProps, withCtx, renderSlot, createElementBlock, Fragment, renderList, createVNode, normalizeStyle, createCommentVNode, markRaw } from "vue";
|
|
21
|
+
import { ElTabs, ElTabPane } from "element-plus";
|
|
22
|
+
import { onRouteChange } from "./routeListener.js";
|
|
23
|
+
import _sfc_main$1 from "./TabContent.vue.js";
|
|
24
|
+
/* empty css */
|
|
25
|
+
import { createTabsStore } from "./useTabsStore.js";
|
|
26
|
+
const _sfc_main = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({}, {
|
|
27
|
+
name: "JkyTabs",
|
|
28
|
+
inheritAttrs: false
|
|
29
|
+
}), {
|
|
30
|
+
__name: "Tabs",
|
|
31
|
+
props: {
|
|
32
|
+
mode: { default: "default" },
|
|
33
|
+
cachable: { type: Boolean, default: true },
|
|
34
|
+
maxCacheSize: { default: 0 },
|
|
35
|
+
className: {},
|
|
36
|
+
tabStyle: { default: () => ({}) },
|
|
37
|
+
tabs: { default: () => [] },
|
|
38
|
+
persist: { type: Boolean },
|
|
39
|
+
persistKey: {},
|
|
40
|
+
type: {},
|
|
41
|
+
closable: { type: Boolean },
|
|
42
|
+
addable: { type: Boolean },
|
|
43
|
+
modelValue: {},
|
|
44
|
+
defaultValue: {},
|
|
45
|
+
editable: { type: Boolean },
|
|
46
|
+
tabPosition: {},
|
|
47
|
+
beforeLeave: {},
|
|
48
|
+
stretch: { type: Boolean },
|
|
49
|
+
tabindex: {}
|
|
50
|
+
},
|
|
51
|
+
emits: ["tabClick", "tabRemove", "edit", "routeChange", "tabClose", "update:modelValue"],
|
|
52
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
53
|
+
const props = __props;
|
|
54
|
+
const emit = __emit;
|
|
55
|
+
const attrs = useAttrs();
|
|
56
|
+
const router = inject("router", null);
|
|
57
|
+
const store = createTabsStore(props.persist, props.persistKey);
|
|
58
|
+
const closedTabs = shallowRef(/* @__PURE__ */ new Set());
|
|
59
|
+
const tabStyleVars = computed(() => {
|
|
60
|
+
var _a, _b, _c, _d;
|
|
61
|
+
const styles = {};
|
|
62
|
+
if ((_a = props.tabStyle) == null ? void 0 : _a.color)
|
|
63
|
+
styles["--jky-tabs-color"] = props.tabStyle.color;
|
|
64
|
+
if ((_b = props.tabStyle) == null ? void 0 : _b.activeColor)
|
|
65
|
+
styles["--jky-tabs-active-color"] = props.tabStyle.activeColor;
|
|
66
|
+
if ((_c = props.tabStyle) == null ? void 0 : _c.height)
|
|
67
|
+
styles["--jky-tabs-height"] = props.tabStyle.height;
|
|
68
|
+
if ((_d = props.tabStyle) == null ? void 0 : _d.fontSize)
|
|
69
|
+
styles["--jky-tabs-font-size"] = props.tabStyle.fontSize;
|
|
70
|
+
return styles;
|
|
71
|
+
});
|
|
72
|
+
const tabsClass = computed(() => {
|
|
73
|
+
return [
|
|
74
|
+
"jky-tabs",
|
|
75
|
+
props.mode === "route" && "jky-tabs--route",
|
|
76
|
+
props.className,
|
|
77
|
+
attrs.class
|
|
78
|
+
].filter(Boolean).join(" ");
|
|
79
|
+
});
|
|
80
|
+
const EL_TABS_PROPS = [
|
|
81
|
+
"type",
|
|
82
|
+
"closable",
|
|
83
|
+
"addable",
|
|
84
|
+
"modelValue",
|
|
85
|
+
"editable",
|
|
86
|
+
"tabPosition",
|
|
87
|
+
"stretch"
|
|
88
|
+
];
|
|
89
|
+
const elTabsProps = computed(() => {
|
|
90
|
+
const elProps = {};
|
|
91
|
+
Object.keys(props).forEach((key) => {
|
|
92
|
+
if (EL_TABS_PROPS.includes(key)) {
|
|
93
|
+
elProps[key] = props[key];
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
return __spreadValues({}, elProps);
|
|
97
|
+
});
|
|
98
|
+
function initRouteTabs() {
|
|
99
|
+
if (!router) {
|
|
100
|
+
console.warn("JkyTabs: route mode requires router instance. Please provide router via provide/inject.");
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const routes = router.getRoutes();
|
|
104
|
+
routes.forEach((route) => {
|
|
105
|
+
var _a;
|
|
106
|
+
if ((_a = route.meta) == null ? void 0 : _a.title) {
|
|
107
|
+
const tabItem = {
|
|
108
|
+
name: route.name,
|
|
109
|
+
label: route.meta.title,
|
|
110
|
+
closable: route.meta.closable !== false,
|
|
111
|
+
icon: route.meta.icon,
|
|
112
|
+
affix: route.meta.affix,
|
|
113
|
+
route: {
|
|
114
|
+
path: route.path,
|
|
115
|
+
name: route.name,
|
|
116
|
+
component: route.components ? markRaw(Object.values(route.components)[0]) : void 0,
|
|
117
|
+
meta: route.meta
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
store.addTab(tabItem);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
const currentRoute = router.currentRoute.value;
|
|
124
|
+
if (currentRoute.name) {
|
|
125
|
+
store.setActiveTab(currentRoute.name);
|
|
126
|
+
if (props.cachable) {
|
|
127
|
+
store.addCache(currentRoute.name);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function handleTabChange(pane) {
|
|
132
|
+
var _a;
|
|
133
|
+
const newTabName = ((_a = pane.props) == null ? void 0 : _a.name) || pane.name;
|
|
134
|
+
store.setActiveTab(newTabName);
|
|
135
|
+
emit("update:modelValue", newTabName);
|
|
136
|
+
if (props.mode === "route" && router) {
|
|
137
|
+
const tab = store.tabList.find((t) => t.name === newTabName);
|
|
138
|
+
if (tab == null ? void 0 : tab.route) {
|
|
139
|
+
router.push(tab.route.path);
|
|
140
|
+
emit("routeChange", tab.route);
|
|
141
|
+
if (props.cachable) {
|
|
142
|
+
store.addCache(newTabName);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
emit("tabClick", pane);
|
|
147
|
+
}
|
|
148
|
+
function handleCloseTab(tabName) {
|
|
149
|
+
const name = String(tabName);
|
|
150
|
+
if (!name)
|
|
151
|
+
return;
|
|
152
|
+
if (props.mode === "route") {
|
|
153
|
+
store.removeTab(name);
|
|
154
|
+
} else {
|
|
155
|
+
closedTabs.value = /* @__PURE__ */ new Set([...closedTabs.value, name]);
|
|
156
|
+
if (store.activeTab === name && props.tabs && props.tabs.length > 0) {
|
|
157
|
+
const currentIndex = props.tabs.findIndex((tab) => tab.name === name);
|
|
158
|
+
const availableTabs = props.tabs.filter((tab) => !closedTabs.value.has(tab.name));
|
|
159
|
+
if (availableTabs.length > 0) {
|
|
160
|
+
const nextTab = availableTabs[currentIndex] || availableTabs[currentIndex - 1];
|
|
161
|
+
if (nextTab) {
|
|
162
|
+
store.setActiveTab(nextTab.name);
|
|
163
|
+
emit("update:modelValue", nextTab.name);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
emit("tabClose", name);
|
|
169
|
+
emit("tabRemove", name);
|
|
170
|
+
}
|
|
171
|
+
function handleAddTab() {
|
|
172
|
+
emit("edit", void 0, "add");
|
|
173
|
+
}
|
|
174
|
+
function isClosed(name) {
|
|
175
|
+
return closedTabs.value.has(name);
|
|
176
|
+
}
|
|
177
|
+
function closeTab(tabName) {
|
|
178
|
+
handleCloseTab(tabName);
|
|
179
|
+
}
|
|
180
|
+
function closeOthers(tabName) {
|
|
181
|
+
store.closeOther(tabName);
|
|
182
|
+
}
|
|
183
|
+
function closeAll() {
|
|
184
|
+
store.closeAll();
|
|
185
|
+
}
|
|
186
|
+
function refreshTab(tabName) {
|
|
187
|
+
store.refresh(tabName);
|
|
188
|
+
}
|
|
189
|
+
function getCachedTabs() {
|
|
190
|
+
return store.getCacheTabs();
|
|
191
|
+
}
|
|
192
|
+
function getTabList() {
|
|
193
|
+
return store.getTabList();
|
|
194
|
+
}
|
|
195
|
+
function getActiveTab() {
|
|
196
|
+
return store.activeTab;
|
|
197
|
+
}
|
|
198
|
+
if (props.mode === "route") {
|
|
199
|
+
onRouteChange((route) => {
|
|
200
|
+
if (route.name) {
|
|
201
|
+
store.setActiveTab(route.name);
|
|
202
|
+
if (props.cachable) {
|
|
203
|
+
store.addCache(route.name);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}, true);
|
|
207
|
+
}
|
|
208
|
+
onMounted(() => {
|
|
209
|
+
if (props.mode === "route") {
|
|
210
|
+
initRouteTabs();
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
__expose({
|
|
214
|
+
closeTab,
|
|
215
|
+
closeOthers,
|
|
216
|
+
closeAll,
|
|
217
|
+
refreshTab,
|
|
218
|
+
getCachedTabs,
|
|
219
|
+
getTabList,
|
|
220
|
+
getActiveTab
|
|
221
|
+
});
|
|
222
|
+
provide("tabsContext", {
|
|
223
|
+
mode: props.mode,
|
|
224
|
+
cachable: props.cachable,
|
|
225
|
+
activeTab: computed(() => store.activeTab),
|
|
226
|
+
cachedTabs: shallowRef(new Set(store.getCacheTabs())),
|
|
227
|
+
cachedComponents: shallowRef(/* @__PURE__ */ new Map())
|
|
228
|
+
});
|
|
229
|
+
return (_ctx, _cache) => {
|
|
230
|
+
return openBlock(), createBlock(unref(ElTabs), mergeProps({
|
|
231
|
+
"model-value": unref(store).activeTab
|
|
232
|
+
}, elTabsProps.value, {
|
|
233
|
+
class: tabsClass.value,
|
|
234
|
+
style: tabStyleVars.value,
|
|
235
|
+
onTabClick: handleTabChange,
|
|
236
|
+
onTabRemove: handleCloseTab,
|
|
237
|
+
onEdit: handleCloseTab,
|
|
238
|
+
onTabAdd: handleAddTab
|
|
239
|
+
}), {
|
|
240
|
+
default: withCtx(() => [
|
|
241
|
+
renderSlot(_ctx.$slots, "default", {}, () => [
|
|
242
|
+
__props.mode === "route" ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(unref(store).tabList, (tab) => {
|
|
243
|
+
return openBlock(), createBlock(unref(ElTabPane), {
|
|
244
|
+
key: tab.name,
|
|
245
|
+
name: tab.name,
|
|
246
|
+
closable: tab.closable
|
|
247
|
+
}, {
|
|
248
|
+
label: withCtx(() => [
|
|
249
|
+
createVNode(_sfc_main$1, { tab }, null, 8, ["tab"])
|
|
250
|
+
]),
|
|
251
|
+
_: 2
|
|
252
|
+
}, 1032, ["name", "closable"]);
|
|
253
|
+
}), 128)) : __props.tabs && __props.tabs.length > 0 ? (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(__props.tabs, (tab) => {
|
|
254
|
+
return openBlock(), createBlock(unref(ElTabPane), {
|
|
255
|
+
key: tab.name,
|
|
256
|
+
name: tab.name,
|
|
257
|
+
closable: tab.closable,
|
|
258
|
+
style: normalizeStyle({ display: isClosed(tab.name) ? "none" : "" })
|
|
259
|
+
}, {
|
|
260
|
+
label: withCtx(() => [
|
|
261
|
+
createVNode(_sfc_main$1, { tab }, null, 8, ["tab"])
|
|
262
|
+
]),
|
|
263
|
+
_: 2
|
|
264
|
+
}, 1032, ["name", "closable", "style"]);
|
|
265
|
+
}), 128)) : createCommentVNode("", true)
|
|
266
|
+
])
|
|
267
|
+
]),
|
|
268
|
+
_: 3
|
|
269
|
+
}, 16, ["model-value", "class", "style"]);
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
}));
|
|
273
|
+
export {
|
|
274
|
+
_sfc_main as default
|
|
275
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { InstallWithSFC } from '../utils';
|
|
2
|
+
import { default as Tabs } from './Tabs.vue';
|
|
3
|
+
export declare const JkyTabs: InstallWithSFC<typeof Tabs>;
|
|
4
|
+
export default JkyTabs;
|
|
5
|
+
export { clearRouteListeners, emitRouteChange, onRouteChange } from './routeListener';
|
|
6
|
+
export { default as JkyTabContent } from './TabContent.vue';
|
|
7
|
+
export type * from './types';
|
|
8
|
+
export { useTabs } from './useTabs';
|
|
9
|
+
export { createTabsStore, resetTabsStore, useTabsStore } from './useTabsStore';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { RouteLocationNormalized } from 'vue-router';
|
|
2
|
+
/**
|
|
3
|
+
* 触发路由变化事件
|
|
4
|
+
*
|
|
5
|
+
* @param route - 路由信息
|
|
6
|
+
*/
|
|
7
|
+
export declare function emitRouteChange(route: RouteLocationNormalized): void;
|
|
8
|
+
/**
|
|
9
|
+
* 监听路由变化
|
|
10
|
+
*
|
|
11
|
+
* @param callback - 回调函数
|
|
12
|
+
* @param immediate - 是否立即执行
|
|
13
|
+
* @returns 取消监听函数
|
|
14
|
+
*/
|
|
15
|
+
export declare function onRouteChange(callback: (route: RouteLocationNormalized) => void, immediate?: boolean): () => void;
|
|
16
|
+
/**
|
|
17
|
+
* 清除所有监听
|
|
18
|
+
*/
|
|
19
|
+
export declare function clearRouteListeners(): void;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import mitt from "mitt";
|
|
2
|
+
const emitter = mitt();
|
|
3
|
+
let lastRoute = null;
|
|
4
|
+
function emitRouteChange(route) {
|
|
5
|
+
lastRoute = route;
|
|
6
|
+
emitter.emit("routeChange", { route });
|
|
7
|
+
}
|
|
8
|
+
function onRouteChange(callback, immediate = true) {
|
|
9
|
+
emitter.on("routeChange", ({ route }) => {
|
|
10
|
+
callback(route);
|
|
11
|
+
});
|
|
12
|
+
if (immediate && lastRoute) {
|
|
13
|
+
callback(lastRoute);
|
|
14
|
+
}
|
|
15
|
+
return () => {
|
|
16
|
+
emitter.off("routeChange");
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function clearRouteListeners() {
|
|
20
|
+
emitter.all.clear();
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
clearRouteListeners,
|
|
24
|
+
emitRouteChange,
|
|
25
|
+
onRouteChange
|
|
26
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/* Tabs 组件样式 */
|
|
2
|
+
.jky-tabs {
|
|
3
|
+
--jky-tabs-color: var(--el-text-color-regular);
|
|
4
|
+
--jky-tabs-active-color: var(--el-color-primary);
|
|
5
|
+
--jky-tabs-height: 40px;
|
|
6
|
+
--jky-tabs-font-size: 14px;
|
|
7
|
+
.el-tabs__item {
|
|
8
|
+
color: var(--jky-tabs-color);
|
|
9
|
+
font-size: var(--jky-tabs-font-size);
|
|
10
|
+
height: var(--jky-tabs-height);
|
|
11
|
+
line-height: var(--jky-tabs-height);
|
|
12
|
+
&.is-active {
|
|
13
|
+
color: var(--jky-tabs-active-color);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
.el-tabs__active-bar {
|
|
17
|
+
background-color: var(--jky-tabs-active-color);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/* 路由模式下的特殊样式 */
|
|
21
|
+
.jky-tabs--route {
|
|
22
|
+
.el-tabs__item {
|
|
23
|
+
&.is-closable:hover {
|
|
24
|
+
.el-tabs__item__close {
|
|
25
|
+
opacity: 1;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ComputedRef } from 'vue';
|
|
2
|
+
import { TabItem, TabsStore } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Tabs Hook 返回类型
|
|
5
|
+
*/
|
|
6
|
+
interface UseTabsReturn {
|
|
7
|
+
activeTab: ComputedRef<string>;
|
|
8
|
+
tabList: ComputedRef<TabItem[]>;
|
|
9
|
+
cacheTabs: ComputedRef<string[]>;
|
|
10
|
+
getCurrentTab: () => TabItem | undefined;
|
|
11
|
+
addTab: (tab: TabItem) => void;
|
|
12
|
+
closeTab: (name?: string) => void;
|
|
13
|
+
closeLeft: (name?: string) => void;
|
|
14
|
+
closeRight: (name?: string) => void;
|
|
15
|
+
closeOther: (name?: string) => void;
|
|
16
|
+
closeAll: () => void;
|
|
17
|
+
refresh: (name?: string) => void;
|
|
18
|
+
setTitle: (title: string, name?: string) => void;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Tabs Hook
|
|
22
|
+
*
|
|
23
|
+
* @param store - 可选的 store 实例
|
|
24
|
+
* @returns Tabs 操作 API
|
|
25
|
+
*/
|
|
26
|
+
export declare function useTabs(store?: TabsStore): UseTabsReturn;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { computed } from "vue";
|
|
2
|
+
import { useTabsStore } from "./useTabsStore.js";
|
|
3
|
+
function useTabs(store) {
|
|
4
|
+
const tabsStore = store || useTabsStore();
|
|
5
|
+
function getCurrentTab() {
|
|
6
|
+
return tabsStore.tabList.find(
|
|
7
|
+
(t) => t.name === tabsStore.activeTab
|
|
8
|
+
);
|
|
9
|
+
}
|
|
10
|
+
function addTab(tab) {
|
|
11
|
+
tabsStore.addTab(tab);
|
|
12
|
+
}
|
|
13
|
+
function closeTab(name) {
|
|
14
|
+
const tabName = name || tabsStore.activeTab;
|
|
15
|
+
tabsStore.removeTab(tabName);
|
|
16
|
+
}
|
|
17
|
+
function closeLeft(name) {
|
|
18
|
+
const tabName = name || tabsStore.activeTab;
|
|
19
|
+
tabsStore.closeLeft(tabName);
|
|
20
|
+
}
|
|
21
|
+
function closeRight(name) {
|
|
22
|
+
const tabName = name || tabsStore.activeTab;
|
|
23
|
+
tabsStore.closeRight(tabName);
|
|
24
|
+
}
|
|
25
|
+
function closeOther(name) {
|
|
26
|
+
const tabName = name || tabsStore.activeTab;
|
|
27
|
+
tabsStore.closeOther(tabName);
|
|
28
|
+
}
|
|
29
|
+
function closeAll() {
|
|
30
|
+
tabsStore.closeAll();
|
|
31
|
+
}
|
|
32
|
+
function refresh(name) {
|
|
33
|
+
const tabName = name || tabsStore.activeTab;
|
|
34
|
+
tabsStore.refresh(tabName);
|
|
35
|
+
}
|
|
36
|
+
function setTitle(title, name) {
|
|
37
|
+
const tabName = name || tabsStore.activeTab;
|
|
38
|
+
tabsStore.updateTab(tabName, { label: title });
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
// 状态
|
|
42
|
+
activeTab: computed(() => tabsStore.activeTab),
|
|
43
|
+
tabList: computed(() => tabsStore.getTabList()),
|
|
44
|
+
cacheTabs: computed(() => tabsStore.getCacheTabs()),
|
|
45
|
+
// 方法
|
|
46
|
+
getCurrentTab,
|
|
47
|
+
addTab,
|
|
48
|
+
closeTab,
|
|
49
|
+
closeLeft,
|
|
50
|
+
closeRight,
|
|
51
|
+
closeOther,
|
|
52
|
+
closeAll,
|
|
53
|
+
refresh,
|
|
54
|
+
setTitle
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export {
|
|
58
|
+
useTabs
|
|
59
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { TabItem } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Tabs Store 返回类型
|
|
4
|
+
* 注意:Pinia 会自动解包 Ref,所以这里使用 UnwrapRef
|
|
5
|
+
*/
|
|
6
|
+
export interface TabsStoreReturn {
|
|
7
|
+
tabList: TabItem[];
|
|
8
|
+
activeTab: string;
|
|
9
|
+
cacheTabs: string[];
|
|
10
|
+
closedTabs: string[];
|
|
11
|
+
addTab: (tab: TabItem) => void;
|
|
12
|
+
updateTab: (name: string, tab: Partial<TabItem>) => void;
|
|
13
|
+
removeTab: (name: string) => void;
|
|
14
|
+
setActiveTab: (name: string) => void;
|
|
15
|
+
addCache: (name: string) => void;
|
|
16
|
+
removeCache: (name: string) => void;
|
|
17
|
+
bulkRemove: (names: string[]) => void;
|
|
18
|
+
closeLeft: (name: string) => void;
|
|
19
|
+
closeRight: (name: string) => void;
|
|
20
|
+
closeOther: (name: string) => void;
|
|
21
|
+
closeAll: () => void;
|
|
22
|
+
refresh: (name: string) => void;
|
|
23
|
+
getTabList: () => TabItem[];
|
|
24
|
+
getCacheTabs: () => string[];
|
|
25
|
+
isClosed: (name: string) => boolean;
|
|
26
|
+
isCached: (name: string) => boolean;
|
|
27
|
+
reset: () => void;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Tabs Store
|
|
31
|
+
* 使用 Pinia 管理标签页状态和缓存
|
|
32
|
+
*
|
|
33
|
+
* @param persist - 是否启用持久化(默认 false)
|
|
34
|
+
* @param persistKey - 持久化 key(可选,默认 'jky-tabs-state')
|
|
35
|
+
*/
|
|
36
|
+
export declare function createTabsStore(persist?: boolean, persistKey?: string): TabsStoreReturn;
|
|
37
|
+
/**
|
|
38
|
+
* 获取或创建 Tabs Store
|
|
39
|
+
*
|
|
40
|
+
* @param persist - 是否启用持久化(默认 false)
|
|
41
|
+
* @param persistKey - 持久化 key(可选)
|
|
42
|
+
*/
|
|
43
|
+
export declare function useTabsStore(persist?: boolean, persistKey?: string): TabsStoreReturn;
|
|
44
|
+
/**
|
|
45
|
+
* 重置 Store
|
|
46
|
+
*/
|
|
47
|
+
export declare function resetTabsStore(): void;
|
|
48
|
+
/**
|
|
49
|
+
* 在应用中提供持久化 key
|
|
50
|
+
*/
|
|
51
|
+
export declare function provideTabsPersistKey(key: string): {
|
|
52
|
+
key: string;
|
|
53
|
+
};
|