forked from floflo3299/LSS-Scripts
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLehrgänge leichter mit Personal füllen.user.js
476 lines (364 loc) · 21.9 KB
/
Lehrgänge leichter mit Personal füllen.user.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
// ==UserScript==
// @name Lehrgänge leichter mit Personal füllen
// @namespace http://tampermonkey.net/
// @version 1.2.1
// @description enables the filtering of buildings in the creation of courses and select people faster!
// @author Silberfighter
// @include https://www.leitstellenspiel.de/buildings/*
// @include https://www.leitstellenspiel.de/schoolings/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=leitstellenspiel.de
// @require https://raw.githubusercontent.com/floflo3299/LSS-Scripts/main/HelperScripts/UTF16Converter.js
// @grant none
// ==/UserScript==
(async function() {
'use strict';
//Mit dieser Variable können Standard-Filter-Werte für einzelne Lehrgänge festgelegt werden
//Dabei muss man wie folgt vorgehen:
//1. Suche den Namen des Lehrgang raus, für welchen Standard-Filter-Werte erstellt werden sollen. Füge diesen Namen in eckigen Klammern und Anführungszeichen ein.
//Beispiel: ["GW-Gefahrgut Lehrgang"]
//2. Falls standardmäßig nach einem Gebäude gefiltert werden soll, füge in Anführungszeichen die ID dem obigen Eintrag hinzu. Andernfalls füge leere Anfähungzeichen hinzu
//Beispiel falls EIN Gebäude standardmäßig ausgewählt werden soll: ["GW-Gefahrgut Lehrgang","0"]
//Beispiel falls KEIN Gebäude standardmäßig ausgewählt werden soll: ["GW-Gefahrgut Lehrgang",""]
//3. Falls standardmäßig nach einer Erweiterung gefiltert werden soll, füge in Anführungszeichen den exakten Namen der Erweiterung dem obigen Eintrag hinzu. Andernfalls füge leere Anfähungzeichen hinzu
//Beispiel falls EINE Erweiterung standardmäßig ausgewählt werden soll: ["GW-Gefahrgut Lehrgang","0","Großwache"]
//Beispiel falls KEINE Erweiterung standardmäßig ausgewählt werden soll: ["GW-Gefahrgut Lehrgang","0",""]
//4. Falls standardmäßig nur Gebäude angezeigt werden sollen, in welchen noch keine gewisse Anzahl an Ausbildungen vorhanden ist, füge in Anführungszeichen die Anzahl der Ausbildungen dem obigen Eintrag hinzu.
//Andernfalls füge leere Anfähungzeichen hinzu
//Beispiel falls nach vorhandenen Ausbildungen gefiltert werden soll: ["GW-Gefahrgut Lehrgang","0","Großwache","6"]
//Beispiel falls nicht nach vorhandenen Ausbildungen gefiltert werden soll: ["GW-Gefahrgut Lehrgang","0","Großwache",""]
//5. Falls standardmäßig nur Gebäude angezeigt werden sollen, in welchen eine gewisse Anzahl an Leuten vorhanden ist, füge in Anführungszeichen die Anzahl der Ausbildungen dem obigen Eintrag hinzu.
//Andernfalls füge leere Anfähungzeichen hinzu
//Beispiel falls nach Anzahl des Personal gefiltert werden soll: ["GW-Gefahrgut Lehrgang","0","Großwache","6","80"]
//Beispiel falls nicht nach Anzahl des Personals gefiltert werden soll: ["GW-Gefahrgut Lehrgang","0","Großwache","6",""]
//6. Füge zum Schluss ein Komma hinten hinzu
//Beispiel: ["GW-Gefahrgut Lehrgang","0","Großwache","6","80"],
//7. Diesen nun generierten Eintrag fügst du unten zwischen den beiden Kommentaren ein. Ob du alle Einträge in eine Zeile schreibst oder in eine Zeile nur einen Eintrag ist egal.
//Die zur Zeit darin befindlichen Einträge sind Beispiele und können rausgelöscht werden
var standardFilterWerte = [
//***** unterhalb von hier einfügen *****
["SEK","11","SEK","18","53"],
["MEK","11","MEK","18","53"],
//***** oberhalb von hier einfügen *****
];
var defaultValueSettings = [["","","","",""]]
var feuerwehrAusbauten = ["Rettungsdienst-Erweiterung","Wasserrettungs-Erweiterung","Flughafen-Erweiterung","Großwache","Werkfeuerwehr","Abrollbehälter-Stellplatz","Lüfter-Erweiterung","NEA50-Erweiterung","NEA200-Erweiterung"];
var thwAusbauten = ["Zugtrupp","Fachgruppe Räumen","Fachgruppe Wassergefahren","Fachgruppe Ortung","Fachgruppe Wasserschaden/Pumpen","Fachgruppe Schwere Bergung","Fachgruppe Elektroversorgung"];
var polizeiAusbauten = ["Technischer Zug: Wasserwerfer","SEK","MEK","Diensthundestaffel","Kriminalpolizei-Erweiterung","Dienstgruppenleitung-Erweiterung","Außenlastbehälter-Erweiterung"];
var rettungsDienstAusbauten = ["Wasserrettungs-Erweiterung","Rettungshundestaffel"];
var feuerwehrGebaeude = [["Feuerwache",0],["Feuerwache (Kleinwache)",18]];
var thwGebaeude = [["THW Ortsverband",9]];
var polizeiGebaeude = [["Polizeiwache",6],["Polizeiwache (Kleinwache)",19],["Bereitschaftspolizei",11],["Polizeihubschrauber-Station",13],["Polizei-Sondereinheit",17]];
var rettungsDienstGebaeude = [["Rettungswache",2],["Rettungswache (Kleinwache)",20],["Rettungshubschrauber-Station",5],["Rettungshundestaffel",21],["SEG",12],["Wasserrettungswache",15]];
var buildings;
if (!sessionStorage.c2Buildings || JSON.parse(sessionStorage.c2Buildings).lastUpdate < (new Date().getTime() - 5 * 1000 * 60) || JSON.parse(sessionStorage.c2Buildings).userId != user_id) {
await $.getJSON('/api/buildings').done(data => sessionStorage.setItem('c2Buildings', JSON.stringify({ lastUpdate: new Date().getTime(), value: LZString.compress(JSON.stringify(data)), userId: user_id })));
}
buildings = JSON.parse(LZString.decompress(JSON.parse(sessionStorage.c2Buildings).value));
var buildingType = 0;
if(window.location.href.includes("leitstellenspiel.de/buildings/")){
buildingType = document.getElementsByTagName("h1")[0].getAttribute("building_type");
} else if(window.location.href.includes("leitstellenspiel.de/schoolings/")){
var shownBuildings = Array.prototype.slice.call($('#accordion')[0].getElementsByTagName("div"));
shownBuildings = shownBuildings.filter(b => b.hasAttribute("building_id"));
shownBuildings = shownBuildings.map(b => parseInt(b.getAttribute("building_id")));
shownBuildings = shownBuildings.map(b => {
var filteredB = buildings.filter(b2 => b2.id == b);
if(filteredB.length > 0){
return filteredB[0].building_type;
} else {
return -1;
}
});
if (shownBuildings.filter(b => parseInt(b) == 0).length > 0){
buildingType = 1;
}
if (shownBuildings.filter(b => parseInt(b) == 2).length > 0){
buildingType = 3;
}
if (shownBuildings.filter(b => parseInt(b) == 6).length > 0){
buildingType = 8;
}
if (shownBuildings.filter(b => parseInt(b) == 9).length > 0){
buildingType = 10;
}
}
var allBuil = [];
if (buildingType == 1 || buildingType == 3 || buildingType == 8 || buildingType == 10){
var dropDownSelectionAusbau = [];
var dropDownSelectionGebaeude = [];
if (buildingType == 1){
dropDownSelectionAusbau = feuerwehrAusbauten;
dropDownSelectionGebaeude = feuerwehrGebaeude;
}
if (buildingType == 3){
dropDownSelectionAusbau = rettungsDienstAusbauten;
dropDownSelectionGebaeude = rettungsDienstGebaeude;
}
if (buildingType == 8){
dropDownSelectionAusbau = polizeiAusbauten;
dropDownSelectionGebaeude = polizeiGebaeude;
}
if (buildingType == 10){
dropDownSelectionAusbau = thwAusbauten;
dropDownSelectionGebaeude = thwGebaeude;
}
//var building = cBuildings.filter(b => b.id == buildingID)[0];
var newWindow = document.createElement("div");
var text = `
<p style="display: inline-block"><b>Achtung! Achtung! Achtung! Bei der Verwendung von Skripten, welche die Oberfläche verändern (z.B. LSS-Manager oder das Lehrgangsskript vom Waldgott) kann es passieren, dass die Lehrgangs-Skripte nicht mehr funktioniert! In diesem Fall das oberflächenverändernde Skript ausschalten und nach der Lehrgangszuweisung wieder einschalten.</b></p>`;
newWindow.innerHTML = text;
$('#accordion').before(newWindow);
newWindow = document.createElement("div");
text = `
<p style="display: inline-block"><b>TIP: öffne die Gebäude von unten nach oben, dann musst du nicht scrollen!</b></p>`;
newWindow.innerHTML = text;
$('#accordion').before(newWindow);
newWindow = document.createElement("div");
text = `
<p style="display: inline-block"><b>Wenn unten in der Liste am rechten Rand "Lade..." erscheint und nicht mehr verschwindet, einmal minimal scrollen!</b></p>`;
newWindow.innerHTML = text;
$('#accordion').before(newWindow);
newWindow = document.createElement("div");
text = `
Nach Gebäuden filtern
<select id="gebaeudeArt" name="gebaeudeFiltern" style="display:inline-block; color: #000;">
<option value="">nicht filtern</option>`;
for(var i = 0; i < dropDownSelectionGebaeude.length; i++){
text += `<option value="` + dropDownSelectionGebaeude[i][1] +`">`+ dropDownSelectionGebaeude[i][0] +`</option>`;
}
text += `</select>`;
newWindow.innerHTML = text;
$('#accordion').before(newWindow);
newWindow = document.createElement("div");
text = `
Nach Ausbauten filtern
<select id="ausbau" name="ausbauFiltern" style="display:inline-block; color: #000;">
<option value="">nicht filtern</option>`;
for(i = 0; i < dropDownSelectionAusbau.length; i++){
text += `<option value="` + dropDownSelectionAusbau[i] +`">`+ dropDownSelectionAusbau[i] +`</option>`;
}
text += `</select>`;
newWindow.innerHTML = text;
$('#accordion').before(newWindow);
newWindow = document.createElement("div");
text = `
Lager vorhanden:
<input type="checkbox" id="lager" name="lagerFiltern" style="display:inline-block; color: #000;">`;
newWindow.innerHTML = text;
$('#accordion').before(newWindow);
newWindow = document.createElement("div");
text = `
<p style="display: inline-block">zeige nur Wachen mit weniger Ausbildungen als ausgewählter Anzahl an:</p>
<input style="display:inline-block; color: #000; width:50px;" type="number" id="maxAusbildungen" min="1" value=""></input>`;
newWindow.innerHTML = text;
$('#accordion').before(newWindow);
newWindow = document.createElement("div");
text = `
<p style="display: inline-block">zeige nur Wachen an, die mindestens die ausgewählte Personenanzahl haben:</p>
<input style="display:inline-block; color: #000; width:50px;" type="number" id="minPerson" min="1" value=""></input>`;
newWindow.innerHTML = text;
$('#accordion').before(newWindow);
let div = document.createElement("div");
div.className = "navbar-text navbar-right"
div.innerHTML = `
<p style="display: inline-block">füllt die Anzahl der Ausbildungen pro Wache bis zur gewählten Zahl auf </p>
<input style="display:inline-block; color: #000; width:50px;" type="number" id="maxPerBuilding" min="1" value="1"></input>
<a id="btnAutoSelect" class="btn btn-success">Auswählen</a>
<input id="noEduc" name="noEduc" type="checkbox" checked="true">
<label class="" for="noEduc">nur Personal ohne Ausbildung</label>
<input id="noAss" name="noAss" type="checkbox" checked="true">
<label class="" for="noAss">nur ungebundenes Personal</label>
`;
let insertBeforeElement = $('#schooling_free')[0].parentElement
insertBeforeElement.parentElement.insertBefore(div, insertBeforeElement);
$('#btnAutoSelect').on('click', function() { autoSelectPeople(); });
//document.getElementById('ausbau').addEventListener ('change', filterBuildings);
//document.getElementById('maxAusbildungen').addEventListener ('change', filterBuildings);
allBuil = Array.prototype.slice.call($('#accordion')[0].getElementsByClassName('panel panel-default'));
var setting = [];
var relevantRadioButtons = Array.prototype.slice.call(document.getElementsByTagName("input")).filter(e => e.getAttribute("class") == "radio");
relevantRadioButtons = relevantRadioButtons.filter(e => e.getAttribute("id").indexOf("education_") >= 0);
if(document.getElementsByTagName("h2").length > 0 && (document.getElementsByTagName("h2")[0] == null || document.getElementsByTagName("h2")[0].parentNode.className != "alert alert-info")){
setting = standardFilterWerte.filter((e) => e[0] === document.getElementsByTagName("h2")[0].innerText);
} else if(relevantRadioButtons.length > 0){
checkForRadioButtonChange();
}
if(setting.length > 0){
$("#gebaeudeArt")[0].value = setting[0][1];
$("#ausbau")[0].value = setting[0][2];
$("#maxAusbildungen")[0].value = setting[0][3];
$("#minPerson")[0].value = setting[0][4];
$("#maxPerBuilding")[0].value = setting[0][3];
if(setting[0][3] == ""){
$("#maxPerBuilding")[0].value = 1;
}
}
}
var oldSelection = "";
async function checkForRadioButtonChange(){
var changed = false;
for(let n = 0; n < relevantRadioButtons.length; n++){
if(relevantRadioButtons[n].checked){
var text = relevantRadioButtons[n].parentNode.innerText
text = text.substring(0, text.lastIndexOf("(")).trim();
if(oldSelection != text){
oldSelection = text;
setting = standardFilterWerte.filter((e) => e[0] === text);
changed = true;
if(setting.length == 0){
setting = defaultValueSettings;
}
}
}
}
if(changed){
$("#gebaeudeArt")[0].value = setting[0][1];
$("#ausbau")[0].value = setting[0][2];
$("#maxAusbildungen")[0].value = setting[0][3];
$("#minPerson")[0].value = setting[0][4];
$("#maxPerBuilding")[0].value = setting[0][3];
if(setting[0][3] == ""){
$("#maxPerBuilding")[0].value = 1;
}
}
await delay(500);
checkForRadioButtonChange();
}
var relevantBuildingIDs = [];
var oldAusbauSelection = NaN;
var oldGebäudeSelection = NaN;
var oldNumPeopleSelection = NaN;
var oldLagerSelection = NaN;
function updateRelevantBuildings(){
oldAusbauSelection = document.getElementById('ausbau').value;
oldGebäudeSelection = document.getElementById('gebaeudeArt').value;
oldNumPeopleSelection = document.getElementById('minPerson').value;
oldLagerSelection = document.getElementById('lager').checked;
relevantBuildingIDs = [];
var filtered;
filtered = buildings.filter((e) => {
if(e.extensions){
return (document.getElementById('gebaeudeArt').value == "" || e.building_type == parseInt(oldGebäudeSelection)) && (document.getElementById('minPerson').value == "" || parseInt(document.getElementById('minPerson').value) <= e.personal_count) &&
(document.getElementById('ausbau').value == "" || e.extensions.filter((e1) => e1.caption.indexOf(document.getElementById('ausbau').value) >= 0).length > 0) &&
(oldLagerSelection == false || e.storage_upgrades.length > 0);
} else {
return false;
}
});
for(var n=0; n < filtered.length; n++){
relevantBuildingIDs.push(parseInt(filtered[n].id));
}
}
filterBuildings();
async function filterBuildings(){
if(buildings){
if(oldAusbauSelection != document.getElementById('ausbau').value || oldGebäudeSelection != document.getElementById('gebaeudeArt').value || oldNumPeopleSelection != document.getElementById('minPerson').value ||
oldLagerSelection != document.getElementById('lager').checked){
updateRelevantBuildings();
}
for(var n = 0; n < allBuil.length;n++){
if(relevantBuildingIDs.includes(parseInt(allBuil[n].getElementsByClassName('panel-heading personal-select-heading')[0].getAttribute("building_id"))) &&
(document.getElementById('maxAusbildungen').value == "" || parseInt(document.getElementById('maxAusbildungen').value) > getNumAusbildungen(allBuil[n]))){
allBuil[n].setAttribute("class", "panel panel-default");
} else {
allBuil[n].setAttribute("class", "panel-body hidden");
if(allBuil[n].getElementsByClassName('panel-body').length > 0 && allBuil[n].getElementsByClassName('panel-body hidden').length == 0){
allBuil[n].getElementsByClassName('panel-heading personal-select-heading')[0].click();
var allPeople = Array.prototype.slice.call(allBuil[n].getElementsByTagName("tr"));
allPeople.shift();
for (let i = 0; i < allPeople.length; i++) {
UnselectPeople(allPeople[i]);
}
}
}
}
}
await delay(500);
filterBuildings();
}
function delay(milliseconds){
return new Promise(resolve => {
setTimeout(resolve, milliseconds);
});
}
function autoSelectPeople() {
var allBuildings = Array.prototype.slice.call(document.getElementsByClassName("table table-striped tablesorter tablesorter-default"));
allBuildings = allBuildings.filter(item => new String(item.parentElement.className).valueOf() != new String("panel-body hidden").valueOf());
allBuildings.forEach(item => {
var allPeople = Array.prototype.slice.call(item.getElementsByTagName("tr"));
allPeople.shift();
var curSelected = getNumAusbildungen2(item);
for (let i = 0; i < allPeople.length; i++) {
if(IsPeopleAvailable(allPeople[i]) && IsPeopleSelected(allPeople[i])){
curSelected += 1;
}
if(IsPeopleAvailable(allPeople[i]) && IsPeopleSelected(allPeople[i]) && ((document.getElementById("noEduc").checked && HasPeopleASTraining(allPeople[i])) || (document.getElementById("noAss").checked && IsPeopleGebunden(allPeople[i])))){
UnselectPeople2(allPeople[i]);
curSelected -= 1;
}
}
var maxPerBuilding = $('#maxPerBuilding').val();
for (let i = 0; i < allPeople.length; i++) {
if(curSelected < maxPerBuilding && IsPeopleAvailable(allPeople[i]) && !IsPeopleSelected(allPeople[i]) && (!document.getElementById("noEduc").checked || !HasPeopleASTraining(allPeople[i])) && (!document.getElementById("noAss").checked || !IsPeopleGebunden(allPeople[i]))){
SelectPeople(allPeople[i]);
curSelected += 1;
}
if(curSelected > maxPerBuilding && IsPeopleAvailable(allPeople[i]) && IsPeopleSelected(allPeople[i])){
UnselectPeople2(allPeople[i]);
curSelected -= 1;
}
}
});
}
function getNumAusbildungen(building){
var returnValue = 0;
if(building.getElementsByClassName("label label-success").length > 0){
returnValue += parseInt(building.getElementsByClassName("label label-success")[0].innerHTML) || 0;
}
if(building.getElementsByClassName("label label-info").length > 0){
returnValue += parseInt(building.getElementsByClassName("label label-info")[0].innerHTML) || 0;
}
return returnValue;
}
function getNumPeople(building){
return parseInt(building.getElementsByClassName("label label-default ")[0].innerHTML) || 0;
}
function UnselectPeople(entry){
if(entry.getElementsByTagName("td")[0].getElementsByTagName("input").length > 0 && entry.getElementsByTagName("td")[0].getElementsByTagName("input")[0].checked){
entry.getElementsByTagName("td")[0].getElementsByTagName("input")[0].click();
}
}
function getNumAusbildungen2(building){
building = building.parentNode.parentNode;
var returnValue = 0;
if(building.getElementsByClassName("label label-success").length > 0){
returnValue += parseInt(building.getElementsByClassName("label label-success")[0].innerHTML) || 0;
}
if(building.getElementsByClassName("label label-info").length > 0){
returnValue += parseInt(building.getElementsByClassName("label label-info")[0].innerHTML) || 0;
}
return returnValue;
}
function IsPeopleSelected(entry){
return entry.getElementsByTagName("td")[0].getElementsByTagName("input")[0].checked;
}
function SelectPeople(entry){
if(!entry.getElementsByTagName("td")[0].getElementsByTagName("input")[0].checked && parseInt($('#schooling_free')[0].innerHTML) > 0){
entry.getElementsByTagName("td")[0].getElementsByTagName("input")[0].click();
}
}
function UnselectPeople2(entry){
if(entry.getElementsByTagName("td")[0].getElementsByTagName("input")[0].checked){
entry.getElementsByTagName("td")[0].getElementsByTagName("input")[0].click();
}
}
function IsPeopleAvailable(entry){
return new String(entry.getElementsByTagName("td")[0].innerHTML).valueOf().trim() != new String("").valueOf();
}
function HasPeopleASTraining(entry){
return new String(entry.getElementsByTagName("td")[2].innerHTML).valueOf().trim() != new String("").valueOf();
}
function IsPeopleGebunden(entry){
return new String(entry.getElementsByTagName("td")[3].innerHTML).valueOf().trim() != new String("").valueOf();
}
})();