@xcpcio/board-app 0.69.5 → 0.71.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.
Files changed (59) hide show
  1. package/dist/404.html +1 -1
  2. package/dist/assets/{Balloon.vue_vue_type_script_setup_true_lang-DfbwZnd2.js → Balloon.vue_vue_type_script_setup_true_lang-D1a_00Po.js} +1 -1
  3. package/dist/assets/{Board-BMeYlAwA.js → Board-DmHXBGpM.js} +97 -97
  4. package/dist/assets/{Board-C89Lc-cb.css → Board-tx1moXfi.css} +1 -1
  5. package/dist/assets/{ContestStateBadge-DoEREwpQ.js → ContestStateBadge-Juu-G2PP.js} +1 -1
  6. package/dist/assets/{Countdown-_PA1hqgx.js → Countdown-CwVTXOpj.js} +1 -1
  7. package/dist/assets/{DataSourceInput.vue_vue_type_script_setup_true_lang-eUwkTVcq.js → DataSourceInput.vue_vue_type_script_setup_true_lang-DxhKBY5N.js} +1 -1
  8. package/dist/assets/{Footer-BWt3hS1p.js → Footer-CmWIcxQy.js} +1 -1
  9. package/dist/assets/{NavBar-DBduFBvK.js → NavBar-CAQ0Zfb0.js} +1 -1
  10. package/dist/assets/{Resolver-DYqdxinL.js → Resolver-Dv0FYcPS.js} +1 -1
  11. package/dist/assets/{RightArrowIcon-CLEfqdYw.js → RightArrowIcon-C4DwAZwr.js} +1 -1
  12. package/dist/assets/{TheInput.vue_vue_type_script_setup_true_lang-BToUgLKT.js → TheInput.vue_vue_type_script_setup_true_lang-DMQHMlKd.js} +1 -1
  13. package/dist/assets/{Tooltip.vue_vue_type_script_setup_true_lang-DDqugeXb.js → Tooltip.vue_vue_type_script_setup_true_lang-Di35scD3.js} +1 -1
  14. package/dist/assets/{_...all_-Cw819WoH.js → _...all_-21UvOyzz.js} +1 -1
  15. package/dist/assets/{_...all_-FGT9N2sj.js → _...all_-Dsfr3X_U.js} +1 -1
  16. package/dist/assets/{_name_-CuQ3cIKi.js → _name_-DXkLOlmO.js} +1 -1
  17. package/dist/assets/{about-BAhmu_eA.js → about--qTFGfhb.js} +1 -1
  18. package/dist/assets/board-N2e0mLQJ.js +1 -0
  19. package/dist/assets/{board-layout-GCp2jR8Y.js → board-layout-BN6m6Eyv.js} +1 -1
  20. package/dist/assets/{constant-CglMAQbu.js → constant-BOM5KUzF.js} +1 -1
  21. package/dist/assets/{dayjs-BswMS1T6.js → dayjs-CT7vuQap.js} +1 -1
  22. package/dist/assets/{default-BSnA2z3z.js → default-Dag11DBy.js} +1 -1
  23. package/dist/assets/en-Bc_VXYkH.js +1 -0
  24. package/dist/assets/{headless-DaRP-RlQ.js → headless-C5Cgkigj.js} +1 -1
  25. package/dist/assets/{home-CQ7J5jfy.js → home-B4y_hv2l.js} +1 -1
  26. package/dist/assets/{index-BShKuYMv.js → index-BTb5OXv2.js} +1 -1
  27. package/dist/assets/{index-BLzpiSXU.js → index-C9QaXroK.js} +1 -1
  28. package/dist/assets/index-CKRZ2rFt.js +1 -0
  29. package/dist/assets/index-DYWobB2z.js +71 -0
  30. package/dist/assets/index-Dh5EPZBi.js +1 -0
  31. package/dist/assets/{index-BGJAeisZ.css → index-VQCc5ge4.css} +1 -1
  32. package/dist/assets/{index-layout-Dzd9pPBi.js → index-layout-BMaWupUy.js} +1 -1
  33. package/dist/assets/index-mJTIjOZ2.js +1 -0
  34. package/dist/assets/{pagination-4SkVHmrY.js → pagination-UEuwAKXF.js} +1 -1
  35. package/dist/assets/{person-BqGZA5vO.js → person-DuAW_NGL.js} +1 -1
  36. package/dist/assets/{query-951tnQE0.js → query-BESLcVEP.js} +1 -1
  37. package/dist/assets/{rank-D0grINCt.js → rank-CRl1OOXt.js} +1 -1
  38. package/dist/assets/{test-BXOoffz6.js → test-BSJmHTjc.js} +1 -1
  39. package/dist/assets/{use-vmodel-B2gtAybe.js → use-vmodel-D6Vw3vwf.js} +1 -1
  40. package/dist/assets/useQueryBoardData-DHmBrLzo.js +1 -0
  41. package/dist/assets/{user-B76vXuTP.js → user-CY1VfyaG.js} +1 -1
  42. package/dist/assets/{virtual_pwa-register-DAgoMBVn.js → virtual_pwa-register-CAAdW0Od.js} +1 -1
  43. package/dist/assets/zh-CN-DJPqkv-M.js +1 -0
  44. package/dist/index.html +1 -1
  45. package/dist/sw.js +1 -1
  46. package/package.json +20 -20
  47. package/src/components/board/{TeamInfoModal.vue → TeamModal.vue} +2 -13
  48. package/src/components/board/{TeamInfo.vue → TeamOverview.vue} +38 -0
  49. package/src/components/board/TeamUI.vue +7 -7
  50. package/src/components.d.ts +6 -4
  51. package/dist/assets/board-B2-AY2i9.js +0 -1
  52. package/dist/assets/en-2FPgP2UC.js +0 -1
  53. package/dist/assets/index-B57ZqXF4.js +0 -1
  54. package/dist/assets/index-BhnYlDUf.js +0 -1
  55. package/dist/assets/index-Bo0N8sE9.js +0 -1
  56. package/dist/assets/index-D_YfgkHi.js +0 -67
  57. package/dist/assets/useQueryBoardData-Bo2tfx6C.js +0 -1
  58. package/dist/assets/zh-CN-HUuGZsB1.js +0 -1
  59. package/src/components/board/TeamAwards.vue +0 -121
