@vue-ui-kit/ant
Version:
Vue3 UI Kit based on Ant Design
139 lines (127 loc) • 4.12 kB
text/typescript
import { PFormProps, PGridProps } from '#/antProxy';
import type { AutoViewportBoxOffsetInput } from '@/utils/autoViewportBox';
import { ConfigType } from 'e-virt-table';
import { clone } from 'xe-utils';
import type { VNode } from 'vue';
// 全局配置接口
export interface UIKitConfig {
form?: {
labelCol?: any;
wrapperCol?: any;
};
grid?: {
align?: 'left' | 'right' | 'center';
lazyReset?: boolean;
fitHeight?: number;
fitCanvasHeight?: number;
striped?: boolean;
/** `PGrid` / `PCanvasGrid` 分页是否显示「跳至」;`pageConfig.showQuickJumper` 优先 */
showQuickJumper?: boolean;
/** `PGrid` 开启 `autoBoxSize` 且未传 `autoBoxSizeOffset` 时的视口边距,与 props 类型一致 */
autoBoxSizeOffset?: AutoViewportBoxOffsetInput;
};
canvasTable?: ConfigType;
/**
* 自定义 tooltip 渲染函数,替换全局所有 a-tooltip。
* @param defaultSlot 原 tooltip 触发元素(图标等)
* @param content tooltip 内容,字符串或返回 VNode 的函数
*/
renderTooltip?: (defaultSlot: () => VNode, content: string | (() => VNode)) => VNode;
/**
* 自定义图标:按 `icon` 名字渲染;返回值为真时优先于 `@ant-design/icons-vue` 同名组件。
*/
icon?: {
render?: (name: string) => unknown;
/**
* CollapseCard / PFormGroup 折叠箭头:
* - `string`:单图标,靠旋转区分(默认收起 0° / 展开 -90°)
* - `[collapsed, expanded]`:双图标切换,不旋转
*/
collapseExpandIcon?: string | [collapsed: string, expanded: string];
};
}
// 默认配置
const defaultConfig: UIKitConfig = {
form: {
labelCol: { span: 6 },
wrapperCol: { span: 16 },
},
grid: {
align: 'left',
lazyReset: false,
fitHeight: 30,
striped: false,
showQuickJumper: true,
},
canvasTable: {
DISABLED: true,
ENABLE_FINDER: true,
AUTO_ROW_HEIGHT: true,
BORDER_RADIUS: 4,
},
icon: {},
};
// 当前配置(可被修改)
let currentConfig: UIKitConfig = clone(defaultConfig, true);
// 设置配置
export function setUIKitConfig(config: Partial<UIKitConfig>): void {
currentConfig = {
form: {
...currentConfig.form,
...config.form,
},
grid: {
...currentConfig.grid,
...config.grid,
},
canvasTable: {
...currentConfig.canvasTable,
...config.canvasTable,
},
renderTooltip: config.renderTooltip ?? currentConfig.renderTooltip,
icon: {
...currentConfig.icon,
...config.icon,
},
};
}
// 获取自定义 tooltip 渲染函数
export function getTooltipRenderer(): UIKitConfig['renderTooltip'] {
return currentConfig.renderTooltip;
}
// 获取配置
export function getUIKitConfig(): UIKitConfig {
return currentConfig;
}
// 获取表单默认配置
export function getFormDefaults(): Partial<PFormProps> {
return {
labelCol: currentConfig.form?.labelCol,
wrapperCol: currentConfig.form?.wrapperCol,
};
}
// 获取Grid默认配置
export function getGridDefaults(): Partial<PGridProps> {
return {
align: currentConfig.grid?.align,
lazyReset: currentConfig.grid?.lazyReset,
fitHeight: currentConfig.grid?.fitHeight,
striped: currentConfig.grid?.striped,
autoBoxSizeOffset: currentConfig.grid?.autoBoxSizeOffset,
};
}
/** 分页「跳至」:局部 pageConfig 优先,否则读全局 grid.showQuickJumper,默认 true */
export function resolveShowQuickJumper(pageConfig?: { showQuickJumper?: boolean }): boolean {
if (pageConfig?.showQuickJumper !== undefined) {
return pageConfig.showQuickJumper;
}
return currentConfig.grid?.showQuickJumper ?? true;
}
// 获取CanvasTable默认配置
export function getCanvasTableDefaults(): ConfigType {
return currentConfig.canvasTable || ({} as ConfigType);
}
// 重置为默认配置
export function resetUIKitConfig(): void {
currentConfig = JSON.parse(JSON.stringify(defaultConfig));
}