@blueking/bkui-form 0.0.4
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/dist/bkui-form-umd-min.js +9 -0
- package/dist/bkui-form-umd.js +10802 -0
- package/dist/bkui-form-umd.js.map +1 -0
- package/dist/bkui-form.css +96 -0
- package/dist/types/bkui-form.d.ts +148 -0
- package/package.json +75 -0
- package/readme.md +410 -0
package/readme.md
ADDED
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
# README
|
|
2
|
+
|
|
3
|
+
### schema 协议
|
|
4
|
+
|
|
5
|
+
```js
|
|
6
|
+
{
|
|
7
|
+
"schema": {
|
|
8
|
+
"title": String, // 必需,整个表单的title说明
|
|
9
|
+
"description": String, // 可选,整个表单描述信息
|
|
10
|
+
"type": Object, // 固定值为对象类型
|
|
11
|
+
"properties": { // 必需
|
|
12
|
+
"fieldKey": { // 必需, 单个表单组件的key,根据业务需求自定义
|
|
13
|
+
"type": String | Number | Boolean | Array | Object, // 必需,表单组件value的数据类型
|
|
14
|
+
"title": String, // 必需,表单组件的label
|
|
15
|
+
"default": String | Number | Boolean | Array | Object, // 可选,表单组件的默认值
|
|
16
|
+
"required": Boolean, // 可选,是否为必填项,默认为false
|
|
17
|
+
"ui:field": {},
|
|
18
|
+
"ui:component": { // 可选,单个表单所需要渲染的目标组件元素,若不配置则默认为magicbox组件的input组件
|
|
19
|
+
"name": String, // 必需,所需渲染组件的名称,例如组件库里的bk-input、bk-table,也可以是通过插件注册的自定义组件
|
|
20
|
+
"props": { // 可选,透传到组件的属性,可传入的属性由渲染的组件决定,组件支持的属性都可传入
|
|
21
|
+
"dataSource": Array < Object: {
|
|
22
|
+
label: String,
|
|
23
|
+
value: String | Numnber | Boolean
|
|
24
|
+
} > , // 可选,用户可枚举选项的表单类型比如:下拉框、复选框、表格等组件,配置选项
|
|
25
|
+
"remoteConfig": { // 可选,可枚举选项类型表单加载远程数据源时,用来配置请求参数,参数会默认传到内置的$loadSourceData方法里, 如果需要加载远程数据需要在reactions里实现
|
|
26
|
+
"url": String,
|
|
27
|
+
"method": String,
|
|
28
|
+
"headers": Object,
|
|
29
|
+
"params": Object,
|
|
30
|
+
"data": Object
|
|
31
|
+
},
|
|
32
|
+
"value": String | Number | Boolean | Array | Object, // 可选
|
|
33
|
+
"disabled": Boolean, // 可选
|
|
34
|
+
"readonly": Boolean, // 可选
|
|
35
|
+
"placeholder": String, // 可选
|
|
36
|
+
... // 目标组件支持的其他props选项
|
|
37
|
+
},
|
|
38
|
+
"slot": {}, // 可选,组件原生支持的slot
|
|
39
|
+
"event": {}, // 可选,组件原生支持的事件
|
|
40
|
+
},
|
|
41
|
+
"ui:reactions": [{
|
|
42
|
+
"target": String, // 可选,目标表单的 path
|
|
43
|
+
"source": String | String[], // 可选,依赖表单的 path,如果依赖多个,则需要用数组描述
|
|
44
|
+
"lifetime": String, // 可选,由当前表单组件的生命周期触发,init、change、destroy
|
|
45
|
+
"effect": String, // 可选,由依赖表单的事件触发,比如button组件的 click 事件
|
|
46
|
+
"if": String | Soolean, // 可选,联动是否生效,支持写表达式字符串和布尔值,表达式的返回值需要为布尔值
|
|
47
|
+
"then": { // 可选,条件满足或者默认触发后执行
|
|
48
|
+
"state": IFormState // 可选,修改表单项的状态,比如visible、value、disabled等
|
|
49
|
+
"actions": Array < IBaseFunction > // 可选,调用内置方法,比如loadSourceData,validate
|
|
50
|
+
},
|
|
51
|
+
"else": { // 不满足条件时执行
|
|
52
|
+
"state": IFormState,
|
|
53
|
+
"actions": Array < IBaseFunction >
|
|
54
|
+
}
|
|
55
|
+
}],
|
|
56
|
+
"ui:validator": [{ // 可选,表单项的校验配置,可以单独定义校验规则,也可以引用全局的定义的rules
|
|
57
|
+
"rule": String, // 必需,校验表达式字符串
|
|
58
|
+
"message": String // 必需,校验失败错误提示信息
|
|
59
|
+
} | String], // 通过"{{ $rules.rule_name }}"的方式引用全局定义的校验规则
|
|
60
|
+
"ui:props": { // 可选,单个表单项的属性配置,按需传入
|
|
61
|
+
"tips": String, // 可选,表单项label的tips说明
|
|
62
|
+
"visible": Boolean | Function, // 可选,表单项是否可见,支持函数通过返回值动态设置,函数context注入整个表单项的value,默认为 true
|
|
63
|
+
"disabled": Boolean | Function, // 可选,表单项是否禁用,默认为false
|
|
64
|
+
"className": String, // 表单项外层容器元素的class名称
|
|
65
|
+
... // 后续扩展
|
|
66
|
+
},
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"layout": [], // 可选,定义各表单元素的位置信息,整体表单按照grid布局方式提供配置,默认按照从上往下单列表单项的布局方式排列
|
|
71
|
+
"rules": { // 可选,定义全局通用的校验规则,可以在单个表单的校验配置项里引用
|
|
72
|
+
"rule_name": { // rule_name 为自定义的校验规则名称
|
|
73
|
+
"validator": String, // 自定义校验表达式,eg: "{{ $self.value.length > 20 && $getValue('a.b.c').value !== '' }}"
|
|
74
|
+
"message": String, // 校验失败错误提示信息
|
|
75
|
+
},
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### demo
|
|
81
|
+
|
|
82
|
+
```js
|
|
83
|
+
{
|
|
84
|
+
"schema": {
|
|
85
|
+
"title": "job_execute_task",
|
|
86
|
+
"description": "作业平台(JOB)-执行作业",
|
|
87
|
+
"type": "object",
|
|
88
|
+
"properties": {
|
|
89
|
+
"biz_cc_id": {
|
|
90
|
+
"type": "number",
|
|
91
|
+
"title": "业务id",
|
|
92
|
+
"default": 3,
|
|
93
|
+
"ui:component": {
|
|
94
|
+
"name": "select",
|
|
95
|
+
"props": {
|
|
96
|
+
"disabled": true,
|
|
97
|
+
"dataSource": [{
|
|
98
|
+
"label": "蓝鲸",
|
|
99
|
+
"value": 3
|
|
100
|
+
}]
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
"ui:props": {
|
|
104
|
+
"required": true
|
|
105
|
+
},
|
|
106
|
+
"ui:reactions": [{
|
|
107
|
+
"lifetime": "init",
|
|
108
|
+
"if": "{{ $self.value !== '' }}",
|
|
109
|
+
"else": {
|
|
110
|
+
"state": "{{ $context.bizId }}"
|
|
111
|
+
}
|
|
112
|
+
}],
|
|
113
|
+
"extend": {
|
|
114
|
+
"can_hook": true
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
"job_task_id": {
|
|
118
|
+
"type": "string",
|
|
119
|
+
"title": "执行方案",
|
|
120
|
+
"default": "",
|
|
121
|
+
"ui:component": {
|
|
122
|
+
"name": "select",
|
|
123
|
+
"props": {
|
|
124
|
+
"datasource": {
|
|
125
|
+
"url": "{{ $context.bizId ? '' : $context.site_url + 'pipeline/job_get_job_tasks_by_biz/' + $context.bizId + '/' }}",
|
|
126
|
+
"header": {},
|
|
127
|
+
"params": {},
|
|
128
|
+
"data": {}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
"ui:reactions": [{
|
|
133
|
+
"lifetime": "init",
|
|
134
|
+
"then": {
|
|
135
|
+
"actions": ["{{ $loadDataSource }}"]
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"source": ["biz_cc_id"],
|
|
140
|
+
"then": {
|
|
141
|
+
"actions": ["{{ $loadDataSource }}"]
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"source": ["button_refresh"],
|
|
146
|
+
"effect": "click",
|
|
147
|
+
"then": {
|
|
148
|
+
"actions": ["{{ $loadDataSource }}"]
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
],
|
|
152
|
+
"ui:validator": [
|
|
153
|
+
"{{ $rules.max20 }}",
|
|
154
|
+
{
|
|
155
|
+
"rule": "{{ $self.value.length > 0 && $getValue('biz_cc_id') }}",
|
|
156
|
+
"message": "执行方案不能为空"
|
|
157
|
+
}
|
|
158
|
+
],
|
|
159
|
+
"ui:props": {
|
|
160
|
+
"required": true
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
"button_refresh": {
|
|
164
|
+
"type": "string",
|
|
165
|
+
"title": "",
|
|
166
|
+
"ui:component": {
|
|
167
|
+
"name": "button",
|
|
168
|
+
"props": {
|
|
169
|
+
"theme": "primary",
|
|
170
|
+
"word": "刷新"
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
"job_global_var": {
|
|
175
|
+
"type": "array",
|
|
176
|
+
"title": "全局变量",
|
|
177
|
+
"default": "",
|
|
178
|
+
"ui:component": {
|
|
179
|
+
"name": "table",
|
|
180
|
+
"props": {
|
|
181
|
+
"dataSource": []
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
"extend": {
|
|
185
|
+
"can_hook": true
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
"ip_is_exist": {
|
|
189
|
+
"type": "boolean",
|
|
190
|
+
"title": "IP 存在性校验",
|
|
191
|
+
"default": true,
|
|
192
|
+
"ui:component": {
|
|
193
|
+
"name": "radio",
|
|
194
|
+
"props": {
|
|
195
|
+
"dataSource": [{
|
|
196
|
+
"label": "是",
|
|
197
|
+
"value": true
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"label": "否",
|
|
201
|
+
"value": false
|
|
202
|
+
}
|
|
203
|
+
]
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
"extend": {
|
|
207
|
+
"can_hook": true
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
"biz_across": {
|
|
211
|
+
"type": "boolean",
|
|
212
|
+
"title": "IP 允许跨业务",
|
|
213
|
+
"default": false,
|
|
214
|
+
"ui:component": {
|
|
215
|
+
"name": "radio",
|
|
216
|
+
"props": {
|
|
217
|
+
"dataSource": [{
|
|
218
|
+
"label": "是",
|
|
219
|
+
"value": true
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"label": "否",
|
|
223
|
+
"value": false
|
|
224
|
+
}
|
|
225
|
+
]
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
"extend": {
|
|
229
|
+
"can_hook": true
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
"is_tagged_ip": {
|
|
233
|
+
"type": "boolean",
|
|
234
|
+
"title": "IP Tag 分组",
|
|
235
|
+
"default": true,
|
|
236
|
+
"ui:component": {
|
|
237
|
+
"name": "radio",
|
|
238
|
+
"props": {
|
|
239
|
+
"dataSource": [{
|
|
240
|
+
"label": "是",
|
|
241
|
+
"value": true
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"label": "否",
|
|
245
|
+
"value": false
|
|
246
|
+
}
|
|
247
|
+
]
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
"extend": {
|
|
251
|
+
"can_hook": true
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
"job_success_id": {
|
|
255
|
+
"type": "string",
|
|
256
|
+
"title": "JOB成功历史",
|
|
257
|
+
"default": "",
|
|
258
|
+
"ui:component": {
|
|
259
|
+
"name": "select",
|
|
260
|
+
"props": {
|
|
261
|
+
"remoteConfig": {
|
|
262
|
+
"url": "{{ $context.bizId ? '' : $context.site_url + 'pipeline/job_get_job_tasks_by_biz/' + $context.bizId + '/' }}",
|
|
263
|
+
"header": {},
|
|
264
|
+
"params": {},
|
|
265
|
+
"data": {}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
"ui:reactions": [{
|
|
270
|
+
"lifetime": "init",
|
|
271
|
+
"then": {
|
|
272
|
+
"actions": ["{{ $loadDataSource }}"]
|
|
273
|
+
}
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
"source": ["biz_cc_id"],
|
|
277
|
+
"then": {
|
|
278
|
+
"actions": ["{{ $loadDataSource }}"]
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
"source": ["button_refresh_2"],
|
|
283
|
+
"effect": "click",
|
|
284
|
+
"then": {
|
|
285
|
+
"actions": ["{{ $loadDataSource }}"]
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
]
|
|
289
|
+
},
|
|
290
|
+
"button_refresh_2": {
|
|
291
|
+
"type": "string",
|
|
292
|
+
"title": "",
|
|
293
|
+
"ui:component": {
|
|
294
|
+
"name": "button",
|
|
295
|
+
"props": {
|
|
296
|
+
"word": "刷新"
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
"job_success_id_static": {
|
|
301
|
+
"type": "string",
|
|
302
|
+
"title": "JOB成功历史(静态)",
|
|
303
|
+
"default": "official",
|
|
304
|
+
"ui:component": {
|
|
305
|
+
"name": "select",
|
|
306
|
+
"props": {
|
|
307
|
+
"datasource": [{
|
|
308
|
+
"value": "official",
|
|
309
|
+
"label": "官方插件"
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
"value": "external",
|
|
313
|
+
"label": "第三方插件"
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
"value": "scripts",
|
|
317
|
+
"label": "脚本插件"
|
|
318
|
+
}
|
|
319
|
+
]
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
},
|
|
325
|
+
"layout": [
|
|
326
|
+
["biz_cc_id"],
|
|
327
|
+
["job_task_id", "button_refresh"],
|
|
328
|
+
["job_global_var"],
|
|
329
|
+
["ip_is_exist"],
|
|
330
|
+
["biz_across"],
|
|
331
|
+
["is_tagged_ip"],
|
|
332
|
+
["job_success_id", "button_refresh_2"],
|
|
333
|
+
["job_success_id_static"]
|
|
334
|
+
],
|
|
335
|
+
"rules": [{
|
|
336
|
+
"max20": {
|
|
337
|
+
"validator": "{{ $self.value.length <= 20 }}",
|
|
338
|
+
"message": "方案名称的长度不能超过20个字符"
|
|
339
|
+
}
|
|
340
|
+
}]
|
|
341
|
+
}
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
### schema 中内置的对象和方法
|
|
345
|
+
|
|
346
|
+
表单插件提供了一些内置对象和内置方法,可以在schema中支持表达式的地方使用,可以满足一些动态获取值的场景,例如在单个组件初始化的时候调用远程数据源,则可以在定义的 reactions 里使用 `$loadDataSource` 方法。
|
|
347
|
+
|
|
348
|
+
- 内置对象
|
|
349
|
+
|
|
350
|
+
- $self 当前表单 widget 的 vue 组件实例
|
|
351
|
+
- $context 具体业务使用方传入的全局上下文
|
|
352
|
+
- $dep reactions 中源(由source定义)表单 vue 组件实例,数组类型,按照source中定义的顺序访问对应的表单实例
|
|
353
|
+
- $rules schema 里定义的全局通用的校验规则
|
|
354
|
+
- $schema 当前表单组件的 schema 配置
|
|
355
|
+
|
|
356
|
+
- 内置方法
|
|
357
|
+
- $getValue 获取表单组件实例的值,参数为表单路径,eg: 'a.b.c'
|
|
358
|
+
- $loadSourceData 可枚举选项类型表单加载远程数据源的方法,通过 remote_config 配置请求参数
|
|
359
|
+
- $validate 表单项的校验方法
|
|
360
|
+
|
|
361
|
+
### 表单联动
|
|
362
|
+
|
|
363
|
+
各表单组件之间的联动是通过`ui:reactions`定义的,插件支持主动联动和被动联动两种方式。主动联动是指当前的表单满足特定条件时,目标表单(target属性定义)执行对应的行为,被动联动是指源表单(source属性定义)满足特定条件时,当前的表单执行对应的行为。
|
|
364
|
+
|
|
365
|
+
主动联动示例,key为spec的表单下的子表单的值发生变化,当值为a时,当前表单显示,不为a时当前表单隐藏:
|
|
366
|
+
```js
|
|
367
|
+
{
|
|
368
|
+
"ui:reactions": [
|
|
369
|
+
{
|
|
370
|
+
"target": "spec.node",
|
|
371
|
+
"if": "{{ $self.value === 'a' }}",
|
|
372
|
+
"then": {
|
|
373
|
+
"state": {
|
|
374
|
+
"visible": true
|
|
375
|
+
}
|
|
376
|
+
},
|
|
377
|
+
"else": {
|
|
378
|
+
"state": {
|
|
379
|
+
"visible": false
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
]
|
|
384
|
+
}
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
被动联动示例,key为biz_cc_id的表单初始化时,当前表单执行加载远程数据源方法:
|
|
388
|
+
```js
|
|
389
|
+
{
|
|
390
|
+
"ui:reactions": [
|
|
391
|
+
{
|
|
392
|
+
"source": ["biz_cc_id"],
|
|
393
|
+
"lifetime": "init",
|
|
394
|
+
"then": {
|
|
395
|
+
"actions": ["{{ $loadDataSource }}"]
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
]
|
|
399
|
+
}
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
### 表单校验
|
|
403
|
+
|
|
404
|
+
1. 内置校验,比如当前表单值是否为空,正整数,最大值,最小值,最大长度,最小长度,正则校验
|
|
405
|
+
2. 依赖校验,当前表单值的校验依赖其他表单的值,**需要提供 schema 中获取其他整个表单值的对象,并且能够按照一定的 path 规则获取到目标表单的值**
|
|
406
|
+
3. 自定义校验,对于相对复杂的场景,支持写自定义校验函数,返回 result 和 message
|
|
407
|
+
|
|
408
|
+
### 表单生命周期
|
|
409
|
+
|
|
410
|
+
目前只提供了表单组件初始化的声明周期( `init`)
|