-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathroundabout.min.js
1 lines (1 loc) · 7.25 KB
/
roundabout.min.js
1
function showPlayer(t){return State.isHighlighted(t)?m("mark",m("strong.is-uppercase",t)):t}function teamName(t){return t.name||["Team ",showPlayer(t.members[0])]}let State={teams:[],ones:[],twos:[],highlighted:"(none)",load:function(t){return m.request({method:"GET",url:t}).then(function(t){State.teams=t.teams,State.ones=t.ones,State.twos=t.twos})},isHighlighted:t=>State.highlighted==t,highlight:function(t){State.highlighted=t}};const trophyIcon=()=>m.trust("🏆"),zapIcon=()=>m.trust("⚡"),medalIcon=()=>m.trust("🏅"),Standings={view:function(t){const e={ONES:9,TWOS:5,THREES:45};let a=State.teams.map(t=>({name:t.name,members:t.members,ones:0,twos:0,threes:0,total:function(){return this.ones+this.twos+this.threes}}));for(const t of State.ones)for(const s of t)if("score"in s){let t=s.players[s.score[0]>s.score[1]?0:1];const m=a.findIndex(e=>e.members.includes(t));a[m].ones+=e.ONES}for(const t of State.twos){let s=t.pairs[t.score[0]>t.score[1]?0:1][0];const m=a.findIndex(t=>t.members.includes(s));a[m].twos+=e.TWOS}a.sort((t,e)=>{const a=t.total(),s=e.total();return a==s?t.threes==e.threes?t.twos==e.twos?t.ones<e.ones:t.twos<e.twos:e.threes<t.threes:a<s});let s=0,n=0,r=0;return a.forEach((t,e)=>{t.ones>a[s].ones&&(s=e),t.twos>a[n].twos&&(n=e),t.threes>a[r].threes&&(r=e)}),m(".column.table-container",m("table.table.is-striped.is-hoverable.is-fullwidth",[m("thead",m("tr",[m("th",{colspan:4},"Team"),m("th.has-text-right","1v1"),m("th.has-text-right","2v2"),m("th.has-text-right","3v3"),m("th.has-text-right","Total")])),m("tbody",a.map((t,e)=>m("tr",m("td",0==e?m("strong",trophyIcon(),teamName(t)):teamName(t)),t.members.map(t=>m("td.text-small",showPlayer(t))),m("td.has-text-right",e==s&&t.ones>0?m("strong",medalIcon(),t.ones):t.ones),m("td.has-text-right",e==n&&t.twos>0?m("strong",medalIcon(),t.twos):t.twos),m("td.has-text-right",e==r&&t.threes>0?m("strong",medalIcon(),t.threes):t.threes),m("td.has-text-right",0==e?m("strong",trophyIcon(),t.total()):t.total())))),m("caption.has-text-left",m("h1.title","Standings"))]))}},Team={view:function(t){return m(".card.team",[m("header.card-header",m("h2.card-header-title",teamName(t.attrs))),m("ul.card-content",t.attrs.members.map(t=>m("li",showPlayer(t)))),m(".card-footer")])}},Teams={view:function(t){return[m("section",[m("h1.title","Teams"),m(".columns",State.teams.map(t=>m(".column",m(Team,t))))]),m("section.columns",m(Standings))]}},Threes={view:function(t){const e=State.teams.slice(1),a=State.teams.slice(0,-1);return m(".columns",[m(".column",[m("table.table.is-striped.is-hoverable.is-fullwidth",[m("caption",m("h2.title","First Bo3")),m("thead",m("tr",[m("th"),a.map(t=>m("th",teamName(t)))])),m("tbody",e.map((t,e)=>m("tr",[m("th",teamName(t)),a.map((t,a)=>m("td",{class:e<a?"has-background-grey":""}))])))])])])}},Twos={view:function(t){const e=[[0,1],[0,2],[1,2]],a=State.teams.slice(1),s=State.teams.slice(0,-1);return m(".columns.",[m(".column.table-container",[m("table.table.is-hoverable.is-fullwidth",[m("caption",m("h2.title","Round-robin Bo3")),m("thead",m("tr",[m("th",{colspan:2}),s.map(t=>m("th.has-text-centered",{colspan:3},teamName(t)))]),m("tr",[m("th",{colspan:2}),s.map(t=>e.map(e=>m("th.has-text-centered",[showPlayer(t.members[e[0]])," ",showPlayer(t.members[e[1]])])))])),a.map((t,a)=>m("tbody",e.map((n,r)=>{let o=[];const i=t.members[n[0]],l=t.members[n[1]];return 0==r&&o.push(m("th",{rowspan:3},teamName(t))),o.push(m("th",[showPlayer(i)," ",showPlayer(l)])),o.push(...s.map((t,s)=>e.map(e=>{const n=t.members[e[0]],r=t.members[e[1]];let o=void 0,h=-1,c=-1;const d=()=>a<s?{class:"has-background-grey"}:[i,l,n,r].some(State.isHighlighted)?{class:"is-selected has-text-centered has-text-weight-bold"}:{class:"has-text-centered"};if(a>=s){const t=[i,l,n,r];o=State.twos.find(e=>e.pairs.flat().every(e=>t.includes(e))),o&&(h=o.pairs.findIndex(t=>t.includes(i)),c=(h+1)%2)}return m("td",d(),o?o.score[h]+" - "+o.score[c]:"")}))),m("tr",o)})))])])])}},Ones={view:function(t){return m(".columns",[m(".column.table-container",[m("table.table.is-striped.is-hoverable.is-fullwidth",[m("thead",[m("tr",[m("th"),State.ones.map((t,e)=>m("th.has-text-centered",{colspan:2},"Round "+(e+1)))]),m("tr",[m("th","Player"),State.ones.map(()=>[m("th","Opponent"),m("th.has-text-right","Result")])])]),m("tbody",State.teams.map(t=>[t.members.map(t=>m("tr",State.isHighlighted(t)?{class:"is-selected has-text-weight-bold"}:{},[m("td",showPlayer(t)),State.ones.map(e=>{const a=e.find(e=>e.players.includes(t));if(void 0!==a){const e=a.players.indexOf(t),s=(e+1)%2;return[m("td",showPlayer(a.players[s])),m("td.has-text-right","score"in a?a.score[e]+" - "+a.score[s]:"")]}{const a=e.filter(e=>e.players.some(e=>e.includes(t))).map((e,a)=>{const s=e.players.indexOf(t),m=(s+1)%2;return a>0?[" or ",showPlayer(e.players[m])]:showPlayer(e.players[m])});return[m("td",a),m("td","")]}})]))]))])])])}},Schedule={view:function(t){return m(".columns",[m("section.column",this.ones()),m("section.column",this.twos())])},ones:function(){return m(".card",[m("header.card-header",m("h2.title.card-header-title","1v1")),m(".card-content",State.ones.map((t,e)=>{const a=t.filter(t=>!("score"in t));if(a.length>0)return m("section.section",[m("h3.title","Round "+(e+1)),a.map(t=>m("ul.columns.is-mobile",[m("li.column",showPlayer(t.players[0])),m("li.column.has-text-centered",zapIcon()),m("li.column.has-text-right",showPlayer(t.players[1]))]))])}))])},twos:function(){let t=[];if(State.teams.length>1){let e={};for(let t=0;t<State.teams.length;++t)e[t]=[[0,1],[0,2],[1,2]];for(let a=0;a<State.teams.length-1;++a){const s=State.teams[a];for(const m of e[a]){const n=s.members[m[0]],r=s.members[m[1]];let o=!1;for(let s=a+1;s<State.teams.length&&!o;++s){const a=State.teams[s];let m=e[s];for(let i=0;i<m.length&&!o;++i){const l=m[i],h=a.members[l[0]],c=a.members[l[1]],d=[n,r,h,c];State.twos.some(t=>t.pairs.flat().every(t=>d.includes(t)))||(t.push([[n,r],[h,c]]),e[s].splice(i,1),o=!0)}}}}}return m(".card",[m("header.card-header",m("h2.title.card-header-title","2v2")),m(".card-content",t.map(t=>m(".columns.is-mobile",[m(".column.has-text-right",showPlayer(t[0][0])),m(".column",showPlayer(t[0][1])),m(".column.is-1",zapIcon()),m(".column.has-text-right",showPlayer(t[1][0])),m(".column",showPlayer(t[1][1]))])))])}},App={oninit:function(t){State.load(t.attrs.dataUrl),t.state.navbarExpanded=!1},view:function(t){const e=function(t){return State.isHighlighted(t)?{value:t,selected:!0}:{value:t}},a=function(t){return{class:"navbar-item "+(m.route.get()==t?"has-text-link has-background-link-light":""),href:t}};return[m("nav.navbar",[m(".navbar-brand",[m(".navbar-item",[m("figure.image",m("img",{src:"./logo.png"})),m("span"," The Roundabout")]),m("a.navbar-burger"+(t.state.navbarExpanded?".is-active":""),{"data-target":"navbarMenu",onclick:function(){t.state.navbarExpanded=!t.state.navbarExpanded}},[m("span"),m("span"),m("span")])]),m(".navbar-menu"+(t.state.navbarExpanded?".is-active":""),[m(".navbar-start",[m(m.route.Link,a("/teams"),"Teams"),m(m.route.Link,a("/3s"),"3v3"),m(m.route.Link,a("/2s"),"2v2"),m(m.route.Link,a("/1s"),"1v1"),m(m.route.Link,a("/schedule"),"Schedule")]),m(".navbar-end",[m(".select",[m("select",{onchange:function(t){State.highlight(t.target.value)}},[m("option",e("(none)"),"(no player highlighted)"),State.teams.map(t=>t.members.map(t=>m("option",e(t),t)))])])])])]),m(".container",t.children)]}};