Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Multiselect design update #296

Merged
merged 6 commits into from
Jan 1, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
15 changes: 15 additions & 0 deletions lib/globals/animations.module.scss
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,21 @@
}
}

@mixin zoomIn() {
-o-animation-name: animateZoom;
-moz-animation-name: animateZoom;
-webkit-animation-name: animateZoom;
animation-name: animateZoom;
@keyframes animateZoom {
0% {
transform: scale(0.1);
}
100% {
transform: scale(1);
}
}
}

@mixin sectionEntry($duration) {
visibility: hidden;
opacity: 0;
Expand Down
51 changes: 8 additions & 43 deletions lib/multiselect/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import ReactDOM from 'react-dom';
import PropTypes from 'prop-types';
import cx from 'classnames';
import { themr } from 'react-css-themr';
import { FaChevronDown } from 'react-icons/fa';
import { MdClose } from 'react-icons/md';
import defaultTheme from './theme.module.scss';

const { findDOMNode: findNode } = ReactDOM;
Expand All @@ -17,7 +19,6 @@ class MultiSelect extends Component {
*/
selected: [],
open: false,
input: '',
};

this.listRef = null;
Expand All @@ -31,12 +32,6 @@ class MultiSelect extends Component {
return { threshold, focusedItem };
};

handleInput = ({ target }) => {
this.setState({
input: target.value,
});
};

// Handle the click event when user selects / clicks on an option from the dropdown.
handleSelect = (selectedOption) => {
const { onSelect } = this.props;
Expand Down Expand Up @@ -65,12 +60,7 @@ class MultiSelect extends Component {
handleKeyPress = (e) => {
e.preventDefault();
const { options } = this.props;
const { input, selected, focus } = this.state;
const isValid = options
.filter(opt => opt
.label
.toLowerCase()
.indexOf(input.toLowerCase()) !== -1);
const { focus } = this.state;
switch (e.key) {
case 'ArrowDown':
this.setState(
Expand Down Expand Up @@ -118,22 +108,7 @@ class MultiSelect extends Component {
);
break;
case 'Enter':
if (focus) {
this.handleSelect(options[focus]);
break;
}
if (isValid.length) {
if (
!selected.filter(item => item.label === isValid[0].label).length
) {
this.setState({
selected: [...selected, isValid[0]],
});
}
}
this.setState({
input: '',
});
this.handleSelect(options[focus]);
break;
default:
break;
Expand Down Expand Up @@ -204,18 +179,8 @@ class MultiSelect extends Component {
// Helper function to render options inside the dropdown.
renderOptions = (options) => {
const { theme } = this.props;
const { selected, input, focus } = this.state;
let filteredOptions;
if (input.length) {
filteredOptions = options
.filter(opt => opt
.label
.toLowerCase()
.indexOf(input.toLowerCase()) !== -1);
} else {
filteredOptions = options;
}
return filteredOptions.map((option, index) => {
const { selected, focus } = this.state;
return options.map((option, index) => {
/* eslint-disable jsx-a11y/click-events-have-key-events */
/* eslint-disable jsx-a11y/no-static-element-interactions */
const itemtheme = cx(
Expand Down Expand Up @@ -259,7 +224,7 @@ class MultiSelect extends Component {
>
<div>
<span>{option.label}</span>
<div
<MdClose
className={theme.close}
onClick={e => this.removeOption(e, option)}
/>
Expand Down Expand Up @@ -290,7 +255,7 @@ class MultiSelect extends Component {
<div id="selected-options" className={theme.selectedInput}>
{this.renderSelected()}
</div>
<div className={cx(theme.arrow, open ? theme.up : theme.down)} />
<FaChevronDown className={cx(theme.arrow, open ? theme.up : theme.down)} />
</div>
{open && (
<div
Expand Down
64 changes: 23 additions & 41 deletions lib/multiselect/theme.module.scss
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,14 @@
display: inline-flex;
box-sizing: border-box;
width: 100%;
padding: 2% 5% 0%;
padding: 5%;
cursor: pointer;
outline: none;
min-height: fit-content;
min-height: -moz-fit-content;
&:hover {
background: rgba(71, 233, 243, 0.2);
background: #c4dfe6;
color: #6c757d;
}
&>span {
white-space: nowrap;
Expand All @@ -51,7 +52,8 @@
}

:local(.item-hover) {
background: rgba(71, 233, 243, 0.2);
background: #c4dfe6 !important;
color: #6c757d !important;
}

:local(.show) {
Expand All @@ -77,27 +79,9 @@
}

:local(.close) {
height: 20px;
width: 20px;
display: flex;
align-self: center;
justify-content: center;
align-items: center;
cursor: pointer;
&:before,
&:after {
position: absolute;
content: "";
z-index: 2;
border-left: 2px solid #aaa;
height: 10px;
}
&:before {
transform: rotate(45deg);
}
&:after {
transform: rotate(-45deg);
}
align-self: center;
padding-left: 0.25em;
}

:local(.selectInputWrapper) {
Expand All @@ -111,18 +95,20 @@
}

:local(.selected) {
min-width: fit-content;
padding: 2px;
box-sizing: border-box;
flex-grow: 1;
padding: 0.2em;
max-width: fit-content;
animation-duration: 0.15s;
@include zoomIn();
div {
flex-direction: row !important;
display: flex;
justify-items: space-between;
padding: 0 5% 0 10%;
padding: 0.38em;
background: #eee;
border-radius: 5px;
min-width: fit-content;
padding: 2px;
position: relative;
box-sizing: border-box;
div {
Expand All @@ -138,27 +124,23 @@
}

:local(.selected-option) {
background-color: rgba(71, 233, 243, 0.2);
background-color: #66a5ad;
color: white;
}

:local(.arrow) {
align-self: flex-start;
border: none;
border-right: 2px solid #1a237e;
border-bottom: 2px solid #1a237e;
height: 5px;
width: 5px;
margin-right: -5px;
align-self: center;
transition: 0.3s ease;
margin-top: 5%;
cursor: pointer;
will-change: transform;
}

:local(.down) {
transform: rotate(45deg);
:local(.up) {
transform: rotate(-180deg);
}

:local(.up) {
transform: rotate(-135deg);
:local(.down) {
transform: rotate(0deg);
}

:local(.border-animation) {
Expand All @@ -167,7 +149,7 @@
position: absolute;
bottom: -2px;
left: 0px;
background-color: $primary-input-active-border !important;
background-color: #c4dfe6 !important;
height: 2px;
@include inputFocus();
animation-duration: 0.5s;
Expand Down