@@ -1 +0,0 @@
1
- import{a5 as V,a6 as j,a7 as f,a8 as D,a9 as w,aa as z,ab as k,ac as M,ad as B,ae as T,af as H,ag as K,ah as L,ai as Y,aj as G,ak as J,al as X,f as W,am as Z,an as q,ao as tt,C as Q,ap as $,aq as et,ar as A,as as st,at as it,au as nt}from"./index-D_YfgkHi.js";import{b as at}from"./constant-CglMAQbu.js";var rt=class extends V{constructor(t,e){super(),this.options=e,this.#s=t,this.#n=null,this.#i=j(),this.bindMethods(),this.setOptions(e)}#s;#t=void 0;#p=void 0;#e=void 0;#r;#u;#i;#n;#b;#c;#d;#o;#h;#a;#f=new Set;bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(this.#t.addObserver(this),_(this.#t,this.options)?this.#l():this.updateResult(),this.#y())}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return U(this.#t,this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return U(this.#t,this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,this.#O(),this.#g(),this.#t.removeObserver(this)}setOptions(t){const e=this.options,i=this.#t;if(this.options=this.#s.defaultQueryOptions(t),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof f(this.options.enabled,this.#t)!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");this.#w(),this.#t.setOptions(this.options),e._defaulted&&!D(this.options,e)&&this.#s.getQueryCache().notify({type:"observerOptionsUpdated",query:this.#t,observer:this});const s=this.hasListeners();s&&N(this.#t,i,this.options,e)&&this.#l(),this.updateResult(),s&&(this.#t!==i||f(this.options.enabled,this.#t)!==f(e.enabled,this.#t)||w(this.options.staleTime,this.#t)!==w(e.staleTime,this.#t))&&this.#v();const n=this.#m();s&&(this.#t!==i||f(this.options.enabled,this.#t)!==f(e.enabled,this.#t)||n!==this.#a)&&this.#R(n)}getOptimisticResult(t){const e=this.#s.getQueryCache().build(this.#s,t),i=this.createResult(e,t);return ht(this,i)&&(this.#e=i,this.#u=this.options,this.#r=this.#t.state),i}getCurrentResult(){return this.#e}trackResult(t,e){return new Proxy(t,{get:(i,s)=>(this.trackProp(s),e?.(s),s==="promise"&&!this.options.experimental_prefetchInRender&&this.#i.status==="pending"&&this.#i.reject(new Error("experimental_prefetchInRender feature flag is not enabled")),Reflect.get(i,s))})}trackProp(t){this.#f.add(t)}getCurrentQuery(){return this.#t}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const e=this.#s.defaultQueryOptions(t),i=this.#s.getQueryCache().build(this.#s,e);return i.fetch().then(()=>this.createResult(i,e))}fetch(t){return this.#l({...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),this.#e))}#l(t){this.#w();let e=this.#t.fetch(this.options,t);return t?.throwOnError||(e=e.catch(z)),e}#v(){this.#O();const t=w(this.options.staleTime,this.#t);if(k||this.#e.isStale||!M(t))return;const i=B(this.#e.dataUpdatedAt,t)+1;this.#o=T.setTimeout(()=>{this.#e.isStale||this.updateResult()},i)}#m(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(this.#t):this.options.refetchInterval)??!1}#R(t){this.#g(),this.#a=t,!(k||f(this.options.enabled,this.#t)===!1||!M(this.#a)||this.#a===0)&&(this.#h=T.setInterval(()=>{(this.options.refetchIntervalInBackground||H.isFocused())&&this.#l()},this.#a))}#y(){this.#v(),this.#R(this.#m())}#O(){this.#o&&(T.clearTimeout(this.#o),this.#o=void 0)}#g(){this.#h&&(T.clearInterval(this.#h),this.#h=void 0)}createResult(t,e){const i=this.#t,s=this.options,n=this.#e,r=this.#r,l=this.#u,v=t!==i?t.state:this.#p,{state:O}=t;let a={...O},C=!1,h;if(e._optimisticResults){const c=this.hasListeners(),I=!c&&_(t,e),y=c&&N(t,i,e,s);(I||y)&&(a={...a,...K(O.data,t.options)}),e._optimisticResults==="isRestoring"&&(a.fetchStatus="idle")}let{error:o,errorUpdatedAt:b,status:d}=a;h=a.data;let g=!1;if(e.placeholderData!==void 0&&h===void 0&&d==="pending"){let c;n?.isPlaceholderData&&e.placeholderData===l?.placeholderData?(c=n.data,g=!0):c=typeof e.placeholderData=="function"?e.placeholderData(this.#d?.state.data,this.#d):e.placeholderData,c!==void 0&&(d="success",h=L(n?.data,c,e),C=!0)}if(e.select&&h!==void 0&&!g)if(n&&h===r?.data&&e.select===this.#b)h=this.#c;else try{this.#b=e.select,h=e.select(h),h=L(n?.data,h,e),this.#c=h,this.#n=null}catch(c){this.#n=c}this.#n&&(o=this.#n,h=this.#c,b=Date.now(),d="error");const m=a.fetchStatus==="fetching",R=d==="pending",E=d==="error",P=R&&m,x=h!==void 0,p={status:d,fetchStatus:a.fetchStatus,isPending:R,isSuccess:d==="success",isError:E,isInitialLoading:P,isLoading:P,data:h,dataUpdatedAt:a.dataUpdatedAt,error:o,errorUpdatedAt:b,failureCount:a.fetchFailureCount,failureReason:a.fetchFailureReason,errorUpdateCount:a.errorUpdateCount,isFetched:a.dataUpdateCount>0||a.errorUpdateCount>0,isFetchedAfterMount:a.dataUpdateCount>v.dataUpdateCount||a.errorUpdateCount>v.errorUpdateCount,isFetching:m,isRefetching:m&&!R,isLoadingError:E&&!x,isPaused:a.fetchStatus==="paused",isPlaceholderData:C,isRefetchError:E&&x,isStale:F(t,e),refetch:this.refetch,promise:this.#i,isEnabled:f(e.enabled,t)!==!1};if(this.options.experimental_prefetchInRender){const c=S=>{p.status==="error"?S.reject(p.error):p.data!==void 0&&S.resolve(p.data)},I=()=>{const S=this.#i=p.promise=j();c(S)},y=this.#i;switch(y.status){case"pending":t.queryHash===i.queryHash&&c(y);break;case"fulfilled":(p.status==="error"||p.data!==y.value)&&I();break;case"rejected":(p.status!=="error"||p.error!==y.reason)&&I();break}}return p}updateResult(){const t=this.#e,e=this.createResult(this.#t,this.options);if(this.#r=this.#t.state,this.#u=this.options,this.#r.data!==void 0&&(this.#d=this.#t),D(e,t))return;this.#e=e;const i=()=>{if(!t)return!0;const{notifyOnChangeProps:s}=this.options,n=typeof s=="function"?s():s;if(n==="all"||!n&&!this.#f.size)return!0;const r=new Set(n??this.#f);return this.options.throwOnError&&r.add("error"),Object.keys(this.#e).some(l=>{const u=l;return this.#e[u]!==t[u]&&r.has(u)})};this.#C({listeners:i()})}#w(){const t=this.#s.getQueryCache().build(this.#s,this.options);if(t===this.#t)return;const e=this.#t;this.#t=t,this.#p=t.state,this.hasListeners()&&(e?.removeObserver(this),t.addObserver(this))}onQueryUpdate(){this.updateResult(),this.hasListeners()&&this.#y()}#C(t){Y.batch(()=>{t.listeners&&this.listeners.forEach(e=>{e(this.#e)}),this.#s.getQueryCache().notify({query:this.#t,type:"observerResultsUpdated"})})}};function ot(t,e){return f(e.enabled,t)!==!1&&t.state.data===void 0&&!(t.state.status==="error"&&e.retryOnMount===!1)}function _(t,e){return ot(t,e)||t.state.data!==void 0&&U(t,e,e.refetchOnMount)}function U(t,e,i){if(f(e.enabled,t)!==!1&&w(e.staleTime,t)!=="static"){const s=typeof i=="function"?i(t):i;return s==="always"||s!==!1&&F(t,e)}return!1}function N(t,e,i,s){return(t!==e||f(s.enabled,t)===!1)&&(!i.suspense||t.state.status!=="error")&&F(t,i)}function F(t,e){return f(e.enabled,t)!==!1&&t.isStaleByTime(w(e.staleTime,t))}function ht(t,e){return!D(t.getCurrentResult(),e)}function lt(t=""){if(!G())throw new Error("vue-query hooks can only be used inside setup() function or functions that support injection context.");const e=X(t),i=J(e);if(!i)throw new Error("No 'queryClient' found in Vue context, use 'VueQueryPlugin' to properly initialize the library.");return i}function ut(t,e,i){const s=lt(),n=W(()=>{const o=Z(e);typeof o.enabled=="function"&&(o.enabled=o.enabled());const b=s.defaultQueryOptions(o);return b._optimisticResults=s.isRestoring?.value?"isRestoring":"optimistic",b}),r=new t(s,n.value),l=n.value.shallow?q(r.getCurrentResult()):tt(r.getCurrentResult());let u=()=>{};s.isRestoring&&Q(s.isRestoring,o=>{o||(u(),u=r.subscribe(b=>{$(l,b)}))},{immediate:!0});const v=()=>{r.setOptions(n.value),$(l,r.getCurrentResult())};Q(n,v),et(()=>{u()});const O=(...o)=>(v(),l.refetch(...o)),a=()=>new Promise((o,b)=>{let d=()=>{};const g=()=>{if(n.value.enabled!==!1){r.setOptions(n.value);const m=r.getOptimisticResult(n.value);m.isStale?(d(),r.fetchOptimistic(n.value).then(o,R=>{A(n.value.throwOnError,[R,r.getCurrentQuery()])?b(R):o(r.getCurrentResult())})):(d(),o(m))}};g(),d=Q(n,g)});Q(()=>l.error,o=>{if(l.isError&&!l.isFetching&&A(n.value.throwOnError,[o,r.getCurrentQuery()]))throw o});const C=n.value.shallow?st(l):it(l),h=nt(C);for(const o in l)typeof l[o]=="function"&&(h[o]=l[o]);return h.suspense=a,h.refetch=O,h}function ct(t,e){return ut(rt,t)}const dt=3;async function ft(t,e){const i=t.startsWith("/")?t.slice(1):t;let s=`${window.DATA_HOST}${i}`;const n={allInOne:!1};if(s.includes("#")){const a=new URLSearchParams(s.split("#")[1]);n.allInOne=a.get("allInOne")==="true",s=s.split("#")[0]}t.startsWith("http")&&(s=t),s.endsWith("/")&&(s=s.slice(0,-1));const r=a=>a.includes("?")?`${a}&t=${e??0}`:`${a}?t=${e??0}`,l=n.allInOne?[await fetch(r(s))]:[await fetch(r(`${s}/config.json`)),await fetch(r(`${s}/team.json`)),await fetch(r(`${s}/run.json`))],{status:u,statusText:v}=l[0];if(u>=300||u<200)throw new Error(`fetch data failed. [status=${u}] [statusText=${v}]`);return Promise.all(l.map(a=>a.json())).then(a=>n.allInOne?a[0]:{contest:a[0],teams:a[1],submissions:a[2]})}function mt(t,e,i=!1){let s=3e4,n=s;const r=W(()=>Math.floor(e.value.getTime()/1e3/10));return at.value==="I18N"&&(s=10*1e3,n=s),i&&(s=Number.POSITIVE_INFINITY,n=!1),ct({queryKey:[t,r.value],queryFn:()=>ft(t,r.value),retry:dt,staleTime:s,refetchInterval:n})}export{mt as u};
@@ -1 +0,0 @@
1
- const t={button:{about:{t:0,b:{t:2,i:[{t:3}],s:"关于"}},back:{t:0,b:{t:2,i:[{t:3}],s:"返回"}},go:{t:0,b:{t:2,i:[{t:3}],s:"确定"}},home:{t:0,b:{t:2,i:[{t:3}],s:"首页"}},confirm:{t:0,b:{t:2,i:[{t:3}],s:"确认"}},cancel:{t:0,b:{t:2,i:[{t:3}],s:"取消"}},toggle_dark:{t:0,b:{t:2,i:[{t:3}],s:"切换深色模式"}},toggle_langs:{t:0,b:{t:2,i:[{t:3}],s:"切换语言"}}},intro:{desc:{t:0,b:{t:2,i:[{t:3}],s:"固执己见的 Vite 项目模板"}},"dynamic-route":{t:0,b:{t:2,i:[{t:3}],s:"动态路由演示"}},hi:{t:0,b:{t:2,i:[{t:3,v:"你好,"},{t:4,k:"name"}]}},aka:{t:0,b:{t:2,i:[{t:3}],s:"也叫"}},"whats-your-name":{t:0,b:{t:2,i:[{t:3}],s:"输入你的名字"}}},"not-found":{t:0,b:{t:2,i:[{t:3}],s:"未找到页面"}},common:{loading:{t:0,b:{t:2,i:[{t:3}],s:"加载中"}},colon:{t:0,b:{t:2,i:[{t:3}],s:":"}}},index:{start:{t:0,b:{t:2,i:[{t:3}],s:"开始时间"}},duration:{t:0,b:{t:2,i:[{t:3}],s:"持续时长"}}},type_menu:{rank:{t:0,b:{t:2,i:[{t:3}],s:"排名"}},overview:{t:0,b:{t:2,i:[{t:3}],s:"简介"}},submissions:{t:0,b:{t:2,i:[{t:3}],s:"提交"}},statistics:{t:0,b:{t:2,i:[{t:3}],s:"统计"}},balloon:{t:0,b:{t:2,i:[{t:3}],s:"气球"}},resolver:{t:0,b:{t:2,i:[{t:3}],s:"滚榜"}},filter:{t:0,b:{t:2,i:[{t:3}],s:"筛选"}},options:{t:0,b:{t:2,i:[{t:3}],s:"选项"}},awards:{t:0,b:{t:2,i:[{t:3}],s:"奖项"}},utility:{t:0,b:{t:2,i:[{t:3}],s:"工具"}},countdown:{t:0,b:{t:2,i:[{t:3}],s:"倒计时"}}},utility:{tools:{t:0,b:{t:2,i:[{t:3}],s:"工具集"}},export:{t:0,b:{t:2,i:[{t:3}],s:"导出"}}},standings:{start_time:{t:0,b:{t:2,i:[{t:3}],s:"开始时间"}},end_time:{t:0,b:{t:2,i:[{t:3}],s:"结束时间"}},elapsed:{t:0,b:{t:2,i:[{t:3}],s:"当前时间"}},remaining:{t:0,b:{t:2,i:[{t:3}],s:"剩余时间"}},place:{t:0,b:{t:2,i:[{t:3}],s:"Place"}},team:{t:0,b:{t:2,i:[{t:3}],s:"Team"}},solved:{t:0,b:{t:2,i:[{t:3}],s:"Solved"}},penalty:{t:0,b:{t:2,i:[{t:3}],s:"Penalty"}},dirt:{t:0,b:{t:2,i:[{t:3}],s:"Dirt"}},se:{t:0,b:{t:2,i:[{t:3}],s:"SE"}},statistics:{submitted:{t:0,b:{t:2,i:[{t:3}],s:"Submitted"}},attempted:{t:0,b:{t:2,i:[{t:3}],s:"Attempted"}},accepted:{t:0,b:{t:2,i:[{t:3}],s:"Accepted"}},dirt:{t:0,b:{t:2,i:[{t:3}],s:"Dirt"}},se:{t:0,b:{t:2,i:[{t:3}],s:"SE"}},first_solved:{t:0,b:{t:2,i:[{t:3}],s:"First Solved"}},last_solved:{t:0,b:{t:2,i:[{t:3}],s:"Last Solved"}},head_data:{problems:{t:0,b:{t:2,i:[{t:3}],s:"题目数"}},teams:{t:0,b:{t:2,i:[{t:3}],s:"队伍数"}},submissions:{t:0,b:{t:2,i:[{t:3}],s:"提交数"}}},submit_heatmap:{t:0,b:{t:2,i:[{t:3}],s:"提交热力图"}}},options:{calculation_of_penalty:{t:0,b:{t:2,i:[{t:3}],s:"罚时计算方式"}},in_minutes:{t:0,b:{t:2,i:[{t:3}],s:"精确到分钟进行累加"}},in_seconds:{t:0,b:{t:2,i:[{t:3}],s:"精确到秒进行累加"}},accumulate_in_seconds_and_finally_to_the_minute:{t:0,b:{t:2,i:[{t:3}],s:"精确到秒进行累加,最后精确到分钟"}}}},submissions:{total_submissions:{t:0,b:{t:2,i:[{t:3}],s:"总提交数"}}},team_info:{rank:{t:0,b:{t:2,i:[{t:3}],s:"排名"}},team_name:{t:0,b:{t:2,i:[{t:3}],s:"队名"}},organization:{t:0,b:{t:2,i:[{t:3}],s:"组织"}},group:{t:0,b:{t:2,i:[{t:3}],s:"组别"}},members:{t:0,b:{t:2,i:[{t:3}],s:"队员"}},coaches:{t:0,b:{t:2,i:[{t:3}],s:"教练"}},location:{t:0,b:{t:2,i:[{t:3}],s:"位置"}}}};export{t as default};
@@ -1,121 +0,0 @@
1
- <script setup lang="ts">
2
- import type { Rank, Team } from "@xcpcio/core";
3
- import { MedalType } from "@xcpcio/core";
4
-
5
- const props = defineProps<{
6
- team: Team;
7
- rank: Rank;
8
- }>();
9
-
10
- const team = computed(() => props.team);
11
- const rank = computed(() => props.rank);
12
-
13
- const firstSolvedProblems = computed(() => {
14
- return props.team.problemStatistics.filter((p) => {
15
- if (p.isFirstSolved) {
16
- return true;
17
- }
18
-
19
- return false;
20
- }).map(p => p.problem.label).join(",");
21
- });
22
-
23
- interface Medal {
24
- text: string;
25
- }
26
-
27
- const medal = computed((): Medal | null => {
28
- const awards = props.team.awards;
29
-
30
- if (awards.includes(MedalType.GOLD)) {
31
- return {
32
- text: "Gold",
33
- };
34
- }
35
-
36
- if (awards.includes(MedalType.SILVER)) {
37
- return {
38
- text: "Silver",
39
- };
40
- }
41
-
42
- if (awards.includes(MedalType.BRONZE)) {
43
- return {
44
- text: "Bronze",
45
- };
46
- }
47
-
48
- if (awards.includes(MedalType.HONORABLE)) {
49
- return {
50
- text: "Honorable",
51
- };
52
- }
53
-
54
- return null;
55
- });
56
-
57
- const place = computed(() => {
58
- let r = team.value.rank;
59
-
60
- if (rank.value.contest.organization) {
61
- r = team.value.organizationRank;
62
- }
63
-
64
- if (r === 1) {
65
- return "1st Place";
66
- }
67
-
68
- if (r === 2) {
69
- return "2nd Place";
70
- }
71
-
72
- if (r === 3) {
73
- return "3rd Place";
74
- }
75
-
76
- return "";
77
- });
78
- </script>
79
-
80
- <template>
81
- <div
82
- text-gray-900 dark:text-white
83
- text-xl
84
- font-mono font-semibold italic
85
- flex flex-col gap-2
86
- justify-center items-center
87
- >
88
- <div
89
- flex flex-col
90
- items-start
91
- gap-y-2
92
- >
93
- <div
94
- v-if="medal"
95
- >
96
- {{ medal.text }} Medalist
97
- </div>
98
-
99
- <div
100
- v-if="place.length > 0"
101
- >
102
- {{ place }}
103
- </div>
104
-
105
- <div
106
- v-if="firstSolvedProblems.length"
107
- flex flex-col gap-2
108
- >
109
- <div>
110
- First Solved Problem {{ firstSolvedProblems }}
111
- </div>
112
- </div>
113
-
114
- <div
115
- v-if="team.solvedProblemNum > 0"
116
- >
117
- Solved {{ team.solvedProblemNum }} {{ team.solvedProblemNum > 1 ? 'Problems' : 'Problem' }}
118
- </div>
119
- </div>
120
- </div>
121
- </template>