diff --git a/assets/js/scoreboard.js b/assets/js/scoreboard.js index e3ef264..d11da70 100644 --- a/assets/js/scoreboard.js +++ b/assets/js/scoreboard.js @@ -16,7 +16,9 @@ Alpine.data("ScoreboardDetail", () => ({ async update() { this.data = await CTFd.pages.scoreboard.getScoreboardDetail(10); - let option = getOption(CTFd.config.userMode, this.data); + let optionMerge = window.scoreboardChartOptions; + let option = getOption(CTFd.config.userMode, this.data, optionMerge); + embed(this.$refs.scoregraph, option); this.show = Object.keys(this.data).length > 0; }, diff --git a/assets/js/teams/private.js b/assets/js/teams/private.js index bb3515c..32c0e5d 100644 --- a/assets/js/teams/private.js +++ b/assets/js/teams/private.js @@ -191,6 +191,8 @@ Alpine.data("TeamGraphs", () => ({ this.failCount = this.fails.meta.count; this.awardCount = this.awards.meta.count; + let optionMerge = window.teamScoreGraphChartOptions; + embed( this.$refs.scoregraph, getUserScoreOption( @@ -198,6 +200,7 @@ Alpine.data("TeamGraphs", () => ({ CTFd.team.name, this.solves.data, this.awards.data, + optionMerge, ), ); }, diff --git a/assets/js/teams/public.js b/assets/js/teams/public.js index 1dd1c46..7906972 100644 --- a/assets/js/teams/public.js +++ b/assets/js/teams/public.js @@ -61,6 +61,8 @@ Alpine.data("TeamGraphs", () => ({ this.failCount = this.fails.meta.count; this.awardCount = this.awards.meta.count; + let optionMerge = window.teamScoreGraphChartOptions; + embed( this.$refs.scoregraph, getUserScoreOption( @@ -68,6 +70,7 @@ Alpine.data("TeamGraphs", () => ({ window.TEAM.name, this.solves.data, this.awards.data, + optionMerge, ), ); }, diff --git a/assets/js/users/private.js b/assets/js/users/private.js index 08fca35..2109167 100644 --- a/assets/js/users/private.js +++ b/assets/js/users/private.js @@ -64,6 +64,8 @@ Alpine.data("UserGraphs", () => ({ this.failCount = this.fails.meta.count; this.awardCount = this.awards.meta.count; + let optionMerge = window.userScoreGraphChartOptions; + embed( this.$refs.scoregraph, getUserScoreOption( @@ -71,6 +73,7 @@ Alpine.data("UserGraphs", () => ({ CTFd.user.name, this.solves.data, this.awards.data, + optionMerge, ), ); }, diff --git a/assets/js/users/public.js b/assets/js/users/public.js index e7ed04a..f7dfbad 100644 --- a/assets/js/users/public.js +++ b/assets/js/users/public.js @@ -64,6 +64,8 @@ Alpine.data("UserGraphs", () => ({ this.failCount = this.fails.meta.count; this.awardCount = this.awards.meta.count; + let optionMerge = window.userScoreGraphChartOptions; + embed( this.$refs.scoregraph, getUserScoreOption( @@ -71,6 +73,7 @@ Alpine.data("UserGraphs", () => ({ window.USER.name, this.solves.data, this.awards.data, + optionMerge, ), ); }, diff --git a/assets/js/utils/graphs/echarts/categories.js b/assets/js/utils/graphs/echarts/categories.js index 3933e69..5f19688 100644 --- a/assets/js/utils/graphs/echarts/categories.js +++ b/assets/js/utils/graphs/echarts/categories.js @@ -1,6 +1,7 @@ import { colorHash } from "@ctfdio/ctfd-js/ui"; +import { mergeObjects } from "../../objects"; -export function getOption(solves) { +export function getOption(solves, optionMerge) { let option = { title: { left: "center", @@ -99,5 +100,8 @@ export function getOption(solves) { }); }); + if (optionMerge) { + option = mergeObjects(option, optionMerge); + } return option; } diff --git a/assets/js/utils/graphs/echarts/scoreboard.js b/assets/js/utils/graphs/echarts/scoreboard.js index bf30310..28982f3 100644 --- a/assets/js/utils/graphs/echarts/scoreboard.js +++ b/assets/js/utils/graphs/echarts/scoreboard.js @@ -1,17 +1,9 @@ import { colorHash } from "@ctfdio/ctfd-js/ui"; +import { mergeObjects } from "../../objects"; +import { cumulativeSum } from "../../math"; import dayjs from "dayjs"; -export function cumulativeSum(arr) { - let result = arr.concat(); - for (let i = 0; i < arr.length; i++) { - result[i] = arr.slice(0, i + 1).reduce(function (p, i) { - return p + i; - }); - } - return result; -} - -export function getOption(mode, places) { +export function getOption(mode, places, optionMerge) { let option = { title: { left: "center", @@ -102,5 +94,8 @@ export function getOption(mode, places) { option.series.push(data); } + if (optionMerge) { + option = mergeObjects(option, optionMerge); + } return option; } diff --git a/assets/js/utils/graphs/echarts/solve-percentage.js b/assets/js/utils/graphs/echarts/solve-percentage.js index fcba1f1..98344f6 100644 --- a/assets/js/utils/graphs/echarts/solve-percentage.js +++ b/assets/js/utils/graphs/echarts/solve-percentage.js @@ -1,4 +1,6 @@ -export function getOption(solves, fails) { +import { mergeObjects } from "../../objects"; + +export function getOption(solves, fails, optionMerge) { let option = { title: { left: "center", @@ -77,5 +79,9 @@ export function getOption(solves, fails) { }, ], }; + + if (optionMerge) { + option = mergeObjects(option, optionMerge); + } return option; } diff --git a/assets/js/utils/graphs/echarts/userscore.js b/assets/js/utils/graphs/echarts/userscore.js index 89815a9..6719da2 100644 --- a/assets/js/utils/graphs/echarts/userscore.js +++ b/assets/js/utils/graphs/echarts/userscore.js @@ -1,8 +1,9 @@ import { colorHash } from "@ctfdio/ctfd-js/ui"; -import { cumulativeSum } from "./scoreboard"; +import { cumulativeSum } from "../../math"; +import { mergeObjects } from "../../objects"; import dayjs from "dayjs"; -export function getOption(id, name, solves, awards) { +export function getOption(id, name, solves, awards, optionMerge) { let option = { title: { left: "center", @@ -98,5 +99,9 @@ export function getOption(id, name, solves, awards) { }, data: cumulativeSum(scores), }); + + if (optionMerge) { + option = mergeObjects(option, optionMerge); + } return option; } diff --git a/assets/js/utils/objects.js b/assets/js/utils/objects.js new file mode 100644 index 0000000..aa564f5 --- /dev/null +++ b/assets/js/utils/objects.js @@ -0,0 +1,11 @@ +export function mergeObjects(target, source) { + // https://stackoverflow.com/a/65817907 + // Iterate through `source` properties and if an `Object` set property to merge of `target` and `source` properties + for (const key of Object.keys(source)) { + if (source[key] instanceof Object) + Object.assign(source[key], mergeObjects(target[key], source[key])); + } + // Join `target` and modified `source` + Object.assign(target || {}, source); + return target; +} diff --git a/static/assets/index.6c6d1611.js b/static/assets/index.6c6d1611.js deleted file mode 100644 index 9d25788..0000000 --- a/static/assets/index.6c6d1611.js +++ /dev/null @@ -1 +0,0 @@ -import{d as c,c as f}from"./index.7e48942e.js";import{u as p,i as g,a as h,b as x,c as y,d as b,e as v,f as $,g as A,h as j,j as L,k as z,l as I,m as O}from"./echarts.128204f2.js";function T(o){let t=o.concat();for(let e=0;e{e&&e.resize()})}export{T as c,S as e,w as g}; diff --git a/static/assets/index.955e6486.js b/static/assets/index.955e6486.js new file mode 100644 index 0000000..d0b2bd4 --- /dev/null +++ b/static/assets/index.955e6486.js @@ -0,0 +1 @@ +import{u as l,i as e,a as c,b as o,c as f,d as u,e as r,f as $,g as b,h as m,j as d,k as j,l as O,m as g}from"./echarts.128204f2.js";function h(n,t){for(const s of Object.keys(t))t[s]instanceof Object&&Object.assign(t[s],h(n[s],t[s]));return Object.assign(n||{},t),n}function p(n){let t=n.concat();for(let s=0;s{s&&s.resize()})}export{p as c,v as e,h as m}; diff --git a/static/assets/scoreboard.3f07d373.js b/static/assets/scoreboard.3f07d373.js new file mode 100644 index 0000000..bcccddc --- /dev/null +++ b/static/assets/scoreboard.3f07d373.js @@ -0,0 +1 @@ +import{d as g,c as f,m as n,C as s}from"./index.7e48942e.js";import{c as y,m as w,e as v}from"./index.955e6486.js";import"./echarts.128204f2.js";function x(i,t,l){let r={title:{left:"center",text:"Top 10 "+(i==="teams"?"Teams":"Users")},tooltip:{trigger:"axis",axisPointer:{type:"cross"}},legend:{type:"scroll",orient:"horizontal",align:"left",bottom:35,data:[]},toolbox:{feature:{dataZoom:{yAxisIndex:"none"},saveAsImage:{}}},grid:{containLabel:!0},xAxis:[{type:"time",boundaryGap:!1,data:[]}],yAxis:[{type:"value"}],dataZoom:[{id:"dataZoomX",type:"slider",xAxisIndex:[0],filterMode:"filter",height:20,top:35,fillerColor:"rgba(233, 236, 241, 0.4)"}],series:[]};const a=Object.keys(t);for(let e=0;e({data:{},show:!0,async update(){this.data=await s.pages.scoreboard.getScoreboardDetail(10);let i=window.scoreboardChartOptions,t=x(s.config.userMode,this.data,i);v(this.$refs.scoregraph,t),this.show=Object.keys(this.data).length>0},async init(){this.update(),setInterval(()=>{this.update()},m)}}));n.data("ScoreboardList",()=>({standings:[],brackets:[],activeBracket:null,async update(){const t=await(await s.fetch(`/api/v1/brackets?type=${s.config.userMode}`,{method:"GET"})).json();this.brackets=t.data,this.standings=await s.pages.scoreboard.getScoreboard()},async init(){this.update(),setInterval(()=>{this.update()},m)}}));n.start(); diff --git a/static/assets/scoreboard.4ec57e19.js b/static/assets/scoreboard.4ec57e19.js deleted file mode 100644 index 2597d61..0000000 --- a/static/assets/scoreboard.4ec57e19.js +++ /dev/null @@ -1 +0,0 @@ -import{m as a,C as t}from"./index.7e48942e.js";import{g as r,e as d}from"./index.6c6d1611.js";import"./echarts.128204f2.js";window.Alpine=a;window.CTFd=t;const s=window.scoreboardUpdateInterval||3e5;a.data("ScoreboardDetail",()=>({data:{},show:!0,async update(){this.data=await t.pages.scoreboard.getScoreboardDetail(10);let e=r(t.config.userMode,this.data);d(this.$refs.scoregraph,e),this.show=Object.keys(this.data).length>0},async init(){this.update(),setInterval(()=>{this.update()},s)}}));a.data("ScoreboardList",()=>({standings:[],brackets:[],activeBracket:null,async update(){const o=await(await t.fetch(`/api/v1/brackets?type=${t.config.userMode}`,{method:"GET"})).json();this.brackets=o.data,this.standings=await t.pages.scoreboard.getScoreboard()},async init(){this.update(),setInterval(()=>{this.update()},s)}}));a.start(); diff --git a/static/assets/teams_private.069dc607.js b/static/assets/teams_private.ca4186a9.js similarity index 93% rename from static/assets/teams_private.069dc607.js rename to static/assets/teams_private.ca4186a9.js index 670c8bb..5b321eb 100644 --- a/static/assets/teams_private.069dc607.js +++ b/static/assets/teams_private.ca4186a9.js @@ -1 +1 @@ -import{m as o,C as i,M as r,c as d}from"./index.7e48942e.js";import{s as n,c as m}from"./clipboard.1749e720.js";import{g as c}from"./userscore.27dbc1a9.js";import{e as u}from"./index.6c6d1611.js";import"./echarts.128204f2.js";window.Alpine=o;window.CTFd=i;o.store("inviteToken","");o.data("TeamEditModal",()=>({success:null,error:null,initial:null,errors:[],init(){this.initial=n(this.$el.querySelector("form"))},async updateProfile(){let e=n(this.$el,this.initial,!0);e.fields=[];for(const a in e)if(a.match(/fields\[\d+\]/)){let s={},l=parseInt(a.slice(7,-1));s.field_id=l,s.value=e[a],e.fields.push(s),delete e[a]}let t=await i.pages.teams.updateTeamSettings(e);t.success?(this.success=!0,this.error=!1,setTimeout(()=>{this.success=null,this.error=null},3e3)):(this.success=!1,this.error=!0,Object.keys(t.errors).map(a=>{const s=t.errors[a];this.errors.push(s)}))}}));o.data("TeamCaptainModal",()=>({success:null,error:null,errors:[],async updateCaptain(){let e=n(this.$el,null,!0),t=await i.pages.teams.updateTeamSettings(e);t.success?window.location.reload():(this.success=!1,this.error=!0,Object.keys(t.errors).map(a=>{const s=t.errors[a];this.errors.push(s)}))}}));o.data("TeamInviteModal",()=>({copy(){m(this.$refs.link)}}));o.data("TeamDisbandModal",()=>({errors:[],async disbandTeam(){let e=await i.pages.teams.disbandTeam();e.success?window.location.reload():this.errors=e.errors[""]}}));o.data("CaptainMenu",()=>({captain:!1,editTeam(){this.teamEditModal=new r(document.getElementById("team-edit-modal")),this.teamEditModal.show()},chooseCaptain(){this.teamCaptainModal=new r(document.getElementById("team-captain-modal")),this.teamCaptainModal.show()},async inviteMembers(){const e=await i.pages.teams.getInviteToken();if(e.success){const t=e.data.code,a=`${window.location.origin}${i.config.urlRoot}/teams/invite?code=${t}`;document.querySelector("#team-invite-modal input[name=link]").value=a,this.$store.inviteToken=a,this.teamInviteModal=new r(document.getElementById("team-invite-modal")),this.teamInviteModal.show()}else Object.keys(e.errors).map(t=>{const a=e.errors[t];alert(a)})},disbandTeam(){this.teamDisbandModal=new r(document.getElementById("team-disband-modal")),this.teamDisbandModal.show()}}));o.data("TeamGraphs",()=>({solves:null,fails:null,awards:null,solveCount:0,failCount:0,awardCount:0,getSolvePercentage(){return(this.solveCount/(this.solveCount+this.failCount)*100).toFixed(2)},getFailPercentage(){return(this.failCount/(this.solveCount+this.failCount)*100).toFixed(2)},getCategoryBreakdown(){const e=[],t={};this.solves.data.map(s=>{e.push(s.challenge.category)}),e.forEach(s=>{s in t?t[s]+=1:t[s]=1});const a=[];for(const s in t)a.push({name:s,count:t[s],percent:t[s]/e.length*100,color:d(s)});return a},async init(){this.solves=await i.pages.teams.teamSolves("me"),this.fails=await i.pages.teams.teamFails("me"),this.awards=await i.pages.teams.teamAwards("me"),this.solveCount=this.solves.meta.count,this.failCount=this.fails.meta.count,this.awardCount=this.awards.meta.count,u(this.$refs.scoregraph,c(i.team.id,i.team.name,this.solves.data,this.awards.data))}}));o.start(); +import{m as o,C as i,M as r,c as d}from"./index.7e48942e.js";import{s as n,c as m}from"./clipboard.1749e720.js";import{g as c}from"./userscore.1d4e199f.js";import{e as u}from"./index.955e6486.js";import"./echarts.128204f2.js";window.Alpine=o;window.CTFd=i;o.store("inviteToken","");o.data("TeamEditModal",()=>({success:null,error:null,initial:null,errors:[],init(){this.initial=n(this.$el.querySelector("form"))},async updateProfile(){let e=n(this.$el,this.initial,!0);e.fields=[];for(const a in e)if(a.match(/fields\[\d+\]/)){let s={},l=parseInt(a.slice(7,-1));s.field_id=l,s.value=e[a],e.fields.push(s),delete e[a]}let t=await i.pages.teams.updateTeamSettings(e);t.success?(this.success=!0,this.error=!1,setTimeout(()=>{this.success=null,this.error=null},3e3)):(this.success=!1,this.error=!0,Object.keys(t.errors).map(a=>{const s=t.errors[a];this.errors.push(s)}))}}));o.data("TeamCaptainModal",()=>({success:null,error:null,errors:[],async updateCaptain(){let e=n(this.$el,null,!0),t=await i.pages.teams.updateTeamSettings(e);t.success?window.location.reload():(this.success=!1,this.error=!0,Object.keys(t.errors).map(a=>{const s=t.errors[a];this.errors.push(s)}))}}));o.data("TeamInviteModal",()=>({copy(){m(this.$refs.link)}}));o.data("TeamDisbandModal",()=>({errors:[],async disbandTeam(){let e=await i.pages.teams.disbandTeam();e.success?window.location.reload():this.errors=e.errors[""]}}));o.data("CaptainMenu",()=>({captain:!1,editTeam(){this.teamEditModal=new r(document.getElementById("team-edit-modal")),this.teamEditModal.show()},chooseCaptain(){this.teamCaptainModal=new r(document.getElementById("team-captain-modal")),this.teamCaptainModal.show()},async inviteMembers(){const e=await i.pages.teams.getInviteToken();if(e.success){const t=e.data.code,a=`${window.location.origin}${i.config.urlRoot}/teams/invite?code=${t}`;document.querySelector("#team-invite-modal input[name=link]").value=a,this.$store.inviteToken=a,this.teamInviteModal=new r(document.getElementById("team-invite-modal")),this.teamInviteModal.show()}else Object.keys(e.errors).map(t=>{const a=e.errors[t];alert(a)})},disbandTeam(){this.teamDisbandModal=new r(document.getElementById("team-disband-modal")),this.teamDisbandModal.show()}}));o.data("TeamGraphs",()=>({solves:null,fails:null,awards:null,solveCount:0,failCount:0,awardCount:0,getSolvePercentage(){return(this.solveCount/(this.solveCount+this.failCount)*100).toFixed(2)},getFailPercentage(){return(this.failCount/(this.solveCount+this.failCount)*100).toFixed(2)},getCategoryBreakdown(){const e=[],t={};this.solves.data.map(s=>{e.push(s.challenge.category)}),e.forEach(s=>{s in t?t[s]+=1:t[s]=1});const a=[];for(const s in t)a.push({name:s,count:t[s],percent:t[s]/e.length*100,color:d(s)});return a},async init(){this.solves=await i.pages.teams.teamSolves("me"),this.fails=await i.pages.teams.teamFails("me"),this.awards=await i.pages.teams.teamAwards("me"),this.solveCount=this.solves.meta.count,this.failCount=this.fails.meta.count,this.awardCount=this.awards.meta.count;let e=window.teamScoreGraphChartOptions;u(this.$refs.scoregraph,c(i.team.id,i.team.name,this.solves.data,this.awards.data,e))}}));o.start(); diff --git a/static/assets/teams_public.65644e78.js b/static/assets/teams_public.6ae1825a.js similarity index 70% rename from static/assets/teams_public.65644e78.js rename to static/assets/teams_public.6ae1825a.js index 3e387f0..45b5bd5 100644 --- a/static/assets/teams_public.65644e78.js +++ b/static/assets/teams_public.6ae1825a.js @@ -1 +1 @@ -import{m as o,c as n,C as e}from"./index.7e48942e.js";import{g as l}from"./userscore.27dbc1a9.js";import{e as r}from"./index.6c6d1611.js";import"./echarts.128204f2.js";window.Alpine=o;o.data("TeamGraphs",()=>({solves:null,fails:null,awards:null,solveCount:0,failCount:0,awardCount:0,getSolvePercentage(){return(this.solveCount/(this.solveCount+this.failCount)*100).toFixed(2)},getFailPercentage(){return(this.failCount/(this.solveCount+this.failCount)*100).toFixed(2)},getCategoryBreakdown(){const s=[],a={};this.solves.data.map(t=>{s.push(t.challenge.category)}),s.forEach(t=>{t in a?a[t]+=1:a[t]=1});const i=[];for(const t in a)i.push({name:t,count:a[t],percent:(a[t]/s.length*100).toFixed(2),color:n(t)});return i},async init(){this.solves=await e.pages.teams.teamSolves(window.TEAM.id),this.fails=await e.pages.teams.teamFails(window.TEAM.id),this.awards=await e.pages.teams.teamAwards(window.TEAM.id),this.solveCount=this.solves.meta.count,this.failCount=this.fails.meta.count,this.awardCount=this.awards.meta.count,r(this.$refs.scoregraph,l(window.TEAM.id,window.TEAM.name,this.solves.data,this.awards.data))}}));o.start(); +import{m as o,c as n,C as e}from"./index.7e48942e.js";import{g as r}from"./userscore.1d4e199f.js";import{e as l}from"./index.955e6486.js";import"./echarts.128204f2.js";window.Alpine=o;o.data("TeamGraphs",()=>({solves:null,fails:null,awards:null,solveCount:0,failCount:0,awardCount:0,getSolvePercentage(){return(this.solveCount/(this.solveCount+this.failCount)*100).toFixed(2)},getFailPercentage(){return(this.failCount/(this.solveCount+this.failCount)*100).toFixed(2)},getCategoryBreakdown(){const s=[],a={};this.solves.data.map(t=>{s.push(t.challenge.category)}),s.forEach(t=>{t in a?a[t]+=1:a[t]=1});const i=[];for(const t in a)i.push({name:t,count:a[t],percent:(a[t]/s.length*100).toFixed(2),color:n(t)});return i},async init(){this.solves=await e.pages.teams.teamSolves(window.TEAM.id),this.fails=await e.pages.teams.teamFails(window.TEAM.id),this.awards=await e.pages.teams.teamAwards(window.TEAM.id),this.solveCount=this.solves.meta.count,this.failCount=this.fails.meta.count,this.awardCount=this.awards.meta.count;let s=window.teamScoreGraphChartOptions;l(this.$refs.scoregraph,r(window.TEAM.id,window.TEAM.name,this.solves.data,this.awards.data,s))}}));o.start(); diff --git a/static/assets/users_private.34cf0ed1.js b/static/assets/users_private.34cf0ed1.js deleted file mode 100644 index 53c63f0..0000000 --- a/static/assets/users_private.34cf0ed1.js +++ /dev/null @@ -1 +0,0 @@ -import{m as o,c as n,C as e}from"./index.7e48942e.js";import{g as l}from"./userscore.27dbc1a9.js";import{e as u}from"./index.6c6d1611.js";import"./echarts.128204f2.js";window.Alpine=o;o.data("UserGraphs",()=>({solves:null,fails:null,awards:null,solveCount:0,failCount:0,awardCount:0,getSolvePercentage(){return(this.solveCount/(this.solveCount+this.failCount)*100).toFixed(2)},getFailPercentage(){return(this.failCount/(this.solveCount+this.failCount)*100).toFixed(2)},getCategoryBreakdown(){const a=[],t={};this.solves.data.map(s=>{a.push(s.challenge.category)}),a.forEach(s=>{s in t?t[s]+=1:t[s]=1});const i=[];for(const s in t){const r=Number(t[s]/a.length*100).toFixed(2);i.push({name:s,count:t[s],color:n(s),percent:r})}return i},async init(){this.solves=await e.pages.users.userSolves("me"),this.fails=await e.pages.users.userFails("me"),this.awards=await e.pages.users.userAwards("me"),this.solveCount=this.solves.meta.count,this.failCount=this.fails.meta.count,this.awardCount=this.awards.meta.count,u(this.$refs.scoregraph,l(e.user.id,e.user.name,this.solves.data,this.awards.data))}}));o.start(); diff --git a/static/assets/users_private.63e06649.js b/static/assets/users_private.63e06649.js new file mode 100644 index 0000000..ec9da68 --- /dev/null +++ b/static/assets/users_private.63e06649.js @@ -0,0 +1 @@ +import{m as o,c as n,C as a}from"./index.7e48942e.js";import{g as l}from"./userscore.1d4e199f.js";import{e as u}from"./index.955e6486.js";import"./echarts.128204f2.js";window.Alpine=o;o.data("UserGraphs",()=>({solves:null,fails:null,awards:null,solveCount:0,failCount:0,awardCount:0,getSolvePercentage(){return(this.solveCount/(this.solveCount+this.failCount)*100).toFixed(2)},getFailPercentage(){return(this.failCount/(this.solveCount+this.failCount)*100).toFixed(2)},getCategoryBreakdown(){const e=[],t={};this.solves.data.map(s=>{e.push(s.challenge.category)}),e.forEach(s=>{s in t?t[s]+=1:t[s]=1});const i=[];for(const s in t){const r=Number(t[s]/e.length*100).toFixed(2);i.push({name:s,count:t[s],color:n(s),percent:r})}return i},async init(){this.solves=await a.pages.users.userSolves("me"),this.fails=await a.pages.users.userFails("me"),this.awards=await a.pages.users.userAwards("me"),this.solveCount=this.solves.meta.count,this.failCount=this.fails.meta.count,this.awardCount=this.awards.meta.count;let e=window.userScoreGraphChartOptions;u(this.$refs.scoregraph,l(a.user.id,a.user.name,this.solves.data,this.awards.data,e))}}));o.start(); diff --git a/static/assets/users_public.025dda56.js b/static/assets/users_public.025dda56.js new file mode 100644 index 0000000..98c27e2 --- /dev/null +++ b/static/assets/users_public.025dda56.js @@ -0,0 +1 @@ +import{m as o,c as r,C as a}from"./index.7e48942e.js";import{g as l}from"./userscore.1d4e199f.js";import{e as u}from"./index.955e6486.js";import"./echarts.128204f2.js";window.Alpine=o;o.data("UserGraphs",()=>({solves:null,fails:null,awards:null,solveCount:0,failCount:0,awardCount:0,getSolvePercentage(){return(this.solveCount/(this.solveCount+this.failCount)*100).toFixed(2)},getFailPercentage(){return(this.failCount/(this.solveCount+this.failCount)*100).toFixed(2)},getCategoryBreakdown(){const e=[],s={};this.solves.data.map(t=>{e.push(t.challenge.category)}),e.forEach(t=>{t in s?s[t]+=1:s[t]=1});const i=[];for(const t in s){const n=Number(s[t]/e.length*100).toFixed(2);i.push({name:t,count:s[t],color:r(t),percent:n})}return i},async init(){this.solves=await a.pages.users.userSolves(window.USER.id),this.fails=await a.pages.users.userFails(window.USER.id),this.awards=await a.pages.users.userAwards(window.USER.id),this.solveCount=this.solves.meta.count,this.failCount=this.fails.meta.count,this.awardCount=this.awards.meta.count;let e=window.userScoreGraphChartOptions;u(this.$refs.scoregraph,l(window.USER.id,window.USER.name,this.solves.data,this.awards.data,e))}}));o.start(); diff --git a/static/assets/users_public.5be7d03c.js b/static/assets/users_public.5be7d03c.js deleted file mode 100644 index 789b6f2..0000000 --- a/static/assets/users_public.5be7d03c.js +++ /dev/null @@ -1 +0,0 @@ -import{m as o,c as r,C as e}from"./index.7e48942e.js";import{g as l}from"./userscore.27dbc1a9.js";import{e as u}from"./index.6c6d1611.js";import"./echarts.128204f2.js";window.Alpine=o;o.data("UserGraphs",()=>({solves:null,fails:null,awards:null,solveCount:0,failCount:0,awardCount:0,getSolvePercentage(){return(this.solveCount/(this.solveCount+this.failCount)*100).toFixed(2)},getFailPercentage(){return(this.failCount/(this.solveCount+this.failCount)*100).toFixed(2)},getCategoryBreakdown(){const a=[],t={};this.solves.data.map(s=>{a.push(s.challenge.category)}),a.forEach(s=>{s in t?t[s]+=1:t[s]=1});const i=[];for(const s in t){const n=Number(t[s]/a.length*100).toFixed(2);i.push({name:s,count:t[s],color:r(s),percent:n})}return i},async init(){this.solves=await e.pages.users.userSolves(window.USER.id),this.fails=await e.pages.users.userFails(window.USER.id),this.awards=await e.pages.users.userAwards(window.USER.id),this.solveCount=this.solves.meta.count,this.failCount=this.fails.meta.count,this.awardCount=this.awards.meta.count,u(this.$refs.scoregraph,l(window.USER.id,window.USER.name,this.solves.data,this.awards.data))}}));o.start(); diff --git a/static/assets/userscore.1d4e199f.js b/static/assets/userscore.1d4e199f.js new file mode 100644 index 0000000..51f48a8 --- /dev/null +++ b/static/assets/userscore.1d4e199f.js @@ -0,0 +1 @@ +import{d as u,c}from"./index.7e48942e.js";import{c as m,m as h}from"./index.955e6486.js";function y(l,a,p,d,i){let e={title:{left:"center",text:"Score over Time"},tooltip:{trigger:"axis",axisPointer:{type:"cross"}},legend:{type:"scroll",orient:"horizontal",align:"left",bottom:0,data:[a]},toolbox:{feature:{saveAsImage:{}}},grid:{containLabel:!0},xAxis:[{type:"category",boundaryGap:!1,data:[]}],yAxis:[{type:"value"}],dataZoom:[{id:"dataZoomX",type:"slider",xAxisIndex:[0],filterMode:"filter",height:20,top:35,fillerColor:"rgba(233, 236, 241, 0.4)"}],series:[]};const n=[],r=[],o=p.concat(d);o.sort((t,s)=>new Date(t.date)-new Date(s.date));for(let t=0;t{e.xAxis[0].data.push(t)}),e.series.push({name:a,type:"line",label:{normal:{show:!0,position:"top"}},areaStyle:{normal:{color:c(a+l)}},itemStyle:{normal:{color:c(a+l)}},data:m(r)}),i&&(e=h(e,i)),e}export{y as g}; diff --git a/static/assets/userscore.27dbc1a9.js b/static/assets/userscore.27dbc1a9.js deleted file mode 100644 index 6c16490..0000000 --- a/static/assets/userscore.27dbc1a9.js +++ /dev/null @@ -1 +0,0 @@ -import{d,c as n}from"./index.7e48942e.js";import{c as u}from"./index.6c6d1611.js";function x(s,o,c,p){let a={title:{left:"center",text:"Score over Time"},tooltip:{trigger:"axis",axisPointer:{type:"cross"}},legend:{type:"scroll",orient:"horizontal",align:"left",bottom:0,data:[o]},toolbox:{feature:{saveAsImage:{}}},grid:{containLabel:!0},xAxis:[{type:"category",boundaryGap:!1,data:[]}],yAxis:[{type:"value"}],dataZoom:[{id:"dataZoomX",type:"slider",xAxisIndex:[0],filterMode:"filter",height:20,top:35,fillerColor:"rgba(233, 236, 241, 0.4)"}],series:[]};const i=[],r=[],e=c.concat(p);e.sort((t,l)=>new Date(t.date)-new Date(l.date));for(let t=0;t{a.xAxis[0].data.push(t)}),a.series.push({name:o,type:"line",label:{normal:{show:!0,position:"top"}},areaStyle:{normal:{color:n(o+s)}},itemStyle:{normal:{color:n(o+s)}},data:u(r)}),a}export{x as g}; diff --git a/static/manifest.json b/static/manifest.json index 8f15350..1b526ea 100644 --- a/static/manifest.json +++ b/static/manifest.json @@ -38,12 +38,12 @@ ] }, "assets/js/scoreboard.js": { - "file": "assets/scoreboard.4ec57e19.js", + "file": "assets/scoreboard.3f07d373.js", "src": "assets/js/scoreboard.js", "isEntry": true, "imports": [ "assets/js/index.js", - "_index.6c6d1611.js", + "_index.955e6486.js", "_echarts.128204f2.js" ] }, @@ -56,25 +56,25 @@ ] }, "assets/js/teams/public.js": { - "file": "assets/teams_public.65644e78.js", + "file": "assets/teams_public.6ae1825a.js", "src": "assets/js/teams/public.js", "isEntry": true, "imports": [ "assets/js/index.js", - "_userscore.27dbc1a9.js", - "_index.6c6d1611.js", + "_userscore.1d4e199f.js", + "_index.955e6486.js", "_echarts.128204f2.js" ] }, "assets/js/teams/private.js": { - "file": "assets/teams_private.069dc607.js", + "file": "assets/teams_private.ca4186a9.js", "src": "assets/js/teams/private.js", "isEntry": true, "imports": [ "assets/js/index.js", "_clipboard.1749e720.js", - "_userscore.27dbc1a9.js", - "_index.6c6d1611.js", + "_userscore.1d4e199f.js", + "_index.955e6486.js", "_echarts.128204f2.js" ] }, @@ -87,24 +87,24 @@ ] }, "assets/js/users/public.js": { - "file": "assets/users_public.5be7d03c.js", + "file": "assets/users_public.025dda56.js", "src": "assets/js/users/public.js", "isEntry": true, "imports": [ "assets/js/index.js", - "_userscore.27dbc1a9.js", - "_index.6c6d1611.js", + "_userscore.1d4e199f.js", + "_index.955e6486.js", "_echarts.128204f2.js" ] }, "assets/js/users/private.js": { - "file": "assets/users_private.34cf0ed1.js", + "file": "assets/users_private.63e06649.js", "src": "assets/js/users/private.js", "isEntry": true, "imports": [ "assets/js/index.js", - "_userscore.27dbc1a9.js", - "_index.6c6d1611.js", + "_userscore.1d4e199f.js", + "_index.955e6486.js", "_echarts.128204f2.js" ] }, @@ -130,18 +130,17 @@ "assets/js/index.js" ] }, - "_index.6c6d1611.js": { - "file": "assets/index.6c6d1611.js", + "_index.955e6486.js": { + "file": "assets/index.955e6486.js", "imports": [ - "assets/js/index.js", "_echarts.128204f2.js" ] }, - "_userscore.27dbc1a9.js": { - "file": "assets/userscore.27dbc1a9.js", + "_userscore.1d4e199f.js": { + "file": "assets/userscore.1d4e199f.js", "imports": [ "assets/js/index.js", - "_index.6c6d1611.js" + "_index.955e6486.js" ] }, "assets/scss/main.scss": {