This commit is contained in:
2026-09-22 16:04:51 +08:00
parent b9e401af4f
commit 1726a18093
27 changed files with 2469 additions and 1835 deletions
Vendored
+146 -87
View File
@@ -1,5 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
import { ReactNode } from 'react';
import { PopupContainerProps } from './container';
export { PopupContainerProps } from './container';
declare const _default: OperationAuth;
@@ -23,93 +24,151 @@ declare class OperationAuth {
#private;
}
/** antd Button 的视觉类型 */
type ButtonType = 'primary' | 'default' | 'danger' | ''
/** 按钮尺寸 */
type ButtonSize = 'large' | 'middle' | 'small'
/** 按钮外观分类,对应 entry(cate) 的参数 */
type ButtonCate = 'default' | 'link' | 'circle' | 'round' | 'dashed'
/** 按钮触发的行为类型 */
type WidgetType =
| 'redirect'
| 'func'
| 'component'
| 'fsdpf-component'
| 'grid-layout-form'
| 'grid-layout'
| 'data-list'
| 'destroy'
/** antd Tooltip / Popconfirm 支持的弹出位置 */
type PlacementType =
| 'top' | 'left' | 'right' | 'bottom'
| 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight'
| 'leftTop' | 'leftBottom' | 'rightTop' | 'rightBottom'
/** Button props.tooltip 配置 */
interface ButtonTooltip {
/** 提示文字 */
title: string
/** 弹出位置 */
placement?: PlacementType
/** 是否启用,0 视同 false */
enabled?: boolean | number
getPopupContainer?: (e: HTMLElement) => HTMLElement
}
/** Button props.confirm 二次确认气泡配置 */
interface ButtonConfirm {
/** 确认提示文字 */
title: string
cancelText?: string
okText?: string
/** 确认按钮类型 */
okType?: ButtonType
placement?: PlacementType
/** 是否启用,0 视同 false */
enabled?: boolean | number
getPopupContainer?: (e: HTMLElement) => HTMLElement
arrow?: boolean | { pointAtCenter: boolean }
}
/**
* 按钮点击行为的容器配置;在 PopupContainerProps 基础上叠加 Popover 专有字段和 Button 专有的 mode,
* 流经 Button → Popover → Popup.modal 三层,各层按需取用不同字段
*/
interface WidgetContainerProps extends Omit<PopupContainerProps, 'placement'> {
/** 'popover' 时按钮触发内嵌气泡卡片,否则走 Popup.modal */
mode?: 'popover' | string
/** 弹窗标题,支持 lodash template 插值(以点击时的 raw data 为上下文) */
title?: string
/** antd Popover 的弹出位置(12 方向) */
placement?: PlacementType | string
/** antd Popover 对齐微调配置 */
align?: unknown
/** antd Popover 的 zIndex */
zIndex?: number
/** antd Popover 的箭头配置 */
arrow?: boolean | { pointAtCenter: boolean }
getPopupContainer?: (e: HTMLElement) => HTMLElement
/** 气泡挂载到 body,false 时挂载到触发元素父节点;默认 true */
isPopupMountBodyContainer?: boolean
}
/** useButton 第二个参数:回调处理器 */
interface UseButtonHandlers {
onAfterClick?: (result: unknown) => void
onBeforeClick?: (data: unknown) => void
}
/** useButton 返回 / ButtonProps 共用的状态字段 */
interface UseButtonStatus {
loading?: boolean
disabled?: boolean
}
/** useButton 第一个参数:行为配置 */
interface UseButtonProps {
/** 行为目标:组件 / 函数 / 路由 / 表达式,含义随 widgetType 而定 */
widget?: unknown
/** 行为类型,决定 widget 的解释方式和触发后的动作 */
widgetType?: WidgetType
/** 触发时附带的额外数据,合并到 widgetProps 求值结果后传给动作处理器 */
widgetData?: Record<string, unknown>
/** 触发前解析的 props 映射配置(经 getWidgetPropsData 求值) */
widgetProps?: Record<string, unknown>
/** 传给目标弹窗/表单/请求的 $setting 配置 */
widgetSetting?: Record<string, unknown>
/** 传给弹窗容器的配置(title/placement/zIndex 等) */
widgetContainerProps?: WidgetContainerProps
}
/** Button 组件的 props(所有变体共用) */
interface ButtonProps extends UseButtonProps, UseButtonHandlers, UseButtonStatus {
className?: string
/** 覆盖工厂默认外观分类 */
variant?: ButtonCate
children?: ReactNode
/** 按钮文字,与 children 二选一 */
name?: string
/** 图标 class 名 */
icon?: string
type?: ButtonType
iconPosition?: 'start' | 'end'
/** 按钮操作的权限标识 */
noAuthType?: string
/** onClick 时传给动作处理器的数据源 */
data?: unknown
tooltip?: ButtonTooltip
confirm?: ButtonConfirm
[key: string]: unknown
}
/** useButton 返回值:[点击处理函数(已防抖), 当前 loading/disabled 状态] */
type UseButtonReturn = [(data: unknown) => void, UseButtonStatus]
/** ButtonGroupPopover props.options 中每一项的结构(ButtonProps + uuid + 必填 widgetType) */
interface ButtonOption extends ButtonProps {
/** 操作项唯一标识,用于权限校验 */
uuid?: string
widgetType: WidgetType
/** 操作项自身的容器配置,与外层 widgetContainerProps 合并 */
widgetContainerSetting?: WidgetContainerProps
}
/**
* Button 组件点击行为的核心 hook;按 widgetType 把点击行为分发到对应的处理器
* (跳转/自定义函数/弹窗组件/表单弹窗/数据列表弹窗/删除请求等)
* @param {Object} config
* @param {*} config.widget 目标(组件/函数名/表达式/路由等,含义随 widgetType 而定)
* @param {'redirect'|'func'|'component'|'fsdpf-component'|'grid-layout-form'|'data-list'|'destroy'} [config.widgetType] 行为类型
* @param {*} [config.widgetData] 触发时附带的数据
* @param {Object} [config.widgetProps] 触发前解析的 props 配置(经 getWidgetPropsData)
* @param {Object} [config.widgetSetting] 传给目标(弹窗/表单/请求)的配置
* @param {Object} [config.widgetContainerProps] 传给弹窗容器的 props
* @param {Object} [handlers]
* @param {(result: *) => void} [handlers.onAfterClick] 动作完成后的回调
* @param {(data: *) => void} [handlers.onBeforeClick] 动作开始前的回调
* @returns {[(data: *) => void, {loading?: boolean, disabled?: boolean}]} [点击处理函数(已做 300ms 防抖), 当前 loading/disabled 状态]
* @param {UseButtonProps} config
* @param {UseButtonHandlers} [handlers]
* @returns {UseButtonReturn} [点击处理函数(已做 300ms 防抖), 当前 loading/disabled 状态]
*/
declare function useButton({ widget, widgetType, widgetData, widgetProps, widgetSetting, widgetContainerProps, }: {
widget: any;
widgetType?: "redirect" | "func" | "component" | "fsdpf-component" | "grid-layout-form" | "data-list" | "destroy";
widgetData?: any;
widgetProps?: any;
widgetSetting?: any;
widgetContainerProps?: any;
}, { onAfterClick, onBeforeClick }?: {
onAfterClick?: (result: any) => void;
onBeforeClick?: (data: any) => void;
}): [(data: any) => void, {
loading?: boolean;
disabled?: boolean;
}];
declare function useButton({ widget, widgetType, widgetData, widgetProps, widgetSetting, widgetContainerProps, }: UseButtonProps, { onAfterClick, onBeforeClick }?: UseButtonHandlers): UseButtonReturn;
declare function Button({ className, variant, children, name, icon, type, iconPosition, noAuthType, onAfterClick, onBeforeClick, data, loading: customLoading, disabled: customDisabled, tooltip, confirm, widget, widgetType, widgetData, widgetProps, widgetSetting, widgetContainerProps, ...props }: {
[x: string]: any;
className: any;
variant: any;
children: any;
name: any;
icon: any;
type?: string;
iconPosition?: string;
noAuthType: any;
onAfterClick: any;
onBeforeClick: any;
data: any;
loading: any;
disabled: any;
tooltip: any;
confirm: any;
widget?: () => void;
widgetType: any;
widgetData: any;
widgetProps: any;
widgetSetting: any;
widgetContainerProps: any;
}): React.JSX.Element;
declare namespace Button {
namespace propTypes {
let type: PropTypes.Requireable<string>;
let size: PropTypes.Requireable<string>;
let name: PropTypes.Requireable<string>;
let icon: PropTypes.Requireable<string>;
let iconPosition: PropTypes.Requireable<string>;
let data: PropTypes.Requireable<any>;
let widget: PropTypes.Requireable<any>;
let widgetType: PropTypes.Requireable<string>;
let widgetData: PropTypes.Requireable<object>;
let widgetProps: PropTypes.Requireable<object>;
let widgetSetting: PropTypes.Requireable<object>;
let widgetContainerProps: PropTypes.Requireable<object>;
let tooltip: PropTypes.Requireable<Required<PropTypes.InferProps<{
title: PropTypes.Validator<string>;
placement: PropTypes.Requireable<string>;
enabled: PropTypes.Requireable<NonNullable<number | boolean>>;
getPopupContainer: PropTypes.Requireable<(...args: any[]) => any>;
}>>>;
let confirm: PropTypes.Requireable<Required<PropTypes.InferProps<{
title: PropTypes.Validator<string>;
cancelText: PropTypes.Requireable<string>;
okText: PropTypes.Requireable<string>;
okType: PropTypes.Requireable<string>;
placement: PropTypes.Requireable<string>;
enabled: PropTypes.Requireable<NonNullable<number | boolean>>;
getPopupContainer: PropTypes.Requireable<(...args: any[]) => any>;
arrow: PropTypes.Requireable<NonNullable<boolean | Required<PropTypes.InferProps<{
pointAtCenter: PropTypes.Requireable<boolean>;
}>>>>;
}>>>;
}
}
export { _default as auth, Button as default, useButton };
export { _default as auth, useButton };
export type { ButtonCate, ButtonConfirm, ButtonOption, ButtonProps, ButtonSize, ButtonTooltip, ButtonType, PlacementType, UseButtonHandlers, UseButtonProps, UseButtonReturn, UseButtonStatus, WidgetContainerProps, WidgetType };