From 219fa566ef770f3b7b0330c842eef1a5f617da86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=AD=90=E9=BB=98?= <925456043@qq.com> Date: Wed, 11 Mar 2026 20:30:36 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E5=8D=A1=E7=89=87=E5=85=A5=E5=8F=A3?= =?UTF-8?q?=E8=A7=86=E8=A7=89=E6=95=88=E6=9E=9C=E9=87=8D=E5=81=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/src/components/page/CardList.vue | 420 +++++++++++++----- .../app/src/views/ai/bots/index.vue | 41 +- .../documentCollection/DocumentCollection.vue | 81 ++-- .../src/views/ai/plugin/AddPluginModal.vue | 92 +++- .../app/src/views/ai/plugin/Plugin.vue | 67 ++- .../src/views/ai/workflow/WorkflowList.vue | 65 ++- 6 files changed, 507 insertions(+), 259 deletions(-) diff --git a/easyflow-ui-admin/app/src/components/page/CardList.vue b/easyflow-ui-admin/app/src/components/page/CardList.vue index e09d1de..0e97ef4 100644 --- a/easyflow-ui-admin/app/src/components/page/CardList.vue +++ b/easyflow-ui-admin/app/src/components/page/CardList.vue @@ -8,7 +8,6 @@ import { ElAvatar, ElButton, ElCard, - ElDivider, ElDropdown, ElDropdownItem, ElDropdownMenu, @@ -17,14 +16,31 @@ import { ElText, } from 'element-plus'; +export type ActionPlacement = 'inline' | 'menu'; +export type ActionTone = 'danger' | 'default'; + export interface ActionButton { - icon: any; + icon?: any; text: string; - className: string; - permission: string; + className?: string; + permission?: string; + placement?: ActionPlacement; + tone?: ActionTone; onClick: (row: any) => void; } +export interface CardPrimaryAction { + icon?: any; + text: string; + permission?: string; + onClick: (row: any) => void; +} + +interface ResolvedActionButton extends ActionButton { + placement: ActionPlacement; + tone: ActionTone; +} + export interface CardListProps { iconField?: string; titleField?: string; @@ -32,125 +48,185 @@ export interface CardListProps { actions?: ActionButton[]; defaultIcon: any; data: any[]; + primaryAction?: CardPrimaryAction; tagField?: string; tagMap?: Record; } + const props = withDefaults(defineProps(), { iconField: 'icon', titleField: 'title', descField: 'description', actions: () => [], + primaryAction: undefined, tagField: '', tagMap: () => ({}), }); + const { hasAccessByCodes } = useAccess(); -const filterActions = computed(() => { - return props.actions.filter((action) => { - return hasAccessByCodes([action.permission]); - }); + +function hasPermission(permission?: string) { + return !permission || hasAccessByCodes([permission]); +} + +const resolvedPrimaryAction = computed(() => { + if (!props.primaryAction || !hasPermission(props.primaryAction.permission)) { + return undefined; + } + return props.primaryAction; }); -const visibleActions = computed(() => { - return filterActions.value.length <= 3 - ? filterActions.value - : filterActions.value.slice(0, 3); + +const resolvedActions = computed(() => { + return props.actions + .filter((action) => hasPermission(action.permission)) + .map((action, index) => ({ + ...action, + placement: + action.placement || + (resolvedPrimaryAction.value ? 'menu' : index < 3 ? 'inline' : 'menu'), + tone: + action.tone || + (action.className?.includes('danger') ? 'danger' : 'default'), + })); }); -const hiddenActions = computed(() => { - return filterActions.value.length > 3 ? filterActions.value.slice(3) : []; + +const inlineActions = computed(() => { + return resolvedActions.value.filter((action) => action.placement === 'inline'); }); + +const menuActions = computed(() => { + return resolvedActions.value.filter((action) => action.placement === 'menu'); +}); + +const showFooter = computed(() => { + return Boolean( + resolvedPrimaryAction.value || + inlineActions.value.length || + menuActions.value.length, + ); +}); + +function handlePrimaryAction(item: any) { + resolvedPrimaryAction.value?.onClick(item); +} + +function handleActionClick(event: Event, action: ActionButton, item: any) { + event.stopPropagation(); + action.onClick(item); +} diff --git a/easyflow-ui-admin/app/src/views/ai/documentCollection/DocumentCollection.vue b/easyflow-ui-admin/app/src/views/ai/documentCollection/DocumentCollection.vue index d868773..5322df5 100644 --- a/easyflow-ui-admin/app/src/views/ai/documentCollection/DocumentCollection.vue +++ b/easyflow-ui-admin/app/src/views/ai/documentCollection/DocumentCollection.vue @@ -1,29 +1,22 @@