@veltra/desktop 1.7.19 → 1.8.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/dist/components/batch-edit/batch-edit-form.js +40 -26
- package/dist/components/batch-edit/batch-edit-form.js.map +1 -1
- package/dist/components/batch-edit/use-handlers.js +3 -3
- package/dist/components/batch-edit/use-handlers.js.map +1 -1
- package/dist/components/batch-edit/use-shortcut-key.js +4 -2
- package/dist/components/batch-edit/use-shortcut-key.js.map +1 -1
- package/dist/components/card/style2.css +0 -2
- package/dist/components/dropdown/dropdown.js +5 -3
- package/dist/components/dropdown/dropdown.js.map +1 -1
- package/dist/components/expression-editor/components/path-preview.js +3 -6
- package/dist/components/expression-editor/components/path-preview.js.map +1 -1
- package/dist/components/expression-editor/components/variable-picker.js +49 -12
- package/dist/components/expression-editor/components/variable-picker.js.map +1 -1
- package/dist/components/expression-editor/core/editor.js +20 -0
- package/dist/components/expression-editor/core/editor.js.map +1 -1
- package/dist/components/expression-editor/expression-editor.js +53 -18
- package/dist/components/expression-editor/expression-editor.js.map +1 -1
- package/dist/components/expression-editor/style2.css +135 -73
- package/dist/components/form/form.js.map +1 -1
- package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js +0 -1
- package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/form/style2.css +8 -3
- package/dist/components/index.d.ts +26 -26
- package/dist/components/index.js +52 -52
- package/dist/components/multi-select/multi-select.js +16 -12
- package/dist/components/multi-select/multi-select.js.map +1 -1
- package/dist/components/multi-select/style2.css +7 -0
- package/dist/components/multi-tree-select/multi-tree-select.js +82 -56
- package/dist/components/multi-tree-select/multi-tree-select.js.map +1 -1
- package/dist/components/multi-tree-select/style2.css +7 -0
- package/dist/components/select/select.js +7 -3
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/select/style2.css +7 -0
- package/dist/components/select/use-options.js +14 -3
- package/dist/components/select/use-options.js.map +1 -1
- package/dist/components/tree-select/style2.css +7 -0
- package/dist/components/tree-select/tree-select.js +49 -17
- package/dist/components/tree-select/tree-select.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/types/dropdown.d.ts +10 -0
- package/dist/types/multi-tree-select.d.ts +7 -1
- package/dist/types/tree-select.d.ts +7 -1
- package/package.json +1 -1
- package/src/components/batch-edit/__test__/batch-edit.test.ts +112 -1
- package/src/components/batch-edit/batch-edit-form.vue +21 -2
- package/src/components/batch-edit/use-handlers.ts +6 -5
- package/src/components/batch-edit/use-shortcut-key.ts +5 -2
- package/src/components/card/style.scss +0 -2
- package/src/components/dropdown/dropdown.vue +9 -4
- package/src/components/expression-editor/components/path-preview.vue +1 -2
- package/src/components/expression-editor/components/variable-picker.vue +54 -13
- package/src/components/expression-editor/core/editor.ts +28 -0
- package/src/components/expression-editor/expression-editor.vue +47 -17
- package/src/components/expression-editor/style.scss +167 -82
- package/src/components/form/form.vue +0 -1
- package/src/components/form/style.scss +11 -4
- package/src/components/multi-select/multi-select.vue +11 -2
- package/src/components/multi-select/style.scss +6 -0
- package/src/components/multi-tree-select/multi-tree-select.vue +58 -9
- package/src/components/multi-tree-select/style.scss +6 -0
- package/src/components/select/__test__/select.test.ts +78 -0
- package/src/components/select/select.vue +13 -3
- package/src/components/select/style.scss +6 -0
- package/src/components/select/use-options.ts +25 -4
- package/src/components/tree-select/__test__/tree-select.test.ts +116 -0
- package/src/components/tree-select/style.scss +6 -0
- package/src/components/tree-select/tree-select.vue +63 -13
- package/src/types/dropdown.ts +10 -0
- package/src/types/multi-tree-select.ts +12 -1
- package/src/types/tree-select.ts +12 -1
|
@@ -17,45 +17,108 @@
|
|
|
17
17
|
/** 暗色:`UITheme.render()` 按主题系列写入 html[data-theme] */
|
|
18
18
|
.u-expression-editor {
|
|
19
19
|
position: relative;
|
|
20
|
+
width: 100%;
|
|
21
|
+
}
|
|
22
|
+
.u-expression-editor__shell {
|
|
20
23
|
background-color: var(--u-bg-color-top);
|
|
21
24
|
border-width: var(--u-border-width);
|
|
22
25
|
border-style: var(--u-border-style);
|
|
23
26
|
border-color: var(--u-border-muted-color);
|
|
24
27
|
border-radius: var(--u-radius-default);
|
|
25
|
-
|
|
28
|
+
transition: border-color var(--u-transition-fast) var(--u-transition-ease), box-shadow var(--u-transition-fast) var(--u-transition-ease);
|
|
26
29
|
}
|
|
27
|
-
.u-expression-
|
|
30
|
+
.u-expression-editor__shell:not(.is-disabled):not(.is-readonly):hover {
|
|
28
31
|
border-color: var(--u-color-primary);
|
|
29
32
|
}
|
|
30
|
-
.u-expression-
|
|
33
|
+
.u-expression-editor__shell:not(.is-disabled):not(.is-readonly):focus-within {
|
|
31
34
|
border-color: var(--u-color-primary);
|
|
35
|
+
box-shadow: var(--u-focus-ring);
|
|
32
36
|
outline: none;
|
|
33
37
|
}
|
|
34
|
-
.u-expression-
|
|
38
|
+
.u-expression-editor__shell.is-disabled {
|
|
35
39
|
background-color: var(--u-color-disabled);
|
|
36
40
|
cursor: not-allowed;
|
|
37
41
|
border-color: var(--u-border-muted-color);
|
|
38
42
|
}
|
|
39
|
-
.u-expression-
|
|
43
|
+
.u-expression-editor__shell.is-disabled:hover {
|
|
40
44
|
border-color: var(--u-border-muted-color);
|
|
41
45
|
}
|
|
42
|
-
.u-expression-
|
|
46
|
+
.u-expression-editor__shell.is-readonly {
|
|
43
47
|
background-color: var(--u-bg-color-middle);
|
|
44
48
|
cursor: default;
|
|
45
49
|
border-color: var(--u-border-muted-color);
|
|
46
50
|
user-select: text;
|
|
47
51
|
}
|
|
48
|
-
.u-expression-
|
|
52
|
+
.u-expression-editor__shell.is-readonly:hover {
|
|
49
53
|
border-color: var(--u-border-muted-color);
|
|
50
54
|
}
|
|
55
|
+
.u-expression-editor__shell--small {
|
|
56
|
+
min-height: var(--u-form-component-height-small);
|
|
57
|
+
padding: var(--u-gap-small);
|
|
58
|
+
}
|
|
59
|
+
.u-expression-editor__shell--small .u-expression-editor__placeholder {
|
|
60
|
+
font-size: var(--u-font-size-main-small);
|
|
61
|
+
}
|
|
62
|
+
.u-expression-editor__shell--small .u-expression-editor__container {
|
|
63
|
+
font-size: var(--u-font-size-main-small);
|
|
64
|
+
}
|
|
65
|
+
.u-expression-editor__shell--default {
|
|
66
|
+
min-height: var(--u-form-component-height-default);
|
|
67
|
+
padding: var(--u-gap-default);
|
|
68
|
+
}
|
|
69
|
+
.u-expression-editor__shell--default .u-expression-editor__placeholder {
|
|
70
|
+
font-size: var(--u-font-size-main-default);
|
|
71
|
+
}
|
|
72
|
+
.u-expression-editor__shell--default .u-expression-editor__container {
|
|
73
|
+
font-size: var(--u-font-size-main-default);
|
|
74
|
+
}
|
|
75
|
+
.u-expression-editor__shell--large {
|
|
76
|
+
min-height: var(--u-form-component-height-large);
|
|
77
|
+
padding: var(--u-gap-large);
|
|
78
|
+
}
|
|
79
|
+
.u-expression-editor__shell--large .u-expression-editor__placeholder {
|
|
80
|
+
font-size: var(--u-font-size-main-large);
|
|
81
|
+
}
|
|
82
|
+
.u-expression-editor__shell--large .u-expression-editor__container {
|
|
83
|
+
font-size: var(--u-font-size-main-large);
|
|
84
|
+
}
|
|
51
85
|
.u-expression-editor__placeholder {
|
|
52
86
|
position: absolute;
|
|
87
|
+
top: 0;
|
|
88
|
+
left: 0;
|
|
53
89
|
color: var(--u-text-color-placeholder);
|
|
54
90
|
pointer-events: none;
|
|
55
91
|
user-select: none;
|
|
56
92
|
transition: opacity 0.2s ease;
|
|
57
93
|
font-weight: 400;
|
|
58
94
|
}
|
|
95
|
+
.u-expression-editor__body {
|
|
96
|
+
position: relative;
|
|
97
|
+
}
|
|
98
|
+
.u-expression-editor__hint {
|
|
99
|
+
font-size: var(--u-font-size-main-small);
|
|
100
|
+
color: var(--u-text-color-placeholder);
|
|
101
|
+
user-select: none;
|
|
102
|
+
margin-bottom: 4px;
|
|
103
|
+
}
|
|
104
|
+
.u-expression-editor__mention-anchor {
|
|
105
|
+
position: absolute;
|
|
106
|
+
width: 0;
|
|
107
|
+
height: 0;
|
|
108
|
+
pointer-events: none;
|
|
109
|
+
}
|
|
110
|
+
.u-expression-editor__hint kbd, .u-expression-editor__picker-hint kbd {
|
|
111
|
+
display: inline-block;
|
|
112
|
+
min-width: 18px;
|
|
113
|
+
padding: 1px 4px;
|
|
114
|
+
border: var(--u-border);
|
|
115
|
+
border-radius: var(--u-radius-small);
|
|
116
|
+
font-size: 11px;
|
|
117
|
+
line-height: 1.4;
|
|
118
|
+
text-align: center;
|
|
119
|
+
color: var(--u-text-color-second);
|
|
120
|
+
background-color: var(--u-bg-color-top);
|
|
121
|
+
}
|
|
59
122
|
.u-expression-editor__container {
|
|
60
123
|
position: relative;
|
|
61
124
|
outline: none;
|
|
@@ -100,50 +163,58 @@
|
|
|
100
163
|
pointer-events: none;
|
|
101
164
|
}
|
|
102
165
|
.u-expression-editor__picker {
|
|
103
|
-
|
|
166
|
+
margin: calc(var(--u-gap-default) * -1);
|
|
167
|
+
min-width: 240px;
|
|
168
|
+
display: flex;
|
|
169
|
+
flex-direction: column;
|
|
170
|
+
overflow: hidden;
|
|
104
171
|
background-color: var(--u-bg-color-top);
|
|
172
|
+
border: var(--u-border);
|
|
173
|
+
border-radius: var(--u-radius-default);
|
|
174
|
+
backdrop-filter: var(--u-bg-filter);
|
|
175
|
+
-webkit-backdrop-filter: var(--u-bg-filter);
|
|
105
176
|
}
|
|
106
177
|
.u-expression-editor__picker-body {
|
|
178
|
+
flex: 1 1 auto;
|
|
179
|
+
min-height: 0;
|
|
107
180
|
display: flex;
|
|
108
181
|
align-items: stretch;
|
|
109
|
-
min-height: 200px;
|
|
110
182
|
}
|
|
111
183
|
.u-expression-editor__panel {
|
|
112
184
|
flex: 1 1 auto;
|
|
113
185
|
min-width: 0;
|
|
114
186
|
max-height: 320px;
|
|
187
|
+
display: flex;
|
|
188
|
+
flex-direction: column;
|
|
115
189
|
}
|
|
116
190
|
.u-expression-editor__panel-list {
|
|
117
|
-
|
|
118
|
-
min-height:
|
|
191
|
+
flex: 1 1 auto;
|
|
192
|
+
min-height: 0;
|
|
119
193
|
}
|
|
120
194
|
.u-expression-editor__panel-content {
|
|
121
|
-
padding: 4px
|
|
195
|
+
padding: 4px;
|
|
122
196
|
}
|
|
123
197
|
.u-expression-editor__item {
|
|
124
|
-
padding: 6px 12px;
|
|
125
|
-
cursor: pointer;
|
|
126
|
-
user-select: none;
|
|
127
198
|
display: flex;
|
|
128
199
|
align-items: center;
|
|
129
200
|
justify-content: space-between;
|
|
130
|
-
gap:
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
font-size: 13px;
|
|
134
|
-
line-height: 1.4;
|
|
201
|
+
gap: var(--u-gap-default);
|
|
202
|
+
height: var(--u-form-component-height-default);
|
|
203
|
+
padding: 0 var(--u-gap-default);
|
|
135
204
|
border-radius: var(--u-radius-small);
|
|
136
|
-
|
|
205
|
+
font-size: var(--u-font-size-main-default);
|
|
206
|
+
color: var(--u-text-color-main);
|
|
207
|
+
cursor: pointer;
|
|
208
|
+
user-select: none;
|
|
209
|
+
transition: background-color 0.15s ease, color 0.15s ease;
|
|
137
210
|
}
|
|
138
211
|
.u-expression-editor__item.is-active {
|
|
139
|
-
background-color: var(--u-color-
|
|
140
|
-
color: var(--u-text-color-
|
|
141
|
-
}
|
|
142
|
-
.u-expression-editor__item.is-active .u-expression-editor__item-expand {
|
|
143
|
-
color: var(--u-text-color-white);
|
|
212
|
+
background-color: var(--u-bg-color-hover);
|
|
213
|
+
color: var(--u-text-color-title);
|
|
144
214
|
}
|
|
145
215
|
.u-expression-editor__item-label {
|
|
146
216
|
flex: 1;
|
|
217
|
+
min-width: 0;
|
|
147
218
|
overflow: hidden;
|
|
148
219
|
text-overflow: ellipsis;
|
|
149
220
|
white-space: nowrap;
|
|
@@ -152,31 +223,59 @@
|
|
|
152
223
|
flex-shrink: 0;
|
|
153
224
|
color: var(--u-text-color-placeholder);
|
|
154
225
|
font-size: 12px;
|
|
226
|
+
box-sizing: content-box;
|
|
227
|
+
padding: 6px;
|
|
228
|
+
margin: -6px;
|
|
229
|
+
border-radius: var(--u-radius-small);
|
|
230
|
+
cursor: pointer;
|
|
231
|
+
transition: color 0.15s ease, background-color 0.15s ease;
|
|
232
|
+
}
|
|
233
|
+
.u-expression-editor__item-expand:hover {
|
|
234
|
+
color: var(--u-color-primary);
|
|
235
|
+
background-color: var(--u-bg-color-hover);
|
|
155
236
|
}
|
|
156
237
|
.u-expression-editor__empty {
|
|
157
238
|
flex: 1;
|
|
158
239
|
padding: 32px 16px;
|
|
159
240
|
text-align: center;
|
|
160
241
|
}
|
|
161
|
-
.u-expression-
|
|
242
|
+
.u-expression-editor__picker-hint {
|
|
162
243
|
display: flex;
|
|
163
244
|
align-items: center;
|
|
164
245
|
flex-wrap: wrap;
|
|
246
|
+
gap: 4px 12px;
|
|
165
247
|
padding: 6px 10px;
|
|
248
|
+
border-top: var(--u-border);
|
|
249
|
+
font-size: var(--u-font-size-main-small);
|
|
250
|
+
color: var(--u-text-color-placeholder);
|
|
251
|
+
user-select: none;
|
|
252
|
+
}
|
|
253
|
+
.u-expression-editor__picker-hint span {
|
|
254
|
+
display: inline-flex;
|
|
255
|
+
align-items: center;
|
|
256
|
+
gap: 3px;
|
|
257
|
+
}
|
|
258
|
+
.u-expression-editor__breadcrumbs {
|
|
259
|
+
display: flex;
|
|
260
|
+
align-items: center;
|
|
261
|
+
flex-wrap: wrap;
|
|
262
|
+
gap: 2px;
|
|
263
|
+
padding: 6px 8px;
|
|
264
|
+
background-color: var(--u-bg-color-middle);
|
|
166
265
|
border-bottom: var(--u-border);
|
|
167
|
-
font-size:
|
|
266
|
+
font-size: var(--u-font-size-main-small);
|
|
168
267
|
color: var(--u-text-color-second);
|
|
169
268
|
}
|
|
170
269
|
.u-expression-editor__breadcrumb-item {
|
|
171
270
|
display: inline-flex;
|
|
172
271
|
align-items: center;
|
|
173
|
-
gap:
|
|
272
|
+
gap: 2px;
|
|
174
273
|
}
|
|
175
274
|
.u-expression-editor__breadcrumb-link {
|
|
176
|
-
|
|
177
|
-
transition: color 0.12s ease, background-color 0.12s ease;
|
|
178
|
-
padding: 2px 6px;
|
|
275
|
+
padding: 3px 6px;
|
|
179
276
|
border-radius: var(--u-radius-small);
|
|
277
|
+
cursor: pointer;
|
|
278
|
+
transition: color 0.15s ease, background-color 0.15s ease;
|
|
180
279
|
}
|
|
181
280
|
.u-expression-editor__breadcrumb-link:hover {
|
|
182
281
|
color: var(--u-color-primary);
|
|
@@ -187,7 +286,7 @@
|
|
|
187
286
|
font-weight: 600;
|
|
188
287
|
}
|
|
189
288
|
.u-expression-editor__breadcrumb-separator {
|
|
190
|
-
font-size:
|
|
289
|
+
font-size: 12px;
|
|
191
290
|
color: var(--u-text-color-placeholder);
|
|
192
291
|
}
|
|
193
292
|
.u-expression-editor__path-preview {
|
|
@@ -195,7 +294,7 @@
|
|
|
195
294
|
border-left: var(--u-border);
|
|
196
295
|
padding: 8px 12px;
|
|
197
296
|
background-color: var(--u-bg-color-middle);
|
|
198
|
-
font-size:
|
|
297
|
+
font-size: var(--u-font-size-main-small);
|
|
199
298
|
}
|
|
200
299
|
.u-expression-editor__path-preview-title {
|
|
201
300
|
color: var(--u-text-color-second);
|
|
@@ -213,52 +312,15 @@
|
|
|
213
312
|
gap: 4px;
|
|
214
313
|
line-height: 1.6;
|
|
215
314
|
color: var(--u-text-color-main);
|
|
315
|
+
padding-left: calc(var(--depth, 0) * 12px);
|
|
216
316
|
}
|
|
217
317
|
.u-expression-editor__path-tree-item.is-active {
|
|
218
318
|
color: var(--u-color-primary);
|
|
219
319
|
font-weight: 600;
|
|
220
320
|
}
|
|
221
|
-
.u-expression-editor__path-tree-branch {
|
|
222
|
-
color: var(--u-text-color-placeholder);
|
|
223
|
-
}
|
|
224
321
|
.u-expression-editor__path-tree-label {
|
|
322
|
+
min-width: 0;
|
|
225
323
|
overflow: hidden;
|
|
226
324
|
text-overflow: ellipsis;
|
|
227
325
|
white-space: nowrap;
|
|
228
326
|
}
|
|
229
|
-
.u-expression-editor--small {
|
|
230
|
-
min-height: var(--u-form-component-height-small);
|
|
231
|
-
padding: var(--u-gap-small);
|
|
232
|
-
}
|
|
233
|
-
.u-expression-editor--small .u-expression-editor__placeholder {
|
|
234
|
-
top: var(--u-gap-small);
|
|
235
|
-
left: var(--u-gap-small);
|
|
236
|
-
font-size: var(--u-font-size-main-small);
|
|
237
|
-
}
|
|
238
|
-
.u-expression-editor--small .u-expression-editor__container {
|
|
239
|
-
font-size: var(--u-font-size-main-small);
|
|
240
|
-
}
|
|
241
|
-
.u-expression-editor--default {
|
|
242
|
-
min-height: var(--u-form-component-height-default);
|
|
243
|
-
padding: var(--u-gap-default);
|
|
244
|
-
}
|
|
245
|
-
.u-expression-editor--default .u-expression-editor__placeholder {
|
|
246
|
-
top: var(--u-gap-default);
|
|
247
|
-
left: var(--u-gap-default);
|
|
248
|
-
font-size: var(--u-font-size-main-default);
|
|
249
|
-
}
|
|
250
|
-
.u-expression-editor--default .u-expression-editor__container {
|
|
251
|
-
font-size: var(--u-font-size-main-default);
|
|
252
|
-
}
|
|
253
|
-
.u-expression-editor--large {
|
|
254
|
-
min-height: var(--u-form-component-height-large);
|
|
255
|
-
padding: var(--u-gap-large);
|
|
256
|
-
}
|
|
257
|
-
.u-expression-editor--large .u-expression-editor__placeholder {
|
|
258
|
-
top: var(--u-gap-large);
|
|
259
|
-
left: var(--u-gap-large);
|
|
260
|
-
font-size: var(--u-font-size-main-large);
|
|
261
|
-
}
|
|
262
|
-
.u-expression-editor--large .u-expression-editor__container {
|
|
263
|
-
font-size: var(--u-font-size-main-large);
|
|
264
|
-
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form.js","names":[],"sources":["../../../src/components/form/form.vue"],"sourcesContent":["<template>\n <u-grid\n tag=\"form\"\n ref=\"grid\"\n @submit.prevent\n
|
|
1
|
+
{"version":3,"file":"form.js","names":[],"sources":["../../../src/components/form/form.vue"],"sourcesContent":["<template>\n <u-grid\n tag=\"form\"\n ref=\"grid\"\n @submit.prevent\n :cols=\"cols || breakpointCols\"\n :class=\"[cls.b, bem.is('readonly', readonly)]\"\n >\n <template\n v-for=\"{ node, isFormItem, formItemProps, field, modelValue, renderKey } of getSlotsNodes()\"\n :key=\"renderKey\"\n >\n <u-form-item v-if=\"!isFormItem && field\" v-bind=\"formItemProps\">\n <component\n :is=\"node\"\n :model-value=\"modelValue ?? o(model ?? {}).get(field)\"\n @update:model-value=\"handleUpdateValue(field, $event)\"\n />\n <div v-if=\"shouldShowModified(field)\" :class=\"cls.e('data-before')\">\n <span :class=\"cls.e('changed-tag')\">{{ modifiedLabel }}</span>\n <component :is=\"createModifiedPreview(node, field)\" />\n </div>\n </u-form-item>\n\n <component v-else :is=\"node\" />\n </template>\n </u-grid>\n</template>\n\n<script lang=\"tsx\" setup>\nimport { o } from '@cat-kit/core'\nimport { bem } from '@veltra/utils'\nimport { provideFormContext } from '@veltra/utils'\nimport { nextTick, toRef, useTemplateRef, type VNode } from 'vue'\n\nimport type { BreakCols, FormProps, _FormExposed, FormEmits } from '../../types'\nimport { UFormItem } from '../form-item'\nimport { UGrid } from '../grid'\nimport { isFieldModified } from './is-field-modified'\nimport { useFormFields } from './use-form-fields'\nimport { forkUnmountedVNode, useNodeInterceptor } from './use-node-interceptor'\n\ndefineOptions({ name: 'UForm' })\n\nconst props = withDefaults(defineProps<FormProps>(), { modifiedLabel: '变更前:' })\n\nconst emit = defineEmits<FormEmits>()\n\ndefineSlots<{ default(props?: { data: Record<string, any> | undefined }): any }>()\n\nconst cls = bem('form')\nconst formItemCls = bem('form-item')\nconst gridRef = useTemplateRef('grid')\n\nconst breakpointCols: BreakCols = { xs: 1, md: 2, lg: 3, xl: 4, default: 4 }\n\nconst {\n validate: runValidate,\n clearValidate,\n reset,\n registerField,\n unregisterField,\n shouldValidate,\n getBaselineModel\n} = useFormFields({ props })\n\nasync function validate(keys?: string[]) {\n const valid = await runValidate(keys)\n if (!valid) {\n await nextTick()\n\n gridRef.value?.el\n ?.querySelector(`.${formItemCls.e('error-text')}`)\n ?.scrollIntoView({ block: 'center' })\n }\n return valid\n}\n\nfunction handleFieldUpdate(field: string, value: any) {\n emit('field:update', field, value)\n}\n\nprovideFormContext({\n formProps: props,\n registerField,\n unregisterField,\n validateFields: validate,\n shouldValidate,\n handleFieldUpdate\n})\n\nconst { getSlotsNodes } = useNodeInterceptor()\n\nfunction handleUpdateValue(field: string, value: any) {\n if (!props.model) return\n o(props.model).set(field, value)\n}\n\nfunction getBaselineFieldValue(field: string) {\n return o(getBaselineModel() ?? {}).get(field)\n}\n\nfunction createModifiedPreview(node: VNode, field: string) {\n return forkUnmountedVNode(node, { readonly: true, modelValue: getBaselineFieldValue(field) })\n}\n\nfunction shouldShowModified(field: string) {\n if (!props.showModified) return false\n const baseline = getBaselineModel()\n if (!baseline || !props.model) return false\n const current = o(props.model).get(field)\n const initial = o(baseline).get(field)\n return isFieldModified(current, initial)\n}\n\ndefineExpose<_FormExposed>({ el: toRef(() => gridRef.value?.el), validate, clearValidate, reset })\n</script>\n"],"mappings":""}
|
|
@@ -90,7 +90,6 @@ var form_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCompo
|
|
|
90
90
|
tag: "form",
|
|
91
91
|
ref: "grid",
|
|
92
92
|
onSubmit: _cache[0] || (_cache[0] = withModifiers(() => {}, ["prevent"])),
|
|
93
|
-
gap: "0 12px",
|
|
94
93
|
cols: __props.cols || breakpointCols,
|
|
95
94
|
class: normalizeClass([unref(cls).b, unref(bem).is("readonly", __props.readonly)])
|
|
96
95
|
}, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/form/form.vue"],"sourcesContent":["<template>\n <u-grid\n tag=\"form\"\n ref=\"grid\"\n @submit.prevent\n
|
|
1
|
+
{"version":3,"file":"form.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/form/form.vue"],"sourcesContent":["<template>\n <u-grid\n tag=\"form\"\n ref=\"grid\"\n @submit.prevent\n :cols=\"cols || breakpointCols\"\n :class=\"[cls.b, bem.is('readonly', readonly)]\"\n >\n <template\n v-for=\"{ node, isFormItem, formItemProps, field, modelValue, renderKey } of getSlotsNodes()\"\n :key=\"renderKey\"\n >\n <u-form-item v-if=\"!isFormItem && field\" v-bind=\"formItemProps\">\n <component\n :is=\"node\"\n :model-value=\"modelValue ?? o(model ?? {}).get(field)\"\n @update:model-value=\"handleUpdateValue(field, $event)\"\n />\n <div v-if=\"shouldShowModified(field)\" :class=\"cls.e('data-before')\">\n <span :class=\"cls.e('changed-tag')\">{{ modifiedLabel }}</span>\n <component :is=\"createModifiedPreview(node, field)\" />\n </div>\n </u-form-item>\n\n <component v-else :is=\"node\" />\n </template>\n </u-grid>\n</template>\n\n<script lang=\"tsx\" setup>\nimport { o } from '@cat-kit/core'\nimport { bem } from '@veltra/utils'\nimport { provideFormContext } from '@veltra/utils'\nimport { nextTick, toRef, useTemplateRef, type VNode } from 'vue'\n\nimport type { BreakCols, FormProps, _FormExposed, FormEmits } from '../../types'\nimport { UFormItem } from '../form-item'\nimport { UGrid } from '../grid'\nimport { isFieldModified } from './is-field-modified'\nimport { useFormFields } from './use-form-fields'\nimport { forkUnmountedVNode, useNodeInterceptor } from './use-node-interceptor'\n\ndefineOptions({ name: 'UForm' })\n\nconst props = withDefaults(defineProps<FormProps>(), { modifiedLabel: '变更前:' })\n\nconst emit = defineEmits<FormEmits>()\n\ndefineSlots<{ default(props?: { data: Record<string, any> | undefined }): any }>()\n\nconst cls = bem('form')\nconst formItemCls = bem('form-item')\nconst gridRef = useTemplateRef('grid')\n\nconst breakpointCols: BreakCols = { xs: 1, md: 2, lg: 3, xl: 4, default: 4 }\n\nconst {\n validate: runValidate,\n clearValidate,\n reset,\n registerField,\n unregisterField,\n shouldValidate,\n getBaselineModel\n} = useFormFields({ props })\n\nasync function validate(keys?: string[]) {\n const valid = await runValidate(keys)\n if (!valid) {\n await nextTick()\n\n gridRef.value?.el\n ?.querySelector(`.${formItemCls.e('error-text')}`)\n ?.scrollIntoView({ block: 'center' })\n }\n return valid\n}\n\nfunction handleFieldUpdate(field: string, value: any) {\n emit('field:update', field, value)\n}\n\nprovideFormContext({\n formProps: props,\n registerField,\n unregisterField,\n validateFields: validate,\n shouldValidate,\n handleFieldUpdate\n})\n\nconst { getSlotsNodes } = useNodeInterceptor()\n\nfunction handleUpdateValue(field: string, value: any) {\n if (!props.model) return\n o(props.model).set(field, value)\n}\n\nfunction getBaselineFieldValue(field: string) {\n return o(getBaselineModel() ?? {}).get(field)\n}\n\nfunction createModifiedPreview(node: VNode, field: string) {\n return forkUnmountedVNode(node, { readonly: true, modelValue: getBaselineFieldValue(field) })\n}\n\nfunction shouldShowModified(field: string) {\n if (!props.showModified) return false\n const baseline = getBaselineModel()\n if (!baseline || !props.model) return false\n const current = o(props.model).get(field)\n const initial = o(baseline).get(field)\n return isFieldModified(current, initial)\n}\n\ndefineExpose<_FormExposed>({ el: toRef(() => gridRef.value?.el), validate, clearValidate, reset })\n</script>\n"],"mappings":"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"}
|
|
@@ -15,15 +15,20 @@
|
|
|
15
15
|
* --u-height-small: 24px;
|
|
16
16
|
*/
|
|
17
17
|
/** 暗色:`UITheme.render()` 按主题系列写入 html[data-theme] */
|
|
18
|
+
.u-form {
|
|
19
|
+
gap: 0 12px;
|
|
20
|
+
}
|
|
18
21
|
.u-form.is-readonly {
|
|
19
|
-
gap:
|
|
22
|
+
gap: 10px 12px;
|
|
20
23
|
}
|
|
21
24
|
.u-form.is-readonly .u-form-item__label {
|
|
22
|
-
|
|
25
|
+
color: var(--u-text-color-second);
|
|
23
26
|
}
|
|
24
27
|
.u-form.is-readonly .u-form-item__content {
|
|
28
|
+
padding: 4px 12px;
|
|
29
|
+
color: var(--u-text-color-main);
|
|
25
30
|
background-color: var(--u-bg-color-middle);
|
|
26
|
-
|
|
31
|
+
border-radius: var(--u-radius-default);
|
|
27
32
|
}
|
|
28
33
|
.u-form__data-before {
|
|
29
34
|
display: flex;
|
|
@@ -4,33 +4,33 @@ import _sfc_main$2 from "./scroll/scroll.js";
|
|
|
4
4
|
import _sfc_main$3 from "./tip/tip.js";
|
|
5
5
|
import _sfc_main$4 from "./dropdown/dropdown.js";
|
|
6
6
|
import input_default from "./input/input.js";
|
|
7
|
-
import _sfc_main$5 from "./
|
|
8
|
-
import _sfc_main$6 from "./
|
|
9
|
-
import _sfc_main$7 from "./
|
|
10
|
-
import _sfc_main$8 from "./tabs/tabs-
|
|
11
|
-
import _sfc_main$9 from "./tabs/tabs.js";
|
|
12
|
-
import _sfc_main$10 from "./
|
|
13
|
-
import _sfc_main$11 from "./
|
|
14
|
-
import _sfc_main$12 from "./tree
|
|
15
|
-
import _sfc_main$13 from "./
|
|
16
|
-
import _sfc_main$14 from "./
|
|
17
|
-
import _sfc_main$15 from "./
|
|
18
|
-
import _sfc_main$16 from "./grid/grid
|
|
7
|
+
import _sfc_main$5 from "./loading/loading.js";
|
|
8
|
+
import _sfc_main$6 from "./select/select.js";
|
|
9
|
+
import _sfc_main$7 from "./condition-editor/condition-editor.js";
|
|
10
|
+
import _sfc_main$8 from "./tabs/tabs-horizontal.js";
|
|
11
|
+
import _sfc_main$9 from "./tabs/tabs-vertical.js";
|
|
12
|
+
import _sfc_main$10 from "./tabs/tabs.js";
|
|
13
|
+
import _sfc_main$11 from "./checkbox/checkbox.js";
|
|
14
|
+
import _sfc_main$12 from "./tree/tree.js";
|
|
15
|
+
import _sfc_main$13 from "./tree-select/tree-select.js";
|
|
16
|
+
import _sfc_main$14 from "./code-editor/code-editor.js";
|
|
17
|
+
import _sfc_main$15 from "./drawer/drawer.js";
|
|
18
|
+
import _sfc_main$16 from "./grid/grid.js";
|
|
19
|
+
import _sfc_main$17 from "./grid/grid-item.js";
|
|
19
20
|
import form_item_default from "./form-item/form-item.js";
|
|
20
21
|
import form_default from "./form/form.js";
|
|
21
|
-
import _sfc_main$
|
|
22
|
-
import _sfc_main$
|
|
23
|
-
import _sfc_main$
|
|
24
|
-
import _sfc_main$
|
|
25
|
-
import _sfc_main$
|
|
26
|
-
import _sfc_main$
|
|
27
|
-
import _sfc_main$
|
|
28
|
-
import _sfc_main$
|
|
29
|
-
import _sfc_main$
|
|
30
|
-
import _sfc_main$
|
|
31
|
-
import _sfc_main$
|
|
32
|
-
import _sfc_main$
|
|
33
|
-
import _sfc_main$29 from "./loading/loading.js";
|
|
22
|
+
import _sfc_main$18 from "./button/button.js";
|
|
23
|
+
import _sfc_main$19 from "./button/button-group.js";
|
|
24
|
+
import _sfc_main$20 from "./message-confirm/message-confirm.js";
|
|
25
|
+
import _sfc_main$21 from "./calendar/calendar.js";
|
|
26
|
+
import _sfc_main$22 from "./radio/radio.js";
|
|
27
|
+
import _sfc_main$23 from "./card/card.js";
|
|
28
|
+
import _sfc_main$24 from "./card/card-header.js";
|
|
29
|
+
import _sfc_main$25 from "./card/card-cover.js";
|
|
30
|
+
import _sfc_main$26 from "./card/card-content.js";
|
|
31
|
+
import _sfc_main$27 from "./card/card-action.js";
|
|
32
|
+
import _sfc_main$28 from "./date-panel/date-panel.js";
|
|
33
|
+
import _sfc_main$29 from "./date-range-picker/date-range-picker.js";
|
|
34
34
|
import _sfc_main$30 from "./progress-nodes/progress-nodes.js";
|
|
35
35
|
import _sfc_main$31 from "./auto-complete/auto-complete.js";
|
|
36
36
|
import _sfc_main$32 from "./progress/progress.js";
|
|
@@ -108,4 +108,4 @@ import { defineBatchEditColumns } from "./batch-edit/helper.js";
|
|
|
108
108
|
import "./batch-edit/index.js";
|
|
109
109
|
import { defineTableColumns } from "./table/use-columns.js";
|
|
110
110
|
import "./table/index.js";
|
|
111
|
-
export { type EvaluateOptions as ConditionEvaluateOptions, ContextmenuPanelDIKey, ContextmenuRootDIKey, _sfc_main$57 as UAction, action_group_default as UActionGroup, _sfc_main$31 as UAutoComplete, _sfc_main$84 as UBadge, _sfc_main$58 as UBatchEdit, _sfc_main$81 as UBreadcrumb, _sfc_main$
|
|
111
|
+
export { type EvaluateOptions as ConditionEvaluateOptions, ContextmenuPanelDIKey, ContextmenuRootDIKey, _sfc_main$57 as UAction, action_group_default as UActionGroup, _sfc_main$31 as UAutoComplete, _sfc_main$84 as UBadge, _sfc_main$58 as UBatchEdit, _sfc_main$81 as UBreadcrumb, _sfc_main$18 as UButton, _sfc_main$19 as UButtonGroup, _sfc_main$21 as UCalendar, _sfc_main$23 as UCard, _sfc_main$27 as UCardAction, _sfc_main$26 as UCardContent, _sfc_main$25 as UCardCover, _sfc_main$24 as UCardHeader, _sfc_main$60 as UCascade, _sfc_main$48 as UCheckTag, _sfc_main$11 as UCheckbox, _sfc_main$36 as UCheckboxButton, _sfc_main$78 as UCheckboxGroup, _sfc_main$14 as UCodeEditor, _sfc_main$44 as UCollapse, _sfc_main$45 as UCollapseItem, _sfc_main$7 as UConditionEditor, _sfc_main$49 as UContextmenu, _sfc_main$28 as UDatePanel, _sfc_main$62 as UDatePicker, _sfc_main$29 as UDateRangePicker, _sfc_main$52 as UDialog, _sfc_main$15 as UDrawer, _sfc_main$4 as UDropdown, _sfc_main$73 as UDualNav, _sfc_main$1 as UEmpty, _sfc_main$53 as UExpressionEditor, _sfc_main$41 as UFilePicker, _sfc_main$79 as UFileViewer, _sfc_main$83 as UFloatButton, form_default as UForm, form_item_default as UFormItem, _sfc_main$39 as UGanttChart, _sfc_main$16 as UGrid, _sfc_main$75 as UGridInput, _sfc_main$17 as UGridItem, _sfc_main$66 as UGroupInput, _sfc_main$74 as UGroupNav, _sfc_main as UIcon, _sfc_main$86 as UImageCropper, input_default as UInput, _sfc_main$55 as UKbd, _sfc_main$34 as ULayout, _sfc_main$67 as UList, _sfc_main$68 as UListItem, _sfc_main$5 as ULoading, _sfc_main$40 as UMessage, _sfc_main$20 as UMessageConfirm, _sfc_main$37 as UMultiSelect, _sfc_main$65 as UMultiTreeSelect, _sfc_main$72 as UNav, _sfc_main$70 as UNavItem, _sfc_main$71 as UNavSub, NodeRender as UNodeRender, _sfc_main$33 as UNotification, _sfc_main$51 as UNumber, _sfc_main$42 as UNumberInput, _sfc_main$43 as UNumberRangeInput, _sfc_main$82 as UPaginator, _sfc_main$63 as UPalette, _sfc_main$50 as UPasswordInput, _sfc_main$56 as UPopConfirm, _sfc_main$32 as UProgress, _sfc_main$30 as UProgressNodes, _sfc_main$22 as URadio, _sfc_main$77 as URadioGroup, _sfc_main$69 as URichTextEditor, _sfc_main$2 as UScroll, _sfc_main$85 as USegment, _sfc_main$6 as USelect, _sfc_main$38 as USlider, _sfc_main$61 as USteps, _sfc_main$76 as USwitch, _sfc_main$46 as UTable, _sfc_main$47 as UTableEditor, _sfc_main$10 as UTabs, _sfc_main$8 as UTabsHorizontal, _sfc_main$9 as UTabsVertical, _sfc_main$35 as UTag, _sfc_main$80 as UText, _sfc_main$59 as UTextarea, _sfc_main$64 as UTheme, _sfc_main$3 as UTip, _sfc_main$12 as UTree, _sfc_main$13 as UTreeSelect, _sfc_main$54 as UWatermark, contextmenu, createEmptyGroup, createEmptyLeaf, defineBatchEditColumns, defineTableColumns, evaluate as evaluateConditionExpression, message, messageConfirm, notification, vLoading };
|