From b2ba2a09e2f7b700b571872e65bf78ab06ab191d Mon Sep 17 00:00:00 2001 From: M_Viper Date: Tue, 24 Mar 2026 19:18:26 +0100 Subject: [PATCH] Update from Git Manager GUI --- renderer/App.jsx | 238 ++++++++---- renderer/Settings.jsx | 99 ++++- renderer/index.html | 52 ++- renderer/renderer.js | 858 ++++++++++++++++++++++++++++++++++++++++-- renderer/style.css | 679 +++++++++++++++++++++++++++++++++ 5 files changed, 1804 insertions(+), 122 deletions(-) diff --git a/renderer/App.jsx b/renderer/App.jsx index 6491792..bdc65b8 100644 --- a/renderer/App.jsx +++ b/renderer/App.jsx @@ -4,39 +4,42 @@ import Settings from './Settings.jsx'; export default function App() { const [folder, setFolder] = useState(''); const [repoName, setRepoName] = useState(''); - const [platform, setPlatform] = useState('github'); - const [status, setStatus] = useState(''); + const [platform, setPlatform] = useState('gitea'); + const [status, setStatus] = useState('Bereit'); const [showSettings, setShowSettings] = useState(false); const [branches, setBranches] = useState([]); - const [selectedBranch, setSelectedBranch] = useState('master'); + const [selectedBranch, setSelectedBranch] = useState('main'); const [logs, setLogs] = useState([]); const [progress, setProgress] = useState(0); async function selectFolder() { const selected = await window.electronAPI.selectFolder(); - if (selected) setFolder(selected); - // Branches laden - if (selected) { - const branchList = await window.electronAPI.getBranches({ folder: selected }); - setBranches(branchList); - if (branchList.includes('master')) setSelectedBranch('master'); - } + if (!selected) return; + setFolder(selected); + const branchList = await window.electronAPI.getBranches({ folder: selected }); + setBranches(branchList); + if (branchList.includes('main')) setSelectedBranch('main'); + else if (branchList.includes('master')) setSelectedBranch('master'); + else if (branchList.length > 0) setSelectedBranch(branchList[0]); } async function createRepoHandler() { - if (!repoName) return alert('Repo Name required!'); - setStatus('Creating repository...'); + if (!repoName) return alert('Repo-Name erforderlich!'); + setStatus('Repository wird erstellt…'); const result = await window.electronAPI.createRepo({ name: repoName, platform }); - setStatus(result ? 'Repository created!' : 'Failed to create repository.'); + setStatus(result ? 'Repository erstellt!' : 'Fehler beim Erstellen des Repositories.'); } async function pushProjectHandler() { - if (!folder) return alert('Select a project folder first!'); - setStatus('Pushing project...'); + if (!folder) return alert('Bitte zuerst einen Projektordner auswählen!'); + setStatus('Projekt wird gepusht…'); setProgress(0); - const onProgress = (p) => setProgress(p); // Callback für Fortschritt - const result = await window.electronAPI.pushProject({ folder, branch: selectedBranch, onProgress }); - setStatus(result ? 'Project pushed!' : 'Failed to push project.'); + const result = await window.electronAPI.pushProject({ + folder, + branch: selectedBranch, + onProgress: (p) => setProgress(p), + }); + setStatus(result ? 'Projekt gepusht!' : 'Push fehlgeschlagen.'); if (result) { const logList = await window.electronAPI.getCommitLogs({ folder }); setLogs(logList); @@ -44,61 +47,168 @@ export default function App() { } return ( -
-

Git Manager GUI - High-End

- - {showSettings && } +
-
- - + {/* ── Toolbar ── */} +
+
+
+
+ Git Manager Logo +
+
+ Workspace Control + Git Manager Explorer Pro +
+
+ +
+
+ + +
+ +
+ +
+ +
+
+
+
+ +
+
+ +
+ +
+
+ {['gitea', 'github'].map(p => ( + + ))} +
+ + {branches.length > 0 && ( + + )} +
+
-
- - {folder} -
+ {/* ── Main ── */} +
-
- - -
+ {/* Fortschrittsbalken */} + {progress > 0 && progress < 100 && ( +
+ + +
+ )} -
- setRepoName(e.target.value)} /> - -
+ {/* Repo erstellen / Ordner */} +
+

📁 Projekt & Repository

-
- -
+
+ +
+ + +
+
-
- - -
+
+ + setRepoName(e.target.value)} + /> +
-
- Status: {status} -
+
+ + +
+
-
-

