From b27f2e35e1b577e4258c6d1fa54ff21170a986b6 Mon Sep 17 00:00:00 2001 From: Maciej Szary Date: Tue, 12 Apr 2016 11:36:43 +0200 Subject: [PATCH] match render decorator --- Gruntfile.js | 6 +++--- dist/jquery.bracket.min.css | 2 +- dist/jquery.bracket.min.js | 4 ++-- src/jquery.bracket.ts | 13 +++++++++++-- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 2077139..ae50aef 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -19,7 +19,7 @@ module.exports = function(grunt) { }, dist: { files: { - 'dist/<%= pkg.name %>.min.css': 'dist/<%= pkg.name %>.css' + 'dist/jquery.bracket.min.css': 'dist/jquery.bracket.css' } } }, @@ -30,7 +30,7 @@ module.exports = function(grunt) { }, dist: { files: { - 'dist/<%= pkg.name %>.min.js': ['dist/<%= pkg.name %>.js'] + 'dist/jquery.bracket.min.js': ['dist/jquery.bracket.js'] } } }, @@ -57,5 +57,5 @@ module.exports = function(grunt) { grunt.loadNpmTasks('grunt-tslint'); grunt.loadNpmTasks('grunt-css'); - grunt.registerTask('default', ['tslint', 'shell', 'typescript', 'uglify', 'cssmin']); + grunt.registerTask('default', ['tslint', 'shell', 'typescript', 'cssmin', 'uglify' ]); }; diff --git a/dist/jquery.bracket.min.css b/dist/jquery.bracket.min.css index 4386ade..8178af1 100644 --- a/dist/jquery.bracket.min.css +++ b/dist/jquery.bracket.min.css @@ -1,2 +1,2 @@ -/* jQuery Bracket | Copyright (c) Teijo Laine 2011-2015 | Licenced under the MIT licence */ +/* jQuery Bracket | Copyright (c) Teijo Laine 2011-2016 | 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;width:100px;margin-right:40px;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;width:100px;cursor:default}div.jQBracket .team:first-child{border-bottom:1px solid #999}div.jQBracket .team input{font-size:12px;padding:0;width:inherit;border:0;margin:0}div.jQBracket .team div.label{padding:3px;position:absolute;width:70px;height:22px;white-space:nowrap;overflow:hidden}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;width:20px}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 .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:#222}div.jQBracket .bubble{height:22px;line-height:22px;width:30px;right:-35px;position:absolute;text-align:center;font-size:11px}div.jQBracket .bubble.third{background-color:#963;color:#D95}div.jQBracket .bubble.fourth{background-color:#678;color:#CCD}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 .bubble.third:after{border-right:6px solid #963}div.jQBracket .bubble.fourth:after{border-right:6px solid #678}div.jQBracket .highlightWinner .bubble{background-color:#DA0;color:#960}div.jQBracket .highlightWinner .bubble:after{border-right-color:#DA0}div.jQBracket .highlightLoser .bubble{background-color:#CCC;color:#333}div.jQBracket .highlightLoser .bubble:after{border-right-color:#CCC}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;margin-left:40px;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 4ef0c93..d32a63c 100644 --- a/dist/jquery.bracket.min.js +++ b/dist/jquery.bracket.min.js @@ -1,2 +1,2 @@ -/* jQuery Bracket | Copyright (c) Teijo Laine 2011-2015 | Licenced under the MIT licence */ -!function(a){function b(a){return!isNaN(parseFloat(a))&&isFinite(a)}function c(a){function b(a,c){return a instanceof Array?b(a[0],c+1):c}return b(a,0)}function d(a,b){return b>0&&(a=d([a],b-1)),a}function e(){return{source:null,name:null,id:-1,idx:-1,score:null}}function f(a){if(b(a.a.score)&&b(a.b.score)){if(a.a.score>a.b.score)return[a.a,a.b];if(a.a.score');e.val(c),b.html(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 l(a,b,c){a.append(b)}function m(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 n(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 o(a,b,c,d,e){for(var f,g=Math.log(2*b.length)/Math.log(2),h=b.length,i=0;g>i;i+=1){f=a.addRound();for(var j=0;h>j;j+=1){var k=0===i?v(b,j):null;if(i===g-1&&c||i===g-1&&e){var l=f.addMatch(k,m);e||l.setAlignCb(w(l,d))}else f.addMatch(k)}h/=2}if(c&&(a["final"]().connectorCb(function(){return null}),b.length>1&&!d)){var o=a["final"]().round().prev().match(0).loser,p=a["final"]().round().prev().match(1).loser,q=f.addMatch(function(){return[{source:o},{source:p}]},n);q.setAlignCb(function(b){var c=a.el.height()/2;q.el.css("height",c+"px");var d=b.height();b.css("top",d+"px")}),q.connectorCb(function(){return null})}}function p(a,b,c,d){for(var e=Math.log(2*c)/Math.log(2)-1,f=c/2,g=0;e>g;g+=1){for(var h=d&&g===e-1?1:2,i=0;h>i;i+=1)for(var j=b.addRound(),k=0;f>k;k+=1){var l=i%2!==0||0===g?x(a,b,f,k,i,g):null,m=g===e-1&&d,o=j.addMatch(l,m?n:null);if(o.setAlignCb(y(o.el.find(".teamContainer"),o)),m)o.connectorCb(function(){return null});else if(e-1>g||1>i){var p=i%2===0?function(a,b){var c=a.height()/4,d=0,e=0;return 0===b.winner().id?e=c:1===b.winner().id?(d=2*-c,e=c):e=2*c,{height:d,shift:e}}:null;o.connectorCb(p)}}f/=2}}function q(a,b,c,d,e,f){var g=a.addRound(),h=g.addMatch(function(){return[{source:b.winner},{source:c.winner}]},function(e){var g=!1;if(d||null===e.winner().name||e.winner().name!==c.winner().name)return m(e);if(2!==a.size()){var h=a.addRound(function(){var b=null!==e.winner().name&&e.winner().name===c.winner().name;return g===!1&&b&&(g=!0,f.css("width",parseInt(f.css("width"),10)+140+"px")),!b&&g&&(g=!1,a.dropRound(),f.css("width",parseInt(f.css("width"),10)-140+"px")),b}),i=h.addMatch(function(){return[{source:e.first},{source:e.second}]},m);return e.connectorCb(function(a){return{height:0,shift:a.height()/2}}),i.connectorCb(function(){return null}),i.setAlignCb(function(a){var d=b.el.height()+c.el.height();i.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 d=b.el.height()+c.el.height();e||(d/=2),h.el.css("height",d+"px");var f=(b.el.height()/2+b.el.height()+c.el.height()/2)/2-a.height();a.css("top",f+"px")}),!e){var i=c["final"]().round().prev().match(0).loser,j=g.addMatch(function(){return[{source:i},{source:c.loser}]},n);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.connectorCb(function(){return null}),j.connectorCb(function(){return null})}b["final"]().connectorCb(function(a){var d,e,f=a.height()/4,g=(b.el.height()/2+b.el.height()+c.el.height()/2)/2-a.height()/2,h=g-b.el.height()/2;return 0===b.winner().id?(e=h+2*f,d=f):1===b.winner().id?(e=h,d=3*f):(e=h+f,d=2*f),e-=a.height()/2,{height:e,shift:d}}),c["final"]().connectorCb(function(a){var d,e,f=a.height()/4,g=(b.el.height()/2+b.el.height()+c.el.height()/2)/2-a.height()/2,h=g-b.el.height()/2;return 0===c.winner().id?(e=h,d=3*f):1===c.winner().id?(e=h+2*f,d=f):(e=h+f,d=2*f),e+=a.height()/2,{height:-e,shift:-d}})}function r(b,c,d,e,f,g){var h=[],i=a('
');return{el:i,bracket:b,id:d,addMatch:function(a,c){var f=h.length,i=null!==a?a():[{source:b.round(d-1).match(2*f).winner},{source:b.round(d-1).match(2*f+1).winner}],j=g(this,i,f,e?e[f]:null,c);return h.push(j),j},match:function(a){return h[a]},prev:function(){return c},size:function(){return h.length},render:function(){i.empty(),("function"!=typeof f||f())&&(i.appendTo(b.el),a.each(h,function(a,b){b.render()}))},results:function(){var b=[];return a.each(h,function(a,c){b.push(c.results())}),b}}}function s(b,c,d){var e=[];return{el:b,addRound:function(a){var b=e.length,f=b>0?e[b-1]:null,g=r(this,f,b,c?c[b]:null,a,d);return e.push(g),g},dropRound:function(){e.pop()},round:function(a){return e[a]},size:function(){return e.length},"final":function(){return e[e.length-1].match(0)},winner:function(){return e[e.length-1].match(0).winner()},loser:function(){return e[e.length-1].match(0).loser()},render:function(){b.empty();for(var a=0;ab&&(g=!1,b=-b),2>b&&(b=0);var h=a('
').appendTo(d);h.css("height",b),h.css("width",f+"px"),h.css(e,-f-2+"px"),c>=0?h.css("top",c+"px"):h.css("bottom",-c+"px"),g?h.css("border-bottom","none"):h.css("border-top","none");var i=a('
').appendTo(h);return i.css("width",f+"px"),i.css(e,-f+"px"),g?i.css("bottom","0px"):i.css("top","0px"),h}function u(b,c,d){var e=a('
').appendTo(b),f=a('+').appendTo(e);if(f.click(function(){for(var a=c.teams.length,b=0;a>b;b+=1)c.teams.push(["",""]);return z(d)}),c.teams.length>1&&1===c.results.length||c.teams.length>2&&3===c.results.length){var g=a('-').appendTo(e);g.click(function(){return c.teams.length>1?(c.teams=c.teams.slice(0,c.teams.length/2),z(d)):void 0})}if(1===c.results.length&&c.teams.length>1){var h=a('de').appendTo(e);h.click(function(){return c.teams.length>1&&c.results.length<3?(c.results.push([],[]),z(d)):void 0})}else if(3===c.results.length&&c.teams.length>1){var h=a('se').appendTo(e);h.click(function(){return 3===c.results.length?(c.results=c.results.slice(0,1),z(d)):void 0})}}var v=function(a,b){return function(){return[{source:function(){return{name:a[b][0],idx:2*b}}},{source:function(){return{name:a[b][1],idx:2*b+1}}}]}},w=function(a,b){return function(c){c.css("top",""),c.css("position","absolute"),b?c.css("top",a.el.height()/2-c.height()/2+"px"):c.css("bottom",-c.height()/2+"px")}},x=function(a,b,c,d,e,f){return function(){if(e%2===0&&0===f)return[{source:a.round(0).match(2*d).loser},{source:a.round(0).match(2*d+1).loser}];var g=f%2===0?c-d-1:d;return[{source:b.round(2*f).match(d).winner},{source:a.round(f+1).match(g).loser}]}},y=function(a,b){return function(){return a.css("top",b.el.height()/2-a.height()/2+"px")}},z=function(e){function f(a){n=0,w.render(),x&&x.render(),y&&!e.skipGrandFinalComeback&&y.render(),j(z,w,y),a&&(v.results[0]=w.results(),x&&(v.results[1]=x.results()),y&&!e.skipGrandFinalComeback&&(v.results[2]=y.results()),e.save&&e.save(v,e.userData))}function i(c,d,i,j,k){function l(c,d,i){var j=n,k=a('
'),l=d.name&&i&&b(d.score)?d.score:"--";k.append(l),n+=1;var o=d.name?d.name:"--",p=a('
'),q=a('
').appendTo(p);return 0===c&&p.attr("data-resultid","team-"+j),e.decorator.render(q,o,l),b(d.idx)&&p.attr("data-teamid",d.idx),null===d.name?p.addClass("na"):g(m).name===d.name?p.addClass("win"):h(m).name===d.name&&p.addClass("lose"),p.append(k),null!==d.name&&i&&e.save&&e.save&&(q.addClass("editable"),q.click(function(){function b(){function h(h,i){h&&(e.init.teams[~~(d.idx/2)][d.idx%2]=h),f(!0),g.click(b);var j=e.el.find(".team[data-teamid="+(d.idx+1)+"] div.label:first");j.length&&i===!0&&0===c&&a(j).click()}g.unbind(),e.decorator.edit(g,d.name,h)}var g=a(this);b()}),d.name&&(k.addClass("editable"),k.click(function(){function c(){e.unbind();var g=b(d.score)?e.text():"0",h=a('');h.val(g),e.html(h),h.focus().select(),h.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=z.find("div.score[data-resultid=result-"+(j+1)+"]");e&&e.click()}}),h.blur(function(){var a=h.val();a&&b(a)||b(d.score)?a&&b(a)||!b(d.score)||(a=d.score):a="0",e.html(a),b(a)&&(d.score=parseInt(a,10),f(!0)),e.click(c)})}var e=a(this);c()}))),p}var m={a:d[0],b:d[1]},o=null,p=null,q=a('
'),s=a('
');if(!e.save){var u=j?j[2]:null;e.onMatchHover&&s.hover(function(){e.onMatchHover(u,!0)},function(){e.onMatchHover(u,!1)}),e.onMatchClick&&s.click(function(){e.onMatchClick(u)})}return m.a.id=0,m.b.id=1,m.a.name=m.a.source().name,m.b.name=m.b.source().name,m.a.score=j?j[0]:null,m.b.score=j?j[1]:null,m.a.name&&m.b.name||!b(m.a.score)&&!b(m.b.score)||(console.log("ERROR IN SCORE DATA: "+m.a.source().name+": "+m.a.score+", "+m.b.source().name+": "+m.b.score),m.a.score=m.b.score=null),{el:q,id:i,round:function(){return c},connectorCb:function(a){o=a},connect:function(a){var b,c,d=s.height()/4,e=q.height()/2;if(a&&null!==a){var f=a(s,this);if(null===f)return;b=f.shift,c=f.height}else i%2===0?0===this.winner().id?(b=d,c=e):1===this.winner().id?(b=3*d,c=e-2*d):(b=2*d,c=e-d):0===this.winner().id?(b=3*-d,c=-e+2*d):1===this.winner().id?(b=-d,c=-e):(b=2*-d,c=-e+d);s.append(t(c,b,s,r))},winner:function(){return g(m)},loser:function(){return h(m)},first:function(){return m.a},second:function(){return m.b},setAlignCb:function(a){p=a},render:function(){q.empty(),s.empty(),m.a.name=m.a.source().name,m.b.name=m.b.source().name,m.a.idx=m.a.source().idx,m.b.idx=m.b.source().idx,g(m).name?s.removeClass("np"):s.addClass("np");var a=(Boolean(m.a.name)||""===m.a.name)&&(Boolean(m.b.name)||""===m.b.name);s.append(l(c.id,m.a,a)),s.append(l(c.id,m.b,a)),q.appendTo(c.el),q.append(s),this.el.css("height",c.bracket.el.height()/c.size()+"px"),s.css("top",this.el.height()/2-s.height()/2+"px"),null!==p&&p(s);var b="function"==typeof k?k(this):!1;b||this.connect(o)},results:function(){return[m.a.score,m.b.score]}}}function m(a){return B?Math.log(2*a)/Math.log(2):e.skipGrandFinalComeback?Math.max(2,2*(Math.log(2*a)/Math.log(2)-1)-1):2*(Math.log(2*a)/Math.log(2)-1)+1}var n,r="lr"===e.dir?"right":"left";if(!e)throw Error("Options not set");if(!e.el)throw Error("Invalid jQuery object as container");if(!e.init&&!e.save)throw Error("No bracket data or save callback given");if(void 0===e.userData&&(e.userData=null),!(!e.decorator||e.decorator.edit&&e.decorator.render))throw Error("Invalid decorator input");e.decorator||(e.decorator={edit:k,render:l});var v;e.init||(e.init={teams:[["",""]],results:[]}),v=e.init;var w,x,y,z=a('
').appendTo(e.el.empty()),A=d(v.results,4-c(v.results));v.results=A;var B=A.length<=1;e.skipSecondaryFinal&&B&&a.error("skipSecondaryFinal setting is viable only in double elimination mode"),e.save&&u(z,v,e);var C,D,E;B?D=a('
').appendTo(z):(e.skipGrandFinalComeback||(C=a('
').appendTo(z)),D=a('
').appendTo(z),E=a('
').appendTo(z));var F=64*v.teams.length;D.css("height",F),B&&v.teams.length<=2&&!e.skipConsolationRound&&z.css("height",F+40),E&&E.css("height",D.height()/2);var G=m(v.teams.length);return e.save?z.css("width",140*G+40):z.css("width",140*G+10),w=s(D,A&&A[0]?A[0]:null,i),B||(x=s(E,A&&A[1]?A[1]:null,i),e.skipGrandFinalComeback||(y=s(C,A&&A[2]?A[2]:null,i))),o(w,v.teams,B,e.skipConsolationRound,e.skipGrandFinalComeback&&!B),B||(p(w,x,v.teams.length,e.skipGrandFinalComeback),e.skipGrandFinalComeback||q(y,w,x,e.skipSecondaryFinal,e.skipConsolationRound,z)),f(!1),{data:function(){return e.init}}},A={init:function(b){var c=a.extend(!0,{},b),d=this;c.el=this,c.save&&(c.onMatchClick||c.onMatchHover)&&a.error("Match callbacks may not be passed in edit mode (in conjunction with save callback)"),c.dir=c.dir||"lr",c.init.teams=c.init.teams&&0!==c.init.teams.length?c.init.teams:[["",""]],c.skipConsolationRound=c.skipConsolationRound||!1,c.skipSecondaryFinal=c.skipSecondaryFinal||!1,"lr"!==c.dir&&"rl"!==c.dir&&a.error('Direction must be either: "lr" or "rl"');var e=z(c);return a(this).data("bracket",{target:d,obj:e}),e},data:function(){var b=a(this).data("bracket");return b.obj.data()}};a.fn.bracket=function(b){return A[b]?A[b].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof b&&b?void a.error("Method "+b+" does not exist on jQuery.bracket"):A.init.apply(this,arguments)}}(jQuery); \ No newline at end of file +/* jQuery Bracket | Copyright (c) Teijo Laine 2011-2016 | Licenced under the MIT licence */ +!function(a){function b(a){return!isNaN(parseFloat(a))&&isFinite(a)}function c(a){function b(a,c){return a instanceof Array?b(a[0],c+1):c}return b(a,0)}function d(a,b){return b>0&&(a=d([a],b-1)),a}function e(){return{source:null,name:null,id:-1,idx:-1,score:null}}function f(a){if(b(a.a.score)&&b(a.b.score)){if(a.a.score>a.b.score)return[a.a,a.b];if(a.a.score');e.val(c),b.html(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 l(a,b,c){a.append(b)}function m(a,b){}function n(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 o(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 p(a,b,c,d,e){for(var f,g=Math.log(2*b.length)/Math.log(2),h=b.length,i=0;g>i;i+=1){f=a.addRound();for(var j=0;h>j;j+=1){var k=0===i?w(b,j):null;if(i===g-1&&c||i===g-1&&e){var l=f.addMatch(k,n);e||l.setAlignCb(x(l,d))}else f.addMatch(k)}h/=2}if(c&&(a["final"]().connectorCb(function(){return null}),b.length>1&&!d)){var m=a["final"]().round().prev().match(0).loser,p=a["final"]().round().prev().match(1).loser,q=f.addMatch(function(){return[{source:m},{source:p}]},o);q.setAlignCb(function(b){var c=a.el.height()/2;q.el.css("height",c+"px");var d=b.height();b.css("top",d+"px")}),q.connectorCb(function(){return null})}}function q(a,b,c,d){for(var e=Math.log(2*c)/Math.log(2)-1,f=c/2,g=0;e>g;g+=1){for(var h=d&&g===e-1?1:2,i=0;h>i;i+=1)for(var j=b.addRound(),k=0;f>k;k+=1){var l=i%2!==0||0===g?y(a,b,f,k,i,g):null,m=g===e-1&&d,n=j.addMatch(l,m?o:null);if(n.setAlignCb(z(n.el.find(".teamContainer"),n)),m)n.connectorCb(function(){return null});else if(e-1>g||1>i){var p=i%2===0?function(a,b){var c=a.height()/4,d=0,e=0;return 0===b.winner().id?e=c:1===b.winner().id?(d=2*-c,e=c):e=2*c,{height:d,shift:e}}:null;n.connectorCb(p)}}f/=2}}function r(a,b,c,d,e,f){var g=a.addRound(),h=g.addMatch(function(){return[{source:b.winner},{source:c.winner}]},function(e){var g=!1;if(d||null===e.winner().name||e.winner().name!==c.winner().name)return n(e);if(2!==a.size()){var h=a.addRound(function(){var b=null!==e.winner().name&&e.winner().name===c.winner().name;return g===!1&&b&&(g=!0,f.css("width",parseInt(f.css("width"),10)+140+"px")),!b&&g&&(g=!1,a.dropRound(),f.css("width",parseInt(f.css("width"),10)-140+"px")),b}),i=h.addMatch(function(){return[{source:e.first},{source:e.second}]},n);return e.connectorCb(function(a){return{height:0,shift:a.height()/2}}),i.connectorCb(function(){return null}),i.setAlignCb(function(a){var d=b.el.height()+c.el.height();i.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 d=b.el.height()+c.el.height();e||(d/=2),h.el.css("height",d+"px");var f=(b.el.height()/2+b.el.height()+c.el.height()/2)/2-a.height();a.css("top",f+"px")}),!e){var i=c["final"]().round().prev().match(0).loser,j=g.addMatch(function(){return[{source:i},{source:c.loser}]},o);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.connectorCb(function(){return null}),j.connectorCb(function(){return null})}b["final"]().connectorCb(function(a){var d,e,f=a.height()/4,g=(b.el.height()/2+b.el.height()+c.el.height()/2)/2-a.height()/2,h=g-b.el.height()/2;return 0===b.winner().id?(e=h+2*f,d=f):1===b.winner().id?(e=h,d=3*f):(e=h+f,d=2*f),e-=a.height()/2,{height:e,shift:d}}),c["final"]().connectorCb(function(a){var d,e,f=a.height()/4,g=(b.el.height()/2+b.el.height()+c.el.height()/2)/2-a.height()/2,h=g-b.el.height()/2;return 0===c.winner().id?(e=h,d=3*f):1===c.winner().id?(e=h+2*f,d=f):(e=h+f,d=2*f),e+=a.height()/2,{height:-e,shift:-d}})}function s(b,c,d,e,f,g){var h=[],i=a('
');return{el:i,bracket:b,id:d,addMatch:function(a,c){var f=h.length,i=null!==a?a():[{source:b.round(d-1).match(2*f).winner},{source:b.round(d-1).match(2*f+1).winner}],j=g(this,i,f,e?e[f]:null,c);return h.push(j),j},match:function(a){return h[a]},prev:function(){return c},size:function(){return h.length},render:function(){i.empty(),("function"!=typeof f||f())&&(i.appendTo(b.el),a.each(h,function(a,b){b.render()}))},results:function(){var b=[];return a.each(h,function(a,c){b.push(c.results())}),b}}}function t(b,c,d){var e=[];return{el:b,addRound:function(a){var b=e.length,f=b>0?e[b-1]:null,g=s(this,f,b,c?c[b]:null,a,d);return e.push(g),g},dropRound:function(){e.pop()},round:function(a){return e[a]},size:function(){return e.length},"final":function(){return e[e.length-1].match(0)},winner:function(){return e[e.length-1].match(0).winner()},loser:function(){return e[e.length-1].match(0).loser()},render:function(){b.empty();for(var a=0;ab&&(g=!1,b=-b),2>b&&(b=0);var h=a('
').appendTo(d);h.css("height",b),h.css("width",f+"px"),h.css(e,-f-2+"px"),c>=0?h.css("top",c+"px"):h.css("bottom",-c+"px"),g?h.css("border-bottom","none"):h.css("border-top","none");var i=a('
').appendTo(h);return i.css("width",f+"px"),i.css(e,-f+"px"),g?i.css("bottom","0px"):i.css("top","0px"),h}function v(b,c,d){var e=a('
').appendTo(b),f=a('+').appendTo(e);if(f.click(function(){for(var a=c.teams.length,b=0;a>b;b+=1)c.teams.push(["",""]);return A(d)}),c.teams.length>1&&1===c.results.length||c.teams.length>2&&3===c.results.length){var g=a('-').appendTo(e);g.click(function(){return c.teams.length>1?(c.teams=c.teams.slice(0,c.teams.length/2),A(d)):void 0})}if(1===c.results.length&&c.teams.length>1){var h=a('de').appendTo(e);h.click(function(){return c.teams.length>1&&c.results.length<3?(c.results.push([],[]),A(d)):void 0})}else if(3===c.results.length&&c.teams.length>1){var h=a('se').appendTo(e);h.click(function(){return 3===c.results.length?(c.results=c.results.slice(0,1),A(d)):void 0})}}var w=function(a,b){return function(){return[{source:function(){return{name:a[b][0],idx:2*b}}},{source:function(){return{name:a[b][1],idx:2*b+1}}}]}},x=function(a,b){return function(c){c.css("top",""),c.css("position","absolute"),b?c.css("top",a.el.height()/2-c.height()/2+"px"):c.css("bottom",-c.height()/2+"px")}},y=function(a,b,c,d,e,f){return function(){if(e%2===0&&0===f)return[{source:a.round(0).match(2*d).loser},{source:a.round(0).match(2*d+1).loser}];var g=f%2===0?c-d-1:d;return[{source:b.round(2*f).match(d).winner},{source:a.round(f+1).match(g).loser}]}},z=function(a,b){return function(){return a.css("top",b.el.height()/2-a.height()/2+"px")}},A=function(e){function f(a){o=0,x.render(),y&&y.render(),z&&!e.skipGrandFinalComeback&&z.render(),j(A,x,z),a&&(w.results[0]=x.results(),y&&(w.results[1]=y.results()),z&&!e.skipGrandFinalComeback&&(w.results[2]=z.results()),e.save&&e.save(w,e.userData))}function i(c,d,i,j,k){function l(c,d,i){var j=o,k=a('
'),l=d.name&&i&&b(d.score)?d.score:"--";k.append(l),o+=1;var n=d.name?d.name:"--",p=a('
'),q=a('
').appendTo(p);return 0===c&&p.attr("data-resultid","team-"+j),e.decorator.render(q,n,l),b(d.idx)&&p.attr("data-teamid",d.idx),null===d.name?p.addClass("na"):g(m).name===d.name?p.addClass("win"):h(m).name===d.name&&p.addClass("lose"),p.append(k),null!==d.name&&i&&e.save&&e.save&&(q.addClass("editable"),q.click(function(){function b(){function h(h,i){h&&(e.init.teams[~~(d.idx/2)][d.idx%2]=h),f(!0),g.click(b);var j=e.el.find(".team[data-teamid="+(d.idx+1)+"] div.label:first");j.length&&i===!0&&0===c&&a(j).click()}g.unbind(),e.decorator.edit(g,d.name,h)}var g=a(this);b()}),d.name&&(k.addClass("editable"),k.click(function(){function c(){e.unbind();var g=b(d.score)?e.text():"0",h=a('');h.val(g),e.html(h),h.focus().select(),h.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=A.find("div.score[data-resultid=result-"+(j+1)+"]");e&&e.click()}}),h.blur(function(){var a=h.val();a&&b(a)||b(d.score)?a&&b(a)||!b(d.score)||(a=d.score):a="0",e.html(a),b(a)&&(d.score=parseInt(a,10),f(!0)),e.click(c)})}var e=a(this);c()}))),p}var m={a:d[0],b:d[1]},n=null,p=null,q=a('
'),r=a('
');if(!e.save){var t=j?j[2]:null;e.onMatchHover&&r.hover(function(){e.onMatchHover(t,!0)},function(){e.onMatchHover(t,!1)}),e.onMatchClick&&r.click(function(){e.onMatchClick(t)})}return m.a.id=0,m.b.id=1,m.a.name=m.a.source().name,m.b.name=m.b.source().name,m.a.score=j?j[0]:null,m.b.score=j?j[1]:null,m.a.name&&m.b.name||!b(m.a.score)&&!b(m.b.score)||(console.log("ERROR IN SCORE DATA: "+m.a.source().name+": "+m.a.score+", "+m.b.source().name+": "+m.b.score),m.a.score=m.b.score=null),{el:q,id:i,round:function(){return c},connectorCb:function(a){n=a},connect:function(a){var b,c,d=r.height()/4,e=q.height()/2;if(a&&null!==a){var f=a(r,this);if(null===f)return;b=f.shift,c=f.height}else i%2===0?0===this.winner().id?(b=d,c=e):1===this.winner().id?(b=3*d,c=e-2*d):(b=2*d,c=e-d):0===this.winner().id?(b=3*-d,c=-e+2*d):1===this.winner().id?(b=-d,c=-e):(b=2*-d,c=-e+d);r.append(u(c,b,r,s))},winner:function(){return g(m)},loser:function(){return h(m)},first:function(){return m.a},second:function(){return m.b},setAlignCb:function(a){p=a},render:function(){q.empty(),r.empty(),m.a.name=m.a.source().name,m.b.name=m.b.source().name,m.a.idx=m.a.source().idx,m.b.idx=m.b.source().idx,g(m).name?r.removeClass("np"):r.addClass("np");var a=(Boolean(m.a.name)||""===m.a.name)&&(Boolean(m.b.name)||""===m.b.name);r.append(l(c.id,m.a,a)),r.append(l(c.id,m.b,a)),q.appendTo(c.el),q.append(r),this.el.css("height",c.bracket.el.height()/c.size()+"px"),r.css("top",this.el.height()/2-r.height()/2+"px"),null!==p&&p(r);var b="function"==typeof k?k(this):!1;b||this.connect(n);var d=j?j[2]:null;e.decorator.renderMatch(r,d)},results:function(){return[m.a.score,m.b.score]}}}function n(a){return C?Math.log(2*a)/Math.log(2):e.skipGrandFinalComeback?Math.max(2,2*(Math.log(2*a)/Math.log(2)-1)-1):2*(Math.log(2*a)/Math.log(2)-1)+1}var o,s="lr"===e.dir?"right":"left";if(!e)throw Error("Options not set");if(!e.el)throw Error("Invalid jQuery object as container");if(!e.init&&!e.save)throw Error("No bracket data or save callback given");if(void 0===e.userData&&(e.userData=null),e.decorator&&!(e.decorator.edit&&e.decorator.render&&e.decorator.renderMatch))throw Error("Invalid decorator input");e.decorator||(e.decorator={edit:k,render:l,renderMatch:m});var w;e.init||(e.init={teams:[["",""]],results:[]}),w=e.init;var x,y,z,A=a('
').appendTo(e.el.empty()),B=d(w.results,4-c(w.results));w.results=B;var C=B.length<=1;e.skipSecondaryFinal&&C&&a.error("skipSecondaryFinal setting is viable only in double elimination mode"),e.save&&v(A,w,e);var D,E,F;C?E=a('
').appendTo(A):(e.skipGrandFinalComeback||(D=a('
').appendTo(A)),E=a('
').appendTo(A),F=a('
').appendTo(A));var G=64*w.teams.length;E.css("height",G),C&&w.teams.length<=2&&!e.skipConsolationRound&&A.css("height",G+40),F&&F.css("height",E.height()/2);var H=n(w.teams.length);return e.save?A.css("width",140*H+40):A.css("width",140*H+10),x=t(E,B&&B[0]?B[0]:null,i),C||(y=t(F,B&&B[1]?B[1]:null,i),e.skipGrandFinalComeback||(z=t(D,B&&B[2]?B[2]:null,i))),p(x,w.teams,C,e.skipConsolationRound,e.skipGrandFinalComeback&&!C),C||(q(x,y,w.teams.length,e.skipGrandFinalComeback),e.skipGrandFinalComeback||r(z,x,y,e.skipSecondaryFinal,e.skipConsolationRound,A)),f(!1),{data:function(){return e.init}}},B={init:function(b){var c=a.extend(!0,{},b),d=this;c.el=this,c.save&&(c.onMatchClick||c.onMatchHover)&&a.error("Match callbacks may not be passed in edit mode (in conjunction with save callback)"),c.dir=c.dir||"lr",c.init.teams=c.init.teams&&0!==c.init.teams.length?c.init.teams:[["",""]],c.skipConsolationRound=c.skipConsolationRound||!1,c.skipSecondaryFinal=c.skipSecondaryFinal||!1,"lr"!==c.dir&&"rl"!==c.dir&&a.error('Direction must be either: "lr" or "rl"');var e=A(c);return a(this).data("bracket",{target:d,obj:e}),e},data:function(){var b=a(this).data("bracket");return b.obj.data()}};a.fn.bracket=function(b){return B[b]?B[b].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof b&&b?void a.error("Method "+b+" does not exist on jQuery.bracket"):B.init.apply(this,arguments)}}(jQuery); \ No newline at end of file diff --git a/src/jquery.bracket.ts b/src/jquery.bracket.ts index b33bc49..333cc98 100644 --- a/src/jquery.bracket.ts +++ b/src/jquery.bracket.ts @@ -91,6 +91,7 @@ interface DoneCallback { interface Decorator { edit: (span: JQuery, name: string, done_fn: DoneCallback) => void; render: (container: JQuery, team: string, score: any) => void; + renderMatch: (container: JQuery, match: string) => void; } interface InitData { @@ -226,6 +227,10 @@ interface Options { container.append(team); } + function defaultRenderMatch(container: JQuery, data: string): void { + return; + } + function winnerBubbles(match: Match): boolean { const el = match.el; const winner = el.find('.team.win'); @@ -702,11 +707,11 @@ interface Options { opts.userData = null; } - if (opts.decorator && (!opts.decorator.edit || !opts.decorator.render)) { + if (opts.decorator && (!opts.decorator.edit || !opts.decorator.render || !opts.decorator.renderMatch)) { throw Error('Invalid decorator input'); } else if (!opts.decorator) { - opts.decorator = {edit: defaultEdit, render: defaultRender}; + opts.decorator = {edit: defaultEdit, render: defaultRender, renderMatch: defaultRenderMatch}; } var data; @@ -1018,6 +1023,10 @@ interface Options { if (!isLast) { this.connect(connectorCb); } + + const matchUserData = (results ? results[2] : null); + opts.decorator.renderMatch(teamCon, matchUserData); + }, results: function() { return [match.a.score, match.b.score];