Datenbank bereinigt / Gitea-Integration gefixt

Dieser Commit ist enthalten in:
hendrik_gebhardt@gmx.de
2026-01-04 00:24:11 +00:00
committet von Server Deploy
Ursprung 395598c2b0
Commit c21be47428
37 geänderte Dateien mit 30993 neuen und 809 gelöschten Zeilen

Datei anzeigen

@ -25,8 +25,10 @@
<link rel="stylesheet" href="css/proposals.css">
<link rel="stylesheet" href="css/notifications.css">
<link rel="stylesheet" href="css/gitea.css">
<link rel="stylesheet" href="css/coding.css">
<link rel="stylesheet" href="css/knowledge.css">
<link rel="stylesheet" href="css/responsive.css">
<link rel="stylesheet" href="css/mobile.css">
<!-- Favicon -->
<link rel="icon" type="image/svg+xml" href="assets/icons/task.svg">
@ -102,98 +104,29 @@
</div>
</div>
<!-- Dateitypen nach Kategorien -->
<div class="admin-upload-types">
<h3>Erlaubte Dateiformate</h3>
<!-- Erlaubte Dateiendungen -->
<div class="admin-upload-extensions">
<h3>Erlaubte Dateiendungen</h3>
<!-- Bildformate -->
<div class="upload-category" data-category="images">
<div class="upload-category-header">
<label class="upload-category-toggle">
<input type="checkbox" id="upload-cat-images" checked>
<span class="upload-category-title">Bildformate</span>
</label>
</div>
<div class="upload-category-types">
<span class="upload-type-tag" data-type="image/jpeg">JPEG</span>
<span class="upload-type-tag" data-type="image/png">PNG</span>
<span class="upload-type-tag" data-type="image/gif">GIF</span>
<span class="upload-type-tag" data-type="image/webp">WebP</span>
<span class="upload-type-tag" data-type="image/svg+xml">SVG</span>
<!-- Aktive Endungen als Tags -->
<div id="extension-tags" class="extension-tags">
<!-- Tags werden dynamisch gerendert -->
</div>
<!-- Neue Endung hinzufügen -->
<div class="extension-add-group">
<label for="extension-input">Neue Endung hinzufügen</label>
<div class="extension-input-row">
<input type="text" id="extension-input" class="extension-input" placeholder="z.B. xlsx" maxlength="10">
<button type="button" id="btn-add-extension" class="btn btn-secondary">+ Hinzufügen</button>
</div>
</div>
<!-- Dokumentformate -->
<div class="upload-category" data-category="documents">
<div class="upload-category-header">
<label class="upload-category-toggle">
<input type="checkbox" id="upload-cat-documents" checked>
<span class="upload-category-title">Dokumentformate</span>
</label>
</div>
<div class="upload-category-types">
<span class="upload-type-tag" data-type="application/pdf">PDF</span>
</div>
</div>
<!-- Office-Formate -->
<div class="upload-category" data-category="office">
<div class="upload-category-header">
<label class="upload-category-toggle">
<input type="checkbox" id="upload-cat-office" checked>
<span class="upload-category-title">Office-Formate</span>
</label>
</div>
<div class="upload-category-types">
<span class="upload-type-tag" data-type="application/msword">DOC</span>
<span class="upload-type-tag" data-type="application/vnd.openxmlformats-officedocument.wordprocessingml.document">DOCX</span>
<span class="upload-type-tag" data-type="application/vnd.ms-excel">XLS</span>
<span class="upload-type-tag" data-type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet">XLSX</span>
<span class="upload-type-tag" data-type="application/vnd.ms-powerpoint">PPT</span>
<span class="upload-type-tag" data-type="application/vnd.openxmlformats-officedocument.presentationml.presentation">PPTX</span>
</div>
</div>
<!-- Textformate -->
<div class="upload-category" data-category="text">
<div class="upload-category-header">
<label class="upload-category-toggle">
<input type="checkbox" id="upload-cat-text" checked>
<span class="upload-category-title">Textformate</span>
</label>
</div>
<div class="upload-category-types">
<span class="upload-type-tag" data-type="text/plain">TXT</span>
<span class="upload-type-tag" data-type="text/csv">CSV</span>
<span class="upload-type-tag" data-type="text/markdown">Markdown</span>
</div>
</div>
<!-- Archivformate -->
<div class="upload-category" data-category="archives">
<div class="upload-category-header">
<label class="upload-category-toggle">
<input type="checkbox" id="upload-cat-archives" checked>
<span class="upload-category-title">Archivformate</span>
</label>
</div>
<div class="upload-category-types">
<span class="upload-type-tag" data-type="application/zip">ZIP</span>
<span class="upload-type-tag" data-type="application/x-rar-compressed">RAR</span>
<span class="upload-type-tag" data-type="application/x-7z-compressed">7Z</span>
</div>
</div>
<!-- Datenformate -->
<div class="upload-category" data-category="data">
<div class="upload-category-header">
<label class="upload-category-toggle">
<input type="checkbox" id="upload-cat-data" checked>
<span class="upload-category-title">Datenformate</span>
</label>
</div>
<div class="upload-category-types">
<span class="upload-type-tag" data-type="application/json">JSON</span>
<!-- Vorschläge -->
<div class="extension-suggestions">
<span class="extension-suggestions-label">Vorschläge:</span>
<div id="extension-suggestions-list" class="extension-suggestions-list">
<!-- Vorschläge werden dynamisch gerendert -->
</div>
</div>
</div>
@ -212,6 +145,13 @@
<!-- Header -->
<header class="header">
<div class="header-left">
<!-- Hamburger Menu Button (Mobile) -->
<button id="hamburger-btn" class="hamburger-btn" aria-label="Menu" aria-expanded="false">
<span class="hamburger-line"></span>
<span class="hamburger-line"></span>
<span class="hamburger-line"></span>
</button>
<h1 class="logo">TaskMate</h1>
<!-- Project Selector -->
@ -235,7 +175,7 @@
<button class="view-tab" data-view="list">Liste</button>
<button class="view-tab" data-view="calendar">Kalender</button>
<button class="view-tab" data-view="proposals">Genehmigung</button>
<button class="view-tab" data-view="gitea">Gitea</button>
<button class="view-tab" data-view="coding">Coding</button>
<button class="view-tab" data-view="knowledge">Wissen</button>
</nav>
</div>
@ -509,383 +449,29 @@
</div>
</div>
<!-- Gitea View -->
<div id="view-gitea" class="view view-gitea hidden">
<!-- Modus-Schalter -->
<div id="gitea-mode-switch" class="gitea-mode-switch">
<button class="gitea-mode-btn active" data-mode="server">
<svg viewBox="0 0 24 24" width="18" height="18"><rect x="2" y="2" width="20" height="8" rx="2" stroke="currentColor" stroke-width="2" fill="none"/><rect x="2" y="14" width="20" height="8" rx="2" stroke="currentColor" stroke-width="2" fill="none"/><circle cx="6" cy="6" r="1" fill="currentColor"/><circle cx="6" cy="18" r="1" fill="currentColor"/></svg>
Server-Anwendung
</button>
<button class="gitea-mode-btn" data-mode="project">
<svg viewBox="0 0 24 24" width="18" height="18"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z" stroke="currentColor" stroke-width="2" fill="none"/></svg>
Projekt-Repository
<!-- Coding View -->
<div id="view-coding" class="view view-coding hidden">
<!-- Header -->
<div class="coding-header coding-header-centered">
<button id="add-coding-directory-btn" class="btn btn-primary">
<svg viewBox="0 0 24 24" width="18" height="18"><path d="M12 5v14M5 12h14" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round"/></svg>
Anwendung hinzufügen
</button>
</div>
<!-- Server-Modus Ansicht -->
<div id="gitea-server-mode" class="gitea-section">
<!-- Server Repository Info Header -->
<div class="gitea-repo-header">
<div class="repo-info">
<h2 id="server-repo-name">
<svg viewBox="0 0 24 24" width="24" height="24"><rect x="2" y="2" width="20" height="8" rx="2" stroke="currentColor" stroke-width="2" fill="none"/><rect x="2" y="14" width="20" height="8" rx="2" stroke="currentColor" stroke-width="2" fill="none"/><circle cx="6" cy="6" r="1" fill="currentColor"/><circle cx="6" cy="18" r="1" fill="currentColor"/></svg>
<span>TaskMate Server</span>
</h2>
<a id="server-repo-url" class="repo-url" href="#" target="_blank"></a>
</div>
</div>
<!-- Server-Pfad Anzeige -->
<div class="gitea-local-path">
<span class="path-label">Server-Pfad:</span>
<code id="server-local-path-display">/home/claude-dev/TaskMate</code>
</div>
<!-- Server Git-Status Panel -->
<div id="server-status-section" class="gitea-status-panel">
<div class="status-grid">
<div class="status-item">
<span class="status-label">Branch</span>
<div class="branch-select-group">
<select id="server-branch-select" class="branch-select">
<!-- Branches dynamisch -->
</select>
</div>
</div>
<div class="status-item">
<span class="status-label">Status</span>
<span id="server-status-indicator" class="status-badge">Prüfe...</span>
</div>
<div class="status-item">
<span class="status-label">Änderungen</span>
<span id="server-changes-count" class="changes-count">0</span>
</div>
</div>
</div>
<!-- Server Git-Operationen -->
<div id="server-operations-section" class="gitea-operations-panel">
<h3>Git-Operationen</h3>
<div class="operations-grid">
<button id="btn-server-fetch" class="btn btn-secondary operation-btn">
<svg viewBox="0 0 24 24" width="18" height="18"><path d="M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" stroke="currentColor" stroke-width="2" fill="none"/><path d="M3 3v5h5" stroke="currentColor" stroke-width="2" fill="none"/><path d="M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16" stroke="currentColor" stroke-width="2" fill="none"/><path d="M21 21v-5h-5" stroke="currentColor" stroke-width="2" fill="none"/></svg>
Fetch
</button>
<button id="btn-server-pull" class="btn btn-secondary operation-btn">
<svg viewBox="0 0 24 24" width="18" height="18"><path d="M12 5v14M19 12l-7 7-7-7" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg>
Pull
</button>
<button id="btn-server-push" class="btn btn-primary operation-btn">
<svg viewBox="0 0 24 24" width="18" height="18"><path d="M12 19V5M5 12l7-7 7 7" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg>
Push
</button>
<button id="btn-server-commit" class="btn btn-secondary operation-btn">
<svg viewBox="0 0 24 24" width="18" height="18"><circle cx="12" cy="12" r="4" stroke="currentColor" stroke-width="2" fill="none"/><path d="M12 2v6M12 16v6M2 12h6M16 12h6" stroke="currentColor" stroke-width="2" fill="none"/></svg>
Commit
</button>
</div>
</div>
<!-- Server Änderungen-Liste -->
<div id="server-changes-section" class="gitea-changes-panel hidden">
<h3>Geänderte Dateien</h3>
<div id="server-changes-list" class="changes-list">
<!-- Dynamisch gefüllt -->
</div>
</div>
<!-- Server Commit-Historie -->
<div id="server-commits-section" class="gitea-commits-panel">
<div class="commits-header">
<h3>Letzte Commits</h3>
<button id="btn-server-clear-commits" class="btn btn-small btn-secondary" title="Alle aus Anzeige entfernen">
Alle ausblenden
</button>
</div>
<div id="server-commits-list" class="commits-list">
<!-- Dynamisch gefüllt -->
</div>
</div>
<!-- Grid für Kacheln -->
<div id="coding-grid" class="coding-grid">
<!-- Kacheln werden per JS gerendert -->
</div>
<!-- Projekt-Modus: Browser-Upload Ansicht -->
<div id="gitea-browser-upload" class="gitea-section hidden">
<!-- Header -->
<div class="gitea-config-header">
<h2>
<svg viewBox="0 0 24 24" width="24" height="24"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M17 8l-5-5-5 5M12 3v12" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg>
Lokales Verzeichnis hochladen
</h2>
<p>Wählen Sie ein Verzeichnis von Ihrem Computer und pushen Sie es direkt ins Gitea.</p>
<!-- Empty State -->
<div id="coding-empty" class="coding-empty hidden">
<div class="empty-icon">
<svg viewBox="0 0 24 24" width="64" height="64"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z" stroke="currentColor" stroke-width="2" fill="none"/></svg>
</div>
<!-- Browser-Kompatibilität Hinweis -->
<div id="browser-upload-compat" class="browser-compat-notice hidden">
<svg viewBox="0 0 24 24" width="20" height="20"><circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="2" fill="none"/><path d="M12 8v4M12 16h.01" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round"/></svg>
<span>Die Verzeichnis-Auswahl funktioniert nur in Chrome, Edge oder Opera. In anderen Browsern können Sie Dateien per Drag & Drop hochladen.</span>
</div>
<!-- Schritt 1: Repository auswählen -->
<div class="upload-step">
<div class="step-header">
<span class="step-number">1</span>
<span class="step-title">Ziel-Repository auswählen</span>
</div>
<div class="form-group">
<div class="gitea-repo-select-group">
<select id="browser-upload-repo-select" class="form-control">
<option value="">-- Repository wählen --</option>
</select>
<button type="button" id="btn-refresh-upload-repos" class="btn btn-icon" title="Repositories aktualisieren">
<svg viewBox="0 0 24 24" width="18" height="18"><path d="M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" stroke="currentColor" stroke-width="2" fill="none"/><path d="M3 3v5h5" stroke="currentColor" stroke-width="2" fill="none"/><path d="M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16" stroke="currentColor" stroke-width="2" fill="none"/><path d="M21 21v-5h-5" stroke="currentColor" stroke-width="2" fill="none"/></svg>
</button>
</div>
</div>
<div class="form-group">
<label for="browser-upload-branch">Ziel-Branch</label>
<input type="text" id="browser-upload-branch" class="form-control" value="main" placeholder="main">
</div>
</div>
<!-- Schritt 2: Verzeichnis auswählen -->
<div class="upload-step">
<div class="step-header">
<span class="step-number">2</span>
<span class="step-title">Verzeichnis auswählen</span>
</div>
<div class="directory-picker">
<button type="button" id="btn-select-directory" class="btn btn-secondary btn-lg">
<svg viewBox="0 0 24 24" width="20" height="20"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z" stroke="currentColor" stroke-width="2" fill="none"/></svg>
Verzeichnis auswählen
</button>
<div id="drop-zone" class="drop-zone hidden">
<svg viewBox="0 0 24 24" width="48" height="48"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M17 8l-5-5-5 5M12 3v12" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg>
<p>Oder Verzeichnis hierher ziehen</p>
</div>
</div>
</div>
<!-- Schritt 3: Datei-Vorschau (erscheint nach Auswahl) -->
<div id="upload-preview-section" class="upload-step hidden">
<div class="step-header">
<span class="step-number">3</span>
<span class="step-title">Ausgewählte Dateien</span>
<span id="upload-file-count" class="file-count">0 Dateien</span>
</div>
<div id="upload-files-list" class="upload-files-list">
<!-- Dynamisch gefüllt -->
</div>
<div class="excluded-info">
<small>Automatisch ausgeschlossen: .git, node_modules, __pycache__, .env, *.log</small>
</div>
</div>
<!-- Schritt 4: Commit und Push -->
<div id="upload-commit-section" class="upload-step hidden">
<div class="step-header">
<span class="step-number">4</span>
<span class="step-title">Commit erstellen und pushen</span>
</div>
<div class="form-group">
<label for="browser-upload-commit-message">Commit-Nachricht</label>
<textarea id="browser-upload-commit-message" class="form-control" rows="2" placeholder="Beschreiben Sie Ihre Änderungen..."></textarea>
</div>
<div class="upload-actions">
<button type="button" id="btn-cancel-upload" class="btn btn-secondary">
Abbrechen
</button>
<button type="button" id="btn-execute-upload" class="btn btn-primary">
<svg viewBox="0 0 24 24" width="18" height="18"><path d="M12 19V5M5 12l7-7 7 7" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg>
Commit & Push
</button>
</div>
<!-- Progress Bar -->
<div id="upload-progress-container" class="upload-progress hidden">
<div class="progress-bar">
<div id="upload-progress-bar" class="progress-fill"></div>
</div>
<span id="upload-progress-text">0%</span>
</div>
</div>
<h3>Keine Anwendungen</h3>
<p>Füge deine erste Server-Anwendung hinzu, um mit Claude oder Codex zu arbeiten.</p>
</div>
<!-- Projekt-Modus: Kein Projekt (altes Element, jetzt versteckt) -->
<div id="gitea-no-project" class="gitea-empty-state hidden">
<svg viewBox="0 0 24 24" width="64" height="64"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg>
<h3>Kein Projekt ausgewählt</h3>
<p>Wählen Sie ein Projekt aus, um die Git-Integration zu konfigurieren.</p>
</div>
<!-- Konfiguration (wenn nicht verknüpft) -->
<div id="gitea-config-section" class="gitea-section hidden">
<div class="gitea-config-header">
<h2>Repository-Konfiguration</h2>
<p>Verknüpfen Sie dieses Projekt mit einem Git-Repository</p>
</div>
<!-- Gitea-Verbindungsstatus -->
<div id="gitea-connection-status" class="gitea-connection-status">
<span class="status-indicator"></span>
<span class="status-text">Prüfe Verbindung...</span>
</div>
<form id="gitea-config-form" class="gitea-config-form">
<!-- Repository-Auswahl -->
<div class="form-group">
<label for="gitea-repo-select">Bestehendes Repository auswählen</label>
<div class="gitea-repo-select-group">
<select id="gitea-repo-select" class="form-control">
<option value="">-- Repository wählen --</option>
</select>
<button type="button" id="btn-refresh-repos" class="btn btn-icon" title="Repositories aktualisieren">
<svg viewBox="0 0 24 24" width="18" height="18"><path d="M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" stroke="currentColor" stroke-width="2" fill="none"/><path d="M3 3v5h5" stroke="currentColor" stroke-width="2" fill="none"/><path d="M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16" stroke="currentColor" stroke-width="2" fill="none"/><path d="M21 21v-5h-5" stroke="currentColor" stroke-width="2" fill="none"/></svg>
</button>
</div>
</div>
<div class="gitea-divider">
<span>oder</span>
</div>
<!-- Neues Repository erstellen -->
<div class="form-group">
<button type="button" id="btn-create-repo" class="btn btn-secondary btn-block">
<svg viewBox="0 0 24 24" width="18" height="18"><path d="M12 5v14M5 12h14" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round"/></svg>
Neues Repository erstellen
</button>
</div>
<div class="gitea-divider"></div>
<!-- Lokaler Pfad -->
<div class="form-group">
<label for="local-path-input">Lokaler Pfad (wo Claude Code arbeitet)</label>
<input type="text" id="local-path-input" class="form-control"
placeholder="z.B. D:\Projekte\MeinProjekt">
<span id="path-validation-result" class="form-hint"></span>
</div>
<!-- Default Branch -->
<div class="form-group">
<label for="default-branch-input">Standard-Branch</label>
<input type="text" id="default-branch-input" class="form-control"
value="main" placeholder="main">
</div>
<div class="form-actions">
<button type="submit" class="btn btn-primary" id="btn-save-config">
<svg viewBox="0 0 24 24" width="18" height="18"><path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z" stroke="currentColor" stroke-width="2" fill="none"/><path d="M17 21v-8H7v8M7 3v5h8" stroke="currentColor" stroke-width="2" fill="none"/></svg>
Konfiguration speichern
</button>
</div>
</form>
</div>
<!-- Hauptansicht (wenn verknüpft) -->
<div id="gitea-main-section" class="gitea-section hidden">
<!-- Repository-Info-Header -->
<div class="gitea-repo-header">
<div class="repo-info">
<h2 id="gitea-repo-name">
<svg viewBox="0 0 24 24" width="24" height="24"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22" stroke="currentColor" stroke-width="2" fill="none"/></svg>
<span>Repository</span>
</h2>
<a id="gitea-repo-url" class="repo-url" href="#" target="_blank"></a>
</div>
<div class="repo-actions">
<button id="btn-edit-config" class="btn btn-icon" title="Konfiguration bearbeiten">
<svg viewBox="0 0 24 24" width="18" height="18"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7" stroke="currentColor" stroke-width="2" fill="none"/><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z" stroke="currentColor" stroke-width="2" fill="none"/></svg>
</button>
<button id="btn-remove-config" class="btn btn-icon btn-danger-hover" title="Konfiguration entfernen">
<svg viewBox="0 0 24 24" width="18" height="18"><path d="M3 6h18M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" stroke="currentColor" stroke-width="2" fill="none"/></svg>
</button>
</div>
</div>
<!-- Lokaler Pfad Anzeige -->
<div class="gitea-local-path">
<span class="path-label">Lokaler Pfad:</span>
<code id="gitea-local-path-display"></code>
</div>
<!-- Git-Status Panel -->
<div id="gitea-status-section" class="gitea-status-panel">
<div class="status-grid">
<div class="status-item">
<span class="status-label">Branch</span>
<div class="branch-select-group">
<select id="branch-select" class="branch-select">
<!-- Branches dynamisch -->
</select>
<button id="btn-rename-branch" class="btn btn-small btn-icon" title="Branch umbenennen">
<svg viewBox="0 0 24 24" width="16" height="16"><path d="M17 3a2.85 2.85 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z" stroke="currentColor" stroke-width="2" fill="none"/></svg>
</button>
</div>
</div>
<div class="status-item">
<span class="status-label">Status</span>
<span id="git-status-indicator" class="status-badge">Prüfe...</span>
</div>
<div class="status-item">
<span class="status-label">Änderungen</span>
<span id="git-changes-count" class="changes-count">0</span>
</div>
</div>
</div>
<!-- Git-Operationen -->
<div id="gitea-operations-section" class="gitea-operations-panel">
<h3>Git-Operationen</h3>
<div class="operations-grid">
<button id="btn-git-fetch" class="btn btn-secondary operation-btn">
<svg viewBox="0 0 24 24" width="18" height="18"><path d="M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" stroke="currentColor" stroke-width="2" fill="none"/><path d="M3 3v5h5" stroke="currentColor" stroke-width="2" fill="none"/><path d="M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16" stroke="currentColor" stroke-width="2" fill="none"/><path d="M21 21v-5h-5" stroke="currentColor" stroke-width="2" fill="none"/></svg>
Fetch
</button>
<button id="btn-git-pull" class="btn btn-secondary operation-btn">
<svg viewBox="0 0 24 24" width="18" height="18"><path d="M12 5v14M19 12l-7 7-7-7" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg>
Pull
</button>
<button id="btn-git-push" class="btn btn-primary operation-btn">
<svg viewBox="0 0 24 24" width="18" height="18"><path d="M12 19V5M5 12l7-7 7 7" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg>
Push
</button>
<button id="btn-git-commit" class="btn btn-secondary operation-btn">
<svg viewBox="0 0 24 24" width="18" height="18"><circle cx="12" cy="12" r="4" stroke="currentColor" stroke-width="2" fill="none"/><path d="M12 2v6M12 16v6M2 12h6M16 12h6" stroke="currentColor" stroke-width="2" fill="none"/></svg>
Commit
</button>
</div>
</div>
<!-- Änderungen-Liste -->
<div id="gitea-changes-section" class="gitea-changes-panel hidden">
<h3>Geänderte Dateien</h3>
<div id="git-changes-list" class="changes-list">
<!-- Dynamisch gefüllt -->
</div>
</div>
<!-- Commit-Historie -->
<div id="gitea-commits-section" class="gitea-commits-panel">
<div class="commits-header">
<h3>Letzte Commits</h3>
<button id="btn-clear-commits" class="btn btn-small btn-secondary" title="Alle aus Anzeige entfernen">
Alle ausblenden
</button>
</div>
<div id="git-commits-list" class="commits-list">
<!-- Dynamisch gefüllt -->
</div>
</div>
</div>
</div>
<!-- Knowledge View (Wissensmanagement) -->
@ -1389,7 +975,21 @@
</div>
<div class="form-group">
<label for="user-password">Passwort <span id="password-hint" class="form-hint">(automatisch generiert)</span></label>
<input type="text" id="user-password" minlength="8" readonly>
<div class="password-input-group">
<input type="text" id="user-password" minlength="8" readonly>
<button type="button" id="edit-password-btn" class="btn btn-secondary btn-sm" title="Passwort bearbeiten">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7" stroke="currentColor" stroke-width="2" fill="none"/>
<path d="m18.5 2.5 3 3L12 15l-4 1 1-4 9.5-9.5z" stroke="currentColor" stroke-width="2" fill="none"/>
</svg>
</button>
<button type="button" id="generate-password-btn" class="btn btn-secondary btn-sm" title="Neues Passwort generieren">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<path d="M1 4v6h6" stroke="currentColor" stroke-width="2" fill="none"/>
<path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10" stroke="currentColor" stroke-width="2" fill="none"/>
</svg>
</button>
</div>
</div>
<div class="form-group">
<label for="user-role">Rolle</label>
@ -1908,9 +1508,152 @@
</div>
</div>
<!-- Coding Directory Modal -->
<div id="coding-modal" class="modal hidden">
<div class="modal-content modal-medium">
<div class="modal-header">
<h3 id="coding-modal-title">Anwendung hinzufügen</h3>
<button class="modal-close" aria-label="Schliessen">&times;</button>
</div>
<div class="modal-body">
<div class="form-group">
<label for="coding-name">Anwendungsname *</label>
<input type="text" id="coding-name" class="form-control" placeholder="z.B. TaskMate" required>
<small class="form-hint" id="coding-path-hint">Ordner: /home/claude-dev/<span id="coding-path-preview">...</span></small>
</div>
<div class="form-group">
<label for="coding-description">Beschreibung</label>
<textarea id="coding-description" class="form-control" rows="2" placeholder="Optionale Beschreibung..."></textarea>
</div>
<div class="form-group">
<label>Farbe</label>
<div class="color-presets" id="coding-color-presets">
<!-- Farb-Buttons werden per JS gerendert -->
</div>
</div>
<div class="form-group">
<label>CLAUDE.md</label>
<div class="claude-link-container">
<button type="button" id="coding-claude-link" class="claude-link" disabled>
<span class="claude-icon">📄</span>
<span class="claude-text">Keine CLAUDE.md vorhanden</span>
</button>
</div>
</div>
<details class="coding-gitea-section">
<summary>Gitea-Repository verknüpfen (optional)</summary>
<div class="form-group" style="margin-top: 1rem;">
<label for="coding-gitea-repo">Repository</label>
<select id="coding-gitea-repo" class="form-control">
<option value="">-- Kein Repository --</option>
</select>
</div>
<div class="form-group">
<label for="coding-branch">Standard-Branch</label>
<input type="text" id="coding-branch" class="form-control" value="main" placeholder="main">
</div>
</details>
</div>
<div class="modal-footer">
<button id="coding-delete-btn" class="btn btn-danger hidden">Löschen</button>
<button class="btn btn-secondary modal-cancel">Abbrechen</button>
<button id="coding-save-btn" class="btn btn-primary">Speichern</button>
</div>
</div>
</div>
<!-- Coding Command Modal -->
<div id="coding-command-modal" class="modal hidden">
<div class="modal-content modal-small">
<div class="modal-header">
<h3>Befehl ausführen</h3>
<button class="modal-close" aria-label="Schliessen">&times;</button>
</div>
<div class="modal-body">
<p id="coding-command-hint">Führe diesen Befehl in WSL aus:</p>
<div class="command-box">
<code id="coding-command-text"></code>
<button id="coding-copy-command" class="btn btn-sm btn-secondary">Kopieren</button>
</div>
</div>
</div>
</div>
<!-- Toast Container -->
<div id="toast-container" class="toast-container"></div>
<!-- Mobile Navigation Menu -->
<nav id="mobile-menu" class="mobile-menu" aria-hidden="true">
<div class="mobile-menu-header">
<h2 class="mobile-menu-title">TaskMate</h2>
<button id="mobile-menu-close" class="mobile-menu-close" aria-label="Menu schliessen">
<svg viewBox="0 0 24 24" width="24" height="24">
<path d="M18 6L6 18M6 6l12 12" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
</svg>
</button>
</div>
<div class="mobile-menu-section">
<label class="mobile-menu-label">Projekt</label>
<select id="mobile-project-select" class="mobile-project-select">
<!-- Populated by JS -->
</select>
</div>
<div class="mobile-menu-section">
<label class="mobile-menu-label">Ansicht</label>
<div class="mobile-menu-nav">
<button class="mobile-nav-item active" data-view="board">
<svg viewBox="0 0 24 24" width="20" height="20"><rect x="3" y="3" width="7" height="9" rx="1" stroke="currentColor" stroke-width="2" fill="none"/><rect x="14" y="3" width="7" height="5" rx="1" stroke="currentColor" stroke-width="2" fill="none"/><rect x="14" y="12" width="7" height="9" rx="1" stroke="currentColor" stroke-width="2" fill="none"/><rect x="3" y="16" width="7" height="5" rx="1" stroke="currentColor" stroke-width="2" fill="none"/></svg>
<span>Board</span>
</button>
<button class="mobile-nav-item" data-view="list">
<svg viewBox="0 0 24 24" width="20" height="20"><path d="M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>
<span>Liste</span>
</button>
<button class="mobile-nav-item" data-view="calendar">
<svg viewBox="0 0 24 24" width="20" height="20"><rect x="3" y="4" width="18" height="18" rx="2" stroke="currentColor" stroke-width="2" fill="none"/><line x1="16" y1="2" x2="16" y2="6" stroke="currentColor" stroke-width="2"/><line x1="8" y1="2" x2="8" y2="6" stroke="currentColor" stroke-width="2"/><line x1="3" y1="10" x2="21" y2="10" stroke="currentColor" stroke-width="2"/></svg>
<span>Kalender</span>
</button>
<button class="mobile-nav-item" data-view="proposals">
<svg viewBox="0 0 24 24" width="20" height="20"><path d="M9 11l3 3L22 4" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11" stroke="currentColor" stroke-width="2" fill="none"/></svg>
<span>Genehmigung</span>
</button>
<button class="mobile-nav-item" data-view="coding">
<svg viewBox="0 0 24 24" width="20" height="20"><polyline points="16 18 22 12 16 6" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/><polyline points="8 6 2 12 8 18" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg>
<span>Coding</span>
</button>
<button class="mobile-nav-item" data-view="knowledge">
<svg viewBox="0 0 24 24" width="20" height="20"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20" stroke="currentColor" stroke-width="2" fill="none"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z" stroke="currentColor" stroke-width="2" fill="none"/></svg>
<span>Wissen</span>
</button>
</div>
</div>
<div class="mobile-menu-section mobile-menu-user">
<div class="mobile-user-info">
<span id="mobile-user-avatar" class="mobile-user-avatar">U</span>
<div class="mobile-user-details">
<span id="mobile-user-name" class="mobile-user-name">Benutzer</span>
<span id="mobile-user-role" class="mobile-user-role">Angemeldet</span>
</div>
</div>
<button id="mobile-admin-btn" class="mobile-menu-btn hidden">Admin-Bereich</button>
<button id="mobile-logout-btn" class="mobile-menu-btn mobile-menu-btn-danger">Abmelden</button>
</div>
</nav>
<!-- Mobile Menu Overlay -->
<div id="mobile-menu-overlay" class="mobile-menu-overlay"></div>
<!-- Swipe Indicators -->
<div id="swipe-indicator-left" class="swipe-indicator left">
<svg viewBox="0 0 24 24" width="24" height="24"><path d="M15 18l-6-6 6-6" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg>
</div>
<div id="swipe-indicator-right" class="swipe-indicator right">
<svg viewBox="0 0 24 24" width="24" height="24"><path d="M9 18l6-6-6-6" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg>
</div>
<!-- Onboarding Tour -->
<div id="onboarding-overlay" class="onboarding-overlay hidden">
<div id="onboarding-tooltip" class="onboarding-tooltip">
@ -1934,6 +1677,21 @@
<img id="lightbox-image" src="" alt="">
</div>
<!-- CLAUDE.md Modal -->
<div id="claude-md-modal" class="modal hidden">
<div class="modal-content modal-large">
<div class="modal-header">
<h3>CLAUDE.md (Nur-Lesen)</h3>
<button class="modal-close" aria-label="Schließen">&times;</button>
</div>
<div class="modal-body">
<div class="claude-md-viewer">
<pre id="claude-md-content" class="claude-md-display"></pre>
</div>
</div>
</div>
</div>
<!-- Socket.io Client -->
<script src="/socket.io/socket.io.js"></script>