zova-module-a-routertabs 5.1.28 → 5.1.32
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/index.js +45 -11
- package/dist/index.js.map +1 -1
- package/dist/model/tabs.d.ts +6 -0
- package/dist/model/tabs.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/model/tabs.ts +60 -18
package/dist/index.js
CHANGED
|
@@ -92,11 +92,9 @@ var ModelTabs$1 = (_dec$2 = Model({
|
|
|
92
92
|
updatedAt: Date.now(),
|
|
93
93
|
info: tabInfo
|
|
94
94
|
};
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
else this.tabs = mutate(this.tabs, (copyState) => {
|
|
99
|
-
copyState.splice(this.tabCurrentIndex + 1, 0, tabNew);
|
|
95
|
+
const insertIndex = this._getInsertIndexForNewTab(tabNew);
|
|
96
|
+
this.tabs = mutate(this.tabs, (copyState) => {
|
|
97
|
+
copyState.splice(insertIndex, 0, tabNew);
|
|
100
98
|
});
|
|
101
99
|
this.pruneTabs();
|
|
102
100
|
} else {
|
|
@@ -219,16 +217,18 @@ var ModelTabs$1 = (_dec$2 = Model({
|
|
|
219
217
|
keepAlive: tab.keepAlive,
|
|
220
218
|
updatedAt: Date.now()
|
|
221
219
|
};
|
|
222
|
-
const
|
|
223
|
-
if (
|
|
224
|
-
|
|
220
|
+
const itemIndex = this._findTabItemIndex(items, tab.componentKey);
|
|
221
|
+
if (itemIndex === -1) {
|
|
222
|
+
const insertIndex = this._getInsertIndexForNewTabItem(tabOld, items);
|
|
223
|
+
items.splice(insertIndex, 0, tabItem);
|
|
224
|
+
} else {
|
|
225
225
|
const tabItemNew = {
|
|
226
|
-
...items[
|
|
226
|
+
...items[itemIndex],
|
|
227
227
|
...tabItem
|
|
228
228
|
};
|
|
229
|
-
items.splice(
|
|
229
|
+
items.splice(itemIndex, 1, tabItemNew);
|
|
230
230
|
}
|
|
231
|
-
|
|
231
|
+
this._moveAnchorItemFirst(items, tabKey);
|
|
232
232
|
}
|
|
233
233
|
const tabNew = {
|
|
234
234
|
...tabOld,
|
|
@@ -264,6 +264,40 @@ var ModelTabs$1 = (_dec$2 = Model({
|
|
|
264
264
|
if (index === -1) return [index, void 0];
|
|
265
265
|
return [index, this.tabs[index]];
|
|
266
266
|
}
|
|
267
|
+
_getInsertIndexForNewTab(tabNew) {
|
|
268
|
+
const lastAffixTabIndex = this._getLastAffixTabIndex();
|
|
269
|
+
if (this.tabCurrentIndex === -1) return lastAffixTabIndex + 1;
|
|
270
|
+
if (tabNew.affix) return lastAffixTabIndex + 1;
|
|
271
|
+
if (this.tabs[this.tabCurrentIndex]?.affix) return lastAffixTabIndex + 1;
|
|
272
|
+
return this.tabCurrentIndex + 1;
|
|
273
|
+
}
|
|
274
|
+
_getLastAffixTabIndex() {
|
|
275
|
+
let lastAffixTabIndex = -1;
|
|
276
|
+
for (let index = 0; index < this.tabs.length; index++) {
|
|
277
|
+
if (!this.tabs[index].affix) break;
|
|
278
|
+
lastAffixTabIndex = index;
|
|
279
|
+
}
|
|
280
|
+
return lastAffixTabIndex;
|
|
281
|
+
}
|
|
282
|
+
_findTabItemIndex(items, componentKey) {
|
|
283
|
+
if (!componentKey) return -1;
|
|
284
|
+
return items.findIndex((item) => item.componentKey === componentKey);
|
|
285
|
+
}
|
|
286
|
+
_getCurrentTabItemIndex(tab, items) {
|
|
287
|
+
if (this.tabKeyCurrent !== tab.tabKey) return -1;
|
|
288
|
+
return this._findTabItemIndex(items, this.componentKeyCurrent);
|
|
289
|
+
}
|
|
290
|
+
_getInsertIndexForNewTabItem(tab, items) {
|
|
291
|
+
const indexCurrentTabItem = this._getCurrentTabItemIndex(tab, items);
|
|
292
|
+
if (indexCurrentTabItem > -1) return indexCurrentTabItem + 1;
|
|
293
|
+
return items.length;
|
|
294
|
+
}
|
|
295
|
+
_moveAnchorItemFirst(items, tabKey) {
|
|
296
|
+
const indexAnchor = items.findIndex((item) => item.componentKey === tabKey);
|
|
297
|
+
if (indexAnchor <= 0) return;
|
|
298
|
+
const [anchorItem] = items.splice(indexAnchor, 1);
|
|
299
|
+
items.unshift(anchorItem);
|
|
300
|
+
}
|
|
267
301
|
async pruneTabs() {
|
|
268
302
|
let max = this.tabsOptions.max;
|
|
269
303
|
if (max === void 0 || max === -1) return;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["Use","Controller","BeanRouterViewBase","ControllerRouterViewTabs","_dec","_dec2","__z_BeanInfo","module","_dec3","injectionScope","_dec4","Reflect","metadata","ModelTabs","Object","_class","_class2","_ControllerRouterViewTabs","constructor","args","_initializerDefineProperty","_descriptor","backRoute","route","$$modelTabs","forwardRoute","setPageMeta","pageMeta","prepareRouteMeta","getKeepAliveInclude","keepAliveInclude","$propsDefault","_applyDecoratedDescriptor","prototype","configurable","enumerable","writable","initializer"],"sources":["../src/model/tabs.ts","../src/component/routerViewTabs/controller.tsx","../src/.metadata/component/routerViewTabs.ts","../src/.metadata/index.ts"],"sourcesContent":["import type { IDecoratorModelOptions, UseQueryOptions } from 'zova-module-a-model';\n\nimport {\n RouteLocationNormalizedLoaded,\n RouteLocationNormalizedLoadedGeneric,\n} from '@cabloy/vue-router';\nimport { mutate } from 'mutate-on-copy';\nimport { deepEqual, deepExtend, TypeEventOff } from 'zova';\nimport { BeanModelBase, Model } from 'zova-module-a-model';\nimport { IPageMeta, IRouteViewRouteItem, IRouteViewRouteMeta } from 'zova-module-a-router';\n\nimport {\n ModelTabsOptions,\n ModelTabsOptionsBase,\n RouteTab,\n RouteTabInitial,\n RouteTabTransient,\n} from '../types/tabs.js';\n\nexport interface IModelOptionsTabs extends IDecoratorModelOptions, ModelTabsOptionsBase {}\n\n@Model<IModelOptionsTabs>({\n enableSelector: true,\n max: -1,\n maxItems: -1,\n cache: false,\n})\nexport class ModelTabs extends BeanModelBase {\n tabsOptions: ModelTabsOptions;\n tabs: RouteTab[];\n componentKeyCurrent?: string;\n tabKeyCurrent?: string;\n tabCurrentIndex: number;\n tabCurrent?: RouteTab;\n keepAliveInclude: string[];\n private _eventSsrHmrReload: TypeEventOff;\n\n protected async __init__(scene: string, options?: ModelTabsOptions) {\n await super.__init__(scene);\n this.bean._setBean('$$modelTabs', this);\n // options\n this.tabsOptions = deepExtend({}, this.$onionOptions, options);\n // computed\n this.tabCurrentIndex = this.$computed(() => {\n const [index] = this.findTab(this.tabKeyCurrent);\n return index;\n });\n this.tabCurrent = this.$computed(() => {\n const [, tab] = this.findTab(this.tabKeyCurrent);\n return tab;\n });\n this.keepAliveInclude = this.$computed(() => {\n return this._getKeepAliveInclude();\n });\n // componentKeyCurrent\n const queryOptionsComponentKeyCurrent: UseQueryOptions<string> = {\n queryKey: ['componentKeyCurrent'],\n };\n this.componentKeyCurrent = this.$useStateMem(queryOptionsComponentKeyCurrent);\n // tabKeyCurrent\n const queryOptionsTabKeyCurrent: UseQueryOptions<string> = {\n queryKey: ['tabKeyCurrent'],\n };\n this.tabKeyCurrent = this.$useStateMem(queryOptionsTabKeyCurrent);\n // if (this.tabsOptions.cache) {\n // this.tabKeyCurrent = this.$useStateDb(queryOptionsTabKeyCurrent);\n // } else {\n // this.tabKeyCurrent = this.$useStateMem(queryOptionsTabKeyCurrent);\n // }\n // tabs\n const queryOptionsTabs: UseQueryOptions<RouteTab[]> = {\n queryKey: ['tabs'],\n meta: {\n defaultData: this._getInitialTabs(),\n },\n };\n if (this.tabsOptions.cache) {\n this.tabs = this.$useStateDb(queryOptionsTabs);\n } else {\n this.tabs = this.$useStateMem(queryOptionsTabs);\n }\n // load cache\n if (this.tabsOptions.cache) {\n // await this.$loadStateDb(this.tabKeyCurrent);\n await this.$loadStateDb(this.tabs);\n }\n // reset pageDirty\n this._resetAllPageDirty();\n // first route\n if (this.$currentRoute) {\n this.forwardRoute(this.$currentRoute);\n }\n // event\n if (process.env.CLIENT && this.sys.config.ssr.hmr) {\n this._eventSsrHmrReload = this.sys.meta.event.on('a-ssrhmr:reload', async (_data, next) => {\n this.updateAllTabInfos();\n return next();\n });\n }\n // locale\n this.$watch(\n () => {\n return this.app.meta.locale.current;\n },\n () => {\n this.updateAllTabInfos();\n },\n );\n }\n\n protected __dispose__() {\n if (this._eventSsrHmrReload) {\n this._eventSsrHmrReload();\n }\n }\n\n get cache() {\n return this.tabsOptions.cache;\n }\n\n // need not async\n addTab(tab: RouteTabTransient, affix?: boolean): boolean {\n const res = this._addTab(tab, affix);\n // current\n this.tabKeyCurrent = res ? tab.tabKey : undefined;\n this.componentKeyCurrent = res ? tab.componentKey : undefined;\n return res;\n }\n\n // need not async\n _addTab(tab: Partial<RouteTabTransient>, affix?: boolean): boolean {\n const tabKey = tab.tabKey;\n if (!tabKey) return false;\n // tab\n const [index, tabOld] = this.findTab(tabKey);\n // tabInfo\n const tabInfo = this.tabsOptions.getTabInfo?.(tabKey) ?? tabOld?.info;\n if (!tabInfo) return false;\n // tabs\n if (index === -1) {\n // new\n const items: IRouteViewRouteItem[] = tab.componentKey\n ? [\n {\n componentKey: tab.componentKey!,\n fullPath: tab.fullPath!,\n keepAlive: tab.keepAlive,\n updatedAt: Date.now(),\n },\n ]\n : [];\n const tabNew: RouteTab = {\n tabKey,\n affix,\n items,\n updatedAt: Date.now(),\n info: tabInfo,\n };\n if (this.tabCurrentIndex === -1) {\n this.tabs = mutate(this.tabs, copyState => {\n copyState.push(tabNew);\n });\n } else {\n this.tabs = mutate(this.tabs, copyState => {\n copyState.splice(this.tabCurrentIndex + 1, 0, tabNew);\n });\n }\n // need not await\n this.pruneTabs();\n } else {\n // update tabInfo\n if (!deepEqual(tabInfo, tabOld?.info)) {\n this.updateTabInfo(tabKey);\n }\n // update\n if (!this._checkIfTabNeedUpdate(tabOld!, tab)) {\n return true;\n }\n this.updateTab(tab);\n // need not await\n this.pruneTabItems(tabKey);\n }\n return true;\n }\n\n resetAllTabInfos() {\n this.tabs = this._getInitialTabs() as RouteTab[];\n }\n\n updateAllTabInfos(tabInitials?: RouteTabInitial[]) {\n for (const tab of this.tabs) {\n const tabInitial = tabInitials?.find(item => item.tabKey === tab.tabKey);\n this.updateTabInfo(tab.tabKey, tabInitial);\n }\n }\n\n updateTabInfo(tabKey?: string, tabInitial?: RouteTabInitial) {\n if (!tabKey) return;\n // tabs\n const [index, tabOld] = this.findTab(tabKey);\n if (index === -1) return;\n // tabInfo\n const tabInfo = this.tabsOptions.getTabInfo\n ? this.tabsOptions.getTabInfo(tabKey)\n : (tabInitial?.info ?? tabOld?.info);\n if (!tabInfo) return;\n // update\n const tabNew = { ...tabOld, info: tabInfo };\n this.updateTab(tabNew);\n }\n\n updateTabItemPageMeta(tabKey?: string, componentKey?: string, pageMeta?: IPageMeta) {\n if (!tabKey || !componentKey) return false;\n // tab\n const [index, tab] = this.findTab(tabKey);\n if (index === -1 || !tab) return false;\n // tabItem\n if (!tab.items) return false;\n const indexItem = tab.items.findIndex(item => item.componentKey === componentKey);\n if (indexItem === -1) return false;\n const tabItem = tab.items[indexItem];\n // change tab item\n const pageMetaNew: IPageMeta = { ...tabItem.pageMeta, ...pageMeta };\n const tabItemNew: IRouteViewRouteItem = { ...tabItem, pageMeta: pageMetaNew };\n const items = mutate(tab.items, copyState => {\n copyState.splice(indexItem, 1, tabItemNew);\n });\n const tabNew: RouteTab = { ...tab, items };\n this.tabs = mutate(this.tabs, copyState => {\n copyState.splice(index, 1, tabNew);\n });\n return true;\n }\n\n async deleteTab(tabKey?: string, noActiveNext?: boolean) {\n if (!tabKey) return;\n // tabs\n const [index] = this.findTab(tabKey);\n if (index === -1) return;\n // active next\n let tabKeyActiveNext;\n if (!noActiveNext && index === this.tabCurrentIndex) {\n // prev/next\n const tabCurrentIndex =\n index + 1 < this.tabs.length ? index + 1 : index - 1 > -1 ? index - 1 : -1;\n if (tabCurrentIndex > -1) {\n tabKeyActiveNext = this.tabs[tabCurrentIndex]?.tabKey;\n }\n }\n // tabs\n this.tabs = mutate(this.tabs, copyState => {\n copyState.splice(index, 1);\n });\n // active next\n if (tabKeyActiveNext) {\n await this.activeTab(tabKeyActiveNext);\n }\n }\n\n async deleteTabItem(tabKey?: string, componentKey?: string, noActiveNext?: boolean) {\n if (!tabKey || !componentKey) return false;\n if (tabKey === componentKey) return false; // not delete first tabItem\n // tab\n const [index, tab] = this.findTab(tabKey);\n if (index === -1 || !tab) return false;\n // indexItem\n if (!tab.items) return false;\n const indexItem = tab.items.findIndex(item => item.componentKey === componentKey);\n if (indexItem === -1) return false;\n // deleteTab if length===1\n if (tab.items.length === 1 && !tab.affix) {\n // delete tab\n await this.deleteTab(tabKey, noActiveNext);\n return true;\n }\n // active next\n let componentKeyActiveNext;\n if (!noActiveNext && componentKey === this.componentKeyCurrent) {\n // prev/next\n const tabItemCurrentIndex =\n indexItem + 1 < tab.items.length ? indexItem + 1 : indexItem - 1 > -1 ? indexItem - 1 : -1;\n if (tabItemCurrentIndex > -1) {\n componentKeyActiveNext = tab.items[tabItemCurrentIndex]?.componentKey;\n }\n }\n // delete tab item\n const items = mutate(tab.items, copyState => {\n copyState.splice(indexItem, 1);\n });\n const tabNew: RouteTab = { ...tab, items };\n this.tabs = mutate(this.tabs, copyState => {\n copyState.splice(index, 1, tabNew);\n });\n // active next\n if (componentKeyActiveNext) {\n await this.activeTabItem(tabKey, componentKeyActiveNext);\n }\n return true;\n }\n\n findTabItemByFullPath(fullPath: string) {\n for (const tab of this.tabs) {\n if (!tab.items) continue;\n for (const item of tab.items) {\n if (item.fullPath === fullPath) {\n return [tab.tabKey, item.componentKey];\n }\n }\n }\n return [];\n }\n\n updateTab(tab: Partial<RouteTabTransient>) {\n const tabKey = tab.tabKey!;\n const [index, tabOld] = this.findTab(tabKey);\n if (index === -1 || !tabOld) return;\n const items: IRouteViewRouteItem[] = tabOld.items\n ? ([] as IRouteViewRouteItem[]).concat(tabOld.items)\n : [];\n if (tab.componentKey) {\n const tabItem: IRouteViewRouteItem = {\n componentKey: tab.componentKey,\n fullPath: tab.fullPath!,\n keepAlive: tab.keepAlive,\n updatedAt: Date.now(),\n };\n const index = items.findIndex(item => item.componentKey === tab.componentKey);\n if (index === -1) {\n items.push(tabItem);\n } else {\n const tabItemNew: IRouteViewRouteItem = { ...items[index], ...tabItem };\n items.splice(index, 1, tabItemNew);\n }\n // not use fullPath, because fullPath has query string\n items.sort(\n (a, b) => (a.componentKey === tabKey ? 0 : 1) - (b.componentKey === tabKey ? 0 : 1),\n );\n }\n const tabNew: RouteTab = {\n ...tabOld,\n ...tab,\n tabKey,\n items,\n updatedAt: Date.now(),\n };\n this.tabs = mutate(this.tabs, copyState => {\n copyState.splice(index, 1, tabNew);\n });\n }\n\n async activeTab(tabKey?: string) {\n if (!tabKey) return;\n const [_, tab] = this.findTab(tabKey);\n if (!tab) return;\n // should not updateTab here\n // this.updateTab({ tabKey });\n // this.tabKeyCurrent = tabKey;\n // first check tab.items?.[0]?.fullPath, because fullPath maybe has query string\n const tabItemFirst = tab.items?.[0];\n const path = tabItemFirst?.componentKey === tabKey ? tabItemFirst.fullPath : tabKey;\n await this.$router.push(path);\n }\n\n async activeTabItem(tabKey?: string, componentKey?: string) {\n if (!tabKey || !componentKey) return;\n const [_, tab] = this.findTab(tabKey);\n if (!tab) return;\n const tabItem = tab.items?.find(item => item.componentKey === componentKey);\n if (!tabItem) return;\n //\n const path = tabItem.fullPath;\n await this.$router.push(path);\n }\n\n findTab(tabKey?: string): [number, RouteTab | undefined] {\n if (!tabKey) return [-1, undefined];\n const index = this.tabs.findIndex(item => item.tabKey === tabKey);\n if (index === -1) return [index, undefined];\n return [index, this.tabs[index]];\n }\n\n async pruneTabs() {\n let max = this.tabsOptions.max;\n if (max === undefined || max === -1) return;\n if (max < 1) max = 1;\n while (true) {\n const affixCount = this.tabs.filter(item => item.affix).length;\n if (this.tabs.length - affixCount <= max) break;\n let tabKey: string | undefined;\n let updatedAt = Date.now();\n for (const tab of this.tabs) {\n if (!tab.affix && tab.updatedAt < updatedAt) {\n tabKey = tab.tabKey;\n updatedAt = tab.updatedAt;\n }\n }\n if (!tabKey) break;\n await this.deleteTab(tabKey, true);\n }\n }\n\n async pruneTabItems(tabKey?: string) {\n if (!tabKey) return;\n let maxItems = this.tabsOptions.maxItems;\n if (maxItems === undefined || maxItems === -1) return;\n if (maxItems < 1) maxItems = 1;\n while (true) {\n const [_, tab] = this.findTab(tabKey);\n if (!tab || !tab.items) break;\n const ignoreCount = tab.items.filter(item => item.componentKey === tabKey).length;\n if (tab.items.length - ignoreCount <= maxItems) break;\n let componentKey: string | undefined;\n let updatedAt = Date.now();\n for (const tabItem of tab.items) {\n if (tabItem.componentKey !== tabKey && tabItem.updatedAt < updatedAt) {\n componentKey = tabItem.componentKey;\n updatedAt = tabItem.updatedAt;\n }\n }\n if (!componentKey) break;\n await this.deleteTabItem(tabKey, componentKey, true);\n }\n }\n\n // special for _addTab\n private _checkIfTabNeedUpdate(tabOld: RouteTab, tabNew: Partial<RouteTabTransient>) {\n for (const key in tabNew) {\n if (['fullPath', 'keepAlive', 'updatedAt'].includes(key)) continue;\n if (['componentKey'].includes(key)) {\n if (!tabOld.items) return true;\n const tabItemOld = tabOld.items.find(item => item[key] === tabNew[key]);\n if (!tabItemOld) return true;\n for (const key2 of ['fullPath', 'keepAlive']) {\n if (tabItemOld[key2] !== tabNew[key2]) return true;\n }\n const recentItemIndex = tabOld.items.findIndex(\n item =>\n item[key] !== tabItemOld[key] && (item.updatedAt ?? 0) >= (tabItemOld.updatedAt ?? 0),\n );\n if (recentItemIndex > -1) return true;\n } else if (tabNew[key] !== tabOld[key]) {\n return true;\n }\n }\n const recentTabIndex = this.tabs.findIndex(\n item => item.tabKey !== tabOld.tabKey && (item.updatedAt ?? 0) >= (tabOld.updatedAt ?? 0),\n );\n if (recentTabIndex > -1) return true;\n return false;\n }\n\n private _getKeepAliveInclude() {\n const include: string[] = [];\n for (const tab of this.tabs) {\n if (!tab.items) continue;\n for (const item of tab.items) {\n if (item.keepAlive !== false && item.componentKey) {\n if (!include.includes(item.componentKey)) {\n include.push(item.componentKey);\n }\n }\n }\n }\n return include;\n }\n\n private _getInitialTabs() {\n const tabs = this.tabsOptions.getInitialTabs?.() ?? [];\n if (!this.tabsOptions.getTabInfo) return tabs;\n return tabs.map(tab => {\n return {\n ...tab,\n info: this.tabsOptions.getTabInfo?.(tab.tabKey) ?? tab.info,\n };\n });\n }\n\n backRoute(route: RouteLocationNormalizedLoadedGeneric) {\n const [tabKey, componentKey] = this.findTabItemByFullPath(route.fullPath);\n this.deleteTabItem(tabKey, componentKey, true);\n }\n\n forwardRoute(route: RouteLocationNormalizedLoadedGeneric) {\n const routeMeta = this.prepareRouteMeta(route);\n this.addTab(routeMeta);\n }\n\n public setPageMeta(route: RouteLocationNormalizedLoadedGeneric, pageMeta: IPageMeta) {\n const [tabKey, componentKey] = this.findTabItemByFullPath(route.fullPath);\n this.updateTabItemPageMeta(tabKey, componentKey, pageMeta);\n }\n\n prepareRouteMeta(route: RouteLocationNormalizedLoadedGeneric): IRouteViewRouteMeta {\n // fullPath\n const fullPath = route.fullPath;\n // componentKey\n const componentKey = this.__handleRoutePropComponentKey(route);\n // tabKey\n const tabKey = this._handleRouteProp(route, 'tabKey') || componentKey;\n // keepAlive\n const keepAlive = this._handleRouteProp(route, 'keepAlive');\n // tab\n return { tabKey, componentKey, fullPath, keepAlive };\n }\n\n private _handleRouteProp(\n route: RouteLocationNormalizedLoaded,\n prop: 'componentKey' | 'tabKey',\n ): string;\n private _handleRouteProp(route: RouteLocationNormalizedLoaded, prop: 'keepAlive'): boolean;\n private _handleRouteProp(route: RouteLocationNormalizedLoaded, prop) {\n let value = route.meta[prop];\n if (typeof value === 'function') {\n value = value.call(this.app, route);\n }\n return value;\n }\n\n private __handleRoutePropComponentKey(route: RouteLocationNormalizedLoaded) {\n const componentKey = this._handleRouteProp(route, 'componentKey');\n if (componentKey) return componentKey;\n // name\n const name = this.$router.getRealRouteName(route.name);\n // path\n if (!name) return route.path;\n // name: nameOnly\n if (route.meta.componentKeyMode === 'nameOnly') return name;\n // name: withParams\n return route.path;\n }\n\n private _resetAllPageDirty() {\n const tabItems: [string, string][] = [];\n for (const tab of this.tabs) {\n if (!tab.items) continue;\n for (const tabItem of tab.items) {\n if (tabItem.pageMeta?.pageDirty) {\n tabItems.push([tab.tabKey, tabItem.componentKey]);\n }\n }\n }\n for (const [tabKey, componentKey] of tabItems) {\n this.updateTabItemPageMeta(tabKey, componentKey, { pageDirty: false });\n }\n }\n}\n","import { RouteLocationNormalizedLoadedGeneric } from '@cabloy/vue-router';\nimport { Use } from 'zova';\nimport { Controller } from 'zova-module-a-bean';\nimport {\n BeanRouterViewBase,\n IPageMeta,\n IRouterViewPropsBase,\n IRouteViewRouteMeta,\n} from 'zova-module-a-router';\n\nimport type { ModelTabs } from '../../model/tabs.js';\n\nexport interface ControllerRouterViewTabsProps extends IRouterViewPropsBase {}\n\n@Controller()\nexport class ControllerRouterViewTabs extends BeanRouterViewBase {\n static $propsDefault = {};\n\n @Use({ injectionScope: 'skipSelf' })\n $$modelTabs: ModelTabs;\n\n public backRoute(route: RouteLocationNormalizedLoadedGeneric) {\n this.$$modelTabs.backRoute(route);\n return true;\n }\n\n public forwardRoute(route: RouteLocationNormalizedLoadedGeneric) {\n this.$$modelTabs.forwardRoute(route);\n return true;\n }\n\n public setPageMeta(route: RouteLocationNormalizedLoadedGeneric, pageMeta: IPageMeta) {\n this.$$modelTabs.setPageMeta(route, pageMeta);\n }\n\n protected prepareRouteMeta(route: RouteLocationNormalizedLoadedGeneric): IRouteViewRouteMeta {\n return this.$$modelTabs.prepareRouteMeta(route);\n }\n\n protected getKeepAliveInclude(): string[] | undefined {\n return this.$$modelTabs.keepAliveInclude;\n }\n}\n","import type { TypeControllerInnerProps } from 'zova';\n\nimport { defineComponent } from 'vue';\nimport { prepareComponentOptions, useController } from 'zova';\n\nimport type { ControllerRouterViewTabsProps } from '../../component/routerViewTabs/controller.jsx';\n\nimport { ControllerRouterViewTabs } from '../../component/routerViewTabs/controller.jsx';\nexport type ZRouterViewTabsProps = {\n controllerRef?: (ref: ControllerRouterViewTabs) => void;\n} & ControllerRouterViewTabsProps;\n\ntype ControllerInnerProps = TypeControllerInnerProps<\n ControllerRouterViewTabsProps,\n keyof typeof ControllerRouterViewTabs.$propsDefault\n>;\ndeclare module 'zova-module-a-routertabs' {\n export interface ControllerRouterViewTabs {\n $props: ControllerInnerProps;\n }\n}\n\nexport const ZRouterViewTabs = defineComponent((_props: ZRouterViewTabsProps) => {\n useController(ControllerRouterViewTabs, undefined, undefined);\n return () => {};\n}, prepareComponentOptions());\ndeclare module 'zova-module-a-bean' {\n export interface IVonaComponentRecord {\n 'a-routertabs:routerViewTabs': ControllerRouterViewTabsProps;\n }\n}\n","// eslint-disable\n/** model: begin */\nexport * from '../model/tabs.js';\nimport { IModelOptionsTabs } from '../model/tabs.js';\nimport 'zova-module-a-model';\ndeclare module 'zova-module-a-model' {\n \n export interface IModelRecord {\n 'a-routertabs:tabs': IModelOptionsTabs;\n }\n\n \n}\ndeclare module 'zova-module-a-routertabs' {\n \n export interface ModelTabs {\n /** @internal */\n get scope(): ScopeModuleARoutertabs;\n }\n\n export interface ModelTabs {\n get $beanFullName(): 'a-routertabs.model.tabs';\n get $onionName(): 'a-routertabs:tabs';\n get $onionOptions(): IModelOptionsTabs;\n } \n}\n/** model: end */\n/** model: begin */\nimport { ModelTabs } from '../model/tabs.js';\nimport 'zova';\ndeclare module 'zova' {\n export interface IBeanRecordGeneral {\n 'a-routertabs.model.tabs': ModelTabs;\n }\n}\n/** model: end */\n/** controller: begin */\nexport * from '../component/routerViewTabs/controller.jsx';\n\nimport 'zova';\ndeclare module 'zova' {\n \n \n}\ndeclare module 'zova-module-a-routertabs' {\n \n export interface ControllerRouterViewTabs {\n /** @internal */\n get scope(): ScopeModuleARoutertabs;\n } \n}\n/** controller: end */\n/** controller: begin */\nimport { ControllerRouterViewTabs } from '../component/routerViewTabs/controller.jsx';\nimport 'zova';\ndeclare module 'zova' {\n export interface IBeanRecordLocal {\n 'a-routertabs.controller.routerViewTabs': ControllerRouterViewTabs;\n }\n}\n/** controller: end */\n\n/** components: begin */\nexport * from './component/routerViewTabs.js';\nimport { ZRouterViewTabs } from './component/routerViewTabs.js';\nexport const components = {\n 'routerViewTabs': ZRouterViewTabs,\n};\nimport 'zova';\ndeclare module 'zova' {\nexport interface IComponentRecord {\n 'a-routertabs:routerViewTabs': ControllerRouterViewTabs;\n}\nexport interface IZovaComponentRecord {\n 'a-routertabs:routerViewTabs': typeof ZRouterViewTabs;\n}\n}\n/** components: end */\n/** scope: begin */\nimport { BeanScopeBase, type BeanScopeUtil } from 'zova';\nimport { Scope } from 'zova-module-a-bean';\n\n@Scope()\nexport class ScopeModuleARoutertabs extends BeanScopeBase {}\n\nexport interface ScopeModuleARoutertabs {\n util: BeanScopeUtil;\n}\n\nimport 'zova';\ndeclare module 'zova' {\n export interface IBeanScopeRecord {\n 'a-routertabs': ScopeModuleARoutertabs;\n }\n \n \n\n \n\n \n}\n \n/** scope: end */\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["Use","Controller","BeanRouterViewBase","ControllerRouterViewTabs","_dec","_dec2","__z_BeanInfo","module","_dec3","injectionScope","_dec4","Reflect","metadata","ModelTabs","Object","_class","_class2","_ControllerRouterViewTabs","constructor","args","_initializerDefineProperty","_descriptor","backRoute","route","$$modelTabs","forwardRoute","setPageMeta","pageMeta","prepareRouteMeta","getKeepAliveInclude","keepAliveInclude","$propsDefault","_applyDecoratedDescriptor","prototype","configurable","enumerable","writable","initializer"],"sources":["../src/model/tabs.ts","../src/component/routerViewTabs/controller.tsx","../src/.metadata/component/routerViewTabs.ts","../src/.metadata/index.ts"],"sourcesContent":["var _dec, _dec2, _class;\nimport { \"BeanInfo\" as __z_BeanInfo } from \"zova\";\nimport { mutate } from 'mutate-on-copy';\nimport { deepEqual, deepExtend } from 'zova';\nimport { BeanModelBase, Model } from 'zova-module-a-model';\nexport let ModelTabs = (_dec = Model({\n enableSelector: true,\n max: -1,\n maxItems: -1,\n cache: false\n}), _dec2 = __z_BeanInfo({\n module: \"a-routertabs\"\n}), _dec(_class = _dec2(_class = class ModelTabs extends BeanModelBase {\n constructor(...args) {\n super(...args);\n this.tabsOptions = void 0;\n this.tabs = void 0;\n this.componentKeyCurrent = void 0;\n this.tabKeyCurrent = void 0;\n this.tabCurrentIndex = void 0;\n this.tabCurrent = void 0;\n this.keepAliveInclude = void 0;\n this._eventSsrHmrReload = void 0;\n }\n async __init__(scene, options) {\n await super.__init__(scene);\n this.bean._setBean('$$modelTabs', this);\n // options\n this.tabsOptions = deepExtend({}, this.$onionOptions, options);\n // computed\n this.tabCurrentIndex = this.$computed(() => {\n const [index] = this.findTab(this.tabKeyCurrent);\n return index;\n });\n this.tabCurrent = this.$computed(() => {\n const [, tab] = this.findTab(this.tabKeyCurrent);\n return tab;\n });\n this.keepAliveInclude = this.$computed(() => {\n return this._getKeepAliveInclude();\n });\n // componentKeyCurrent\n const queryOptionsComponentKeyCurrent = {\n queryKey: ['componentKeyCurrent']\n };\n this.componentKeyCurrent = this.$useStateMem(queryOptionsComponentKeyCurrent);\n // tabKeyCurrent\n const queryOptionsTabKeyCurrent = {\n queryKey: ['tabKeyCurrent']\n };\n this.tabKeyCurrent = this.$useStateMem(queryOptionsTabKeyCurrent);\n // if (this.tabsOptions.cache) {\n // this.tabKeyCurrent = this.$useStateDb(queryOptionsTabKeyCurrent);\n // } else {\n // this.tabKeyCurrent = this.$useStateMem(queryOptionsTabKeyCurrent);\n // }\n // tabs\n const queryOptionsTabs = {\n queryKey: ['tabs'],\n meta: {\n defaultData: this._getInitialTabs()\n }\n };\n if (this.tabsOptions.cache) {\n this.tabs = this.$useStateDb(queryOptionsTabs);\n } else {\n this.tabs = this.$useStateMem(queryOptionsTabs);\n }\n // load cache\n if (this.tabsOptions.cache) {\n // await this.$loadStateDb(this.tabKeyCurrent);\n await this.$loadStateDb(this.tabs);\n }\n // reset pageDirty\n this._resetAllPageDirty();\n // first route\n if (this.$currentRoute) {\n this.forwardRoute(this.$currentRoute);\n }\n // event\n if (process.env.CLIENT && this.sys.config.ssr.hmr) {\n this._eventSsrHmrReload = this.sys.meta.event.on('a-ssrhmr:reload', async (_data, next) => {\n this.updateAllTabInfos();\n return next();\n });\n }\n // locale\n this.$watch(() => {\n return this.app.meta.locale.current;\n }, () => {\n this.updateAllTabInfos();\n });\n }\n __dispose__() {\n if (this._eventSsrHmrReload) {\n this._eventSsrHmrReload();\n }\n }\n get cache() {\n return this.tabsOptions.cache;\n }\n\n // need not async\n addTab(tab, affix) {\n const res = this._addTab(tab, affix);\n // current\n this.tabKeyCurrent = res ? tab.tabKey : undefined;\n this.componentKeyCurrent = res ? tab.componentKey : undefined;\n return res;\n }\n\n // need not async\n _addTab(tab, affix) {\n const tabKey = tab.tabKey;\n if (!tabKey) return false;\n // tab\n const [index, tabOld] = this.findTab(tabKey);\n // tabInfo\n const tabInfo = this.tabsOptions.getTabInfo?.(tabKey) ?? tabOld?.info;\n if (!tabInfo) return false;\n // tabs\n if (index === -1) {\n // new\n const items = tab.componentKey ? [{\n componentKey: tab.componentKey,\n fullPath: tab.fullPath,\n keepAlive: tab.keepAlive,\n updatedAt: Date.now()\n }] : [];\n const tabNew = {\n tabKey,\n affix,\n items,\n updatedAt: Date.now(),\n info: tabInfo\n };\n const insertIndex = this._getInsertIndexForNewTab(tabNew);\n this.tabs = mutate(this.tabs, copyState => {\n copyState.splice(insertIndex, 0, tabNew);\n });\n // need not await\n this.pruneTabs();\n } else {\n // update tabInfo\n if (!deepEqual(tabInfo, tabOld?.info)) {\n this.updateTabInfo(tabKey);\n }\n // update\n if (!this._checkIfTabNeedUpdate(tabOld, tab)) {\n return true;\n }\n this.updateTab(tab);\n // need not await\n this.pruneTabItems(tabKey);\n }\n return true;\n }\n resetAllTabInfos() {\n this.tabs = this._getInitialTabs();\n }\n updateAllTabInfos(tabInitials) {\n for (const tab of this.tabs) {\n const tabInitial = tabInitials?.find(item => item.tabKey === tab.tabKey);\n this.updateTabInfo(tab.tabKey, tabInitial);\n }\n }\n updateTabInfo(tabKey, tabInitial) {\n if (!tabKey) return;\n // tabs\n const [index, tabOld] = this.findTab(tabKey);\n if (index === -1) return;\n // tabInfo\n const tabInfo = this.tabsOptions.getTabInfo ? this.tabsOptions.getTabInfo(tabKey) : tabInitial?.info ?? tabOld?.info;\n if (!tabInfo) return;\n // update\n const tabNew = {\n ...tabOld,\n info: tabInfo\n };\n this.updateTab(tabNew);\n }\n updateTabItemPageMeta(tabKey, componentKey, pageMeta) {\n if (!tabKey || !componentKey) return false;\n // tab\n const [index, tab] = this.findTab(tabKey);\n if (index === -1 || !tab) return false;\n // tabItem\n if (!tab.items) return false;\n const indexItem = tab.items.findIndex(item => item.componentKey === componentKey);\n if (indexItem === -1) return false;\n const tabItem = tab.items[indexItem];\n // change tab item\n const pageMetaNew = {\n ...tabItem.pageMeta,\n ...pageMeta\n };\n const tabItemNew = {\n ...tabItem,\n pageMeta: pageMetaNew\n };\n const items = mutate(tab.items, copyState => {\n copyState.splice(indexItem, 1, tabItemNew);\n });\n const tabNew = {\n ...tab,\n items\n };\n this.tabs = mutate(this.tabs, copyState => {\n copyState.splice(index, 1, tabNew);\n });\n return true;\n }\n async deleteTab(tabKey, noActiveNext) {\n if (!tabKey) return;\n // tabs\n const [index] = this.findTab(tabKey);\n if (index === -1) return;\n // active next\n let tabKeyActiveNext;\n if (!noActiveNext && index === this.tabCurrentIndex) {\n // prev/next\n const tabCurrentIndex = index + 1 < this.tabs.length ? index + 1 : index - 1 > -1 ? index - 1 : -1;\n if (tabCurrentIndex > -1) {\n tabKeyActiveNext = this.tabs[tabCurrentIndex]?.tabKey;\n }\n }\n // tabs\n this.tabs = mutate(this.tabs, copyState => {\n copyState.splice(index, 1);\n });\n // active next\n if (tabKeyActiveNext) {\n await this.activeTab(tabKeyActiveNext);\n }\n }\n async deleteTabItem(tabKey, componentKey, noActiveNext) {\n if (!tabKey || !componentKey) return false;\n if (tabKey === componentKey) return false; // not delete first tabItem\n // tab\n const [index, tab] = this.findTab(tabKey);\n if (index === -1 || !tab) return false;\n // indexItem\n if (!tab.items) return false;\n const indexItem = tab.items.findIndex(item => item.componentKey === componentKey);\n if (indexItem === -1) return false;\n // deleteTab if length===1\n if (tab.items.length === 1 && !tab.affix) {\n // delete tab\n await this.deleteTab(tabKey, noActiveNext);\n return true;\n }\n // active next\n let componentKeyActiveNext;\n if (!noActiveNext && componentKey === this.componentKeyCurrent) {\n // prev/next\n const tabItemCurrentIndex = indexItem + 1 < tab.items.length ? indexItem + 1 : indexItem - 1 > -1 ? indexItem - 1 : -1;\n if (tabItemCurrentIndex > -1) {\n componentKeyActiveNext = tab.items[tabItemCurrentIndex]?.componentKey;\n }\n }\n // delete tab item\n const items = mutate(tab.items, copyState => {\n copyState.splice(indexItem, 1);\n });\n const tabNew = {\n ...tab,\n items\n };\n this.tabs = mutate(this.tabs, copyState => {\n copyState.splice(index, 1, tabNew);\n });\n // active next\n if (componentKeyActiveNext) {\n await this.activeTabItem(tabKey, componentKeyActiveNext);\n }\n return true;\n }\n findTabItemByFullPath(fullPath) {\n for (const tab of this.tabs) {\n if (!tab.items) continue;\n for (const item of tab.items) {\n if (item.fullPath === fullPath) {\n return [tab.tabKey, item.componentKey];\n }\n }\n }\n return [];\n }\n updateTab(tab) {\n const tabKey = tab.tabKey;\n const [index, tabOld] = this.findTab(tabKey);\n if (index === -1 || !tabOld) return;\n const items = tabOld.items ? [].concat(tabOld.items) : [];\n if (tab.componentKey) {\n const tabItem = {\n componentKey: tab.componentKey,\n fullPath: tab.fullPath,\n keepAlive: tab.keepAlive,\n updatedAt: Date.now()\n };\n const itemIndex = this._findTabItemIndex(items, tab.componentKey);\n if (itemIndex === -1) {\n const insertIndex = this._getInsertIndexForNewTabItem(tabOld, items);\n items.splice(insertIndex, 0, tabItem);\n } else {\n const tabItemNew = {\n ...items[itemIndex],\n ...tabItem\n };\n items.splice(itemIndex, 1, tabItemNew);\n }\n this._moveAnchorItemFirst(items, tabKey);\n }\n const tabNew = {\n ...tabOld,\n ...tab,\n tabKey,\n items,\n updatedAt: Date.now()\n };\n this.tabs = mutate(this.tabs, copyState => {\n copyState.splice(index, 1, tabNew);\n });\n }\n async activeTab(tabKey) {\n if (!tabKey) return;\n const [_, tab] = this.findTab(tabKey);\n if (!tab) return;\n // should not updateTab here\n // this.updateTab({ tabKey });\n // this.tabKeyCurrent = tabKey;\n // first check tab.items?.[0]?.fullPath, because fullPath maybe has query string\n const tabItemFirst = tab.items?.[0];\n const path = tabItemFirst?.componentKey === tabKey ? tabItemFirst.fullPath : tabKey;\n await this.$router.push(path);\n }\n async activeTabItem(tabKey, componentKey) {\n if (!tabKey || !componentKey) return;\n const [_, tab] = this.findTab(tabKey);\n if (!tab) return;\n const tabItem = tab.items?.find(item => item.componentKey === componentKey);\n if (!tabItem) return;\n //\n const path = tabItem.fullPath;\n await this.$router.push(path);\n }\n findTab(tabKey) {\n if (!tabKey) return [-1, undefined];\n const index = this.tabs.findIndex(item => item.tabKey === tabKey);\n if (index === -1) return [index, undefined];\n return [index, this.tabs[index]];\n }\n _getInsertIndexForNewTab(tabNew) {\n const lastAffixTabIndex = this._getLastAffixTabIndex();\n if (this.tabCurrentIndex === -1) {\n return lastAffixTabIndex + 1;\n }\n if (tabNew.affix) {\n return lastAffixTabIndex + 1;\n }\n const tabCurrent = this.tabs[this.tabCurrentIndex];\n if (tabCurrent?.affix) {\n return lastAffixTabIndex + 1;\n }\n return this.tabCurrentIndex + 1;\n }\n _getLastAffixTabIndex() {\n let lastAffixTabIndex = -1;\n for (let index = 0; index < this.tabs.length; index++) {\n if (!this.tabs[index].affix) break;\n lastAffixTabIndex = index;\n }\n return lastAffixTabIndex;\n }\n _findTabItemIndex(items, componentKey) {\n if (!componentKey) return -1;\n return items.findIndex(item => item.componentKey === componentKey);\n }\n _getCurrentTabItemIndex(tab, items) {\n if (this.tabKeyCurrent !== tab.tabKey) return -1;\n return this._findTabItemIndex(items, this.componentKeyCurrent);\n }\n _getInsertIndexForNewTabItem(tab, items) {\n const indexCurrentTabItem = this._getCurrentTabItemIndex(tab, items);\n if (indexCurrentTabItem > -1) {\n return indexCurrentTabItem + 1;\n }\n return items.length;\n }\n _moveAnchorItemFirst(items, tabKey) {\n const indexAnchor = items.findIndex(item => item.componentKey === tabKey);\n if (indexAnchor <= 0) return;\n const [anchorItem] = items.splice(indexAnchor, 1);\n items.unshift(anchorItem);\n }\n async pruneTabs() {\n let max = this.tabsOptions.max;\n if (max === undefined || max === -1) return;\n if (max < 1) max = 1;\n while (true) {\n const affixCount = this.tabs.filter(item => item.affix).length;\n if (this.tabs.length - affixCount <= max) break;\n let tabKey;\n let updatedAt = Date.now();\n for (const tab of this.tabs) {\n if (!tab.affix && tab.updatedAt < updatedAt) {\n tabKey = tab.tabKey;\n updatedAt = tab.updatedAt;\n }\n }\n if (!tabKey) break;\n await this.deleteTab(tabKey, true);\n }\n }\n async pruneTabItems(tabKey) {\n if (!tabKey) return;\n let maxItems = this.tabsOptions.maxItems;\n if (maxItems === undefined || maxItems === -1) return;\n if (maxItems < 1) maxItems = 1;\n while (true) {\n const [_, tab] = this.findTab(tabKey);\n if (!tab || !tab.items) break;\n const ignoreCount = tab.items.filter(item => item.componentKey === tabKey).length;\n if (tab.items.length - ignoreCount <= maxItems) break;\n let componentKey;\n let updatedAt = Date.now();\n for (const tabItem of tab.items) {\n if (tabItem.componentKey !== tabKey && tabItem.updatedAt < updatedAt) {\n componentKey = tabItem.componentKey;\n updatedAt = tabItem.updatedAt;\n }\n }\n if (!componentKey) break;\n await this.deleteTabItem(tabKey, componentKey, true);\n }\n }\n\n // special for _addTab\n _checkIfTabNeedUpdate(tabOld, tabNew) {\n for (const key in tabNew) {\n if (['fullPath', 'keepAlive', 'updatedAt'].includes(key)) continue;\n if (['componentKey'].includes(key)) {\n if (!tabOld.items) return true;\n const tabItemOld = tabOld.items.find(item => item[key] === tabNew[key]);\n if (!tabItemOld) return true;\n for (const key2 of ['fullPath', 'keepAlive']) {\n if (tabItemOld[key2] !== tabNew[key2]) return true;\n }\n const recentItemIndex = tabOld.items.findIndex(item => item[key] !== tabItemOld[key] && (item.updatedAt ?? 0) >= (tabItemOld.updatedAt ?? 0));\n if (recentItemIndex > -1) return true;\n } else if (tabNew[key] !== tabOld[key]) {\n return true;\n }\n }\n const recentTabIndex = this.tabs.findIndex(item => item.tabKey !== tabOld.tabKey && (item.updatedAt ?? 0) >= (tabOld.updatedAt ?? 0));\n if (recentTabIndex > -1) return true;\n return false;\n }\n _getKeepAliveInclude() {\n const include = [];\n for (const tab of this.tabs) {\n if (!tab.items) continue;\n for (const item of tab.items) {\n if (item.keepAlive !== false && item.componentKey) {\n if (!include.includes(item.componentKey)) {\n include.push(item.componentKey);\n }\n }\n }\n }\n return include;\n }\n _getInitialTabs() {\n const tabs = this.tabsOptions.getInitialTabs?.() ?? [];\n if (!this.tabsOptions.getTabInfo) return tabs;\n return tabs.map(tab => {\n return {\n ...tab,\n info: this.tabsOptions.getTabInfo?.(tab.tabKey) ?? tab.info\n };\n });\n }\n backRoute(route) {\n const [tabKey, componentKey] = this.findTabItemByFullPath(route.fullPath);\n this.deleteTabItem(tabKey, componentKey, true);\n }\n forwardRoute(route) {\n const routeMeta = this.prepareRouteMeta(route);\n this.addTab(routeMeta);\n }\n setPageMeta(route, pageMeta) {\n const [tabKey, componentKey] = this.findTabItemByFullPath(route.fullPath);\n this.updateTabItemPageMeta(tabKey, componentKey, pageMeta);\n }\n prepareRouteMeta(route) {\n // fullPath\n const fullPath = route.fullPath;\n // componentKey\n const componentKey = this.__handleRoutePropComponentKey(route);\n // tabKey\n const tabKey = this._handleRouteProp(route, 'tabKey') || componentKey;\n // keepAlive\n const keepAlive = this._handleRouteProp(route, 'keepAlive');\n // tab\n return {\n tabKey,\n componentKey,\n fullPath,\n keepAlive\n };\n }\n _handleRouteProp(route, prop) {\n let value = route.meta[prop];\n if (typeof value === 'function') {\n value = value.call(this.app, route);\n }\n return value;\n }\n __handleRoutePropComponentKey(route) {\n const componentKey = this._handleRouteProp(route, 'componentKey');\n if (componentKey) return componentKey;\n // name\n const name = this.$router.getRealRouteName(route.name);\n // path\n if (!name) return route.path;\n // name: nameOnly\n if (route.meta.componentKeyMode === 'nameOnly') return name;\n // name: withParams\n return route.path;\n }\n _resetAllPageDirty() {\n const tabItems = [];\n for (const tab of this.tabs) {\n if (!tab.items) continue;\n for (const tabItem of tab.items) {\n if (tabItem.pageMeta?.pageDirty) {\n tabItems.push([tab.tabKey, tabItem.componentKey]);\n }\n }\n }\n for (const [tabKey, componentKey] of tabItems) {\n this.updateTabItemPageMeta(tabKey, componentKey, {\n pageDirty: false\n });\n }\n }\n}) || _class) || _class);","import { RouteLocationNormalizedLoadedGeneric } from '@cabloy/vue-router';\nimport { Use } from 'zova';\nimport { Controller } from 'zova-module-a-bean';\nimport {\n BeanRouterViewBase,\n IPageMeta,\n IRouterViewPropsBase,\n IRouteViewRouteMeta,\n} from 'zova-module-a-router';\n\nimport type { ModelTabs } from '../../model/tabs.js';\n\nexport interface ControllerRouterViewTabsProps extends IRouterViewPropsBase {}\n\n@Controller()\nexport class ControllerRouterViewTabs extends BeanRouterViewBase {\n static $propsDefault = {};\n\n @Use({ injectionScope: 'skipSelf' })\n $$modelTabs: ModelTabs;\n\n public backRoute(route: RouteLocationNormalizedLoadedGeneric) {\n this.$$modelTabs.backRoute(route);\n return true;\n }\n\n public forwardRoute(route: RouteLocationNormalizedLoadedGeneric) {\n this.$$modelTabs.forwardRoute(route);\n return true;\n }\n\n public setPageMeta(route: RouteLocationNormalizedLoadedGeneric, pageMeta: IPageMeta) {\n this.$$modelTabs.setPageMeta(route, pageMeta);\n }\n\n protected prepareRouteMeta(route: RouteLocationNormalizedLoadedGeneric): IRouteViewRouteMeta {\n return this.$$modelTabs.prepareRouteMeta(route);\n }\n\n protected getKeepAliveInclude(): string[] | undefined {\n return this.$$modelTabs.keepAliveInclude;\n }\n}\n","import { defineComponent } from 'vue';\nimport { prepareComponentOptions, useController } from 'zova';\nimport { ControllerRouterViewTabs } from '../../component/routerViewTabs/controller.jsx';\nexport const ZRouterViewTabs = defineComponent(_props => {\n useController(ControllerRouterViewTabs, undefined, undefined);\n return () => {};\n}, prepareComponentOptions());","var _dec, _dec2, _class;\nimport { \"BeanInfo\" as __z_BeanInfo } from \"zova\";\n// eslint-disable\n/** model: begin */\nexport * from '../model/tabs.js';\nimport 'zova-module-a-model';\n/** model: end */\n/** model: begin */\nimport { ModelTabs } from '../model/tabs.js';\nimport 'zova';\n/** model: end */\n/** controller: begin */\nexport * from '../component/routerViewTabs/controller.jsx';\nimport 'zova';\n/** controller: end */\n/** controller: begin */\nimport { ControllerRouterViewTabs } from '../component/routerViewTabs/controller.jsx';\nimport 'zova';\n/** controller: end */\n\n/** components: begin */\nexport * from './component/routerViewTabs.js';\nimport { ZRouterViewTabs } from './component/routerViewTabs.js';\nexport const components = {\n 'routerViewTabs': ZRouterViewTabs\n};\nimport 'zova';\n/** components: end */\n/** scope: begin */\nimport { BeanScopeBase } from 'zova';\nimport { Scope } from 'zova-module-a-bean';\nexport let ScopeModuleARoutertabs = (_dec = Scope(), _dec2 = __z_BeanInfo({\n module: \"a-routertabs\"\n}), _dec(_class = _dec2(_class = class ScopeModuleARoutertabs extends BeanScopeBase {}) || _class) || _class);\nimport 'zova';\n\n/** scope: end */"],"mappings":"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"}
|
package/dist/model/tabs.d.ts
CHANGED
|
@@ -30,6 +30,12 @@ export declare class ModelTabs extends BeanModelBase {
|
|
|
30
30
|
activeTab(tabKey?: string): Promise<void>;
|
|
31
31
|
activeTabItem(tabKey?: string, componentKey?: string): Promise<void>;
|
|
32
32
|
findTab(tabKey?: string): [number, RouteTab | undefined];
|
|
33
|
+
private _getInsertIndexForNewTab;
|
|
34
|
+
private _getLastAffixTabIndex;
|
|
35
|
+
private _findTabItemIndex;
|
|
36
|
+
private _getCurrentTabItemIndex;
|
|
37
|
+
private _getInsertIndexForNewTabItem;
|
|
38
|
+
private _moveAnchorItemFirst;
|
|
33
39
|
pruneTabs(): Promise<void>;
|
|
34
40
|
pruneTabItems(tabKey?: string): Promise<void>;
|
|
35
41
|
private _checkIfTabNeedUpdate;
|
package/dist/model/tabs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/model/tabs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAmB,MAAM,qBAAqB,CAAC;AAEnF,OAAO,EAEL,oCAAoC,EACrC,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,aAAa,EAAS,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAuB,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3F,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,QAAQ,EACR,eAAe,EACf,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,iBAAkB,SAAQ,sBAAsB,EAAE,oBAAoB;CAAG;AAE1F,qBAMa,SAAU,SAAQ,aAAa;IAC1C,WAAW,EAAE,gBAAgB,CAAC;IAC9B,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,CAAC,kBAAkB,CAAe;cAEzB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAyElE,SAAS,CAAC,WAAW;IAMrB,IAAI,KAAK,wBAER;IAGD,MAAM,CAAC,GAAG,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO;IASxD,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO;
|
|
1
|
+
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/model/tabs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAmB,MAAM,qBAAqB,CAAC;AAEnF,OAAO,EAEL,oCAAoC,EACrC,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,aAAa,EAAS,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAuB,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3F,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,QAAQ,EACR,eAAe,EACf,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,iBAAkB,SAAQ,sBAAsB,EAAE,oBAAoB;CAAG;AAE1F,qBAMa,SAAU,SAAQ,aAAa;IAC1C,WAAW,EAAE,gBAAgB,CAAC;IAC9B,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,CAAC,kBAAkB,CAAe;cAEzB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAyElE,SAAS,CAAC,WAAW;IAMrB,IAAI,KAAK,wBAER;IAGD,MAAM,CAAC,GAAG,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO;IASxD,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO;IAkDlE,gBAAgB;IAIhB,iBAAiB,CAAC,WAAW,CAAC,EAAE,eAAe,EAAE;IAOjD,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,eAAe;IAe3D,qBAAqB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,SAAS;IAuB5E,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO;IAyBjD,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO;IAyClF,qBAAqB,CAAC,QAAQ,EAAE,MAAM;IAYtC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,iBAAiB,CAAC;IAoCnC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM;IAazB,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;IAW1D,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IAOxD,OAAO,CAAC,wBAAwB;IAehC,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,uBAAuB;IAK/B,OAAO,CAAC,4BAA4B;IAQpC,OAAO,CAAC,oBAAoB;IAOtB,SAAS;IAoBT,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM;IAwBnC,OAAO,CAAC,qBAAqB;IA0B7B,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,eAAe;IAWvB,SAAS,CAAC,KAAK,EAAE,oCAAoC;IAKrD,YAAY,CAAC,KAAK,EAAE,oCAAoC;IAKjD,WAAW,CAAC,KAAK,EAAE,oCAAoC,EAAE,QAAQ,EAAE,SAAS;IAKnF,gBAAgB,CAAC,KAAK,EAAE,oCAAoC,GAAG,mBAAmB;IAalF,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,6BAA6B;IAarC,OAAO,CAAC,kBAAkB;CAc3B"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zova-module-a-routertabs",
|
|
3
|
-
"version": "5.1.
|
|
4
|
-
"gitHead": "
|
|
3
|
+
"version": "5.1.32",
|
|
4
|
+
"gitHead": "1a39e8008e1b48001cfeff475ddd53a2a0d867c4",
|
|
5
5
|
"description": "routertabs",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"Zova Module"
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"tsc:publish": "npm run clean && node ../../../../../packages-cli/cli/src/bin/zova.ts :bin:buildModule --sourcemap && tsc -p tsconfig.build.json",
|
|
28
28
|
"prepublishOnly": "npm run tsc:publish",
|
|
29
29
|
"prepack": "clean-package",
|
|
30
|
-
"postpack": "clean-package restore
|
|
30
|
+
"postpack": "clean-package restore"
|
|
31
31
|
},
|
|
32
32
|
"title": "a-routertabs"
|
|
33
33
|
}
|
package/src/model/tabs.ts
CHANGED
|
@@ -156,15 +156,10 @@ export class ModelTabs extends BeanModelBase {
|
|
|
156
156
|
updatedAt: Date.now(),
|
|
157
157
|
info: tabInfo,
|
|
158
158
|
};
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
} else {
|
|
164
|
-
this.tabs = mutate(this.tabs, copyState => {
|
|
165
|
-
copyState.splice(this.tabCurrentIndex + 1, 0, tabNew);
|
|
166
|
-
});
|
|
167
|
-
}
|
|
159
|
+
const insertIndex = this._getInsertIndexForNewTab(tabNew);
|
|
160
|
+
this.tabs = mutate(this.tabs, copyState => {
|
|
161
|
+
copyState.splice(insertIndex, 0, tabNew);
|
|
162
|
+
});
|
|
168
163
|
// need not await
|
|
169
164
|
this.pruneTabs();
|
|
170
165
|
} else {
|
|
@@ -324,17 +319,15 @@ export class ModelTabs extends BeanModelBase {
|
|
|
324
319
|
keepAlive: tab.keepAlive,
|
|
325
320
|
updatedAt: Date.now(),
|
|
326
321
|
};
|
|
327
|
-
const
|
|
328
|
-
if (
|
|
329
|
-
|
|
322
|
+
const itemIndex = this._findTabItemIndex(items, tab.componentKey);
|
|
323
|
+
if (itemIndex === -1) {
|
|
324
|
+
const insertIndex = this._getInsertIndexForNewTabItem(tabOld, items);
|
|
325
|
+
items.splice(insertIndex, 0, tabItem);
|
|
330
326
|
} else {
|
|
331
|
-
const tabItemNew: IRouteViewRouteItem = { ...items[
|
|
332
|
-
items.splice(
|
|
327
|
+
const tabItemNew: IRouteViewRouteItem = { ...items[itemIndex], ...tabItem };
|
|
328
|
+
items.splice(itemIndex, 1, tabItemNew);
|
|
333
329
|
}
|
|
334
|
-
|
|
335
|
-
items.sort(
|
|
336
|
-
(a, b) => (a.componentKey === tabKey ? 0 : 1) - (b.componentKey === tabKey ? 0 : 1),
|
|
337
|
-
);
|
|
330
|
+
this._moveAnchorItemFirst(items, tabKey);
|
|
338
331
|
}
|
|
339
332
|
const tabNew: RouteTab = {
|
|
340
333
|
...tabOld,
|
|
@@ -379,6 +372,55 @@ export class ModelTabs extends BeanModelBase {
|
|
|
379
372
|
return [index, this.tabs[index]];
|
|
380
373
|
}
|
|
381
374
|
|
|
375
|
+
private _getInsertIndexForNewTab(tabNew: RouteTab) {
|
|
376
|
+
const lastAffixTabIndex = this._getLastAffixTabIndex();
|
|
377
|
+
if (this.tabCurrentIndex === -1) {
|
|
378
|
+
return lastAffixTabIndex + 1;
|
|
379
|
+
}
|
|
380
|
+
if (tabNew.affix) {
|
|
381
|
+
return lastAffixTabIndex + 1;
|
|
382
|
+
}
|
|
383
|
+
const tabCurrent = this.tabs[this.tabCurrentIndex];
|
|
384
|
+
if (tabCurrent?.affix) {
|
|
385
|
+
return lastAffixTabIndex + 1;
|
|
386
|
+
}
|
|
387
|
+
return this.tabCurrentIndex + 1;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
private _getLastAffixTabIndex() {
|
|
391
|
+
let lastAffixTabIndex = -1;
|
|
392
|
+
for (let index = 0; index < this.tabs.length; index++) {
|
|
393
|
+
if (!this.tabs[index].affix) break;
|
|
394
|
+
lastAffixTabIndex = index;
|
|
395
|
+
}
|
|
396
|
+
return lastAffixTabIndex;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
private _findTabItemIndex(items: IRouteViewRouteItem[], componentKey?: string) {
|
|
400
|
+
if (!componentKey) return -1;
|
|
401
|
+
return items.findIndex(item => item.componentKey === componentKey);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
private _getCurrentTabItemIndex(tab: RouteTab, items: IRouteViewRouteItem[]) {
|
|
405
|
+
if (this.tabKeyCurrent !== tab.tabKey) return -1;
|
|
406
|
+
return this._findTabItemIndex(items, this.componentKeyCurrent);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
private _getInsertIndexForNewTabItem(tab: RouteTab, items: IRouteViewRouteItem[]) {
|
|
410
|
+
const indexCurrentTabItem = this._getCurrentTabItemIndex(tab, items);
|
|
411
|
+
if (indexCurrentTabItem > -1) {
|
|
412
|
+
return indexCurrentTabItem + 1;
|
|
413
|
+
}
|
|
414
|
+
return items.length;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
private _moveAnchorItemFirst(items: IRouteViewRouteItem[], tabKey: string) {
|
|
418
|
+
const indexAnchor = items.findIndex(item => item.componentKey === tabKey);
|
|
419
|
+
if (indexAnchor <= 0) return;
|
|
420
|
+
const [anchorItem] = items.splice(indexAnchor, 1);
|
|
421
|
+
items.unshift(anchorItem);
|
|
422
|
+
}
|
|
423
|
+
|
|
382
424
|
async pruneTabs() {
|
|
383
425
|
let max = this.tabsOptions.max;
|
|
384
426
|
if (max === undefined || max === -1) return;
|