UNPKG

jamis

Version:

一种支持通过JSON配置方式生成页面的组件库

350 lines (349 loc) 10.4 kB
import type { OnEventProps, RendererProps, SchemaBoolean, SchemaNode, ThemeProps } from 'jamis-core'; import type { BadgeObject, BaseSchema, DialogSchemaBase, DrawerSchemaBase, FeedbackDialog, SchemaApi, SchemaClassName, SchemaCollection, SchemaExpression, SchemaIcon, SchemaReload, SchemaTooltip, SchemaTpl, SizeUnit, StaticControlSchemaBase, ToastSchemaBase, TourConfig } from '../types'; interface Button { type: 'submit' | 'button' | 'reset'; label?: string; icon?: string; size?: string; disabled?: boolean; className?: string; } export type ButtonLevel = 'info' | 'success' | 'warning' | 'danger' | 'link' | 'primary' | 'dark' | 'light' | 'secondary' | 'enhance' | 'default'; /** * @deprecated 过期, 和ActionObject重复了 */ export interface ActionOld extends Button { actionType?: 'submit' | 'copy' | 'reload' | 'ajax' | 'saveAs' | 'dialog' | 'drawer' | 'jump' | 'link' | 'url' | 'email' | 'close' | 'confirm' | 'add' | 'remove' | 'delete' | 'edit' | 'cancel' | 'next' | 'prev' | 'reset' | 'validate' | 'reset-and-submit' | 'clear' | 'clear-and-submit' | 'toast' | 'goto-step' | 'goto-image' | 'expand' | 'collapse' | 'step-submit' | 'selectAll' | 'changeTabKey' | 'click' | 'stopAutoRefresh'; api?: SchemaApi; asyncApi?: SchemaApi; payload?: any; dialog?: SchemaNode; to?: string; target?: string; link?: string; url?: string; cc?: string; bcc?: string; subject?: string; body?: string; mergeData?: boolean; reload?: string; messages?: { success?: string; failed?: string; }; feedback?: any; required?: Array<string>; [propName: string]: any; } export interface ButtonSchema extends BaseSchema, OnEventProps { /** * 指定按钮类型,支持 button、submit或者reset三种类型。 * 兼容action类型写法, 但会被转换成button */ type: 'button' | 'submit' | 'reset' | 'action'; /** * 其他各个具体的schema会指定明确的actionType */ actionType?: string; /** * 透传渲染器的路径 * @inner 内部使用 */ __$path?: string; /** * 是否为块状展示,默认为内联。 */ block?: boolean; /** * 禁用时的文案提示。 */ disabledTip?: string; /** * 按钮图标, antd图标的类名, 如LeftOutlined */ icon?: SchemaIcon; iconExpr?: SchemaExpression; /** * icon 上的css 类名 */ iconClassName?: SchemaClassName; /** * 右侧按钮图标, iconfont 的类名 */ rightIcon?: SchemaIcon; /** * 右侧 icon 上的 css 类名 */ rightIconClassName?: SchemaClassName; /** * loading 上的css 类名 */ loadingClassName?: SchemaClassName; /** * 按钮文字 */ label?: string; /** * 按钮样式 */ level?: ButtonLevel; /** * @deprecated 通过 level 来配置 */ primary?: boolean; /** * 按钮大小 */ size?: SizeUnit; tooltip?: SchemaTooltip; tooltipPlacement?: 'top' | 'right' | 'bottom' | 'left'; /** * 提示文字,配置了操作前会要求用户确认。 */ confirmText?: string; /** * 如果按钮在form中,配置此属性会要求用户把指定的字段通过验证后才会触发行为。 */ required?: Array<string>; /** * 激活状态时的样式 */ activeLevel?: ButtonLevel; /** * 激活状态时的类名 */ activeClassName?: string; /** * 如果按钮在弹框中,可以配置这个动作完成后是否关闭弹窗,或者指定关闭目标弹框。 */ close?: boolean | string; /** * 当按钮时批量操作按钮时,默认必须有勾选元素才能可点击,如果此属性配置成 false,则没有点选成员也能点击。 */ requireSelected?: boolean; /** * 是否将弹框中数据 merge 到父级作用域。 */ mergeData?: boolean; /** * 可以指定让谁来触发这个动作。 */ target?: string; /** * 点击后的禁止倒计时(秒) */ countDown?: number; /** 点击后的禁止倒计时(秒)表达式 */ countDownExpr?: SchemaExpression; /** * 倒计时文字自定义 */ countDownTpl?: string; /** * 角标 */ badge?: BadgeObject; /** * 键盘快捷键 */ hotKey?: string; /** * 是否显示loading效果 */ loadingOn?: string; /** * 子内容 */ body?: SchemaCollection; /** 是否是激活态 */ active?: boolean; /** * 是否禁止冒泡 */ stopPropagation?: boolean; stopPropagationOn?: SchemaBoolean; /** * 自定义事件处理函数 */ onClick?: (event: React.SyntheticEvent<HTMLElement>, props: ActionProps) => any; } export interface AjaxActionSchema extends ButtonSchema { /** * 指定为发送 ajax 的行为。 */ actionType: 'ajax'; /** * 配置 ajax 发送地址 */ api: SchemaApi; feedback?: FeedbackDialog; reload?: SchemaReload; redirect?: string; ignoreConfirm?: boolean; /** 接口请求消息提示 */ messages?: { success: string; failed: string; }; } export interface DownloadActionSchema extends Omit<AjaxActionSchema, 'actionType'> { /** * 指定为下载行为 */ actionType: 'download'; } export interface SaveAsActionSchema extends Omit<AjaxActionSchema, 'actionType'> { /** * 指定为保存到本地 */ actionType: 'saveAs'; } export interface UrlActionSchema extends ButtonSchema { /** * 指定为打开链接 */ actionType: 'url'; /** * 是否新窗口打开 */ blank?: boolean; /** * 打开的目标地址 */ url: string; } export interface DialogActionSchema extends ButtonSchema { /** * 指定为打开弹窗 */ actionType: 'dialog'; /** * 弹框详情 * */ dialog: DialogSchemaBase; /** * 是否有下一个的表达式,正常可以不用配置,如果想要刷掉某些数据可以配置这个。 */ nextCondition?: SchemaExpression; reload?: SchemaReload; redirect?: string; } export interface DrawerActionSchema extends ButtonSchema { /** * 指定为打开弹窗,抽出式弹窗 */ actionType: 'drawer'; /** * 抽出式弹框详情 * */ drawer: DrawerSchemaBase; /** * 是否有下一个的表达式,正常可以不用配置,如果想要刷掉某些数据可以配置这个。 */ nextCondition?: SchemaExpression; reload?: SchemaReload; redirect?: string; } export interface ToastActionSchema extends ButtonSchema { /** * 指定为打开弹窗,抽出式弹窗 */ actionType: 'toast'; /** * 轻提示详情 * */ toast: ToastSchemaBase; } export interface CopyActionSchema extends ButtonSchema { /** * 指定为复制内容行为 */ actionType: 'copy'; /** * 复制啥内容由此配置,支持模板语法。 */ copy: SchemaTpl; } export interface LinkActionSchema extends ButtonSchema { /** * 指定为打开链接行为,跟 url 不同的时这个行为为单页模式。 */ actionType: 'link'; /** * 是否新窗口打开 */ blank?: boolean; /** * 跳转到哪?支持配置相对路径。 */ link: string; } export interface ReloadActionSchema extends ButtonSchema { /** * 指定为刷新目标组件。 */ actionType: 'reload'; /** * 指定目标组件。 */ target?: SchemaReload; } export interface EmailActionSchema extends Omit<ButtonSchema, 'body'> { /** * 指定为打开邮箱行为 */ actionType: 'email'; /** * 收件人邮箱 */ to: string; /** * 抄送邮箱 */ cc?: string; /** * 匿名抄送邮箱 */ bcc?: string; /** * 邮件主题 */ subject?: string; /** * 邮件正文 */ body?: string; } export interface OtherActionSchema extends ButtonSchema { actionType: 'prev' | 'next' | 'cancel' | 'close' | 'submit' | 'confirm' | 'add' | 'reset' | 'reset-and-submit'; } export interface TourAction extends ButtonSchema { actionType: 'tour'; tourConfig: TourConfig; } /** * 按钮动作渲染器。 * */ export type ActionSchema = ButtonSchema | AjaxActionSchema | DownloadActionSchema | UrlActionSchema | LinkActionSchema | DialogActionSchema | DrawerActionSchema | ToastActionSchema | CopyActionSchema | ReloadActionSchema | EmailActionSchema | OtherActionSchema | TourAction; export interface StaticActionSchema extends Omit<ActionSchema, 'type'>, Omit<StaticControlSchemaBase, 'label' | 'required'> { type?: `static-${ActionSchema['type']}`; } type OmitButtonSchema = 'type' | 'className' | 'iconClassName' | 'rightIconClassName' | 'loadingClassName' | 'onClick' | 'actionType'; export interface ActionProps extends Omit<RendererProps, 'onAction'>, ThemeProps, Omit<Partial<ButtonSchema>, OmitButtonSchema>, Omit<Partial<AjaxActionSchema>, OmitButtonSchema>, Omit<Partial<UrlActionSchema>, OmitButtonSchema>, Omit<Partial<LinkActionSchema>, OmitButtonSchema>, Omit<Partial<DialogActionSchema>, OmitButtonSchema>, Omit<Partial<DrawerActionSchema>, OmitButtonSchema>, Omit<Partial<ToastSchemaBase>, OmitButtonSchema>, Omit<Partial<CopyActionSchema>, OmitButtonSchema>, Omit<Partial<ReloadActionSchema>, OmitButtonSchema>, Omit<Partial<EmailActionSchema>, 'body' | OmitButtonSchema>, Omit<Partial<OtherActionSchema>, OmitButtonSchema>, Omit<Partial<TourAction>, OmitButtonSchema> { actionType?: ActionSchema['actionType']; onAction?: (e: React.MouseEvent<any> | void | null, action: ActionSchema) => void; onActionSensor?: (promise?: Promise<any>) => void; isCurrentUrl?: (link: string) => boolean; onClick?: ((e: React.MouseEvent<any>, props: any) => void) | string | Function | null; componentClass?: React.ComponentType | 'a' | 'button' | 'div' | 'input'; tooltipContainer?: any; isMenuItem?: boolean; active?: boolean; [propName: string]: any; } export {};