diff --git a/button.d.ts b/button.d.ts index a56034c..e3be28d 100644 --- a/button.d.ts +++ b/button.d.ts @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import React, { ReactNode } from 'react'; import { PopupContainerProps } from './container'; export { PopupContainerProps } from './container'; @@ -170,5 +170,7 @@ interface ButtonOption extends ButtonProps { */ declare function useButton({ widget, widgetType, widgetData, widgetProps, widgetSetting, widgetContainerProps, }: UseButtonProps, { onAfterClick, onBeforeClick }?: UseButtonHandlers): UseButtonReturn; -export { _default as auth, useButton }; +declare const Button: (props: ButtonProps) => React.ReactNode; + +export { _default as auth, Button as default, useButton }; export type { ButtonCate, ButtonConfirm, ButtonOption, ButtonProps, ButtonSize, ButtonTooltip, ButtonType, PlacementType, UseButtonHandlers, UseButtonProps, UseButtonReturn, UseButtonStatus, WidgetContainerProps, WidgetType }; diff --git a/container.d.ts b/container.d.ts index ab618a8..6a733e6 100644 --- a/container.d.ts +++ b/container.d.ts @@ -96,6 +96,47 @@ type PopupHandle = Promise & { */ declare const SlotContext: React.Context; +/** + * 页面级容器,通过 SlotContext 把 title/subTitle/actions/extras 挂载到外层布局的对应插槽位置 + * @param {Object} props + * @param {string} [props.rootClassName] 挂载到外层布局根节点的 className + * @param {string} [props.className] 容器自身的 className + * @param {ReactNode} [props.children] 容器内容 + * @param {ReactNode} [props.actions] 挂载到 actions 插槽的内容 + * @param {ReactNode} [props.title] 挂载到 title 插槽的内容 + * @param {ReactNode} [props.subTitle] 挂载到 sub-title 插槽的内容 + * @param {ReactNode} [props.extras] 挂载到 extras 插槽的内容 + * @param {CSSProperties} [props.style] 容器行内样式 + */ +declare function FFContainer({ rootClassName, className, children, actions, title, subTitle, extras, style }: { + rootClassName?: string; + className?: string; + children?: React.ReactNode; + actions?: React.ReactNode; + title?: React.ReactNode; + subTitle?: React.ReactNode; + extras?: React.ReactNode; + style?: React.CSSProperties; +}): React.JSX.Element; +declare namespace FFContainer { + function Action({ children, className }: { + children: any; + className: any; + }): any; + function Title({ children, className }: { + children: any; + className: any; + }): any; + function SubTitle({ children, className }: { + children: any; + className: any; + }): any; + function Extra({ children, className }: { + children: any; + className: any; + }): any; +} + declare namespace FFPopup { export { modal }; export { confirm }; @@ -161,5 +202,5 @@ declare namespace FFPopupRender { function $onClick(...args: any[]): Promise; } -export { SlotContext as Context, Empty, Loading, NotFound, FFPageRender as PageRender, FFPopup as Popup, FFPopupRender as PopupRender }; +export { SlotContext as Context, Empty, Loading, NotFound, FFPageRender as PageRender, FFPopup as Popup, FFPopupRender as PopupRender, FFContainer as default }; export type { PopupContainerProps, PopupHandle, SlotContextValue, SlotElements, SlotKey }; diff --git a/data-converter.d.ts b/data-converter.d.ts index 77f7923..95f4339 100644 --- a/data-converter.d.ts +++ b/data-converter.d.ts @@ -1,5 +1,36 @@ +import React from 'react'; import { WidgetType, WidgetContainerProps } from './button'; +/** + * 按一串中间件(middleware)链式转换数据;每个中间件可以是函数,也可以是要动态加载的 + * 组件名字符串(通过 core.getWidgetComponent 解析),支持嵌套数组表示的中间件组 + */ +declare class DataConverter { + static "__#private@#resolver": any; + static "__#private@#newMiddleware": any; + /** + * @param {...(Array|[string|Function, *])} middlewares 中间件列表,每项是 + * [中间件名或函数, 传给中间件的配置],或者是这种元组的嵌套数组(会被展开) + */ + constructor(...middlewares: (any[] | [string | Function, any])[]); + /** + * 依次跑完所有中间件,把 value 转换成最终结果;单个中间件报错会被跳过,不中断整条链 + * @param {*} value 原始值 + * @param {*} [record] 关联的记录数据,中间件里可通过 this.getRecord() 取到 + * @returns {Promise<*>} 转换后的结果 + */ + toValue: (value: any, record?: any) => Promise; + /** + * 把 toValue 的异步转换结果渲染成 React 元素;转换完成前显示 loading,转换出错则显示错误信息 + * @param {*} value 原始值 + * @param {*} record 关联的记录数据 + * @param {*} [loading] 转换完成前显示的占位内容 + * @returns {React.ReactElement} + */ + toRender: (value: any, record: any, loading?: any) => React.ReactElement; + #private; +} + // ===== 用户数据结构(复用类型,JSDoc 无法跨文件引用,放 .d.ts) ===== interface UserRoleBinding { @@ -109,4 +140,5 @@ interface WorkerPipeInstance { clear: (session: string) => void } +export { DataConverter as default }; export type { HttpHeaders, MenuItem, RouteItem, UserInfo, UserRoleBinding, WorkerPipeInstance }; diff --git a/data-list.d.ts b/data-list.d.ts index c6f7058..81842bf 100644 --- a/data-list.d.ts +++ b/data-list.d.ts @@ -271,6 +271,66 @@ declare function useOperationCallback(props: any, listCode: string, primaryKey?: */ declare function useDataListHelper(listCode: string, base62params: DataListQueryParams): DataListHelperState; +/** + * 数据列表根组件:根据 isItemGridLayout 选择宫格(DataListFramework)或表格(DataTableFramework)布局, + * 也可通过 theme 动态加载自定义主题组件替代默认布局;并通过 DataListContext 向下透传分页/筛选/选中等状态与操作方法 + * @param {Object} props + * @param {boolean} [props.isItemGridLayout] 是否使用宫格布局(否则使用表格布局,theme 设置时忽略) + * @param {string} [props.theme] 自定义主题组件标识,设置后通过 core.getWidgetComponent 动态加载并替代默认布局 + * @param {Object} [props.themeProps] 传给自定义主题组件的 $setting + * @param {DataListContextValue['onClickCallback']} [props.onClickCallback] 行内/批量操作点击后的回调 + * @param {DataListContextValue['onReload']} [props.onReload] 刷新回调 + * @param {string} [props.listCode] 列表标识 + * @param {DataListQueryParams['total']} [props.total=0] 数据总条数 + * @param {DataListQueryParams['page']} [props.page=0] 当前页码 + * @param {DataListContextValue['onPageChange']} [props.onPageChange] 页码变更回调 + * @param {DataListQueryParams['pageSize']} [props.pageSize=30] 每页条数 + * @param {DataListContextValue['onPageSizeChange']} [props.onPageSizeChange] 每页条数变更回调 + * @param {DataListQueryParams['tab']} [props.tab] 当前选中的 tab + * @param {DataListContextValue['onTabChange']} [props.onTabChange] tab 变更回调 + * @param {DataListQueryParams['keyword']} [props.keyword] 关键字搜索值 + * @param {DataListContextValue['onKeywordChange']} [props.onKeywordChange] 关键字变更回调 + * @param {DataListQueryParams['condition']} [props.condition] 筛选条件 + * @param {DataListContextValue['onConditionChange']} [props.onConditionChange] 筛选条件变更回调 + * @param {DataListQueryParams['sider']} [props.sider] 侧边栏选中值 + * @param {DataListContextValue['onSiderChange']} [props.onSiderChange] 侧边栏选中值变更回调 + * @param {DataListLayouts|false} [props.layouts] 自定义子布局组件集合(sider/filter/footer/toolbar/empty),false 表示全部隐藏 + * @param {DataListClassNames} [props.classNames={}] 各区块自定义 className + * @param {DataListQueryParams['payload']} [props.payload={}] 附加请求参数 + * @param {Record[]} [props.dataSource=[]] 列表数据 + * @param {DataListRowSelection} [props.rowSelection] 行选择配置 + * @param {() => Record[]} [props.getSelectedRows] 获取已选中行的方法,未提供时默认返回 dataSource + * @param {string} [props.primaryKey] 主键字段名 + */ +declare function DataList({ isItemGridLayout, theme, themeProps, onClickCallback, onReload, listCode, total, page, onPageChange, pageSize, onPageSizeChange, tab, onTabChange, keyword, onKeywordChange, condition, onConditionChange, sider, onSiderChange, layouts, classNames, payload, dataSource, rowSelection, getSelectedRows: getSelectedRowsProp, primaryKey, ...props }: { + isItemGridLayout?: boolean; + theme?: string; + themeProps?: any; + onClickCallback?: DataListContextValue["onClickCallback"]; + onReload?: DataListContextValue["onReload"]; + listCode?: string; + total?: DataListQueryParams["total"]; + page?: DataListQueryParams["page"]; + onPageChange?: DataListContextValue["onPageChange"]; + pageSize?: DataListQueryParams["pageSize"]; + onPageSizeChange?: DataListContextValue["onPageSizeChange"]; + tab?: DataListQueryParams["tab"]; + onTabChange?: DataListContextValue["onTabChange"]; + keyword?: DataListQueryParams["keyword"]; + onKeywordChange?: DataListContextValue["onKeywordChange"]; + condition?: DataListQueryParams["condition"]; + onConditionChange?: DataListContextValue["onConditionChange"]; + sider?: DataListQueryParams["sider"]; + onSiderChange?: DataListContextValue["onSiderChange"]; + layouts?: DataListLayouts | false; + classNames?: DataListClassNames; + payload?: DataListQueryParams["payload"]; + dataSource?: Record[]; + rowSelection?: DataListRowSelection; + getSelectedRows?: () => Record[]; + primaryKey?: string; +}): React.JSX.Element; + /** * 列表筛选区:isConditionFormLayout 为 true 时拉取后台配置的条件表单结构并渲染 GridLayoutForm,否则渲染默认的关键字搜索框 * @param {Object} props @@ -542,5 +602,5 @@ declare function DataTableFramework({ listCode, className, layouts, dataSource, isConditionFormLayout?: boolean; }): React.JSX.Element; -export { DataListContent, _default as DataListContext, DataListFilter, DataListFooter, DataListFramework, DataListHelper, DataListSider, DataListTable, DataListToolbar, DataTableFramework, useCellEditableComponents, useColumnsRender, useDataListHelper, useHasOperationColumn, useItemOperationsAccess, useOperationCallback }; +export { DataListContent, _default as DataListContext, DataListFilter, DataListFooter, DataListFramework, DataListHelper, DataListSider, DataListTable, DataListToolbar, DataTableFramework, DataList as default, useCellEditableComponents, useColumnsRender, useDataListHelper, useHasOperationColumn, useItemOperationsAccess, useOperationCallback }; export type { DataListAPI, DataListClassNames, DataListColumn, DataListContextValue, DataListHelperRef, DataListHelperState, DataListItemForGridLayout, DataListItemOperationsAccess, DataListLayouts, DataListOperation, DataListQueryParams, DataListRowSelection, DataListStructure, DataListTab }; diff --git a/grid-layout-form.d.ts b/grid-layout-form.d.ts index 3235ebf..d0a6ac7 100644 --- a/grid-layout-form.d.ts +++ b/grid-layout-form.d.ts @@ -372,6 +372,11 @@ declare function GridLayoutForm({ name, form: initForm, basicForm, style, classN groups?: GridLayoutFormGroup[]; children?: React.ReactNode; }): React.JSX.Element; +declare const _default: ({ code, isPreview, ...props }: { + [x: string]: any; + code: any; + isPreview?: boolean; +}) => React.JSX.Element; -export { GridLayoutForm, GridLayoutFormHelper, GridLayoutFormWidget, useFieldArray, useFormAction, useFormData, useFormSubmit, useMergedFormValuesChange, useRules, useStructure, useWidgetDecorator }; +export { GridLayoutForm, GridLayoutFormHelper, GridLayoutFormWidget, _default as default, useFieldArray, useFormAction, useFormData, useFormSubmit, useMergedFormValuesChange, useRules, useStructure, useWidgetDecorator }; export type { EnhancedFormInstance, GridLayoutFormAPI, GridLayoutFormField, GridLayoutFormFieldValidators, GridLayoutFormGroup, GridLayoutFormItem, GridLayoutFormItemWidgetComponentProps, GridLayoutFormItemWidgetProps, GridLayoutFormSetting, GridLayoutFormStructure, GridLayoutFormSubWidget, GridLayoutFormWidgetDecorator, SubmitOptions, UseFieldArrayReturn }; diff --git a/grid-layout.d.ts b/grid-layout.d.ts index 246fa19..ba6b019 100644 --- a/grid-layout.d.ts +++ b/grid-layout.d.ts @@ -270,6 +270,7 @@ declare function GridLayout({ name, form: initForm, basicForm, style, className, groups?: GridLayoutGroup[]; children?: any; }): React.JSX.Element; +declare const _default: Function; -export { GridLayout, GridLayoutFramework, GridLayoutWidget, HOOK_MARK, useField, useFnRun, useGridLayoutFields, useStructure }; +export { GridLayout, GridLayoutFramework, GridLayoutWidget, HOOK_MARK, _default as default, useField, useFnRun, useGridLayoutFields, useStructure }; export type { BoxStyle, GridLayoutField, GridLayoutFieldAPI, GridLayoutGroup, GridLayoutItem, GridLayoutProps, GridLayoutStructure, LayoutField, UseFieldReturn, UseFnRunReturn }; diff --git a/res-ws.d.ts b/res-ws.d.ts index 77f7923..6a28939 100644 --- a/res-ws.d.ts +++ b/res-ws.d.ts @@ -1,5 +1,32 @@ import { WidgetType, WidgetContainerProps } from './button'; +declare const _default: ResWs; + +/** + * 基于 SharedWorker 的资源状态 WebSocket 单例;多个页面/标签页共用同一条连接, + * 按资源 uuid 把服务端推送的状态变化分发给各自的订阅回调 + */ +declare class ResWs { + /** @type {ResWs} */ + static "__#private@#instance": ResWs; + /** @returns {ResWs} 单例实例 */ + static getInstance: () => ResWs; + /** + * 订阅资源状态变化 + * @param {(data: *) => void} cb 状态变化时的回调,收到服务端推送的原始数据 + * @param {string|string[]} [res] 要订阅的资源 uuid,不传/空数组表示订阅全部('*') + * @returns {() => void} 取消订阅的函数 + */ + subscribe: (cb: (data: any) => void, res?: string | string[]) => () => void; + /** + * 取消订阅 + * @param {Function} cb 订阅时传入的回调 + * @returns {boolean} 是否成功移除 + */ + unsubscribe: (cb: Function) => boolean; + #private; +} + // ===== 用户数据结构(复用类型,JSDoc 无法跨文件引用,放 .d.ts) ===== interface UserRoleBinding { @@ -109,4 +136,5 @@ interface WorkerPipeInstance { clear: (session: string) => void } +export { _default as default }; export type { HttpHeaders, MenuItem, RouteItem, UserInfo, UserRoleBinding, WorkerPipeInstance }; diff --git a/virtual-fs.d.ts b/virtual-fs.d.ts index 2586f0f..1184a8b 100644 --- a/virtual-fs.d.ts +++ b/virtual-fs.d.ts @@ -403,5 +403,5 @@ interface WorkerPipeInstance { clear: (session: string) => void } -export { toTreePaths }; +export { VirtualFS as default, toTreePaths }; export type { HttpHeaders, MenuItem, RouteItem, UserInfo, UserRoleBinding, WorkerPipeInstance };