Skip to content

Commit 86e6f04

Browse files
committed
Sort tasks properly
1 parent 084d029 commit 86e6f04

File tree

9 files changed

+72
-55
lines changed

9 files changed

+72
-55
lines changed

admin/src/Statistics/TaskActivityPage.tsx

Lines changed: 62 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
formatDate,
66
TaskLogEntryWithMember,
77
} from "Models/taskActions";
8+
import { useState } from "react";
89
import { Link } from "react-router-dom";
910

1011
interface TaskActivityResponse {
@@ -23,6 +24,7 @@ function extractRoom(labels: string[]): string | null {
2324
export default function TaskActivityPage() {
2425
const { t } = useTranslation("task_statistics");
2526
const { t: t_tasks } = useTranslation("tasks");
27+
const [showOnlyCompleted, setShowOnlyCompleted] = useState(false);
2628

2729
const { data, isLoading, error } = useJson<TaskActivityResponse>({
2830
url: `/tasks/statistics`,
@@ -55,22 +57,22 @@ export default function TaskActivityPage() {
5557
);
5658
}
5759

58-
// Sort task logs: completed first, then by date
59-
const sortedTaskLogs = [...data.task_logs].sort((a, b) => {
60-
const aCompleted = ACTION_INFO[a.action]?.isCompleted ?? false;
61-
const bCompleted = ACTION_INFO[b.action]?.isCompleted ?? false;
62-
if (aCompleted !== bCompleted) {
63-
return aCompleted ? -1 : 1;
64-
}
65-
return (
66-
new Date(b.created_at).getTime() - new Date(a.created_at).getTime()
67-
);
68-
});
69-
7060
return (
7161
<div className="uk-width-1-1">
7262
<h2>{t("task_log.title")}</h2>
7363

64+
<div className="uk-margin-bottom">
65+
<label>
66+
<input
67+
type="checkbox"
68+
className="uk-checkbox uk-margin-small-right"
69+
checked={showOnlyCompleted}
70+
onChange={(e) => setShowOnlyCompleted(e.target.checked)}
71+
/>
72+
{t("task_log.show_only_completed")}
73+
</label>
74+
</div>
75+
7476
<table className="uk-table uk-table-small uk-table-striped uk-table-hover">
7577
<thead>
7678
<tr>
@@ -82,47 +84,56 @@ export default function TaskActivityPage() {
8284
</tr>
8385
</thead>
8486
<tbody>
85-
{sortedTaskLogs.map((log) => {
86-
const actionMeta = ACTION_INFO[log.action];
87-
const actionLabel = actionMeta
88-
? t_tasks(actionMeta.key as any)
89-
: log.action;
90-
const isCompleted = actionMeta?.isCompleted ?? false;
91-
const rowStyle = isCompleted ? {} : { opacity: 0.5 };
87+
{data.task_logs
88+
.filter((log) => {
89+
if (!showOnlyCompleted) return true;
90+
const actionMeta = ACTION_INFO[log.action];
91+
return actionMeta?.isCompleted ?? false;
92+
})
93+
.map((log) => {
94+
const actionMeta = ACTION_INFO[log.action];
95+
const actionLabel = actionMeta
96+
? t_tasks(actionMeta.key as any)
97+
: log.action;
98+
const isCompleted =
99+
actionMeta?.isCompleted ?? false;
100+
const rowStyle = isCompleted
101+
? {}
102+
: { opacity: 0.5 };
92103

93-
return (
94-
<tr key={log.id} style={rowStyle}>
95-
<td style={{ whiteSpace: "nowrap" }}>
96-
{formatDate(log.created_at)}
97-
</td>
98-
<td>
99-
{log.member_id ? (
100-
<Link
101-
to={`/membership/members/${log.member_id}/tasks`}
104+
return (
105+
<tr key={log.id} style={rowStyle}>
106+
<td style={{ whiteSpace: "nowrap" }}>
107+
{formatDate(log.created_at)}
108+
</td>
109+
<td>
110+
{log.member_id ? (
111+
<Link
112+
to={`/membership/members/${log.member_id}/tasks`}
113+
>
114+
{log.member_name}
115+
</Link>
116+
) : (
117+
"-"
118+
)}
119+
</td>
120+
<td>
121+
<a
122+
href={log.card_url}
123+
target="_blank"
124+
rel="noopener noreferrer"
102125
>
103-
{log.member_name}
104-
</Link>
105-
) : (
106-
"-"
107-
)}
108-
</td>
109-
<td>
110-
<a
111-
href={log.card_url}
112-
target="_blank"
113-
rel="noopener noreferrer"
114-
>
115-
{log.card_name}
116-
</a>
117-
</td>
118-
<td style={{ whiteSpace: "nowrap" }}>
119-
{isCompleted ? "✅ " : ""}
120-
{actionLabel}
121-
</td>
122-
<td>{extractRoom(log.labels) || "-"}</td>
123-
</tr>
124-
);
125-
})}
126+
{log.card_name}
127+
</a>
128+
</td>
129+
<td style={{ whiteSpace: "nowrap" }}>
130+
{isCompleted ? "✅ " : ""}
131+
{actionLabel}
132+
</td>
133+
<td>{extractRoom(log.labels) || "-"}</td>
134+
</tr>
135+
);
136+
})}
126137
</tbody>
127138
</table>
128139
</div>

admin/src/i18n/generated_locales/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
"member": "Member",
8787
"no_logs": "No task activity yet.",
8888
"room": "Room",
89+
"show_only_completed": "Show only completed",
8990
"status": "Status",
9091
"task": "Task",
9192
"title": "Recent Task Activity"

admin/src/i18n/generated_locales/sv.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
"member": "Medlem",
8787
"no_logs": "Ingen uppgiftsaktivitet ännu.",
8888
"room": "Rum",
89+
"show_only_completed": "Visa endast slutförda",
8990
"status": "Status",
9091
"task": "Uppgift",
9192
"title": "Senaste uppgiftsaktivitet"

admin/src/i18n/locales.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import sv from "./generated_locales/sv.json";
2525
"member_tasks":
2626
((key: "by_label.count" | "by_label.label" | "by_label.no_labels" | "by_label.title" | "error_loading" | "history.date" | "history.labels" | "history.no_tasks" | "history.status" | "history.task" | "history.title" | "loading" | "no_data" | "summary.not_specified" | "summary.preferred_rooms" | "summary.skill_level" | "summary.time_at_space" | "summary.title" | "summary.total_completed") => string)
2727
"task_statistics":
28-
((key: "cards.completed_count" | "cards.last_completed" | "cards.last_completer" | "cards.never" | "cards.no_cards" | "cards.score" | "cards.task" | "cards.title" | "error_loading" | "loading" | "task_log.date" | "task_log.member" | "task_log.no_logs" | "task_log.room" | "task_log.status" | "task_log.task" | "task_log.title" | "title") => string)
28+
((key: "cards.completed_count" | "cards.last_completed" | "cards.last_completer" | "cards.never" | "cards.no_cards" | "cards.score" | "cards.task" | "cards.title" | "error_loading" | "loading" | "task_log.date" | "task_log.member" | "task_log.no_logs" | "task_log.room" | "task_log.show_only_completed" | "task_log.status" | "task_log.task" | "task_log.title" | "title") => string)
2929
"tasks":
3030
((key: "actions.already_completed_by_someone_else" | "actions.assigned" | "actions.completed" | "actions.ignored" | "actions.not_done_confused" | "actions.not_done_did_something_else" | "actions.not_done_forgot" | "actions.not_done_no_time" | "actions.not_done_rerolled") => string)
3131
& ((key: "actions.not_done", args: { "count": string | number}) => string)
@@ -42,7 +42,7 @@ export type LOCALE_SCHEMA_GLOBAL = (
4242
& ((key: "common:todo") => string)
4343
& ((key: "member_quizzes:error_loading" | "member_quizzes:loading" | "member_quizzes:no_quizzes" | "member_quizzes:table.completion" | "member_quizzes:table.correctly_answered" | "member_quizzes:table.quiz") => string)
4444
& ((key: "member_tasks:by_label.count" | "member_tasks:by_label.label" | "member_tasks:by_label.no_labels" | "member_tasks:by_label.title" | "member_tasks:error_loading" | "member_tasks:history.date" | "member_tasks:history.labels" | "member_tasks:history.no_tasks" | "member_tasks:history.status" | "member_tasks:history.task" | "member_tasks:history.title" | "member_tasks:loading" | "member_tasks:no_data" | "member_tasks:summary.not_specified" | "member_tasks:summary.preferred_rooms" | "member_tasks:summary.skill_level" | "member_tasks:summary.time_at_space" | "member_tasks:summary.title" | "member_tasks:summary.total_completed") => string)
45-
& ((key: "task_statistics:cards.completed_count" | "task_statistics:cards.last_completed" | "task_statistics:cards.last_completer" | "task_statistics:cards.never" | "task_statistics:cards.no_cards" | "task_statistics:cards.score" | "task_statistics:cards.task" | "task_statistics:cards.title" | "task_statistics:error_loading" | "task_statistics:loading" | "task_statistics:task_log.date" | "task_statistics:task_log.member" | "task_statistics:task_log.no_logs" | "task_statistics:task_log.room" | "task_statistics:task_log.status" | "task_statistics:task_log.task" | "task_statistics:task_log.title" | "task_statistics:title") => string)
45+
& ((key: "task_statistics:cards.completed_count" | "task_statistics:cards.last_completed" | "task_statistics:cards.last_completer" | "task_statistics:cards.never" | "task_statistics:cards.no_cards" | "task_statistics:cards.score" | "task_statistics:cards.task" | "task_statistics:cards.title" | "task_statistics:error_loading" | "task_statistics:loading" | "task_statistics:task_log.date" | "task_statistics:task_log.member" | "task_statistics:task_log.no_logs" | "task_statistics:task_log.room" | "task_statistics:task_log.show_only_completed" | "task_statistics:task_log.status" | "task_statistics:task_log.task" | "task_statistics:task_log.title" | "task_statistics:title") => string)
4646
& ((key: "tasks:actions.already_completed_by_someone_else" | "tasks:actions.assigned" | "tasks:actions.completed" | "tasks:actions.ignored" | "tasks:actions.not_done_confused" | "tasks:actions.not_done_did_something_else" | "tasks:actions.not_done_forgot" | "tasks:actions.not_done_no_time" | "tasks:actions.not_done_rerolled") => string)
4747
& ((key: "tasks:actions.not_done", args: { "count": string | number}) => string)
4848
& ((key: "time:relative_generic.now") => string)

api/src/i18n/en.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
"task_statistics:task_log.member": "Member",
6363
"task_statistics:task_log.no_logs": "No task activity yet.",
6464
"task_statistics:task_log.room": "Room",
65+
"task_statistics:task_log.show_only_completed": "Show only completed",
6566
"task_statistics:task_log.status": "Status",
6667
"task_statistics:task_log.task": "Task",
6768
"task_statistics:task_log.title": "Recent Task Activity",

api/src/i18n/locales.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class member_tasksTranslator(Protocol):
3838
def __call__(self, key: Literal["by_label.count","by_label.label","by_label.no_labels","by_label.title","error_loading","history.date","history.labels","history.no_tasks","history.status","history.task","history.title","loading","no_data","summary.not_specified","summary.preferred_rooms","summary.skill_level","summary.time_at_space","summary.title","summary.total_completed","member_tasks:by_label.count","member_tasks:by_label.label","member_tasks:by_label.no_labels","member_tasks:by_label.title","member_tasks:error_loading","member_tasks:history.date","member_tasks:history.labels","member_tasks:history.no_tasks","member_tasks:history.status","member_tasks:history.task","member_tasks:history.title","member_tasks:loading","member_tasks:no_data","member_tasks:summary.not_specified","member_tasks:summary.preferred_rooms","member_tasks:summary.skill_level","member_tasks:summary.time_at_space","member_tasks:summary.title","member_tasks:summary.total_completed"]) -> str: ...
3939

4040
class task_statisticsTranslator(Protocol):
41-
def __call__(self, key: Literal["cards.completed_count","cards.last_completed","cards.last_completer","cards.never","cards.no_cards","cards.score","cards.task","cards.title","error_loading","loading","task_log.date","task_log.member","task_log.no_logs","task_log.room","task_log.status","task_log.task","task_log.title","title","task_statistics:cards.completed_count","task_statistics:cards.last_completed","task_statistics:cards.last_completer","task_statistics:cards.never","task_statistics:cards.no_cards","task_statistics:cards.score","task_statistics:cards.task","task_statistics:cards.title","task_statistics:error_loading","task_statistics:loading","task_statistics:task_log.date","task_statistics:task_log.member","task_statistics:task_log.no_logs","task_statistics:task_log.room","task_statistics:task_log.status","task_statistics:task_log.task","task_statistics:task_log.title","task_statistics:title"]) -> str: ...
41+
def __call__(self, key: Literal["cards.completed_count","cards.last_completed","cards.last_completer","cards.never","cards.no_cards","cards.score","cards.task","cards.title","error_loading","loading","task_log.date","task_log.member","task_log.no_logs","task_log.room","task_log.show_only_completed","task_log.status","task_log.task","task_log.title","title","task_statistics:cards.completed_count","task_statistics:cards.last_completed","task_statistics:cards.last_completer","task_statistics:cards.never","task_statistics:cards.no_cards","task_statistics:cards.score","task_statistics:cards.task","task_statistics:cards.title","task_statistics:error_loading","task_statistics:loading","task_statistics:task_log.date","task_statistics:task_log.member","task_statistics:task_log.no_logs","task_statistics:task_log.room","task_statistics:task_log.show_only_completed","task_statistics:task_log.status","task_statistics:task_log.task","task_statistics:task_log.title","task_statistics:title"]) -> str: ...
4242

4343
class tasksTranslator(Protocol):
4444
@overload
@@ -87,7 +87,7 @@ def translate(key: Literal["by_label.count","by_label.label","by_label.no_labels
8787

8888

8989
@overload
90-
def translate(key: Literal["cards.completed_count","cards.last_completed","cards.last_completer","cards.never","cards.no_cards","cards.score","cards.task","cards.title","error_loading","loading","task_log.date","task_log.member","task_log.no_logs","task_log.room","task_log.status","task_log.task","task_log.title","title","task_statistics:cards.completed_count","task_statistics:cards.last_completed","task_statistics:cards.last_completer","task_statistics:cards.never","task_statistics:cards.no_cards","task_statistics:cards.score","task_statistics:cards.task","task_statistics:cards.title","task_statistics:error_loading","task_statistics:loading","task_statistics:task_log.date","task_statistics:task_log.member","task_statistics:task_log.no_logs","task_statistics:task_log.room","task_statistics:task_log.status","task_statistics:task_log.task","task_statistics:task_log.title","task_statistics:title"]) -> str: ...
90+
def translate(key: Literal["cards.completed_count","cards.last_completed","cards.last_completer","cards.never","cards.no_cards","cards.score","cards.task","cards.title","error_loading","loading","task_log.date","task_log.member","task_log.no_logs","task_log.room","task_log.show_only_completed","task_log.status","task_log.task","task_log.title","title","task_statistics:cards.completed_count","task_statistics:cards.last_completed","task_statistics:cards.last_completer","task_statistics:cards.never","task_statistics:cards.no_cards","task_statistics:cards.score","task_statistics:cards.task","task_statistics:cards.title","task_statistics:error_loading","task_statistics:loading","task_statistics:task_log.date","task_statistics:task_log.member","task_statistics:task_log.no_logs","task_statistics:task_log.room","task_statistics:task_log.show_only_completed","task_statistics:task_log.status","task_statistics:task_log.task","task_statistics:task_log.title","task_statistics:title"]) -> str: ...
9191

9292

9393
@overload

api/src/i18n/sv.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
"task_statistics:task_log.member": "Medlem",
6363
"task_statistics:task_log.no_logs": "Ingen uppgiftsaktivitet ännu.",
6464
"task_statistics:task_log.room": "Rum",
65+
"task_statistics:task_log.show_only_completed": "Visa endast slutförda",
6566
"task_statistics:task_log.status": "Status",
6667
"task_statistics:task_log.task": "Uppgift",
6768
"task_statistics:task_log.title": "Senaste uppgiftsaktivitet",

config/locales/en/admin/task_statistics.json5

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
status: "Status",
1111
room: "Room",
1212
no_logs: "No task activity yet.",
13+
show_only_completed: "Show only completed",
1314
},
1415
cards: {
1516
title: "All Tasks",

config/locales/sv/admin/task_statistics.json5

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
status: "Status",
1111
room: "Rum",
1212
no_logs: "Ingen uppgiftsaktivitet ännu.",
13+
show_only_completed: "Visa endast slutförda",
1314
},
1415
cards: {
1516
title: "Alla uppgifter",

0 commit comments

Comments
 (0)