2 // @name ADS changeset comment search
4 // @description Places a searchbox somewhere to search commit messages
5 // @author Tobias Sachs
6 // @match https://ads/*
8 // @updateURL https://src.twobees.de/?p=tampermonkeyscripts.git;a=blob_plain;f=AzureDevOpsChangesetCommentSearch.js;hb=HEAD
9 // @downloadURL https://src.twobees.de/?p=tampermonkeyscripts.git;a=blob_plain;f=AzureDevOpsChangesetCommentSearch.js;hb=HEAD
12 /* jshint esversion:6 */
17 let pollUrl = 'https://ads/HeBa/Entwicklung/_apis/tfvc/changesets?$top=1000?maxCommentLength=500';
18 let skipParm = '&$skip=';
19 let changeSetUrl = `/HeBa/Entwicklung/_versionControl/changeset/`;
21 let totalReceived = 0;
24 let suchWasDelayed = function(){
26 clearTimeout(timerSuche);
28 timerSuche = setTimeout( () =>
30 timerSuche = undefined;
35 let requestNext = function(skipCnt){
36 let xhr = new XMLHttpRequest();
37 xhr.onload = () => searchItems(xhr);
38 xhr.onerror = function (e){
39 console.warning(`poll error: ${e.type}: ${e.loaded} bytes transferred\n` + JSON.stringify(e));
41 xhr.open('GET', pollUrl + skipParm + skipCnt, true);
45 let searchItems = function(xhr){
47 console.info("Die daten sind da...");
48 if (xhr.status !== 200){
49 console.info("poll failed: " + xhr.statusText);
52 let s = document.getElementById('suchBox').value;
53 let resultDiv = document.getElementById('suchErg');
54 let statsSpan = document.getElementById('suchStats');
56 var d = JSON.parse(xhr.responseText);
57 var regex = new RegExp("("+s+")", 'gi');
58 totalReceived += d.value.length;
59 for (let e in d.value){
62 if (cs.comment && regex.test(cs.comment)){
64 let comment = cs.comment.replace(regex, `<span style="background: orange;">$1</span>`);
66 `<div style='margin: 2px;' >`
67 + `<a href='` + changeSetUrl
68 + cs.changesetId + `'>` + cs.changesetId + '</a>'
69 + ": " + comment + " (" + cs.author.displayName + ")"
71 resultDiv.innerHTML += item;
74 statsSpan.innerHTML = "matches: " + matchesFound +" searched comments: " + totalReceived;
75 if (d.value.length > 0)
77 requestNext(totalReceived);
81 statsSpan.innerHTML += " -- All comments searched.";
85 let suchWas = function (){
86 let s = document.getElementById('suchBox');
87 let results = document.getElementById('suchErg');
90 results.innerHTML = "";
91 document.getElementById('suchStats').innerHTML = "";
92 if (s.value.length < 3){
99 let addSearch = () => {
101 clearTimeout(timerId);
103 observer.disconnect();
105 timerId = setTimeout(function() {
107 if (window.location.href.includes("_apis")){
110 if (window.location.href.includes("_sprints")){
111 // macht sonst irgendwie das man im sprintboard nix anklicken kann ¯\_(ツ)_/¯
114 let search = document.getElementById('supersearch');
116 let html = `<div id="supersearch" style="display: block;position: absolute; left: 450px; top: 0px; height: auto; z-index: 9999;" >
117 <input id="suchBox" placeholder="search commit" />
118 <span id="suchStats"> </span>
119 <div id="suchErg" style="max-height: 500px; background:#CCCCCC; overflow: auto;" ></div>
122 document.body.insertAdjacentHTML('afterbegin', html);
123 let s = document.getElementById('suchBox');
124 s.addEventListener("keyup", suchWasDelayed);
127 // keep watching for changes
128 observer.observe(document, { subtree: true, childList: true, characterData: true });
132 const observer = new MutationObserver(function() {