Server-Bibliothek
2026-07-23 548bab93e55f6e514557571d3c9da9b1c1d59c35
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
{% extends "base.html" %}
{% block title %}{{ "Tool bearbeiten" if software else "Neues Tool" }} – Server-Bibliothek{% endblock %}
{% block content %}
 
<div class="page-head">
  <div>
    <p class="eyebrow">{{ "Bearbeiten" if software else "Neu anlegen" }}</p>
    <h1>{{ software.name if software else "Neues Software-Tool" }}</h1>
  </div>
</div>
 
<form method="post" class="form-grid">
  <div class="field">
    <label for="name">Name *</label>
    <input type="text" id="name" name="name" required value="{{ software.name if software else '' }}" placeholder="z. B. 7-Zip, Adobe Reader, Firmen-VPN-Client">
  </div>
 
  <div class="field">
    <label for="kategorie">Kategorie</label>
    <input type="text" id="kategorie" name="kategorie" value="{{ software.kategorie if software else '' }}" placeholder="z. B. Basis-Software, Sicherheit, Inhouse-Tool">
  </div>
 
  <div class="field">
    <label for="version">Aktuelle Version</label>
    <input type="text" id="version" name="version" value="{{ software.version if software else '' }}" placeholder="z. B. 24.08">
  </div>
 
  <div class="field">
    <label for="installer_pfad">Ablageordner</label>
    <input type="text" id="installer_pfad" name="installer_pfad" value="{{ software.installer_pfad if software else '' }}" placeholder="z. B. C:\Bibliothek ablage\7-Zip\">
    <div class="hint">Nur der Ordner – das Tool legt automatisch einen eigenen Unterordner und Dateinamen an, auch wenn ihr überall denselben Basisordner eintragt.</div>
  </div>
 
  <div class="field">
    <label for="install_parameter">Silent-Install-Parameter</label>
    <input type="text" id="install_parameter" name="install_parameter" value="{{ software.install_parameter if software else '' }}" placeholder="z. B. /S oder /quiet /norestart">
  </div>
 
  <div class="field">
    <label for="dokumentation">Dokumentation / Einrichtungshinweise</label>
    <textarea id="dokumentation" name="dokumentation" rows="8" placeholder="Schritt-fuer-Schritt Anleitung, Lizenzhinweise, Besonderheiten…">{{ software.dokumentation if software else '' }}</textarea>
  </div>
 
  <div class="field panel" style="padding:16px 18px;">
    <label style="display:flex; align-items:center; gap:8px; font-size:14px;">
      <input type="checkbox" id="auto_update" name="auto_update" style="width:auto;"
             {{ "checked" if software and software.auto_update }}>
      Automatische Aktualisierung aktivieren
    </label>
    <div class="hint">Wenn aktiv, sucht das Tool selbststaendig nach neuen Versionen und ersetzt die
      Installer-Datei automatisch – ohne Rueckfrage. Die alte Datei wird vorher immer gesichert.</div>
 
    <div id="update_quelle_felder" style="margin-top:14px; display:{{ 'block' if software and software.auto_update else 'none' }};">
      <div class="auto-update-layout">
        <div class="auto-update-fields">
          <div class="field">
            <label for="update_quelle">Update-Quelle</label>
            <select id="update_quelle" name="update_quelle" onchange="updateQuelleHinweis()">
              <option value="">– auswaehlen –</option>
              <option value="winget" {{ "selected" if software and software.update_quelle == "winget" }}>winget (Windows-Paketverwaltung)</option>
              <option value="github" {{ "selected" if software and software.update_quelle == "github" }}>GitHub-Projekt (Releases)</option>
              <option value="direkt" {{ "selected" if software and software.update_quelle == "direkt" }}>Direkter Download-Link</option>
            </select>
          </div>
          <div class="field">
            <label for="update_wert" id="update_wert_label">Update-Wert</label>
            <input type="text" id="update_wert" name="update_wert" value="{{ software.update_wert if software else '' }}" placeholder="– zuerst Update-Quelle auswaehlen –">
          </div>
        </div>
 
        <div class="mini-doku" id="mini_doku">
          <div class="mini-doku-titel" id="mini_doku_titel">Wo pruefen?</div>
          <div id="mini_doku_inhalt">Zuerst eine Update-Quelle auswaehlen, dann erscheinen hier die Pruef-Schritte.</div>
        </div>
      </div>
    </div>
  </div>
 
  <div class="form-actions">
    <button type="submit" class="btn">{{ "Speichern" if software else "Tool anlegen" }}</button>
    <a href="{{ url_for('software_detail', software_id=software.id) if software else url_for('dashboard') }}" class="btn btn-secondary">Abbrechen</a>
  </div>
