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.
- package/dist/assets/icons/ph-subset.json.js +1 -1
- package/dist/composables/authMenuRoute.d.ts +10 -0
- package/dist/composables/authMenuRoute.js +39 -23
- package/dist/composables/authMenuRoute.js.map +1 -1
- package/dist/composables/useModule.d.ts +3 -1
- package/dist/composables/useModule.js +44 -32
- package/dist/composables/useModule.js.map +1 -1
- package/dist/index.js +49 -47
- package/dist/layouts/components/SideNav.vue.js +2 -2
- package/dist/layouts/components/SideNav2.vue.js.map +1 -1
- package/dist/lib/runtime.js +1 -1
- package/dist/locales/en-US.d.ts +6 -0
- package/dist/locales/en-US.js +9 -2
- package/dist/locales/en-US.js.map +1 -1
- package/dist/locales/zh-CN.d.ts +6 -0
- package/dist/locales/zh-CN.js +9 -2
- package/dist/locales/zh-CN.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/utils/tree.d.ts +15 -0
- package/dist/utils/tree.js +43 -29
- package/dist/utils/tree.js.map +1 -1
- package/dist/utils/treeCard.d.ts +6 -0
- package/dist/utils/treeCard.js +9 -0
- package/dist/utils/treeCard.js.map +1 -0
- package/dist/views/error/404.vue.js +2 -2
- package/dist/views/error/4042.vue.js +81 -24
- package/dist/views/error/4042.vue.js.map +1 -1
- package/dist/views/login/components/LoginDesk.vue.js +2 -2
- package/dist/views/login/components/LoginDesk2.vue.js.map +1 -1
- package/dist/views/login/components/LoginHeroPanel.vue.js +2 -2
- package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -1
- package/dist/views/system/job-monitor/index.vue.js +2 -2
- package/dist/views/system/job-monitor/index2.vue.js +46 -46
- package/dist/views/system/job-monitor/index2.vue.js.map +1 -1
- package/dist/views/system/menu/index.vue.js +2 -2
- package/dist/views/system/menu/index2.vue.js +161 -150
- package/dist/views/system/menu/index2.vue.js.map +1 -1
- package/dist/views/system/org/index.vue.js +2 -2
- package/dist/views/system/org/index2.vue.js +182 -176
- package/dist/views/system/org/index2.vue.js.map +1 -1
- package/dist/views/system/user/index.vue.js +2 -2
- package/dist/views/system/user/index2.vue.js +348 -317
- package/dist/views/system/user/index2.vue.js.map +1 -1
- 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
86
|
-
import { FULLSCREEN_PATH_PREFIX as
|
|
87
|
-
import { default as
|
|
88
|
-
import { ACCENTS as
|
|
89
|
-
import { btnGrad as
|
|
90
|
-
import { buildThemeOverrides as
|
|
91
|
-
import { setupMarkdown as
|
|
92
|
-
import { LoadingBarBridge as
|
|
93
|
-
import { classifyNoticeAction as
|
|
94
|
-
import { registerViews as
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
121
|
-
|
|
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
|
-
|
|
134
|
+
Pt as LINK_BY_ACCOUNT_CODES,
|
|
135
135
|
K as LONG_TIMEOUT_MS,
|
|
136
136
|
eo as LineChart,
|
|
137
|
-
|
|
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
|
-
|
|
168
|
+
Ta as btnGrad,
|
|
169
169
|
Dt as buildConfigProviderRows,
|
|
170
170
|
er as buildRoutesForModule,
|
|
171
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
209
|
+
ma as isFullscreenPath,
|
|
209
210
|
_t as isHardError,
|
|
210
|
-
|
|
211
|
+
ua as isHttpUrl,
|
|
211
212
|
wt as isIconifyName,
|
|
212
|
-
|
|
213
|
+
La as isSiteRelativeUrl,
|
|
213
214
|
_ as jobApi,
|
|
214
215
|
Te as joinPermission,
|
|
215
|
-
|
|
216
|
+
xa as kernelIconSet,
|
|
216
217
|
M as listQuery,
|
|
217
218
|
Fr as loadSite,
|
|
218
219
|
Xt as loadWithinServerMax,
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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
|
-
|
|
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
|
-
|
|
233
|
-
|
|
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
|
-
|
|
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
|
-
|
|
255
|
+
Ua as registerViews,
|
|
255
256
|
we as resetRouter,
|
|
256
257
|
vt as resolveProviderIcon,
|
|
257
|
-
|
|
258
|
+
ha as rgba,
|
|
258
259
|
N as roleApi,
|
|
260
|
+
aa as rootExpandableIds,
|
|
259
261
|
Fe as router,
|
|
260
262
|
H as sessionApi,
|
|
261
|
-
|
|
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
|
-
|
|
273
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
305
|
+
va as viewComponentPaths,
|
|
304
306
|
Je as withExt,
|
|
305
|
-
|
|
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
|
|
4
|
+
const f = /* @__PURE__ */ t(o, [["__scopeId", "data-v-a4f9dd94"]]);
|
|
5
5
|
export {
|
|
6
|
-
|
|
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:
|
|
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;;;;;;;"}
|
package/dist/lib/runtime.js
CHANGED
package/dist/locales/en-US.d.ts
CHANGED
|
@@ -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;
|
package/dist/locales/en-US.js
CHANGED
|
@@ -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
|
-
//
|
|
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)",
|