##// END OF EJS Templates
rhodecode.js: more jQuery and general cleanup...
Mads Kiilerich -
r4160:4451b2ea rhodecode-2.2.5-gpl
parent child Browse files
Show More
@@ -3132,7 +3132,7 table.code-browser .submodule-dir {
3132 }
3132 }
3133
3133
3134 .hl-tip-box {
3134 .hl-tip-box {
3135 visibility: hidden;
3135 z-index: 1;
3136 position: absolute;
3136 position: absolute;
3137 color: #666;
3137 color: #666;
3138 background-color: #FFF;
3138 background-color: #FFF;
This diff has been collapsed as it changes many lines, (1083 lines changed) Show them Hide them
@@ -70,17 +70,6 if(!Array.prototype.indexOf) {
70 };
70 };
71 }
71 }
72
72
73 // IE(CRAP) doesn't support previousElementSibling
74 var prevElementSibling = function( el ) {
75 if( el.previousElementSibling ) {
76 return el.previousElementSibling;
77 } else {
78 while( el = el.previousSibling ) {
79 if( el.nodeType === 1 ) return el;
80 }
81 }
82 }
83
84 /**
73 /**
85 * A customized version of PyRoutes.JS from https://pypi.python.org/pypi/pyroutes.js/
74 * A customized version of PyRoutes.JS from https://pypi.python.org/pypi/pyroutes.js/
86 * which is copyright Stephane Klein and was made available under the BSD License.
75 * which is copyright Stephane Klein and was made available under the BSD License.
@@ -273,6 +262,7 var YUD = YAHOO.util.Dom;
273 var YUE = YAHOO.util.Event;
262 var YUE = YAHOO.util.Event;
274 var YUQ = YAHOO.util.Selector.query;
263 var YUQ = YAHOO.util.Selector.query;
275
264
265 /* Invoke all functions in callbacks */
276 var _run_callbacks = function(callbacks){
266 var _run_callbacks = function(callbacks){
277 if (callbacks !== undefined){
267 if (callbacks !== undefined){
278 var _l = callbacks.length;
268 var _l = callbacks.length;
@@ -290,7 +280,7 var _run_callbacks = function(callbacks)
290 /**
280 /**
291 * turns objects into GET query string
281 * turns objects into GET query string
292 */
282 */
293 var toQueryString = function(o) {
283 var _toQueryString = function(o) {
294 if(typeof o !== 'object') {
284 if(typeof o !== 'object') {
295 return false;
285 return false;
296 }
286 }
@@ -323,6 +313,7 function ypjax(url,container,s_call,f_ca
323 if(args===undefined){
313 if(args===undefined){
324 args=null;
314 args=null;
325 }
315 }
316 $container = $('#' + container);
326
317
327 // Set special header for partial ajax == HTTP_X_PARTIAL_XHR
318 // Set special header for partial ajax == HTTP_X_PARTIAL_XHR
328 YUC.initHeader('X-PARTIAL-XHR',true);
319 YUC.initHeader('X-PARTIAL-XHR',true);
@@ -330,21 +321,21 function ypjax(url,container,s_call,f_ca
330 // wrapper of passed callback
321 // wrapper of passed callback
331 var s_wrapper = (function(o){
322 var s_wrapper = (function(o){
332 return function(o){
323 return function(o){
333 YUD.get(container).innerHTML=o.responseText;
324 $container.html(o.responseText);
334 YUD.setStyle(container,'opacity','1.0');
325 $container.css('opacity','1.0');
335 //execute the given original callback
326 //execute the given original callback
336 if (s_call !== undefined){
327 if (s_call !== undefined){
337 s_call(o);
328 s_call(o);
338 }
329 }
339 }
330 }
340 })()
331 })()
341 YUD.setStyle(container,'opacity','0.3');
332 $container.css('opacity','0.3');
342 YUC.asyncRequest(method,url,{
333 YUC.asyncRequest(method,url,{
343 success:s_wrapper,
334 success:s_wrapper,
344 failure:function(o){
335 failure:function(o){
345 console.log(o);
336 console.log('ypjax failure: '+o);
346 YUD.get(container).innerHTML='<span class="error_red">ERROR: {0}</span>'.format(o.status);
337 $container.html('<span class="error_red">ERROR: {0}</span>'.format(o.status));
347 YUD.setStyle(container,'opacity','1.0');
338 $container.css('opacity','1.0');
348 },
339 },
349 cache:false
340 cache:false
350 },args);
341 },args);
@@ -380,91 +371,78 var ajaxPOST = function(url,postData,suc
380 alert("error");
371 alert("error");
381 },
372 },
382 };
373 };
383 var postData = toQueryString(postData);
374 var postData = _toQueryString(postData);
384 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
375 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
385 return request;
376 return request;
386 };
377 };
387
378
388
379
389 /**
380 /**
390 * tooltip activate
381 * activate .show_more links
391 */
382 * the .show_more must have an id that is the the id of an element to hide prefixed with _
392 var tooltip_activate = function(){
383 * the parentnode will be displayed
393 yt = YAHOO.yuitip.main;
394 YUE.onDOMReady(yt.init);
395 };
396
397 /**
398 * show more
399 */
384 */
400 var show_more_event = function(){
385 var show_more_event = function(){
401 YUE.on(YUD.getElementsByClassName('show_more'),'click',function(e){
386 $('.show_more').click(function(e){
402 var el = e.target;
387 var el = e.currentTarget;
403 YUD.setStyle(YUD.get(el.id.substring(1)),'display','');
388 $('#' + el.id.substring(1)).hide();
404 YUD.setStyle(el.parentNode,'display','none');
389 $(el.parentNode).show();
405 });
390 });
406 };
391 };
407
392
408 /**
393 /**
409 * show changeset tooltip
394 * activate .lazy-cs mouseover for showing changeset tooltip
410 */
395 */
411 var show_changeset_tooltip = function(){
396 var show_changeset_tooltip = function(){
412 YUE.on(YUD.getElementsByClassName('lazy-cs'), 'mouseover', function(e){
397 $('.lazy-cs').mouseover(function(e){
413 var target = e.currentTarget;
398 var $target = $(e.currentTarget);
414 var rid = YUD.getAttribute(target,'raw_id');
399 var rid = $target.attr('raw_id');
415 var repo_name = YUD.getAttribute(target,'repo_name');
400 var repo_name = $target.attr('repo_name');
416 var ttid = 'tt-'+rid;
401 if(rid && !$target.hasClass('tooltip')){
417 var success = function(o){
402 _show_tooltip(e, _TM['loading ...']);
418 var json = JSON.parse(o.responseText);
403 var url = pyroutes.url('changeset_info', {"repo_name": repo_name, "revision": rid});
419 YUD.addClass(target,'tooltip')
404 ajaxGET(url, function(o){
420 YUD.setAttribute(target, 'title',json['message']);
405 var json = JSON.parse(o.responseText);
421 YAHOO.yuitip.main.show_yuitip(e, target);
406 $target.addClass('tooltip')
422 }
407 _show_tooltip(e, json['message']);
423 if(rid && !YUD.hasClass(target, 'tooltip')){
408 _activate_tooltip($target);
424 YUD.setAttribute(target,'id',ttid);
409 });
425 YUD.setAttribute(target, 'title',_TM['loading ...']);
426 YAHOO.yuitip.main.set_listeners(target);
427 YAHOO.yuitip.main.show_yuitip(e, target);
428 var url = pyroutes.url('changeset_info', {"repo_name":repo_name, "revision": rid});
429 ajaxGET(url, success)
430 }
410 }
431 });
411 });
432 };
412 };
433
413
434 var onSuccessFollow = function(target){
414 var _onSuccessFollow = function(target){
435 var f = YUD.get(target);
415 var $target = $(target);
436 var f_cnt = YUD.get('current_followers_count');
416 var $f_cnt = $('#current_followers_count');
437
417 if($target.hasClass('follow')){
438 if(YUD.hasClass(f, 'follow')){
418 $target.attr('class', 'following');
439 f.setAttribute('class','following');
419 $target.attr('title', _TM['Stop following this repository']);
440 f.setAttribute('title',_TM['Stop following this repository']);
420 if($f_cnt.html()){
441
421 var cnt = Number($f_cnt.html())+1;
442 if(f_cnt){
422 $f_cnt.html(cnt);
443 var cnt = Number(f_cnt.innerHTML)+1;
444 f_cnt.innerHTML = cnt;
445 }
423 }
446 }
424 }
447 else{
425 else{
448 f.setAttribute('class','follow');
426 $target.attr('class', 'follow');
449 f.setAttribute('title',_TM['Start following this repository']);
427 $target.attr('title', _TM['Start following this repository']);
450 if(f_cnt){
428 if($f_cnt.html()){
451 var cnt = Number(f_cnt.innerHTML)-1;
429 var cnt = Number($f_cnt.html())-1;
452 f_cnt.innerHTML = cnt;
430 $f_cnt.html(cnt);
453 }
431 }
454 }
432 }
455 }
433 }
456
434
457 var toggleFollowingRepo = function(target,fallows_repo_id,token,user_id){
435 var toggleFollowingRepo = function(target, follows_repo_id, token, user_id){
458 args = 'follows_repo_id='+fallows_repo_id;
436 args = 'follows_repo_id='+follows_repo_id;
459 args+= '&amp;auth_token='+token;
437 args+= '&amp;auth_token='+token;
460 if(user_id != undefined){
438 if(user_id != undefined){
461 args+="&amp;user_id="+user_id;
439 args+="&amp;user_id="+user_id;
462 }
440 }
463 $.post(TOGGLE_FOLLOW_URL, args, function(data){
441 $.post(TOGGLE_FOLLOW_URL, args, function(data){
464 onSuccessFollow(target);
442 _onSuccessFollow(target);
465 });
443 });
466 return false;
444 return false;
467 }
445 };
468
446
469 var showRepoSize = function(target, repo_name, token){
447 var showRepoSize = function(target, repo_name, token){
470 var args= 'auth_token='+token;
448 var args= 'auth_token='+token;
@@ -478,113 +456,73 var showRepoSize = function(target, repo
478 });
456 });
479 }
457 }
480 return false;
458 return false;
481 }
459 };
482
460
483 /**
461 /**
484 * TOOLTIP IMPL.
462 * tooltips
485 */
463 */
486 YAHOO.namespace('yuitip');
487 YAHOO.yuitip.main = {
488
489 $: YAHOO.util.Dom.get,
490
464
491 bgColor: '#000',
465 var tooltip_activate = function(){
492 speed: 0.3,
466 $(document).ready(_init_tooltip);
493 opacity: 0.9,
467 };
494 offset: [15,15],
495 useAnim: false,
496 maxWidth: 600,
497 add_links: false,
498 yuitips: [],
499
468
500 set_listeners: function(tt){
469 var _activate_tooltip = function($tt){
501 YUE.on(tt, 'mouseover', yt.show_yuitip, tt);
470 $tt.mouseover(_show_tooltip);
502 YUE.on(tt, 'mousemove', yt.move_yuitip, tt);
471 $tt.mousemove(_move_tooltip);
503 YUE.on(tt, 'mouseout', yt.close_yuitip, tt);
472 $tt.mouseout(_close_tooltip);
504 },
473 };
505
474
506 init: function(){
475 var _init_tooltip = function(){
507 yt.tipBox = yt.$('tip-box');
476 var $tipBox = $('#tip-box');
508 if(!yt.tipBox){
477 if(!$tipBox.length){
509 yt.tipBox = document.createElement('div');
478 $tipBox = $('<div id="tip-box"></div>')
510 document.body.appendChild(yt.tipBox);
479 $(document.body).append($tipBox);
511 yt.tipBox.id = 'tip-box';
480 }
512 }
513
481
514 YUD.setStyle(yt.tipBox, 'display', 'none');
482 $tipBox.hide();
515 YUD.setStyle(yt.tipBox, 'position', 'absolute');
483 $tipBox.css('position', 'absolute');
516 if(yt.maxWidth !== null){
484 $tipBox.css('max-width', '600px');
517 YUD.setStyle(yt.tipBox, 'max-width', yt.maxWidth+'px');
518 }
519
520 var yuitips = YUD.getElementsByClassName('tooltip');
521
485
522 if(yt.add_links === true){
486 _activate_tooltip($('.tooltip'));
523 var links = document.getElementsByTagName('a');
487 };
524 var linkLen = links.length;
525 for(i=0;i<linkLen;i++){
526 yuitips.push(links[i]);
527 }
528 }
529
530 var yuiLen = yuitips.length;
531
488
532 for(i=0;i<yuiLen;i++){
489 var _show_tooltip = function(e, tipText){
533 yt.set_listeners(yuitips[i]);
490 e.stopImmediatePropagation();
534 }
491 var el = e.currentTarget;
535 },
492 if(tipText){
493 // just use it
494 } else if(el.tagName.toLowerCase() === 'img'){
495 tipText = el.alt ? el.alt : '';
496 } else {
497 tipText = el.title ? el.title : '';
498 }
536
499
537 show_yuitip: function(e, el){
500 if(tipText !== ''){
538 YUE.stopEvent(e);
501 // save org title
539 if(el.tagName.toLowerCase() === 'img'){
502 $(el).attr('tt_title', tipText);
540 yt.tipText = el.alt ? el.alt : '';
503 // reset title to not show org tooltips
541 } else {
504 $(el).attr('title', '');
542 yt.tipText = el.title ? el.title : '';
543 }
544
545 if(yt.tipText !== ''){
546 // save org title
547 YUD.setAttribute(el, 'tt_title', yt.tipText);
548 // reset title to not show org tooltips
549 YUD.setAttribute(el, 'title', '');
550
505
551 yt.tipBox.innerHTML = yt.tipText;
506 var $tipBox = $('#tip-box');
552 YUD.setStyle(yt.tipBox, 'display', 'block');
507 $tipBox.html(tipText);
553 if(yt.useAnim === true){
508 $tipBox.css('display', 'block');
554 YUD.setStyle(yt.tipBox, 'opacity', '0');
509 }
555 var newAnim = new YAHOO.util.Anim(yt.tipBox,
510 };
556 {
557 opacity: { to: yt.opacity }
558 }, yt.speed, YAHOO.util.Easing.easeOut
559 );
560 newAnim.animate();
561 }
562 }
563 },
564
511
565 move_yuitip: function(e, el){
512 var _move_tooltip = function(e){
566 YUE.stopEvent(e);
513 e.stopImmediatePropagation();
567 var movePos = YUE.getXY(e);
514 var $tipBox = $('#tip-box');
568 YUD.setStyle(yt.tipBox, 'top', (movePos[1] + yt.offset[1]) + 'px');
515 $tipBox.css('top', (e.pageY + 15) + 'px');
569 YUD.setStyle(yt.tipBox, 'left', (movePos[0] + yt.offset[0]) + 'px');
516 $tipBox.css('left', (e.pageX + 15) + 'px');
570 },
517 };
571
572 close_yuitip: function(e, el){
573 YUE.stopEvent(e);
574
518
575 if(yt.useAnim === true){
519 var _close_tooltip = function(e){
576 var newAnim = new YAHOO.util.Anim(yt.tipBox,
520 e.stopImmediatePropagation();
577 {
521 var $tipBox = $('#tip-box');
578 opacity: { to: 0 }
522 $tipBox.hide();
579 }, yt.speed, YAHOO.util.Easing.easeOut
523 var el = e.currentTarget;
580 );
524 $(el).attr('title', $(el).attr('tt_title'));
581 newAnim.animate();
525 };
582 } else {
583 YUD.setStyle(yt.tipBox, 'display', 'none');
584 }
585 YUD.setAttribute(el,'title', YUD.getAttribute(el, 'tt_title'));
586 }
587 }
588
526
589 /**
527 /**
590 * Quick filter widget
528 * Quick filter widget
@@ -593,142 +531,109 YAHOO.yuitip.main = {
593 * @param nodes: list of nodes in html we want to filter.
531 * @param nodes: list of nodes in html we want to filter.
594 * @param display_element function that takes current node from nodes and
532 * @param display_element function that takes current node from nodes and
595 * does hide or show based on the node
533 * does hide or show based on the node
596 *
597 */
534 */
598 var q_filter = function(target,nodes,display_element){
535 var q_filter = function(target, nodes, display_element){
599
600 var nodes = nodes;
536 var nodes = nodes;
601 var q_filter_field = YUD.get(target);
537 var $q_filter_field = $('#' + target);
602 var F = YAHOO.namespace(target);
538 var F = YAHOO.namespace(target);
603
539
604 YUE.on(q_filter_field,'keyup',function(e){
540 $q_filter_field.keyup(function(e){
605 clearTimeout(F.filterTimeout);
541 clearTimeout(F.filterTimeout);
606 F.filterTimeout = setTimeout(F.updateFilter,600);
542 F.filterTimeout = setTimeout(F.updateFilter, 600);
607 });
543 });
608
544
609 F.filterTimeout = null;
545 F.filterTimeout = null;
610
546
611 var show_node = function(node){
612 YUD.setStyle(node,'display','')
613 }
614 var hide_node = function(node){
615 YUD.setStyle(node,'display','none');
616 }
617
618 F.updateFilter = function() {
547 F.updateFilter = function() {
619 // Reset timeout
548 // Reset timeout
620 F.filterTimeout = null;
549 F.filterTimeout = null;
621
550
622 var obsolete = [];
551 var obsolete = [];
623
552
624 var req = q_filter_field.value.toLowerCase();
553 var req = $q_filter_field.val().toLowerCase();
625
554
626 var l = nodes.length;
555 var l = nodes.length;
627 var i;
556 var i;
628 var showing = 0;
557 var showing = 0;
629
558
630 for (i=0;i<l;i++ ){
559 for (i=0; i<l; i++ ){
631 var n = nodes[i];
560 var n = nodes[i];
632 var target_element = display_element(n)
561 var target_element = display_element(n)
633 if(req && n.innerHTML.toLowerCase().indexOf(req) == -1){
562 if(req && n.innerHTML.toLowerCase().indexOf(req) == -1){
634 hide_node(target_element);
563 $(target_element).hide();
635 }
564 }
636 else{
565 else{
637 show_node(target_element);
566 $(target_element).show();
638 showing+=1;
567 showing += 1;
639 }
568 }
640 }
569 }
641
570
642 // if repo_count is set update the number
571 $('#repo_count').html(showing); /* FIXME: don't hardcode */
643 var cnt = YUD.get('repo_count');
644 if(cnt){
645 YUD.get('repo_count').innerHTML = showing;
646 }
647 }
572 }
648 };
573 };
649
574
650 var tableTr = function(cls, body){
575 /* return jQuery expression with a tr with body in 3rd column and class cls and id named after the body */
651 var _el = document.createElement('div');
576 var _table_tr = function(cls, body){
652 var cont = new YAHOO.util.Element(body);
577 // like: <div class="comment" id="comment-8" line="o92"><div class="comment-wrapp">...
653 var comment_id = fromHTML(body).children[0].id.split('comment-')[1];
578 // except new inlines which are different ...
654 var id = 'comment-tr-{0}'.format(comment_id);
579 var comment_id = ($(body).attr('id') || 'comment-new').split('comment-')[1];
655 var _html = ('<table><tbody><tr id="{0}" class="{1}">'+
580 var tr_id = 'comment-tr-{0}'.format(comment_id);
581 return $(('<tr id="{0}" class="{1}">'+
656 '<td class="lineno-inline new-inline"></td>'+
582 '<td class="lineno-inline new-inline"></td>'+
657 '<td class="lineno-inline old-inline"></td>'+
583 '<td class="lineno-inline old-inline"></td>'+
658 '<td>{2}</td>'+
584 '<td>{2}</td>'+
659 '</tr></tbody></table>').format(id, cls, body);
585 '</tr>').format(tr_id, cls, body));
660 _el.innerHTML = _html;
661 return _el.children[0].children[0].children[0];
662 };
586 };
663
587
664 var createInlineForm = function(parent_tr, f_path, line) {
588 /** return jQuery expression with new inline form based on template **/
665 var tmpl = $('#comment-inline-form-template').html();
589 var _createInlineForm = function(parent_tr, f_path, line) {
666 tmpl = tmpl.format(f_path, line);
590 var $tmpl = $('#comment-inline-form-template').html().format(f_path, line);
667 var form = tableTr('comment-form-inline',tmpl)
591 var $form = _table_tr('comment-form-inline', $tmpl)
668
592
669 // create event for hide button
593 // create event for hide button
670 form = new YAHOO.util.Element(form);
594 $form.find('.hide-inline-form').click(function(e) {
671 var form_hide_button = new YAHOO.util.Element(YUD.getElementsByClassName('hide-inline-form',null,form)[0]);
672 form_hide_button.on('click', function(e) {
673 var newtr = e.currentTarget.parentNode.parentNode.parentNode.parentNode.parentNode;
595 var newtr = e.currentTarget.parentNode.parentNode.parentNode.parentNode.parentNode;
674 if(YUD.hasClass(newtr.nextElementSibling,'inline-comments-button')){
596 if($(newtr).next().hasClass('inline-comments-button')){
675 YUD.setStyle(newtr.nextElementSibling,'display','');
597 $(newtr).next().show();
676 }
598 }
677 removeInlineForm(newtr);
599 $(newtr).remove();
678 YUD.removeClass(parent_tr, 'form-open');
600 $(parent_tr).removeClass('form-open');
679 YUD.removeClass(parent_tr, 'hl-comment');
601 $(parent_tr).removeClass('hl-comment');
680
681 });
602 });
682
603
683 return form
604 return $form
684 };
605 };
685
606
686 /**
607 /**
687 * Inject inline comment for on given TR this tr should be always an .line
608 * Inject inline comment for an given TR. This tr should always be a .line .
688 * tr containing the line. Code will detect comment, and always put the comment
609 * The form will be inject after any comments.
689 * block at the very bottom
690 */
610 */
691 var injectInlineForm = function(tr){
611 var injectInlineForm = function(tr){
692 if(!$(tr).hasClass('line')){
612 $tr = $(tr);
613 if(!$tr.hasClass('line')){
693 return
614 return
694 }
615 }
695 var submit_url = AJAX_COMMENT_URL;
616 var submit_url = AJAX_COMMENT_URL;
696 var _td = YUD.getElementsByClassName('code',null,tr)[0];
617 var $td = $tr.find('.code');
697 if($(tr).hasClass('form-open') || $(tr).hasClass('context') || $(_td).hasClass('no-comment')){
618 if($tr.hasClass('form-open') || $tr.hasClass('context') || $td.hasClass('no-comment')){
698 return
619 return
699 }
620 }
700 $(tr).addClass('form-open hl-comment');
621 $tr.addClass('form-open hl-comment');
701 var node = YUD.getElementsByClassName('full_f_path',null,tr.parentNode.parentNode.parentNode)[0];
622 var $node = $tr.parent().parent().parent().find('.full_f_path');
702 var f_path = YUD.getAttribute(node,'path');
623 var f_path = $node.attr('path');
703 var lineno = getLineNo(tr);
624 var lineno = _getLineNo(tr);
704 var form = createInlineForm(tr, f_path, lineno, submit_url);
625 var $form = _createInlineForm(tr, f_path, lineno, submit_url);
705
626
706 var parent = tr;
627 var $parent = $tr;
707 while (1){
628 while ($parent.next().hasClass('inline-comments')){
708 var n = parent.nextElementSibling;
629 var $parent = $parent.next();
709 // next element are comments !
710 if($(n).hasClass('inline-comments')){
711 parent = n;
712 }
713 else{
714 break;
715 }
716 }
630 }
717 YUD.insertAfter(form,parent);
631 $form.insertAfter($parent);
718 var f = YUD.get(form);
632 var $overlay = $form.find('.overlay');
719 var overlay = YUD.getElementsByClassName('overlay',null,f)[0];
633 var $inlineform = $form.find('.inline-form');
720 var _form = YUD.getElementsByClassName('inline-form',null,f)[0];
721
722 YUE.on(YUD.get(_form), 'submit',function(e){
723 YUE.preventDefault(e);
724
634
725 //ajax submit
635 $form.submit(function(e){
726 var text = YUD.get('text_'+lineno).value;
636 e.preventDefault();
727 var postData = {
728 'text':text,
729 'f_path':f_path,
730 'line':lineno
731 };
732
637
733 if(lineno === undefined){
638 if(lineno === undefined){
734 alert('missing line !');
639 alert('missing line !');
@@ -739,48 +644,51 var injectInlineForm = function(tr){
739 return
644 return
740 }
645 }
741
646
647 var text = $('#text_'+lineno).val();
742 if(text == ""){
648 if(text == ""){
743 return
649 return
744 }
650 }
745
651
746 var success = function(o){
652 if ($overlay.hasClass('overlay')){
747 YUD.removeClass(tr, 'form-open');
653 $overlay.css('width', $inlineform.offsetWidth + 'px');
748 removeInlineForm(f);
654 $overlay.css('height', $inlineform.offsetHeight + 'px');
749 var json_data = JSON.parse(o.responseText);
655 }
750 renderInlineComment(json_data);
656 $overlay.addClass('submitting');
751 };
752
657
753 if (YUD.hasClass(overlay,'overlay')){
658 var success = function(o){
754 var w = _form.offsetWidth;
659 $tr.removeClass('form-open');
755 var h = _form.offsetHeight;
660 $form.remove();
756 YUD.setStyle(overlay,'width',w+'px');
661 var json_data = JSON.parse(o.responseText);
757 YUD.setStyle(overlay,'height',h+'px');
662 _renderInlineComment(json_data);
758 }
663 };
759 YUD.addClass(overlay, 'submitting');
664 var postData = {
760
665 'text': text,
666 'f_path': f_path,
667 'line': lineno
668 };
761 ajaxPOST(submit_url, postData, success);
669 ajaxPOST(submit_url, postData, success);
762 });
670 });
763
671
764 YUE.on('preview-btn_'+lineno, 'click', function(e){
672 $('#preview-btn_'+lineno).click(function(e){
765 var _text = YUD.get('text_'+lineno).value;
673 var text = $('#text_'+lineno).val();
766 if(!_text){
674 if(!text){
767 return
675 return
768 }
676 }
769 var post_data = {'text': _text};
677 $('#preview-box_'+lineno).addClass('unloaded');
770 YUD.addClass('preview-box_'+lineno, 'unloaded');
678 $('#preview-box_'+lineno).html(_TM['Loading ...']);
771 YUD.get('preview-box_'+lineno).innerHTML = _TM['Loading ...'];
679 $('#edit-container_'+lineno).hide();
772 YUD.setStyle('edit-container_'+lineno, 'display', 'none');
680 $('#preview-container_'+lineno).show();
773 YUD.setStyle('preview-container_'+lineno, 'display', '');
774
681
775 var url = pyroutes.url('changeset_comment_preview', {'repo_name': REPO_NAME});
682 var url = pyroutes.url('changeset_comment_preview', {'repo_name': REPO_NAME});
776 ajaxPOST(url,post_data,function(o){
683 var post_data = {'text': text};
777 YUD.get('preview-box_'+lineno).innerHTML = o.responseText;
684 ajaxPOST(url, post_data, function(o){
778 YUD.removeClass('preview-box_'+lineno, 'unloaded');
685 $('#preview-box_'+lineno).html(o.responseText);
686 $('#preview-box_'+lineno).removeClass('unloaded');
779 })
687 })
780 })
688 })
781 YUE.on('edit-btn_'+lineno, 'click', function(e){
689 $('#edit-btn_'+lineno).click(function(e){
782 YUD.setStyle('edit-container_'+lineno, 'display', '');
690 $('#edit-container_'+lineno).show();
783 YUD.setStyle('preview-container_'+lineno, 'display', 'none');
691 $('#preview-container_'+lineno).hide();
784 })
692 })
785
693
786 setTimeout(function(){
694 setTimeout(function(){
@@ -788,10 +696,7 var injectInlineForm = function(tr){
788 tooltip_activate();
696 tooltip_activate();
789 MentionsAutoComplete('text_'+lineno, 'mentions_container_'+lineno,
697 MentionsAutoComplete('text_'+lineno, 'mentions_container_'+lineno,
790 _USERS_AC_DATA, _GROUPS_AC_DATA);
698 _USERS_AC_DATA, _GROUPS_AC_DATA);
791 var _e = YUD.get('text_'+lineno);
699 $('#text_'+lineno).focus();
792 if(_e){
793 _e.focus();
794 }
795 },10)
700 },10)
796 };
701 };
797
702
@@ -799,38 +704,18 var deleteComment = function(comment_id)
799 var url = AJAX_COMMENT_DELETE_URL.replace('__COMMENT_ID__',comment_id);
704 var url = AJAX_COMMENT_DELETE_URL.replace('__COMMENT_ID__',comment_id);
800 var postData = {'_method':'delete'};
705 var postData = {'_method':'delete'};
801 var success = function(o){
706 var success = function(o){
802 var n = YUD.get('comment-tr-'+comment_id);
707 var $deleted = $('#comment-tr-'+comment_id);
803 var root = prevElementSibling(prevElementSibling(n));
708 var $prev = $deleted.prev('tr');
804 n.parentNode.removeChild(n);
709 $deleted.remove();
805
710 _placeAddButton($prev);
806 // scann nodes, and attach add button to last one only for TR
807 // which are the inline comments
808 if(root && root.tagName == 'TR'){
809 placeAddButton(root);
810 }
811 }
711 }
812 ajaxPOST(url,postData,success);
712 ajaxPOST(url,postData,success);
813 }
713 }
814
714
815 var createInlineAddButton = function(tr){
715 var _getLineNo = function(tr) {
816
817 var label = TRANSLATION_MAP['Add another comment'];
818
819 var html_el = document.createElement('div');
820 YUD.addClass(html_el, 'add-comment');
821 html_el.innerHTML = '<span class="ui-btn">{0}</span>'.format(label);
822
823 var add = new YAHOO.util.Element(html_el);
824 add.on('click', function(e) {
825 injectInlineForm(tr);
826 });
827 return add;
828 };
829
830 var getLineNo = function(tr) {
831 var line;
716 var line;
832 var o = tr.children[0].id.split('_');
717 var o = $(tr).children()[0].id.split('_');
833 var n = tr.children[1].id.split('_');
718 var n = $(tr).children()[1].id.split('_');
834
719
835 if (n.length >= 2) {
720 if (n.length >= 2) {
836 line = n[n.length-1];
721 line = n[n.length-1];
@@ -841,78 +726,48 var getLineNo = function(tr) {
841 return line
726 return line
842 };
727 };
843
728
844 var placeAddButton = function(target_tr){
729 var _placeAddButton = function($line_tr){
845 if(!target_tr){
730 var $tr = $line_tr;
846 return
731 while ($tr.next().hasClass('inline-comments')){
732 $tr.find('.add-comment').remove();
733 $tr = $tr.next();
847 }
734 }
848 var last_node = target_tr;
735 $tr.find('.add-comment').remove();
849 //scann
736 var label = TRANSLATION_MAP['Add another comment'];
850 while (1){
737 var $html_el = $('<div class="add-comment"><span class="ui-btn">{0}</span></div>'.format(label));
851 var n = last_node.nextElementSibling;
738 $html_el.click(function(e) {
852 // next element are comments !
739 injectInlineForm($line_tr);
853 if($(n).hasClass('inline-comments')){
740 });
854 last_node = n;
741 $tr.find('.comment').after($html_el);
855 //also remove the comment button from previous
742 };
856 var comment_add_buttons = YUD.getElementsByClassName('add-comment',null,last_node);
857 for(var i=0;i<comment_add_buttons.length;i++){
858 var b = comment_add_buttons[i];
859 b.parentNode.removeChild(b);
860 }
861 }
862 else{
863 break;
864 }
865 }
866
867 var add = createInlineAddButton(target_tr);
868 // get the comment div
869 var comment_block = YUD.getElementsByClassName('comment',null,last_node)[0];
870 // attach add button
871 YUD.insertAfter(add,comment_block);
872 }
873
743
874 /**
744 /**
875 * Places the inline comment into the changeset block in proper line position
745 * Places the inline comment into the changeset block in proper line position
876 */
746 */
877 var placeInline = function(target_container,lineno,html){
747 var _placeInline = function(target_id, lineno, html){
878 var lineid = "{0}_{1}".format(target_container,lineno);
748 var $td = $("#{0}_{1}".format(target_id, lineno));
879 var target_line = YUD.get(lineid);
880 var comment = new YAHOO.util.Element(tableTr('inline-comments',html))
881
749
882 // check if there are comments already !
750 // check if there are comments already !
883 var parent = target_line.parentNode;
751 var $line_tr = $td.parent(); // the tr
884 var root_parent = parent;
752 var $after_tr = $line_tr;
885 while (1){
753 while ($after_tr.next().hasClass('inline-comments')){
886 var n = parent.nextElementSibling;
754 $after_tr = $after_tr.next();
887 // next element are comments !
888 if($(n).hasClass('inline-comments')){
889 parent = n;
890 }
891 else{
892 break;
893 }
894 }
755 }
895 // put in the comment at the bottom
756 // put in the comment at the bottom
896 YUD.insertAfter(comment,parent);
757 $after_tr.after(_table_tr('inline-comments', html));
897
758
898 // scann nodes, and attach add button to last one
759 // scan nodes, and attach add button to last one
899 placeAddButton(root_parent);
760 _placeAddButton($line_tr);
900
901 return target_line;
902 }
761 }
903
762
904 /**
763 /**
905 * make a single inline comment and place it inside
764 * make a single inline comment and place it inside
906 */
765 */
907 var renderInlineComment = function(json_data){
766 var _renderInlineComment = function(json_data){
908 try{
767 var html = json_data['rendered_text'];
909 var html = json_data['rendered_text'];
768 var lineno = json_data['line_no'];
910 var lineno = json_data['line_no'];
769 var target_id = json_data['target_id'];
911 var target_id = json_data['target_id'];
770 _placeInline(target_id, lineno, html);
912 placeInline(target_id, lineno, html);
913 }catch(e){
914 console.log(e);
915 }
916 }
771 }
917
772
918 /**
773 /**
@@ -923,27 +778,28 var renderInlineComments = function(file
923 // holding all comments for a FILE
778 // holding all comments for a FILE
924 var box = file_comments[f];
779 var box = file_comments[f];
925
780
926 var target_id = YUD.getAttribute(box,'target_id');
781 var target_id = $(box).attr('target_id');
927 // actually comments with line numbers
782 // actual comments with line numbers
928 var comments = box.children;
783 var comments = box.children;
929 for(var i=0; i<comments.length; i++){
784 for(var i=0; i<comments.length; i++){
930 var data = {
785 var data = {
931 'rendered_text': comments[i].outerHTML,
786 'rendered_text': comments[i].outerHTML,
932 'line_no': YUD.getAttribute(comments[i],'line'),
787 'line_no': $(comments[i]).attr('line'),
933 'target_id': target_id
788 'target_id': target_id
934 }
789 }
935 renderInlineComment(data);
790 _renderInlineComment(data);
936 }
791 }
937 }
792 }
938 }
793 }
939
794
795 /* activate files.html stuff */
940 var fileBrowserListeners = function(current_url, node_list_url, url_base){
796 var fileBrowserListeners = function(current_url, node_list_url, url_base){
941 var current_url_branch = +"?branch=__BRANCH__";
797 var current_url_branch = "?branch=__BRANCH__";
942
798
943 $('#stay_at_branch').on('click',function(e){
799 $('#stay_at_branch').on('click',function(e){
944 if(e.target.checked){
800 if(e.currentTarget.checked){
945 var uri = current_url_branch;
801 var uri = current_url_branch;
946 uri = uri.replace('__BRANCH__',e.target.value);
802 uri = uri.replace('__BRANCH__',e.currentTarget.value);
947 window.location = uri;
803 window.location = uri;
948 }
804 }
949 else{
805 else{
@@ -951,26 +807,25 var fileBrowserListeners = function(curr
951 }
807 }
952 })
808 })
953
809
954 var n_filter = YUD.get('node_filter');
810 var $node_filter = $('#node_filter');
955 var F = YAHOO.namespace('node_filter');
956
811
957 F.filterTimeout = null;
812 var filterTimeout = null;
958 var nodes = null;
813 var nodes = null;
959
814
960 F.initFilter = function(){
815 var initFilter = function(){
961 $('#node_filter_box_loading').css('display','');
816 $('#node_filter_box_loading').show();
962 $('#search_activate_id').css('display','none');
817 $('#search_activate_id').hide();
963 $('#add_node_id').css('display','none');
818 $('#add_node_id').hide();
964 YUC.initHeader('X-PARTIAL-XHR',true);
819 YUC.initHeader('X-PARTIAL-XHR',true);
965 YUC.asyncRequest('GET', node_list_url, {
820 YUC.asyncRequest('GET', node_list_url, {
966 success:function(o){
821 success:function(o){
967 nodes = JSON.parse(o.responseText).nodes;
822 nodes = JSON.parse(o.responseText).nodes;
968 $('#node_filter_box_loading').css('display','none');
823 $('#node_filter_box_loading').hide();
969 $('#node_filter_box').css('display','');
824 $('#node_filter_box').show();
970 n_filter.focus();
825 $node_filter.focus();
971 if(YUD.hasClass(n_filter,'init')){
826 if($node_filter.hasClass('init')){
972 n_filter.value = '';
827 $node_filter.val('');
973 YUD.removeClass(n_filter,'init');
828 $node_filter.removeClass('init');
974 }
829 }
975 },
830 },
976 failure:function(o){
831 failure:function(o){
@@ -979,11 +834,11 var fileBrowserListeners = function(curr
979 },null);
834 },null);
980 }
835 }
981
836
982 F.updateFilter = function(e) {
837 var updateFilter = function(e) {
983 return function(){
838 return function(){
984 // Reset timeout
839 // Reset timeout
985 F.filterTimeout = null;
840 filterTimeout = null;
986 var query = e.target.value.toLowerCase();
841 var query = e.currentTarget.value.toLowerCase();
987 var match = [];
842 var match = [];
988 var matches = 0;
843 var matches = 0;
989 var matches_max = 20;
844 var matches_max = 20;
@@ -1011,58 +866,58 var fileBrowserListeners = function(curr
1011 }
866 }
1012 }
867 }
1013 if(query != ""){
868 if(query != ""){
1014 $('#tbody').css('display','none');
869 $('#tbody').hide();
1015 $('#tbody_filtered').css('display','');
870 $('#tbody_filtered').show();
1016
871
1017 if (match.length==0){
872 if (match.length==0){
1018 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['No matching files']));
873 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['No matching files']));
1019 }
874 }
1020
875
1021 YUD.get('tbody_filtered').innerHTML = match.join("");
876 $('#tbody_filtered').html(match.join(""));
1022 }
877 }
1023 else{
878 else{
1024 $('#tbody').css('display','');
879 $('#tbody').show();
1025 $('#tbody_filtered').css('display','none');
880 $('#tbody_filtered').hide();
1026 }
881 }
1027 }
882 }
1028 };
883 };
1029
884
1030 YUE.on(YUD.get('filter_activate'),'click',function(){
885 $('#filter_activate').click(function(){
1031 F.initFilter();
886 initFilter();
1032 })
887 });
1033 YUE.on(n_filter,'click',function(){
888 $node_filter.click(function(){
1034 if(YUD.hasClass(n_filter,'init')){
889 if($node_filter.hasClass('init')){
1035 n_filter.value = '';
890 $node_filter.val('');
1036 YUD.removeClass(n_filter,'init');
891 $node_filter.removeClass('init');
1037 }
892 }
1038 });
893 });
1039 YUE.on(n_filter,'keyup',function(e){
894 $node_filter.keyup(function(e){
1040 clearTimeout(F.filterTimeout);
895 clearTimeout(filterTimeout);
1041 F.filterTimeout = setTimeout(F.updateFilter(e),600);
896 filterTimeout = setTimeout(updateFilter(e),600);
1042 });
897 });
1043 };
898 };
1044
899
1045
900
1046 var initCodeMirror = function(textAreadId,resetUrl){
901 var initCodeMirror = function(textarea_id, resetUrl){
1047 var myCodeMirror = CodeMirror.fromTextArea(YUD.get(textAreadId),{
902 var myCodeMirror = CodeMirror.fromTextArea($('#' + textarea_id)[0], {
1048 mode: "null",
903 mode: "null",
1049 lineNumbers:true,
904 lineNumbers: true,
1050 indentUnit: 4
905 indentUnit: 4
1051 });
906 });
1052 YUE.on('reset','click',function(e){
907 $('#reset').click(function(e){
1053 window.location=resetUrl
908 window.location=resetUrl;
1054 });
909 });
1055
910
1056 YUE.on('file_enable','click',function(){
911 $('#file_enable').click(function(){
1057 $('#editor_container').css('display','');
912 $('#editor_container').show();
1058 $('#upload_file_container').css('display','none');
913 $('#upload_file_container').hide();
1059 $('#filename_container').css('display','');
914 $('#filename_container').show();
1060 });
915 });
1061
916
1062 YUE.on('upload_file_enable','click',function(){
917 $('#upload_file_enable').click(function(){
1063 $('#editor_container').css('display','none');
918 $('#editor_container').hide();
1064 $('#upload_file_container').css('display','');
919 $('#upload_file_container').show();
1065 $('#filename_container').css('display','none');
920 $('#filename_container').hide();
1066 });
921 });
1067
922
1068 return myCodeMirror
923 return myCodeMirror
@@ -1074,8 +929,8 var setCodeMirrorMode = function(codeMir
1074 }
929 }
1075
930
1076
931
1077 var getIdentNode = function(n){
932 var _getIdentNode = function(n){
1078 //iterate thru nodes untill matched interesting node !
933 //iterate thrugh nodes until matching interesting node
1079
934
1080 if (typeof n == 'undefined'){
935 if (typeof n == 'undefined'){
1081 return -1
936 return -1
@@ -1085,68 +940,55 var getIdentNode = function(n){
1085 return n
940 return n
1086 }
941 }
1087 else{
942 else{
1088 return getIdentNode(n.parentNode);
943 return _getIdentNode(n.parentNode);
1089 }
944 }
1090 };
945 };
1091
946
947 /* generate links for multi line selects that can be shown by files.html page_highlights.
948 * This is a mouseup handler for hlcode from CodeHtmlFormatter and pygmentize */
1092 var getSelectionLink = function(e) {
949 var getSelectionLink = function(e) {
1093 //get selection from start/to nodes
950 //get selection from start/to nodes
1094 if (typeof window.getSelection != "undefined") {
951 if (typeof window.getSelection != "undefined") {
1095 s = window.getSelection();
952 s = window.getSelection();
1096
953
1097 from = getIdentNode(s.anchorNode);
954 from = _getIdentNode(s.anchorNode);
1098 till = getIdentNode(s.focusNode);
955 till = _getIdentNode(s.focusNode);
1099
956
1100 f_int = parseInt(from.id.replace('L',''));
957 f_int = parseInt(from.id.replace('L',''));
1101 t_int = parseInt(till.id.replace('L',''));
958 t_int = parseInt(till.id.replace('L',''));
1102
959
1103 if (f_int > t_int){
960 var yoffset = 35;
961 var ranges = [parseInt(from.id.replace('L','')), parseInt(till.id.replace('L',''))];
962 if (ranges[0] > ranges[1]){
1104 //highlight from bottom
963 //highlight from bottom
1105 offset = -35;
964 yoffset = -yoffset;
1106 ranges = [t_int,f_int];
965 ranges = [ranges[1], ranges[0]];
1107
1108 }
966 }
1109 else{
967 var $hl_div = $('div#linktt');
1110 //highligth from top
1111 offset = 35;
1112 ranges = [f_int,t_int];
1113 }
1114 // if we select more than 2 lines
968 // if we select more than 2 lines
1115 if (ranges[0] != ranges[1]){
969 if (ranges[0] != ranges[1]){
1116 if(YUD.get('linktt') == null){
970 if ($hl_div.length) {
1117 hl_div = document.createElement('div');
971 $hl_div.html('');
1118 hl_div.id = 'linktt';
972 } else {
973 $hl_div = $('<div id="linktt" class="hl-tip-box">');
974 $('body').prepend($hl_div);
1119 }
975 }
1120 hl_div.innerHTML = '';
1121
976
1122 anchor = '#L'+ranges[0]+'-'+ranges[1];
977 $hl_div.append($('<a>').html(_TM['Selection link']).attr('href', location.href.substring(0, location.href.indexOf('#')) + '#L' + ranges[0] + '-'+ranges[1]));
1123 var link = document.createElement('a');
978 xy = $(till).offset();
1124 link.href = location.href.substring(0,location.href.indexOf('#'))+anchor;
979 $hl_div.css('top', (xy.top + yoffset) + 'px').css('left', xy.left + 'px');
1125 link.innerHTML = _TM['Selection link'];
980 $hl_div.show();
1126 hl_div.appendChild(link);
1127 YUD.get('body').appendChild(hl_div);
1128
1129 xy = YUD.getXY(till.id);
1130
1131 YUD.addClass('linktt', 'hl-tip-box');
1132 $('#linktt').css('top',xy[1]+offset+'px');
1133 $('#linktt').css('left',xy[0]+'px');
1134 $('#linktt').css('visibility','visible');
1135
1136 }
981 }
1137 else{
982 else{
1138 $('#linktt').css('visibility','hidden');
983 $hl_div.hide();
1139 }
984 }
1140 }
985 }
1141 };
986 };
1142
987
1143 var deleteNotification = function(url, notification_id,callbacks){
988 var deleteNotification = function(url, notification_id, callbacks){
1144 var callback = {
989 var callback = {
1145 success:function(o){
990 success:function(o){
1146 var obj = YUD.get(String("notification_"+notification_id));
991 $("#notification_"+notification_id).remove();
1147 if(obj.parentNode !== undefined){
1148 obj.parentNode.removeChild(obj);
1149 }
1150 _run_callbacks(callbacks);
992 _run_callbacks(callbacks);
1151 },
993 },
1152 failure:function(o){
994 failure:function(o){
@@ -1159,16 +1001,12 var deleteNotification = function(url, n
1159 callback, postData);
1001 callback, postData);
1160 };
1002 };
1161
1003
1162 var readNotification = function(url, notification_id,callbacks){
1004 var readNotification = function(url, notification_id, callbacks){
1163 var callback = {
1005 var callback = {
1164 success:function(o){
1006 success:function(o){
1165 var obj = YUD.get(String("notification_"+notification_id));
1007 var $obj = $("#notification_"+notification_id);
1166 YUD.removeClass(obj, 'unread');
1008 $obj.removeClass('unread');
1167 var r_button = YUD.getElementsByClassName('read-notification',null,obj.children[0])[0];
1009 $obj.find('.read-notification').remove();
1168
1169 if(r_button.parentNode !== undefined){
1170 r_button.parentNode.removeChild(r_button);
1171 }
1172 _run_callbacks(callbacks);
1010 _run_callbacks(callbacks);
1173 },
1011 },
1174 failure:function(o){
1012 failure:function(o){
@@ -1183,7 +1021,7 var readNotification = function(url, not
1183
1021
1184 /** MEMBERS AUTOCOMPLETE WIDGET **/
1022 /** MEMBERS AUTOCOMPLETE WIDGET **/
1185
1023
1186 var MembersAutoComplete = function (divid, cont, users_list, groups_list) {
1024 var _MembersAutoComplete = function (divid, cont, users_list, groups_list) {
1187 var myUsers = users_list;
1025 var myUsers = users_list;
1188 var myGroups = groups_list;
1026 var myGroups = groups_list;
1189
1027
@@ -1338,11 +1176,11 var MembersAutoComplete = function (divi
1338 if (oData.nname != undefined) {
1176 if (oData.nname != undefined) {
1339 //users
1177 //users
1340 myAC.getInputEl().value = oData.nname;
1178 myAC.getInputEl().value = oData.nname;
1341 YUD.get('perm_new_member_type_'+nextId).value = 'user';
1179 $('#perm_new_member_type_'+nextId).val('user');
1342 } else {
1180 } else {
1343 //groups
1181 //groups
1344 myAC.getInputEl().value = oData.grname;
1182 myAC.getInputEl().value = oData.grname;
1345 YUD.get('perm_new_member_type_'+nextId).value = 'users_group';
1183 $('#perm_new_member_type_'+nextId).val('users_group');
1346 }
1184 }
1347 };
1185 };
1348
1186
@@ -1485,11 +1323,11 var MentionsAutoComplete = function (div
1485 chunks[1] = chunks[1].replace('@'+myAC.dataSource.mentionQuery,
1323 chunks[1] = chunks[1].replace('@'+myAC.dataSource.mentionQuery,
1486 '@'+oData.nname+' ');
1324 '@'+oData.nname+' ');
1487 myAC.getInputEl().value = chunks.join('')
1325 myAC.getInputEl().value = chunks.join('')
1488 YUD.get(myAC.getInputEl()).focus(); // Y U NO WORK !?
1326 myAC.getInputEl().focus(); // Y U NO WORK !?
1489 } else {
1327 } else {
1490 //groups
1328 //groups
1491 myAC.getInputEl().value = oData.grname;
1329 myAC.getInputEl().value = oData.grname;
1492 YUD.get('perm_new_member_type').value = 'users_group';
1330 $('#perm_new_member_type').val('users_group');
1493 }
1331 }
1494 });
1332 });
1495 }
1333 }
@@ -1549,7 +1387,6 var MentionsAutoComplete = function (div
1549 }
1387 }
1550
1388
1551 var addReviewMember = function(id,fname,lname,nname,gravatar_link){
1389 var addReviewMember = function(id,fname,lname,nname,gravatar_link){
1552 var members = YUD.get('review_members');
1553 var tmpl = '<li id="reviewer_{2}">'+
1390 var tmpl = '<li id="reviewer_{2}">'+
1554 '<div class="reviewers_member">'+
1391 '<div class="reviewers_member">'+
1555 '<div class="gravatar"><img alt="gravatar" src="{0}"/> </div>'+
1392 '<div class="gravatar"><img alt="gravatar" src="{0}"/> </div>'+
@@ -1562,31 +1399,26 var addReviewMember = function(id,fname,
1562 var element = tmpl.format(gravatar_link,displayname,id);
1399 var element = tmpl.format(gravatar_link,displayname,id);
1563 // check if we don't have this ID already in
1400 // check if we don't have this ID already in
1564 var ids = [];
1401 var ids = [];
1565 var _els = YUQ('#review_members li');
1402 $('#review_members').find('li').each(function() {
1566 for (el in _els){
1403 ids.push(this.id);
1567 ids.push(_els[el].id)
1404 });
1568 }
1569 if(ids.indexOf('reviewer_'+id) == -1){
1405 if(ids.indexOf('reviewer_'+id) == -1){
1570 //only add if it's not there
1406 //only add if it's not there
1571 members.innerHTML += element;
1407 $('#review_members').append(element);
1572 }
1408 }
1573 }
1409 }
1574
1410
1575 var removeReviewMember = function(reviewer_id, repo_name, pull_request_id){
1411 var removeReviewMember = function(reviewer_id, repo_name, pull_request_id){
1576 var el = YUD.get('reviewer_{0}'.format(reviewer_id));
1412 $('#reviewer_{0}'.format(reviewer_id)).remove();
1577 if (el.parentNode !== undefined){
1578 el.parentNode.removeChild(el);
1579 }
1580 }
1413 }
1581
1414
1415 /* handle "Save Changes" of addReviewMember and removeReviewMember on PR */
1582 var updateReviewers = function(reviewers_ids, repo_name, pull_request_id){
1416 var updateReviewers = function(reviewers_ids, repo_name, pull_request_id){
1583 if (reviewers_ids === undefined){
1417 if (reviewers_ids === undefined){
1584 var reviewers_ids = [];
1418 var reviewers_ids = [];
1585 var ids = YUQ('#review_members input');
1419 $('#review_members').find('input').each(function(){
1586 for(var i=0; i<ids.length;i++){
1420 reviewers_ids.push(this.value);
1587 var id = ids[i].value
1421 });
1588 reviewers_ids.push(id);
1589 }
1590 }
1422 }
1591 var url = pyroutes.url('pullrequest_update', {"repo_name":repo_name,
1423 var url = pyroutes.url('pullrequest_update', {"repo_name":repo_name,
1592 "pull_request_id": pull_request_id});
1424 "pull_request_id": pull_request_id});
@@ -1598,6 +1430,7 var updateReviewers = function(reviewers
1598 ajaxPOST(url,postData,success);
1430 ajaxPOST(url,postData,success);
1599 }
1431 }
1600
1432
1433 /* activate auto completion of users and groups ... but only used for users as PR reviewers */
1601 var PullRequestAutoComplete = function (divid, cont, users_list, groups_list) {
1434 var PullRequestAutoComplete = function (divid, cont, users_list, groups_list) {
1602 var myUsers = users_list;
1435 var myUsers = users_list;
1603 var myGroups = groups_list;
1436 var myGroups = groups_list;
@@ -1731,37 +1564,32 var PullRequestAutoComplete = function (
1731 var oData = aArgs[2]; // object literal of selected item's result data
1564 var oData = aArgs[2]; // object literal of selected item's result data
1732
1565
1733 //fill the autocomplete with value
1566 //fill the autocomplete with value
1734
1735 if (oData.nname != undefined) {
1567 if (oData.nname != undefined) {
1736 addReviewMember(oData.id, oData.fname, oData.lname, oData.nname,
1568 addReviewMember(oData.id, oData.fname, oData.lname, oData.nname,
1737 oData.gravatar_lnk);
1569 oData.gravatar_lnk);
1738 myAC.dataSource.cache.push(oData.id);
1570 myAC.dataSource.cache.push(oData.id);
1739 YUD.get('user').value = ''
1571 $('#user').val('');
1740 }
1572 }
1741 });
1573 });
1742 }
1574 }
1743 return {
1744 ownerDS: ownerDS,
1745 reviewerAC: reviewerAC,
1746 };
1747 }
1575 }
1748
1576
1749 /**
1577 /**
1750 * QUICK REPO MENU
1578 * Activate .quick_repo_menu
1751 */
1579 */
1752 var quick_repo_menu = function(){
1580 var quick_repo_menu = function(){
1753 YUE.on(YUQ('.quick_repo_menu'),'mouseenter',function(e){
1581 $(".quick_repo_menu").mouseenter(function(e) {
1754 var menu = e.currentTarget.firstElementChild.firstElementChild;
1582 var $menu = $(e.currentTarget).children().first().children().first();
1755 if(YUD.hasClass(menu,'hidden')){
1583 if($menu.hasClass('hidden')){
1756 YUD.replaceClass(e.currentTarget,'hidden', 'active');
1584 $menu.removeClass('hidden').addClass('active');
1757 YUD.replaceClass(menu, 'hidden', 'active');
1585 $(e.currentTarget).removeClass('hidden').addClass('active');
1758 }
1586 }
1759 })
1587 })
1760 YUE.on(YUQ('.quick_repo_menu'),'mouseleave',function(e){
1588 $(".quick_repo_menu").mouseleave(function(e) {
1761 var menu = e.currentTarget.firstElementChild.firstElementChild;
1589 var $menu = $(e.currentTarget).children().first().children().first();
1762 if(YUD.hasClass(menu,'active')){
1590 if($menu.hasClass('active')){
1763 YUD.replaceClass(e.currentTarget, 'active', 'hidden');
1591 $menu.removeClass('active').addClass('hidden');
1764 YUD.replaceClass(menu, 'active', 'hidden');
1592 $(e.currentTarget).removeClass('active').addClass('hidden');
1765 }
1593 }
1766 })
1594 })
1767 };
1595 };
@@ -1791,92 +1619,57 var get_rev = function(node){
1791 }
1619 }
1792
1620
1793 var get_date = function(node){
1621 var get_date = function(node){
1794 var date_ = YUD.getAttribute(node.firstElementChild,'date');
1622 return $(node.firstElementChild).attr('date');
1795 return date_
1796 }
1623 }
1797
1624
1798 var revisionSort = function(a, b, desc, field) {
1625 var revisionSort = function(a, b, desc, field) {
1799 var a_ = fromHTML(a.getData(field));
1626 var a_ = get_rev(fromHTML(a.getData(field)));
1800 var b_ = fromHTML(b.getData(field));
1627 var b_ = get_rev(fromHTML(b.getData(field)));
1801
1628
1802 // extract revisions from string nodes
1629 return YAHOO.util.Sort.compare(a_, b_, desc);
1803 a_ = get_rev(a_)
1804 b_ = get_rev(b_)
1805
1806 var comp = YAHOO.util.Sort.compare;
1807 var compState = comp(a_, b_, desc);
1808 return compState;
1809 };
1630 };
1810
1631
1811 var ageSort = function(a, b, desc, field) {
1632 var ageSort = function(a, b, desc, field) {
1812 var a_ = fromHTML(a.getData(field));
1633 // data is like: <span class="tooltip" date="2014-06-04 18:18:55.325474" title="Wed, 04 Jun 2014 18:18:55">1 day and 23 hours ago</span>
1813 var b_ = fromHTML(b.getData(field));
1634 var a_ = $(a.getData(field)).attr('date');
1635 var b_ = $(b.getData(field)).attr('date');
1814
1636
1815 // extract name from table
1637 return YAHOO.util.Sort.compare(a_, b_, desc);
1816 a_ = get_date(a_)
1817 b_ = get_date(b_)
1818
1819 var comp = YAHOO.util.Sort.compare;
1820 var compState = comp(a_, b_, desc);
1821 return compState;
1822 };
1638 };
1823
1639
1824 var lastLoginSort = function(a, b, desc, field) {
1640 var lastLoginSort = function(a, b, desc, field) {
1825 var a_ = a.getData('last_login_raw') || 0;
1641 var a_ = a.getData('last_login_raw') || 0;
1826 var b_ = b.getData('last_login_raw') || 0;
1642 var b_ = b.getData('last_login_raw') || 0;
1827
1643
1828 var comp = YAHOO.util.Sort.compare;
1644 return YAHOO.util.Sort.compare(a_, b_, desc);
1829 var compState = comp(a_, b_, desc);
1830 return compState;
1831 };
1645 };
1832
1646
1833 var nameSort = function(a, b, desc, field) {
1647 var nameSort = function(a, b, desc, field) {
1834 var a_ = a.getData('raw_name') || 0;
1648 var a_ = a.getData('raw_name') || 0;
1835 var b_ = b.getData('raw_name') || 0;
1649 var b_ = b.getData('raw_name') || 0;
1836
1650
1837 var comp = YAHOO.util.Sort.compare;
1651 return YAHOO.util.Sort.compare(a_, b_, desc);
1838 var compState = comp(a_, b_, desc);
1839 return compState;
1840 };
1652 };
1841
1653
1842 var dateSort = function(a, b, desc, field) {
1654 var dateSort = function(a, b, desc, field) {
1843 var a_ = fromHTML(a.getData(field));
1655 var a_ = get_date(fromHTML(a.getData(field)));
1844 var b_ = fromHTML(b.getData(field));
1656 var b_ = get_date(fromHTML(b.getData(field)));
1845
1657
1846 // extract name from table
1658 return YAHOO.util.Sort.compare(a_, b_, desc);
1847 a_ = get_date(a_)
1848 b_ = get_date(b_)
1849
1850 var comp = YAHOO.util.Sort.compare;
1851 var compState = comp(a_, b_, desc);
1852 return compState;
1853 };
1659 };
1854
1660
1855 var addPermAction = function(_html, users_list, groups_list){
1661 var addPermAction = function(_html, users_list, groups_list){
1856 var elmts = YUD.getElementsByClassName('last_new_member');
1662 var $last_node = $('.last_new_member').last(); // empty tr between last and add
1857 var last_node = elmts[elmts.length-1];
1663 var next_id = $('.new_members').length;
1858 if (last_node){
1664 $last_node.before($('<tr class="new_members">').append(_html.format(next_id)));
1859 var next_id = (YUD.getElementsByClassName('new_members')).length;
1665 _MembersAutoComplete("perm_new_member_name_"+next_id,
1860 _html = _html.format(next_id);
1666 "perm_container_"+next_id, users_list, groups_list);
1861 last_node.innerHTML = _html;
1862 YUD.setStyle(last_node, 'display', '');
1863 YUD.removeClass(last_node, 'last_new_member');
1864 MembersAutoComplete("perm_new_member_name_"+next_id,
1865 "perm_container_"+next_id, users_list, groups_list);
1866 //create new last NODE
1867 var el = document.createElement('tr');
1868 el.id = 'add_perm_input';
1869 YUD.addClass(el,'last_new_member');
1870 YUD.addClass(el,'new_members');
1871 YUD.insertAfter(el, last_node);
1872 }
1873 }
1667 }
1874
1668
1875 function ajaxActionRevokePermission(url, obj_id, obj_type, field_id, extra_data) {
1669 function ajaxActionRevokePermission(url, obj_id, obj_type, field_id, extra_data) {
1876 var callback = {
1670 var callback = {
1877 success: function (o) {
1671 success: function (o) {
1878 var tr = YUD.get(String(field_id));
1672 $('#' + field_id).remove();
1879 tr.parentNode.removeChild(tr);
1880 },
1673 },
1881 failure: function (o) {
1674 failure: function (o) {
1882 alert(_TM['Failed to remoke permission'] + ": " + o.status);
1675 alert(_TM['Failed to remoke permission'] + ": " + o.status);
@@ -1902,141 +1695,44 function ajaxActionRevokePermission(url,
1902 }
1695 }
1903
1696
1904 var request = YAHOO.util.Connect.asyncRequest('POST', url, callback,
1697 var request = YAHOO.util.Connect.asyncRequest('POST', url, callback,
1905 toQueryString(query_params));
1698 _toQueryString(query_params));
1906 };
1699 };
1907
1700
1908 /* Multi selectors */
1701 /* Multi selectors */
1909
1702
1910 var MultiSelectWidget = function(selected_id, available_id, form_id){
1703 var MultiSelectWidget = function(selected_id, available_id, form_id){
1911 //definition of containers ID's
1704 var $availableselect = $('#' + available_id);
1912 var selected_container = selected_id;
1705 var $selectedselect = $('#' + selected_id);
1913 var available_container = available_id;
1914
1915 //temp container for selected storage.
1916 var cache = new Array();
1917 var av_cache = new Array();
1918 var c = YUD.get(selected_container);
1919 var ac = YUD.get(available_container);
1920
1921 //get only selected options for further fullfilment
1922 for(var i = 0;node =c.options[i];i++){
1923 if(node.selected){
1924 //push selected to my temp storage left overs :)
1925 cache.push(node);
1926 }
1927 }
1928
1929 //get all available options to cache
1930 for(var i = 0;node =ac.options[i];i++){
1931 //push selected to my temp storage left overs :)
1932 av_cache.push(node);
1933 }
1934
1935 //fill available only with those not in chosen
1936 ac.options.length=0;
1937 tmp_cache = new Array();
1938
1706
1939 for(var i = 0;node = av_cache[i];i++){
1707 //fill available only with those not in selected
1940 var add = true;
1708 var $selectedoptions = $selectedselect.children('option');
1941 for(var i2 = 0;node_2 = cache[i2];i2++){
1709 $availableselect.children('option').filter(function(i, e){
1942 if(node.value == node_2.value){
1710 for(var j = 0, node; node = $selectedoptions[j]; j++){
1943 add=false;
1711 if(node.value == e.value){
1944 break;
1712 return true;
1945 }
1946 }
1947 if(add){
1948 tmp_cache.push(new Option(node.text, node.value, false, false));
1949 }
1950 }
1951
1952 for(var i = 0;node = tmp_cache[i];i++){
1953 ac.options[i] = node;
1954 }
1955
1956 function prompts_action_callback(e){
1957
1958 var chosen = YUD.get(selected_container);
1959 var available = YUD.get(available_container);
1960
1961 //get checked and unchecked options from field
1962 function get_checked(from_field){
1963 //temp container for storage.
1964 var sel_cache = new Array();
1965 var oth_cache = new Array();
1966
1967 for(var i = 0;node = from_field.options[i];i++){
1968 if(node.selected){
1969 //push selected fields :)
1970 sel_cache.push(node);
1971 }
1972 else{
1973 oth_cache.push(node)
1974 }
1713 }
1975 }
1714 }
1976
1715 return false;
1977 return [sel_cache,oth_cache]
1716 }).remove();
1978 }
1979
1980 //fill the field with given options
1981 function fill_with(field,options){
1982 //clear firtst
1983 field.options.length=0;
1984 for(var i = 0;node = options[i];i++){
1985 field.options[i]=new Option(node.text, node.value,
1986 false, false);
1987 }
1988
1989 }
1990 //adds to current field
1991 function add_to(field,options){
1992 for(var i = 0;node = options[i];i++){
1993 field.appendChild(new Option(node.text, node.value,
1994 false, false));
1995 }
1996 }
1997
1717
1998 // add action
1718 $('#add_element').click(function(e){
1999 if (this.id=='add_element'){
1719 $selectedselect.append($availableselect.children('option:selected'));
2000 var c = get_checked(available);
1720 });
2001 add_to(chosen,c[0]);
1721 $('#remove_element').click(function(e){
2002 fill_with(available,c[1]);
1722 $availableselect.append($selectedselect.children('option:selected'));
2003 }
1723 });
2004 // remove action
1724 $('#add_all_elements').click(function(e){
2005 if (this.id=='remove_element'){
1725 $selectedselect.append($availableselect.children('option'));
2006 var c = get_checked(chosen);
1726 });
2007 add_to(available,c[0]);
1727 $('#remove_all_elements').click(function(e){
2008 fill_with(chosen,c[1]);
1728 $availableselect.append($selectedselect.children('option'));
2009 }
1729 });
2010 // add all elements
2011 if(this.id=='add_all_elements'){
2012 for(var i=0; node = available.options[i];i++){
2013 chosen.appendChild(new Option(node.text,
2014 node.value, false, false));
2015 }
2016 available.options.length = 0;
2017 }
2018 //remove all elements
2019 if(this.id=='remove_all_elements'){
2020 for(var i=0; node = chosen.options[i];i++){
2021 available.appendChild(new Option(node.text,
2022 node.value, false, false));
2023 }
2024 chosen.options.length = 0;
2025 }
2026
1730
2027 }
1731 $('#'+form_id).submit(function(){
2028
1732 $selectedselect.children('option').each(function(i, e){
2029 YUE.addListener(['add_element','remove_element',
1733 e.selected = 'selected';
2030 'add_all_elements','remove_all_elements'],'click',
1734 });
2031 prompts_action_callback)
2032 if (form_id !== undefined) {
2033 YUE.addListener(form_id,'submit',function(){
2034 var chosen = YUD.get(selected_container);
2035 for (var i = 0; i < chosen.options.length; i++) {
2036 chosen.options[i].selected = 'selected';
2037 }
2038 });
1735 });
2039 }
2040 }
1736 }
2041
1737
2042 // custom paginator
1738 // custom paginator
@@ -2108,7 +1804,7 var YUI_paginator = function(links_per_p
2108
1804
2109 this.link = document.createElement('a');
1805 this.link = document.createElement('a');
2110 this.span = document.createElement('span');
1806 this.span = document.createElement('span');
2111 YUD.setStyle(this.span, 'display', 'none');
1807 $(this.span).hide();
2112
1808
2113 var _pos = this.getPos(p.getCurrentPage(), p.getTotalPages(), 5);
1809 var _pos = this.getPos(p.getCurrentPage(), p.getTotalPages(), 5);
2114 this.leftmost_page = _pos[0];
1810 this.leftmost_page = _pos[0];
@@ -2119,7 +1815,7 var YUI_paginator = function(links_per_p
2119 this.link.className = c;
1815 this.link.className = c;
2120 this.link.innerHTML = label;
1816 this.link.innerHTML = label;
2121 this.link.title = title;
1817 this.link.title = title;
2122 YAHOO.util.Event.on(this.link,'click',this.onClick,this,true);
1818 YUE.on(this.link,'click',this.onClick,this,true);
2123
1819
2124 setId(this.span, id_base + '-first-span');
1820 setId(this.span, id_base + '-first-span');
2125 this.span.className = c;
1821 this.span.className = c;
@@ -2152,12 +1848,12 var YUI_paginator = function(links_per_p
2152 }
1848 }
2153 },
1849 },
2154 destroy : function () {
1850 destroy : function () {
2155 YAHOO.util.Event.purgeElement(this.link);
1851 YUE.purgeElement(this.link);
2156 this.current.parentNode.removeChild(this.current);
1852 this.current.parentNode.removeChild(this.current);
2157 this.link = this.span = null;
1853 this.link = this.span = null;
2158 },
1854 },
2159 onClick : function (e) {
1855 onClick : function (e) {
2160 YAHOO.util.Event.stopEvent(e);
1856 YUE.stopEvent(e);
2161 this.paginator.setPage(1);
1857 this.paginator.setPage(1);
2162 }
1858 }
2163 };
1859 };
@@ -2237,7 +1933,7 var YUI_paginator = function(links_per_p
2237
1933
2238 this.link = document.createElement('a');
1934 this.link = document.createElement('a');
2239 this.span = document.createElement('span');
1935 this.span = document.createElement('span');
2240 YUD.setStyle(this.span, 'display', 'none');
1936 $(this.span).hide();
2241
1937
2242 this.na = this.span.cloneNode(false);
1938 this.na = this.span.cloneNode(false);
2243
1939
@@ -2246,7 +1942,7 var YUI_paginator = function(links_per_p
2246 this.link.className = c;
1942 this.link.className = c;
2247 this.link.innerHTML = label;
1943 this.link.innerHTML = label;
2248 this.link.title = title;
1944 this.link.title = title;
2249 YAHOO.util.Event.on(this.link,'click',this.onClick,this,true);
1945 YUE.on(this.link,'click',this.onClick,this,true);
2250
1946
2251 setId(this.span, id_base + '-last-span');
1947 setId(this.span, id_base + '-last-span');
2252 this.span.className = c;
1948 this.span.className = c;
@@ -2295,12 +1991,12 var YUI_paginator = function(links_per_p
2295
1991
2296 },
1992 },
2297 destroy : function () {
1993 destroy : function () {
2298 YAHOO.util.Event.purgeElement(this.link);
1994 YUE.purgeElement(this.link);
2299 this.current.parentNode.removeChild(this.current);
1995 this.current.parentNode.removeChild(this.current);
2300 this.link = this.span = null;
1996 this.link = this.span = null;
2301 },
1997 },
2302 onClick : function (e) {
1998 onClick : function (e) {
2303 YAHOO.util.Event.stopEvent(e);
1999 YUE.stopEvent(e);
2304 this.paginator.setPage(this.paginator.getTotalPages());
2000 this.paginator.setPage(this.paginator.getTotalPages());
2305 }
2001 }
2306 };
2002 };
@@ -2326,18 +2022,17 var YUI_paginator = function(links_per_p
2326
2022
2327 // global hooks after DOM is loaded
2023 // global hooks after DOM is loaded
2328
2024
2329 YUE.onDOMReady(function(){
2025 $(document).ready(function(){
2330 YUE.on(YUQ('.diff-collapse-button'), 'click', function(e){
2026 $('.diff-collapse-button').click(function(e) {
2331 var button = e.currentTarget;
2027 var $button = $(e.currentTarget);
2332 var t = YUD.get(button).getAttribute('target');
2028 var $target = $('#' + $button.attr('target'));
2333 console.log(t);
2029 if($target.hasClass('hidden')){
2334 if(YUD.hasClass(t, 'hidden')){
2030 $target.removeClass('hidden');
2335 YUD.removeClass(t, 'hidden');
2031 $button.html("&uarr; {0} &uarr;".format(_TM['Collapse diff']));
2336 YUD.get(button).innerHTML = "&uarr; {0} &uarr;".format(_TM['Collapse diff']);
2337 }
2032 }
2338 else if(!YUD.hasClass(t, 'hidden')){
2033 else if(!$target.hasClass('hidden')){
2339 YUD.addClass(t, 'hidden');
2034 $target.addClass('hidden');
2340 YUD.get(button).innerHTML = "&darr; {0} &darr;".format(_TM['Expand diff']);
2035 $button.html("&darr; {0} &darr;".format(_TM['Expand diff']));
2341 }
2036 }
2342 });
2037 });
2343 });
2038 });
General Comments 0
You need to be logged in to leave comments. Login now