From 493b3b85ee5cb43ff83ea0ff2867e44a75e9bc3a Mon Sep 17 00:00:00 2001 From: Anton Stroganov Date: Thu, 1 Sep 2016 13:39:24 -0700 Subject: [PATCH 01/19] Rename autosize "Input" references to "AutosizeInput" Frequently getting this warning: > warning.js?85a7:36Warning: Unknown prop `minWidth` on tag. Remove this prop from the element. which means that somehow the plain html input is being used instead of AutosizeInput. Also, having two references that differ only in case is just begging for user error. --- src/Select.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Select.js b/src/Select.js index 19717a1a..89abf7c2 100644 --- a/src/Select.js +++ b/src/Select.js @@ -1,6 +1,6 @@ import React from 'react'; import ReactDOM from 'react-dom'; -import Input from 'react-input-autosize'; +import AutosizeInput from 'react-input-autosize'; import classNames from 'classnames'; import stripDiacritics from './utils/stripDiacritics'; @@ -298,7 +298,7 @@ const Select = React.createClass({ let input = this.input; if (typeof input.getInput === 'function') { - // Get the actual DOM input if the ref is an component + // Get the actual DOM input if the ref is an component input = input.getInput(); } @@ -812,7 +812,7 @@ const Select = React.createClass({ if (this.props.autosize) { return ( - + ); } return ( From f492e6da3c5330a85299d1b54cfa7a3741d529cf Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Mon, 5 Sep 2016 07:53:01 +0800 Subject: [PATCH 02/19] Added arrowRenderer prop and updated examples. Also added an example showing how to highlight matching search text using a custom optionRenderer. --- README.md | 1 + examples/src/app.js | 2 +- examples/src/components/CustomComponents.js | 7 +++++++ examples/src/components/CustomRender.js | 10 ++++++++-- package.json | 1 + src/Select.js | 13 +++++++++++-- src/utils/defaultArrowRenderer.js | 10 ++++++++++ 7 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 src/utils/defaultArrowRenderer.js diff --git a/README.md b/README.md index 25c17216..fffac7f7 100644 --- a/README.md +++ b/README.md @@ -316,6 +316,7 @@ function onInputKeyDown(event) { Property | Type | Default | Description :-----------------------|:--------------|:--------------|:-------------------------------- addLabelText | string | 'Add "{label}"?' | text to display when `allowCreate` is true + arrowRenderer | func | undefined | Renders a custom drop-down arrow to be shown in the right-hand side of the select: `arrowRenderer({ onMouseDown })` autoBlur | bool | false | Blurs the input element after a selection has been made. Handy for lowering the keyboard on mobile devices autofocus | bool | undefined | autofocus the component on mount autoload | bool | true | whether to auto-load the default async options set diff --git a/examples/src/app.js b/examples/src/app.js index f2a541f5..a13bc939 100644 --- a/examples/src/app.js +++ b/examples/src/app.js @@ -23,7 +23,7 @@ ReactDOM.render( - +

{this.props.label}

this._inputValue = inputValue} options={options} optionRenderer={this.renderOption} onChange={this.setValue} diff --git a/package.json b/package.json index 00f053a8..9744292c 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "react-component-gulp-tasks": "^0.7.7", "react-dom": "^15.0", "react-gravatar": "^2.4.5", + "react-highlight-words": "^0.3.0", "react-virtualized": "^7.22.1", "react-virtualized-select": "^1.3.0", "sinon": "^1.17.5", diff --git a/src/Select.js b/src/Select.js index 29c7ab12..b440864a 100644 --- a/src/Select.js +++ b/src/Select.js @@ -3,6 +3,7 @@ import ReactDOM from 'react-dom'; import Input from 'react-input-autosize'; import classNames from 'classnames'; +import defaultArrowRenderer from './utils/defaultArrowRenderer'; import defaultFilterOptions from './utils/defaultFilterOptions'; import defaultMenuRenderer from './utils/defaultMenuRenderer'; @@ -38,6 +39,7 @@ const Select = React.createClass({ addLabelText: React.PropTypes.string, // placeholder displayed when you want to add a label on a multi-value input 'aria-label': React.PropTypes.string, // Aria label (for assistive tech) 'aria-labelledby': React.PropTypes.string, // HTML ID of an element that should be used as the label (for assistive tech) + arrowRenderer: React.PropTypes.func, // Create drop-down caret element autoBlur: React.PropTypes.bool, // automatically blur the component when an option is selected autofocus: React.PropTypes.bool, // autofocus the component on mount autosize: React.PropTypes.bool, // whether to enable autosizing or not @@ -109,6 +111,7 @@ const Select = React.createClass({ getDefaultProps () { return { addLabelText: 'Add "{label}"?', + arrowRenderer: defaultArrowRenderer, autosize: true, backspaceRemoves: true, backspaceToRemoveMessage: 'Press backspace to remove {label}', @@ -846,9 +849,15 @@ const Select = React.createClass({ }, renderArrow () { + const onMouseDown = this.handleMouseDownOnArrow; + const arrow = this.props.arrowRenderer({ onMouseDown }); + return ( - - + + {arrow} ); }, diff --git a/src/utils/defaultArrowRenderer.js b/src/utils/defaultArrowRenderer.js new file mode 100644 index 00000000..0654e310 --- /dev/null +++ b/src/utils/defaultArrowRenderer.js @@ -0,0 +1,10 @@ +import React from 'react'; + +export default function arrowRenderer ({ onMouseDown }) { + return ( + + ); +}; From 33f528febd07c9b8b0a1e1f1ffa805dd80fd0b55 Mon Sep 17 00:00:00 2001 From: Jed Watson Date: Mon, 5 Sep 2016 22:53:48 +1000 Subject: [PATCH 03/19] Minor whitespace fix --- src/Select.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Select.js b/src/Select.js index 23563d2f..4c5bd0b8 100644 --- a/src/Select.js +++ b/src/Select.js @@ -44,8 +44,7 @@ const Select = React.createClass({ autofocus: React.PropTypes.bool, // autofocus the component on mount autosize: React.PropTypes.bool, // whether to enable autosizing or not backspaceRemoves: React.PropTypes.bool, // whether backspace removes an item if there is no text input - backspaceToRemoveMessage: React.PropTypes.string, // Message to use for screenreaders to press backspace to remove the current item - - // {label} is replaced with the item label + backspaceToRemoveMessage: React.PropTypes.string, // Message to use for screenreaders to press backspace to remove the current item - {label} is replaced with the item label className: React.PropTypes.string, // className for the outer element clearAllText: stringOrNode, // title for the "clear" control when multi: true clearValueText: stringOrNode, // title for the "clear" control From 47149557781c069a9063555faacee04129c2b8d3 Mon Sep 17 00:00:00 2001 From: Jed Watson Date: Mon, 5 Sep 2016 23:02:18 +1000 Subject: [PATCH 04/19] Adding copyright header to src --- src/Select.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Select.js b/src/Select.js index 4c5bd0b8..966c03fb 100644 --- a/src/Select.js +++ b/src/Select.js @@ -1,3 +1,9 @@ +/*! + Copyright (c) 2016 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/react-select +*/ + import React from 'react'; import ReactDOM from 'react-dom'; import AutosizeInput from 'react-input-autosize'; From 6d387d8b167830d9e7bbe8b2dc1ab01ccfa6417e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Robichet?= Date: Tue, 6 Sep 2016 11:50:21 +1000 Subject: [PATCH 05/19] Vertical align variables --- scss/select.scss | 90 ++++++++++++++++++++++++------------------------ 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/scss/select.scss b/scss/select.scss index 4f2fc139..de78f9d1 100644 --- a/scss/select.scss +++ b/scss/select.scss @@ -10,62 +10,62 @@ // ------------------------------ // control options -$select-input-bg: #fff !default; -$select-input-bg-disabled: #f9f9f9 !default; -$select-input-border-color: #ccc !default; -$select-input-border-radius: 4px !default; -$select-input-border-focus: #08c !default; // blue -$select-input-border-width: 1px !default; -$select-input-height: 36px !default; -$select-input-internal-height: ($select-input-height - ($select-input-border-width * 2)) !default; -$select-input-placeholder: #aaa !default; -$select-text-color: #333 !default; -$select-link-hover-color: $select-input-border-focus !default; +$select-input-bg: #fff !default; +$select-input-bg-disabled: #f9f9f9 !default; +$select-input-border-color: #ccc !default; +$select-input-border-radius: 4px !default; +$select-input-border-focus: #08c !default; // blue +$select-input-border-width: 1px !default; +$select-input-height: 36px !default; +$select-input-internal-height: ($select-input-height - ($select-input-border-width * 2)) !default; +$select-input-placeholder: #aaa !default; +$select-text-color: #333 !default; +$select-link-hover-color: $select-input-border-focus !default; -$select-padding-vertical: 8px !default; -$select-padding-horizontal: 10px !default; +$select-padding-vertical: 8px !default; +$select-padding-horizontal: 10px !default; // menu options -$select-menu-zindex: 1000 !default; -$select-menu-max-height: 200px !default; +$select-menu-zindex: 1000 !default; +$select-menu-max-height: 200px !default; -$select-option-color: lighten($select-text-color, 20%) !default; -$select-option-bg: $select-input-bg !default; -$select-option-focused-color: $select-text-color !default; -$select-option-focused-bg: #f2f9fc !default; // pale blue -$select-option-selected-color: $select-text-color !default; -$select-option-selected-bg: #f5faff !default; // lightest blue -$select-option-disabled-color: lighten($select-text-color, 60%) !default; +$select-option-color: lighten($select-text-color, 20%) !default; +$select-option-bg: $select-input-bg !default; +$select-option-focused-color: $select-text-color !default; +$select-option-focused-bg: #f2f9fc !default; // pale blue +$select-option-selected-color: $select-text-color !default; +$select-option-selected-bg: #f5faff !default; // lightest blue +$select-option-disabled-color: lighten($select-text-color, 60%) !default; -$select-noresults-color: lighten($select-text-color, 40%) !default; +$select-noresults-color: lighten($select-text-color, 40%) !default; // clear "x" button -$select-clear-size: floor(($select-input-height / 2)) !default; -$select-clear-color: #999 !default; -$select-clear-hover-color: #D0021B !default; // red -$select-clear-width: ($select-input-internal-height / 2) !default; +$select-clear-size: floor(($select-input-height / 2)) !default; +$select-clear-color: #999 !default; +$select-clear-hover-color: #D0021B !default; // red +$select-clear-width: ($select-input-internal-height / 2) !default; // arrow indicator -$select-arrow-color: #999 !default; -$select-arrow-color-hover: #666 !default; -$select-arrow-width: 5px !default; +$select-arrow-color: #999 !default; +$select-arrow-color-hover: #666 !default; +$select-arrow-width: 5px !default; // loading indicator -$select-loading-size: 16px !default; -$select-loading-color: $select-text-color !default; -$select-loading-color-bg: $select-input-border-color !default; +$select-loading-size: 16px !default; +$select-loading-color: $select-text-color !default; +$select-loading-color-bg: $select-input-border-color !default; // multi-select item -$select-item-border-radius: 2px !default; -$select-item-gutter: 5px !default; -$select-item-padding-vertical: 2px !default; -$select-item-padding-horizontal: 5px !default; -$select-item-font-size: .9em !default; -$select-item-color: #08c !default; // pale blue -$select-item-bg: #f2f9fc !default; -$select-item-border-color: darken($select-item-bg, 10%) !default; -$select-item-hover-color: darken($select-item-color, 5%) !default; // pale blue -$select-item-hover-bg: darken($select-item-bg, 5%) !default; -$select-item-disabled-color: #333 !default; -$select-item-disabled-bg: #fcfcfc !default; +$select-item-border-radius: 2px !default; +$select-item-gutter: 5px !default; +$select-item-padding-vertical: 2px !default; +$select-item-padding-horizontal: 5px !default; +$select-item-font-size: .9em !default; +$select-item-color: #08c !default; // pale blue +$select-item-bg: #f2f9fc !default; +$select-item-border-color: darken($select-item-bg, 10%) !default; +$select-item-hover-color: darken($select-item-color, 5%) !default; // pale blue +$select-item-hover-bg: darken($select-item-bg, 5%) !default; +$select-item-disabled-color: #333 !default; +$select-item-disabled-bg: #fcfcfc !default; $select-item-disabled-border-color: darken($select-item-disabled-bg, 10%) !default; From 3554c1017204994b68b2f58d8dc5789552b342c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Robichet?= Date: Tue, 6 Sep 2016 11:53:51 +1000 Subject: [PATCH 06/19] Vertical align variables --- less/select.less | 100 +++++++++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/less/select.less b/less/select.less index 7e3a488b..a1875c7b 100644 --- a/less/select.less +++ b/less/select.less @@ -10,76 +10,76 @@ // ------------------------------ // common -@select-primary-color: #007eff; +@select-primary-color: #007eff; // control options -@select-input-bg: #fff; -@select-input-bg-disabled: #f9f9f9; -@select-input-border-color: #ccc; -@select-input-border-radius: 4px; -@select-input-border-focus: @select-primary-color; -@select-input-border-width: 1px; -@select-input-height: 36px; -@select-input-internal-height: (@select-input-height - (@select-input-border-width * 2)); -@select-input-placeholder: #aaa; -@select-text-color: #333; -@select-link-hover-color: @select-input-border-focus; +@select-input-bg: #fff; +@select-input-bg-disabled: #f9f9f9; +@select-input-border-color: #ccc; +@select-input-border-radius: 4px; +@select-input-border-focus: @select-primary-color; +@select-input-border-width: 1px; +@select-input-height: 36px; +@select-input-internal-height: (@select-input-height - (@select-input-border-width * 2)); +@select-input-placeholder: #aaa; +@select-text-color: #333; +@select-link-hover-color: @select-input-border-focus; -@select-padding-vertical: 8px; -@select-padding-horizontal: 10px; +@select-padding-vertical: 8px; +@select-padding-horizontal: 10px; // menu options -@select-menu-zindex: 1; -@select-menu-max-height: 200px; +@select-menu-zindex: 1; +@select-menu-max-height: 200px; -@select-option-color: lighten(@select-text-color, 20%); -@select-option-bg: @select-input-bg; -@select-option-focused-color: @select-text-color; -@select-option-focused-bg: fade(@select-primary-color, 8%); -@select-option-focused-bg-fb: mix(@select-primary-color, @select-option-bg, 8%); // Fallback color for IE 8 -@select-option-selected-color: @select-text-color; -@select-option-selected-bg: fade(@select-primary-color, 4%); +@select-option-color: lighten(@select-text-color, 20%); +@select-option-bg: @select-input-bg; +@select-option-focused-color: @select-text-color; +@select-option-focused-bg: fade(@select-primary-color, 8%); +@select-option-focused-bg-fb: mix(@select-primary-color, @select-option-bg, 8%); // Fallback color for IE 8 +@select-option-selected-color: @select-text-color; +@select-option-selected-bg: fade(@select-primary-color, 4%); @select-option-selected-bg-fb: mix(@select-primary-color, @select-option-bg, 4%); // Fallback color for IE 8 -@select-option-disabled-color: lighten(@select-text-color, 60%); +@select-option-disabled-color: lighten(@select-text-color, 60%); -@select-noresults-color: lighten(@select-text-color, 40%); +@select-noresults-color: lighten(@select-text-color, 40%); // clear "x" button -@select-clear-size: floor((@select-input-height / 2)); -@select-clear-color: #999; -@select-clear-hover-color: #D0021B; // red -@select-clear-width: (@select-input-internal-height / 2); +@select-clear-size: floor((@select-input-height / 2)); +@select-clear-color: #999; +@select-clear-hover-color: #D0021B; // red +@select-clear-width: (@select-input-internal-height / 2); // arrow indicator -@select-arrow-color: #999; -@select-arrow-color-hover: #666; -@select-arrow-width: 5px; +@select-arrow-color: #999; +@select-arrow-color-hover: #666; +@select-arrow-width: 5px; // loading indicator -@select-loading-size: 16px; -@select-loading-color: @select-text-color; -@select-loading-color-bg: @select-input-border-color; +@select-loading-size: 16px; +@select-loading-color: @select-text-color; +@select-loading-color-bg: @select-input-border-color; // multi-select item -@select-item-font-size: .9em; +@select-item-font-size: .9em; -@select-item-bg: fade(@select-primary-color, 8%); -@select-item-bg-fb: mix(@select-primary-color, @select-input-bg, 8%); // Fallback color for IE 8 -@select-item-color: @select-primary-color; -@select-item-border-color: fade(@select-primary-color, 24%); -@select-item-border-color-fb: mix(@select-primary-color, @select-input-bg, 24%); // Fallback color for IE 8 -@select-item-hover-color: darken(@select-item-color, 5%); -@select-item-hover-bg: darken(@select-item-bg, 5%); -@select-item-hover-bg-fb: mix(darken(@select-primary-color, 5%), @select-item-bg-fb, 8%); // Fallback color for IE 8 -@select-item-disabled-color: #333; -@select-item-disabled-bg: #fcfcfc; +@select-item-bg: fade(@select-primary-color, 8%); +@select-item-bg-fb: mix(@select-primary-color, @select-input-bg, 8%); // Fallback color for IE 8 +@select-item-color: @select-primary-color; +@select-item-border-color: fade(@select-primary-color, 24%); +@select-item-border-color-fb: mix(@select-primary-color, @select-input-bg, 24%); // Fallback color for IE 8 +@select-item-hover-color: darken(@select-item-color, 5%); +@select-item-hover-bg: darken(@select-item-bg, 5%); +@select-item-hover-bg-fb: mix(darken(@select-primary-color, 5%), @select-item-bg-fb, 8%); // Fallback color for IE 8 +@select-item-disabled-color: #333; +@select-item-disabled-bg: #fcfcfc; @select-item-disabled-border-color: darken(@select-item-disabled-bg, 10%); -@select-item-border-radius: 2px; -@select-item-gutter: 5px; +@select-item-border-radius: 2px; +@select-item-gutter: 5px; -@select-item-padding-horizontal: 5px; -@select-item-padding-vertical: 2px; +@select-item-padding-horizontal: 5px; +@select-item-padding-vertical: 2px; // imports @import "control.less"; From 17a3e5d7dcac9309fef487f0055279ee35107c21 Mon Sep 17 00:00:00 2001 From: nhducit Date: Sun, 11 Sep 2016 00:25:50 +0700 Subject: [PATCH 07/19] Do not focus and open menu when disabled --- src/Select.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Select.js b/src/Select.js index 53ead0f7..4712bf74 100644 --- a/src/Select.js +++ b/src/Select.js @@ -353,6 +353,7 @@ const Select = React.createClass({ }, handleInputFocus (event) { + if (this.props.disabled) return; var isOpen = this.state.isOpen || this._openAfterFocus || this.props.openOnFocus; if (this.props.onFocus) { this.props.onFocus(event); From cf76d953c8c3f1556c70b51dad28ce60fe9b2284 Mon Sep 17 00:00:00 2001 From: Ruben Martinez Jr Date: Sat, 10 Sep 2016 13:03:34 -0700 Subject: [PATCH 08/19] Document promptTextCreator property of Creatable. https://github.com/JedWatson/react-select/issues/1202#issuecomment-246130181 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index db0e3c83..a9e2030c 100644 --- a/README.md +++ b/README.md @@ -220,6 +220,7 @@ Property | Type | Description `isValidNewOption` | function | Determines if the current input text represents a valid option. By default any non-empty string will be considered valid. Expected signature: `({ label: string }): boolean` | `newOptionCreator` | function | Factory to create new option. Expected signature: `({ label: string, labelKey: string, valueKey: string }): Object` | `shouldKeyDownEventCreateNewOption` | function | Decides if a keyDown event (eg its `keyCode`) should result in the creation of a new option. ENTER, TAB and comma keys create new options by dfeault. Expected signature: `({ keyCode: number }): boolean` | +`promptTextCreator` | function | Factory for overriding default option creator prompt label. By default it will read 'Create option "{label}"'. Expected signature: `(label: String): String` | ### Filtering options From a863d15092c97fc2db9f94f28a147e20a9d03ed8 Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Sun, 11 Sep 2016 08:57:00 +0800 Subject: [PATCH 09/19] Creatable and Async components can compose each other Following a child-function pattern. Tests have been added. --- README.md | 2 ++ src/Async.js | 40 +++++++++++++++++++++++++++------------- src/Creatable.js | 42 ++++++++++++++++++++++++++++++------------ test/Async-test.js | 27 +++++++++++++++++++++++++++ test/Creatable-test.js | 17 +++++++++++++++++ 5 files changed, 103 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index db0e3c83..66292047 100644 --- a/README.md +++ b/README.md @@ -216,9 +216,11 @@ function render (selectProps) { Property | Type | Description :---|:---|:--- +`children` | function | Child function responsible for creating the inner Select component. This component can be used to compose HOCs (eg Creatable and Async). Expected signature: `(props: Object): PropTypes.element` | `isOptionUnique` | function | Searches for any matching option within the set of options. This function prevents duplicate options from being created. By default this is a basic, case-sensitive comparison of label and value. Expected signature: `({ option: Object, options: Array, labelKey: string, valueKey: string }): boolean` | `isValidNewOption` | function | Determines if the current input text represents a valid option. By default any non-empty string will be considered valid. Expected signature: `({ label: string }): boolean` | `newOptionCreator` | function | Factory to create new option. Expected signature: `({ label: string, labelKey: string, valueKey: string }): Object` | +`promptTextCreator` | function | Creates prompt/placeholder option text. Expected signature: `(filterText: string): string` `shouldKeyDownEventCreateNewOption` | function | Decides if a keyDown event (eg its `keyCode`) should result in the creation of a new option. ENTER, TAB and comma keys create new options by dfeault. Expected signature: `({ keyCode: number }): boolean` | ### Filtering options diff --git a/src/Async.js b/src/Async.js index 5de2bcef..6840fc3a 100644 --- a/src/Async.js +++ b/src/Async.js @@ -44,6 +44,7 @@ const stringOrNode = React.PropTypes.oneOfType([ const Async = React.createClass({ propTypes: { cache: React.PropTypes.any, // object to use to cache results, can be null to disable cache + children: React.PropTypes.func, // Child function responsible for creating the inner Select component; (props: Object): PropTypes.element ignoreAccents: React.PropTypes.bool, // whether to strip diacritics when filtering (shared with Select) ignoreCase: React.PropTypes.bool, // whether to perform case-insensitive filtering (shared with Select) isLoading: React.PropTypes.bool, // overrides the isLoading state when set to true @@ -53,7 +54,7 @@ const Async = React.createClass({ noResultsText: stringOrNode, // placeholder displayed when there are no matching search results (shared with Select) onInputChange: React.PropTypes.func, // onInputChange handler: function (inputValue) {} placeholder: stringOrNode, // field placeholder, displayed when there's no value (shared with Select) - searchPromptText: stringOrNode, // label to prompt for search input + searchPromptText: stringOrNode, // label to prompt for search input searchingText: React.PropTypes.string, // message to display while options are loading }, getDefaultProps () { @@ -141,7 +142,11 @@ const Async = React.createClass({ }) : input; }, render () { - let { noResultsText } = this.props; + let { + children = defaultChildren, + noResultsText, + ...restProps + } = this.props; let { isLoading, options } = this.state; if (this.props.isLoading) isLoading = true; let placeholder = isLoading ? this.props.loadingPlaceholder : this.props.placeholder; @@ -150,18 +155,27 @@ const Async = React.createClass({ } else if (!options.length && this._lastInput.length < this.props.minimumInput) { noResultsText = this.props.searchPromptText; } - return ( - + ); +}; + module.exports = Async; diff --git a/src/Creatable.js b/src/Creatable.js index bf316e1e..bdaadf38 100644 --- a/src/Creatable.js +++ b/src/Creatable.js @@ -7,6 +7,11 @@ const Creatable = React.createClass({ displayName: 'CreatableSelect', propTypes: { + // Child function responsible for creating the inner Select component + // This component can be used to compose HOCs (eg Creatable and Async) + // (props: Object): PropTypes.element + children: React.PropTypes.func, + // See Select.propTypes.filterOptions filterOptions: React.PropTypes.any, @@ -160,21 +165,34 @@ const Creatable = React.createClass({ }, render () { - const { newOptionCreator, shouldKeyDownEventCreateNewOption, ...restProps } = this.props; - - return ( - + ); +}; + function isOptionUnique ({ option, options, labelKey, valueKey }) { return options .filter((existingOption) => diff --git a/test/Async-test.js b/test/Async-test.js index 59a3ffb8..431c45b7 100644 --- a/test/Async-test.js +++ b/test/Async-test.js @@ -573,4 +573,31 @@ describe('Async', () => { expect(loadOptions, 'was called with', 'ware'); }); }); + + describe('children function', () => { + it('should allow a custom select type to be rendered', () => { + let childProps; + const node = ReactDOM.findDOMNode( + TestUtils.renderIntoDocument( + + {(props) => { + childProps = props; + return
faux select
; + }} +
+ ) + ); + expect(node.textContent, 'to equal', 'faux select'); + expect(childProps.isLoading, 'to equal', true); + }); + + it('should render a Select component by default', () => { + const node = ReactDOM.findDOMNode( + TestUtils.renderIntoDocument( + + ) + ); + expect(node.className, 'to contain', 'Select'); + }); + }); }); diff --git a/test/Creatable-test.js b/test/Creatable-test.js index aca1ffde..09144d59 100644 --- a/test/Creatable-test.js +++ b/test/Creatable-test.js @@ -125,6 +125,23 @@ describe('Creatable', () => { expect(options, 'to have length', 1); }); + it('should allow a custom select type to be rendered via the :children property', () => { + let childProps; + createControl({ + children: (props) => { + childProps = props; + return
faux select
; + } + }); + expect(creatableNode.textContent, 'to equal', 'faux select'); + expect(childProps.allowCreate, 'to equal', true); + }); + + it('default :children function renders a Select component', () => { + createControl(); + expect(creatableNode.className, 'to contain', 'Select'); + }); + it('default :isOptionUnique function should do a simple equality check for value and label', () => { const options = [ newOption('foo', 1), From d977fb100c521f151738ff144eed4135e39d41a8 Mon Sep 17 00:00:00 2001 From: Jed Watson Date: Sun, 11 Sep 2016 21:37:56 +1000 Subject: [PATCH 10/19] Updating dependencies --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index bcc74130..bd6edf53 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "gulp": "^3.9.1", "isomorphic-fetch": "^2.2.1", "istanbul": "^0.4.5", - "jsdom": "^9.4.2", + "jsdom": "^9.5.0", "mocha": "^3.0.2", "react": "^15.0", "react-addons-shallow-compare": "^15.0", @@ -33,12 +33,12 @@ "react-dom": "^15.0", "react-gravatar": "^2.4.5", "react-highlight-words": "^0.3.0", - "react-virtualized": "^7.22.1", - "react-virtualized-select": "^1.3.0", + "react-virtualized": "^7.23.0", + "react-virtualized-select": "^1.4.0", "sinon": "^1.17.5", - "unexpected": "^10.16.0", + "unexpected": "^10.17.0", "unexpected-dom": "^3.1.0", - "unexpected-react": "^3.2.3", + "unexpected-react": "^3.2.4", "unexpected-sinon": "^10.4.0" }, "peerDependencies": { From f723189ed547a868cb96ad321d7918b6636fd872 Mon Sep 17 00:00:00 2001 From: Jed Watson Date: Sun, 11 Sep 2016 21:38:02 +1000 Subject: [PATCH 11/19] Updating build --- dist/react-select.js | 151 +++++-- dist/react-select.min.js | 4 +- examples/dist/app.js | 681 ++++++++++++++++++++++++------ examples/dist/bundle.js | 149 +++++-- examples/dist/common.js | 36 +- examples/dist/standalone.js | 151 +++++-- lib/Async.js | 30 +- lib/Creatable.js | 55 ++- lib/Select.js | 28 +- lib/utils/defaultArrowRenderer.js | 24 ++ 10 files changed, 1013 insertions(+), 296 deletions(-) create mode 100644 lib/utils/defaultArrowRenderer.js diff --git a/dist/react-select.js b/dist/react-select.js index 160e4f51..0fb8aad0 100644 --- a/dist/react-select.js +++ b/dist/react-select.js @@ -6,6 +6,8 @@ var _extends = Object.assign || function (target) { for (var i = 1; i < argument function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } + var _react = (typeof window !== "undefined" ? window['React'] : typeof global !== "undefined" ? global['React'] : null); var _react2 = _interopRequireDefault(_react); @@ -58,6 +60,7 @@ var Async = _react2['default'].createClass({ propTypes: { cache: _react2['default'].PropTypes.any, // object to use to cache results, can be null to disable cache + children: _react2['default'].PropTypes.func, // Child function responsible for creating the inner Select component; (props: Object): PropTypes.element ignoreAccents: _react2['default'].PropTypes.bool, // whether to strip diacritics when filtering (shared with Select) ignoreCase: _react2['default'].PropTypes.bool, // whether to perform case-insensitive filtering (shared with Select) isLoading: _react2['default'].PropTypes.bool, // overrides the isLoading state when set to true @@ -159,7 +162,13 @@ var Async = _react2['default'].createClass({ render: function render() { var _this2 = this; - var noResultsText = this.props.noResultsText; + var _props = this.props; + var _props$children = _props.children; + var children = _props$children === undefined ? defaultChildren : _props$children; + var noResultsText = _props.noResultsText; + + var restProps = _objectWithoutProperties(_props, ['children', 'noResultsText']); + var _state = this.state; var isLoading = _state.isLoading; var options = _state.options; @@ -171,23 +180,30 @@ var Async = _react2['default'].createClass({ } else if (!options.length && this._lastInput.length < this.props.minimumInput) { noResultsText = this.props.searchPromptText; } - return _react2['default'].createElement(_Select2['default'], _extends({}, this.props, { - ref: function (ref) { - return _this2.select = ref; - }, + + var props = _extends({}, restProps, { isLoading: isLoading, noResultsText: noResultsText, onInputChange: this.loadOptions, options: options, - placeholder: placeholder - })); + placeholder: placeholder, + ref: function ref(_ref) { + _this2.select = _ref; + } + }); + + return children(props); } }); +function defaultChildren(props) { + return _react2['default'].createElement(_Select2['default'], props); +}; + module.exports = Async; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./Select":4,"./utils/stripDiacritics":8}],2:[function(require,module,exports){ +},{"./Select":4,"./utils/stripDiacritics":9}],2:[function(require,module,exports){ (function (global){ 'use strict'; @@ -217,6 +233,11 @@ var Creatable = _react2['default'].createClass({ displayName: 'CreatableSelect', propTypes: { + // Child function responsible for creating the inner Select component + // This component can be used to compose HOCs (eg Creatable and Async) + // (props: Object): PropTypes.element + children: _react2['default'].PropTypes.func, + // See Select.propTypes.filterOptions filterOptions: _react2['default'].PropTypes.any, @@ -325,9 +346,9 @@ var Creatable = _react2['default'].createClass({ return filteredOptions; }, - isOptionUnique: function isOptionUnique(_ref) { - var option = _ref.option; - var options = _ref.options; + isOptionUnique: function isOptionUnique(_ref2) { + var option = _ref2.option; + var options = _ref2.options; if (!this.select) { return false; @@ -381,44 +402,52 @@ var Creatable = _react2['default'].createClass({ var _this = this; var _props3 = this.props; + var _props3$children = _props3.children; + var children = _props3$children === undefined ? defaultChildren : _props3$children; var newOptionCreator = _props3.newOptionCreator; var shouldKeyDownEventCreateNewOption = _props3.shouldKeyDownEventCreateNewOption; - var restProps = _objectWithoutProperties(_props3, ['newOptionCreator', 'shouldKeyDownEventCreateNewOption']); + var restProps = _objectWithoutProperties(_props3, ['children', 'newOptionCreator', 'shouldKeyDownEventCreateNewOption']); - return _react2['default'].createElement(_Select2['default'], _extends({}, restProps, { + var props = _extends({}, restProps, { allowCreate: true, filterOptions: this.filterOptions, menuRenderer: this.menuRenderer, onInputKeyDown: this.onInputKeyDown, - ref: function (ref) { - return _this.select = ref; + ref: function ref(_ref) { + _this.select = _ref; } - })); + }); + + return children(props); } }); -function isOptionUnique(_ref2) { - var option = _ref2.option; - var options = _ref2.options; - var labelKey = _ref2.labelKey; - var valueKey = _ref2.valueKey; +function defaultChildren(props) { + return _react2['default'].createElement(_Select2['default'], props); +}; + +function isOptionUnique(_ref3) { + var option = _ref3.option; + var options = _ref3.options; + var labelKey = _ref3.labelKey; + var valueKey = _ref3.valueKey; return options.filter(function (existingOption) { return existingOption[labelKey] === option[labelKey] || existingOption[valueKey] === option[valueKey]; }).length === 0; }; -function isValidNewOption(_ref3) { - var label = _ref3.label; +function isValidNewOption(_ref4) { + var label = _ref4.label; return !!label; }; -function newOptionCreator(_ref4) { - var label = _ref4.label; - var labelKey = _ref4.labelKey; - var valueKey = _ref4.valueKey; +function newOptionCreator(_ref5) { + var label = _ref5.label; + var labelKey = _ref5.labelKey; + var valueKey = _ref5.valueKey; var option = {}; option[valueKey] = label; @@ -431,8 +460,8 @@ function promptTextCreator(label) { return 'Create option "' + label + '"'; } -function shouldKeyDownEventCreateNewOption(_ref5) { - var keyCode = _ref5.keyCode; +function shouldKeyDownEventCreateNewOption(_ref6) { + var keyCode = _ref6.keyCode; switch (keyCode) { case 9: // TAB @@ -448,7 +477,7 @@ function shouldKeyDownEventCreateNewOption(_ref5) { module.exports = Creatable; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./Select":4,"./utils/defaultFilterOptions":6,"./utils/defaultMenuRenderer":7}],3:[function(require,module,exports){ +},{"./Select":4,"./utils/defaultFilterOptions":7,"./utils/defaultMenuRenderer":8}],3:[function(require,module,exports){ (function (global){ 'use strict'; @@ -565,6 +594,12 @@ module.exports = Option; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],4:[function(require,module,exports){ (function (global){ +/*! + Copyright (c) 2016 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/react-select +*/ + 'use strict'; Object.defineProperty(exports, '__esModule', { @@ -595,6 +630,10 @@ var _classnames = (typeof window !== "undefined" ? window['classNames'] : typeof var _classnames2 = _interopRequireDefault(_classnames); +var _utilsDefaultArrowRenderer = require('./utils/defaultArrowRenderer'); + +var _utilsDefaultArrowRenderer2 = _interopRequireDefault(_utilsDefaultArrowRenderer); + var _utilsDefaultFilterOptions = require('./utils/defaultFilterOptions'); var _utilsDefaultFilterOptions2 = _interopRequireDefault(_utilsDefaultFilterOptions); @@ -643,12 +682,12 @@ var Select = _react2['default'].createClass({ addLabelText: _react2['default'].PropTypes.string, // placeholder displayed when you want to add a label on a multi-value input 'aria-label': _react2['default'].PropTypes.string, // Aria label (for assistive tech) 'aria-labelledby': _react2['default'].PropTypes.string, // HTML ID of an element that should be used as the label (for assistive tech) + arrowRenderer: _react2['default'].PropTypes.func, // Create drop-down caret element autoBlur: _react2['default'].PropTypes.bool, // automatically blur the component when an option is selected autofocus: _react2['default'].PropTypes.bool, // autofocus the component on mount autosize: _react2['default'].PropTypes.bool, // whether to enable autosizing or not backspaceRemoves: _react2['default'].PropTypes.bool, // whether backspace removes an item if there is no text input - backspaceToRemoveMessage: _react2['default'].PropTypes.string, // Message to use for screenreaders to press backspace to remove the current item - - // {label} is replaced with the item label + backspaceToRemoveMessage: _react2['default'].PropTypes.string, // Message to use for screenreaders to press backspace to remove the current item - {label} is replaced with the item label className: _react2['default'].PropTypes.string, // className for the outer element clearAllText: stringOrNode, // title for the "clear" control when multi: true clearValueText: stringOrNode, // title for the "clear" control @@ -714,6 +753,7 @@ var Select = _react2['default'].createClass({ getDefaultProps: function getDefaultProps() { return { addLabelText: 'Add "{label}"?', + arrowRenderer: _utilsDefaultArrowRenderer2['default'], autosize: true, backspaceRemoves: true, backspaceToRemoveMessage: 'Press backspace to remove {label}', @@ -924,7 +964,7 @@ var Select = _react2['default'].createClass({ var input = this.input; if (typeof input.getInput === 'function') { - // Get the actual DOM input if the ref is an component + // Get the actual DOM input if the ref is an component input = input.getInput(); } @@ -991,6 +1031,7 @@ var Select = _react2['default'].createClass({ }, handleInputFocus: function handleInputFocus(event) { + if (this.props.disabled) return; var isOpen = this.state.isOpen || this._openAfterFocus || this.props.openOnFocus; if (this.props.onFocus) { this.props.onFocus(event); @@ -1512,10 +1553,16 @@ var Select = _react2['default'].createClass({ }, renderArrow: function renderArrow() { + var onMouseDown = this.handleMouseDownOnArrow; + var arrow = this.props.arrowRenderer({ onMouseDown: onMouseDown }); + return _react2['default'].createElement( 'span', - { className: 'Select-arrow-zone', onMouseDown: this.handleMouseDownOnArrow }, - _react2['default'].createElement('span', { className: 'Select-arrow', onMouseDown: this.handleMouseDownOnArrow }) + { + className: 'Select-arrow-zone', + onMouseDown: onMouseDown + }, + arrow ); }, @@ -1717,7 +1764,7 @@ exports['default'] = Select; module.exports = exports['default']; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./Async":1,"./Creatable":2,"./Option":3,"./Value":5,"./utils/defaultFilterOptions":6,"./utils/defaultMenuRenderer":7}],5:[function(require,module,exports){ +},{"./Async":1,"./Creatable":2,"./Option":3,"./Value":5,"./utils/defaultArrowRenderer":6,"./utils/defaultFilterOptions":7,"./utils/defaultMenuRenderer":8}],5:[function(require,module,exports){ (function (global){ 'use strict'; @@ -1828,6 +1875,34 @@ module.exports = Value; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],6:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = arrowRenderer; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var _react = (typeof window !== "undefined" ? window['React'] : typeof global !== "undefined" ? global['React'] : null); + +var _react2 = _interopRequireDefault(_react); + +function arrowRenderer(_ref) { + var onMouseDown = _ref.onMouseDown; + + return _react2["default"].createElement("span", { + className: "Select-arrow", + onMouseDown: onMouseDown + }); +} + +; +module.exports = exports["default"]; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],7:[function(require,module,exports){ 'use strict'; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } @@ -1871,7 +1946,7 @@ function filterOptions(options, filterValue, excludeOptions, props) { module.exports = filterOptions; -},{"./stripDiacritics":8}],7:[function(require,module,exports){ +},{"./stripDiacritics":9}],8:[function(require,module,exports){ (function (global){ 'use strict'; @@ -1934,7 +2009,7 @@ function menuRenderer(_ref) { module.exports = menuRenderer; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],8:[function(require,module,exports){ +},{}],9:[function(require,module,exports){ 'use strict'; var map = [{ 'base': 'A', 'letters': /[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g }, { 'base': 'AA', 'letters': /[\uA732]/g }, { 'base': 'AE', 'letters': /[\u00C6\u01FC\u01E2]/g }, { 'base': 'AO', 'letters': /[\uA734]/g }, { 'base': 'AU', 'letters': /[\uA736]/g }, { 'base': 'AV', 'letters': /[\uA738\uA73A]/g }, { 'base': 'AY', 'letters': /[\uA73C]/g }, { 'base': 'B', 'letters': /[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g }, { 'base': 'C', 'letters': /[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g }, { 'base': 'D', 'letters': /[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g }, { 'base': 'DZ', 'letters': /[\u01F1\u01C4]/g }, { 'base': 'Dz', 'letters': /[\u01F2\u01C5]/g }, { 'base': 'E', 'letters': /[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g }, { 'base': 'F', 'letters': /[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g }, { 'base': 'G', 'letters': /[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g }, { 'base': 'H', 'letters': /[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g }, { 'base': 'I', 'letters': /[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g }, { 'base': 'J', 'letters': /[\u004A\u24BF\uFF2A\u0134\u0248]/g }, { 'base': 'K', 'letters': /[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g }, { 'base': 'L', 'letters': /[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g }, { 'base': 'LJ', 'letters': /[\u01C7]/g }, { 'base': 'Lj', 'letters': /[\u01C8]/g }, { 'base': 'M', 'letters': /[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g }, { 'base': 'N', 'letters': /[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g }, { 'base': 'NJ', 'letters': /[\u01CA]/g }, { 'base': 'Nj', 'letters': /[\u01CB]/g }, { 'base': 'O', 'letters': /[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g }, { 'base': 'OI', 'letters': /[\u01A2]/g }, { 'base': 'OO', 'letters': /[\uA74E]/g }, { 'base': 'OU', 'letters': /[\u0222]/g }, { 'base': 'P', 'letters': /[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g }, { 'base': 'Q', 'letters': /[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g }, { 'base': 'R', 'letters': /[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g }, { 'base': 'S', 'letters': /[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g }, { 'base': 'T', 'letters': /[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g }, { 'base': 'TZ', 'letters': /[\uA728]/g }, { 'base': 'U', 'letters': /[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g }, { 'base': 'V', 'letters': /[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g }, { 'base': 'VY', 'letters': /[\uA760]/g }, { 'base': 'W', 'letters': /[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g }, { 'base': 'X', 'letters': /[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g }, { 'base': 'Y', 'letters': /[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g }, { 'base': 'Z', 'letters': /[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g }, { 'base': 'a', 'letters': /[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g }, { 'base': 'aa', 'letters': /[\uA733]/g }, { 'base': 'ae', 'letters': /[\u00E6\u01FD\u01E3]/g }, { 'base': 'ao', 'letters': /[\uA735]/g }, { 'base': 'au', 'letters': /[\uA737]/g }, { 'base': 'av', 'letters': /[\uA739\uA73B]/g }, { 'base': 'ay', 'letters': /[\uA73D]/g }, { 'base': 'b', 'letters': /[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g }, { 'base': 'c', 'letters': /[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g }, { 'base': 'd', 'letters': /[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g }, { 'base': 'dz', 'letters': /[\u01F3\u01C6]/g }, { 'base': 'e', 'letters': /[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g }, { 'base': 'f', 'letters': /[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g }, { 'base': 'g', 'letters': /[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g }, { 'base': 'h', 'letters': /[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g }, { 'base': 'hv', 'letters': /[\u0195]/g }, { 'base': 'i', 'letters': /[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g }, { 'base': 'j', 'letters': /[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g }, { 'base': 'k', 'letters': /[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g }, { 'base': 'l', 'letters': /[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g }, { 'base': 'lj', 'letters': /[\u01C9]/g }, { 'base': 'm', 'letters': /[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g }, { 'base': 'n', 'letters': /[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g }, { 'base': 'nj', 'letters': /[\u01CC]/g }, { 'base': 'o', 'letters': /[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g }, { 'base': 'oi', 'letters': /[\u01A3]/g }, { 'base': 'ou', 'letters': /[\u0223]/g }, { 'base': 'oo', 'letters': /[\uA74F]/g }, { 'base': 'p', 'letters': /[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g }, { 'base': 'q', 'letters': /[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g }, { 'base': 'r', 'letters': /[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g }, { 'base': 's', 'letters': /[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g }, { 'base': 't', 'letters': /[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g }, { 'base': 'tz', 'letters': /[\uA729]/g }, { 'base': 'u', 'letters': /[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g }, { 'base': 'v', 'letters': /[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g }, { 'base': 'vy', 'letters': /[\uA761]/g }, { 'base': 'w', 'letters': /[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g }, { 'base': 'x', 'letters': /[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g }, { 'base': 'y', 'letters': /[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g }, { 'base': 'z', 'letters': /[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g }]; diff --git a/dist/react-select.min.js b/dist/react-select.min.js index 0a8bdddc..857fb83d 100644 --- a/dist/react-select.min.js +++ b/dist/react-select.min.js @@ -1,2 +1,2 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Select=e()}}(function(){return function e(t,u,s){function n(i,a){if(!u[i]){if(!t[i]){var r="function"==typeof require&&require;if(!a&&r)return r(i,!0);if(o)return o(i,!0);var l=new Error("Cannot find module '"+i+"'");throw l.code="MODULE_NOT_FOUND",l}var p=u[i]={exports:{}};t[i][0].call(p.exports,function(e){var u=t[i][1][e];return n(u?u:e)},p,p.exports,e,t,u,s)}return u[i].exports}for(var o="function"==typeof require&&require,i=0;i=0;--u){var s=t.slice(0,u);if(e[s]&&(t===s||e[s].complete))return e[s]}}function a(e,t){if(e&&"function"==typeof e.then)return e.then(function(e){t(null,e)},function(e){t(e)})}var r=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,s)&&(u[s]=e[s]);return u}function o(e){var t=e.option,u=e.options,s=e.labelKey,n=e.valueKey;return 0===u.filter(function(e){return e[s]===t[s]||e[n]===t[n]}).length}function i(e){var t=e.label;return!!t}function a(e){var t=e.label,u=e.labelKey,s=e.valueKey,n={};return n[s]=t,n[u]=t,n.className="Select-create-option-placeholder",n}function r(e){return'Create option "'+e+'"'}function l(e){var t=e.keyCode;switch(t){case 9:case 13:case 188:return!0}return!1}var p=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,s)&&(u[s]=e[s]);return u}function i(e,t,u){return t in e?Object.defineProperty(e,t,{value:u,enumerable:!0,configurable:!0,writable:!0}):e[t]=u,e}function a(e){return"string"==typeof e?e:"object"==typeof e?JSON.stringify(e):e||0===e?String(e):""}Object.defineProperty(u,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;ta.bottom||i.topt.offsetHeight&&!(t.scrollHeight-t.offsetHeight-t.scrollTop)&&this.props.onMenuScrollToBottom()}},handleRequired:function(e,t){return!e||(t?0===e.length:0===Object.keys(e).length)},getOptionLabel:function(e){return e[this.props.labelKey]},getValueArray:function(e,t){var u=this,s="object"==typeof t?t:this.props;if(s.multi){if("string"==typeof e&&(e=e.split(s.delimiter)),!Array.isArray(e)){if(null===e||void 0===e)return[];e=[e]}return e.map(function(e){return u.expandValue(e,s)}).filter(function(e){return e})}var n=this.expandValue(e,s);return n?[n]:[]},expandValue:function(e,t){if("string"!=typeof e&&"number"!=typeof e)return e;var u=t.options,s=t.valueKey;if(u)for(var n=0;n0?u-=1:u=t.length-1;else if("start"===e)u=0;else if("end"===e)u=t.length-1;else if("page_up"===e){var n=u-this.props.pageSize;u=n<0?0:n}else if("page_down"===e){var n=u+this.props.pageSize;u=n>t.length-1?t.length-1:n}u===-1&&(u=0),this.setState({focusedIndex:t[u].index,focusedOption:t[u].option})}},getFocusedOption:function(){return this._focusedOption},getInputValue:function(){return this.state.inputValue},selectFocusedOption:function(){if(this._focusedOption)return this.selectValue(this._focusedOption)},renderLoading:function(){if(this.props.isLoading)return p["default"].createElement("span",{className:"Select-loading-zone","aria-hidden":"true"},p["default"].createElement("span",{className:"Select-loading"}))},renderValue:function(e,t){var u=this,s=this.props.valueRenderer||this.getOptionLabel,n=this.props.valueComponent;if(!e.length)return this.state.inputValue?null:p["default"].createElement("div",{className:"Select-placeholder"},this.props.placeholder);var o=this.props.onValueClick?this.handleValueClick:null;return this.props.multi?e.map(function(e,t){return p["default"].createElement(n,{id:u._instancePrefix+"-value-"+t,instancePrefix:u._instancePrefix,disabled:u.props.disabled||e.clearableValue===!1,key:"value-"+t+"-"+e[u.props.valueKey],onClick:o,onRemove:u.removeValue,value:e},s(e,t),p["default"].createElement("span",{className:"Select-aria-only"}," "))}):this.state.inputValue?void 0:(t&&(o=null),p["default"].createElement(n,{id:this._instancePrefix+"-value-item",disabled:this.props.disabled,instancePrefix:this._instancePrefix,onClick:o,value:e[0]},s(e[0])))},renderInput:function(e,t){var u=this;if(this.props.inputRenderer)return this.props.inputRenderer();var s,n=(0,g["default"])("Select-input",this.props.inputProps.className),a=!!this.state.isOpen,l=(0,g["default"])((s={},i(s,this._instancePrefix+"-list",a),i(s,this._instancePrefix+"-backspace-remove-message",this.props.multi&&!this.props.disabled&&this.state.isFocused&&!this.state.inputValue),s)),c=r({},this.props.inputProps,{role:"combobox","aria-expanded":""+a,"aria-owns":l,"aria-haspopup":""+a,"aria-activedescendant":a?this._instancePrefix+"-option-"+t:this._instancePrefix+"-value","aria-labelledby":this.props["aria-labelledby"],"aria-label":this.props["aria-label"],className:n,tabIndex:this.props.tabIndex,onBlur:this.handleInputBlur,onChange:this.handleInputChange,onFocus:this.handleInputFocus,ref:function(e){return u.input=e},required:this.state.required,value:this.state.inputValue});if(this.props.disabled||!this.props.searchable){var d=this.props.inputProps,f=(d.inputClassName,o(d,["inputClassName"]));return p["default"].createElement("div",r({},f,{role:"combobox","aria-expanded":a,"aria-owns":a?this._instancePrefix+"-list":this._instancePrefix+"-value","aria-activedescendant":a?this._instancePrefix+"-option-"+t:this._instancePrefix+"-value",className:n,tabIndex:this.props.tabIndex||0,onBlur:this.handleInputBlur,onFocus:this.handleInputFocus,ref:function(e){return u.input=e},"aria-readonly":""+!!this.props.disabled,style:{border:0,width:1,display:"inline-block"}}))}return this.props.autosize?p["default"].createElement(h["default"],r({},c,{minWidth:"5px"})):p["default"].createElement("div",{className:n},p["default"].createElement("input",c))},renderClear:function(){if(this.props.clearable&&this.props.value&&0!==this.props.value&&(!this.props.multi||this.props.value.length)&&!this.props.disabled&&!this.props.isLoading)return p["default"].createElement("span",{className:"Select-clear-zone",title:this.props.multi?this.props.clearAllText:this.props.clearValueText,"aria-label":this.props.multi?this.props.clearAllText:this.props.clearValueText,onMouseDown:this.clearValue,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove,onTouchEnd:this.handleTouchEndClearValue},p["default"].createElement("span",{className:"Select-clear",dangerouslySetInnerHTML:{__html:"×"}}))},renderArrow:function(){return p["default"].createElement("span",{className:"Select-arrow-zone",onMouseDown:this.handleMouseDownOnArrow},p["default"].createElement("span",{className:"Select-arrow",onMouseDown:this.handleMouseDownOnArrow}))},filterOptions:function x(e){var t=this.state.inputValue,u=this.props.options||[];if(this.props.filterOptions){var x="function"==typeof this.props.filterOptions?this.props.filterOptions:b["default"];return x(u,t,e,{filterOption:this.props.filterOption,ignoreAccents:this.props.ignoreAccents,ignoreCase:this.props.ignoreCase,labelKey:this.props.labelKey,matchPos:this.props.matchPos,matchProp:this.props.matchProp,valueKey:this.props.valueKey})}return u},renderMenu:function(e,t,u){return e&&e.length?this.props.menuRenderer({focusedOption:u,focusOption:this.focusOption,instancePrefix:this._instancePrefix,labelKey:this.props.labelKey,onFocus:this.focusOption,onSelect:this.selectValue,optionClassName:this.props.optionClassName,optionComponent:this.props.optionComponent,optionRenderer:this.props.optionRenderer||this.getOptionLabel,options:e,selectValue:this.selectValue,valueArray:t,valueKey:this.props.valueKey}):this.props.noResultsText?p["default"].createElement("div",{className:"Select-noresults"},this.props.noResultsText):null},renderHiddenField:function(e){var t=this;if(this.props.name){if(this.props.joinValues){var u=e.map(function(e){return a(e[t.props.valueKey])}).join(this.props.delimiter);return p["default"].createElement("input",{type:"hidden",ref:function(e){return t.value=e},name:this.props.name,value:u,disabled:this.props.disabled})}return e.map(function(e,u){return p["default"].createElement("input",{key:"hidden."+u,type:"hidden",ref:"value"+u,name:t.props.name,value:a(e[t.props.valueKey]),disabled:t.props.disabled})})}},getFocusableOptionIndex:function(e){var t=this._visibleOptions;if(!t.length)return null;var u=this.state.focusedOption||e;if(u&&!u.disabled){var s=t.indexOf(u);if(s!==-1)return s}for(var n=0;n-1)return!1;if(s.filterOption)return s.filterOption.call(n,e,t);if(!t)return!0;var o=String(e[s.valueKey]),a=String(e[s.labelKey]);return s.ignoreAccents&&("label"!==s.matchProp&&(o=(0,i["default"])(o)),"value"!==s.matchProp&&(a=(0,i["default"])(a))),s.ignoreCase&&("label"!==s.matchProp&&(o=o.toLowerCase()),"value"!==s.matchProp&&(a=a.toLowerCase())),"start"===s.matchPos?"label"!==s.matchProp&&o.substr(0,t.length)===t||"value"!==s.matchProp&&a.substr(0,t.length)===t:"label"!==s.matchProp&&o.indexOf(t)>=0||"value"!==s.matchProp&&a.indexOf(t)>=0})}var o=e("./stripDiacritics"),i=s(o);t.exports=n},{"./stripDiacritics":8}],7:[function(e,t,u){(function(e){"use strict";function u(e){return e&&e.__esModule?e:{"default":e}}function s(e){var t=e.focusedOption,u=e.instancePrefix,s=(e.labelKey,e.onFocus),n=e.onSelect,i=e.optionClassName,r=e.optionComponent,l=e.optionRenderer,p=e.options,c=e.valueArray,d=e.valueKey,f=r;return p.map(function(e,r){var p=c&&c.indexOf(e)>-1,h=e===t,E=h?"focused":null,g=(0,o["default"])(i,{"Select-option":!0,"is-selected":p,"is-focused":h,"is-disabled":e.disabled});return a["default"].createElement(f,{className:g,instancePrefix:u,isDisabled:e.disabled,isFocused:h,isSelected:p,key:"option-"+r+"-"+e[d],onFocus:s,onSelect:n,option:e,optionIndex:r,ref:E},l(e,r))})}var n="undefined"!=typeof window?window.classNames:"undefined"!=typeof e?e.classNames:null,o=u(n),i="undefined"!=typeof window?window.React:"undefined"!=typeof e?e.React:null,a=u(i);t.exports=s}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],8:[function(e,t,u){"use strict";var s=[{base:"A",letters:/[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g},{base:"AA",letters:/[\uA732]/g},{base:"AE",letters:/[\u00C6\u01FC\u01E2]/g},{base:"AO",letters:/[\uA734]/g},{base:"AU",letters:/[\uA736]/g},{base:"AV",letters:/[\uA738\uA73A]/g},{base:"AY",letters:/[\uA73C]/g},{base:"B",letters:/[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g},{base:"C",letters:/[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g},{base:"D",letters:/[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g},{base:"DZ",letters:/[\u01F1\u01C4]/g},{base:"Dz",letters:/[\u01F2\u01C5]/g},{base:"E",letters:/[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g},{base:"F",letters:/[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g},{base:"G",letters:/[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g},{base:"H",letters:/[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g},{base:"I",letters:/[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g},{base:"J",letters:/[\u004A\u24BF\uFF2A\u0134\u0248]/g},{base:"K",letters:/[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g},{base:"L",letters:/[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g},{base:"LJ",letters:/[\u01C7]/g},{base:"Lj",letters:/[\u01C8]/g},{base:"M",letters:/[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g},{base:"N",letters:/[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g},{base:"NJ",letters:/[\u01CA]/g},{base:"Nj",letters:/[\u01CB]/g},{base:"O",letters:/[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g},{base:"OI",letters:/[\u01A2]/g},{base:"OO",letters:/[\uA74E]/g},{base:"OU",letters:/[\u0222]/g},{base:"P",letters:/[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g},{base:"Q",letters:/[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g},{base:"R",letters:/[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g},{base:"S",letters:/[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g},{base:"T",letters:/[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g},{base:"TZ",letters:/[\uA728]/g},{base:"U",letters:/[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g},{base:"V",letters:/[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g},{base:"VY",letters:/[\uA760]/g},{base:"W",letters:/[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g},{base:"X",letters:/[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g},{base:"Y",letters:/[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g},{base:"Z",letters:/[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g},{base:"a",letters:/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g},{base:"aa",letters:/[\uA733]/g},{base:"ae",letters:/[\u00E6\u01FD\u01E3]/g},{base:"ao",letters:/[\uA735]/g},{base:"au",letters:/[\uA737]/g},{base:"av",letters:/[\uA739\uA73B]/g},{base:"ay",letters:/[\uA73D]/g},{base:"b",letters:/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g},{base:"c",letters:/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g},{base:"d",letters:/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g},{base:"dz",letters:/[\u01F3\u01C6]/g},{base:"e",letters:/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g},{base:"f",letters:/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g},{base:"g",letters:/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g},{base:"h",letters:/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g},{base:"hv",letters:/[\u0195]/g},{base:"i",letters:/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g},{base:"j",letters:/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g},{base:"k",letters:/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g},{base:"l",letters:/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g},{base:"lj",letters:/[\u01C9]/g},{base:"m",letters:/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g},{base:"n",letters:/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g},{base:"nj",letters:/[\u01CC]/g},{base:"o",letters:/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g},{base:"oi",letters:/[\u01A3]/g},{base:"ou",letters:/[\u0223]/g},{base:"oo",letters:/[\uA74F]/g},{base:"p",letters:/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g},{base:"q",letters:/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g},{base:"r",letters:/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g},{base:"s",letters:/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g},{base:"t",letters:/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g},{base:"tz",letters:/[\uA729]/g},{base:"u",letters:/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g},{base:"v",letters:/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g},{base:"vy",letters:/[\uA761]/g},{base:"w",letters:/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g},{base:"x",letters:/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g},{base:"y",letters:/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g},{base:"z",letters:/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g}];t.exports=function(e){for(var t=0;t=0||Object.prototype.hasOwnProperty.call(e,s)&&(u[s]=e[s]);return u}function o(e){return e&&"object"!=typeof e&&(e={}),e?e:null}function i(e,t,u){e&&(e[t]=u)}function r(e,t){if(e)for(var u=t.length;u>=0;--u){var s=t.slice(0,u);if(e[s]&&(t===s||e[s].complete))return e[s]}}function a(e,t){if(e&&"function"==typeof e.then)return e.then(function(e){t(null,e)},function(e){t(e)})}function l(e){return c["default"].createElement(h["default"],e)}var p=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,s)&&(u[s]=e[s]);return u}function o(e){return f["default"].createElement(E["default"],e)}function i(e){var t=e.option,u=e.options,s=e.labelKey,n=e.valueKey;return 0===u.filter(function(e){return e[s]===t[s]||e[n]===t[n]}).length}function r(e){var t=e.label;return!!t}function a(e){var t=e.label,u=e.labelKey,s=e.valueKey,n={};return n[s]=t,n[u]=t,n.className="Select-create-option-placeholder",n}function l(e){return'Create option "'+e+'"'}function p(e){var t=e.keyCode;switch(t){case 9:case 13:case 188:return!0}return!1}var d=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,s)&&(u[s]=e[s]);return u}function i(e,t,u){return t in e?Object.defineProperty(e,t,{value:u,enumerable:!0,configurable:!0,writable:!0}):e[t]=u,e}function r(e){return"string"==typeof e?e:"object"==typeof e?JSON.stringify(e):e||0===e?String(e):""}Object.defineProperty(u,"__esModule",{value:!0});var a=Object.assign||function(e){for(var t=1;tr.bottom||i.topt.offsetHeight&&!(t.scrollHeight-t.offsetHeight-t.scrollTop)&&this.props.onMenuScrollToBottom()}},handleRequired:function(e,t){return!e||(t?0===e.length:0===Object.keys(e).length)},getOptionLabel:function(e){return e[this.props.labelKey]},getValueArray:function(e,t){var u=this,s="object"==typeof t?t:this.props;if(s.multi){if("string"==typeof e&&(e=e.split(s.delimiter)),!Array.isArray(e)){if(null===e||void 0===e)return[];e=[e]}return e.map(function(e){return u.expandValue(e,s)}).filter(function(e){return e})}var n=this.expandValue(e,s);return n?[n]:[]},expandValue:function(e,t){if("string"!=typeof e&&"number"!=typeof e)return e;var u=t.options,s=t.valueKey;if(u)for(var n=0;n0?u-=1:u=t.length-1;else if("start"===e)u=0;else if("end"===e)u=t.length-1;else if("page_up"===e){var n=u-this.props.pageSize;u=n<0?0:n}else if("page_down"===e){var n=u+this.props.pageSize;u=n>t.length-1?t.length-1:n}u===-1&&(u=0),this.setState({focusedIndex:t[u].index,focusedOption:t[u].option})}},getFocusedOption:function(){return this._focusedOption},getInputValue:function(){return this.state.inputValue},selectFocusedOption:function(){if(this._focusedOption)return this.selectValue(this._focusedOption)},renderLoading:function(){if(this.props.isLoading)return p["default"].createElement("span",{className:"Select-loading-zone","aria-hidden":"true"},p["default"].createElement("span",{className:"Select-loading"}))},renderValue:function(e,t){var u=this,s=this.props.valueRenderer||this.getOptionLabel,n=this.props.valueComponent;if(!e.length)return this.state.inputValue?null:p["default"].createElement("div",{className:"Select-placeholder"},this.props.placeholder);var o=this.props.onValueClick?this.handleValueClick:null;return this.props.multi?e.map(function(e,t){return p["default"].createElement(n,{id:u._instancePrefix+"-value-"+t,instancePrefix:u._instancePrefix,disabled:u.props.disabled||e.clearableValue===!1,key:"value-"+t+"-"+e[u.props.valueKey],onClick:o,onRemove:u.removeValue,value:e},s(e,t),p["default"].createElement("span",{className:"Select-aria-only"}," "))}):this.state.inputValue?void 0:(t&&(o=null),p["default"].createElement(n,{id:this._instancePrefix+"-value-item",disabled:this.props.disabled,instancePrefix:this._instancePrefix,onClick:o,value:e[0]},s(e[0])))},renderInput:function(e,t){var u=this;if(this.props.inputRenderer)return this.props.inputRenderer();var s,n=(0,g["default"])("Select-input",this.props.inputProps.className),r=!!this.state.isOpen,l=(0,g["default"])((s={},i(s,this._instancePrefix+"-list",r),i(s,this._instancePrefix+"-backspace-remove-message",this.props.multi&&!this.props.disabled&&this.state.isFocused&&!this.state.inputValue),s)),d=a({},this.props.inputProps,{role:"combobox","aria-expanded":""+r,"aria-owns":l,"aria-haspopup":""+r,"aria-activedescendant":r?this._instancePrefix+"-option-"+t:this._instancePrefix+"-value","aria-labelledby":this.props["aria-labelledby"],"aria-label":this.props["aria-label"],className:n,tabIndex:this.props.tabIndex,onBlur:this.handleInputBlur,onChange:this.handleInputChange,onFocus:this.handleInputFocus,ref:function(e){return u.input=e},required:this.state.required,value:this.state.inputValue});if(this.props.disabled||!this.props.searchable){var c=this.props.inputProps,f=(c.inputClassName,o(c,["inputClassName"]));return p["default"].createElement("div",a({},f,{role:"combobox","aria-expanded":r,"aria-owns":r?this._instancePrefix+"-list":this._instancePrefix+"-value","aria-activedescendant":r?this._instancePrefix+"-option-"+t:this._instancePrefix+"-value",className:n,tabIndex:this.props.tabIndex||0,onBlur:this.handleInputBlur,onFocus:this.handleInputFocus,ref:function(e){return u.input=e},"aria-readonly":""+!!this.props.disabled,style:{border:0,width:1,display:"inline-block"}}))}return this.props.autosize?p["default"].createElement(h["default"],a({},d,{minWidth:"5px"})):p["default"].createElement("div",{className:n},p["default"].createElement("input",d))},renderClear:function(){if(this.props.clearable&&this.props.value&&0!==this.props.value&&(!this.props.multi||this.props.value.length)&&!this.props.disabled&&!this.props.isLoading)return p["default"].createElement("span",{className:"Select-clear-zone",title:this.props.multi?this.props.clearAllText:this.props.clearValueText,"aria-label":this.props.multi?this.props.clearAllText:this.props.clearValueText,onMouseDown:this.clearValue,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove,onTouchEnd:this.handleTouchEndClearValue},p["default"].createElement("span",{className:"Select-clear",dangerouslySetInnerHTML:{__html:"×"}}))},renderArrow:function(){var e=this.handleMouseDownOnArrow,t=this.props.arrowRenderer({onMouseDown:e});return p["default"].createElement("span",{className:"Select-arrow-zone",onMouseDown:e},t)},filterOptions:function M(e){var t=this.state.inputValue,u=this.props.options||[];if(this.props.filterOptions){var M="function"==typeof this.props.filterOptions?this.props.filterOptions:m["default"];return M(u,t,e,{filterOption:this.props.filterOption,ignoreAccents:this.props.ignoreAccents,ignoreCase:this.props.ignoreCase,labelKey:this.props.labelKey,matchPos:this.props.matchPos,matchProp:this.props.matchProp,valueKey:this.props.valueKey})}return u},renderMenu:function(e,t,u){return e&&e.length?this.props.menuRenderer({focusedOption:u,focusOption:this.focusOption,instancePrefix:this._instancePrefix,labelKey:this.props.labelKey,onFocus:this.focusOption,onSelect:this.selectValue,optionClassName:this.props.optionClassName,optionComponent:this.props.optionComponent,optionRenderer:this.props.optionRenderer||this.getOptionLabel,options:e,selectValue:this.selectValue,valueArray:t,valueKey:this.props.valueKey}):this.props.noResultsText?p["default"].createElement("div",{className:"Select-noresults"},this.props.noResultsText):null},renderHiddenField:function(e){var t=this;if(this.props.name){if(this.props.joinValues){var u=e.map(function(e){return r(e[t.props.valueKey])}).join(this.props.delimiter);return p["default"].createElement("input",{type:"hidden",ref:function(e){return t.value=e},name:this.props.name,value:u,disabled:this.props.disabled})}return e.map(function(e,u){return p["default"].createElement("input",{key:"hidden."+u,type:"hidden",ref:"value"+u,name:t.props.name,value:r(e[t.props.valueKey]),disabled:t.props.disabled})})}},getFocusableOptionIndex:function(e){var t=this._visibleOptions;if(!t.length)return null;var u=this.state.focusedOption||e;if(u&&!u.disabled){var s=t.indexOf(u);if(s!==-1)return s}for(var n=0;n-1)return!1;if(s.filterOption)return s.filterOption.call(n,e,t);if(!t)return!0;var o=String(e[s.valueKey]),r=String(e[s.labelKey]);return s.ignoreAccents&&("label"!==s.matchProp&&(o=(0,i["default"])(o)),"value"!==s.matchProp&&(r=(0,i["default"])(r))),s.ignoreCase&&("label"!==s.matchProp&&(o=o.toLowerCase()),"value"!==s.matchProp&&(r=r.toLowerCase())),"start"===s.matchPos?"label"!==s.matchProp&&o.substr(0,t.length)===t||"value"!==s.matchProp&&r.substr(0,t.length)===t:"label"!==s.matchProp&&o.indexOf(t)>=0||"value"!==s.matchProp&&r.indexOf(t)>=0})}var o=e("./stripDiacritics"),i=s(o);t.exports=n},{"./stripDiacritics":9}],8:[function(e,t,u){(function(e){"use strict";function u(e){return e&&e.__esModule?e:{"default":e}}function s(e){var t=e.focusedOption,u=e.instancePrefix,s=(e.labelKey,e.onFocus),n=e.onSelect,i=e.optionClassName,a=e.optionComponent,l=e.optionRenderer,p=e.options,d=e.valueArray,c=e.valueKey,f=a;return p.map(function(e,a){var p=d&&d.indexOf(e)>-1,h=e===t,E=h?"focused":null,g=(0,o["default"])(i,{"Select-option":!0,"is-selected":p,"is-focused":h,"is-disabled":e.disabled});return r["default"].createElement(f,{className:g,instancePrefix:u,isDisabled:e.disabled,isFocused:h,isSelected:p,key:"option-"+a+"-"+e[c],onFocus:s,onSelect:n,option:e,optionIndex:a,ref:E},l(e,a))})}var n="undefined"!=typeof window?window.classNames:"undefined"!=typeof e?e.classNames:null,o=u(n),i="undefined"!=typeof window?window.React:"undefined"!=typeof e?e.React:null,r=u(i);t.exports=s}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],9:[function(e,t,u){"use strict";var s=[{base:"A",letters:/[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g},{base:"AA",letters:/[\uA732]/g},{base:"AE",letters:/[\u00C6\u01FC\u01E2]/g},{base:"AO",letters:/[\uA734]/g},{base:"AU",letters:/[\uA736]/g},{base:"AV",letters:/[\uA738\uA73A]/g},{base:"AY",letters:/[\uA73C]/g},{base:"B",letters:/[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g},{base:"C",letters:/[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g},{base:"D",letters:/[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g},{base:"DZ",letters:/[\u01F1\u01C4]/g},{base:"Dz",letters:/[\u01F2\u01C5]/g},{base:"E",letters:/[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g},{base:"F",letters:/[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g},{base:"G",letters:/[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g},{base:"H",letters:/[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g},{base:"I",letters:/[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g},{base:"J",letters:/[\u004A\u24BF\uFF2A\u0134\u0248]/g},{base:"K",letters:/[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g},{base:"L",letters:/[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g},{base:"LJ",letters:/[\u01C7]/g},{base:"Lj",letters:/[\u01C8]/g},{base:"M",letters:/[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g},{base:"N",letters:/[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g},{base:"NJ",letters:/[\u01CA]/g},{base:"Nj",letters:/[\u01CB]/g},{base:"O",letters:/[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g},{base:"OI",letters:/[\u01A2]/g},{base:"OO",letters:/[\uA74E]/g},{base:"OU",letters:/[\u0222]/g},{base:"P",letters:/[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g},{base:"Q",letters:/[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g},{base:"R",letters:/[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g},{base:"S",letters:/[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g},{base:"T",letters:/[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g},{base:"TZ",letters:/[\uA728]/g},{base:"U",letters:/[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g},{base:"V",letters:/[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g},{base:"VY",letters:/[\uA760]/g},{base:"W",letters:/[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g},{base:"X",letters:/[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g},{base:"Y",letters:/[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g},{base:"Z",letters:/[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g},{base:"a",letters:/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g},{base:"aa",letters:/[\uA733]/g},{base:"ae",letters:/[\u00E6\u01FD\u01E3]/g},{base:"ao",letters:/[\uA735]/g},{base:"au",letters:/[\uA737]/g},{base:"av",letters:/[\uA739\uA73B]/g},{base:"ay",letters:/[\uA73D]/g},{base:"b",letters:/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g},{base:"c",letters:/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g},{base:"d",letters:/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g},{base:"dz",letters:/[\u01F3\u01C6]/g},{base:"e",letters:/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g},{base:"f",letters:/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g},{base:"g",letters:/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g},{base:"h",letters:/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g},{base:"hv",letters:/[\u0195]/g},{base:"i",letters:/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g},{base:"j",letters:/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g},{base:"k",letters:/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g},{base:"l",letters:/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g},{base:"lj",letters:/[\u01C9]/g},{base:"m",letters:/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g},{base:"n",letters:/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g},{base:"nj",letters:/[\u01CC]/g},{base:"o",letters:/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g},{base:"oi",letters:/[\u01A3]/g},{base:"ou",letters:/[\u0223]/g},{base:"oo",letters:/[\uA74F]/g},{base:"p",letters:/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g},{base:"q",letters:/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g},{base:"r",letters:/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g},{base:"s",letters:/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g},{base:"t",letters:/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g},{base:"tz",letters:/[\uA729]/g},{base:"u",letters:/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g},{base:"v",letters:/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g},{base:"vy",letters:/[\uA761]/g},{base:"w",letters:/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g},{base:"x",letters:/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g},{base:"y",letters:/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g},{base:"z",letters:/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g}];t.exports=function(e){for(var t=0;ts (wrapping highlighted words). + */ + + function Highlighter(_ref) { + var _ref$highlightClassName = _ref.highlightClassName; + var highlightClassName = _ref$highlightClassName === undefined ? '' : _ref$highlightClassName; + var _ref$highlightStyle = _ref.highlightStyle; + var highlightStyle = _ref$highlightStyle === undefined ? {} : _ref$highlightStyle; + var searchWords = _ref.searchWords; + var textToHighlight = _ref.textToHighlight; + var sanitize = _ref.sanitize; + + var chunks = Chunks.findAll(textToHighlight, searchWords, sanitize); + + return _react2['default'].createElement( + 'span', + null, + chunks.map(function (chunk, index) { + var text = textToHighlight.substr(chunk.start, chunk.end - chunk.start); + + if (chunk.highlight) { + return _react2['default'].createElement( + 'mark', + { + className: highlightClassName, + key: index, + style: highlightStyle + }, + text + ); + } else { + return _react2['default'].createElement( + 'span', + { key: index }, + text + ); + } + }) + ); + } + + module.exports = exports['default']; + +/***/ }, +/* 3 */ +/***/ function(module, exports) { + + module.exports = require("react"); + +/***/ }, +/* 4 */ +/***/ function(module, exports) { + + /** + * Creates an array of chunk objects representing both higlightable and non highlightable pieces of text that match each search word. + * @param searchWords string[] + * @param textToSearch string + * @return {start:number, end:number, highlight:boolean}[] + */ + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + var findAll = function findAll(textToSearch, wordsToFind, sanitize) { + return fillInChunks(combineChunks(findChunks(textToSearch, wordsToFind, sanitize)), textToSearch.length); + }; + + exports.findAll = findAll; + /** + * Takes an array of {start:number, end:number} objects and combines chunks that overlap into single chunks. + * @param chunks {start:number, end:number}[] + * @return {start:number, end:number}[] + */ + var combineChunks = function combineChunks(chunks) { + chunks = chunks.sort(function (first, second) { + return first.start - second.start; + }).reduce(function (processedChunks, nextChunk) { + // First chunk just goes straight in the array... + if (processedChunks.length === 0) { + return [nextChunk]; + } else { + // ... subsequent chunks get checked to see if they overlap... + var prevChunk = processedChunks.pop(); + if (nextChunk.start <= prevChunk.end) { + // It may be the case that prevChunk completely surrounds nextChunk, so take the + // largest of the end indeces. + var endIndex = Math.max(prevChunk.end, nextChunk.end); + processedChunks.push({ start: prevChunk.start, end: endIndex }); + } else { + processedChunks.push(prevChunk, nextChunk); + } + return processedChunks; + } + }, []); + + return chunks; + }; + + exports.combineChunks = combineChunks; + /** + * Examine textToSearch for any matches. + * If we find matches, add them to the returned array as a "chunk" object ({start:number, end:number}). + * @param textToSearch string + * @param wordsToFind string[] + * @param sanitize Process and optionally modify textToSearch and wordsToFind before comparison; this can be used to eg. remove accents + * @return {start:number, end:number}[] + */ + var findChunks = function findChunks(textToSearch, wordsToFind) { + var sanitize = arguments.length <= 2 || arguments[2] === undefined ? identity : arguments[2]; + return wordsToFind.filter(function (searchWord) { + return searchWord; + }) // Remove empty words + .reduce(function (chunks, searchWord) { + var normalizedWord = sanitize(searchWord); + var normalizedText = sanitize(textToSearch); + var regex = new RegExp(normalizedWord, 'gi'); + var match = undefined; + while ((match = regex.exec(normalizedText)) != null) { + chunks.push({ start: match.index, end: regex.lastIndex }); + } + return chunks; + }, []); + }; + + exports.findChunks = findChunks; + /** + * Given a set of chunks to highlight, create an additional set of chunks + * to represent the bits of text between the highlighted text. + * @param chunksToHighlight {start:number, end:number}[] + * @param totalLength number + * @return {start:number, end:number, highlight:boolean}[] + */ + var fillInChunks = function fillInChunks(chunksToHighlight, totalLength) { + var allChunks = []; + var append = function append(start, end, highlight) { + if (end - start > 0) { + allChunks.push({ start: start, end: end, highlight: highlight }); + } + }; + + if (chunksToHighlight.length === 0) { + append(0, totalLength, false); + } else { + (function () { + var lastIndex = 0; + chunksToHighlight.forEach(function (chunk) { + append(lastIndex, chunk.start, false); + append(chunk.start, chunk.end, true); + lastIndex = chunk.end; + }); + append(lastIndex, totalLength, false); + })(); + } + return allChunks; + }; + + exports.fillInChunks = fillInChunks; + function identity(value) { + return value; + } + +/***/ } +/******/ ]); + +},{"react":undefined}],32:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -2152,10 +2459,7 @@ var VirtualizedSelect = function (_Component) { }, { key: 'render', value: function render() { - var async = this.props.async; - - - var SelectComponent = async ? _reactSelect2.default.Async : _reactSelect2.default; + var SelectComponent = this._getSelectComponent(); return _react2.default.createElement(SelectComponent, _extends({}, this.props, { menuRenderer: this._renderMenu, @@ -2255,6 +2559,22 @@ var VirtualizedSelect = function (_Component) { return optionHeight instanceof Function ? optionHeight({ option: option }) : optionHeight; } + }, { + key: '_getSelectComponent', + value: function _getSelectComponent() { + var _props = this.props; + var async = _props.async; + var selectComponent = _props.selectComponent; + + + if (selectComponent) { + return selectComponent; + } else if (async) { + return _reactSelect2.default.Async; + } else { + return _reactSelect2.default; + } + } }, { key: '_optionRenderer', value: function _optionRenderer(_ref8) { @@ -2303,7 +2623,8 @@ VirtualizedSelect.propTypes = { async: _react.PropTypes.bool, maxHeight: _react.PropTypes.number.isRequired, optionHeight: _react.PropTypes.oneOfType([_react.PropTypes.number, _react.PropTypes.func]).isRequired, - optionRenderer: _react.PropTypes.func + optionRenderer: _react.PropTypes.func, + selectComponent: _react.PropTypes.func }; VirtualizedSelect.defaultProps = { async: false, @@ -2311,7 +2632,7 @@ VirtualizedSelect.defaultProps = { optionHeight: 35 }; exports.default = VirtualizedSelect; -},{"react":undefined,"react-select":undefined,"react-virtualized":74}],32:[function(require,module,exports){ +},{"react":undefined,"react-select":undefined,"react-virtualized":76}],33:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -2326,9 +2647,9 @@ var _VirtualizedSelect2 = _interopRequireDefault(_VirtualizedSelect); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.default = _VirtualizedSelect2.default; -},{"./VirtualizedSelect":31}],33:[function(require,module,exports){ -arguments[4][32][0].apply(exports,arguments) -},{"./VirtualizedSelect":32,"dup":32}],34:[function(require,module,exports){ +},{"./VirtualizedSelect":32}],34:[function(require,module,exports){ +arguments[4][33][0].apply(exports,arguments) +},{"./VirtualizedSelect":33,"dup":33}],35:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -2470,7 +2791,7 @@ ArrowKeyStepper.propTypes = { rowCount: _react.PropTypes.number.isRequired }; exports.default = ArrowKeyStepper; -},{"react":undefined,"react-addons-shallow-compare":29}],35:[function(require,module,exports){ +},{"react":undefined,"react-addons-shallow-compare":29}],36:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -2486,7 +2807,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de exports.default = _ArrowKeyStepper3.default; exports.ArrowKeyStepper = _ArrowKeyStepper3.default; -},{"./ArrowKeyStepper":34}],36:[function(require,module,exports){ +},{"./ArrowKeyStepper":35}],37:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -2656,7 +2977,7 @@ AutoSizer.defaultProps = { onResize: function onResize() {} }; exports.default = AutoSizer; -},{"../vendor/detectElementResize":77,"react":undefined,"react-addons-shallow-compare":29}],37:[function(require,module,exports){ +},{"../vendor/detectElementResize":79,"react":undefined,"react-addons-shallow-compare":29}],38:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -2672,7 +2993,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de exports.default = _AutoSizer3.default; exports.AutoSizer = _AutoSizer3.default; -},{"./AutoSizer":36}],38:[function(require,module,exports){ +},{"./AutoSizer":37}],39:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -2986,7 +3307,7 @@ CellMeasurer.propTypes = { width: _react.PropTypes.number }; exports.default = CellMeasurer; -},{"./defaultCellSizeCache":39,"react":undefined,"react-addons-shallow-compare":29,"react-dom":undefined}],39:[function(require,module,exports){ +},{"./defaultCellSizeCache":40,"react":undefined,"react-addons-shallow-compare":29,"react-dom":undefined}],40:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -3084,7 +3405,7 @@ var CellSizeCache = function () { }(); exports.default = CellSizeCache; -},{}],40:[function(require,module,exports){ +},{}],41:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -3105,7 +3426,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de exports.default = _CellMeasurer3.default; exports.CellMeasurer = _CellMeasurer3.default; exports.defaultCellSizeCache = _defaultCellSizeCache3.default; -},{"./CellMeasurer":38,"./defaultCellSizeCache":39}],41:[function(require,module,exports){ +},{"./CellMeasurer":39,"./defaultCellSizeCache":40}],42:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -3427,7 +3748,7 @@ function defaultCellGroupRenderer(_ref5) { return !!renderedCell; }); } -},{"../utils/getUpdatedOffsetForIndex":76,"./CollectionView":42,"./utils/calculateSizeAndPositionData":46,"react":undefined,"react-addons-shallow-compare":29}],42:[function(require,module,exports){ +},{"../utils/getUpdatedOffsetForIndex":78,"./CollectionView":43,"./utils/calculateSizeAndPositionData":47,"react":undefined,"react-addons-shallow-compare":29}],43:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -4096,7 +4417,7 @@ CollectionView.defaultProps = { verticalOverscanSize: 0 }; exports.default = CollectionView; -},{"../utils/createCallbackMemoizer":75,"classnames":undefined,"dom-helpers/util/scrollbarSize":18,"raf":28,"react":undefined,"react-addons-shallow-compare":29}],43:[function(require,module,exports){ +},{"../utils/createCallbackMemoizer":77,"classnames":undefined,"dom-helpers/util/scrollbarSize":18,"raf":28,"react":undefined,"react-addons-shallow-compare":29}],44:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -4167,7 +4488,7 @@ var Section = function () { exports.default = Section; -},{}],44:[function(require,module,exports){ +},{}],45:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -4323,7 +4644,7 @@ var SectionManager = function () { }(); exports.default = SectionManager; -},{"./Section":43}],45:[function(require,module,exports){ +},{"./Section":44}],46:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -4339,7 +4660,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de exports.default = _Collection3.default; exports.Collection = _Collection3.default; -},{"./Collection":41}],46:[function(require,module,exports){ +},{"./Collection":42}],47:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -4387,7 +4708,7 @@ function calculateSizeAndPositionData(_ref) { width: width }; } -},{"../SectionManager":44}],47:[function(require,module,exports){ +},{"../SectionManager":45}],48:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -4523,7 +4844,7 @@ ColumnSizer.propTypes = { width: _react.PropTypes.number.isRequired }; exports.default = ColumnSizer; -},{"../Grid":60,"react":undefined,"react-addons-shallow-compare":29}],48:[function(require,module,exports){ +},{"../Grid":61,"react":undefined,"react-addons-shallow-compare":29}],49:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -4539,7 +4860,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de exports.default = _ColumnSizer3.default; exports.ColumnSizer = _ColumnSizer3.default; -},{"./ColumnSizer":47}],49:[function(require,module,exports){ +},{"./ColumnSizer":48}],50:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -4650,7 +4971,7 @@ Column.propTypes = { width: _react.PropTypes.number.isRequired }; exports.default = Column; -},{"./defaultCellDataGetter":53,"./defaultCellRenderer":54,"./defaultHeaderRenderer":55,"react":undefined}],50:[function(require,module,exports){ +},{"./defaultCellDataGetter":54,"./defaultCellRenderer":55,"./defaultHeaderRenderer":56,"react":undefined}],51:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -5314,7 +5635,7 @@ FlexTable.defaultProps = { style: {} }; exports.default = FlexTable; -},{"../Grid":60,"./FlexColumn":49,"./SortDirection":51,"./defaultRowRenderer":56,"classnames":undefined,"react":undefined,"react-addons-shallow-compare":29,"react-dom":undefined}],51:[function(require,module,exports){ +},{"../Grid":61,"./FlexColumn":50,"./SortDirection":52,"./defaultRowRenderer":57,"classnames":undefined,"react":undefined,"react-addons-shallow-compare":29,"react-dom":undefined}],52:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -5335,7 +5656,7 @@ var SortDirection = { }; exports.default = SortDirection; -},{}],52:[function(require,module,exports){ +},{}],53:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -5383,7 +5704,7 @@ function SortIndicator(_ref) { SortIndicator.propTypes = { sortDirection: _react.PropTypes.oneOf([_SortDirection2.default.ASC, _SortDirection2.default.DESC]) }; -},{"./SortDirection":51,"classnames":undefined,"react":undefined}],53:[function(require,module,exports){ +},{"./SortDirection":52,"classnames":undefined,"react":undefined}],54:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -5408,7 +5729,7 @@ function defaultCellDataGetter(_ref) { return rowData[dataKey]; } } -},{}],54:[function(require,module,exports){ +},{}],55:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -5434,7 +5755,7 @@ function defaultCellRenderer(_ref) { return String(cellData); } } -},{}],55:[function(require,module,exports){ +},{}],56:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -5483,7 +5804,7 @@ function defaultHeaderRenderer(_ref) { return children; } -},{"./SortIndicator":52,"react":undefined}],56:[function(require,module,exports){ +},{"./SortIndicator":53,"react":undefined}],57:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -5553,7 +5874,7 @@ function defaultRowRenderer(_ref) { columns ); } -},{"react":undefined}],57:[function(require,module,exports){ +},{"react":undefined}],58:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -5604,12 +5925,13 @@ exports.FlexTable = _FlexTable3.default; exports.FlexColumn = _FlexColumn3.default; exports.SortDirection = _SortDirection3.default; exports.SortIndicator = _SortIndicator3.default; -},{"./FlexColumn":49,"./FlexTable":50,"./SortDirection":51,"./SortIndicator":52,"./defaultCellDataGetter":53,"./defaultCellRenderer":54,"./defaultHeaderRenderer":55,"./defaultRowRenderer":56}],58:[function(require,module,exports){ +},{"./FlexColumn":50,"./FlexTable":51,"./SortDirection":52,"./SortIndicator":53,"./defaultCellDataGetter":54,"./defaultCellRenderer":55,"./defaultHeaderRenderer":56,"./defaultRowRenderer":57}],59:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); +exports.DEFAULT_SCROLLING_RESET_TIME_INTERVAL = undefined; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; @@ -5671,7 +5993,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" * Specifies the number of miliseconds during which to disable pointer events while a scroll is in progress. * This improves performance and makes scrolling smoother. */ -var IS_SCROLLING_TIMEOUT = 150; +var DEFAULT_SCROLLING_RESET_TIME_INTERVAL = exports.DEFAULT_SCROLLING_RESET_TIME_INTERVAL = 150; /** * Controls whether the Grid updates the DOM element's scrollLeft/scrollTop based on the current state or just observes it. @@ -5697,6 +6019,8 @@ var Grid = function (_Component) { _this.state = { isScrolling: false, + scrollDirectionHorizontal: _getOverscanIndices.SCROLL_DIRECTION_FIXED, + scrollDirectionVertical: _getOverscanIndices.SCROLL_DIRECTION_FIXED, scrollLeft: 0, scrollTop: 0 }; @@ -5773,6 +6097,11 @@ var Grid = function (_Component) { this._columnSizeAndPositionManager.resetCell(columnIndex); this._rowSizeAndPositionManager.resetCell(rowIndex); + + // Clear cell cache in case we are scrolling; + // Invalid row heights likely mean invalid cached content as well. + this._cellCache = {}; + this.forceUpdate(); } }, { @@ -6093,6 +6422,8 @@ var Grid = function (_Component) { var rowCount = props.rowCount; var width = props.width; var isScrolling = state.isScrolling; + var scrollDirectionHorizontal = state.scrollDirectionHorizontal; + var scrollDirectionVertical = state.scrollDirectionVertical; var scrollLeft = state.scrollLeft; var scrollTop = state.scrollTop; @@ -6128,6 +6459,7 @@ var Grid = function (_Component) { var overscanColumnIndices = (0, _getOverscanIndices2.default)({ cellCount: columnCount, overscanCellsCount: overscanColumnCount, + scrollDirection: scrollDirectionHorizontal, startIndex: this._renderedColumnStartIndex, stopIndex: this._renderedColumnStopIndex }); @@ -6135,6 +6467,7 @@ var Grid = function (_Component) { var overscanRowIndices = (0, _getOverscanIndices2.default)({ cellCount: rowCount, overscanCellsCount: overscanRowCount, + scrollDirection: scrollDirectionVertical, startIndex: this._renderedRowStartIndex, stopIndex: this._renderedRowStopIndex }); @@ -6174,11 +6507,14 @@ var Grid = function (_Component) { }, { key: '_enablePointerEventsAfterDelay', value: function _enablePointerEventsAfterDelay() { + var scrollingResetTimeInterval = this.props.scrollingResetTimeInterval; + + if (this._disablePointerEventsTimeoutId) { clearTimeout(this._disablePointerEventsTimeoutId); } - this._disablePointerEventsTimeoutId = setTimeout(this._enablePointerEventsAfterDelayCallback, IS_SCROLLING_TIMEOUT); + this._disablePointerEventsTimeoutId = setTimeout(this._enablePointerEventsAfterDelayCallback, scrollingResetTimeInterval); } }, { key: '_enablePointerEventsAfterDelayCallback', @@ -6189,7 +6525,9 @@ var Grid = function (_Component) { this._cellCache = {}; this.setState({ - isScrolling: false + isScrolling: false, + scrollDirectionHorizontal: _getOverscanIndices.SCROLL_DIRECTION_FIXED, + scrollDirectionVertical: _getOverscanIndices.SCROLL_DIRECTION_FIXED }); } }, { @@ -6423,6 +6761,10 @@ var Grid = function (_Component) { // For more information see https://github.com/bvaughn/react-virtualized/pull/124 var scrollPositionChangeReason = event.cancelable ? SCROLL_POSITION_CHANGE_REASONS.OBSERVED : SCROLL_POSITION_CHANGE_REASONS.REQUESTED; + // Track scrolling direction so we can more efficiently overscan rows to reduce empty space around the edges while scrolling. + var scrollDirectionVertical = scrollTop > this.state.scrollTop ? _getOverscanIndices.SCROLL_DIRECTION_FORWARD : _getOverscanIndices.SCROLL_DIRECTION_BACKWARD; + var scrollDirectionHorizontal = scrollLeft > this.state.scrollLeft ? _getOverscanIndices.SCROLL_DIRECTION_FORWARD : _getOverscanIndices.SCROLL_DIRECTION_BACKWARD; + if (!this.state.isScrolling) { this.setState({ isScrolling: true @@ -6431,6 +6773,8 @@ var Grid = function (_Component) { this._setNextState({ isScrolling: true, + scrollDirectionHorizontal: scrollDirectionHorizontal, + scrollDirectionVertical: scrollDirectionVertical, scrollLeft: scrollLeft, scrollPositionChangeReason: scrollPositionChangeReason, scrollTop: scrollTop @@ -6563,6 +6907,9 @@ Grid.propTypes = { */ rowCount: _react.PropTypes.number.isRequired, + /** Wait this amount of time after the last scroll event before resetting Grid `pointer-events`. */ + scrollingResetTimeInterval: _react.PropTypes.number, + /** Horizontal offset. */ scrollLeft: _react.PropTypes.number, @@ -6614,12 +6961,13 @@ Grid.defaultProps = { }, overscanColumnCount: 0, overscanRowCount: 10, + scrollingResetTimeInterval: DEFAULT_SCROLLING_RESET_TIME_INTERVAL, scrollToAlignment: 'auto', style: {}, tabIndex: 0 }; exports.default = Grid; -},{"../utils/createCallbackMemoizer":75,"./defaultCellRangeRenderer":59,"./utils/ScalingCellSizeAndPositionManager":62,"./utils/calculateSizeAndPositionDataAndUpdateScrollOffset":63,"./utils/getOverscanIndices":64,"./utils/updateScrollIndexHelper":65,"classnames":undefined,"dom-helpers/util/scrollbarSize":18,"raf":28,"react":undefined,"react-addons-shallow-compare":29}],59:[function(require,module,exports){ +},{"../utils/createCallbackMemoizer":77,"./defaultCellRangeRenderer":60,"./utils/ScalingCellSizeAndPositionManager":63,"./utils/calculateSizeAndPositionDataAndUpdateScrollOffset":64,"./utils/getOverscanIndices":65,"./utils/updateScrollIndexHelper":66,"classnames":undefined,"dom-helpers/util/scrollbarSize":18,"raf":28,"react":undefined,"react-addons-shallow-compare":29}],60:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -6722,7 +7070,7 @@ function defaultCellRangeRenderer(_ref) { return renderedCells; } -},{"classnames":undefined,"react":undefined}],60:[function(require,module,exports){ +},{"classnames":undefined,"react":undefined}],61:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -6743,7 +7091,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de exports.default = _Grid3.default; exports.Grid = _Grid3.default; exports.defaultCellRangeRenderer = _defaultCellRangeRenderer3.default; -},{"./Grid":58,"./defaultCellRangeRenderer":59}],61:[function(require,module,exports){ +},{"./Grid":59,"./defaultCellRangeRenderer":60}],62:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -7041,7 +7389,7 @@ var CellSizeAndPositionManager = function () { }(); exports.default = CellSizeAndPositionManager; -},{}],62:[function(require,module,exports){ +},{}],63:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -7258,7 +7606,7 @@ var ScalingCellSizeAndPositionManager = function () { }(); exports.default = ScalingCellSizeAndPositionManager; -},{"./CellSizeAndPositionManager":61}],63:[function(require,module,exports){ +},{"./CellSizeAndPositionManager":62}],64:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -7301,18 +7649,23 @@ function calculateSizeAndPositionDataAndUpdateScrollOffset(_ref) { } } } -},{}],64:[function(require,module,exports){ +},{}],65:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = getOverscanIndices; +var SCROLL_DIRECTION_BACKWARD = exports.SCROLL_DIRECTION_BACKWARD = -1; +var SCROLL_DIRECTION_FIXED = exports.SCROLL_DIRECTION_FIXED = 0; +var SCROLL_DIRECTION_FORWARD = exports.SCROLL_DIRECTION_FORWARD = 1; + /** * Calculates the number of cells to overscan before and after a specified range. * This function ensures that overscanning doesn't exceed the available cells. * * @param cellCount Number of rows or columns in the current axis + * @param scrollDirection One of SCROLL_DIRECTION_BACKWARD * @param overscanCellsCount Maximum number of cells to over-render in either direction * @param startIndex Begin of range of visible cells * @param stopIndex End of range of visible cells @@ -7320,15 +7673,30 @@ exports.default = getOverscanIndices; function getOverscanIndices(_ref) { var cellCount = _ref.cellCount; var overscanCellsCount = _ref.overscanCellsCount; + var scrollDirection = _ref.scrollDirection; var startIndex = _ref.startIndex; var stopIndex = _ref.stopIndex; + var overscanStartIndex = void 0; + var overscanStopIndex = void 0; + + if (scrollDirection === SCROLL_DIRECTION_FORWARD) { + overscanStartIndex = startIndex; + overscanStopIndex = stopIndex + overscanCellsCount * 2; + } else if (scrollDirection === SCROLL_DIRECTION_BACKWARD) { + overscanStartIndex = startIndex - overscanCellsCount * 2; + overscanStopIndex = stopIndex; + } else { + overscanStartIndex = startIndex - overscanCellsCount; + overscanStopIndex = stopIndex + overscanCellsCount; + } + return { - overscanStartIndex: Math.max(0, startIndex - overscanCellsCount), - overscanStopIndex: Math.min(cellCount - 1, stopIndex + overscanCellsCount) + overscanStartIndex: Math.max(0, overscanStartIndex), + overscanStopIndex: Math.min(cellCount - 1, overscanStopIndex) }; } -},{}],65:[function(require,module,exports){ +},{}],66:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -7376,21 +7744,16 @@ function updateScrollIndexHelper(_ref) { // If we don't have a selected item but list size or number of children have decreased, // Make sure we aren't scrolled too far past the current content. } else if (!hasScrollToIndex && cellCount > 0 && (size < previousSize || cellCount < previousCellsCount)) { - scrollToIndex = cellCount - 1; - - var calculatedScrollOffset = cellSizeAndPositionManager.getUpdatedOffsetForIndex({ - containerSize: size, - currentOffset: scrollOffset, - targetIndex: scrollToIndex - }); - + // We need to ensure that the current scroll offset is still within the collection's range. + // To do this, we don't need to measure everything; CellMeasurer would perform poorly. + // Just check to make sure we're still okay. // Only adjust the scroll position if we've scrolled below the last set of rows. - if (calculatedScrollOffset < scrollOffset) { + if (scrollOffset > cellSizeAndPositionManager.getTotalSize() - size) { updateScrollIndexCallback(cellCount - 1); } } } -},{}],66:[function(require,module,exports){ +},{}],67:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -7677,7 +8040,7 @@ function scanForUnloadedRanges(_ref3) { function forceUpdateReactVirtualizedComponent(component) { typeof component.forceUpdateGrid === 'function' ? component.forceUpdateGrid() : component.forceUpdate(); } -},{"../utils/createCallbackMemoizer":75,"react":undefined,"react-addons-shallow-compare":29}],67:[function(require,module,exports){ +},{"../utils/createCallbackMemoizer":77,"react":undefined,"react-addons-shallow-compare":29}],68:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -7693,7 +8056,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de exports.default = _InfiniteLoader3.default; exports.InfiniteLoader = _InfiniteLoader3.default; -},{"./InfiniteLoader":66}],68:[function(require,module,exports){ +},{"./InfiniteLoader":67}],69:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -7794,7 +8157,7 @@ ScrollSync.propTypes = { children: _react.PropTypes.func.isRequired }; exports.default = ScrollSync; -},{"react":undefined,"react-addons-shallow-compare":29}],69:[function(require,module,exports){ +},{"react":undefined,"react-addons-shallow-compare":29}],70:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -7810,7 +8173,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de exports.default = _ScrollSync3.default; exports.ScrollSync = _ScrollSync3.default; -},{"./ScrollSync":68}],70:[function(require,module,exports){ +},{"./ScrollSync":69}],71:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -8104,7 +8467,7 @@ VirtualScroll.defaultProps = { style: {} }; exports.default = VirtualScroll; -},{"../Grid":60,"classnames":undefined,"react":undefined,"react-addons-shallow-compare":29}],71:[function(require,module,exports){ +},{"../Grid":61,"classnames":undefined,"react":undefined,"react-addons-shallow-compare":29}],72:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -8120,13 +8483,12 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de exports.default = _VirtualScroll3.default; exports.VirtualScroll = _VirtualScroll3.default; -},{"./VirtualScroll":70}],72:[function(require,module,exports){ +},{"./VirtualScroll":71}],73:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); -exports.IS_SCROLLING_TIMEOUT = undefined; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); @@ -8146,6 +8508,8 @@ var _raf = require('raf'); var _raf2 = _interopRequireDefault(_raf); +var _onScroll = require('./utils/onScroll'); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -8154,12 +8518,6 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -/** - * Specifies the number of miliseconds during which to disable pointer events while a scroll is in progress. - * This improves performance and makes scrolling smoother. - */ -var IS_SCROLLING_TIMEOUT = exports.IS_SCROLLING_TIMEOUT = 150; - var WindowScroller = function (_Component) { _inherits(WindowScroller, _Component); @@ -8198,20 +8556,15 @@ var WindowScroller = function (_Component) { }); } - window.addEventListener('scroll', this._onScrollWindow, false); + (0, _onScroll.registerScrollListener)(this); window.addEventListener('resize', this._onResizeWindow, false); } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { - window.removeEventListener('scroll', this._onScrollWindow, false); - window.removeEventListener('resize', this._onResizeWindow, false); + (0, _onScroll.unregisterScrollListener)(this); - if (this._disablePointerEventsTimeoutId) { - clearTimeout(this._disablePointerEventsTimeoutId); - - this._enablePointerEventsIfDisabled(); - } + window.removeEventListener('resize', this._onResizeWindow, false); } /** @@ -8259,35 +8612,13 @@ var WindowScroller = function (_Component) { value: function shouldComponentUpdate(nextProps, nextState) { return (0, _reactAddonsShallowCompare2.default)(this, nextProps, nextState); } - }, { - key: '_enablePointerEventsAfterDelay', - value: function _enablePointerEventsAfterDelay() { - if (this._disablePointerEventsTimeoutId) { - clearTimeout(this._disablePointerEventsTimeoutId); - } - - this._disablePointerEventsTimeoutId = setTimeout(this._enablePointerEventsAfterDelayCallback, IS_SCROLLING_TIMEOUT); - } }, { key: '_enablePointerEventsAfterDelayCallback', value: function _enablePointerEventsAfterDelayCallback() { - this._enablePointerEventsIfDisabled(); - this.setState({ isScrolling: false }); } - }, { - key: '_enablePointerEventsIfDisabled', - value: function _enablePointerEventsIfDisabled() { - if (this._disablePointerEventsTimeoutId) { - this._disablePointerEventsTimeoutId = null; - - document.body.style.pointerEvents = this._originalBodyPointerEvents; - - this._originalBodyPointerEvents = null; - } - } }, { key: '_onResizeWindow', value: function _onResizeWindow(event) { @@ -8311,14 +8642,6 @@ var WindowScroller = function (_Component) { var scrollTop = Math.max(0, scrollY - this._positionFromTop); - if (this._originalBodyPointerEvents == null) { - this._originalBodyPointerEvents = document.body.style.pointerEvents; - - document.body.style.pointerEvents = 'none'; - - this._enablePointerEventsAfterDelay(); - } - var state = { isScrolling: true, scrollTop: scrollTop @@ -8356,23 +8679,103 @@ WindowScroller.defaultProps = { onScroll: function onScroll() {} }; exports.default = WindowScroller; -},{"raf":28,"react":undefined,"react-addons-shallow-compare":29,"react-dom":undefined}],73:[function(require,module,exports){ +},{"./utils/onScroll":75,"raf":28,"react":undefined,"react-addons-shallow-compare":29,"react-dom":undefined}],74:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); -exports.WindowScroller = exports.default = undefined; +exports.IS_SCROLLING_TIMEOUT = exports.WindowScroller = exports.default = undefined; var _WindowScroller2 = require('./WindowScroller'); var _WindowScroller3 = _interopRequireDefault(_WindowScroller2); +var _onScroll = require('./utils/onScroll'); + +var _onScroll2 = _interopRequireDefault(_onScroll); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.default = _WindowScroller3.default; exports.WindowScroller = _WindowScroller3.default; -},{"./WindowScroller":72}],74:[function(require,module,exports){ +exports.IS_SCROLLING_TIMEOUT = _onScroll2.default; +},{"./WindowScroller":73,"./utils/onScroll":75}],75:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.registerScrollListener = registerScrollListener; +exports.unregisterScrollListener = unregisterScrollListener; +var mountedInstances = []; +var originalBodyPointerEvents = null; +var disablePointerEventsTimeoutId = null; + +/** + * Specifies the number of miliseconds during which to disable pointer events while a scroll is in progress. + * This improves performance and makes scrolling smoother. + */ +var IS_SCROLLING_TIMEOUT = exports.IS_SCROLLING_TIMEOUT = 150; + +function enablePointerEventsIfDisabled() { + if (disablePointerEventsTimeoutId) { + disablePointerEventsTimeoutId = null; + + document.body.style.pointerEvents = originalBodyPointerEvents; + + originalBodyPointerEvents = null; + } +} + +function enablePointerEventsAfterDelayCallback() { + enablePointerEventsIfDisabled(); + mountedInstances.forEach(function (component) { + return component._enablePointerEventsAfterDelayCallback(); + }); +} + +function enablePointerEventsAfterDelay() { + if (disablePointerEventsTimeoutId) { + clearTimeout(disablePointerEventsTimeoutId); + } + + disablePointerEventsTimeoutId = setTimeout(enablePointerEventsAfterDelayCallback, IS_SCROLLING_TIMEOUT); +} + +function onScrollWindow(event) { + if (originalBodyPointerEvents == null) { + originalBodyPointerEvents = document.body.style.pointerEvents; + + document.body.style.pointerEvents = 'none'; + + enablePointerEventsAfterDelay(); + } + mountedInstances.forEach(function (component) { + return component._onScrollWindow(event); + }); +} + +function registerScrollListener(component) { + if (!mountedInstances.length) { + window.addEventListener('scroll', onScrollWindow); + } + mountedInstances.push(component); +} + +function unregisterScrollListener(component) { + mountedInstances = mountedInstances.filter(function (c) { + return c !== component; + }); + if (!mountedInstances.length) { + window.removeEventListener('scroll', onScrollWindow); + if (disablePointerEventsTimeoutId) { + clearTimeout(disablePointerEventsTimeoutId); + enablePointerEventsIfDisabled(); + } + } +} +},{}],76:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -8537,7 +8940,7 @@ Object.defineProperty(exports, 'WindowScroller', { return _WindowScroller.WindowScroller; } }); -},{"./ArrowKeyStepper":35,"./AutoSizer":37,"./CellMeasurer":40,"./Collection":45,"./ColumnSizer":48,"./FlexTable":57,"./Grid":60,"./InfiniteLoader":67,"./ScrollSync":69,"./VirtualScroll":71,"./WindowScroller":73}],75:[function(require,module,exports){ +},{"./ArrowKeyStepper":36,"./AutoSizer":38,"./CellMeasurer":41,"./Collection":46,"./ColumnSizer":49,"./FlexTable":58,"./Grid":61,"./InfiniteLoader":68,"./ScrollSync":70,"./VirtualScroll":72,"./WindowScroller":74}],77:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -8575,7 +8978,7 @@ function createCallbackMemoizer() { } }; } -},{}],76:[function(require,module,exports){ +},{}],78:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -8616,7 +9019,7 @@ function getUpdatedOffsetForIndex(_ref) { return Math.max(minOffset, Math.min(maxOffset, currentOffset)); } } -},{}],77:[function(require,module,exports){ +},{}],79:[function(require,module,exports){ 'use strict'; /** @@ -8779,7 +9182,7 @@ module.exports = { addResizeListener: addResizeListener, removeResizeListener: removeResizeListener }; -},{}],78:[function(require,module,exports){ +},{}],80:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -8805,7 +9208,7 @@ function shallowCompare(instance, nextProps, nextState) { } module.exports = shallowCompare; -},{"fbjs/lib/shallowEqual":19}],79:[function(require,module,exports){ +},{"fbjs/lib/shallowEqual":19}],81:[function(require,module,exports){ 'use strict'; module.exports = function (str) { return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { @@ -8813,7 +9216,7 @@ module.exports = function (str) { }); }; -},{}],80:[function(require,module,exports){ +},{}],82:[function(require,module,exports){ (function(self) { 'use strict'; diff --git a/examples/dist/bundle.js b/examples/dist/bundle.js index e5590cae..303ad08a 100644 --- a/examples/dist/bundle.js +++ b/examples/dist/bundle.js @@ -5,6 +5,8 @@ var _extends = Object.assign || function (target) { for (var i = 1; i < argument function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } + var _react = require('react'); var _react2 = _interopRequireDefault(_react); @@ -57,6 +59,7 @@ var Async = _react2['default'].createClass({ propTypes: { cache: _react2['default'].PropTypes.any, // object to use to cache results, can be null to disable cache + children: _react2['default'].PropTypes.func, // Child function responsible for creating the inner Select component; (props: Object): PropTypes.element ignoreAccents: _react2['default'].PropTypes.bool, // whether to strip diacritics when filtering (shared with Select) ignoreCase: _react2['default'].PropTypes.bool, // whether to perform case-insensitive filtering (shared with Select) isLoading: _react2['default'].PropTypes.bool, // overrides the isLoading state when set to true @@ -158,7 +161,13 @@ var Async = _react2['default'].createClass({ render: function render() { var _this2 = this; - var noResultsText = this.props.noResultsText; + var _props = this.props; + var _props$children = _props.children; + var children = _props$children === undefined ? defaultChildren : _props$children; + var noResultsText = _props.noResultsText; + + var restProps = _objectWithoutProperties(_props, ['children', 'noResultsText']); + var _state = this.state; var isLoading = _state.isLoading; var options = _state.options; @@ -170,22 +179,29 @@ var Async = _react2['default'].createClass({ } else if (!options.length && this._lastInput.length < this.props.minimumInput) { noResultsText = this.props.searchPromptText; } - return _react2['default'].createElement(_Select2['default'], _extends({}, this.props, { - ref: function (ref) { - return _this2.select = ref; - }, + + var props = _extends({}, restProps, { isLoading: isLoading, noResultsText: noResultsText, onInputChange: this.loadOptions, options: options, - placeholder: placeholder - })); + placeholder: placeholder, + ref: function ref(_ref) { + _this2.select = _ref; + } + }); + + return children(props); } }); +function defaultChildren(props) { + return _react2['default'].createElement(_Select2['default'], props); +}; + module.exports = Async; -},{"./Select":"react-select","./utils/stripDiacritics":7,"react":undefined}],2:[function(require,module,exports){ +},{"./Select":"react-select","./utils/stripDiacritics":8,"react":undefined}],2:[function(require,module,exports){ 'use strict'; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; @@ -214,6 +230,11 @@ var Creatable = _react2['default'].createClass({ displayName: 'CreatableSelect', propTypes: { + // Child function responsible for creating the inner Select component + // This component can be used to compose HOCs (eg Creatable and Async) + // (props: Object): PropTypes.element + children: _react2['default'].PropTypes.func, + // See Select.propTypes.filterOptions filterOptions: _react2['default'].PropTypes.any, @@ -322,9 +343,9 @@ var Creatable = _react2['default'].createClass({ return filteredOptions; }, - isOptionUnique: function isOptionUnique(_ref) { - var option = _ref.option; - var options = _ref.options; + isOptionUnique: function isOptionUnique(_ref2) { + var option = _ref2.option; + var options = _ref2.options; if (!this.select) { return false; @@ -378,44 +399,52 @@ var Creatable = _react2['default'].createClass({ var _this = this; var _props3 = this.props; + var _props3$children = _props3.children; + var children = _props3$children === undefined ? defaultChildren : _props3$children; var newOptionCreator = _props3.newOptionCreator; var shouldKeyDownEventCreateNewOption = _props3.shouldKeyDownEventCreateNewOption; - var restProps = _objectWithoutProperties(_props3, ['newOptionCreator', 'shouldKeyDownEventCreateNewOption']); + var restProps = _objectWithoutProperties(_props3, ['children', 'newOptionCreator', 'shouldKeyDownEventCreateNewOption']); - return _react2['default'].createElement(_Select2['default'], _extends({}, restProps, { + var props = _extends({}, restProps, { allowCreate: true, filterOptions: this.filterOptions, menuRenderer: this.menuRenderer, onInputKeyDown: this.onInputKeyDown, - ref: function (ref) { - return _this.select = ref; + ref: function ref(_ref) { + _this.select = _ref; } - })); + }); + + return children(props); } }); -function isOptionUnique(_ref2) { - var option = _ref2.option; - var options = _ref2.options; - var labelKey = _ref2.labelKey; - var valueKey = _ref2.valueKey; +function defaultChildren(props) { + return _react2['default'].createElement(_Select2['default'], props); +}; + +function isOptionUnique(_ref3) { + var option = _ref3.option; + var options = _ref3.options; + var labelKey = _ref3.labelKey; + var valueKey = _ref3.valueKey; return options.filter(function (existingOption) { return existingOption[labelKey] === option[labelKey] || existingOption[valueKey] === option[valueKey]; }).length === 0; }; -function isValidNewOption(_ref3) { - var label = _ref3.label; +function isValidNewOption(_ref4) { + var label = _ref4.label; return !!label; }; -function newOptionCreator(_ref4) { - var label = _ref4.label; - var labelKey = _ref4.labelKey; - var valueKey = _ref4.valueKey; +function newOptionCreator(_ref5) { + var label = _ref5.label; + var labelKey = _ref5.labelKey; + var valueKey = _ref5.valueKey; var option = {}; option[valueKey] = label; @@ -428,8 +457,8 @@ function promptTextCreator(label) { return 'Create option "' + label + '"'; } -function shouldKeyDownEventCreateNewOption(_ref5) { - var keyCode = _ref5.keyCode; +function shouldKeyDownEventCreateNewOption(_ref6) { + var keyCode = _ref6.keyCode; switch (keyCode) { case 9: // TAB @@ -444,7 +473,7 @@ function shouldKeyDownEventCreateNewOption(_ref5) { module.exports = Creatable; -},{"./Select":"react-select","./utils/defaultFilterOptions":5,"./utils/defaultMenuRenderer":6,"react":undefined}],3:[function(require,module,exports){ +},{"./Select":"react-select","./utils/defaultFilterOptions":6,"./utils/defaultMenuRenderer":7,"react":undefined}],3:[function(require,module,exports){ 'use strict'; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } @@ -666,6 +695,32 @@ var Value = _react2['default'].createClass({ module.exports = Value; },{"classnames":undefined,"react":undefined}],5:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = arrowRenderer; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +function arrowRenderer(_ref) { + var onMouseDown = _ref.onMouseDown; + + return _react2["default"].createElement("span", { + className: "Select-arrow", + onMouseDown: onMouseDown + }); +} + +; +module.exports = exports["default"]; + +},{"react":undefined}],6:[function(require,module,exports){ 'use strict'; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } @@ -709,7 +764,7 @@ function filterOptions(options, filterValue, excludeOptions, props) { module.exports = filterOptions; -},{"./stripDiacritics":7}],6:[function(require,module,exports){ +},{"./stripDiacritics":8}],7:[function(require,module,exports){ 'use strict'; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } @@ -770,7 +825,7 @@ function menuRenderer(_ref) { module.exports = menuRenderer; -},{"classnames":undefined,"react":undefined}],7:[function(require,module,exports){ +},{"classnames":undefined,"react":undefined}],8:[function(require,module,exports){ 'use strict'; var map = [{ 'base': 'A', 'letters': /[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g }, { 'base': 'AA', 'letters': /[\uA732]/g }, { 'base': 'AE', 'letters': /[\u00C6\u01FC\u01E2]/g }, { 'base': 'AO', 'letters': /[\uA734]/g }, { 'base': 'AU', 'letters': /[\uA736]/g }, { 'base': 'AV', 'letters': /[\uA738\uA73A]/g }, { 'base': 'AY', 'letters': /[\uA73C]/g }, { 'base': 'B', 'letters': /[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g }, { 'base': 'C', 'letters': /[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g }, { 'base': 'D', 'letters': /[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g }, { 'base': 'DZ', 'letters': /[\u01F1\u01C4]/g }, { 'base': 'Dz', 'letters': /[\u01F2\u01C5]/g }, { 'base': 'E', 'letters': /[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g }, { 'base': 'F', 'letters': /[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g }, { 'base': 'G', 'letters': /[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g }, { 'base': 'H', 'letters': /[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g }, { 'base': 'I', 'letters': /[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g }, { 'base': 'J', 'letters': /[\u004A\u24BF\uFF2A\u0134\u0248]/g }, { 'base': 'K', 'letters': /[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g }, { 'base': 'L', 'letters': /[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g }, { 'base': 'LJ', 'letters': /[\u01C7]/g }, { 'base': 'Lj', 'letters': /[\u01C8]/g }, { 'base': 'M', 'letters': /[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g }, { 'base': 'N', 'letters': /[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g }, { 'base': 'NJ', 'letters': /[\u01CA]/g }, { 'base': 'Nj', 'letters': /[\u01CB]/g }, { 'base': 'O', 'letters': /[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g }, { 'base': 'OI', 'letters': /[\u01A2]/g }, { 'base': 'OO', 'letters': /[\uA74E]/g }, { 'base': 'OU', 'letters': /[\u0222]/g }, { 'base': 'P', 'letters': /[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g }, { 'base': 'Q', 'letters': /[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g }, { 'base': 'R', 'letters': /[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g }, { 'base': 'S', 'letters': /[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g }, { 'base': 'T', 'letters': /[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g }, { 'base': 'TZ', 'letters': /[\uA728]/g }, { 'base': 'U', 'letters': /[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g }, { 'base': 'V', 'letters': /[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g }, { 'base': 'VY', 'letters': /[\uA760]/g }, { 'base': 'W', 'letters': /[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g }, { 'base': 'X', 'letters': /[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g }, { 'base': 'Y', 'letters': /[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g }, { 'base': 'Z', 'letters': /[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g }, { 'base': 'a', 'letters': /[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g }, { 'base': 'aa', 'letters': /[\uA733]/g }, { 'base': 'ae', 'letters': /[\u00E6\u01FD\u01E3]/g }, { 'base': 'ao', 'letters': /[\uA735]/g }, { 'base': 'au', 'letters': /[\uA737]/g }, { 'base': 'av', 'letters': /[\uA739\uA73B]/g }, { 'base': 'ay', 'letters': /[\uA73D]/g }, { 'base': 'b', 'letters': /[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g }, { 'base': 'c', 'letters': /[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g }, { 'base': 'd', 'letters': /[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g }, { 'base': 'dz', 'letters': /[\u01F3\u01C6]/g }, { 'base': 'e', 'letters': /[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g }, { 'base': 'f', 'letters': /[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g }, { 'base': 'g', 'letters': /[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g }, { 'base': 'h', 'letters': /[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g }, { 'base': 'hv', 'letters': /[\u0195]/g }, { 'base': 'i', 'letters': /[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g }, { 'base': 'j', 'letters': /[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g }, { 'base': 'k', 'letters': /[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g }, { 'base': 'l', 'letters': /[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g }, { 'base': 'lj', 'letters': /[\u01C9]/g }, { 'base': 'm', 'letters': /[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g }, { 'base': 'n', 'letters': /[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g }, { 'base': 'nj', 'letters': /[\u01CC]/g }, { 'base': 'o', 'letters': /[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g }, { 'base': 'oi', 'letters': /[\u01A3]/g }, { 'base': 'ou', 'letters': /[\u0223]/g }, { 'base': 'oo', 'letters': /[\uA74F]/g }, { 'base': 'p', 'letters': /[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g }, { 'base': 'q', 'letters': /[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g }, { 'base': 'r', 'letters': /[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g }, { 'base': 's', 'letters': /[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g }, { 'base': 't', 'letters': /[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g }, { 'base': 'tz', 'letters': /[\uA729]/g }, { 'base': 'u', 'letters': /[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g }, { 'base': 'v', 'letters': /[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g }, { 'base': 'vy', 'letters': /[\uA761]/g }, { 'base': 'w', 'letters': /[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g }, { 'base': 'x', 'letters': /[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g }, { 'base': 'y', 'letters': /[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g }, { 'base': 'z', 'letters': /[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g }]; @@ -783,6 +838,12 @@ module.exports = function stripDiacritics(str) { }; },{}],"react-select":[function(require,module,exports){ +/*! + Copyright (c) 2016 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/react-select +*/ + 'use strict'; Object.defineProperty(exports, '__esModule', { @@ -813,6 +874,10 @@ var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); +var _utilsDefaultArrowRenderer = require('./utils/defaultArrowRenderer'); + +var _utilsDefaultArrowRenderer2 = _interopRequireDefault(_utilsDefaultArrowRenderer); + var _utilsDefaultFilterOptions = require('./utils/defaultFilterOptions'); var _utilsDefaultFilterOptions2 = _interopRequireDefault(_utilsDefaultFilterOptions); @@ -861,12 +926,12 @@ var Select = _react2['default'].createClass({ addLabelText: _react2['default'].PropTypes.string, // placeholder displayed when you want to add a label on a multi-value input 'aria-label': _react2['default'].PropTypes.string, // Aria label (for assistive tech) 'aria-labelledby': _react2['default'].PropTypes.string, // HTML ID of an element that should be used as the label (for assistive tech) + arrowRenderer: _react2['default'].PropTypes.func, // Create drop-down caret element autoBlur: _react2['default'].PropTypes.bool, // automatically blur the component when an option is selected autofocus: _react2['default'].PropTypes.bool, // autofocus the component on mount autosize: _react2['default'].PropTypes.bool, // whether to enable autosizing or not backspaceRemoves: _react2['default'].PropTypes.bool, // whether backspace removes an item if there is no text input - backspaceToRemoveMessage: _react2['default'].PropTypes.string, // Message to use for screenreaders to press backspace to remove the current item - - // {label} is replaced with the item label + backspaceToRemoveMessage: _react2['default'].PropTypes.string, // Message to use for screenreaders to press backspace to remove the current item - {label} is replaced with the item label className: _react2['default'].PropTypes.string, // className for the outer element clearAllText: stringOrNode, // title for the "clear" control when multi: true clearValueText: stringOrNode, // title for the "clear" control @@ -932,6 +997,7 @@ var Select = _react2['default'].createClass({ getDefaultProps: function getDefaultProps() { return { addLabelText: 'Add "{label}"?', + arrowRenderer: _utilsDefaultArrowRenderer2['default'], autosize: true, backspaceRemoves: true, backspaceToRemoveMessage: 'Press backspace to remove {label}', @@ -1142,7 +1208,7 @@ var Select = _react2['default'].createClass({ var input = this.input; if (typeof input.getInput === 'function') { - // Get the actual DOM input if the ref is an component + // Get the actual DOM input if the ref is an component input = input.getInput(); } @@ -1209,6 +1275,7 @@ var Select = _react2['default'].createClass({ }, handleInputFocus: function handleInputFocus(event) { + if (this.props.disabled) return; var isOpen = this.state.isOpen || this._openAfterFocus || this.props.openOnFocus; if (this.props.onFocus) { this.props.onFocus(event); @@ -1730,10 +1797,16 @@ var Select = _react2['default'].createClass({ }, renderArrow: function renderArrow() { + var onMouseDown = this.handleMouseDownOnArrow; + var arrow = this.props.arrowRenderer({ onMouseDown: onMouseDown }); + return _react2['default'].createElement( 'span', - { className: 'Select-arrow-zone', onMouseDown: this.handleMouseDownOnArrow }, - _react2['default'].createElement('span', { className: 'Select-arrow', onMouseDown: this.handleMouseDownOnArrow }) + { + className: 'Select-arrow-zone', + onMouseDown: onMouseDown + }, + arrow ); }, @@ -1934,4 +2007,4 @@ var Select = _react2['default'].createClass({ exports['default'] = Select; module.exports = exports['default']; -},{"./Async":1,"./Creatable":2,"./Option":3,"./Value":4,"./utils/defaultFilterOptions":5,"./utils/defaultMenuRenderer":6,"classnames":undefined,"react":undefined,"react-dom":undefined,"react-input-autosize":undefined}]},{},[]); +},{"./Async":1,"./Creatable":2,"./Option":3,"./Value":4,"./utils/defaultArrowRenderer":5,"./utils/defaultFilterOptions":6,"./utils/defaultMenuRenderer":7,"classnames":undefined,"react":undefined,"react-dom":undefined,"react-input-autosize":undefined}]},{},[]); diff --git a/examples/dist/common.js b/examples/dist/common.js index a63febb3..ef927103 100644 --- a/examples/dist/common.js +++ b/examples/dist/common.js @@ -1267,20 +1267,30 @@ var process = module.exports = {}; var cachedSetTimeout; var cachedClearTimeout; +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} (function () { try { - cachedSetTimeout = setTimeout; - } catch (e) { - cachedSetTimeout = function () { - throw new Error('setTimeout is not defined'); + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; } + } catch (e) { + cachedSetTimeout = defaultSetTimout; } try { - cachedClearTimeout = clearTimeout; - } catch (e) { - cachedClearTimeout = function () { - throw new Error('clearTimeout is not defined'); + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; } } ()) function runTimeout(fun) { @@ -1288,6 +1298,11 @@ function runTimeout(fun) { //normal enviroments in sane situations return setTimeout(fun, 0); } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedSetTimeout(fun, 0); @@ -1308,6 +1323,11 @@ function runClearTimeout(marker) { //normal enviroments in sane situations return clearTimeout(marker); } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedClearTimeout(marker); diff --git a/examples/dist/standalone.js b/examples/dist/standalone.js index 160e4f51..0fb8aad0 100644 --- a/examples/dist/standalone.js +++ b/examples/dist/standalone.js @@ -6,6 +6,8 @@ var _extends = Object.assign || function (target) { for (var i = 1; i < argument function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } + var _react = (typeof window !== "undefined" ? window['React'] : typeof global !== "undefined" ? global['React'] : null); var _react2 = _interopRequireDefault(_react); @@ -58,6 +60,7 @@ var Async = _react2['default'].createClass({ propTypes: { cache: _react2['default'].PropTypes.any, // object to use to cache results, can be null to disable cache + children: _react2['default'].PropTypes.func, // Child function responsible for creating the inner Select component; (props: Object): PropTypes.element ignoreAccents: _react2['default'].PropTypes.bool, // whether to strip diacritics when filtering (shared with Select) ignoreCase: _react2['default'].PropTypes.bool, // whether to perform case-insensitive filtering (shared with Select) isLoading: _react2['default'].PropTypes.bool, // overrides the isLoading state when set to true @@ -159,7 +162,13 @@ var Async = _react2['default'].createClass({ render: function render() { var _this2 = this; - var noResultsText = this.props.noResultsText; + var _props = this.props; + var _props$children = _props.children; + var children = _props$children === undefined ? defaultChildren : _props$children; + var noResultsText = _props.noResultsText; + + var restProps = _objectWithoutProperties(_props, ['children', 'noResultsText']); + var _state = this.state; var isLoading = _state.isLoading; var options = _state.options; @@ -171,23 +180,30 @@ var Async = _react2['default'].createClass({ } else if (!options.length && this._lastInput.length < this.props.minimumInput) { noResultsText = this.props.searchPromptText; } - return _react2['default'].createElement(_Select2['default'], _extends({}, this.props, { - ref: function (ref) { - return _this2.select = ref; - }, + + var props = _extends({}, restProps, { isLoading: isLoading, noResultsText: noResultsText, onInputChange: this.loadOptions, options: options, - placeholder: placeholder - })); + placeholder: placeholder, + ref: function ref(_ref) { + _this2.select = _ref; + } + }); + + return children(props); } }); +function defaultChildren(props) { + return _react2['default'].createElement(_Select2['default'], props); +}; + module.exports = Async; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./Select":4,"./utils/stripDiacritics":8}],2:[function(require,module,exports){ +},{"./Select":4,"./utils/stripDiacritics":9}],2:[function(require,module,exports){ (function (global){ 'use strict'; @@ -217,6 +233,11 @@ var Creatable = _react2['default'].createClass({ displayName: 'CreatableSelect', propTypes: { + // Child function responsible for creating the inner Select component + // This component can be used to compose HOCs (eg Creatable and Async) + // (props: Object): PropTypes.element + children: _react2['default'].PropTypes.func, + // See Select.propTypes.filterOptions filterOptions: _react2['default'].PropTypes.any, @@ -325,9 +346,9 @@ var Creatable = _react2['default'].createClass({ return filteredOptions; }, - isOptionUnique: function isOptionUnique(_ref) { - var option = _ref.option; - var options = _ref.options; + isOptionUnique: function isOptionUnique(_ref2) { + var option = _ref2.option; + var options = _ref2.options; if (!this.select) { return false; @@ -381,44 +402,52 @@ var Creatable = _react2['default'].createClass({ var _this = this; var _props3 = this.props; + var _props3$children = _props3.children; + var children = _props3$children === undefined ? defaultChildren : _props3$children; var newOptionCreator = _props3.newOptionCreator; var shouldKeyDownEventCreateNewOption = _props3.shouldKeyDownEventCreateNewOption; - var restProps = _objectWithoutProperties(_props3, ['newOptionCreator', 'shouldKeyDownEventCreateNewOption']); + var restProps = _objectWithoutProperties(_props3, ['children', 'newOptionCreator', 'shouldKeyDownEventCreateNewOption']); - return _react2['default'].createElement(_Select2['default'], _extends({}, restProps, { + var props = _extends({}, restProps, { allowCreate: true, filterOptions: this.filterOptions, menuRenderer: this.menuRenderer, onInputKeyDown: this.onInputKeyDown, - ref: function (ref) { - return _this.select = ref; + ref: function ref(_ref) { + _this.select = _ref; } - })); + }); + + return children(props); } }); -function isOptionUnique(_ref2) { - var option = _ref2.option; - var options = _ref2.options; - var labelKey = _ref2.labelKey; - var valueKey = _ref2.valueKey; +function defaultChildren(props) { + return _react2['default'].createElement(_Select2['default'], props); +}; + +function isOptionUnique(_ref3) { + var option = _ref3.option; + var options = _ref3.options; + var labelKey = _ref3.labelKey; + var valueKey = _ref3.valueKey; return options.filter(function (existingOption) { return existingOption[labelKey] === option[labelKey] || existingOption[valueKey] === option[valueKey]; }).length === 0; }; -function isValidNewOption(_ref3) { - var label = _ref3.label; +function isValidNewOption(_ref4) { + var label = _ref4.label; return !!label; }; -function newOptionCreator(_ref4) { - var label = _ref4.label; - var labelKey = _ref4.labelKey; - var valueKey = _ref4.valueKey; +function newOptionCreator(_ref5) { + var label = _ref5.label; + var labelKey = _ref5.labelKey; + var valueKey = _ref5.valueKey; var option = {}; option[valueKey] = label; @@ -431,8 +460,8 @@ function promptTextCreator(label) { return 'Create option "' + label + '"'; } -function shouldKeyDownEventCreateNewOption(_ref5) { - var keyCode = _ref5.keyCode; +function shouldKeyDownEventCreateNewOption(_ref6) { + var keyCode = _ref6.keyCode; switch (keyCode) { case 9: // TAB @@ -448,7 +477,7 @@ function shouldKeyDownEventCreateNewOption(_ref5) { module.exports = Creatable; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./Select":4,"./utils/defaultFilterOptions":6,"./utils/defaultMenuRenderer":7}],3:[function(require,module,exports){ +},{"./Select":4,"./utils/defaultFilterOptions":7,"./utils/defaultMenuRenderer":8}],3:[function(require,module,exports){ (function (global){ 'use strict'; @@ -565,6 +594,12 @@ module.exports = Option; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],4:[function(require,module,exports){ (function (global){ +/*! + Copyright (c) 2016 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/react-select +*/ + 'use strict'; Object.defineProperty(exports, '__esModule', { @@ -595,6 +630,10 @@ var _classnames = (typeof window !== "undefined" ? window['classNames'] : typeof var _classnames2 = _interopRequireDefault(_classnames); +var _utilsDefaultArrowRenderer = require('./utils/defaultArrowRenderer'); + +var _utilsDefaultArrowRenderer2 = _interopRequireDefault(_utilsDefaultArrowRenderer); + var _utilsDefaultFilterOptions = require('./utils/defaultFilterOptions'); var _utilsDefaultFilterOptions2 = _interopRequireDefault(_utilsDefaultFilterOptions); @@ -643,12 +682,12 @@ var Select = _react2['default'].createClass({ addLabelText: _react2['default'].PropTypes.string, // placeholder displayed when you want to add a label on a multi-value input 'aria-label': _react2['default'].PropTypes.string, // Aria label (for assistive tech) 'aria-labelledby': _react2['default'].PropTypes.string, // HTML ID of an element that should be used as the label (for assistive tech) + arrowRenderer: _react2['default'].PropTypes.func, // Create drop-down caret element autoBlur: _react2['default'].PropTypes.bool, // automatically blur the component when an option is selected autofocus: _react2['default'].PropTypes.bool, // autofocus the component on mount autosize: _react2['default'].PropTypes.bool, // whether to enable autosizing or not backspaceRemoves: _react2['default'].PropTypes.bool, // whether backspace removes an item if there is no text input - backspaceToRemoveMessage: _react2['default'].PropTypes.string, // Message to use for screenreaders to press backspace to remove the current item - - // {label} is replaced with the item label + backspaceToRemoveMessage: _react2['default'].PropTypes.string, // Message to use for screenreaders to press backspace to remove the current item - {label} is replaced with the item label className: _react2['default'].PropTypes.string, // className for the outer element clearAllText: stringOrNode, // title for the "clear" control when multi: true clearValueText: stringOrNode, // title for the "clear" control @@ -714,6 +753,7 @@ var Select = _react2['default'].createClass({ getDefaultProps: function getDefaultProps() { return { addLabelText: 'Add "{label}"?', + arrowRenderer: _utilsDefaultArrowRenderer2['default'], autosize: true, backspaceRemoves: true, backspaceToRemoveMessage: 'Press backspace to remove {label}', @@ -924,7 +964,7 @@ var Select = _react2['default'].createClass({ var input = this.input; if (typeof input.getInput === 'function') { - // Get the actual DOM input if the ref is an component + // Get the actual DOM input if the ref is an component input = input.getInput(); } @@ -991,6 +1031,7 @@ var Select = _react2['default'].createClass({ }, handleInputFocus: function handleInputFocus(event) { + if (this.props.disabled) return; var isOpen = this.state.isOpen || this._openAfterFocus || this.props.openOnFocus; if (this.props.onFocus) { this.props.onFocus(event); @@ -1512,10 +1553,16 @@ var Select = _react2['default'].createClass({ }, renderArrow: function renderArrow() { + var onMouseDown = this.handleMouseDownOnArrow; + var arrow = this.props.arrowRenderer({ onMouseDown: onMouseDown }); + return _react2['default'].createElement( 'span', - { className: 'Select-arrow-zone', onMouseDown: this.handleMouseDownOnArrow }, - _react2['default'].createElement('span', { className: 'Select-arrow', onMouseDown: this.handleMouseDownOnArrow }) + { + className: 'Select-arrow-zone', + onMouseDown: onMouseDown + }, + arrow ); }, @@ -1717,7 +1764,7 @@ exports['default'] = Select; module.exports = exports['default']; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./Async":1,"./Creatable":2,"./Option":3,"./Value":5,"./utils/defaultFilterOptions":6,"./utils/defaultMenuRenderer":7}],5:[function(require,module,exports){ +},{"./Async":1,"./Creatable":2,"./Option":3,"./Value":5,"./utils/defaultArrowRenderer":6,"./utils/defaultFilterOptions":7,"./utils/defaultMenuRenderer":8}],5:[function(require,module,exports){ (function (global){ 'use strict'; @@ -1828,6 +1875,34 @@ module.exports = Value; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],6:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = arrowRenderer; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var _react = (typeof window !== "undefined" ? window['React'] : typeof global !== "undefined" ? global['React'] : null); + +var _react2 = _interopRequireDefault(_react); + +function arrowRenderer(_ref) { + var onMouseDown = _ref.onMouseDown; + + return _react2["default"].createElement("span", { + className: "Select-arrow", + onMouseDown: onMouseDown + }); +} + +; +module.exports = exports["default"]; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],7:[function(require,module,exports){ 'use strict'; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } @@ -1871,7 +1946,7 @@ function filterOptions(options, filterValue, excludeOptions, props) { module.exports = filterOptions; -},{"./stripDiacritics":8}],7:[function(require,module,exports){ +},{"./stripDiacritics":9}],8:[function(require,module,exports){ (function (global){ 'use strict'; @@ -1934,7 +2009,7 @@ function menuRenderer(_ref) { module.exports = menuRenderer; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],8:[function(require,module,exports){ +},{}],9:[function(require,module,exports){ 'use strict'; var map = [{ 'base': 'A', 'letters': /[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g }, { 'base': 'AA', 'letters': /[\uA732]/g }, { 'base': 'AE', 'letters': /[\u00C6\u01FC\u01E2]/g }, { 'base': 'AO', 'letters': /[\uA734]/g }, { 'base': 'AU', 'letters': /[\uA736]/g }, { 'base': 'AV', 'letters': /[\uA738\uA73A]/g }, { 'base': 'AY', 'letters': /[\uA73C]/g }, { 'base': 'B', 'letters': /[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g }, { 'base': 'C', 'letters': /[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g }, { 'base': 'D', 'letters': /[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g }, { 'base': 'DZ', 'letters': /[\u01F1\u01C4]/g }, { 'base': 'Dz', 'letters': /[\u01F2\u01C5]/g }, { 'base': 'E', 'letters': /[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g }, { 'base': 'F', 'letters': /[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g }, { 'base': 'G', 'letters': /[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g }, { 'base': 'H', 'letters': /[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g }, { 'base': 'I', 'letters': /[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g }, { 'base': 'J', 'letters': /[\u004A\u24BF\uFF2A\u0134\u0248]/g }, { 'base': 'K', 'letters': /[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g }, { 'base': 'L', 'letters': /[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g }, { 'base': 'LJ', 'letters': /[\u01C7]/g }, { 'base': 'Lj', 'letters': /[\u01C8]/g }, { 'base': 'M', 'letters': /[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g }, { 'base': 'N', 'letters': /[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g }, { 'base': 'NJ', 'letters': /[\u01CA]/g }, { 'base': 'Nj', 'letters': /[\u01CB]/g }, { 'base': 'O', 'letters': /[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g }, { 'base': 'OI', 'letters': /[\u01A2]/g }, { 'base': 'OO', 'letters': /[\uA74E]/g }, { 'base': 'OU', 'letters': /[\u0222]/g }, { 'base': 'P', 'letters': /[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g }, { 'base': 'Q', 'letters': /[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g }, { 'base': 'R', 'letters': /[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g }, { 'base': 'S', 'letters': /[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g }, { 'base': 'T', 'letters': /[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g }, { 'base': 'TZ', 'letters': /[\uA728]/g }, { 'base': 'U', 'letters': /[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g }, { 'base': 'V', 'letters': /[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g }, { 'base': 'VY', 'letters': /[\uA760]/g }, { 'base': 'W', 'letters': /[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g }, { 'base': 'X', 'letters': /[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g }, { 'base': 'Y', 'letters': /[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g }, { 'base': 'Z', 'letters': /[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g }, { 'base': 'a', 'letters': /[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g }, { 'base': 'aa', 'letters': /[\uA733]/g }, { 'base': 'ae', 'letters': /[\u00E6\u01FD\u01E3]/g }, { 'base': 'ao', 'letters': /[\uA735]/g }, { 'base': 'au', 'letters': /[\uA737]/g }, { 'base': 'av', 'letters': /[\uA739\uA73B]/g }, { 'base': 'ay', 'letters': /[\uA73D]/g }, { 'base': 'b', 'letters': /[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g }, { 'base': 'c', 'letters': /[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g }, { 'base': 'd', 'letters': /[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g }, { 'base': 'dz', 'letters': /[\u01F3\u01C6]/g }, { 'base': 'e', 'letters': /[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g }, { 'base': 'f', 'letters': /[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g }, { 'base': 'g', 'letters': /[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g }, { 'base': 'h', 'letters': /[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g }, { 'base': 'hv', 'letters': /[\u0195]/g }, { 'base': 'i', 'letters': /[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g }, { 'base': 'j', 'letters': /[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g }, { 'base': 'k', 'letters': /[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g }, { 'base': 'l', 'letters': /[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g }, { 'base': 'lj', 'letters': /[\u01C9]/g }, { 'base': 'm', 'letters': /[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g }, { 'base': 'n', 'letters': /[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g }, { 'base': 'nj', 'letters': /[\u01CC]/g }, { 'base': 'o', 'letters': /[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g }, { 'base': 'oi', 'letters': /[\u01A3]/g }, { 'base': 'ou', 'letters': /[\u0223]/g }, { 'base': 'oo', 'letters': /[\uA74F]/g }, { 'base': 'p', 'letters': /[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g }, { 'base': 'q', 'letters': /[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g }, { 'base': 'r', 'letters': /[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g }, { 'base': 's', 'letters': /[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g }, { 'base': 't', 'letters': /[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g }, { 'base': 'tz', 'letters': /[\uA729]/g }, { 'base': 'u', 'letters': /[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g }, { 'base': 'v', 'letters': /[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g }, { 'base': 'vy', 'letters': /[\uA761]/g }, { 'base': 'w', 'letters': /[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g }, { 'base': 'x', 'letters': /[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g }, { 'base': 'y', 'letters': /[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g }, { 'base': 'z', 'letters': /[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g }]; diff --git a/lib/Async.js b/lib/Async.js index bc371595..f8f6ce09 100644 --- a/lib/Async.js +++ b/lib/Async.js @@ -4,6 +4,8 @@ var _extends = Object.assign || function (target) { for (var i = 1; i < argument function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } + var _react = require('react'); var _react2 = _interopRequireDefault(_react); @@ -56,6 +58,7 @@ var Async = _react2['default'].createClass({ propTypes: { cache: _react2['default'].PropTypes.any, // object to use to cache results, can be null to disable cache + children: _react2['default'].PropTypes.func, // Child function responsible for creating the inner Select component; (props: Object): PropTypes.element ignoreAccents: _react2['default'].PropTypes.bool, // whether to strip diacritics when filtering (shared with Select) ignoreCase: _react2['default'].PropTypes.bool, // whether to perform case-insensitive filtering (shared with Select) isLoading: _react2['default'].PropTypes.bool, // overrides the isLoading state when set to true @@ -157,7 +160,13 @@ var Async = _react2['default'].createClass({ render: function render() { var _this2 = this; - var noResultsText = this.props.noResultsText; + var _props = this.props; + var _props$children = _props.children; + var children = _props$children === undefined ? defaultChildren : _props$children; + var noResultsText = _props.noResultsText; + + var restProps = _objectWithoutProperties(_props, ['children', 'noResultsText']); + var _state = this.state; var isLoading = _state.isLoading; var options = _state.options; @@ -169,17 +178,24 @@ var Async = _react2['default'].createClass({ } else if (!options.length && this._lastInput.length < this.props.minimumInput) { noResultsText = this.props.searchPromptText; } - return _react2['default'].createElement(_Select2['default'], _extends({}, this.props, { - ref: function (ref) { - return _this2.select = ref; - }, + + var props = _extends({}, restProps, { isLoading: isLoading, noResultsText: noResultsText, onInputChange: this.loadOptions, options: options, - placeholder: placeholder - })); + placeholder: placeholder, + ref: function ref(_ref) { + _this2.select = _ref; + } + }); + + return children(props); } }); +function defaultChildren(props) { + return _react2['default'].createElement(_Select2['default'], props); +}; + module.exports = Async; \ No newline at end of file diff --git a/lib/Creatable.js b/lib/Creatable.js index b382ff89..a435cea5 100644 --- a/lib/Creatable.js +++ b/lib/Creatable.js @@ -26,6 +26,11 @@ var Creatable = _react2['default'].createClass({ displayName: 'CreatableSelect', propTypes: { + // Child function responsible for creating the inner Select component + // This component can be used to compose HOCs (eg Creatable and Async) + // (props: Object): PropTypes.element + children: _react2['default'].PropTypes.func, + // See Select.propTypes.filterOptions filterOptions: _react2['default'].PropTypes.any, @@ -134,9 +139,9 @@ var Creatable = _react2['default'].createClass({ return filteredOptions; }, - isOptionUnique: function isOptionUnique(_ref) { - var option = _ref.option; - var options = _ref.options; + isOptionUnique: function isOptionUnique(_ref2) { + var option = _ref2.option; + var options = _ref2.options; if (!this.select) { return false; @@ -190,44 +195,52 @@ var Creatable = _react2['default'].createClass({ var _this = this; var _props3 = this.props; + var _props3$children = _props3.children; + var children = _props3$children === undefined ? defaultChildren : _props3$children; var newOptionCreator = _props3.newOptionCreator; var shouldKeyDownEventCreateNewOption = _props3.shouldKeyDownEventCreateNewOption; - var restProps = _objectWithoutProperties(_props3, ['newOptionCreator', 'shouldKeyDownEventCreateNewOption']); + var restProps = _objectWithoutProperties(_props3, ['children', 'newOptionCreator', 'shouldKeyDownEventCreateNewOption']); - return _react2['default'].createElement(_Select2['default'], _extends({}, restProps, { + var props = _extends({}, restProps, { allowCreate: true, filterOptions: this.filterOptions, menuRenderer: this.menuRenderer, onInputKeyDown: this.onInputKeyDown, - ref: function (ref) { - return _this.select = ref; + ref: function ref(_ref) { + _this.select = _ref; } - })); + }); + + return children(props); } }); -function isOptionUnique(_ref2) { - var option = _ref2.option; - var options = _ref2.options; - var labelKey = _ref2.labelKey; - var valueKey = _ref2.valueKey; +function defaultChildren(props) { + return _react2['default'].createElement(_Select2['default'], props); +}; + +function isOptionUnique(_ref3) { + var option = _ref3.option; + var options = _ref3.options; + var labelKey = _ref3.labelKey; + var valueKey = _ref3.valueKey; return options.filter(function (existingOption) { return existingOption[labelKey] === option[labelKey] || existingOption[valueKey] === option[valueKey]; }).length === 0; }; -function isValidNewOption(_ref3) { - var label = _ref3.label; +function isValidNewOption(_ref4) { + var label = _ref4.label; return !!label; }; -function newOptionCreator(_ref4) { - var label = _ref4.label; - var labelKey = _ref4.labelKey; - var valueKey = _ref4.valueKey; +function newOptionCreator(_ref5) { + var label = _ref5.label; + var labelKey = _ref5.labelKey; + var valueKey = _ref5.valueKey; var option = {}; option[valueKey] = label; @@ -240,8 +253,8 @@ function promptTextCreator(label) { return 'Create option "' + label + '"'; } -function shouldKeyDownEventCreateNewOption(_ref5) { - var keyCode = _ref5.keyCode; +function shouldKeyDownEventCreateNewOption(_ref6) { + var keyCode = _ref6.keyCode; switch (keyCode) { case 9: // TAB diff --git a/lib/Select.js b/lib/Select.js index 7c29d26d..541775f7 100644 --- a/lib/Select.js +++ b/lib/Select.js @@ -1,3 +1,9 @@ +/*! + Copyright (c) 2016 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/react-select +*/ + 'use strict'; Object.defineProperty(exports, '__esModule', { @@ -28,6 +34,10 @@ var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); +var _utilsDefaultArrowRenderer = require('./utils/defaultArrowRenderer'); + +var _utilsDefaultArrowRenderer2 = _interopRequireDefault(_utilsDefaultArrowRenderer); + var _utilsDefaultFilterOptions = require('./utils/defaultFilterOptions'); var _utilsDefaultFilterOptions2 = _interopRequireDefault(_utilsDefaultFilterOptions); @@ -76,12 +86,12 @@ var Select = _react2['default'].createClass({ addLabelText: _react2['default'].PropTypes.string, // placeholder displayed when you want to add a label on a multi-value input 'aria-label': _react2['default'].PropTypes.string, // Aria label (for assistive tech) 'aria-labelledby': _react2['default'].PropTypes.string, // HTML ID of an element that should be used as the label (for assistive tech) + arrowRenderer: _react2['default'].PropTypes.func, // Create drop-down caret element autoBlur: _react2['default'].PropTypes.bool, // automatically blur the component when an option is selected autofocus: _react2['default'].PropTypes.bool, // autofocus the component on mount autosize: _react2['default'].PropTypes.bool, // whether to enable autosizing or not backspaceRemoves: _react2['default'].PropTypes.bool, // whether backspace removes an item if there is no text input - backspaceToRemoveMessage: _react2['default'].PropTypes.string, // Message to use for screenreaders to press backspace to remove the current item - - // {label} is replaced with the item label + backspaceToRemoveMessage: _react2['default'].PropTypes.string, // Message to use for screenreaders to press backspace to remove the current item - {label} is replaced with the item label className: _react2['default'].PropTypes.string, // className for the outer element clearAllText: stringOrNode, // title for the "clear" control when multi: true clearValueText: stringOrNode, // title for the "clear" control @@ -147,6 +157,7 @@ var Select = _react2['default'].createClass({ getDefaultProps: function getDefaultProps() { return { addLabelText: 'Add "{label}"?', + arrowRenderer: _utilsDefaultArrowRenderer2['default'], autosize: true, backspaceRemoves: true, backspaceToRemoveMessage: 'Press backspace to remove {label}', @@ -357,7 +368,7 @@ var Select = _react2['default'].createClass({ var input = this.input; if (typeof input.getInput === 'function') { - // Get the actual DOM input if the ref is an component + // Get the actual DOM input if the ref is an component input = input.getInput(); } @@ -424,6 +435,7 @@ var Select = _react2['default'].createClass({ }, handleInputFocus: function handleInputFocus(event) { + if (this.props.disabled) return; var isOpen = this.state.isOpen || this._openAfterFocus || this.props.openOnFocus; if (this.props.onFocus) { this.props.onFocus(event); @@ -945,10 +957,16 @@ var Select = _react2['default'].createClass({ }, renderArrow: function renderArrow() { + var onMouseDown = this.handleMouseDownOnArrow; + var arrow = this.props.arrowRenderer({ onMouseDown: onMouseDown }); + return _react2['default'].createElement( 'span', - { className: 'Select-arrow-zone', onMouseDown: this.handleMouseDownOnArrow }, - _react2['default'].createElement('span', { className: 'Select-arrow', onMouseDown: this.handleMouseDownOnArrow }) + { + className: 'Select-arrow-zone', + onMouseDown: onMouseDown + }, + arrow ); }, diff --git a/lib/utils/defaultArrowRenderer.js b/lib/utils/defaultArrowRenderer.js new file mode 100644 index 00000000..99115a3d --- /dev/null +++ b/lib/utils/defaultArrowRenderer.js @@ -0,0 +1,24 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = arrowRenderer; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +function arrowRenderer(_ref) { + var onMouseDown = _ref.onMouseDown; + + return _react2["default"].createElement("span", { + className: "Select-arrow", + onMouseDown: onMouseDown + }); +} + +; +module.exports = exports["default"]; \ No newline at end of file From 3ae25c35a2aace9793f9579b7999d047f0c619c4 Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Mon, 12 Sep 2016 16:58:18 +0800 Subject: [PATCH 12/19] Introducing new AsyncCreatable HOC --- src/AsyncCreatable.js | 29 ++++++++++++++++++ src/Creatable.js | 70 ++++++++++++++++++++++++++++--------------- src/Select.js | 3 +- 3 files changed, 77 insertions(+), 25 deletions(-) create mode 100644 src/AsyncCreatable.js diff --git a/src/AsyncCreatable.js b/src/AsyncCreatable.js new file mode 100644 index 00000000..8b218091 --- /dev/null +++ b/src/AsyncCreatable.js @@ -0,0 +1,29 @@ +import React from 'react'; +import Select from './Select'; + +function AsyncCreatable (props) { + return ( + + {(asyncProps) => ( + + {(creatableProps) => ( + { - creatableProps.onInputChange(input); - return asyncProps.onInputChange(input); - }} - ref={(ref) => { - creatableProps.ref(ref); - asyncProps.ref(ref); - }} - /> - )} - - )} - - ); -}; +const AsyncCreatable = React.createClass({ + displayName: 'AsyncCreatableSelect', + + render () { + return ( + + {(asyncProps) => ( + + {(creatableProps) => ( + @@ -55,6 +64,12 @@ const GithubUsers = React.createClass({ Single Value +
+ +
This example uses fetch.js for showing Async options with Promises
); From feb70e41a63b421854ca244d9b3834283f3b34f5 Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Tue, 13 Sep 2016 16:09:11 +0800 Subject: [PATCH 16/19] Added check against restoring an invalid cached options --- src/Async.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Async.js b/src/Async.js index 6840fc3a..f14b8e42 100644 --- a/src/Async.js +++ b/src/Async.js @@ -127,7 +127,7 @@ const Async = React.createClass({ return this.resetState(); } let cacheResult = getFromCache(this.state.cache, input); - if (cacheResult) { + if (cacheResult && Array.isArray(cacheResult.options)) { return this.setState({ options: cacheResult.options, }); From 3a5c5ed6928ecdab1d035c4f1fa03a30b9775b18 Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Tue, 13 Sep 2016 16:20:01 +0800 Subject: [PATCH 17/19] Tidied up comments --- src/Creatable.js | 3 ++- test/AsyncCreatable-test.js | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Creatable.js b/src/Creatable.js index 2261bb15..dcfc03c0 100644 --- a/src/Creatable.js +++ b/src/Creatable.js @@ -87,8 +87,9 @@ const Creatable = React.createClass({ filterOptions (...params) { const { filterOptions, isValidNewOption, options, promptTextCreator } = this.props; - // Check selected options as well. + // TRICKY Check currently selected options as well. // Don't display a create-prompt for a value that's selected. + // This covers async edge-cases where a newly-created Option isn't yet in the async-loaded array. const excludeOptions = params[2] || []; const filteredOptions = filterOptions(...params); diff --git a/test/AsyncCreatable-test.js b/test/AsyncCreatable-test.js index f2b4686c..e1dd7882 100644 --- a/test/AsyncCreatable-test.js +++ b/test/AsyncCreatable-test.js @@ -2,7 +2,6 @@ /* global describe, it, beforeEach */ /* eslint react/jsx-boolean-value: 0 */ -// Copied from Async-test verbatim; may need to be reevaluated later. var jsdomHelper = require('../testHelpers/jsdomHelper'); jsdomHelper(); var unexpected = require('unexpected'); From f77fb2ebac61025c4bb4716946610dccaae00870 Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Tue, 13 Sep 2016 16:24:13 +0800 Subject: [PATCH 18/19] Added AsyncCreatable to README --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index f864051d..1faad38a 100644 --- a/README.md +++ b/README.md @@ -224,6 +224,24 @@ Property | Type | Description `shouldKeyDownEventCreateNewOption` | function | Decides if a keyDown event (eg its `keyCode`) should result in the creation of a new option. ENTER, TAB and comma keys create new options by dfeault. Expected signature: `({ keyCode: number }): boolean` | `promptTextCreator` | function | Factory for overriding default option creator prompt label. By default it will read 'Create option "{label}"'. Expected signature: `(label: String): String` | +### Combining Async and Creatable + +Use the `AsyncCreatable` HOC if you want both _async_ and _creatable_ functionality. +It ties `Async` and `Creatable` components together and supports a union of their properties (listed above). +Use it as follows: + +```jsx +import React from 'react'; +import { AsyncCreatable } from 'react-select'; + +function render (props) { + // props can be a mix of Async, Creatable, and Select properties + return ( + + ); +} +``` + ### Filtering options You can control how options are filtered with the following properties: From 051bf7d3c90b6a0c4542e3729bc513616293d537 Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Tue, 13 Sep 2016 16:48:47 +0800 Subject: [PATCH 19/19] Added check for invalid filterOptions return value to Creatable --- src/Creatable.js | 2 +- test/Creatable-test.js | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Creatable.js b/src/Creatable.js index dcfc03c0..6732d983 100644 --- a/src/Creatable.js +++ b/src/Creatable.js @@ -92,7 +92,7 @@ const Creatable = React.createClass({ // This covers async edge-cases where a newly-created Option isn't yet in the async-loaded array. const excludeOptions = params[2] || []; - const filteredOptions = filterOptions(...params); + const filteredOptions = filterOptions(...params) || []; if (isValidNewOption({ label: this.inputValue })) { const { newOptionCreator } = this.props; diff --git a/test/Creatable-test.js b/test/Creatable-test.js index 8eb1903a..de6bfa42 100644 --- a/test/Creatable-test.js +++ b/test/Creatable-test.js @@ -102,6 +102,13 @@ describe('Creatable', () => { expect(values, 'to contain', 'three'); }); + it('should guard against invalid values returned by filterOptions', () => { + createControl({ + filterOptions: () => null + }); + typeSearchText('test');; + }); + it('should not show a "create..." prompt if current filter text is not a valid option (as determined by :isValidNewOption prop)', () => { createControl({ isValidNewOption: () => false