UNPKG

@lark-project/ui-kit-plugin

Version:

Lark Project UI Kit Plugin

623 lines (568 loc) 20.3 kB
/** * Copyright (c) 2024 Lark Technologies Pte. Ltd. * * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted,provided that the above copyright notice and this permission notice appear in all copies. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ import { CSSProperties } from 'react'; import { Dispatch } from 'react'; import { ForwardedRef } from 'react'; import { ForwardRefExoticComponent } from 'react'; import { ReactElement } from 'react'; import { RefAttributes } from 'react'; import { RefObject } from 'react'; import { RichTextEditorContent } from '@lark-project/js-sdk'; import { RichTextEditorOptions } from '@lark-project/js-sdk'; import { SetStateAction } from 'react'; import { User } from '@lark-project/js-sdk'; import { WorkItemFinderOptions } from '@lark-project/js-sdk'; /** * [基础组件] DatePicker */ export declare function DatePicker(props: IDatePickerProps): ReactElement; export declare namespace DatePicker { var RangePicker: typeof DateRangePicker; } /** * [基础组件] RangePicker */ declare function DateRangePicker(props: IRangePickerProps): ReactElement; declare type DateValue = Date | string | number | undefined; export declare type DisabledDateOptions = { rangeStart?: string; rangeEnd?: string; rangeInputFocus?: 'rangeStart' | 'rangeEnd' | false; }; /** * dom 通用属性 */ declare interface IBaseDOMProps { /** * 类名 */ className?: string; /** * 样式 */ style?: CSSProperties; } /** * 对标基础组件库 api 设置 */ declare interface IBasePopoverProps { /** * 自定义 trigger dom 元素 * * 满足与semi Popover 一致的约定,以下描述引用自semi: * * Popover 需要将 DOM 事件监听器应用到 children 中,如果子元素是自定义的组件,你需要确保它能将属性传递至底层的 DOM 元素 * * 同时为了计算弹出层的定位,需要获取到 children 的真实 DOM 元素,因此 Popover 支持如下类型的 children * * 1. Class Component,不强制绑定ref,但需要确保 props 可被透传至真实的 DOM 节点上 * 2. 使用 forwardRef 包裹后的函数式组件,将 props 与 ref 透传到 children 内真实的 DOM 节点上 * 3. 真实 DOM 节点, 如 span,div,p... */ children?: ReactElement; /** * 支持设置浮层弹出方向 */ position?: 'left' | 'top' | 'topLeft' | 'topRight' | 'leftTop' | 'leftBottom' | 'right' | 'rightTop' | 'rightBottom' | 'bottom' | 'bottomLeft' | 'bottomRight'; } declare interface IBasePortalProps { serviceType: string; refer?: { handler?: IPortalHandler; }; /** * init 时触发回调 * * 为了不忘记要有return销毁,这里类型上强制有返回函数 * @returns 组件销毁时会调用 return 的函数,用于销毁一些副作用,函数不会响应引用变化 */ onInit?: (params: { handler: IPortalHandler; }) => () => void; } declare interface IBaseSelectProps { /** * 选择框默认文字 */ placeholder?: string; /** * 是否禁用 */ disabled?: boolean; /** * 多选模式下,已选项超出 maxTagCount 时,后续选项会被渲染成+N 的形式 */ maxTagCount?: number; /** * 是否多选 */ multiple?: boolean; /** * 是否展示清除按钮 */ showClear?: boolean; } declare interface IBaseUserTagProps extends IBaseDOMProps, Pick<IBasePopoverProps, 'children'> { larkUserId?: string; /** * 用户 id */ userId?: string; name?: string; avatar?: string; /** * 是否禁用,禁用将不会弹出用户卡片 */ disabled?: boolean; /** * 是否可关闭 */ closable?: boolean; onClose?: (tagChildren: React.ReactNode, event: React.MouseEvent<HTMLElement>, tagKey: string | number) => void; } export declare interface IDatePickerProps extends Pick<IDateTriggerProps, 'className' | 'style' | 'showClear' | 'disabled' | 'inputReadOnly' | 'onClear' | 'placeholder'> { showTime?: boolean; format?: string; presets?: PresetItem[]; weekStartsOn?: number; defaultValue?: DateValue; value?: DateValue; onChange?: (date: Date | undefined, dateStr: string | undefined) => void; onPresetClick?: (preset: PresetItem) => void; onFocus?: () => void; onBlur?: () => void; disabledDate?: (date: Date) => boolean; } declare interface IDateTriggerProps extends IBaseDOMProps { type: 'date' | 'dateTime' | 'month'; showClear?: boolean; inputReadOnly?: boolean; disabled?: boolean; isFocused?: boolean; value?: string; onChange?: (value: string) => void; onClear?: () => void; onClick?: (e: React.MouseEvent<HTMLDivElement>) => void; placeholder?: string; } export declare interface IEditor { setValue: (val: Pick<RichTextEditorContent, 'doc'>) => void; } /** * 通用错误表达结构 */ declare interface IError { /** * 错误码,一般非0表示存在错误 */ c: number; /** * 当有错误时,提供对应的错误描述信息 */ m: string; } declare interface IInnerInfo { type: PopType; } export declare function init(): Promise<void>; export declare interface IPopoverContent { Provider: (props: IPopoverContentProviderProps) => React.ReactElement; Consumer: React.Consumer<IPopoverContentType>; useContext: <T extends Record<string, any> = Record<string, any>>() => IPopoverContentType<T>; } declare interface IPopoverContentProviderProps { children: React.ReactNode; } declare interface IPopoverContentType<T extends Record<string, any> = Record<string, any>> { context: T; ref: React.MutableRefObject<any>; } export declare interface IPopoverProps extends IBasePopoverProps, Pick<IBaseDOMProps, 'style'> { /** * 触发方式 */ trigger?: 'hover' | 'click' | 'custom'; /** * 如果只需要展示普通文本,直接给定 content 字符串即可 */ content?: string; /** * 自定义 entry 函数名,与插件在入口导出的自定义函数名匹配 */ entry?: string; /** * 指定 entry 时,允许传入自定义参数。 * * 组件会将此参数携带给插件自定义 entry 函数的入参 props.context。 * * 建议使用平面对象,不支持函数,proxy,等非常规数据。 */ context?: any; /** * 弹出层展示/隐藏时触发的回调 */ onVisibleChange?: (visible: boolean) => void; /** * 弹出层是否可见,配合trigger = 'custom' 时使用 */ visible?: boolean; /** * 当弹出层处于展示状态,点击非Children、非浮层内部区域时的回调(仅trigger为custom、click时有效) */ onClickOutSide?: () => void; } declare type IPortalDispatch = <DispatchContext extends IPortalPayload>(context: DispatchContext, cb?: (ret: any) => void) => Promise<void>; declare interface IPortalEvent<Context = any> { payload: Context; } declare interface IPortalHandler { destroy: () => void; open: <Context extends Record<string, any>>(context?: Context, option?: { noBounding?: boolean; }) => Promise<void>; close: () => Promise<void>; dispatch: IPortalDispatch; onMessage: IPortalOnMessage; addTargetListener: <K extends keyof ITargetListenerMap>(type: K, handler: (payload: ITargetListenerMap[K]) => void) => () => void; define: (funcMap: Record<string, () => (...args: any[]) => any>) => () => void; onDefine: (cb?: (funcList: Record<string, (...args: any[]) => any>) => void) => () => void; } declare interface IPortalMsgPayload<Context extends IPortalPayload<any> = IPortalPayload<any>> { portalId: string; serviceType: string; payload: Context; } declare type IPortalOnMessage = <Context = Record<string, any>, K extends keyof Context = keyof Context>(type: K, cb: (payload?: Context[K], msg?: IPortalMsgPayload<IPortalPayload<Context, K>>) => void) => () => void; declare interface IPortalPayload<Context = Record<string, any>, K extends keyof Context = keyof Context> { type: K; sessionId?: string; payload?: Context[K]; } export declare interface IRangePickerProps extends Pick<IDatePickerProps, 'className' | 'style' | 'showClear' | 'disabled' | 'inputReadOnly' | 'onClear' | 'showTime' | 'weekStartsOn' | 'format' | 'presets' | 'disabledDate' | 'onPresetClick' | 'onFocus' | 'onBlur'>, Pick<IRangeTriggerProps, 'rangeSeparator' | 'placeholder'> { defaultValue?: Date[] | string[] | number[]; value?: Date[] | string[] | number[]; onChange?: (date: Date[], dateStr: string[]) => void; disabledDate?: (date: Date, options?: DisabledDateOptions) => boolean; } declare interface IRangeTriggerProps extends IBaseDOMProps { type?: 'dateRange' | 'dateTimeRange' | 'monthRange'; placeholder?: string[]; startValue?: string; endValue?: string; onStartValueChange?: (value: string) => void; onEndValueChange?: (value: string) => void; inputReadOnly?: boolean; disabled?: boolean; showClear?: boolean; rangeSeparator?: string; rangeInputFocus: RangeFocusType; setRangeInputFocus: Dispatch<SetStateAction<RangeFocusType>>; onClear?: () => void; onClick?: () => void; rangeInputStartRef?: RefObject<HTMLInputElement>; rangeInputEndRef?: RefObject<HTMLInputElement>; } declare interface IRect { height: number; bottom: number; left: number; right: number; top: number; width: number; x: number; y: number; } export declare interface IRichTextEditorPopoverProps extends IBaseDOMProps, IBasePopoverProps, Pick<ITriggerControllerProps, 'disabled' | 'trigger' | 'visible' | 'onVisibleChange' | 'onClickOutSide'>, Pick<RichTextEditorOptions, 'imageUpload' | 'autoFocus'> { /** * 空间 id,用于url、图片、mention等功能 */ spaceId: string; /** * 富文本内容 * doc 是富文本内容必须数据 * doc_html 是快速上屏数据,请确保表达内容与doc一致 */ defaultValue?: Pick<RichTextEditorContent, 'doc' | 'doc_html'>; /** * 弹出层宽度 */ contentWidth?: CSSProperties['width']; /** * 富文本触发 onClickOutSide 时会自动触发 onSubmit 回调 * @param value * @returns */ onSubmit?: (value: RichTextEditorContent) => void; } export declare interface IRichTextEditorProps extends Pick<IRichTextEditorPopoverProps, 'imageUpload' | 'spaceId' | 'defaultValue'> { /** * 默认值 true ,如果想预览富文本请主动给组件加上editable={false} */ editable?: boolean; /** * 编辑类型,默认inline,popover为弹出式编辑 */ editType?: 'inline' | 'popover'; /** * editType 为 popover 时,对 popover 生效的 props */ editPopoverProps?: Omit<IRichTextEditorPopoverProps, 'imageUpload' | 'spaceId' | 'defaultValue'> & { ref?: ForwardedRef<IEditor | undefined>; }; } export declare interface ISelectOption<DATA extends Record<string, any> = Record<string, any>> { value: string; label: string; disabled?: boolean; data?: DATA; } export declare interface ISelectOptionsProps<DATA extends Record<string, any>> { className?: string; style?: React.CSSProperties; emptyContent?: ReactElement | string; renderOptionItem?: (option: ISelectOption<DATA>) => React.ReactNode; } export declare interface ISelectProps<DATA extends Record<string, any> = Record<string, any>> extends Pick<ISelectTriggerProps<DATA>, 'optionList' | 'filter' | 'onSearch' | 'onClear' | 'renderSelectedItem' | 'className' | 'style' | 'multiple' | 'placeholder' | 'disabled' | 'maxTagCount' | 'showClear' | 'value' | 'onChange'> { /** * 自定义 entry 函数名,与插件在入口导出的自定义函数名匹配 */ entry?: string; } declare interface ISelectTriggerProps<DATA extends Record<string, any>> extends IBaseSelectProps, IBaseDOMProps { selectRef?: React.RefObject<any>; /** * select 选项列表 */ optionList: ISelectOption<DATA>[]; /** * 选中的选项 */ value?: string | string[] | undefined; /** * 选中的选项 */ filter?: boolean; /** * input 输入框内容发生改变时回调函数 */ onSearch?: (value: string) => void; /** * 是否展示加载动画 */ /** * 弹出位置 */ /** * 变化时回调函数 */ onChange?: (value: string | string[] | undefined, selectedOptions: ISelectOption<DATA> | ISelectOption<DATA>[] | undefined) => void; /** * 点击清除按钮后的回调 */ onClear?: () => void; /** * 点击 Trigger 后的回调 */ onClick?: () => void; /** * 自定义渲染选中项 */ renderSelectedItem?: (optionNode: ISelectOption<DATA>) => React.ReactElement | { isRenderInTag: boolean; content: React.ReactElement; }; } declare interface ITargetListenerMap { bounding: IPortalEvent<{ rect: IRect; }>; clickOutSide: IPortalEvent<undefined>; hover: IPortalEvent<{ hovering: boolean; }>; viewportVisible: IPortalEvent<{ visible: boolean; }>; } declare interface ITriggerControllerProps<T extends Record<string, any> = Record<string, any>> extends IBasePortalProps, Pick<IBasePopoverProps, 'children'> { /** * 触发方式 */ trigger?: 'hover' | 'click' | 'custom'; /** * 弹出层是否可见,配合trigger = 'custom' 时使用 */ visible?: boolean; /** * 弹出层展示/隐藏时触发的回调 */ onVisibleChange?: (visible: boolean) => void; /** * 当弹出层处于展示状态,点击非Children、非浮层内部区域时的回调(仅trigger为custom、click时有效) */ onClickOutSide?: () => void; mouseEnterDelay?: number; mouseLeaveDelay?: number; openPayload?: { popoverProps?: Omit<IBasePopoverProps, 'children'> & IBaseDOMProps & { sizeLimit?: boolean; }; } & Record<string, any>; disabled?: boolean; contentRef?: React.MutableRefObject<{ popup?: Record<string, any>; }>; context?: T; innerInfo?: IInnerInfo; startTiming?: RefObject<number>; } export declare interface IUserSelectProps extends IBaseDOMProps, IBaseSelectProps { /** * 当前选中的用户 ids */ userIds?: string[]; /** * userIds 变化时回调函数 * @param userIds * @param users * @returns */ onChange?: (userIds: string[], users: User[]) => void; /** * 自定义选项范围,限制可选的 userIds 范围 */ optionIds?: string[]; /** * 禁用的 userIds,不可选择 / 反选 */ disabledIds?: string[]; /** * 禁止弹出用户卡片 */ userCardDisabled?: boolean; /** * 空间标识 * 1. 影响用户搜索范围: * * 1.1 非企业互联租户,无论是否提供 spaceId,搜索全租户 * * 1.2 企业互联租户 * * 1.2.1 提供 spaceId: * a. spaceId 是开放空间:搜索当前登录租户 + 协作租户开放名单 * b. spaceId 不是开放空间:只搜索当前登录租户 * * 1.2.2 不提供 spaceId: 搜索当前登录租户 * 2. 影响推荐用户列表: * * 2.1 提供 spaceId: 默认推荐用户列表对不同空间有区别 * * 2.2 未提供 spaceId: 默认推荐用户列表对不同空间无区别 */ spaceId?: string; } export declare interface IUserTagProps extends IBaseDOMProps, Pick<IBaseUserTagProps, 'userId' | 'closable' | 'disabled' | 'name' | 'avatar'> { /** * 关闭回调 * @returns */ onClose?: () => void; } export declare interface IWorkItemFinderProps extends IBaseDOMProps, IBasePopoverProps, Omit<WorkItemFinderOptions, 'title'> { /** * 是否禁用,禁用状态下不能打开配置界面 */ disabled?: boolean; /** * 修改配置触发 * @param params total:筛选条件数量 * @returns */ onChange?: (params: { total: number; }) => void; /** * 保存提交 * @param params searchId 筛选条件id * @returns */ onSubmit?: (params: { searchId: string; searchGroup?: any; }) => void; /** * 非阻塞异常,以下情况会触发此回调: * 1. { c: 1, m: 'searchId not match spaceId or workObjectId' } * @param err * @returns */ onValidateError?: (err: IError) => void; /** * 阻塞异常,比如保存失败 * @param err * @returns */ onError?: (err: IError) => void; } declare function OriginSelectOptions<DATA extends Record<string, any> = Record<string, any>>(props: ISelectOptionsProps<DATA>): ReactElement; /** * [基础组件] Popover */ export declare const Popover: PopoverComponent; declare interface PopoverComponent extends ForwardRefExoticComponent<IPopoverProps & RefAttributes<{ popup?: Record<string, any>; }>> { PopoverContent: IPopoverContent; } declare type PopType = 'Popover' | 'Select'; /** * @deprecated PopupContentContext is deprecated. Please use Popover.PopoverContent instead. */ export declare const PopupContentContext: IPopoverContent; export declare type PresetItem = { text?: string; start?: Date; end?: Date; }; declare type RangeFocusType = 'rangeStart' | 'rangeEnd' | ''; /** * [业务组件] RichTextEditor * * 富文本编辑器 */ export declare function RichTextEditor({ spaceId, defaultValue, editable, imageUpload, editType, editPopoverProps, }: IRichTextEditorProps): ReactElement; /** * [基础组件] Select */ export declare function Select<DATA extends Record<string, any> = Record<string, any>>(props: ISelectProps<DATA>): ReactElement; export declare namespace Select { var SelectOptions: typeof OriginSelectOptions; } /** * [业务组件] UserSelect * * 用户选择 */ export declare function UserSelect({ className, style, multiple, placeholder, showClear, disabled, maxTagCount, spaceId, userIds: _userIds, onChange, optionIds, disabledIds, userCardDisabled, }: IUserSelectProps): ReactElement; /** * [业务组件] UserTag * * 用户标签,hover 出用户卡片 */ export declare function UserTag({ className, style, userId, name, avatar, closable, onClose, disabled }: IUserTagProps): ReactElement; /** * [业务组件] 工作项筛选器 */ export declare function WorkItemFinder({ className, style, children, disabled, onChange, onSubmit, onValidateError, onError, searchId, position, spaceId, workObjectId, backfill, forceCreateNewSearchId, }: IWorkItemFinderProps): ReactElement; export { }