@liujitcn/kratos-admin-system 0.0.39 → 0.0.41
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/README.md +22 -0
- package/dist/package/declarations/src/api/system/admin/v1/base_config.d.ts +1 -5
- package/dist/package/declarations/src/components/DynamicI18nCell.vue.d.ts +2 -8
- package/dist/package/declarations/src/components/DynamicI18nEditor.vue.d.ts +20 -3
- package/dist/package/declarations/src/components/dynamicI18n.d.ts +2 -2
- package/dist/package/declarations/src/locales/generated.d.ts +5797 -5813
- package/dist/package/declarations/src/rpc/system/admin/v1/base_config.d.ts +4 -40
- package/dist/package/declarations/src/utils/code-gen-progress.d.ts +3 -0
- package/dist/package/declarations/src/views/tool/code-gen/components/CodeGenGenerateConfirm.vue.d.ts +11 -0
- package/dist/package/declarations/src/views/tool/code-gen/components/CodeGenLocaleEditor.vue.d.ts +5 -9
- package/dist/package/declarations/src/views/tool/code-gen/config.d.ts +3 -0
- package/dist/package/src/api/system/admin/v1/base_config.ts +0 -20
- package/dist/package/src/components/DynamicI18nCell.vue +55 -220
- package/dist/package/src/components/DynamicI18nEditor.vue +150 -146
- package/dist/package/src/components/dynamicI18n.ts +10 -6
- package/dist/package/src/config/index.ts +1 -3
- package/dist/package/src/locales/en-US.json +1430 -1434
- package/dist/package/src/locales/ja-JP.json +1430 -1434
- package/dist/package/src/locales/zh-CN.json +1429 -1433
- package/dist/package/src/locales/zh-TW.json +1429 -1433
- package/dist/package/src/module.ts +0 -1
- package/dist/package/src/rpc/system/admin/v1/base_config.ts +3 -43
- package/dist/package/src/utils/code-gen-progress.ts +15 -0
- package/dist/package/src/views/base/config/index.vue +183 -48
- package/dist/package/src/views/base/dict/index.vue +6 -9
- package/dist/package/src/views/base/dict/item.vue +6 -15
- package/dist/package/src/views/base/job/index.vue +16 -17
- package/dist/package/src/views/base/menu/index.vue +78 -15
- package/dist/package/src/views/tool/code-gen/columns/index.vue +17 -25
- package/dist/package/src/views/tool/code-gen/components/CodeGenGenerateConfirm.vue +115 -0
- package/dist/package/src/views/tool/code-gen/components/CodeGenLocaleEditor.vue +27 -186
- package/dist/package/src/views/tool/code-gen/components/CodeGenProgressDialog.vue +2 -0
- package/dist/package/src/views/tool/code-gen/config.ts +15 -1
- package/dist/package/src/views/tool/code-gen/table/index.vue +69 -40
- package/package.json +3 -2
- package/dist/package/declarations/src/config/database-backup.d.ts +0 -12
- package/dist/package/declarations/src/views/base/runtime-config/index.vue.d.ts +0 -3
- package/dist/package/src/config/database-backup.ts +0 -57
- package/dist/package/src/views/base/runtime-config/index.vue +0 -479
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { getEditableLanguageOptions } from "@liujitcn/kratos-admin-system/components/dynamicI18n";
|
|
2
|
+
import type { CodeGenLocaleConfig } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_i18n";
|
|
1
3
|
import type { FormRules } from "element-plus";
|
|
2
4
|
import { t } from "@liujitcn/kratos-admin-core";
|
|
3
5
|
import type { ProFormComponentType, ProFormOption } from "@liujitcn/kratos-admin-core/components/ProForm/interface";
|
|
@@ -122,7 +124,9 @@ export function codeGenTableRules(): FormRules {
|
|
|
122
124
|
{ required: true, type: "number", min: 1, message: t("system.code.gen.validation.parent_menu_required"), trigger: "change" }
|
|
123
125
|
],
|
|
124
126
|
page_type: [{ required: true, max: 32, message: t("system.code.gen.validation.page_type_required"), trigger: "change" }],
|
|
125
|
-
parent_column: [
|
|
127
|
+
parent_column: [
|
|
128
|
+
{ required: true, max: 64, message: t("system.code.gen.validation.parent_column_required"), trigger: "change" }
|
|
129
|
+
],
|
|
126
130
|
tree_label_column: [
|
|
127
131
|
{ required: true, max: 64, message: t("system.code.gen.validation.tree_label_required"), trigger: "change" }
|
|
128
132
|
],
|
|
@@ -213,3 +217,13 @@ export function createDefaultCodeGenOptionConfig(): CodeGenColumnOptionConfig {
|
|
|
213
217
|
lazy: false
|
|
214
218
|
};
|
|
215
219
|
}
|
|
220
|
+
|
|
221
|
+
/** 保存代码生成配置时,以原值补齐尚未填写的启用语言描述。 */
|
|
222
|
+
export function withCodeGenLocaleDefaults(values: Map<string, CodeGenLocaleConfig>, comment: string, leftTreeComment = "") {
|
|
223
|
+
const result = new Map(values);
|
|
224
|
+
for (const { value } of getEditableLanguageOptions()) {
|
|
225
|
+
const current = values.get(value);
|
|
226
|
+
result.set(value, { comment: current?.comment || comment, left_tree_comment: current?.left_tree_comment || leftTreeComment });
|
|
227
|
+
}
|
|
228
|
+
return result;
|
|
229
|
+
}
|
|
@@ -30,11 +30,16 @@
|
|
|
30
30
|
>
|
|
31
31
|
<template #tableI18nConfig>
|
|
32
32
|
<CodeGenLocaleEditor
|
|
33
|
-
class="code-gen-table-locales"
|
|
34
33
|
:model-value="formData.i18n_config"
|
|
35
34
|
:source-comment="formData.comment"
|
|
36
|
-
:
|
|
37
|
-
|
|
35
|
+
@update:model-value="value => (formData.i18n_config = value)"
|
|
36
|
+
/>
|
|
37
|
+
</template>
|
|
38
|
+
<template #leftTreeI18nConfig>
|
|
39
|
+
<CodeGenLocaleEditor
|
|
40
|
+
:model-value="formData.i18n_config"
|
|
41
|
+
:source-comment="formData.left_tree_config?.comment"
|
|
42
|
+
field="left_tree_comment"
|
|
38
43
|
@update:model-value="value => (formData.i18n_config = value)"
|
|
39
44
|
/>
|
|
40
45
|
</template>
|
|
@@ -51,7 +56,7 @@
|
|
|
51
56
|
</template>
|
|
52
57
|
|
|
53
58
|
<script setup lang="ts">
|
|
54
|
-
import { computed, nextTick, reactive, ref } from "vue";
|
|
59
|
+
import { computed, h, onBeforeUnmount, nextTick, reactive, ref } from "vue";
|
|
55
60
|
import { useRouter } from "vue-router";
|
|
56
61
|
import {
|
|
57
62
|
CirclePlus,
|
|
@@ -90,8 +95,11 @@ import { CodeGenTableStatus } from "@liujitcn/kratos-admin-system/rpc/system/adm
|
|
|
90
95
|
import { buildPageRequest, normalizeSelectedIds } from "@liujitcn/kratos-admin-core/table";
|
|
91
96
|
import { t } from "@liujitcn/kratos-admin-core";
|
|
92
97
|
import CodeGenProgressDialog from "../components/CodeGenProgressDialog.vue";
|
|
98
|
+
import { loadEnabledBaseLanguages } from "@liujitcn/kratos-admin-system/api/system/admin/v1/base_language";
|
|
93
99
|
import CodeGenLocaleEditor from "../components/CodeGenLocaleEditor.vue";
|
|
100
|
+
import CodeGenGenerateConfirm from "../components/CodeGenGenerateConfirm.vue";
|
|
94
101
|
import {
|
|
102
|
+
withCodeGenLocaleDefaults,
|
|
95
103
|
codeGenPageTypeOptions,
|
|
96
104
|
codeGenTableRules,
|
|
97
105
|
createDefaultCodeGenLeftTreeConfig,
|
|
@@ -224,20 +232,13 @@ const formFields = computed<ProFormField[]>(() => [
|
|
|
224
232
|
},
|
|
225
233
|
{
|
|
226
234
|
prop: "comment",
|
|
235
|
+
suffixSlotName: "tableI18nConfig",
|
|
227
236
|
label: t("system.code.gen.table.field.comment"),
|
|
228
237
|
component: "input",
|
|
229
238
|
colSpan: 24,
|
|
230
239
|
labelTooltip: t("system.code.gen.table.tooltip.comment"),
|
|
231
240
|
props: { placeholder: t("system.code.gen.table.placeholder.comment") }
|
|
232
241
|
},
|
|
233
|
-
{
|
|
234
|
-
prop: "i18n_config",
|
|
235
|
-
label: t("system.code.gen.i18n.field.i18ns"),
|
|
236
|
-
component: "slot",
|
|
237
|
-
slotName: "tableI18nConfig",
|
|
238
|
-
colSpan: 24,
|
|
239
|
-
labelTooltip: t("system.code.gen.i18n.tooltip.table")
|
|
240
|
-
},
|
|
241
242
|
{
|
|
242
243
|
prop: "business_module",
|
|
243
244
|
label: t("system.code.gen.table.field.business_module"),
|
|
@@ -315,6 +316,7 @@ const formFields = computed<ProFormField[]>(() => [
|
|
|
315
316
|
},
|
|
316
317
|
{
|
|
317
318
|
prop: "left_tree_config.comment",
|
|
319
|
+
suffixSlotName: "leftTreeI18nConfig",
|
|
318
320
|
label: t("system.code.gen.table.field.left_tree_comment"),
|
|
319
321
|
component: "input",
|
|
320
322
|
labelTooltip: t("system.code.gen.table.tooltip.left_tree_comment"),
|
|
@@ -599,6 +601,37 @@ async function handleOpenCodePreview(tableId: number) {
|
|
|
599
601
|
await router.push(`/code/gen/code/preview/${tableId}`);
|
|
600
602
|
}
|
|
601
603
|
|
|
604
|
+
let releaseGenerationHotUpdates: (() => void) | undefined;
|
|
605
|
+
|
|
606
|
+
/** 等待开发服务器暂停热更新,避免生成文件的中间状态反复刷新页面。 */
|
|
607
|
+
async function holdGenerationHotUpdates() {
|
|
608
|
+
const hot = import.meta.hot;
|
|
609
|
+
if (!hot || releaseGenerationHotUpdates) return;
|
|
610
|
+
await new Promise<void>(resolve => {
|
|
611
|
+
const held = () => {
|
|
612
|
+
clearTimeout(timeout);
|
|
613
|
+
hot.off("admin:codegen-held", held);
|
|
614
|
+
releaseGenerationHotUpdates = () => hot.send("admin:codegen-release", {});
|
|
615
|
+
resolve();
|
|
616
|
+
};
|
|
617
|
+
const timeout = setTimeout(() => {
|
|
618
|
+
hot.off("admin:codegen-held", held);
|
|
619
|
+
hot.send("admin:codegen-release", {});
|
|
620
|
+
resolve();
|
|
621
|
+
}, 2000);
|
|
622
|
+
hot.on("admin:codegen-held", held);
|
|
623
|
+
hot.send("admin:codegen-hold", {});
|
|
624
|
+
});
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
/** 任务结束且结果弹窗关闭后恢复开发热更新。 */
|
|
628
|
+
function releaseGenerationUpdates() {
|
|
629
|
+
releaseGenerationHotUpdates?.();
|
|
630
|
+
releaseGenerationHotUpdates = undefined;
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
onBeforeUnmount(releaseGenerationUpdates);
|
|
634
|
+
|
|
602
635
|
/** 创建单项或批量代码生成任务。 */
|
|
603
636
|
async function handleGenerate(selected: CodeGenGenerateTarget) {
|
|
604
637
|
const tables = Array.isArray(selected) ? selected : [selected];
|
|
@@ -612,7 +645,7 @@ async function handleGenerate(selected: CodeGenGenerateTarget) {
|
|
|
612
645
|
return;
|
|
613
646
|
}
|
|
614
647
|
generating.value = true;
|
|
615
|
-
let missingI18ns: string[] = [];
|
|
648
|
+
let missingI18ns: Array<{ name: string; items: string[] }> = [];
|
|
616
649
|
try {
|
|
617
650
|
const previewEntries = await Promise.all(
|
|
618
651
|
tables.map(async table => ({
|
|
@@ -620,34 +653,31 @@ async function handleGenerate(selected: CodeGenGenerateTarget) {
|
|
|
620
653
|
preview: await defCodeGenService.PreviewCodeGen({ table_id: table.id, output_paths: undefined })
|
|
621
654
|
}))
|
|
622
655
|
);
|
|
623
|
-
missingI18ns = previewEntries
|
|
624
|
-
(preview
|
|
625
|
-
|
|
656
|
+
missingI18ns = previewEntries
|
|
657
|
+
.map(({ table, preview }) => ({ name: table.name, items: preview.missing_i18ns ?? [] }))
|
|
658
|
+
.filter(group => group.items.length);
|
|
626
659
|
} finally {
|
|
627
660
|
generating.value = false;
|
|
628
661
|
}
|
|
629
|
-
if (missingI18ns.length) {
|
|
630
|
-
ElMessage.warning(
|
|
631
|
-
t("system.code.gen.preview.message.missing_i18ns", {
|
|
632
|
-
items: missingI18ns.join(t("system.code.gen.preview.value.list_separator"))
|
|
633
|
-
})
|
|
634
|
-
);
|
|
635
|
-
}
|
|
636
662
|
const message =
|
|
637
663
|
tables.length === 1
|
|
638
664
|
? t("system.code.gen.table.dialog.generate_one", { name: tables[0].name })
|
|
639
665
|
: t("system.code.gen.table.dialog.generate_batch", { count: tables.length });
|
|
640
666
|
try {
|
|
641
|
-
|
|
642
|
-
|
|
667
|
+
const content = h(CodeGenGenerateConfirm, { message, groups: missingI18ns });
|
|
668
|
+
await ElMessageBox.confirm(content, t("system.code.gen.table.dialog.generate_title"), {
|
|
669
|
+
confirmButtonText: t("system.code.gen.action.generate"),
|
|
643
670
|
cancelButtonText: t("common.action.cancel"),
|
|
644
|
-
|
|
671
|
+
customClass: "code-gen-generate-confirm",
|
|
672
|
+
showClose: true,
|
|
673
|
+
closeOnClickModal: false
|
|
645
674
|
});
|
|
646
675
|
} catch {
|
|
647
676
|
return;
|
|
648
677
|
}
|
|
649
678
|
generating.value = true;
|
|
650
679
|
try {
|
|
680
|
+
await holdGenerationHotUpdates();
|
|
651
681
|
const data = await defCodeGenService.StartCodeGenTask({
|
|
652
682
|
table_ids: tables.map(table => table.id)
|
|
653
683
|
});
|
|
@@ -659,6 +689,7 @@ async function handleGenerate(selected: CodeGenGenerateTarget) {
|
|
|
659
689
|
handleProgressDialogVisibleChange(true);
|
|
660
690
|
} catch (error) {
|
|
661
691
|
generating.value = false;
|
|
692
|
+
releaseGenerationUpdates();
|
|
662
693
|
throw error;
|
|
663
694
|
}
|
|
664
695
|
}
|
|
@@ -704,11 +735,13 @@ function handleProgressDialogVisibleChange(visible: boolean) {
|
|
|
704
735
|
return;
|
|
705
736
|
}
|
|
706
737
|
window.sessionStorage.removeItem(codeGenProgressDialogVisibleStorageKey);
|
|
738
|
+
if (!generating.value) releaseGenerationUpdates();
|
|
707
739
|
}
|
|
708
740
|
|
|
709
741
|
/** 生成任务结束后刷新列表。 */
|
|
710
742
|
function handleProgressCompleted() {
|
|
711
743
|
generating.value = false;
|
|
744
|
+
if (!progressDialogVisible.value) releaseGenerationUpdates();
|
|
712
745
|
window.sessionStorage.removeItem(codeGenProgressDialogVisibleStorageKey);
|
|
713
746
|
progressSelectedTableIds.value = [];
|
|
714
747
|
proTable.value?.clearSelection();
|
|
@@ -746,6 +779,7 @@ function removeProgressSelectedTableIds() {
|
|
|
746
779
|
|
|
747
780
|
/** 请求代码生成表配置列表。 */
|
|
748
781
|
async function requestCodeGenTable(params: PageCodeGenTableRequest) {
|
|
782
|
+
await loadEnabledBaseLanguages();
|
|
749
783
|
const data = await defCodeGenTableService.PageCodeGenTable(buildPageRequest(params));
|
|
750
784
|
return { data: { ...data, list: data.code_gen_tables ?? [] } };
|
|
751
785
|
}
|
|
@@ -856,7 +890,15 @@ async function handleSubmit() {
|
|
|
856
890
|
if (!valid) return;
|
|
857
891
|
if (!formData.parent_menu_id) return;
|
|
858
892
|
|
|
859
|
-
const payload: CodeGenTableForm = {
|
|
893
|
+
const payload: CodeGenTableForm = {
|
|
894
|
+
...formData,
|
|
895
|
+
parent_menu_id: formData.parent_menu_id,
|
|
896
|
+
i18n_config: withCodeGenLocaleDefaults(
|
|
897
|
+
formData.i18n_config,
|
|
898
|
+
formData.comment,
|
|
899
|
+
formData.page_type === "left_tree" ? formData.left_tree_config?.comment : ""
|
|
900
|
+
)
|
|
901
|
+
};
|
|
860
902
|
saving.value = true;
|
|
861
903
|
try {
|
|
862
904
|
if (formData.id) {
|
|
@@ -1016,20 +1058,7 @@ function ensureLeftTreeConfig() {
|
|
|
1016
1058
|
</script>
|
|
1017
1059
|
|
|
1018
1060
|
<style scoped lang="scss">
|
|
1019
|
-
.code-gen-table-locales {
|
|
1020
|
-
display: grid;
|
|
1021
|
-
grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
|
|
1022
|
-
width: 100%;
|
|
1023
|
-
min-width: 0;
|
|
1024
|
-
:deep(.el-alert) {
|
|
1025
|
-
grid-column: 1 / -1;
|
|
1026
|
-
}
|
|
1027
|
-
}
|
|
1028
|
-
|
|
1029
1061
|
@media (max-width: 767px) {
|
|
1030
|
-
.code-gen-table-locales {
|
|
1031
|
-
grid-template-columns: 1fr;
|
|
1032
|
-
}
|
|
1033
1062
|
:deep(.code-gen-table-form) {
|
|
1034
1063
|
.el-col {
|
|
1035
1064
|
flex: 0 0 100%;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@liujitcn/kratos-admin-system",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.41",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "kratos-admin system management module",
|
|
7
7
|
"license": "MIT",
|
|
@@ -11,11 +11,12 @@
|
|
|
11
11
|
"url": "git@github.com:liujitcn/kratos-admin.git"
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
+
"@lucide/vue": "^1.39.0",
|
|
14
15
|
"@microsoft/fetch-event-source": "^2.0.1",
|
|
15
16
|
"sortablejs": "^1.15.2",
|
|
16
17
|
"swagger-ui-dist": "^5.32.9",
|
|
17
18
|
"vue-element-plus-x": "^2.0.3",
|
|
18
|
-
"@liujitcn/kratos-admin-core": "0.0.
|
|
19
|
+
"@liujitcn/kratos-admin-core": "0.0.41"
|
|
19
20
|
},
|
|
20
21
|
"peerDependencies": {
|
|
21
22
|
"@element-plus/icons-vue": "^2.3.1",
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { RuntimeConfigDefinition } from "./types";
|
|
2
|
-
/** 数据库备份配置模型。 */
|
|
3
|
-
export interface DatabaseBackupConfig {
|
|
4
|
-
enabled: boolean;
|
|
5
|
-
integrity_key: string;
|
|
6
|
-
encryption_key: string;
|
|
7
|
-
directory: string;
|
|
8
|
-
gzip: boolean;
|
|
9
|
-
retention_count: number;
|
|
10
|
-
}
|
|
11
|
-
/** 数据库备份配置定义。 */
|
|
12
|
-
export declare const databaseBackupConfig: RuntimeConfigDefinition<DatabaseBackupConfig>;
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
2
|
-
declare const _default: typeof __VLS_export;
|
|
3
|
-
export default _default;
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { Coin } from "@element-plus/icons-vue";
|
|
2
|
-
import type { RuntimeConfigDefinition } from "./types";
|
|
3
|
-
|
|
4
|
-
/** 数据库备份配置模型。 */
|
|
5
|
-
export interface DatabaseBackupConfig {
|
|
6
|
-
enabled: boolean;
|
|
7
|
-
integrity_key: string;
|
|
8
|
-
encryption_key: string;
|
|
9
|
-
directory: string;
|
|
10
|
-
gzip: boolean;
|
|
11
|
-
retention_count: number;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/** 数据库备份配置定义。 */
|
|
15
|
-
export const databaseBackupConfig: RuntimeConfigDefinition<DatabaseBackupConfig> = {
|
|
16
|
-
key: "databaseBackup",
|
|
17
|
-
titleKey: "system.base.runtime_config.backup.title",
|
|
18
|
-
descriptionKey: "system.base.runtime_config.backup.description",
|
|
19
|
-
icon: Coin,
|
|
20
|
-
createModel: () => ({
|
|
21
|
-
enabled: false,
|
|
22
|
-
integrity_key: "",
|
|
23
|
-
encryption_key: "",
|
|
24
|
-
directory: "./backups",
|
|
25
|
-
gzip: true,
|
|
26
|
-
retention_count: 7
|
|
27
|
-
}),
|
|
28
|
-
fields: [
|
|
29
|
-
{ prop: "enabled", labelKey: "system.base.runtime_config.field.enabled", component: "switch" },
|
|
30
|
-
{
|
|
31
|
-
prop: "integrity_key",
|
|
32
|
-
labelKey: "system.base.runtime_config.field.integrity_key",
|
|
33
|
-
component: "password",
|
|
34
|
-
props: { showPassword: true, autocomplete: "new-password" }
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
prop: "encryption_key",
|
|
38
|
-
labelKey: "system.base.runtime_config.field.encryption_key",
|
|
39
|
-
component: "password",
|
|
40
|
-
props: { showPassword: true, autocomplete: "new-password" }
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
prop: "directory",
|
|
44
|
-
labelKey: "system.base.runtime_config.field.directory",
|
|
45
|
-
component: "input",
|
|
46
|
-
rules: [{ required: true, messageKey: "system.base.runtime_config.validation.directory", trigger: "blur" }]
|
|
47
|
-
},
|
|
48
|
-
{ prop: "gzip", labelKey: "system.base.runtime_config.field.gzip", component: "switch" },
|
|
49
|
-
{
|
|
50
|
-
prop: "retention_count",
|
|
51
|
-
labelKey: "system.base.runtime_config.field.retention_count",
|
|
52
|
-
component: "input-number",
|
|
53
|
-
props: { min: 1, max: 1000, controls: true },
|
|
54
|
-
rules: [{ type: "number", min: 1, messageKey: "system.base.runtime_config.validation.retention_count", trigger: "blur" }]
|
|
55
|
-
}
|
|
56
|
-
]
|
|
57
|
-
};
|