smart-admin-web 10.21.0 → 10.22.0

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.
Files changed (44) hide show
  1. package/dist/assets/icons/ph-subset.json.js +1 -1
  2. package/dist/composables/authMenuRoute.d.ts +10 -0
  3. package/dist/composables/authMenuRoute.js +39 -23
  4. package/dist/composables/authMenuRoute.js.map +1 -1
  5. package/dist/composables/useModule.d.ts +3 -1
  6. package/dist/composables/useModule.js +44 -32
  7. package/dist/composables/useModule.js.map +1 -1
  8. package/dist/index.js +49 -47
  9. package/dist/layouts/components/SideNav.vue.js +2 -2
  10. package/dist/layouts/components/SideNav2.vue.js.map +1 -1
  11. package/dist/lib/runtime.js +1 -1
  12. package/dist/locales/en-US.d.ts +6 -0
  13. package/dist/locales/en-US.js +9 -2
  14. package/dist/locales/en-US.js.map +1 -1
  15. package/dist/locales/zh-CN.d.ts +6 -0
  16. package/dist/locales/zh-CN.js +9 -2
  17. package/dist/locales/zh-CN.js.map +1 -1
  18. package/dist/style.css +1 -1
  19. package/dist/utils/tree.d.ts +15 -0
  20. package/dist/utils/tree.js +43 -29
  21. package/dist/utils/tree.js.map +1 -1
  22. package/dist/utils/treeCard.d.ts +6 -0
  23. package/dist/utils/treeCard.js +9 -0
  24. package/dist/utils/treeCard.js.map +1 -0
  25. package/dist/views/error/404.vue.js +2 -2
  26. package/dist/views/error/4042.vue.js +81 -24
  27. package/dist/views/error/4042.vue.js.map +1 -1
  28. package/dist/views/login/components/LoginDesk.vue.js +2 -2
  29. package/dist/views/login/components/LoginDesk2.vue.js.map +1 -1
  30. package/dist/views/login/components/LoginHeroPanel.vue.js +2 -2
  31. package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -1
  32. package/dist/views/system/job-monitor/index.vue.js +2 -2
  33. package/dist/views/system/job-monitor/index2.vue.js +46 -46
  34. package/dist/views/system/job-monitor/index2.vue.js.map +1 -1
  35. package/dist/views/system/menu/index.vue.js +2 -2
  36. package/dist/views/system/menu/index2.vue.js +161 -150
  37. package/dist/views/system/menu/index2.vue.js.map +1 -1
  38. package/dist/views/system/org/index.vue.js +2 -2
  39. package/dist/views/system/org/index2.vue.js +182 -176
  40. package/dist/views/system/org/index2.vue.js.map +1 -1
  41. package/dist/views/system/user/index.vue.js +2 -2
  42. package/dist/views/system/user/index2.vue.js +348 -317
  43. package/dist/views/system/user/index2.vue.js.map +1 -1
  44. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -3,13 +3,13 @@ import { createSmartAdmin as s } from "./createSmartAdmin.js";
3
3
  /* empty css */
4
4
  /* empty css */
5
5
  /* empty css */
6
- import { ApiError as f, aiProviderApi as m, aiUsageApi as u, authApi as n, cacheApi as d, callApi as x, configApi as c, dashboardApi as A, dayRange as S, dictAdminApi as T, dictApi as g, externalAuthApi as C, fileApi as E, highSensApi as h, jobApi as _, listQuery as M, logApi as P, menuApi as I, mfaApi as b, moduleApi as B, monitorApi as R, normalizeCommit as O, normalizePreview as D, noticeApi as y, orgApi as L, pageParams as w, personalApi as F, positionApi as U, recycleApi as v, roleApi as N, sessionApi as H, toPage as k, toWireRows as G, unwrap as J, unwrapDownload as z, userApi as V } from "./api/index.js";
6
+ import { ApiError as f, aiProviderApi as m, aiUsageApi as u, authApi as n, cacheApi as d, callApi as x, configApi as c, dashboardApi as A, dayRange as S, dictAdminApi as T, dictApi as g, externalAuthApi as C, fileApi as E, highSensApi as h, jobApi as _, listQuery as M, logApi as I, menuApi as P, mfaApi as b, moduleApi as B, monitorApi as R, normalizeCommit as O, normalizePreview as D, noticeApi as y, orgApi as L, pageParams as w, personalApi as F, positionApi as U, recycleApi as v, roleApi as N, sessionApi as H, toPage as k, toWireRows as G, unwrap as J, unwrapDownload as z, userApi as V } from "./api/index.js";
7
7
  import { DEFAULT_TIMEOUT_MS as X, LONG_TIMEOUT_MS as K, client as Y, createApiClient as j, ensureAccessToken as Z, readCookie as q, refreshOnce as Q } from "./api/client.js";
