worked on preparing search query

This commit is contained in:
Kim, Jimin 2021-07-31 22:36:59 +09:00
parent 632f0c859a
commit 4bccb7f883

View file

@ -1,6 +1,6 @@
import { useState } from "react" import { useState } from "react"
import styled from "styled-components" import styled from "styled-components"
import { Link, BrowserRouter, useLocation } from "react-router-dom" import { BrowserRouter, useLocation, useHistory } from "react-router-dom"
import { Helmet } from "react-helmet-async" import { Helmet } from "react-helmet-async"
import { DateRange } from "react-date-range" import { DateRange } from "react-date-range"
import queryString from "query-string" import queryString from "query-string"
@ -13,19 +13,36 @@ import map from "../data/map.json"
import Tag from "../components/Tag" import Tag from "../components/Tag"
const StyledSearch = styled.div` const StyledSearch = styled.div`
margin: auto;
margin-top: 2rem;
text-align: center; text-align: center;
color: ${(props) => color: ${(props) =>
theming.theme(props.theme.currentTheme, { theming.theme(props.theme.currentTheme, {
light: "#111111", light: theming.dark.color1,
dark: "#EEEEEE", dark: theming.dark.color1,
})}; })};
` `
const StyledSearchContainer = styled.div`
display: flex;
@media screen and (max-width: ${theming.size.screen_size2}) {
display: block;
}
`
const StyledSearchControlContainer = styled.div`
width: 100%;
margin: 0 0 0 1rem;
@media screen and (max-width: ${theming.size.screen_size2}) {
margin-top: 2rem;
}
`
const StyledSearchResult = styled.div``
const StyledTagTable = styled.table` const StyledTagTable = styled.table`
margin-left: auto; margin: 0 auto 0 auto;
margin-right: auto;
` `
export default function Search() { export default function Search() {
@ -36,11 +53,20 @@ export default function Search() {
) )
} }
// have to be in a separate component for tags to update when the urls change
// todo: check if using keys will fix the issue
function _Search() { function _Search() {
const parsedQuery = queryString.parse(useLocation().search) const _history = useHistory()
parsedQuery.tags = parsedQuery.tags const _location = useLocation()
? (parsedQuery.tags as string).split(",")
: [] // todo: handle duplicate/missing keys
const _query = queryString.parse(_location.search)
const query = {
from: _query.from ? _query.from?.toString() : "",
to: _query.to ? _query.to?.toString() : "",
tags: _query.tags ? _query.tags.toString().split(",") : [],
}
const [dateRange, setDateRange] = useState([ const [dateRange, setDateRange] = useState([
{ {
@ -66,20 +92,48 @@ function _Search() {
</Helmet> </Helmet>
<StyledSearch className="card main-content"> <StyledSearch className="card main-content">
<h1>Search</h1>
<StyledSearchContainer>
<DateRange <DateRange
editableDateInputs={true} editableDateInputs={true}
moveRangeOnFirstSelection={false} moveRangeOnFirstSelection={false}
retainEndDateOnFirstSelection={true} retainEndDateOnFirstSelection={true}
ranges={dateRange} ranges={dateRange}
onChange={(item) => { onChange={(item) => {
const historyToPush = {
from: query.from,
to: query.to,
tags: query.tags.join(","),
}
// convert Date to YYYY-MM-DD string if it exists
if (item.selection.startDate != null)
historyToPush.from = item.selection.startDate
.toISOString()
.split("T")[0]
if (item.selection.endDate != null)
historyToPush.to = item.selection.endDate
.toISOString()
.split("T")[0]
_history.push({
pathname: "/search",
search: queryString.stringify(historyToPush),
})
setDateRange([item.selection]) setDateRange([item.selection])
}} }}
/> />
<StyledSearchControlContainer>
<input type="text" />
<br />
<br /> <br />
available tags:
<small> <small>
<StyledTagTable> <StyledTagTable>
{map.meta.tags.map((tag) => { {query.tags?.map((tag) => {
return ( return (
<td key={tag}> <td key={tag}>
<Tag text={tag} /> <Tag text={tag} />
@ -89,30 +143,42 @@ function _Search() {
</StyledTagTable> </StyledTagTable>
</small> </small>
<br /> <br />
date from: {query.from}
<br /> <br />
Selected tags: date to: {query.to}
<small>
<StyledTagTable>
{parsedQuery.tags?.map((tag) => {
return (
<td key={tag}>
<Tag text={tag} />
</td>
)
})}
</StyledTagTable>
</small>
<br /> <br />
date from: {parsedQuery.from} <button
<br /> onClick={() => {
date to: {parsedQuery.to} _history.push({
<br /> pathname: "/search",
<Link to="/search?&from=YYYYMMDD&to=YYYYMMDD&tags=include,!exclude"> search: queryString.stringify({
Search1 from: query.from,
</Link> to: query.to,
<Link to="/search?&from=YYYYMMDD&to=YYYYMMDD&tags=include2,!exclude2"> tags: "include,!exclude",
Search2 }),
</Link> })
}}
>
Search test 1
</button>
|
<button
onClick={() => {
_history.push({
pathname: "/search",
search: queryString.stringify({
from: query.from,
to: query.to,
tags: "include2,!exclude2",
}),
})
}}
>
Search test 2
</button>
</StyledSearchControlContainer>
</StyledSearchContainer>
<StyledSearchResult>{map.meta.tags}</StyledSearchResult>
</StyledSearch> </StyledSearch>
</> </>
) )