@liujitcn/kratos-admin-system 0.0.21 → 0.0.23
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/package/declarations/src/api/system/base_language.d.ts +5 -4
- package/dist/package/declarations/src/api/system/base_translation.d.ts +7 -4
- package/dist/package/declarations/src/api/system/ops_monitoring.d.ts +19 -0
- package/dist/package/declarations/src/api/system/ops_monitoring_sse.d.ts +12 -0
- package/dist/package/declarations/src/components/DynamicTranslationCell.vue.d.ts +9 -32
- package/dist/package/declarations/src/components/DynamicTranslationEditor.vue.d.ts +3 -6
- package/dist/package/declarations/src/components/dynamicTranslation.d.ts +11 -17
- package/dist/package/declarations/src/locales/generated.d.ts +6536 -0
- package/dist/package/declarations/src/rpc/base/v1/ai_session.d.ts +12 -2
- package/dist/package/declarations/src/rpc/base/v1/ai_tool.d.ts +9 -1
- package/dist/package/declarations/src/rpc/base/v1/config.d.ts +35 -0
- package/dist/package/declarations/src/rpc/system/admin/v1/auth.d.ts +1 -1
- package/dist/package/declarations/src/rpc/system/admin/v1/base_config.d.ts +23 -7
- package/dist/package/declarations/src/rpc/system/admin/v1/base_dict.d.ts +7 -77
- package/dist/package/declarations/src/rpc/system/admin/v1/base_job.d.ts +9 -1
- package/dist/package/declarations/src/rpc/system/admin/v1/base_language.d.ts +7 -2
- package/dist/package/declarations/src/rpc/system/admin/v1/base_menu.d.ts +5 -40
- package/dist/package/declarations/src/rpc/system/admin/v1/base_migration.d.ts +6 -6
- package/dist/package/declarations/src/rpc/system/admin/v1/base_role.d.ts +13 -1
- package/dist/package/declarations/src/rpc/system/admin/v1/base_translation.d.ts +54 -81
- package/dist/package/declarations/src/rpc/system/admin/v1/base_user.d.ts +11 -1
- package/dist/package/declarations/src/rpc/system/admin/v1/code_gen.d.ts +11 -11
- package/dist/package/declarations/src/rpc/system/admin/v1/code_gen_table.d.ts +11 -1
- package/dist/package/declarations/src/rpc/system/admin/v1/common.d.ts +13 -0
- package/dist/package/declarations/src/rpc/system/admin/v1/ops_monitoring.d.ts +222 -0
- package/dist/package/declarations/src/views/tool/ops-monitoring/index.vue.d.ts +3 -0
- package/dist/package/src/api/base/ai_message.ts +2 -2
- package/dist/package/src/api/system/base_language.ts +13 -15
- package/dist/package/src/api/system/base_translation.ts +17 -6
- package/dist/package/src/api/system/ops_monitoring.ts +88 -0
- package/dist/package/src/api/system/ops_monitoring_sse.ts +49 -0
- package/dist/package/src/components/DynamicTranslationCell.vue +199 -126
- package/dist/package/src/components/DynamicTranslationEditor.vue +109 -78
- package/dist/package/src/components/dynamicTranslation.ts +11 -31
- package/dist/package/src/locales/README.md +7 -5
- package/dist/package/src/locales/en-US.json +876 -872
- package/dist/package/src/locales/es-ES.json +900 -895
- package/dist/package/src/locales/fr-FR.json +896 -891
- package/dist/package/src/locales/generated.ts +22 -0
- package/dist/package/src/locales/ja-JP.json +876 -872
- package/dist/package/src/locales/ko-KR.json +881 -876
- package/dist/package/src/locales/zh-CN.json +876 -872
- package/dist/package/src/locales/zh-TW.json +876 -871
- package/dist/package/src/module.ts +3 -17
- package/dist/package/src/rpc/base/v1/ai_session.ts +13 -2
- package/dist/package/src/rpc/base/v1/ai_tool.ts +10 -1
- package/dist/package/src/rpc/base/v1/config.ts +47 -0
- package/dist/package/src/rpc/system/admin/v1/auth.ts +1 -1
- package/dist/package/src/rpc/system/admin/v1/base_config.ts +24 -7
- package/dist/package/src/rpc/system/admin/v1/base_dict.ts +7 -79
- package/dist/package/src/rpc/system/admin/v1/base_job.ts +10 -1
- package/dist/package/src/rpc/system/admin/v1/base_language.ts +8 -2
- package/dist/package/src/rpc/system/admin/v1/base_menu.ts +5 -41
- package/dist/package/src/rpc/system/admin/v1/base_migration.ts +8 -8
- package/dist/package/src/rpc/system/admin/v1/base_role.ts +14 -1
- package/dist/package/src/rpc/system/admin/v1/base_translation.ts +54 -81
- package/dist/package/src/rpc/system/admin/v1/base_user.ts +12 -1
- package/dist/package/src/rpc/system/admin/v1/code_gen.ts +11 -11
- package/dist/package/src/rpc/system/admin/v1/code_gen_table.ts +12 -1
- package/dist/package/src/rpc/system/admin/v1/common.ts +21 -0
- package/dist/package/src/rpc/system/admin/v1/ops_monitoring.ts +255 -0
- package/dist/package/src/views/ai/chat/components/ChatPanel.vue +36 -36
- package/dist/package/src/views/ai/chat/components/SessionPanel.vue +6 -6
- package/dist/package/src/views/ai/chat/components/XSender.vue +20 -20
- package/dist/package/src/views/ai/chat/index.vue +33 -32
- package/dist/package/src/views/ai/chat/message.ts +16 -15
- package/dist/package/src/views/base/api/index.vue +55 -56
- package/dist/package/src/views/base/area/index.vue +18 -19
- package/dist/package/src/views/base/config/index.vue +143 -133
- package/dist/package/src/views/base/dept/index.vue +42 -43
- package/dist/package/src/views/base/dict/index.vue +49 -45
- package/dist/package/src/views/base/dict/item.vue +54 -49
- package/dist/package/src/views/base/job/index.vue +51 -52
- package/dist/package/src/views/base/job/log.vue +18 -18
- package/dist/package/src/views/{tool → base}/language/index.vue +51 -47
- package/dist/package/src/views/base/log/index.vue +40 -40
- package/dist/package/src/views/base/menu/index.vue +220 -177
- package/dist/package/src/views/base/migration/index.vue +24 -24
- package/dist/package/src/views/base/post/index.vue +42 -43
- package/dist/package/src/views/base/role/index.vue +54 -55
- package/dist/package/src/views/base/tenant/index.vue +42 -43
- package/dist/package/src/views/base/user/components/dept-tree.vue +1 -1
- package/dist/package/src/views/base/user/index.vue +69 -71
- package/dist/package/src/views/profile/components/base.vue +9 -9
- package/dist/package/src/views/profile/components/password.vue +19 -20
- package/dist/package/src/views/profile/components/security.vue +20 -20
- package/dist/package/src/views/profile/index.vue +3 -3
- package/dist/package/src/views/tool/api-doc/index.vue +1 -1
- package/dist/package/src/views/tool/code-gen/code-preview/index.vue +13 -13
- package/dist/package/src/views/tool/code-gen/columns/index.vue +89 -89
- package/dist/package/src/views/tool/code-gen/components/CodeGenLocaleEditor.vue +5 -5
- package/dist/package/src/views/tool/code-gen/components/CodeGenProgressDialog.vue +21 -21
- package/dist/package/src/views/tool/code-gen/components/CodePreviewPane.vue +5 -5
- package/dist/package/src/views/tool/code-gen/config.ts +60 -60
- package/dist/package/src/views/tool/code-gen/preview/data.ts +2 -2
- package/dist/package/src/views/tool/code-gen/preview/index.vue +30 -31
- package/dist/package/src/views/tool/code-gen/proto/index.vue +43 -43
- package/dist/package/src/views/tool/code-gen/table/index.vue +95 -95
- package/dist/package/src/views/tool/ops-monitoring/index.vue +1175 -0
- package/dist/package/src/views/tool/project-doc/index.vue +7 -7
- package/package.json +2 -2
- package/dist/package/declarations/src/rpc/base/v1/enum.d.ts +0 -43
- package/dist/package/declarations/src/rpc/system/common/v1/enum.d.ts +0 -67
- package/dist/package/src/rpc/base/v1/enum.ts +0 -54
- package/dist/package/src/rpc/system/common/v1/enum.ts +0 -80
- /package/dist/package/declarations/src/views/{tool → base}/language/index.vue.d.ts +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<div class="table-box">
|
|
3
3
|
<ProTable
|
|
4
4
|
ref="proTable"
|
|
5
|
-
:title="t('system.menu.title.list')"
|
|
5
|
+
:title="t('system.base.menu.title.list')"
|
|
6
6
|
row-key="id"
|
|
7
7
|
:indent="20"
|
|
8
8
|
:columns="columns"
|
|
@@ -16,26 +16,23 @@
|
|
|
16
16
|
<FormDialog
|
|
17
17
|
v-model="dialog.visible"
|
|
18
18
|
ref="formDialogRef"
|
|
19
|
-
:title="t(dialog.editing ? 'system.menu.action.edit' : 'system.menu.action.create')"
|
|
19
|
+
:title="t(dialog.editing ? 'system.base.menu.action.edit' : 'system.base.menu.action.create')"
|
|
20
20
|
width="1180px"
|
|
21
21
|
:model="formData"
|
|
22
22
|
:fields="formFields"
|
|
23
23
|
:rules="rules"
|
|
24
|
-
label-width="120px"
|
|
25
24
|
:col-span="12"
|
|
26
25
|
@confirm="handleSubmit"
|
|
27
26
|
@close="handleCloseDialog"
|
|
28
27
|
>
|
|
29
28
|
<template #menuIcon>
|
|
30
|
-
<SelectIcon v-model:icon-value="menuIconValue" :placeholder="t('system.menu.placeholder.icon')" />
|
|
29
|
+
<SelectIcon v-model:icon-value="menuIconValue" :placeholder="t('system.base.menu.placeholder.icon')" />
|
|
31
30
|
</template>
|
|
32
31
|
|
|
33
32
|
<template #translations>
|
|
34
33
|
<DynamicTranslationEditor
|
|
35
34
|
v-model="translationValues"
|
|
36
|
-
:
|
|
37
|
-
:resource-type="TranslationResourceType.TRANSLATION_RESOURCE_TYPE_MENU"
|
|
38
|
-
:draft-enabled="configStore.translationDraftEnabled"
|
|
35
|
+
:source="formData.meta.title"
|
|
39
36
|
:maxlength="100"
|
|
40
37
|
/>
|
|
41
38
|
</template>
|
|
@@ -43,9 +40,9 @@
|
|
|
43
40
|
<template #apiTransferItem="slotScope">
|
|
44
41
|
<el-popover effect="light" trigger="hover" placement="top" width="auto">
|
|
45
42
|
<template #default>
|
|
46
|
-
<div>{{ t("system.api.field.operation") }}:{{ slotScope.option.operation }}</div>
|
|
47
|
-
<div>{{ t("system.api.field.method") }}:{{ slotScope.option.method }}</div>
|
|
48
|
-
<div>{{ t("system.api.field.path") }}:{{ slotScope.option.path }}</div>
|
|
43
|
+
<div>{{ t("system.base.api.field.operation") }}:{{ slotScope.option.operation }}</div>
|
|
44
|
+
<div>{{ t("system.base.api.field.method") }}:{{ slotScope.option.method }}</div>
|
|
45
|
+
<div>{{ t("system.base.api.field.path") }}:{{ slotScope.option.path }}</div>
|
|
49
46
|
</template>
|
|
50
47
|
<template #reference>{{ slotScope.option.label }}</template>
|
|
51
48
|
</el-popover>
|
|
@@ -79,10 +76,10 @@ import type {
|
|
|
79
76
|
BaseMenuMeta
|
|
80
77
|
} from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_menu";
|
|
81
78
|
import { Status } from "@liujitcn/kratos-admin-system/rpc/common/v1/enum";
|
|
82
|
-
import { BaseMenuType } from "@liujitcn/kratos-admin-system/rpc/system/
|
|
79
|
+
import { BaseMenuType } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/common";
|
|
80
|
+
import { TranslationTargetType } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_translation";
|
|
83
81
|
import { normalizeSelectedIds } from "@liujitcn/kratos-admin-core/table";
|
|
84
82
|
import { t } from "@liujitcn/kratos-admin-core";
|
|
85
|
-
import { useConfigStore } from "@liujitcn/kratos-admin-core/stores/runtime";
|
|
86
83
|
import DynamicTranslationEditor from "@liujitcn/kratos-admin-system/components/DynamicTranslationEditor.vue";
|
|
87
84
|
import DynamicTranslationCell from "@liujitcn/kratos-admin-system/components/DynamicTranslationCell.vue";
|
|
88
85
|
import {
|
|
@@ -91,8 +88,6 @@ import {
|
|
|
91
88
|
type DynamicTranslationRecord,
|
|
92
89
|
type DynamicTranslationValue
|
|
93
90
|
} from "@liujitcn/kratos-admin-system/components/dynamicTranslation";
|
|
94
|
-
import { TranslationResourceType } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_translation";
|
|
95
|
-
import type { BaseMenuTranslation } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_menu";
|
|
96
91
|
|
|
97
92
|
defineOptions({
|
|
98
93
|
name: "BaseMenu",
|
|
@@ -110,7 +105,6 @@ type MenuFormState = Omit<BaseMenuForm, "meta"> & {
|
|
|
110
105
|
};
|
|
111
106
|
|
|
112
107
|
const { BUTTONS } = useAuthButtons();
|
|
113
|
-
const configStore = useConfigStore();
|
|
114
108
|
const proTable = ref<ProTableInstance>();
|
|
115
109
|
const formDialogRef = ref<InstanceType<typeof FormDialog>>();
|
|
116
110
|
const menuOptions = ref<ProFormOption[]>([]);
|
|
@@ -122,7 +116,7 @@ const translationValues = ref<DynamicTranslationValue[]>(normalizeDynamicTransla
|
|
|
122
116
|
const dialog = reactive({
|
|
123
117
|
editing: false,
|
|
124
118
|
visible: false,
|
|
125
|
-
parentType: BaseMenuType.
|
|
119
|
+
parentType: BaseMenuType.BASE_MENU_TYPE_UNSPECIFIED,
|
|
126
120
|
parentLocked: true
|
|
127
121
|
});
|
|
128
122
|
|
|
@@ -156,7 +150,7 @@ function createDefaultMenuForm(): MenuFormState {
|
|
|
156
150
|
return {
|
|
157
151
|
id: 0,
|
|
158
152
|
parent_id: undefined,
|
|
159
|
-
type: BaseMenuType.
|
|
153
|
+
type: BaseMenuType.BASE_MENU_TYPE_FOLDER,
|
|
160
154
|
path: "",
|
|
161
155
|
name: "",
|
|
162
156
|
component: "",
|
|
@@ -180,10 +174,10 @@ const menuIconValue = computed({
|
|
|
180
174
|
});
|
|
181
175
|
|
|
182
176
|
const menuTypeOptions = computed<ProFormOption[]>(() => [
|
|
183
|
-
{ label: t("system.menu.type.folder"), value: BaseMenuType.
|
|
184
|
-
{ label: t("system.menu.type.menu"), value: BaseMenuType.
|
|
185
|
-
{ label: t("system.menu.type.button"), value: BaseMenuType.
|
|
186
|
-
{ label: t("system.menu.type.external"), value: BaseMenuType.
|
|
177
|
+
{ label: t("system.base.menu.type.folder"), value: BaseMenuType.BASE_MENU_TYPE_FOLDER },
|
|
178
|
+
{ label: t("system.base.menu.type.menu"), value: BaseMenuType.BASE_MENU_TYPE_MENU },
|
|
179
|
+
{ label: t("system.base.menu.type.button"), value: BaseMenuType.BASE_MENU_TYPE_BUTTON },
|
|
180
|
+
{ label: t("system.base.menu.type.external"), value: BaseMenuType.BASE_MENU_TYPE_EXT_LINK }
|
|
187
181
|
]);
|
|
188
182
|
|
|
189
183
|
/** 判断父节点是否属于固定移动端菜单树。 */
|
|
@@ -209,8 +203,8 @@ function getMenuLevel(menuId: number) {
|
|
|
209
203
|
function canCreateChild(menu: BaseMenu) {
|
|
210
204
|
const level = getMenuLevel(menu.id);
|
|
211
205
|
if (menu.id === APP_MENU_ROOT_ID || isAppMenu(menu.parent_id)) return level >= 1 && level < 4;
|
|
212
|
-
if (menu.type === BaseMenuType.
|
|
213
|
-
if (menu.type === BaseMenuType.
|
|
206
|
+
if (menu.type === BaseMenuType.BASE_MENU_TYPE_FOLDER) return level === 1 || level === 2;
|
|
207
|
+
if (menu.type === BaseMenuType.BASE_MENU_TYPE_MENU) return level === 2 || level === 3;
|
|
214
208
|
return false;
|
|
215
209
|
}
|
|
216
210
|
|
|
@@ -218,17 +212,24 @@ function canCreateChild(menu: BaseMenu) {
|
|
|
218
212
|
const availableMenuTypeOptions = computed(() => {
|
|
219
213
|
const parentLevel = getMenuLevel(formData.parent_id ?? 0);
|
|
220
214
|
|
|
221
|
-
if (formData.id === APP_MENU_ROOT_ID)
|
|
222
|
-
|
|
223
|
-
if (formData.
|
|
224
|
-
if (
|
|
215
|
+
if (formData.id === APP_MENU_ROOT_ID)
|
|
216
|
+
return menuTypeOptions.value.filter(item => item.value === BaseMenuType.BASE_MENU_TYPE_FOLDER);
|
|
217
|
+
if (isAppMenu(formData.parent_id)) return menuTypeOptions.value.filter(item => item.value === BaseMenuType.BASE_MENU_TYPE_MENU);
|
|
218
|
+
if (formData.id > 0 && parentLevel === 0)
|
|
219
|
+
return menuTypeOptions.value.filter(item => item.value === BaseMenuType.BASE_MENU_TYPE_FOLDER);
|
|
220
|
+
if (dialog.parentType === BaseMenuType.BASE_MENU_TYPE_FOLDER && parentLevel === 1)
|
|
225
221
|
return menuTypeOptions.value.filter(
|
|
226
|
-
item =>
|
|
222
|
+
item =>
|
|
223
|
+
item.value === BaseMenuType.BASE_MENU_TYPE_FOLDER ||
|
|
224
|
+
item.value === BaseMenuType.BASE_MENU_TYPE_MENU ||
|
|
225
|
+
item.value === BaseMenuType.BASE_MENU_TYPE_EXT_LINK
|
|
227
226
|
);
|
|
228
|
-
if (dialog.parentType === BaseMenuType.
|
|
229
|
-
return menuTypeOptions.value.filter(
|
|
230
|
-
|
|
231
|
-
|
|
227
|
+
if (dialog.parentType === BaseMenuType.BASE_MENU_TYPE_FOLDER && parentLevel === 2)
|
|
228
|
+
return menuTypeOptions.value.filter(
|
|
229
|
+
item => item.value === BaseMenuType.BASE_MENU_TYPE_MENU || item.value === BaseMenuType.BASE_MENU_TYPE_EXT_LINK
|
|
230
|
+
);
|
|
231
|
+
if (dialog.parentType === BaseMenuType.BASE_MENU_TYPE_MENU && (parentLevel === 2 || parentLevel === 3))
|
|
232
|
+
return menuTypeOptions.value.filter(item => item.value === BaseMenuType.BASE_MENU_TYPE_BUTTON);
|
|
232
233
|
return [];
|
|
233
234
|
});
|
|
234
235
|
|
|
@@ -241,9 +242,9 @@ watch(
|
|
|
241
242
|
} else if (formData.id === 0) {
|
|
242
243
|
formData.meta.app = undefined;
|
|
243
244
|
}
|
|
244
|
-
dialog.parentType = parentMenuTypeMap.value.get(formData.parent_id ?? 0) ?? BaseMenuType.
|
|
245
|
+
dialog.parentType = parentMenuTypeMap.value.get(formData.parent_id ?? 0) ?? BaseMenuType.BASE_MENU_TYPE_UNSPECIFIED;
|
|
245
246
|
if (formData.id > 0 || availableMenuTypeOptions.value.some(item => item.value === formData.type)) return;
|
|
246
|
-
formData.type = (availableMenuTypeOptions.value[0]?.value as BaseMenuType) ?? BaseMenuType.
|
|
247
|
+
formData.type = (availableMenuTypeOptions.value[0]?.value as BaseMenuType) ?? BaseMenuType.BASE_MENU_TYPE_UNSPECIFIED;
|
|
247
248
|
}
|
|
248
249
|
);
|
|
249
250
|
|
|
@@ -253,9 +254,9 @@ const statusOptions = computed<ProFormOption[]>(() => [
|
|
|
253
254
|
]);
|
|
254
255
|
|
|
255
256
|
const appAccessOptions = computed<ProFormOption[]>(() => [
|
|
256
|
-
{ label: t("system.menu.access.public"), value: "PUBLIC" },
|
|
257
|
-
{ label: t("system.menu.access.guest"), value: "GUEST_ONLY" },
|
|
258
|
-
{ label: t("system.menu.access.authenticated"), value: "AUTHENTICATED" }
|
|
257
|
+
{ label: t("system.base.menu.access.public"), value: "PUBLIC" },
|
|
258
|
+
{ label: t("system.base.menu.access.guest"), value: "GUEST_ONLY" },
|
|
259
|
+
{ label: t("system.base.menu.access.authenticated"), value: "AUTHENTICATED" }
|
|
259
260
|
]);
|
|
260
261
|
|
|
261
262
|
/**
|
|
@@ -284,7 +285,7 @@ function renderMenuIconCell(scope: RenderScope<BaseMenu>) {
|
|
|
284
285
|
function renderHiddenCell(scope: RenderScope<BaseMenu>) {
|
|
285
286
|
const isHidden = Boolean(scope.row.meta?.hidden);
|
|
286
287
|
return h(ElTag, { type: isHidden ? "info" : "success" }, () =>
|
|
287
|
-
t(isHidden ? "system.menu.status.hidden" : "system.menu.status.visible")
|
|
288
|
+
t(isHidden ? "system.base.menu.status.hidden" : "system.base.menu.status.visible")
|
|
288
289
|
);
|
|
289
290
|
}
|
|
290
291
|
|
|
@@ -293,8 +294,9 @@ function renderMenuTitleCell(scope: RenderScope<BaseMenu>) {
|
|
|
293
294
|
const row = scope.row;
|
|
294
295
|
return h(DynamicTranslationCell, {
|
|
295
296
|
source: row.meta?.title ?? "",
|
|
296
|
-
|
|
297
|
-
|
|
297
|
+
targetType: TranslationTargetType.TRANSLATION_TARGET_TYPE_BASE_MENU,
|
|
298
|
+
targetId: row.id,
|
|
299
|
+
translations: row.translations
|
|
298
300
|
});
|
|
299
301
|
}
|
|
300
302
|
|
|
@@ -310,28 +312,28 @@ const columns = computed<ColumnProps[]>(() => [
|
|
|
310
312
|
},
|
|
311
313
|
{
|
|
312
314
|
prop: "meta.title",
|
|
313
|
-
label: t("system.menu.field.name"),
|
|
315
|
+
label: t("system.base.menu.field.name"),
|
|
314
316
|
minWidth: 220,
|
|
315
317
|
align: "left",
|
|
316
318
|
search: { el: "input", key: "title" },
|
|
317
319
|
showOverflowTooltip: false,
|
|
318
320
|
render: scope => renderMenuTitleCell(scope as unknown as RenderScope<BaseMenu>)
|
|
319
321
|
},
|
|
320
|
-
{ prop: "type", label: t("system.menu.field.type"), minWidth: 120, dictCode: "base_menu_type", search: { el: "select" } },
|
|
322
|
+
{ prop: "type", label: t("system.base.menu.field.type"), minWidth: 120, dictCode: "base_menu_type", search: { el: "select" } },
|
|
321
323
|
{
|
|
322
324
|
prop: "meta.icon",
|
|
323
|
-
label: t("system.menu.field.icon"),
|
|
325
|
+
label: t("system.base.menu.field.icon"),
|
|
324
326
|
width: 90,
|
|
325
327
|
render: scope => renderMenuIconCell(scope as unknown as RenderScope<BaseMenu>)
|
|
326
328
|
},
|
|
327
|
-
{ prop: "path", label: t("system.menu.field.
|
|
328
|
-
{ prop: "name", label: t("system.menu.field.
|
|
329
|
-
{ prop: "component", label: t("system.menu.field.component"), minWidth: 260 },
|
|
330
|
-
{ prop: "redirect", label: t("system.menu.field.redirect"), minWidth: 220 },
|
|
331
|
-
{ prop: "sort", label: t("
|
|
329
|
+
{ prop: "path", label: t("system.base.menu.field.path_or_permission"), minWidth: 260, search: { el: "input" } },
|
|
330
|
+
{ prop: "name", label: t("system.base.menu.field.route_name"), minWidth: 180, search: { el: "input" } },
|
|
331
|
+
{ prop: "component", label: t("system.base.menu.field.component"), minWidth: 260 },
|
|
332
|
+
{ prop: "redirect", label: t("system.base.menu.field.redirect"), minWidth: 220 },
|
|
333
|
+
{ prop: "sort", label: t("common.field.sort"), minWidth: 80, align: "right" },
|
|
332
334
|
{
|
|
333
335
|
prop: "status",
|
|
334
|
-
label: t("
|
|
336
|
+
label: t("common.field.status"),
|
|
335
337
|
width: 100,
|
|
336
338
|
dictCode: "status",
|
|
337
339
|
search: { el: "select" },
|
|
@@ -347,15 +349,15 @@ const columns = computed<ColumnProps[]>(() => [
|
|
|
347
349
|
},
|
|
348
350
|
{
|
|
349
351
|
prop: "meta.hidden",
|
|
350
|
-
label: t("system.menu.field.
|
|
352
|
+
label: t("system.base.menu.field.display_status"),
|
|
351
353
|
width: 100,
|
|
352
354
|
render: scope => renderHiddenCell(scope as unknown as RenderScope<BaseMenu>)
|
|
353
355
|
},
|
|
354
|
-
{ prop: "created_at", label: t("
|
|
355
|
-
{ prop: "updated_at", label: t("
|
|
356
|
+
{ prop: "created_at", label: t("common.field.created_at"), minWidth: 180 },
|
|
357
|
+
{ prop: "updated_at", label: t("common.field.updated_at"), minWidth: 180 },
|
|
356
358
|
{
|
|
357
359
|
prop: "operation",
|
|
358
|
-
label: t("
|
|
360
|
+
label: t("common.field.action"),
|
|
359
361
|
width: 220,
|
|
360
362
|
fixed: "right",
|
|
361
363
|
cellType: "actions",
|
|
@@ -423,7 +425,7 @@ const transferData = computed<ProFormOption[]>(() => {
|
|
|
423
425
|
const formFields = computed<ProFormField[]>(() => [
|
|
424
426
|
{
|
|
425
427
|
prop: "parent_id",
|
|
426
|
-
label: t("system.menu.field.parent"),
|
|
428
|
+
label: t("system.base.menu.field.parent"),
|
|
427
429
|
component: "tree-select",
|
|
428
430
|
options: menuOptions.value,
|
|
429
431
|
props: () => ({
|
|
@@ -432,14 +434,14 @@ const formFields = computed<ProFormField[]>(() => [
|
|
|
432
434
|
checkStrictly: true,
|
|
433
435
|
clearable: false,
|
|
434
436
|
filterable: true,
|
|
435
|
-
placeholder: t("system.menu.placeholder.parent"),
|
|
437
|
+
placeholder: t("system.base.menu.placeholder.parent"),
|
|
436
438
|
disabled: dialog.parentLocked,
|
|
437
439
|
style: { width: "100%" }
|
|
438
440
|
})
|
|
439
441
|
},
|
|
440
442
|
{
|
|
441
443
|
prop: "type",
|
|
442
|
-
label: t("system.menu.field.type"),
|
|
444
|
+
label: t("system.base.menu.field.type"),
|
|
443
445
|
component: "radio-group",
|
|
444
446
|
options: availableMenuTypeOptions.value,
|
|
445
447
|
props: model => ({
|
|
@@ -448,20 +450,24 @@ const formFields = computed<ProFormField[]>(() => [
|
|
|
448
450
|
},
|
|
449
451
|
{
|
|
450
452
|
prop: "meta.title",
|
|
451
|
-
label: t(
|
|
453
|
+
label: t(
|
|
454
|
+
formData.type === BaseMenuType.BASE_MENU_TYPE_BUTTON ? "system.base.menu.field.button_name" : "system.base.menu.field.title"
|
|
455
|
+
),
|
|
452
456
|
component: "input",
|
|
453
457
|
itemProps: {
|
|
454
458
|
required: true
|
|
455
459
|
},
|
|
456
460
|
props: () => ({
|
|
457
461
|
placeholder: t(
|
|
458
|
-
formData.type === BaseMenuType.
|
|
462
|
+
formData.type === BaseMenuType.BASE_MENU_TYPE_BUTTON
|
|
463
|
+
? "system.base.menu.placeholder.button_name"
|
|
464
|
+
: "system.base.menu.placeholder.title"
|
|
459
465
|
)
|
|
460
466
|
})
|
|
461
467
|
},
|
|
462
468
|
{
|
|
463
469
|
prop: "translations",
|
|
464
|
-
label: t("system.translation.field.translations"),
|
|
470
|
+
label: t("system.base.translation.field.translations"),
|
|
465
471
|
component: "slot",
|
|
466
472
|
slotName: "translations",
|
|
467
473
|
colSpan: 24
|
|
@@ -472,12 +478,12 @@ const formFields = computed<ProFormField[]>(() => [
|
|
|
472
478
|
component: "input",
|
|
473
479
|
labelTooltip: getPathFieldTooltip(),
|
|
474
480
|
itemProps: model => ({
|
|
475
|
-
required: model.type !== BaseMenuType.
|
|
481
|
+
required: model.type !== BaseMenuType.BASE_MENU_TYPE_FOLDER
|
|
476
482
|
}),
|
|
477
483
|
props: () => ({
|
|
478
484
|
placeholder: getPathFieldPlaceholder()
|
|
479
485
|
}),
|
|
480
|
-
visible: model => model.type !== BaseMenuType.
|
|
486
|
+
visible: model => model.type !== BaseMenuType.BASE_MENU_TYPE_FOLDER
|
|
481
487
|
},
|
|
482
488
|
{
|
|
483
489
|
prop: "redirect",
|
|
@@ -485,117 +491,121 @@ const formFields = computed<ProFormField[]>(() => [
|
|
|
485
491
|
component: "input",
|
|
486
492
|
props: () => ({ placeholder: getRedirectFieldPlaceholder() }),
|
|
487
493
|
itemProps: model => ({
|
|
488
|
-
required: model.type === BaseMenuType.
|
|
494
|
+
required: model.type === BaseMenuType.BASE_MENU_TYPE_EXT_LINK
|
|
489
495
|
}),
|
|
490
|
-
visible: model => model.type === BaseMenuType.
|
|
496
|
+
visible: model => model.type === BaseMenuType.BASE_MENU_TYPE_FOLDER || model.type === BaseMenuType.BASE_MENU_TYPE_EXT_LINK
|
|
491
497
|
},
|
|
492
498
|
{
|
|
493
499
|
prop: "meta.icon",
|
|
494
|
-
label: t("system.menu.field.icon"),
|
|
500
|
+
label: t("system.base.menu.field.icon"),
|
|
495
501
|
component: "slot",
|
|
496
502
|
slotName: "menuIcon",
|
|
497
503
|
itemProps: model => ({
|
|
498
|
-
required: model.type !== BaseMenuType.
|
|
504
|
+
required: model.type !== BaseMenuType.BASE_MENU_TYPE_BUTTON
|
|
499
505
|
}),
|
|
500
|
-
visible: model => !isAppMenu(model.parent_id) && model.type !== BaseMenuType.
|
|
506
|
+
visible: model => !isAppMenu(model.parent_id) && model.type !== BaseMenuType.BASE_MENU_TYPE_BUTTON
|
|
501
507
|
},
|
|
502
508
|
{
|
|
503
509
|
prop: "meta.icon",
|
|
504
|
-
label: t("system.menu.field.
|
|
510
|
+
label: t("system.base.menu.field.default_icon"),
|
|
505
511
|
component: "input",
|
|
506
|
-
labelTooltip: t("system.menu.tooltip.
|
|
512
|
+
labelTooltip: t("system.base.menu.tooltip.mobile_icon"),
|
|
507
513
|
itemProps: model => ({
|
|
508
514
|
required: Boolean(model.meta?.app?.in_tab_bar)
|
|
509
515
|
}),
|
|
510
|
-
props: { placeholder: t("system.menu.placeholder.
|
|
516
|
+
props: { placeholder: t("system.base.menu.placeholder.default_icon") },
|
|
511
517
|
visible: model => isAppMenu(model.parent_id)
|
|
512
518
|
},
|
|
513
519
|
{
|
|
514
520
|
prop: "name",
|
|
515
|
-
label: t(isAppMenu(formData.parent_id) ? "system.menu.field.
|
|
521
|
+
label: t(isAppMenu(formData.parent_id) ? "system.base.menu.field.logical_name" : "system.base.menu.field.route_name"),
|
|
516
522
|
component: "input",
|
|
517
|
-
labelTooltip: isAppMenu(formData.parent_id)
|
|
523
|
+
labelTooltip: isAppMenu(formData.parent_id)
|
|
524
|
+
? t("system.base.menu.tooltip.logical_name")
|
|
525
|
+
: t("system.base.menu.tooltip.route_name"),
|
|
518
526
|
itemProps: model => ({
|
|
519
|
-
required: model.type === BaseMenuType.
|
|
527
|
+
required: model.type === BaseMenuType.BASE_MENU_TYPE_MENU
|
|
520
528
|
}),
|
|
521
529
|
props: () => ({
|
|
522
530
|
placeholder: isAppMenu(formData.parent_id)
|
|
523
|
-
? t("system.menu.placeholder.
|
|
524
|
-
: t("system.menu.placeholder.
|
|
531
|
+
? t("system.base.menu.placeholder.logical_name")
|
|
532
|
+
: t("system.base.menu.placeholder.route_name")
|
|
525
533
|
}),
|
|
526
|
-
visible: model => model.type === BaseMenuType.
|
|
534
|
+
visible: model => model.type === BaseMenuType.BASE_MENU_TYPE_MENU
|
|
527
535
|
},
|
|
528
536
|
{
|
|
529
537
|
prop: "meta.app.view_key",
|
|
530
|
-
label: t("system.menu.field.
|
|
538
|
+
label: t("system.base.menu.field.view_key"),
|
|
531
539
|
component: "input",
|
|
532
|
-
labelTooltip: t("system.menu.tooltip.
|
|
540
|
+
labelTooltip: t("system.base.menu.tooltip.view_key"),
|
|
533
541
|
itemProps: { required: true },
|
|
534
|
-
props: { placeholder: t("system.menu.placeholder.
|
|
542
|
+
props: { placeholder: t("system.base.menu.placeholder.view_key") },
|
|
535
543
|
visible: model => isAppMenu(model.parent_id)
|
|
536
544
|
},
|
|
537
545
|
{
|
|
538
546
|
prop: "meta.app.access",
|
|
539
|
-
label: t("system.menu.field.access"),
|
|
547
|
+
label: t("system.base.menu.field.access"),
|
|
540
548
|
component: "select",
|
|
541
549
|
options: appAccessOptions.value,
|
|
542
550
|
itemProps: { required: true },
|
|
543
551
|
props: {
|
|
544
552
|
clearable: false,
|
|
545
|
-
placeholder: t("system.menu.placeholder.access")
|
|
553
|
+
placeholder: t("system.base.menu.placeholder.access")
|
|
546
554
|
},
|
|
547
555
|
visible: model => isAppMenu(model.parent_id)
|
|
548
556
|
},
|
|
549
557
|
{
|
|
550
558
|
prop: "meta.app.selected_icon",
|
|
551
|
-
label: t("system.menu.field.
|
|
559
|
+
label: t("system.base.menu.field.selected_icon"),
|
|
552
560
|
component: "input",
|
|
553
|
-
labelTooltip: t("system.menu.tooltip.
|
|
561
|
+
labelTooltip: t("system.base.menu.tooltip.mobile_icon"),
|
|
554
562
|
itemProps: { required: true },
|
|
555
|
-
props: { placeholder: t("system.menu.placeholder.
|
|
563
|
+
props: { placeholder: t("system.base.menu.placeholder.selected_icon") },
|
|
556
564
|
visible: model => isAppTab(model.parent_id)
|
|
557
565
|
},
|
|
558
566
|
{
|
|
559
567
|
prop: "component",
|
|
560
|
-
label: t("system.menu.field.component"),
|
|
568
|
+
label: t("system.base.menu.field.component"),
|
|
561
569
|
component: "input",
|
|
562
|
-
labelTooltip: t("system.menu.tooltip.component"),
|
|
570
|
+
labelTooltip: t("system.base.menu.tooltip.component"),
|
|
563
571
|
itemProps: model => ({
|
|
564
|
-
required: model.type === BaseMenuType.
|
|
572
|
+
required: model.type === BaseMenuType.BASE_MENU_TYPE_MENU && !isAppMenu(model.parent_id)
|
|
565
573
|
}),
|
|
566
574
|
props: { placeholder: "system/base/user/index" },
|
|
567
|
-
visible: model => model.type === BaseMenuType.
|
|
575
|
+
visible: model => model.type === BaseMenuType.BASE_MENU_TYPE_MENU && !isAppMenu(model.parent_id)
|
|
568
576
|
},
|
|
569
577
|
{
|
|
570
578
|
prop: "meta.hidden",
|
|
571
|
-
label: t("system.menu.field.hidden"),
|
|
579
|
+
label: t("system.base.menu.field.hidden"),
|
|
572
580
|
component: "switch",
|
|
573
581
|
props: {
|
|
574
582
|
inlinePrompt: true,
|
|
575
|
-
activeText: t("
|
|
576
|
-
inactiveText: t("
|
|
583
|
+
activeText: t("common.value.yes"),
|
|
584
|
+
inactiveText: t("common.value.no"),
|
|
577
585
|
activeValue: true,
|
|
578
586
|
inactiveValue: false
|
|
579
587
|
},
|
|
580
|
-
visible: model => !isAppMenu(model.parent_id) && model.type !== BaseMenuType.
|
|
588
|
+
visible: model => !isAppMenu(model.parent_id) && model.type !== BaseMenuType.BASE_MENU_TYPE_BUTTON
|
|
581
589
|
},
|
|
582
590
|
{
|
|
583
591
|
prop: "meta.always_show",
|
|
584
|
-
label: t("system.menu.field.
|
|
592
|
+
label: t("system.base.menu.field.always_show"),
|
|
585
593
|
component: "switch",
|
|
586
|
-
labelTooltip: t("system.menu.tooltip.
|
|
594
|
+
labelTooltip: t("system.base.menu.tooltip.always_show"),
|
|
587
595
|
props: {
|
|
588
596
|
inlinePrompt: true,
|
|
589
|
-
activeText: t("
|
|
590
|
-
inactiveText: t("
|
|
597
|
+
activeText: t("common.value.yes"),
|
|
598
|
+
inactiveText: t("common.value.no"),
|
|
591
599
|
activeValue: true,
|
|
592
600
|
inactiveValue: false
|
|
593
601
|
},
|
|
594
|
-
visible: model =>
|
|
602
|
+
visible: model =>
|
|
603
|
+
!isAppMenu(model.parent_id) &&
|
|
604
|
+
(model.type === BaseMenuType.BASE_MENU_TYPE_FOLDER || model.type === BaseMenuType.BASE_MENU_TYPE_MENU)
|
|
595
605
|
},
|
|
596
606
|
{
|
|
597
607
|
prop: "meta.keep_alive",
|
|
598
|
-
label: t("system.menu.field.
|
|
608
|
+
label: t("system.base.menu.field.keep_alive"),
|
|
599
609
|
component: "switch",
|
|
600
610
|
props: {
|
|
601
611
|
inlinePrompt: true,
|
|
@@ -604,11 +614,11 @@ const formFields = computed<ProFormField[]>(() => [
|
|
|
604
614
|
activeValue: true,
|
|
605
615
|
inactiveValue: false
|
|
606
616
|
},
|
|
607
|
-
visible: model => !isAppMenu(model.parent_id) && model.type === BaseMenuType.
|
|
617
|
+
visible: model => !isAppMenu(model.parent_id) && model.type === BaseMenuType.BASE_MENU_TYPE_MENU
|
|
608
618
|
},
|
|
609
619
|
{
|
|
610
620
|
prop: "meta.full",
|
|
611
|
-
label: t("system.menu.field.fullscreen"),
|
|
621
|
+
label: t("system.base.menu.field.fullscreen"),
|
|
612
622
|
component: "switch",
|
|
613
623
|
props: {
|
|
614
624
|
inlinePrompt: true,
|
|
@@ -617,11 +627,11 @@ const formFields = computed<ProFormField[]>(() => [
|
|
|
617
627
|
activeValue: true,
|
|
618
628
|
inactiveValue: false
|
|
619
629
|
},
|
|
620
|
-
visible: model => !isAppMenu(model.parent_id) && model.type === BaseMenuType.
|
|
630
|
+
visible: model => !isAppMenu(model.parent_id) && model.type === BaseMenuType.BASE_MENU_TYPE_MENU
|
|
621
631
|
},
|
|
622
632
|
{
|
|
623
633
|
prop: "meta.affix",
|
|
624
|
-
label: t("system.menu.field.affix"),
|
|
634
|
+
label: t("system.base.menu.field.affix"),
|
|
625
635
|
component: "switch",
|
|
626
636
|
props: {
|
|
627
637
|
inlinePrompt: true,
|
|
@@ -630,39 +640,42 @@ const formFields = computed<ProFormField[]>(() => [
|
|
|
630
640
|
activeValue: true,
|
|
631
641
|
inactiveValue: false
|
|
632
642
|
},
|
|
633
|
-
visible: model => !isAppMenu(model.parent_id) && model.type === BaseMenuType.
|
|
643
|
+
visible: model => !isAppMenu(model.parent_id) && model.type === BaseMenuType.BASE_MENU_TYPE_MENU
|
|
634
644
|
},
|
|
635
645
|
{
|
|
636
646
|
prop: "meta.params",
|
|
637
|
-
label: t("system.menu.field.
|
|
647
|
+
label: t("system.base.menu.field.route_params"),
|
|
638
648
|
component: "kv-list",
|
|
639
|
-
labelTooltip: t("system.menu.tooltip.
|
|
649
|
+
labelTooltip: t("system.base.menu.tooltip.route_params"),
|
|
640
650
|
props: {
|
|
641
|
-
addText: t("system.menu.action.
|
|
642
|
-
keyInputProps: { placeholder: t("common.field.
|
|
643
|
-
valueInputProps: { placeholder: t("common.field.
|
|
651
|
+
addText: t("system.base.menu.action.add_route_param"),
|
|
652
|
+
keyInputProps: { placeholder: t("common.field.parameter_name") },
|
|
653
|
+
valueInputProps: { placeholder: t("common.field.parameter_value") }
|
|
644
654
|
},
|
|
645
655
|
itemProps: {
|
|
646
656
|
class: "menu-form__params"
|
|
647
657
|
},
|
|
648
|
-
visible: model => !isAppMenu(model.parent_id) && model.type === BaseMenuType.
|
|
658
|
+
visible: model => !isAppMenu(model.parent_id) && model.type === BaseMenuType.BASE_MENU_TYPE_MENU
|
|
649
659
|
},
|
|
650
660
|
{
|
|
651
661
|
prop: "api",
|
|
652
|
-
label: t("system.menu.field.
|
|
662
|
+
label: t("system.base.menu.field.api_list"),
|
|
653
663
|
component: "transfer",
|
|
654
664
|
slotName: "apiTransferItem",
|
|
655
665
|
options: transferData.value,
|
|
656
666
|
props: {
|
|
657
667
|
filterable: true,
|
|
658
|
-
titles: [t("system.menu.value.
|
|
668
|
+
titles: [t("system.base.menu.value.available_api"), t("system.base.menu.value.selected_api")]
|
|
659
669
|
},
|
|
660
|
-
visible: model =>
|
|
670
|
+
visible: model =>
|
|
671
|
+
model.id === APP_MENU_ROOT_ID ||
|
|
672
|
+
model.type === BaseMenuType.BASE_MENU_TYPE_MENU ||
|
|
673
|
+
model.type === BaseMenuType.BASE_MENU_TYPE_BUTTON,
|
|
661
674
|
colSpan: 24
|
|
662
675
|
},
|
|
663
676
|
{
|
|
664
677
|
prop: "sort",
|
|
665
|
-
label: t("
|
|
678
|
+
label: t("common.field.sort"),
|
|
666
679
|
component: "input-number",
|
|
667
680
|
itemProps: {
|
|
668
681
|
required: true
|
|
@@ -677,7 +690,7 @@ const formFields = computed<ProFormField[]>(() => [
|
|
|
677
690
|
},
|
|
678
691
|
{
|
|
679
692
|
prop: "status",
|
|
680
|
-
label: t("
|
|
693
|
+
label: t("common.field.status"),
|
|
681
694
|
component: "radio-group",
|
|
682
695
|
itemProps: {
|
|
683
696
|
required: true
|
|
@@ -689,11 +702,11 @@ const formFields = computed<ProFormField[]>(() => [
|
|
|
689
702
|
const rules = computed<FormRules>(() => ({
|
|
690
703
|
parent_id: formData.id
|
|
691
704
|
? []
|
|
692
|
-
: [{ required: true, type: "number", min: 1, message: t("system.menu.placeholder.parent"), trigger: "change" }],
|
|
705
|
+
: [{ required: true, type: "number", min: 1, message: t("system.base.menu.placeholder.parent"), trigger: "change" }],
|
|
693
706
|
type: [
|
|
694
707
|
{
|
|
695
708
|
required: true,
|
|
696
|
-
message: t("
|
|
709
|
+
message: t("common.validation.required_select", { field: t("system.base.menu.field.type") }),
|
|
697
710
|
trigger: "change"
|
|
698
711
|
}
|
|
699
712
|
],
|
|
@@ -703,7 +716,11 @@ const rules = computed<FormRules>(() => ({
|
|
|
703
716
|
if (value) return callback();
|
|
704
717
|
callback(
|
|
705
718
|
new Error(
|
|
706
|
-
t(
|
|
719
|
+
t(
|
|
720
|
+
formData.type === BaseMenuType.BASE_MENU_TYPE_BUTTON
|
|
721
|
+
? "system.base.menu.placeholder.button_name"
|
|
722
|
+
: "system.base.menu.placeholder.title"
|
|
723
|
+
)
|
|
707
724
|
)
|
|
708
725
|
);
|
|
709
726
|
},
|
|
@@ -713,11 +730,13 @@ const rules = computed<FormRules>(() => ({
|
|
|
713
730
|
"meta.icon": [
|
|
714
731
|
{
|
|
715
732
|
validator: (_rule, value, callback) => {
|
|
716
|
-
if (formData.type === BaseMenuType.
|
|
733
|
+
if (formData.type === BaseMenuType.BASE_MENU_TYPE_BUTTON) return callback();
|
|
717
734
|
if (isAppMenu(formData.parent_id) && !isAppTab(formData.parent_id)) return callback();
|
|
718
735
|
if (value) return callback();
|
|
719
736
|
callback(
|
|
720
|
-
new Error(
|
|
737
|
+
new Error(
|
|
738
|
+
t(isAppMenu(formData.parent_id) ? "system.base.menu.validation.default_icon" : "system.base.menu.placeholder.icon")
|
|
739
|
+
)
|
|
721
740
|
);
|
|
722
741
|
},
|
|
723
742
|
trigger: "change"
|
|
@@ -727,7 +746,7 @@ const rules = computed<FormRules>(() => ({
|
|
|
727
746
|
{
|
|
728
747
|
validator: (_rule, value, callback) => {
|
|
729
748
|
if (!isAppMenu(formData.parent_id) || value) return callback();
|
|
730
|
-
callback(new Error(t("system.menu.validation.
|
|
749
|
+
callback(new Error(t("system.base.menu.validation.view_key")));
|
|
731
750
|
},
|
|
732
751
|
trigger: "blur"
|
|
733
752
|
}
|
|
@@ -736,7 +755,7 @@ const rules = computed<FormRules>(() => ({
|
|
|
736
755
|
{
|
|
737
756
|
validator: (_rule, value, callback) => {
|
|
738
757
|
if (!isAppMenu(formData.parent_id) || value) return callback();
|
|
739
|
-
callback(new Error(t("system.menu.placeholder.access")));
|
|
758
|
+
callback(new Error(t("system.base.menu.placeholder.access")));
|
|
740
759
|
},
|
|
741
760
|
trigger: "change"
|
|
742
761
|
}
|
|
@@ -745,7 +764,7 @@ const rules = computed<FormRules>(() => ({
|
|
|
745
764
|
{
|
|
746
765
|
validator: (_rule, value, callback) => {
|
|
747
766
|
if (!isAppTab(formData.parent_id) || value) return callback();
|
|
748
|
-
callback(new Error(t("system.menu.validation.
|
|
767
|
+
callback(new Error(t("system.base.menu.validation.selected_icon")));
|
|
749
768
|
},
|
|
750
769
|
trigger: "blur"
|
|
751
770
|
}
|
|
@@ -753,23 +772,29 @@ const rules = computed<FormRules>(() => ({
|
|
|
753
772
|
path: [
|
|
754
773
|
{
|
|
755
774
|
max: 1024,
|
|
756
|
-
message: t("
|
|
775
|
+
message: t("common.validation.max_length", { field: t("system.base.menu.field.path"), max: 1024 }),
|
|
757
776
|
trigger: "blur"
|
|
758
777
|
},
|
|
759
778
|
{
|
|
760
779
|
validator: (_rule, value, callback) => {
|
|
761
|
-
if (formData.type === BaseMenuType.
|
|
780
|
+
if (formData.type === BaseMenuType.BASE_MENU_TYPE_FOLDER) return callback();
|
|
762
781
|
if (!value) {
|
|
763
|
-
if (formData.type === BaseMenuType.
|
|
764
|
-
|
|
782
|
+
if (formData.type === BaseMenuType.BASE_MENU_TYPE_BUTTON)
|
|
783
|
+
return callback(new Error(t("system.base.menu.validation.permission")));
|
|
784
|
+
if (formData.type === BaseMenuType.BASE_MENU_TYPE_EXT_LINK)
|
|
785
|
+
return callback(new Error(t("system.base.menu.validation.external_url")));
|
|
765
786
|
return callback(
|
|
766
787
|
new Error(
|
|
767
|
-
t(
|
|
788
|
+
t(
|
|
789
|
+
isAppMenu(formData.parent_id)
|
|
790
|
+
? "system.base.menu.validation.logical_path"
|
|
791
|
+
: "system.base.menu.validation.route_path"
|
|
792
|
+
)
|
|
768
793
|
)
|
|
769
794
|
);
|
|
770
795
|
}
|
|
771
796
|
if (isAppMenu(formData.parent_id) && !String(value).startsWith("app/")) {
|
|
772
|
-
return callback(new Error(t("system.menu.validation.
|
|
797
|
+
return callback(new Error(t("system.base.menu.validation.app_path_prefix")));
|
|
773
798
|
}
|
|
774
799
|
callback();
|
|
775
800
|
},
|
|
@@ -779,14 +804,14 @@ const rules = computed<FormRules>(() => ({
|
|
|
779
804
|
redirect: [
|
|
780
805
|
{
|
|
781
806
|
max: 1024,
|
|
782
|
-
message: t("
|
|
807
|
+
message: t("common.validation.max_length", { field: t("system.base.menu.field.redirect"), max: 1024 }),
|
|
783
808
|
trigger: "blur"
|
|
784
809
|
},
|
|
785
810
|
{
|
|
786
811
|
validator: (_rule, value, callback) => {
|
|
787
|
-
if (formData.type !== BaseMenuType.
|
|
812
|
+
if (formData.type !== BaseMenuType.BASE_MENU_TYPE_EXT_LINK) return callback();
|
|
788
813
|
if (/^https?:\/\/\S+$/.test(value)) return callback();
|
|
789
|
-
callback(new Error(t("system.menu.validation.
|
|
814
|
+
callback(new Error(t("system.base.menu.validation.http_url")));
|
|
790
815
|
},
|
|
791
816
|
trigger: "blur"
|
|
792
817
|
}
|
|
@@ -794,20 +819,24 @@ const rules = computed<FormRules>(() => ({
|
|
|
794
819
|
name: [
|
|
795
820
|
{
|
|
796
821
|
max: 255,
|
|
797
|
-
message: t("
|
|
822
|
+
message: t("common.validation.max_length", { field: t("system.base.menu.field.route_name"), max: 255 }),
|
|
798
823
|
trigger: "blur"
|
|
799
824
|
},
|
|
800
825
|
{
|
|
801
826
|
validator: (_rule, value, callback) => {
|
|
802
|
-
if (formData.type !== BaseMenuType.
|
|
827
|
+
if (formData.type !== BaseMenuType.BASE_MENU_TYPE_MENU) return callback();
|
|
803
828
|
if (!value)
|
|
804
829
|
return callback(
|
|
805
830
|
new Error(
|
|
806
|
-
t(
|
|
831
|
+
t(
|
|
832
|
+
isAppMenu(formData.parent_id)
|
|
833
|
+
? "system.base.menu.validation.logical_name"
|
|
834
|
+
: "system.base.menu.placeholder.route_name"
|
|
835
|
+
)
|
|
807
836
|
)
|
|
808
837
|
);
|
|
809
838
|
if (isAppMenu(formData.parent_id) && !String(value).startsWith("App")) {
|
|
810
|
-
return callback(new Error(t("system.menu.validation.
|
|
839
|
+
return callback(new Error(t("system.base.menu.validation.app_name_prefix")));
|
|
811
840
|
}
|
|
812
841
|
callback();
|
|
813
842
|
},
|
|
@@ -817,23 +846,23 @@ const rules = computed<FormRules>(() => ({
|
|
|
817
846
|
component: [
|
|
818
847
|
{
|
|
819
848
|
max: 255,
|
|
820
|
-
message: t("
|
|
849
|
+
message: t("common.validation.max_length", { field: t("system.base.menu.field.component"), max: 255 }),
|
|
821
850
|
trigger: "blur"
|
|
822
851
|
},
|
|
823
852
|
{
|
|
824
853
|
validator: (_rule, value, callback) => {
|
|
825
|
-
if (formData.type !== BaseMenuType.
|
|
854
|
+
if (formData.type !== BaseMenuType.BASE_MENU_TYPE_MENU || isAppMenu(formData.parent_id)) return callback();
|
|
826
855
|
if (value) return callback();
|
|
827
|
-
callback(new Error(t("system.menu.validation.component")));
|
|
856
|
+
callback(new Error(t("system.base.menu.validation.component")));
|
|
828
857
|
},
|
|
829
858
|
trigger: "blur"
|
|
830
859
|
}
|
|
831
860
|
],
|
|
832
|
-
sort: [{ required: true, type: "number", min: 1, message: t("
|
|
861
|
+
sort: [{ required: true, type: "number", min: 1, message: t("common.validation.sort_positive"), trigger: "blur" }],
|
|
833
862
|
status: [
|
|
834
863
|
{
|
|
835
864
|
required: true,
|
|
836
|
-
message: t("
|
|
865
|
+
message: t("common.validation.required_select", { field: t("common.field.status") }),
|
|
837
866
|
trigger: "change"
|
|
838
867
|
}
|
|
839
868
|
]
|
|
@@ -841,38 +870,44 @@ const rules = computed<FormRules>(() => ({
|
|
|
841
870
|
|
|
842
871
|
/** 计算当前路径字段文案。 */
|
|
843
872
|
function getPathFieldLabel() {
|
|
844
|
-
if (isAppMenu(formData.parent_id)) return t("system.menu.field.
|
|
845
|
-
if (formData.type === BaseMenuType.
|
|
846
|
-
if (formData.type === BaseMenuType.
|
|
847
|
-
return t("system.menu.field.path");
|
|
873
|
+
if (isAppMenu(formData.parent_id)) return t("system.base.menu.field.logical_path");
|
|
874
|
+
if (formData.type === BaseMenuType.BASE_MENU_TYPE_BUTTON) return t("system.base.menu.field.permission");
|
|
875
|
+
if (formData.type === BaseMenuType.BASE_MENU_TYPE_EXT_LINK) return t("system.base.menu.field.internal_path");
|
|
876
|
+
return t("system.base.menu.field.path");
|
|
848
877
|
}
|
|
849
878
|
|
|
850
879
|
/** 计算当前路径字段占位文案。 */
|
|
851
880
|
function getPathFieldPlaceholder() {
|
|
852
|
-
if (isAppMenu(formData.parent_id)) return t("system.menu.placeholder.
|
|
853
|
-
if (formData.type === BaseMenuType.
|
|
854
|
-
if (formData.type === BaseMenuType.
|
|
855
|
-
if (formData.type === BaseMenuType.
|
|
881
|
+
if (isAppMenu(formData.parent_id)) return t("system.base.menu.placeholder.logical_path");
|
|
882
|
+
if (formData.type === BaseMenuType.BASE_MENU_TYPE_BUTTON) return t("system.base.menu.placeholder.permission");
|
|
883
|
+
if (formData.type === BaseMenuType.BASE_MENU_TYPE_EXT_LINK) return "external/baidu";
|
|
884
|
+
if (formData.type === BaseMenuType.BASE_MENU_TYPE_FOLDER) return "base";
|
|
856
885
|
return "user";
|
|
857
886
|
}
|
|
858
887
|
|
|
859
888
|
/** 计算当前路径字段提示文案。 */
|
|
860
889
|
function getPathFieldTooltip() {
|
|
861
|
-
if (isAppMenu(formData.parent_id)) return t("system.menu.tooltip.
|
|
862
|
-
if (formData.type === BaseMenuType.
|
|
863
|
-
if (formData.type === BaseMenuType.
|
|
864
|
-
if (formData.type === BaseMenuType.
|
|
865
|
-
return t("system.menu.tooltip.
|
|
890
|
+
if (isAppMenu(formData.parent_id)) return t("system.base.menu.tooltip.logical_path");
|
|
891
|
+
if (formData.type === BaseMenuType.BASE_MENU_TYPE_BUTTON) return t("system.base.menu.tooltip.permission");
|
|
892
|
+
if (formData.type === BaseMenuType.BASE_MENU_TYPE_EXT_LINK) return t("system.base.menu.tooltip.internal_path");
|
|
893
|
+
if (formData.type === BaseMenuType.BASE_MENU_TYPE_FOLDER) return t("system.base.menu.tooltip.folder_path");
|
|
894
|
+
return t("system.base.menu.tooltip.route_path");
|
|
866
895
|
}
|
|
867
896
|
|
|
868
897
|
/** 计算重定向字段文案。 */
|
|
869
898
|
function getRedirectFieldLabel() {
|
|
870
|
-
return t(
|
|
899
|
+
return t(
|
|
900
|
+
formData.type === BaseMenuType.BASE_MENU_TYPE_EXT_LINK
|
|
901
|
+
? "system.base.menu.field.external_url"
|
|
902
|
+
: "system.base.menu.field.redirect_route"
|
|
903
|
+
);
|
|
871
904
|
}
|
|
872
905
|
|
|
873
906
|
/** 计算重定向字段占位文案。 */
|
|
874
907
|
function getRedirectFieldPlaceholder() {
|
|
875
|
-
return formData.type === BaseMenuType.
|
|
908
|
+
return formData.type === BaseMenuType.BASE_MENU_TYPE_EXT_LINK
|
|
909
|
+
? "https://www.example.com/"
|
|
910
|
+
: t("system.base.menu.placeholder.redirect_route");
|
|
876
911
|
}
|
|
877
912
|
|
|
878
913
|
/** 判断当前图标是否为 Element Plus 图标。 */
|
|
@@ -929,7 +964,7 @@ function normalizeMenuForm(data?: Partial<BaseMenuForm>): MenuFormState {
|
|
|
929
964
|
...defaultForm,
|
|
930
965
|
...data,
|
|
931
966
|
parent_id: parentId,
|
|
932
|
-
type: data?.type ?? BaseMenuType.
|
|
967
|
+
type: data?.type ?? BaseMenuType.BASE_MENU_TYPE_FOLDER,
|
|
933
968
|
status: data?.status ?? Status.ENABLE,
|
|
934
969
|
api: normalizeMenuApiSelection(data?.api),
|
|
935
970
|
sort: data?.sort ?? 1,
|
|
@@ -943,7 +978,7 @@ function buildMenuOptions(menuList: BaseMenu[] = []) {
|
|
|
943
978
|
const mobileIds = new Set<number>([APP_MENU_ROOT_ID]);
|
|
944
979
|
const convert = (list: BaseMenu[]): ProFormOption[] =>
|
|
945
980
|
list
|
|
946
|
-
.filter(item => item.type === BaseMenuType.
|
|
981
|
+
.filter(item => item.type === BaseMenuType.BASE_MENU_TYPE_FOLDER || item.type === BaseMenuType.BASE_MENU_TYPE_MENU)
|
|
947
982
|
.map(item => {
|
|
948
983
|
typeMap.set(item.id, item.type);
|
|
949
984
|
if (mobileIds.has(item.parent_id ?? 0)) mobileIds.add(item.id);
|
|
@@ -962,7 +997,11 @@ function buildMenuOptions(menuList: BaseMenu[] = []) {
|
|
|
962
997
|
/** 根据菜单类型清理无效字段,避免提交脏数据。 */
|
|
963
998
|
function buildSubmitPayload(): BaseMenuForm {
|
|
964
999
|
const payload = normalizeMenuForm(formData);
|
|
965
|
-
payload.translations = serializeDynamicTranslations(
|
|
1000
|
+
payload.translations = serializeDynamicTranslations(
|
|
1001
|
+
translationValues.value,
|
|
1002
|
+
TranslationTargetType.TRANSLATION_TARGET_TYPE_BASE_MENU,
|
|
1003
|
+
payload.id
|
|
1004
|
+
);
|
|
966
1005
|
// 一级菜单在表单中保持空白,提交时仍按接口约定传回根节点标识。
|
|
967
1006
|
if (payload.id > 0 && payload.parent_id === undefined) payload.parent_id = 0;
|
|
968
1007
|
payload.meta.params = (payload.meta.params ?? []).filter(item => item.key || item.value);
|
|
@@ -981,7 +1020,7 @@ function buildSubmitPayload(): BaseMenuForm {
|
|
|
981
1020
|
if (!payload.meta.app.in_tab_bar) payload.meta.app.selected_icon = undefined;
|
|
982
1021
|
}
|
|
983
1022
|
|
|
984
|
-
if (payload.type === BaseMenuType.
|
|
1023
|
+
if (payload.type === BaseMenuType.BASE_MENU_TYPE_BUTTON) {
|
|
985
1024
|
payload.name = "";
|
|
986
1025
|
payload.component = "";
|
|
987
1026
|
payload.redirect = "";
|
|
@@ -994,7 +1033,7 @@ function buildSubmitPayload(): BaseMenuForm {
|
|
|
994
1033
|
payload.meta.params = [];
|
|
995
1034
|
}
|
|
996
1035
|
|
|
997
|
-
if (payload.type === BaseMenuType.
|
|
1036
|
+
if (payload.type === BaseMenuType.BASE_MENU_TYPE_FOLDER) {
|
|
998
1037
|
payload.path = "";
|
|
999
1038
|
payload.name = "";
|
|
1000
1039
|
payload.component = "Layout";
|
|
@@ -1005,7 +1044,7 @@ function buildSubmitPayload(): BaseMenuForm {
|
|
|
1005
1044
|
payload.meta.params = [];
|
|
1006
1045
|
}
|
|
1007
1046
|
|
|
1008
|
-
if (payload.type === BaseMenuType.
|
|
1047
|
+
if (payload.type === BaseMenuType.BASE_MENU_TYPE_EXT_LINK) {
|
|
1009
1048
|
payload.name = "";
|
|
1010
1049
|
payload.component = "";
|
|
1011
1050
|
payload.api = [];
|
|
@@ -1080,7 +1119,7 @@ async function handleOpenDialog(parentMenu?: BaseMenu, menuId?: number) {
|
|
|
1080
1119
|
await loadDialogResources();
|
|
1081
1120
|
dialog.parentLocked = Boolean(parentMenu || menuId);
|
|
1082
1121
|
dialog.editing = Boolean(menuId);
|
|
1083
|
-
dialog.parentType = parentMenu?.type ?? BaseMenuType.
|
|
1122
|
+
dialog.parentType = parentMenu?.type ?? BaseMenuType.BASE_MENU_TYPE_UNSPECIFIED;
|
|
1084
1123
|
resetForm(menuId ? undefined : { parent_id: parentMenu?.id });
|
|
1085
1124
|
dialog.visible = true;
|
|
1086
1125
|
|
|
@@ -1094,7 +1133,7 @@ async function handleOpenDialog(parentMenu?: BaseMenu, menuId?: number) {
|
|
|
1094
1133
|
/** 关闭菜单弹窗并显式重置表单与校验状态。 */
|
|
1095
1134
|
function handleCloseDialog() {
|
|
1096
1135
|
dialog.visible = false;
|
|
1097
|
-
dialog.parentType = BaseMenuType.
|
|
1136
|
+
dialog.parentType = BaseMenuType.BASE_MENU_TYPE_UNSPECIFIED;
|
|
1098
1137
|
dialog.parentLocked = true;
|
|
1099
1138
|
resetForm();
|
|
1100
1139
|
}
|
|
@@ -1115,10 +1154,10 @@ async function handleSubmit() {
|
|
|
1115
1154
|
const payload = buildSubmitPayload();
|
|
1116
1155
|
if (payload.id > 0) {
|
|
1117
1156
|
await defBaseMenuService.UpdateBaseMenu({ base_menu: payload });
|
|
1118
|
-
ElMessage.success(t("system.menu.message.
|
|
1157
|
+
ElMessage.success(t("system.base.menu.message.update_success"));
|
|
1119
1158
|
} else {
|
|
1120
1159
|
await defBaseMenuService.CreateBaseMenu({ base_menu: payload });
|
|
1121
|
-
ElMessage.success(t("system.menu.message.
|
|
1160
|
+
ElMessage.success(t("system.base.menu.message.create_success"));
|
|
1122
1161
|
}
|
|
1123
1162
|
|
|
1124
1163
|
handleCloseDialog();
|
|
@@ -1133,13 +1172,17 @@ async function handleBeforeSetStatus(row: BaseMenu) {
|
|
|
1133
1172
|
const action = t(nextStatus === Status.ENABLE ? "common.status.enabled" : "common.status.disabled");
|
|
1134
1173
|
const menuName = row.meta?.title || row.name || row.path || `ID:${row.id}`;
|
|
1135
1174
|
try {
|
|
1136
|
-
await ElMessageBox.confirm(
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1175
|
+
await ElMessageBox.confirm(
|
|
1176
|
+
t("system.base.menu.message.confirm_status", { action, name: menuName }),
|
|
1177
|
+
t("common.title.notice"),
|
|
1178
|
+
{
|
|
1179
|
+
confirmButtonText: t("common.action.confirm"),
|
|
1180
|
+
cancelButtonText: t("common.action.cancel"),
|
|
1181
|
+
type: "warning"
|
|
1182
|
+
}
|
|
1183
|
+
);
|
|
1141
1184
|
await defBaseMenuService.SetBaseMenuStatus({ id: row.id, status: nextStatus });
|
|
1142
|
-
ElMessage.success(t("
|
|
1185
|
+
ElMessage.success(t("common.message.status_success", { action }));
|
|
1143
1186
|
refreshTable();
|
|
1144
1187
|
return true;
|
|
1145
1188
|
} catch {
|
|
@@ -1157,23 +1200,23 @@ function handleDeleteMenu(selected?: number | string | Array<number | string> |
|
|
|
1157
1200
|
? [selected as BaseMenu]
|
|
1158
1201
|
: [];
|
|
1159
1202
|
if (menuList.some(item => item.parent_id === 0 || item.id === APP_MENU_ROOT_ID)) {
|
|
1160
|
-
ElMessage.warning(t("system.menu.message.
|
|
1203
|
+
ElMessage.warning(t("system.base.menu.message.protected_delete"));
|
|
1161
1204
|
return;
|
|
1162
1205
|
}
|
|
1163
1206
|
const menuIds = (
|
|
1164
1207
|
menuList.length ? menuList.map(item => item.id) : normalizeSelectedIds(selected as number | string | Array<number | string>)
|
|
1165
1208
|
).join(",");
|
|
1166
1209
|
if (!menuIds) {
|
|
1167
|
-
ElMessage.warning(t("
|
|
1210
|
+
ElMessage.warning(t("common.message.select_delete_item"));
|
|
1168
1211
|
return;
|
|
1169
1212
|
}
|
|
1170
1213
|
|
|
1171
1214
|
const singleMenuName = menuList[0]?.meta?.title || menuList[0]?.name || menuList[0]?.path || `ID:${menuList[0]?.id ?? ""}`;
|
|
1172
1215
|
const confirmMessage = menuList.length
|
|
1173
1216
|
? menuList.length === 1
|
|
1174
|
-
? t("system.menu.message.
|
|
1175
|
-
: t("system.menu.message.
|
|
1176
|
-
: t("system.menu.message.
|
|
1217
|
+
? t("system.base.menu.message.confirm_delete_single", { name: singleMenuName })
|
|
1218
|
+
: t("system.base.menu.message.confirm_delete_batch", { count: menuList.length })
|
|
1219
|
+
: t("system.base.menu.message.confirm_delete_selected");
|
|
1177
1220
|
|
|
1178
1221
|
ElMessageBox.confirm(confirmMessage, t("common.title.warning"), {
|
|
1179
1222
|
confirmButtonText: t("common.action.confirm"),
|
|
@@ -1182,12 +1225,12 @@ function handleDeleteMenu(selected?: number | string | Array<number | string> |
|
|
|
1182
1225
|
}).then(
|
|
1183
1226
|
() => {
|
|
1184
1227
|
defBaseMenuService.DeleteBaseMenu({ id: menuIds }).then(() => {
|
|
1185
|
-
ElMessage.success(t("system.menu.message.
|
|
1228
|
+
ElMessage.success(t("system.base.menu.message.delete_success"));
|
|
1186
1229
|
refreshTable();
|
|
1187
1230
|
});
|
|
1188
1231
|
},
|
|
1189
1232
|
() => {
|
|
1190
|
-
ElMessage.info(t("system.menu.message.
|
|
1233
|
+
ElMessage.info(t("system.base.menu.message.delete_canceled"));
|
|
1191
1234
|
}
|
|
1192
1235
|
);
|
|
1193
1236
|
}
|