@hbdlzy/ui-core 0.1.5 → 0.1.6
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/components.manifest.json +21 -0
- package/dist/components/OutlinedCascader/OutlinedCascader.types.d.ts +3 -0
- package/dist/components/OutlinedCascader/OutlinedCascader.vue.d.ts +9 -0
- package/dist/components/OutlinedDatePicker/OutlinedDatePicker.types.d.ts +3 -0
- package/dist/components/OutlinedDatePicker/OutlinedDatePicker.vue.d.ts +9 -0
- package/dist/components/OutlinedDateTimePicker/OutlinedDateTimePicker.types.d.ts +3 -0
- package/dist/components/OutlinedDateTimePicker/OutlinedDateTimePicker.vue.d.ts +9 -0
- package/dist/components/OutlinedInput/OutlinedInput.types.d.ts +3 -0
- package/dist/components/OutlinedInput/OutlinedInput.vue.d.ts +9 -0
- package/dist/components/OutlinedSelect/OutlinedSelect.types.d.ts +3 -0
- package/dist/components/OutlinedSelect/OutlinedSelect.vue.d.ts +9 -0
- package/dist/components/OutlinedTimePicker/OutlinedTimePicker.types.d.ts +3 -0
- package/dist/components/OutlinedTimePicker/OutlinedTimePicker.vue.d.ts +9 -0
- package/dist/components/OutlinedTreeSelect/OutlinedTreeSelect.types.d.ts +3 -0
- package/dist/components/OutlinedTreeSelect/OutlinedTreeSelect.vue.d.ts +9 -0
- package/dist/index.cjs +5 -5
- package/dist/index.js +339 -121
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/components/OutlinedCascader/OutlinedCascader.types.ts +3 -0
- package/src/components/OutlinedCascader/OutlinedCascader.vue +71 -6
- package/src/components/OutlinedCascader/README.md +3 -0
- package/src/components/OutlinedDatePicker/OutlinedDatePicker.types.ts +3 -0
- package/src/components/OutlinedDatePicker/OutlinedDatePicker.vue +71 -6
- package/src/components/OutlinedDatePicker/README.md +3 -0
- package/src/components/OutlinedDateTimePicker/OutlinedDateTimePicker.types.ts +3 -0
- package/src/components/OutlinedDateTimePicker/OutlinedDateTimePicker.vue +144 -64
- package/src/components/OutlinedDateTimePicker/README.md +3 -0
- package/src/components/OutlinedInput/OutlinedInput.types.ts +3 -0
- package/src/components/OutlinedInput/OutlinedInput.vue +87 -8
- package/src/components/OutlinedInput/README.md +3 -0
- package/src/components/OutlinedSelect/OutlinedSelect.types.ts +3 -0
- package/src/components/OutlinedSelect/OutlinedSelect.vue +72 -6
- package/src/components/OutlinedSelect/README.md +3 -0
- package/src/components/OutlinedTimePicker/OutlinedTimePicker.types.ts +3 -0
- package/src/components/OutlinedTimePicker/OutlinedTimePicker.vue +75 -8
- package/src/components/OutlinedTimePicker/README.md +3 -0
- package/src/components/OutlinedTreeSelect/OutlinedTreeSelect.types.ts +3 -0
- package/src/components/OutlinedTreeSelect/OutlinedTreeSelect.vue +72 -6
- package/src/components/OutlinedTreeSelect/README.md +3 -0
|
@@ -12,14 +12,15 @@
|
|
|
12
12
|
:is-range="isRange"
|
|
13
13
|
:format="format"
|
|
14
14
|
:value-format="resolvedValueFormat"
|
|
15
|
-
:placeholder="
|
|
16
|
-
:start-placeholder="
|
|
17
|
-
:end-placeholder="
|
|
15
|
+
:placeholder="controlPlaceholder"
|
|
16
|
+
:start-placeholder="controlStartPlaceholder"
|
|
17
|
+
:end-placeholder="controlEndPlaceholder"
|
|
18
18
|
:range-separator="rangeSeparator"
|
|
19
19
|
:disabled="disabled"
|
|
20
20
|
:clearable="clearable"
|
|
21
21
|
:arrow-control="arrowControl"
|
|
22
22
|
:style="pickerStyle"
|
|
23
|
+
:aria-invalid="hasError ? 'true' : undefined"
|
|
23
24
|
@update:model-value="handleModelValueUpdate"
|
|
24
25
|
@focus="handleFocus"
|
|
25
26
|
@blur="handleBlur"
|
|
@@ -33,8 +34,19 @@
|
|
|
33
34
|
class="outlined-time-picker__label"
|
|
34
35
|
:class="labelClasses"
|
|
35
36
|
>
|
|
36
|
-
|
|
37
|
+
<span
|
|
38
|
+
v-if="required"
|
|
39
|
+
class="outlined-time-picker__required"
|
|
40
|
+
>*</span>
|
|
41
|
+
<span>{{ floatingLabel }}</span>
|
|
37
42
|
</div>
|
|
43
|
+
|
|
44
|
+
<p
|
|
45
|
+
v-if="hasError"
|
|
46
|
+
class="outlined-time-picker__error"
|
|
47
|
+
>
|
|
48
|
+
{{ resolvedErrorMessage }}
|
|
49
|
+
</p>
|
|
38
50
|
</div>
|
|
39
51
|
</template>
|
|
40
52
|
|
|
@@ -68,7 +80,10 @@ const props = withDefaults(defineProps<OutlinedTimePickerProps>(), {
|
|
|
68
80
|
inputHeight: 40,
|
|
69
81
|
isBorder: false,
|
|
70
82
|
marginBottom: 20,
|
|
71
|
-
paddingTop: 20
|
|
83
|
+
paddingTop: 20,
|
|
84
|
+
required: false,
|
|
85
|
+
error: false,
|
|
86
|
+
errorMessage: ''
|
|
72
87
|
})
|
|
73
88
|
|
|
74
89
|
const emit = defineEmits<{
|
|
@@ -106,7 +121,8 @@ const pickerAttrs = computed(() => {
|
|
|
106
121
|
})
|
|
107
122
|
|
|
108
123
|
const containerClasses = computed(() => ({
|
|
109
|
-
'outlined-time-picker--bordered': props.isBorder
|
|
124
|
+
'outlined-time-picker--bordered': props.isBorder,
|
|
125
|
+
'outlined-time-picker--error': hasError.value
|
|
110
126
|
}))
|
|
111
127
|
|
|
112
128
|
const containerStyle = computed(() => ({
|
|
@@ -119,6 +135,11 @@ const pickerStyle = computed(() => ({
|
|
|
119
135
|
}))
|
|
120
136
|
|
|
121
137
|
const floatingLabel = computed(() => props.label || props.placeholder || '')
|
|
138
|
+
const controlPlaceholder = computed(() => addRequiredMark(props.placeholder))
|
|
139
|
+
const controlStartPlaceholder = computed(() => addRequiredMark(props.startPlaceholder))
|
|
140
|
+
const controlEndPlaceholder = computed(() => addRequiredMark(props.endPlaceholder))
|
|
141
|
+
const hasError = computed(() => Boolean(props.error))
|
|
142
|
+
const resolvedErrorMessage = computed(() => props.errorMessage || createRequiredMessage(floatingLabel.value))
|
|
122
143
|
|
|
123
144
|
const hasContent = computed(() => {
|
|
124
145
|
if (Array.isArray(pickerValue.value)) {
|
|
@@ -210,6 +231,18 @@ function toCssValue(value: OutlinedTimePickerCssValue | undefined) {
|
|
|
210
231
|
return value
|
|
211
232
|
}
|
|
212
233
|
|
|
234
|
+
function addRequiredMark(value: string) {
|
|
235
|
+
if (!props.required || !value || value.startsWith('*')) {
|
|
236
|
+
return value
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return `*${value}`
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function createRequiredMessage(label: string) {
|
|
243
|
+
return label ? `${label}为必填项` : '该项为必填项'
|
|
244
|
+
}
|
|
245
|
+
|
|
213
246
|
defineExpose<OutlinedTimePickerExpose>({
|
|
214
247
|
focus: () => {
|
|
215
248
|
pickerRef.value?.focus?.()
|
|
@@ -242,6 +275,9 @@ defineExpose<OutlinedTimePickerExpose>({
|
|
|
242
275
|
.outlined-time-picker__label {
|
|
243
276
|
position: absolute;
|
|
244
277
|
left: -2px;
|
|
278
|
+
display: inline-flex;
|
|
279
|
+
align-items: center;
|
|
280
|
+
gap: 2px;
|
|
245
281
|
padding: 2px 5px;
|
|
246
282
|
border-radius: 2px;
|
|
247
283
|
background-color: #ffffff;
|
|
@@ -271,6 +307,23 @@ defineExpose<OutlinedTimePickerExpose>({
|
|
|
271
307
|
color: var(--el-text-color-regular);
|
|
272
308
|
}
|
|
273
309
|
|
|
310
|
+
.outlined-time-picker--error {
|
|
311
|
+
--el-input-focus-border-color: var(--el-color-danger);
|
|
312
|
+
--el-input-hover-border-color: var(--el-color-danger);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
.outlined-time-picker__required,
|
|
316
|
+
.outlined-time-picker--error .outlined-time-picker__label,
|
|
317
|
+
.outlined-time-picker__error {
|
|
318
|
+
color: var(--el-color-danger);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
.outlined-time-picker__error {
|
|
322
|
+
margin: 6px 0 0;
|
|
323
|
+
font-size: 12px;
|
|
324
|
+
line-height: 1.2;
|
|
325
|
+
}
|
|
326
|
+
|
|
274
327
|
:deep(.outlined-time-picker__control.el-date-editor) {
|
|
275
328
|
width: 100%;
|
|
276
329
|
}
|
|
@@ -291,13 +344,27 @@ defineExpose<OutlinedTimePickerExpose>({
|
|
|
291
344
|
right: 30px;
|
|
292
345
|
}
|
|
293
346
|
|
|
294
|
-
|
|
347
|
+
.outlined-time-picker--bordered :deep(.el-input__wrapper) {
|
|
295
348
|
box-shadow: none;
|
|
296
349
|
border-radius: 0;
|
|
297
350
|
border-bottom: 1px solid #cccccc;
|
|
298
351
|
}
|
|
299
352
|
|
|
300
|
-
|
|
353
|
+
.outlined-time-picker--bordered :deep(.el-input__wrapper.is-focus) {
|
|
301
354
|
border-bottom-color: var(--el-color-primary);
|
|
302
355
|
}
|
|
356
|
+
|
|
357
|
+
.outlined-time-picker--error :deep(.el-input__wrapper) {
|
|
358
|
+
box-shadow: 0 0 0 1px var(--el-color-danger) inset;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
.outlined-time-picker--error :deep(.el-input__wrapper.is-focus),
|
|
362
|
+
.outlined-time-picker--error :deep(.el-input__wrapper:hover) {
|
|
363
|
+
box-shadow: 0 0 0 1px var(--el-color-danger) inset;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
.outlined-time-picker--error.outlined-time-picker--bordered :deep(.el-input__wrapper) {
|
|
367
|
+
box-shadow: 0 0 0 1px var(--el-color-danger) inset;
|
|
368
|
+
border-bottom-color: transparent;
|
|
369
|
+
}
|
|
303
370
|
</style>
|
|
@@ -49,6 +49,9 @@ const periodRange = ref<string[]>([])
|
|
|
49
49
|
| `value` | `string \| number \| Date \| Array<string \| number \| Date> \| null` | `''` | `v-model:value` 绑定值 |
|
|
50
50
|
| `placeholder` | `string` | `''` | 单值模式占位文案,也会作为浮动标签文案 |
|
|
51
51
|
| `label` | `string` | `''` | 自定义浮动标签文案,优先级高于 `placeholder` |
|
|
52
|
+
| `required` | `boolean` | `false` | 是否显示必填星号 |
|
|
53
|
+
| `error` | `boolean` | `false` | 是否显示错误态,开启后时间框变红并展示错误文案 |
|
|
54
|
+
| `errorMessage` | `string` | `''` | 错误文案,未传时默认使用“字段名为必填项” |
|
|
52
55
|
| `disabled` | `boolean` | `false` | 是否禁用 |
|
|
53
56
|
| `clearable` | `boolean` | `true` | 是否允许清空 |
|
|
54
57
|
| `isRange` | `boolean` | `false` | 是否启用时间范围模式 |
|
|
@@ -46,6 +46,9 @@ export interface OutlinedTreeSelectProps {
|
|
|
46
46
|
isBorder?: boolean
|
|
47
47
|
marginBottom?: OutlinedTreeSelectCssValue
|
|
48
48
|
paddingTop?: OutlinedTreeSelectCssValue
|
|
49
|
+
required?: boolean
|
|
50
|
+
error?: boolean
|
|
51
|
+
errorMessage?: string
|
|
49
52
|
}
|
|
50
53
|
|
|
51
54
|
export interface OutlinedTreeSelectExpose {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
:model-value="treeSelectValue"
|
|
12
12
|
:data="data"
|
|
13
13
|
:props="resolvedTreeProps"
|
|
14
|
-
:placeholder="
|
|
14
|
+
:placeholder="controlPlaceholder"
|
|
15
15
|
:disabled="disabled"
|
|
16
16
|
:clearable="clearable"
|
|
17
17
|
:filterable="filterable"
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
:popper-class="popperClass"
|
|
29
29
|
:node-key="nodeKey"
|
|
30
30
|
:style="treeSelectStyle"
|
|
31
|
+
:aria-invalid="hasError ? 'true' : undefined"
|
|
31
32
|
@update:model-value="handleModelValueUpdate"
|
|
32
33
|
@focus="handleFocus"
|
|
33
34
|
@blur="handleBlur"
|
|
@@ -53,8 +54,19 @@
|
|
|
53
54
|
class="outlined-tree-select__label"
|
|
54
55
|
:class="labelClasses"
|
|
55
56
|
>
|
|
56
|
-
|
|
57
|
+
<span
|
|
58
|
+
v-if="required"
|
|
59
|
+
class="outlined-tree-select__required"
|
|
60
|
+
>*</span>
|
|
61
|
+
<span>{{ floatingLabel }}</span>
|
|
57
62
|
</div>
|
|
63
|
+
|
|
64
|
+
<p
|
|
65
|
+
v-if="hasError"
|
|
66
|
+
class="outlined-tree-select__error"
|
|
67
|
+
>
|
|
68
|
+
{{ resolvedErrorMessage }}
|
|
69
|
+
</p>
|
|
58
70
|
</div>
|
|
59
71
|
</template>
|
|
60
72
|
|
|
@@ -101,7 +113,10 @@ const props = withDefaults(defineProps<OutlinedTreeSelectProps>(), {
|
|
|
101
113
|
inputHeight: 40,
|
|
102
114
|
isBorder: false,
|
|
103
115
|
marginBottom: 20,
|
|
104
|
-
paddingTop: 20
|
|
116
|
+
paddingTop: 20,
|
|
117
|
+
required: false,
|
|
118
|
+
error: false,
|
|
119
|
+
errorMessage: ''
|
|
105
120
|
})
|
|
106
121
|
|
|
107
122
|
const emit = defineEmits<{
|
|
@@ -138,7 +153,8 @@ const treeSelectAttrs = computed(() => {
|
|
|
138
153
|
})
|
|
139
154
|
|
|
140
155
|
const containerClasses = computed(() => ({
|
|
141
|
-
'outlined-tree-select--bordered': props.isBorder
|
|
156
|
+
'outlined-tree-select--bordered': props.isBorder,
|
|
157
|
+
'outlined-tree-select--error': hasError.value
|
|
142
158
|
}))
|
|
143
159
|
|
|
144
160
|
const containerStyle = computed(() => ({
|
|
@@ -165,6 +181,9 @@ const resolvedTreeProps = computed(() => {
|
|
|
165
181
|
})
|
|
166
182
|
|
|
167
183
|
const floatingLabel = computed(() => props.label || props.placeholder || '')
|
|
184
|
+
const controlPlaceholder = computed(() => addRequiredMark(props.placeholder))
|
|
185
|
+
const hasError = computed(() => Boolean(props.error))
|
|
186
|
+
const resolvedErrorMessage = computed(() => props.errorMessage || createRequiredMessage(floatingLabel.value))
|
|
168
187
|
|
|
169
188
|
const hasContent = computed(() => {
|
|
170
189
|
if (isArrayMode()) {
|
|
@@ -263,6 +282,18 @@ function toCssValue(value: OutlinedTreeSelectCssValue | undefined) {
|
|
|
263
282
|
return value
|
|
264
283
|
}
|
|
265
284
|
|
|
285
|
+
function addRequiredMark(value: string) {
|
|
286
|
+
if (!props.required || !value || value.startsWith('*')) {
|
|
287
|
+
return value
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return `*${value}`
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
function createRequiredMessage(label: string) {
|
|
294
|
+
return label ? `${label}为必填项` : '该项为必填项'
|
|
295
|
+
}
|
|
296
|
+
|
|
266
297
|
defineExpose<OutlinedTreeSelectExpose>({
|
|
267
298
|
focus: () => {
|
|
268
299
|
treeSelectRef.value?.focus?.()
|
|
@@ -296,6 +327,9 @@ defineExpose<OutlinedTreeSelectExpose>({
|
|
|
296
327
|
.outlined-tree-select__label {
|
|
297
328
|
position: absolute;
|
|
298
329
|
left: -2px;
|
|
330
|
+
display: inline-flex;
|
|
331
|
+
align-items: center;
|
|
332
|
+
gap: 2px;
|
|
299
333
|
padding: 2px 5px;
|
|
300
334
|
border-radius: 2px;
|
|
301
335
|
background-color: #ffffff;
|
|
@@ -325,6 +359,23 @@ defineExpose<OutlinedTreeSelectExpose>({
|
|
|
325
359
|
color: var(--el-text-color-regular);
|
|
326
360
|
}
|
|
327
361
|
|
|
362
|
+
.outlined-tree-select--error {
|
|
363
|
+
--el-input-focus-border-color: var(--el-color-danger);
|
|
364
|
+
--el-input-hover-border-color: var(--el-color-danger);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
.outlined-tree-select__required,
|
|
368
|
+
.outlined-tree-select--error .outlined-tree-select__label,
|
|
369
|
+
.outlined-tree-select__error {
|
|
370
|
+
color: var(--el-color-danger);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
.outlined-tree-select__error {
|
|
374
|
+
margin: 6px 0 0;
|
|
375
|
+
font-size: 12px;
|
|
376
|
+
line-height: 1.2;
|
|
377
|
+
}
|
|
378
|
+
|
|
328
379
|
:deep(.outlined-tree-select__control.el-select) {
|
|
329
380
|
width: 100%;
|
|
330
381
|
}
|
|
@@ -342,13 +393,28 @@ defineExpose<OutlinedTreeSelectExpose>({
|
|
|
342
393
|
padding-top: 4px;
|
|
343
394
|
}
|
|
344
395
|
|
|
345
|
-
|
|
396
|
+
.outlined-tree-select--bordered :deep(.el-select__wrapper) {
|
|
346
397
|
box-shadow: none;
|
|
347
398
|
border-radius: 0;
|
|
348
399
|
border-bottom: 1px solid #cccccc;
|
|
349
400
|
}
|
|
350
401
|
|
|
351
|
-
|
|
402
|
+
.outlined-tree-select--bordered :deep(.el-select__wrapper.is-focused) {
|
|
352
403
|
border-bottom-color: var(--el-color-primary);
|
|
353
404
|
}
|
|
405
|
+
|
|
406
|
+
.outlined-tree-select--error :deep(.el-select__wrapper) {
|
|
407
|
+
box-shadow: 0 0 0 1px var(--el-color-danger) inset;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
.outlined-tree-select--error :deep(.el-select__wrapper.is-focused),
|
|
411
|
+
.outlined-tree-select--error :deep(.el-select__wrapper.is-focus),
|
|
412
|
+
.outlined-tree-select--error :deep(.el-select__wrapper:hover) {
|
|
413
|
+
box-shadow: 0 0 0 1px var(--el-color-danger) inset;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
.outlined-tree-select--error.outlined-tree-select--bordered :deep(.el-select__wrapper) {
|
|
417
|
+
box-shadow: 0 0 0 1px var(--el-color-danger) inset;
|
|
418
|
+
border-bottom-color: transparent;
|
|
419
|
+
}
|
|
354
420
|
</style>
|
|
@@ -55,6 +55,9 @@ const treeData = [
|
|
|
55
55
|
| `propsValue` | `Record<string, unknown>` | `undefined` | 透传给 `el-tree-select` 的 `props` |
|
|
56
56
|
| `placeholder` | `string` | `''` | 占位文案,也会作为浮动标签文案 |
|
|
57
57
|
| `label` | `string` | `''` | 自定义浮动标签文案,优先级高于 `placeholder` |
|
|
58
|
+
| `required` | `boolean` | `false` | 是否显示必填星号 |
|
|
59
|
+
| `error` | `boolean` | `false` | 是否显示错误态,开启后树选择框变红并展示错误文案 |
|
|
60
|
+
| `errorMessage` | `string` | `''` | 错误文案,未传时默认使用“字段名为必填项” |
|
|
58
61
|
| `disabled` | `boolean` | `false` | 是否禁用 |
|
|
59
62
|
| `clearable` | `boolean` | `true` | 是否允许清空 |
|
|
60
63
|
| `filterable` | `boolean` | `true` | 是否允许搜索 |
|