jamis
Version:
一种支持通过JSON配置方式生成页面的组件库
227 lines (226 loc) • 5.73 kB
TypeScript
import type { RendererProps, SchemaClassName, SchemaExpression, ThemeProps } from 'jamis-core';
import type { ActionSchema, BaseSchema, DropdownButtonSchema, IListItem, SchemaCopyable, SchemaObject, SchemaPopOver, SchemaQuickEdit, SchemaTpl, SchemaUrlPath, TplSchema } from '../types';
/**
* Card 卡片渲染器。
*
*/
export interface CardSchema extends BaseSchema {
/**
* 指定为 card 类型
*/
type: 'card';
/**
* 头部配置
*/
header?: CardHeader;
/**
* 内容区域
*/
body?: Array<SchemaObject & CardBodyField> | SchemaTpl;
bodyClassName?: SchemaClassName;
/**
* 多媒体区域
*/
media?: CardMedia;
/**
* 底部按钮集合。
*/
actions?: Array<ActionSchema | DropdownButtonSchema>;
actionsClassName?: SchemaClassName;
/**
* 每个操作按钮的样式类
*/
actionsItemClassName?: SchemaClassName;
/**
* 工具栏按钮
*/
toolbar?: Array<ActionSchema | DropdownButtonSchema | TplSchema>;
/**
* 次要说明
*/
secondary?: SchemaTpl;
/**
* 卡片内容区的表单项label是否使用Card内部的样式,默认为true
*/
useCardLabel?: boolean;
/**
* 设置整个卡片的点击行为
*/
itemAction?: ActionSchema | DropdownButtonSchema;
/**
* 卡片跳转地址, 可以是绝对路径, 也可以是前端路由
*/
href?: string;
/**
* 是否新窗口打开
*/
blank?: boolean;
lazyItemClassName?: SchemaClassName;
}
export interface CardBodyField {
/**
* 列标题
*/
label?: string;
/**
* label 类名
*/
labelClassName?: SchemaClassName;
/**
* 绑定字段名
*/
name?: string;
/**
* 配置查看详情功能
*/
popOver?: SchemaPopOver;
/**
* 配置快速编辑功能
*/
quickEdit?: SchemaQuickEdit;
/**
* 配置点击复制功能
*/
copyable?: SchemaCopyable;
/** 外部包装的样式类 */
wrapClassName?: SchemaClassName;
}
export interface CardHeader {
className?: SchemaClassName;
/**
* 标题
*/
title?: SchemaTpl;
titleClassName?: SchemaClassName;
/**
* 副标题
*/
subTitle?: SchemaTpl;
subTitleClassName?: SchemaClassName;
subTitlePlaceholder?: string;
/**
* 描述
*/
description?: SchemaTpl;
/**
* 描述占位内容
*/
descriptionPlaceholder?: string;
/**
* 描述占位类名
*/
descriptionClassName?: SchemaClassName;
/**
* @deprecated 建议用 description
*/
desc?: SchemaTpl;
/**
* @deprecated 建议用 descriptionPlaceholder
*/
descPlaceholder?: SchemaTpl;
/**
* @deprecated 建议用 descriptionClassName
*/
descClassName?: SchemaClassName;
/**
* 图片地址
*/
avatar?: SchemaUrlPath;
avatarText?: SchemaTpl;
avatarTextBackground?: String[];
avatarTextClassName?: SchemaClassName;
/**
* 图片包括层类名
*/
avatarClassName?: SchemaClassName;
/**
* 图片类名。
*/
imageClassName?: SchemaClassName;
/**
* 是否点亮
*/
highlight?: SchemaExpression | boolean;
highlightClassName?: SchemaClassName;
/**
* 链接地址
*/
href?: SchemaTpl;
/**
* 是否新窗口打开
*/
blank?: boolean;
}
export interface CardMedia {
className?: SchemaClassName;
/**
* 多媒体类型
*/
type?: 'image' | 'video';
/**
* 多媒体链接地址
*/
url?: SchemaUrlPath;
/**
* 多媒体区域位置
*/
position?: 'top' | 'left' | 'right' | 'bottom';
/**
* 类型为video时是否自动播放
*/
autoPlay?: boolean;
/**
* 类型为video时是否是直播
*/
isLive?: boolean;
/**
* 类型为video时视频封面
*/
poster?: SchemaUrlPath | false;
}
export interface CardRendererProps extends RendererProps, Omit<CardSchema, 'className'> {
actionsCount: number;
itemIndex?: number;
dragging?: boolean;
selectable?: boolean;
selected?: boolean;
checkable?: boolean;
multiple?: boolean;
hideCheckToggler?: boolean;
item: IListItem;
checkOnItemClick?: boolean;
onCheck: (item: IListItem) => Promise<void>;
onDoubleClick?: (e: React.MouseEvent<HTMLDivElement>) => void;
onClickBefore?: () => Promise<boolean>;
}
export interface CardProps extends ThemeProps {
className?: SchemaClassName;
headerClassName?: SchemaClassName;
titleClassName?: SchemaClassName;
subTitleClassName?: SchemaClassName;
descriptionClassName?: SchemaClassName;
avatarTextStyle?: React.CSSProperties;
avatarTextClassName?: SchemaClassName;
avatarClassName?: SchemaClassName;
secondaryClassName?: SchemaClassName;
imageClassName?: SchemaClassName;
bodyClassName?: SchemaClassName;
footerClassName?: SchemaClassName;
media?: React.ReactNode;
mediaPosition?: 'top' | 'left' | 'right' | 'bottom';
mediaClassName?: SchemaClassName;
toolbar?: React.ReactNode;
children?: React.ReactNode;
actions?: React.ReactNode;
title?: string | JSX.Element;
subTitle?: string | JSX.Element;
subTitlePlaceholder?: string | JSX.Element;
description?: string | JSX.Element;
descriptionPlaceholder?: string | JSX.Element;
avatar?: string;
avatarText?: string | JSX.Element;
secondary?: string | JSX.Element;
onClick?: (e: React.MouseEvent<HTMLDivElement>) => void;
onDoubleClick?: (e: React.MouseEvent<HTMLDivElement>) => void;
data?: any;
}