// ==UserScript==
// @name Fix ADS checkin comments in discussion and history of workitems
-// @version 0.4
+// @version 0.13
// @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.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];
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(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/_versionControl/changeset/$1'>#$1</a>");
+ html = html.replace(/\n/gi, "<br />");
+ html = html.replace(/(@@CUST.*)/s, "<br><span style=\"color: green; font-style:italic;\">$1</span>");
+ el.innerHTML = html;
}
}
};
+
+ 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();
})();
+