8
8
  import { AI_USAGE_GROUP_BY as ee, AI_USAGE_SOURCE as re, DataScopeType as oe, DuplicateStrategy as te, JobConcurrencyMode as ae, JobFireMode as ie, JobHandlerKind as pe, JobMisfireStrategy as se, JobRunStatus as le, JobStatus as fe, JobTriggerKind as me, NoticeType as ue, ReceiverType as ne, UserMenuEffect as de, UserMenuGrantStatus as xe } from "./types/api.js";
9
9
  import { MenuType as Ae, PERMISSION_SEPARATOR as Se, joinPermission as Te, splitPermission as ge, toMenuInput as Ce } from "./types/menu.js";
10
10
  import { useAppStore as he } from "./stores/app.js";
11
11
  import { useAuthStore as Me } from "./stores/auth.js";
12
- import { useDictOptions as Ie, useDictStore as be } from "./stores/dict.js";
12
+ import { useDictOptions as Pe, useDictStore as be } from "./stores/dict.js";
13
13
  import { useTabsStore as Re } from "./stores/tabs.js";
14
14
  import { useUserStore as De } from "./stores/user.js";
15
15
  import { registerDynamic as Le, resetRouter as we, router as Fe } from "./router/index.js";
@@ -29,7 +29,7 @@ import { useLayoutMenu as Ar } from "./composables/useLayoutMenu.js";
29
29
  import { menuBadge as Tr, registerMenuBadge as gr } from "./composables/useMenuBadge.js";
30
30
  import { useMenuFlat as Er } from "./composables/useMenuFlat.js";
31
31
  import { useModule as _r } from "./composables/useModule.js";
32
- import { noticeActionButtonType as Pr, useNoticeAction as Ir } from "./composables/useNoticeAction.js";
32
+ import { noticeActionButtonType as Ir, useNoticeAction as Pr } from "./composables/useNoticeAction.js";
33
33
  import { usePageTitle as Br } from "./composables/usePageTitle.js";
34
34
  import { beginVoluntaryLogout as Or, noticeBus as Dr, onRealtime as yr, useRealtime as Lr } from "./composables/useRealtime.js";
35
35
  import { loadSite as Fr, useSite as Ur } from "./composables/useSite.js";
@@ -53,7 +53,7 @@ import { default as So } from "./components/DictSelect/index.vue.js";
53
53
  import { default as go } from "./components/DictTag/index.vue.js";
54
54
  import { default as Eo } from "./components/ErrorBoundary/index.vue.js";
55
55
  import { default as _o } from "./components/ExportColumnsModal/index.vue.js";
56
- import { default as Po } from "./components/FileUpload/index.vue.js";
56
+ import { default as Io } from "./components/FileUpload/index.vue.js";
57
57
  import { default as bo } from "./components/FormContainer/index.vue.js";
58
58
  /* empty css */
59
59
  import { default as Ro } from "./components/IconPicker/index.vue.js";
@@ -78,28 +78,28 @@ import { triggerBlobDownload as ut } from "./utils/download.js";
78
78
  import { translateError as dt, translateErrorDetail as xt } from "./utils/error.js";
79
79
  import { fmtBytes as At, fmtDateTime as St, operatorText as Tt } from "./utils/format.js";
80
80
  import { IMPORT_DUPLICATE_IN_DB as Ct, hardErrorsOf as Et, isDuplicateOnly as ht, isHardError as _t } from "./utils/importDup.js";
81
- import { BRAND_CODES as Pt, LINK_BY_ACCOUNT_CODES as It, OFFICIAL_TYPES as bt, PREVIEW_ALL_SSO_BRANDS as Bt, SSO_VISIBLE_MAX as Rt, brandDisplayName as Ot, buildConfigProviderRows as Dt, claimWeComAutoLogin as yt, isBrandCode as Lt, isIconifyName as wt, mergeBindingRows as Ft, previewAllBrandProviders as Ut, resolveProviderIcon as vt, splitLoginProviders as Nt } from "./utils/oauthBrand.js";
81
+ import { BRAND_CODES as It, LINK_BY_ACCOUNT_CODES as Pt, OFFICIAL_TYPES as bt, PREVIEW_ALL_SSO_BRANDS as Bt, SSO_VISIBLE_MAX as Rt, brandDisplayName as Ot, buildConfigProviderRows as Dt, claimWeComAutoLogin as yt, isBrandCode as Lt, isIconifyName as wt, mergeBindingRows as Ft, previewAllBrandProviders as Ut, resolveProviderIcon as vt, splitLoginProviders as Nt } from "./utils/oauthBrand.js";
82
82
  import { SEARCH_ACTIONS as kt, createClientFilterFetcher as Gt, createFlatFilterSerializer as Jt, deriveHeaderFilters as zt, flatFilterSerializer as Vt, flatSearchOf as Wt, loadWithinServerMax as Xt, passthroughFilterSerializer as Kt, presetEqualFilter as Yt } from "./utils/tableFilter.js";
