Update from Git Manager GUI

This commit is contained in:
2026-02-07 20:44:20 +01:00
parent eece161e58
commit 0a6703b87e
6 changed files with 101 additions and 101 deletions

View File

View File

View File

View File

0
renderer/modules/ui.js Normal file
View File

View File

@@ -1588,18 +1588,39 @@ window.addEventListener('DOMContentLoaded', async () => {
} }
}); });
// Load credentials // Load credentials and auto-login if available
try { try {
const creds = await window.electronAPI.loadCredentials(); const creds = await window.electronAPI.loadCredentials();
if (creds) { if (creds) {
// Fülle Settings-Felder
if ($('githubToken')) $('githubToken').value = creds.githubToken || ''; if ($('githubToken')) $('githubToken').value = creds.githubToken || '';
if ($('giteaToken')) $('giteaToken').value = creds.giteaToken || ''; if ($('giteaToken')) $('giteaToken').value = creds.giteaToken || '';
if ($('giteaURL')) $('giteaURL').value = creds.giteaURL || ''; if ($('giteaURL')) $('giteaURL').value = creds.giteaURL || '';
// 🆕 AUTO-LOGIN: Wenn Gitea-Credentials vorhanden sind, lade sofort die Repos
if (creds.giteaToken && creds.giteaURL) {
console.log('✅ Credentials gefunden - Auto-Login wird gestartet...');
setStatus('Lade deine Projekte...');
// Kurze Verzögerung damit UI fertig geladen ist
setTimeout(() => {
loadGiteaRepos();
}, 500);
} else {
console.log(' Keine vollständigen Gitea-Credentials - bitte in Settings eintragen');
setStatus('Bereit - bitte Settings konfigurieren');
}
} else {
console.log(' Keine Credentials gespeichert');
setStatus('Bereit - bitte Settings konfigurieren');
} }
} catch (error) { } catch (error) {
console.error('Error loading credentials:', error); console.error('Error loading credentials:', error);
setStatus('Fehler beim Laden der Einstellungen');
} }
// Rest of Event Handlers... (bleibt unverändert)
// Event Handlers // Event Handlers
if ($('btnLoadGiteaRepos')) { if ($('btnLoadGiteaRepos')) {
$('btnLoadGiteaRepos').onclick = loadGiteaRepos; $('btnLoadGiteaRepos').onclick = loadGiteaRepos;
@@ -1723,8 +1744,6 @@ window.addEventListener('DOMContentLoaded', async () => {
}; };
} }
// Modal wird mit pointer-events: none nicht geschlossen durch Klicks
// Der Grid bleibt voll interaktiv für neue Tabs
// Keyboard shortcuts // Keyboard shortcuts
document.addEventListener('keydown', (e) => { document.addEventListener('keydown', (e) => {
@@ -2143,15 +2162,13 @@ function createReleaseCard(release, isLatest) {
} }
/* ------------------------- /* -------------------------
CREATE RELEASE MODAL CREATE RELEASE MODAL (MIT DATEI-UPLOAD)
------------------------- */ ------------------------- */
function showCreateReleaseModal(owner, repo) { function showCreateReleaseModal(owner, repo) {
let selectedFiles = [];
const modal = document.createElement('div'); const modal = document.createElement('div');
modal.className = 'modal'; modal.className = 'modal';
modal.innerHTML = ` modal.innerHTML = `
<div class="card" style="width: 650px; max-width: 90vw;"> <div class="card" style="width: 600px; max-width: 90vw;">
<h2>🚀 Neues Release erstellen</h2> <h2>🚀 Neues Release erstellen</h2>
<div class="input-group"> <div class="input-group">
@@ -2187,21 +2204,29 @@ function showCreateReleaseModal(owner, repo) {
<input id="releaseTarget" type="text" value="main" placeholder="main"> <input id="releaseTarget" type="text" value="main" placeholder="main">
</div> </div>
<!-- NEU: Datei Upload -->
<div class="input-group"> <div class="input-group">
<label>📎 Release Assets (optional)</label> <label>Release Asset (Optional)</label>
<button id="btnSelectAssets" style=" <div style="display: flex; gap: 10px;">
width: 100%; <input id="releaseAssetInput" type="text" readonly placeholder="Keine Datei gewählt" style="
padding: 12px; flex: 1;
background: var(--bg-tertiary); padding: 10px;
border: 2px dashed rgba(255, 255, 255, 0.2);
border-radius: var(--radius-md); border-radius: var(--radius-md);
color: var(--text-secondary); border: 1px solid rgba(255, 255, 255, 0.1);
cursor: pointer; background: rgba(0, 0, 0, 0.2);
transition: all 0.2s; color: var(--text-muted);
cursor: not-allowed;
"> ">
📁 Dateien auswählen (z.B. .exe, .zip, .tar.gz) <button id="btnSelectReleaseAsset" type="button" style="
</button> padding: 10px 20px;
<div id="assetsList" style="margin-top: 10px;"></div> border-radius: var(--radius-md);
background: var(--bg-secondary);
color: var(--text-primary);
border: 1px solid rgba(255, 255, 255, 0.1);
cursor: pointer;
font-weight: 600;
">📎 Datei wählen</button>
</div>
</div> </div>
<div class="input-group" style="display: flex; gap: 20px;"> <div class="input-group" style="display: flex; gap: 20px;">
@@ -2222,52 +2247,27 @@ function showCreateReleaseModal(owner, repo) {
document.body.appendChild(modal); document.body.appendChild(modal);
// Asset-Auswahl Handler // Variable zum Speichern des gewählten Dateipfads
$('btnSelectAssets').onclick = async () => { let selectedAssetPath = null;
// Event Listener: Datei auswählen
$('btnSelectReleaseAsset').onclick = async () => {
try {
const res = await window.electronAPI.selectFile(); const res = await window.electronAPI.selectFile();
if (res.ok && res.files && res.files.length > 0) { if (res.ok && res.files && res.files.length > 0) {
selectedFiles = res.files; selectedAssetPath = res.files[0];
updateAssetsList(); const fileName = selectedAssetPath.split(/[\\/]/).pop();
$('releaseAssetInput').value = fileName;
$('releaseAssetInput').style.color = 'var(--text-primary)';
$('releaseAssetInput').style.borderColor = 'var(--accent-primary)';
}
} catch (error) {
console.error('Fehler beim Auswählen der Datei:', error);
alert('Konnte Dateidialog nicht öffnen.');
} }
}; };
function updateAssetsList() { // Event Listener: Release erstellen
const list = $('assetsList');
if (selectedFiles.length === 0) {
list.innerHTML = '';
return;
}
list.innerHTML = selectedFiles.map((file, idx) => `
<div style="
display: flex;
align-items: center;
gap: 10px;
padding: 8px 12px;
background: var(--bg-tertiary);
border-radius: var(--radius-sm);
margin-bottom: 6px;
">
<span style="flex: 1; color: var(--text-primary); font-size: 13px;">📄 ${file.name}</span>
<button onclick="removeAsset(${idx})" style="
background: rgba(255, 59, 48, 0.2);
color: #ff3b30;
border: none;
padding: 4px 8px;
border-radius: 4px;
cursor: pointer;
font-size: 12px;
">✕</button>
</div>
`).join('');
}
// Asset entfernen (global für onclick)
window.removeAsset = (idx) => {
selectedFiles.splice(idx, 1);
updateAssetsList();
};
$('btnCreateRelease').onclick = async () => { $('btnCreateRelease').onclick = async () => {
const tag = $('releaseTag').value.trim(); const tag = $('releaseTag').value.trim();
const name = $('releaseName').value.trim() || tag; const name = $('releaseName').value.trim() || tag;
@@ -2281,14 +2281,10 @@ function showCreateReleaseModal(owner, repo) {
return; return;
} }
const btnCreate = $('btnCreateRelease');
const originalText = btnCreate.textContent;
btnCreate.disabled = true;
btnCreate.textContent = 'Erstelle Release...';
setStatus('Creating release...'); setStatus('Creating release...');
try { try {
// 1. Release erstellen
const res = await window.electronAPI.createRelease({ const res = await window.electronAPI.createRelease({
owner, owner,
repo, repo,
@@ -2301,43 +2297,49 @@ function showCreateReleaseModal(owner, repo) {
}); });
if (res.ok) { if (res.ok) {
// Assets hochladen, falls vorhanden // 2. Falls eine Datei ausgewählt wurde, direkt hochladen
if (selectedFiles.length > 0) { if (selectedAssetPath) {
btnCreate.textContent = `Lade Assets (0/${selectedFiles.length})...`; setStatus('Release erstellt. Lade Datei hoch...');
setStatus(`Uploading ${selectedFiles.length} asset(s)...`); showProgress(50, 'Uploading Asset...');
for (let i = 0; i < selectedFiles.length; i++) {
const file = selectedFiles[i];
btnCreate.textContent = `Lade Assets (${i + 1}/${selectedFiles.length})...`;
try { try {
await window.electronAPI.uploadReleaseAsset({ const fileName = selectedAssetPath.split(/[\\/]/).pop();
const uploadRes = await window.electronAPI.uploadReleaseAsset({
owner, owner,
repo, repo,
releaseId: res.release.id, releaseId: res.release.id,
filePath: file.path, filePath: selectedAssetPath,
fileName: file.name fileName
}); });
} catch (err) {
console.error('Asset upload error:', err); if (uploadRes.ok) {
// Weiter mit nächster Datei setStatus(`Release "${tag}" und Asset erstellt!`);
} else {
console.error('Asset Upload fehlgeschlagen:', uploadRes.error);
alert(`Release erstellt, aber Asset Upload fehlgeschlagen: ${uploadRes.error}`);
setStatus('Release erstellt (Upload Fehler)');
} }
} catch (uploadErr) {
console.error('Upload error:', uploadErr);
alert('Release erstellt, aber Fehler beim Hochladen der Datei.');
setStatus('Release erstellt (Upload Fehler)');
} finally {
hideProgress();
} }
} else {
setStatus('Release created!');
} }
modal.remove(); modal.remove();
setStatus('Release created successfully!'); loadRepoReleases(owner, repo); // Liste neu laden
loadRepoReleases(owner, repo); // Reload
} else { } else {
setStatus('Failed: ' + res.error); setStatus('Failed: ' + res.error);
btnCreate.disabled = false; alert('Fehler beim Erstellen des Releases: ' + res.error);
btnCreate.textContent = originalText;
} }
} catch (error) { } catch (error) {
console.error('Create release error:', error); console.error('Create release error:', error);
setStatus('Create failed'); setStatus('Create failed');
btnCreate.disabled = false; alert('Ein unerwarteter Fehler ist aufgetreten.');
btnCreate.textContent = originalText;
} }
}; };
@@ -2348,7 +2350,6 @@ function showCreateReleaseModal(owner, repo) {
if (e.target === modal) modal.remove(); if (e.target === modal) modal.remove();
}; };
} }
/* ------------------------- /* -------------------------
UPLOAD ASSET DIALOG UPLOAD ASSET DIALOG
------------------------- */ ------------------------- */
@@ -2360,9 +2361,8 @@ async function showUploadAssetDialog(release) {
return; return;
} }
const file = res.files[0]; const filePath = res.files[0];
const filePath = file.path; const fileName = filePath.split(/[\\/]/).pop();
const fileName = file.name;
setStatus(`Uploading ${fileName}...`); setStatus(`Uploading ${fileName}...`);
showProgress(0, `Uploading ${fileName}...`); showProgress(0, `Uploading ${fileName}...`);