From 23a79657b9c576966d8dd1fec86cba8655aecd29 Mon Sep 17 00:00:00 2001 From: Loi Phan Date: Mon, 30 Oct 2023 17:54:40 +0700 Subject: [PATCH] Implement sort method --- hotel-management/src/components/OrderBy.tsx | 72 +++++++++++++++++++ hotel-management/src/components/Select.tsx | 32 +++++++++ hotel-management/src/components/SortBy.tsx | 30 ++++++++ .../src/components/Table/index.tsx | 6 +- hotel-management/src/helpers/utils.ts | 23 ++++++ hotel-management/src/hooks/useFetch.ts | 18 +++-- hotel-management/src/pages/User/Table.tsx | 38 +++++++++- hotel-management/src/pages/User/styled.ts | 4 +- .../src/styles/abstracts/variables.css | 1 + 9 files changed, 212 insertions(+), 12 deletions(-) create mode 100644 hotel-management/src/components/OrderBy.tsx create mode 100644 hotel-management/src/components/Select.tsx create mode 100644 hotel-management/src/components/SortBy.tsx diff --git a/hotel-management/src/components/OrderBy.tsx b/hotel-management/src/components/OrderBy.tsx new file mode 100644 index 0000000..9d72a3c --- /dev/null +++ b/hotel-management/src/components/OrderBy.tsx @@ -0,0 +1,72 @@ +import { useSearchParams } from 'react-router-dom'; +import styled, { css } from 'styled-components'; + +const StyledFilter = styled.div` + border: 1px solid var(--border-color); + border-radius: var(--radius-sm); + padding: 5px; + display: flex; + gap: 10px; +`; + +interface IFilterBtn { + active: boolean; +} + +const FilterButton = styled.button` + border: none; + + ${(props) => + props.active && + css` + background-color: var(--primary-color); + color: var(--light-text); + `} + + border-radius: var(--radius-sm); + font-weight: 500; + font-size: var(--fs-sm-x); + padding: 5px 10px; + transition: all 0.3s; + + &:hover:not(:disabled) { + background-color: var(--hover-dark-background-color); + } +`; + +interface IFilterProps { + options: { + value: string; + label: string; + }[]; +} + +function OrderBy({ options }: IFilterProps) { + const field = 'orderBy'; + + const [searchParams, setSearchParams] = useSearchParams(); + const currentFilter = searchParams.get(field) || options[0].value; + + const handleClick = (value: string) => { + searchParams.set(field, value); + + setSearchParams(searchParams); + }; + + return ( + + {options.map((option) => ( + handleClick(option.value)} + active={option.value === currentFilter} + disabled={option.value === currentFilter} + > + {option.label} + + ))} + + ); +} + +export default OrderBy; diff --git a/hotel-management/src/components/Select.tsx b/hotel-management/src/components/Select.tsx new file mode 100644 index 0000000..83c7077 --- /dev/null +++ b/hotel-management/src/components/Select.tsx @@ -0,0 +1,32 @@ +import styled from 'styled-components'; + +interface ISelect { + options: { + value: string; + label: string; + }[]; + value: string; + onChange: React.ChangeEventHandler; +} + +const StyledSelect = styled.select` + font-size: var(--fs-sm-x); + padding: 5px 10px; + border: 1px solid var(--border-color); + border-radius: var(--radius-sm); + font-weight: 500; +`; + +function Select({ options, value, onChange }: ISelect) { + return ( + + {options.map((option) => ( + + ))} + + ); +} + +export default Select; diff --git a/hotel-management/src/components/SortBy.tsx b/hotel-management/src/components/SortBy.tsx new file mode 100644 index 0000000..524366b --- /dev/null +++ b/hotel-management/src/components/SortBy.tsx @@ -0,0 +1,30 @@ +import { useSearchParams } from 'react-router-dom'; +import Select from './Select'; + +interface ISortByProps { + options: { + value: string; + label: string; + }[]; +} + +const SortBy = ({ options }: ISortByProps) => { + const [searchParams, setSearchParams] = useSearchParams(); + const sortBy = searchParams.get('sortBy') || ''; + + const handleChange = (event: React.ChangeEvent) => { + searchParams.set('sortBy', event.target.value); + setSearchParams(searchParams); + }; + + // prettier-ignore + return ( +