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 {
const creds = await window.electronAPI.loadCredentials();
if (creds) {
// Fülle Settings-Felder
if ($('githubToken')) $('githubToken').value = creds.githubToken || '';
if ($('giteaToken')) $('giteaToken').value = creds.giteaToken || '';
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) {
console.error('Error loading credentials:', error);
setStatus('Fehler beim Laden der Einstellungen');
}
// Rest of Event Handlers... (bleibt unverändert)
// Event Handlers
if ($('btnLoadGiteaRepos')) {
$('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
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) {
let selectedFiles = [];
const modal = document.createElement('div');
modal.className = 'modal';
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>
<div class="input-group">
@@ -2186,22 +2203,30 @@ function showCreateReleaseModal(owner, repo) {
<label>Target Branch</label>
<input id="releaseTarget" type="text" value="main" placeholder="main">
</div>
<!-- NEU: Datei Upload -->
<div class="input-group">
<label>📎 Release Assets (optional)</label>
<button id="btnSelectAssets" style="
width: 100%;
padding: 12px;
background: var(--bg-tertiary);
border: 2px dashed rgba(255, 255, 255, 0.2);
border-radius: var(--radius-md);
color: var(--text-secondary);
cursor: pointer;
transition: all 0.2s;
">
📁 Dateien auswählen (z.B. .exe, .zip, .tar.gz)
</button>
<div id="assetsList" style="margin-top: 10px;"></div>
<label>Release Asset (Optional)</label>
<div style="display: flex; gap: 10px;">
<input id="releaseAssetInput" type="text" readonly placeholder="Keine Datei gewählt" style="
flex: 1;
padding: 10px;
border-radius: var(--radius-md);
border: 1px solid rgba(255, 255, 255, 0.1);
background: rgba(0, 0, 0, 0.2);
color: var(--text-muted);
cursor: not-allowed;
">
<button id="btnSelectReleaseAsset" type="button" style="
padding: 10px 20px;
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 class="input-group" style="display: flex; gap: 20px;">
@@ -2221,53 +2246,28 @@ function showCreateReleaseModal(owner, repo) {
`;
document.body.appendChild(modal);
// Asset-Auswahl Handler
$('btnSelectAssets').onclick = async () => {
const res = await window.electronAPI.selectFile();
if (res.ok && res.files && res.files.length > 0) {
selectedFiles = res.files;
updateAssetsList();
// Variable zum Speichern des gewählten Dateipfads
let selectedAssetPath = null;
// Event Listener: Datei auswählen
$('btnSelectReleaseAsset').onclick = async () => {
try {
const res = await window.electronAPI.selectFile();
if (res.ok && res.files && res.files.length > 0) {
selectedAssetPath = res.files[0];
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() {
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();
};
// Event Listener: Release erstellen
$('btnCreateRelease').onclick = async () => {
const tag = $('releaseTag').value.trim();
const name = $('releaseName').value.trim() || tag;
@@ -2281,14 +2281,10 @@ function showCreateReleaseModal(owner, repo) {
return;
}
const btnCreate = $('btnCreateRelease');
const originalText = btnCreate.textContent;
btnCreate.disabled = true;
btnCreate.textContent = 'Erstelle Release...';
setStatus('Creating release...');
try {
// 1. Release erstellen
const res = await window.electronAPI.createRelease({
owner,
repo,
@@ -2301,43 +2297,49 @@ function showCreateReleaseModal(owner, repo) {
});
if (res.ok) {
// Assets hochladen, falls vorhanden
if (selectedFiles.length > 0) {
btnCreate.textContent = `Lade Assets (0/${selectedFiles.length})...`;
setStatus(`Uploading ${selectedFiles.length} asset(s)...`);
// 2. Falls eine Datei ausgewählt wurde, direkt hochladen
if (selectedAssetPath) {
setStatus('Release erstellt. Lade Datei hoch...');
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 {
await window.electronAPI.uploadReleaseAsset({
owner,
repo,
releaseId: res.release.id,
filePath: file.path,
fileName: file.name
});
} catch (err) {
console.error('Asset upload error:', err);
// Weiter mit nächster Datei
try {
const fileName = selectedAssetPath.split(/[\\/]/).pop();
const uploadRes = await window.electronAPI.uploadReleaseAsset({
owner,
repo,
releaseId: res.release.id,
filePath: selectedAssetPath,
fileName
});
if (uploadRes.ok) {
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();
setStatus('Release created successfully!');
loadRepoReleases(owner, repo); // Reload
loadRepoReleases(owner, repo); // Liste neu laden
} else {
setStatus('Failed: ' + res.error);
btnCreate.disabled = false;
btnCreate.textContent = originalText;
alert('Fehler beim Erstellen des Releases: ' + res.error);
}
} catch (error) {
console.error('Create release error:', error);
setStatus('Create failed');
btnCreate.disabled = false;
btnCreate.textContent = originalText;
alert('Ein unerwarteter Fehler ist aufgetreten.');
}
};
@@ -2348,7 +2350,6 @@ function showCreateReleaseModal(owner, repo) {
if (e.target === modal) modal.remove();
};
}
/* -------------------------
UPLOAD ASSET DIALOG
------------------------- */
@@ -2360,9 +2361,8 @@ async function showUploadAssetDialog(release) {
return;
}
const file = res.files[0];
const filePath = file.path;
const fileName = file.name;
const filePath = res.files[0];
const fileName = filePath.split(/[\\/]/).pop();
setStatus(`Uploading ${fileName}...`);
showProgress(0, `Uploading ${fileName}...`);