adds search bar functionality

The process of finding image for a specific device by select inputs
was a tidious one.
Search bar functionality was introduced to make the process easier
and convenient.
The search uses fuzzyset.js to find possible suggestions for the user
in realtime.

Signed-off-by: Sudhanshu Gautam <me@sudhanshug.com>
This commit is contained in:
Sudhanshu Gautam 2019-07-03 02:51:14 +05:30
parent 07b13c3f7a
commit 3f7007f259
6 changed files with 180 additions and 337 deletions

View file

@ -6,6 +6,7 @@
"dependencies": {
"@material-ui/core": "^4.1.2",
"@material-ui/icons": "^4.2.1",
"fuzzyset.js": "^0.0.8",
"gh-pages": "^2.0.1",
"i18next": "^17.0.4",
"i18next-browser-languagedetector": "^3.0.1",
@ -14,8 +15,7 @@
"react-dom": "^16.8.6",
"react-i18next": "^10.11.2",
"react-router-dom": "^5.0.1",
"react-scripts": "3.0.1",
"react-select": "^3.0.4"
"react-scripts": "3.0.1"
},
"scripts": {
"start": "react-scripts start",

View file

@ -1,158 +1,135 @@
import React from "react";
import { Container, Paper, Typography, Grid, Button } from "@material-ui/core";
import { Container, Paper, Typography, InputAdornment, FormControl, TextField, List, ListItem, ListItemText } from "@material-ui/core";
import { fade, makeStyles } from '@material-ui/core/styles';
import SearchIcon from '@material-ui/icons/Search';
import './home.scss';
import Select from 'react-select';
import data from '../../data.json';
import { withTranslation } from 'react-i18next';
import FuzzySet from 'fuzzyset.js';
const useStylesSearch = makeStyles(theme => ({
root: {
borderColor: '#e2e2e1',
overflow: 'hidden',
margin: 0,
borderRadius: 4,
transition: theme.transitions.create(['border-color', 'box-shadow']),
'&:hover': {
borderColor: fade(theme.palette.primary.main, 0.25),
},
'&$focused': {
backgroundColor: '#fff',
boxShadow: `${fade(theme.palette.primary.main, 0.25)} 0 0 0 2px`,
borderColor: theme.palette.primary.main,
},
},
focused: {},
}));
function SearchTextField(props) {
const classes = useStylesSearch();
return (
<TextField
variant="outlined"
label={
<div className="search-label">
{props.labelText}
</div>
}
InputProps={
{ classes,
endAdornment: (
<InputAdornment position="start">
<SearchIcon className={classes.label} />
</InputAdornment>
)
}
} {...props} />
);
}
class Home extends React.Component {
devices = [];
deviceNames = [];
deviceNamesID = {};
state = {
selectedOption: null,
variants: [],
models: [],
showDeviceData: false,
device: null,
vendor: null,
model: null,
variant: null
searchResults: [],
showSearch: false,
selectedSearchIndex: 0,
query: '',
};
vendorExistsInDevices(vendor) {
var exists = false;
var existIndex = -1;
this.devices.forEach((d, i) => {
if (d["label"] === vendor) {
exists = true;
existIndex = i;
}
});
return {
exists,
existIndex
};
}
modelExistsInDevices(vendorIndex, model) {
var exists = false;
var existIndex = -1;
this.devices[vendorIndex]["value"].forEach((d, i) => {
if (d["label"] === model) {
exists = true;
existIndex = i;
}
});
return {
exists,
existIndex
};
}
variantExistsInDevices(vendorIndex, modelIndex, variant) {
var exists = false;
var existIndex = -1;
this.devices[vendorIndex]["value"][modelIndex]["value"].forEach((d, i) => {
if (d["label"] === variant) {
exists = true;
existIndex = i;
}
});
return {
exists,
existIndex
};
}
fuzzySet;
componentDidMount() {
Object.keys(data["devices"]).forEach((device_id) => {
var vendor = "";
var variant = "";
var device_data = data["devices"][device_id];
if ("vendor" in device_data) {
vendor = device_data["vendor"];
Object.keys(data['devices']).forEach((device_id) => {
var deviceName = '';
if ('vendor' in data['devices'][device_id]) {
deviceName += data['devices'][device_id]['vendor'] + ' ';
}
var model = device_data["model"];
if ("variant" in device_data) {
variant = device_data["variant"];
}
var vendorExists = this.vendorExistsInDevices(vendor);
if (vendorExists.exists) {
var modelExists = this.modelExistsInDevices(vendorExists.existIndex, model);
if (modelExists.exists) {
var variantExists = this.variantExistsInDevices(vendorExists.existIndex, modelExists.existIndex, variant);
if (!variantExists.existIndex) {
this.devices[vendorExists.existIndex]["value"][modelExists.existIndex]["value"].push({
"label": variant,
"value": device_data
});
}
} else {
this.devices[vendorExists.existIndex]["value"].push({
"label": model,
"value": [{
"label": variant,
"value": device_data
}]
});
deviceName += data['devices'][device_id]['model'];
if ('variant' in data['devices'][device_id]) {
if (data['devices'][device_id]['variant'] !== '') {
deviceName += ' ' + data['devices'][device_id]['variant'];
}
} else {
this.devices.push({
"label": vendor,
"value": [{
"label": model,
"value": [{
"label": variant,
"value": device_data
}]
}]
});
}
this.deviceNames.push(deviceName);
this.deviceNamesID[deviceName] = device_id;
});
this.fuzzySet = FuzzySet(this.deviceNames);
}
changeVendor = (v) => {
this.setState({
vendor: v,
model: null,
variant: null,
});
}
changeModel = (v) => {
this.setState({
model: v,
variant: v.value[0],
});
}
changeVariant = (v) => {
this.setState({
variant: v,
});
}
findDevice = () => {
try {
var device = this.state.variant.value;
selectDevice = (device_id) => {
if (device_id != null) {
this.setState({
device: device,
device: data["devices"][device_id],
showDeviceData: true,
});
} catch (error) {
this.setState({
device: {},
showDeviceData: false,
query: data["devices"][device_id]["vendor"] + " " + data["devices"][device_id]["model"] + " " + data["devices"][device_id]["variant"]
});
}
}
noOptionsMessage = (props) => <Typography {...props.innerProps}>{this.props.t('components.select.noOptions')}</Typography>;
search = (event) => {
const query = event.target.value;
var showSearch = false;
this.setState({
query,
searchResults: [],
showSearch,
});
const deviceNames = this.fuzzySet.get(query, undefined, 0);
var searchResults = [];
if (deviceNames != null) {
for (var i = 0; i < deviceNames.length && i < 6; i++) {
searchResults.push(data['devices'][this.deviceNamesID[deviceNames[i][1]]]);
}
}
showSearch = true;
if (query === '') {
showSearch = false;
}
this.setState({
searchResults,
showSearch,
});
}
hideSearch = () => {
setTimeout(() => {
this.setState({
showSearch: false,
});
}, 300);
}
render() {
return (
<Container className="home-container">
<Paper>
<Paper className="home-container-paper">
<Typography variant="h5">
{this.props.t('appIntro.head')}
</Typography>
@ -160,53 +137,50 @@ class Home extends React.Component {
{this.props.t('appIntro.para')}
</Typography>
<br />
<Grid container spacing={2}>
<Grid item xs={4}>
<Select
onChange={this.changeVendor}
options={this.devices}
value={this.state.vendor}
placeholder={this.props.t('components.select.placeholder')}
noOptionsMessage={this.noOptionsMessage}
/>
</Grid>
{
this.state.vendor === null ? '' : (
<Grid item xs={4}>
<Select
onChange={this.changeModel}
options={this.state.vendor.value}
value={this.state.model}
placeholder={this.props.t('components.select.placeholder')}
noOptionsMessage={this.noOptionsMessage}
/>
</Grid>
)
}
{
this.state.model === null ? '' : (
(this.state.model.value.length === 1 && this.state.model.value[0].label === '') ? '' : (
<Grid item xs={4}>
<Select
onChange={this.changeVariant}
options={this.state.model.value}
value={this.state.variant}
placeholder={this.props.t('components.select.placeholder')}
noOptionsMessage={this.noOptionsMessage}
/>
</Grid>
)
)
}
</Grid>
<br />
<Button
color="primary"
variant="contained"
onClick={this.findDevice.bind(this)}
>
{this.props.t('components.submit')}
</Button>
<FormControl fullWidth>
<SearchTextField
id="outlined-adornment-search-devices"
labelText={this.props.t('components.search.label')}
value={this.state.query}
onChange={this.search}
onClick={this.search}
onBlur={this.hideSearch}
/>
</FormControl>
{
this.state.showSearch && (
<Paper elevation={4} className="search-results">
<List>
{
this.state.searchResults.map((res, index) => {
return (
<ListItem
key={res["device_id"]}
button
onClick={() => this.selectDevice(res["device_id"])}
>
<ListItemText primary={
<div>
{res["vendor"]} {res["model"]} {res["variant"]}
</div>
} />
</ListItem>
);
})
}
</List>
</Paper>
)
}
{
(this.state.searchResults.length === 0 && this.state.showSearch) && (
<Paper elevation={4} className="search-results">
<ListItem>
<ListItemText primary={this.props.t('components.search.noResults')}></ListItemText>
</ListItem>
</Paper>
)
}
<br />
{this.state.showDeviceData ? (
<table className="device-table">

View file

@ -1,8 +1,18 @@
.home-container {
margin-top: 30px;
.MuiPaper-root {
.home-container-paper {
padding: 30px;
text-align: left;
.search-label {
background-color: #fff;
padding: 0 10px;
position: absolute;
white-space: nowrap;
}
.search-results {
position: absolute;
z-index: 10;
}
.MuiTypography-h4 {
font-weight: bold;
margin-bottom: 15px;

View file

@ -10,6 +10,10 @@
"select": {
"placeholder": "Wählen...",
"noOptions": "Keine Optionen"
},
"search": {
"label": "Suchen Sie Ihr Gerät",
"noResults": "Keine Ergebnisse"
}
},
"table": {

View file

@ -10,6 +10,10 @@
"select": {
"placeholder": "Select...",
"noOptions": "No options"
},
"search": {
"label": "Search your device",
"noResults": "No results"
}
},
"table": {

173
yarn.lock
View file

@ -852,7 +852,7 @@
dependencies:
regenerator-runtime "^0.13.2"
"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5":
"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5":
version "7.4.5"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.5.tgz#582bb531f5f9dc67d2fcb682979894f75e253f12"
integrity sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==
@ -910,82 +910,11 @@
resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-9.0.1.tgz#c27b391d8457d1e893f1eddeaf5e5412d12ffbb5"
integrity sha512-6It2EVfGskxZCQhuykrfnALg7oVeiI6KclWSmGDqB0AiInVrTGB9Jp9i4/Ad21u9Jde/voVQz6eFX/eSg/UsPA==
"@emotion/cache@^10.0.9":
version "10.0.9"
resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.9.tgz#e0c7b7a289f7530edcfad4dcf3858bd2e5700a6f"
integrity sha512-f7MblpE2xoimC4fCMZ9pivmsIn7hyWRIvY75owMDi8pdOSeh+w5tH3r4hBJv/LLrwiMM7cTQURqTPcYoL5pWnw==
dependencies:
"@emotion/sheet" "0.9.2"
"@emotion/stylis" "0.8.3"
"@emotion/utils" "0.11.1"
"@emotion/weak-memoize" "0.2.2"
"@emotion/core@^10.0.9":
version "10.0.10"
resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.0.10.tgz#8d3114e5a2f8b178a7067c603a2937516f180b08"
integrity sha512-U1aE2cOWUscjc8ZJ3Cx32udOzLeRoJwGxBH93xQD850oQFpwPKZARzdUtdc9SByUOwzSFYxhDhrpXnV34FJmWg==
dependencies:
"@emotion/cache" "^10.0.9"
"@emotion/css" "^10.0.9"
"@emotion/serialize" "^0.11.6"
"@emotion/sheet" "0.9.2"
"@emotion/utils" "0.11.1"
"@emotion/css@^10.0.9":
version "10.0.12"
resolved "https://registry.yarnpkg.com/@emotion/css/-/css-10.0.12.tgz#b358168afcb151899bda5cfd778c01dc37801c24"
integrity sha512-esET/v6AwYIw5YVo0e1L/bUik7bIMWyK32BudsC/PE5O1rLK3rjiLCOoMVv5GY6+ssuwWVzooGbz79hPvkkmsw==
dependencies:
"@emotion/serialize" "^0.11.7"
"@emotion/utils" "0.11.1"
babel-plugin-emotion "^10.0.9"
"@emotion/hash@0.7.1", "@emotion/hash@^0.7.1":
"@emotion/hash@^0.7.1":
version "0.7.1"
resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.7.1.tgz#9833722341379fb7d67f06a4b00ab3c37913da53"
integrity sha512-OYpa/Sg+2GDX+jibUfpZVn1YqSVRpYmTLF2eyAfrFTIJSbwyIrc+YscayoykvaOME/wV4BV0Sa0yqdMrgse6mA==
"@emotion/memoize@0.7.1":
version "0.7.1"
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.1.tgz#e93c13942592cf5ef01aa8297444dc192beee52f"
integrity sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg==
"@emotion/serialize@^0.11.6", "@emotion/serialize@^0.11.7":
version "0.11.7"
resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.7.tgz#dd9583dbf753002738676fa8c1eb8df77f95fb53"
integrity sha512-GfzJIMue9eIEPFgBL340hBbjfki11vjYkfmY2LXoCDAFPuG6S+hkOlfinRXLnPVlXnKu7WWp587cVa6/xQriNQ==
dependencies:
"@emotion/hash" "0.7.1"
"@emotion/memoize" "0.7.1"
"@emotion/unitless" "0.7.3"
"@emotion/utils" "0.11.1"
csstype "^2.5.7"
"@emotion/sheet@0.9.2":
version "0.9.2"
resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.2.tgz#74e5c6b5e489a1ba30ab246ab5eedd96916487c4"
integrity sha512-pVBLzIbC/QCHDKJF2E82V2H/W/B004mDFQZiyo/MSR+VC4pV5JLG0TF/zgQDFvP3fZL/5RTPGEmXlYJBMUuJ+A==
"@emotion/stylis@0.8.3":
version "0.8.3"
resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.3.tgz#3ca7e9bcb31b3cb4afbaeb66156d86ee85e23246"
integrity sha512-M3nMfJ6ndJMYloSIbYEBq6G3eqoYD41BpDOxreE8j0cb4fzz/5qvmqU9Mb2hzsXcCnIlGlWhS03PCzVGvTAe0Q==
"@emotion/unitless@0.7.3":
version "0.7.3"
resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.3.tgz#6310a047f12d21a1036fb031317219892440416f"
integrity sha512-4zAPlpDEh2VwXswwr/t8xGNDGg8RQiPxtxZ3qQEXyQsBV39ptTdESCjuBvGze1nLMVrxmTIKmnO/nAV8Tqjjzg==
"@emotion/utils@0.11.1":
version "0.11.1"
resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.1.tgz#8529b7412a6eb4b48bdf6e720cc1b8e6e1e17628"
integrity sha512-8M3VN0hetwhsJ8dH8VkVy7xo5/1VoBsDOk/T4SJOeXwTO1c4uIqVNx2qyecLFnnUWD5vvUqHQ1gASSeUN6zcTg==
"@emotion/weak-memoize@0.2.2":
version "0.2.2"
resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.2.tgz#63985d3d8b02530e0869962f4da09142ee8e200e"
integrity sha512-n/VQ4mbfr81aqkx/XmVicOLjviMuy02eenSdJY33SVA7S2J42EU0P1H0mOogfYedb3wXA0d/LVtBrgTSm04WEA==
"@hapi/address@2.x.x":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.0.0.tgz#9f05469c88cb2fd3dcd624776b54ee95c312126a"
@ -2094,22 +2023,6 @@ babel-plugin-dynamic-import-node@2.2.0:
dependencies:
object.assign "^4.1.0"
babel-plugin-emotion@^10.0.9:
version "10.0.13"
resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.13.tgz#c4faa1ba8c0fd74a13226ced32876b314ef1d8ab"
integrity sha512-w8yukWIYDw2ZUzBo7B9t5jh7wsM4NQWqvuZadW4MhVokgw5wsoBRJ59Sa1hMc3UZiatwb0iBNufmRQZVl77I5Q==
dependencies:
"@babel/helper-module-imports" "^7.0.0"
"@emotion/hash" "0.7.1"
"@emotion/memoize" "0.7.1"
"@emotion/serialize" "^0.11.6"
babel-plugin-macros "^2.0.0"
babel-plugin-syntax-jsx "^6.18.0"
convert-source-map "^1.5.0"
escape-string-regexp "^1.0.5"
find-root "^1.1.0"
source-map "^0.5.7"
babel-plugin-istanbul@^5.1.0:
version "5.1.4"
resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.4.tgz#841d16b9a58eeb407a0ddce622ba02fe87a752ba"
@ -2135,25 +2048,11 @@ babel-plugin-macros@2.5.1:
cosmiconfig "^5.2.0"
resolve "^1.10.0"
babel-plugin-macros@^2.0.0:
version "2.6.1"
resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz#41f7ead616fc36f6a93180e89697f69f51671181"
integrity sha512-6W2nwiXme6j1n2erPOnmRiWfObUhWH7Qw1LMi9XZy8cj+KtESu3T6asZvtk5bMQQjX8te35o7CFueiSdL/2NmQ==
dependencies:
"@babel/runtime" "^7.4.2"
cosmiconfig "^5.2.0"
resolve "^1.10.0"
babel-plugin-named-asset-import@^0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.2.tgz#20978ed446b8e1bf4a2f42d0a94c0ece85f75f4f"
integrity sha512-CxwvxrZ9OirpXQ201Ec57OmGhmI8/ui/GwTDy0hSp6CmRvgRC0pSair6Z04Ck+JStA0sMPZzSJ3uE4n17EXpPQ==
babel-plugin-syntax-jsx@^6.18.0:
version "6.18.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=
babel-plugin-syntax-object-rest-spread@^6.8.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
@ -2697,11 +2596,6 @@ class-utils@^0.3.5:
isobject "^3.0.0"
static-extend "^0.1.1"
classnames@^2.2.5:
version "2.2.6"
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce"
integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==
clean-css@4.2.x:
version "4.2.1"
resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17"
@ -2959,7 +2853,7 @@ convert-css-length@^2.0.0:
console-polyfill "^0.1.2"
parse-unit "^1.0.1"
convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0:
convert-source-map@^1.1.0, convert-source-map@^1.4.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20"
integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==
@ -3317,7 +3211,7 @@ cssstyle@^1.0.0, cssstyle@^1.1.1:
dependencies:
cssom "0.3.x"
csstype@^2.2.0, csstype@^2.5.2, csstype@^2.5.7:
csstype@^2.2.0, csstype@^2.5.2:
version "2.6.5"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.5.tgz#1cd1dff742ebf4d7c991470ae71e12bb6751e034"
integrity sha512-JsTaiksRsel5n7XwqPAfB0l3TFKdpjW/kgAELf9vrb5adGA7UCPLajKK5s3nFrcFm3Rkyp/Qkgl73ENc1UY3cA==
@ -4320,11 +4214,6 @@ find-cache-dir@^2.0.0:
make-dir "^2.0.0"
pkg-dir "^3.0.0"
find-root@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
find-up@3.0.0, find-up@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
@ -4531,6 +4420,11 @@ functional-red-black-tree@^1.0.1:
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
fuzzyset.js@^0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/fuzzyset.js/-/fuzzyset.js-0.0.8.tgz#398311fb54a5f84221db2cb143ac8cf1e523ae50"
integrity sha512-wymI6DYJgCBDFUrIyA/M2gIjJPEWj40pnCf04+Dma0PaprQRrTRh9/Cmz1wl9jCJxA+iqrCqNrGYuq7lVOtzXQ==
gauge@~2.7.3:
version "2.7.4"
resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
@ -6617,11 +6511,6 @@ mem@^4.0.0:
mimic-fn "^2.0.0"
p-is-promise "^2.0.0"
memoize-one@^5.0.0:
version "5.0.4"
resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.0.4.tgz#005928aced5c43d890a4dfab18ca908b0ec92cbc"
integrity sha512-P0z5IeAH6qHHGkJIXWw0xC2HNEgkx/9uWWBQw64FJj3/ol14VYdfVGWWr0fXfjhhv3TKVIqUq65os6O4GUNksA==
memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
@ -8436,7 +8325,7 @@ prompts@^2.0.1:
kleur "^3.0.2"
sisteransi "^1.0.0"
prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2:
prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2:
version "15.7.2"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
@ -8565,7 +8454,7 @@ querystringify@^2.1.1:
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e"
integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==
raf@3.4.1, raf@^3.4.0:
raf@3.4.1:
version "3.4.1"
resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39"
integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==
@ -8687,23 +8576,11 @@ react-i18next@^10.11.2:
"@babel/runtime" "^7.3.1"
html-parse-stringify2 "2.0.1"
react-input-autosize@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.1.tgz#ec428fa15b1592994fb5f9aa15bb1eb6baf420f8"
integrity sha512-3+K4CD13iE4lQQ2WlF8PuV5htfmTRLH6MDnfndHM6LuBRszuXnuyIfE7nhSKt8AzRBZ50bu0sAhkNMeS5pxQQA==
dependencies:
prop-types "^15.5.8"
react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1, react-is@^16.8.4:
version "16.8.6"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16"
integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==
react-lifecycles-compat@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
react-router-dom@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.0.1.tgz#ee66f4a5d18b6089c361958e443489d6bab714be"
@ -8793,32 +8670,6 @@ react-scripts@3.0.1:
optionalDependencies:
fsevents "2.0.6"
react-select@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/react-select/-/react-select-3.0.4.tgz#16bde37c24fd4f6444914d4681e78f15ffbc86d3"
integrity sha512-fbVISKa/lSUlLsltuatfUiKcWCNvdLXxFFyrzVQCBUsjxJZH/m7UMPdw/ywmRixAmwXAP++MdbNNZypOsiDEfA==
dependencies:
"@babel/runtime" "^7.4.4"
"@emotion/cache" "^10.0.9"
"@emotion/core" "^10.0.9"
"@emotion/css" "^10.0.9"
classnames "^2.2.5"
memoize-one "^5.0.0"
prop-types "^15.6.0"
raf "^3.4.0"
react-input-autosize "^2.2.1"
react-transition-group "^2.2.1"
react-transition-group@^2.2.1:
version "2.9.0"
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d"
integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==
dependencies:
dom-helpers "^3.4.0"
loose-envify "^1.4.0"
prop-types "^15.6.2"
react-lifecycles-compat "^3.0.4"
react@^16.8.6:
version "16.8.6"
resolved "https://registry.yarnpkg.com/react/-/react-16.8.6.tgz#ad6c3a9614fd3a4e9ef51117f54d888da01f2bbe"
@ -9621,7 +9472,7 @@ source-map@^0.4.2:
dependencies:
amdefine ">=0.0.4"
source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7:
source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=