feat: 更新为 1.2.0 构建产物(内核重构版)

- 产物替换为 funjiaui.es.js / funjiaui.cjs.js / funjiaui.umd.js
- style.css 更新,新增 index.d.ts 与各组件类型声明目录
- 移除旧产物 um_table.es.js(1.0.0 的 ES 包,历史与 v1.0.0 标签仍可回溯)
- package.json 补齐 module / types / unpkg / jsdelivr / files 字段,
  并将 vue、element-plus、@element-plus/icons-vue 声明为 peerDependencies
- 新增 README 说明产物清单与用法
This commit is contained in:
2026-09-19 01:04:09 +08:00
parent 0d6ad0c775
commit f26bd3f377
38 changed files with 14329 additions and 3516 deletions
+37
View File
@@ -0,0 +1,37 @@
import type { VNode } from "vue";
declare const _sfc_main: import("vue").DefineComponent<{
target: any;
data: any[];
/**
* 是否为树形表格
*/
isExpand?: boolean | undefined;
/**
* 树形表格模板
*/
expandTemplate?: VNode<import("vue").RendererNode, import("vue").RendererElement, {
[key: string]: any;
}> | undefined;
otherParams?: any;
searchParams?: any;
}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, import("vue").EmitsOptions, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<{
target: any;
data: any[];
/**
* 是否为树形表格
*/
isExpand?: boolean | undefined;
/**
* 树形表格模板
*/
expandTemplate?: VNode<import("vue").RendererNode, import("vue").RendererElement, {
[key: string]: any;
}> | undefined;
otherParams?: any;
searchParams?: any;
}>, {
target: any;
otherParams: any;
searchParams: any;
}>;
export default _sfc_main;
+29
View File
@@ -0,0 +1,29 @@
declare const _sfc_main: import("vue").DefineComponent<{
target: Function | any;
data: any[];
class?: string | undefined;
otherParams?: any;
formData?: any;
/**
* 是否为树状列表
*/
isExpand?: boolean | undefined;
expandTemplate?: any;
}, any, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, import("vue").EmitsOptions, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<{
target: Function | any;
data: any[];
class?: string | undefined;
otherParams?: any;
formData?: any;
/**
* 是否为树状列表
*/
isExpand?: boolean | undefined;
expandTemplate?: any;
}>, {
target: any;
expandTemplate: any;
otherParams: any;
formData: any;
}>;
export default _sfc_main;
+77
View File
@@ -0,0 +1,77 @@
import type { PropType } from "vue";
import type { TColumnRender, tFieldType } from "./types";
declare const _sfc_main: import("vue").DefineComponent<{
fieldType: {
type: PropType<tFieldType>;
default: string;
};
data: {
type: PropType<Record<string, any>>;
default: () => {};
};
prop: {
type: StringConstructor;
default: string;
};
/** 自定义渲染函数 */
render: {
type: PropType<TColumnRender>;
default: undefined;
};
/**
* 日期格式化模板(仅 fieldType === "date" 生效)。
* 不传时沿用历史默认 `YYYY-MM-DD HH:mm:ss`。
*/
dateFormat: {
type: StringConstructor;
default: undefined;
};
/** 是否显示单元格内容(支持异步) */
isShow: {
type: PropType<(data: any) => boolean | Promise<boolean>>;
default: undefined;
};
}, unknown, {
visible: boolean;
}, {}, {
refreshVisible(): Promise<void>;
}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, Record<string, any>, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
fieldType: {
type: PropType<tFieldType>;
default: string;
};
data: {
type: PropType<Record<string, any>>;
default: () => {};
};
prop: {
type: StringConstructor;
default: string;
};
/** 自定义渲染函数 */
render: {
type: PropType<TColumnRender>;
default: undefined;
};
/**
* 日期格式化模板(仅 fieldType === "date" 生效)。
* 不传时沿用历史默认 `YYYY-MM-DD HH:mm:ss`。
*/
dateFormat: {
type: StringConstructor;
default: undefined;
};
/** 是否显示单元格内容(支持异步) */
isShow: {
type: PropType<(data: any) => boolean | Promise<boolean>>;
default: undefined;
};
}>>, {
data: Record<string, any>;
fieldType: tFieldType;
prop: string;
dateFormat: string;
isShow: (data: any) => boolean | Promise<boolean>;
render: TColumnRender;
}>;
export default _sfc_main;
+42
View File
@@ -0,0 +1,42 @@
declare const _sfc_main: import("vue").DefineComponent<{}, {
emit: (e: "click", data: Event) => any;
fileInput: import("vue").Ref<any>;
onClick: () => void;
onFileChange: (e: Event) => void;
Iconfont: import("vue").DefineComponent<{
class: {
type: StringConstructor;
required: false;
};
style: {
type: null;
required: false;
};
type: {
type: StringConstructor;
required: true;
};
}, {
props: any;
emit: (e: "click") => void;
iconClass: import("vue").ComputedRef<string>;
}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, "click"[], "click", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
class: {
type: StringConstructor;
required: false;
};
style: {
type: null;
required: false;
};
type: {
type: StringConstructor;
required: true;
};
}>> & {
onClick?: ((...args: any[]) => any) | undefined;
}, {}>;
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, "click"[], "click", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{}>> & {
onClick?: ((...args: any[]) => any) | undefined;
}, {}>;
export default _sfc_main;
+35
View File
@@ -0,0 +1,35 @@
interface ISearchField {
label: string;
/** 由 `fieldType` 推导出的默认控件 */
fieldType?: string;
/** 由 `$um_component` 显式指定的控件,优先级高于 fieldType */
component?: string;
prop: string;
placeholder?: string;
style?: any;
}
declare const _sfc_main: import("vue").DefineComponent<{
/** 配置类(构造函数或实例) */
target: {
type: any;
required: true;
};
}, unknown, {
formFields: ISearchField[];
formModel: Record<string, any>;
fieldOption: Map<string, any>;
}, {}, {
/** 收集字段并按 fieldName 初始化表单模型 */
buildFields(): Promise<void>;
onSubmit(): void;
onReset(): void;
}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, "change"[], "change", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
/** 配置类(构造函数或实例) */
target: {
type: any;
required: true;
};
}>> & {
onChange?: ((...args: any[]) => any) | undefined;
}, {}>;
export default _sfc_main;
+124
View File
@@ -0,0 +1,124 @@
import type { IFormRule } from "./types";
declare const _sfc_main: import("vue").DefineComponent<{
data: {
type: null;
required: false;
};
depData: {
type: null;
required: false;
};
}, {
props: any;
SyncNode: {
new (): {};
};
tableForm: import("vue").Ref<any>;
formId: import("vue").Ref<string | number>;
moduleFieldName: import("vue").Ref<string>;
moduleFieldTitle: import("vue").Ref<string>;
formModel: import("vue").Ref<{
[x: string]: any;
}>;
target: import("vue").ComputedRef<{
new (): {};
}>;
lastApplied: any;
onFormModelChange: (v: any) => void;
onOk: (_data: any) => void;
UmTableForm: import("vue").DefineComponent<{}, {
formModel: import("vue").Ref<{
[x: string]: any;
}>;
setFormModel: (models: any) => void;
}, {
rules: Record<string, any>;
formItems: any[];
fieldOption: Map<string, any>;
maxLabelWidth: number;
showList: string[];
cascadeMap: Map<string, string[]>;
throttleRefreshForm: import("lodash").DebouncedFunc<(this: any, v: any, oldV: any, needFreshCascadeField: string[]) => Promise<void>>;
}, {
formCom(): import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
[key: string]: any;
}> | null;
}, {
refreshForm(v: any, oldV: any, needFreshCascadeField: string[]): Promise<void | undefined>;
onSubmit(): Promise<void>;
getRule(rule: IFormRule): {
required: boolean;
message: string | undefined;
pattern?: undefined;
min?: undefined;
max?: undefined;
validator?: undefined;
} | {
pattern: RegExp;
message: string;
required?: undefined;
min?: undefined;
max?: undefined;
validator?: undefined;
} | {
min: number | undefined;
max: number | undefined;
message: string;
required?: undefined;
pattern?: undefined;
validator?: undefined;
} | {
max: number | undefined;
message: string;
required?: undefined;
pattern?: undefined;
min?: undefined;
validator?: undefined;
} | {
min: number | undefined;
message: string;
required?: undefined;
pattern?: undefined;
max?: undefined;
validator?: undefined;
} | {
validator: any;
required?: undefined;
message?: undefined;
pattern?: undefined;
min?: undefined;
max?: undefined;
} | {
required?: undefined;
message?: undefined;
pattern?: undefined;
min?: undefined;
max?: undefined;
validator?: undefined;
} | undefined;
updateFieldOption(fieldName: string, metaData: import("./types").IFieldMetaValue, isBeforeMount?: boolean): Promise<void>;
initShowFieldList(v: any, oldV?: any): Promise<void>;
initCascadeData(needFreshCascadeField: string[]): Promise<void>;
initData(): Promise<void>;
initFormItem(): void;
initRule(isBeforeMount?: boolean): void;
init(): Promise<void>;
initForm(fieldName: string, value: any): void;
}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("ok" | "cancel" | "formModelChange")[], "ok" | "cancel" | "formModelChange", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{}>> & {
onOk?: ((...args: any[]) => any) | undefined;
onCancel?: ((...args: any[]) => any) | undefined;
onFormModelChange?: ((...args: any[]) => any) | undefined;
}, {}>;
}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, "cancel"[], "cancel", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
data: {
type: null;
required: false;
};
depData: {
type: null;
required: false;
};
}>> & {
onCancel?: ((...args: any[]) => any) | undefined;
}, {}>;
export default _sfc_main;
+600
View File
@@ -0,0 +1,600 @@
import type { IToolbar, TEvent } from "./types";
declare const _sfc_main: import("vue").DefineComponent<{
style: {
type: null;
required: false;
};
width: {
type: (NumberConstructor | StringConstructor)[];
required: false;
default: string;
};
data: {
type: ArrayConstructor;
required: true;
};
toolbarOptions: {
type: ArrayConstructor;
required: false;
default: () => never[];
};
toolbarEvents: {
type: ArrayConstructor;
required: false;
default: () => never[];
};
otherParams: {
type: null;
required: false;
default: () => {};
};
searchParams: {
type: null;
required: false;
default: () => {};
};
rowKey: {
type: StringConstructor;
required: false;
default: string;
};
defaultExpandAll: {
type: BooleanConstructor;
required: false;
default: boolean;
};
treeProps: {
type: null;
required: false;
};
}, {
props: any;
selection: import("vue").Ref<any[]>;
onSelect: (rows: any[]) => void;
onSelectAll: (rows: any[]) => void;
ElTable: import("element-plus/es/utils").SFCWithInstall<import("vue").DefineComponent<{
data: {
type: import("vue").PropType<any[]>;
default: () => never[];
};
size: StringConstructor;
width: (NumberConstructor | StringConstructor)[];
height: (NumberConstructor | StringConstructor)[];
maxHeight: (NumberConstructor | StringConstructor)[];
fit: {
type: BooleanConstructor;
default: boolean;
};
stripe: BooleanConstructor;
border: BooleanConstructor;
rowKey: import("vue").PropType<string | ((row: any) => string) | undefined>;
showHeader: {
type: BooleanConstructor;
default: boolean;
};
showSummary: BooleanConstructor;
sumText: StringConstructor;
summaryMethod: import("vue").PropType<import("element-plus/es/components/table/src/table/defaults").SummaryMethod<any> | undefined>;
rowClassName: import("vue").PropType<import("element-plus/es/components/table/src/table/defaults").ColumnCls<any> | undefined>;
rowStyle: import("vue").PropType<import("element-plus/es/components/table/src/table/defaults").ColumnStyle<any> | undefined>;
cellClassName: import("vue").PropType<string | ((data: {
row: any;
rowIndex: number;
column: import("element-plus/es/components/table/src/table-column/defaults").TableColumnCtx<any>;
columnIndex: number;
}) => string) | undefined>;
cellStyle: import("vue").PropType<import("vue").CSSProperties | ((data: {
row: any;
rowIndex: number;
column: import("element-plus/es/components/table/src/table-column/defaults").TableColumnCtx<any>;
columnIndex: number;
}) => import("vue").CSSProperties) | undefined>;
headerRowClassName: import("vue").PropType<import("element-plus/es/components/table/src/table/defaults").ColumnCls<any> | undefined>;
headerRowStyle: import("vue").PropType<import("element-plus/es/components/table/src/table/defaults").ColumnStyle<any> | undefined>;
headerCellClassName: import("vue").PropType<string | ((data: {
row: any;
rowIndex: number;
column: import("element-plus/es/components/table/src/table-column/defaults").TableColumnCtx<any>;
columnIndex: number;
}) => string) | undefined>;
headerCellStyle: import("vue").PropType<import("vue").CSSProperties | ((data: {
row: any;
rowIndex: number;
column: import("element-plus/es/components/table/src/table-column/defaults").TableColumnCtx<any>;
columnIndex: number;
}) => import("vue").CSSProperties) | undefined>;
highlightCurrentRow: BooleanConstructor;
currentRowKey: (NumberConstructor | StringConstructor)[];
emptyText: StringConstructor;
expandRowKeys: import("vue").PropType<any[] | undefined>;
defaultExpandAll: BooleanConstructor;
defaultSort: import("vue").PropType<import("element-plus/es/components/table/src/table/defaults").Sort | undefined>;
tooltipEffect: StringConstructor;
spanMethod: import("vue").PropType<((data: {
row: any;
rowIndex: number;
column: import("element-plus/es/components/table/src/table-column/defaults").TableColumnCtx<any>;
columnIndex: number;
}) => number[] | {
rowspan: number;
colspan: number;
}) | undefined>;
selectOnIndeterminate: {
type: BooleanConstructor;
default: boolean;
};
indent: {
type: NumberConstructor;
default: number;
};
treeProps: {
type: import("vue").PropType<{
hasChildren?: string | undefined;
children?: string | undefined;
} | undefined>;
default: () => {
hasChildren: string;
children: string;
};
};
lazy: BooleanConstructor;
load: import("vue").PropType<((row: any, treeNode: import("element-plus/es/components/table/src/table/defaults").TreeNode, resolve: (data: any[]) => void) => void) | undefined>;
style: {
type: import("vue").PropType<import("vue").CSSProperties>;
default: () => {};
};
className: {
type: StringConstructor;
default: string;
};
tableLayout: {
type: import("vue").PropType<"fixed" | "auto">;
default: string;
};
scrollbarAlwaysOn: {
type: BooleanConstructor;
default: boolean;
};
}, {
ns: {
namespace: import("vue").ComputedRef<string>;
b: (blockSuffix?: string | undefined) => string;
e: (element?: string | undefined) => string;
m: (modifier?: string | undefined) => string;
be: (blockSuffix?: string | undefined, element?: string | undefined) => string;
em: (element?: string | undefined, modifier?: string | undefined) => string;
bm: (blockSuffix?: string | undefined, modifier?: string | undefined) => string;
bem: (blockSuffix?: string | undefined, element?: string | undefined, modifier?: string | undefined) => string;
is: {
(name: string, state: boolean | undefined): string;
(name: string): string;
};
};
layout: import("element-plus/es/components/table/src/table-layout").default<any>;
store: any;
handleHeaderFooterMousewheel: (event: any, data: any) => void;
handleMouseLeave: () => void;
tableId: string;
tableSize: import("vue").ComputedRef<"" | "default" | "small" | "large">;
isHidden: import("vue").Ref<boolean>;
isEmpty: import("vue").ComputedRef<boolean>;
renderExpanded: import("vue").Ref<null>;
resizeProxyVisible: import("vue").Ref<boolean>;
resizeState: import("vue").Ref<{
width: null;
height: null;
}>;
isGroup: import("vue").Ref<boolean>;
bodyWidth: import("vue").ComputedRef<string>;
bodyHeight: import("vue").ComputedRef<{
height: string;
'max-height'?: undefined;
} | {
'max-height': string;
height?: undefined;
} | {
height?: undefined;
'max-height'?: undefined;
}>;
height: import("vue").ComputedRef<string | number | undefined>;
tableBodyStyles: import("vue").ComputedRef<{
width: string;
}>;
emptyBlockStyle: import("vue").ComputedRef<{
width: string;
height: string;
} | null>;
debouncedUpdateLayout: import("lodash").DebouncedFunc<() => void>;
handleFixedMousewheel: (event: any, data: any) => void;
fixedHeight: import("vue").ComputedRef<{
bottom: number;
height?: undefined;
} | {
bottom: string;
height?: undefined;
} | {
height: string;
bottom?: undefined;
}>;
fixedBodyHeight: import("vue").ComputedRef<{
height: string;
'max-height'?: undefined;
} | {
'max-height': string;
height?: undefined;
} | {
height?: undefined;
'max-height'?: undefined;
}>;
setCurrentRow: (row: any) => void;
getSelectionRows: () => any;
toggleRowSelection: (row: any, selected: boolean) => void;
clearSelection: () => void;
clearFilter: (columnKeys: string[]) => void;
toggleAllSelection: () => void;
toggleRowExpansion: (row: any, expanded: boolean) => void;
clearSort: () => void;
doLayout: () => void;
sort: (prop: string, order: string) => void;
t: import("element-plus").Translator;
setDragVisible: (visible: boolean) => void;
context: import("element-plus/es/components/table/src/table/defaults").Table<any>;
computedSumText: import("vue").ComputedRef<string>;
computedEmptyText: import("vue").ComputedRef<string>;
tableLayout: import("vue").ComputedRef<"fixed" | "auto">;
scrollbarViewStyle: {
display: string;
verticalAlign: string;
};
scrollBarRef: import("vue").Ref<any>;
scrollTo: (options: number | ScrollToOptions, yCoord?: number | undefined) => void;
setScrollLeft: (left?: number | undefined) => void;
setScrollTop: (top?: number | undefined) => void;
}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("select" | "select-all" | "expand-change" | "current-change" | "selection-change" | "cell-mouse-enter" | "cell-mouse-leave" | "cell-contextmenu" | "cell-click" | "cell-dblclick" | "row-click" | "row-contextmenu" | "row-dblclick" | "header-click" | "header-contextmenu" | "sort-change" | "filter-change" | "header-dragend")[], "select" | "select-all" | "expand-change" | "current-change" | "selection-change" | "cell-mouse-enter" | "cell-mouse-leave" | "cell-contextmenu" | "cell-click" | "cell-dblclick" | "row-click" | "row-contextmenu" | "row-dblclick" | "header-click" | "header-contextmenu" | "sort-change" | "filter-change" | "header-dragend", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
data: {
type: import("vue").PropType<any[]>;
default: () => never[];
};
size: StringConstructor;
width: (NumberConstructor | StringConstructor)[];
height: (NumberConstructor | StringConstructor)[];
maxHeight: (NumberConstructor | StringConstructor)[];
fit: {
type: BooleanConstructor;
default: boolean;
};
stripe: BooleanConstructor;
border: BooleanConstructor;
rowKey: import("vue").PropType<string | ((row: any) => string) | undefined>;
showHeader: {
type: BooleanConstructor;
default: boolean;
};
showSummary: BooleanConstructor;
sumText: StringConstructor;
summaryMethod: import("vue").PropType<import("element-plus/es/components/table/src/table/defaults").SummaryMethod<any> | undefined>;
rowClassName: import("vue").PropType<import("element-plus/es/components/table/src/table/defaults").ColumnCls<any> | undefined>;
rowStyle: import("vue").PropType<import("element-plus/es/components/table/src/table/defaults").ColumnStyle<any> | undefined>;
cellClassName: import("vue").PropType<string | ((data: {
row: any;
rowIndex: number;
column: import("element-plus/es/components/table/src/table-column/defaults").TableColumnCtx<any>;
columnIndex: number;
}) => string) | undefined>;
cellStyle: import("vue").PropType<import("vue").CSSProperties | ((data: {
row: any;
rowIndex: number;
column: import("element-plus/es/components/table/src/table-column/defaults").TableColumnCtx<any>;
columnIndex: number;
}) => import("vue").CSSProperties) | undefined>;
headerRowClassName: import("vue").PropType<import("element-plus/es/components/table/src/table/defaults").ColumnCls<any> | undefined>;
headerRowStyle: import("vue").PropType<import("element-plus/es/components/table/src/table/defaults").ColumnStyle<any> | undefined>;
headerCellClassName: import("vue").PropType<string | ((data: {
row: any;
rowIndex: number;
column: import("element-plus/es/components/table/src/table-column/defaults").TableColumnCtx<any>;
columnIndex: number;
}) => string) | undefined>;
headerCellStyle: import("vue").PropType<import("vue").CSSProperties | ((data: {
row: any;
rowIndex: number;
column: import("element-plus/es/components/table/src/table-column/defaults").TableColumnCtx<any>;
columnIndex: number;
}) => import("vue").CSSProperties) | undefined>;
highlightCurrentRow: BooleanConstructor;
currentRowKey: (NumberConstructor | StringConstructor)[];
emptyText: StringConstructor;
expandRowKeys: import("vue").PropType<any[] | undefined>;
defaultExpandAll: BooleanConstructor;
defaultSort: import("vue").PropType<import("element-plus/es/components/table/src/table/defaults").Sort | undefined>;
tooltipEffect: StringConstructor;
spanMethod: import("vue").PropType<((data: {
row: any;
rowIndex: number;
column: import("element-plus/es/components/table/src/table-column/defaults").TableColumnCtx<any>;
columnIndex: number;
}) => number[] | {
rowspan: number;
colspan: number;
}) | undefined>;
selectOnIndeterminate: {
type: BooleanConstructor;
default: boolean;
};
indent: {
type: NumberConstructor;
default: number;
};
treeProps: {
type: import("vue").PropType<{
hasChildren?: string | undefined;
children?: string | undefined;
} | undefined>;
default: () => {
hasChildren: string;
children: string;
};
};
lazy: BooleanConstructor;
load: import("vue").PropType<((row: any, treeNode: import("element-plus/es/components/table/src/table/defaults").TreeNode, resolve: (data: any[]) => void) => void) | undefined>;
style: {
type: import("vue").PropType<import("vue").CSSProperties>;
default: () => {};
};
className: {
type: StringConstructor;
default: string;
};
tableLayout: {
type: import("vue").PropType<"fixed" | "auto">;
default: string;
};
scrollbarAlwaysOn: {
type: BooleanConstructor;
default: boolean;
};
}>> & {
onSelect?: ((...args: any[]) => any) | undefined;
"onExpand-change"?: ((...args: any[]) => any) | undefined;
"onCurrent-change"?: ((...args: any[]) => any) | undefined;
"onSelect-all"?: ((...args: any[]) => any) | undefined;
"onSelection-change"?: ((...args: any[]) => any) | undefined;
"onCell-mouse-enter"?: ((...args: any[]) => any) | undefined;
"onCell-mouse-leave"?: ((...args: any[]) => any) | undefined;
"onCell-contextmenu"?: ((...args: any[]) => any) | undefined;
"onCell-click"?: ((...args: any[]) => any) | undefined;
"onCell-dblclick"?: ((...args: any[]) => any) | undefined;
"onRow-click"?: ((...args: any[]) => any) | undefined;
"onRow-contextmenu"?: ((...args: any[]) => any) | undefined;
"onRow-dblclick"?: ((...args: any[]) => any) | undefined;
"onHeader-click"?: ((...args: any[]) => any) | undefined;
"onHeader-contextmenu"?: ((...args: any[]) => any) | undefined;
"onSort-change"?: ((...args: any[]) => any) | undefined;
"onFilter-change"?: ((...args: any[]) => any) | undefined;
"onHeader-dragend"?: ((...args: any[]) => any) | undefined;
}, {
data: any[];
lazy: boolean;
style: import("vue").CSSProperties;
className: string;
tableLayout: "fixed" | "auto";
border: boolean;
fit: boolean;
scrollbarAlwaysOn: boolean;
stripe: boolean;
treeProps: {
hasChildren?: string | undefined;
children?: string | undefined;
} | undefined;
showHeader: boolean;
showSummary: boolean;
highlightCurrentRow: boolean;
defaultExpandAll: boolean;
selectOnIndeterminate: boolean;
indent: number;
}>> & {
TableColumn: import("vue").DefineComponent<{
type: {
type: StringConstructor;
default: string;
};
label: StringConstructor;
className: StringConstructor;
labelClassName: StringConstructor;
property: StringConstructor;
prop: StringConstructor;
width: {
type: (NumberConstructor | StringConstructor)[];
default: string;
};
minWidth: {
type: (NumberConstructor | StringConstructor)[];
default: string;
};
renderHeader: import("vue").PropType<(data: {
column: import("element-plus/es/components/table/src/table-column/defaults").TableColumnCtx<any>;
$index: number;
}) => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
[key: string]: any;
}>>;
sortable: {
type: (BooleanConstructor | StringConstructor)[];
default: boolean;
};
sortMethod: import("vue").PropType<(a: any, b: any) => number>;
sortBy: import("vue").PropType<string | string[] | ((row: any, index: number) => string)>;
resizable: {
type: BooleanConstructor;
default: boolean;
};
columnKey: StringConstructor;
align: StringConstructor;
headerAlign: StringConstructor;
showTooltipWhenOverflow: BooleanConstructor;
showOverflowTooltip: BooleanConstructor;
fixed: (BooleanConstructor | StringConstructor)[];
formatter: import("vue").PropType<(row: any, column: import("element-plus/es/components/table/src/table-column/defaults").TableColumnCtx<any>, cellValue: any, index: number) => string | import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
[key: string]: any;
}>>;
selectable: import("vue").PropType<(row: any, index: number) => boolean>;
reserveSelection: BooleanConstructor;
filterMethod: import("vue").PropType<import("element-plus/es/components/table/src/table-column/defaults").FilterMethods<any>>;
filteredValue: import("vue").PropType<string[]>;
filters: import("vue").PropType<import("element-plus/es/components/table/src/table-column/defaults").Filters>;
filterPlacement: StringConstructor;
filterMultiple: {
type: BooleanConstructor;
default: boolean;
};
index: import("vue").PropType<number | ((index: number) => number)>;
sortOrders: {
type: import("vue").PropType<("ascending" | "descending" | null)[]>;
default: () => (string | null)[];
validator: (val: ("ascending" | "descending" | null)[]) => boolean;
};
}, void, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, Record<string, any>, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
type: {
type: StringConstructor;
default: string;
};
label: StringConstructor;
className: StringConstructor;
labelClassName: StringConstructor;
property: StringConstructor;
prop: StringConstructor;
width: {
type: (NumberConstructor | StringConstructor)[];
default: string;
};
minWidth: {
type: (NumberConstructor | StringConstructor)[];
default: string;
};
renderHeader: import("vue").PropType<(data: {
column: import("element-plus/es/components/table/src/table-column/defaults").TableColumnCtx<any>;
$index: number;
}) => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
[key: string]: any;
}>>;
sortable: {
type: (BooleanConstructor | StringConstructor)[];
default: boolean;
};
sortMethod: import("vue").PropType<(a: any, b: any) => number>;
sortBy: import("vue").PropType<string | string[] | ((row: any, index: number) => string)>;
resizable: {
type: BooleanConstructor;
default: boolean;
};
columnKey: StringConstructor;
align: StringConstructor;
headerAlign: StringConstructor;
showTooltipWhenOverflow: BooleanConstructor;
showOverflowTooltip: BooleanConstructor;
fixed: (BooleanConstructor | StringConstructor)[];
formatter: import("vue").PropType<(row: any, column: import("element-plus/es/components/table/src/table-column/defaults").TableColumnCtx<any>, cellValue: any, index: number) => string | import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
[key: string]: any;
}>>;
selectable: import("vue").PropType<(row: any, index: number) => boolean>;
reserveSelection: BooleanConstructor;
filterMethod: import("vue").PropType<import("element-plus/es/components/table/src/table-column/defaults").FilterMethods<any>>;
filteredValue: import("vue").PropType<string[]>;
filters: import("vue").PropType<import("element-plus/es/components/table/src/table-column/defaults").Filters>;
filterPlacement: StringConstructor;
filterMultiple: {
type: BooleanConstructor;
default: boolean;
};
index: import("vue").PropType<number | ((index: number) => number)>;
sortOrders: {
type: import("vue").PropType<("ascending" | "descending" | null)[]>;
default: () => (string | null)[];
validator: (val: ("ascending" | "descending" | null)[]) => boolean;
};
}>>, {
type: string;
width: string | number;
minWidth: string | number;
sortOrders: ("ascending" | "descending" | null)[];
sortable: string | boolean;
resizable: boolean;
showTooltipWhenOverflow: boolean;
showOverflowTooltip: boolean;
reserveSelection: boolean;
filterMultiple: boolean;
}>;
};
UmTableToolbar: import("vue").DefineComponent<{
data: IToolbar[];
events: TEvent[];
selection: any[];
otherParams: any;
searchParams: any;
}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, import("vue").EmitsOptions, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<{
data: IToolbar[];
events: TEvent[];
selection: any[];
otherParams: any;
searchParams: any;
}>, {
otherParams: any;
searchParams: any;
}>;
}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, Record<string, any>, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
style: {
type: null;
required: false;
};
width: {
type: (NumberConstructor | StringConstructor)[];
required: false;
default: string;
};
data: {
type: ArrayConstructor;
required: true;
};
toolbarOptions: {
type: ArrayConstructor;
required: false;
default: () => never[];
};
toolbarEvents: {
type: ArrayConstructor;
required: false;
default: () => never[];
};
otherParams: {
type: null;
required: false;
default: () => {};
};
searchParams: {
type: null;
required: false;
default: () => {};
};
rowKey: {
type: StringConstructor;
required: false;
default: string;
};
defaultExpandAll: {
type: BooleanConstructor;
required: false;
default: boolean;
};
treeProps: {
type: null;
required: false;
};
}>>, {
width: string | number;
otherParams: any;
searchParams: any;
toolbarOptions: unknown[];
toolbarEvents: unknown[];
rowKey: string;
defaultExpandAll: boolean;
}>;
export default _sfc_main;
+341
View File
@@ -0,0 +1,341 @@
import type { IOperateItem, TColumnRender, tFieldType } from "./types";
declare const _sfc_main: import("vue").DefineComponent<{
type: {
type: null;
required: false;
};
fieldType: {
type: null;
required: false;
default: string;
};
prop: {
type: StringConstructor;
required: false;
default: string;
};
label: {
type: StringConstructor;
required: false;
};
width: {
type: (NumberConstructor | StringConstructor)[];
required: false;
default: number;
};
minWidth: {
type: (NumberConstructor | StringConstructor)[];
required: false;
};
showOverflowTooltip: {
type: BooleanConstructor;
required: false;
};
operateItems: {
type: ArrayConstructor;
required: false;
default: () => never[];
};
expandTemplate: {
type: null;
required: false;
};
columnRender: {
type: null;
required: false;
};
dateFormat: {
type: StringConstructor;
required: false;
};
isShow: {
type: FunctionConstructor;
required: false;
};
}, {
props: any;
resolvedLabel: import("vue").ComputedRef<string | undefined>;
ElTableColumn: import("element-plus/es/utils").SFCWithInstall<import("vue").DefineComponent<{
type: {
type: StringConstructor;
default: string;
};
label: StringConstructor;
className: StringConstructor;
labelClassName: StringConstructor;
property: StringConstructor;
prop: StringConstructor;
width: {
type: (NumberConstructor | StringConstructor)[];
default: string;
};
minWidth: {
type: (NumberConstructor | StringConstructor)[];
default: string;
};
renderHeader: import("vue").PropType<(data: {
column: import("element-plus/es/components/table/src/table-column/defaults").TableColumnCtx<any>;
$index: number;
}) => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
[key: string]: any;
}>>;
sortable: {
type: (BooleanConstructor | StringConstructor)[];
default: boolean;
};
sortMethod: import("vue").PropType<(a: any, b: any) => number>;
sortBy: import("vue").PropType<string | string[] | ((row: any, index: number) => string)>;
resizable: {
type: BooleanConstructor;
default: boolean;
};
columnKey: StringConstructor;
align: StringConstructor;
headerAlign: StringConstructor;
showTooltipWhenOverflow: BooleanConstructor;
showOverflowTooltip: BooleanConstructor;
fixed: (BooleanConstructor | StringConstructor)[];
formatter: import("vue").PropType<(row: any, column: import("element-plus/es/components/table/src/table-column/defaults").TableColumnCtx<any>, cellValue: any, index: number) => string | import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
[key: string]: any;
}>>;
selectable: import("vue").PropType<(row: any, index: number) => boolean>;
reserveSelection: BooleanConstructor;
filterMethod: import("vue").PropType<import("element-plus/es/components/table/src/table-column/defaults").FilterMethods<any>>;
filteredValue: import("vue").PropType<string[]>;
filters: import("vue").PropType<import("element-plus/es/components/table/src/table-column/defaults").Filters>;
filterPlacement: StringConstructor;
filterMultiple: {
type: BooleanConstructor;
default: boolean;
};
index: import("vue").PropType<number | ((index: number) => number)>;
sortOrders: {
type: import("vue").PropType<("ascending" | "descending" | null)[]>;
default: () => (string | null)[];
validator: (val: ("ascending" | "descending" | null)[]) => boolean;
};
}, void, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, Record<string, any>, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
type: {
type: StringConstructor;
default: string;
};
label: StringConstructor;
className: StringConstructor;
labelClassName: StringConstructor;
property: StringConstructor;
prop: StringConstructor;
width: {
type: (NumberConstructor | StringConstructor)[];
default: string;
};
minWidth: {
type: (NumberConstructor | StringConstructor)[];
default: string;
};
renderHeader: import("vue").PropType<(data: {
column: import("element-plus/es/components/table/src/table-column/defaults").TableColumnCtx<any>;
$index: number;
}) => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
[key: string]: any;
}>>;
sortable: {
type: (BooleanConstructor | StringConstructor)[];
default: boolean;
};
sortMethod: import("vue").PropType<(a: any, b: any) => number>;
sortBy: import("vue").PropType<string | string[] | ((row: any, index: number) => string)>;
resizable: {
type: BooleanConstructor;
default: boolean;
};
columnKey: StringConstructor;
align: StringConstructor;
headerAlign: StringConstructor;
showTooltipWhenOverflow: BooleanConstructor;
showOverflowTooltip: BooleanConstructor;
fixed: (BooleanConstructor | StringConstructor)[];
formatter: import("vue").PropType<(row: any, column: import("element-plus/es/components/table/src/table-column/defaults").TableColumnCtx<any>, cellValue: any, index: number) => string | import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
[key: string]: any;
}>>;
selectable: import("vue").PropType<(row: any, index: number) => boolean>;
reserveSelection: BooleanConstructor;
filterMethod: import("vue").PropType<import("element-plus/es/components/table/src/table-column/defaults").FilterMethods<any>>;
filteredValue: import("vue").PropType<string[]>;
filters: import("vue").PropType<import("element-plus/es/components/table/src/table-column/defaults").Filters>;
filterPlacement: StringConstructor;
filterMultiple: {
type: BooleanConstructor;
default: boolean;
};
index: import("vue").PropType<number | ((index: number) => number)>;
sortOrders: {
type: import("vue").PropType<("ascending" | "descending" | null)[]>;
default: () => (string | null)[];
validator: (val: ("ascending" | "descending" | null)[]) => boolean;
};
}>>, {
type: string;
width: string | number;
minWidth: string | number;
sortOrders: ("ascending" | "descending" | null)[];
sortable: string | boolean;
resizable: boolean;
showTooltipWhenOverflow: boolean;
showOverflowTooltip: boolean;
reserveSelection: boolean;
filterMultiple: boolean;
}>>;
UmColumnRender: import("vue").DefineComponent<{
fieldType: {
type: import("vue").PropType<tFieldType>;
default: string;
};
data: {
type: import("vue").PropType<Record<string, any>>;
default: () => {};
};
prop: {
type: StringConstructor;
default: string;
};
render: {
type: import("vue").PropType<TColumnRender>;
default: undefined;
};
dateFormat: {
type: StringConstructor;
default: undefined;
};
isShow: {
type: import("vue").PropType<(data: any) => boolean | Promise<boolean>>;
default: undefined;
};
}, unknown, {
visible: boolean;
}, {}, {
refreshVisible(): Promise<void>;
}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, Record<string, any>, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
fieldType: {
type: import("vue").PropType<tFieldType>;
default: string;
};
data: {
type: import("vue").PropType<Record<string, any>>;
default: () => {};
};
prop: {
type: StringConstructor;
default: string;
};
render: {
type: import("vue").PropType<TColumnRender>;
default: undefined;
};
dateFormat: {
type: StringConstructor;
default: undefined;
};
isShow: {
type: import("vue").PropType<(data: any) => boolean | Promise<boolean>>;
default: undefined;
};
}>>, {
data: Record<string, any>;
fieldType: tFieldType;
prop: string;
dateFormat: string;
isShow: (data: any) => boolean | Promise<boolean>;
render: TColumnRender;
}>;
UmTableOperate: import("vue").DefineComponent<{
items: {
type: import("vue").PropType<IOperateItem[]>;
default: () => never[];
};
rowId: {
type: import("vue").PropType<string | number>;
default: string;
};
rowData: {
type: import("vue").PropType<any>;
default: () => {};
};
}, unknown, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, Record<string, any>, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
items: {
type: import("vue").PropType<IOperateItem[]>;
default: () => never[];
};
rowId: {
type: import("vue").PropType<string | number>;
default: string;
};
rowData: {
type: import("vue").PropType<any>;
default: () => {};
};
}>>, {
items: IOperateItem[];
rowId: string | number;
rowData: any;
}>;
}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, Record<string, any>, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
type: {
type: null;
required: false;
};
fieldType: {
type: null;
required: false;
default: string;
};
prop: {
type: StringConstructor;
required: false;
default: string;
};
label: {
type: StringConstructor;
required: false;
};
width: {
type: (NumberConstructor | StringConstructor)[];
required: false;
default: number;
};
minWidth: {
type: (NumberConstructor | StringConstructor)[];
required: false;
};
showOverflowTooltip: {
type: BooleanConstructor;
required: false;
};
operateItems: {
type: ArrayConstructor;
required: false;
default: () => never[];
};
expandTemplate: {
type: null;
required: false;
};
columnRender: {
type: null;
required: false;
};
dateFormat: {
type: StringConstructor;
required: false;
};
isShow: {
type: FunctionConstructor;
required: false;
};
}>>, {
width: string | number;
fieldType: any;
prop: string;
showOverflowTooltip: boolean;
operateItems: unknown[];
}>;
export default _sfc_main;
+58
View File
@@ -0,0 +1,58 @@
import type { PropType } from "vue";
declare const _sfc_main: import("vue").DefineComponent<{
modelValue: {
type: BooleanConstructor;
default: boolean;
};
title: {
type: StringConstructor;
default: string;
};
/** 弹窗内容,可以是 VNode、字符串或组件 */
content: {
type: PropType<any>;
default: null;
};
width: {
type: (NumberConstructor | StringConstructor)[];
default: number;
};
/** 是否显示默认的取消/确定 footer */
footer: {
type: BooleanConstructor;
default: boolean;
};
}, unknown, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("update:modelValue" | "ok")[], "update:modelValue" | "ok", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
modelValue: {
type: BooleanConstructor;
default: boolean;
};
title: {
type: StringConstructor;
default: string;
};
/** 弹窗内容,可以是 VNode、字符串或组件 */
content: {
type: PropType<any>;
default: null;
};
width: {
type: (NumberConstructor | StringConstructor)[];
default: number;
};
/** 是否显示默认的取消/确定 footer */
footer: {
type: BooleanConstructor;
default: boolean;
};
}>> & {
onOk?: ((...args: any[]) => any) | undefined;
"onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
}, {
footer: boolean;
title: string;
width: string | number;
modelValue: boolean;
content: any;
}>;
export default _sfc_main;
+99
View File
@@ -0,0 +1,99 @@
import type { IFormRule, IFieldMetaValue } from "./types";
declare const _sfc_main: import("vue").DefineComponent<{}, {
formModel: import("vue").Ref<{
[x: string]: any;
}>;
setFormModel: (models: any) => void;
}, {
rules: Record<string, any>;
formItems: any[];
fieldOption: Map<string, any>;
/** label 默认宽度 */
maxLabelWidth: number;
/** 当前需要显示的字段 */
showList: string[];
/** 级联关系:改 A 字段要刷新它的 cascadeFiled 列表 */
cascadeMap: Map<string, string[]>;
/** 表单刷新按 100ms 合并,避免连续输入时反复重建整个表单 */
throttleRefreshForm: import("lodash").DebouncedFunc<(this: any, v: any, oldV: any, needFreshCascadeField: string[]) => Promise<void>>;
}, {
formCom(): import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
[key: string]: any;
}> | null;
}, {
refreshForm(v: any, oldV: any, needFreshCascadeField: string[]): Promise<void | undefined>;
onSubmit(): Promise<void>;
/** 把 `IFormRule` 翻译成 element-plus 的 FormItemRule */
getRule(rule: IFormRule): {
required: boolean;
message: string | undefined;
pattern?: undefined;
min?: undefined;
max?: undefined;
validator?: undefined;
} | {
pattern: RegExp;
message: string;
required?: undefined;
min?: undefined;
max?: undefined;
validator?: undefined;
} | {
min: number | undefined;
max: number | undefined;
message: string;
required?: undefined;
pattern?: undefined;
validator?: undefined;
} | {
max: number | undefined;
message: string;
required?: undefined;
pattern?: undefined;
min?: undefined;
validator?: undefined;
} | {
min: number | undefined;
message: string;
required?: undefined;
pattern?: undefined;
max?: undefined;
validator?: undefined;
} | {
validator: any;
required?: undefined;
message?: undefined;
pattern?: undefined;
min?: undefined;
max?: undefined;
} | {
required?: undefined;
message?: undefined;
pattern?: undefined;
min?: undefined;
max?: undefined;
validator?: undefined;
} | undefined;
/** 取回字段的候选数据(下拉 / 树),并在需要时重置级联字段的值 */
updateFieldOption(fieldName: string, metaData: IFieldMetaValue, isBeforeMount?: boolean): Promise<void>;
/**
* 初始化需要显示的字段。
* 隐藏的字段会把当前值暂存到 `$ref:<field>` 并置空,重新显示时还原。
*/
initShowFieldList(v: any, oldV?: any): Promise<void>;
/** 刷新级联字段的候选数据 */
initCascadeData(needFreshCascadeField: string[]): Promise<void>;
/** 首次进入时把所有字段的候选数据取回来 */
initData(): Promise<void>;
initFormItem(): void;
/** 根据字段元数据计算校验规则、初始化表单值、并算出最宽的 label */
initRule(isBeforeMount?: boolean): void;
init(): Promise<void>;
/** 单字段赋值:整体替换对象,触发父层的 formModel watch */
initForm(fieldName: string, value: any): void;
}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("ok" | "cancel" | "formModelChange")[], "ok" | "cancel" | "formModelChange", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{}>> & {
onOk?: ((...args: any[]) => any) | undefined;
onCancel?: ((...args: any[]) => any) | undefined;
onFormModelChange?: ((...args: any[]) => any) | undefined;
}, {}>;
export default _sfc_main;
+34
View File
@@ -0,0 +1,34 @@
declare const _sfc_main: import("vue").DefineComponent<{
modelValue: {
type: StringConstructor;
required: true;
};
accept: {
type: StringConstructor;
required: false;
default: string;
};
}, {
props: any;
emit: (n: "update:modelValue", url: string) => void;
imageUrl: import("vue").Ref<string | undefined>;
handleAvatarSuccess: (res: any, file: any) => void;
beforeAvatarUpload: (file: any) => boolean;
onHttpRequest: (option: any) => Promise<void>;
Plus: any;
}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, "update:modelValue"[], "update:modelValue", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
modelValue: {
type: StringConstructor;
required: true;
};
accept: {
type: StringConstructor;
required: false;
default: string;
};
}>> & {
"onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
}, {
accept: string;
}>;
export default _sfc_main;
+40
View File
@@ -0,0 +1,40 @@
import type { PropType } from "vue";
import type { IOperateItem } from "./types";
declare const _sfc_main: import("vue").DefineComponent<{
/** 操作按钮描述 */
items: {
type: PropType<IOperateItem[]>;
default: () => never[];
};
/** 当前行的 id */
rowId: {
type: PropType<string | number>;
default: string;
};
/** 当前行的完整数据 */
rowData: {
type: PropType<any>;
default: () => {};
};
}, unknown, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, Record<string, any>, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
/** 操作按钮描述 */
items: {
type: PropType<IOperateItem[]>;
default: () => never[];
};
/** 当前行的 id */
rowId: {
type: PropType<string | number>;
default: string;
};
/** 当前行的完整数据 */
rowData: {
type: PropType<any>;
default: () => {};
};
}>>, {
items: IOperateItem[];
rowId: string | number;
rowData: any;
}>;
export default _sfc_main;
+18
View File
@@ -0,0 +1,18 @@
import type { IToolbar, TEvent } from "./types";
declare const _sfc_main: import("vue").DefineComponent<{
data: IToolbar[];
events: TEvent[];
selection: any[];
otherParams: any;
searchParams: any;
}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, import("vue").EmitsOptions, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<{
data: IToolbar[];
events: TEvent[];
selection: any[];
otherParams: any;
searchParams: any;
}>, {
otherParams: any;
searchParams: any;
}>;
export default _sfc_main;
+80
View File
@@ -0,0 +1,80 @@
import type { VNode } from "vue";
import type { IToolbar, TDecoratorKey, TEvent, TOperateType } from "../types";
import { type IEventTask, type TFireHook } from "./events";
/**
* 列 / 操作列 / 工具栏的装配逻辑。
*
* 改造前这段"扫描类元数据 -> 拼 h() 节点 -> 造事件闭包"的代码
* 全写在 UmByClass.vue 的 render() 里(200+ 行),
* 每次渲染都要重建一遍,且无法复用、无法单测。这里抽成纯函数。
*/
/** 收集数据列 VNode(按 sort 升序) */
export declare const collectDataColumns: (target: any) => VNode[];
/** 操作列分组:同一 id(缺省用 type)的多个方法会聚合到同一个按钮上 */
export interface IOperateGroup {
type: TOperateType;
sort: number;
title?: any;
isShow?: (rowData: any) => boolean;
tasks: IEventTask[];
}
/**
* 按 id(缺省用 type)聚合操作列配置。
*
* 说明:`@TableColumnMethodDecorator` 允许给多个方法配同一个 `type`,
* 分别声明 `es: "onBefore" / "onNow" / "onAfter"`,运行时串成一条链,
* 从而做到"先取详情 -> 再弹窗 -> 最后提交"。
*/
export declare const collectOperateGroups: (target: any) => IOperateGroup[];
/**
* 是否需要渲染操作列。
*
* 原判断:`(operates.length > 0 && !targetInstance.isShowOperate) || targetInstance?.isShowOperate?.()`
* - 存在操作按钮但 `isShowOperate()` 返回 false 时,因为 `!undefined` 为真仍会渲染出空操作列;
* - 没有操作按钮但 `isShowOperate()` 返回 true 时会渲染出一个空列。
* 这里改成明确的语义:有按钮 && (未配置 isShowOperate 或其为真)。
*/
export declare const resolveShowOperate: (target: any, hasOperate: boolean) => boolean;
/** 解析操作列宽度(支持实例属性与类静态属性两种写法) */
export declare const resolveOperateWidth: (target: any, fallback?: number | string) => number | string;
export interface IBuildOperateColumnOptions {
fire: TFireHook;
/** 透传给操作事件的行数据集合 */
tableData?: any[];
width?: number | string;
/** 需要延后执行 onAfter 的按钮类型,见 IDeferOptions */
deferAfterTypes?: string[];
}
/**
* 默认的"弹窗确认型"按钮类型。
*
* 这些按钮的 `onAfter` 会被摘出主事件链,由组件在弹窗给出结果后补跑。
* 单独抽成常量是为了让配置体检(`./diagnose`)和组件用同一份清单判断
* "这个按钮是不是应该有 onAfter" —— 两边各写一份字符串迟早会对不上。
*/
export declare const DEFAULT_DEFER_TYPES: string[];
/** 生成操作列 VNode;没有操作按钮时返回 null */
export declare const buildOperateColumn: (groups: IOperateGroup[], options: IBuildOperateColumnOptions) => VNode | null;
/** 工具栏收集结果 */
export interface IToolbarCollectResult {
toolbars: IToolbar[];
events: TEvent[];
}
/**
* 收集某个装饰器下、指定 `type` 的全部方法,按优先级降序返回。
*
* 用于"弹窗确定后补跑 onAfter"这类只需要部分阶段的场景:
* 同一个按钮的多个方法(不同 `es`)都要收进来,但只执行其中某几个阶段。
*/
export declare const collectTypedTasks: (target: any, decoratorKey: TDecoratorKey, type: string) => IEventTask[];
/**
* 收集工具栏按钮与对应事件。
*
* 关于 `rerunOnAfterFalsy`:原实现靠它实现"弹窗被取消 / 接口失败后重来一轮",
* 但事件链在 onAfter 返回假值时会用 `i -= 2` 回到第一阶段,若业务方法持续返回假值
* 就会把弹窗反复重开。改造后弹窗改为"挂起事件链、确认后再继续"(见 deferAfterTypes),
* 不再需要这个重跑机制,这里默认关闭,只在显式要求时启用。
*/
export declare const collectToolbar: (target: any, fire: TFireHook, options?: {
deferAfterTypes?: string[];
}) => IToolbarCollectResult;
+45
View File
@@ -0,0 +1,45 @@
/**
* 配置体检。
*
* 装饰器驱动这套写法的最大代价是"错误是静默的":字符串写错、装饰器挂错位置、
* 少写一个阶段,编译不报错、运行也不抛异常,只是功能没生效。使用方看到的现象
* 永远是"点了没反应",然后去找组件的 bug —— 而问题在他的配置类里。
*
* 这个模块把常见的配置失误在组件挂载时一次性报出来,让静默的失败变成一条
* 指得出位置的警告。它只读元数据、不改行为,报错也不阻断渲染。
*/
export type TDiagnosticLevel = "error" | "warn";
export interface IDiagnostic {
level: TDiagnosticLevel;
/** 规则名,便于单测断言与按需忽略 */
code: string;
/** 出问题的成员(属性名 / 方法名 / 按钮类型),用于定位 */
member?: string;
/** 一句话结论 */
message: string;
/** 具体怎么改 */
hint?: string;
}
export interface IDiagnoseOptions {
/**
* 需要"弹窗确认后才提交"的按钮类型,缺省用 `DEFAULT_DEFER_TYPES`。
* 传了就以传入的为准(组件会把自己的 `defer-after-types` 传进来)。
*/
deferAfterTypes?: string[];
/** 是否要求存在 `getList``UmByClassEnhance` 场景传 true */
requireGetList?: boolean;
}
/**
* 检查一个配置类,返回全部发现的问题(按 error -> warn、再按成员名排序)。
* 只读,不产生任何副作用。
*/
export declare const diagnoseTarget: (target: any, options?: IDiagnoseOptions) => IDiagnostic[];
export declare const setDiagnosticsEnabled: (enabled: boolean) => void;
export declare const isDiagnosticsEnabled: () => boolean;
export interface IReportOptions extends IDiagnoseOptions {
/** 本次是否上报(组件会把 `:diagnose="false"` 传进来) */
enabled?: boolean;
}
/** 把诊断结果打到控制台,并原样返回,便于使用方自行处理 */
export declare const reportDiagnostics: (target: any, options?: IReportOptions) => IDiagnostic[];
export declare const reportDiagnosticsOnce: (target: any, options?: IReportOptions) => IDiagnostic[];
+68
View File
@@ -0,0 +1,68 @@
import type { TExecutionSequence, TMethodMetaValue } from "../types";
/**
* 事件链执行器。
*
* 改造前"按 priority 排序 -> 按 es 分阶段 -> 依次 await"这套逻辑
* 在 UmByClass(操作列 / 工具栏)和 UmByClassEnhance(弹窗确认)里被复制了 3 份,
* 参数顺序、是否透传行数据、是否支持重跑都各不相同。这里统一。
*/
/** 一个待执行的事件 */
export interface IEventTask {
event: (...args: any[]) => any;
meta: TMethodMetaValue;
}
/** 阶段顺序 */
export declare const EVENT_PHASES: TExecutionSequence[];
/** 按优先级排序(数字越大越先执行),不修改入参数组 */
export declare const sortTasksByPriority: (tasks: IEventTask[]) => IEventTask[];
/**
* 阶段之间的钩子,把控制权交回业务组件(弹窗、消息提示等都挂在这里)。
* - `data`:当前累积的数据
* - `type`:按钮类型("添加" / "edit" / "del" / "批量删除" ...),业务侧据此分支
* - `phase`:当前阶段
* - `meta`:该阶段第一个事件的元数据
* @returns 处理后的数据,作为下一阶段的输入
*/
export type TFireHook = (data: any, type: string, phase: TExecutionSequence, meta?: TMethodMetaValue) => Promise<any> | any;
export interface IRunEventPipelineOptions {
tasks: IEventTask[];
/** 原始入参,恒作为每个事件的第一个参数 */
rowId: any;
/**
* "当前数据"(第二个参数,也是 fire 钩子拿到的 `data`)的初始值,
* 缺省等于 `rowId`。
*
* 操作列会把整行数据作为初始值传进来:行数据通常已经是完整的,
* 组件不应该强迫使用方再写一个 `es: "onBefore"` 的方法去查一遍详情,
* 否则一旦漏写,`edit` 拿到的就只有一个行 id,表单会静默变成空的。
*/
initial?: any;
/** 按钮类型,透传给 fire 钩子 */
type: string;
/** 阶段间的钩子 */
fire: TFireHook;
/** 透传给事件的额外参数(如整表数据) */
extra?: any[];
/**
* 只执行指定阶段(默认按 onBefore -> onNow -> onAfter 全跑)。
* 弹窗"确定"时只需要补跑 onAfter,用这个参数收窄。
*/
phases?: TExecutionSequence[];
/**
* onAfter 返回假值时是否回到第一阶段重跑。
* 原 UmByClass 工具栏分支用 `i -= 2` 实现,一旦事件始终返回假值会死循环卡死页面,
* 这里保留该行为但加上最大重跑次数保护。
*/
rerunOnAfterFalsy?: boolean;
maxRerun?: number;
}
/**
* 依次执行 onBefore -> onNow -> onAfter。
*
* 事件签名固定为 `(rowId, currentData, meta, ...extra)`
* - `rowId`:原始入参(行 id / 选中项),恒定不变;
* - `currentData`:上一个事件的返回值,同阶段多个事件形成"责任链";
* - `meta`:该事件的元数据;
* - `...extra`:组件透传的额外数据(如整表数据)。
*/
export declare function runEventPipeline(options: IRunEventPipelineOptions): Promise<any>;
+8
View File
@@ -0,0 +1,8 @@
/**
* UmTable 组件族的内核:类元数据读取 / 事件链执行 / 列装配 / 配置体检。
* 供有定制需求的使用方复用,无需重复实现反射扫描逻辑。
*/
export * from "./meta";
export * from "./events";
export * from "./columns";
export * from "./diagnose";
+73
View File
@@ -0,0 +1,73 @@
import type { TDecoratorKey } from "../types";
/**
* 类元数据访问层。
*
* 改造前,"实例化 target -> for...in 遍历 -> Reflect.getMetadata"
* 这套逻辑在 UmByClass / UmByClassEnhance / UmSearchForm / UmSearchFormEnhance /
* UmTableForm 里被复制了 8 次,每次细节还都略有出入(有的漏了 hasOwnProperty 判断,
* 有的用归一化名查、有的用原始名查),导致同一份配置在不同组件里表现不一致。
*
* 这里收口成唯一实现。
*/
/** 类实例上的一个成员 */
export interface IClassMember {
/** 类上的原始属性名(可能带 `_` 前缀) */
key: string;
/** 归一化名称:去掉 `_` 前缀,与后端字段名一致 */
fieldName: string;
/** 成员的值 */
value: any;
/** 是否为函数成员 */
isMethod: boolean;
}
/** 带元数据的成员 */
export type IDecoratedMember<M> = IClassMember & {
meta: M;
};
/** 去掉 `_` 前缀:`_foo` -> `foo` */
export declare const normalizeFieldName: (key: string) => string;
/**
* 构造实例,用于读取"实例字段"上的装饰器元数据。
* target 为空或不是构造函数时返回原值 / 空对象,避免抛错。
*/
export declare const createTargetInstance: (target: any) => any;
/**
* 收集类实例上的全部成员(含原型链上的方法)。
*
* 为什么要扫原型链:当 `useDefineForClassFields = false` 时,
* 无初始值的字段(如 `birthday: any;`)不会出现在实例上,
* 只靠 `for...in` 会漏掉这些字段对应的列。
*/
export declare const collectClassMembers: (target: any) => IClassMember[];
/**
* 读取某个成员上的装饰器元数据。
* 先按归一化名查,再按原始名查,兼容两种书写习惯。
*/
export declare const getMemberMeta: <M>(target: any, decoratorKey: TDecoratorKey, member: Pick<IClassMember, "key" | "fieldName">) => M | undefined;
/**
* 扫描出所有挂载了指定装饰器元数据的成员。
* @param options.methods 是否是方法成员(默认 false,即取普通字段)
*/
export declare const scanDecoratedMembers: <M>(target: any, decoratorKey: TDecoratorKey, options?: {
methods?: boolean;
}) => IDecoratedMember<M>[];
/**
* 在"接口原始数据"与"表单展示数据"之间做双向字段转换。
*
* 约定:类上用 `_field` 存原始值,再通过 getter/setter `field` 暴露格式化后的值
* (金额、日期、字典等)。原实现把这段转换在 UmByClassEnhance 里写了两遍
* (打开弹窗时一遍、提交时一遍),且两遍取的属性名还不一致(一处取 `field`、
* 一处取 `_field`),行为难以预期。这里统一为单一实现:
* - `in` :接口原始值 -> 表单展示值(走 getter
* - `out`:表单展示值 -> 接口原始值(走 `_field`
*
* @returns 转换后的同一份 data(便于链式调用)
*/
export declare const transformFields: (target: any, data: any, direction: "in" | "out") => any;
/**
* 按类型取出某个方法元数据(早退版本,避免每次全量扫描后才 return)
*/
export declare const findMethodMeta: (target: any, decoratorKey: TDecoratorKey, type: string) => {
meta: any;
member: IDecoratedMember<any>;
} | null;
+31
View File
@@ -0,0 +1,31 @@
import type { IFieldMetaValue, IMethodMetaValue, TDecoratorKey } from "./types";
/**
* UmTable 装饰器集合。
*
* 与改造前的差异:
* 1. 类型改为从 `./types` 导入(原来从 `./UmTable` 导入,指向一个不存在的模块);
* 2. 装饰器改为"柯里化后先冻结默认值再返回"的写法,避免同一个 meta 对象被多次
* 装饰器调用共享时被反复改写(原实现对入参做 `value.width = 100` 的原地修改);
* 3. `TableColumnMethodDecorator` 只在未显式传入时补默认值,语义不变。
*/
/**
* 数据列属性装饰器
*/
export declare const TableColumnPropertyDecorator: (value: IFieldMetaValue) => (target: any, propertyKey: string) => void;
/**
* 属性装饰器(增删改查表单)
*/
export declare const TableFormColumnPropertyDecorator: (value: IFieldMetaValue) => (target: any, propertyKey: string) => void;
/**
* 属性装饰器(查询表单)
*/
export declare const TableSearchFormPropertyDecorator: (value: IFieldMetaValue) => (target: any, propertyKey: string) => void;
/**
* 方法装饰器(操作列 / 工具栏 / 查询方法)
*/
export declare const TableColumnMethodDecorator: ({ key, value, }: {
key?: TDecoratorKey | undefined;
value: IMethodMetaValue;
}) => (target: any, propertyKey: string) => void;
export * from "./types";
export * from "./core";
+179
View File
@@ -0,0 +1,179 @@
import type { Component, VNode } from "vue";
/**
* UmTable 组件族的全部类型定义(唯一来源)。
*
* 改造前这些类型分散在两个文件里:
* - `src/types/UmTable.d.ts`
* - `src/components/UmTable/UmTable.d.ts`
* 两者内容 90% 重复,而且都是"带 import 的模块文件 + 未 export 的 declare"
* 结果是 `import { TFieldMetaValue } from "./UmTable"` 这类写法在类型层面解析不到,
* 打包后 dist 里的 `UmTable/index.d.ts` 引用了一个不存在的模块 —— 对外类型是坏的。
*
* 现在统一到这里,全部显式 export。
*/
/** 数据列类型 */
export type TColumnType = "selection" | "index" | "expand" | "operate";
/** 兼容历史命名 */
export type columnType = TColumnType;
/** 操作列按钮类型 */
export type TOperateType = "edit" | "del" | "copy" | "customOperateEvent";
/**
* 字段(单元格 / 表单控件)数据类型
*/
export type tFieldType = "date" | "default" | "upload" | "primaryKey" | "treeSelect" | "areaTreeSelect" | "select" | "switch" | "boolean" | "img" | "pickerMapGps" | "pickerMapGpsRange" | "ip" | "port" | "string" | "textarea" | "input" | "password" | "custom" | "number" | "dateRange";
/** 工具栏按钮类型 */
export type TToolbar = "添加" | "导入模板" | "导入" | "导出" | "批量删除" | "自定义";
/** 查询方法类型 */
export type TSearch = "getList";
/**
* 事件执行顺序
*/
export type TExecutionSequence = "onBefore" | "onNow" | "onAfter";
/** 校验规则类型 */
export type TFormRuleType = "require" | "requireString" | "idNumber" | "phone" | "regexp" | "ip" | "port" | "len" | "validator";
/** 查询表单可用的控件类型 */
export type TFormComponent = "date-picker" | "input" | "textarea" | "dateTime-picker" | "color-picker" | "cascader" | "checkbox" | "input-number" | "radio" | "rate" | "select" | "slider" | "switch" | "time-picker" | "time-select";
/** 装饰器元数据 key */
export type TDecoratorKey = "table:field" | "table:operate" | "table:toolbar" | "table:VNode" | "table:formField" | "table:searchFormField" | "table:searchFormMethod";
/** 可能返回 Promise 的值 */
export type MaybePromise<T> = T | Promise<T>;
/** 工具栏按钮配置 */
export interface IToolbar {
/** 工具按钮类型 */
type: TToolbar;
/** 工具按钮图示 */
icon?: string | VNode;
/** 功能按钮自定义名称 */
title?: string;
}
/** 事件回调(工具栏 / 操作列) */
export type TEvent = (selection?: any[]) => void;
/** 表单校验规则 */
export interface IFormRule {
type?: TFormRuleType;
message?: string;
pattern?: RegExp;
max?: number;
min?: number;
validator?: any;
}
/**
* 单元格自定义渲染函数
* @param value 列的值
* @param fieldName 列的字段名
* @param rowData 列所在行的数据
*/
export type TColumnRender = (value: any, fieldName: string, rowData: any) => any;
/**
* 字段元数据(`@TableColumnPropertyDecorator` / `@TableFormColumnPropertyDecorator`
* / `@TableSearchFormPropertyDecorator` 的入参)
*/
export interface IFieldMetaValue {
lang?: string;
/** 字段中文名(列头 / 表单 label) */
def: string;
fieldType?: tFieldType;
/** 表单校验规则 */
rule?: IFormRule | IFormRule[];
/** 字段名称(查询表单场景下用于覆盖属性名) */
fieldName?: string;
width?: number;
minWidth?: number;
/** 用于初始化组件数据(级联数据的来源) */
getData?: (currentData?: any) => MaybePromise<any>;
/** 查询表单中所需要的组件类型 */
$um_component?: TFormComponent;
/** 页面中对相同类型字段的区分标志 */
$um_index?: number;
/** 自定义表单组件 */
component?: Component | any;
style?: any;
/** 列排序,数字越小越靠前 */
sort?: number;
/** 数据列自定义渲染函数 */
columnRender?: TColumnRender;
/** 输入字符最长长度 */
maxlength?: number;
/** 输入字符最短长度 */
minlength?: number;
/** 占位字符 */
placeholder?: string;
/** 当内容过长被隐藏时显示 tooltip */
showOverflowTooltip?: boolean;
/**
* 日期格式化模板,仅 `fieldType: "date"` 生效。
* 不传时保持历史行为(YYYY-MM-DD HH:mm:ss)。
*/
dateFormat?: string;
/** 禁用状态 */
disabled?: boolean;
/** 判断是否需要禁用 */
isDisabled?: (rowData: any) => boolean;
/** 是否显示该字段(支持异步) */
isShow?: (data: any) => MaybePromise<boolean>;
/** 是否为级联字段 */
isCascade?: boolean;
/** 联动触发的关联字段 */
cascadeFiled?: string[];
}
/** 兼容历史命名 */
export type TFieldMetaValue = IFieldMetaValue;
/**
* 方法元数据(`@TableColumnMethodDecorator` 的入参)
*/
export interface IMethodMetaValue {
/** 唯一标识,用于把多个方法聚合到同一个操作按钮上 */
id?: any;
/** 按钮 / 事件类型 */
type: TOperateType | TToolbar | TSearch;
/** 执行阶段,默认 onNow */
es?: TExecutionSequence;
/** 同一阶段内的执行优先级,数字越大越先执行,默认 1 */
priority?: number;
icon?: string | VNode;
dialogContent?: VNode | string | any;
dialogTitle?: VNode | string | any;
dialogWidth?: number;
/** 弹窗表单使用的类(默认复用表格的 target) */
dialogTarget?: any;
title?: string;
/**
* 按钮排序(数字越小越靠前)。
* 改造前声明为必填 `sort: number`,但实际用法几乎都不传,
* 类型与实际不符,这里改为可选。
*/
sort?: number;
/** 控制操作栏 / 工具栏按钮是否显示(不支持异步) */
isShow?: (rowData: any) => boolean;
/** 获取依赖数据 */
getData?: () => MaybePromise<any>;
}
/** 兼容历史命名 */
export type TMethodMetaValue = IMethodMetaValue;
/**
* 单个操作按钮的运行时描述(供 UmTableOperate 渲染)
*
* 改造前 UmTableOperate 接收 4 个靠下标对齐的并行数组
* data / titles / renders / events),再靠 mapIndex 反查,
* 任一处顺序错位就会串按钮。这里改成一个自描述的对象数组。
*/
export interface IOperateItem {
/** 按钮类型 */
type: TOperateType;
/** 按钮文案(自定义按钮必填) */
title?: any;
/** 是否显示该按钮 */
isShow?: (rowData: any) => boolean;
/**
* 点击回调。
* 第二个参数是当前行的完整数据 —— 事件链会把它作为"当前数据"的初始值,
* 这样"编辑"按钮即使没有声明 `es: "onBefore"` 的取详情方法,
* 弹窗表单也能直接用行数据回填。
*/
onClick: (rowId: string | number, rowData?: any) => void;
}
/** 数据列描述 */
export interface IDataColumn {
sort: number;
vnode: VNode;
}