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 @@