]> src.twobees.de Git - tampermonkeyscripts.git/blobdiff - AzureDevOpsCommentEnhancer.user.js
0.18: make '@@DEPENDENCIES' blue
[tampermonkeyscripts.git] / AzureDevOpsCommentEnhancer.user.js
index 9d1c5a280d21b5ab6f3b01b9ba03a33f13788843..b42e8bec2a74c500f46c308e55514cb6f66595ea 100644 (file)
 // ==UserScript==
 // @name         Fix ADS checkin comments in discussion and history of workitems
-// @version      0.3
+// @version      0.18
 // @author       Tobias Sachs
-//  ... add match eg https://myazerdevops/*
-// @match        https://
-// @updateURL    https://github.com/tsheba/tampermonkeyscripts/raw/master/AzureDevOpsCommentEnhancer.user.js
-// @downloadURL  https://github.com/tsheba/tampermonkeyscripts/raw/master/AzureDevOpsCommentEnhancer.user.js
+//  ... in @match replace "ads" with the url of you Azure DevOps Server
+// @match        https://ads/*
+// @updateURL    https://src.twobees.de/?p=tampermonkeyscripts.git;a=blob_plain;f=AzureDevOpsCommentEnhancer.user.js;hb=HEAD
+// @downloadURL  https://src.twobees.de/?p=tampermonkeyscripts.git;a=blob_plain;f=AzureDevOpsCommentEnhancer.user.js;hb=HEAD
 // @grant        none
+// @description
 // ==/UserScript==
 
+// 0.18: make '@@DEPENDENCIES' blue
+// 0.17: search caseless for '@@CUST'
+// 0.16: do not modify a comment more than once
+// 0.15: fix links to work items found in commitmessages (e.g. #1235)
+// 0.14: also check html property of comments
+// 0.13: Allow to manually insert changeset comments, which where not associated with the item during checking.
+//       Just copy changecomment into the commentsection and prefix with "Associated with changeset CHANGESET_NUMBER:"
+// 0.12: also fix "Resolved with changeset" comments
+// 0.11: fix regexp for later changesets attached.
+// 0.10: #Bugnumber to links, highlight comments for customors in checkins
+// 0.09: updateq download/update URLs
+// 0.08: fix typregexp for later changesets attachedos/formatting
+// 0.07: fix work itlsem tampering
+// 0.06: Add link to Changeset in diff view
+
+/* jshint esversion:6 */
 (function() {
     'use strict';
-    let timerId = undefined;
-    let fixComments = (items) =>
-    {
-        if (items === null || items === undefined || items.length === 0)
-        {
+    let timerId;
+
+    let fixWorkitems = () => {
+        let found = document.getElementsByClassName("comment-content");
+        fixCommentContents(found);
+
+        found = document.getElementsByClassName("history-item-comment");
+        fixCommentContents(found);
+
+        console.debug("observe...");
+    };
+
+    let checkRegex = /^.*(Associated|Resolved).*[:.]/;
+    let fixCommentContents = (items) => {
+        if (items === null || items === undefined || items.length === 0) {
             return;
         }
         console.info("fixing '" + items.length +"' comments.");
-        for (var i = 0; i < items.length; i++){
+        for (var i = 0; i < items.length; i++) {
             let el = items[i];
+            if(el.wasTampered) { continue; }
+
             let html = el.innerHTML;
-            if (html.startsWith("Associated"))
-            {
-                html = html.replace(/(Associated with changeset )(\d*):/, "<b>$1<a href='/HeBa/Entwicklung/_versionControl/changeset/$2'>$2</a></b>:<br />");
-                el.innerHTML = html.replace(/\n/gi, "<br />");
+            if (    checkRegex.test(html)
+                || (el.textContext && checkRegex.test(el.textContext))
+               ) {
+                html = html.replace(/((Associated|Resolved) with changeset )(\d*)([:.])/,
+                    "<b>$1<a href='/HeBa/Entwicklung/_versionControl/changeset/$3'>$3</a></b>$4<br />");
+                html = html.replace(/#(\d+)/g, "<a href='/HeBa/Entwicklung/_workitems/edit/$1'>#$1</a>");
+                html = html.replace(/\n/gi, "<br />");
+                html = html.replace(/(@@CUST.*)/is, "<br><span style=\"color: green; font-style:italic;\">$1</span>");
+                html = html.replace(/(@@Dependencies.*)/is, "<span style=\"color: blue; font-style:italic;\">$1</span>");
+                el.innerHTML = html;
+                el.wasTampered = "😋";
             }
         }
     };
+
+    let fixVersionControl = () => {
+        let elToFix;
+        let found = document.getElementsByClassName("changeset-version")[0];
+        if (!found) {
+            return;
+        }
+
+        // if opened from email notification, it is the first span in div "changeset-version"
+        elToFix = found.querySelector("span");
+
+        if (!elToFix) {
+            return;
+        }
+
+        elToFix.innerHTML = elToFix.innerHTML
+            .replace(/(Changeset )(\d+)/,
+                "$1<a href='/HeBa/Entwicklung/_versionControl/changeset/$2'>$2</a>");
+    };
+
     let fixit = () => {
-        if (timerId){
+        if (timerId) {
             console.debug("fixit timerreset...");
             clearTimeout(timerId);
         }
 
         observer.disconnect();
-        timerId = setTimeout(function(){
+
+        timerId = setTimeout(function() {
             timerId = undefined;
-            let found = document.getElementsByClassName("comment-content");
-            fixComments(found);
 
-            found = document.getElementsByClassName("history-item-comment");
-            fixComments(found);
+            let url = window.location.href;
 
-            console.debug("observe...");
+            if (url.includes("/_versionControl")) {
+                fixVersionControl();
+            }
+            else {
+                // if (url.includes("/_workitems")){
+                // does not work since workitems are often shown in
+                // dialogs on random pages
+                fixWorkitems();
+            }
+
+            // keep watching for changes
             observer.observe(document, { subtree: true, childList: true, characterData: true });
         }, 300);
     };
 
     const observer = new MutationObserver(function() {
-        console.debug('observertriggered...');
+        console.debug('observer was triggered...');
         fixit();
     });
 
     fixit();
 
 })();
+