From e0508a96c115660061f679c5aa968bd39bd05e53 Mon Sep 17 00:00:00 2001 From: blacktemplar Date: Sun, 18 Dec 2016 00:40:07 +0100 Subject: [PATCH 1/2] adds support for renderMatch decorator, allows to only specify partial decorators. --- dist/jquery.bracket.min.js | 4 ++-- src/jquery.bracket.ts | 22 ++++++++++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/dist/jquery.bracket.min.js b/dist/jquery.bracket.min.js index db05ac6..049d94c 100644 --- a/dist/jquery.bracket.min.js +++ b/dist/jquery.bracket.min.js @@ -1,2 +1,2 @@ -/* jQuery Bracket | Copyright (c) Teijo Laine 2011-2016 | Licenced under the MIT licence */ -var __extends=this&&this.__extends||function(a,b){function c(){this.constructor=a}for(var d in b)b.hasOwnProperty(d)&&(a[d]=b[d]);a.prototype=null===b?Object.create(b):(c.prototype=b.prototype,new c)};!function(a){function b(a){return!isNaN(parseFloat(a))&&isFinite(a)}function c(){this.message="Root of information for this team",this.name="EndOfBranchException"}function d(a){function b(a,c){return a instanceof Array?b(a[0],c+1):c}return b(a,0)}function e(a,b){return b>0&&(a=e([a],b-1)),a}function f(b,c,d){var e=d.find(".team[data-teamid="+b+"]"),f=c?c:"highlight";return{highlight:function(){e.each(function(){a(this).addClass(f),a(this).hasClass("win")&&a(this).parent().find(".connector").addClass(f)})},deHighlight:function(){e.each(function(){a(this).removeClass(f),a(this).parent().find(".connector").removeClass(f)})}}}function g(b,c,d){var e=d||c,g=e.winner(),h=e.loser();g&&h&&(g.name.isEmpty()||f(g.seed.get(),"highlightWinner",b).highlight(),h.name.isEmpty()||f(h.seed.get(),"highlightLoser",b).highlight()),b.find(".team").mouseover(function(){var c=a(this).attr("data-teamid");if(void 0!==c){var d=f(parseInt(c,10),null,b);d.highlight(),a(this).mouseout(function(){d.deHighlight(),a(this).unbind("mouseout")})}})}function h(b,c,d){var e=a('');e.val(c),b.empty().append(e),e.focus(),e.blur(function(){d(e.val())}),e.keydown(function(a){var b=a.keyCode||a.which;9!==b&&13!==b&&27!==b||(a.preventDefault(),d(e.val(),27!==b))})}function i(a,b,c,d){switch(d){case"empty-bye":return void a.append("BYE");case"empty-tbd":return void a.append("TBD");case"entry-no-score":case"entry-default-win":case"entry-complete":return void a.append(b)}}function j(a){var b=a.el,c=b.find(".team.win");c.append('
1st
');var d=b.find(".team.lose");return d.append('
2nd
'),!0}function k(a){var b=a.el,c=b.find(".team.win");c.append('
3rd
');var d=b.find(".team.lose");return d.append('
4th
'),!0}function l(a,b,c,d,e){for(var f,g=Math.log(2*b.length)/Math.log(2),h=b.length,i=0;i1&&!d.skipConsolationRound)){var o=a.final().getRound().prev(),p=o.map(function(a){return function(){return a.match(0).loser()}}).toNull(),q=o.map(function(a){return function(){return a.match(1).loser()}}).toNull(),r=f.addMatch(function(){return[{source:p},{source:q}]},u.of(k));r.setAlignCb(function(b){var c=a.el.height()/2;r.el.css("height",c+"px");var e=b.height()/2+d.matchMargin;b.css("top",e+"px")}),r.setConnectorCb(u.empty())}}function m(a,b,c,d,e){for(var f=Math.log(2*c)/Math.log(2)-1,g=c/2,h=0;h2)throw new Error("Unexpected number of final rounds");return j(e)}if(2===a.size())return!1;var h=function(){var b=!e.winner().name.isEmpty()&&e.winner().name===c.winner().name;return g===!1&&b&&(g=!0,f()),!b&&g&&(g=!1,a.dropRound(),f()),b},i=a.addRound(u.of(h)),k=i.addMatch(function(){return[{source:function(){return e.first()}},{source:function(){return e.second()}}]},u.of(j));return e.setConnectorCb(u.of(function(a){return{height:0,shift:a.height()/2}})),k.setConnectorCb(u.empty()),k.setAlignCb(function(a){var d=b.el.height()+c.el.height();k.el.css("height",d+"px");var e=(b.el.height()/2+b.el.height()+c.el.height()/2)/2-a.height();a.css("top",e+"px")}),!1}));if(h.setAlignCb(function(a){var e=b.el.height()+c.el.height();d.skipConsolationRound||(e/=2),h.el.css("height",e+"px");var f=(b.el.height()/2+b.el.height()+c.el.height()/2)/2-a.height();a.css("top",f+"px")}),!d.skipConsolationRound){var i=c.final().getRound().prev(),l=g.addMatch(function(){return[{source:function(){return i.get().match(0).loser()}},{source:function(){return c.loser()}}]},u.of(k));l.setAlignCb(function(a){var d=(b.el.height()+c.el.height())/2;l.el.css("height",d+"px");var e=(b.el.height()/2+b.el.height()+c.el.height()/2)/2+a.height()/2-d;a.css("top",e+"px")}),h.setConnectorCb(u.empty()),l.setConnectorCb(u.empty())}b.final().setConnectorCb(u.of(function(a){var e=a.height()/4,f=(b.el.height()/2+b.el.height()+c.el.height()/2)/2-a.height()/2,g=f-b.el.height()/2,h=b.winner().order.map(function(a){return a.map({height:g+e*(d.centerConnectors?2:1),shift:e*(d.centerConnectors?2:1)},{height:g+e*(d.centerConnectors?2:0),shift:e*(d.centerConnectors?2:3)})}).orElse({height:g+e*(d.centerConnectors?2:1),shift:2*e}),i=h.height,j=h.shift;return i-=a.height()/2,{height:i,shift:j}})),c.final().setConnectorCb(u.of(function(a){var e=a.height()/4,f=(b.el.height()/2+b.el.height()+c.el.height()/2)/2-a.height()/2,g=f-b.el.height()/2,h=c.winner().order.map(function(a){return a.map({height:g+e*(d.centerConnectors?2:0),shift:e*(d.centerConnectors?2:3)},{height:g+2*e,shift:e*(d.centerConnectors?2:1)})}).orElse({height:g+e*(d.centerConnectors?2:1),shift:2*e}),i=h.height,j=h.shift;return i+=a.height()/2,{height:-i,shift:-j}}))}function o(b,c,d,e){var f=c.height,g=c.shift,h=b/2,i=!0;f<0&&(i=!1,f=-f),f<2&&(f=0);var j=a('
').appendTo(d);j.css("height",f),j.css("width",h+"px"),j.css(e,-h-2+"px"),g>=0?j.css("top",g-1+"px"):j.css("bottom",-g-1+"px"),i?j.css("border-bottom","none"):j.css("border-top","none");var k=a('
').appendTo(j);return k.css("width",h+"px"),k.css(e,-h+"px"),i?k.css("bottom","0px"):k.css("top","0px"),j}function p(a,b,c,d,e){if(b)return Math.log(2*a)/Math.log(2);if(c)return Math.max(2,2*(Math.log(2*a)/Math.log(2)-1)-1);var f=!d&&3===e.length&&2===e[2].length;return 2*(Math.log(2*a)/Math.log(2)-1)+1+(f?1:0)}function q(b){var c=a.extend(!0,{},b);return c.teams=c.teams.map(function(a){return a.map(function(a){return a.toNull()})}),c.results=c.results.map(function(a){return a.map(function(a){return a.map(function(a){var b=[a.first.toNull(),a.second.toNull()];return void 0!==a.userData&&b.push(a.userData),b})})}),c}function r(c,d,e,f,g,h,i,j,k,l){var m=e.name.isEmpty()||f.name.isEmpty()?"":'data-resultid="result-'+j.getNext()+'"',n=a('
"),o=e.name.isEmpty()||f.name.isEmpty()||!g?u.empty():e.score.map(function(a){return""+a}),p=o.orElse("--");n.text(p);var q=e.name.map(function(){return o.map(function(){return"entry-complete"}).orElseGet(function(){return f.emptyBranch()===t.BYE?"entry-default-win":"entry-no-score"})}).orElseGet(function(){var a=e.emptyBranch();switch(a){case t.BYE:return"empty-bye";case t.TBD:return"empty-tbd";default:throw new Error("Unexpected branch type "+a)}}),r=a('
'),s=a('
').appendTo(r);if(i.decorator.render(s,e.name.toNull(),p,q),e.seed.forEach(function(a){r.attr("data-teamid",a)}),e.name.isEmpty()?r.addClass("na"):d.winner().name===e.name?r.addClass("win"):d.loser().name===e.name&&r.addClass("lose"),r.append(n),(!e.name.isEmpty()||e.name.isEmpty()&&0===c&&h)&&"function"==typeof i.save&&(i.disableTeamEdit||(s.addClass("editable"),s.click(function(){function b(){function f(f,g){var h=e.seed.get();i.init.teams[~~(h/2)][h%2]=u.of(f||null),l(!0),d.click(b);var j=i.el.find(".team[data-teamid="+(h+1)+"] div.label:first");j.length&&g===!0&&0===c&&a(j).click()}d.unbind(),i.decorator.edit(d,e.name.toNull(),f)}var d=a(this);b()})),!e.name.isEmpty()&&!f.name.isEmpty()&&g)){var w=j.get();n.addClass("editable"),n.click(function(){function c(){d.unbind();var f=b(e.score)?d.text():"0",g=a('');g.val(f),d.empty().append(g),g.focus().select(),g.keydown(function(c){b(a(this).val())?a(this).removeClass("error"):a(this).addClass("error");var d=c.keyCode||c.which;if(9===d||13===d||27===d){if(c.preventDefault(),a(this).blur(),27===d)return;var e=k.find("div.score[data-resultid=result-"+(w+1)+"]");e&&e.click()}}),g.blur(function(){var a=g.val();a&&b(a)||b(e.score)?a&&b(a)||!b(e.score)||(a=e.score):a="0",d.html(a),b(a)&&(e.score=v.of(parseInt(a,10)),l(!0)),d.click(c)})}var d=a(this);c()})}return r}function s(b,c,d){var e=a('
').appendTo(b),f=a('+').appendTo(e);if(f.click(function(){for(var a=c.teams.length,b=0;b1&&1===c.results.length||c.teams.length>2&&3===c.results.length){var g=a('-').appendTo(e);g.click(function(){if(c.teams.length>1)return c.teams=c.teams.slice(0,c.teams.length/2),K(d)})}if(1===c.results.length&&c.teams.length>1){var h=a('de').appendTo(e);h.click(function(){if(c.teams.length>1&&c.results.length<3)return c.results.push([],[]),K(d)})}else if(3===c.results.length&&c.teams.length>1){var h=a('se').appendTo(e);h.click(function(){if(3===c.results.length)return c.results=c.results.slice(0,1),K(d)})}}var t,u=function(){function a(b){if(this.val=b,b instanceof a)throw new Error("Trying to wrap Option into an Option");if(void 0===this.val)throw new Error("Option cannot contain undefined")}return a.of=function(b){return new a(b)},a.empty=function(){return new a(null)},a.prototype.get=function(){if(null===this.val)throw new Error("Trying to get() empty Option");return this.val},a.prototype.orElse=function(a){return null===this.val?a:this.val},a.prototype.orElseGet=function(a){return null===this.val?a():this.val},a.prototype.map=function(b){return null===this.val?a.empty():new a(b(this.val))},a.prototype.forEach=function(a){return null!==this.val&&a(this.val),this},a.prototype.toNull=function(){return null===this.val?null:this.val},a.prototype.isEmpty=function(){return null===this.val},a}(),v=function(a){function b(){a.apply(this,arguments)}return __extends(b,a),b.of=function(a){var b=typeof a,c="number";if(null!==a&&b!==c)throw new Error("Invalid score format, expected "+c+", got "+b);return u.of(a)},b.empty=function(){return u.empty()},b}(u),w=function(){function a(a,b,c){if(this.first=a,this.second=b,this.userData=c,!a||!b)throw new Error("Cannot create ResultObject with undefined scores")}return a}();!function(a){a[a.TBD=0]="TBD",a[a.BYE=1]="BYE"}(t||(t={}));var x=function(){function a(a){this.isFirst=a}return a.first=function(){return new a(!0)},a.second=function(){return new a(!1)},a.prototype.map=function(a,b){return this.isFirst?a:b},a}(),y=function(){function a(a,b,c,d,e){this.source=a,this.name=b,this.order=c,this.seed=d,this.score=e}return a.prototype.emptyBranch=function(){if(!this.name.isEmpty())return t.TBD;try{return this.source().emptyBranch()}catch(a){if(a instanceof c)return t.BYE;throw new Error("Unexpected exception type")}},a}(),z=function(){function a(a,b){this.a=a,this.b=b}return a.teamsInResultOrder=function(a){var b=a.a.name.isEmpty(),c=a.b.name.isEmpty();if(c&&!b)return a.b.emptyBranch()===t.BYE?[a.a,a.b]:[];if(b&&!c)return a.a.emptyBranch()===t.BYE?[a.b,a.a]:[];if(!a.a.score.isEmpty()&&!a.b.score.isEmpty()){if(a.a.score.get()>a.b.score.get())return[a.a,a.b];if(a.a.score.get()'),this.matches=[]}return Object.defineProperty(b.prototype,"el",{get:function(){return this.roundCon},enumerable:!0,configurable:!0}),b.prototype.addMatch=function(a,b){var c=this,d=this.matches.length,e=null!==a?a():[{source:function(){return c.bracket.round(c.roundNumber-1).match(2*d).winner()}},{source:function(){return c.bracket.round(c.roundNumber-1).match(2*d+1).winner()}}],f=function(){return e[0].source()},g=function(){return e[1].source()},h=new z(new y(f,f().name,u.of(x.first()),f().seed,v.empty()),new y(g,g().name,u.of(x.second()),g().seed,v.empty())),i=this.mkMatch(this,h,d,this._results.map(function(a){return void 0===a[d]?null:a[d]}),b,this.isFirstBracket,this.opts);return this.matches.push(i),i},b.prototype.match=function(a){return this.matches[a]},b.prototype.prev=function(){return this.previousRound},b.prototype.size=function(){return this.matches.length},b.prototype.render=function(){this.roundCon.empty(),(this.doRenderCb.isEmpty()||this.doRenderCb.get()())&&(this.roundCon.appendTo(this.bracket.el),this.matches.forEach(function(a){return a.render()}))},b.prototype.results=function(){return this.matches.reduce(function(a,b){return a.concat([b.results()])},[])},b}(),F=function(){function a(a,b,c,d,e){this.bracketCon=a,this.initResults=b,this.mkMatch=c,this.isFirstBracket=d,this.opts=e,this.rounds=[]}return Object.defineProperty(a.prototype,"el",{get:function(){return this.bracketCon},enumerable:!0,configurable:!0}),a.prototype.addRound=function(a){var b=this.rounds.length,c=b>0?u.of(this.rounds[b-1]):u.empty(),d=this.initResults.map(function(a){return void 0===a[b]?new w(v.empty(),v.empty(),void 0):a[b]}),e=new E(this,c,b,d,a,this.mkMatch,this.isFirstBracket,this.opts);return this.rounds.push(e),e},a.prototype.dropRound=function(){this.rounds.pop()},a.prototype.round=function(a){return this.rounds[a]},a.prototype.size=function(){return this.rounds.length},a.prototype.final=function(){return this.rounds[this.rounds.length-1].match(0)},a.prototype.winner=function(){return this.rounds[this.rounds.length-1].match(0).winner()},a.prototype.loser=function(){return this.rounds[this.rounds.length-1].match(0).loser()},a.prototype.render=function(){this.bracketCon.empty();for(var a=0;a'),this.teamCon=a('
'),this.alignCb=null,this.matchUserData=f.isEmpty()?void 0:f.get().userData,!i.save){var m=this.matchUserData;i.onMatchHover&&this.teamCon.hover(function(){i.onMatchHover(m,!0)},function(){i.onMatchHover(m,!1)}),i.onMatchClick&&this.teamCon.click(function(){i.onMatchClick(m)})}d.a.name=d.a.source().name,d.b.name=d.b.source().name,d.a.score=f.map(function(a){return a.first.toNull()}),d.b.score=f.map(function(a){return a.second.toNull()}),d.a.name&&d.b.name||!b(d.a.score)&&!b(d.b.score)||(console.log("ERROR IN SCORE DATA: "+d.a.source().name+": "+d.a.score+", "+d.b.source().name+": "+d.b.score),d.a.score=d.b.score=v.empty())}return Object.defineProperty(c.prototype,"el",{get:function(){return this.matchCon},enumerable:!0,configurable:!0}),c.prototype.getRound=function(){return this.round},c.prototype.setConnectorCb=function(a){this.connectorCb=a},c.prototype.connect=function(a){var b=this,c="lr"===this.opts.dir?"right":"left",d=this.teamCon.height()/4,e=this.matchCon.height()/2,f=a.map(function(a){return a(b.teamCon,b)}).orElseGet(function(){return b.seed%2===0?b.winner().order.map(function(a){return a.map({shift:d*(b.opts.centerConnectors?2:1),height:e},{shift:d*(b.opts.centerConnectors?2:3),height:e-d*(b.opts.centerConnectors?0:2)})}).orElse({shift:2*d,height:e-d*(b.opts.centerConnectors?0:1)}):b.winner().order.map(function(a){return a.map({shift:-d*(b.opts.centerConnectors?2:3),height:-e+d*(b.opts.centerConnectors?0:2)},{shift:-d*(b.opts.centerConnectors?2:1),height:-e})}).orElse({shift:2*-d,height:-e+d*(b.opts.centerConnectors?0:1)})});this.teamCon.append(o(this.opts.roundMargin,f,this.teamCon,c))},c.prototype.winner=function(){return this.match.winner()},c.prototype.loser=function(){return this.match.loser()},c.prototype.first=function(){return this.match.a},c.prototype.second=function(){return this.match.b},c.prototype.setAlignCb=function(a){this.alignCb=a},c.prototype.render=function(){var a=this;this.matchCon.empty(),this.teamCon.empty(),this.match.a.name=this.match.a.source().name,this.match.b.name=this.match.b.source().name,this.match.a.seed=this.match.a.source().seed,this.match.b.seed=this.match.b.source().seed;var b=this.match.a.name.isEmpty()&&this.match.b.name.isEmpty();b?this.teamCon.addClass("np"):this.match.winner().name?this.teamCon.removeClass("np"):this.teamCon.addClass("np");var c=!this.match.a.name.isEmpty()&&!this.match.b.name.isEmpty();this.teamCon.append(r(this.round.roundNumber,this.match,this.match.a,this.match.b,c,this.isFirstBracket,this.opts,this.resultId,this.topCon,this.renderAll)),this.teamCon.append(r(this.round.roundNumber,this.match,this.match.b,this.match.a,c,this.isFirstBracket,this.opts,this.resultId,this.topCon,this.renderAll)),this.matchCon.appendTo(this.round.el),this.matchCon.append(this.teamCon),this.el.css("height",this.round.bracket.el.height()/this.round.size()+"px"),this.teamCon.css("top",this.el.height()/2-this.teamCon.height()/2+"px"),null!==this.alignCb&&this.alignCb(this.teamCon);var d=this.renderCb.map(function(b){return b(a)}).orElse(!1);d||this.connect(this.connectorCb)},c.prototype.results=function(){var a=this.match.a.name.isEmpty()||this.match.b.name.isEmpty();return a&&(this.match.a.score=this.match.b.score=v.empty()),new w(this.match.a.score,this.match.b.score,this.matchUserData)},c}(),I=function(a){return void 0===a?null:a},J=function(a){return a.map(function(a){return a.map(function(a){return a.map(function(a){return new w(v.of(I(a[0])),v.of(I(a[1])),a[2])})})})},K=function(b){function c(){var a=p(j.teams.length,k,b.skipGrandFinalComeback,b.skipSecondaryFinal,j.results);b.disableToolbar?r.css("width",a*(b.teamWidth+b.scoreWidth+b.roundMargin)+10):r.css("width",a*(b.teamWidth+b.scoreWidth+b.roundMargin)+40),k&&j.teams.length<=2&&!b.skipConsolationRound&&r.css("height",o+40)}function d(a){i.reset(),e.render(),f&&f.render(),h&&!b.skipGrandFinalComeback&&h.render(),b.disableHighlight||g(r,e,h),a&&(j.results[0]=e.results(),f&&(j.results[1]=f.results()),h&&!b.skipGrandFinalComeback&&(j.results[2]=h.results()),c(),b.save&&b.save(q(j),b.userData))}var e,f,h,i=new G,j=b.init,k=j.results.length<=1,o=45*j.teams.length+j.teams.length*b.matchMargin,r=a('
').appendTo(b.el.empty());b.skipSecondaryFinal&&k&&a.error("skipSecondaryFinal setting is viable only in double elimination mode"),b.disableToolbar||s(r,j,b);var t,v,w;k?v=a('
').appendTo(r):(b.skipGrandFinalComeback||(t=a('
').appendTo(r)),v=a('
').appendTo(r),w=a('
').appendTo(r)),v.css("height",o),w&&w.css("height",v.height()/2),c();var x=function(a,b,c,e,f,g,h){return new H(a,b,c,e,f,g,h,i,r,d)};return e=new F(v,u.of(j.results[0]||null),x,!0,b),k||(f=new F(w,u.of(j.results[1]||null),x,!1,b),b.skipGrandFinalComeback||(h=new F(t,u.of(j.results[2]||null),x,!1,b))),l(e,j.teams,k,b,b.skipGrandFinalComeback&&!k),k||(m(e,f,j.teams.length,b.skipGrandFinalComeback,b.centerConnectors),b.skipGrandFinalComeback||n(h,e,f,b,r,c)),d(!1),{data:function(){return q(b.init)}}},L=function(a,b){if(a.hasOwnProperty(b)){var c="number",d=typeof a[b];if(d!==c)throw new Error('Option "'+b+'" is '+d+" instead of "+c)}},M=function(a,b){var c=a[b],d="boolean",e=typeof c;if(e!==d)throw new Error("Value of "+b+" must be boolean, got "+d+", got "+e)},N=function(a,b,c){var d=b[c];if(dmatch.b.score.get()){return[match.a,match.b]}else if(match.a.score.get()0){a=wrap([a],d-1)}return a}function trackHighlighter(teamIndex,cssClass,container){var elements=container.find(".team[data-teamid="+teamIndex+"]");var addedClass=!cssClass?"highlight":cssClass;return{highlight:function(){elements.each(function(){$(this).addClass(addedClass);if($(this).hasClass("win")){$(this).parent().find(".connector").addClass(addedClass)}})},deHighlight:function(){elements.each(function(){$(this).removeClass(addedClass);$(this).parent().find(".connector").removeClass(addedClass)})}}}function postProcess(container,w,f){var source=f||w;var winner=source.winner();var loser=source.loser();if(winner&&loser){if(!winner.name.isEmpty()){trackHighlighter(winner.seed.get(),"highlightWinner",container).highlight()}if(!loser.name.isEmpty()){trackHighlighter(loser.seed.get(),"highlightLoser",container).highlight()}}container.find(".team").mouseover(function(){var teamId=$(this).attr("data-teamid");if(teamId===undefined){return}var track=trackHighlighter(parseInt(teamId,10),null,container);track.highlight();$(this).mouseout(function(){track.deHighlight();$(this).unbind("mouseout")})})}function defaultEdit(span,data,done){var input=$('');input.val(data);span.empty().append(input);input.focus();input.blur(function(){done(input.val())});input.keydown(function(e){var key=e.keyCode||e.which;if(key===9||key===13||key===27){e.preventDefault();done(input.val(),key!==27)}})}function defaultRender(container,team,score,state){switch(state){case"empty-bye":container.append("BYE");return;case"empty-tbd":container.append("TBD");return;case"entry-no-score":case"entry-default-win":case"entry-complete":container.append(team);return}}function defaultRenderMatch(container,data){return}function winnerBubbles(match){var el=match.el;var winner=el.find(".team.win");winner.append('
1st
');var loser=el.find(".team.lose");loser.append('
2nd
');return true}function consolationBubbles(match){var el=match.el;var winner=el.find(".team.win");winner.append('
3rd
');var loser=el.find(".team.lose");loser.append('
4th
');return true}var winnerMatchSources=function(teams,m){return function(){return[{source:function(){return new TeamBlock(function(){throw new EndOfBranchException},teams[m][0],Option.of(Order.first()),Option.of(m*2),Score.empty())}},{source:function(){return new TeamBlock(function(){throw new EndOfBranchException},teams[m][1],Option.of(Order.second()),Option.of(m*2+1),Score.empty())}}]}};var winnerAlignment=function(match,skipConsolationRound){return function(tC){tC.css("top","");tC.css("position","absolute");if(skipConsolationRound){tC.css("top",match.el.height()/2-tC.height()/2+"px")}else{tC.css("bottom",-tC.height()/2+"px")}}};function prepareWinners(winners,teams,isSingleElimination,opts,skipGrandFinalComeback){var roundCount=Math.log(teams.length*2)/Math.log(2);var matchCount=teams.length;var round;for(var r=0;r1&&!opts.skipConsolationRound){var prev=winners.final().getRound().prev();var third_1=prev.map(function(p){return function(){return p.match(0).loser()}}).toNull();var fourth_1=prev.map(function(p){return function(){return p.match(1).loser()}}).toNull();var consol_1=round.addMatch(function(){return[{source:third_1},{source:fourth_1}]},Option.of(consolationBubbles));consol_1.setAlignCb(function(tC){var height=winners.el.height()/2;consol_1.el.css("height",height+"px");var topShift=tC.height()/2+opts.matchMargin;tC.css("top",topShift+"px")});consol_1.setConnectorCb(Option.empty())}}}var loserMatchSources=function(winners,losers,matchCount,m,n,r){return function(){if(n%2===0&&r===0){return[{source:function(){return winners.round(0).match(m*2).loser()}},{source:function(){return winners.round(0).match(m*2+1).loser()}}]}else{var winnerMatch_1=r%2===0?matchCount-m-1:m;return[{source:function(){return losers.round(r*2).match(m).winner()}},{source:function(){return winners.round(r+1).match(winnerMatch_1).loser()}}]}}};var loserAlignment=function(teamCon,match){return function(){return teamCon.css("top",match.el.height()/2-teamCon.height()/2+"px")}};function prepareLosers(winners,losers,teamCount,skipGrandFinalComeback,centerConnectors){var roundCount=Math.log(teamCount*2)/Math.log(2)-1;var matchCount=teamCount/2;for(var r=0;r2){throw new Error("Unexpected number of final rounds")}return winnerBubbles(match)}}));match.setAlignCb(function(tC){var height=winners.el.height()+losers.el.height();if(!opts.skipConsolationRound){height/=2}match.el.css("height",height+"px");var topShift=(winners.el.height()/2+winners.el.height()+losers.el.height()/2)/2-tC.height();tC.css("top",topShift+"px")});if(!opts.skipConsolationRound){var prev_1=losers.final().getRound().prev();var consol_2=round.addMatch(function(){return[{source:function(){return prev_1.get().match(0).loser()}},{source:function(){return losers.loser()}}]},Option.of(consolationBubbles));consol_2.setAlignCb(function(tC){var height=(winners.el.height()+losers.el.height())/2;consol_2.el.css("height",height+"px");var topShift=(winners.el.height()/2+winners.el.height()+losers.el.height()/2)/2+tC.height()/2-height;tC.css("top",topShift+"px")});match.setConnectorCb(Option.empty());consol_2.setConnectorCb(Option.empty())}winners.final().setConnectorCb(Option.of(function(tC){var connectorOffset=tC.height()/4;var topShift=(winners.el.height()/2+winners.el.height()+losers.el.height()/2)/2-tC.height()/2;var matchupOffset=topShift-winners.el.height()/2;var _a=winners.winner().order.map(function(order){return order.map({height:matchupOffset+connectorOffset*(opts.centerConnectors?2:1),shift:connectorOffset*(opts.centerConnectors?2:1)},{height:matchupOffset+connectorOffset*(opts.centerConnectors?2:0),shift:connectorOffset*(opts.centerConnectors?2:3)})}).orElse({height:matchupOffset+connectorOffset*(opts.centerConnectors?2:1),shift:connectorOffset*2}),height=_a.height,shift=_a.shift;height-=tC.height()/2;return{height:height,shift:shift}}));losers.final().setConnectorCb(Option.of(function(tC){var connectorOffset=tC.height()/4;var topShift=(winners.el.height()/2+winners.el.height()+losers.el.height()/2)/2-tC.height()/2;var matchupOffset=topShift-winners.el.height()/2;var _a=losers.winner().order.map(function(order){return order.map({height:matchupOffset+connectorOffset*(opts.centerConnectors?2:0),shift:connectorOffset*(opts.centerConnectors?2:3)},{height:matchupOffset+connectorOffset*2,shift:connectorOffset*(opts.centerConnectors?2:1)})}).orElse({height:matchupOffset+connectorOffset*(opts.centerConnectors?2:1),shift:connectorOffset*2}),height=_a.height,shift=_a.shift;height+=tC.height()/2;return{height:-height,shift:-shift}}))}var Round=function(){function Round(bracket,previousRound,roundNumber,_results,doRenderCb,mkMatch,isFirstBracket,opts){this.bracket=bracket;this.previousRound=previousRound;this.roundNumber=roundNumber;this._results=_results;this.doRenderCb=doRenderCb;this.mkMatch=mkMatch;this.isFirstBracket=isFirstBracket;this.opts=opts;this.containerWidth=this.opts.teamWidth+this.opts.scoreWidth;this.roundCon=$('
');this.matches=[]}Object.defineProperty(Round.prototype,"el",{get:function(){return this.roundCon},enumerable:true,configurable:true});Round.prototype.addMatch=function(teamCb,renderCb){var _this=this;var matchIdx=this.matches.length;var teams=teamCb!==null?teamCb():[{source:function(){return _this.bracket.round(_this.roundNumber-1).match(matchIdx*2).winner()}},{source:function(){return _this.bracket.round(_this.roundNumber-1).match(matchIdx*2+1).winner()}}];var teamA=function(){return teams[0].source()};var teamB=function(){return teams[1].source()};var matchResult=new MatchResult(new TeamBlock(teamA,teamA().name,Option.of(Order.first()),teamA().seed,Score.empty()),new TeamBlock(teamB,teamB().name,Option.of(Order.second()),teamB().seed,Score.empty()));var match=this.mkMatch(this,matchResult,matchIdx,this._results.map(function(r){return r[matchIdx]===undefined?null:r[matchIdx]}),renderCb,this.isFirstBracket,this.opts);this.matches.push(match);return match};Round.prototype.match=function(id){return this.matches[id]};Round.prototype.prev=function(){return this.previousRound};Round.prototype.size=function(){return this.matches.length};Round.prototype.render=function(){this.roundCon.empty();if(!this.doRenderCb.isEmpty()&&!this.doRenderCb.get()()){return}this.roundCon.appendTo(this.bracket.el);this.matches.forEach(function(m){return m.render()})};Round.prototype.results=function(){return this.matches.reduce(function(agg,m){return agg.concat([m.results()])},[])};return Round}();var Bracket=function(){function Bracket(bracketCon,initResults,mkMatch,isFirstBracket,opts){this.bracketCon=bracketCon;this.initResults=initResults;this.mkMatch=mkMatch;this.isFirstBracket=isFirstBracket;this.opts=opts;this.rounds=[]}Object.defineProperty(Bracket.prototype,"el",{get:function(){return this.bracketCon},enumerable:true,configurable:true});Bracket.prototype.addRound=function(doRenderCb){var id=this.rounds.length;var previous=id>0?Option.of(this.rounds[id-1]):Option.empty();var roundResults=this.initResults.map(function(r){return r[id]===undefined?new ResultObject(Score.empty(),Score.empty(),undefined):r[id]});var round=new Round(this,previous,id,roundResults,doRenderCb,this.mkMatch,this.isFirstBracket,this.opts);this.rounds.push(round);return round};Bracket.prototype.dropRound=function(){this.rounds.pop()};Bracket.prototype.round=function(id){return this.rounds[id]};Bracket.prototype.size=function(){return this.rounds.length};Bracket.prototype.final=function(){return this.rounds[this.rounds.length-1].match(0)};Bracket.prototype.winner=function(){return this.rounds[this.rounds.length-1].match(0).winner()};Bracket.prototype.loser=function(){return this.rounds[this.rounds.length-1].match(0).loser()};Bracket.prototype.render=function(){this.bracketCon.empty();for(var i=0;i
').appendTo(teamCon);src.css("height",height);src.css("width",width+"px");src.css(align,-width-2+"px");if(shift>=0){src.css("top",shift-1+"px")}else{src.css("bottom",-shift-1+"px")}if(drop){src.css("border-bottom","none")}else{src.css("border-top","none")}var dst=$('
').appendTo(src);dst.css("width",width+"px");dst.css(align,-width+"px");if(drop){dst.css("bottom","0px")}else{dst.css("top","0px")}return src}function countRounds(teamCount,isSingleElimination,skipGrandFinalComeback,skipSecondaryFinal,results){if(isSingleElimination){return Math.log(teamCount*2)/Math.log(2)}else if(skipGrandFinalComeback){return Math.max(2,(Math.log(teamCount*2)/Math.log(2)-1)*2-1)}else{var hasGrandFinalRematch=!skipSecondaryFinal&&(results.length===3&&results[2].length===2);return(Math.log(teamCount*2)/Math.log(2)-1)*2+1+(hasGrandFinalRematch?1:0)}}function exportData(data){var output=$.extend(true,{},data);output.teams=output.teams.map(function(ts){return ts.map(function(t){return t.toNull()})});output.results=output.results.map(function(brackets){return brackets.map(function(rounds){return rounds.map(function(matches){var matchData=[matches.first.toNull(),matches.second.toNull()];if(matches.userData!==undefined){matchData.push(matches.userData)}return matchData})})});return output}var ResultId=function(){function ResultId(){this.counter=0}ResultId.prototype.get=function(){return this.counter};ResultId.prototype.getNext=function(){return++this.counter};ResultId.prototype.reset=function(){this.counter=0};return ResultId}();function teamElement(roundNumber,match,team,opponent,isReady,isFirstBracket,opts,resultId,topCon,renderAll){var resultIdAttribute=team.name.isEmpty()||opponent.name.isEmpty()?"":'data-resultid="result-'+resultId.getNext()+'"';var sEl=$('
");var score=team.name.isEmpty()||opponent.name.isEmpty()||!isReady?Option.empty():team.score.map(function(s){return""+s});var scoreString=score.orElse("--");sEl.text(scoreString);var entryState=team.name.map(function(){return score.map(function(){return"entry-complete"}).orElseGet(function(){return opponent.emptyBranch()===BranchType.BYE?"entry-default-win":"entry-no-score"})}).orElseGet(function(){var type=team.emptyBranch();switch(type){case BranchType.BYE:return"empty-bye";case BranchType.TBD:return"empty-tbd";default:throw new Error("Unexpected branch type "+type)}});var tEl=$('
');var nEl=$('
').appendTo(tEl);opts.decorator.render(nEl,team.name.toNull(),scoreString,entryState);team.seed.forEach(function(seed){tEl.attr("data-teamid",seed)});if(team.name.isEmpty()){tEl.addClass("na")}else if(match.winner().name===team.name){tEl.addClass("win")}else if(match.loser().name===team.name){tEl.addClass("lose")}tEl.append(sEl);if((!team.name.isEmpty()||team.name.isEmpty()&&roundNumber===0&&isFirstBracket)&&typeof opts.save==="function"){if(!opts.disableTeamEdit){nEl.addClass("editable");nEl.click(function(){var span=$(this);function editor(){function done_fn(val,next){var teamId=team.seed.get();opts.init.teams[~~(teamId/2)][teamId%2]=Option.of(val||null);renderAll(true);span.click(editor);var labels=opts.el.find(".team[data-teamid="+(teamId+1)+"] div.label:first");if(labels.length&&next===true&&roundNumber===0){$(labels).click()}}span.unbind();opts.decorator.edit(span,team.name.toNull(),done_fn)}editor()})}if(!team.name.isEmpty()&&!opponent.name.isEmpty()&&isReady){var rId_1=resultId.get();sEl.addClass("editable");sEl.click(function(){var span=$(this);function editor(){span.unbind();var score=!isNumber(team.score)?"0":span.text();var input=$('');input.val(score);span.empty().append(input);input.focus().select();input.keydown(function(e){if(!isNumber($(this).val())){$(this).addClass("error")}else{$(this).removeClass("error")}var key=e.keyCode||e.which;if(key===9||key===13||key===27){e.preventDefault();$(this).blur();if(key===27){return}var next=topCon.find("div.score[data-resultid=result-"+(rId_1+1)+"]");if(next){next.click()}}});input.blur(function(){var val=input.val();if((!val||!isNumber(val))&&!isNumber(team.score)){val="0"}else if((!val||!isNumber(val))&&isNumber(team.score)){val=team.score}span.html(val);if(isNumber(val)){team.score=Score.of(parseInt(val,10));renderAll(true)}span.click(editor)})}editor()})}}return tEl}var Match=function(){function Match(round,match,seed,results,renderCb,isFirstBracket,opts,resultId,topCon,renderAll){this.round=round;this.match=match;this.seed=seed;this.renderCb=renderCb;this.isFirstBracket=isFirstBracket;this.opts=opts;this.resultId=resultId;this.topCon=topCon;this.renderAll=renderAll;this.connectorCb=Option.empty();this.matchCon=$('
');this.teamCon=$('
');this.alignCb=null;this.matchUserData=!results.isEmpty()?results.get().userData:undefined;if(!opts.save){var userData_1=this.matchUserData;if(opts.onMatchHover){this.teamCon.hover(function(){opts.onMatchHover(userData_1,true)},function(){opts.onMatchHover(userData_1,false)})}if(opts.onMatchClick){this.teamCon.click(function(){opts.onMatchClick(userData_1)})}}match.a.name=match.a.source().name;match.b.name=match.b.source().name;match.a.score=results.map(function(r){return r.first.toNull()});match.b.score=results.map(function(r){return r.second.toNull()});if((!match.a.name||!match.b.name)&&(isNumber(match.a.score)||isNumber(match.b.score))){console.log("ERROR IN SCORE DATA: "+match.a.source().name+": "+match.a.score+", "+match.b.source().name+": "+match.b.score);match.a.score=match.b.score=Score.empty()}}Object.defineProperty(Match.prototype,"el",{get:function(){return this.matchCon},enumerable:true,configurable:true});Match.prototype.getRound=function(){return this.round};Match.prototype.setConnectorCb=function(cb){this.connectorCb=cb};Match.prototype.connect=function(cb){var _this=this;var align=this.opts.dir==="lr"?"right":"left";var connectorOffset=this.teamCon.height()/4;var matchupOffset=this.matchCon.height()/2;var result=cb.map(function(connectorCb){return connectorCb(_this.teamCon,_this)}).orElseGet(function(){if(_this.seed%2===0){return _this.winner().order.map(function(order){return order.map({shift:connectorOffset*(_this.opts.centerConnectors?2:1),height:matchupOffset},{shift:connectorOffset*(_this.opts.centerConnectors?2:3),height:matchupOffset-connectorOffset*(_this.opts.centerConnectors?0:2)})}).orElse({shift:connectorOffset*2,height:matchupOffset-connectorOffset*(_this.opts.centerConnectors?0:1)})}else{return _this.winner().order.map(function(order){return order.map({shift:-connectorOffset*(_this.opts.centerConnectors?2:3),height:-matchupOffset+connectorOffset*(_this.opts.centerConnectors?0:2)},{shift:-connectorOffset*(_this.opts.centerConnectors?2:1),height:-matchupOffset})}).orElse({shift:-connectorOffset*2,height:-matchupOffset+connectorOffset*(_this.opts.centerConnectors?0:1)})}});this.teamCon.append(connector(this.opts.roundMargin,result,this.teamCon,align))};Match.prototype.winner=function(){return this.match.winner()};Match.prototype.loser=function(){return this.match.loser()};Match.prototype.first=function(){return this.match.a};Match.prototype.second=function(){return this.match.b};Match.prototype.setAlignCb=function(cb){this.alignCb=cb};Match.prototype.render=function(){var _this=this;this.matchCon.empty();this.teamCon.empty();this.match.a.name=this.match.a.source().name;this.match.b.name=this.match.b.source().name;this.match.a.seed=this.match.a.source().seed;this.match.b.seed=this.match.b.source().seed;var isDoubleBye=this.match.a.name.isEmpty()&&this.match.b.name.isEmpty();if(isDoubleBye){this.teamCon.addClass("np")}else if(!this.match.winner().name){this.teamCon.addClass("np")}else{this.teamCon.removeClass("np")}var isReady=!this.match.a.name.isEmpty()&&!this.match.b.name.isEmpty();this.teamCon.append(teamElement(this.round.roundNumber,this.match,this.match.a,this.match.b,isReady,this.isFirstBracket,this.opts,this.resultId,this.topCon,this.renderAll));this.teamCon.append(teamElement(this.round.roundNumber,this.match,this.match.b,this.match.a,isReady,this.isFirstBracket,this.opts,this.resultId,this.topCon,this.renderAll));this.matchCon.appendTo(this.round.el);this.matchCon.append(this.teamCon);this.el.css("height",this.round.bracket.el.height()/this.round.size()+"px");this.teamCon.css("top",this.el.height()/2-this.teamCon.height()/2+"px");if(this.alignCb!==null){this.alignCb(this.teamCon)}var isLast=this.renderCb.map(function(cb){return cb(_this)}).orElse(false);if(!isLast){this.connect(this.connectorCb)}this.opts.decorator.renderMatch(this.teamCon,this.matchUserData)};Match.prototype.results=function(){var hasBye=this.match.a.name.isEmpty()||this.match.b.name.isEmpty();if(hasBye){this.match.a.score=this.match.b.score=Score.empty()}return new ResultObject(this.match.a.score,this.match.b.score,this.matchUserData)};return Match}();var undefinedToNull=function(value){return value===undefined?null:value};var wrapResults=function(initResults){return initResults.map(function(brackets){return brackets.map(function(rounds){return rounds.map(function(matches){return new ResultObject(Score.of(undefinedToNull(matches[0])),Score.of(undefinedToNull(matches[1])),matches[2])})})})};var JqueryBracket=function(opts){var resultId=new ResultId;var data=opts.init;var isSingleElimination=data.results.length<=1;var height=data.teams.length*45+data.teams.length*opts.matchMargin;var topCon=$('
').appendTo(opts.el.empty());function resizeContainer(){var roundCount=countRounds(data.teams.length,isSingleElimination,opts.skipGrandFinalComeback,opts.skipSecondaryFinal,data.results);if(!opts.disableToolbar){topCon.css("width",roundCount*(opts.teamWidth+opts.scoreWidth+opts.roundMargin)+40)}else{topCon.css("width",roundCount*(opts.teamWidth+opts.scoreWidth+opts.roundMargin)+10)}if(isSingleElimination&&data.teams.length<=2&&!opts.skipConsolationRound){topCon.css("height",height+40)}}var w,l,f;function renderAll(save){resultId.reset();w.render();if(l){l.render()}if(f&&!opts.skipGrandFinalComeback){f.render()}if(!opts.disableHighlight){postProcess(topCon,w,f)}if(save){data.results[0]=w.results();if(l){data.results[1]=l.results()}if(f&&!opts.skipGrandFinalComeback){data.results[2]=f.results()}resizeContainer();if(opts.save){opts.save(exportData(data),opts.userData)}}}if(opts.skipSecondaryFinal&&isSingleElimination){$.error("skipSecondaryFinal setting is viable only in double elimination mode")}if(!opts.disableToolbar){embedEditButtons(topCon,data,opts)}var fEl,wEl,lEl;if(isSingleElimination){wEl=$('
').appendTo(topCon)}else{if(!opts.skipGrandFinalComeback){fEl=$('
').appendTo(topCon)}wEl=$('
').appendTo(topCon);lEl=$('
').appendTo(topCon)}wEl.css("height",height);if(lEl){lEl.css("height",wEl.height()/2)}resizeContainer();var mkMatch=function(round,match,seed,results,renderCb,isFirstBracket,opts){return new Match(round,match,seed,results,renderCb,isFirstBracket,opts,resultId,topCon,renderAll)};w=new Bracket(wEl,Option.of(data.results[0]||null),mkMatch,true,opts);if(!isSingleElimination){l=new Bracket(lEl,Option.of(data.results[1]||null),mkMatch,false,opts);if(!opts.skipGrandFinalComeback){f=new Bracket(fEl,Option.of(data.results[2]||null),mkMatch,false,opts)}}prepareWinners(w,data.teams,isSingleElimination,opts,opts.skipGrandFinalComeback&&!isSingleElimination);if(!isSingleElimination){prepareLosers(w,l,data.teams.length,opts.skipGrandFinalComeback,opts.centerConnectors);if(!opts.skipGrandFinalComeback){prepareFinals(f,w,l,opts,topCon,resizeContainer)}}renderAll(false);return{data:function(){return exportData(opts.init)}}};function embedEditButtons(topCon,data,opts){var tools=$('
').appendTo(topCon);var inc=$('+').appendTo(tools);inc.click(function(){var len=data.teams.length;for(var i=0;i1&&data.results.length===1||data.teams.length>2&&data.results.length===3){var dec=$('-').appendTo(tools);dec.click(function(){if(data.teams.length>1){data.teams=data.teams.slice(0,data.teams.length/2);return JqueryBracket(opts)}})}if(data.results.length===1&&data.teams.length>1){var type=$('de').appendTo(tools);type.click(function(){if(data.teams.length>1&&data.results.length<3){data.results.push([],[]);return JqueryBracket(opts)}})}else if(data.results.length===3&&data.teams.length>1){var type=$('se').appendTo(tools);type.click(function(){if(data.results.length===3){data.results=data.results.slice(0,1);return JqueryBracket(opts)}})}}var assertNumber=function(opts,field){if(opts.hasOwnProperty(field)){var expectedType="number";var type=typeof opts[field];if(type!==expectedType){throw new Error('Option "'+field+'" is '+type+" instead of "+expectedType)}}};var assertBoolean=function(opts,field){var value=opts[field];var expectedType="boolean";var type=typeof value;if(type!==expectedType){throw new Error("Value of "+field+" must be boolean, got "+expectedType+", got "+type)}};var assertGt=function(expected,opts,field){var value=opts[field];if(value void; render: (container: JQuery, team: Object | null, score: any, entryState: EntryState) => void; + renderMatch: (container: JQuery, match: string) => void; } interface InitData { @@ -363,6 +364,10 @@ } } + function defaultRenderMatch(container: JQuery, data: string): void { + return; + } + function winnerBubbles(match: Match): boolean { const el = match.el; const winner = el.find('.team.win'); @@ -1185,6 +1190,8 @@ if (!isLast) { this.connect(this.connectorCb); } + + this.opts.decorator.renderMatch(this.teamCon, this.matchUserData); } results(): ResultObject { // Either team is bye -> reset (mutate) scores from that match @@ -1416,11 +1423,18 @@ opts.userData = null; } - if (opts.decorator && (!opts.decorator.edit || !opts.decorator.render)) { - throw Error('Invalid decorator input'); + if (!opts.decorator) { + opts.decorator = {}; + } + + if (!opts.decorator.edit) { + opts.decorator.edit = defaultEdit; + } + if (!opts.decorator.render) { + opts.decorator.render = defaultRender; } - else if (!opts.decorator) { - opts.decorator = {edit: defaultEdit, render: defaultRender}; + if (!opts.decorator.renderMatch) { + opts.decorator.renderMatch = defaultRenderMatch; } if (!opts.init) { From cd627feac8e69f0299e7c3c3dd05ad8ae5c7069b Mon Sep 17 00:00:00 2001 From: blacktemplar Date: Tue, 1 Aug 2017 23:29:58 +0200 Subject: [PATCH 2/2] adds saveData as argument to save function, fixes some null problems --- dist/jquery.bracket.min.css | 2 +- dist/jquery.bracket.min.js | 4 ++-- src/jquery.bracket.ts | 18 +++++++++--------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/dist/jquery.bracket.min.css b/dist/jquery.bracket.min.css index ae4c552..d78867a 100644 --- a/dist/jquery.bracket.min.css +++ b/dist/jquery.bracket.min.css @@ -1,2 +1,2 @@ -/* jQuery Bracket | Copyright (c) Teijo Laine 2011-2016 | Licenced under the MIT licence */ +/* jQuery Bracket | Copyright (c) Teijo Laine 2011-2017 | Licenced under the MIT licence */ div.jQBracket{font-family:Arial;font-size:14px;position:relative}div.jQBracket .tools{position:absolute;top:0;color:#FFF}div.jQBracket .tools span{cursor:pointer;margin:5px;display:block;text-align:center;width:18px;height:18px;background-color:#666}div.jQBracket .tools span:hover{background-color:#999}div.jQBracket .finals{float:right;right:0;clear:right;position:relative}div.jQBracket .bracket{float:right;clear:left}div.jQBracket .loserBracket{float:right;clear:left;position:relative}div.jQBracket .round{position:relative;float:left}div.jQBracket .match{position:relative}div.jQBracket .editable{cursor:pointer}div.jQBracket .team{position:relative;z-index:1;float:left;background-color:#EEE;cursor:default}div.jQBracket .team:first-child{border-bottom:1px solid #999}div.jQBracket .team input{font-size:14px;padding:0;width:100%;border:0;margin:0;outline:0}div.jQBracket .team div.label{padding:3px;position:absolute;height:22px;white-space:nowrap;overflow:hidden;box-sizing:border-box}div.jQBracket .team div.label[disabled]{cursor:default}div.jQBracket .team div.score{float:right;padding:3px;background-color:rgba(255,255,255,.3);text-align:center;box-sizing:border-box}div.jQBracket .team div.score input{text-align:center}div.jQBracket .team div.score[disabled]{color:#999;cursor:default}div.jQBracket .team div.label input.error,div.jQBracket .team div.score input.error{background-color:#FCC}div.jQBracket .team.np{background-color:#666;color:#EEE}div.jQBracket .team.na{background-color:#999;color:#CCC}div.jQBracket .team.win{color:#333}div.jQBracket .team.win div.score{color:#060}div.jQBracket .team.lose div.score{color:#900}div.jQBracket .team.lose{background-color:#DDD;color:#999}div.jQBracket .team.tie div.score{color:#00F}div.jQBracket .team.highlightWinner{background-color:#DA0;color:#000}div.jQBracket .team.highlightLoser{background-color:#CCC;color:#000}div.jQBracket .team.highlight{background-color:#3C0;color:#000}div.jQBracket .team.bye{background-color:#999;color:#CCC}div.jQBracket .teamContainer{z-index:1;position:relative;float:left}div.jQBracket .connector{border:2px solid #666;border-left-style:none;position:absolute;z-index:1}div.jQBracket .connector div.connector{border:0;border-bottom:2px solid #666;height:0;position:absolute}div.jQBracket .connector.highlightWinner,div.jQBracket .connector div.connector.highlightWinner{border-color:#DA0}div.jQBracket .connector.highlightLoser,div.jQBracket .connector div.connector.highlightLoser{border-color:#CCC}div.jQBracket .connector.highlight,div.jQBracket .connector div.connector.highlight{border-color:#0C0}div.jQBracket .np .connector,div.jQBracket .np .connector div.connector{border-color:#999}div.jQBracket .bubble{height:22px;line-height:22px;width:30px;right:-35px;position:absolute;text-align:center;font-size:11px}div.jQBracket .bubble:after{content:'';position:absolute;top:6px;width:0;height:0;border-top:5px solid transparent;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid transparent}div.jQBracket .bubble:after{left:-5px;border-left:0}div.jQBracket .win .bubble{background-color:#DA0;color:#960}div.jQBracket .win .bubble:after{border-right-color:#DA0}div.jQBracket .win .bubble.third{background-color:#963;color:#D95}div.jQBracket .win .bubble.third:after{border-right:6px solid #963}div.jQBracket .lose .bubble{background-color:#CCC;color:#333}div.jQBracket .lose .bubble:after{border-right-color:#CCC}div.jQBracket .lose .bubble.fourth{background-color:#678;color:#CCD}div.jQBracket .lose .bubble.fourth:after{border-right:6px solid #678}div.jQBracket.rl .finals{float:left;left:0;clear:left}div.jQBracket.rl .bracket{float:left;clear:right}div.jQBracket.rl .loserBracket{float:left;clear:right}div.jQBracket.rl .round{margin-right:0;float:right}div.jQBracket.rl .team{float:right}div.jQBracket.rl .team div.label{right:0}div.jQBracket.rl .team div.score{float:left}div.jQBracket.rl .teamContainer{float:right}div.jQBracket.rl .connector{border-left-style:solid;border-right-style:none;border-width:2px}div.jQBracket.rl .connector.highlightWinner,div.jQBracket.rl .connector div.connector.highlightWinner{border-color:#DA0}div.jQBracket.rl .connector.highlightLoser,div.jQBracket.rl .connector div.connector.highlightLoser{border-color:#CCC}div.jQBracket.rl .connector.highlight,div.jQBracket.rl .connector div.connector.highlight{border-color:#0C0}div.jQBracket.rl .bubble{left:-35px}div.jQBracket.rl .bubble.third{background-color:#963;color:#310}div.jQBracket.rl .bubble.fourth{background-color:#678;color:#CCD}div.jQBracket.rl .bubble:after{left:auto;right:-5px;border-left:5px solid transparent;border-right:0}div.jQBracket.rl .bubble.third:after{border-right:0;border-left:6px solid #963}div.jQBracket.rl .bubble.fourth:after{border-right:0;border-left:6px solid #678}div.jQBracket.rl .highlightWinner .bubble:after{border-left-color:#DA0}div.jQBracket.rl .highlightLoser .bubble:after{border-left-color:#CCC} \ No newline at end of file diff --git a/dist/jquery.bracket.min.js b/dist/jquery.bracket.min.js index 049d94c..25008bb 100644 --- a/dist/jquery.bracket.min.js +++ b/dist/jquery.bracket.min.js @@ -1,2 +1,2 @@ -var __extends=this&&this.__extends||function(d,b){for(var p in b)if(b.hasOwnProperty(p))d[p]=b[p];function __(){this.constructor=d}d.prototype=b===null?Object.create(b):(__.prototype=b.prototype,new __)};(function($){var Option=function(){function Option(val){this.val=val;if(val instanceof Option){throw new Error("Trying to wrap Option into an Option")}if(this.val===undefined){throw new Error("Option cannot contain undefined")}}Option.of=function(value){return new Option(value)};Option.empty=function(){return new Option(null)};Option.prototype.get=function(){if(this.val===null){throw new Error("Trying to get() empty Option")}return this.val};Option.prototype.orElse=function(defaultValue){return this.val===null?defaultValue:this.val};Option.prototype.orElseGet=function(defaultProvider){return this.val===null?defaultProvider():this.val};Option.prototype.map=function(f){return this.val===null?Option.empty():new Option(f(this.val))};Option.prototype.forEach=function(f){if(this.val!==null){f(this.val)}return this};Option.prototype.toNull=function(){return this.val===null?null:this.val};Option.prototype.isEmpty=function(){return this.val===null};return Option}();var Score=function(_super){__extends(Score,_super);function Score(){_super.apply(this,arguments)}Score.of=function(val){var type=typeof val;var expected="number";if(val!==null&&type!==expected){throw new Error("Invalid score format, expected "+expected+", got "+type)}return Option.of(val)};Score.empty=function(){return Option.empty()};return Score}(Option);var ResultObject=function(){function ResultObject(first,second,userData){this.first=first;this.second=second;this.userData=userData;if(!first||!second){throw new Error("Cannot create ResultObject with undefined scores")}return}return ResultObject}();var BranchType;(function(BranchType){BranchType[BranchType["TBD"]=0]="TBD";BranchType[BranchType["BYE"]=1]="BYE"})(BranchType||(BranchType={}));var Order=function(){function Order(isFirst){this.isFirst=isFirst}Order.first=function(){return new Order(true)};Order.second=function(){return new Order(false)};Order.prototype.map=function(first,second){return this.isFirst?first:second};return Order}();var TeamBlock=function(){function TeamBlock(source,name,order,seed,score){this.source=source;this.name=name;this.order=order;this.seed=seed;this.score=score}TeamBlock.prototype.emptyBranch=function(){if(!this.name.isEmpty()){return BranchType.TBD}else{try{return this.source().emptyBranch()}catch(e){if(e instanceof EndOfBranchException){return BranchType.BYE}else{throw new Error("Unexpected exception type")}}}};return TeamBlock}();function isNumber(n){return!isNaN(parseFloat(n))&&isFinite(n)}function EndOfBranchException(){this.message="Root of information for this team";this.name="EndOfBranchException"}var MatchResult=function(){function MatchResult(a,b){this.a=a;this.b=b;return}MatchResult.teamsInResultOrder=function(match){var aBye=match.a.name.isEmpty();var bBye=match.b.name.isEmpty();if(bBye&&!aBye){if(match.b.emptyBranch()===BranchType.BYE){return[match.a,match.b]}else{return[]}}else if(aBye&&!bBye){if(match.a.emptyBranch()===BranchType.BYE){return[match.b,match.a]}else{return[]}}else if(!match.a.score.isEmpty()&&!match.b.score.isEmpty()){if(match.a.score.get()>match.b.score.get()){return[match.a,match.b]}else if(match.a.score.get()0){a=wrap([a],d-1)}return a}function trackHighlighter(teamIndex,cssClass,container){var elements=container.find(".team[data-teamid="+teamIndex+"]");var addedClass=!cssClass?"highlight":cssClass;return{highlight:function(){elements.each(function(){$(this).addClass(addedClass);if($(this).hasClass("win")){$(this).parent().find(".connector").addClass(addedClass)}})},deHighlight:function(){elements.each(function(){$(this).removeClass(addedClass);$(this).parent().find(".connector").removeClass(addedClass)})}}}function postProcess(container,w,f){var source=f||w;var winner=source.winner();var loser=source.loser();if(winner&&loser){if(!winner.name.isEmpty()){trackHighlighter(winner.seed.get(),"highlightWinner",container).highlight()}if(!loser.name.isEmpty()){trackHighlighter(loser.seed.get(),"highlightLoser",container).highlight()}}container.find(".team").mouseover(function(){var teamId=$(this).attr("data-teamid");if(teamId===undefined){return}var track=trackHighlighter(parseInt(teamId,10),null,container);track.highlight();$(this).mouseout(function(){track.deHighlight();$(this).unbind("mouseout")})})}function defaultEdit(span,data,done){var input=$('');input.val(data);span.empty().append(input);input.focus();input.blur(function(){done(input.val())});input.keydown(function(e){var key=e.keyCode||e.which;if(key===9||key===13||key===27){e.preventDefault();done(input.val(),key!==27)}})}function defaultRender(container,team,score,state){switch(state){case"empty-bye":container.append("BYE");return;case"empty-tbd":container.append("TBD");return;case"entry-no-score":case"entry-default-win":case"entry-complete":container.append(team);return}}function defaultRenderMatch(container,data){return}function winnerBubbles(match){var el=match.el;var winner=el.find(".team.win");winner.append('
1st
');var loser=el.find(".team.lose");loser.append('
2nd
');return true}function consolationBubbles(match){var el=match.el;var winner=el.find(".team.win");winner.append('
3rd
');var loser=el.find(".team.lose");loser.append('
4th
');return true}var winnerMatchSources=function(teams,m){return function(){return[{source:function(){return new TeamBlock(function(){throw new EndOfBranchException},teams[m][0],Option.of(Order.first()),Option.of(m*2),Score.empty())}},{source:function(){return new TeamBlock(function(){throw new EndOfBranchException},teams[m][1],Option.of(Order.second()),Option.of(m*2+1),Score.empty())}}]}};var winnerAlignment=function(match,skipConsolationRound){return function(tC){tC.css("top","");tC.css("position","absolute");if(skipConsolationRound){tC.css("top",match.el.height()/2-tC.height()/2+"px")}else{tC.css("bottom",-tC.height()/2+"px")}}};function prepareWinners(winners,teams,isSingleElimination,opts,skipGrandFinalComeback){var roundCount=Math.log(teams.length*2)/Math.log(2);var matchCount=teams.length;var round;for(var r=0;r1&&!opts.skipConsolationRound){var prev=winners.final().getRound().prev();var third_1=prev.map(function(p){return function(){return p.match(0).loser()}}).toNull();var fourth_1=prev.map(function(p){return function(){return p.match(1).loser()}}).toNull();var consol_1=round.addMatch(function(){return[{source:third_1},{source:fourth_1}]},Option.of(consolationBubbles));consol_1.setAlignCb(function(tC){var height=winners.el.height()/2;consol_1.el.css("height",height+"px");var topShift=tC.height()/2+opts.matchMargin;tC.css("top",topShift+"px")});consol_1.setConnectorCb(Option.empty())}}}var loserMatchSources=function(winners,losers,matchCount,m,n,r){return function(){if(n%2===0&&r===0){return[{source:function(){return winners.round(0).match(m*2).loser()}},{source:function(){return winners.round(0).match(m*2+1).loser()}}]}else{var winnerMatch_1=r%2===0?matchCount-m-1:m;return[{source:function(){return losers.round(r*2).match(m).winner()}},{source:function(){return winners.round(r+1).match(winnerMatch_1).loser()}}]}}};var loserAlignment=function(teamCon,match){return function(){return teamCon.css("top",match.el.height()/2-teamCon.height()/2+"px")}};function prepareLosers(winners,losers,teamCount,skipGrandFinalComeback,centerConnectors){var roundCount=Math.log(teamCount*2)/Math.log(2)-1;var matchCount=teamCount/2;for(var r=0;r2){throw new Error("Unexpected number of final rounds")}return winnerBubbles(match)}}));match.setAlignCb(function(tC){var height=winners.el.height()+losers.el.height();if(!opts.skipConsolationRound){height/=2}match.el.css("height",height+"px");var topShift=(winners.el.height()/2+winners.el.height()+losers.el.height()/2)/2-tC.height();tC.css("top",topShift+"px")});if(!opts.skipConsolationRound){var prev_1=losers.final().getRound().prev();var consol_2=round.addMatch(function(){return[{source:function(){return prev_1.get().match(0).loser()}},{source:function(){return losers.loser()}}]},Option.of(consolationBubbles));consol_2.setAlignCb(function(tC){var height=(winners.el.height()+losers.el.height())/2;consol_2.el.css("height",height+"px");var topShift=(winners.el.height()/2+winners.el.height()+losers.el.height()/2)/2+tC.height()/2-height;tC.css("top",topShift+"px")});match.setConnectorCb(Option.empty());consol_2.setConnectorCb(Option.empty())}winners.final().setConnectorCb(Option.of(function(tC){var connectorOffset=tC.height()/4;var topShift=(winners.el.height()/2+winners.el.height()+losers.el.height()/2)/2-tC.height()/2;var matchupOffset=topShift-winners.el.height()/2;var _a=winners.winner().order.map(function(order){return order.map({height:matchupOffset+connectorOffset*(opts.centerConnectors?2:1),shift:connectorOffset*(opts.centerConnectors?2:1)},{height:matchupOffset+connectorOffset*(opts.centerConnectors?2:0),shift:connectorOffset*(opts.centerConnectors?2:3)})}).orElse({height:matchupOffset+connectorOffset*(opts.centerConnectors?2:1),shift:connectorOffset*2}),height=_a.height,shift=_a.shift;height-=tC.height()/2;return{height:height,shift:shift}}));losers.final().setConnectorCb(Option.of(function(tC){var connectorOffset=tC.height()/4;var topShift=(winners.el.height()/2+winners.el.height()+losers.el.height()/2)/2-tC.height()/2;var matchupOffset=topShift-winners.el.height()/2;var _a=losers.winner().order.map(function(order){return order.map({height:matchupOffset+connectorOffset*(opts.centerConnectors?2:0),shift:connectorOffset*(opts.centerConnectors?2:3)},{height:matchupOffset+connectorOffset*2,shift:connectorOffset*(opts.centerConnectors?2:1)})}).orElse({height:matchupOffset+connectorOffset*(opts.centerConnectors?2:1),shift:connectorOffset*2}),height=_a.height,shift=_a.shift;height+=tC.height()/2;return{height:-height,shift:-shift}}))}var Round=function(){function Round(bracket,previousRound,roundNumber,_results,doRenderCb,mkMatch,isFirstBracket,opts){this.bracket=bracket;this.previousRound=previousRound;this.roundNumber=roundNumber;this._results=_results;this.doRenderCb=doRenderCb;this.mkMatch=mkMatch;this.isFirstBracket=isFirstBracket;this.opts=opts;this.containerWidth=this.opts.teamWidth+this.opts.scoreWidth;this.roundCon=$('
');this.matches=[]}Object.defineProperty(Round.prototype,"el",{get:function(){return this.roundCon},enumerable:true,configurable:true});Round.prototype.addMatch=function(teamCb,renderCb){var _this=this;var matchIdx=this.matches.length;var teams=teamCb!==null?teamCb():[{source:function(){return _this.bracket.round(_this.roundNumber-1).match(matchIdx*2).winner()}},{source:function(){return _this.bracket.round(_this.roundNumber-1).match(matchIdx*2+1).winner()}}];var teamA=function(){return teams[0].source()};var teamB=function(){return teams[1].source()};var matchResult=new MatchResult(new TeamBlock(teamA,teamA().name,Option.of(Order.first()),teamA().seed,Score.empty()),new TeamBlock(teamB,teamB().name,Option.of(Order.second()),teamB().seed,Score.empty()));var match=this.mkMatch(this,matchResult,matchIdx,this._results.map(function(r){return r[matchIdx]===undefined?null:r[matchIdx]}),renderCb,this.isFirstBracket,this.opts);this.matches.push(match);return match};Round.prototype.match=function(id){return this.matches[id]};Round.prototype.prev=function(){return this.previousRound};Round.prototype.size=function(){return this.matches.length};Round.prototype.render=function(){this.roundCon.empty();if(!this.doRenderCb.isEmpty()&&!this.doRenderCb.get()()){return}this.roundCon.appendTo(this.bracket.el);this.matches.forEach(function(m){return m.render()})};Round.prototype.results=function(){return this.matches.reduce(function(agg,m){return agg.concat([m.results()])},[])};return Round}();var Bracket=function(){function Bracket(bracketCon,initResults,mkMatch,isFirstBracket,opts){this.bracketCon=bracketCon;this.initResults=initResults;this.mkMatch=mkMatch;this.isFirstBracket=isFirstBracket;this.opts=opts;this.rounds=[]}Object.defineProperty(Bracket.prototype,"el",{get:function(){return this.bracketCon},enumerable:true,configurable:true});Bracket.prototype.addRound=function(doRenderCb){var id=this.rounds.length;var previous=id>0?Option.of(this.rounds[id-1]):Option.empty();var roundResults=this.initResults.map(function(r){return r[id]===undefined?new ResultObject(Score.empty(),Score.empty(),undefined):r[id]});var round=new Round(this,previous,id,roundResults,doRenderCb,this.mkMatch,this.isFirstBracket,this.opts);this.rounds.push(round);return round};Bracket.prototype.dropRound=function(){this.rounds.pop()};Bracket.prototype.round=function(id){return this.rounds[id]};Bracket.prototype.size=function(){return this.rounds.length};Bracket.prototype.final=function(){return this.rounds[this.rounds.length-1].match(0)};Bracket.prototype.winner=function(){return this.rounds[this.rounds.length-1].match(0).winner()};Bracket.prototype.loser=function(){return this.rounds[this.rounds.length-1].match(0).loser()};Bracket.prototype.render=function(){this.bracketCon.empty();for(var i=0;i
').appendTo(teamCon);src.css("height",height);src.css("width",width+"px");src.css(align,-width-2+"px");if(shift>=0){src.css("top",shift-1+"px")}else{src.css("bottom",-shift-1+"px")}if(drop){src.css("border-bottom","none")}else{src.css("border-top","none")}var dst=$('
').appendTo(src);dst.css("width",width+"px");dst.css(align,-width+"px");if(drop){dst.css("bottom","0px")}else{dst.css("top","0px")}return src}function countRounds(teamCount,isSingleElimination,skipGrandFinalComeback,skipSecondaryFinal,results){if(isSingleElimination){return Math.log(teamCount*2)/Math.log(2)}else if(skipGrandFinalComeback){return Math.max(2,(Math.log(teamCount*2)/Math.log(2)-1)*2-1)}else{var hasGrandFinalRematch=!skipSecondaryFinal&&(results.length===3&&results[2].length===2);return(Math.log(teamCount*2)/Math.log(2)-1)*2+1+(hasGrandFinalRematch?1:0)}}function exportData(data){var output=$.extend(true,{},data);output.teams=output.teams.map(function(ts){return ts.map(function(t){return t.toNull()})});output.results=output.results.map(function(brackets){return brackets.map(function(rounds){return rounds.map(function(matches){var matchData=[matches.first.toNull(),matches.second.toNull()];if(matches.userData!==undefined){matchData.push(matches.userData)}return matchData})})});return output}var ResultId=function(){function ResultId(){this.counter=0}ResultId.prototype.get=function(){return this.counter};ResultId.prototype.getNext=function(){return++this.counter};ResultId.prototype.reset=function(){this.counter=0};return ResultId}();function teamElement(roundNumber,match,team,opponent,isReady,isFirstBracket,opts,resultId,topCon,renderAll){var resultIdAttribute=team.name.isEmpty()||opponent.name.isEmpty()?"":'data-resultid="result-'+resultId.getNext()+'"';var sEl=$('
");var score=team.name.isEmpty()||opponent.name.isEmpty()||!isReady?Option.empty():team.score.map(function(s){return""+s});var scoreString=score.orElse("--");sEl.text(scoreString);var entryState=team.name.map(function(){return score.map(function(){return"entry-complete"}).orElseGet(function(){return opponent.emptyBranch()===BranchType.BYE?"entry-default-win":"entry-no-score"})}).orElseGet(function(){var type=team.emptyBranch();switch(type){case BranchType.BYE:return"empty-bye";case BranchType.TBD:return"empty-tbd";default:throw new Error("Unexpected branch type "+type)}});var tEl=$('
');var nEl=$('
').appendTo(tEl);opts.decorator.render(nEl,team.name.toNull(),scoreString,entryState);team.seed.forEach(function(seed){tEl.attr("data-teamid",seed)});if(team.name.isEmpty()){tEl.addClass("na")}else if(match.winner().name===team.name){tEl.addClass("win")}else if(match.loser().name===team.name){tEl.addClass("lose")}tEl.append(sEl);if((!team.name.isEmpty()||team.name.isEmpty()&&roundNumber===0&&isFirstBracket)&&typeof opts.save==="function"){if(!opts.disableTeamEdit){nEl.addClass("editable");nEl.click(function(){var span=$(this);function editor(){function done_fn(val,next){var teamId=team.seed.get();opts.init.teams[~~(teamId/2)][teamId%2]=Option.of(val||null);renderAll(true);span.click(editor);var labels=opts.el.find(".team[data-teamid="+(teamId+1)+"] div.label:first");if(labels.length&&next===true&&roundNumber===0){$(labels).click()}}span.unbind();opts.decorator.edit(span,team.name.toNull(),done_fn)}editor()})}if(!team.name.isEmpty()&&!opponent.name.isEmpty()&&isReady){var rId_1=resultId.get();sEl.addClass("editable");sEl.click(function(){var span=$(this);function editor(){span.unbind();var score=!isNumber(team.score)?"0":span.text();var input=$('');input.val(score);span.empty().append(input);input.focus().select();input.keydown(function(e){if(!isNumber($(this).val())){$(this).addClass("error")}else{$(this).removeClass("error")}var key=e.keyCode||e.which;if(key===9||key===13||key===27){e.preventDefault();$(this).blur();if(key===27){return}var next=topCon.find("div.score[data-resultid=result-"+(rId_1+1)+"]");if(next){next.click()}}});input.blur(function(){var val=input.val();if((!val||!isNumber(val))&&!isNumber(team.score)){val="0"}else if((!val||!isNumber(val))&&isNumber(team.score)){val=team.score}span.html(val);if(isNumber(val)){team.score=Score.of(parseInt(val,10));renderAll(true)}span.click(editor)})}editor()})}}return tEl}var Match=function(){function Match(round,match,seed,results,renderCb,isFirstBracket,opts,resultId,topCon,renderAll){this.round=round;this.match=match;this.seed=seed;this.renderCb=renderCb;this.isFirstBracket=isFirstBracket;this.opts=opts;this.resultId=resultId;this.topCon=topCon;this.renderAll=renderAll;this.connectorCb=Option.empty();this.matchCon=$('
');this.teamCon=$('
');this.alignCb=null;this.matchUserData=!results.isEmpty()?results.get().userData:undefined;if(!opts.save){var userData_1=this.matchUserData;if(opts.onMatchHover){this.teamCon.hover(function(){opts.onMatchHover(userData_1,true)},function(){opts.onMatchHover(userData_1,false)})}if(opts.onMatchClick){this.teamCon.click(function(){opts.onMatchClick(userData_1)})}}match.a.name=match.a.source().name;match.b.name=match.b.source().name;match.a.score=results.map(function(r){return r.first.toNull()});match.b.score=results.map(function(r){return r.second.toNull()});if((!match.a.name||!match.b.name)&&(isNumber(match.a.score)||isNumber(match.b.score))){console.log("ERROR IN SCORE DATA: "+match.a.source().name+": "+match.a.score+", "+match.b.source().name+": "+match.b.score);match.a.score=match.b.score=Score.empty()}}Object.defineProperty(Match.prototype,"el",{get:function(){return this.matchCon},enumerable:true,configurable:true});Match.prototype.getRound=function(){return this.round};Match.prototype.setConnectorCb=function(cb){this.connectorCb=cb};Match.prototype.connect=function(cb){var _this=this;var align=this.opts.dir==="lr"?"right":"left";var connectorOffset=this.teamCon.height()/4;var matchupOffset=this.matchCon.height()/2;var result=cb.map(function(connectorCb){return connectorCb(_this.teamCon,_this)}).orElseGet(function(){if(_this.seed%2===0){return _this.winner().order.map(function(order){return order.map({shift:connectorOffset*(_this.opts.centerConnectors?2:1),height:matchupOffset},{shift:connectorOffset*(_this.opts.centerConnectors?2:3),height:matchupOffset-connectorOffset*(_this.opts.centerConnectors?0:2)})}).orElse({shift:connectorOffset*2,height:matchupOffset-connectorOffset*(_this.opts.centerConnectors?0:1)})}else{return _this.winner().order.map(function(order){return order.map({shift:-connectorOffset*(_this.opts.centerConnectors?2:3),height:-matchupOffset+connectorOffset*(_this.opts.centerConnectors?0:2)},{shift:-connectorOffset*(_this.opts.centerConnectors?2:1),height:-matchupOffset})}).orElse({shift:-connectorOffset*2,height:-matchupOffset+connectorOffset*(_this.opts.centerConnectors?0:1)})}});this.teamCon.append(connector(this.opts.roundMargin,result,this.teamCon,align))};Match.prototype.winner=function(){return this.match.winner()};Match.prototype.loser=function(){return this.match.loser()};Match.prototype.first=function(){return this.match.a};Match.prototype.second=function(){return this.match.b};Match.prototype.setAlignCb=function(cb){this.alignCb=cb};Match.prototype.render=function(){var _this=this;this.matchCon.empty();this.teamCon.empty();this.match.a.name=this.match.a.source().name;this.match.b.name=this.match.b.source().name;this.match.a.seed=this.match.a.source().seed;this.match.b.seed=this.match.b.source().seed;var isDoubleBye=this.match.a.name.isEmpty()&&this.match.b.name.isEmpty();if(isDoubleBye){this.teamCon.addClass("np")}else if(!this.match.winner().name){this.teamCon.addClass("np")}else{this.teamCon.removeClass("np")}var isReady=!this.match.a.name.isEmpty()&&!this.match.b.name.isEmpty();this.teamCon.append(teamElement(this.round.roundNumber,this.match,this.match.a,this.match.b,isReady,this.isFirstBracket,this.opts,this.resultId,this.topCon,this.renderAll));this.teamCon.append(teamElement(this.round.roundNumber,this.match,this.match.b,this.match.a,isReady,this.isFirstBracket,this.opts,this.resultId,this.topCon,this.renderAll));this.matchCon.appendTo(this.round.el);this.matchCon.append(this.teamCon);this.el.css("height",this.round.bracket.el.height()/this.round.size()+"px");this.teamCon.css("top",this.el.height()/2-this.teamCon.height()/2+"px");if(this.alignCb!==null){this.alignCb(this.teamCon)}var isLast=this.renderCb.map(function(cb){return cb(_this)}).orElse(false);if(!isLast){this.connect(this.connectorCb)}this.opts.decorator.renderMatch(this.teamCon,this.matchUserData)};Match.prototype.results=function(){var hasBye=this.match.a.name.isEmpty()||this.match.b.name.isEmpty();if(hasBye){this.match.a.score=this.match.b.score=Score.empty()}return new ResultObject(this.match.a.score,this.match.b.score,this.matchUserData)};return Match}();var undefinedToNull=function(value){return value===undefined?null:value};var wrapResults=function(initResults){return initResults.map(function(brackets){return brackets.map(function(rounds){return rounds.map(function(matches){return new ResultObject(Score.of(undefinedToNull(matches[0])),Score.of(undefinedToNull(matches[1])),matches[2])})})})};var JqueryBracket=function(opts){var resultId=new ResultId;var data=opts.init;var isSingleElimination=data.results.length<=1;var height=data.teams.length*45+data.teams.length*opts.matchMargin;var topCon=$('
').appendTo(opts.el.empty());function resizeContainer(){var roundCount=countRounds(data.teams.length,isSingleElimination,opts.skipGrandFinalComeback,opts.skipSecondaryFinal,data.results);if(!opts.disableToolbar){topCon.css("width",roundCount*(opts.teamWidth+opts.scoreWidth+opts.roundMargin)+40)}else{topCon.css("width",roundCount*(opts.teamWidth+opts.scoreWidth+opts.roundMargin)+10)}if(isSingleElimination&&data.teams.length<=2&&!opts.skipConsolationRound){topCon.css("height",height+40)}}var w,l,f;function renderAll(save){resultId.reset();w.render();if(l){l.render()}if(f&&!opts.skipGrandFinalComeback){f.render()}if(!opts.disableHighlight){postProcess(topCon,w,f)}if(save){data.results[0]=w.results();if(l){data.results[1]=l.results()}if(f&&!opts.skipGrandFinalComeback){data.results[2]=f.results()}resizeContainer();if(opts.save){opts.save(exportData(data),opts.userData)}}}if(opts.skipSecondaryFinal&&isSingleElimination){$.error("skipSecondaryFinal setting is viable only in double elimination mode")}if(!opts.disableToolbar){embedEditButtons(topCon,data,opts)}var fEl,wEl,lEl;if(isSingleElimination){wEl=$('
').appendTo(topCon)}else{if(!opts.skipGrandFinalComeback){fEl=$('
').appendTo(topCon)}wEl=$('
').appendTo(topCon);lEl=$('
').appendTo(topCon)}wEl.css("height",height);if(lEl){lEl.css("height",wEl.height()/2)}resizeContainer();var mkMatch=function(round,match,seed,results,renderCb,isFirstBracket,opts){return new Match(round,match,seed,results,renderCb,isFirstBracket,opts,resultId,topCon,renderAll)};w=new Bracket(wEl,Option.of(data.results[0]||null),mkMatch,true,opts);if(!isSingleElimination){l=new Bracket(lEl,Option.of(data.results[1]||null),mkMatch,false,opts);if(!opts.skipGrandFinalComeback){f=new Bracket(fEl,Option.of(data.results[2]||null),mkMatch,false,opts)}}prepareWinners(w,data.teams,isSingleElimination,opts,opts.skipGrandFinalComeback&&!isSingleElimination);if(!isSingleElimination){prepareLosers(w,l,data.teams.length,opts.skipGrandFinalComeback,opts.centerConnectors);if(!opts.skipGrandFinalComeback){prepareFinals(f,w,l,opts,topCon,resizeContainer)}}renderAll(false);return{data:function(){return exportData(opts.init)}}};function embedEditButtons(topCon,data,opts){var tools=$('
').appendTo(topCon);var inc=$('+').appendTo(tools);inc.click(function(){var len=data.teams.length;for(var i=0;i1&&data.results.length===1||data.teams.length>2&&data.results.length===3){var dec=$('-').appendTo(tools);dec.click(function(){if(data.teams.length>1){data.teams=data.teams.slice(0,data.teams.length/2);return JqueryBracket(opts)}})}if(data.results.length===1&&data.teams.length>1){var type=$('de').appendTo(tools);type.click(function(){if(data.teams.length>1&&data.results.length<3){data.results.push([],[]);return JqueryBracket(opts)}})}else if(data.results.length===3&&data.teams.length>1){var type=$('se').appendTo(tools);type.click(function(){if(data.results.length===3){data.results=data.results.slice(0,1);return JqueryBracket(opts)}})}}var assertNumber=function(opts,field){if(opts.hasOwnProperty(field)){var expectedType="number";var type=typeof opts[field];if(type!==expectedType){throw new Error('Option "'+field+'" is '+type+" instead of "+expectedType)}}};var assertBoolean=function(opts,field){var value=opts[field];var expectedType="boolean";var type=typeof value;if(type!==expectedType){throw new Error("Value of "+field+" must be boolean, got "+expectedType+", got "+type)}};var assertGt=function(expected,opts,field){var value=opts[field];if(value0&&(a=e([a],b-1)),a}function f(b,c,d){var e=d.find(".team[data-teamid="+b+"]"),f=c?c:"highlight";return{highlight:function(){e.each(function(){a(this).addClass(f),a(this).hasClass("win")&&a(this).parent().find(".connector").addClass(f)})},deHighlight:function(){e.each(function(){a(this).removeClass(f),a(this).parent().find(".connector").removeClass(f)})}}}function g(b,c,d){var e=d||c,g=e.winner(),h=e.loser();g&&h&&(g.name.isEmpty()||f(g.seed.get(),"highlightWinner",b).highlight(),h.name.isEmpty()||f(h.seed.get(),"highlightLoser",b).highlight()),b.find(".team").mouseover(function(){var c=a(this).attr("data-teamid");if(void 0!==c){var d=f(parseInt(c,10),null,b);d.highlight(),a(this).mouseout(function(){d.deHighlight(),a(this).unbind("mouseout")})}})}function h(b,c,d){var e=a('');e.val(c),b.empty().append(e),e.focus(),e.blur(function(){d(e.val())}),e.keydown(function(a){var b=a.keyCode||a.which;9!==b&&13!==b&&27!==b||(a.preventDefault(),d(e.val(),27!==b))})}function i(a,b,c,d){switch(d){case"empty-bye":return void a.append("BYE");case"empty-tbd":return void a.append("TBD");case"entry-no-score":case"entry-default-win":case"entry-complete":return void a.append(b)}}function j(a,b){}function k(a){var b=a.el,c=b.find(".team.win");c.append('
1st
');var d=b.find(".team.lose");return d.append('
2nd
'),!0}function l(a){var b=a.el,c=b.find(".team.win");c.append('
3rd
');var d=b.find(".team.lose");return d.append('
4th
'),!0}function m(a,b,c,d,e){for(var f,g=Math.log(2*b.length)/Math.log(2),h=b.length,i=0;i1&&!d.skipConsolationRound)){var o=a.final().getRound().prev(),p=o.map(function(a){return function(){return a.match(0).loser()}}).toNull(),q=o.map(function(a){return function(){return a.match(1).loser()}}).toNull(),r=f.addMatch(function(){return[{source:p},{source:q}]},v.of(l));r.setAlignCb(function(b){var c=a.el.height()/2;r.el.css("height",c+"px");var e=b.height()/2+d.matchMargin;b.css("top",e+"px")}),r.setConnectorCb(v.empty())}}function n(a,b,c,d,e){for(var f=Math.log(2*c)/Math.log(2)-1,g=c/2,h=0;h2)throw new Error("Unexpected number of final rounds");return k(e)}if(2===a.size())return!1;var h=function(){var b=!e.winner().name.isEmpty()&&e.winner().name===c.winner().name;return g===!1&&b&&(g=!0,f()),!b&&g&&(g=!1,a.dropRound(),f()),b},i=a.addRound(v.of(h)),j=i.addMatch(function(){return[{source:function(){return e.first()}},{source:function(){return e.second()}}]},v.of(k));return e.setConnectorCb(v.of(function(a){return{height:0,shift:a.height()/2}})),j.setConnectorCb(v.empty()),j.setAlignCb(function(a){var d=b.el.height()+c.el.height();j.el.css("height",d+"px");var e=(b.el.height()/2+b.el.height()+c.el.height()/2)/2-a.height();a.css("top",e+"px")}),!1}));if(h.setAlignCb(function(a){var e=b.el.height()+c.el.height();d.skipConsolationRound||(e/=2),h.el.css("height",e+"px");var f=(b.el.height()/2+b.el.height()+c.el.height()/2)/2-a.height();a.css("top",f+"px")}),!d.skipConsolationRound){var i=c.final().getRound().prev(),j=g.addMatch(function(){return[{source:function(){return i.get().match(0).loser()}},{source:function(){return c.loser()}}]},v.of(l));j.setAlignCb(function(a){var d=(b.el.height()+c.el.height())/2;j.el.css("height",d+"px");var e=(b.el.height()/2+b.el.height()+c.el.height()/2)/2+a.height()/2-d;a.css("top",e+"px")}),h.setConnectorCb(v.empty()),j.setConnectorCb(v.empty())}b.final().setConnectorCb(v.of(function(a){var e=a.height()/4,f=(b.el.height()/2+b.el.height()+c.el.height()/2)/2-a.height()/2,g=f-b.el.height()/2,h=b.winner().order.map(function(a){return a.map({height:g+e*(d.centerConnectors?2:1),shift:e*(d.centerConnectors?2:1)},{height:g+e*(d.centerConnectors?2:0),shift:e*(d.centerConnectors?2:3)})}).orElse({height:g+e*(d.centerConnectors?2:1),shift:2*e}),i=h.height,j=h.shift;return i-=a.height()/2,{height:i,shift:j}})),c.final().setConnectorCb(v.of(function(a){var e=a.height()/4,f=(b.el.height()/2+b.el.height()+c.el.height()/2)/2-a.height()/2,g=f-b.el.height()/2,h=c.winner().order.map(function(a){return a.map({height:g+e*(d.centerConnectors?2:0),shift:e*(d.centerConnectors?2:3)},{height:g+2*e,shift:e*(d.centerConnectors?2:1)})}).orElse({height:g+e*(d.centerConnectors?2:1),shift:2*e}),i=h.height,j=h.shift;return i+=a.height()/2,{height:-i,shift:-j}}))}function p(b,c,d,e){var f=c.height,g=c.shift,h=b/2,i=!0;f<0&&(i=!1,f=-f),f<2&&(f=0);var j=a('
').appendTo(d);j.css("height",f),j.css("width",h+"px"),j.css(e,-h-2+"px"),g>=0?j.css("top",g-1+"px"):j.css("bottom",-g-1+"px"),i?j.css("border-bottom","none"):j.css("border-top","none");var k=a('
').appendTo(j);return k.css("width",h+"px"),k.css(e,-h+"px"),i?k.css("bottom","0px"):k.css("top","0px"),j}function q(a,b,c,d,e){if(b)return Math.log(2*a)/Math.log(2);if(c)return Math.max(2,2*(Math.log(2*a)/Math.log(2)-1)-1);var f=!d&&3===e.length&&2===e[2].length;return 2*(Math.log(2*a)/Math.log(2)-1)+1+(f?1:0)}function r(b){var c=a.extend(!0,{},b);return c.teams=c.teams.map(function(a){return a.map(function(a){return a.toNull()})}),c.results=c.results.map(function(a){return a.map(function(a){return a.map(function(a){var b=[a.first.toNull(),a.second.toNull()];return void 0!==a.userData&&b.push(a.userData),b})})}),c}function s(c,d,e,f,g,h,i,j,k,l,m){var n=f.name.isEmpty()||g.name.isEmpty()?"":'data-resultid="result-'+k.getNext()+'"',o=a('
"),p=f.name.isEmpty()||g.name.isEmpty()||!h?v.empty():f.score.map(function(a){return""+a}),q=p.orElse("--");o.text(q);var r=f.name.map(function(){return p.map(function(){return"entry-complete"}).orElseGet(function(){return g.emptyBranch()===u.BYE?"entry-default-win":"entry-no-score"})}).orElseGet(function(){var a=f.emptyBranch();switch(a){case u.BYE:return"empty-bye";case u.TBD:return"empty-tbd";default:throw new Error("Unexpected branch type "+a)}}),s=a('
'),t=a('
').appendTo(s);if(j.decorator.render(t,f.name.toNull(),q,r),f.seed.forEach(function(a){s.attr("data-teamid",a)}),f.name.isEmpty()?s.addClass("na"):d.winner().name===f.name?s.addClass("win"):d.loser().name===f.name&&s.addClass("lose"),s.append(o),(!f.name.isEmpty()||f.name.isEmpty()&&0===c&&i)&&"function"==typeof j.save&&(j.disableTeamEdit||(t.addClass("editable"),t.click(function(){function b(){function e(e,g){var h=f.seed.get();j.init.teams[~~(h/2)][h%2]=v.of(e||null),m(!0),d.click(b);var i=j.el.find(".team[data-teamid="+(h+1)+"] div.label:first");i.length&&g===!0&&0===c&&a(i).click()}d.unbind(),j.decorator.edit(d,f.name.toNull(),e)}var d=a(this);b()})),!f.name.isEmpty()&&!g.name.isEmpty()&&h)){var x=k.get();o.addClass("editable"),o.click(function(){function c(){g.unbind();var h=b(f.score.toNull())?g.text():"0",i=a('');i.val(h),g.empty().append(i),i.focus().select(),i.keydown(function(c){b(a(this).val())?a(this).removeClass("error"):a(this).addClass("error");var d=c.keyCode||c.which;if(9===d||13===d||27===d){if(c.preventDefault(),a(this).blur(),27===d)return;var e=l.find("div.score[data-resultid=result-"+(x+1)+"]");e&&e.click()}}),i.blur(function(){var a=i.val();a&&b(a)||b(f.score)?a&&b(a)||!b(f.score)||(a=f.score):a="0",g.html(a),b(a)&&(f.score=w.of(parseInt(a,10)),m({match:d,data:e})),g.click(c)})}var g=a(this);c()})}return s}function t(b,c,d){var e=a('
').appendTo(b),f=a('+').appendTo(e);if(f.click(function(){for(var a=c.teams.length,b=0;b1&&1===c.results.length||c.teams.length>2&&3===c.results.length){var g=a('-').appendTo(e);g.click(function(){if(c.teams.length>1)return c.teams=c.teams.slice(0,c.teams.length/2),L(d)})}if(1===c.results.length&&c.teams.length>1){var h=a('de').appendTo(e);h.click(function(){if(c.teams.length>1&&c.results.length<3)return c.results.push([],[]),L(d)})}else if(3===c.results.length&&c.teams.length>1){var h=a('se').appendTo(e);h.click(function(){if(3===c.results.length)return c.results=c.results.slice(0,1),L(d)})}}var u,v=function(){function a(b){if(this.val=b,b instanceof a)throw new Error("Trying to wrap Option into an Option");if(void 0===this.val)throw new Error("Option cannot contain undefined")}return a.of=function(b){return new a(b)},a.empty=function(){return new a(null)},a.prototype.get=function(){if(null===this.val)throw new Error("Trying to get() empty Option");return this.val},a.prototype.orElse=function(a){return null===this.val?a:this.val},a.prototype.orElseGet=function(a){return null===this.val?a():this.val},a.prototype.map=function(b){return null===this.val?a.empty():new a(b(this.val))},a.prototype.forEach=function(a){return null!==this.val&&a(this.val),this},a.prototype.toNull=function(){return null===this.val?null:this.val},a.prototype.isEmpty=function(){return null===this.val},a}(),w=function(a){function b(){return null!==a&&a.apply(this,arguments)||this}return __extends(b,a),b.of=function(a){var b=typeof a,c="number";if(null!==a&&b!==c)throw new Error("Invalid score format, expected "+c+", got "+b);return v.of(a)},b.empty=function(){return v.empty()},b}(v),x=function(){function a(a,b,c){if(this.first=a,this.second=b,this.userData=c,!a||!b)throw new Error("Cannot create ResultObject with undefined scores")}return a}();!function(a){a[a.TBD=0]="TBD",a[a.BYE=1]="BYE"}(u||(u={}));var y=function(){function a(a){this.isFirst=a}return a.first=function(){return new a(!0)},a.second=function(){return new a(!1)},a.prototype.map=function(a,b){return this.isFirst?a:b},a}(),z=function(){function a(a,b,c,d,e){this.source=a,this.name=b,this.order=c,this.seed=d,this.score=e}return a.prototype.emptyBranch=function(){if(!this.name.isEmpty())return u.TBD;try{return this.source().emptyBranch()}catch(a){if(a instanceof c)return u.BYE;throw new Error("Unexpected exception type")}},a}(),A=function(){function a(a,b){this.a=a,this.b=b}return a.teamsInResultOrder=function(a){var b=a.a.name.isEmpty(),c=a.b.name.isEmpty();if(c&&!b)return a.b.emptyBranch()===u.BYE?[a.a,a.b]:[];if(b&&!c)return a.a.emptyBranch()===u.BYE?[a.b,a.a]:[];if(!a.a.score.isEmpty()&&!a.b.score.isEmpty()){if(a.a.score.get()>a.b.score.get())return[a.a,a.b];if(a.a.score.get()'),this.matches=[]}return Object.defineProperty(b.prototype,"el",{get:function(){return this.roundCon},enumerable:!0,configurable:!0}),b.prototype.addMatch=function(a,b){var c=this,d=this.matches.length,e=null!==a?a():[{source:function(){return c.bracket.round(c.roundNumber-1).match(2*d).winner()}},{source:function(){return c.bracket.round(c.roundNumber-1).match(2*d+1).winner()}}],f=function(){return e[0].source()},g=function(){return e[1].source()},h=new A(new z(f,f().name,v.of(y.first()),f().seed,w.empty()),new z(g,g().name,v.of(y.second()),g().seed,w.empty())),i=this.mkMatch(this,h,d,this._results.map(function(a){return void 0===a[d]?null:a[d]}),b,this.isFirstBracket,this.opts);return this.matches.push(i),i},b.prototype.match=function(a){return this.matches[a]},b.prototype.prev=function(){return this.previousRound},b.prototype.size=function(){return this.matches.length},b.prototype.render=function(){this.roundCon.empty(),(this.doRenderCb.isEmpty()||this.doRenderCb.get()())&&(this.roundCon.appendTo(this.bracket.el),this.matches.forEach(function(a){return a.render()}))},b.prototype.results=function(){return this.matches.reduce(function(a,b){return a.concat([b.results()])},[])},b}(),G=function(){function a(a,b,c,d,e){this.bracketCon=a,this.initResults=b,this.mkMatch=c,this.isFirstBracket=d,this.opts=e,this.rounds=[]}return Object.defineProperty(a.prototype,"el",{get:function(){return this.bracketCon},enumerable:!0,configurable:!0}),a.prototype.addRound=function(a){var b=this.rounds.length,c=b>0?v.of(this.rounds[b-1]):v.empty(),d=this.initResults.map(function(a){return void 0===a[b]?new x(w.empty(),w.empty(),void 0):a[b]}),e=new F(this,c,b,d,a,this.mkMatch,this.isFirstBracket,this.opts);return this.rounds.push(e),e},a.prototype.dropRound=function(){this.rounds.pop()},a.prototype.round=function(a){return this.rounds[a]},a.prototype.size=function(){return this.rounds.length},a.prototype.final=function(){return this.rounds[this.rounds.length-1].match(0)},a.prototype.winner=function(){return this.rounds[this.rounds.length-1].match(0).winner()},a.prototype.loser=function(){return this.rounds[this.rounds.length-1].match(0).loser()},a.prototype.render=function(){this.bracketCon.empty();for(var a=0;a'),this.teamCon=a('
'),this.alignCb=null,this.matchUserData=f.isEmpty()?void 0:f.get().userData,!i.save){var m=this.matchUserData;i.onMatchHover&&this.teamCon.hover(function(){i.onMatchHover(m,!0)},function(){i.onMatchHover(m,!1)}),i.onMatchClick&&this.teamCon.click(function(){i.onMatchClick(m)})}d.a.name=d.a.source().name,d.b.name=d.b.source().name,d.a.score=f.map(function(a){return a.first.toNull()}),d.b.score=f.map(function(a){return a.second.toNull()}),d.a.name&&d.b.name||!b(d.a.score.toNull())&&!b(d.b.score.toNull())||(console.log("ERROR IN SCORE DATA: "+d.a.source().name+": "+d.a.score+", "+d.b.source().name+": "+d.b.score),d.a.score=d.b.score=w.empty())}return Object.defineProperty(c.prototype,"el",{get:function(){return this.matchCon},enumerable:!0,configurable:!0}),c.prototype.getRound=function(){return this.round},c.prototype.setConnectorCb=function(a){this.connectorCb=a},c.prototype.connect=function(a){var b=this,c="lr"===this.opts.dir?"right":"left",d=this.teamCon.height()/4,e=this.matchCon.height()/2,f=a.map(function(a){return a(b.teamCon,b)}).orElseGet(function(){return b.seed%2===0?b.winner().order.map(function(a){return a.map({shift:d*(b.opts.centerConnectors?2:1),height:e},{shift:d*(b.opts.centerConnectors?2:3),height:e-d*(b.opts.centerConnectors?0:2)})}).orElse({shift:2*d,height:e-d*(b.opts.centerConnectors?0:1)}):b.winner().order.map(function(a){return a.map({shift:-d*(b.opts.centerConnectors?2:3),height:-e+d*(b.opts.centerConnectors?0:2)},{shift:-d*(b.opts.centerConnectors?2:1),height:-e})}).orElse({shift:2*-d,height:-e+d*(b.opts.centerConnectors?0:1)})});this.teamCon.append(p(this.opts.roundMargin,f,this.teamCon,c))},c.prototype.winner=function(){return this.match.winner()},c.prototype.loser=function(){return this.match.loser()},c.prototype.first=function(){return this.match.a},c.prototype.second=function(){return this.match.b},c.prototype.setAlignCb=function(a){this.alignCb=a},c.prototype.render=function(){var a=this;this.matchCon.empty(),this.teamCon.empty(),this.match.a.name=this.match.a.source().name,this.match.b.name=this.match.b.source().name,this.match.a.seed=this.match.a.source().seed,this.match.b.seed=this.match.b.source().seed;var b=this.match.a.name.isEmpty()&&this.match.b.name.isEmpty();b?this.teamCon.addClass("np"):this.match.winner().name?this.teamCon.removeClass("np"):this.teamCon.addClass("np");var c=!this.match.a.name.isEmpty()&&!this.match.b.name.isEmpty();this.teamCon.append(s(this.round.roundNumber,this.match,this.matchUserData,this.match.a,this.match.b,c,this.isFirstBracket,this.opts,this.resultId,this.topCon,this.renderAll)),this.teamCon.append(s(this.round.roundNumber,this.match,this.matchUserData,this.match.b,this.match.a,c,this.isFirstBracket,this.opts,this.resultId,this.topCon,this.renderAll)),this.matchCon.appendTo(this.round.el),this.matchCon.append(this.teamCon),this.el.css("height",this.round.bracket.el.height()/this.round.size()+"px"),this.teamCon.css("top",this.el.height()/2-this.teamCon.height()/2+"px"),null!==this.alignCb&&this.alignCb(this.teamCon);var d=this.renderCb.map(function(b){return b(a)}).orElse(!1);d||this.connect(this.connectorCb),this.opts.decorator.renderMatch(this.teamCon,this.matchUserData)},c.prototype.results=function(){var a=this.match.a.name.isEmpty()||this.match.b.name.isEmpty();return a&&(this.match.a.score=this.match.b.score=w.empty()),new x(this.match.a.score,this.match.b.score,this.matchUserData)},c}(),J=function(a){return void 0===a?null:a},K=function(a){return a.map(function(a){return a.map(function(a){return a.map(function(a){return new x(w.of(J(a[0])),w.of(J(a[1])),a[2])})})})},L=function(b){function c(){var a=q(j.teams.length,k,b.skipGrandFinalComeback,b.skipSecondaryFinal,j.results);b.disableToolbar?p.css("width",a*(b.teamWidth+b.scoreWidth+b.roundMargin)+10):p.css("width",a*(b.teamWidth+b.scoreWidth+b.roundMargin)+40),k&&j.teams.length<=2&&!b.skipConsolationRound&&p.css("height",l+40)}function d(a){i.reset(),e.render(),f&&f.render(),h&&!b.skipGrandFinalComeback&&h.render(),b.disableHighlight||g(p,e,h),a&&(j.results[0]=e.results(),f&&(j.results[1]=f.results()),h&&!b.skipGrandFinalComeback&&(j.results[2]=h.results()),c(),b.save&&b.save(r(j),b.userData,a))}var e,f,h,i=new H,j=b.init,k=j.results.length<=1,l=45*j.teams.length+j.teams.length*b.matchMargin,p=a('
').appendTo(b.el.empty());b.skipSecondaryFinal&&k&&a.error("skipSecondaryFinal setting is viable only in double elimination mode"),b.disableToolbar||t(p,j,b);var s,u,w;k?u=a('
').appendTo(p):(b.skipGrandFinalComeback||(s=a('
').appendTo(p)),u=a('
').appendTo(p),w=a('
').appendTo(p)),u.css("height",l),w&&w.css("height",u.height()/2),c();var x=function(a,b,c,e,f,g,h){return new I(a,b,c,e,f,g,h,i,p,d)};return e=new G(u,v.of(j.results[0]||null),x,!0,b),k||(f=new G(w,v.of(j.results[1]||null),x,!1,b),b.skipGrandFinalComeback||(h=new G(s,v.of(j.results[2]||null),x,!1,b))),m(e,j.teams,k,b,b.skipGrandFinalComeback&&!k),k||(n(e,f,j.teams.length,b.skipGrandFinalComeback,b.centerConnectors),b.skipGrandFinalComeback||o(h,e,f,b,p,c)),d(!1),{data:function(){return r(b.init)}}},M=function(a,b){if(a.hasOwnProperty(b)){var c="number",d=typeof a[b];if(d!==c)throw new Error('Option "'+b+'" is '+d+" instead of "+c)}},N=function(a,b){var c=a[b],d="boolean",e=typeof c;if(e!==d)throw new Error("Value of "+b+" must be boolean, got "+d+", got "+e)},O=function(a,b,c){var d=b[c];if(d void; + save: (data: any, userData: any, saveData: any) => void; userData: any; decorator: Decorator; skipConsolationRound: boolean; @@ -888,7 +888,7 @@ } } - function teamElement(roundNumber: number, match: MatchResult, team: TeamBlock, + function teamElement(roundNumber: number, match: MatchResult, matchUserData: any, team: TeamBlock, opponent: TeamBlock, isReady: boolean, isFirstBracket: boolean, opts: Options, resultId: ResultId, topCon: JQuery, renderAll: (boolean) => void) { @@ -977,7 +977,7 @@ function editor() { span.unbind(); - const score = !isNumber(team.score) ? '0' : span.text(); + const score = !isNumber(team.score.toNull()) ? '0' : span.text(); const input = $(''); input.val(score); @@ -1018,7 +1018,7 @@ span.html(val); if (isNumber(val)) { team.score = Score.of(parseInt(val, 10)); - renderAll(true); + renderAll({match: match, data: matchUserData}); } span.click(editor); }); @@ -1078,7 +1078,7 @@ /* match has score even though teams haven't yet been decided */ /* todo: would be nice to have in preload check, maybe too much work */ - if ((!match.a.name || !match.b.name) && (isNumber(match.a.score) || isNumber(match.b.score))) { + if ((!match.a.name || !match.b.name) && (isNumber(match.a.score.toNull()) || isNumber(match.b.score.toNull()))) { console.log('ERROR IN SCORE DATA: ' + match.a.source().name + ': ' + match.a.score + ', ' + match.b.source().name + ': ' + match.b.score); match.a.score = match.b.score = Score.empty(); @@ -1168,10 +1168,10 @@ // Coerce truthy/falsy "isset()" for Typescript const isReady = !this.match.a.name.isEmpty() && !this.match.b.name.isEmpty(); - this.teamCon.append(teamElement(this.round.roundNumber, this.match, this.match.a, + this.teamCon.append(teamElement(this.round.roundNumber, this.match, this.matchUserData, this.match.a, this.match.b, isReady, this.isFirstBracket, this.opts, this.resultId, this.topCon, this.renderAll)); - this.teamCon.append(teamElement(this.round.roundNumber, this.match, this.match.b, + this.teamCon.append(teamElement(this.round.roundNumber, this.match, this.matchUserData, this.match.b, this.match.a, isReady, this.isFirstBracket, this.opts, this.resultId, this.topCon, this.renderAll)); @@ -1244,7 +1244,7 @@ let w, l, f; - function renderAll(save: boolean): void { + function renderAll(save: any): void { resultId.reset(); w.render(); if (l) { @@ -1271,7 +1271,7 @@ resizeContainer(); if (opts.save) { - opts.save(exportData(data), opts.userData); + opts.save(exportData(data), opts.userData, save); } } }