From a8439cc296e355ac73fc967ac171e32e7259503d Mon Sep 17 00:00:00 2001 From: Jakub Benes Date: Sun, 10 Mar 2019 17:09:08 +0100 Subject: [PATCH] fix(autocomplete): fixed minChar behavior --- cypress/integration/textarea.js | 41 ++++++++++++++++++++++++++++++++- example/App.jsx | 23 ++++++++++++++++-- src/Textarea.jsx | 5 +++- src/types.js | 2 +- 4 files changed, 66 insertions(+), 5 deletions(-) diff --git a/cypress/integration/textarea.js b/cypress/integration/textarea.js index 1216471..c332a00 100644 --- a/cypress/integration/textarea.js +++ b/cypress/integration/textarea.js @@ -33,6 +33,7 @@ describe("React Textarea Autocomplete", () => { context("basic", () => { beforeEach(() => { cy.get(".rta__textarea").clear({ force: true }); + cy.get('[data-test="minChar"]').clear({ force: true }) }); it("basic test with keyboard", () => { @@ -114,6 +115,7 @@ describe("React Textarea Autocomplete", () => { context("advanced", () => { beforeEach(() => { cy.get(".rta__textarea").clear({ force: true }); + cy.get('[data-test="minChar"]').clear({ force: true }) }); it("should have place caret before outputted word", () => { @@ -233,8 +235,45 @@ describe("React Textarea Autocomplete", () => { it("show autocomplete only after whitespace", () => { cy.get(".rta__textarea").type("This is test;"); cy.get(".rta__autocomplete").should("not.be.visible"); - cy.get(".rta__textarea").type(" ;"); + cy.get(".rta__textarea").clear({ force: true }); + + cy.get(".rta__textarea").type("This is test;a"); + cy.get(".rta__autocomplete").should("not.be.visible"); + cy.get(".rta__textarea").clear({ force: true }); + + cy.get(".rta__textarea").type(";"); + cy.get(".rta__autocomplete").should("be.visible"); + cy.get(".rta__textarea").clear({ force: true }); + + cy.get(".rta__textarea").type("something ;"); cy.get(".rta__autocomplete").should("be.visible"); + cy.get(".rta__textarea").clear({ force: true }); + + cy.get(".rta__textarea").type("something ;somethingmore"); + cy.get(".rta__autocomplete").should("be.visible"); + cy.get(".rta__textarea").clear({ force: true }); + + cy.get('[data-test="minChar"]').type("{uparrow}"); + + cy.get(".rta__textarea").type("This is test;"); + cy.get(".rta__autocomplete").should("not.be.visible"); + cy.get(".rta__textarea").clear({ force: true }); + + cy.get(".rta__textarea").type("This is test;a"); + cy.get(".rta__autocomplete").should("not.be.visible"); + cy.get(".rta__textarea").clear({ force: true }); + + cy.get(".rta__textarea").type(";a"); + cy.get(".rta__autocomplete").should("be.visible"); + cy.get(".rta__textarea").clear({ force: true }); + + cy.get(".rta__textarea").type("something ;a"); + cy.get(".rta__autocomplete").should("be.visible"); + cy.get(".rta__textarea").clear({ force: true }); + + cy.get(".rta__textarea").type("something ;somethingmore"); + cy.get(".rta__autocomplete").should("be.visible"); + cy.get(".rta__textarea").clear({ force: true }); }); it("test multi-character triggers and its possible combo", () => { diff --git a/example/App.jsx b/example/App.jsx index 795b410..10a7037 100644 --- a/example/App.jsx +++ b/example/App.jsx @@ -28,6 +28,7 @@ class App extends React.Component { caretPosition: 0, movePopupAsYouType: false, text: "", + minChar: 0, optionsCaret: "start", actualTokenInProvider: "", showSecondTextarea: false @@ -81,6 +82,12 @@ class App extends React.Component { }); }; + _handleMinChar = ({ target: { value } }) => { + this.setState({ + minChar: +value + }); + }; + _setCaretPosition = () => { this.rtaRef.setCaretPosition(1); }; @@ -122,7 +129,8 @@ class App extends React.Component { movePopupAsYouType, actualTokenInProvider, showSecondTextarea, - text + text, + minChar } = this.state; return ( @@ -180,6 +188,17 @@ class App extends React.Component { Move popup as you type +
+ +
Actual caret position:{" "} {caretPosition} @@ -233,7 +252,7 @@ class App extends React.Component { }} movePopupAsYouType={movePopupAsYouType} onCaretPositionChange={this._onCaretPositionChangeHandle} - minChar={0} + minChar={minChar} value={text} onChange={this._onChangeHandle} trigger={{ diff --git a/src/Textarea.jsx b/src/Textarea.jsx index b2ff0ca..24425dc 100644 --- a/src/Textarea.jsx +++ b/src/Textarea.jsx @@ -752,11 +752,14 @@ class ReactTextareaAutocomplete extends React.Component< * from currentTrigger not this.state.currentTrigger * * Check if the currently typed token has to be afterWhitespace, or not. + * + * This setting means that there has to be whitespace before the token (on it has to be the the first character typed into textarea) */ if ( currentTrigger && trigger[currentTrigger].afterWhitespace && - value[selectionEnd - 2] !== " " + (value[selectionEnd - lastToken.length - 1] !== " " && + value[selectionEnd - lastToken.length - 1] !== undefined) ) { this._closeAutocomplete(); return; diff --git a/src/types.js b/src/types.js index 309ee5e..939cefd 100644 --- a/src/types.js +++ b/src/types.js @@ -80,7 +80,7 @@ export type TextareaProps = { closeOnClickOutside?: boolean, movePopupAsYouType?: boolean, boundariesElement: string | HTMLElement, - minChar: ?number, + minChar: number, value?: string, style: ?Object, listStyle: ?Object,