@algoux/standard-ranklist-renderer-component-vue 0.6.3 → 0.6.5

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/README.md CHANGED
@@ -76,8 +76,18 @@ function handleSolutionClick(payload: SolutionClickPayload) {
76
76
  </template>
77
77
  ```
78
78
 
79
+ ## Advanced Usage
80
+
79
81
  Use `Modal` directly when you want custom modal content. `Ranklist` exposes scoped slots such as `userCell` and `statusCell` for targeted table-cell customization.
80
82
 
83
+ For custom interaction flows, `Ranklist` emits three semantic click events:
84
+
85
+ - `@user-click`: receives `UserClickPayload` when a user cell is clicked.
86
+ - `@problem-click`: receives `ProblemClickPayload` when a problem header is clicked. When listened to, default problem headers are always clickable and problem links are not rendered as anchors.
87
+ - `@solution-click`: receives `SolutionClickPayload` when a status cell with submissions is clicked.
88
+
89
+ `problem-header-cell` slots receive `ranklist` and an `onClick` helper so they can opt into the same problem-click payload path.
90
+
81
91
  ## Ranklist Render Options
82
92
 
83
93
  `Ranklist` includes optional render props for changing the table structure and status presentation while keeping the default behavior unchanged:
@@ -1,7 +1,7 @@
1
1
  import type * as srk from '@algoux/standard-ranklist';
2
2
  import { resolveText } from '@algoux/standard-ranklist-utils';
3
- import { calculateDirtPercentage, calculateSEValue, getProblemHeaderBackgroundImage } from '@algoux/standard-ranklist-renderer-component-core';
4
- import type { ProblemStatisticsFooter, RanklistColumnTitles, RankValue, SolutionClickPayload, StaticRanklistRow, UserClickPayload } from '@algoux/standard-ranklist-renderer-component-core';
3
+ import { calculateDirtPercentage, calculateSEValue, getProblemHeaderBackgroundImageIfStyled } from '@algoux/standard-ranklist-renderer-component-core';
4
+ import type { ProblemStatisticsFooter, ProblemClickPayload, RanklistColumnTitles, RankValue, SolutionClickPayload, StaticRanklistRow, UserClickPayload } from '@algoux/standard-ranklist-renderer-component-core';
5
5
  declare const _sfc_main: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
6
6
  data: {
7
7
  type: ObjectConstructor;
@@ -81,8 +81,10 @@ declare const _sfc_main: import("vue").DefineComponent<import("vue").ExtractProp
81
81
  };
82
82
  }>, {
83
83
  props: any;
84
- emit: (event: "userClick" | "solutionClick", ...args: any[]) => void;
84
+ emit: (event: "userClick" | "problemClick" | "solutionClick", ...args: any[]) => void;
85
+ instance: import("vue").ComponentInternalInstance | null;
85
86
  resolvedTheme: import("vue").ComputedRef<any>;
87
+ hasProblemClickListener: import("vue").ComputedRef<boolean>;
86
88
  supportedVersions: any;
87
89
  isSupportedVersion: import("vue").ComputedRef<boolean>;
88
90
  showTimeColumn: import("vue").ComputedRef<boolean>;
@@ -111,6 +113,8 @@ declare const _sfc_main: import("vue").DefineComponent<import("vue").ExtractProp
111
113
  backgroundColor: any;
112
114
  };
113
115
  getStatusSolutions: (status: srk.RankProblemStatus) => srk.Solution[];
116
+ emitProblemClickPayload: (payload: ProblemClickPayload) => void;
117
+ emitProblemClick: (problem: srk.Problem, problemIndex: number, event?: MouseEvent | undefined) => void;
114
118
  getProblemStatisticsFooterCellPrimary: (key: string, stat: ProblemStatisticsFooter) => string | number;
115
119
  getProblemStatisticsFooterCellSecondary: (key: string, stat: ProblemStatisticsFooter) => string | undefined;
116
120
  emitUserClick: (payloadOrRow: UserClickPayload | StaticRanklistRow, rowIndex?: number | undefined, event?: MouseEvent | undefined) => void;
@@ -119,7 +123,7 @@ declare const _sfc_main: import("vue").DefineComponent<import("vue").ExtractProp
119
123
  readonly numberToAlphabet: any;
120
124
  readonly calculateDirtPercentage: typeof calculateDirtPercentage;
121
125
  readonly calculateSEValue: typeof calculateSEValue;
122
- readonly getProblemHeaderBackgroundImage: typeof getProblemHeaderBackgroundImage;
126
+ readonly getProblemHeaderBackgroundImageIfStyled: typeof getProblemHeaderBackgroundImageIfStyled;
123
127
  ProblemHeaderCell: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
124
128
  problem: {
125
129
  type: null;
@@ -129,6 +133,10 @@ declare const _sfc_main: import("vue").DefineComponent<import("vue").ExtractProp
129
133
  type: NumberConstructor;
130
134
  required: true;
131
135
  };
136
+ ranklist: {
137
+ type: ObjectConstructor;
138
+ required: true;
139
+ };
132
140
  theme: {
133
141
  type: StringConstructor;
134
142
  required: false;
@@ -138,12 +146,18 @@ declare const _sfc_main: import("vue").DefineComponent<import("vue").ExtractProp
138
146
  type: ArrayConstructor;
139
147
  required: false;
140
148
  };
149
+ onProblemClick: {
150
+ type: FunctionConstructor;
151
+ required: false;
152
+ };
141
153
  }>, {
142
154
  props: any;
143
155
  alias: import("vue").ComputedRef<any>;
156
+ title: import("vue").ComputedRef<any>;
144
157
  stat: import("vue").ComputedRef<any>;
145
158
  statDesc: import("vue").ComputedRef<string>;
146
- backgroundImage: import("vue").ComputedRef<string>;
159
+ backgroundImage: import("vue").ComputedRef<string | undefined>;
160
+ handleClick: (event: MouseEvent) => void;
147
161
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
148
162
  problem: {
149
163
  type: null;
@@ -153,6 +167,10 @@ declare const _sfc_main: import("vue").DefineComponent<import("vue").ExtractProp
153
167
  type: NumberConstructor;
154
168
  required: true;
155
169
  };
170
+ ranklist: {
171
+ type: ObjectConstructor;
172
+ required: true;
173
+ };
156
174
  theme: {
157
175
  type: StringConstructor;
158
176
  required: false;
@@ -162,6 +180,10 @@ declare const _sfc_main: import("vue").DefineComponent<import("vue").ExtractProp
162
180
  type: ArrayConstructor;
163
181
  required: false;
164
182
  };
183
+ onProblemClick: {
184
+ type: FunctionConstructor;
185
+ required: false;
186
+ };
165
187
  }>> & Readonly<{}>, {
166
188
  theme: string;
167
189
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -222,6 +244,7 @@ declare const _sfc_main: import("vue").DefineComponent<import("vue").ExtractProp
222
244
  fbStar: string;
223
245
  solutions: import("vue").ComputedRef<any[]>;
224
246
  isClickable: import("vue").ComputedRef<boolean>;
247
+ statusResultClassName: import("vue").ComputedRef<string | undefined>;
225
248
  commonClassName: import("vue").ComputedRef<(string | {
226
249
  'srk--cursor-pointer': boolean;
227
250
  'srk-prest-status-block-color-text': any;
@@ -424,7 +447,7 @@ declare const _sfc_main: import("vue").DefineComponent<import("vue").ExtractProp
424
447
  hideOrganization: boolean;
425
448
  hideAvatar: boolean;
426
449
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
427
- }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("userClick" | "solutionClick")[], "userClick" | "solutionClick", import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
450
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("userClick" | "problemClick" | "solutionClick")[], "userClick" | "problemClick" | "solutionClick", import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
428
451
  data: {
429
452
  type: ObjectConstructor;
430
453
  required: true;
@@ -503,6 +526,7 @@ declare const _sfc_main: import("vue").DefineComponent<import("vue").ExtractProp
503
526
  };
504
527
  }>> & Readonly<{
505
528
  onUserClick?: ((...args: any[]) => any) | undefined;
529
+ onProblemClick?: ((...args: any[]) => any) | undefined;
506
530
  onSolutionClick?: ((...args: any[]) => any) | undefined;
507
531
  }>, {
508
532
  theme: string;
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require("@algoux/standard-ranklist-renderer-component-styles");var e=require("vue"),d=require("@algoux/standard-ranklist-renderer-component-core"),B=require("@algoux/standard-ranklist-utils");const O=["data-srk-modal-state"],L=["aria-labelledby"],q={class:"srk-modal-content"},R={key:0,class:"srk-modal-header"},H={class:"srk-modal-body"},U=e.defineComponent({__name:"Modal",props:{open:{type:Boolean},title:{},width:{},rootClassName:{},wrapClassName:{},style:{},destroyOnClose:{type:Boolean,default:!0},closeOnEsc:{type:Boolean,default:!0},closeOnMaskClick:{type:Boolean,default:!0}},emits:["close","update:open"],setup(t,{emit:o}){let l=0;const r=t,u=o,g=`srk-vue-modal-title-${++l}`,f=e.ref(null),a=e.ref(r.open||!r.destroyOnClose),m=e.ref(r.open?"pre-open":"closing"),c=e.ref({x:0,y:0});let y=null,k=null,S=null;const E=e.computed(()=>a.value||!r.destroyOnClose),z=e.computed(()=>["srk-modal-root",d.SRK_ANIMATED_MODAL_ROOT_CLASS,r.rootClassName].filter(Boolean)),A=e.computed(()=>r.open||r.destroyOnClose&&a.value),D=e.computed(()=>{var b,x;return{...r.style,width:r.width?`${r.width}px`:(b=r.style)==null?void 0:b.width,["--srk-modal-origin-x"]:`${c.value.x}px`,["--srk-modal-origin-y"]:`${c.value.y}px`,["--srk-modal-max-width"]:r.width?`${r.width}px`:typeof((x=r.style)==null?void 0:x.width)=="string"?r.style.width:void 0}});function T(){if(typeof window=="undefined"){y=null,k=null;return}y!==null&&(window.clearTimeout(y),y=null),k!==null&&(window.clearTimeout(k),k=null)}async function N(){if(await e.nextTick(),typeof window=="undefined"||!r.open||!a.value||m.value!=="pre-open")return;C();const b=d.resolveModalTransformOrigin(f.value);c.value=b.origin,k=window.setTimeout(()=>{m.value="opening",k=null},0)}function C(){const b=d.registerModalFocusScope(f.value,{onEscape:F});S===null&&(S=b)}function w(){S!==null&&(d.unregisterModalFocusScope(S),S=null)}function M(b){u("update:open",!1),u("close",b)}function P(b){r.closeOnMaskClick&&b.target===b.currentTarget&&M("mask")}function F(b){r.open&&r.closeOnEsc&&M("escape")}return e.watch(()=>r.open,async b=>{if(T(),b){a.value=!0,c.value={x:0,y:0},m.value="pre-open",await N();return}if(w(),m.value="closing",!r.destroyOnClose){a.value=!0;return}a.value&&typeof window!="undefined"&&(y=window.setTimeout(()=>{a.value=!1,y=null},d.MODAL_ANIMATION_DURATION_MS))},{immediate:!0}),e.watchEffect(b=>{!A.value||(d.lockModalBodyScroll(),b(()=>{d.unlockModalBodyScroll()}))}),e.onMounted(()=>{d.ensureModalInteractionTracker(),r.open&&C()}),e.onBeforeUnmount(()=>{T(),w()}),(b,x)=>E.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(z.value),"data-srk-modal-state":m.value},[x[2]||(x[2]=e.createElementVNode("div",{class:"srk-modal-mask"},null,-1)),e.createElementVNode("div",{class:e.normalizeClass(["srk-modal-wrap",t.wrapClassName]),tabindex:"-1",onMousedown:P},[e.createElementVNode("div",{class:"srk-modal",role:"dialog","aria-modal":"true","aria-labelledby":t.title?g:void 0,"data-srk-modal-panel":"true",tabindex:"-1",ref_key:"dialogRef",ref:f,style:e.normalizeStyle(D.value)},[e.createElementVNode("div",q,[e.createElementVNode("button",{"aria-label":"Close",class:"srk-modal-close",type:"button",onClick:x[0]||(x[0]=I=>M("close-button"))},[...x[1]||(x[1]=[e.createElementVNode("span",{class:"srk-modal-close-x"},null,-1)])]),t.title!==void 0?(e.openBlock(),e.createElementBlock("div",R,[e.createElementVNode("div",{id:g,class:"srk-modal-title"},e.toDisplayString(t.title),1)])):e.createCommentVNode("",!0),e.createElementVNode("div",H,[e.renderSlot(b.$slots,"default")])])],12,L)],34)],10,O)):e.createCommentVNode("",!0)}}),K={class:"srk-common-table srk-solutions-table"},j={class:"srk--text-right"},J=e.defineComponent({__name:"DefaultSolutionModal",props:{open:{type:Boolean},user:{},problem:{},problemIndex:{},solutions:{default:()=>[]},title:{},width:{default:320},rootClassName:{default:"srk-general-modal-root"},wrapClassName:{default:"srk-solutions-modal"},style:{},languages:{}},emits:["close","update:open"],setup(t,{emit:o}){const l=t,r=o,u=e.ref(l.user?{user:l.user,problem:l.problem,problemIndex:l.problemIndex,solutions:l.solutions}:null);e.watch([()=>l.user,()=>l.problem,()=>l.problemIndex,()=>l.solutions],([f,a,m,c])=>{f&&(u.value={user:f,problem:a,problemIndex:m,solutions:c})},{immediate:!0});const g=e.computed(()=>l.title||(u.value?d.getSolutionModalTitle(u.value.problemIndex,u.value.user,l.languages):""));return(f,a)=>u.value?(e.openBlock(),e.createBlock(U,{key:0,open:t.open,title:g.value,width:t.width,"root-class-name":t.rootClassName,"wrap-class-name":t.wrapClassName,style:e.normalizeStyle(t.style),onClose:a[0]||(a[0]=m=>r("close",m)),"onUpdate:open":a[1]||(a[1]=m=>r("update:open",m))},{default:e.withCtx(()=>[e.createElementVNode("table",K,[a[2]||(a[2]=e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[e.createElementVNode("th",{class:"srk--text-left"},"Result"),e.createElementVNode("th",{class:"srk--text-right"},"Time")])],-1)),e.createElementVNode("tbody",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.value.solutions,(m,c)=>{var y;return e.openBlock(),e.createElementBlock("tr",{key:`${m.result}_${(y=m.time)==null?void 0:y[0]}_${c}`},[e.createElementVNode("td",null,[e.createElementVNode("span",{class:e.normalizeClass(["srk-solution-result-text",e.unref(d.getSolutionResultMeta)(m.result).className])},e.toDisplayString(e.unref(d.getSolutionResultMeta)(m.result).label),3)]),e.createElementVNode("td",j,e.toDisplayString(e.unref(d.formatSolutionTimestamp)(m)),1)])}),128))])])]),_:1},8,["open","title","width","root-class-name","wrap-class-name","style"])):e.createCommentVNode("",!0)}}),W={class:"srk-user-modal-info"},G={class:"srk-user-modal-info-user-name"},Q={key:0,class:"srk-user-modal-info-user-second-name"},X={class:"srk-user-modal-info-labels"},Y={class:"srk-user-modal-info-labels-label srk-user-modal-info-labels-label-preset-general"},Z={key:1,class:"srk-user-modal-info-team-members"},_={key:0,class:"srk-user-modal-info-team-members-slash"},ee={key:2,class:"srk-user-modal-info-photo"},te=["src"],se=e.defineComponent({__name:"DefaultUserModal",props:{open:{type:Boolean},user:{},markers:{default:()=>[]},theme:{default:B.EnumTheme.light},title:{default:"User Info"},width:{default:420},rootClassName:{default:"srk-general-modal-root"},wrapClassName:{default:"srk-user-modal"},style:{},formatSrkAssetUrl:{},languages:{}},emits:["close","update:open"],setup(t,{emit:o}){const l=t,r=o,u=e.ref(l.user||null);e.watch(()=>l.user,c=>{c&&(u.value=c)},{immediate:!0});const g=e.computed(()=>u.value?B.resolveUserMarkers(u.value,l.markers).map(c=>({marker:c,presentation:d.getMarkerPresentation(c,l.theme)})):[]);function f(c,y){return d.resolveSrkAssetUrl(c,y,l.formatSrkAssetUrl)}function a(c){return B.resolveText(c,l.languages)}function m(c){return d.formatTeamMemberName(c,l.languages)}return(c,y)=>u.value?(e.openBlock(),e.createBlock(U,{key:0,open:t.open,title:t.title,width:t.width,"root-class-name":t.rootClassName,"wrap-class-name":t.wrapClassName,style:e.normalizeStyle(t.style),onClose:y[0]||(y[0]=k=>r("close",k)),"onUpdate:open":y[1]||(y[1]=k=>r("update:open",k))},{default:e.withCtx(()=>[e.createElementVNode("div",W,[e.createElementVNode("h3",G,e.toDisplayString(a(u.value.name)),1),u.value.organization?(e.openBlock(),e.createElementBlock("p",Q,e.toDisplayString(a(u.value.organization)),1)):e.createCommentVNode("",!0),e.createElementVNode("div",X,[e.createElementVNode("span",Y,e.toDisplayString(u.value.official===!1?"\uFF0A \u975E\u6B63\u5F0F\u53C2\u52A0\u8005":"\u6B63\u5F0F\u53C2\u52A0\u8005"),1),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.value,k=>(e.openBlock(),e.createElementBlock("span",{key:k.marker.id,class:e.normalizeClass(["srk-user-modal-info-labels-label",k.presentation.className]),style:e.normalizeStyle(k.presentation.style)},e.toDisplayString(a(k.marker.label)),7))),128))]),u.value.teamMembers&&u.value.teamMembers.length?(e.openBlock(),e.createElementBlock("div",Z,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.value.teamMembers,(k,S)=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:a(k.name)},[S>0?(e.openBlock(),e.createElementBlock("span",_," / ")):e.createCommentVNode("",!0),e.createElementVNode("span",null,e.toDisplayString(m(k)),1)],64))),128))])):e.createCommentVNode("",!0),u.value.photo?(e.openBlock(),e.createElementBlock("div",ee,[e.createElementVNode("img",{src:f(u.value.photo,"user.photo"),alt:"User portrait",class:"srk-user-modal-info-photo-img"},null,8,te)])):e.createCommentVNode("",!0)])]),_:1},8,["open","title","width","root-class-name","wrap-class-name","style"])):e.createCommentVNode("",!0)}}),le={class:"srk-progress-bar-container"},re={class:"srk-progress-bar"},oe={class:"srk-progress-bar-body"},ae={key:0,class:"srk-progress-slider-layer"},ne=["max","title"],ie={class:"srk-progress-secondary-area"},ce={class:"srk-progress-secondary-area-center"},ue={key:0,class:"srk-progress-time-machine-status"},de={key:1,class:"srk-progress-live-text"},me={key:2,style:{visibility:"hidden"}},ke=e.defineComponent({__name:"ProgressBar",props:{data:{},enableTimeTravel:{type:Boolean,default:!1},live:{type:Boolean,default:!1},td:{default:0}},emits:["timeTravel"],setup(t,{emit:o}){const l=t,r=o,u=e.ref(Date.now()),g=e.ref(!1),f=e.ref(!1),a=e.ref(d.getProgressMaxAvailableMinutes(l.data.contest,u.value,l.td)),m=e.ref(null);let c;const y=e.computed(()=>d.getProgressDurationMinutes(l.data.contest)),k=e.computed(()=>d.getProgressMaxAvailableMinutes(l.data.contest,u.value,l.td)),S=e.computed(()=>d.isProgressEnded(l.data.contest,u.value,l.td)),E=e.computed(()=>d.getProgressMetrics(l.data,u.value,l.td,a.value,g.value));function z(){u.value=Date.now(),S.value&&c!==void 0&&(window.clearInterval(c),c=void 0)}function A(C){typeof window!="undefined"&&(C&&c===void 0&&(c=window.setInterval(z,1e3)),!C&&c!==void 0&&(window.clearInterval(c),c=void 0))}function D(C){const w=C>=y.value||C>=k.value;r("timeTravel",w?null:C*60*1e3),g.value=!w,m.value=w?null:C*60*1e3,f.value=!1}function T(){f.value=!0,g.value=!0}function N(){f.value&&D(a.value)}return e.watch(k,C=>{!f.value&&m.value===null&&(a.value=C)}),e.watch(()=>l.live,C=>A(C),{immediate:!0}),e.watch(()=>l.data.contest.title,()=>{f.value=!1,a.value=k.value,m.value=null,g.value=!1,r("timeTravel",null)}),e.onBeforeUnmount(()=>{c!==void 0&&(window.clearInterval(c),c=void 0)}),(C,w)=>(e.openBlock(),e.createElementBlock("div",le,[e.createElementVNode("div",re,[e.createElementVNode("div",oe,[e.createElementVNode("div",{class:"srk-progress-bar-segment srk-progress-bar-normal",style:e.normalizeStyle({width:`${E.value.frozenBreakpoint*100}%`})},[e.createElementVNode("div",{class:"srk-progress-bar-fill",style:e.normalizeStyle({width:`${E.value.normalInnerPercent}%`})},null,4)],4),e.createElementVNode("div",{class:"srk-progress-bar-segment srk-progress-bar-frozen",style:e.normalizeStyle({width:`${(1-E.value.frozenBreakpoint)*100}%`})},[e.createElementVNode("div",{class:"srk-progress-bar-fill",style:e.normalizeStyle({width:`${E.value.frozenInnerPercent}%`})},null,4)],4)]),t.enableTimeTravel&&E.value.supportRegen?(e.openBlock(),e.createElementBlock("div",ae,[f.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:"srk-progress-slider-tooltip",style:e.normalizeStyle({left:`${y.value?a.value/y.value*100:0}%`})},e.toDisplayString(e.unref(B.secToTimeStr)(a.value*60)),5)):e.createCommentVNode("",!0),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":w[0]||(w[0]=M=>a.value=M),"aria-label":"Time Travel",class:"srk-progress-slider",max:y.value,min:"0",step:"1",title:e.unref(B.secToTimeStr)(a.value*60),type:"range",onBlur:N,onKeydown:T,onKeyup:N,onMousedown:T,onMouseup:N,onTouchend:N,onTouchstart:T},null,40,ne),[[e.vModelText,a.value,void 0,{number:!0}]])])):e.createCommentVNode("",!0)]),e.createElementVNode("div",ie,[e.createElementVNode("div",{class:"srk-progress-secondary-area-left",style:e.normalizeStyle(t.live||g.value?{}:{display:"none"})}," Elapsed: "+e.toDisplayString(e.unref(B.secToTimeStr)(Math.round(E.value.elapsed/1e3))),5),e.createElementVNode("div",ce,[g.value?(e.openBlock(),e.createElementBlock("div",ue,[...w[1]||(w[1]=[e.createElementVNode("div",{class:"srk-progress-time-machine-text"},"Time Travel Mode",-1)])])):t.live&&!S.value?(e.openBlock(),e.createElementBlock("div",de,"Live")):(e.openBlock(),e.createElementBlock("div",me,"SRK"))]),e.createElementVNode("div",{class:"srk-progress-secondary-area-right",style:e.normalizeStyle(t.live||g.value?{}:{display:"none"})}," Remaining: "+e.toDisplayString(e.unref(B.secToTimeStr)(Math.round(E.value.remaining/1e3))),5)])]))}}),pe=["href"],fe={class:"srk--display-block"},ge=["title"],ve={class:"srk--display-block"},ye=["title"],he=e.defineComponent({__name:"ProblemHeaderCell",props:{problem:{},index:{},theme:{default:B.EnumTheme.light},languages:{}},setup(t){const o=t,l=e.computed(()=>o.problem.alias||B.numberToAlphabet(o.index)),r=e.computed(()=>o.problem.statistics),u=e.computed(()=>{if(!r.value)return"";const f=r.value.submitted?(r.value.accepted/r.value.submitted*100).toFixed(1):0;return`${r.value.accepted} / ${r.value.submitted} (${f}%)`}),g=e.computed(()=>d.getProblemHeaderBackgroundImage(o.problem.style,o.theme));return(f,a)=>(e.openBlock(),e.createElementBlock("th",{class:"srk--nowrap srk-problem-header",style:e.normalizeStyle({backgroundImage:g.value})},[t.problem.link?(e.openBlock(),e.createElementBlock("a",{key:0,href:t.problem.link,target:"_blank",rel:"noopener noreferrer",style:{color:"unset"}},[e.createElementVNode("span",fe,e.toDisplayString(l.value),1),r.value?(e.openBlock(),e.createElementBlock("span",{key:0,class:"srk--display-block srk-problem-stats",title:u.value},e.toDisplayString(r.value.accepted),9,ge)):e.createCommentVNode("",!0)],8,pe)):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createElementVNode("span",ve,e.toDisplayString(l.value),1),r.value?(e.openBlock(),e.createElementBlock("span",{key:0,class:"srk--display-block srk-problem-stats",title:u.value},e.toDisplayString(r.value.accepted),9,ye)):e.createCommentVNode("",!0)],64))],4))}}),be={key:0,class:"srk-prest-status-block-fb-star"},Be={key:4,class:"srk-status-placeholder-cell srk--text-center srk--nowrap"},Ce="\u2605",Ee=e.defineComponent({__name:"StatusCell",props:{status:{},problem:{},problemIndex:{},user:{},row:{},rowIndex:{},ranklist:{},onSolutionClick:{},statusCellPreset:{default:"classic"},statusColorAsText:{type:Boolean,default:!1},emptyStatusPlaceholder:{default:null},languages:{}},setup(t){const o=t,l=e.computed(()=>[...o.status.solutions||[]].reverse()),r=e.computed(()=>l.value.length>0&&!!o.onSolutionClick),u=e.computed(()=>["srk-prest-status-block","srk--text-center","srk--nowrap",{"srk--cursor-pointer":r.value,"srk-prest-status-block-color-text":o.statusColorAsText}]);function g(a){var m,c;!r.value||(d.captureModalTriggerPointFromMouseEvent(a,{source:"status-cell",context:{rowIndex:o.rowIndex,problemIndex:o.problemIndex,problemAlias:((m=o.problem)==null?void 0:m.alias)||null,problemTitle:o.problem?B.resolveText(o.problem.title,o.languages):null,userId:o.user.id||null}}),(c=o.onSolutionClick)==null||c.call(o,{user:o.user,row:o.row,rowIndex:o.rowIndex,problemIndex:o.problemIndex,problem:o.problem,status:o.status,solutions:l.value,ranklist:o.ranklist}))}const f=e.defineComponent({props:{status:{type:Object,required:!0},ranklist:{type:Object,required:!0},preset:{type:String,required:!0}},setup(a){return()=>{const m=a.status,c=a.ranklist,y=a.preset,k=d.getRankProblemStatusCellPresentation(m,c,y);return typeof k.score=="number"?[e.h("span",{class:"srk-prest-status-block-score"},k.score),e.h("span",{class:"srk-prest-status-block-score-details"},k.scoreDetails)]:k.secondary!==void 0?[e.h("span",{class:"srk-prest-status-block-primary"},k.primary||"")," ",e.h("span",{class:"srk-prest-status-block-secondary"},k.secondary)]:k.primary||""}}});return(a,m)=>t.status.result==="FB"?(e.openBlock(),e.createElementBlock("td",{key:0,class:e.normalizeClass([u.value,"srk-prest-status-block-fb"]),onClick:e.withModifiers(g,["prevent"])},[t.statusColorAsText?(e.openBlock(),e.createElementBlock("span",be,e.toDisplayString(Ce))):e.createCommentVNode("",!0),e.createVNode(e.unref(f),{status:t.status,ranklist:t.ranklist,preset:t.statusCellPreset},null,8,["status","ranklist","preset"])],2)):t.status.result==="AC"?(e.openBlock(),e.createElementBlock("td",{key:1,class:e.normalizeClass([u.value,"srk-prest-status-block-accepted"]),onClick:e.withModifiers(g,["prevent"])},[e.createVNode(e.unref(f),{status:t.status,ranklist:t.ranklist,preset:t.statusCellPreset},null,8,["status","ranklist","preset"])],2)):t.status.result==="?"?(e.openBlock(),e.createElementBlock("td",{key:2,class:e.normalizeClass([u.value,"srk-prest-status-block-frozen"]),onClick:e.withModifiers(g,["prevent"])},[e.createVNode(e.unref(f),{status:t.status,ranklist:t.ranklist,preset:t.statusCellPreset},null,8,["status","ranklist","preset"])],2)):t.status.result==="RJ"?(e.openBlock(),e.createElementBlock("td",{key:3,class:e.normalizeClass([u.value,"srk-prest-status-block-failed"]),onClick:e.withModifiers(g,["prevent"])},[e.createVNode(e.unref(f),{status:t.status,ranklist:t.ranklist,preset:t.statusCellPreset},null,8,["status","ranklist","preset"])],2)):(e.openBlock(),e.createElementBlock("td",Be,e.toDisplayString(t.emptyStatusPlaceholder),1))}}),Se={class:"srk-user-cell-content"},Ne={key:0,class:"srk-user-avatar"},we=["src"],xe={class:"srk-user-body"},Ve={class:"srk-user-name-row"},Te=["title"],Me={class:"srk-marker-dot-group"},$e=["data-tooltip"],De={key:0,class:"srk-user-secondary-text srk--text-ellipsis",title:""},ze=e.defineComponent({__name:"UserCell",props:{user:{},row:{},rowIndex:{},ranklist:{},markers:{default:()=>[]},theme:{default:B.EnumTheme.light},formatSrkAssetUrl:{},onUserClick:{},hideOrganization:{type:Boolean,default:!1},hideAvatar:{type:Boolean,default:!1},languages:{}},setup(t){const o=t,l=e.computed(()=>g(o.user.name)),r=e.computed(()=>B.resolveUserMarkers(o.user,o.markers)),u=e.computed(()=>r.value.map(a=>({marker:a,presentation:d.getMarkerPresentation(a,o.theme)})));function g(a){return B.resolveText(a,o.languages)}function f(a){var m;d.captureModalTriggerPointFromMouseEvent(a,{source:"user-cell",context:{rowIndex:o.rowIndex,userId:o.user.id||null,userName:l.value}}),(m=o.onUserClick)==null||m.call(o,{user:o.user,row:o.row,rowIndex:o.rowIndex,ranklist:o.ranklist})}return(a,m)=>(e.openBlock(),e.createElementBlock("td",{class:e.normalizeClass(["srk--text-left srk--nowrap srk-user-cell",{"srk--cursor-pointer":!!t.onUserClick}]),title:"",onClick:e.withModifiers(f,["prevent"])},[e.createElementVNode("div",Se,[t.user.avatar&&!t.hideAvatar?(e.openBlock(),e.createElementBlock("div",Ne,[e.createElementVNode("img",{src:t.formatSrkAssetUrl(t.user.avatar,"user.avatar"),alt:"User Avatar"},null,8,we)])):e.createCommentVNode("",!0),e.createElementVNode("div",xe,[e.createElementVNode("div",Ve,[e.createElementVNode("span",{class:"srk-user-name-text",title:l.value},e.toDisplayString(l.value),9,Te),e.createElementVNode("span",Me,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.value,c=>(e.openBlock(),e.createElementBlock("span",{key:c.marker.id,class:e.normalizeClass(["srk-marker srk-marker-dot srk--c-tooltip",c.presentation.className]),style:e.normalizeStyle(c.presentation.style),"data-tooltip":g(c.marker.label)},null,14,$e))),128))])]),t.user.organization&&!t.hideOrganization?(e.openBlock(),e.createElementBlock("p",De,e.toDisplayString(g(t.user.organization)),1)):e.createCommentVNode("",!0)])])],2))}}),Ae={key:0},Pe={key:1},Fe={key:2,class:"srk-common-table srk-main"},Ie={key:0,class:"srk-organization-header srk--text-left srk--nowrap"},Ue={class:"srk--text-left srk--nowrap"},Oe={class:"srk--text-right srk--nowrap"},Le={key:1,class:"srk--text-right srk--nowrap"},qe={key:2,class:"srk-dirt-header srk--text-right srk--nowrap"},Re={key:3,class:"srk-se-header srk--text-right srk--nowrap"},He={class:"srk-organization-cell-content"},Ke={key:0,class:"srk-user-avatar"},je=["src"],Je=["title"],We={class:"srk--text-right srk--nowrap"},Ge={key:1,class:"srk--text-right srk--nowrap"},Qe={key:2,class:"srk-dirt-cell srk--text-right srk--nowrap"},Xe={key:3,class:"srk-se-cell srk--text-right srk--nowrap"},Ye={key:0},Ze=["colspan"],_e=["data-tooltip"],et={class:"srk-problem-statistics-footer-primary"},tt={class:"srk-problem-statistics-footer-secondary"},st={key:0,class:"srk-problem-statistics-footer-cell srk-extra-statistics-footer-cell srk-dirt-footer-cell srk--nowrap"},lt={key:1,class:"srk-problem-statistics-footer-cell srk-extra-statistics-footer-cell srk-se-footer-cell srk--nowrap"},rt={class:"srk-problem-statistics-footer-row srk-problem-statistics-footer-problem-label-row"},ot=["colspan"],at={class:"srk--display-block"},nt={key:0,class:"srk-problem-statistics-footer-cell srk-extra-statistics-footer-cell srk-dirt-footer-cell srk--nowrap"},it={key:1,class:"srk-problem-statistics-footer-cell srk-extra-statistics-footer-cell srk-se-footer-cell srk--nowrap"},ct=e.defineComponent({__name:"Ranklist",props:{data:{},theme:{default:B.EnumTheme.light},rowBordered:{type:Boolean,default:!1},columnBordered:{type:Boolean,default:!1},rowStriped:{type:Boolean,default:!1},formatSrkAssetUrl:{},splitOrganization:{type:Boolean,default:!1},columnTitles:{},statusCellPreset:{default:"classic"},statusColorAsText:{type:Boolean,default:!1},showProblemStatisticsFooter:{type:Boolean,default:!1},showDirtColumn:{type:Boolean,default:!1},showSEColumn:{type:Boolean,default:!1},emptyStatusPlaceholder:{default:null},userAvatarPlacement:{default:"user"},languages:{}},emits:["userClick","solutionClick"],setup(t,{emit:o}){const l=t,r=o,u=e.computed(()=>l.theme),g=d.srkSupportedVersions,f=e.computed(()=>d.caniuse(l.data.version)),a=e.computed(()=>d.shouldShowTimeColumn(l.data.rows)),m=e.computed(()=>l.splitOrganization&&l.userAvatarPlacement==="organization"),c=e.computed(()=>l.showProblemStatisticsFooter||l.showSEColumn?d.calculateProblemStatisticsFooter(l.data):[]),y=e.computed(()=>l.data.series.length+1+1+(a.value?1:0)+(l.splitOrganization?1:0)),k=[{key:"accepted",label:"Accepted",tooltip:"Number of participants who solved this problem"},{key:"attempted",label:"Attempted",tooltip:"Number of participants who attempted this problem"},{key:"submitted",label:"Submitted",tooltip:"Total number of valid submissions for this problem"},{key:"dirt",label:"Dirt",tooltip:"Wrong submissions among participants who solved this problem"},{key:"se",label:"SE",tooltip:"Average hardness, calculated as (participants - accepted) / participants"},{key:"firstAccepted",label:"FB at",tooltip:"First Blood at, also known as first solve time, in minutes"},{key:"lastAccepted",label:"LB at",tooltip:"Last Blood at, also known as last solve time, in minutes"}];function S(n,i){return d.resolveSrkAssetUrl(n,i,l.formatSrkAssetUrl)}function E(n){return B.resolveText(n,l.languages)}function z(n){return n.rankValues||l.data.series.map(()=>({rank:null,segmentIndex:null}))}function A(n,i){return n.rank?n.rank:i.user.official===!1?"\uFF0A":""}function D(n){return((n==null?void 0:n.segments)||[]).some(i=>typeof i.style=="string")}function T(n,i){var p,h,v;const s=(p=l.columnTitles)==null?void 0:p.series;return typeof s=="function"?(h=s(n,i))!=null?h:n.title:Array.isArray(s)&&(v=s[i])!=null?v:n.title}function N(n,i){var s,p;return(p=(s=l.columnTitles)==null?void 0:s[n])!=null?p:i}function C(n,i){const s=n.segmentIndex||n.segmentIndex===0?n.segmentIndex:-1;return((i==null?void 0:i.segments)||[])[s]||{}}function w(n,i){const s=C(n,i).style;return typeof s=="string"?`srk-preset-series-segment-${s}`:""}function M(n,i){const s={[B.EnumTheme.light]:void 0,[B.EnumTheme.dark]:void 0},p=C(n,i).style;if(!p||typeof p=="string")return{};const h=B.resolveStyle(p),v=h.textColor||s,V=h.backgroundColor||s;return{color:v[l.theme],backgroundColor:V[l.theme]}}function P(n){return[...n.solutions||[]].reverse()}function F(n,i){switch(n){case"accepted":return i.accepted;case"attempted":return i.attempted;case"submitted":return i.submitted;case"dirt":return i.dirt;case"se":return d.formatProblemStatisticsAverageHardness(i);case"firstAccepted":return d.formatProblemStatisticsAcceptedMinute(i.firstAcceptedTime);case"lastAccepted":return d.formatProblemStatisticsAcceptedMinute(i.lastAcceptedTime);default:return""}}function b(n,i){switch(n){case"accepted":return d.formatProblemStatisticsPercent(i.accepted,i.participantCount);case"attempted":return d.formatProblemStatisticsPercent(i.attempted,i.participantCount);case"dirt":return d.formatProblemStatisticsPercent(i.dirt,i.dirtSubmitted);default:return}}function x(n,i,s){if("ranklist"in n){r("userClick",n);return}s&&d.captureModalTriggerPointFromMouseEvent(s,{source:"user-cell",context:{rowIndex:i||0,userId:n.user.id||null,userName:E(n.user.name)}}),r("userClick",{user:n.user,row:n,rowIndex:i||0,ranklist:l.data})}function I(n,i,s,p,h){if("solutions"in n){r("solutionClick",n);return}const v=p||0,V=s||n.statuses[v];if(h){const $=l.data.problems[v];d.captureModalTriggerPointFromMouseEvent(h,{source:"status-cell",context:{rowIndex:i||0,problemIndex:v,problemAlias:($==null?void 0:$.alias)||null,problemTitle:$?E($.title):null,userId:n.user.id||null}})}r("solutionClick",{user:n.user,row:n,rowIndex:i||0,problemIndex:v,problem:l.data.problems[v],status:V,solutions:P(V),ranklist:l.data})}return(n,i)=>t.data.type!=="general"?(e.openBlock(),e.createElementBlock("div",Ae,'srk type "'+e.toDisplayString(t.data.type)+'" is not supported',1)):f.value?(e.openBlock(),e.createElementBlock("div",Fe,[e.createElementVNode("table",{class:e.normalizeClass({"srk-table-row-bordered":t.rowBordered,"srk-table-column-bordered":t.columnBordered,"srk-table-row-striped":t.rowStriped})},[e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.data.series,(s,p)=>(e.openBlock(),e.createElementBlock("th",{key:s.title,class:e.normalizeClass(["srk-series-header srk--text-right srk--nowrap",{"srk-series-segmented-column":D(s)}])},e.toDisplayString(T(s,p)),3))),128)),t.splitOrganization?(e.openBlock(),e.createElementBlock("th",Ie,e.toDisplayString(N("organization","Organization")),1)):e.createCommentVNode("",!0),e.createElementVNode("th",Ue,e.toDisplayString(N("user","Name")),1),e.createElementVNode("th",Oe,e.toDisplayString(N("score","Score")),1),a.value?(e.openBlock(),e.createElementBlock("th",Le,e.toDisplayString(N("time","Time")),1)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.data.problems,(s,p)=>e.renderSlot(n.$slots,"problem-header-cell",e.mergeProps({key:s.alias||E(s.title)||p,ref_for:!0},{problem:s,problemIndex:p,index:p,theme:u.value,languages:t.languages}),()=>[e.createVNode(he,{problem:s,index:p,theme:u.value,languages:t.languages},null,8,["problem","index","theme","languages"])])),128)),t.showDirtColumn?(e.openBlock(),e.createElementBlock("th",qe,e.toDisplayString(N("dirt","Dirt")),1)):e.createCommentVNode("",!0),t.showSEColumn?(e.openBlock(),e.createElementBlock("th",Re,e.toDisplayString(N("se","SE")),1)):e.createCommentVNode("",!0)])]),e.createElementVNode("tbody",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.data.rows,(s,p)=>(e.openBlock(),e.createElementBlock("tr",{key:s.user.id||E(s.user.name)},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(z(s),(h,v)=>{var V;return e.openBlock(),e.createElementBlock("td",{key:((V=t.data.series[v])==null?void 0:V.title)||v,class:e.normalizeClass(["srk--text-right srk--nowrap",[w(h,t.data.series[v]),{"srk-series-segmented-column":D(t.data.series[v])}]]),style:e.normalizeStyle(M(h,t.data.series[v]))},e.toDisplayString(A(h,s)),7)}),128)),t.splitOrganization?(e.openBlock(),e.createElementBlock("td",{key:0,class:e.normalizeClass(["srk-organization-cell srk--text-left srk--nowrap",{"srk-organization-cell-avatar":m.value&&!!s.user.avatar}])},[e.createElementVNode("div",He,[m.value&&s.user.avatar?(e.openBlock(),e.createElementBlock("div",Ke,[e.createElementVNode("img",{src:S(s.user.avatar,"user.avatar"),alt:"User Avatar"},null,8,je)])):e.createCommentVNode("",!0),e.createElementVNode("span",{class:"srk-organization-name-text",title:s.user.organization?E(s.user.organization):""},e.toDisplayString(s.user.organization?E(s.user.organization):""),9,Je)])],2)):e.createCommentVNode("",!0),e.renderSlot(n.$slots,"user-cell",e.mergeProps({ref_for:!0},{user:s.user,row:s,rowIndex:p,ranklist:t.data,markers:t.data.markers,theme:u.value,hideOrganization:t.splitOrganization,hideAvatar:m.value,languages:t.languages,onClick:h=>x(s,p,h)}),()=>[e.createVNode(ze,{user:s.user,row:s,"row-index":p,ranklist:t.data,markers:t.data.markers,theme:u.value,"format-srk-asset-url":S,"on-user-click":x,"hide-organization":t.splitOrganization,"hide-avatar":m.value,languages:t.languages},null,8,["user","row","row-index","ranklist","markers","theme","hide-organization","hide-avatar","languages"])]),e.createElementVNode("td",We,e.toDisplayString(s.score.value),1),a.value?(e.openBlock(),e.createElementBlock("td",Ge,e.toDisplayString(s.score.time?e.unref(B.formatTimeDuration)(s.score.time,"min",Math.floor):"-"),1)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.statuses,(h,v)=>{var V;return e.renderSlot(n.$slots,"status-cell",e.mergeProps({key:((V=t.data.problems[v])==null?void 0:V.alias)||v,ref_for:!0},{status:h,problem:t.data.problems[v],problemIndex:v,user:s.user,row:s,rowIndex:p,ranklist:t.data,solutions:P(h),statusCellPreset:t.statusCellPreset,statusColorAsText:t.statusColorAsText,emptyStatusPlaceholder:t.emptyStatusPlaceholder,languages:t.languages,onClick:$=>I(s,p,h,v,$)}),()=>[e.createVNode(Ee,{status:h,problem:t.data.problems[v],"problem-index":v,user:s.user,row:s,"row-index":p,ranklist:t.data,"on-solution-click":I,"status-cell-preset":t.statusCellPreset,"status-color-as-text":t.statusColorAsText,"empty-status-placeholder":t.emptyStatusPlaceholder,languages:t.languages},null,8,["status","problem","problem-index","user","row","row-index","ranklist","status-cell-preset","status-color-as-text","empty-status-placeholder","languages"])])}),128)),t.showDirtColumn?(e.openBlock(),e.createElementBlock("td",Qe,e.toDisplayString(e.unref(d.calculateDirtPercentage)(s)),1)):e.createCommentVNode("",!0),t.showSEColumn?(e.openBlock(),e.createElementBlock("td",Xe,e.toDisplayString(e.unref(d.calculateSEValue)(s,c.value)),1)):e.createCommentVNode("",!0)]))),128))]),t.showProblemStatisticsFooter?(e.openBlock(),e.createElementBlock("tfoot",Ye,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(k,s=>e.createElementVNode("tr",{key:s.key,class:"srk-problem-statistics-footer-row"},[e.createElementVNode("td",{class:"srk-problem-statistics-footer-labels srk--text-right srk--nowrap",colspan:y.value},[e.createElementVNode("span",{class:"srk-problem-statistics-footer-label srk--c-tooltip","data-tooltip":s.tooltip},e.toDisplayString(s.label),9,_e)],8,Ze),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c.value,(p,h)=>{var v;return e.openBlock(),e.createElementBlock("td",{key:((v=t.data.problems[h])==null?void 0:v.alias)||h,class:"srk-problem-statistics-footer-cell srk--text-center srk--nowrap"},[e.createElementVNode("span",et,e.toDisplayString(F(s.key,p)),1),b(s.key,p)!==void 0?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[i[0]||(i[0]=e.createTextVNode(e.toDisplayString(" ")+" ",-1)),e.createElementVNode("span",tt,e.toDisplayString(b(s.key,p)),1)],64)):e.createCommentVNode("",!0)])}),128)),t.showDirtColumn?(e.openBlock(),e.createElementBlock("td",st,[...i[1]||(i[1]=[e.createElementVNode("span",{class:"srk-problem-statistics-footer-primary"},null,-1)])])):e.createCommentVNode("",!0),t.showSEColumn?(e.openBlock(),e.createElementBlock("td",lt,[...i[2]||(i[2]=[e.createElementVNode("span",{class:"srk-problem-statistics-footer-primary"},null,-1)])])):e.createCommentVNode("",!0)])),64)),e.createElementVNode("tr",rt,[e.createElementVNode("td",{class:"srk-problem-statistics-footer-labels srk--text-right srk--nowrap",colspan:y.value},null,8,ot),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.data.problems,(s,p)=>(e.openBlock(),e.createElementBlock("td",{key:s.alias||E(s.title)||p,class:"srk-problem-statistics-footer-cell srk-problem-statistics-footer-problem-header srk-problem-header srk--text-center srk--nowrap",style:e.normalizeStyle({backgroundImage:e.unref(d.getProblemHeaderBackgroundImage)(s.style,u.value,0)})},[e.createElementVNode("span",at,e.toDisplayString(s.alias||e.unref(B.numberToAlphabet)(p)),1)],4))),128)),t.showDirtColumn?(e.openBlock(),e.createElementBlock("td",nt,[...i[3]||(i[3]=[e.createElementVNode("span",{class:"srk-problem-statistics-footer-primary"},null,-1)])])):e.createCommentVNode("",!0),t.showSEColumn?(e.openBlock(),e.createElementBlock("td",it,[...i[4]||(i[4]=[e.createElementVNode("span",{class:"srk-problem-statistics-footer-primary"},null,-1)])])):e.createCommentVNode("",!0)])])):e.createCommentVNode("",!0)],2)])):(e.openBlock(),e.createElementBlock("div",Pe,' srk version "'+e.toDisplayString(t.data.version)+'" is not supported (current supported: '+e.toDisplayString(e.unref(g))+") ",1))}});exports.DefaultSolutionModal=J;exports.DefaultUserModal=se;exports.Modal=U;exports.ProgressBar=ke;exports.Ranklist=ct;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require("@algoux/standard-ranklist-renderer-component-styles");var e=require("vue"),d=require("@algoux/standard-ranklist-renderer-component-core"),B=require("@algoux/standard-ranklist-utils");const H=["data-srk-modal-state"],K=["aria-labelledby"],j={class:"srk-modal-content"},J={key:0,class:"srk-modal-header"},W={class:"srk-modal-body"},I=e.defineComponent({__name:"Modal",props:{open:{type:Boolean},title:{},width:{},rootClassName:{},wrapClassName:{},style:{},destroyOnClose:{type:Boolean,default:!0},closeOnEsc:{type:Boolean,default:!0},closeOnMaskClick:{type:Boolean,default:!0}},emits:["close","update:open"],setup(t,{emit:o}){let s=0;const u=t,n=o,p=`srk-vue-modal-title-${++s}`,g=e.ref(null),c=e.ref(u.open||!u.destroyOnClose),m=e.ref(u.open?"pre-open":"closing"),i=e.ref({x:0,y:0});let f=null,v=null,b=null;const N=e.computed(()=>c.value||!u.destroyOnClose),D=e.computed(()=>["srk-modal-root",d.SRK_ANIMATED_MODAL_ROOT_CLASS,u.rootClassName].filter(Boolean)),w=e.computed(()=>u.open||u.destroyOnClose&&c.value),z=e.computed(()=>{var C,x;return{...u.style,width:u.width?`${u.width}px`:(C=u.style)==null?void 0:C.width,["--srk-modal-origin-x"]:`${i.value.x}px`,["--srk-modal-origin-y"]:`${i.value.y}px`,["--srk-modal-max-width"]:u.width?`${u.width}px`:typeof((x=u.style)==null?void 0:x.width)=="string"?u.style.width:void 0}});function M(){if(typeof window=="undefined"){f=null,v=null;return}f!==null&&(window.clearTimeout(f),f=null),v!==null&&(window.clearTimeout(v),v=null)}async function T(){if(await e.nextTick(),typeof window=="undefined"||!u.open||!c.value||m.value!=="pre-open")return;S();const C=d.resolveModalTransformOrigin(g.value);i.value=C.origin,v=window.setTimeout(()=>{m.value="opening",v=null},0)}function S(){const C=d.registerModalFocusScope(g.value,{onEscape:F});b===null&&(b=C)}function E(){b!==null&&(d.unregisterModalFocusScope(b),b=null)}function P(C){n("update:open",!1),n("close",C)}function A(C){u.closeOnMaskClick&&C.target===C.currentTarget&&P("mask")}function F(C){u.open&&u.closeOnEsc&&P("escape")}return e.watch(()=>u.open,async C=>{if(M(),C){c.value=!0,i.value={x:0,y:0},m.value="pre-open",await T();return}if(E(),m.value="closing",!u.destroyOnClose){c.value=!0;return}c.value&&typeof window!="undefined"&&(f=window.setTimeout(()=>{c.value=!1,f=null},d.MODAL_ANIMATION_DURATION_MS))},{immediate:!0}),e.watchEffect(C=>{!w.value||(d.lockModalBodyScroll(),C(()=>{d.unlockModalBodyScroll()}))}),e.onMounted(()=>{d.ensureModalInteractionTracker(),u.open&&S()}),e.onBeforeUnmount(()=>{M(),E()}),(C,x)=>N.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(D.value),"data-srk-modal-state":m.value},[x[2]||(x[2]=e.createElementVNode("div",{class:"srk-modal-mask"},null,-1)),e.createElementVNode("div",{class:e.normalizeClass(["srk-modal-wrap",t.wrapClassName]),tabindex:"-1",onMousedown:A},[e.createElementVNode("div",{class:"srk-modal",role:"dialog","aria-modal":"true","aria-labelledby":t.title?p:void 0,"data-srk-modal-panel":"true",tabindex:"-1",ref_key:"dialogRef",ref:g,style:e.normalizeStyle(z.value)},[e.createElementVNode("div",j,[e.createElementVNode("button",{"aria-label":"Close",class:"srk-modal-close",type:"button",onClick:x[0]||(x[0]=U=>P("close-button"))},[...x[1]||(x[1]=[e.createElementVNode("span",{class:"srk-modal-close-x"},null,-1)])]),t.title!==void 0?(e.openBlock(),e.createElementBlock("div",J,[e.createElementVNode("div",{id:p,class:"srk-modal-title"},e.toDisplayString(t.title),1)])):e.createCommentVNode("",!0),e.createElementVNode("div",W,[e.renderSlot(C.$slots,"default")])])],12,K)],34)],10,H)):e.createCommentVNode("",!0)}}),G={class:"srk-common-table srk-solutions-table"},Q={class:"srk--text-right"},X=e.defineComponent({__name:"DefaultSolutionModal",props:{open:{type:Boolean},user:{},problem:{},problemIndex:{},solutions:{default:()=>[]},title:{},width:{default:320},rootClassName:{default:"srk-general-modal-root"},wrapClassName:{default:"srk-solutions-modal"},style:{},languages:{}},emits:["close","update:open"],setup(t,{emit:o}){const s=t,u=o,n=e.ref(s.user?{user:s.user,problem:s.problem,problemIndex:s.problemIndex,solutions:s.solutions}:null);e.watch([()=>s.user,()=>s.problem,()=>s.problemIndex,()=>s.solutions],([g,c,m,i])=>{g&&(n.value={user:g,problem:c,problemIndex:m,solutions:i})},{immediate:!0});const p=e.computed(()=>s.title||(n.value?d.getSolutionModalTitle(n.value.problemIndex,n.value.user,s.languages):""));return(g,c)=>n.value?(e.openBlock(),e.createBlock(I,{key:0,open:t.open,title:p.value,width:t.width,"root-class-name":t.rootClassName,"wrap-class-name":t.wrapClassName,style:e.normalizeStyle(t.style),onClose:c[0]||(c[0]=m=>u("close",m)),"onUpdate:open":c[1]||(c[1]=m=>u("update:open",m))},{default:e.withCtx(()=>[e.createElementVNode("table",G,[c[2]||(c[2]=e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[e.createElementVNode("th",{class:"srk--text-left"},"Result"),e.createElementVNode("th",{class:"srk--text-right"},"Time")])],-1)),e.createElementVNode("tbody",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.value.solutions,(m,i)=>{var f;return e.openBlock(),e.createElementBlock("tr",{key:`${m.result}_${(f=m.time)==null?void 0:f[0]}_${i}`},[e.createElementVNode("td",null,[e.createElementVNode("span",{class:e.normalizeClass(["srk-solution-result-text",e.unref(d.getSolutionResultMeta)(m.result).className])},e.toDisplayString(e.unref(d.getSolutionResultMeta)(m.result).label),3)]),e.createElementVNode("td",Q,e.toDisplayString(e.unref(d.formatSolutionTimestamp)(m)),1)])}),128))])])]),_:1},8,["open","title","width","root-class-name","wrap-class-name","style"])):e.createCommentVNode("",!0)}}),Y={class:"srk-user-modal-info"},Z={class:"srk-user-modal-info-user-name"},_={key:0,class:"srk-user-modal-info-user-second-name"},ee={class:"srk-user-modal-info-labels"},te={class:"srk-user-modal-info-labels-label srk-user-modal-info-labels-label-preset-general"},le={key:1,class:"srk-user-modal-info-team-members"},se={key:0,class:"srk-user-modal-info-team-members-slash"},oe={key:2,class:"srk-user-modal-info-photo"},re=["src"],ae=e.defineComponent({__name:"DefaultUserModal",props:{open:{type:Boolean},user:{},markers:{default:()=>[]},theme:{default:B.EnumTheme.light},title:{default:"User Info"},width:{default:420},rootClassName:{default:"srk-general-modal-root"},wrapClassName:{default:"srk-user-modal"},style:{},formatSrkAssetUrl:{},languages:{}},emits:["close","update:open"],setup(t,{emit:o}){const s=t,u=o,n=e.ref(s.user||null);e.watch(()=>s.user,i=>{i&&(n.value=i)},{immediate:!0});const p=e.computed(()=>n.value?B.resolveUserMarkers(n.value,s.markers).map(i=>({marker:i,presentation:d.getMarkerPresentation(i,s.theme)})):[]);function g(i,f){return d.resolveSrkAssetUrl(i,f,s.formatSrkAssetUrl)}function c(i){return B.resolveText(i,s.languages)}function m(i){return d.formatTeamMemberName(i,s.languages)}return(i,f)=>n.value?(e.openBlock(),e.createBlock(I,{key:0,open:t.open,title:t.title,width:t.width,"root-class-name":t.rootClassName,"wrap-class-name":t.wrapClassName,style:e.normalizeStyle(t.style),onClose:f[0]||(f[0]=v=>u("close",v)),"onUpdate:open":f[1]||(f[1]=v=>u("update:open",v))},{default:e.withCtx(()=>[e.createElementVNode("div",Y,[e.createElementVNode("h3",Z,e.toDisplayString(c(n.value.name)),1),n.value.organization?(e.openBlock(),e.createElementBlock("p",_,e.toDisplayString(c(n.value.organization)),1)):e.createCommentVNode("",!0),e.createElementVNode("div",ee,[e.createElementVNode("span",te,e.toDisplayString(n.value.official===!1?"\uFF0A \u975E\u6B63\u5F0F\u53C2\u52A0\u8005":"\u6B63\u5F0F\u53C2\u52A0\u8005"),1),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(p.value,v=>(e.openBlock(),e.createElementBlock("span",{key:v.marker.id,class:e.normalizeClass(["srk-user-modal-info-labels-label",v.presentation.className]),style:e.normalizeStyle(v.presentation.style)},e.toDisplayString(c(v.marker.label)),7))),128))]),n.value.teamMembers&&n.value.teamMembers.length?(e.openBlock(),e.createElementBlock("div",le,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.value.teamMembers,(v,b)=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:c(v.name)},[b>0?(e.openBlock(),e.createElementBlock("span",se," / ")):e.createCommentVNode("",!0),e.createElementVNode("span",null,e.toDisplayString(m(v)),1)],64))),128))])):e.createCommentVNode("",!0),n.value.photo?(e.openBlock(),e.createElementBlock("div",oe,[e.createElementVNode("img",{src:g(n.value.photo,"user.photo"),alt:"User portrait",class:"srk-user-modal-info-photo-img"},null,8,re)])):e.createCommentVNode("",!0)])]),_:1},8,["open","title","width","root-class-name","wrap-class-name","style"])):e.createCommentVNode("",!0)}}),ne={class:"srk-progress-bar-container"},ie={class:"srk-progress-bar"},ce={class:"srk-progress-bar-body"},ue={key:0,class:"srk-progress-slider-layer"},de=["max","title"],me={class:"srk-progress-secondary-area"},ke={class:"srk-progress-secondary-area-center"},pe={key:0,class:"srk-progress-time-machine-status"},fe={key:1,class:"srk-progress-live-text"},ge={key:2,style:{visibility:"hidden"}},ve=e.defineComponent({__name:"ProgressBar",props:{data:{},enableTimeTravel:{type:Boolean,default:!1},live:{type:Boolean,default:!1},td:{default:0}},emits:["timeTravel"],setup(t,{emit:o}){const s=t,u=o,n=e.ref(Date.now()),p=e.ref(!1),g=e.ref(!1),c=e.ref(d.getProgressMaxAvailableMinutes(s.data.contest,n.value,s.td)),m=e.ref(null);let i;const f=e.computed(()=>d.getProgressDurationMinutes(s.data.contest)),v=e.computed(()=>d.getProgressMaxAvailableMinutes(s.data.contest,n.value,s.td)),b=e.computed(()=>d.isProgressEnded(s.data.contest,n.value,s.td)),N=e.computed(()=>d.getProgressMetrics(s.data,n.value,s.td,c.value,p.value));function D(){n.value=Date.now(),b.value&&i!==void 0&&(window.clearInterval(i),i=void 0)}function w(S){typeof window!="undefined"&&(S&&i===void 0&&(i=window.setInterval(D,1e3)),!S&&i!==void 0&&(window.clearInterval(i),i=void 0))}function z(S){const E=S>=f.value||S>=v.value;u("timeTravel",E?null:S*60*1e3),p.value=!E,m.value=E?null:S*60*1e3,g.value=!1}function M(){g.value=!0,p.value=!0}function T(){g.value&&z(c.value)}return e.watch(v,S=>{!g.value&&m.value===null&&(c.value=S)}),e.watch(()=>s.live,S=>w(S),{immediate:!0}),e.watch(()=>s.data.contest.title,()=>{g.value=!1,c.value=v.value,m.value=null,p.value=!1,u("timeTravel",null)}),e.onBeforeUnmount(()=>{i!==void 0&&(window.clearInterval(i),i=void 0)}),(S,E)=>(e.openBlock(),e.createElementBlock("div",ne,[e.createElementVNode("div",ie,[e.createElementVNode("div",ce,[e.createElementVNode("div",{class:"srk-progress-bar-segment srk-progress-bar-normal",style:e.normalizeStyle({width:`${N.value.frozenBreakpoint*100}%`})},[e.createElementVNode("div",{class:"srk-progress-bar-fill",style:e.normalizeStyle({width:`${N.value.normalInnerPercent}%`})},null,4)],4),e.createElementVNode("div",{class:"srk-progress-bar-segment srk-progress-bar-frozen",style:e.normalizeStyle({width:`${(1-N.value.frozenBreakpoint)*100}%`})},[e.createElementVNode("div",{class:"srk-progress-bar-fill",style:e.normalizeStyle({width:`${N.value.frozenInnerPercent}%`})},null,4)],4)]),t.enableTimeTravel&&N.value.supportRegen?(e.openBlock(),e.createElementBlock("div",ue,[g.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:"srk-progress-slider-tooltip",style:e.normalizeStyle({left:`${f.value?c.value/f.value*100:0}%`})},e.toDisplayString(e.unref(B.secToTimeStr)(c.value*60)),5)):e.createCommentVNode("",!0),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":E[0]||(E[0]=P=>c.value=P),"aria-label":"Time Travel",class:"srk-progress-slider",max:f.value,min:"0",step:"1",title:e.unref(B.secToTimeStr)(c.value*60),type:"range",onBlur:T,onKeydown:M,onKeyup:T,onMousedown:M,onMouseup:T,onTouchend:T,onTouchstart:M},null,40,de),[[e.vModelText,c.value,void 0,{number:!0}]])])):e.createCommentVNode("",!0)]),e.createElementVNode("div",me,[e.createElementVNode("div",{class:"srk-progress-secondary-area-left",style:e.normalizeStyle(t.live||p.value?{}:{display:"none"})}," Elapsed: "+e.toDisplayString(e.unref(B.secToTimeStr)(Math.round(N.value.elapsed/1e3))),5),e.createElementVNode("div",ke,[p.value?(e.openBlock(),e.createElementBlock("div",pe,[...E[1]||(E[1]=[e.createElementVNode("div",{class:"srk-progress-time-machine-text"},"Time Travel Mode",-1)])])):t.live&&!b.value?(e.openBlock(),e.createElementBlock("div",fe,"Live")):(e.openBlock(),e.createElementBlock("div",ge,"SRK"))]),e.createElementVNode("div",{class:"srk-progress-secondary-area-right",style:e.normalizeStyle(t.live||p.value?{}:{display:"none"})}," Remaining: "+e.toDisplayString(e.unref(B.secToTimeStr)(Math.round(N.value.remaining/1e3))),5)])]))}}),ye=["href"],he={class:"srk--display-block"},be=["title"],Ce={class:"srk--display-block"},Be=["title"],Ee=e.defineComponent({__name:"ProblemHeaderCell",props:{problem:{},index:{},ranklist:{},theme:{default:B.EnumTheme.light},languages:{},onProblemClick:{}},setup(t){const o=t,s=e.computed(()=>o.problem.alias||B.numberToAlphabet(o.index)),u=e.computed(()=>B.resolveText(o.problem.title,o.languages)),n=e.computed(()=>o.problem.statistics),p=e.computed(()=>{if(!n.value)return"";const m=n.value.submitted?(n.value.accepted/n.value.submitted*100).toFixed(1):0;return`${n.value.accepted} / ${n.value.submitted} (${m}%)`}),g=e.computed(()=>d.getProblemHeaderBackgroundImageIfStyled(o.problem.style,o.theme));function c(m){!o.onProblemClick||(m.preventDefault(),d.captureModalTriggerPointFromMouseEvent(m,{source:"problem-header",context:{problemIndex:o.index,problemAlias:o.problem.alias||null,problemTitle:u.value||null}}),o.onProblemClick({problem:o.problem,problemIndex:o.index,ranklist:o.ranklist}))}return(m,i)=>(e.openBlock(),e.createElementBlock("th",{class:e.normalizeClass(["srk--nowrap srk-problem-header",{"srk--cursor-pointer":!!t.onProblemClick}]),style:e.normalizeStyle({backgroundImage:g.value}),onClick:c},[t.problem.link&&!t.onProblemClick?(e.openBlock(),e.createElementBlock("a",{key:0,href:t.problem.link,target:"_blank",rel:"noopener noreferrer",style:{color:"unset"}},[e.createElementVNode("span",he,e.toDisplayString(s.value),1),n.value?(e.openBlock(),e.createElementBlock("span",{key:0,class:"srk--display-block srk-problem-stats",title:p.value},e.toDisplayString(n.value.accepted),9,be)):e.createCommentVNode("",!0)],8,ye)):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createElementVNode("span",Ce,e.toDisplayString(s.value),1),n.value?(e.openBlock(),e.createElementBlock("span",{key:0,class:"srk--display-block srk-problem-stats",title:p.value},e.toDisplayString(n.value.accepted),9,Be)):e.createCommentVNode("",!0)],64))],6))}}),Se={key:0,class:"srk-prest-status-block-fb-star"},Ne={key:4,class:"srk-status-placeholder-cell srk--text-center srk--nowrap"},we="\u2605",xe=e.defineComponent({__name:"StatusCell",props:{status:{},problem:{},problemIndex:{},user:{},row:{},rowIndex:{},ranklist:{},onSolutionClick:{},statusCellPreset:{default:"classic"},statusColorAsText:{type:Boolean,default:!1},emptyStatusPlaceholder:{default:null},languages:{}},setup(t){const o=t,s=e.computed(()=>[...o.status.solutions||[]].reverse()),u=e.computed(()=>s.value.length>0&&!!o.onSolutionClick),n=e.computed(()=>d.getRankProblemStatusCellClassName(o.status,o.ranklist)),p=e.computed(()=>["srk-prest-status-block","srk--text-center","srk--nowrap",{"srk--cursor-pointer":u.value,"srk-prest-status-block-color-text":o.statusColorAsText}]);function g(m){var i,f;!u.value||(d.captureModalTriggerPointFromMouseEvent(m,{source:"status-cell",context:{rowIndex:o.rowIndex,problemIndex:o.problemIndex,problemAlias:((i=o.problem)==null?void 0:i.alias)||null,problemTitle:o.problem?B.resolveText(o.problem.title,o.languages):null,userId:o.user.id||null}}),(f=o.onSolutionClick)==null||f.call(o,{user:o.user,row:o.row,rowIndex:o.rowIndex,problemIndex:o.problemIndex,problem:o.problem,status:o.status,solutions:s.value,ranklist:o.ranklist}))}const c=e.defineComponent({props:{status:{type:Object,required:!0},ranklist:{type:Object,required:!0},preset:{type:String,required:!0}},setup(m){return()=>{const i=m.status,f=m.ranklist,v=m.preset,b=d.getRankProblemStatusCellPresentation(i,f,v);if(typeof b.score=="number"){const N=[e.h("span",{class:"srk-prest-status-block-score"},b.score)];return b.scoreDetails!==void 0&&N.push(" ",e.h("span",{class:"srk-prest-status-block-score-details"},b.scoreDetails)),N}return b.secondary!==void 0?[e.h("span",{class:"srk-prest-status-block-primary"},b.primary||"")," ",e.h("span",{class:"srk-prest-status-block-secondary"},b.secondary)]:b.primary||""}}});return(m,i)=>t.status.result==="FB"?(e.openBlock(),e.createElementBlock("td",{key:0,class:e.normalizeClass([p.value,n.value]),onClick:e.withModifiers(g,["prevent"])},[t.statusColorAsText?(e.openBlock(),e.createElementBlock("span",Se,e.toDisplayString(we))):e.createCommentVNode("",!0),e.createVNode(e.unref(c),{status:t.status,ranklist:t.ranklist,preset:t.statusCellPreset},null,8,["status","ranklist","preset"])],2)):t.status.result==="AC"?(e.openBlock(),e.createElementBlock("td",{key:1,class:e.normalizeClass([p.value,n.value]),onClick:e.withModifiers(g,["prevent"])},[e.createVNode(e.unref(c),{status:t.status,ranklist:t.ranklist,preset:t.statusCellPreset},null,8,["status","ranklist","preset"])],2)):t.status.result==="?"?(e.openBlock(),e.createElementBlock("td",{key:2,class:e.normalizeClass([p.value,n.value]),onClick:e.withModifiers(g,["prevent"])},[e.createVNode(e.unref(c),{status:t.status,ranklist:t.ranklist,preset:t.statusCellPreset},null,8,["status","ranklist","preset"])],2)):t.status.result==="RJ"?(e.openBlock(),e.createElementBlock("td",{key:3,class:e.normalizeClass([p.value,n.value]),onClick:e.withModifiers(g,["prevent"])},[e.createVNode(e.unref(c),{status:t.status,ranklist:t.ranklist,preset:t.statusCellPreset},null,8,["status","ranklist","preset"])],2)):(e.openBlock(),e.createElementBlock("td",Ne,e.toDisplayString(t.emptyStatusPlaceholder),1))}}),Ve={class:"srk-user-cell-content"},Te={key:0,class:"srk-user-avatar"},Me=["src"],Pe={class:"srk-user-body"},$e={class:"srk-user-name-row"},De=["title"],ze={class:"srk-marker-dot-group"},Ae=["data-tooltip"],Fe={key:0,class:"srk-user-secondary-text srk--text-ellipsis",title:""},Ie=e.defineComponent({__name:"UserCell",props:{user:{},row:{},rowIndex:{},ranklist:{},markers:{default:()=>[]},theme:{default:B.EnumTheme.light},formatSrkAssetUrl:{},onUserClick:{},hideOrganization:{type:Boolean,default:!1},hideAvatar:{type:Boolean,default:!1},languages:{}},setup(t){const o=t,s=e.computed(()=>p(o.user.name)),u=e.computed(()=>B.resolveUserMarkers(o.user,o.markers)),n=e.computed(()=>u.value.map(c=>({marker:c,presentation:d.getMarkerPresentation(c,o.theme)})));function p(c){return B.resolveText(c,o.languages)}function g(c){var m;d.captureModalTriggerPointFromMouseEvent(c,{source:"user-cell",context:{rowIndex:o.rowIndex,userId:o.user.id||null,userName:s.value}}),(m=o.onUserClick)==null||m.call(o,{user:o.user,row:o.row,rowIndex:o.rowIndex,ranklist:o.ranklist})}return(c,m)=>(e.openBlock(),e.createElementBlock("td",{class:e.normalizeClass(["srk--text-left srk--nowrap srk-user-cell",{"srk--cursor-pointer":!!t.onUserClick}]),title:"",onClick:e.withModifiers(g,["prevent"])},[e.createElementVNode("div",Ve,[t.user.avatar&&!t.hideAvatar?(e.openBlock(),e.createElementBlock("div",Te,[e.createElementVNode("img",{src:t.formatSrkAssetUrl(t.user.avatar,"user.avatar"),alt:"User Avatar"},null,8,Me)])):e.createCommentVNode("",!0),e.createElementVNode("div",Pe,[e.createElementVNode("div",$e,[e.createElementVNode("span",{class:"srk-user-name-text",title:s.value},e.toDisplayString(s.value),9,De),e.createElementVNode("span",ze,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.value,i=>(e.openBlock(),e.createElementBlock("span",{key:i.marker.id,class:e.normalizeClass(["srk-marker srk-marker-dot srk--c-tooltip",i.presentation.className]),style:e.normalizeStyle(i.presentation.style),"data-tooltip":p(i.marker.label)},null,14,Ae))),128))])]),t.user.organization&&!t.hideOrganization?(e.openBlock(),e.createElementBlock("p",Fe,e.toDisplayString(p(t.user.organization)),1)):e.createCommentVNode("",!0)])])],2))}}),Ue={key:0},Oe={key:1},Le={key:2,class:"srk-common-table srk-main"},qe={key:0,class:"srk-organization-header srk--text-left srk--nowrap"},Re={class:"srk--text-left srk--nowrap"},He={class:"srk--text-right srk--nowrap"},Ke={key:1,class:"srk--text-right srk--nowrap"},je={key:2,class:"srk-dirt-header srk--text-right srk--nowrap"},Je={key:3,class:"srk-se-header srk--text-right srk--nowrap"},We={class:"srk-organization-cell-content"},Ge={key:0,class:"srk-user-avatar"},Qe=["src"],Xe=["title"],Ye={class:"srk--text-right srk--nowrap"},Ze={key:1,class:"srk--text-right srk--nowrap"},_e={key:2,class:"srk-dirt-cell srk--text-right srk--nowrap"},et={key:3,class:"srk-se-cell srk--text-right srk--nowrap"},tt={key:0},lt=["colspan"],st=["data-tooltip"],ot={class:"srk-problem-statistics-footer-primary"},rt={class:"srk-problem-statistics-footer-secondary"},at={key:0,class:"srk-problem-statistics-footer-cell srk-extra-statistics-footer-cell srk-dirt-footer-cell srk--nowrap"},nt={key:1,class:"srk-problem-statistics-footer-cell srk-extra-statistics-footer-cell srk-se-footer-cell srk--nowrap"},it={class:"srk-problem-statistics-footer-row srk-problem-statistics-footer-problem-label-row"},ct=["colspan"],ut={class:"srk--display-block"},dt={key:0,class:"srk-problem-statistics-footer-cell srk-extra-statistics-footer-cell srk-dirt-footer-cell srk--nowrap"},mt={key:1,class:"srk-problem-statistics-footer-cell srk-extra-statistics-footer-cell srk-se-footer-cell srk--nowrap"},kt=e.defineComponent({__name:"Ranklist",props:{data:{},theme:{default:B.EnumTheme.light},rowBordered:{type:Boolean,default:!1},columnBordered:{type:Boolean,default:!1},rowStriped:{type:Boolean,default:!1},formatSrkAssetUrl:{},splitOrganization:{type:Boolean,default:!1},columnTitles:{},statusCellPreset:{default:"classic"},statusColorAsText:{type:Boolean,default:!1},showProblemStatisticsFooter:{type:Boolean,default:!1},showDirtColumn:{type:Boolean,default:!1},showSEColumn:{type:Boolean,default:!1},emptyStatusPlaceholder:{default:null},userAvatarPlacement:{default:"user"},languages:{}},emits:["userClick","problemClick","solutionClick"],setup(t,{emit:o}){const s=t,u=o,n=e.getCurrentInstance(),p=e.computed(()=>s.theme),g=e.computed(()=>{var r;return Boolean((r=n==null?void 0:n.vnode.props)==null?void 0:r.onProblemClick)}),c=d.srkSupportedVersions,m=e.computed(()=>d.caniuse(s.data.version)),i=e.computed(()=>d.shouldShowTimeColumn(s.data.rows)),f=e.computed(()=>s.splitOrganization&&s.userAvatarPlacement==="organization"),v=e.computed(()=>s.showProblemStatisticsFooter||s.showSEColumn?d.calculateProblemStatisticsFooter(s.data):[]),b=e.computed(()=>s.data.series.length+1+1+(i.value?1:0)+(s.splitOrganization?1:0)),N=[{key:"accepted",label:"Accepted",tooltip:"Number of participants who solved this problem"},{key:"attempted",label:"Attempted",tooltip:"Number of participants who attempted this problem"},{key:"submitted",label:"Submitted",tooltip:"Total number of valid submissions for this problem"},{key:"dirt",label:"Dirt",tooltip:"Wrong submissions among participants who solved this problem"},{key:"se",label:"SE",tooltip:"Average hardness, calculated as (participants - accepted) / participants"},{key:"firstAccepted",label:"FB at",tooltip:"First Blood at, also known as first solve time, in minutes"},{key:"lastAccepted",label:"LB at",tooltip:"Last Blood at, also known as last solve time, in minutes"}];function D(r,a){return d.resolveSrkAssetUrl(r,a,s.formatSrkAssetUrl)}function w(r){return B.resolveText(r,s.languages)}function z(r){return r.rankValues||s.data.series.map(()=>({rank:null,segmentIndex:null}))}function M(r,a){return r.rank?r.rank:a.user.official===!1?"\uFF0A":""}function T(r){return((r==null?void 0:r.segments)||[]).some(a=>typeof a.style=="string")}function S(r,a){var k,h,y;const l=(k=s.columnTitles)==null?void 0:k.series;return typeof l=="function"?(h=l(r,a))!=null?h:r.title:Array.isArray(l)&&(y=l[a])!=null?y:r.title}function E(r,a){var l,k;return(k=(l=s.columnTitles)==null?void 0:l[r])!=null?k:a}function P(r,a){const l=r.segmentIndex||r.segmentIndex===0?r.segmentIndex:-1;return((a==null?void 0:a.segments)||[])[l]||{}}function A(r,a){const l=P(r,a).style;return typeof l=="string"?`srk-preset-series-segment-${l}`:""}function F(r,a){const l={[B.EnumTheme.light]:void 0,[B.EnumTheme.dark]:void 0},k=P(r,a).style;if(!k||typeof k=="string")return{};const h=B.resolveStyle(k),y=h.textColor||l,V=h.backgroundColor||l;return{color:y[s.theme],backgroundColor:V[s.theme]}}function C(r){return[...r.solutions||[]].reverse()}function x(r){u("problemClick",r)}function U(r,a,l){l&&(l.preventDefault(),d.captureModalTriggerPointFromMouseEvent(l,{source:"problem-header",context:{problemIndex:a,problemAlias:r.alias||null,problemTitle:w(r.title)||null}})),x({problem:r,problemIndex:a,ranklist:s.data})}function R(r,a){switch(r){case"accepted":return a.accepted;case"attempted":return a.attempted;case"submitted":return a.submitted;case"dirt":return a.dirt;case"se":return d.formatProblemStatisticsAverageHardness(a);case"firstAccepted":return d.formatProblemStatisticsAcceptedMinute(a.firstAcceptedTime);case"lastAccepted":return d.formatProblemStatisticsAcceptedMinute(a.lastAcceptedTime);default:return""}}function O(r,a){switch(r){case"accepted":return d.formatProblemStatisticsPercent(a.accepted,a.participantCount);case"attempted":return d.formatProblemStatisticsPercent(a.attempted,a.participantCount);case"dirt":return d.formatProblemStatisticsPercent(a.dirt,a.dirtSubmitted);default:return}}function L(r,a,l){if("ranklist"in r){u("userClick",r);return}l&&d.captureModalTriggerPointFromMouseEvent(l,{source:"user-cell",context:{rowIndex:a||0,userId:r.user.id||null,userName:w(r.user.name)}}),u("userClick",{user:r.user,row:r,rowIndex:a||0,ranklist:s.data})}function q(r,a,l,k,h){if("solutions"in r){u("solutionClick",r);return}const y=k||0,V=l||r.statuses[y];if(h){const $=s.data.problems[y];d.captureModalTriggerPointFromMouseEvent(h,{source:"status-cell",context:{rowIndex:a||0,problemIndex:y,problemAlias:($==null?void 0:$.alias)||null,problemTitle:$?w($.title):null,userId:r.user.id||null}})}u("solutionClick",{user:r.user,row:r,rowIndex:a||0,problemIndex:y,problem:s.data.problems[y],status:V,solutions:C(V),ranklist:s.data})}return(r,a)=>t.data.type!=="general"?(e.openBlock(),e.createElementBlock("div",Ue,'srk type "'+e.toDisplayString(t.data.type)+'" is not supported',1)):m.value?(e.openBlock(),e.createElementBlock("div",Le,[e.createElementVNode("table",{class:e.normalizeClass({"srk-table-row-bordered":t.rowBordered,"srk-table-column-bordered":t.columnBordered,"srk-table-row-striped":t.rowStriped})},[e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.data.series,(l,k)=>(e.openBlock(),e.createElementBlock("th",{key:l.title,class:e.normalizeClass(["srk-series-header srk--text-right srk--nowrap",{"srk-series-segmented-column":T(l)}])},e.toDisplayString(S(l,k)),3))),128)),t.splitOrganization?(e.openBlock(),e.createElementBlock("th",qe,e.toDisplayString(E("organization","Organization")),1)):e.createCommentVNode("",!0),e.createElementVNode("th",Re,e.toDisplayString(E("user","Name")),1),e.createElementVNode("th",He,e.toDisplayString(E("score","Score")),1),i.value?(e.openBlock(),e.createElementBlock("th",Ke,e.toDisplayString(E("time","Time")),1)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.data.problems,(l,k)=>e.renderSlot(r.$slots,"problem-header-cell",e.mergeProps({key:l.alias||w(l.title)||k,ref_for:!0},{problem:l,problemIndex:k,index:k,ranklist:t.data,theme:p.value,languages:t.languages,onClick:h=>U(l,k,h)}),()=>[e.createVNode(Ee,{problem:l,index:k,ranklist:t.data,theme:p.value,languages:t.languages,"on-problem-click":g.value?x:void 0},null,8,["problem","index","ranklist","theme","languages","on-problem-click"])])),128)),t.showDirtColumn?(e.openBlock(),e.createElementBlock("th",je,e.toDisplayString(E("dirt","Dirt")),1)):e.createCommentVNode("",!0),t.showSEColumn?(e.openBlock(),e.createElementBlock("th",Je,e.toDisplayString(E("se","SE")),1)):e.createCommentVNode("",!0)])]),e.createElementVNode("tbody",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.data.rows,(l,k)=>(e.openBlock(),e.createElementBlock("tr",{key:l.user.id||w(l.user.name)},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(z(l),(h,y)=>{var V;return e.openBlock(),e.createElementBlock("td",{key:((V=t.data.series[y])==null?void 0:V.title)||y,class:e.normalizeClass(["srk--text-right srk--nowrap",[A(h,t.data.series[y]),{"srk-series-segmented-column":T(t.data.series[y])}]]),style:e.normalizeStyle(F(h,t.data.series[y]))},e.toDisplayString(M(h,l)),7)}),128)),t.splitOrganization?(e.openBlock(),e.createElementBlock("td",{key:0,class:e.normalizeClass(["srk-organization-cell srk--text-left srk--nowrap",{"srk-organization-cell-avatar":f.value&&!!l.user.avatar}])},[e.createElementVNode("div",We,[f.value&&l.user.avatar?(e.openBlock(),e.createElementBlock("div",Ge,[e.createElementVNode("img",{src:D(l.user.avatar,"user.avatar"),alt:"User Avatar"},null,8,Qe)])):e.createCommentVNode("",!0),e.createElementVNode("span",{class:"srk-organization-name-text",title:l.user.organization?w(l.user.organization):""},e.toDisplayString(l.user.organization?w(l.user.organization):""),9,Xe)])],2)):e.createCommentVNode("",!0),e.renderSlot(r.$slots,"user-cell",e.mergeProps({ref_for:!0},{user:l.user,row:l,rowIndex:k,ranklist:t.data,markers:t.data.markers,theme:p.value,hideOrganization:t.splitOrganization,hideAvatar:f.value,languages:t.languages,onClick:h=>L(l,k,h)}),()=>[e.createVNode(Ie,{user:l.user,row:l,"row-index":k,ranklist:t.data,markers:t.data.markers,theme:p.value,"format-srk-asset-url":D,"on-user-click":L,"hide-organization":t.splitOrganization,"hide-avatar":f.value,languages:t.languages},null,8,["user","row","row-index","ranklist","markers","theme","hide-organization","hide-avatar","languages"])]),e.createElementVNode("td",Ye,e.toDisplayString(l.score.value),1),i.value?(e.openBlock(),e.createElementBlock("td",Ze,e.toDisplayString(l.score.time?e.unref(B.formatTimeDuration)(l.score.time,"min",Math.floor):"-"),1)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.statuses,(h,y)=>{var V;return e.renderSlot(r.$slots,"status-cell",e.mergeProps({key:((V=t.data.problems[y])==null?void 0:V.alias)||y,ref_for:!0},{status:h,problem:t.data.problems[y],problemIndex:y,user:l.user,row:l,rowIndex:k,ranklist:t.data,solutions:C(h),statusCellPreset:t.statusCellPreset,statusColorAsText:t.statusColorAsText,emptyStatusPlaceholder:t.emptyStatusPlaceholder,languages:t.languages,onClick:$=>q(l,k,h,y,$)}),()=>[e.createVNode(xe,{status:h,problem:t.data.problems[y],"problem-index":y,user:l.user,row:l,"row-index":k,ranklist:t.data,"on-solution-click":q,"status-cell-preset":t.statusCellPreset,"status-color-as-text":t.statusColorAsText,"empty-status-placeholder":t.emptyStatusPlaceholder,languages:t.languages},null,8,["status","problem","problem-index","user","row","row-index","ranklist","status-cell-preset","status-color-as-text","empty-status-placeholder","languages"])])}),128)),t.showDirtColumn?(e.openBlock(),e.createElementBlock("td",_e,e.toDisplayString(e.unref(d.calculateDirtPercentage)(l)),1)):e.createCommentVNode("",!0),t.showSEColumn?(e.openBlock(),e.createElementBlock("td",et,e.toDisplayString(e.unref(d.calculateSEValue)(l,v.value)),1)):e.createCommentVNode("",!0)]))),128))]),t.showProblemStatisticsFooter?(e.openBlock(),e.createElementBlock("tfoot",tt,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(N,l=>e.createElementVNode("tr",{key:l.key,class:"srk-problem-statistics-footer-row"},[e.createElementVNode("td",{class:"srk-problem-statistics-footer-labels srk--text-right srk--nowrap",colspan:b.value},[e.createElementVNode("span",{class:"srk-problem-statistics-footer-label srk--c-tooltip","data-tooltip":l.tooltip},e.toDisplayString(l.label),9,st)],8,lt),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(v.value,(k,h)=>{var y;return e.openBlock(),e.createElementBlock("td",{key:((y=t.data.problems[h])==null?void 0:y.alias)||h,class:"srk-problem-statistics-footer-cell srk--text-center srk--nowrap"},[e.createElementVNode("span",ot,e.toDisplayString(R(l.key,k)),1),O(l.key,k)!==void 0?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[a[0]||(a[0]=e.createTextVNode(e.toDisplayString(" ")+" ",-1)),e.createElementVNode("span",rt,e.toDisplayString(O(l.key,k)),1)],64)):e.createCommentVNode("",!0)])}),128)),t.showDirtColumn?(e.openBlock(),e.createElementBlock("td",at,[...a[1]||(a[1]=[e.createElementVNode("span",{class:"srk-problem-statistics-footer-primary"},null,-1)])])):e.createCommentVNode("",!0),t.showSEColumn?(e.openBlock(),e.createElementBlock("td",nt,[...a[2]||(a[2]=[e.createElementVNode("span",{class:"srk-problem-statistics-footer-primary"},null,-1)])])):e.createCommentVNode("",!0)])),64)),e.createElementVNode("tr",it,[e.createElementVNode("td",{class:"srk-problem-statistics-footer-labels srk--text-right srk--nowrap",colspan:b.value},null,8,ct),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.data.problems,(l,k)=>(e.openBlock(),e.createElementBlock("td",{key:l.alias||w(l.title)||k,class:"srk-problem-statistics-footer-cell srk-problem-statistics-footer-problem-header srk-problem-header srk--text-center srk--nowrap",style:e.normalizeStyle({backgroundImage:e.unref(d.getProblemHeaderBackgroundImageIfStyled)(l.style,p.value,0)})},[e.createElementVNode("span",ut,e.toDisplayString(l.alias||e.unref(B.numberToAlphabet)(k)),1)],4))),128)),t.showDirtColumn?(e.openBlock(),e.createElementBlock("td",dt,[...a[3]||(a[3]=[e.createElementVNode("span",{class:"srk-problem-statistics-footer-primary"},null,-1)])])):e.createCommentVNode("",!0),t.showSEColumn?(e.openBlock(),e.createElementBlock("td",mt,[...a[4]||(a[4]=[e.createElementVNode("span",{class:"srk-problem-statistics-footer-primary"},null,-1)])])):e.createCommentVNode("",!0)])])):e.createCommentVNode("",!0)],2)])):(e.openBlock(),e.createElementBlock("div",Oe,' srk version "'+e.toDisplayString(t.data.version)+'" is not supported (current supported: '+e.toDisplayString(e.unref(c))+") ",1))}});exports.DefaultSolutionModal=X;exports.DefaultUserModal=ae;exports.Modal=I;exports.ProgressBar=ve;exports.Ranklist=kt;
package/dist/index.d.ts CHANGED
@@ -3,4 +3,4 @@ export { default as DefaultUserModal } from './modal/DefaultUserModal.vue';
3
3
  export { default as Modal } from './modal/Modal.vue';
4
4
  export { default as ProgressBar } from './progress/ProgressBar.vue';
5
5
  export { default as Ranklist } from './Ranklist.vue';
6
- export type { DefaultSolutionModalProps, DefaultUserModalProps, ModalCloseReason, ModalEvents, ModalProps, ProblemHeaderCellSlotProps, ProgressBarEvents, ProgressBarProps, RanklistColumnTitles, RanklistEvents, RanklistProps, RanklistStatusCellPreset, RanklistUserAvatarPlacement, SolutionClickPayload, StaticRanklist, StaticRanklistRow, StatusCellSlotProps, UserCellSlotProps, UserClickPayload, } from './types';
6
+ export type { DefaultSolutionModalProps, DefaultUserModalProps, ModalCloseReason, ModalEvents, ModalProps, ProblemClickPayload, ProblemHeaderCellSlotProps, ProgressBarEvents, ProgressBarProps, RanklistColumnTitles, RanklistEvents, RanklistProps, RanklistStatusCellPreset, RanklistUserAvatarPlacement, SolutionClickPayload, StaticRanklist, StaticRanklistRow, StatusCellSlotProps, UserCellSlotProps, UserClickPayload, } from './types';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import "@algoux/standard-ranklist-renderer-component-styles";
2
- import { defineComponent, ref, computed, watch, watchEffect, onMounted, onBeforeUnmount, openBlock, createElementBlock, normalizeClass, createElementVNode, normalizeStyle, toDisplayString, createCommentVNode, renderSlot, nextTick, createBlock, withCtx, Fragment, renderList, unref, withDirectives, vModelText, h, withModifiers, createVNode, mergeProps, createTextVNode } from "vue";
3
- import { SRK_ANIMATED_MODAL_ROOT_CLASS, MODAL_ANIMATION_DURATION_MS, lockModalBodyScroll, unlockModalBodyScroll, ensureModalInteractionTracker, resolveModalTransformOrigin, registerModalFocusScope, unregisterModalFocusScope, getSolutionModalTitle, getSolutionResultMeta, formatSolutionTimestamp, getMarkerPresentation, resolveSrkAssetUrl, formatTeamMemberName, getProgressMaxAvailableMinutes, getProgressDurationMinutes, isProgressEnded, getProgressMetrics, getProblemHeaderBackgroundImage, getRankProblemStatusCellPresentation, captureModalTriggerPointFromMouseEvent, caniuse, shouldShowTimeColumn, calculateProblemStatisticsFooter, calculateDirtPercentage, calculateSEValue, srkSupportedVersions, formatProblemStatisticsAcceptedMinute, formatProblemStatisticsAverageHardness, formatProblemStatisticsPercent } from "@algoux/standard-ranklist-renderer-component-core";
2
+ import { defineComponent, ref, computed, watch, watchEffect, onMounted, onBeforeUnmount, openBlock, createElementBlock, normalizeClass, createElementVNode, normalizeStyle, toDisplayString, createCommentVNode, renderSlot, nextTick, createBlock, withCtx, Fragment, renderList, unref, withDirectives, vModelText, h, withModifiers, createVNode, getCurrentInstance, mergeProps, createTextVNode } from "vue";
3
+ import { SRK_ANIMATED_MODAL_ROOT_CLASS, MODAL_ANIMATION_DURATION_MS, lockModalBodyScroll, unlockModalBodyScroll, ensureModalInteractionTracker, resolveModalTransformOrigin, registerModalFocusScope, unregisterModalFocusScope, getSolutionModalTitle, getSolutionResultMeta, formatSolutionTimestamp, getMarkerPresentation, resolveSrkAssetUrl, formatTeamMemberName, getProgressMaxAvailableMinutes, getProgressDurationMinutes, isProgressEnded, getProgressMetrics, getProblemHeaderBackgroundImageIfStyled, captureModalTriggerPointFromMouseEvent, getRankProblemStatusCellClassName, getRankProblemStatusCellPresentation, caniuse, shouldShowTimeColumn, calculateProblemStatisticsFooter, calculateDirtPercentage, calculateSEValue, srkSupportedVersions, formatProblemStatisticsAcceptedMinute, formatProblemStatisticsAverageHardness, formatProblemStatisticsPercent } from "@algoux/standard-ranklist-renderer-component-core";
4
4
  import { EnumTheme, resolveUserMarkers, resolveText, secToTimeStr, numberToAlphabet, formatTimeDuration, resolveStyle } from "@algoux/standard-ranklist-utils";
5
5
  const _hoisted_1$7 = ["data-srk-modal-state"];
6
6
  const _hoisted_2$7 = ["aria-labelledby"];
@@ -565,12 +565,15 @@ const _sfc_main$3 = defineComponent({
565
565
  props: {
566
566
  problem: {},
567
567
  index: {},
568
+ ranklist: {},
568
569
  theme: { default: EnumTheme.light },
569
- languages: {}
570
+ languages: {},
571
+ onProblemClick: {}
570
572
  },
571
573
  setup(__props) {
572
574
  const props = __props;
573
575
  const alias = computed(() => props.problem.alias || numberToAlphabet(props.index));
576
+ const title = computed(() => resolveText(props.problem.title, props.languages));
574
577
  const stat = computed(() => props.problem.statistics);
575
578
  const statDesc = computed(() => {
576
579
  if (!stat.value) {
@@ -579,13 +582,33 @@ const _sfc_main$3 = defineComponent({
579
582
  const ratio = stat.value.submitted ? (stat.value.accepted / stat.value.submitted * 100).toFixed(1) : 0;
580
583
  return `${stat.value.accepted} / ${stat.value.submitted} (${ratio}%)`;
581
584
  });
582
- const backgroundImage = computed(() => getProblemHeaderBackgroundImage(props.problem.style, props.theme));
585
+ const backgroundImage = computed(() => getProblemHeaderBackgroundImageIfStyled(props.problem.style, props.theme));
586
+ function handleClick(event) {
587
+ if (!props.onProblemClick) {
588
+ return;
589
+ }
590
+ event.preventDefault();
591
+ captureModalTriggerPointFromMouseEvent(event, {
592
+ source: "problem-header",
593
+ context: {
594
+ problemIndex: props.index,
595
+ problemAlias: props.problem.alias || null,
596
+ problemTitle: title.value || null
597
+ }
598
+ });
599
+ props.onProblemClick({
600
+ problem: props.problem,
601
+ problemIndex: props.index,
602
+ ranklist: props.ranklist
603
+ });
604
+ }
583
605
  return (_ctx, _cache) => {
584
606
  return openBlock(), createElementBlock("th", {
585
- class: "srk--nowrap srk-problem-header",
586
- style: normalizeStyle({ backgroundImage: backgroundImage.value })
607
+ class: normalizeClass(["srk--nowrap srk-problem-header", { "srk--cursor-pointer": !!__props.onProblemClick }]),
608
+ style: normalizeStyle({ backgroundImage: backgroundImage.value }),
609
+ onClick: handleClick
587
610
  }, [
588
- __props.problem.link ? (openBlock(), createElementBlock("a", {
611
+ __props.problem.link && !__props.onProblemClick ? (openBlock(), createElementBlock("a", {
589
612
  key: 0,
590
613
  href: __props.problem.link,
591
614
  target: "_blank",
@@ -606,7 +629,7 @@ const _sfc_main$3 = defineComponent({
606
629
  title: statDesc.value
607
630
  }, toDisplayString(stat.value.accepted), 9, _hoisted_5$2)) : createCommentVNode("", true)
608
631
  ], 64))
609
- ], 4);
632
+ ], 6);
610
633
  };
611
634
  }
612
635
  });
@@ -639,6 +662,7 @@ const _sfc_main$2 = defineComponent({
639
662
  const props = __props;
640
663
  const solutions = computed(() => [...props.status.solutions || []].reverse());
641
664
  const isClickable = computed(() => solutions.value.length > 0 && !!props.onSolutionClick);
665
+ const statusResultClassName = computed(() => getRankProblemStatusCellClassName(props.status, props.ranklist));
642
666
  const commonClassName = computed(() => [
643
667
  "srk-prest-status-block",
644
668
  "srk--text-center",
@@ -696,10 +720,11 @@ const _sfc_main$2 = defineComponent({
696
720
  const preset = childProps.preset;
697
721
  const presentation = getRankProblemStatusCellPresentation(status, ranklist, preset);
698
722
  if (typeof presentation.score === "number") {
699
- return [
700
- h("span", { class: "srk-prest-status-block-score" }, presentation.score),
701
- h("span", { class: "srk-prest-status-block-score-details" }, presentation.scoreDetails)
702
- ];
723
+ const children = [h("span", { class: "srk-prest-status-block-score" }, presentation.score)];
724
+ if (presentation.scoreDetails !== void 0) {
725
+ children.push(" ", h("span", { class: "srk-prest-status-block-score-details" }, presentation.scoreDetails));
726
+ }
727
+ return children;
703
728
  }
704
729
  if (presentation.secondary !== void 0) {
705
730
  return [
@@ -715,7 +740,7 @@ const _sfc_main$2 = defineComponent({
715
740
  return (_ctx, _cache) => {
716
741
  return __props.status.result === "FB" ? (openBlock(), createElementBlock("td", {
717
742
  key: 0,
718
- class: normalizeClass([commonClassName.value, "srk-prest-status-block-fb"]),
743
+ class: normalizeClass([commonClassName.value, statusResultClassName.value]),
719
744
  onClick: withModifiers(emitSolutionClick, ["prevent"])
720
745
  }, [
721
746
  __props.statusColorAsText ? (openBlock(), createElementBlock("span", _hoisted_1$2, toDisplayString(fbStar))) : createCommentVNode("", true),
@@ -726,7 +751,7 @@ const _sfc_main$2 = defineComponent({
726
751
  }, null, 8, ["status", "ranklist", "preset"])
727
752
  ], 2)) : __props.status.result === "AC" ? (openBlock(), createElementBlock("td", {
728
753
  key: 1,
729
- class: normalizeClass([commonClassName.value, "srk-prest-status-block-accepted"]),
754
+ class: normalizeClass([commonClassName.value, statusResultClassName.value]),
730
755
  onClick: withModifiers(emitSolutionClick, ["prevent"])
731
756
  }, [
732
757
  createVNode(unref(StatusBody), {
@@ -736,7 +761,7 @@ const _sfc_main$2 = defineComponent({
736
761
  }, null, 8, ["status", "ranklist", "preset"])
737
762
  ], 2)) : __props.status.result === "?" ? (openBlock(), createElementBlock("td", {
738
763
  key: 2,
739
- class: normalizeClass([commonClassName.value, "srk-prest-status-block-frozen"]),
764
+ class: normalizeClass([commonClassName.value, statusResultClassName.value]),
740
765
  onClick: withModifiers(emitSolutionClick, ["prevent"])
741
766
  }, [
742
767
  createVNode(unref(StatusBody), {
@@ -746,7 +771,7 @@ const _sfc_main$2 = defineComponent({
746
771
  }, null, 8, ["status", "ranklist", "preset"])
747
772
  ], 2)) : __props.status.result === "RJ" ? (openBlock(), createElementBlock("td", {
748
773
  key: 3,
749
- class: normalizeClass([commonClassName.value, "srk-prest-status-block-failed"]),
774
+ class: normalizeClass([commonClassName.value, statusResultClassName.value]),
750
775
  onClick: withModifiers(emitSolutionClick, ["prevent"])
751
776
  }, [
752
777
  createVNode(unref(StatusBody), {
@@ -942,11 +967,16 @@ const _sfc_main = defineComponent({
942
967
  userAvatarPlacement: { default: "user" },
943
968
  languages: {}
944
969
  },
945
- emits: ["userClick", "solutionClick"],
970
+ emits: ["userClick", "problemClick", "solutionClick"],
946
971
  setup(__props, { emit: __emit }) {
947
972
  const props = __props;
948
973
  const emit = __emit;
974
+ const instance = getCurrentInstance();
949
975
  const resolvedTheme = computed(() => props.theme);
976
+ const hasProblemClickListener = computed(() => {
977
+ var _a;
978
+ return Boolean((_a = instance == null ? void 0 : instance.vnode.props) == null ? void 0 : _a.onProblemClick);
979
+ });
950
980
  const supportedVersions = srkSupportedVersions;
951
981
  const isSupportedVersion = computed(() => caniuse(props.data.version));
952
982
  const showTimeColumn = computed(() => shouldShowTimeColumn(props.data.rows));
@@ -1048,6 +1078,27 @@ const _sfc_main = defineComponent({
1048
1078
  function getStatusSolutions(status) {
1049
1079
  return [...status.solutions || []].reverse();
1050
1080
  }
1081
+ function emitProblemClickPayload(payload) {
1082
+ emit("problemClick", payload);
1083
+ }
1084
+ function emitProblemClick(problem, problemIndex, event) {
1085
+ if (event) {
1086
+ event.preventDefault();
1087
+ captureModalTriggerPointFromMouseEvent(event, {
1088
+ source: "problem-header",
1089
+ context: {
1090
+ problemIndex,
1091
+ problemAlias: problem.alias || null,
1092
+ problemTitle: resolveDisplayText(problem.title) || null
1093
+ }
1094
+ });
1095
+ }
1096
+ emitProblemClickPayload({
1097
+ problem,
1098
+ problemIndex,
1099
+ ranklist: props.data
1100
+ });
1101
+ }
1051
1102
  function getProblemStatisticsFooterCellPrimary(key, stat) {
1052
1103
  switch (key) {
1053
1104
  case "accepted":
@@ -1158,13 +1209,23 @@ const _sfc_main = defineComponent({
1158
1209
  return renderSlot(_ctx.$slots, "problem-header-cell", mergeProps({
1159
1210
  key: problem.alias || resolveDisplayText(problem.title) || problemIndex,
1160
1211
  ref_for: true
1161
- }, { problem, problemIndex, index: problemIndex, theme: resolvedTheme.value, languages: __props.languages }), () => [
1212
+ }, {
1213
+ problem,
1214
+ problemIndex,
1215
+ index: problemIndex,
1216
+ ranklist: __props.data,
1217
+ theme: resolvedTheme.value,
1218
+ languages: __props.languages,
1219
+ onClick: (event) => emitProblemClick(problem, problemIndex, event)
1220
+ }), () => [
1162
1221
  createVNode(_sfc_main$3, {
1163
1222
  problem,
1164
1223
  index: problemIndex,
1224
+ ranklist: __props.data,
1165
1225
  theme: resolvedTheme.value,
1166
- languages: __props.languages
1167
- }, null, 8, ["problem", "index", "theme", "languages"])
1226
+ languages: __props.languages,
1227
+ "on-problem-click": hasProblemClickListener.value ? emitProblemClickPayload : void 0
1228
+ }, null, 8, ["problem", "index", "ranklist", "theme", "languages", "on-problem-click"])
1168
1229
  ]);
1169
1230
  }), 128)),
1170
1231
  __props.showDirtColumn ? (openBlock(), createElementBlock("th", _hoisted_8, toDisplayString(resolveColumnTitle("dirt", "Dirt")), 1)) : createCommentVNode("", true),
@@ -1318,7 +1379,7 @@ const _sfc_main = defineComponent({
1318
1379
  return openBlock(), createElementBlock("td", {
1319
1380
  key: problem.alias || resolveDisplayText(problem.title) || problemIndex,
1320
1381
  class: "srk-problem-statistics-footer-cell srk-problem-statistics-footer-problem-header srk-problem-header srk--text-center srk--nowrap",
1321
- style: normalizeStyle({ backgroundImage: unref(getProblemHeaderBackgroundImage)(problem.style, resolvedTheme.value, 0) })
1382
+ style: normalizeStyle({ backgroundImage: unref(getProblemHeaderBackgroundImageIfStyled)(problem.style, resolvedTheme.value, 0) })
1322
1383
  }, [
1323
1384
  createElementVNode("span", _hoisted_27, toDisplayString(problem.alias || unref(numberToAlphabet)(problemIndex)), 1)
1324
1385
  ], 4);
@@ -7,6 +7,10 @@ declare const _sfc_main: import("vue").DefineComponent<import("vue").ExtractProp
7
7
  type: NumberConstructor;
8
8
  required: true;
9
9
  };
10
+ ranklist: {
11
+ type: ObjectConstructor;
12
+ required: true;
13
+ };
10
14
  theme: {
11
15
  type: StringConstructor;
12
16
  required: false;
@@ -16,12 +20,18 @@ declare const _sfc_main: import("vue").DefineComponent<import("vue").ExtractProp
16
20
  type: ArrayConstructor;
17
21
  required: false;
18
22
  };
23
+ onProblemClick: {
24
+ type: FunctionConstructor;
25
+ required: false;
26
+ };
19
27
  }>, {
20
28
  props: any;
21
29
  alias: import("vue").ComputedRef<any>;
30
+ title: import("vue").ComputedRef<any>;
22
31
  stat: import("vue").ComputedRef<any>;
23
32
  statDesc: import("vue").ComputedRef<string>;
24
- backgroundImage: import("vue").ComputedRef<string>;
33
+ backgroundImage: import("vue").ComputedRef<string | undefined>;
34
+ handleClick: (event: MouseEvent) => void;
25
35
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
26
36
  problem: {
27
37
  type: null;
@@ -31,6 +41,10 @@ declare const _sfc_main: import("vue").DefineComponent<import("vue").ExtractProp
31
41
  type: NumberConstructor;
32
42
  required: true;
33
43
  };
44
+ ranklist: {
45
+ type: ObjectConstructor;
46
+ required: true;
47
+ };
34
48
  theme: {
35
49
  type: StringConstructor;
36
50
  required: false;
@@ -40,6 +54,10 @@ declare const _sfc_main: import("vue").DefineComponent<import("vue").ExtractProp
40
54
  type: ArrayConstructor;
41
55
  required: false;
42
56
  };
57
+ onProblemClick: {
58
+ type: FunctionConstructor;
59
+ required: false;
60
+ };
43
61
  }>> & Readonly<{}>, {
44
62
  theme: string;
45
63
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -55,6 +55,7 @@ declare const _sfc_main: import("vue").DefineComponent<import("vue").ExtractProp
55
55
  fbStar: string;
56
56
  solutions: import("vue").ComputedRef<any[]>;
57
57
  isClickable: import("vue").ComputedRef<boolean>;
58
+ statusResultClassName: import("vue").ComputedRef<string | undefined>;
58
59
  commonClassName: import("vue").ComputedRef<(string | {
59
60
  'srk--cursor-pointer': boolean;
60
61
  'srk-prest-status-block-color-text': any;
package/dist/types.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type * as srk from '@algoux/standard-ranklist';
2
2
  import type { CSSProperties } from 'vue';
3
3
  import type { EnumTheme } from '@algoux/standard-ranklist-utils';
4
- import type { RanklistColumnTitles, RanklistStatusCellPreset, RanklistUserAvatarPlacement, SolutionClickPayload, StaticRanklist, StaticRanklistRow, UserClickPayload } from '@algoux/standard-ranklist-renderer-component-core';
4
+ import type { RanklistColumnTitles, RanklistStatusCellPreset, RanklistUserAvatarPlacement, ProblemClickPayload, SolutionClickPayload, StaticRanklist, StaticRanklistRow, UserClickPayload } from '@algoux/standard-ranklist-renderer-component-core';
5
5
  export declare type ModalCloseReason = 'mask' | 'close-button' | 'escape';
6
6
  export interface RanklistProps {
7
7
  data: StaticRanklist;
@@ -25,8 +25,10 @@ export interface ProblemHeaderCellSlotProps {
25
25
  problem: srk.Problem;
26
26
  problemIndex: number;
27
27
  index: number;
28
+ ranklist: StaticRanklist;
28
29
  theme?: EnumTheme;
29
30
  languages?: readonly string[];
31
+ onClick: (event?: MouseEvent) => void;
30
32
  }
31
33
  export interface UserCellSlotProps {
32
34
  user: srk.User;
@@ -91,6 +93,7 @@ export interface DefaultSolutionModalProps extends Pick<ModalProps, 'open' | 'ro
91
93
  }
92
94
  export declare type RanklistEvents = {
93
95
  userClick: UserClickPayload;
96
+ problemClick: ProblemClickPayload;
94
97
  solutionClick: SolutionClickPayload;
95
98
  };
96
99
  export declare type ProgressBarEvents = {
@@ -100,4 +103,4 @@ export declare type ModalEvents = {
100
103
  close: ModalCloseReason;
101
104
  'update:open': boolean;
102
105
  };
103
- export type { RanklistColumnTitles, RanklistStatusCellPreset, RanklistUserAvatarPlacement, SolutionClickPayload, StaticRanklist, StaticRanklistRow, UserClickPayload, };
106
+ export type { RanklistColumnTitles, RanklistStatusCellPreset, RanklistUserAvatarPlacement, ProblemClickPayload, SolutionClickPayload, StaticRanklist, StaticRanklistRow, UserClickPayload, };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@algoux/standard-ranklist-renderer-component-vue",
3
- "version": "0.6.3",
3
+ "version": "0.6.5",
4
4
  "description": "Vue components for Standard Ranklist Renderer Component",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/algoux/standard-ranklist-renderer-component",
@@ -29,8 +29,8 @@
29
29
  },
30
30
  "dependencies": {
31
31
  "@algoux/standard-ranklist-utils": "^0.3.1",
32
- "@algoux/standard-ranklist-renderer-component-styles": "0.6.1",
33
- "@algoux/standard-ranklist-renderer-component-core": "0.6.2"
32
+ "@algoux/standard-ranklist-renderer-component-core": "0.6.4",
33
+ "@algoux/standard-ranklist-renderer-component-styles": "0.6.2"
34
34
  },
35
35
  "peerDependencies": {
36
36
  "@algoux/standard-ranklist": "*",