Sprechwunschfilter

Fügt Filter für Sprechwünsche hinzu

// ==UserScript==
// @name         Sprechwunschfilter
// @namespace    leeSalami.lss
// @version      1.3.2
// @description  Fügt Filter für Sprechwünsche hinzu
// @author       leeSalami
// @license      MIT
// @match        https://*.leitstellenspiel.de/vehicles/*
// @exclude      /zuweisung$/
// @exclude      /stats$/
// @exclude      /move$/
// @exclude      /edit$/
// @grant        GM.getValue
// @grant        GM.setValue
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_addStyle
// ==/UserScript==

(async function () {
  'use strict';

  const AUTO_GO_TO_NEXT = true;

  let freePlaces, fees, transportationDistance, special;
  const nextButton = document.getElementById('next-vehicle-fms-5');

  if (document.querySelector('div[data-transport-request-type="patient"]')) {
    freePlaces = await GM.getValue('beds', false);
    fees = await GM.getValue('fees', '');
    transportationDistance = await GM.getValue('distance', '');
    special = await GM.getValue('special', false);

    setStyle();
    setButtons(true);
    filterHospitals();
  } else if (document.querySelector('div[data-transport-request-type="prisoner"]')) {
    freePlaces = await GM.getValue('cells', false);
    transportationDistance = await GM.getValue('jailDistance', '');
    fees = await GM.getValue('jailFees', '');

    setStyle();
    setButtons();
    filterCells();
  } else if (AUTO_GO_TO_NEXT === true && nextButton !== null) {
    nextButton.click();
  }

  function setButtons(hospital = false) {
    const container = document.createElement('div');
    container.className = 'vehicle-transport-request-filter-box';

    const titleContainer = document.createElement('div');
    titleContainer.className = 'vehicle-transport-request-filter-title-container';

    const title = document.createElement('strong');
    title.className = 'vehicle-transport-request-filter-title';
    title.textContent = 'Sprechwunschfilter';
    titleContainer.append(title);
    container.append(titleContainer);

    const select = document.createElement('select');
    select.id = 'transport_request_fee';
    select.className = 'selectpicker transport-request transport-request-filter';
    select.dataset.container = 'body';

    const options = ['', '0', '10', '20', '30', '40', '50'];

    for (let i = 0, n = options.length; i < n; i++) {
      const option = document.createElement('option');
      option.value = options[i];

      if (options[i] !== '') {
        option.text = 'max. ' + options[i] + ' %';
      } else {
        option.text = 'Unbegrenzte Abgabe';
      }

      if (fees === options[i]) {
        option.selected = true;
      }

      select.append(option);
    }

    container.append(select);

    const distanceSelect = document.createElement('select');
    distanceSelect.id = 'transport_request_distance';
    distanceSelect.className = 'selectpicker transport-request transport-request-distance-filter';
    distanceSelect.dataset.container = 'body';

    const distanceOptions = ['', '5', '10', '15', '20', '25', '50', '75', '100'];

    for (let i = 0, n = distanceOptions.length; i < n; i++) {
      const option = document.createElement('option');
      option.value = distanceOptions[i];

      if (distanceOptions[i] !== '') {
        option.text = 'max. ' + distanceOptions[i] + ' km';
      } else {
        option.text = 'Unbegrenzte Entfernung';
      }

      if (transportationDistance === distanceOptions[i]) {
        option.selected = true;
      }

      distanceSelect.append(option);
    }

    container.append(distanceSelect);

    const buttonGroup = document.createElement('div');
    buttonGroup.className = 'btn-group';

    if (hospital) {
      const specialDepartmentToggle = document.createElement('a');
      specialDepartmentToggle.className = 'btn';
      specialDepartmentToggle.id = 'special_department_toggle';
      specialDepartmentToggle.title = 'Grün = Es wird nach Fachabteilung gefiltert. Rot = Es wird nicht nach Fachabteilung gefiltert.';
      specialDepartmentToggle.textContent = 'Fachabteilung';
      specialDepartmentToggle.addEventListener('click', patientConfigChange);

      if (special === true) {
        specialDepartmentToggle.classList.add('btn-success');
      } else {
        specialDepartmentToggle.classList.add('btn-default');
      }

      buttonGroup.append(specialDepartmentToggle);
    }

    const freePlacesToggle = document.createElement('a');
    freePlacesToggle.className = 'btn';
    freePlacesToggle.id = 'free_places_toggle';

    if (hospital) {
      select.addEventListener('change', patientConfigChange);
      distanceSelect.addEventListener('change', patientConfigChange);

      freePlacesToggle.title = 'Grün = Es wird nach freien Betten gefiltert. Rot = Es wird nicht nach freien Betten gefiltert.';
      freePlacesToggle.textContent = 'Freie Betten';
      freePlacesToggle.addEventListener('click', patientConfigChange);
    } else {
      select.addEventListener('change', prisonerConfigChange);
      distanceSelect.addEventListener('change', prisonerConfigChange);

      freePlacesToggle.title = 'Grün = Es wird nach freien Zellen gefiltert. Rot = Es wird nicht nach freien Zellen gefiltert.';
      freePlacesToggle.textContent = 'Freie Zellen';
      freePlacesToggle.addEventListener('click', prisonerConfigChange);
    }

    if (freePlaces === true) {
      freePlacesToggle.classList.add('btn-success');
    } else {
      freePlacesToggle.classList.add('btn-default');
    }

    buttonGroup.append(freePlacesToggle);
    container.append(buttonGroup);

    if (hospital) {
      document.querySelector('div[data-transport-request-type] .alert.alert-info').after(container);
    } else {
      document.querySelector('div[data-transport-request-type] .alert.alert-info').before(container);
    }

    $('.selectpicker.transport-request').selectpicker();
  }

  async function patientConfigChange(e) {
    if (e.currentTarget.classList.contains('btn-success')) {
      e.currentTarget.classList.replace('btn-success', 'btn-default');
    } else if (e.currentTarget.classList.contains('btn-default')) {
      e.currentTarget.classList.replace('btn-default', 'btn-success');
    }

    freePlaces = !document.getElementById('free_places_toggle').classList.contains('btn-default');
    special = !document.getElementById('special_department_toggle').classList.contains('btn-default');
    fees = document.getElementById('transport_request_fee').value;
    transportationDistance = document.getElementById('transport_request_distance').value;
    filterHospitals();
    await GM.setValue('beds', freePlaces);
    await GM.setValue('fees', fees);
    await GM.setValue('distance', transportationDistance);
    await GM.setValue('special', special);
  }

  async function prisonerConfigChange(e) {
    if (e.currentTarget.classList.contains('btn-success')) {
      e.currentTarget.classList.replace('btn-success', 'btn-default');
    } else if (e.currentTarget.classList.contains('btn-default')) {
      e.currentTarget.classList.replace('btn-default', 'btn-success');
    }

    freePlaces = !document.getElementById('free_places_toggle').classList.contains('btn-default');
    fees = document.getElementById('transport_request_fee').value;
    transportationDistance = document.getElementById('transport_request_distance').value;

    filterCells();
    await GM.setValue('cells', freePlaces);
    await GM.setValue('jailFees', fees);
    await GM.setValue('jailDistance', transportationDistance);
  }

  function filterCells() {
    const cellList = document.querySelectorAll('a[href*="/gefangener/"]');

    for (let i = 0, n = cellList.length; i < n; i++) {
      const freeCells = cellList[i].textContent.match(/Freie Zellen: (.*?),/)[1];
      const cellFee = cellList[i].textContent.match(/Abgabe an Besitzer: (.*?)%/);
      const cellDistance = parseFloat(cellList[i].textContent.match(/Entfernung: (\d+(([,.])\d+)?) km/)[1].replace(',', '.'));

      if (fees !== '' && cellFee && cellFee[1] > fees) {
        cellList[i].style.display = 'none';
      } else if (transportationDistance !== '' && cellDistance && cellDistance > transportationDistance) {
        cellList[i].style.display = 'none';
      } else if (freePlaces && freeCells === '0') {
        cellList[i].style.display = 'none';
      } else {
        cellList[i].style.display = '';
      }
    }
  }

  function filterHospitals() {
    const tableRows = document.querySelectorAll('#own-hospitals > tbody > tr, #alliance-hospitals > tbody > tr');

    for (let i = 0, n = tableRows.length; i < n; i++) {
      let hospitalFee = null;
      let specialDepartment = null;
      const hospitalDistance = parseFloat(tableRows[i].querySelector('td:nth-child(2)')?.textContent?.match(/\d+(([,.])\d+)?/)[0].replace(',', '.'));
      const freeBeds = parseInt(tableRows[i].querySelector('td:nth-child(3)')?.textContent?.match(/[0-9]{1,2}/)[0]);

      if (tableRows[i].parentElement.parentElement.id === 'alliance-hospitals') {
        hospitalFee = parseInt(tableRows[i].querySelector('td:nth-child(4)')?.textContent?.match(/([0-9]{1,2}) %/)[1]);
        specialDepartment = tableRows[i].querySelector('td:nth-child(5)')?.innerHTML?.match(/(Ja|Nein)/)[0];
      } else {
        specialDepartment = tableRows[i].querySelector('td:nth-child(4)')?.innerHTML?.match(/(Ja|Nein)/)[0];
      }

      if (fees !== '' && hospitalFee && hospitalFee > fees) {
        tableRows[i].style.display = 'none';
      } else if (transportationDistance !== '' && hospitalDistance && hospitalDistance > transportationDistance) {
        tableRows[i].style.display = 'none';
      } else if (freePlaces && freeBeds === 0) {
        tableRows[i].style.display = 'none';
      } else if (special && specialDepartment === "Nein") {
        tableRows[i].style.display = 'none';
      } else {
        tableRows[i].style.display = '';
      }
    }
  }

  function setStyle() {
    GM_addStyle(`
    .vehicle-transport-request-filter-box {
      margin-bottom: 23px;
    }

    .vehicle-transport-request-filter-title-container {
      margin-top: 8px;
      margin-right: 15px;
    }

    .transport-request-filter,
    .transport-request-distance-filter,
    .vehicle-transport-request-filter-box .btn-group {
      margin-top: 8px;
    }

    .transport-request-distance-filter,
    .transport-request-filter {
      margin-right: 15px;
    }`);
  }
})();