diff --git a/frontend/src/components/controls/Icon.tsx b/frontend/src/components/controls/Icon.tsx index 79b6448f..6aa5f18d 100644 --- a/frontend/src/components/controls/Icon.tsx +++ b/frontend/src/components/controls/Icon.tsx @@ -124,4 +124,4 @@ export const EmailedIcon = ({...props}) => ( ); -export const SortIcon = ({...props}) => ; +export const SortIcon = ({...props}: IconProps) => ; diff --git a/frontend/src/components/controls/table/List.tsx b/frontend/src/components/controls/table/List.tsx index 14a7053f..0e996969 100644 --- a/frontend/src/components/controls/table/List.tsx +++ b/frontend/src/components/controls/table/List.tsx @@ -31,9 +31,14 @@ export const List = ({feature}: ListProps) => { data = data.slice().sort(feature.list.sorter); } + const handleSort = (sort: any) => { + data = data.slice().sort(sort); + console.log("sorted", data.map((val) => val.consultantName)); + } + return ( - + {data.slice(page * listSize, page * listSize + listSize).map(model => ( diff --git a/frontend/src/components/controls/table/ListHeader.tsx b/frontend/src/components/controls/table/ListHeader.tsx index b337b49a..76c8a260 100644 --- a/frontend/src/components/controls/table/ListHeader.tsx +++ b/frontend/src/components/controls/table/ListHeader.tsx @@ -1,15 +1,15 @@ -import {t} from '../../utils'; import {IFeature} from '../feature/feature-models'; -import { SortIcon } from '../Icon'; +import { ListHeaderCell } from './ListHeaderCell'; type ListHeaderProps = { feature: IFeature; + onSort?: (sort?: (a: TModel, b: TModel) => number) => void } // eslint-disable-next-line arrow-body-style -export const ListHeader = ({feature}: ListHeaderProps) => { +export const ListHeader = ({feature, onSort}: ListHeaderProps) => { return ( @@ -31,10 +31,7 @@ export const ListHeader = ({feature}: ListHeaderProps) => { } return ( - + { if(onSort && col.sort) onSort(col.sort(asc)) }}/> ); })} diff --git a/frontend/src/components/controls/table/ListHeaderCell.tsx b/frontend/src/components/controls/table/ListHeaderCell.tsx index cdacee78..d2fe5d53 100644 --- a/frontend/src/components/controls/table/ListHeaderCell.tsx +++ b/frontend/src/components/controls/table/ListHeaderCell.tsx @@ -1,10 +1,24 @@ -export const ListHeaderCell = () => { +import { useState } from "react"; +import useHover from "../../hooks/useHover"; +import { t } from "../../utils"; +import { SortIcon } from "../Icon"; + +type ListHeaderCellProps = { + width: string | undefined | number + header:string + addSort: boolean, + onSort?: (asc: boolean) => void +} + +export const ListHeaderCell = ({width, header, addSort, onSort}: ListHeaderCellProps) => { const [hovered, eventHandlers] = useHover(); + const [asc, setAsc] = useState(undefined) return ( - ) } diff --git a/frontend/src/components/controls/table/table-models.ts b/frontend/src/components/controls/table/table-models.ts index 01eece65..fa5553f7 100644 --- a/frontend/src/components/controls/table/table-models.ts +++ b/frontend/src/components/controls/table/table-models.ts @@ -87,7 +87,7 @@ export interface IListCell { /** Will span until next cell with a footer */ footer?: string | ((models: TModel[]) => string | React.ReactNode); - sort?: StringFn + sort?: (asc: boolean) => (a: TModel, b: TModel) => number } diff --git a/frontend/src/components/hooks/useHover.tsx b/frontend/src/components/hooks/useHover.tsx index bc937f3b..a8add1fc 100644 --- a/frontend/src/components/hooks/useHover.tsx +++ b/frontend/src/components/hooks/useHover.tsx @@ -1,12 +1,14 @@ -const { useState, useMemo } = React; +import { useState, useMemo } from 'react'; -const useHover = () => { - const [hovered, setHovered] = useState(); +const useHover = () : [boolean, { onMouseOver(): void, onMouseOut(): void}] => { + const [hovered, setHovered] = useState(false); const eventHandlers = useMemo(() => ({ onMouseOver() { setHovered(true); }, onMouseOut() { setHovered(false); } }), []); - return {hovered, eventHandlers}; + return [hovered, eventHandlers]; } + +export default useHover; diff --git a/frontend/src/components/project/ProjectsList.tsx b/frontend/src/components/project/ProjectsList.tsx index aa292cb0..74ac2116 100644 --- a/frontend/src/components/project/ProjectsList.tsx +++ b/frontend/src/components/project/ProjectsList.tsx @@ -36,7 +36,6 @@ export const ProjectsList = () => { ); - const feature = projectFeature(config); return ; }; diff --git a/frontend/src/components/project/models/getProjectFeature.tsx b/frontend/src/components/project/models/getProjectFeature.tsx index eeef267a..d8195cf2 100644 --- a/frontend/src/components/project/models/getProjectFeature.tsx +++ b/frontend/src/components/project/models/getProjectFeature.tsx @@ -115,7 +115,7 @@ const projectListConfig = (config: ProjectFeatureBuilderConfig): IList , footer: (models: FullProjectModel[]) => x.consultant)} />, - sort: p => p.consultantName + sort: (asc) => (p, p2) => p.consultantName > p2.consultantName ? (asc ? 1 : -1) : (asc ? -1 : 1) }, { key: 'startDate', header: 'project.startDate',
- {header ? t(header) : <> } - {addSort ? <> : <> } -
+ + {header ? t(header) : <> } - {addSort ? <> : <> } + {addSort && hovered ? <> {setAsc(!asc); if(onSort) onSort(!asc);}} size={1}/> : <> }