From 0f4dcc19579fb4e2207bc6486aba97180ec9a204 Mon Sep 17 00:00:00 2001 From: Sammy Teillet Date: Mon, 24 Apr 2023 18:05:29 +0200 Subject: [PATCH] refactor: extract dropdown for Sort dropdown --- .../table/table-header/DropdownButton.tsx | 43 ++++++++----------- .../table/table-header/SortDropdownButton.tsx | 28 ++++++++++-- .../table/table-header/TableHeader.tsx | 12 +++++- 3 files changed, 52 insertions(+), 31 deletions(-) diff --git a/front/src/components/table/table-header/DropdownButton.tsx b/front/src/components/table/table-header/DropdownButton.tsx index 30d244846..16eac92b4 100644 --- a/front/src/components/table/table-header/DropdownButton.tsx +++ b/front/src/components/table/table-header/DropdownButton.tsx @@ -1,6 +1,5 @@ import styled from '@emotion/styled'; -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { useState, useRef } from 'react'; +import { useRef, ReactNode } from 'react'; import { useOutsideAlerter } from '../../../hooks/useOutsideAlerter'; import { modalBackground } from '../../../layout/styles/themes'; import { SortType } from './SortAndFilterBar'; @@ -10,6 +9,9 @@ type OwnProps = { options: Array; isActive: boolean; onSortSelect?: (id: string) => void; + children?: ReactNode; + isUnfolded?: boolean; + setIsUnfolded?: React.Dispatch>; }; const StyledDropdownButtonContainer = styled.div` @@ -88,15 +90,20 @@ const StyledIcon = styled.div` margin-right: ${(props) => props.theme.spacing(1)}; `; -function DropdownButton({ label, options, onSortSelect, isActive }: OwnProps) { - const [isUnfolded, setIsUnfolded] = useState(false); - +function DropdownButton({ + label, + options, + isActive, + children, + isUnfolded = false, + setIsUnfolded, +}: OwnProps) { const onButtonClick = () => { - setIsUnfolded(!isUnfolded); + setIsUnfolded && setIsUnfolded(!isUnfolded); }; const onOutsideClick = () => { - setIsUnfolded(false); + setIsUnfolded && setIsUnfolded(false); }; const dropdownRef = useRef(null); @@ -112,27 +119,13 @@ function DropdownButton({ label, options, onSortSelect, isActive }: OwnProps) { {label} {isUnfolded && options.length > 0 && ( - - {options.map((option, index) => ( - { - setIsUnfolded(false); - if (onSortSelect) { - onSortSelect(option.id); - } - }} - > - - {option.icon && } - - {option.label} - - ))} - + {children} )} ); } +DropdownButton.StyledDropdownItem = StyledDropdownItem; +DropdownButton.StyledIcon = StyledIcon; + export default DropdownButton; diff --git a/front/src/components/table/table-header/SortDropdownButton.tsx b/front/src/components/table/table-header/SortDropdownButton.tsx index 0f6cbffb2..c0695dd8b 100644 --- a/front/src/components/table/table-header/SortDropdownButton.tsx +++ b/front/src/components/table/table-header/SortDropdownButton.tsx @@ -1,11 +1,12 @@ -import { useCallback } from 'react'; +import { useCallback, useState } from 'react'; import DropdownButton from './DropdownButton'; import { SortType } from './SortAndFilterBar'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; type OwnProps = { sorts: SortType[]; - setSorts: any; - sortsAvailable: any; + setSorts: (sorts: SortType[]) => void; + sortsAvailable: SortType[]; }; export function SortDropdownButton({ @@ -13,6 +14,8 @@ export function SortDropdownButton({ setSorts, sorts, }: OwnProps) { + const [isUnfolded, setIsUnfolded] = useState(false); + const onSortItemSelect = useCallback( (sortId: string) => { const newSorts = [ @@ -33,6 +36,23 @@ export function SortDropdownButton({ options={sortsAvailable} onSortSelect={onSortItemSelect} isActive={sorts.length > 0} - /> + isUnfolded={isUnfolded} + setIsUnfolded={setIsUnfolded} + > + {sortsAvailable.map((option, index) => ( + { + setIsUnfolded(false); + onSortItemSelect(option.id); + }} + > + + {option.icon && } + + {option.label} + + ))} + ); } diff --git a/front/src/components/table/table-header/TableHeader.tsx b/front/src/components/table/table-header/TableHeader.tsx index a3ba9ac36..98aa5d74e 100644 --- a/front/src/components/table/table-header/TableHeader.tsx +++ b/front/src/components/table/table-header/TableHeader.tsx @@ -80,14 +80,22 @@ function TableHeader({ {viewName} - + - + {sorts.length > 0 && (