Commit Logs:

-
    - {logs.map((log, i) => ( -
  • {log}
  • - ))} -
-
+ {/* Commit-Logs */} + {logs.length > 0 && ( +
+

📊 Commit-Verlauf

+
    + {logs.map((log, i) => ( +
  • + {log} +
  • + ))} +
+
+ )} + + {logs.length === 0 && !folder && ( +
+
📂
+

+ Öffne einen lokalen Ordner oder lade Repos über die Toolbar. +

+
+ )} +
+ + {/* ── Settings-Modal ── */} + {showSettings && ( +
{ if (e.target === e.currentTarget) setShowSettings(false); }}> + setShowSettings(false)} /> +
+ )}
); } diff --git a/renderer/Settings.jsx b/renderer/Settings.jsx index bbb9626..4e230ea 100644 --- a/renderer/Settings.jsx +++ b/renderer/Settings.jsx @@ -1,9 +1,10 @@ import React, { useState, useEffect } from 'react'; -export default function Settings() { +export default function Settings({ onClose }) { const [githubToken, setGithubToken] = useState(''); const [giteaToken, setGiteaToken] = useState(''); const [giteaURL, setGiteaURL] = useState(''); + const [savedOk, setSavedOk] = useState(false); function normalizeAndValidateGiteaUrl(rawUrl) { const value = (rawUrl || '').trim(); @@ -15,14 +16,14 @@ export default function Settings() { } catch (_) { return { ok: false, - error: 'Ungültige Gitea-URL. Beispiel für IPv6: http://[2001:db8::1]:3000' + error: 'Ungültige Gitea-URL. Beispiel für IPv6: http://[2001:db8::1]:3000', }; } if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') { return { ok: false, - error: 'Die Gitea-URL muss mit http:// oder https:// beginnen.' + error: 'Die Gitea-URL muss mit http:// oder https:// beginnen.', }; } @@ -39,33 +40,95 @@ export default function Settings() { }); }, []); - const save = () => { + function save() { const checkedUrl = normalizeAndValidateGiteaUrl(giteaURL); if (!checkedUrl.ok) { alert(checkedUrl.error); return; } - window.electronAPI.saveCredentials({ githubToken, giteaToken, giteaURL: checkedUrl.value }); - alert('Settings saved securely!'); + setSavedOk(true); + setTimeout(() => setSavedOk(false), 2500); } return ( -
-

Settings

-
- - setGithubToken(e.target.value)} /> +
+ +
+
+
Konfiguration
+

⚙️ Einstellungen

+

+ Zugangsdaten für GitHub und Gitea hinterlegen. +

+
-
- - setGiteaToken(e.target.value)} /> + +
+
+
+
+
+

Zugangsdaten

+

API-Zugriffe für GitHub und Gitea konfigurieren.

+
+
+ +
+
+ + setGithubToken(e.target.value)} + /> +
+ +
+ + setGiteaToken(e.target.value)} + /> +
+
+ +
+ + setGiteaURL(e.target.value)} + /> +
+
+ Hinweis: IPv6 mit Klammern eingeben, z.B. http://[2001:db8::1]:3000 +
+
+
+
+
-
- - setGiteaURL(e.target.value)} /> + +
+ + {onClose && ( + + )}
-
); } diff --git a/renderer/index.html b/renderer/index.html index 9da8662..85b8f39 100644 --- a/renderer/index.html +++ b/renderer/index.html @@ -9,6 +9,25 @@
+ +
+
+ + Git Manager Explorer Pro +
+
+ + + +
+
+
@@ -63,10 +82,12 @@
-
-
-
-
+
+ +
+
+
+
@@ -230,6 +272,7 @@
+
Name prüfen: Duplikate, ähnliche Namen und ungültige Zeichen werden erkannt.
@@ -295,6 +338,7 @@
+
Kollisionsprüfung aktiv: vorhandene Zielordner und Namenskonflikte werden angezeigt.