Update from Git Manager GUI
This commit is contained in:
0
renderer/modules/editor.js
Normal file
0
renderer/modules/editor.js
Normal file
0
renderer/modules/gitea.js
Normal file
0
renderer/modules/gitea.js
Normal file
0
renderer/modules/progress.js
Normal file
0
renderer/modules/progress.js
Normal file
0
renderer/modules/state.js
Normal file
0
renderer/modules/state.js
Normal file
0
renderer/modules/ui.js
Normal file
0
renderer/modules/ui.js
Normal 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">
|
||||||
@@ -2186,22 +2203,30 @@ function showCreateReleaseModal(owner, repo) {
|
|||||||
<label>Target Branch</label>
|
<label>Target Branch</label>
|
||||||
<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);
|
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||||
color: var(--text-secondary);
|
background: rgba(0, 0, 0, 0.2);
|
||||||
cursor: pointer;
|
color: var(--text-muted);
|
||||||
transition: all 0.2s;
|
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;">
|
||||||
@@ -2221,53 +2246,28 @@ 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;
|
||||||
const res = await window.electronAPI.selectFile();
|
|
||||||
if (res.ok && res.files && res.files.length > 0) {
|
// Event Listener: Datei auswählen
|
||||||
selectedFiles = res.files;
|
$('btnSelectReleaseAsset').onclick = async () => {
|
||||||
updateAssetsList();
|
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() {
|
// 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++) {
|
try {
|
||||||
const file = selectedFiles[i];
|
const fileName = selectedAssetPath.split(/[\\/]/).pop();
|
||||||
btnCreate.textContent = `Lade Assets (${i + 1}/${selectedFiles.length})...`;
|
const uploadRes = await window.electronAPI.uploadReleaseAsset({
|
||||||
|
owner,
|
||||||
try {
|
repo,
|
||||||
await window.electronAPI.uploadReleaseAsset({
|
releaseId: res.release.id,
|
||||||
owner,
|
filePath: selectedAssetPath,
|
||||||
repo,
|
fileName
|
||||||
releaseId: res.release.id,
|
});
|
||||||
filePath: file.path,
|
|
||||||
fileName: file.name
|
if (uploadRes.ok) {
|
||||||
});
|
setStatus(`Release "${tag}" und Asset erstellt!`);
|
||||||
} catch (err) {
|
} else {
|
||||||
console.error('Asset upload error:', err);
|
console.error('Asset Upload fehlgeschlagen:', uploadRes.error);
|
||||||
// Weiter mit nächster Datei
|
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}...`);
|
||||||
|
|||||||
Reference in New Issue
Block a user