import type { BusinessSelectListResponseListItem } from "../../api/types"; import React, { FC } from 'react'; import type { SelectValue, TdSelectProps } from 'tdesign-react/es/select/type'; import './index.scss'; /** 下拉场景 */ type Scene = 'default' | 'sdk' | 'compliance_age' | 'custom_region'; /** 标签格式 */ type LabelFormat = 'name' | 'name_en' | 'name_id' | 'name_en_id'; interface PntBusinessSelectProps { /** * 当前选中值 * @description 单选为 string,多选为 string[] */ value?: SelectValue; /** * 值变化回调 */ onChange?: TdSelectProps['onChange']; /** * 是否多选 * @default false */ multiple?: boolean; /** * 下拉场景 * @description 后端按场景返回默认字段集 * @default 'default' */ scene?: Scene; /** * 业务状态筛选 * @description 3-线上运营,4-接入中,5-中途结项,6-已下线 */ statuses?: number[]; /** * 业务类型筛选 * @description 1-正式业务,2-测试业务 */ businessTypes?: number[]; /** * 标签格式 * @description name-中文名,name_en-英文名,name_id-中文名(ID),name_en_id-英文名(ID) * @default 'name' */ labelFormat?: LabelFormat; /** * 占位提示文案 */ placeholder?: string; /** * 是否禁用整个选择器 * @default false */ disabled?: boolean; /** * 是否可清除 * @default true */ clearable?: boolean; /** * 是否可远程搜索 * @default true */ filterable?: boolean; /** * 多选时最大可选数量 */ max?: number; /** * 每页条数 * @default 20 */ pageSize?: number; /** * 搜索防抖延迟(毫秒) * @default 400 */ searchDebounce?: number; /** * 多选时最少折叠数量 * @description 超过此数量的选中项将折叠显示,透传至 TDesign Select */ minCollapsedNum?: number; /** * 折叠项自定义渲染 * @description 透传至 TDesign Select collapsedItems */ collapsedItems?: TdSelectProps['collapsedItems']; /** * 弹层属性透传 * @description 会与组件内部 onScrollToBottom 合并;常用 attach(挂载容器)、overlayClassName 等 */ popupProps?: Partial; /** * 字段白名单 * @description 传给后端 fields 参数,指定返回字段;未传时后端按 scene 返回默认字段 */ fields?: string[]; /** * 自定义 label 字段 * @description 从响应项的指定字段取 label;默认按 labelFormat 渲染 * 常用于消费方接口返回字段不是标准 name/name_en 的场景(如 game_name) */ labelField?: string; /** * 自定义选项 label 渲染 * @description 返回 ReactNode 作为选项内容;优先级高于 labelFormat/labelField * 常用于需要 ellipsis/样式包裹的场景 */ optionLabel?: (item: BusinessSelectListResponseListItem) => React.ReactNode; /** * 是否分页 * @description false 时一次性加载所有数据(pageNum=1, pageSize=0),不分页不远程搜索 * @default true */ pagination?: boolean; /** * 选项加载完成回调 * @description 每次远程加载(首屏/搜索/翻页追加)成功后触发,返回当前全部选项; * 不分页模式下首屏即全量数据,消费方可借此复用同一份数据,无需重复请求 */ onLoaded?: (options: BusinessSelectListResponseListItem[]) => void; /** * 自定义选项禁用逻辑 * @description 返回 true 时该选项禁用;与合规场景的 creatable 判断叠加(任一为 true 即禁用) */ optionDisabled?: (item: BusinessSelectListResponseListItem) => boolean; /** * 自定义选项 tooltip 内容 * @description 返回非空字符串时该选项悬停显示 tooltip;常用于解释禁用原因 */ optionTooltip?: (item: BusinessSelectListResponseListItem) => string; /** * tooltip 位置 * @default 'top' */ tooltipPlacement?: 'top' | 'bottom' | 'left' | 'right'; /** * 自定义类名 */ className?: string; /** * 自定义样式 */ style?: React.CSSProperties; } /** * 业务选择器组件 * @description 统一业务下拉选择器,内置对接后端通用接口 `/api/business/select/list`, * 支持远程搜索、滚动分页加载、多选、场景化禁用(合规场景 creatable 字段)。 * * @param {PntBusinessSelectProps} props - 组件属性 * * @example * ```tsx * import { PntBusinessSelect } from '@pnt-team/pnt-component-frontend'; * * // 最简用法 * setGameId(v as string)} * /> * * // SDK 定制场景 + 名称带 ID * setGameId(v as string)} * /> * * // 合规年龄场景(自动禁用 creatable=false 的业务) * setGameId(v as string)} * /> * * // 多选 + 状态过滤 * setGameIds(v as string[])} * /> * ``` * * @returns {ReactElement} 业务选择器组件 */ declare const PntBusinessSelect: FC; export default PntBusinessSelect;