From 1892dce64b62156947359265162508fa140ace31 Mon Sep 17 00:00:00 2001 From: Ryan Wang Date: Thu, 31 Aug 2023 05:36:12 -0500 Subject: [PATCH] refactor: operation and entity field extension points (#4530) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /area console /kind improvement /milestone 2.9.x #### What this PR does / why we need it: 重构数据列表操作项和显示字段扩展点的类型定义和条件判断: 1. `EntityDropdownItem` 改为 `OperationItem` 以适配不同的场景,最开始仅仅是为了提供给 Entity 组件,但后面发现如主题管理列表并没有使用 Entity 组件,所以定义统一改为 Operation 。 2. 修改 `OperationItem` 和 `EntityFieldItem` 的 `visible` 字段为 `hidden`,方便渲染的时候判断,并方便调用方默认不设置值。 #### Does this PR introduce a user-facing change? ```release-note None ``` --- .../extension-points/entity-listitem-field.md | 2 +- .../entity-listitem-operation.md | 17 +++---- console/packages/shared/src/index.ts | 1 + console/packages/shared/src/states/entity.ts | 13 +---- .../packages/shared/src/states/operation.ts | 12 +++++ console/packages/shared/src/types/plugin.ts | 13 +++-- .../entity-fields/EntityFieldItems.vue | 7 ++- .../components/entity/EntityDropdownItems.vue | 24 ++++++--- .../use-entity-extension-points.ts | 49 +------------------ .../use-operation-extension-points.ts | 36 ++++++++++++++ .../posts/components/PostListItem.vue | 13 ++--- .../themes/components/ThemeListItem.vue | 32 ++++++------ .../backup/components/BackupListItem.vue | 12 ++--- .../plugins/components/PluginListItem.vue | 30 +++++------- 14 files changed, 128 insertions(+), 133 deletions(-) create mode 100644 console/packages/shared/src/states/operation.ts create mode 100644 console/src/composables/use-operation-extension-points.ts diff --git a/console/docs/extension-points/entity-listitem-field.md b/console/docs/extension-points/entity-listitem-field.md index cbef8f17c..4b26da2bd 100644 --- a/console/docs/extension-points/entity-listitem-field.md +++ b/console/docs/extension-points/entity-listitem-field.md @@ -48,6 +48,6 @@ export interface EntityFieldItem { component: Raw; // 字段组件,可以使用 `@halo-dev/components` 中提供的 `VEntityField`,也可以自定义 props?: Record; // 组件的 props permissions?: string[]; // 权限设置 - visible?: boolean; // 是否可见 + hidden?: boolean; // 是否隐藏 } ``` diff --git a/console/docs/extension-points/entity-listitem-operation.md b/console/docs/extension-points/entity-listitem-operation.md index 0e1f76521..fb2588b13 100644 --- a/console/docs/extension-points/entity-listitem-operation.md +++ b/console/docs/extension-points/entity-listitem-operation.md @@ -8,10 +8,10 @@ 目前支持扩展的数据列表: -- 文章:`"post:list-item:operation:create"?: (post: Ref) => | EntityDropdownItem[] | Promise[]>` -- 插件:`"plugin:list-item:operation:create"?: (plugin: Ref) => | EntityDropdownItem[] | Promise[]>` -- 备份:`"backup:list-item:operation:create"?: (backup: Ref) => | EntityDropdownItem[] | Promise[]>` -- 主题:`"theme:list-item:operation:create"?: (theme: Ref) => | EntityDropdownItem[] | Promise[]>` +- 文章:`"post:list-item:operation:create"?: (post: Ref) => | OperationItem[] | Promise[]>` +- 插件:`"plugin:list-item:operation:create"?: (plugin: Ref) => | OperationItem[] | Promise[]>` +- 备份:`"backup:list-item:operation:create"?: (backup: Ref) => | OperationItem[] | Promise[]>` +- 主题:`"theme:list-item:operation:create"?: (theme: Ref) => | OperationItem[] | Promise[]>` 示例: @@ -32,7 +32,6 @@ export default definePlugin({ priority: 21, component: markRaw(VDropdownItem), label: "导出为 Markdown 文档", - visible: true, permissions: [], action: async (post: ListedPost) => { const { data } = await axios.get( @@ -54,17 +53,17 @@ export default definePlugin({ }); ``` -`EntityDropdownItem` 类型: +`OperationItem` 类型: ```ts -export interface EntityDropdownItem { +export interface OperationItem { priority: number; // 优先级,越小越靠前 component: Raw; // 菜单项组件,可以使用 `@halo-dev/components` 中提供的 `VDropdownItem`,也可以自定义 props?: Record; // 组件的 props action?: (item?: T) => void; // 点击事件 label?: string; // 菜单项名称 - visible?: boolean; // 是否可见 + hidden?: boolean; // 是否隐藏 permissions?: string[]; // 权限 - children?: EntityDropdownItem[]; // 子菜单 + children?: OperationItem[]; // 子菜单 } ``` diff --git a/console/packages/shared/src/index.ts b/console/packages/shared/src/index.ts index 605e66554..39a1e8192 100644 --- a/console/packages/shared/src/index.ts +++ b/console/packages/shared/src/index.ts @@ -10,3 +10,4 @@ export * from "./states/backup"; export * from "./states/plugin-installation-tabs"; export * from "./states/entity"; export * from "./states/theme-list-tabs"; +export * from "./states/operation"; diff --git a/console/packages/shared/src/states/entity.ts b/console/packages/shared/src/states/entity.ts index 996f55a37..9f3f1b413 100644 --- a/console/packages/shared/src/states/entity.ts +++ b/console/packages/shared/src/states/entity.ts @@ -1,21 +1,10 @@ import type { Component, Raw } from "vue"; -export interface EntityDropdownItem { - priority: number; - component: Raw; - props?: Record; - action?: (item?: T) => void; - label?: string; - visible?: boolean; - permissions?: string[]; - children?: EntityDropdownItem[]; -} - export interface EntityFieldItem { priority: number; position: "start" | "end"; component: Raw; props?: Record; permissions?: string[]; - visible?: boolean; + hidden?: boolean; } diff --git a/console/packages/shared/src/states/operation.ts b/console/packages/shared/src/states/operation.ts new file mode 100644 index 000000000..efc2807fb --- /dev/null +++ b/console/packages/shared/src/states/operation.ts @@ -0,0 +1,12 @@ +import type { Component, Raw } from "vue"; + +export interface OperationItem { + priority: number; + component: Raw; + props?: Record; + action?: (item?: T) => void; + label?: string; + hidden?: boolean; + permissions?: string[]; + children?: OperationItem[]; +} diff --git a/console/packages/shared/src/types/plugin.ts b/console/packages/shared/src/types/plugin.ts index 87f41bab6..09417d7d9 100644 --- a/console/packages/shared/src/types/plugin.ts +++ b/console/packages/shared/src/types/plugin.ts @@ -7,7 +7,8 @@ import type { AnyExtension } from "@tiptap/vue-3"; import type { CommentSubjectRefProvider } from "@/states/comment-subject-ref"; import type { BackupTab } from "@/states/backup"; import type { PluginInstallationTab } from "@/states/plugin-installation-tabs"; -import type { EntityDropdownItem, EntityFieldItem } from "@/states/entity"; +import type { EntityFieldItem } from "@/states/entity"; +import type { OperationItem } from "@/states/operation"; import type { ThemeListTab } from "@/states/theme-list-tabs"; import type { Backup, ListedPost, Plugin, Theme } from "@halo-dev/api-client"; @@ -42,17 +43,15 @@ export interface ExtensionPoint { "post:list-item:operation:create"?: ( post: Ref - ) => - | EntityDropdownItem[] - | Promise[]>; + ) => OperationItem[] | Promise[]>; "plugin:list-item:operation:create"?: ( plugin: Ref - ) => EntityDropdownItem[] | Promise[]>; + ) => OperationItem[] | Promise[]>; "backup:list-item:operation:create"?: ( backup: Ref - ) => EntityDropdownItem[] | Promise[]>; + ) => OperationItem[] | Promise[]>; "plugin:list-item:field:create"?: ( plugin: Ref @@ -62,7 +61,7 @@ export interface ExtensionPoint { "theme:list-item:operation:create"?: ( theme: Ref - ) => EntityDropdownItem[] | Promise[]>; + ) => OperationItem[] | Promise[]>; } export interface PluginModule { diff --git a/console/src/components/entity-fields/EntityFieldItems.vue b/console/src/components/entity-fields/EntityFieldItems.vue index 59086199f..2f5651740 100644 --- a/console/src/components/entity-fields/EntityFieldItems.vue +++ b/console/src/components/entity-fields/EntityFieldItems.vue @@ -1,5 +1,6 @@ diff --git a/console/src/components/entity/EntityDropdownItems.vue b/console/src/components/entity/EntityDropdownItems.vue index 27738fcb2..d9c0dbccd 100644 --- a/console/src/components/entity/EntityDropdownItems.vue +++ b/console/src/components/entity/EntityDropdownItems.vue @@ -1,10 +1,13 @@