import { DownOutlined } from '@ant-design/icons' import type { IObjectAny } from '@schema-render/core-react' import { utils } from '@schema-render/core-react' import { Button, Dropdown, Popconfirm } from 'antd' import type { ReactNode } from 'react' import { Fragment } from 'react' import ButtonLoading from '../../../components/ButtonLoading' import type { ILocale, ISearchTableProps } from '../../../typings' import type { IActionItem } from '../../../typings/table.d' import styles from './actions.module.css' const { isArray, isString, omit } = utils /** * 创建「操作栏」按钮 */ export function createActionItem(item: IActionItem, index: number) { const { text, confirmAgain, confirmProps, onClick, ...restItem } = item const content = isString(text) ? ( !confirmAgain && onClick?.(e)} > {text} ) : ( text ) // 增加二次确认 if (confirmAgain) { return ( {content} ) } return content } /** * 创建 “操作栏” 按钮组 */ export function createActions({ record, index, actionItems, actionItemsCount, actionItemsDropdownProps, locale, }: { record: IObjectAny index: number actionItems: ISearchTableProps['table']['actionItems'] actionItemsCount: number actionItemsDropdownProps: ISearchTableProps['table']['actionItemsDropdownProps'] locale: ILocale }) { const items = actionItems?.(record, index) if (!isArray(items)) { return null } // 可展示项 const displayableItems = items.filter((item) => { return item.isShow !== false }) // 最后渲染的内容 let contents: ReactNode if (displayableItems.length > actionItemsCount) { const displayedItems: IActionItem[] = [] const dropdownItems: ReactNode[] = [] displayableItems.forEach((item, i) => { /** * 显示个数减一,以保证“更多”按钮对齐 */ if (i < actionItemsCount - 1) { displayedItems.push(item) } else { dropdownItems.push(createActionItem(item, i)) } }) return ( <> {displayedItems.map((item, i) => createActionItem(item, i))} (
{dropdownItems.map((label, i) => ( {label} ))}
)} >
) } else { contents = displayableItems.map((item, i) => createActionItem(item, i)) } return contents }