83
83
  import { TABLE_MIN_ROW_HEIGHT as Zt, TABLE_TOOLBAR as qt } from "./utils/tableToolbar.js";
84
- import { buildTree as $t, collectSubtreeIds as ea, expandableIds as ra, filterTree as oa } from "./utils/tree.js";
85
- import { parseUserAgent as aa, uaSummary as ia } from "./utils/ua.js";
86
- import { FULLSCREEN_PATH_PREFIX as sa, isFullscreenPath as la, isHttpUrl as fa, trimTrailingSlashes as ma } from "./utils/url.js";
87
- import { default as na } from "./assets/icons/ph-subset.json.js";
88
- import { ACCENTS as xa } from "./theme/accents.js";
89
- import { btnGrad as Aa, derivePrimary as Sa, glowSh as Ta, mix as ga, rgba as Ca } from "./theme/mix.js";
90
- import { buildThemeOverrides as ha } from "./theme/naive-theme.js";
91
- import { setupMarkdown as Ma, withXssPlugin as Pa } from "./lib/markdown.js";
92
- import { LoadingBarBridge as ba, loadingBar as Ba } from "./lib/loadingBar.js";
93
- import { classifyNoticeAction as Oa, isSiteRelativeUrl as Da, noticeActionLabel as ya } from "./lib/noticeActions.js";
94
- import { registerViews as wa, viewComponentPaths as Fa } from "./router/viewRegistry.js";
84
+ import { buildTree as $t, collectSubtreeIds as ea, expandableIds as ra, filterTree as oa, flattenTree as ta, rootExpandableIds as aa } from "./utils/tree.js";
85
+ import { parseUserAgent as pa, uaSummary as sa } from "./utils/ua.js";
86
+ import { FULLSCREEN_PATH_PREFIX as fa, isFullscreenPath as ma, isHttpUrl as ua, trimTrailingSlashes as na } from "./utils/url.js";
87
+ import { default as xa } from "./assets/icons/ph-subset.json.js";
88
+ import { ACCENTS as Aa } from "./theme/accents.js";
89
+ import { btnGrad as Ta, derivePrimary as ga, glowSh as Ca, mix as Ea, rgba as ha } from "./theme/mix.js";
90
+ import { buildThemeOverrides as Ma } from "./theme/naive-theme.js";
91
+ import { setupMarkdown as Pa, withXssPlugin as ba } from "./lib/markdown.js";
92
+ import { LoadingBarBridge as Ra, loadingBar as Oa } from "./lib/loadingBar.js";
93
+ import { classifyNoticeAction as ya, isSiteRelativeUrl as La, noticeActionLabel as wa } from "./lib/noticeActions.js";
94
+ import { registerViews as Ua, viewComponentPaths as va } from "./router/viewRegistry.js";
95
95
  export {
96
- xa as ACCENTS,
96
+ Aa as ACCENTS,
97
97
  ee as AI_USAGE_GROUP_BY,
98
98
  re as AI_USAGE_SOURCE,
99
99
  f as ApiError,
100
100
  Zr as ApiSelect,
101
101
  rt as AppIcon,
102
- Pt as BRAND_CODES,
102
+ It as BRAND_CODES,
103
103
  oo as BarChart,
104
104
  st as BrandIcon,
105
105
  ar as COMPACT_MAX_HEIGHT,
@@ -117,8 +117,8 @@ export {
117
117
  te as DuplicateStrategy,
118
118
  Eo as ErrorBoundary,
119
119
  _o as ExportColumnsModal,
120
- sa as FULLSCREEN_PATH_PREFIX,
121
- Po as FileUpload,
120
+ fa as FULLSCREEN_PATH_PREFIX,
121
+ Io as FileUpload,
122
122
  bo as FormContainer,
123
123
  Ct as IMPORT_DUPLICATE_IN_DB,
124
124
  Ro as IconPicker,
@@ -131,10 +131,10 @@ export {
131
131
  fe as JobStatus,
132
132
  me as JobTriggerKind,
133
133
  Lo as JsonEditor,
134
- It as LINK_BY_ACCOUNT_CODES,
134
+ Pt as LINK_BY_ACCOUNT_CODES,
135
135
  K as LONG_TIMEOUT_MS,
136
136
  eo as LineChart,
137
- ba as LoadingBarBridge,
137
+ Ra as LoadingBarBridge,
138
138
  Fo as MarkdownEditor,
139
139
  vo as MarkdownView,
140
140
  tt as MenuSearch,
@@ -165,15 +165,15 @@ export {
165
165
  n as authApi,
166
166
  Or as beginVoluntaryLogout,
167
167
  Ot as brandDisplayName,
168
- Aa as btnGrad,
168
+ Ta as btnGrad,
169
169
  Dt as buildConfigProviderRows,
170
170
  er as buildRoutesForModule,
171
- ha as buildThemeOverrides,
171
+ Ma as buildThemeOverrides,
172
172
  $t as buildTree,
173
173
  d as cacheApi,
174
174
  x as callApi,
175
175
  yt as claimWeComAutoLogin,
176
- Oa as classifyNoticeAction,
176
+ ya as classifyNoticeAction,
177
177
  Qe as clearClientCache,
178
178
  Y as client,
179
179
  ea as collectSubtreeIds,
@@ -185,7 +185,7 @@ export {
185
185
  A as dashboardApi,
186
186
  S as dayRange,
187
187
  zt as deriveHeaderFilters,
188
- Sa as derivePrimary,
188
+ ga as derivePrimary,
189
189
  Ze as describeMenuRoute,
190
190
  T as dictAdminApi,
191
191
  g as dictApi,
@@ -196,48 +196,49 @@ export {
196
196
  oa as filterTree,
197
197
  Vt as flatFilterSerializer,
198
198
  Wt as flatSearchOf,
199
+ ta as flattenTree,
199
200
  At as fmtBytes,
200
201
  St as fmtDateTime,
201
- Ta as glowSh,
202
+ Ca as glowSh,
202
203
  Et as hardErrorsOf,
203
204
  h as highSensApi,
204
205
  He as i18n,
205
206
  Lt as isBrandCode,
206
207
  pr as isCompactSize,
207
208
  ht as isDuplicateOnly,
208
- la as isFullscreenPath,
209
+ ma as isFullscreenPath,
209
210
  _t as isHardError,
210
- fa as isHttpUrl,
211
+ ua as isHttpUrl,
211
212
  wt as isIconifyName,
212
- Da as isSiteRelativeUrl,
213
+ La as isSiteRelativeUrl,
213
214
  _ as jobApi,
214
215
  Te as joinPermission,
215
- na as kernelIconSet,
216
+ xa as kernelIconSet,
216
217
  M as listQuery,
217
218
  Fr as loadSite,
218
219
  Xt as loadWithinServerMax,
219
- Ba as loadingBar,
220
- P as logApi,
221
- I as menuApi,
220
+ Oa as loadingBar,
221
+ I as logApi,
222
+ P as menuApi,
222
223
  Tr as menuBadge,
223
224
  Ve as menuTitleKey,
224
225
  Ft as mergeBindingRows,
225
226
  b as mfaApi,
226
- ga as mix,
227
+ Ea as mix,
227
228
  B as moduleApi,
228
229
  R as monitorApi,
229
230
  ve as namedPage,
230
231
  O as normalizeCommit,
231
232
  D as normalizePreview,
232
- Pr as noticeActionButtonType,
233
- ya as noticeActionLabel,
233
+ Ir as noticeActionButtonType,
234
+ wa as noticeActionLabel,
234
235
  y as noticeApi,
235
236
  Dr as noticeBus,
236
237
  yr as onRealtime,
237
238
  Tt as operatorText,
238
239
  L as orgApi,
239
240
  w as pageParams,
240
- aa as parseUserAgent,
241
+ pa as parseUserAgent,
241
242
  Kt as passthroughFilterSerializer,
242
243
  F as personalApi,
243
244
  U as positionApi,
@@ -251,14 +252,15 @@ export {
251
252
  ke as registerLocales,
252
253
  gr as registerMenuBadge,
253
254
  We as registerMenuTitles,
254
- wa as registerViews,
255
+ Ua as registerViews,
255
256
  we as resetRouter,
256
257
  vt as resolveProviderIcon,
257
- Ca as rgba,
258
+ ha as rgba,
258
259
  N as roleApi,
260
+ aa as rootExpandableIds,
259
261
  Fe as router,
260
262
  H as sessionApi,
261
- Ma as setupMarkdown,
263
+ Pa as setupMarkdown,
262
264
  Nt as splitLoginProviders,
263
265
  ge as splitPermission,
264
266
  Ge as t,
@@ -269,8 +271,8 @@ export {
269
271
  xt as translateErrorDetail,
270
272
  Xe as translateMenuTitle,
271
273
  ut as triggerBlobDownload,
272
- ma as trimTrailingSlashes,
273
- ia as uaSummary,
274
+ na as trimTrailingSlashes,
275
+ sa as uaSummary,
274
276
  J as unwrap,
275
277
  z as unwrapDownload,
276
278
  ft as uploadChunked,
@@ -279,14 +281,14 @@ export {
279
281
  or as useBatchDelete,
280
282
  sr as useCompactScreen,
281
283
  fr as useConfirm,
282
- Ie as useDictOptions,
284
+ Pe as useDictOptions,
283
285
  be as useDictStore,
284
286
  ur as useFullscreenToggle,
285
287
  xr as useHeaderTools,
286
288
  Ar as useLayoutMenu,
287
289
  Er as useMenuFlat,
288
290
  _r as useModule,
289
- Ir as useNoticeAction,
291
+ Pr as useNoticeAction,
290
292
  Br as usePageTitle,
291
293
  Lr as useRealtime,
292
294
  Vr as useShellBreakpoint,
@@ -300,8 +302,8 @@ export {
300
302
  Yr as useVisualViewportHeight,
301
303
  V as userApi,
302
304
  Ye as vAuth,
303
- Fa as viewComponentPaths,
305
+ va as viewComponentPaths,
304
306
  Je as withExt,
305
- Pa as withXssPlugin
307
+ ba as withXssPlugin
306
308
  };
307
309
  //# sourceMappingURL=index.js.map
@@ -1,8 +1,8 @@
1
1
  import o from "./SideNav2.vue.js";
2
2
  /* empty css */
3
3
  import t from "../../_virtual/_plugin-vue_export-helper.js";
4
- const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-0b541618"]]);
4
+ const f = /* @__PURE__ */ t(o, [["__scopeId", "data-v-a4f9dd94"]]);
5
5
  export {
6
- p as default
6
+ f as default
7
7
  };
8
8
  //# sourceMappingURL=SideNav.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SideNav2.vue.js","sources":["../../../src/layouts/components/SideNav.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 侧栏薄壳:对 n-menu 的展示层封装,default.vue 复用于 4 处——完整树/二级子树/一级图标 rail/移动抽屉。\n// collapsed(用户折叠开关) 与 rail(一级细栏,恒图标态、固定窄宽、无品牌字) 是两条独立的\"收窄\"来源,\n// 二者任一为真都令 n-menu 进入 collapsed;rail 另用更窄的 collapsed-width。\n// 玻璃底由外层 aside / 抽屉提供,这里保持透明,不自带底色(否则两层半透明叠出一块灰)。\nimport { computed } from 'vue'\nimport { NInput, NMenu, NScrollbar, type MenuOption } from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport { useI18n } from 'vue-i18n'\nimport SmartLogo from '#/components/SmartLogo.vue'\nimport { useSite } from '#/composables/useSite'\n\nconst { site } = useSite()\nconst { t } = useI18n()\n\nconst props = defineProps<{\n options: MenuOption[]\n value?: string\n collapsed?: boolean\n rail?: boolean // 细图标栏(一级),强制图标态、无品牌文字\n showBrand?: boolean\n showSearch?: boolean // 品牌下方的菜单搜索入口(只读输入框,点开 Ctrl+K 同一个面板)\n}>()\nconst emit = defineEmits<{ select: [key: string]; search: [] }>()\n\nconst iconOnly = computed(() => props.collapsed || props.rail)\n</script>\n\n<template>\n <div class=\"sidenav\" :class=\"{ rail: props.rail, 'icon-only': iconOnly }\">\n <div v-if=\"props.showBrand\" class=\"brand\">\n <SmartLogo :size=\"28\" />\n <span v-show=\"!iconOnly\" class=\"brand-name\">\n {{ site.title }}\n </span>\n </div>\n <div v-if=\"props.showSearch && !iconOnly\" class=\"side-search\">\n <n-input\n size=\"small\"\n readonly\n class=\"search-input\"\n :placeholder=\"t('app.search')\"\n :aria-label=\"t('app.search')\"\n @click=\"emit('search')\"\n @keydown.enter=\"emit('search')\"\n >\n <template #prefix>\n <Icon icon=\"ph:magnifying-glass\" :width=\"15\" class=\"search-ico\" />\n </template>\n </n-input>\n </div>\n <n-scrollbar class=\"side-menu\">\n <n-menu\n :options=\"props.options\"\n :value=\"props.value\"\n :collapsed=\"iconOnly\"\n :collapsed-width=\"props.rail ? 64 : 68\"\n :collapsed-icon-size=\"20\"\n :icon-size=\"18\"\n :indent=\"14\"\n :root-indent=\"14\"\n @update:value=\"(k: string) => emit('select', k)\"\n />\n </n-scrollbar>\n </div>\n</template>\n\n<style scoped>\n.sidenav {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: transparent;\n overflow: hidden;\n}\n.brand {\n display: flex;\n align-items: center;\n gap: 10px;\n height: 50px;\n padding: 0 18px;\n color: var(--text-1);\n overflow: hidden;\n white-space: nowrap;\n flex-shrink: 0;\n}\n.icon-only .brand {\n padding: 0;\n justify-content: center;\n}\n.brand-name {\n min-width: 0;\n font-size: 15px;\n font-weight: 600;\n letter-spacing: -0.02em;\n line-height: 1.2;\n color: var(--text-1); /* 品牌文字跟随主题文字色:固定深色在暗色下看不清 */\n}\n.side-search {\n flex-shrink: 0;\n padding: 0 12px 12px;\n}\n.search-input {\n cursor: pointer;\n}\n/* 只读输入框:光标也是手型,点哪都能打开面板 */\n.search-input :deep(.n-input__input-el) {\n cursor: pointer;\n}\n.search-ico {\n color: var(--text-3);\n}\n\n.side-menu {\n flex: 1;\n min-height: 0;\n /* 菜单滚到底时最后一行淡出,不被圆角面板的下沿硬切 */\n -webkit-mask-image: linear-gradient(180deg, #000 calc(100% - 22px), transparent);\n mask-image: linear-gradient(180deg, #000 calc(100% - 22px), transparent);\n}\n/* 选中项只靠行底色 + 强调色文字 / 图标 + 加粗到 600 表达(与横向页签栏的选中页签同一字重),不画左侧竖条 */\n.sidenav :deep(.n-menu-item-content--selected .n-menu-item-content-header) {\n font-weight: 600;\n}\n</style>\n"],"names":["site","useSite","t","useI18n","props","__props","emit","__emit","iconOnly","computed","_createElementBlock","_openBlock","_hoisted_1","_createVNode","SmartLogo","_withDirectives","_createElementVNode","_toDisplayString","_unref","_hoisted_2","NInput","Icon","NScrollbar","NMenu","_cache","k"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAYA,UAAM,EAAE,MAAAA,EAAA,IAASC,EAAA,GACX,EAAE,GAAAC,EAAA,IAAMC,EAAA,GAERC,IAAQC,GAQRC,IAAOC,GAEPC,IAAWC,EAAS,MAAML,EAAM,aAAaA,EAAM,IAAI;2BAI3DM,EAmCM,OAAA;AAAA,MAnCD,UAAM,WAAS,EAAA,MAAiBN,EAAM,mBAAmBI,EAAA,OAAQ,CAAA;AAAA,IAAA;MACzDJ,EAAM,aAAjBO,EAAA,GAAAD,EAKM,OALNE,GAKM;AAAA,QAJJC,EAAwBC,GAAA,EAAZ,MAAM,IAAE;AAAA,QACpBC,EAAAC,EAEO,UAFkB,OAAM,aAAA,GAAYC,EACtCC,EAAAlB,CAAA,EAAK,KAAK,GAAA,GAAA,GAAA;AAAA,eADAQ,EAAA,KAAQ;AAAA,QAAA;;MAIdJ,EAAM,cAAU,CAAKI,EAAA,SAAhCG,KAAAD,EAcM,OAdNS,GAcM;AAAA,QAbJN,EAYUK,EAAAE,CAAA,GAAA;AAAA,UAXR,MAAK;AAAA,UACL,UAAA;AAAA,UACA,OAAM;AAAA,UACL,aAAaF,EAAAhB,CAAA,EAAC,YAAA;AAAA,UACd,cAAYgB,EAAAhB,CAAA,EAAC,YAAA;AAAA,UACb,gCAAOI,EAAI,QAAA;AAAA,UACX,oCAAeA,EAAI,QAAA,GAAA,CAAA,OAAA,CAAA;AAAA,QAAA;UAET,UACT,MAAkE;AAAA,YAAlEO,EAAkEK,EAAAG,CAAA,GAAA;AAAA,cAA5D,MAAK;AAAA,cAAuB,OAAO;AAAA,cAAI,OAAM;AAAA,YAAA;;;;;MAIzDR,EAYcK,EAAAI,CAAA,GAAA,EAZD,OAAM,eAAW;AAAA,mBAC5B,MAUE;AAAA,UAVFT,EAUEK,EAAAK,CAAA,GAAA;AAAA,YATC,SAASnB,EAAM;AAAA,YACf,OAAOA,EAAM;AAAA,YACb,WAAWI,EAAA;AAAA,YACX,mBAAiBJ,EAAM,OAAI,KAAA;AAAA,YAC3B,uBAAqB;AAAA,YACrB,aAAW;AAAA,YACX,QAAQ;AAAA,YACR,eAAa;AAAA,YACb,kBAAYoB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAGC,MAAcnB,YAAemB,CAAC;AAAA,UAAA;;;;;;;"}
1
+ {"version":3,"file":"SideNav2.vue.js","sources":["../../../src/layouts/components/SideNav.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 侧栏薄壳:对 n-menu 的展示层封装,default.vue 复用于 4 处——完整树/二级子树/一级图标 rail/移动抽屉。\n// collapsed(用户折叠开关) 与 rail(一级细栏,恒图标态、固定窄宽、无品牌字) 是两条独立的\"收窄\"来源,\n// 二者任一为真都令 n-menu 进入 collapsed;rail 另用更窄的 collapsed-width。\n// 玻璃底由外层 aside / 抽屉提供,这里保持透明,不自带底色(否则两层半透明叠出一块灰)。\nimport { computed } from 'vue'\nimport { NInput, NMenu, NScrollbar, type MenuOption } from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport { useI18n } from 'vue-i18n'\nimport SmartLogo from '#/components/SmartLogo.vue'\nimport { useSite } from '#/composables/useSite'\n\nconst { site } = useSite()\nconst { t } = useI18n()\n\nconst props = defineProps<{\n options: MenuOption[]\n value?: string\n collapsed?: boolean\n rail?: boolean // 细图标栏(一级),强制图标态、无品牌文字\n showBrand?: boolean\n showSearch?: boolean // 品牌下方的菜单搜索入口(只读输入框,点开 Ctrl+K 同一个面板)\n}>()\nconst emit = defineEmits<{ select: [key: string]; search: [] }>()\n\nconst iconOnly = computed(() => props.collapsed || props.rail)\n</script>\n\n<template>\n <div class=\"sidenav\" :class=\"{ rail: props.rail, 'icon-only': iconOnly }\">\n <div v-if=\"props.showBrand\" class=\"brand\">\n <SmartLogo :size=\"28\" />\n <span v-show=\"!iconOnly\" class=\"brand-name\">\n {{ site.title }}\n </span>\n </div>\n <div v-if=\"props.showSearch && !iconOnly\" class=\"side-search\">\n <n-input\n size=\"small\"\n readonly\n class=\"search-input\"\n :placeholder=\"t('app.search')\"\n :aria-label=\"t('app.search')\"\n @click=\"emit('search')\"\n @keydown.enter=\"emit('search')\"\n >\n <template #prefix>\n <Icon icon=\"ph:magnifying-glass\" :width=\"15\" class=\"search-ico\" />\n </template>\n </n-input>\n </div>\n <n-scrollbar class=\"side-menu\">\n <n-menu\n :options=\"props.options\"\n :value=\"props.value\"\n :collapsed=\"iconOnly\"\n :collapsed-width=\"props.rail ? 64 : 68\"\n :collapsed-icon-size=\"20\"\n :icon-size=\"18\"\n :indent=\"14\"\n :root-indent=\"14\"\n @update:value=\"(k: string) => emit('select', k)\"\n />\n </n-scrollbar>\n </div>\n</template>\n\n<style scoped>\n.sidenav {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: transparent;\n overflow: hidden;\n}\n.brand {\n display: flex;\n align-items: center;\n gap: 10px;\n height: 50px;\n padding: 0 18px;\n color: var(--text-1);\n overflow: hidden;\n white-space: nowrap;\n flex-shrink: 0;\n}\n.icon-only .brand {\n padding: 0;\n justify-content: center;\n}\n.brand-name {\n min-width: 0;\n font-size: 18px;\n font-weight: 600;\n letter-spacing: -0.02em;\n line-height: 1.2;\n color: var(--text-1); /* 品牌文字跟随主题文字色:固定深色在暗色下看不清 */\n}\n.side-search {\n flex-shrink: 0;\n padding: 0 12px 12px;\n}\n.search-input {\n cursor: pointer;\n}\n/* 只读输入框:光标也是手型,点哪都能打开面板 */\n.search-input :deep(.n-input__input-el) {\n cursor: pointer;\n}\n.search-ico {\n color: var(--text-3);\n}\n\n.side-menu {\n flex: 1;\n min-height: 0;\n /* 菜单滚到底时最后一行淡出,不被圆角面板的下沿硬切 */\n -webkit-mask-image: linear-gradient(180deg, #000 calc(100% - 22px), transparent);\n mask-image: linear-gradient(180deg, #000 calc(100% - 22px), transparent);\n}\n/* 选中项只靠行底色 + 强调色文字 / 图标 + 加粗到 600 表达(与横向页签栏的选中页签同一字重),不画左侧竖条 */\n.sidenav :deep(.n-menu-item-content--selected .n-menu-item-content-header) {\n font-weight: 600;\n}\n</style>\n"],"names":["site","useSite","t","useI18n","props","__props","emit","__emit","iconOnly","computed","_createElementBlock","_openBlock","_hoisted_1","_createVNode","SmartLogo","_withDirectives","_createElementVNode","_toDisplayString","_unref","_hoisted_2","NInput","Icon","NScrollbar","NMenu","_cache","k"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAYA,UAAM,EAAE,MAAAA,EAAA,IAASC,EAAA,GACX,EAAE,GAAAC,EAAA,IAAMC,EAAA,GAERC,IAAQC,GAQRC,IAAOC,GAEPC,IAAWC,EAAS,MAAML,EAAM,aAAaA,EAAM,IAAI;2BAI3DM,EAmCM,OAAA;AAAA,MAnCD,UAAM,WAAS,EAAA,MAAiBN,EAAM,mBAAmBI,EAAA,OAAQ,CAAA;AAAA,IAAA;MACzDJ,EAAM,aAAjBO,EAAA,GAAAD,EAKM,OALNE,GAKM;AAAA,QAJJC,EAAwBC,GAAA,EAAZ,MAAM,IAAE;AAAA,QACpBC,EAAAC,EAEO,UAFkB,OAAM,aAAA,GAAYC,EACtCC,EAAAlB,CAAA,EAAK,KAAK,GAAA,GAAA,GAAA;AAAA,eADAQ,EAAA,KAAQ;AAAA,QAAA;;MAIdJ,EAAM,cAAU,CAAKI,EAAA,SAAhCG,KAAAD,EAcM,OAdNS,GAcM;AAAA,QAbJN,EAYUK,EAAAE,CAAA,GAAA;AAAA,UAXR,MAAK;AAAA,UACL,UAAA;AAAA,UACA,OAAM;AAAA,UACL,aAAaF,EAAAhB,CAAA,EAAC,YAAA;AAAA,UACd,cAAYgB,EAAAhB,CAAA,EAAC,YAAA;AAAA,UACb,gCAAOI,EAAI,QAAA;AAAA,UACX,oCAAeA,EAAI,QAAA,GAAA,CAAA,OAAA,CAAA;AAAA,QAAA;UAET,UACT,MAAkE;AAAA,YAAlEO,EAAkEK,EAAAG,CAAA,GAAA;AAAA,cAA5D,MAAK;AAAA,cAAuB,OAAO;AAAA,cAAI,OAAM;AAAA,YAAA;;;;;MAIzDR,EAYcK,EAAAI,CAAA,GAAA,EAZD,OAAM,eAAW;AAAA,mBAC5B,MAUE;AAAA,UAVFT,EAUEK,EAAAK,CAAA,GAAA;AAAA,YATC,SAASnB,EAAM;AAAA,YACf,OAAOA,EAAM;AAAA,YACb,WAAWI,EAAA;AAAA,YACX,mBAAiBJ,EAAM,OAAI,KAAA;AAAA,YAC3B,uBAAqB;AAAA,YACrB,aAAW;AAAA,YACX,QAAQ;AAAA,YACR,eAAa;AAAA,YACb,kBAAYoB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAGC,MAAcnB,YAAemB,CAAC;AAAA,UAAA;;;;;;;"}
@@ -2,7 +2,7 @@ const e = {
2
2
  /** API 根地址;空串 = 同源(dev 由 Vite 代理,生产由反代或后端托管 dist) */
3
3
  apiBase: "",
4
4
  /** 登录页页脚展示的版本号;默认内核版本,消费方可覆盖为应用版本 */
5
- version: "10.21.0",
5
+ version: "10.22.0",
6
6
  /** 开发态:登录页预填超管账号、设置抽屉显示「复制配置」 */
7
7
  dev: !1,
8
8
  brand: {}
@@ -42,6 +42,9 @@ declare const _default: {
42
42
  notFound: {
43
43
  desc: string;
44
44
  back: string;
45
+ currentApp: string;
46
+ otherApp: string;
47
+ switchAndOpen: string;
45
48
  };
46
49
  errorBoundary: {
47
50
  title: string;
@@ -515,6 +518,9 @@ declare const _default: {
515
518
  org: string;
516
519
  allOrgs: string;
517
520
  orgFilter: string;
521
+ collapseToFirstLevel: string;
522
+ hideOrgPanel: string;
523
+ showOrgPanel: string;
518
524
  orgPlaceholder: string;
519
525
  position: string;
520
526
  positionPlaceholder: string;
@@ -41,7 +41,10 @@ const e = {
41
41
  },
42
42
  notFound: {
43
43
  desc: "Page not found",
44
- back: "Back to workbench"
44
+ back: "Back to workbench",
45
+ currentApp: "Current app: {app}",
46
+ otherApp: 'This page belongs to the "{app}" app, not the one you are in',
47
+ switchAndOpen: 'Switch to "{app}" and open it'
45
48
  },
46
49
  // Content-area render fallback (components/ErrorBoundary)
47
50
  errorBoundary: {
@@ -522,8 +525,12 @@ const e = {
522
525
  passwordHint: "Leave blank to auto-generate one (shown once after creation)",
523
526
  org: "Org",
524
527
  allOrgs: "All",
525
- // Narrow content area: the org tree moves into a drawer (toolbar button + drawer title)
528
+ // Group name of the org panel; in a narrow content area the tree moves into a drawer, where it is also the toolbar button + drawer title
526
529
  orgFilter: "Organization",
530
+ // Panel header button tips: once fully expanded it becomes "collapse to first level"; "hide" slides the whole panel left, after which the toolbar button's tip is "show"
531
+ collapseToFirstLevel: "Collapse to first level",
532
+ hideOrgPanel: "Hide organization panel",
533
+ showOrgPanel: "Show organization panel",
527
534
  orgPlaceholder: "Select org (optional)",
528
535
  position: "Position",
529
536
  positionPlaceholder: "Select position (optional)",