From ca6c8ac9b343db5f7ce1d0c5a8517501cf38396f Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Mon, 30 Dec 2024 06:13:10 +0000 Subject: [PATCH 01/32] =?UTF-8?q?=E2=9C=A8=20Add=20task=20table=20tab=20fo?= =?UTF-8?q?r=20ABC212=20-=20=20(#1611)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/routes/problems/+page.svelte | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/routes/problems/+page.svelte b/src/routes/problems/+page.svelte index 499b3b367..9831286b6 100644 --- a/src/routes/problems/+page.svelte +++ b/src/routes/problems/+page.svelte @@ -7,6 +7,7 @@ import HeadingOne from '$lib/components/HeadingOne.svelte'; import TabItemWrapper from '$lib/components/TabItemWrapper.svelte'; + import TaskTable from '$lib/components/TaskTables/TaskTable.svelte'; import TaskGradeList from '$lib/components/TaskGradeList.svelte'; import GradeGuidelineTable from '$lib/components/TaskGrades/GradeGuidelineTable.svelte'; @@ -25,8 +26,16 @@ + + + {#if isAdmin} + + + + {/if} + - + @@ -45,12 +54,5 @@ - - - - - - From 15f9e7d0bf9bee142bde24bf6d7f602e2b51e364 Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Mon, 30 Dec 2024 06:13:49 +0000 Subject: [PATCH 02/32] =?UTF-8?q?=E2=9C=A8=20Select=20ABC212=20-=20tasks?= =?UTF-8?q?=20=20(#1611)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/TaskTables/TaskTable.svelte | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/lib/components/TaskTables/TaskTable.svelte diff --git a/src/lib/components/TaskTables/TaskTable.svelte b/src/lib/components/TaskTables/TaskTable.svelte new file mode 100644 index 000000000..3fdf1a049 --- /dev/null +++ b/src/lib/components/TaskTables/TaskTable.svelte @@ -0,0 +1,91 @@ + + + + + + + + + + +

AtCoder Beginners Contest

+ +{#if selectedTaskResults !== null && selectedTaskResults.length} +

問題数: {selectedTaskResults.length}

+{/if} + + + + + + Contest + {#if headerNames !== null && headerNames.length} + {#each headerNames as headerName} + {headerName} + {/each} + {/if} + + + {#if contestNames !== null && contestNames.length} + + {#if selectedContestType === ContestType.ABC} + {#each contestNames as contestName} + + {getContestNameLabel(contestName)} + + {/each} + {/if} + {/if} + +
From abd8767f6c15fd80d18c4c59b4f9ada354db3eca Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Mon, 30 Dec 2024 06:44:38 +0000 Subject: [PATCH 03/32] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Rename=20(#1611)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/TaskTables/TaskTable.svelte | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/lib/components/TaskTables/TaskTable.svelte b/src/lib/components/TaskTables/TaskTable.svelte index 3fdf1a049..da6cd8182 100644 --- a/src/lib/components/TaskTables/TaskTable.svelte +++ b/src/lib/components/TaskTables/TaskTable.svelte @@ -21,28 +21,29 @@ let contestNames: Array | null = null; let headerNames: Array | null = null; - $: selectedTaskResults = taskResults.filter(fromABC212_Onwards); + $: selectedTaskResults = filterTaskResultsByContestType(fromABC212_Onwards); + $: contestNames = getContestNames(selectedTaskResults); + $: headerNames = getTaskIndices(selectedTaskResults, ContestType.ABC); - // FIXME: 冗長な記述をリファクタリング - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const handleClick = (event: any) => { - selectedContestType = event.target.value; - selectedTaskResults = taskResults.filter( - (taskResult: TaskResult) => classifyContest(taskResult.contest_id) === selectedContestType, - ); + function filterTaskResultsByContestType( + condition: (taskResult: TaskResult) => boolean, + ): TaskResults { + return taskResults.filter(condition); + } + function getContestNames(selectedTaskResults: TaskResults): Array { const contestList = selectedTaskResults.map((taskResult: TaskResult) => taskResult.contest_id); - contestNames = Array.from(new Set(contestList)).sort().reverse(); + return Array.from(new Set(contestList)).sort().reverse(); + } + function getTaskIndices( + selectedTaskResults: TaskResults, + selectedContestType: ContestType, + ): Array { const headerList = selectedTaskResults.map((taskResult: TaskResult) => getTaskTableHeaderName(selectedContestType, taskResult), ); - - headerNames = Array.from(new Set(headerList)).sort(); - }; - - function filterByContestType(condition: (taskResult: TaskResult) => boolean): void { - selectedTaskResults = taskResults.filter(condition); + return Array.from(new Set(headerList)).sort(); } // Note: @@ -55,7 +56,7 @@ - + From 4416a23050312e99f2b911e50bd42dcaece83417 Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Mon, 30 Dec 2024 06:48:16 +0000 Subject: [PATCH 04/32] :bug: Fix conflict (#1611) --- .../components/TaskTables/TaskTable.svelte | 32 ++++++++----------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/src/lib/components/TaskTables/TaskTable.svelte b/src/lib/components/TaskTables/TaskTable.svelte index da6cd8182..6d67af3e6 100644 --- a/src/lib/components/TaskTables/TaskTable.svelte +++ b/src/lib/components/TaskTables/TaskTable.svelte @@ -16,10 +16,9 @@ import { getTaskTableHeaderName } from '$lib/utils/task'; export let taskResults: TaskResults; - let selectedContestType: ContestType; - let selectedTaskResults: TaskResults | null = null; - let contestNames: Array | null = null; - let headerNames: Array | null = null; + let selectedTaskResults: TaskResults; + let contestNames: Array; + let headerNames: Array; $: selectedTaskResults = filterTaskResultsByContestType(fromABC212_Onwards); $: contestNames = getContestNames(selectedTaskResults); @@ -52,41 +51,36 @@ classifyContest(taskResult.contest_id) === ContestType.ABC && taskResult.contest_id >= 'abc212'; - + - +

AtCoder Beginners Contest

-{#if selectedTaskResults !== null && selectedTaskResults.length} +{#if selectedTaskResults.length}

問題数: {selectedTaskResults.length}

{/if} - - Contest - {#if headerNames !== null && headerNames.length} + {#if headerNames.length} {#each headerNames as headerName} {headerName} {/each} {/if} - {#if contestNames !== null && contestNames.length} - - {#if selectedContestType === ContestType.ABC} - {#each contestNames as contestName} - - {getContestNameLabel(contestName)} - - {/each} - {/if} + {#if contestNames.length} + {#each contestNames as contestName} + + {getContestNameLabel(contestName)} + + {/each} {/if}
From 630892e5627ce19c3187c36f76cb2127d709f292 Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Mon, 30 Dec 2024 11:45:35 +0000 Subject: [PATCH 05/32] :books: Add future tasks to comment (#1611) --- src/lib/components/TaskTables/TaskTable.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/components/TaskTables/TaskTable.svelte b/src/lib/components/TaskTables/TaskTable.svelte index 6d67af3e6..c622bf6da 100644 --- a/src/lib/components/TaskTables/TaskTable.svelte +++ b/src/lib/components/TaskTables/TaskTable.svelte @@ -30,6 +30,7 @@ return taskResults.filter(condition); } + // TODO: 任意のコンテスト種別に拡張 function getContestNames(selectedTaskResults: TaskResults): Array { const contestList = selectedTaskResults.map((taskResult: TaskResult) => taskResult.contest_id); return Array.from(new Set(contestList)).sort().reverse(); From 04f6fe70c415271a545037a018e376a17b433ffc Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Mon, 30 Dec 2024 11:46:32 +0000 Subject: [PATCH 06/32] :books: Add future tasks to comment (#1611) --- src/lib/components/TaskTables/TaskTable.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/components/TaskTables/TaskTable.svelte b/src/lib/components/TaskTables/TaskTable.svelte index c622bf6da..26e396eab 100644 --- a/src/lib/components/TaskTables/TaskTable.svelte +++ b/src/lib/components/TaskTables/TaskTable.svelte @@ -66,6 +66,7 @@

問題数: {selectedTaskResults.length}

{/if} + Contest From 013db189314a5153e446d1e145999f449f748ed6 Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Mon, 30 Dec 2024 12:39:32 +0000 Subject: [PATCH 07/32] =?UTF-8?q?=E2=9C=A8=20Show=20task=20title=20in=20ta?= =?UTF-8?q?sk=20table=20=20(#1611)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/TaskTables/TaskTable.svelte | 81 ++++++++++++++----- 1 file changed, 59 insertions(+), 22 deletions(-) diff --git a/src/lib/components/TaskTables/TaskTable.svelte b/src/lib/components/TaskTables/TaskTable.svelte index 26e396eab..d93c09325 100644 --- a/src/lib/components/TaskTables/TaskTable.svelte +++ b/src/lib/components/TaskTables/TaskTable.svelte @@ -11,18 +11,23 @@ } from 'flowbite-svelte'; import type { TaskResults, TaskResult } from '$lib/types/task'; + import { ContestType } from '$lib/types/contest'; import { classifyContest, getContestNameLabel } from '$lib/utils/contest'; import { getTaskTableHeaderName } from '$lib/utils/task'; + export let taskResults: TaskResults; let selectedTaskResults: TaskResults; - let contestNames: Array; - let headerNames: Array; + let contestIds: Array; + let taskTableIndices: Array; + let taskTable: Record>; + // TODO: 任意のコンテスト種別に拡張 $: selectedTaskResults = filterTaskResultsByContestType(fromABC212_Onwards); - $: contestNames = getContestNames(selectedTaskResults); - $: headerNames = getTaskIndices(selectedTaskResults, ContestType.ABC); + $: contestIds = getContestIds(selectedTaskResults); + $: taskTableIndices = getTaskTableIndices(selectedTaskResults, ContestType.ABC); + $: taskTable = prepareTaskTable(selectedTaskResults, ContestType.ABC); function filterTaskResultsByContestType( condition: (taskResult: TaskResult) => boolean, @@ -30,13 +35,17 @@ return taskResults.filter(condition); } - // TODO: 任意のコンテスト種別に拡張 - function getContestNames(selectedTaskResults: TaskResults): Array { + // Note: + // Before and from ABC212 onwards, the number and tendency of tasks are very different. + const fromABC212_Onwards = (taskResult: TaskResult) => + classifyContest(taskResult.contest_id) === ContestType.ABC && taskResult.contest_id >= 'abc212'; + + function getContestIds(selectedTaskResults: TaskResults): Array { const contestList = selectedTaskResults.map((taskResult: TaskResult) => taskResult.contest_id); return Array.from(new Set(contestList)).sort().reverse(); } - function getTaskIndices( + function getTaskTableIndices( selectedTaskResults: TaskResults, selectedContestType: ContestType, ): Array { @@ -46,10 +55,25 @@ return Array.from(new Set(headerList)).sort(); } - // Note: - // Before and from ABC212 onwards, the number and tendency of tasks are very different. - const fromABC212_Onwards = (taskResult: TaskResult) => - classifyContest(taskResult.contest_id) === ContestType.ABC && taskResult.contest_id >= 'abc212'; + function prepareTaskTable( + selectedTaskResults: TaskResults, + selectedContestType: ContestType, + ): Record> { + const table: Record> = {}; + + selectedTaskResults.forEach((taskResult: TaskResult) => { + const contestId = taskResult.contest_id; + const taskTableIndex = getTaskTableHeaderName(selectedContestType, taskResult); + + if (!table[contestId]) { + table[contestId] = {}; + } + + table[contestId][taskTableIndex] = taskResult; + }); + + return table; + } @@ -62,25 +86,38 @@

AtCoder Beginners Contest

-{#if selectedTaskResults.length} -

問題数: {selectedTaskResults.length}

-{/if} - -
+
- Contest - {#if headerNames.length} - {#each headerNames as headerName} - {headerName} + Round + + {#if taskTableIndices.length} + {#each taskTableIndices as taskIndex} + {taskIndex} {/each} {/if} + - {#if contestNames.length} - {#each contestNames as contestName} + {#if contestIds.length && taskTableIndices.length} + {#each contestIds as contestName} {getContestNameLabel(contestName)} + + {#each taskTableIndices as taskIndex} + + {#if taskTable[contestName][taskIndex]} + {taskTable[contestName][taskIndex].title} + + {/if} + + {/each} {/each} {/if} From 9f14afe3dd5a8b9568b40ab85187a3442cd1b2bd Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Mon, 30 Dec 2024 13:14:54 +0000 Subject: [PATCH 08/32] :art: Show external links and add styles (#1611) --- .../components/TaskTables/TaskTable.svelte | 88 ++++++++++--------- 1 file changed, 48 insertions(+), 40 deletions(-) diff --git a/src/lib/components/TaskTables/TaskTable.svelte b/src/lib/components/TaskTables/TaskTable.svelte index d93c09325..99413eda6 100644 --- a/src/lib/components/TaskTables/TaskTable.svelte +++ b/src/lib/components/TaskTables/TaskTable.svelte @@ -1,5 +1,6 @@ - {description} +
+ {description} +
- +
From dec29c51acb558c82189509c5f4d68e8b4a7d381 Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Tue, 31 Dec 2024 09:17:06 +0000 Subject: [PATCH 11/32] :art: Add and update styles (#1611) --- .../components/TaskTables/TaskTable.svelte | 56 ++++++++++++------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/src/lib/components/TaskTables/TaskTable.svelte b/src/lib/components/TaskTables/TaskTable.svelte index 51cea213b..6cb17b820 100644 --- a/src/lib/components/TaskTables/TaskTable.svelte +++ b/src/lib/components/TaskTables/TaskTable.svelte @@ -89,18 +89,21 @@ - {'AtCoder Beginners Contest'} + {'AtCoder Beginners Contest 212 〜'} -
-
+ + + +
+
- Round + Round {#if taskTableIndices.length} {#each taskTableIndices as taskTableIndex} - {taskTableIndex} + {taskTableIndex} {/each} {/if} @@ -109,28 +112,39 @@ {#if contestIds.length && taskTableIndices.length} {#each contestIds as contestId} - - {getContestNameLabel(contestId)} + + + {getContestNameLabel(contestId).replace('ABC ', '')} {#each taskTableIndices as taskIndex} - + {#if taskTable[contestId][taskIndex]} -
- + + +
+ +
+ +
+
+ {'更新'} +
+
+ {'詳細'} +
- - {'更新'} - {'詳細'} {/if} {/each} From fd9d7f0fa520fb76fd1389364af5ada97a35d7a4 Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Tue, 31 Dec 2024 11:25:47 +0000 Subject: [PATCH 12/32] :art: Enable to hide icon (#1611) --- .../components/SubmissionStatus/SubmissionStatusImage.svelte | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lib/components/SubmissionStatus/SubmissionStatusImage.svelte b/src/lib/components/SubmissionStatus/SubmissionStatusImage.svelte index c3ad796e4..4190cd5ba 100644 --- a/src/lib/components/SubmissionStatus/SubmissionStatusImage.svelte +++ b/src/lib/components/SubmissionStatus/SubmissionStatusImage.svelte @@ -5,6 +5,7 @@ import type { TaskResult } from '$lib/types/task'; + export let isHideImage: boolean = false; export let taskResult: TaskResult; export let isLoggedIn: boolean; @@ -17,7 +18,9 @@ } -{imageAlt} +{#if !isHideImage} + {imageAlt} +{/if} {#if isLoggedIn}
From 2f366090530a4aaa9bc9190ff9c43a0677c12936 Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Tue, 31 Dec 2024 11:26:44 +0000 Subject: [PATCH 13/32] :art: Add submission status icon and colors (#1611) --- .../components/TaskTables/TaskTable.svelte | 27 ++++++++++++++++--- src/routes/problems/+page.svelte | 2 +- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/lib/components/TaskTables/TaskTable.svelte b/src/lib/components/TaskTables/TaskTable.svelte index 6cb17b820..ac050bf0d 100644 --- a/src/lib/components/TaskTables/TaskTable.svelte +++ b/src/lib/components/TaskTables/TaskTable.svelte @@ -16,11 +16,14 @@ import ExternalLinkWrapper from '$lib/components/ExternalLinkWrapper.svelte'; import GradeLabel from '$lib/components/GradeLabel.svelte'; + import SubmissionStatusImage from '$lib/components/SubmissionStatus/SubmissionStatusImage.svelte'; import { classifyContest, getContestNameLabel } from '$lib/utils/contest'; import { getTaskTableHeaderName, getTaskUrl, removeTaskIndexFromTitle } from '$lib/utils/task'; + import { getBackgroundColorFrom } from '$lib/services/submission_status'; export let taskResults: TaskResults; + export let isLoggedIn: boolean; let selectedTaskResults: TaskResults; let contestIds: Array; @@ -78,6 +81,16 @@ return table; } + + function getBackgroundColor(taskResult: TaskResult): string { + const statusName = taskResult?.status_name; + + if (taskResult && statusName !== 'ns') { + return getBackgroundColorFrom(statusName); + } + + return ''; + } @@ -96,7 +109,7 @@ -
+
Round @@ -118,9 +131,12 @@ {#each taskTableIndices as taskIndex} - + {#if taskTable[contestId][taskIndex]} + +
- {'更新'} +
{'詳細'} diff --git a/src/routes/problems/+page.svelte b/src/routes/problems/+page.svelte index 9831286b6..65e4fe22b 100644 --- a/src/routes/problems/+page.svelte +++ b/src/routes/problems/+page.svelte @@ -30,7 +30,7 @@ {#if isAdmin} - + {/if} From a7218b9c0cf562d437d3f699a0b88c31d0bfce63 Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Tue, 31 Dec 2024 11:27:45 +0000 Subject: [PATCH 14/32] =?UTF-8?q?=E2=9C=A8=20Add=20helper=20method=20(#161?= =?UTF-8?q?1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/utils/task.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/lib/utils/task.ts b/src/lib/utils/task.ts index 758fd5900..362649649 100644 --- a/src/lib/utils/task.ts +++ b/src/lib/utils/task.ts @@ -1,4 +1,5 @@ import type { UrlGenerator, UrlGenerators } from '$lib/types/url'; +import { ContestType } from '$lib/types/contest'; import { type TaskResult, type TaskResults, TaskGrade, type TaskGrades } from '$lib/types/task'; import { type WorkBookTaskBase } from '$lib/types/workbook'; import { ATCODER_BASE_CONTEST_URL, AOJ_TASKS_URL } from '$lib/constants/urls'; @@ -92,6 +93,18 @@ export function compareByContestIdAndTaskId(first: TaskResult, second: TaskResul return first.task_table_index.localeCompare(second.task_table_index); } +// See: +// https://github.com/kenkoooo/AtCoderProblems/blob/master/atcoder-problems-frontend/src/pages/TablePage/AtCoderRegularTable.tsx +export const getTaskTableHeaderName = (contestType: ContestType, taskResult: TaskResult) => { + if (contestType === ContestType.ABC && taskResult.task_table_index === 'H') { + return 'H/Ex'; + } else if (taskResult.task_table_index === 'Ex') { + return 'H/Ex'; + } + + return taskResult.task_table_index; +}; + // 問題一覧や問題集の詳細ページでは、AtCoder ProblemsのAPIから取得したタイトルからプレフィックス(A., B., ..., G. など)を非表示にする // 理由: 問題を解くときに、プレフィックスからの先入観を受けないようにするため // その他: プレフィックスは、同じテーブルの出典に記載する From 2969d7564d90921ff8f88d4fda3309c849ae24ef Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Tue, 31 Dec 2024 11:46:23 +0000 Subject: [PATCH 15/32] :art: Add and update styles (#1611) --- src/lib/components/TaskTables/TaskTable.svelte | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/lib/components/TaskTables/TaskTable.svelte b/src/lib/components/TaskTables/TaskTable.svelte index ac050bf0d..1f6df3f10 100644 --- a/src/lib/components/TaskTables/TaskTable.svelte +++ b/src/lib/components/TaskTables/TaskTable.svelte @@ -132,7 +132,9 @@ {#each taskTableIndices as taskIndex} {#if taskTable[contestId][taskIndex]} @@ -150,11 +152,12 @@ /> -
+
-
+ +
-
+
{'詳細'}
From f654aea80e49f12025597511dcafdc5c8466cc1b Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Wed, 1 Jan 2025 12:28:48 +0000 Subject: [PATCH 16/32] :art: Fix title position and size (#1611) --- .../components/TaskTables/TaskTable.svelte | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/lib/components/TaskTables/TaskTable.svelte b/src/lib/components/TaskTables/TaskTable.svelte index 1f6df3f10..f31979e71 100644 --- a/src/lib/components/TaskTables/TaskTable.svelte +++ b/src/lib/components/TaskTables/TaskTable.svelte @@ -132,24 +132,24 @@ {#each taskTableIndices as taskIndex} {#if taskTable[contestId][taskIndex]} - +
+ +
From 026409abacbc90c3c92c8235556b4e5fbf32591d Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Wed, 1 Jan 2025 12:52:06 +0000 Subject: [PATCH 17/32] :art: Fix icon size (#1611) --- src/lib/components/GradeLabel.svelte | 4 +++- src/lib/components/TaskTables/TaskTable.svelte | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/lib/components/GradeLabel.svelte b/src/lib/components/GradeLabel.svelte index 9d0e6be27..4de0d01e6 100644 --- a/src/lib/components/GradeLabel.svelte +++ b/src/lib/components/GradeLabel.svelte @@ -3,6 +3,8 @@ import { TaskGrade } from '$lib/types/task'; export let taskGrade: TaskGrade | string; + export let defaultPadding: number = 1; + export let defaultWidth: number = 10; $: grade = getTaskGradeLabel(taskGrade); $: gradeColor = getTaskGradeColor(taskGrade); @@ -10,7 +12,7 @@
diff --git a/src/lib/components/TaskTables/TaskTable.svelte b/src/lib/components/TaskTables/TaskTable.svelte index f31979e71..c87bd78bb 100644 --- a/src/lib/components/TaskTables/TaskTable.svelte +++ b/src/lib/components/TaskTables/TaskTable.svelte @@ -153,7 +153,11 @@
- +
From 4f96b9dbf116a6e95768f23bfa2f4f28c02c1693 Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Wed, 1 Jan 2025 13:15:11 +0000 Subject: [PATCH 18/32] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Split=20image=20and?= =?UTF-8?q?=20text=20(#1611)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SubmissionStatus/IconForUpdating.svelte | 18 ++++++++++++++++++ .../SubmissionStatusImage.svelte | 5 +---- src/lib/components/TaskTables/TaskTable.svelte | 8 ++------ 3 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 src/lib/components/SubmissionStatus/IconForUpdating.svelte diff --git a/src/lib/components/SubmissionStatus/IconForUpdating.svelte b/src/lib/components/SubmissionStatus/IconForUpdating.svelte new file mode 100644 index 000000000..62bef1cb9 --- /dev/null +++ b/src/lib/components/SubmissionStatus/IconForUpdating.svelte @@ -0,0 +1,18 @@ + + + + +{#if isLoggedIn} +
+
+ {'更新'} +
+ + +
+{/if} diff --git a/src/lib/components/SubmissionStatus/SubmissionStatusImage.svelte b/src/lib/components/SubmissionStatus/SubmissionStatusImage.svelte index 4190cd5ba..c3ad796e4 100644 --- a/src/lib/components/SubmissionStatus/SubmissionStatusImage.svelte +++ b/src/lib/components/SubmissionStatus/SubmissionStatusImage.svelte @@ -5,7 +5,6 @@ import type { TaskResult } from '$lib/types/task'; - export let isHideImage: boolean = false; export let taskResult: TaskResult; export let isLoggedIn: boolean; @@ -18,9 +17,7 @@ } -{#if !isHideImage} - {imageAlt} -{/if} +{imageAlt} {#if isLoggedIn}
diff --git a/src/lib/components/TaskTables/TaskTable.svelte b/src/lib/components/TaskTables/TaskTable.svelte index c87bd78bb..ac1a53a68 100644 --- a/src/lib/components/TaskTables/TaskTable.svelte +++ b/src/lib/components/TaskTables/TaskTable.svelte @@ -16,7 +16,7 @@ import ExternalLinkWrapper from '$lib/components/ExternalLinkWrapper.svelte'; import GradeLabel from '$lib/components/GradeLabel.svelte'; - import SubmissionStatusImage from '$lib/components/SubmissionStatus/SubmissionStatusImage.svelte'; + import IconForUpdating from '$lib/components/SubmissionStatus/IconForUpdating.svelte'; import { classifyContest, getContestNameLabel } from '$lib/utils/contest'; import { getTaskTableHeaderName, getTaskUrl, removeTaskIndexFromTitle } from '$lib/utils/task'; @@ -163,11 +163,7 @@
- +
{'詳細'} From 47aff4b5e01c8e8030d142f6c91260237adb9cdf Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Wed, 1 Jan 2025 13:48:13 +0000 Subject: [PATCH 19/32] :art: Fix layout (#1611) --- .../components/SubmissionStatus/IconForUpdating.svelte | 2 +- src/lib/components/TaskTables/TaskTable.svelte | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/lib/components/SubmissionStatus/IconForUpdating.svelte b/src/lib/components/SubmissionStatus/IconForUpdating.svelte index 62bef1cb9..6b9af9aa9 100644 --- a/src/lib/components/SubmissionStatus/IconForUpdating.svelte +++ b/src/lib/components/SubmissionStatus/IconForUpdating.svelte @@ -8,7 +8,7 @@ {#if isLoggedIn} -
+
{'更新'}
diff --git a/src/lib/components/TaskTables/TaskTable.svelte b/src/lib/components/TaskTables/TaskTable.svelte index ac1a53a68..651be6ceb 100644 --- a/src/lib/components/TaskTables/TaskTable.svelte +++ b/src/lib/components/TaskTables/TaskTable.svelte @@ -152,7 +152,7 @@
-
+
-
-
+
+
-
+ + +
{'詳細'}
From 6923c6755f56a6933c18ebbfaf1a9ba127bcdd71 Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Wed, 1 Jan 2025 14:26:26 +0000 Subject: [PATCH 20/32] =?UTF-8?q?=E2=9C=A8=20Enable=20to=20update=20submis?= =?UTF-8?q?sion=20status=20from=20task=20table=20(#1611)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/TaskTables/TaskTable.svelte | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/lib/components/TaskTables/TaskTable.svelte b/src/lib/components/TaskTables/TaskTable.svelte index 651be6ceb..22b028a66 100644 --- a/src/lib/components/TaskTables/TaskTable.svelte +++ b/src/lib/components/TaskTables/TaskTable.svelte @@ -16,6 +16,7 @@ import ExternalLinkWrapper from '$lib/components/ExternalLinkWrapper.svelte'; import GradeLabel from '$lib/components/GradeLabel.svelte'; + import UpdatingModal from '$lib/components/SubmissionStatus/UpdatingModal.svelte'; import IconForUpdating from '$lib/components/SubmissionStatus/IconForUpdating.svelte'; import { classifyContest, getContestNameLabel } from '$lib/utils/contest'; @@ -29,14 +30,16 @@ let contestIds: Array; let taskTableIndices: Array; let taskTable: Record>; + let updatingModal: UpdatingModal; // TODO: 任意のコンテスト種別に拡張 - $: selectedTaskResults = filterTaskResultsByContestType(fromABC212_Onwards); + $: selectedTaskResults = filterTaskResultsByContestType(taskResults, fromABC212_Onwards); $: contestIds = getContestIds(selectedTaskResults); $: taskTableIndices = getTaskTableIndices(selectedTaskResults, ContestType.ABC); $: taskTable = prepareTaskTable(selectedTaskResults, ContestType.ABC); function filterTaskResultsByContestType( + taskResults: TaskResults, condition: (taskResult: TaskResult) => boolean, ): TaskResults { return taskResults.filter(condition); @@ -97,7 +100,9 @@ - + @@ -162,9 +167,14 @@
-
+
+
@@ -180,3 +190,5 @@
+ + From a34c7d59e8097012b50d4ec7b4dd0ccc7e9f5fce Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Thu, 2 Jan 2025 02:30:46 +0000 Subject: [PATCH 21/32] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Extract=20component?= =?UTF-8?q?=20(#1611)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/TaskTables/TaskTable.svelte | 54 +++---------------- .../TaskTables/TaskTableBodyCell.svelte | 48 +++++++++++++++++ 2 files changed, 56 insertions(+), 46 deletions(-) create mode 100644 src/lib/components/TaskTables/TaskTableBodyCell.svelte diff --git a/src/lib/components/TaskTables/TaskTable.svelte b/src/lib/components/TaskTables/TaskTable.svelte index 22b028a66..5cae6c5c4 100644 --- a/src/lib/components/TaskTables/TaskTable.svelte +++ b/src/lib/components/TaskTables/TaskTable.svelte @@ -14,13 +14,11 @@ import type { TaskResults, TaskResult } from '$lib/types/task'; import { ContestType } from '$lib/types/contest'; - import ExternalLinkWrapper from '$lib/components/ExternalLinkWrapper.svelte'; - import GradeLabel from '$lib/components/GradeLabel.svelte'; import UpdatingModal from '$lib/components/SubmissionStatus/UpdatingModal.svelte'; - import IconForUpdating from '$lib/components/SubmissionStatus/IconForUpdating.svelte'; + import TaskTableBodyCell from '$lib/components/TaskTables/TaskTableBodyCell.svelte'; import { classifyContest, getContestNameLabel } from '$lib/utils/contest'; - import { getTaskTableHeaderName, getTaskUrl, removeTaskIndexFromTitle } from '$lib/utils/task'; + import { getTaskTableHeaderName } from '$lib/utils/task'; import { getBackgroundColorFrom } from '$lib/services/submission_status'; export let taskResults: TaskResults; @@ -126,7 +124,7 @@ {/if} - + {#if contestIds.length && taskTableIndices.length} {#each contestIds as contestId} @@ -140,47 +138,11 @@ class="px-2 py-2 border {getBackgroundColor(taskTable[contestId][taskIndex])}" > {#if taskTable[contestId][taskIndex]} - - -
- -
- - -
- -
- - -
- - - -
- {'詳細'} -
-
+ {/if} {/each} diff --git a/src/lib/components/TaskTables/TaskTableBodyCell.svelte b/src/lib/components/TaskTables/TaskTableBodyCell.svelte new file mode 100644 index 000000000..46535ce5d --- /dev/null +++ b/src/lib/components/TaskTables/TaskTableBodyCell.svelte @@ -0,0 +1,48 @@ + + + +
+ +
+ + +
+ +
+ + +
+ + + +
+ {'詳細'} +
+
From dd7c19a140fd491c33d3e433aebc9c209908c4f4 Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Fri, 3 Jan 2025 06:59:35 +0000 Subject: [PATCH 22/32] :art: Improve layout (#1611) --- .../SubmissionStatus/IconForUpdating.svelte | 2 +- src/lib/components/TaskTables/TaskTable.svelte | 11 +++++++---- .../TaskTables/TaskTableBodyCell.svelte | 18 ++++++++---------- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/lib/components/SubmissionStatus/IconForUpdating.svelte b/src/lib/components/SubmissionStatus/IconForUpdating.svelte index 6b9af9aa9..352775538 100644 --- a/src/lib/components/SubmissionStatus/IconForUpdating.svelte +++ b/src/lib/components/SubmissionStatus/IconForUpdating.svelte @@ -13,6 +13,6 @@ {'更新'} - + {/if} diff --git a/src/lib/components/TaskTables/TaskTable.svelte b/src/lib/components/TaskTables/TaskTable.svelte index 5cae6c5c4..8c31990bf 100644 --- a/src/lib/components/TaskTables/TaskTable.svelte +++ b/src/lib/components/TaskTables/TaskTable.svelte @@ -115,7 +115,7 @@
- Round + Round {#if taskTableIndices.length} {#each taskTableIndices as taskTableIndex} @@ -127,15 +127,18 @@ {#if contestIds.length && taskTableIndices.length} {#each contestIds as contestId} - - + + {getContestNameLabel(contestId).replace('ABC ', '')} {#each taskTableIndices as taskIndex} {#if taskTable[contestId][taskIndex]} -
+
- -
- -
+
+ + - -
+ From a40715d35eff97f11a1f610d0f9b0bbd4b1201c9 Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Fri, 3 Jan 2025 11:35:44 +0000 Subject: [PATCH 25/32] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Extract=20method=20(?= =?UTF-8?q?#1611)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/components/TaskTables/TaskTable.svelte | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/lib/components/TaskTables/TaskTable.svelte b/src/lib/components/TaskTables/TaskTable.svelte index 8c31990bf..b7ba02f1b 100644 --- a/src/lib/components/TaskTables/TaskTable.svelte +++ b/src/lib/components/TaskTables/TaskTable.svelte @@ -92,6 +92,13 @@ return ''; } + + function getBodyCellClasses(contestId: string, taskIndex: string): string { + const baseClasses = 'w-1/2 xs:w-1/3 sm:w-1/4 md:w-1/5 lg:w-1/6 px-1 py-1 border'; + const backgroundColor = getBackgroundColor(taskTable[contestId][taskIndex]); + + return `${baseClasses} ${backgroundColor}`; + } @@ -127,7 +134,7 @@ {#if contestIds.length && taskTableIndices.length} {#each contestIds as contestId} - + {getContestNameLabel(contestId).replace('ABC ', '')} @@ -136,9 +143,7 @@ {#each taskTableIndices as taskIndex} {#if taskTable[contestId][taskIndex]} Date: Fri, 3 Jan 2025 11:45:07 +0000 Subject: [PATCH 26/32] :art: Improve styles (#1611) --- src/lib/components/TaskTables/TaskTableBodyCell.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/TaskTables/TaskTableBodyCell.svelte b/src/lib/components/TaskTables/TaskTableBodyCell.svelte index 418023412..830b64f08 100644 --- a/src/lib/components/TaskTables/TaskTableBodyCell.svelte +++ b/src/lib/components/TaskTables/TaskTableBodyCell.svelte @@ -32,7 +32,7 @@
- Round + Round {#if taskTableIndices.length} {#each taskTableIndices as taskTableIndex} - {taskTableIndex} + {taskTableIndex} {/each} {/if} @@ -147,7 +162,7 @@ - {getContestNameLabel(contestId).replace('ABC ', '')} + {getContestNameLabelForTaskTable(contestId)} {#each taskTableIndices as taskIndex} From da519fa3bd926d7adb293ffb6584bf7615e24710 Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Fri, 3 Jan 2025 13:09:47 +0000 Subject: [PATCH 31/32] =?UTF-8?q?=F0=9F=93=96=20Update=20docs=20(#1611)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/lib/utils/test_cases/task_table_header_name.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/test/lib/utils/test_cases/task_table_header_name.ts b/src/test/lib/utils/test_cases/task_table_header_name.ts index 4304834b5..382de06d3 100644 --- a/src/test/lib/utils/test_cases/task_table_header_name.ts +++ b/src/test/lib/utils/test_cases/task_table_header_name.ts @@ -1,7 +1,9 @@ import type { TaskResult } from '$lib/types/task'; -// For the default task result, the updated_at field is set to the Unix epoch. -// why: only use the parameter task_table_index +// Default task result with minimal initialization. +// Most fields are empty strings as they're not relevant for these tests. +// The updated_at field is set to Unix epoch as we only care about task_table_index +// and task_id for header name testing. const defaultTaskResult: TaskResult = { is_ac: true, user_id: '', @@ -19,6 +21,9 @@ const defaultTaskResult: TaskResult = { /** * Creates a new TaskResult using defaultTaskResult as a base, overriding the taskId and taskTableIndex. + * @param taskId - The ID of the task (e.g., 'abc212') + * @param taskTableIndex - The index of the task in the table (e.g., 'A', 'B', 'Ex') + * @returns A new TaskResult object with the specified taskId and taskTableIndex */ function createTaskResultWithTaskTableIndex(taskId: string, taskTableIndex: string): TaskResult { return { From f6f55ba02e0b68fdb1713bb0447b910db8ab3b75 Mon Sep 17 00:00:00 2001 From: Kato Hiroki Date: Fri, 3 Jan 2025 13:11:32 +0000 Subject: [PATCH 32/32] :art: Add accessibility attributes (#1611) --- src/lib/components/TaskTables/TaskTable.svelte | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/lib/components/TaskTables/TaskTable.svelte b/src/lib/components/TaskTables/TaskTable.svelte index 67660ebcd..275430fc6 100644 --- a/src/lib/components/TaskTables/TaskTable.svelte +++ b/src/lib/components/TaskTables/TaskTable.svelte @@ -127,8 +127,11 @@ - -