Skip to content

Commit a8983ed

Browse files
authored
Merge pull request #1266 from AtCoder-NoviSteps/#1145
🎨 Move prefix in task to contest name (#1145)
2 parents e1fac8a + a8552b3 commit a8983ed

File tree

14 files changed

+425
-48
lines changed

14 files changed

+425
-48
lines changed

src/lib/components/TaskForm.svelte

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@
1111
Button,
1212
} from 'flowbite-svelte';
1313
14+
import { addContestNameToTaskIndex } from '$lib/utils/contest';
1415
import { taskGradeValues, type Task } from '$lib/types/task';
15-
import { getTaskGradeLabel } from '$lib/utils/task';
16+
import { getTaskGradeLabel, removeTaskIndexFromTitle } from '$lib/utils/task';
1617
1718
export let task: Task;
1819
//export const isAdmin: boolean; // Admin権限がある場合は、編集リンクを表示する
@@ -37,13 +38,13 @@
3738
<TableBodyRow>
3839
<TableBodyCell>タイトル</TableBodyCell>
3940
<TableBodyCell>
40-
{task.title}
41+
{removeTaskIndexFromTitle(task.title, task.task_table_index)}
4142
</TableBodyCell>
4243
</TableBodyRow>
4344
<TableBodyRow>
4445
<TableBodyCell>出典</TableBodyCell>
4546
<TableBodyCell>
46-
{task.contest_id}
47+
{addContestNameToTaskIndex(task.contest_id, task.task_table_index)}
4748
</TableBodyCell>
4849
</TableBodyRow>
4950
<TableBodyRow>

src/lib/components/TaskList.svelte

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
import ExternalLinkWrapper from '$lib/components/ExternalLinkWrapper.svelte';
1919
import AcceptedCounter from '$lib/components/SubmissionStatus/AcceptedCounter.svelte';
2020
import { getBackgroundColorFrom } from '$lib/services/submission_status';
21-
import { getContestNameLabel } from '$lib/utils/contest';
22-
import { taskUrl, toWhiteTextIfNeeds } from '$lib/utils/task';
21+
import { addContestNameToTaskIndex } from '$lib/utils/contest';
22+
import { toWhiteTextIfNeeds, taskUrl, removeTaskIndexFromTitle } from '$lib/utils/task';
2323
2424
export let grade: string;
2525
export let gradeColor: string;
@@ -83,13 +83,16 @@
8383
<TableBodyCell class="pl-0 sm:pl-6 w-2/3">
8484
<ExternalLinkWrapper
8585
url={taskUrl(taskResult.contest_id, taskResult.task_id)}
86-
description={taskResult.title}
86+
description={removeTaskIndexFromTitle(
87+
taskResult.title,
88+
taskResult.task_table_index,
89+
)}
8790
textSize="xs:text-lg"
8891
textColorInDarkMode="dark:text-gray-300"
8992
/>
9093
</TableBodyCell>
9194
<TableBodyCell class="pl-0 xs:text-lg text-gray-700 dark:text-gray-300">
92-
{getContestNameLabel(taskResult.contest_id)}
95+
{addContestNameToTaskIndex(taskResult.contest_id, taskResult.task_table_index)}
9396
</TableBodyCell>
9497
<TableBodyCell class="px-0">
9598
{#if isAdmin}

src/lib/components/TaskListSorted.svelte

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,19 @@
1010
} from 'flowbite-svelte';
1111
1212
import type { TaskResults } from '$lib/types/task';
13-
import { ATCODER_BASE_CONTEST_URL } from '$lib/constants/urls';
14-
import { getContestNameLabel } from '$lib/utils/contest';
13+
14+
import { addContestNameToTaskIndex } from '$lib/utils/contest';
15+
import { removeTaskIndexFromTitle } from '$lib/utils/task';
1516
1617
export let taskResults: TaskResults;
1718
</script>
1819

