Skip to content

Commit d04cc5d

Browse files
committed
Show most recent session first in list; group by day
1 parent 506b23e commit d04cc5d

File tree

4 files changed

+68
-21
lines changed

4 files changed

+68
-21
lines changed

frontend/package-lock.json

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"license": "MIT",
1414
"dependencies": {
1515
"classnames": "^2.3.2",
16+
"just-group-by": "^2.2.0",
1617
"lodash": "^4.17.21",
1718
"raviger": "^4.1.2",
1819
"react": "^18.2.0",

frontend/src/home.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,16 +55,17 @@ export function Home({ modelOverview, presetOverview, sessionOverview, templateO
5555
return (
5656
<div className="top-layout">
5757
<div className="session-list">
58-
<SessionOverviewList
59-
sessionOverview={sessionOverview}
60-
selectedSessionId={sessionId}
61-
/>
6258
<button
6359
className={classNames({"primary": !isCreatingSession})}
6460
disabled={isCreatingSession}
6561
onClick={onNewSessionClick}>
6662
{isCreatingSession ? "Creating session..." : "New Session" }
6763
</button>
64+
<p></p>
65+
<SessionOverviewList
66+
sessionOverview={sessionOverview}
67+
selectedSessionId={sessionId}
68+
/>
6869
</div>
6970
<div className="session-tab">
7071
<SessionEditor

frontend/src/sessionoverviewlist.tsx

Lines changed: 51 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,70 @@
11
import classNames from "classnames";
22
import { SessionOverview, SessionSummary } from "./data";
33
import { navigate } from "raviger";
4+
import groupBy from "just-group-by";
5+
46

57
export interface Props {
68
sessionOverview: SessionOverview;
79
selectedSessionId: string | null;
810
}
911

1012
export function SessionOverviewList({sessionOverview, selectedSessionId}: Props): JSX.Element {
11-
const sessionSummaries = [...sessionOverview.sessionSummaries];
13+
const groups = groupBy(sessionOverview.sessionSummaries, (summary: SessionSummary): string => {
14+
return summary.creationTimestamp.substring(0, 10);
15+
});
16+
console.log(groups);
17+
18+
const groupNames = Object.getOwnPropertyNames(groups);
19+
groupNames.sort().reverse();
20+
return <>
21+
{
22+
groupNames.map((name) => formatGroup(groups[name], selectedSessionId))
23+
}
24+
</>;
25+
}
26+
27+
function formatGroup(sessionSummaries: SessionSummary[], selectedSessionId: string | null): JSX.Element {
28+
const sortedSessionSummaries = [...sessionSummaries];
1229
const cmp = (a: SessionSummary, b: SessionSummary) => {
13-
if (a.creationTimestamp < b.creationTimestamp) {
30+
if (a.creationTimestamp > b.creationTimestamp) {
1431
return -1;
1532
}
1633
return a.creationTimestamp === b.creationTimestamp ? 0 : 1;
1734
}
18-
sessionSummaries.sort(cmp);
35+
sortedSessionSummaries.sort(cmp);
36+
37+
const dateFormat = new Intl.DateTimeFormat("default", { dateStyle: "medium" });
38+
39+
const now = new Date();
40+
const groupDay = new Date(Date.parse(sortedSessionSummaries[0].creationTimestamp));
41+
const isToday = (now.getDay() === groupDay.getDay() &&
42+
now.getMonth() === groupDay.getMonth() &&
43+
now.getFullYear() === groupDay.getFullYear());
1944

20-
return <ul className="tabs">
45+
return <>
2146
{
22-
sessionSummaries.map(s => {
23-
const onClick = () => {
24-
navigate(`/session/${s.id}`);
25-
};
26-
return <li
27-
key={s.id}
28-
className={classNames({"tab": true, active: s.id === selectedSessionId})}
29-
onClick={onClick}
30-
>
31-
{s.title}
32-
</li>;
33-
})
47+
!isToday && <p className="minor">
48+
{
49+
dateFormat.format(Date.parse(sortedSessionSummaries[0].creationTimestamp))
50+
}
51+
</p>
3452
}
35-
</ul>;
53+
<ul className="tabs">
54+
{
55+
sortedSessionSummaries.map(s => {
56+
const onClick = () => {
57+
navigate(`/session/${s.id}`);
58+
};
59+
return <li
60+
key={s.id}
61+
className={classNames({"tab": true, active: s.id === selectedSessionId})}
62+
onClick={onClick}
63+
>
64+
{s.title}
65+
</li>;
66+
})
67+
}
68+
</ul>
69+
</>;
3670
}

0 commit comments

Comments
 (0)