SearchBar.js 7.16 KiB
/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre
Departamento de Informatica - Universidade Federal do Parana
This file is part of Plataforma Integrada MEC.
Plataforma Integrada MEC is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Plataforma Integrada MEC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/
import React, { useState, useEffect, useContext } from 'react'
import { Redirect } from 'react-router-dom'
import IconSearch from '@material-ui/icons/Search'
import { RadioGroup, Radio, FormControl, Select, MenuItem, Button, FormControlLabel, TextField, Link } from '@material-ui/core'
import styled from 'styled-components'
import { Store } from '../Store';
import { v4 as uuidv4 } from 'uuid'
import Grid from "@material-ui/core/Grid"
const dividerStyled = {
background: '#e0e0e0',
width: '1px',
content: "",
display: 'block',
top: '0',
bottom: '0',
right: '0',
minHeight: '70px',
margin: '0 20px'
}
const DividerVertical = () => <em style={dividerStyled}></em>
const ButtonStyled = styled(Button)`
text-transform: capitalize !important;
`
const IconSearchStyled = styled(IconSearch)`
color: #16b8dd;
`
const TextFieldStyled = styled(TextField)`
flex-grow: 2;
margin: 0 2vw !important;
`
/*
const RadioGroupStyled = styled(RadioGroup)`
display: flex;
flex-direction: row;
flex-grow: 1;
`
*/
const FormControlLabelStyled = styled(FormControlLabel)`
*{
text-transform: uppercase;
color: #ff8a17 !important;
fontWeight: bolder;
}
`
const RadioStyled = styled(Radio)`
color: #ff8a17;
`
const SelectStyled = styled(Select)`
margin-right: 2vw;
*{
text-transform: uppercase;
color: #ff8a17 !important;
fontWeight: bolder;
}
`
const MenuItemStyled = styled(MenuItem)`
text-transform: uppercase;
fontWeight: bolder;
`
/*const Bar = styled.div`
display: flex;
align-items: center;
justify-content: space-between;
border-top: 1px rgba(0,0,0,.1) solid;
`
const Flex = styled.span`
display: flex;
align-items: center;
color: #787380;
`*/
export default function SearchBar(props) {
const [query, setQuery] = useState('')
const [searchClass, setSearchClass] = useState('LearningObject')
const { state, dispatch } = useContext(Store)
const [goSearch, setGoSearch] = useState(false)
useEffect(() => {
if (window.location.pathname.includes('busca')) {
const urlParams = new URLSearchParams(window.location.search)
const urlQuery = urlParams.get('query')
const urlSearchClass = urlParams.get('search_class')
if (searchClass !== urlSearchClass || query !== urlQuery) {
setQuery(urlQuery)
setSearchClass(urlSearchClass)
}
}
}, [])
useEffect(() => setGoSearch(false), [goSearch])
const handleChange = (event) => {
setQuery(event.target.value)
}
const handleKeyDown = (event) => {
if (event.key === 'Enter' || event.type === 'click') {
dispatch({
type: 'SAVE_SEARCH',
newSearch: {
query: query !== '' ? query : '*',
class: searchClass
}
})
setGoSearch(true)
}
}
const linkTarget = {
pathname: `/busca?page=0&results_per_page=12&order=review_average&query=${state.search.query}&search_class=${state.search.class}`,
key: uuidv4(), // we could use Math.random, but that's not guaranteed unique.
state: {
applied: true
}
};
return (
<Grid container>
<Grid container item xs={12} sm={6} md={6} lg={6} xl={6}>
{goSearch && <Redirect to={`/busca?page=0&results_per_page=12&order=review_average&query=${state.search.query}&search_class=${state.search.class}`} />}
<TextFieldStyled
id="standard-search"
label="O que você está buscando"
type="search"
margin="normal"
value={query}
onChange={handleChange}
onKeyPress={handleKeyDown}
/>
</Grid>
<Grid container item justify="center" alignItems="center" xs={12} sm={6} md={6} lg={6} xl={6}>
{state.windowSize.width >= 960 ?
<React.Fragment>
<Grid container item justify="center" alignItems="center" xs={12} sm={1} md={1} lg={1} xl={1}>
<Link
to={linkTarget}
>
<ButtonStyled onClick={handleKeyDown} ><IconSearchStyled /></ButtonStyled>
</Link>
</Grid>
<Grid container item justify="center" alignItems="center" xs={12} sm={3} md={3} lg={3} xl={3}>
<span>Pressione "Enter" ou click na lupa</span>
</Grid>
<Grid container item justify="center" alignItems="center" xs={12} sm={1} md={1} lg={1} xl={1}>
<DividerVertical />
</Grid>
<Grid container item justify="center" alignItems="center" xs={12} sm={7} md={7} lg={7} xl={7}>
<RadioGroup row={true}
aria-label="Tipo"
name="types" value={searchClass}
onChange={
(event) => setSearchClass(event.target.value)
}
justify="center" alignItems="center"
>
<FormControlLabelStyled value="LearningObject" control={<RadioStyled />} label="Recursos" />
<FormControlLabelStyled value="Collection" control={<RadioStyled />} label="Coleções" />
<FormControlLabelStyled value="User" control={<RadioStyled />} label="Usuários" />
</RadioGroup>
</Grid>
</React.Fragment>
:
<React.Fragment>
<Grid container item justify="center" alignItems="center" xs={5} sm={5} md={5} lg={5} xl={5}>
<FormControl>
<SelectStyled
value={searchClass}
onChange={(event) => setSearchClass(event.target.value)}
>
<MenuItemStyled style={{color : "#ff7f00"}} value="LearningObject" aria-label="Recursos">Recursos</MenuItemStyled>
<MenuItemStyled style={{color : "#673ab7"}} value="Collection" aria-label="Coleções">Coleções</MenuItemStyled>
<MenuItemStyled style={{color : "#00bcd4"}} value="User" aria-label="Usuários">Usuários</MenuItemStyled>
</SelectStyled>
</FormControl>
</Grid>
<Grid container item justify="center" alignItems="center" xs={2} sm={2} md={2} lg={2} xl={2}>
<DividerVertical />
</Grid>
<Grid container item justify="center" alignItems="center" xs={5} sm={5} md={5} lg={5} xl={5}>
<Link
to={linkTarget}
>
<ButtonStyled onClick={handleKeyDown} ><IconSearchStyled /></ButtonStyled>
</Link>
</Grid>
</React.Fragment>
}
</Grid>
</Grid>
)
}