Skip to content

Commit e713590

Browse files
feat(OtpInput): use input instead of keydown event (#7520)
* revert: 撤销更新 * optinput,三平台输入修正 optinput,三平台输入修正 * doc: 增加 embedPDF 映射关系 * refactor: 更新逻辑 * feat: 增加分隔符 * refactor: 增加长度验证 * refactor: 重构不是从第一位开始逻辑 * test: 更新单元测试 * refactor: 精简逻辑 --------- Co-authored-by: Argo Zhang <argo@live.ca>
1 parent 3d85ea6 commit e713590

4 files changed

Lines changed: 33 additions & 61 deletions

File tree

src/BootstrapBlazor.Server/docs.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,8 @@
259259
"select-region": "SelectRegions",
260260
"select-city": "SelectCities",
261261
"select-province": "SelectProvinces",
262-
"hik-vision": "HikVisions"
262+
"hik-vision": "HikVisions",
263+
"embed-pdf": "EmbedPDFs"
263264
},
264265
"video": {
265266
"table": "BV1ap4y1x7Qn?p=1",

src/BootstrapBlazor/Components/Input/OtpInput.razor.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Licensed to the .NET Foundation under one or more agreements.
1+
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the Apache 2.0 License
33
// See the LICENSE file in the project root for more information.
44
// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone
@@ -104,9 +104,9 @@ protected override void OnParametersSet()
104104
/// <param name="val"></param>
105105
/// <returns></returns>
106106
[JSInvokable]
107-
public Task TriggerSetValue(string val)
107+
public Task TriggerSetValue(string[] val)
108108
{
109-
SetValue(val);
109+
SetValue(string.Join("", val.Select(i => string.IsNullOrEmpty(i) ? " " : i)));
110110
return Task.CompletedTask;
111111
}
112112
}

src/BootstrapBlazor/Components/Input/OtpInput.razor.js

Lines changed: 24 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -2,47 +2,40 @@ import EventHandler from '../../modules/event-handler.js'
22

33
export function init(id, invoke, method) {
44
const el = document.getElementById(id);
5-
let triggerKeydown = false;
5+
const totalInputs = [...el.querySelectorAll('.bb-otp-item')];
66

7-
EventHandler.on(el, 'beforeinput', '.bb-otp-item', e => {
8-
if (triggerKeydown) {
9-
return;
10-
}
11-
12-
processKey(el, e, e.data);
13-
});
147
EventHandler.on(el, 'input', '.bb-otp-item', e => {
158
const isNumber = e.target.getAttribute('type') === 'number';
16-
if (isNumber && e.target.value.length > 1) {
17-
e.target.value = e.target.value.slice(1, 2);
9+
let value = e.target.value;
10+
if (value.length > 1) {
11+
value = value.slice(1, 2);
1812
}
19-
setValue(el, invoke, method);
20-
});
21-
EventHandler.on(el, 'keydown', '.bb-otp-item', e => {
22-
if (e.ctrlKey) {
13+
14+
if (isNumber && "0123456789".indexOf(value) === -1) {
15+
e.target.value = '';
2316
return;
2417
}
2518

26-
if (e.key.charCodeAt(0) === 0) {
19+
if ("abcdefghijklmnopqrstuvwxyzABCDEDFGHIJKLMNOPQRSTUVWXYZ0123456789".indexOf(value) === -1) {
20+
e.target.value = '';
2721
return;
2822
}
29-
triggerKeydown = true;
30-
processKey(el, e, e.key);
31-
});
32-
EventHandler.on(el, 'keyup', '.bb-otp-item', e => {
33-
const input = event.target;
34-
const value = e.key;
3523

36-
if (value === 'Backspace' || value === 'ArrowLeft') {
37-
setPrevFocus(el, input);
24+
e.target.value = value;
25+
26+
if (value.length === 1) {
27+
setNextFocus(el, e.target);
3828
}
39-
else if (value === 'ArrowRight') {
40-
setNextFocus(el, input);
29+
setValue(el, invoke, method);
30+
});
31+
EventHandler.on(el, 'keydown', '.bb-otp-item', e => {
32+
if (e.key === 'Backspace' || e.key === 'ArrowLeft') {
33+
setPrevFocus(el, e.target);
4134
}
42-
else if (value === 'Delete') {
43-
setFocus(input);
35+
else if (e.key === 'ArrowRight') {
36+
setNextFocus(el, e.target);
4437
}
45-
})
38+
});
4639
EventHandler.on(el, 'focus', '.bb-otp-item', e => {
4740
if (e.target.select) {
4841
e.target.select();
@@ -72,7 +65,7 @@ export function init(id, invoke, method) {
7265
}
7366

7467
const setValue = (el, invoke, method) => {
75-
const val = [...el.querySelectorAll('.bb-otp-item')].map(input => input.value).join('');
68+
const val = [...el.querySelectorAll('.bb-otp-item')].map(input => input.value);
7669
invoke.invokeMethodAsync(method, val);
7770
}
7871

@@ -98,38 +91,13 @@ const setFocus = target => {
9891
if (target.focus) {
9992
target.focus();
10093
}
101-
}, 0);
102-
}
103-
104-
const processKey = (el, event, value) => {
105-
const skipKeys = ['Enter', 'Tab', 'Shift', 'Control', 'Alt', 'Backspace', 'ArrowLeft', 'ArrowRight', 'Delete'];
106-
const input = event.target;
107-
const isNumber = input.getAttribute('type') === 'number';
108-
109-
if (skipKeys.indexOf(value) > -1) {
110-
111-
}
112-
else if (isNumber) {
113-
if ("0123456789".indexOf(value) > -1) {
114-
setNextFocus(el, input);
115-
}
116-
else {
117-
event.preventDefault();
118-
}
119-
}
120-
else if ("abcdefghijklmnopqrstuvwxyzABCDEDFGHIJKLMNOPQRSTUVWXYZ0123456789".indexOf(value) > -1) {
121-
setNextFocus(el, input);
122-
}
123-
else {
124-
event.preventDefault();
125-
}
94+
}, 10);
12695
}
12796

12897
export function dispose(id) {
12998
const el = document.getElementById(id);
13099
EventHandler.off(el, 'input');
131100
EventHandler.off(el, 'keydown');
132-
EventHandler.off(el, 'keyup');
133-
EventHandler.off(el, 'beforeinput');
134101
EventHandler.off(el, 'focus');
102+
EventHandler.off(el, 'paste');
135103
}

test/UnitTest/Components/OtpInputTest.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,10 @@ public async Task TriggerSetValue_Ok()
9090
});
9191
});
9292

93-
await cut.InvokeAsync(() => cut.Instance.TriggerSetValue("234567"));
93+
await cut.InvokeAsync(() => cut.Instance.TriggerSetValue(["2", "3", "4", "5", "6", "7"]));
9494
Assert.Equal("234567", v);
95+
96+
await cut.InvokeAsync(() => cut.Instance.TriggerSetValue(["", "3", "4", "5", "6", "7"]));
97+
Assert.Equal(" 34567", v);
9598
}
9699
}

0 commit comments

Comments
 (0)