urit-qf-ui 0.2.7 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +88 -22
- package/dist/components/UBaseInfo.vue.d.ts +22 -0
- package/dist/components/UCascader.vue.d.ts +22 -37
- package/dist/components/UDialog.vue.d.ts +94 -0
- package/dist/components/UForm.vue.d.ts +233 -0
- package/dist/components/UMenu.vue.d.ts +230 -11
- package/dist/components/UResults.vue.d.ts +23 -0
- package/dist/components/USearch.vue.d.ts +51 -0
- package/dist/components/UTable.vue.d.ts +54 -0
- package/dist/components/UTablePage.vue.d.ts +152 -0
- package/dist/index.d.ts +33 -18
- package/dist/index.js +2962 -3147
- package/dist/index.umd.cjs +1 -2
- package/dist/layout/UGrid.vue.d.ts +44 -0
- package/dist/model/base-info.d.ts +113 -0
- package/dist/model/cascader.d.ts +135 -0
- package/dist/model/form.d.ts +143 -0
- package/dist/model/grid.d.ts +53 -0
- package/dist/model/menu.d.ts +140 -0
- package/dist/model/results.d.ts +90 -0
- package/dist/model/search.d.ts +93 -0
- package/dist/model/table-page.d.ts +44 -0
- package/dist/model/table.d.ts +163 -0
- package/dist/parser/cascader.d.ts +35 -0
- package/dist/parser/form.d.ts +7 -0
- package/dist/parser/menu.d.ts +5 -0
- package/dist/parser/table-page.d.ts +15 -0
- package/dist/parser/yaml-parser.d.ts +41 -0
- package/dist/qf/interface.d.ts +22 -0
- package/dist/qf/qf.d.ts +23 -1
- package/dist/style.css +1 -1
- package/dist/utils/base-info.d.ts +39 -0
- package/dist/utils/cascader.d.ts +45 -0
- package/dist/utils/form.d.ts +59 -0
- package/dist/utils/menu.d.ts +14 -0
- package/dist/utils/results.d.ts +38 -0
- package/dist/utils/search.d.ts +8 -0
- package/dist/utils/table.d.ts +16 -0
- package/package.json +1 -1
- package/dist/components/UDate.vue.d.ts +0 -47
- package/dist/components/UDict.vue.d.ts +0 -49
- package/dist/components/UInput.vue.d.ts +0 -52
- package/dist/components/UInputNumber.vue.d.ts +0 -52
- package/dist/components/UToggle.vue.d.ts +0 -54
- package/dist/show/UCascaderShow.vue.d.ts +0 -11
- package/dist/show/UDateShow.vue.d.ts +0 -15
- package/dist/show/UDictShow.vue.d.ts +0 -9
- package/dist/show/UFieldView.vue.d.ts +0 -24
- package/dist/show/UInputShow.vue.d.ts +0 -10
- package/dist/show/UToggleShow.vue.d.ts +0 -12
- package/dist/ts/constant.d.ts +0 -24
- package/dist/ts/dict.d.ts +0 -105
- package/dist/ts/form-render.d.ts +0 -30
- package/dist/ts/http.d.ts +0 -13
- package/dist/ts/model.d.ts +0 -202
- package/dist/ts/notify.d.ts +0 -42
- package/dist/ts/table-data-service.d.ts +0 -30
- package/dist/ts/table-render.d.ts +0 -210
- package/dist/uform/FormContainer.vue.d.ts +0 -37
- package/dist/uform/FormField.vue.d.ts +0 -16
- package/dist/uform/FormGrid.vue.d.ts +0 -24
- package/dist/uform/FormRender.vue.d.ts +0 -104
- package/dist/uform/TableDetail.vue.d.ts +0 -37
- package/dist/uform/TableGrid.vue.d.ts +0 -51
- package/dist/uform/TablePagination.vue.d.ts +0 -14
- package/dist/uform/TableRender.vue.d.ts +0 -618
- package/dist/uform/TableSearch.vue.d.ts +0 -38
- package/dist/uform/TableToolbar.vue.d.ts +0 -31
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UCascader —— 多级级联选择的数据结构定义(model 层)
|
|
3
|
+
*
|
|
4
|
+
* 本层只定义**数据结构**,不放任何逻辑:
|
|
5
|
+
* - 渲染期逻辑(层级骨架 / 选项推导 / 清理更深字段)在 ../utils/cascader.ts;
|
|
6
|
+
* - 后端 yaml → 本层结构的转换在 ../parser/cascader.ts。
|
|
7
|
+
*
|
|
8
|
+
* 定位:**多个 el-select 组合**出来的级联选择(不是 el-cascader)。
|
|
9
|
+
* - 树有几层就渲染几个 select,**默认全部显示**(不是选了第一级才冒出第二级);
|
|
10
|
+
* - 每一级各自带标签,标签来自节点上的 fieldLabel;
|
|
11
|
+
* - 上一级改选 → 下面各级的**值清空、选项换成新分支**
|
|
12
|
+
* (选了广西就只会出现桂林/柳州,不会混进湖南的城市)。
|
|
13
|
+
*
|
|
14
|
+
* 为什么不用 el-cascader:业务上每一级都是一个**独立的查询字段 / 表单字段**
|
|
15
|
+
* (province / city / county 各自入库、各自拼查询串),一个数组值表达不了。
|
|
16
|
+
*
|
|
17
|
+
* 节点上的字段含义(都是描述「下一级」的,不是自己的):
|
|
18
|
+
* node.field —— **下一级**的字段名
|
|
19
|
+
* node.fieldLabel —— **下一级**的标签文字(不写则退回用下一级的 field)
|
|
20
|
+
* 第 1 级的字段 / 标签来自配置的 field / fieldLabel / label。
|
|
21
|
+
*
|
|
22
|
+
* 例:
|
|
23
|
+
* {
|
|
24
|
+
* field: 'province', fieldLabel: '省份', options: [
|
|
25
|
+
* {label: '广西', value: 'gx', field: 'city', fieldLabel: '地级市', children: [
|
|
26
|
+
* {label: '桂林', value: 'gl', field: 'county', fieldLabel: '县城', children: [
|
|
27
|
+
* {label: '兴安', value: 'xingan'},
|
|
28
|
+
* ]},
|
|
29
|
+
* {label: '柳州', value: 'lz'},
|
|
30
|
+
* ]},
|
|
31
|
+
* {label: '湖南', value: 'hn'},
|
|
32
|
+
* ],
|
|
33
|
+
* }
|
|
34
|
+
* → 渲染 3 个 select:省份 / 地级市 / 县城(即使一级都没选也都画出来),
|
|
35
|
+
* 所以一项级联会往 model 里写**多个 key**:{province, city, county}。
|
|
36
|
+
*/
|
|
37
|
+
/** 级联选项节点(树形;带 children 即构成下一级) */
|
|
38
|
+
export interface CascaderOption {
|
|
39
|
+
/** 显示文字 */
|
|
40
|
+
label: string;
|
|
41
|
+
/** 实际值 */
|
|
42
|
+
value: any;
|
|
43
|
+
/**
|
|
44
|
+
* **下一级**的字段名。
|
|
45
|
+
* 例:{label: '广西', value: 'gx', field: 'city', children: [...]}
|
|
46
|
+
* → 选中广西后,下一级(桂林 / 柳州)的值写进 model.city
|
|
47
|
+
*/
|
|
48
|
+
field?: string;
|
|
49
|
+
/** **下一级**的标签文字(例:'地级市')。不写则退回用下一级的 field 当标签。 */
|
|
50
|
+
fieldLabel?: string;
|
|
51
|
+
/** 子级选项;有 children 的节点下方会多一个 el-select(层级总数 = 树的最大深度) */
|
|
52
|
+
children?: CascaderOption[];
|
|
53
|
+
/** 是否禁用该项 */
|
|
54
|
+
disabled?: boolean;
|
|
55
|
+
/** 其它透传给 el-option 的字段原样保留 */
|
|
56
|
+
[key: string]: any;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 「级联数据源」——只要能表达「第 1 级叫什么 + 一棵选项树」就够。
|
|
60
|
+
* USearch 的 SearchItem 结构上就满足它,所以能直接喂给 utils/cascader.ts 的工具函数。
|
|
61
|
+
*/
|
|
62
|
+
export interface CascaderSource {
|
|
63
|
+
/** 第 1 级的字段名(支持点路径,如 'info.province') */
|
|
64
|
+
field: string;
|
|
65
|
+
/** 第 1 级的标签文字(fieldLabel 优先) */
|
|
66
|
+
label?: string;
|
|
67
|
+
/** 第 1 级的标签文字(与节点上的 fieldLabel 同位写法) */
|
|
68
|
+
fieldLabel?: string;
|
|
69
|
+
/** 选项树 */
|
|
70
|
+
options?: CascaderOption[];
|
|
71
|
+
/** 其它字段原样保留 */
|
|
72
|
+
[key: string]: any;
|
|
73
|
+
}
|
|
74
|
+
/** UCascader 配置:数据源 + 外观 */
|
|
75
|
+
export interface CascaderOptions extends CascaderSource {
|
|
76
|
+
/** 标签位置:left 左边 | top 上面,默认 'left' */
|
|
77
|
+
labelPosition?: 'left' | 'top';
|
|
78
|
+
/** 标签宽度(labelPosition 为 left 时生效),数字按 px,默认 80 */
|
|
79
|
+
labelWidth?: number | string;
|
|
80
|
+
/** 标签对齐(labelPosition 为 left 时生效),默认 'right';top 时恒为左对齐 */
|
|
81
|
+
labelAlign?: 'left' | 'center' | 'right';
|
|
82
|
+
/** 是否显示标签,默认 true */
|
|
83
|
+
showLabel?: boolean;
|
|
84
|
+
/** 各级之间的间距(px),默认 8 */
|
|
85
|
+
gutter?: number;
|
|
86
|
+
/** 透传给每一级 el-select 的属性(filterable / clearable / size …) */
|
|
87
|
+
props?: Record<string, any>;
|
|
88
|
+
/** 第 1 级的占位提示 */
|
|
89
|
+
placeholder?: string;
|
|
90
|
+
/** 第 2 级及以后的占位提示,默认 '请选择' */
|
|
91
|
+
subPlaceholder?: string;
|
|
92
|
+
/** 是否禁用整组 */
|
|
93
|
+
disabled?: boolean;
|
|
94
|
+
}
|
|
95
|
+
/** 级联实际渲染出来的一级 */
|
|
96
|
+
export interface CascaderLevel {
|
|
97
|
+
/** 该级的字段名 */
|
|
98
|
+
field: string;
|
|
99
|
+
/** 该级的标签文字 */
|
|
100
|
+
label: string;
|
|
101
|
+
/** 该级的选项(上级没选 / 该分支没有下级时是空数组,但这一级照样渲染) */
|
|
102
|
+
options: CascaderOption[];
|
|
103
|
+
/** 该级当前选中的值 */
|
|
104
|
+
value: any;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 「某一级」的描述 —— 级联**只声明了层级、选项树在字典里**时用
|
|
108
|
+
* (yaml 用 children 链写法的:每级只写 field / fieldLabel,整棵树来自一个 dictType)。
|
|
109
|
+
*
|
|
110
|
+
* 解析层算出每级叫什么后带在 `SearchItem.cascaderLevels` 上;
|
|
111
|
+
* 使用方取到字典树后调 `new CascaderParser().stampLevels(树, levels)` 把每级的字段名打上去。
|
|
112
|
+
*/
|
|
113
|
+
export interface CascaderLevelMeta {
|
|
114
|
+
/** 该级的字段名 */
|
|
115
|
+
field: string;
|
|
116
|
+
/** 该级的标签文字 */
|
|
117
|
+
label: string;
|
|
118
|
+
/** 该级的选项从哪个字典类型取(children 链写法才有) */
|
|
119
|
+
dictType?: string;
|
|
120
|
+
/** 该级自己的 el-select 透传属性 */
|
|
121
|
+
props?: Record<string, any>;
|
|
122
|
+
}
|
|
123
|
+
/** 级联变化事件的载荷 */
|
|
124
|
+
export interface CascaderChangePayload {
|
|
125
|
+
/** 第几级(从 0 开始) */
|
|
126
|
+
level: number;
|
|
127
|
+
/** 该级的字段名 */
|
|
128
|
+
field: string;
|
|
129
|
+
/** 该级新选中的值 */
|
|
130
|
+
value: any;
|
|
131
|
+
/** 写回后的完整模型对象 */
|
|
132
|
+
model: Record<string, any>;
|
|
133
|
+
/** 当前各级快照 */
|
|
134
|
+
levels: CascaderLevel[];
|
|
135
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { FormItemRule } from 'element-plus';
|
|
2
|
+
/**
|
|
3
|
+
* 控件类型:直接写 Element Plus 的组件名。
|
|
4
|
+
* 支持 EP 常用表单控件,也允许写任意自定义组件名(会原样交给 <component :is> 解析)。
|
|
5
|
+
*/
|
|
6
|
+
export type FormControlType = 'el-input' | 'el-input-number' | 'el-select' | 'el-radio-group' | 'el-checkbox-group' | 'el-switch' | 'el-slider' | 'el-rate' | 'el-color-picker' | 'el-date-picker' | 'el-time-picker' | 'el-time-select' | 'el-cascader' | 'el-tree-select' | 'el-autocomplete' | 'el-segmented' | (string & {});
|
|
7
|
+
/** 选项数据(el-select / el-radio-group / el-checkbox-group / el-cascader 用) */
|
|
8
|
+
export interface FormFieldOption {
|
|
9
|
+
/** 显示文字 */
|
|
10
|
+
label: string;
|
|
11
|
+
/** 实际值 */
|
|
12
|
+
value: any;
|
|
13
|
+
/** 是否禁用该项 */
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
/** 子选项(级联 / 树形选择用) */
|
|
16
|
+
children?: FormFieldOption[];
|
|
17
|
+
/** 其它透传给选项组件的属性 */
|
|
18
|
+
[key: string]: any;
|
|
19
|
+
}
|
|
20
|
+
/** 单个字段配置 */
|
|
21
|
+
export interface FormFieldConfig {
|
|
22
|
+
/**
|
|
23
|
+
* 字段名,对应表单数据里的 key。
|
|
24
|
+
* 支持点路径(如 'info.remark'),会直接用作 el-form-item 的 prop 参与校验。
|
|
25
|
+
*/
|
|
26
|
+
field: string;
|
|
27
|
+
/** 控件类型(EP 组件名),默认 'el-input' */
|
|
28
|
+
type?: FormControlType;
|
|
29
|
+
/** 标签文字 */
|
|
30
|
+
label?: string;
|
|
31
|
+
/**
|
|
32
|
+
* 透传给控件的属性(如 placeholder / clearable / multiple / rows / show-password / filterable …)。
|
|
33
|
+
* EP 有什么属性就写什么,库不做二次封装。
|
|
34
|
+
*/
|
|
35
|
+
props?: Record<string, any>;
|
|
36
|
+
/** 选项数据(el-select / el-radio-group / el-checkbox-group / el-cascader 用) */
|
|
37
|
+
options?: FormFieldOption[];
|
|
38
|
+
/** 校验规则,直接吃 async-validator 格式(EP 原生) */
|
|
39
|
+
rules?: FormItemRule[];
|
|
40
|
+
/**
|
|
41
|
+
* 是否必填。等价于往 rules 里补一条 {required: true, ...},
|
|
42
|
+
* trigger 会根据控件类型自动选 blur / change(见 ../utils/form.ts 的 getValidateTrigger)。
|
|
43
|
+
*/
|
|
44
|
+
required?: boolean;
|
|
45
|
+
/** 栅格占宽(24 栅格制)。不传则按表单的 columns 均分 */
|
|
46
|
+
colSpan?: number;
|
|
47
|
+
/** 是否禁用该字段(会与表单一级的 disabled 取或) */
|
|
48
|
+
disabled?: boolean;
|
|
49
|
+
/** 字段下方的灰色说明文字 */
|
|
50
|
+
tip?: string;
|
|
51
|
+
/** 是否隐藏该字段(隐藏后不渲染,但仍参与数据) */
|
|
52
|
+
hidden?: boolean;
|
|
53
|
+
/** el-form-item 的其它属性(如 labelWidth / required / showMessage / error …) */
|
|
54
|
+
itemProps?: Record<string, any>;
|
|
55
|
+
/** 默认值。仅用于 utils/form.ts 的 getDefaultModel() 生成初始数据,组件本身不注入 */
|
|
56
|
+
default?: any;
|
|
57
|
+
}
|
|
58
|
+
/** UForm 表单级配置 */
|
|
59
|
+
export interface FormOptions {
|
|
60
|
+
/** 字段列表 */
|
|
61
|
+
fields: FormFieldConfig[];
|
|
62
|
+
/** 每行几列(1~4),底层用 el-row / el-col 的 24 栅格等分,默认 1 */
|
|
63
|
+
columns?: number;
|
|
64
|
+
/** 栅格间距(px),默认 0 */
|
|
65
|
+
gutter?: number;
|
|
66
|
+
/** 标签宽度(直接给 el-form 的 label-width) */
|
|
67
|
+
labelWidth?: string | number;
|
|
68
|
+
/** 标签位置,默认 'right'(EP 默认值) */
|
|
69
|
+
labelPosition?: 'left' | 'right' | 'top';
|
|
70
|
+
/** 标签后缀,默认 ':' */
|
|
71
|
+
labelSuffix?: string;
|
|
72
|
+
/** 是否隐藏必填星号 */
|
|
73
|
+
hideRequiredAsterisk?: boolean;
|
|
74
|
+
/** 表单项尺寸 */
|
|
75
|
+
size?: 'large' | 'default' | 'small';
|
|
76
|
+
/** 是否禁用整个表单 */
|
|
77
|
+
disabled?: boolean;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 表单接口地址(yaml 的 api 段原样带出)。
|
|
81
|
+
*
|
|
82
|
+
* UForm 自己**永远不碰**这几个地址 —— 它们由 <UTablePage> 或使用方消费:
|
|
83
|
+
* get 回显单条(拼 `?<key>=<行id>`)
|
|
84
|
+
* add 新增(POST 整个表单数据)
|
|
85
|
+
* edit 编辑(POST 整个表单数据,主键在数据里)
|
|
86
|
+
*/
|
|
87
|
+
export interface FormApi {
|
|
88
|
+
/** 回显单条:GET,组件会拼 `?<key>=<value>` */
|
|
89
|
+
get?: string;
|
|
90
|
+
/** 新增提交地址(POST) */
|
|
91
|
+
add?: string;
|
|
92
|
+
/** 编辑提交地址(POST) */
|
|
93
|
+
edit?: string;
|
|
94
|
+
/** 其它自定义接口地址原样保留 */
|
|
95
|
+
[key: string]: any;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 表单的页面级布局(yaml 的 layout 段原样带出)。
|
|
99
|
+
* UForm 不消费它(表单组件只认 FormOptions 里的 columns / labelPosition),
|
|
100
|
+
* 由打开表单的那一方决定怎么用 —— 比如 UTablePage 用 width 当弹窗宽度。
|
|
101
|
+
*/
|
|
102
|
+
export interface FormLayout {
|
|
103
|
+
/** 打开方式:dialog 弹窗(默认)| page 整页 | drawer 抽屉 */
|
|
104
|
+
open?: 'dialog' | 'page' | 'drawer' | (string & {});
|
|
105
|
+
/** 弹窗 / 抽屉宽度(数字按 px) */
|
|
106
|
+
width?: number | string;
|
|
107
|
+
/** 每行几列(与 FormOptions.columns 同义,解析时已并进去,这里保留原始值) */
|
|
108
|
+
columns?: number;
|
|
109
|
+
/** 标签位置 */
|
|
110
|
+
labelPosition?: 'left' | 'right' | 'top';
|
|
111
|
+
/** 按钮对齐 */
|
|
112
|
+
buttonAlign?: 'left' | 'center' | 'right';
|
|
113
|
+
/** 其它自定义键原样保留 */
|
|
114
|
+
[key: string]: any;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* 表单配置(`GetFormConfig(id)` 的返回值)。
|
|
118
|
+
*
|
|
119
|
+
* FormConfig = {formOptions, api?, layout?, meta?}
|
|
120
|
+
* ├─ formOptions → 直接喂 <UForm :options>
|
|
121
|
+
* └─ api / layout / meta → 页面级配置,组件不吃,打开表单的那一方消费
|
|
122
|
+
*/
|
|
123
|
+
export interface FormConfig {
|
|
124
|
+
/** 表单组件配置,直接喂 <UForm :options> */
|
|
125
|
+
formOptions: FormOptions;
|
|
126
|
+
/** 接口地址(yaml 的 `api` 段):get / add / edit */
|
|
127
|
+
api?: FormApi;
|
|
128
|
+
/** 页面级布局(yaml 的 `layout` 段):open / width / buttonAlign … */
|
|
129
|
+
layout?: FormLayout;
|
|
130
|
+
/** 后端 yaml 的 meta 段原样带出(formId / title / version) */
|
|
131
|
+
meta?: Record<string, any>;
|
|
132
|
+
}
|
|
133
|
+
/** 字段插槽的作用域参数 */
|
|
134
|
+
export interface FormFieldSlotProps {
|
|
135
|
+
/** 当前字段的配置 */
|
|
136
|
+
field: FormFieldConfig;
|
|
137
|
+
/** 当前字段的值 */
|
|
138
|
+
value: any;
|
|
139
|
+
/** 整个表单数据 */
|
|
140
|
+
model: Record<string, any>;
|
|
141
|
+
/** 把值写回表单(等价于控件自己的 v-model 行为) */
|
|
142
|
+
setValue: (value: any) => void;
|
|
143
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export type GridDirection = 'row' | 'column';
|
|
2
|
+
export interface GridOptions {
|
|
3
|
+
/**
|
|
4
|
+
* 容器宽度。数字按 px 处理,字符串原样使用(如 '80%' / '600px' / 'calc(100% - 24px)')。
|
|
5
|
+
* 不传则撑满父容器(100%)。
|
|
6
|
+
*/
|
|
7
|
+
width?: number | string;
|
|
8
|
+
/**
|
|
9
|
+
* 容器高度。数字按 px 处理,字符串原样使用。
|
|
10
|
+
* 不传则撑满父容器(100%)。
|
|
11
|
+
*/
|
|
12
|
+
height?: number | string;
|
|
13
|
+
/**
|
|
14
|
+
* 列数(1~12)。卡片宽度 = 12 / columns 份,即用 quasar 的 .col-<12/columns> 等分整行。
|
|
15
|
+
* 只在 direction === 'row' 时作为「列」,direction === 'column' 时作为「行」。
|
|
16
|
+
* 不传或超出 1~12(且不能整除 12)时,退化为 .col(每张卡片等分、自动换行)。
|
|
17
|
+
*/
|
|
18
|
+
columns?: number;
|
|
19
|
+
direction?: GridDirection;
|
|
20
|
+
/**
|
|
21
|
+
* 卡片间距(quasar 的 q-gutter-<size>,即卡片之间的间隔)。
|
|
22
|
+
* 取值:none / xs(4px) / sm(8px) / md(16px) / lg(24px) / xl(48px),默认 md。
|
|
23
|
+
* 传 none 表示无间距。
|
|
24
|
+
*/
|
|
25
|
+
gutter?: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
26
|
+
/**
|
|
27
|
+
* 容器内边距(quasar 的 q-pa-<size>)。取值同 gutter,默认 md。
|
|
28
|
+
* 传 none 表示无内边距。
|
|
29
|
+
*/
|
|
30
|
+
padding?: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
31
|
+
count?: number;
|
|
32
|
+
items?: any[];
|
|
33
|
+
}
|
|
34
|
+
export interface CardOptions {
|
|
35
|
+
/**
|
|
36
|
+
* 卡片宽度。不传则由容器的 columns 算出(.col-<12/columns>)。
|
|
37
|
+
* 传了就固定该宽度:数字按 px,字符串原样使用(如 '200px' / '30%')。
|
|
38
|
+
*/
|
|
39
|
+
width?: number | string;
|
|
40
|
+
/**
|
|
41
|
+
* 卡片高度。数字按 px,字符串原样使用。
|
|
42
|
+
* 不传则由内容撑开(并受容器 align 限制)。
|
|
43
|
+
*/
|
|
44
|
+
height?: number | string;
|
|
45
|
+
direction?: GridDirection;
|
|
46
|
+
padding?: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
47
|
+
bordered?: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface GridCardSlotProps {
|
|
50
|
+
index: number;
|
|
51
|
+
item: any;
|
|
52
|
+
options: CardOptions;
|
|
53
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UMenu —— 菜单的数据结构定义(model 层)
|
|
3
|
+
*
|
|
4
|
+
* 本层只定义**数据结构**,不放任何逻辑:
|
|
5
|
+
* - 逻辑(菜单项兜底规范化)在 ../utils/menu.ts;
|
|
6
|
+
* - 后端 yaml → 本层结构的转换在 ../parser/menu.ts。
|
|
7
|
+
*
|
|
8
|
+
* 设计原则:
|
|
9
|
+
* 1. UMenu 是**纯展示组件**:不发任何请求,菜单数据全部由外部传入
|
|
10
|
+
* (`options` prop 或 `setOptions()`)。
|
|
11
|
+
* 2. 只负责「画出来 + 把点击意图抛出去」——点击由外部按 payload.type 分发,
|
|
12
|
+
* 组件自己不 router.push、不 window.open。
|
|
13
|
+
* 3. 默认**全部展开**,带子菜单的一级菜单标题加粗当分组标题用(`expandAll` 默认 true)。
|
|
14
|
+
*
|
|
15
|
+
* 数据来源(谁把菜单塞进来,组件不管):
|
|
16
|
+
* - 静态 yaml:GET /api/form?type=menus&id=<id> → Qf.GetMenuConfig(id) 转成 MenuOptions
|
|
17
|
+
* - 字典菜单:使用方自己取字典树(yaml 里的 dictType 会原样带出来)后填进 `menus`
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* 菜单跳转类型
|
|
21
|
+
* route —— 前端路由(vue-router),取 path
|
|
22
|
+
* url —— 外部链接,取 path
|
|
23
|
+
* form —— 表单配置(config/forms/<id>.yaml),由使用方打开表单
|
|
24
|
+
* table —— 表格配置(config/tables/<id>.yaml),由使用方打开表格
|
|
25
|
+
* menu —— 菜单配置(config/menus/<id>.yaml),由使用方切换菜单
|
|
26
|
+
*/
|
|
27
|
+
export type MenuJumpType = 'route' | 'url' | 'form' | 'table' | 'menu';
|
|
28
|
+
/** url 类型的打开方式:new 新窗口(默认)| self 当前窗口 */
|
|
29
|
+
export type MenuOpenType = 'new' | 'self';
|
|
30
|
+
/** 菜单项(最多支持 2 级) */
|
|
31
|
+
export interface MenuItem {
|
|
32
|
+
/** 菜单名称 */
|
|
33
|
+
label: string;
|
|
34
|
+
/** 跳转类型,默认 route */
|
|
35
|
+
type?: MenuJumpType;
|
|
36
|
+
/** 跳转目标:route -> 路由地址;url -> 完整地址 */
|
|
37
|
+
path?: string;
|
|
38
|
+
/**
|
|
39
|
+
* 配置文件 id(type 为 form/table/menu 时使用,
|
|
40
|
+
* 对应 config/<forms|tables|menus>/<id>.yaml)。不写则回退用 path。
|
|
41
|
+
*/
|
|
42
|
+
id?: string;
|
|
43
|
+
/** 打开方式(仅 url 类型生效):new 新窗口 | self 当前窗口 */
|
|
44
|
+
open?: MenuOpenType;
|
|
45
|
+
/** 图标名(@element-plus/icons-vue 的组件名,如 User / Setting) */
|
|
46
|
+
icon?: string;
|
|
47
|
+
/** 二级菜单(再往下不再展开) */
|
|
48
|
+
children?: MenuItem[];
|
|
49
|
+
/** 其它自定义字段原样保留(使用方可按自己的业务取用) */
|
|
50
|
+
[key: string]: any;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* UMenu 配置
|
|
54
|
+
* 组件只认下面这些键;其余键原样忽略(yaml 里的额外信息请走解析层消化)。
|
|
55
|
+
*/
|
|
56
|
+
export interface MenuOptions {
|
|
57
|
+
/** 项目名称:sidebar 模式显示在顶部,horizontal 模式显示在最左侧;为空不显示 */
|
|
58
|
+
projectName?: string;
|
|
59
|
+
/** 项目 logo 图片地址 */
|
|
60
|
+
logo?: string;
|
|
61
|
+
/** 菜单模式:sidebar 左侧栏 | horizontal 水平,默认 'sidebar' */
|
|
62
|
+
mode?: 'sidebar' | 'horizontal';
|
|
63
|
+
/** 菜单宽度(仅 sidebar 模式生效),默认 220 */
|
|
64
|
+
width?: number;
|
|
65
|
+
/**
|
|
66
|
+
* 是否默认展开全部子菜单,**默认 true**。
|
|
67
|
+
* 展开时带子菜单的一级菜单标题加粗,当分组标题用。
|
|
68
|
+
*/
|
|
69
|
+
expandAll?: boolean;
|
|
70
|
+
/** 是否只允许同时展开一个子菜单,默认 false(expandAll 为 true 时该项无效) */
|
|
71
|
+
uniqueOpened?: boolean;
|
|
72
|
+
/** 菜单列表 */
|
|
73
|
+
menus?: MenuItem[];
|
|
74
|
+
/** 是否显示退出登录区域,默认 true */
|
|
75
|
+
showLogout?: boolean;
|
|
76
|
+
/** 退出登录按钮文本,默认 '退出登录' */
|
|
77
|
+
logoutText?: string;
|
|
78
|
+
/**
|
|
79
|
+
* 字典菜单类型 —— yaml 里写了就原样带出来给使用方。
|
|
80
|
+
* 非空表示菜单数据要去字典接口按该 dictType 取一棵树(取数属于使用方的活),
|
|
81
|
+
* 取到后填进 `menus`。
|
|
82
|
+
*/
|
|
83
|
+
dictType?: string;
|
|
84
|
+
/** 其它自定义字段原样保留 */
|
|
85
|
+
[key: string]: any;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* 菜单配置(`GetMenuConfig(id)` 的返回值)。
|
|
89
|
+
*
|
|
90
|
+
* 和 TablePageConfig / FormConfig 一个思路:yaml 里除了组件直接吃的部分,
|
|
91
|
+
* 还有些**不属于组件**的页面级信息,所以包一层带出来。
|
|
92
|
+
*
|
|
93
|
+
* MenuConfig = {menuOptions, menuId?, meta?}
|
|
94
|
+
* ├─ menuOptions → 直接喂 <UMenu :options>
|
|
95
|
+
* └─ menuId / meta → yaml 的 meta 段原样带出(使用方记录「当前是哪份菜单」时用)
|
|
96
|
+
*
|
|
97
|
+
* 字典菜单的 `dictType` 不在这一层 —— 它就在 MenuOptions 上(使用方取到字典树后填 menus)。
|
|
98
|
+
*/
|
|
99
|
+
export interface MenuConfig {
|
|
100
|
+
/** 菜单组件配置,直接喂 <UMenu :options> */
|
|
101
|
+
menuOptions: MenuOptions;
|
|
102
|
+
/** 菜单配置 ID(yaml 的 meta.menuId) */
|
|
103
|
+
menuId?: string;
|
|
104
|
+
/** 后端 yaml 的 meta 段原样带出(menuId / title / version) */
|
|
105
|
+
meta?: Record<string, any>;
|
|
106
|
+
}
|
|
107
|
+
/** 菜单点击事件载荷(外部按 type 判断跳转类型) */
|
|
108
|
+
export interface MenuClickPayload {
|
|
109
|
+
/** 跳转类型:route / url / form / table / menu */
|
|
110
|
+
type: MenuJumpType;
|
|
111
|
+
/** 原始跳转目标(route/url 为目标地址,form/table/menu 一般为配置文件名) */
|
|
112
|
+
path: string;
|
|
113
|
+
/** type === 'route' 时的路由地址 */
|
|
114
|
+
route?: string;
|
|
115
|
+
/** type === 'url' 时的完整地址 */
|
|
116
|
+
url?: string;
|
|
117
|
+
/** type === 'url' 时的打开方式 */
|
|
118
|
+
open?: MenuOpenType;
|
|
119
|
+
/** type 为 form / table / menu 时的配置文件 id(取自菜单项 id,缺失时回退 path) */
|
|
120
|
+
id?: string;
|
|
121
|
+
/** 被点击的菜单项原始配置 */
|
|
122
|
+
item: MenuItem;
|
|
123
|
+
/** 菜单层级(1 或 2) */
|
|
124
|
+
level: number;
|
|
125
|
+
/** el-menu 的 index 链路 */
|
|
126
|
+
indexPath: string[];
|
|
127
|
+
/** el-menu 的 index */
|
|
128
|
+
index: string;
|
|
129
|
+
}
|
|
130
|
+
/** #menu-title / #menu-item 插槽的作用域参数 */
|
|
131
|
+
export interface MenuItemSlotProps {
|
|
132
|
+
/** 当前菜单项 */
|
|
133
|
+
item: MenuItem;
|
|
134
|
+
/** 层级:1 一级 | 2 二级 */
|
|
135
|
+
level: number;
|
|
136
|
+
/** 同级中的下标 */
|
|
137
|
+
index: number;
|
|
138
|
+
/** 二级菜单的父项(一级项为 null) */
|
|
139
|
+
parent: MenuItem | null;
|
|
140
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 单元格文字对齐方式。
|
|
3
|
+
* 检验结果表里「结果」「单位」「提示」这类短列习惯居中,「项目」「参考区间」左对齐。
|
|
4
|
+
*/
|
|
5
|
+
export type ResultsAlign = 'left' | 'center' | 'right';
|
|
6
|
+
/**
|
|
7
|
+
* 一列的定义(`options.columns` 的成员)—— 「自定义列」配的就是它。
|
|
8
|
+
*
|
|
9
|
+
* 列宽规则(决定这一列分到多宽):
|
|
10
|
+
* ① 配了 `width` —— 固定值(数字按 px,字符串原样如 `'20%'` / `'1fr'`)
|
|
11
|
+
* ② 只配了 `minWidth` —— `minmax(minWidth, 1fr)`:至少这么宽,剩余空间一起分
|
|
12
|
+
* ③ 都没配 —— `minmax(0, 1fr)`:把剩余空间等分
|
|
13
|
+
* 所以「只给两列配宽度、其余自动铺满」直接写就行,不用算百分比。
|
|
14
|
+
*/
|
|
15
|
+
export interface ResultsColumn {
|
|
16
|
+
/** 表头文字 */
|
|
17
|
+
label?: string;
|
|
18
|
+
/**
|
|
19
|
+
* 取值字段。支持点路径(`'item.name'` → `row.item.name`)。
|
|
20
|
+
* 同时兼作插槽名(当 `slot: true` 时)。
|
|
21
|
+
*/
|
|
22
|
+
prop?: string;
|
|
23
|
+
/** 列宽(数字按 px,字符串原样)。不配则该列等分剩余宽度 */
|
|
24
|
+
width?: number | string;
|
|
25
|
+
/** 最小列宽(数字按 px,字符串原样)。配了它、没配 width 时:至少这么宽,剩余空间一起分 */
|
|
26
|
+
minWidth?: number | string;
|
|
27
|
+
/** 单元格对齐,默认 `left` */
|
|
28
|
+
align?: ResultsAlign;
|
|
29
|
+
/** 表头对齐,默认跟随 `align` */
|
|
30
|
+
headerAlign?: ResultsAlign;
|
|
31
|
+
/**
|
|
32
|
+
* 该列单元格用插槽渲染(结果值要标红/加箭头时用):
|
|
33
|
+
* 字符串 —— 插槽名,如 `slot: 'flag'` → 使用方写 `<template #flag="{value, row}">`
|
|
34
|
+
* true —— 用 `prop` 当插槽名
|
|
35
|
+
* 使用方没提供该插槽时自动退回纯文本(不会渲染成空白)。
|
|
36
|
+
*/
|
|
37
|
+
slot?: string | boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 检验结果表配置(UResults 的 `options`)。
|
|
41
|
+
* 直接喂给组件即可显示 —— 解析层(后端 yaml)负责把它拼出来。
|
|
42
|
+
*/
|
|
43
|
+
export interface ResultsOptions {
|
|
44
|
+
/** 列定义,数组顺序即列顺序(核心配置) */
|
|
45
|
+
columns?: ResultsColumn[];
|
|
46
|
+
/** 数据行(组件 `data` prop 的兜底)。两者都给时以 `data` prop 为准 */
|
|
47
|
+
data?: any[];
|
|
48
|
+
/** 斑马纹(隔行底色),默认 false */
|
|
49
|
+
striped?: boolean;
|
|
50
|
+
/** 行 / 列分割线与外框,默认 true */
|
|
51
|
+
border?: boolean;
|
|
52
|
+
/** 表头背景色,默认 `'#f5f7fa'` */
|
|
53
|
+
headerBg?: string;
|
|
54
|
+
/** 表头文字颜色,默认 `'#303133'` */
|
|
55
|
+
headerColor?: string;
|
|
56
|
+
/** 数据行背景色,默认 `'#fff'` */
|
|
57
|
+
itemBg?: string;
|
|
58
|
+
/** 斑马纹那几行的底色,默认 `'#fafafa'`(要对比明显就往更深的颜色给) */
|
|
59
|
+
stripeBg?: string;
|
|
60
|
+
/** 组件宽度(数字按 px,字符串原样),默认 `'100%'` */
|
|
61
|
+
width?: number | string;
|
|
62
|
+
/**
|
|
63
|
+
* 组件高度(数字按 px,字符串原样),默认不限制(随内容自适应)。
|
|
64
|
+
* 配了它,内容超出时在内容区滚动、**表头吸顶不动**。
|
|
65
|
+
*/
|
|
66
|
+
height?: number | string;
|
|
67
|
+
/** 行高(数字按 px)—— 单元格最小高度;内容多把行撑高时以内容为准 */
|
|
68
|
+
rowHeight?: number | string;
|
|
69
|
+
/** 表头行高(数字按 px),同 `rowHeight` */
|
|
70
|
+
headerHeight?: number | string;
|
|
71
|
+
/** 值为空时的占位,默认 `'-'`。传空串表示什么都不显示 */
|
|
72
|
+
emptyText?: string;
|
|
73
|
+
/** 一行数据都没有时的文案,默认 `'暂无数据'`(想自定义布局用 `#empty` 插槽) */
|
|
74
|
+
emptyDataText?: string;
|
|
75
|
+
}
|
|
76
|
+
/** 列级插槽(`column.slot` 指定的那个)的作用域 */
|
|
77
|
+
export interface ResultsCellSlotProps {
|
|
78
|
+
/** 当前整行数据 */
|
|
79
|
+
row: any;
|
|
80
|
+
/** 当前列定义 */
|
|
81
|
+
column: ResultsColumn;
|
|
82
|
+
/** 第几行,从 0 开始 */
|
|
83
|
+
rowIndex: number;
|
|
84
|
+
/** 第几列,从 0 开始 */
|
|
85
|
+
columnIndex: number;
|
|
86
|
+
/** 该单元格原始值(未经空值占位处理) */
|
|
87
|
+
value: any;
|
|
88
|
+
/** 该单元格的展示文本(空值已按 `emptyText` 处理) */
|
|
89
|
+
text: string;
|
|
90
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { CascaderLevel, CascaderLevelMeta, CascaderOption } from './cascader';
|
|
2
|
+
/**
|
|
3
|
+
* 搜索项类型:直接写 Element Plus 的组件名也可以('el-xxx' 原样交给 <component :is>)。
|
|
4
|
+
* input —— el-input 文本输入
|
|
5
|
+
* number —— el-input-number 数字输入
|
|
6
|
+
* select —— el-select 下拉(选项带 children 时自动交给 UCascader 渲染成多级联动)
|
|
7
|
+
* date —— el-date-picker 单日期
|
|
8
|
+
* daterange —— el-date-picker 日期范围
|
|
9
|
+
* datetime —— el-date-picker 日期时间
|
|
10
|
+
*/
|
|
11
|
+
export type SearchItemType = 'input' | 'number' | 'select' | 'date' | 'daterange' | 'datetime' | (string & {});
|
|
12
|
+
/** select 的选项节点(就是级联选项,见 ./cascader.ts 的 CascaderOption) */
|
|
13
|
+
export type SearchOption = CascaderOption;
|
|
14
|
+
/** 级联 select 实际渲染出来的一级(见 ./cascader.ts 的 CascaderLevel) */
|
|
15
|
+
export type SearchSelectLevel = CascaderLevel;
|
|
16
|
+
/** 单个搜索项 */
|
|
17
|
+
export interface SearchItem {
|
|
18
|
+
/**
|
|
19
|
+
* 字段名(级联 select 时 = **第一级**的字段名)。
|
|
20
|
+
* 支持点路径(如 'info.remark')。
|
|
21
|
+
*/
|
|
22
|
+
field: string;
|
|
23
|
+
/** 类型,默认 'input' */
|
|
24
|
+
type?: SearchItemType;
|
|
25
|
+
/** 标签文字,默认用 fieldLabel / field */
|
|
26
|
+
label?: string;
|
|
27
|
+
/**
|
|
28
|
+
* 级联 select **第一级**的标签(与节点上的 fieldLabel 同位写法)。
|
|
29
|
+
* 不写则用 item.label。
|
|
30
|
+
*/
|
|
31
|
+
fieldLabel?: string;
|
|
32
|
+
/** select 的选项(树形,可有 children 形成级联) */
|
|
33
|
+
options?: SearchOption[];
|
|
34
|
+
/**
|
|
35
|
+
* 透传给控件的属性:
|
|
36
|
+
* clearable / filterable / multiple / placeholder / value-format / start-placeholder …
|
|
37
|
+
*/
|
|
38
|
+
props?: Record<string, any>;
|
|
39
|
+
/** 该项占宽(css 值,如 '240px' / '100%'),不传用 SearchOptions.itemWidth */
|
|
40
|
+
width?: number | string;
|
|
41
|
+
/** 是否隐藏该项(不渲染,但也不从 model 里删值) */
|
|
42
|
+
hidden?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* 字典类型。解析层从 yaml 的 dictType 带过来,
|
|
45
|
+
* 组件不认这个字段 —— 选项由使用方按 dictType 取好后塞进 options。
|
|
46
|
+
*/
|
|
47
|
+
dictType?: string;
|
|
48
|
+
/**
|
|
49
|
+
* 级联项**只声明了层级、选项树在字典里**(yaml 用 children 链写法)时,
|
|
50
|
+
* 解析层把层级链带在这里。使用方取到字典树后:
|
|
51
|
+
* `item.options = new CascaderParser().stampLevels(树, item.cascaderLevels)`。
|
|
52
|
+
* 内联了选项树(或非级联项)时不会有这个字段。
|
|
53
|
+
*/
|
|
54
|
+
cascaderLevels?: CascaderLevelMeta[];
|
|
55
|
+
/** 其它自定义字段原样保留(配置里未被本层消费的键都在这里) */
|
|
56
|
+
[key: string]: any;
|
|
57
|
+
}
|
|
58
|
+
/** USearch 整体配置 */
|
|
59
|
+
export interface SearchOptions {
|
|
60
|
+
/** 搜索项列表 */
|
|
61
|
+
items: SearchItem[];
|
|
62
|
+
/** 标签位置:left 左边 | top 上面,默认 'left' */
|
|
63
|
+
labelPosition?: 'left' | 'top';
|
|
64
|
+
/** 标签宽度(labelPosition 为 left 时生效),数字按 px,默认 80 */
|
|
65
|
+
labelWidth?: number | string;
|
|
66
|
+
/** 标签对齐(labelPosition 为 left 时生效),默认 'right';top 时恒为左对齐 */
|
|
67
|
+
labelAlign?: 'left' | 'center' | 'right';
|
|
68
|
+
/** 项与项之间的间距(px),默认 12 */
|
|
69
|
+
gutter?: number;
|
|
70
|
+
/** 搜索项默认占宽(css 值),默认 '240px' */
|
|
71
|
+
itemWidth?: number | string;
|
|
72
|
+
/** 是否显示「查询」按钮,默认 true */
|
|
73
|
+
showSearch?: boolean;
|
|
74
|
+
/** 是否显示「重置」按钮,默认 true */
|
|
75
|
+
showReset?: boolean;
|
|
76
|
+
/** 查询按钮文字,默认 '查询' */
|
|
77
|
+
searchText?: string;
|
|
78
|
+
/** 重置按钮文字,默认 '重置' */
|
|
79
|
+
resetText?: string;
|
|
80
|
+
/** 是否禁用整栏 */
|
|
81
|
+
disabled?: boolean;
|
|
82
|
+
}
|
|
83
|
+
/** 搜索项插槽的作用域参数 */
|
|
84
|
+
export interface SearchItemSlotProps {
|
|
85
|
+
/** 当前项的配置 */
|
|
86
|
+
item: SearchItem;
|
|
87
|
+
/** 当前项的值(级联项为第一级的值) */
|
|
88
|
+
value: any;
|
|
89
|
+
/** 整个搜索条件对象 */
|
|
90
|
+
model: Record<string, any>;
|
|
91
|
+
/** 写回整个条件对象 */
|
|
92
|
+
setModel: (model: Record<string, any>) => void;
|
|
93
|
+
}
|