From 004082d52a3526af39096f3172dfdc12dab5663f Mon Sep 17 00:00:00 2001 From: Steven Murray Date: Fri, 24 May 2019 12:34:09 -0400 Subject: [PATCH 1/5] Prevents InputTextFuzzy from triggering form submission without a valid suggestion when hitting Enter. --- .../components/atoms/forms/InputTextFuzzy/index.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/react/src/components/atoms/forms/InputTextFuzzy/index.js b/react/src/components/atoms/forms/InputTextFuzzy/index.js index fe1f8d2006..28492bb786 100644 --- a/react/src/components/atoms/forms/InputTextFuzzy/index.js +++ b/react/src/components/atoms/forms/InputTextFuzzy/index.js @@ -170,6 +170,12 @@ class InputTextFuzzy extends React.Component { }); if (suggestion) { this.clearSuggestions(event); + } else { + // This prevents the input from potentially triggering a form submit + // when there is no matching suggestion. + if (this.props.onKeyDownPreventDefault) { + event.preventDefault(); + } } } break; @@ -261,7 +267,9 @@ InputTextFuzzy.propTypes = { /** The id of the the input tag */ inputId: PropTypes.string, /** By default all options will be rendered as suggestions on input focus */ - renderDefaultSuggestion: PropTypes.bool + renderDefaultSuggestion: PropTypes.bool, + /** When true, calls preventDefault on the onKeyDown SyntheticEvent for the input element. */ + onKeyDownPreventDefault: PropTypes.bool }; InputTextFuzzy.defaultProps = { @@ -279,7 +287,8 @@ InputTextFuzzy.defaultProps = { }, disabled: false, boxed: false, - renderDefaultSuggestion: true + renderDefaultSuggestion: true, + onKeyDownPreventDefault: false }; export default InputTextFuzzy; From 2085cea76f8acfc1d233bf16e0eed909bfe82f87 Mon Sep 17 00:00:00 2001 From: Steven Murray Date: Fri, 24 May 2019 12:36:27 -0400 Subject: [PATCH 2/5] Adds changelog. --- changelogs/DP-13800.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelogs/DP-13800.md diff --git a/changelogs/DP-13800.md b/changelogs/DP-13800.md new file mode 100644 index 0000000000..1b68bdb3b5 --- /dev/null +++ b/changelogs/DP-13800.md @@ -0,0 +1,4 @@ +___DESCRIPTION___ +Minor +Added +- (React) [InputTextFuzzy] DP-13800: Adds prop onKeyDownPreventDefault. When set to true, hitting enter without a valid suggestion will trigger event.preventDefault(). From b0bcb78df6943e1564679a0924110935f0314819 Mon Sep 17 00:00:00 2001 From: Steven Murray Date: Wed, 5 Jun 2019 10:21:57 -0400 Subject: [PATCH 3/5] Refactors InputTextFuzzy to use Autosuggest component. --- react/package-lock.json | 155 ++++++++--- react/package.json | 4 +- .../InputTextFuzzy/InputTextFuzzy.stories.js | 8 +- .../atoms/forms/InputTextFuzzy/index.js | 261 +++++++----------- 4 files changed, 211 insertions(+), 217 deletions(-) diff --git a/react/package-lock.json b/react/package-lock.json index 40d9f5975c..c461343fed 100644 --- a/react/package-lock.json +++ b/react/package-lock.json @@ -3967,6 +3967,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", "dev": true, + "optional": true, "requires": { "es6-promisify": "^5.0.0" } @@ -4627,13 +4628,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "dev": true, + "optional": true }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, + "optional": true, "requires": { "is-extglob": "^1.0.0" } @@ -6826,6 +6829,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "dev": true, + "optional": true, "requires": { "hoek": "2.x.x" } @@ -7098,7 +7102,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==", - "dev": true + "dev": true, + "optional": true }, "buffer-xor": { "version": "1.0.3", @@ -7441,7 +7446,8 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "bundled": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -7459,11 +7465,13 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true + "bundled": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7476,15 +7484,18 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "concat-map": { "version": "0.0.1", - "bundled": true + "bundled": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -7587,7 +7598,8 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "bundled": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -7597,6 +7609,7 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -7609,17 +7622,20 @@ "minimatch": { "version": "3.0.4", "bundled": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true + "bundled": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -7636,6 +7652,7 @@ "mkdirp": { "version": "0.5.1", "bundled": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -7708,7 +7725,8 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "bundled": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -7718,6 +7736,7 @@ "once": { "version": "1.4.0", "bundled": true, + "optional": true, "requires": { "wrappy": "1" } @@ -7793,7 +7812,8 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true + "bundled": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -7823,6 +7843,7 @@ "string-width": { "version": "1.0.2", "bundled": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -7840,6 +7861,7 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -7878,11 +7900,13 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true + "bundled": true, + "optional": true }, "yallist": { "version": "3.0.3", - "bundled": true + "bundled": true, + "optional": true } } }, @@ -10038,6 +10062,7 @@ "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, + "optional": true, "requires": { "es6-promise": "^4.0.3" } @@ -11360,7 +11385,8 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "optional": true }, "aproba": { "version": "1.2.0", @@ -11381,12 +11407,14 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "optional": true }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11401,17 +11429,20 @@ "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "optional": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "optional": true }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -11528,7 +11559,8 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "optional": true }, "ini": { "version": "1.3.5", @@ -11540,6 +11572,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -11554,6 +11587,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -11561,12 +11595,14 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "optional": true }, "minipass": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -11585,6 +11621,7 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "optional": true, "requires": { "minimist": "0.0.8" } @@ -11665,7 +11702,8 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "optional": true }, "object-assign": { "version": "4.1.1", @@ -11677,6 +11715,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "optional": true, "requires": { "wrappy": "1" } @@ -11762,7 +11801,8 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -11798,6 +11838,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -11817,6 +11858,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -11860,12 +11902,14 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "optional": true }, "yallist": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", + "optional": true } } }, @@ -12587,7 +12631,8 @@ "version": "2.16.3", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true + "dev": true, + "optional": true }, "hoist-non-react-statics": { "version": "3.3.0", @@ -12825,6 +12870,7 @@ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", "dev": true, + "optional": true, "requires": { "agent-base": "4", "debug": "3.1.0" @@ -12835,6 +12881,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, + "optional": true, "requires": { "ms": "2.0.0" } @@ -12867,6 +12914,7 @@ "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", "dev": true, + "optional": true, "requires": { "httpreq": ">=0.4.22", "underscore": "~1.7.0" @@ -12876,7 +12924,8 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=", - "dev": true + "dev": true, + "optional": true }, "https-browserify": { "version": "1.0.0", @@ -12888,6 +12937,7 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", "dev": true, + "optional": true, "requires": { "agent-base": "^4.1.0", "debug": "^3.1.0" @@ -12898,6 +12948,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, + "optional": true, "requires": { "ms": "^2.1.1" } @@ -12906,7 +12957,8 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true + "dev": true, + "optional": true } } }, @@ -13541,7 +13593,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true + "dev": true, + "optional": true }, "is-regex": { "version": "1.0.4", @@ -15479,13 +15532,15 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz", "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=", - "dev": true + "dev": true, + "optional": true }, "libmime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/libmime/-/libmime-3.0.0.tgz", "integrity": "sha1-UaGp50SOy9Ms2lRCFnW7IbwJPaY=", "dev": true, + "optional": true, "requires": { "iconv-lite": "0.4.15", "libbase64": "0.1.0", @@ -15496,7 +15551,8 @@ "version": "0.4.15", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", - "dev": true + "dev": true, + "optional": true } } }, @@ -15504,7 +15560,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=", - "dev": true + "dev": true, + "optional": true }, "load-json-file": { "version": "2.0.0", @@ -17051,13 +17108,15 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=", - "dev": true + "dev": true, + "optional": true }, "nodemailer-shared": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=", "dev": true, + "optional": true, "requires": { "nodemailer-fetch": "1.6.0" } @@ -17090,7 +17149,8 @@ "version": "0.1.10", "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=", - "dev": true + "dev": true, + "optional": true }, "noop2": { "version": "2.0.0", @@ -20334,19 +20394,19 @@ } }, "react-autosuggest": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/react-autosuggest/-/react-autosuggest-9.3.4.tgz", - "integrity": "sha512-vcAsZw+6zkjimni4aun1tvuzVCGilmFihAgF8yCeVm/p82ssGgtQb0pnNCcEBcPzPTLJjQc2O8dLJidoOyjlcA==", + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/react-autosuggest/-/react-autosuggest-9.4.3.tgz", + "integrity": "sha512-wFbp5QpgFQRfw9cwKvcgLR8theikOUkv8PFsuLYqI2PUgVlx186Cz8MYt5bLxculi+jxGGUUVt+h0esaBZZouw==", "requires": { "prop-types": "^15.5.10", - "react-autowhatever": "^10.1.0", + "react-autowhatever": "^10.1.2", "shallow-equal": "^1.0.0" } }, "react-autowhatever": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/react-autowhatever/-/react-autowhatever-10.1.2.tgz", - "integrity": "sha512-+0XgELT1LF7hHEJv5H5Zwkfb4Q1rqmMZZ5U/XJ2J+UcSPRKnG6CqEjXUJ+hYLXDHgvDqwEN5PBdxczD5rHvOuA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/react-autowhatever/-/react-autowhatever-10.2.0.tgz", + "integrity": "sha512-dqHH4uqiJldPMbL8hl/i2HV4E8FMTDEdVlOIbRqYnJi0kTpWseF9fJslk/KS9pGDnm80JkYzVI+nzFjnOG/u+g==", "requires": { "prop-types": "^15.5.8", "react-themeable": "^1.1.0", @@ -23700,9 +23760,9 @@ } }, "shallow-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.0.0.tgz", - "integrity": "sha1-UI0YOLPeWQq4dXsBGyXkMJAJRfc=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.1.0.tgz", + "integrity": "sha512-0SW1nWo1hnabO62SEeHsl8nmTVVEzguVWZCj5gaQrgWAxz/BaCja4OWdJBWLVPDxdtE/WU7c98uUCCXyPHSCvw==" }, "shallowequal": { "version": "1.1.0", @@ -23820,13 +23880,15 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz", "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==", - "dev": true + "dev": true, + "optional": true }, "smtp-connection": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=", "dev": true, + "optional": true, "requires": { "httpntlm": "1.6.1", "nodemailer-shared": "1.1.0" @@ -24045,6 +24107,7 @@ "resolved": "https://registry.npmjs.org/socks/-/socks-2.2.3.tgz", "integrity": "sha512-+2r83WaRT3PXYoO/1z+RDEBE7Z2f9YcdQnJ0K/ncXXbV5gJ6wYfNAebYFYiiUjM6E4JyXnPY8cimwyvFYHVUUA==", "dev": true, + "optional": true, "requires": { "ip": "^1.1.5", "smart-buffer": "4.0.2" @@ -24055,6 +24118,7 @@ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz", "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==", "dev": true, + "optional": true, "requires": { "agent-base": "~4.2.0", "socks": "~2.2.0" @@ -25767,7 +25831,8 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", - "dev": true + "dev": true, + "optional": true }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", diff --git a/react/package.json b/react/package.json index d4fd2d03db..d6ecb6cbf1 100644 --- a/react/package.json +++ b/react/package.json @@ -44,8 +44,8 @@ "numbro": "^2.1.2", "object.entries": "^1.0.4", "pikaday": "^1.7.0", - "react-autosuggest": "^9.3.4", - "react-autowhatever": "^10.1.2", + "react-autosuggest": "^9.4.3", + "react-autowhatever": "^10.2.0", "react-compound-slider": "^0.19.2", "react-scripts": "^2.1.3", "react-select": "^1.2.1", diff --git a/react/src/components/atoms/forms/InputTextFuzzy/InputTextFuzzy.stories.js b/react/src/components/atoms/forms/InputTextFuzzy/InputTextFuzzy.stories.js index 78602762d6..a7fa49ec1d 100644 --- a/react/src/components/atoms/forms/InputTextFuzzy/InputTextFuzzy.stories.js +++ b/react/src/components/atoms/forms/InputTextFuzzy/InputTextFuzzy.stories.js @@ -32,8 +32,12 @@ storiesOf('atoms/forms', module) threshold: 0.3, minMatchCharLength: 1 }), - onChange: action('fuzzy input onChange'), - onSuggestionClick: action('fuzzy suggestion onClick'), + onKeyDown: action('onKeyDown event'), + onKeyUp: action('onKeyUp event'), + onChange: action('onChange event'), + onFocus: action('onFocus event'), + onBlur: action('onBlur event'), + onSuggestionClick: action('onSuggestionClick called'), renderDefaultSuggestion: boolean('fuzzy renderDefaultSuggestion', true) }; return(); diff --git a/react/src/components/atoms/forms/InputTextFuzzy/index.js b/react/src/components/atoms/forms/InputTextFuzzy/index.js index 28492bb786..953bdcb36c 100644 --- a/react/src/components/atoms/forms/InputTextFuzzy/index.js +++ b/react/src/components/atoms/forms/InputTextFuzzy/index.js @@ -1,7 +1,7 @@ import React from 'react'; +import Autosuggest from 'react-autosuggest'; import PropTypes from 'prop-types'; import Fuse from 'fuse.js'; -import Autowhatever from 'react-autowhatever'; import parse from 'autosuggest-highlight/parse'; import classNames from 'classnames'; import is from 'is'; @@ -13,26 +13,68 @@ class InputTextFuzzy extends React.Component { super(props); this.state = { value: this.props.selected || '', - suggestions: [], - highlightedItemIndex: null + suggestions: [] }; const fuseOptions = this.props.fuseOptions; fuseOptions.keys = this.props.keys; this.fuse = new Fuse(this.props.options, fuseOptions); } - clearSuggestions = (event = null) => { + onSuggestionsFetchRequested = ({ value }) => { + const suggestions = is.empty(value) ? this.optionsToSuggestions(this.props.options) : this.fuse.search(value); this.setState({ - suggestions: [], - highlightedItemIndex: null + suggestions + }); + }; + onSuggestionsClearRequested = () => { + this.setState({ + suggestions: [] + }); + }; + onSuggestionSelected = (event, { suggestion, method }) => { + // invokes custom function if passed in the component + if (is.fn(this.props.onSuggestionClick)) { + event.persist(); + // Suggestion is an object that can contain info on score, matches, etc. + this.props.onSuggestionClick(event, { suggestion, method }); + } + } + getSuggestionValue = (suggestion) => suggestion.item.text; + handleChange = (event, { newValue, method }) => { + event.persist(); + const value = newValue; + this.setState({ + value }, () => { - if (event && is.fn(this.props.onSuggestionClick)) { - this.props.onSuggestionClick(event, { - suggestion: { - item: { text: this.state.value } - } + if (is.fn(this.props.onChange)) { + this.props.onChange({ + event, method, value, suggestions: this.state.suggestions }); } }); + }; + handleBlur = (event) => { + if (is.fn(this.props.onBlur)) { + event.persist(); + this.props.onBlur({ event, value: this.state.value, suggestions: this.state.suggestions }); + } + } + // handleChange and onSuggestionSelected both do not fire when enter is hit. + // This is a workaround for that. Use handleChange for keyboard presses. + handleKeyPress = (event) => { + const { value } = this.state; + if (event.key === 'Enter') { + event.persist(); + event.preventDefault(); + if (is.fn(this.props.onSuggestionClick)) { + this.props.onSuggestionClick(event, { method: 'enter', suggestion: { item: { text: value } } }); + } + } + } + handleFocus = (event) => { + if (is.fn(this.props.onFocus)) { + event.persist(); + this.props.onFocus({ event, value: this.state.value, suggestions: this.state.suggestions }); + } } optionsToSuggestions = (options) => { const suggestions = options.map((item) => ({ @@ -49,75 +91,48 @@ class InputTextFuzzy extends React.Component { })); return suggestions; } - handleChange = (e) => { - e.persist(); - const { value } = e.target; - if (is.empty(value)) { - const suggestions = this.optionsToSuggestions(this.props.options); - if (this.props.renderDefaultSuggestion) { - this.setState({ - suggestions, - value: '' - }, () => { - if (is.fn(this.props.onChange)) { - this.props.onChange({ event: e, value, suggestions }); - } - }); - } else if (is.fn(this.props.onChange)) { - this.props.onChange({ event: e, value, suggestions }); - } - } else { - const suggestions = this.fuse.search(value); - this.setState({ - value, - suggestions - }, () => { - if (is.fn(this.props.onChange)) { - this.props.onChange({ event: e, value, suggestions }); - } - }); - } - }; - handleFocus = () => { - if (this.props.renderDefaultSuggestion) { - const suggestions = this.optionsToSuggestions(this.props.options); - this.setState({ - suggestions - }); - } + shouldRenderSuggestions = (value) => { + return(this.props.renderDefaultSuggestion === true) ? (value.trim().length >= 0) : (value.trim().length > 0); } renderItem = (suggestion) => ( { - suggestion.matches.map((match) => { - if (this.props.keys.indexOf(match.key) > -1) { - // Add one to each range to get a proper highlight match. - const ranges = match.indices.map((range) => [ - range[0], - range[1] + 1 - ]); - const parts = parse(match.value, ranges); - return parts.filter((part) => part.text.length > 0).map((part, index) => { - const className = part.highlight ? 'highlight' : null; - const key = `${match.key}.suggestion_${index}`; - return( - {part.text} - ); - }); - } - }) + suggestion.matches.map((match) => { + if (this.props.keys.indexOf(match.key) > -1) { + // Add one to each range to get a proper highlight match. + const ranges = match.indices.map((range) => [ + range[0], + range[1] + 1 + ]); + const parts = parse(match.value, ranges); + return parts.filter((part) => part.text.length > 0).map((part, index) => { + const className = part.highlight ? 'highlight' : null; + const key = `${match.key}.suggestion_${index}`; + return( + {part.text} + ); + }); } + }) + } ); + renderItemsContainer = ({ children, containerProps }) => (
{children}
); + render() { const autoProps = { - items: this.state.suggestions, - renderItemsContainer: this.renderItemsContainer, - renderItem: this.renderItem, - renderItemData: { value: this.state.value }, + suggestions: this.state.suggestions, + renderSuggestionsContainer: this.renderItemsContainer, + renderSuggestion: this.renderItem, + onSuggestionsFetchRequested: this.onSuggestionsFetchRequested, + onSuggestionsClearRequested: this.onSuggestionsClearRequested, + getSuggestionValue: this.getSuggestionValue, + shouldRenderSuggestions: this.shouldRenderSuggestions, + onSuggestionSelected: this.onSuggestionSelected, + focusInputOnSuggestionClick: false, inputProps: { type: 'search', placeholder: this.props.placeholder, @@ -126,105 +141,13 @@ class InputTextFuzzy extends React.Component { disabled: this.props.disabled, id: this.props.inputId, onFocus: this.handleFocus, - onBlur: () => { - this.clearSuggestions(); - }, - onKeyDown: (event, { newHighlightedItemIndex }) => { - event.persist(); - switch (event.key) { - case 'ArrowDown': - case 'ArrowUp': - event.preventDefault(); - this.setState((currentState) => { - if (currentState.suggestions.length > 0) { - return{ - highlightedItemIndex: !(newHighlightedItemIndex) ? 0 : newHighlightedItemIndex - }; - } - }); - break; - case 'Enter': - // If there are suggestions and the user chose one. - if (this.state.suggestions.length > 0 && this.state.highlightedItemIndex !== null && this.state.highlightedItemIndex > -1) { - const suggestion = this.state.suggestions[this.state.highlightedItemIndex]; - this.setState({ - value: suggestion.item.text, - suggestions: [], - highlightedItemIndex: null - }, () => { - if (is.fn(this.props.onSuggestionClick)) { - // Suggestion is an object that can contain info on score, matches, etc. - this.props.onSuggestionClick(event, { suggestion }); - } - }); - } else { - // Try to see if the typed in value is in the options array. - const suggestion = this.props.options.find((option) => { - let match = false; - this.props.keys.forEach((key) => { - if (option[key] && option[key] === this.state.value) { - match = true; - } - }); - return match; - }); - if (suggestion) { - this.clearSuggestions(event); - } else { - // This prevents the input from potentially triggering a form submit - // when there is no matching suggestion. - if (this.props.onKeyDownPreventDefault) { - event.preventDefault(); - } - } - } - break; - case 'Escape': - this.setState({ - suggestions: [], - highlightedItemIndex: null - }); - break; - default: - } - } + autoFocus: this.props.autoFocusInput, + onBlur: this.handleBlur, + onKeyPress: this.handleKeyPress }, id: this.props.id }; - if (this.state.highlightedItemIndex !== null) { - autoProps.highlightedItemIndex = this.state.highlightedItemIndex; - } - autoProps.itemProps = (props) => { - const { itemIndex } = props; - const suggestion = this.state.suggestions[itemIndex]; - return{ - 'data-item-index': itemIndex, - onMouseDown: (event) => { - event.persist(); - this.setState({ - value: suggestion.item.text, - suggestions: [], - highlightedItemIndex: null - }, () => { - if (is.fn(this.props.onSuggestionClick)) { - // Suggestion is an object that can contain info on score, matches, etc. - this.props.onSuggestionClick(event, { suggestion }); - } - }); - }, - onMouseEnter: () => { - this.setState({ - highlightedItemIndex: itemIndex - }); - }, - onMouseLeave: () => { - this.setState({ - highlightedItemIndex: null - }); - } - }; - }; const inputTextTypeAheadClasses = classNames({ 'ma__input-typeahead': true, 'ma__input-typeahead--disabled': this.props.disabled, @@ -234,7 +157,7 @@ class InputTextFuzzy extends React.Component { {this.props.label && ()}
- +
); @@ -260,6 +183,8 @@ InputTextFuzzy.propTypes = { disabled: PropTypes.bool, /** Function that runs after changes to the input happen. */ onChange: PropTypes.func, + onFocus: PropTypes.func, + onBlur: PropTypes.func, /** Function that runs after a suggestion has been clicked. */ onSuggestionClick: PropTypes.func, /** The default value for the select box. */ @@ -268,8 +193,8 @@ InputTextFuzzy.propTypes = { inputId: PropTypes.string, /** By default all options will be rendered as suggestions on input focus */ renderDefaultSuggestion: PropTypes.bool, - /** When true, calls preventDefault on the onKeyDown SyntheticEvent for the input element. */ - onKeyDownPreventDefault: PropTypes.bool + /** Focus on typeahead input */ + autoFocusInput: PropTypes.bool }; InputTextFuzzy.defaultProps = { @@ -285,10 +210,10 @@ InputTextFuzzy.defaultProps = { /** Prevents matches against empty strings. */ minMatchCharLength: 1 }, + autoFocusInput: false, disabled: false, boxed: false, - renderDefaultSuggestion: true, - onKeyDownPreventDefault: false + renderDefaultSuggestion: true }; export default InputTextFuzzy; From 9ee517c26f68ae7cb5b166f28f702038a5b5a568 Mon Sep 17 00:00:00 2001 From: Steven Murray Date: Thu, 6 Jun 2019 12:24:36 -0400 Subject: [PATCH 4/5] Updates backstop image for InputTextFuzzy. --- ...InputTextFuzzy_0_document_0_small_atom.png | Bin 7405 -> 5486 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/react/backstop/data/bitmaps_reference/vrt_atoms_forms_InputTextFuzzy_0_document_0_small_atom.png b/react/backstop/data/bitmaps_reference/vrt_atoms_forms_InputTextFuzzy_0_document_0_small_atom.png index 07bae2467021960e047171c29481e709107e85ac..d1d1cf2029af29715ad889dfa2c729ac4c17fe70 100644 GIT binary patch literal 5486 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 Nc1K&KK>5M*{{m5TA6) Date: Thu, 6 Jun 2019 12:40:54 -0400 Subject: [PATCH 5/5] Fixes InputTextFuzzy backstop reference image. --- ...InputTextFuzzy_0_document_0_small_atom.png | Bin 5486 -> 7392 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/react/backstop/data/bitmaps_reference/vrt_atoms_forms_InputTextFuzzy_0_document_0_small_atom.png b/react/backstop/data/bitmaps_reference/vrt_atoms_forms_InputTextFuzzy_0_document_0_small_atom.png index d1d1cf2029af29715ad889dfa2c729ac4c17fe70..6f94c1ea8a40a3d367f9ec5b4011d747069bfe08 100644 GIT binary patch literal 7392 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 ez<!yC$$tQ6pCAAL literal 5486 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