1920
<Table shadow hoverable={true} class="text-md">
2021
<TableHead class="text-md bg-gray-100">
21-
<TableHeadCell class="w-1/6">提出状況</TableHeadCell>
22-
<TableHeadCell class="w-1/6">コンテスト名</TableHeadCell>
22+
<TableHeadCell class="w-1/6">回答</TableHeadCell>
2323
<TableHeadCell class="w-1/2">問題名</TableHeadCell>
24-
<TableHeadCell class="w-1/6">更新時間</TableHeadCell>
24+
<TableHeadCell class="w-1/6">出典</TableHeadCell>
25+
<TableHeadCell class="w-1/6">更新日時</TableHeadCell>
2526
</TableHead>
2627
<TableBody tableBodyClass="divide-y">
2728
{#each taskResults as taskResult}
@@ -35,21 +36,14 @@
3536
</TableBodyCell>
3637
<TableBodyCell>
3738
<a
38-
href="{ATCODER_BASE_CONTEST_URL}/{taskResult.contest_id}"
39+
href="/problems/{taskResult.task_id}"
3940
class="font-medium text-primary-600 hover:underline dark:text-primary-500"
40-
target="_blank"
41-
rel="noreferrer"
4241
>
43-
{getContestNameLabel(taskResult.contest_id)}
42+
{removeTaskIndexFromTitle(taskResult.title, taskResult.task_table_index)}
4443
</a>
4544
</TableBodyCell>
4645
<TableBodyCell>
47-
<a
48-
href="/problems/{taskResult.task_id}"
49-
class="font-medium text-primary-600 hover:underline dark:text-primary-500"
50-
>
51-
{taskResult.title}
52-
</a>
46+
{addContestNameToTaskIndex(taskResult.contest_id, taskResult.task_table_index)}
5347
</TableBodyCell>
5448
<TableBodyCell>{taskResult.updated_at.toLocaleString()}</TableBodyCell>
5549
</TableBodyRow>

src/lib/components/WorkBookTasks/WorkBookTasksTable.svelte

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@
1010
} from 'flowbite-svelte';
1111
1212
import ExternalLinkWrapper from '$lib/components/ExternalLinkWrapper.svelte';
13-
import { getContestNameLabel } from '$lib/utils/contest';
14-
import { taskUrl } from '$lib/utils/task';
13+
import { addContestNameToTaskIndex } from '$lib/utils/contest';
14+
import { taskUrl, removeTaskIndexFromTitle } from '$lib/utils/task';
15+
1516
import type { WorkBookTaskBase, WorkBookTaskCreate, WorkBookTaskEdit } from '$lib/types/workbook';
17+
import type { Task } from '$lib/types/task';
1618
19+
export let tasksMapByIds: Map<string, Task>;
1720
export let workBookTasks = [] as WorkBookTaskBase[];
1821
export let workBookTasksForTable = [] as WorkBookTaskCreate[] | WorkBookTaskEdit[];
1922
@@ -72,6 +75,12 @@
7275
(event.target as HTMLElement).classList.add('placeholder');
7376
}
7477
}
78+
79+
function getTaskTableIndex(tasksMapByIds: Map<string, Task>, taskId: string) {
80+
const task = tasksMapByIds.get(taskId);
81+
82+
return task?.task_table_index !== undefined ? task.task_table_index : '';
83+
}
7584
</script>
7685

