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 }; +