]> src.twobees.de Git - tampermonkeyscripts.git/blob - AzureDevOpsChangesetCommentSearch.js
version update test...
[tampermonkeyscripts.git] / AzureDevOpsChangesetCommentSearch.js
1 // ==UserScript==
2 // @name         ADS changeset comment search
3 // @version      0.2
4 // @description  Places a searchbox somewhere to search commit messages
5 // @author       Tobias Sachs
6 // @match        https://ads/*
7 // @grant        none
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
10 // ==/UserScript==
11
12 /* jshint esversion:6 */
13 (function() {
14     'use strict';
15     let timerId;
16     let timerSuche;
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/`;
20
21     let totalReceived = 0;
22     let matchesFound = 0;
23
24     let suchWasDelayed = function(){
25         if (timerSuche) {
26             clearTimeout(timerSuche);
27         }
28         timerSuche = setTimeout( () =>
29             {
30                 timerSuche = undefined;
31                 suchWas();
32             }, 200);
33     };
34
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));
40         };
41         xhr.open('GET', pollUrl + skipParm + skipCnt, true);
42         xhr.send();
43     };
44
45     let searchItems = function(xhr){
46
47         console.info("Die daten sind da...");
48         if (xhr.status !== 200){
49             console.info("poll failed: " + xhr.statusText);
50             return;
51         }
52         let s = document.getElementById('suchBox').value;
53         let resultDiv = document.getElementById('suchErg');
54         let statsSpan = document.getElementById('suchStats');
55
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){
60             let cs = d.value[e];
61
62             if (cs.comment && regex.test(cs.comment)){
63                 matchesFound++;
64                 let comment = cs.comment.replace(regex, `<span style="background: orange;">$1</span>`);
65                 let item =
66                     `<div style='margin: 2px;' >`
67                     + `<a href='` + changeSetUrl
68                     + cs.changesetId + `'>` + cs.changesetId + '</a>'
69                     + ": " + comment + " (" + cs.author.displayName + ")"
70                     + `</div>`;
71                 resultDiv.innerHTML += item;
72             }
73         }
74         statsSpan.innerHTML = "matches: " + matchesFound +" searched comments: " + totalReceived;
75         if (d.value.length > 0)
76         {
77             requestNext(totalReceived);
78         }
79         else
80         {
81             statsSpan.innerHTML += " -- All comments searched.";
82         }
83     };
84
85     let suchWas = function (){
86         let s = document.getElementById('suchBox');
87         let results = document.getElementById('suchErg');
88         totalReceived = 0;
89         matchesFound = 0;
90         results.innerHTML = "";
91         document.getElementById('suchStats').innerHTML = "";
92         if (s.value.length < 3){
93             return;
94         }
95
96         requestNext(0);
97     };
98
99     let addSearch = () => {
100         if (timerId) {
101             clearTimeout(timerId);
102         }
103         observer.disconnect();
104
105         timerId = setTimeout(function() {
106             timerId = undefined;
107             if (window.location.href.includes("_apis")){
108                 return;
109             }
110             if (window.location.href.includes("_sprints")){
111                 // macht sonst irgendwie das man im sprintboard nix anklicken kann ¯\_(ツ)_/¯
112                 return;
113             }
114             let search = document.getElementById('supersearch');
115             if (!search){
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>
120                             </div>`;
121
122                 document.body.insertAdjacentHTML('afterbegin', html);
123                 let s = document.getElementById('suchBox');
124                 s.addEventListener("keyup", suchWasDelayed);
125             }
126
127             // keep watching for changes
128             observer.observe(document, { subtree: true, childList: true, characterData: true });
129         }, 500);
130     };
131
132     const observer = new MutationObserver(function() {
133         addSearch();
134     });
135
136     addSearch();
137
138 })();