Orareview Helper

Help you making life easier when orareview.

  1. // ==UserScript==
  2. // @name Orareview Helper
  3. // @version 0.1.6
  4. // @description Help you making life easier when orareview.
  5. // @namespace https://greatest.deepsurf.us/users/3729
  6. // @match https://orareview.us.oracle.com/*
  7. // @require https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
  8. // @grant unsafeWindow
  9. // @grant GM_log
  10. // @grant GM_setClipboard
  11. // @copyright 2014, Rex
  12. // ==/UserScript==
  13.  
  14. (function(document,jQuery) {
  15. var $=jQuery;
  16. var patternPageMap={"onMainPage":/\.com\/\d+$/g, "onDiffPage":/\.com\/\d+\/diff[2]?\/\d+(:\d+)?\/\d+/g};
  17. var paramLineWidth='display_width',patternLineWidth=new RegExp(paramLineWidth);
  18. var preferedLineWidth=80;
  19. function log(){
  20. unsafeWindow.console.debug(arguments);
  21. }
  22. function getPreferedLineWidth(){
  23. var lineNumberColWidth=0, codeViewportWidth=0, windowWidth=jQuery(unsafeWindow).width();
  24. if(!!jQuery('table#table-top').length){
  25. codeViewportWidth=jQuery('table#table-top').width();
  26. jQuery('table#thecode:first tbody tr:eq(1) b').each(function(i,col){
  27. lineNumberColWidth=jQuery(col).width();
  28. });
  29. }
  30. if(lineNumberColWidth==0){
  31. lineNumberColWidth=42;
  32. if(codeViewportWidth==0){
  33. codeViewportWidth=windowWidth-26;
  34. }
  35. }
  36. return parseInt(((codeViewportWidth-lineNumberColWidth*2)/2)/7);
  37. }
  38. function onDiffPage(){
  39. //log('onDiffPage');
  40. var patternMatch=false,lineContent=null,filter=null;
  41. var lineFilters=[{name:"CreationDate",pattern:/CreationDate/},{name:"LastUpdateDate",pattern:/LastUpdateDate/},{name:"LastUpdateLogin",pattern:/LastUpdateLogin/},{pattern:/CreatedBy/},{pattern:/LastUpdatedBy/},{pattern:/BaseFlowParameterId/},{pattern:/BaseTaskParameterId/},{pattern:/<BaseFlowTaskParameterId>/},{pattern:/BaseFlowTaskParamId/},{pattern:/<prop prop-type="ObjectVersionNumber"/},{pattern:/prop-type="GUID"/},{pattern:/prop-type="extract_date"/},{pattern:/<DefaultVal>\d+<\/DefaultVal>/}];/**['<CreationDate>','<LastUpdateDate>','<LastUpdateLogin>','<BaseFlowParameterId>'];*/
  42. jQuery("table#thecode tbody tr[id*=pair]:not(:has(td[class*=oldequal]))").each(function(i,tr){
  43. tr=jQuery(tr);
  44. lineContent=tr.text();
  45. patternMatch=false;
  46. for(i in lineFilters){
  47. filter=lineFilters[i];
  48. if(filter && filter.pattern && filter.pattern.test(lineContent)){
  49. //log(lineContent, filter.pattern, tr);
  50. patternMatch=true;
  51. break;
  52. }
  53. }
  54. if(patternMatch){tr.toggle();}else{//remove spaces only changes TOCONFIG
  55. var diffsInline=tr.find("[class*=dark]");
  56. if(!jQuery.trim(diffsInline.text()).length){
  57. if(diffsInline.parents("td:first").index()==0)
  58. diffsInline.addClass('oldequal');
  59. else
  60. diffsInline.addClass('newequal');
  61. }
  62. }
  63. });
  64. //0.1.5
  65. if(unsafeWindow.hookState){
  66. unsafeWindow.hookState.updateHooks();
  67. }
  68. //clipboard support
  69. //add a hidden button
  70. var filePath = jQuery('div.code:first #table-top > div:nth-child(1) h3');filePath.css("display","inline-block");
  71. var clipboardButton= jQuery("<button>Copy(<u>O</u>)</button>").attr("id","clipboardButton").attr("title","Click to copy full path.").css('margin-left',20).click(function(){
  72. GM_setClipboard(filePath.text());
  73. clipboardButton.toggleState();
  74. });
  75. clipboardButton.toggleState=function(){
  76. clipboardButton.html('Copied');
  77. unsafeWindow.setTimeout(function(){
  78. clipboardButton.html('Copy(<u>O</u>)');
  79. },2000);
  80. }
  81. onDiffPageAttachKeyEvents();
  82. filePath.after(clipboardButton);
  83. //remain current display width when jumping to another file
  84. var fileJumper=jQuery('select[onChange*=M_jumpToPatch]:first');
  85. var displayWidth=parseInt(jQuery(":input[name="+paramLineWidth+"]:visible:first").val());
  86. fileJumper.children().each(function(i,opt){
  87. if(i==0 && patternLineWidth.test(opt.value)){
  88. return false;
  89. }else if(i==0){
  90. if(isNaN(displayWidth) || displayWidth==80){
  91. displayWidth=getPreferedLineWidth();
  92. }
  93. }
  94. opt.value+='?display_width='+displayWidth;
  95. });//*/
  96. //mark file reviewed/not reviewed
  97. var statusPanel=fileJumper.parent().nextAll('div:has(a[href*=mark_file_reviewed]):first');
  98. if(statusPanel.length>0){
  99. var selectedOption=fileJumper.children(':selected:first');
  100. var markTrigger=statusPanel.find('a[href*=mark_file_reviewed]:first');
  101. var statusDescriptor=jQuery('<span style="margin-right:5px;"></span>');
  102. statusDescriptor.text('Status: '+jQuery.trim(statusPanel.text()).match(/Status:\s(\w+(\s\w+)?)/)[1]);
  103. statusPanel.html('').append(statusDescriptor).append(markTrigger);
  104. var currentReviewStatus=null;//true|false
  105. var currentReviewStatusText=null;//'Reviewed'|'Not Reviewed'
  106. var reviewStatusMap={'Reviewed':true,'Not Reviewed':false,true:'Reviewed',false:'Not Reviewed'};
  107. var getCurrentReviewStatusText=function(){
  108. if(currentReviewStatusText==null){
  109. var matchGroup=statusDescriptor.text().match(/Status:\s(\w+(\s\w+)?)/);
  110. if(matchGroup && matchGroup.length>1){
  111. currentReviewStatusText = matchGroup[1];
  112. }
  113. }
  114. return currentReviewStatusText;
  115. }
  116. var getCurrentReviewStatus=function(){
  117. if(currentReviewStatus==null){
  118. currentReviewStatusText=getCurrentReviewStatusText();
  119. currentReviewStatus=reviewStatusMap[currentReviewStatusText];
  120. }
  121. return currentReviewStatus;
  122. }
  123. var setClientReviewStatus = function(reviewed){//true|false
  124. if(reviewed==currentReviewStatus){
  125. return;
  126. }
  127. var newStatusText=reviewStatusMap[reviewed];
  128. statusDescriptor.text('Status: '+newStatusText);
  129. markTrigger.text('Change Status to '+reviewStatusMap[!reviewed]);
  130. //change selected option
  131. selectedOption.text(selectedOption.text().replace(/\((R|V)\)/,function(match0,status){
  132. return status=='V'?'(R)':'(V)';
  133. }));
  134. }
  135. var toggleClientReviewStatus = function(){
  136. setClientReviewStatus(!currentReviewStatus);
  137. };
  138. markTrigger.click(function(evt){
  139. //console.log(evt,evt.target,evt.target.href);
  140. currentReviewStatus=getCurrentReviewStatus();
  141. jQuery.ajax(evt.target.href,{
  142. success:function(data,status,xhr){
  143. //change to server status only when really successfully loaded
  144. currentReviewStatus=!currentReviewStatus;
  145. },error:function(xhr,status,errorThrown){
  146. //console.log('onerror',status,errorThrown,xhr.status,xhr);
  147. if(xhr.readyState!=0){
  148. unsafeWindow.alert('Failed to mark file as ['+currentReviewStatusText+'].');
  149. //revert change
  150. setReviewStatus(currentReviewStatus);
  151. }
  152. }
  153. });
  154. //mark successfull immediately. But if error occured later, revert this change.
  155. setTimeout(toggleClientReviewStatus,1000);
  156. return false;
  157. });
  158. }
  159. }
  160. function onDiffPageAttachKeyEvents(){
  161. var oldKeypressFn =document.onkeypress;
  162. document.onkeypress=function(evt){
  163. var ret = M_keyPressCommon(evt, function(key) {
  164. if (key == 'o') {
  165. // copy full file path
  166. var filePath = jQuery('div.code:first #table-top > div:nth-child(1) h3');filePath.css("display","inline-block");
  167. if (filePath){
  168. GM_setClipboard(filePath.text());
  169. return true;
  170. }
  171. }
  172. return false;
  173. }, M_commentTextKeyPress_);
  174. if(ret){
  175. return true;
  176. }
  177. if(oldKeypressFn){
  178. return oldKeypressFn.apply(unsafeWindow,[evt]);
  179. }
  180. return false;
  181. };
  182. }
  183. function onMainPage(){
  184. //change default line width of orareview diff page
  185. //log('onMainPage');
  186. var diffLink = null;
  187. var paramName=paramLineWidth, adjustedParamValue = preferedLineWidth?preferedLineWidth:105, paramRegExp = new RegExp(paramName+'=(\d*)');
  188. jQuery('a[href*=diff]').each(function(i,a){
  189. a=jQuery(a);
  190. diffLink = a.attr('href');
  191. if(/^\/\d+\/diff[2]?\/\d+(:\d+)?\/\d+$/.test(diffLink)){
  192. if(!/\?/.test(diffLink)){diffLink+='?';}else{
  193. if(!/\?$/.test(diffLink)){
  194. diffLink+='&';
  195. }
  196. }
  197. if(paramRegExp.test(diffLink)){
  198. diffLink=diffLink.replace(paramRegExp,paramName+'='+adjustedParamValue);
  199. }else{
  200. diffLink+=paramName+'='+adjustedParamValue;
  201. }
  202. a.attr('href',diffLink);
  203. }
  204. });
  205. }
  206. function main(){
  207. log('Orareview Helper loaded.',jQuery);
  208. unsafeWindow.jQuery=jQuery;
  209. preferedLineWidth=getPreferedLineWidth();
  210. var documentLocation = document.location.href;
  211. //log('preferedLW',preferedLineWidth,'documentLocation',documentLocation);
  212. var pattern=null;
  213. for(fnd in patternPageMap){
  214. pattern=patternPageMap[fnd];
  215. if(pattern.test(documentLocation)){
  216. log(fnd,pattern);
  217. eval(fnd+'.apply()');
  218. break;
  219. }
  220. }
  221. }
  222. main();
  223. })(window.document,jQuery);