Skip to content

Commit de95f2d

Browse files
authored
fix(autocomplete): fixed minChar behavior (#144)
Fixes #142
1 parent 2482aec commit de95f2d

File tree

4 files changed

+66
-5
lines changed

4 files changed

+66
-5
lines changed

cypress/integration/textarea.js

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ describe("React Textarea Autocomplete", () => {
3333
context("basic", () => {
3434
beforeEach(() => {
3535
cy.get(".rta__textarea").clear({ force: true });
36+
cy.get('[data-test="minChar"]').clear({ force: true })
3637
});
3738

3839
it("basic test with keyboard", () => {
@@ -114,6 +115,7 @@ describe("React Textarea Autocomplete", () => {
114115
context("advanced", () => {
115116
beforeEach(() => {
116117
cy.get(".rta__textarea").clear({ force: true });
118+
cy.get('[data-test="minChar"]').clear({ force: true })
117119
});
118120

119121
it("should have place caret before outputted word", () => {
@@ -233,8 +235,45 @@ describe("React Textarea Autocomplete", () => {
233235
it("show autocomplete only after whitespace", () => {
234236
cy.get(".rta__textarea").type("This is test;");
235237
cy.get(".rta__autocomplete").should("not.be.visible");
236-
cy.get(".rta__textarea").type(" ;");
238+
cy.get(".rta__textarea").clear({ force: true });
239+
240+
cy.get(".rta__textarea").type("This is test;a");
241+
cy.get(".rta__autocomplete").should("not.be.visible");
242+
cy.get(".rta__textarea").clear({ force: true });
243+
244+
cy.get(".rta__textarea").type(";");
245+
cy.get(".rta__autocomplete").should("be.visible");
246+
cy.get(".rta__textarea").clear({ force: true });
247+
248+
cy.get(".rta__textarea").type("something ;");
237249
cy.get(".rta__autocomplete").should("be.visible");
250+
cy.get(".rta__textarea").clear({ force: true });
251+
252+
cy.get(".rta__textarea").type("something ;somethingmore");
253+
cy.get(".rta__autocomplete").should("be.visible");
254+
cy.get(".rta__textarea").clear({ force: true });
255+
256+
cy.get('[data-test="minChar"]').type("{uparrow}");
257+
258+
cy.get(".rta__textarea").type("This is test;");
259+
cy.get(".rta__autocomplete").should("not.be.visible");
260+
cy.get(".rta__textarea").clear({ force: true });
261+
262+
cy.get(".rta__textarea").type("This is test;a");
263+
cy.get(".rta__autocomplete").should("not.be.visible");
264+
cy.get(".rta__textarea").clear({ force: true });
265+
266+
cy.get(".rta__textarea").type(";a");
267+
cy.get(".rta__autocomplete").should("be.visible");
268+
cy.get(".rta__textarea").clear({ force: true });
269+
270+
cy.get(".rta__textarea").type("something ;a");
271+
cy.get(".rta__autocomplete").should("be.visible");
272+
cy.get(".rta__textarea").clear({ force: true });
273+
274+
cy.get(".rta__textarea").type("something ;somethingmore");
275+
cy.get(".rta__autocomplete").should("be.visible");
276+
cy.get(".rta__textarea").clear({ force: true });
238277
});
239278

240279
it("test multi-character triggers and its possible combo", () => {

example/App.jsx

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class App extends React.Component {
2828
caretPosition: 0,
2929
movePopupAsYouType: false,
3030
text: "",
31+
minChar: 0,
3132
optionsCaret: "start",
3233
actualTokenInProvider: "",
3334
showSecondTextarea: false
@@ -81,6 +82,12 @@ class App extends React.Component {
8182
});
8283
};
8384

85+
_handleMinChar = ({ target: { value } }) => {
86+
this.setState({
87+
minChar: +value
88+
});
89+
};
90+
8491
_setCaretPosition = () => {
8592
this.rtaRef.setCaretPosition(1);
8693
};
@@ -122,7 +129,8 @@ class App extends React.Component {
122129
movePopupAsYouType,
123130
actualTokenInProvider,
124131
showSecondTextarea,
125-
text
132+
text,
133+
minChar
126134
} = this.state;
127135

128136
return (
@@ -180,6 +188,17 @@ class App extends React.Component {
180188
Move popup as you type
181189
</label>
182190
</div>
191+
<div>
192+
<label>
193+
<input
194+
data-test="minChar"
195+
type="number"
196+
value={minChar}
197+
onChange={this._handleMinChar}
198+
/>
199+
Minimal characters typed to trigger autocomplete
200+
</label>
201+
</div>
183202
<div>
184203
Actual caret position:{" "}
185204
<span data-test="actualCaretPosition">{caretPosition}</span>
@@ -233,7 +252,7 @@ class App extends React.Component {
233252
}}
234253
movePopupAsYouType={movePopupAsYouType}
235254
onCaretPositionChange={this._onCaretPositionChangeHandle}
236-
minChar={0}
255+
minChar={minChar}
237256
value={text}
238257
onChange={this._onChangeHandle}
239258
trigger={{

src/Textarea.jsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -752,11 +752,14 @@ class ReactTextareaAutocomplete extends React.Component<
752752
* from currentTrigger not this.state.currentTrigger
753753
*
754754
* Check if the currently typed token has to be afterWhitespace, or not.
755+
*
756+
* This setting means that there has to be whitespace before the token (on it has to be the the first character typed into textarea)
755757
*/
756758
if (
757759
currentTrigger &&
758760
trigger[currentTrigger].afterWhitespace &&
759-
value[selectionEnd - 2] !== " "
761+
(value[selectionEnd - lastToken.length - 1] !== " " &&
762+
value[selectionEnd - lastToken.length - 1] !== undefined)
760763
) {
761764
this._closeAutocomplete();
762765
return;

src/types.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ export type TextareaProps = {
8080
closeOnClickOutside?: boolean,
8181
movePopupAsYouType?: boolean,
8282
boundariesElement: string | HTMLElement,
83-
minChar: ?number,
83+
minChar: number,
8484
value?: string,
8585
style: ?Object,
8686
listStyle: ?Object,

0 commit comments

Comments
 (0)