Greasy Fork

Orareview Helper

Help you making life easier when orareview.

目前为 2014-08-22 提交的版本。查看 最新版本

// ==UserScript==
// @name       Orareview Helper
// @namespace https://greasyfork.org/users/3729
// @version    0.1.4
// @description  Help you making life easier when orareview.
// @match      https://orareview.us.oracle.com/*
// @require    https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @grant      unsafeWindow
// @copyright  2014, Rex
// ==/UserScript==

(function(document,jQuery) {
    var $=jQuery;
    var patternPageMap={"onMainPage":/\.com\/\d+$/g, "onDiffPage":/\.com\/\d+\/diff[2]?\/\d+(:\d+)?\/\d+/g};
    
    var paramLineWidth='display_width',patternLineWidth=new RegExp(paramLineWidth);
    var preferedLineWidth=80;
    function log(){
      unsafeWindow.console.debug.apply(unsafeWindow.console,arguments);   
    }
    function getPreferedLineWidth(){
        var lineNumberColWidth=0, codeViewportWidth=0, windowWidth=jQuery(unsafeWindow).width();
        if(!!jQuery('table#table-top').length){
            codeViewportWidth=jQuery('table#table-top').width();
            jQuery('table#thecode:first tbody tr:eq(1) b').each(function(i,col){
                lineNumberColWidth=jQuery(col).width();
            });
        }
        if(lineNumberColWidth==0){
            lineNumberColWidth=42;
            if(codeViewportWidth==0){
             	codeViewportWidth=windowWidth-26;
            }
        }
        return parseInt(((codeViewportWidth-lineNumberColWidth*2)/2)/7);
    }
    function onDiffPage(){
        //log('onDiffPage');
        var patternMatch=false,lineContent=null,filter=null;
        var lineFilters=[{name:"CreationDate",pattern:/<CreationDate>/},{name:"LastUpdateDate",pattern:/<LastUpdateDate>/},{name:"LastUpdateLogin",pattern:/<LastUpdateLogin>/}];/**['<CreationDate>','<LastUpdateDate>','<LastUpdateLogin>','<BaseFlowParameterId>'];*/
        jQuery("table#thecode tbody tr[id*=pair]:has(td[class*=replace])").each(function(i,tr){
          tr=jQuery(tr);
          lineContent=tr.text();
          patternMatch=false;
          for(i in lineFilters){
              filter=lineFilters[i];
            if(filter && filter.pattern && filter.pattern.test(lineContent)){
                //log(lineContent, filter.pattern, tr);
                patternMatch=true;
                break;
            }
          }
          if(patternMatch){tr.toggle();}else{//remove spaces only changes TOCONFIG
              var diffsInline=tr.find("[class*=dark]");
              if(!jQuery.trim(diffsInline.text()).length){
                  if(diffsInline.parents("td:first").index()==0)
                  	  diffsInline.addClass('oldequal');
                  else
                      diffsInline.addClass('newequal');
              }
          }
        });///**
        //remain current display width when jumping to another file
        var fileJumper=jQuery('select[onChange*=M_jumpToPatch]:first');
        var displayWidth=parseInt(jQuery(":input[name="+paramLineWidth+"]:visible:first").val());
        
        fileJumper.children().each(function(i,opt){
            if(i==0 && patternLineWidth.test(opt.value)){
                return false;
            }else if(i==0){
                if(isNaN(displayWidth) || displayWidth==80){
                	displayWidth=getPreferedLineWidth();
            	}   
            }
          opt.value+='?display_width='+displayWidth;
        });//*/
        //mark file reviewed/not reviewed
        var statusPanel=fileJumper.parent().nextAll('div:has(a[href*=mark_file_reviewed]):first');
        if(statusPanel.length>0){
            var selectedOption=fileJumper.children(':selected:first');
            var markTrigger=statusPanel.find('a[href*=mark_file_reviewed]:first');        
            var statusDescriptor=jQuery('<span style="margin-right:5px;"></span>');
            statusDescriptor.text('Status: '+jQuery.trim(statusPanel.text()).match(/Status:\s(\w+(\s\w+)?)/)[1]);
            statusPanel.html('').append(statusDescriptor).append(markTrigger);
            
            var currentReviewStatus=null;//true|false
            var currentReviewStatusText=null;//'Reviewed'|'Not Reviewed'
            var reviewStatusMap={'Reviewed':true,'Not Reviewed':false,true:'Reviewed',false:'Not Reviewed'};
            var getCurrentReviewStatusText=function(){
                if(currentReviewStatusText==null){
                    var matchGroup=statusDescriptor.text().match(/Status:\s(\w+(\s\w+)?)/);
                    if(matchGroup && matchGroup.length>1){
                        currentReviewStatusText = matchGroup[1];
                    }
                }
                return currentReviewStatusText;
            }
            var getCurrentReviewStatus=function(){
                if(currentReviewStatus==null){
                    currentReviewStatusText=getCurrentReviewStatusText();
                    currentReviewStatus=reviewStatusMap[currentReviewStatusText];
                }
                return currentReviewStatus;
            }
            var setClientReviewStatus = function(reviewed){//true|false
                if(reviewed==currentReviewStatus){
                  return;   
                }
                var newStatusText=reviewStatusMap[reviewed];
                statusDescriptor.text('Status: '+newStatusText);
                markTrigger.text('Change Status to '+reviewStatusMap[!reviewed]);
                //change selected option
                selectedOption.text(selectedOption.text().replace(/\((R|V)\)/,function(match0,status){
                  return status=='V'?'(R)':'(V)';
                }));
            }
            var toggleClientReviewStatus = function(){
                setClientReviewStatus(!currentReviewStatus);
            };
            markTrigger.click(function(evt){
                //console.log(evt,evt.target,evt.target.href);
                currentReviewStatus=getCurrentReviewStatus();
                jQuery.ajax(evt.target.href,{
                    success:function(data,status,xhr){
                        //change to server status only when really successfully loaded
                        currentReviewStatus=!currentReviewStatus;
                    },error:function(xhr,status,errorThrown){
                        unsafeWindow.alert('Failed to mark file as ['+currentReviewStatusText+'].');
                        //revert change
                        setReviewStatus(true);
                    }
                });
                //mark successfull immediately. But if error occured later, revert this change.
                setTimeout(toggleClientReviewStatus,1000);
                return false;
            });
        }
    }
    function onMainPage(){
        //change default line width of orareview diff page
        //log('onMainPage');
        var diffLink = null;
        var paramName=paramLineWidth, adjustedParamValue = preferedLineWidth?preferedLineWidth:105, paramRegExp = new RegExp(paramName+'=(\d*)');
        jQuery('a[href*=diff]').each(function(i,a){
          a=jQuery(a);
          diffLink = a.attr('href');
          if(/^\/\d+\/diff[2]?\/\d+(:\d+)?\/\d+$/.test(diffLink)){
            if(!/\?/.test(diffLink)){diffLink+='?';}else{
                if(!/\?$/.test(diffLink)){
                    diffLink+='&';
                }
            }
            if(paramRegExp.test(diffLink)){
                diffLink=diffLink.replace(paramRegExp,paramName+'='+adjustedParamValue);
            }else{
                diffLink+=paramName+'='+adjustedParamValue;
            }
            a.attr('href',diffLink);
          }
        });
    }
    function main(){
        log('Orareview Helper loaded.');
        unsafeWindow.jQuery=jQuery;
        preferedLineWidth=getPreferedLineWidth();
        var documentLocation = document.location.href;
        //log('preferedLW',preferedLineWidth,'documentLocation',documentLocation);
        var pattern=null;
        for(fnd in patternPageMap){
            pattern=patternPageMap[fnd];
            if(pattern.test(documentLocation)){
                log(fnd,pattern);
            	eval(fnd+'.apply()');
                break;
            }
        }
    }
	main();
})(window.document,jQuery);