diff --git a/packages/shared/package.json b/packages/shared/package.json index 9ef1f88ef..642ab4078 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -40,9 +40,11 @@ "dependencies": { "@halo-dev/api-client": "^0.0.14", "@halo-dev/components": "workspace:*", - "axios": "^0.27.2" + "axios": "^0.27.2", + "lodash.merge": "^4.6.2" }, "devDependencies": { + "@types/lodash.merge": "^4.6.7", "vite-plugin-dts": "^1.4.1" }, "peerDependencies": { diff --git a/packages/shared/src/composables/use-setting-form.ts b/packages/shared/src/composables/use-setting-form.ts index a2a66c770..6c4a615cc 100644 --- a/packages/shared/src/composables/use-setting-form.ts +++ b/packages/shared/src/composables/use-setting-form.ts @@ -6,8 +6,10 @@ import { apiClient } from "../utils/api-client"; // libs import cloneDeep from "lodash.clonedeep"; +import merge from "lodash.merge"; import type { FormKitSetting, FormKitSettingSpec } from "../types/formkit"; import type { ConfigMap } from "@halo-dev/api-client"; +import type { FormKitSchemaNode } from "@formkit/core"; const initialConfigMap: ConfigMap = { apiVersion: "v1alpha1", @@ -38,6 +40,7 @@ export function useSettingForm( const configMapFormData = ref< Record> | undefined >(); + const saving = ref(false); const handleFetchSettings = async () => { @@ -50,6 +53,27 @@ export function useSettingForm( name: settingName.value, }); settings.value = response.data as FormKitSetting; + + // init configMapFormData + if (!configMapFormData.value) { + const { spec: schemaGroups } = settings.value; + const initialConfigMapFormData: Record< + string, + Record + > = {}; + schemaGroups.forEach((schemaGroup) => { + initialConfigMapFormData[schemaGroup.group] = {}; + const formSchema = schemaGroup.formSchema as FormKitSchemaNode[]; + formSchema.forEach((schema) => { + // @ts-ignore + if ("name" in schema && "$formkit" in schema) { + initialConfigMapFormData[schemaGroup.group][schema.name] = + schema.value || undefined; + } + }); + }); + configMapFormData.value = cloneDeep(initialConfigMapFormData); + } } catch (e) { console.error(e); } @@ -67,27 +91,27 @@ export function useSettingForm( name: configMapName.value, } ); + configMap.value = response.data; const { data } = configMap.value; if (data) { - configMapFormData.value = Object.keys(data).reduce((acc, key) => { - // @ts-ignore - acc[key] = JSON.parse(data[key]); - return acc; - }, {}); + // merge objects value + const { spec: schemaGroups } = settings.value || {}; + + schemaGroups?.forEach((schemaGroup) => { + if (!configMapFormData.value) { + return; + } + configMapFormData.value[schemaGroup.group] = merge( + configMapFormData.value[schemaGroup.group] || {}, + JSON.parse(data[schemaGroup.group] || "{}") + ); + }); } } catch (e) { console.error(e); - } finally { - if (!configMapFormData.value) { - configMapFormData.value = settings.value?.spec.reduce((acc, item) => { - // @ts-ignore - acc[item.group] = {}; - return acc; - }, {}); - } } }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1c62fba04..86fb0c963 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -196,13 +196,17 @@ importers: specifiers: '@halo-dev/api-client': ^0.0.14 '@halo-dev/components': workspace:* + '@types/lodash.merge': ^4.6.7 axios: ^0.27.2 + lodash.merge: ^4.6.2 vite-plugin-dts: ^1.4.1 dependencies: '@halo-dev/api-client': 0.0.14 '@halo-dev/components': link:../components axios: 0.27.2 + lodash.merge: 4.6.2 devDependencies: + '@types/lodash.merge': 4.6.7 vite-plugin-dts: 1.4.1 packages: @@ -3196,6 +3200,12 @@ packages: '@types/lodash': 4.14.182 dev: true + /@types/lodash.merge/4.6.7: + resolution: {integrity: sha512-OwxUJ9E50gw3LnAefSHJPHaBLGEKmQBQ7CZe/xflHkyy/wH2zVyEIAKReHvVrrn7zKdF58p16We9kMfh7v0RRQ==} + dependencies: + '@types/lodash': 4.14.182 + dev: true + /@types/lodash/4.14.182: resolution: {integrity: sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==} dev: true @@ -6724,7 +6734,6 @@ packages: /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true /lodash.mergewith/4.6.2: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} diff --git a/src/modules/system/settings/CodeInjectSettings.vue b/src/modules/system/settings/CodeInjectSettings.vue deleted file mode 100644 index 0e485182e..000000000 --- a/src/modules/system/settings/CodeInjectSettings.vue +++ /dev/null @@ -1,29 +0,0 @@ - - diff --git a/src/modules/system/settings/CommentSettings.vue b/src/modules/system/settings/CommentSettings.vue deleted file mode 100644 index 8703c4fb5..000000000 --- a/src/modules/system/settings/CommentSettings.vue +++ /dev/null @@ -1,41 +0,0 @@ - - diff --git a/src/modules/system/settings/GeneralSettings.vue b/src/modules/system/settings/GeneralSettings.vue deleted file mode 100644 index bace93406..000000000 --- a/src/modules/system/settings/GeneralSettings.vue +++ /dev/null @@ -1,18 +0,0 @@ - - diff --git a/src/modules/system/settings/NotificationSettings.vue b/src/modules/system/settings/NotificationSettings.vue deleted file mode 100644 index de682b1e1..000000000 --- a/src/modules/system/settings/NotificationSettings.vue +++ /dev/null @@ -1,11 +0,0 @@ - - diff --git a/src/modules/system/settings/PostSettings.vue b/src/modules/system/settings/PostSettings.vue deleted file mode 100644 index 9b521d758..000000000 --- a/src/modules/system/settings/PostSettings.vue +++ /dev/null @@ -1,34 +0,0 @@ - - diff --git a/src/modules/system/settings/SeoSettings.vue b/src/modules/system/settings/SeoSettings.vue deleted file mode 100644 index 9b0ee46f6..000000000 --- a/src/modules/system/settings/SeoSettings.vue +++ /dev/null @@ -1,25 +0,0 @@ - - diff --git a/src/modules/system/settings/SystemSetting.vue b/src/modules/system/settings/SystemSetting.vue new file mode 100644 index 000000000..51bab5028 --- /dev/null +++ b/src/modules/system/settings/SystemSetting.vue @@ -0,0 +1,67 @@ + + diff --git a/src/modules/system/settings/UserSettings.vue b/src/modules/system/settings/UserSettings.vue deleted file mode 100644 index cdd5194b3..000000000 --- a/src/modules/system/settings/UserSettings.vue +++ /dev/null @@ -1,24 +0,0 @@ - - diff --git a/src/modules/system/settings/layouts/SystemSettingsLayout.vue b/src/modules/system/settings/layouts/SystemSettingsLayout.vue index 81de2441d..4da681043 100644 --- a/src/modules/system/settings/layouts/SystemSettingsLayout.vue +++ b/src/modules/system/settings/layouts/SystemSettingsLayout.vue @@ -1,70 +1,94 @@ diff --git a/src/modules/system/settings/module.ts b/src/modules/system/settings/module.ts index 3baf145cb..f9f8c3687 100644 --- a/src/modules/system/settings/module.ts +++ b/src/modules/system/settings/module.ts @@ -1,12 +1,6 @@ import { definePlugin } from "@halo-dev/admin-shared"; import SystemSettingsLayout from "./layouts/SystemSettingsLayout.vue"; -import GeneralSettings from "./GeneralSettings.vue"; -import UserSettings from "./UserSettings.vue"; -import PostSettings from "./PostSettings.vue"; -import SeoSettings from "./SeoSettings.vue"; -import CommentSettings from "./CommentSettings.vue"; -import CodeInjectSettings from "./CodeInjectSettings.vue"; -import NotificationSettings from "./NotificationSettings.vue"; +import SystemSetting from "./SystemSetting.vue"; import { IconSettings } from "@halo-dev/components"; export default definePlugin({ @@ -16,42 +10,11 @@ export default definePlugin({ { path: "/settings", component: SystemSettingsLayout, - redirect: "/settings/general", children: [ { - path: "general", - name: "GeneralSettings", - component: GeneralSettings, - }, - { - path: "user", - name: "UserSettings", - component: UserSettings, - }, - { - path: "post", - name: "PostSettings", - component: PostSettings, - }, - { - path: "seo", - name: "SeoSettings", - component: SeoSettings, - }, - { - path: "comment", - name: "CommentSettings", - component: CommentSettings, - }, - { - path: "code-inject", - name: "CodeInjectSettings", - component: CodeInjectSettings, - }, - { - path: "notification", - name: "NotificationSettings", - component: NotificationSettings, + path: ":group", + name: "SystemSetting", + component: SystemSetting, }, ], }, @@ -62,7 +25,7 @@ export default definePlugin({ items: [ { name: "设置", - path: "/settings", + path: "/settings/basic", icon: IconSettings, }, ],