@xcpcio/board-app 0.75.2 → 0.76.1
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/{Balloon.vue_vue_type_script_setup_true_lang-Cw5mKlP6.js → Balloon.vue_vue_type_script_setup_true_lang-d2G-u5vg.js} +1 -1
- package/dist/assets/{Board-JvA5b1h4.css → Board-BwQ18wc3.css} +1 -1
- package/dist/assets/{Board-B_focp30.js → Board-DJV0AVBI.js} +70 -70
- package/dist/assets/ContestStateBadge-DwpYB8jU.js +1 -0
- package/dist/assets/{Countdown-_e1WmD1Z.js → Countdown-C0ehxYV6.js} +1 -1
- package/dist/assets/{DataSourceInput.vue_vue_type_script_setup_true_lang-B1XI4zsB.js → DataSourceInput.vue_vue_type_script_setup_true_lang-DsbNshKm.js} +1 -1
- package/dist/assets/{NavBar-DqffB-To.js → NavBar-yKXoYQ8Z.js} +1 -1
- package/dist/assets/{Resolver-Cdswx7dD.js → Resolver-P35Bzy4i.js} +1 -1
- package/dist/assets/{RightArrowIcon-ASzKllar.js → RightArrowIcon-DgGuAJYR.js} +1 -1
- package/dist/assets/{TheInput.vue_vue_type_script_setup_true_lang-C3GiJV4o.js → TheInput.vue_vue_type_script_setup_true_lang-DkbZF4tx.js} +1 -1
- package/dist/assets/Tooltip.vue_vue_type_script_setup_true_lang-FDvNZrD3.js +27 -0
- package/dist/assets/{_...all_-D-RS9GfB.js → _...all_-DDWfwyFN.js} +1 -1
- package/dist/assets/{_...all_-DncsZYI5.js → _...all_-DxUCPQBM.js} +1 -1
- package/dist/assets/{board-layout-_R9n85-s.js → board-layout-GWm9-tdD.js} +1 -1
- package/dist/assets/constant-BtV7X_BN.js +1 -0
- package/dist/assets/{dayjs-CDQeLdpE.js → dayjs-ZD42Nn2w.js} +1 -1
- package/dist/assets/default-BZg96Ko6.js +1 -0
- package/dist/assets/{headless-BOt-atch.js → headless-vYwzdT_U.js} +1 -1
- package/dist/assets/index-BDgEyGgl.js +1 -0
- package/dist/assets/{index-Cs7d6jbK.js → index-BctgVEkb.js} +1 -1
- package/dist/assets/index-BdEyt6rO.js +15 -0
- package/dist/assets/index-DTBbtQqs.js +1 -0
- package/dist/assets/{index-Di6laDi4.js → index-IrmG24Wk.js} +1 -1
- package/dist/assets/{index-Bwa4u3Zk.js → index-L2S2y7PX.js} +1 -1
- package/dist/assets/{index-C0X9msh5.js → index-Op11lXUa.js} +1 -1
- package/dist/assets/{index-layout-ClOXvNqI.js → index-layout-CaWd8ZGw.js} +1 -1
- package/dist/assets/{pagination-BWHNOXqm.js → pagination-TofUkJg0.js} +1 -1
- package/dist/assets/{person-hQawOM24.js → person-BGcNDO7L.js} +1 -1
- package/dist/assets/rank-BLNhEN4T.js +1 -0
- package/dist/assets/use-vmodel-Czj8tqqP.js +20 -0
- package/dist/index.html +1 -1
- package/package.json +16 -16
- package/src/auto-imports.d.ts +339 -338
- package/src/components/board/Board.vue +1 -1
- package/src/components/board/Export.vue +30 -18
- package/src/composables/useRouteQueryWithoutParam.ts +2 -2
- package/src/typed-router.d.ts +96 -27
- package/dist/assets/ContestStateBadge-2eB9UgeA.js +0 -1
- package/dist/assets/Tooltip.vue_vue_type_script_setup_true_lang-BzjHrCex.js +0 -27
- package/dist/assets/constant-B4A9F229.js +0 -1
- package/dist/assets/default-6Bf5Es_S.js +0 -1
- package/dist/assets/index-99Hkl89C.js +0 -15
- package/dist/assets/index-C9dK3x8P.js +0 -1
- package/dist/assets/index-RAMlsvVJ.js +0 -1
- package/dist/assets/rank-DGk2KbBp.js +0 -1
- package/dist/assets/use-vmodel-BwR2Z-3A.js +0 -20
|
@@ -405,7 +405,7 @@ const widthClass = "sm:w-[1260px] xl:w-screen";
|
|
|
405
405
|
>
|
|
406
406
|
<div class="max-w-[92%]">
|
|
407
407
|
<img
|
|
408
|
-
:src="getImageSource(rank.contest.banner, `${DATA_HOST}
|
|
408
|
+
:src="getImageSource(rank.contest.banner, `${DATA_HOST}`)"
|
|
409
409
|
class="w-screen"
|
|
410
410
|
alt="banner"
|
|
411
411
|
>
|
|
@@ -40,6 +40,8 @@ const btnDisable = ref({
|
|
|
40
40
|
ICPCStandingsCsvDownload: false,
|
|
41
41
|
});
|
|
42
42
|
|
|
43
|
+
const includeFakeRussianTeams = ref(false);
|
|
44
|
+
|
|
43
45
|
async function waitDisabled() {
|
|
44
46
|
await nextTick();
|
|
45
47
|
await sleep(16);
|
|
@@ -50,7 +52,7 @@ async function onClickForCfDatDownload() {
|
|
|
50
52
|
await waitDisabled();
|
|
51
53
|
|
|
52
54
|
const converter = new CodeforcesGymGhostDATConverter();
|
|
53
|
-
const dat = converter.convert(rank.value);
|
|
55
|
+
const dat = converter.convert(rank.value, { includeFakeRussianTeams: includeFakeRussianTeams.value });
|
|
54
56
|
const blob = new Blob([dat], { type: "text/plain;charset=utf-8" });
|
|
55
57
|
FileSaver.saveAs(blob, "contest.dat");
|
|
56
58
|
|
|
@@ -67,7 +69,7 @@ async function onClickForCfDatCopyToClipboard() {
|
|
|
67
69
|
await waitDisabled();
|
|
68
70
|
|
|
69
71
|
const converter = new CodeforcesGymGhostDATConverter();
|
|
70
|
-
const dat = converter.convert(rank.value);
|
|
72
|
+
const dat = converter.convert(rank.value, { includeFakeRussianTeams: includeFakeRussianTeams.value });
|
|
71
73
|
copy(dat);
|
|
72
74
|
|
|
73
75
|
btnDisable.value.CfDatCopy = false;
|
|
@@ -117,23 +119,33 @@ async function onClickForICPCStandingsCsvDownload() {
|
|
|
117
119
|
>
|
|
118
120
|
<div
|
|
119
121
|
v-if="currentItem.value === 'cf-dat'"
|
|
120
|
-
flex flex-
|
|
122
|
+
flex flex-col gap-4
|
|
121
123
|
>
|
|
122
|
-
<
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
</
|
|
129
|
-
|
|
130
|
-
<
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
124
|
+
<div flex justify-center>
|
|
125
|
+
<TheCheckbox v-model="includeFakeRussianTeams">
|
|
126
|
+
<span ml-3 text-sm font-medium text-gray-900 dark:text-gray-300>
|
|
127
|
+
Include fake Russian teams (100 placeholder teams)
|
|
128
|
+
</span>
|
|
129
|
+
</TheCheckbox>
|
|
130
|
+
</div>
|
|
131
|
+
|
|
132
|
+
<div flex flex-row justify-center gap-4>
|
|
133
|
+
<button
|
|
134
|
+
:disabled="btnDisable.CfDatDownload"
|
|
135
|
+
btn
|
|
136
|
+
@click="onClickForCfDatDownload"
|
|
137
|
+
>
|
|
138
|
+
Download
|
|
139
|
+
</button>
|
|
140
|
+
|
|
141
|
+
<button
|
|
142
|
+
:disabled="btnDisable.CfDatCopy"
|
|
143
|
+
btn
|
|
144
|
+
@click="onClickForCfDatCopyToClipboard"
|
|
145
|
+
>
|
|
146
|
+
Copy to Clipboard
|
|
147
|
+
</button>
|
|
148
|
+
</div>
|
|
137
149
|
</div>
|
|
138
150
|
|
|
139
151
|
<div
|
|
@@ -43,7 +43,7 @@ export interface ReactiveRouteOptionsWithTransform<V, R> extends ReactiveRouteOp
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
export function useRouteQueryWithoutParam(
|
|
46
|
-
name: string
|
|
46
|
+
name: string,
|
|
47
47
|
): Ref<undefined | null | string | string[]>;
|
|
48
48
|
|
|
49
49
|
export function useRouteQueryWithoutParam<
|
|
@@ -52,7 +52,7 @@ export function useRouteQueryWithoutParam<
|
|
|
52
52
|
>(
|
|
53
53
|
name: string,
|
|
54
54
|
defaultValue?: MaybeRefOrGetter<T>,
|
|
55
|
-
options?: ReactiveRouteOptionsWithTransform<T, K
|
|
55
|
+
options?: ReactiveRouteOptionsWithTransform<T, K>,
|
|
56
56
|
): Ref<K>;
|
|
57
57
|
|
|
58
58
|
export function useRouteQueryWithoutParam<
|
package/src/typed-router.d.ts
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
/* eslint-disable */
|
|
2
2
|
/* prettier-ignore */
|
|
3
3
|
// @ts-nocheck
|
|
4
|
-
//
|
|
4
|
+
// noinspection ES6UnusedImports
|
|
5
|
+
// Generated by unplugin-vue-router. !! DO NOT MODIFY THIS FILE !!
|
|
5
6
|
// It's recommended to commit this file.
|
|
6
7
|
// Make sure to add this file to your tsconfig.json file as an "includes" or "files" entry.
|
|
7
8
|
|
|
9
|
+
declare module 'vue-router/auto-resolver' {
|
|
10
|
+
export type ParamParserCustom = never
|
|
11
|
+
}
|
|
12
|
+
|
|
8
13
|
declare module 'vue-router/auto-routes' {
|
|
9
14
|
import type {
|
|
10
15
|
RouteRecordInfo,
|
|
@@ -18,19 +23,67 @@ declare module 'vue-router/auto-routes' {
|
|
|
18
23
|
* Route name map generated by unplugin-vue-router
|
|
19
24
|
*/
|
|
20
25
|
export interface RouteNamedMap {
|
|
21
|
-
'/': RouteRecordInfo<
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
'/
|
|
26
|
+
'/': RouteRecordInfo<
|
|
27
|
+
'/',
|
|
28
|
+
'/',
|
|
29
|
+
Record<never, never>,
|
|
30
|
+
Record<never, never>,
|
|
31
|
+
| never
|
|
32
|
+
>,
|
|
33
|
+
'/[...all]': RouteRecordInfo<
|
|
34
|
+
'/[...all]',
|
|
35
|
+
'/:all(.*)',
|
|
36
|
+
{ all: ParamValue<true> },
|
|
37
|
+
{ all: ParamValue<false> },
|
|
38
|
+
| never
|
|
39
|
+
>,
|
|
40
|
+
'/balloon/': RouteRecordInfo<
|
|
41
|
+
'/balloon/',
|
|
42
|
+
'/balloon',
|
|
43
|
+
Record<never, never>,
|
|
44
|
+
Record<never, never>,
|
|
45
|
+
| never
|
|
46
|
+
>,
|
|
47
|
+
'/board/': RouteRecordInfo<
|
|
48
|
+
'/board/',
|
|
49
|
+
'/board',
|
|
50
|
+
Record<never, never>,
|
|
51
|
+
Record<never, never>,
|
|
52
|
+
| never
|
|
53
|
+
>,
|
|
54
|
+
'/countdown/': RouteRecordInfo<
|
|
55
|
+
'/countdown/',
|
|
56
|
+
'/countdown',
|
|
57
|
+
Record<never, never>,
|
|
58
|
+
Record<never, never>,
|
|
59
|
+
| never
|
|
60
|
+
>,
|
|
61
|
+
'/rating/': RouteRecordInfo<
|
|
62
|
+
'/rating/',
|
|
63
|
+
'/rating',
|
|
64
|
+
Record<never, never>,
|
|
65
|
+
Record<never, never>,
|
|
66
|
+
| never
|
|
67
|
+
>,
|
|
68
|
+
'/rating/[...all]': RouteRecordInfo<
|
|
69
|
+
'/rating/[...all]',
|
|
70
|
+
'/rating/:all(.*)',
|
|
71
|
+
{ all: ParamValue<true> },
|
|
72
|
+
{ all: ParamValue<false> },
|
|
73
|
+
| never
|
|
74
|
+
>,
|
|
75
|
+
'/resolver/': RouteRecordInfo<
|
|
76
|
+
'/resolver/',
|
|
77
|
+
'/resolver',
|
|
78
|
+
Record<never, never>,
|
|
79
|
+
Record<never, never>,
|
|
80
|
+
| never
|
|
81
|
+
>,
|
|
29
82
|
}
|
|
30
83
|
|
|
31
84
|
/**
|
|
32
85
|
* Route file to route info map by unplugin-vue-router.
|
|
33
|
-
* Used by the
|
|
86
|
+
* Used by the \`sfc-typed-router\` Volar plugin to automatically type \`useRoute()\`.
|
|
34
87
|
*
|
|
35
88
|
* Each key is a file path relative to the project root with 2 properties:
|
|
36
89
|
* - routes: union of route names of the possible routes when in this page (passed to useRoute<...>())
|
|
@@ -40,42 +93,58 @@ declare module 'vue-router/auto-routes' {
|
|
|
40
93
|
*/
|
|
41
94
|
export interface _RouteFileInfoMap {
|
|
42
95
|
'src/pages/index.vue': {
|
|
43
|
-
routes:
|
|
44
|
-
|
|
96
|
+
routes:
|
|
97
|
+
| '/'
|
|
98
|
+
views:
|
|
99
|
+
| never
|
|
45
100
|
}
|
|
46
101
|
'src/pages/[...all].vue': {
|
|
47
|
-
routes:
|
|
48
|
-
|
|
102
|
+
routes:
|
|
103
|
+
| '/[...all]'
|
|
104
|
+
views:
|
|
105
|
+
| never
|
|
49
106
|
}
|
|
50
107
|
'src/pages/balloon/index.vue': {
|
|
51
|
-
routes:
|
|
52
|
-
|
|
108
|
+
routes:
|
|
109
|
+
| '/balloon/'
|
|
110
|
+
views:
|
|
111
|
+
| never
|
|
53
112
|
}
|
|
54
113
|
'src/pages/board/index.vue': {
|
|
55
|
-
routes:
|
|
56
|
-
|
|
114
|
+
routes:
|
|
115
|
+
| '/board/'
|
|
116
|
+
views:
|
|
117
|
+
| never
|
|
57
118
|
}
|
|
58
119
|
'src/pages/countdown/index.vue': {
|
|
59
|
-
routes:
|
|
60
|
-
|
|
120
|
+
routes:
|
|
121
|
+
| '/countdown/'
|
|
122
|
+
views:
|
|
123
|
+
| never
|
|
61
124
|
}
|
|
62
125
|
'src/pages/rating/index.vue': {
|
|
63
|
-
routes:
|
|
64
|
-
|
|
126
|
+
routes:
|
|
127
|
+
| '/rating/'
|
|
128
|
+
views:
|
|
129
|
+
| never
|
|
65
130
|
}
|
|
66
131
|
'src/pages/rating/[...all].vue': {
|
|
67
|
-
routes:
|
|
68
|
-
|
|
132
|
+
routes:
|
|
133
|
+
| '/rating/[...all]'
|
|
134
|
+
views:
|
|
135
|
+
| never
|
|
69
136
|
}
|
|
70
137
|
'src/pages/resolver/index.vue': {
|
|
71
|
-
routes:
|
|
72
|
-
|
|
138
|
+
routes:
|
|
139
|
+
| '/resolver/'
|
|
140
|
+
views:
|
|
141
|
+
| never
|
|
73
142
|
}
|
|
74
143
|
}
|
|
75
144
|
|
|
76
145
|
/**
|
|
77
146
|
* Get a union of possible route names in a certain route component file.
|
|
78
|
-
* Used by the
|
|
147
|
+
* Used by the \`sfc-typed-router\` Volar plugin to automatically type \`useRoute()\`.
|
|
79
148
|
*
|
|
80
149
|
* @internal
|
|
81
150
|
*/
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{j as i,k as A}from"./use-vmodel-BwR2Z-3A.js";import{e as U,h as F,m as n,U as G,D as V,c as v,o as g,b as c,I,n as D,u as x,q as E,F as X,t as k}from"./index-99Hkl89C.js";import{c as j,g as q}from"./dayjs-CDQeLdpE.js";import{_ as C}from"./_plugin-vue_export-helper-DlAUqK2U.js";function ae(s,e){return s?.url?!e||s.url.startsWith("http")?s.url:new URL(s.url,e==="/"?window.location.host:e).toString():s?.base64?`data:image/${s.type??"png"};base64,${s.base64}`:""}const H=U({__name:"Progress",props:{width:null,state:null,needScroll:{type:Boolean},rank:null,rankOptions:null,elapsedTime:null},emits:["update:rank-options"],setup(s,{emit:e}){const t=s,M=e,h=F({get(){return t.rankOptions},set(l){M("update:rank-options",l)}}),N=F(()=>{switch(t.state){case i.PENDING:return"am-progress-bar-secondary";case i.RUNNING:return"am-progress-bar-success";case i.FROZEN:return"am-progress-bar-danger";case i.FINISHED:return"am-progress-bar-primary";case i.PAUSED:return"am-progress-bar-danger"}return""}),r=n(!1),S=n(!1),m=n(0),_=n(t.width),w=n(0),d=A(),o=n(null),L=n(null),p=n(null),T=n(null),R=n(null);function $(l){S.value=!0;const f=l.clientX-p.value.offsetLeft,b=W=>{if(!S.value)return;r.value=!0;let a=W.clientX-f;a=Math.max(a,0),a=Math.min(a,o.value.offsetWidth-p.value.offsetWidth);const B=o.value.offsetWidth*Number.parseInt(L.value.style?.width)*.01;a>=B&&(a=B,r.value=!1);let u=0;a>0&&(u=Math.round((a+p.value.offsetWidth)/o.value.offsetWidth*1e4)),u>1e4&&(u=1e4),u===1e4&&(r.value=!1),window.getSelection()?.removeAllRanges(),m.value=u,w.value=a,_.value=u*.01},y=()=>{document.removeEventListener("mouseup",y),document.removeEventListener("mousemove",b),S.value=!1,r.value===!0?(d.value=m.value,h.value?.setWidth(m.value,t.rank.contest)):(d.value=void 0,h.value?.disableFilterSubmissionByTimestamp())};document.addEventListener("mousemove",b),document.addEventListener("mouseup",y)}function z(){const l=t.rank.contest.getStartTime(),f=t.rank.contest.getEndTime(),b=f.unix()-l.unix(),y=Math.floor(b*_.value*.01),W=j(),a=Math.max(0,Math.min(W.unix(),f.unix())-l.unix());return q(Math.min(y,a))}function O(){return r.value===!0?z():t.elapsedTime}function P(){return r.value===!0?`${Math.max(0,w.value)}px`:`max(calc(0%), min(calc(${t.width}%), calc(100% - 10px)))`}return G(()=>{t.needScroll===!0&&(o.value.onmouseenter=()=>{T.value.classList.add("in")},o.value.onmouseleave=()=>{T.value.classList.remove("in")}),d.value!==-1?(r.value=!0,m.value=Math.max(0,Math.min(1e4,d.value)),_.value=m.value*.01,w.value=_.value*.01*o.value.offsetWidth-p.value.offsetWidth,h.value?.setWidth(d.value,t.rank.contest)):h.value?.disableFilterSubmissionByTimestamp()}),V(()=>{}),(l,f)=>(g(),v("div",{ref_key:"scroll",ref:o,class:"am-progress am-progress-striped am-active","w-full":"",style:{position:"relative"}},[c("div",{ref_key:"mask",ref:L,class:D(["am-progress-bar",[x(N)]]),style:I({width:`${t.width}%`})},[t.needScroll?(g(),v(X,{key:0},[c("div",{ref_key:"tooltip",ref:T,class:"tooltip tooltip-top",style:I({marginLeft:"-32px",bottom:"22px",left:P()})},[c("div",{ref_key:"tooltipInner",ref:R,class:"tooltip-inner"},k(O()),513)],4),c("div",{ref_key:"bar",ref:p,class:D(["am-progress-bar am-progress-cursor am-progress-scroll-size z-99",[x(N)]]),style:I({left:P()}),onMousedown:$},null,38)],64)):E("",!0)],6)],512))}}),ne=C(H,[["__scopeId","data-v-4607820e"]]),J={flex:"","flex-row":"","items-center":"","justify-center":""},Q={key:0,"ml-2":""},Z={key:1,"ml-2":""},K=U({__name:"ContestStateBadge",props:{state:null,pendingTime:null,pausedTime:null},setup(s){const e=s;return(t,M)=>(g(),v("div",J,[c("div",{class:D(["label",e.state])},null,2),c("div",null,k(e.state),1),e.pendingTime&&e.state===x(i).PENDING?(g(),v("div",Q,k(e.pendingTime),1)):E("",!0),e.pausedTime&&e.state===x(i).PAUSED?(g(),v("div",Z,k(e.pausedTime),1)):E("",!0)]))}}),re=C(K,[["__scopeId","data-v-68586c4d"]]);export{re as _,ne as a,ae as g};
|