Mercurial Hosting > nabble
comparison src/nabble/view/web/util/nabbledropdown-2.4.1.js @ 0:7ecd1a4ef557
add content
| author | Franklin Schmidt <fschmidt@gmail.com> |
|---|---|
| date | Thu, 21 Mar 2019 19:15:52 -0600 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:7ecd1a4ef557 |
|---|---|
| 1 var dropdownItems = []; | |
| 2 var $visibleSubmenu = null; | |
| 3 var INTERVAL = null; | |
| 4 | |
| 5 var itemColor; | |
| 6 function getItemColor() { | |
| 7 if (!itemColor) | |
| 8 itemColor = $('span.dropdown-item').css('color'); | |
| 9 return itemColor; | |
| 10 }; | |
| 11 | |
| 12 function closeDropdowns() { | |
| 13 for (var i = 0; i < dropdownItems.length; i++) { | |
| 14 var span = $('#'+dropdownItems[i]); | |
| 15 $('table,ul', span).fadeOut("fast"); | |
| 16 } | |
| 17 $('ul.dropdown-submenu').fadeOut("fast"); | |
| 18 clearTimeout(INTERVAL); | |
| 19 $visibleSubmenu = null; | |
| 20 }; | |
| 21 | |
| 22 function dropdownUpdateLink(columnId) { | |
| 23 var row = $('#'+columnId).parent().get(); | |
| 24 _update(row); | |
| 25 }; | |
| 26 | |
| 27 function _update(row, checkdone) { | |
| 28 var $row = $(row); | |
| 29 if ($row.attr('done') && checkdone) | |
| 30 return; | |
| 31 var submenu = $row.attr('submenu')? '<img class="submenu" src="/images/submenu.gif" width=8 height=13 style="float:right;margin-top:.3em"/>':null; | |
| 32 | |
| 33 var $link = $('a', row); | |
| 34 $link.wrapInner('<span class="dropdown-item"></span>'); | |
| 35 if ($link && !$link.attr('ignore')) { | |
| 36 if (submenu) { | |
| 37 $link.css({display:'block',marginRight:'1em'}).parent().prepend(submenu); | |
| 38 } else { | |
| 39 $link | |
| 40 .css('width', '100%') | |
| 41 .css('display','block') | |
| 42 .css('color', getItemColor()); | |
| 43 } | |
| 44 } | |
| 45 $row.attr('done','y'); | |
| 46 }; | |
| 47 | |
| 48 function dropdownCleanup(id) { | |
| 49 $('#'+id).unbind().removeAttr('init'); | |
| 50 }; | |
| 51 | |
| 52 function dropdownClick(o) { | |
| 53 var $this = $(this); | |
| 54 var id = $this.attr('id'); | |
| 55 if (!$this.attr('init')) { | |
| 56 firstTime(id); | |
| 57 $this.attr('init', '1'); | |
| 58 } | |
| 59 var submenu = $(o.target).parents('tr').attr('submenu'); | |
| 60 if (submenu) { | |
| 61 o.stopPropagation(); | |
| 62 return; | |
| 63 } | |
| 64 var $t = $('table', this); | |
| 65 closeDropdowns(); | |
| 66 if (!$t.is(':visible')) { | |
| 67 var $link = $t.siblings().first(); | |
| 68 var off = $link.offset(); | |
| 69 var w = $(window).width(); | |
| 70 var left = off.left; | |
| 71 var top = off.top + $link.outerHeight(); | |
| 72 if (left + $t.outerWidth() > w) { | |
| 73 left = w - $t.outerWidth() - 10; | |
| 74 } | |
| 75 $t.css({ left: left, top: top}); | |
| 76 $t.show(function() { | |
| 77 if (left + $t.outerWidth() > w) { | |
| 78 left = w - $t.outerWidth() - 10; | |
| 79 $t.css('left', left); | |
| 80 } | |
| 81 }); | |
| 82 } | |
| 83 }; | |
| 84 | |
| 85 function dropdownInit(id) { | |
| 86 var $drop = $('#'+id); | |
| 87 $drop.unbind().click(dropdownClick); | |
| 88 }; | |
| 89 | |
| 90 function firstTime(id) { | |
| 91 var $drop = $('#'+id); | |
| 92 dropdownItems.push(id); | |
| 93 var $t = $('table', $drop); | |
| 94 var colorNormal = null; | |
| 95 var colorSelected = null; | |
| 96 | |
| 97 var $tr = $('tr', $drop); | |
| 98 $tr.each(function() { | |
| 99 if ($(this).hasClass('dropdown-separator')) | |
| 100 return; | |
| 101 _update(this); | |
| 102 var $row = $(this); | |
| 103 | |
| 104 var submenuId = $(this).attr('submenu'); | |
| 105 var $submenu = submenuId? $('#'+submenuId) : null; | |
| 106 | |
| 107 if ($submenu) { | |
| 108 $('a', $submenu) | |
| 109 .css('display','block') | |
| 110 .css('width', '100%') | |
| 111 .css('color', getItemColor()) | |
| 112 .wrapInner('<span class="dropdown-item"/>'); | |
| 113 | |
| 114 $('li',$submenu).hover( | |
| 115 function(e) { | |
| 116 if (colorSelected) $(this).css('background-color',colorSelected); | |
| 117 clearTimeout(INTERVAL); | |
| 118 e.stopPropagation(); | |
| 119 }, | |
| 120 function(e) { | |
| 121 if (colorNormal) $(this).css('background-color',colorNormal); | |
| 122 e.stopPropagation(); | |
| 123 } | |
| 124 ); | |
| 125 } | |
| 126 | |
| 127 function handleSubmenu() { | |
| 128 clearTimeout(INTERVAL); | |
| 129 if ($submenu) | |
| 130 INTERVAL = setTimeout(openSubmenu, 400); | |
| 131 else | |
| 132 INTERVAL = setTimeout(closeSubmenu, 600); | |
| 133 }; | |
| 134 | |
| 135 function openSubmenu() { | |
| 136 if ($visibleSubmenu == $submenu) | |
| 137 return; | |
| 138 closeSubmenu(); | |
| 139 $submenu.css('background-color',$t.css('background-color')); | |
| 140 var rh = $row.outerHeight(); | |
| 141 rh = rh % 2 == 0? rh : rh-1; | |
| 142 var top = $row.offset().top - rh/2; | |
| 143 var left = $t.offset().left + $t.outerWidth(); | |
| 144 if ($submenu.outerWidth() + left > $(window).width() - 20) { | |
| 145 left = $t.offset().left - $submenu.outerWidth(); | |
| 146 left = left < 0? 0 : left; | |
| 147 } | |
| 148 $submenu.css({top:top,left:left}); | |
| 149 $submenu.fadeIn('fast'); | |
| 150 $visibleSubmenu = $submenu; | |
| 151 }; | |
| 152 | |
| 153 function closeSubmenu() { | |
| 154 if ($visibleSubmenu) | |
| 155 $visibleSubmenu.fadeOut(); | |
| 156 $visibleSubmenu = null; | |
| 157 }; | |
| 158 | |
| 159 $(this).hover( | |
| 160 function(e) { | |
| 161 $(this).addClass('dark-bg-color'); | |
| 162 if (!colorSelected) colorSelected = $(this).css('background-color'); | |
| 163 handleSubmenu(); | |
| 164 e.stopPropagation(); | |
| 165 }, | |
| 166 function(e) { | |
| 167 $(this).removeClass('dark-bg-color'); | |
| 168 if (!colorNormal) colorNormal = $(this).css('background-color'); | |
| 169 e.stopPropagation(); | |
| 170 } | |
| 171 ); | |
| 172 }); | |
| 173 NabbleDropdown.showSeparators($tr.get(0)); | |
| 174 }; | |
| 175 | |
| 176 $(document).ready(function() { | |
| 177 $(document).click(function(o){ | |
| 178 var $tg = $(o.target); | |
| 179 var parents = $tg.parents('.dropdown'); | |
| 180 if (parents.size() == 0 && !$tg.hasClass('dropdown')) | |
| 181 closeDropdowns(); | |
| 182 }); | |
| 183 }); | |
| 184 | |
| 185 /* Dropdown builder */ | |
| 186 | |
| 187 function NabbleDropdown(id,linkText,linkTitle) { | |
| 188 this.id = id; | |
| 189 this.text = linkText; | |
| 190 this.title = linkTitle; | |
| 191 this.options = []; | |
| 192 this.submenus= []; | |
| 193 this.groupCounter = 0; | |
| 194 this.built = false; | |
| 195 }; | |
| 196 | |
| 197 NabbleDropdown.prototype.customButton = function(element) { | |
| 198 this.element = element; | |
| 199 }; | |
| 200 | |
| 201 NabbleDropdown.prototype.add = function(id,contents,style) { | |
| 202 var o = {id:id,contents:contents,style:style}; | |
| 203 if (this.currentGroup) { | |
| 204 var lastGroup = this.submenus.length == 0? null : this.submenus[this.submenus.length-1]; | |
| 205 if (lastGroup == null || lastGroup.id != this.currentGroup) { | |
| 206 lastGroup = {id:this.currentGroup, options: []}; | |
| 207 this.submenus.push(lastGroup); | |
| 208 } | |
| 209 lastGroup.options.push(o); | |
| 210 } else | |
| 211 this.options.push(o); | |
| 212 }; | |
| 213 | |
| 214 NabbleDropdown.prototype.addSeparator = function() { | |
| 215 this.options.push('separator'); | |
| 216 }; | |
| 217 | |
| 218 NabbleDropdown.prototype.startGroup = function(text) { | |
| 219 this.currentGroup = 'sm'+this.groupCounter; | |
| 220 this.options.push({id:this.currentGroup+'-id',contents:"<a href=\"javascript:void(0)\">"+text+"</a>",style:"display:none",submenu:this.currentGroup}); | |
| 221 this.groupCounter++; | |
| 222 }; | |
| 223 | |
| 224 NabbleDropdown.prototype.endGroup = function() { | |
| 225 this.currentGroup = null; | |
| 226 }; | |
| 227 | |
| 228 NabbleDropdown.prototype.addCustomSubmenu = function(text, boxId) { | |
| 229 this.options.push({id:boxId+'-id',contents:"<a href=\"javascript:void(0)\">"+text+"</a>",submenu:boxId}); | |
| 230 this.currentGroup = null; | |
| 231 }; | |
| 232 | |
| 233 NabbleDropdown.prototype.getHtml = function() { | |
| 234 var html = '<span id="'+this.id+'" class="dropdown">'; | |
| 235 if (this.element) | |
| 236 html += this.element; | |
| 237 else { | |
| 238 html += '<a href="javascript:void(0)"' + (this.title?' title="'+this.title+'"':'') + '>'+this.text+'</a> '; | |
| 239 html += '<img src="/images/more.png" width="10" height="10"/>'; | |
| 240 } | |
| 241 html += '<table class="light-bg-color medium-border-color drop-shadow" style="margin-top:1px;">'; | |
| 242 html += '<tr id="_loading' +this.id+'" style="display:none"><td class="dropdown-simple-row"><span id="_loadingSpan'+this.id+'">Loading...</span></td></tr>'; | |
| 243 for (var i=0; i<this.options.length;i++) { | |
| 244 var x = this.options[i]; | |
| 245 if (x == 'separator') { | |
| 246 html += '<tr class="dropdown-separator"><td class="action-separator medium-border-color"> </td></tr>'; | |
| 247 } else { | |
| 248 html += '<tr'; | |
| 249 if (x.id) html += ' id="'+x.id+'"'; | |
| 250 if (x.style) html += ' style="'+x.style+'"'; | |
| 251 if (x.submenu) html += ' submenu="'+x.submenu+'"'; | |
| 252 html += '><td style="border:none">'+x.contents+'</td></tr>'; | |
| 253 } | |
| 254 } | |
| 255 html += '</table>'; | |
| 256 for (var i=0;i<this.submenus.length;i++) { | |
| 257 var x = this.submenus[i]; | |
| 258 html += '<ul id="'+x.id+'" class="light-bg-color medium-border-color drop-shadow">'; | |
| 259 for (var j=0;j<x.options.length;j++) { | |
| 260 var y = x.options[j]; | |
| 261 html += '<li'; | |
| 262 if (y.id) html += ' id="'+y.id+'"'; | |
| 263 if (y.style) html += ' style="'+y.style+'"'; | |
| 264 html += '>'+y.contents+'</li>'; | |
| 265 } | |
| 266 html += '</ul>'; | |
| 267 } | |
| 268 html += '</span>'; | |
| 269 return html; | |
| 270 }; | |
| 271 | |
| 272 NabbleDropdown.prototype.build = function(elemId) { | |
| 273 $('#'+elemId).html(this.getHtml()); | |
| 274 dropdownInit(this.id); | |
| 275 }; | |
| 276 | |
| 277 NabbleDropdown.prototype.loadingAnimation = function(id,action) { | |
| 278 var $span = $('#_loadingSpan'+id); | |
| 279 if (action == 'start') { | |
| 280 NabbleDropdown.show('_loading'+id); | |
| 281 function loading1() { $span.fadeTo(300,0.3,loading2); }; | |
| 282 function loading2() { $span.fadeTo(300,1,loading1); }; | |
| 283 loading1(); | |
| 284 } else { | |
| 285 NabbleDropdown.hide('_loading'+id); | |
| 286 $span.stop(); | |
| 287 } | |
| 288 }; | |
| 289 | |
| 290 NabbleDropdown.prototype.loadOnClick = function(scriptUrl) { | |
| 291 var _this = this; | |
| 292 var id = this.id; | |
| 293 var hasRequested = false; | |
| 294 var $drop = $('#'+this.id); | |
| 295 $drop.mouseover(function() { | |
| 296 if (!hasRequested) { | |
| 297 hasRequested = true; | |
| 298 _this.loadingAnimation(id, 'start'); | |
| 299 $.getScript(scriptUrl, function() { | |
| 300 _this.loadingAnimation(id, 'stop'); | |
| 301 }); | |
| 302 } | |
| 303 }); | |
| 304 }; | |
| 305 | |
| 306 NabbleDropdown.show = function(id) { | |
| 307 var e = document.getElementById(id); | |
| 308 if (e.nodeName == 'LI') { | |
| 309 e.style.display = 'list-item'; | |
| 310 var p = document.getElementById(e.parentNode['id']+'-id'); | |
| 311 p.style.display = $.browser.msie?'block':'table-row'; | |
| 312 NabbleDropdown.showSeparators(p); | |
| 313 } else { | |
| 314 e.style.display = $.browser.msie?'block':'table-row'; | |
| 315 NabbleDropdown.showSeparators(e); | |
| 316 } | |
| 317 }; | |
| 318 | |
| 319 NabbleDropdown.hide = function(id) { | |
| 320 var e = document.getElementById(id); | |
| 321 e.style.display = 'none'; | |
| 322 NabbleDropdown.showSeparators(e); | |
| 323 }; | |
| 324 | |
| 325 NabbleDropdown.showSeparators = function(e) { | |
| 326 while (e.previousSibling) | |
| 327 e = e.previousSibling; | |
| 328 var separators = []; | |
| 329 while (e) { | |
| 330 if (e.nodeName != 'TR') return; | |
| 331 if (e.className == 'dropdown-separator') | |
| 332 separators.push(e); | |
| 333 else if (e.style.display != 'none') | |
| 334 separators.push('X'); | |
| 335 e = e.nextSibling; | |
| 336 } | |
| 337 for (var i=0; i<separators.length;i++) { | |
| 338 if (typeof separators[i] != 'string') { | |
| 339 var prev = i > 0 && separators[i-1] == 'X'; | |
| 340 var next = i < separators.length-1 && separators[i+1] == 'X'; | |
| 341 if (next && prev) { | |
| 342 separators[i].style.display = $.browser.msie?'block':'table-row'; | |
| 343 } | |
| 344 } | |
| 345 } | |
| 346 }; | |
| 347 | |
| 348 NabbleDropdown.addContents = function(id,contents) { | |
| 349 var $row = $('#'+id); | |
| 350 $row.html('<td>'+contents+'</td>').show(); | |
| 351 _update($row.get(),false); | |
| 352 }; | |
| 353 | |
| 354 NabbleDropdown.replaceContents = function(id,contents) { | |
| 355 $('#'+id).html('<td class="dropdown-simple-row">'+contents+'</td>'); | |
| 356 }; |
