@xcpcio/board-app 0.52.0 → 0.53.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/404.html +1 -1
- package/dist/assets/{Board-f05c0366.css → Board--Fj0eIxn.css} +1 -1
- package/dist/assets/Board-DVycq7Hb.js +1 -0
- package/dist/assets/ContestStateBadge-SaSIRVZw.js +1 -0
- package/dist/assets/ContestStateBadge-yOXRkC0c.css +1 -0
- package/dist/assets/DataSourceInput.vue_vue_type_script_setup_true_lang-ButnX5NG.js +1 -0
- package/dist/assets/Footer.vue_vue_type_script_setup_true_lang-DtriOyxw.js +1 -0
- package/dist/assets/NavBar-CTO09sVc.js +1 -0
- package/dist/assets/NavBar-K1-1c5jR.css +1 -0
- package/dist/assets/RightArrowIcon-93I3m1Dg.js +1 -0
- package/dist/assets/TheInput.vue_vue_type_script_setup_true_lang-Bstp0Uq6.js +1 -0
- package/dist/assets/Tooltip-VVqtpO6L.css +1 -0
- package/dist/assets/Tooltip.vue_vue_type_script_setup_true_lang-IVJ6kO8Y.js +27 -0
- package/dist/assets/{_...all_-85910c2a.js → _...all_-CajB1u6j.js} +2 -2
- package/dist/assets/_...all_-DkFLHLY4.js +1 -0
- package/dist/assets/_name_-CKcXFscu.js +1 -0
- package/dist/assets/_plugin-vue_export-helper-DlAUqK2U.js +1 -0
- package/dist/assets/about-Bt1E61e1.js +5 -0
- package/dist/assets/board-BuZxK-RS.js +1 -0
- package/dist/assets/board-layout-BDGSSQnD.js +1 -0
- package/dist/assets/constant-D5AETBoS.js +1 -0
- package/dist/assets/default-g2FZdb_E.js +1 -0
- package/dist/assets/en-DDlXf_8q.js +1 -0
- package/dist/assets/headless-AGI21K3d.js +1 -0
- package/dist/assets/home-CIo2SGx9.js +1 -0
- package/dist/assets/index-B0AiC33S.js +1 -0
- package/dist/assets/index-BJlHNlHk.js +198 -0
- package/dist/assets/{index-241beb5a.css → index-BP90wE2A.css} +1 -1
- package/dist/assets/index-BVqqkkh8.js +25 -0
- package/dist/assets/index-BerApwlM.css +1 -0
- package/dist/assets/index-Bqug296L.js +50 -0
- package/dist/assets/index-ByBDbX-Q.js +1 -0
- package/dist/assets/index-CDb5YJlm.js +1 -0
- package/dist/assets/index-Ci3FURub.css +5 -0
- package/dist/assets/index-CsD1PvIl.js +5 -0
- package/dist/assets/{index-c827bc8f.css → index-DRiWpQTB.css} +1 -1
- package/dist/assets/index-De6dfmWB.css +1 -0
- package/dist/assets/index-DtIE9gnq.js +1 -0
- package/dist/assets/index-eEOWm26O.js +1 -0
- package/dist/assets/index-layout-B9ZsHAPN.js +1 -0
- package/dist/assets/pagination-SF0231GF.js +3 -0
- package/dist/assets/route-block-B_A1xBdJ.js +1 -0
- package/dist/assets/test-BmgsMNrG.js +1 -0
- package/dist/assets/use-vmodel-DKmkNt1c.js +1 -0
- package/dist/assets/useQueryBoardData-MYqwKv9X.js +1 -0
- package/dist/assets/user-DVMgLOCG.js +1 -0
- package/dist/assets/virtual_pwa-register-G08q8i_v.js +1 -0
- package/dist/assets/workbox-window.prod.es5-D5gOYdM7.js +2 -0
- package/dist/assets/zh-CN-CNJkghp4.js +1 -0
- package/dist/index.html +1 -1
- package/dist/sw.js +1 -1
- package/package.json +51 -49
- package/src/auto-imports.d.ts +4 -2
- package/src/components/Balloon.vue +3 -2
- package/src/components/BalloonBlock.vue +1 -1
- package/src/components/ContestIndexUI.vue +3 -3
- package/src/components/Countdown.vue +3 -3
- package/src/components/NavBar.vue +1 -1
- package/src/components/Resolver.vue +112 -27
- package/src/components/SearchInput.vue +1 -1
- package/src/components/TheCheckbox.vue +1 -1
- package/src/components/TheCounter.vue +1 -1
- package/src/components/TheInput.vue +3 -3
- package/src/components/battle-of-giants/GiantsOptions.vue +5 -5
- package/src/components/battle-of-giants/GiantsScoreBoard.vue +1 -1
- package/src/components/board/AnimatedSubmissionBlock.vue +2 -2
- package/src/components/board/AnimatedSubmissionsModal.vue +1 -1
- package/src/components/board/Badge.vue +2 -2
- package/src/components/board/Board.vue +8 -8
- package/src/components/board/BoardTab.vue +1 -1
- package/src/components/board/BottomStatistics.vue +1 -1
- package/src/components/board/ContestStateBadge.vue +3 -3
- package/src/components/board/Export.vue +5 -5
- package/src/components/board/Modal.vue +4 -4
- package/src/components/board/ModalMenu.vue +2 -2
- package/src/components/board/OptionsModal.vue +4 -4
- package/src/components/board/ProblemBlock.vue +2 -2
- package/src/components/board/ProblemInfoModal.vue +3 -3
- package/src/components/board/Progress.vue +12 -9
- package/src/components/board/SecondLevelMenu.vue +2 -2
- package/src/components/board/Standings.vue +5 -5
- package/src/components/board/Statistics.vue +3 -3
- package/src/components/board/SubmissionsTable.vue +15 -15
- package/src/components/board/SubmissionsTableModal.vue +4 -4
- package/src/components/board/TeamAwards.vue +3 -3
- package/src/components/board/TeamInfoModal.vue +5 -5
- package/src/components/board/TeamProblemBlock.vue +5 -5
- package/src/components/board/TeamUI.vue +3 -3
- package/src/components/flowbite/Tooltip.vue +2 -2
- package/src/components/rating/Rating.vue +1 -1
- package/src/components/rating/RatingBadge.vue +1 -1
- package/src/components/rating/RatingIndexUI.vue +3 -3
- package/src/components/rating/RatingInfoModal.vue +4 -4
- package/src/components/rating/RatingTable.vue +4 -4
- package/src/components/rating/RatingUserUI.vue +2 -2
- package/src/components/table/TablePagination.vue +1 -1
- package/src/components.d.ts +1 -1
- package/src/composables/color.ts +2 -2
- package/src/composables/logo/index.ts +1 -1
- package/src/composables/pagination.ts +2 -2
- package/src/composables/rating.ts +1 -1
- package/src/composables/statistics.ts +1 -1
- package/src/composables/type.ts +4 -4
- package/src/composables/useQueryBoardData.ts +3 -2
- package/src/main.ts +9 -8
- package/src/modules/README.md +1 -1
- package/src/modules/i18n.ts +1 -1
- package/src/modules/nprogress.ts +1 -1
- package/src/modules/pinia.ts +1 -1
- package/src/modules/pwa.ts +1 -1
- package/src/modules/toast.ts +2 -2
- package/src/pages/index.vue +6 -6
- package/src/pages/rating/index.vue +2 -2
- package/src/shims.d.ts +10 -8
- package/src/styles/markdown.css +8 -11
- package/src/typed-router.d.ts +33 -0
- package/src/types.ts +1 -1
- package/tsconfig.json +18 -19
- package/vite.config.ts +32 -30
- package/dist/assets/Board-04b0589d.js +0 -1
- package/dist/assets/DataSourceInput.vue_vue_type_script_setup_true_lang-11e5a08c.js +0 -1
- package/dist/assets/TheInput.vue_vue_type_script_setup_true_lang-f91fd6e0.js +0 -1
- package/dist/assets/_...all_-905784b3.js +0 -1
- package/dist/assets/_name_-203db09f.js +0 -1
- package/dist/assets/about-d9d865e0.js +0 -11
- package/dist/assets/board-3f91f491.js +0 -1
- package/dist/assets/board-layout-967802f4.js +0 -1
- package/dist/assets/en-c9a8dbb5.js +0 -1
- package/dist/assets/headless-f3f3253c.js +0 -1
- package/dist/assets/home-3d9e3102.js +0 -1
- package/dist/assets/index-0095f855.js +0 -1
- package/dist/assets/index-1e2a1259.js +0 -236
- package/dist/assets/index-43f8e0d3.css +0 -5
- package/dist/assets/index-86ef642b.js +0 -1
- package/dist/assets/index-accb347c.css +0 -1
- package/dist/assets/index-b97b2d45.js +0 -1
- package/dist/assets/index-d51c6c02.js +0 -1
- package/dist/assets/index-layout-5a67cc99.js +0 -1
- package/dist/assets/pagination-6eac914a.js +0 -3
- package/dist/assets/query-ff21040c.js +0 -1
- package/dist/assets/test-5dd32cac.js +0 -1
- package/dist/assets/user-cd9a56f6.js +0 -1
- package/dist/assets/virtual_pwa-register-ff5720d1.js +0 -1
- package/dist/assets/workbox-window.prod.es5-c46a1faa.js +0 -2
- package/dist/assets/zh-CN-8e545f66.js +0 -1
- /package/dist/assets/{_...all_-c60acc8c.css → _..-8Wh-Y8sB.css} +0 -0
|
@@ -6,8 +6,8 @@ import type { AnimatedSubmissionBlockItem } from "~/composables/type";
|
|
|
6
6
|
import { LastBlockDisplayType } from "~/composables/type";
|
|
7
7
|
|
|
8
8
|
const props = defineProps<{
|
|
9
|
-
item: AnimatedSubmissionBlockItem
|
|
10
|
-
lastBlockDisplayType: LastBlockDisplayType
|
|
9
|
+
item: AnimatedSubmissionBlockItem;
|
|
10
|
+
lastBlockDisplayType: LastBlockDisplayType;
|
|
11
11
|
}>();
|
|
12
12
|
|
|
13
13
|
const item = computed(() => props.item);
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import
|
|
3
|
-
import { useRouteQuery } from "@vueuse/router";
|
|
2
|
+
import type { Contest, Submissions, Teams } from "@xcpcio/core";
|
|
4
3
|
import { onKeyStroke, useDocumentVisibility, useIntervalFn, useNow } from "@vueuse/core";
|
|
4
|
+
import { useRouteQuery } from "@vueuse/router";
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import type { Contest, Submissions, Teams } from "@xcpcio/core";
|
|
6
|
+
import { createContest, createSubmissions, createTeams, getImageSource, getTimeDiff, Rank, RankOptions } from "@xcpcio/core";
|
|
8
7
|
import { ContestState, type Contest as IContest, type Submissions as ISubmissions, type Teams as ITeams } from "@xcpcio/types";
|
|
8
|
+
import _ from "lodash";
|
|
9
9
|
|
|
10
|
-
import { TITLE_SUFFIX } from "~/composables/constant";
|
|
11
10
|
import type { Item } from "~/components/board/SecondLevelMenu.vue";
|
|
11
|
+
import { TITLE_SUFFIX } from "~/composables/constant";
|
|
12
12
|
|
|
13
13
|
const props = defineProps<{
|
|
14
|
-
dataSourceUrl?: string
|
|
14
|
+
dataSourceUrl?: string;
|
|
15
15
|
}>();
|
|
16
16
|
|
|
17
17
|
const route = useRoute();
|
|
@@ -45,7 +45,7 @@ const enableAutoScroll = ref(false);
|
|
|
45
45
|
const routeQueryForBattleOfGiants = useRouteQueryForBattleOfGiants();
|
|
46
46
|
if (
|
|
47
47
|
routeQueryForBattleOfGiants.value !== null
|
|
48
|
-
|
|
48
|
+
&& routeQueryForBattleOfGiants.value !== undefined
|
|
49
49
|
) {
|
|
50
50
|
rankOptions.value.battleOfGiants.FromBase64(routeQueryForBattleOfGiants.value);
|
|
51
51
|
}
|
|
@@ -187,7 +187,7 @@ const group = computed(() => {
|
|
|
187
187
|
});
|
|
188
188
|
|
|
189
189
|
const groupMenuList = computed(() => {
|
|
190
|
-
const res = Array<Item>();
|
|
190
|
+
const res = new Array<Item>();
|
|
191
191
|
|
|
192
192
|
for (const [k, v] of group.value) {
|
|
193
193
|
const item = {
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import type { Rank } from "@xcpcio/core";
|
|
3
|
+
import { CodeforcesGymGhostDATConverter, GeneralExcelConverter, ICPCStandingsCsvConverter } from "@xcpcio/core";
|
|
4
4
|
import FileSaver from "file-saver";
|
|
5
5
|
import sleep from "sleep-promise";
|
|
6
6
|
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
7
|
+
import { ModelSelect } from "vue-search-select";
|
|
8
|
+
import { useToast } from "vue-toast-notification";
|
|
9
9
|
|
|
10
10
|
const props = defineProps<{
|
|
11
|
-
rank: Rank
|
|
11
|
+
rank: Rank;
|
|
12
12
|
}>();
|
|
13
13
|
|
|
14
14
|
const $toast = useToast();
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
import { useMagicKeys } from "@vueuse/core";
|
|
3
3
|
|
|
4
4
|
const props = defineProps<{
|
|
5
|
-
isHidden: boolean
|
|
5
|
+
isHidden: boolean;
|
|
6
6
|
|
|
7
|
-
title?: string
|
|
8
|
-
width?: string
|
|
9
|
-
mt?: string
|
|
7
|
+
title?: string;
|
|
8
|
+
width?: string;
|
|
9
|
+
mt?: string;
|
|
10
10
|
}>();
|
|
11
11
|
|
|
12
12
|
const emit = defineEmits(["update:isHidden"]);
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
+
import type { Rank, RankOptions, SelectOptionItem } from "@xcpcio/core";
|
|
2
3
|
import _ from "lodash";
|
|
3
4
|
import { MultiSelect } from "vue-search-select";
|
|
4
|
-
import type { Rank, RankOptions, SelectOptionItem } from "@xcpcio/core";
|
|
5
5
|
|
|
6
6
|
const props = defineProps<{
|
|
7
|
-
isHidden: boolean
|
|
7
|
+
isHidden: boolean;
|
|
8
8
|
|
|
9
|
-
rank: Rank
|
|
10
|
-
rankOptions: RankOptions
|
|
9
|
+
rank: Rank;
|
|
10
|
+
rankOptions: RankOptions;
|
|
11
11
|
}>();
|
|
12
12
|
|
|
13
13
|
const emit = defineEmits([
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
import type { Problem, Rank } from "@xcpcio/core";
|
|
3
3
|
|
|
4
4
|
const props = defineProps<{
|
|
5
|
-
isHidden: boolean
|
|
5
|
+
isHidden: boolean;
|
|
6
6
|
|
|
7
|
-
rank: Rank
|
|
8
|
-
problem: Problem
|
|
7
|
+
rank: Rank;
|
|
8
|
+
problem: Problem;
|
|
9
9
|
}>();
|
|
10
10
|
|
|
11
11
|
const emit = defineEmits(["update:isHidden"]);
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { ContestState } from "@xcpcio/types";
|
|
3
|
-
import { useRouteQuery } from "@vueuse/router";
|
|
4
2
|
import type { Rank, RankOptions } from "@xcpcio/core";
|
|
3
|
+
import { useRouteQuery } from "@vueuse/router";
|
|
5
4
|
import { createDayJS, getTimeDiff } from "@xcpcio/core";
|
|
5
|
+
import { ContestState } from "@xcpcio/types";
|
|
6
6
|
|
|
7
7
|
const props = defineProps<{
|
|
8
|
-
width: number
|
|
9
|
-
state: ContestState
|
|
10
|
-
needScroll?: boolean
|
|
11
|
-
rank?: Rank
|
|
12
|
-
rankOptions?: RankOptions
|
|
13
|
-
elapsedTime?: string
|
|
8
|
+
width: number;
|
|
9
|
+
state: ContestState;
|
|
10
|
+
needScroll?: boolean;
|
|
11
|
+
rank?: Rank;
|
|
12
|
+
rankOptions?: RankOptions;
|
|
13
|
+
elapsedTime?: string;
|
|
14
14
|
}>();
|
|
15
15
|
const emit = defineEmits(["update:rank-options"]);
|
|
16
16
|
|
|
@@ -33,7 +33,10 @@ const barClass = computed(() => {
|
|
|
33
33
|
return "am-progress-bar-danger";
|
|
34
34
|
case ContestState.FINISHED:
|
|
35
35
|
return "am-progress-bar-primary";
|
|
36
|
+
case ContestState.PAUSED:
|
|
37
|
+
return "am-progress-bar-danger";
|
|
36
38
|
}
|
|
39
|
+
return "";
|
|
37
40
|
});
|
|
38
41
|
|
|
39
42
|
const pauseUpdate = ref(false);
|
|
@@ -105,7 +108,7 @@ function startDrag(event: MouseEvent) {
|
|
|
105
108
|
progressRatio.value = dragWidth.value;
|
|
106
109
|
rankOptions.value?.setWidth(dragWidth.value, props.rank!.contest);
|
|
107
110
|
} else {
|
|
108
|
-
// eslint-disable-next-line
|
|
111
|
+
// eslint-disable-next-line ts/ban-ts-comment
|
|
109
112
|
// @ts-expect-error
|
|
110
113
|
progressRatio.value = undefined;
|
|
111
114
|
rankOptions.value?.disableFilterSubmissionByTimestamp();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { useRouteQuery } from "@vueuse/router";
|
|
3
2
|
import type { Lang } from "@xcpcio/types";
|
|
3
|
+
import { useRouteQuery } from "@vueuse/router";
|
|
4
4
|
|
|
5
5
|
export interface Item {
|
|
6
6
|
title?: string;
|
|
@@ -21,7 +21,7 @@ const props = defineProps<{
|
|
|
21
21
|
currentItem: string;
|
|
22
22
|
queryParamName: string;
|
|
23
23
|
reverseOrder?: boolean;
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
onChange?: (current: string) => void;
|
|
26
26
|
}>();
|
|
27
27
|
|
|
@@ -3,7 +3,7 @@ import type { Rank } from "@xcpcio/core";
|
|
|
3
3
|
import { GiantsType, Team } from "@xcpcio/core";
|
|
4
4
|
|
|
5
5
|
const props = defineProps<{
|
|
6
|
-
rank: Rank
|
|
6
|
+
rank: Rank;
|
|
7
7
|
}>();
|
|
8
8
|
|
|
9
9
|
const { t } = useI18n();
|
|
@@ -31,8 +31,8 @@ const filterTeams = computed(() => {
|
|
|
31
31
|
});
|
|
32
32
|
|
|
33
33
|
interface GiantTeam {
|
|
34
|
-
team: Team
|
|
35
|
-
giantsType: GiantsType
|
|
34
|
+
team: Team;
|
|
35
|
+
giantsType: GiantsType;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
const giantTeams = computed(() => {
|
|
@@ -49,7 +49,7 @@ const giantTeams = computed(() => {
|
|
|
49
49
|
const giantsType = (() => {
|
|
50
50
|
if (
|
|
51
51
|
blueTeam.filterOrganizationMap.has(t.organization)
|
|
52
|
-
|
|
52
|
+
|| blueTeam.filterTeamMap.has(t.id)
|
|
53
53
|
) {
|
|
54
54
|
if (blueCnt >= battleOfGiants.topX) {
|
|
55
55
|
return null;
|
|
@@ -61,7 +61,7 @@ const giantTeams = computed(() => {
|
|
|
61
61
|
|
|
62
62
|
if (
|
|
63
63
|
redTeam.filterOrganizationMap.has(t.organization)
|
|
64
|
-
|
|
64
|
+
|| redTeam.filterTeamMap.has(t.id)
|
|
65
65
|
) {
|
|
66
66
|
if (redCnt >= battleOfGiants.topX) {
|
|
67
67
|
return null;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { Chart } from "highcharts-vue";
|
|
3
|
-
|
|
4
2
|
import type { Rank } from "@xcpcio/core";
|
|
5
3
|
|
|
4
|
+
import { Chart } from "highcharts-vue";
|
|
5
|
+
|
|
6
6
|
const props = defineProps<{
|
|
7
|
-
rank: Rank
|
|
7
|
+
rank: Rank;
|
|
8
8
|
}>();
|
|
9
9
|
|
|
10
10
|
const { t } = useI18n();
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { MultiSelect } from "vue-search-select";
|
|
3
|
-
|
|
4
2
|
import type { Rank, SelectOptionItem, Submissions } from "@xcpcio/core";
|
|
5
|
-
|
|
3
|
+
|
|
6
4
|
import type { SubmissionReaction, SubmissionStatus } from "@xcpcio/types";
|
|
5
|
+
import { Submission } from "@xcpcio/core";
|
|
7
6
|
import { SubmissionStatusToString } from "@xcpcio/types";
|
|
7
|
+
import { MultiSelect } from "vue-search-select";
|
|
8
8
|
|
|
9
9
|
import { Pagination } from "~/composables/pagination";
|
|
10
10
|
|
|
@@ -18,18 +18,18 @@ interface FilterOptions {
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
interface EnableFilterOptions {
|
|
21
|
-
organization?: boolean
|
|
22
|
-
team?: boolean
|
|
23
|
-
language?: boolean
|
|
24
|
-
status?: boolean
|
|
21
|
+
organization?: boolean;
|
|
22
|
+
team?: boolean;
|
|
23
|
+
language?: boolean;
|
|
24
|
+
status?: boolean;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
const props = defineProps<{
|
|
28
|
-
rank: Rank
|
|
29
|
-
submissions: Submissions
|
|
30
|
-
pageSize?: number
|
|
31
|
-
removeBorder?: boolean
|
|
32
|
-
enableFilter?: EnableFilterOptions
|
|
28
|
+
rank: Rank;
|
|
29
|
+
submissions: Submissions;
|
|
30
|
+
pageSize?: number;
|
|
31
|
+
removeBorder?: boolean;
|
|
32
|
+
enableFilter?: EnableFilterOptions;
|
|
33
33
|
}>();
|
|
34
34
|
|
|
35
35
|
const rank = computed(() => props.rank);
|
|
@@ -145,9 +145,9 @@ const submissions = computed(() => {
|
|
|
145
145
|
const o = filterOptions.value;
|
|
146
146
|
|
|
147
147
|
if (o.orgNames.length === 0
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
148
|
+
&& o.teamIds.length === 0
|
|
149
|
+
&& o.languages.length === 0
|
|
150
|
+
&& o.statuses.length === 0
|
|
151
151
|
) {
|
|
152
152
|
return true;
|
|
153
153
|
}
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
import type { Rank, Team, TeamProblemStatistics } from "@xcpcio/core";
|
|
3
3
|
|
|
4
4
|
const props = defineProps<{
|
|
5
|
-
isHidden: boolean
|
|
5
|
+
isHidden: boolean;
|
|
6
6
|
|
|
7
|
-
rank: Rank
|
|
8
|
-
team: Team
|
|
9
|
-
p: TeamProblemStatistics
|
|
7
|
+
rank: Rank;
|
|
8
|
+
team: Team;
|
|
9
|
+
p: TeamProblemStatistics;
|
|
10
10
|
}>();
|
|
11
11
|
|
|
12
12
|
const emit = defineEmits(["update:isHidden"]);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { MedalType } from "@xcpcio/core";
|
|
3
2
|
import type { Rank, Team } from "@xcpcio/core";
|
|
3
|
+
import { MedalType } from "@xcpcio/core";
|
|
4
4
|
|
|
5
5
|
const props = defineProps<{
|
|
6
|
-
team: Team
|
|
7
|
-
rank: Rank
|
|
6
|
+
team: Team;
|
|
7
|
+
rank: Rank;
|
|
8
8
|
}>();
|
|
9
9
|
|
|
10
10
|
const team = computed(() => props.team);
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { Chart } from "highcharts-vue";
|
|
3
|
-
|
|
4
2
|
import type { Rank, Team } from "@xcpcio/core";
|
|
5
3
|
|
|
4
|
+
import { Chart } from "highcharts-vue";
|
|
5
|
+
|
|
6
6
|
const props = defineProps<{
|
|
7
|
-
isHidden: boolean
|
|
7
|
+
isHidden: boolean;
|
|
8
8
|
|
|
9
|
-
rank: Rank
|
|
10
|
-
team: Team
|
|
9
|
+
rank: Rank;
|
|
10
|
+
team: Team;
|
|
11
11
|
}>();
|
|
12
12
|
|
|
13
13
|
const emit = defineEmits(["update:isHidden"]);
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
import type { Rank, Team, TeamProblemStatistics } from "@xcpcio/core";
|
|
3
3
|
|
|
4
4
|
const props = defineProps<{
|
|
5
|
-
rank: Rank
|
|
6
|
-
team: Team
|
|
7
|
-
p: TeamProblemStatistics
|
|
5
|
+
rank: Rank;
|
|
6
|
+
team: Team;
|
|
7
|
+
p: TeamProblemStatistics;
|
|
8
8
|
}>();
|
|
9
9
|
|
|
10
10
|
const hiddenModal = ref(true);
|
|
@@ -40,8 +40,8 @@ function getProblemShow(p: TeamProblemStatistics): string {
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
if ((p.isSolved && rank.value.contest.statusTimeDisplay.correct)
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
|| (p.isPending && rank.value.contest.statusTimeDisplay.pending)
|
|
44
|
+
|| (p.isWrongAnswer && rank.value.contest.statusTimeDisplay.incorrect)) {
|
|
45
45
|
res += `/${Math.floor(p.lastSubmitTimestamp / 60)}`;
|
|
46
46
|
}
|
|
47
47
|
|
|
@@ -3,9 +3,9 @@ import type { Rank, Team } from "@xcpcio/core";
|
|
|
3
3
|
import { GiantsType, MedalType } from "@xcpcio/core";
|
|
4
4
|
|
|
5
5
|
const props = defineProps<{
|
|
6
|
-
ix: number
|
|
7
|
-
rank: Rank
|
|
8
|
-
team: Team
|
|
6
|
+
ix: number;
|
|
7
|
+
rank: Rank;
|
|
8
|
+
team: Team;
|
|
9
9
|
isFilter?: boolean;
|
|
10
10
|
giantsType?: GiantsType;
|
|
11
11
|
}>();
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { Tooltip } from "flowbite";
|
|
3
2
|
import type { TooltipInterface, TooltipOptions } from "flowbite";
|
|
3
|
+
import { Tooltip } from "flowbite";
|
|
4
4
|
|
|
5
5
|
import "./Tooltip.css";
|
|
6
6
|
|
|
7
7
|
const props = defineProps<{
|
|
8
|
-
placement?: "left" | "right" | "top" | "bottom" | "auto"
|
|
8
|
+
placement?: "left" | "right" | "top" | "bottom" | "auto";
|
|
9
9
|
}>();
|
|
10
10
|
|
|
11
11
|
const tooltipTargetEl = ref(null);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { useElementVisibility } from "@vueuse/core";
|
|
3
|
-
|
|
4
2
|
import type { IRatingIndex } from "@xcpcio/types/index";
|
|
5
3
|
|
|
4
|
+
import { useElementVisibility } from "@vueuse/core";
|
|
5
|
+
|
|
6
6
|
const props = defineProps<{
|
|
7
|
-
ratingIndex: IRatingIndex
|
|
7
|
+
ratingIndex: IRatingIndex;
|
|
8
8
|
}>();
|
|
9
9
|
|
|
10
10
|
const ratingIndex = computed(() => props.ratingIndex);
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { Chart } from "highcharts-vue";
|
|
3
|
-
|
|
4
2
|
import type { RatingUser } from "@xcpcio/core";
|
|
5
3
|
|
|
4
|
+
import { Chart } from "highcharts-vue";
|
|
5
|
+
|
|
6
6
|
import "./rating.less";
|
|
7
7
|
|
|
8
8
|
const props = defineProps<{
|
|
9
|
-
isHidden: boolean
|
|
9
|
+
isHidden: boolean;
|
|
10
10
|
|
|
11
|
-
ratingUser: RatingUser
|
|
11
|
+
ratingUser: RatingUser;
|
|
12
12
|
}>();
|
|
13
13
|
|
|
14
14
|
const emit = defineEmits(["update:isHidden"]);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { MultiSelect } from "vue-search-select";
|
|
3
|
-
|
|
4
2
|
import type { Rating, SelectOptionItem } from "@xcpcio/core";
|
|
5
3
|
|
|
4
|
+
import { MultiSelect } from "vue-search-select";
|
|
5
|
+
|
|
6
6
|
import { Pagination } from "~/composables/pagination";
|
|
7
7
|
|
|
8
8
|
interface FilterOptions {
|
|
@@ -11,7 +11,7 @@ interface FilterOptions {
|
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
const props = defineProps<{
|
|
14
|
-
rating: Rating
|
|
14
|
+
rating: Rating;
|
|
15
15
|
pageSize?: number;
|
|
16
16
|
removeBorder?: boolean;
|
|
17
17
|
}>();
|
|
@@ -75,7 +75,7 @@ const users = computed(() => {
|
|
|
75
75
|
const o = filterOptions.value;
|
|
76
76
|
|
|
77
77
|
if (o.organizations.length === 0
|
|
78
|
-
|
|
78
|
+
&& o.members.length === 0) {
|
|
79
79
|
return true;
|
|
80
80
|
}
|
|
81
81
|
|
package/src/components.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/* eslint-disable */
|
|
2
|
-
/* prettier-ignore */
|
|
3
2
|
// @ts-nocheck
|
|
4
3
|
// Generated by unplugin-vue-components
|
|
5
4
|
// Read more: https://github.com/vuejs/core/pull/3399
|
|
6
5
|
export {}
|
|
7
6
|
|
|
7
|
+
/* prettier-ignore */
|
|
8
8
|
declare module 'vue' {
|
|
9
9
|
export interface GlobalComponents {
|
|
10
10
|
AnimatedSubmissionBlock: typeof import('./components/board/AnimatedSubmissionBlock.vue')['default']
|
package/src/composables/color.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { MedalType } from "@xcpcio/core";
|
|
2
1
|
import type { Submission, Team } from "@xcpcio/core";
|
|
2
|
+
import { MedalType } from "@xcpcio/core";
|
|
3
3
|
|
|
4
|
-
export function getMedalColor(team: Team): { backgroundColor: string
|
|
4
|
+
export function getMedalColor(team: Team): { backgroundColor: string; color: string } | undefined {
|
|
5
5
|
const color = {
|
|
6
6
|
backgroundColor: "#fff",
|
|
7
7
|
color: "#000",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { Image } from "@xcpcio/types";
|
|
2
2
|
|
|
3
|
-
import { GET_LOGO_ICPC } from "./icpc";
|
|
4
3
|
import { GET_LOGO_CCPC } from "./ccpc";
|
|
5
4
|
import { GET_LOGO_HUNAN_CPC } from "./hunan-cpc";
|
|
5
|
+
import { GET_LOGO_ICPC } from "./icpc";
|
|
6
6
|
|
|
7
7
|
export function getLogoFromPreset(image: Image): Image {
|
|
8
8
|
if (!image.preset) {
|