@@ -9,14 +9,17 @@ import {
9
9
buildTimeValue ,
10
10
calculateNewValue ,
11
11
fireInputEvent ,
12
+ getInputRange ,
12
13
getSpaceUntilMaxLength ,
13
14
getValue ,
14
- isClickableInput ,
15
15
isContentEditable ,
16
+ isEditableInput ,
16
17
isElementType ,
17
18
isValidDateValue ,
18
19
isValidInputTimeValue ,
20
+ prepareInput ,
19
21
} from '../../utils'
22
+ import { UISelectionRange } from '../../document'
20
23
21
24
export const keypressBehavior : behaviorPlugin [ ] = [
22
25
{
@@ -37,9 +40,10 @@ export const keypressBehavior: behaviorPlugin[] = [
37
40
newEntry = timeNewEntry
38
41
}
39
42
40
- const { newValue, newSelectionStart } = calculateNewValue (
43
+ const { newValue, newOffset } = calculateNewValue (
41
44
newEntry ,
42
- element as HTMLElement ,
45
+ element as HTMLInputElement & { type : 'time' } ,
46
+ getInputRange ( element ) as UISelectionRange ,
43
47
)
44
48
const prevValue = getValue ( element )
45
49
@@ -48,7 +52,10 @@ export const keypressBehavior: behaviorPlugin[] = [
48
52
if ( prevValue !== newValue ) {
49
53
fireInputEvent ( element as HTMLInputElement , {
50
54
newValue,
51
- newSelectionStart,
55
+ newSelection : {
56
+ node : element ,
57
+ offset : newOffset ,
58
+ } ,
52
59
eventOverrides : {
53
60
data : keyDef . key ,
54
61
inputType : 'insertText' ,
@@ -81,9 +88,10 @@ export const keypressBehavior: behaviorPlugin[] = [
81
88
newEntry = textToBeTyped
82
89
}
83
90
84
- const { newValue, newSelectionStart } = calculateNewValue (
91
+ const { newValue, newOffset } = calculateNewValue (
85
92
newEntry ,
86
- element as HTMLElement ,
93
+ element as HTMLInputElement & { type : 'date' } ,
94
+ getInputRange ( element ) as UISelectionRange ,
87
95
)
88
96
const prevValue = getValue ( element )
89
97
@@ -92,7 +100,10 @@ export const keypressBehavior: behaviorPlugin[] = [
92
100
if ( prevValue !== newValue ) {
93
101
fireInputEvent ( element as HTMLInputElement , {
94
102
newValue,
95
- newSelectionStart,
103
+ newSelection : {
104
+ node : element ,
105
+ offset : newOffset ,
106
+ } ,
96
107
eventOverrides : {
97
108
data : keyDef . key ,
98
109
inputType : 'insertText' ,
@@ -118,10 +129,10 @@ export const keypressBehavior: behaviorPlugin[] = [
118
129
return
119
130
}
120
131
121
- const { newValue, newSelectionStart } = calculateNewValue (
132
+ const { newValue, commit } = prepareInput (
122
133
keyDef . key as string ,
123
- element as HTMLElement ,
124
- )
134
+ element ,
135
+ ) as NonNullable < ReturnType < typeof prepareInput > >
125
136
126
137
// the browser allows some invalid input but not others
127
138
// it allows up to two '-' at any place before any 'e' or one directly following 'e'
@@ -135,37 +146,18 @@ export const keypressBehavior: behaviorPlugin[] = [
135
146
return
136
147
}
137
148
138
- fireInputEvent ( element as HTMLInputElement , {
139
- newValue,
140
- newSelectionStart,
141
- eventOverrides : {
142
- data : keyDef . key ,
143
- inputType : 'insertText' ,
144
- } ,
145
- } )
149
+ commit ( )
146
150
} ,
147
151
} ,
148
152
{
149
153
matches : ( keyDef , element ) =>
150
154
keyDef . key ?. length === 1 &&
151
- ( ( isElementType ( element , [ 'input' , 'textarea' ] , { readOnly : false } ) &&
152
- ! isClickableInput ( element ) ) ||
155
+ ( isEditableInput ( element ) ||
156
+ isElementType ( element , 'textarea' , { readOnly : false } ) ||
153
157
isContentEditable ( element ) ) &&
154
158
getSpaceUntilMaxLength ( element ) !== 0 ,
155
159
handle : ( keyDef , element ) => {
156
- const { newValue, newSelectionStart} = calculateNewValue (
157
- keyDef . key as string ,
158
- element as HTMLElement ,
159
- )
160
-
161
- fireInputEvent ( element as HTMLElement , {
162
- newValue,
163
- newSelectionStart,
164
- eventOverrides : {
165
- data : keyDef . key ,
166
- inputType : 'insertText' ,
167
- } ,
168
- } )
160
+ prepareInput ( keyDef . key as string , element ) ?. commit ( )
169
161
} ,
170
162
} ,
171
163
{
@@ -175,23 +167,13 @@ export const keypressBehavior: behaviorPlugin[] = [
175
167
isContentEditable ( element ) ) &&
176
168
getSpaceUntilMaxLength ( element ) !== 0 ,
177
169
handle : ( keyDef , element , options , state ) => {
178
- const { newValue , newSelectionStart } = calculateNewValue (
170
+ prepareInput (
179
171
'\n' ,
180
- element as HTMLElement ,
181
- )
182
-
183
- const inputType =
172
+ element ,
184
173
isContentEditable ( element ) && ! state . modifiers . shift
185
174
? 'insertParagraph'
186
- : 'insertLineBreak'
187
-
188
- fireInputEvent ( element as HTMLElement , {
189
- newValue,
190
- newSelectionStart,
191
- eventOverrides : {
192
- inputType,
193
- } ,
194
- } )
175
+ : 'insertLineBreak' ,
176
+ ) ?. commit ( )
195
177
} ,
196
178
} ,
197
179
]
0 commit comments