Skip to content

Commit 6205193

Browse files
fix(time-select): [time-select] Fix and optimize issues with invalid … (#2735)
* fix(time-select): [time-select] Fix and optimize issues with invalid input data and backfill data, and add input filtering functionality * feat(time-select): [time-select] Modify monitoring opinions * fix(time-select): [time-select] Modify monitoring opinions
1 parent 99e46d0 commit 6205193

File tree

7 files changed

+80
-26
lines changed

7 files changed

+80
-26
lines changed

examples/sites/demos/pc/app/time-select/range-placeholder.spec.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,18 @@ test('固定时间范围', async ({ page }) => {
88
await timeInput.click()
99
// options 的第一条是 options.first(),时间是 08:30;最后一条(最大时间)是 options.nth(43),时间是 18:30
1010
await expect(options.first()).toContainText('08:30')
11-
await expect(options.nth(43)).toContainText('18:30')
12-
// 起始时间选择 10:00,稍后验证结束时间 10:00 是否 disabled
13-
options.nth(9).click()
11+
await expect(options.nth(44)).toContainText('18:30')
12+
// 起始时间选择10:00,稍后验证结束时间10:00是否disabled
13+
options.nth(10).click()
1414
await expect(page.locator('.tiny-input-suffix .tiny-input__inner').first()).toHaveValue('10:00')
1515

1616
const timeEnd = page.getByRole('textbox', { name: '结束时间' })
1717
const endOptions = page.locator('.tiny-picker-panel').nth(1).locator('div')
1818
await timeEnd.click()
1919
await expect(endOptions.first()).toContainText('08:30')
20-
await expect(endOptions.nth(43)).toContainText('18:30')
21-
// 验证结束时间 10:00 是否 disabled
22-
await expect(endOptions.nth(9)).toHaveClass('tiny-time-select__item disabled')
23-
endOptions.nth(10).click()
20+
await expect(endOptions.nth(44)).toContainText('18:30')
21+
// 验证结束时间10:00是否disabled
22+
await expect(endOptions.nth(10)).toHaveClass('tiny-time-select__item disabled')
23+
endOptions.nth(11).click()
2424
await expect(page.locator('.tiny-input-suffix .tiny-input__inner').last()).toHaveValue('10:15')
2525
})

packages/renderless/src/picker/index.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,12 @@ export const handleInput =
544544
const val = event.target.value
545545
state.userInput = val
546546
}
547+
548+
// time-selelt 组件中,输入值开启过滤逻辑,将值传递给生成选项数据的计算属性中生成过滤后的数据面板
549+
if (state.type === 'time-select') {
550+
state.picker.state.isFilter = true
551+
state.picker.state.filterVal = state.userInput
552+
}
547553
}
548554