7786
{#if workBookTasksForTable.length}
@@ -110,13 +119,19 @@
110119
<TableBodyCell class="xs:text-lg truncate">
111120
<ExternalLinkWrapper
112121
url={taskUrl(task.contestId, task.taskId)}
113-
description={task.title}
122+
description={removeTaskIndexFromTitle(
123+
task.title,
124+
getTaskTableIndex(tasksMapByIds, task.taskId),
125+
)}
114126
/>
115127
</TableBodyCell>
116128

117129
<!-- 出典 -->
118130
<TableBodyCell class="xs:text-lg text-gray-700 dark:text-gray-300 truncate">
119-
{getContestNameLabel(task.contestId)}
131+
{addContestNameToTaskIndex(
132+
task.contestId,
133+
getTaskTableIndex(tasksMapByIds, task.taskId),
134+
)}
120135
</TableBodyCell>
121136

122137
<!-- 一言(コメント・ヒント) -->

src/lib/utils/contest.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,3 +132,9 @@ export const getContestNameLabel = (contest_id: string) => {
132132

133133
return contest_id.toUpperCase();
134134
};
135+
136+
export const addContestNameToTaskIndex = (contestId: string, taskTableIndex: string): string => {
137+
const contestName = getContestNameLabel(contestId);
138+
139+
return `${contestName} - ${taskTableIndex}`;
140+
};

src/lib/utils/task.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,13 @@ export function compareByContestIdAndTaskId(first: TaskResult, second: TaskResul
5353
return first.task_table_index.localeCompare(second.task_table_index);
5454
}
5555

56+
// 問題一覧や問題集の詳細ページでは、AtCoder ProblemsのAPIから取得したタイトルからプレフィックス(A., B., ..., G. など)を非表示にする
57+
// 理由: 問題を解くときに、プレフィックスからの先入観を受けないようにするため
58+
// その他: プレフィックスは、同じテーブルの出典に記載する
59+
export const removeTaskIndexFromTitle = (title: string, taskTableIndex: string = '') => {
60+
return title.replace(`${taskTableIndex}. `, '');
61+
};
62+
5663
export const taskGradeOrderInfinity = 9999;
5764

5865
// order: 1 (first) - 17 (last)、9999: Infinity

src/routes/users/[username]/+page.server.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
//See https://tech-blog.rakus.co.jp/entry/20230209/sveltekit#%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E6%8A%95%E7%A8%BF%E7%94%BB%E9%9D%A2
22

3-
import type { Roles } from '$lib/types/user';
4-
import type { TaskResult } from '$lib/types/task';
3+
import { redirect } from '@sveltejs/kit';
4+
55
import * as userService from '$lib/services/users';
66
import * as taskResultService from '$lib/services/task_results';
77

8-
import { redirect } from '@sveltejs/kit';
8+
import type { Roles } from '$lib/types/user';
9+
import type { TaskResult } from '$lib/types/task';
10+
11+
import { TEMPORARY_REDIRECT } from '$lib/constants/http-response-status-codes';
912

1013
export async function load({ locals, params }) {
1114
const session = await locals.auth.validate();
1215
if (!session) {
13-
redirect(302, '/login');
16+
redirect(TEMPORARY_REDIRECT, '/login');
1417
}
1518

1619
try {
1720
const user = await userService.getUser(params.username as string);
18-
console.log(user?.id);
1921

2022
if (!user) {
2123
return {
@@ -28,11 +30,13 @@ export async function load({ locals, params }) {
2830
};
2931
}
3032

31-
const taskResults = await taskResultService.getTaskResultsOnlyResultExists(user?.id as string);
32-
taskResults.sort((firstObject: TaskResult, secondObject: TaskResult) =>
33-
firstObject.updated_at > secondObject.updated_at ? -1 : 1,
33+
const taskResultsMap = await taskResultService.getTaskResultsOnlyResultExists(
34+
user?.id as string,
35+
);
36+
const taskResults = Array.from(taskResultsMap.values()).sort(
37+
(firstTaskResult: TaskResult, secondTaskResult: TaskResult) =>
38+
firstTaskResult.updated_at > secondTaskResult.updated_at ? -1 : 1,
3439
);
35-
console.log('taskResults:', taskResults);
3640

3741
return {
3842
userId: user?.id as string,
@@ -43,8 +47,8 @@ export async function load({ locals, params }) {
4347
taskResults: taskResults,
4448
};
4549
} catch (e) {
46-
console.log('fail to load user or taskResults:', session?.user.username);
47-
console.log(e);
50+
console.error('Failed to load user or taskResults: ', session?.user.username);
51+
console.error(e);
4852
//500を投げたい
4953
//throw redirect(302, '/login');
5054
}

src/routes/users/[username]/+page.svelte

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import TaskListSorted from '$lib/components/TaskListSorted.svelte';
55
66
export let data;
7+
78
let username = data.username;
89
let atcoder_username = data.atcoder_username;
910
let isLoggedIn = data.isLoggedIn;

src/routes/workbooks/[slug]/+page.svelte

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
2222
import { getBackgroundColorFrom } from '$lib/services/submission_status';
2323
24-
import { taskUrl } from '$lib/utils/task';
25-
import { getContestNameLabel } from '$lib/utils/contest';
24+
import { taskUrl, removeTaskIndexFromTitle } from '$lib/utils/task';
25+
import { addContestNameToTaskIndex } from '$lib/utils/contest';
2626
2727
import type { WorkBookTaskBase } from '$lib/types/workbook';
2828
import type { TaskResult, TaskGrade } from '$lib/types/task';
@@ -50,11 +50,21 @@
5050
5151
const getContestNameFrom = (taskId: string): string => {
5252
const contestId = getContestIdFrom(taskId);
53-
return getContestNameLabel(contestId);
53+
const taskTableIndex = getTaskTableIndex(taskId);
54+
55+
return addContestNameToTaskIndex(contestId, taskTableIndex);
5456
};
5557
5658
const getTaskName = (taskId: string): string => {
57-
return getTaskResult(taskId)?.title as string;
59+
const title = getTaskResult(taskId)?.title as string;
60+
const taskTableIndex = getTaskTableIndex(taskId);
61+
62+
return removeTaskIndexFromTitle(title, taskTableIndex);
63+
};
64+
65+
const getTaskTableIndex = (taskId: string): string => {
66+
const taskTableIndex = getTaskResult(taskId)?.task_table_index as string;
67+
return taskTableIndex ? taskTableIndex : '';
5868
};
5969
6070
const getUniqueIdUsing = (taskId: string): string => {

src/routes/workbooks/create/+page.server.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ export const load = async ({ locals }) => {
3131
error(FORBIDDEN, `アクセス権限がありません。`);
3232
}
3333

34-
const tasks = await tasksCrud.getTasks();
34+
const tasksMapByIds = await tasksCrud.getTasksByTaskId();
3535

36-
return { form: form, author: author, isAdmin: isAdmin, tasks: tasks };
36+
return { form: form, author: author, isAdmin: isAdmin, tasksMapByIds: tasksMapByIds };
3737
};
3838

3939
export const actions = {

0 commit comments

Comments
 (0)