</form>
 
<script>
  document.getElementById("auto_update").addEventListener("change", function () {
    document.getElementById("update_quelle_felder").style.display = this.checked ? "block" : "none";
  });
 
  const MINI_DOKU = {
    "": {
      label: "Update-Wert",
      platzhalter: "– zuerst Update-Quelle auswaehlen –",
      inhalt: "Zuerst eine Update-Quelle auswaehlen, dann erscheinen hier die Pruef-Schritte."
    },
    "winget": {
      label: "winget-Paket-ID",
      platzhalter: "z. B. 7zip.7zip",
      inhalt: `
        <ol>
          <li><strong>winstall.app</strong> oeffnen, Tool-Namen eingeben</li>
          <li>Im grauen Befehlskasten das Wort direkt nach <code>--id</code> kopieren (bis zum naechsten Leerzeichen)</li>
          <li>Exakt einfuegen wie kopiert – Gross-/Kleinschreibung ist wichtig, nicht abtippen</li>
        </ol>
        <div class="beispiel">--id <strong>Google.Chrome</strong> → Google.Chrome</div>`
    },
    "github": {
      label: "GitHub-Projekt",
      platzhalter: "z. B. videolan/vlc",
      inhalt: `
        <ol>
          <li>Auf <strong>github.com</strong> nach dem Tool suchen</li>
          <li>Auf der Projektseite rechts auf „Releases" schauen</li>
          <li>Pruefen: liegt dort eine .exe- oder .msi-Datei?</li>
        </ol>
        <div class="beispiel">Beispiel: videolan/vlc<br>(aus github.com/videolan/vlc)</div>
        <div class="hint" style="margin-top:8px;">Auch okay, falls aus Versehen die ganze Adresse eingefuegt wird (z. B. https://github.com/videolan/vlc) – wird automatisch erkannt.</div>`
    },
    "direkt": {
      label: "Download-Link",
      platzhalter: "z. B. https://beispiel.de/tool/aktuell.exe",
      inhalt: `
        <ol>
          <li>Download-Seite des Herstellers oeffnen</li>
          <li>Nach einem Link suchen, der immer zur neuesten Datei fuehrt (oft bei Portable-Tools)</li>
        </ol>
        <div class="beispiel">Versionsnummer ist hier technisch, keine echte Nummer.</div>`
    }
  };
 
  function updateQuelleHinweis() {
    const quelle = document.getElementById("update_quelle").value;
    const angaben = MINI_DOKU[quelle] || MINI_DOKU[""];
    document.getElementById("update_wert_label").textContent = angaben.label;
    document.getElementById("update_wert").placeholder = angaben.platzhalter;
    document.getElementById("mini_doku_inhalt").innerHTML = angaben.inhalt;
  }
  updateQuelleHinweis();
 
  // Ordner-Vorschlag: merkt sich den zuletzt genutzten Basis-Ordner und
  // schlaegt ihn bei neuen Tools automatisch vor - so muss der Ablageort
  // nur beim allerersten Tool einmal komplett eingetippt werden.
  (function () {
    var nameFeld = document.getElementById("name");
    var pfadFeld = document.getElementById("installer_pfad");
    var SPEICHER_KEY = "sb_basis_ordner";
 
    function sanitisiere(text) {
      return (text || "").trim().replace(/[<>:"/\\|?*]/g, "");
    }
 
    if (nameFeld && pfadFeld && !pfadFeld.value) {
      nameFeld.addEventListener("blur", function () {
        if (pfadFeld.value.trim() !== "" || !nameFeld.value.trim()) return;
        var basis = localStorage.getItem(SPEICHER_KEY);
        if (!basis) return;
        pfadFeld.value = basis.replace(/[\\/]+$/, "") + "\\" + sanitisiere(nameFeld.value) + "\\";
      });
    }
 
    if (pfadFeld) {
      pfadFeld.addEventListener("change", function () {
        var wert = pfadFeld.value.trim();
        if (!wert) return;
        var teile = wert.replace(/[\\/]+$/, "").split(/[\\/]/);
        if (teile.length > 1) {
          teile.pop();
          var basis = teile.join("\\");
          if (basis) localStorage.setItem(SPEICHER_KEY, basis);
        }
      });
    }
  })();
</script>
 
{% endblock %}