From 5eabce7544212d724ec9c4876f67cac8115ed90e Mon Sep 17 00:00:00 2001 From: Ryan Wang Date: Wed, 26 Jun 2024 21:58:51 +0800 Subject: [PATCH] feat: add management and view pages for extension points (#6137) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /area ui /kind feature /milestone 2.17.x #### What this PR does / why we need it: 添加扩展点的查看和设置页面。 image #### Which issue(s) this PR fixes: Fixes https://github.com/halo-dev/halo/issues/3206 #### Does this PR introduce a user-facing change? ```release-note 添加系统扩展点的查看和设置页面。 ``` --- .../run/halo/app/infra/SchemeInitializer.java | 8 +- .../plugins/PluginExtensionPointSettings.vue | 122 +++++++++++++++ .../ExtensionDefinitionListItem.vue | 77 ++++++++++ .../ExtensionDefinitionMultiInstanceView.vue | 45 ++++++ .../ExtensionDefinitionSingletonView.vue | 141 ++++++++++++++++++ .../use-extension-definition-fetch.ts | 22 +++ .../modules/system/plugins/module.ts | 19 ++- ui/packages/api-client/entry/api-client.ts | 1 + 8 files changed, 432 insertions(+), 3 deletions(-) create mode 100644 ui/console-src/modules/system/plugins/PluginExtensionPointSettings.vue create mode 100644 ui/console-src/modules/system/plugins/components/extension-points/ExtensionDefinitionListItem.vue create mode 100644 ui/console-src/modules/system/plugins/components/extension-points/ExtensionDefinitionMultiInstanceView.vue create mode 100644 ui/console-src/modules/system/plugins/components/extension-points/ExtensionDefinitionSingletonView.vue create mode 100644 ui/console-src/modules/system/plugins/composables/use-extension-definition-fetch.ts diff --git a/application/src/main/java/run/halo/app/infra/SchemeInitializer.java b/application/src/main/java/run/halo/app/infra/SchemeInitializer.java index 072113429..273e880c1 100644 --- a/application/src/main/java/run/halo/app/infra/SchemeInitializer.java +++ b/application/src/main/java/run/halo/app/infra/SchemeInitializer.java @@ -81,7 +81,13 @@ public class SchemeInitializer implements ApplicationListener definition.getSpec().getClassName()) )); }); - schemeManager.register(ExtensionDefinition.class); + schemeManager.register(ExtensionDefinition.class, indexSpecs -> { + indexSpecs.add(new IndexSpec() + .setName("spec.extensionPointName") + .setIndexFunc(simpleAttribute(ExtensionDefinition.class, + definition -> definition.getSpec().getExtensionPointName()) + )); + }); schemeManager.register(RoleBinding.class); schemeManager.register(User.class, indexSpecs -> { diff --git a/ui/console-src/modules/system/plugins/PluginExtensionPointSettings.vue b/ui/console-src/modules/system/plugins/PluginExtensionPointSettings.vue new file mode 100644 index 000000000..8bca1bfd8 --- /dev/null +++ b/ui/console-src/modules/system/plugins/PluginExtensionPointSettings.vue @@ -0,0 +1,122 @@ + + + diff --git a/ui/console-src/modules/system/plugins/components/extension-points/ExtensionDefinitionListItem.vue b/ui/console-src/modules/system/plugins/components/extension-points/ExtensionDefinitionListItem.vue new file mode 100644 index 000000000..3c37f2a20 --- /dev/null +++ b/ui/console-src/modules/system/plugins/components/extension-points/ExtensionDefinitionListItem.vue @@ -0,0 +1,77 @@ + + + diff --git a/ui/console-src/modules/system/plugins/components/extension-points/ExtensionDefinitionMultiInstanceView.vue b/ui/console-src/modules/system/plugins/components/extension-points/ExtensionDefinitionMultiInstanceView.vue new file mode 100644 index 000000000..88eb84419 --- /dev/null +++ b/ui/console-src/modules/system/plugins/components/extension-points/ExtensionDefinitionMultiInstanceView.vue @@ -0,0 +1,45 @@ + + + diff --git a/ui/console-src/modules/system/plugins/components/extension-points/ExtensionDefinitionSingletonView.vue b/ui/console-src/modules/system/plugins/components/extension-points/ExtensionDefinitionSingletonView.vue new file mode 100644 index 000000000..2a3f8f561 --- /dev/null +++ b/ui/console-src/modules/system/plugins/components/extension-points/ExtensionDefinitionSingletonView.vue @@ -0,0 +1,141 @@ + + + diff --git a/ui/console-src/modules/system/plugins/composables/use-extension-definition-fetch.ts b/ui/console-src/modules/system/plugins/composables/use-extension-definition-fetch.ts new file mode 100644 index 000000000..06947fd18 --- /dev/null +++ b/ui/console-src/modules/system/plugins/composables/use-extension-definition-fetch.ts @@ -0,0 +1,22 @@ +import type { ExtensionPointDefinition } from "@halo-dev/api-client"; +import { coreApiClient } from "@halo-dev/api-client"; +import { useQuery } from "@tanstack/vue-query"; +import { computed, type Ref } from "vue"; + +export function useExtensionDefinitionFetch( + extensionPointDefinition: Ref +) { + return useQuery({ + queryKey: ["extension-definitions", extensionPointDefinition], + queryFn: async () => { + const { data } = + await coreApiClient.plugin.extensionDefinition.listExtensionDefinition({ + fieldSelector: [ + `spec.extensionPointName=${extensionPointDefinition.value?.metadata.name}`, + ], + }); + return data; + }, + enabled: computed(() => !!extensionPointDefinition.value), + }); +} diff --git a/ui/console-src/modules/system/plugins/module.ts b/ui/console-src/modules/system/plugins/module.ts index 3dc58c3a5..5c9bcb5ca 100644 --- a/ui/console-src/modules/system/plugins/module.ts +++ b/ui/console-src/modules/system/plugins/module.ts @@ -1,8 +1,10 @@ import BasicLayout from "@console/layouts/BasicLayout.vue"; -import { IconPlug } from "@halo-dev/components"; +import { IconPlug, IconSettings } from "@halo-dev/components"; import { definePlugin } from "@halo-dev/console-shared"; import { markRaw } from "vue"; +import type { RouteRecordRaw } from "vue-router"; import PluginDetail from "./PluginDetail.vue"; +import PluginExtensionPointSettings from "./PluginExtensionPointSettings.vue"; import PluginList from "./PluginList.vue"; export default definePlugin({ @@ -29,6 +31,19 @@ export default definePlugin({ name: "Plugins", component: PluginList, }, + { + path: "extension-point-settings", + name: "PluginExtensionPointSettings", + component: PluginExtensionPointSettings, + meta: { + title: "扩展点设置", + hideFooter: true, + menu: { + name: "扩展点设置", + icon: markRaw(IconSettings), + }, + }, + }, { path: ":name", name: "PluginDetail", @@ -39,6 +54,6 @@ export default definePlugin({ }, }, ], - }, + } as RouteRecordRaw, ], }); diff --git a/ui/packages/api-client/entry/api-client.ts b/ui/packages/api-client/entry/api-client.ts index 2dded36c0..db7bff69b 100644 --- a/ui/packages/api-client/entry/api-client.ts +++ b/ui/packages/api-client/entry/api-client.ts @@ -452,3 +452,4 @@ export { defaultPublicApiClient as publicApiClient, defaultUcApiClient as ucApiClient }; +