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 (
-
- {header ? t(header) : <> >}
- {addSort ? <>> : <> >}
- |
+ { 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 (
-
+
+ |
{header ? t(header) : <> >}
- {addSort ? <>> : <> >}
+ {addSort && hovered ? <> {setAsc(!asc); if(onSort) onSort(!asc);}} size={1}/>> : <> >}
|
)
}
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',