Skip to content
Open
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
6ebce44
DDW-603 - Enable pasting of wallet recovery phrase - updates for sing…
DeeJayElly Apr 2, 2021
8611a8d
DDW-603 - Enable pasting of wallet recovery phrase - updates for sing…
DeeJayElly Apr 2, 2021
121b7c5
Merge branch 'develop' into feature/ddw-603-enable-pasting-of-wallet-…
DeeJayElly Apr 6, 2021
65e2b2d
Merge branch 'develop' into feature/ddw-603-enable-pasting-of-wallet-…
DeeJayElly Apr 8, 2021
83a7876
Merge branch 'develop' into feature/ddw-603-enable-pasting-of-wallet-…
DeeJayElly Apr 9, 2021
1259fb4
Merge branch 'develop' into feature/ddw-603-enable-pasting-of-wallet-…
DeeJayElly Apr 12, 2021
fed8427
Merge branch 'develop' into feature/ddw-603-enable-pasting-of-wallet-…
DeeJayElly Apr 14, 2021
3419fdc
Merge branch 'develop' into feature/ddw-603-enable-pasting-of-wallet-…
DeeJayElly Apr 14, 2021
2bfbcc3
Merge branch 'feature/ddw-603-enable-pasting-of-wallet-recovery-phras…
DeeJayElly Apr 14, 2021
f866f8d
DDW-603 - Enable pasting of wallet recovery phrase - updates for mult…
DeeJayElly Apr 14, 2021
ce4a326
DDW-603 - Enable pasting of wallet recovery phrase - updates for mult…
DeeJayElly Apr 14, 2021
5094cb1
Merge branch 'develop' into feature/ddw-603-enable-pasting-of-wallet-…
DeeJayElly Apr 16, 2021
fe0f88e
DDW-603 - Enable pasting of wallet recovery phrase - updates for mult…
DeeJayElly Apr 20, 2021
67c1a38
Merge branch 'develop' into feature/ddw-603-enable-pasting-of-wallet-…
DeeJayElly Apr 20, 2021
d335973
DDW-603 - Enable pasting of wallet recovery phrase - fixing event js …
DeeJayElly Apr 20, 2021
54079a9
Merge remote-tracking branch 'origin/feature/ddw-603-enable-pasting-o…
DeeJayElly Apr 20, 2021
2f93290
DDW-603 - Enable pasting of wallet recovery phrase - fixing focus
DeeJayElly Apr 20, 2021
1fb856a
DDW-603 - Enable pasting of wallet recovery phrase - fixing click rem…
DeeJayElly Apr 21, 2021
5bd423e
DDW-603 - Enable pasting of wallet recovery phrase - fixing click rem…
DeeJayElly Apr 21, 2021
f3478bd
DDW-603 - Enable pasting of wallet recovery phrase - updating version…
DeeJayElly Apr 21, 2021
4d96e1f
DDW-603 - Enable pasting of wallet recovery phrase - fixes for dropdown
DeeJayElly Apr 21, 2021
26e5704
DDW-603 - Enable pasting of wallet recovery phrase - fixes for event …
DeeJayElly Apr 22, 2021
ba15d3c
[603] WIP: remove autocomplete click handler
DominikGuzei Apr 23, 2021
d7ec120
Merge branch 'develop' into feature/ddw-603-enable-pasting-of-wallet-…
DominikGuzei Apr 27, 2021
30535ca
Merge branch 'develop' into feature/ddw-603-enable-pasting-of-wallet-…
DominikGuzei May 7, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "react-polymorph",
"description": "React components with highly customizable logic, markup and styles.",
"version": "0.9.8-rc.18",
"version": "0.9.8-rc.21",
"scripts": {
"build": "cross-env yarn clean && yarn sass && yarn js",
"build:watch": "concurrently 'yarn js:watch' 'yarn sass:watch'",
Expand Down
97 changes: 57 additions & 40 deletions source/components/Autocomplete.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ type State = {
inputValue: string,
mouseIsOverOptions: boolean,
selectedOptions: Array<any>,
isRemoveWordClicked: boolean,
};

class AutocompleteBase extends Component<AutocompleteProps, State> {
Expand Down Expand Up @@ -101,6 +102,7 @@ class AutocompleteBase extends Component<AutocompleteProps, State> {
filteredOptions:
sortAlphabetically && options ? options.sort() : options || [],
isOpen: false,
isRemoveWordClicked: false,
mouseIsOverOptions: false,
composedTheme: composeTheme(
addThemeId(theme || context.theme, themeId),
Expand Down Expand Up @@ -149,20 +151,23 @@ class AutocompleteBase extends Component<AutocompleteProps, State> {
};

onKeyDown = (event: SyntheticKeyboardEvent<>) => {
if (
// Check for backspace in order to delete the last selected option
event.keyCode === 8 &&
!event.target.value &&
this.state.selectedOptions.length
) {
// Remove last selected option
this.removeOption(this.state.selectedOptions.length - 1, event);
} else if (event.keyCode === 27) {
// ESCAPE key: Stops propagation & modal closing
event.stopPropagation();
} else if (event.keyCode === 13) {
// ENTER key: Opens suggestions
this.open();
if (event) {
if (
// Check for backspace in order to delete the last selected option
event.keyCode === 8 &&
!event.target.value &&
this.state.selectedOptions.length
) {
// Remove last selected option
this.close();
this.removeOption(this.state.selectedOptions.length - 1);
} else if (event.keyCode === 27) {
// ESCAPE key: Stops propagation & modal closing
event.stopPropagation();
} else if (event.keyCode === 13) {
// ENTER key: Opens suggestions
this.open();
}
}
};

Expand All @@ -174,24 +179,24 @@ class AutocompleteBase extends Component<AutocompleteProps, State> {
this._setInputValue(value);
if (hasMultipleValues) {
this.open();
setTimeout(() => {
this.updateSelectedOptions(event, multipleValues);
}, 0);
}
setTimeout(() => {
this.updateSelectedOptions(multipleValues, multipleValues.length === 1);
}, 0);
};

// passed to Options onChange handler in AutocompleteSkin
handleChange = (option: any, event: SyntheticEvent<>) => {
this.updateSelectedOptions(event, option);
handleChange = (option: any) => {
this.updateSelectedOptions(option);
};

updateSelectedOptions = (
event: SyntheticEvent<>,
selectedOption: any = null
selectedOption: any = null,
singleInput?: boolean,
) => {
const { maxSelections, multipleSameSelections, options } = this.props;
const { selectedOptions, isOpen } = this.state;
let { filteredOptions } = this.state;
const { filteredOptions } = this.state;
const canMoreOptionsBeSelected =
maxSelections != null ? selectedOptions.length < maxSelections : true;
const areFilteredOptionsAvailable =
Expand All @@ -206,14 +211,14 @@ class AutocompleteBase extends Component<AutocompleteProps, State> {
selectedOption.trim() : selectedOption.filter(item => item);
const newSelectedOptions: Array<string> = [...selectedOptions];
if (option && Array.isArray(option)) {
filteredOptions = options;
option.forEach(item => {
const optionCanBeSelected = multipleSameSelections &&
filteredOptions.includes(item) ||
(filteredOptions.includes(item) &&
const optionCanBeSelected = (multipleSameSelections &&
options.includes(item) && !singleInput && option.length > 1) ||
(options.includes(item) &&
!selectedOptions.includes(item) &&
!newSelectedOptions.includes(item));
if (!optionCanBeSelected && !skipValueSelection) {
!newSelectedOptions.includes(item) && option.length > 1);
if ((!optionCanBeSelected && !skipValueSelection) ||
(singleInput && !selectedOptions.length)) {
this._setInputValue(item, true);
skipValueSelection = true;
return;
Expand All @@ -230,28 +235,31 @@ class AutocompleteBase extends Component<AutocompleteProps, State> {
!selectedOptions.includes(option);
if (option && optionCanBeSelected && isOpen) {
newSelectedOptions.push(option);
skipValueSelection = false;
}
}
this.selectionChanged(newSelectedOptions, event);
this.selectionChanged(newSelectedOptions);
this.setState({ selectedOptions: newSelectedOptions, isOpen: false });
} else {
skipValueSelection = true;
}
if (!skipValueSelection) {
this._setInputValue('');
}
};

removeOption = (index: number, event: SyntheticEvent<>) => {
removeOption = (index: number) => {
const { selectedOptions } = this.state;
_.pullAt(selectedOptions, index);
this.selectionChanged(selectedOptions, event);
this.setState({ selectedOptions });
this.close();
this.selectionChanged(selectedOptions);
this.setState({ selectedOptions, isRemoveWordClicked: true });
};

selectionChanged = (
selectedOptions: Array<any>,
event: SyntheticEvent<any>
selectedOptions: Array<any>
) => {
if (this.props.onChange) this.props.onChange(selectedOptions, event);
if (this.props.onChange) this.props.onChange(selectedOptions);
};

// returns an object containing props, theme, and method handlers
Expand All @@ -267,10 +275,10 @@ class AutocompleteBase extends Component<AutocompleteProps, State> {
isOpen,
selectedOptions,
theme: composedTheme[themeId],
removeSelection: (index: number, event: SyntheticEvent<>) =>
removeSelection: (index: number) =>
// the user's custom removeSelection event handler is composed with
// the internal functionality of Autocomplete (this.removeOption)
composeFunctions(removeSelection, this.removeOption)(index, event),
composeFunctions(removeSelection, this.removeOption)(index),
};
};

Expand Down Expand Up @@ -305,7 +313,16 @@ class AutocompleteBase extends Component<AutocompleteProps, State> {
error={error || this.state.error}
filteredOptions={this.state.filteredOptions}
getSelectionProps={this.getSelectionProps}
handleAutocompleteClick={this.handleAutocompleteClick}
handleAutocompleteClick={() => {
setTimeout(() => {
const { isRemoveWordClicked } = this.state;
if (!isRemoveWordClicked) {
this.handleAutocompleteClick();
} else {
this.setState((prevState) => ({ isRemoveWordClicked: !prevState.isRemoveWordClicked }));
}
}, 0);
}}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@aleksandardjordjeviciohk can we improve the isRemoveWordClicked logic to something cleaner? It looks like a hack to me and in general I would like to keep timeouts to the absolute minimum because they are also hacks in most cases.

handleChange={this.handleChange}
handleInputChange={this.handleInputChange}
inputRef={this.inputElement}
Expand Down Expand Up @@ -374,15 +391,15 @@ class AutocompleteBase extends Component<AutocompleteProps, State> {
selectedOptions = [...selectedOptions, ...this._filterOptions(filteredValue)];
});
this.setState({
isOpen: true,
isOpen: !!multipleValues.length,
inputValue: '',
filteredOptions: Array.from(new Set(selectedOptions)),
});
} else {
const filteredValue = this._filterInvalidChars(value);
const filteredOptions = this._filterOptions(filteredValue);
this.setState({
isOpen: !!value,
isOpen: value === '' ? false : !!value,
inputValue: filteredValue,
filteredOptions,
});
Expand Down