549555
export const formatInputValue =
@@ -986,6 +992,11 @@ export const handleKeydown =
986992
// Enter
987993
if (keyCode === 13) {
988994
if (state.userInput === '' || api.isValidValue(api.parseString(state.displayValue))) {
995+
// time-select组件中,对输入的数据进行校验,如果有效则取默认过滤后数据的第一个。
996+
if (state.type === 'time-select') {
997+
state.userInput = state.picker.state.items.length ? state.picker.state.items[0].value : ''
998+
}
999+
9891000
api.handleChange()
9901001
state.pickerVisible = state.picker.state.visible = false
9911002
api.blur()
@@ -1010,6 +1021,10 @@ export const hidePicker =
10101021
({ destroyPopper, state }) =>
10111022
() => {
10121023
if (state.picker) {
1024+
// time-select组件中,选中面板关闭则清除过滤,保证下次面板打开时原始items数据。
1025+
if (state.type === 'time-select') {
1026+
state.picker.state.isFilter = false
1027+
}
10131028
state.picker.resetView && state.picker.resetView()
10141029
state.pickerVisible = state.picker.visible = state.picker.state.visible = false
10151030
destroyPopper()

packages/renderless/src/time-panel/index.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,15 @@ export const computItems =
106106
current = api.nextTime(current, step)
107107
}
108108
}
109-
110-
return result
109+
// 生成选项数据时若开启过滤,则进行选项数据过滤,否则返回原始选项数据
110+
if (state.isFilter) {
111+
const newItems = result.filter((item) => {
112+
return item.value.includes(state.filterVal)
113+
})
114+
return newItems
115+
} else {
116+
return result
117+
}
111118
}
112119

113120
export const handleClick = (api) => (item) => !item.disabled && api.emitPick({ value: item.value })

packages/renderless/src/time-panel/vue.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ const initState = ({ reactive, computed, api }) => {
4747
maxTime: '',
4848
width: 0,
4949
lastEmitValue: '',
50+
isFilter: false,
51+
filterVal: '',
5052
items: computed(() => api.computItems()),
5153
default: computed(() => state.defaultValue || state.defaultTime || ''),
5254
value: computed({

packages/theme-saas/src/time-select/index.less

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,21 @@
11
@import '../custom.less';
22

33
@time-select-prefix-cls: ~'@{css-prefix}time-select';
4+
@picker-panel-prefix-cls: ~'@{css-prefix}picker-panel';
5+
@time-select-scrollbar-cls: ~'@{css-prefix}scrollbar';
46

57
.@{time-select-prefix-cls} {
8+
9+
&.not-match-height {
10+
height: 36px;
11+
}
12+
height: 252px;
13+
padding-top: 6px;
14+
border-radius: 8px;
15+
.@{time-select-scrollbar-cls} {
16+
height: 100%;
17+
}
18+
619
.@{scrollbar-prefix-cls}__wrap {
720
@apply p-0;
821
@apply !mb-0;
@@ -37,4 +50,12 @@
3750
}
3851
}
3952
}
53+
54+
.@{picker-panel-prefix-cls} {
55+
&__content {
56+
.no-match {
57+
text-align: center;
58+
}
59+
}
60+
}
4061
}

packages/theme/src/time-select/index.less

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,14 @@
1919

2020
.@{time-select-prefix-cls} {
2121
.inject-TimeSelect-vars();
22-
22+
23+
&.not-match-height {
24+
height: 36px;
25+
}
2326
height: 242px;
27+
padding-top: var(--tv-TimeSelect-content-padding-top);
2428
.@{time-select-scrollbar-cls} {
25-
height: 242px;
29+
height: 100%;
2630
.@{css-prefix}scrollbar__wrap {
2731
max-height: unset;
2832
}
@@ -54,7 +58,9 @@
5458
&__content {
5559
padding-left: 0;
5660
padding-right: 0;
57-
padding-top: var(--tv-TimeSelect-content-padding-top);
61+
.no-match {
62+
text-align: center;
63+
}
5864
}
5965
}
6066
}

packages/vue/src/time-panel/src/pc.vue

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,27 @@
1515
ref="popper"
1616
v-show="state.visible"
1717
:style="{ width: state.width + 'px' }"
18-
:class="state.popperClass"
18+
:class="[state.popperClass, { 'not-match-height': !state.items.length }]"
1919
class="tiny-picker-panel tiny-time-select tiny-popper"
2020
>
2121
<tiny-scrollbar noresize wrap-class="tiny-picker-panel__content">
22-
<div
23-
class="tiny-time-select__item"
24-
v-for="item in state.items"
25-
:class="{
26-
selected: state.value === item.value,
27-
disabled: item.disabled,
28-
default: item.value === state.default
29-
}"
30-
:disabled="item.disabled"
31-
:key="item.value"
32-
@click="handleClick(item)"
33-
>
34-
{{ item.value }}
22+
<div v-if="state.items.length">
23+
<div
24+
class="tiny-time-select__item"
25+
v-for="item in state.items"
26+
:class="{
27+
selected: state.value === item.value,
28+
disabled: item.disabled,
29+
default: item.value === state.default
30+
}"
31+
:disabled="item.disabled"
32+
:key="item.value"
33+
@click="handleClick(item)"
34+
>
35+
{{ item.value }}
36+
</div>
3537
</div>
38+
<div v-else class="no-match">{{ $t('ui.select.noMatch') }}</div>
3639
</tiny-scrollbar>
3740
</div>
3841
</transition>

0 commit comments

Comments
 (0)