Upload folder via GUI - renderer

This commit is contained in:
Git Manager GUI
2026-05-24 22:33:16 +02:00
parent 691c85531c
commit 309babf849

View File

@@ -944,7 +944,7 @@ async function toggleRepoVisibility(owner, repoName, currentPrivate) {
} }
const targetPrivate = !currentPrivate; const targetPrivate = !currentPrivate;
const actionText = targetPrivate ? 'privat' : 'oeffentlich'; const actionText = targetPrivate ? 'privat' : 'öffentlich';
showProgress(35, `Repository wird ${actionText} gesetzt...`); showProgress(35, `Repository wird ${actionText} gesetzt...`);
const result = await window.electronAPI.updateGiteaRepoVisibility({ const result = await window.electronAPI.updateGiteaRepoVisibility({
token: creds.giteaToken, token: creds.giteaToken,
@@ -1048,7 +1048,7 @@ function showTagsEditorModal(owner, repoName, seed, knownTopics) {
const hint = document.createElement('div'); const hint = document.createElement('div');
hint.className = 'settings-inline-hint'; hint.className = 'settings-inline-hint';
hint.textContent = 'Vorschlaege kommen live von deiner Gitea-Seite. Neue Tags sind ebenfalls erlaubt.'; hint.textContent = 'Vorschläge kommen live von deiner Gitea-Seite. Neue Tags sind ebenfalls erlaubt.';
group.appendChild(repoLabel); group.appendChild(repoLabel);
group.appendChild(selectedHostEl); group.appendChild(selectedHostEl);
@@ -1130,7 +1130,7 @@ function showTagsEditorModal(owner, repoName, seed, knownTopics) {
} }
list = list.filter(t => !selected.some(s => s.toLowerCase() === t.toLowerCase())).slice(0, 50); list = list.filter(t => !selected.some(s => s.toLowerCase() === t.toLowerCase())).slice(0, 50);
if (list.length === 0) { if (list.length === 0) {
suggestionsHost.innerHTML = '<div style="padding:10px 12px;color:var(--text-muted);font-size:12px;">Keine Vorschlaege</div>'; suggestionsHost.innerHTML = '<div style="padding:10px 12px;color:var(--text-muted);font-size:12px;">Keine Vorschläge</div>';
return; return;
} }
suggestionsHost.innerHTML = ''; suggestionsHost.innerHTML = '';
@@ -1521,7 +1521,7 @@ async function buildGithubHeatmapFromRepoCommits(monthsBack) {
dayMap.set(key, (dayMap.get(key) || 0) + 1); dayMap.set(key, (dayMap.get(key) || 0) + 1);
} }
} catch (_) { } catch (_) {
// einzelne Repos koennen fehlschlagen ohne den Gesamtprozess zu blockieren // einzelne Repos können fehlschlagen, ohne den Gesamtprozess zu blockieren
} }
} }
}; };
@@ -2742,9 +2742,9 @@ function renderTabs() {
e.stopPropagation(); e.stopPropagation();
if (tab.dirty) { if (tab.dirty) {
const ok = await showActionConfirmModal({ const ok = await showActionConfirmModal({
title: 'Ungespeicherte Aenderungen', title: 'Ungespeicherte Änderungen',
message: `${tab.name} hat ungespeicherte Aenderungen. Wirklich schliessen?`, message: `${tab.name} hat ungespeicherte Änderungen. Wirklich schließen?`,
confirmText: 'Schliessen', confirmText: 'Schließen',
danger: true danger: true
}); });
if (!ok) return; if (!ok) return;
@@ -3009,9 +3009,9 @@ async function closeFileEditor() {
if (unsaved.length > 0) { if (unsaved.length > 0) {
const ok = await showActionConfirmModal({ const ok = await showActionConfirmModal({
title: 'Ungespeicherte Aenderungen', title: 'Ungespeicherte Änderungen',
message: `${unsaved.length} Datei(en) haben ungespeicherte Aenderungen. Wirklich schliessen?`, message: `${unsaved.length} Datei(en) haben ungespeicherte Änderungen. Wirklich schließen?`,
confirmText: 'Schliessen', confirmText: 'Schließen',
danger: true danger: true
}); });
if (!ok) return; if (!ok) return;
@@ -3049,7 +3049,7 @@ async function openFileEditor(filePath, fileName) {
if (response.ok) { if (response.ok) {
addTab(filePath, fileName, response.content); addTab(filePath, fileName, response.content);
} else { } else {
await showInfoModal('Datei konnte nicht geoeffnet werden', `Fehler: ${response.error || 'Unbekannter Fehler'}`, true); await showInfoModal('Datei konnte nicht geöffnet werden', `Fehler: ${response.error || 'Unbekannter Fehler'}`, true);
return; return;
} }
} }
@@ -3065,7 +3065,7 @@ async function openFileEditor(filePath, fileName) {
console.log('✅ File opened'); console.log('✅ File opened');
} catch (error) { } catch (error) {
console.error('Error opening file:', error); console.error('Error opening file:', error);
await showInfoModal('Datei konnte nicht geoeffnet werden', 'Fehler beim Oeffnen der Datei.', true); await showInfoModal('Datei konnte nicht geöffnet werden', 'Fehler beim Öffnen der Datei.', true);
} }
} }
@@ -3110,7 +3110,7 @@ async function openGiteaFileInEditor(owner, repo, filePath, fileName) {
} }
} catch (error) { } catch (error) {
console.error('Error opening Gitea file:', error); console.error('Error opening Gitea file:', error);
await showInfoModal('Datei konnte nicht geoeffnet werden', 'Fehler beim Oeffnen der Datei.', true); await showInfoModal('Datei konnte nicht geöffnet werden', 'Fehler beim Öffnen der Datei.', true);
showError('Fehler'); showError('Fehler');
} }
} }
@@ -3277,7 +3277,7 @@ async function saveCurrentFile(isAutoSave = false) {
// Prüfe ob es eine Bilddatei ist // Prüfe ob es eine Bilddatei ist
if (/\.(png|jpg|jpeg|gif|webp|svg)$/i.test(currentActiveTab)) { if (/\.(png|jpg|jpeg|gif|webp|svg)$/i.test(currentActiveTab)) {
await showInfoModal('Nicht bearbeitbar', 'Bilder koennen nicht bearbeitet werden.'); await showInfoModal('Nicht bearbeitbar', 'Bilder können nicht bearbeitet werden.');
return; return;
} }
@@ -4374,7 +4374,7 @@ function showSyncConfirmModal({ title = 'Bestaetigen', message = '', confirmText
const detailTitle = document.createElement('div'); const detailTitle = document.createElement('div');
detailTitle.style.cssText = 'font-size:12px;font-weight:700;letter-spacing:0.06em;text-transform:uppercase;color:#b9c9e8;margin-bottom:4px;'; detailTitle.style.cssText = 'font-size:12px;font-weight:700;letter-spacing:0.06em;text-transform:uppercase;color:#b9c9e8;margin-bottom:4px;';
detailTitle.textContent = 'Was wird uebernommen'; detailTitle.textContent = 'Was wird übernommen';
detailBlock.appendChild(detailTitle); detailBlock.appendChild(detailTitle);
rows.forEach((d) => { rows.forEach((d) => {
@@ -4600,7 +4600,7 @@ function showRepoContextMenu(ev, owner, repoName, cloneUrl, element, isPrivate =
details: [ details: [
{ label: 'Richtung', value: 'Gitea -> GitHub' }, { label: 'Richtung', value: 'Gitea -> GitHub' },
{ label: 'Repository', value: `${owner}/${repoName}` }, { label: 'Repository', value: `${owner}/${repoName}` },
{ label: 'Sichtbarkeit', value: isPrivate ? 'Privat' : 'Oeffentlich' }, { label: 'Sichtbarkeit', value: isPrivate ? 'Privat' : 'Öffentlich' },
{ label: 'Beschreibung', value: (repoMeta?.description || '-').slice(0, 160) }, { label: 'Beschreibung', value: (repoMeta?.description || '-').slice(0, 160) },
{ label: 'Topics', value: (Array.isArray(repoMeta?.topics) && repoMeta.topics.length > 0) ? repoMeta.topics.join(', ') : '-' } { label: 'Topics', value: (Array.isArray(repoMeta?.topics) && repoMeta.topics.length > 0) ? repoMeta.topics.join(', ') : '-' }
] ]
@@ -4633,7 +4633,7 @@ function showRepoContextMenu(ev, owner, repoName, cloneUrl, element, isPrivate =
details: [ details: [
{ label: 'Richtung', value: 'GitHub -> Gitea' }, { label: 'Richtung', value: 'GitHub -> Gitea' },
{ label: 'Repository', value: `${owner}/${repoName}` }, { label: 'Repository', value: `${owner}/${repoName}` },
{ label: 'Sichtbarkeit', value: isPrivate ? 'Privat' : 'Oeffentlich' }, { label: 'Sichtbarkeit', value: isPrivate ? 'Privat' : 'Öffentlich' },
{ label: 'Beschreibung', value: (repoMeta?.description || '-').slice(0, 160) }, { label: 'Beschreibung', value: (repoMeta?.description || '-').slice(0, 160) },
{ label: 'Topics', value: (Array.isArray(repoMeta?.topics) && repoMeta.topics.length > 0) ? repoMeta.topics.join(', ') : '-' } { label: 'Topics', value: (Array.isArray(repoMeta?.topics) && repoMeta.topics.length > 0) ? repoMeta.topics.join(', ') : '-' }
] ]
@@ -4757,9 +4757,9 @@ function showRepoContextMenu(ev, owner, repoName, cloneUrl, element, isPrivate =
const deleteItem = createMenuItem('🗑️', 'Repo löschen', async () => { const deleteItem = createMenuItem('🗑️', 'Repo löschen', async () => {
menu.remove(); menu.remove();
const ok = await showActionConfirmModal({ const ok = await showActionConfirmModal({
title: 'Repository loeschen', title: 'Repository löschen',
message: `Delete ${repoName}?`, message: `Repository ${repoName} wirklich löschen?`,
confirmText: 'Loeschen', confirmText: 'Löschen',
danger: true danger: true
}); });
if (ok) { if (ok) {
@@ -4767,13 +4767,13 @@ function showRepoContextMenu(ev, owner, repoName, cloneUrl, element, isPrivate =
const res = await window.electronAPI.deleteGiteaRepo({ owner, repo: repoName, platform: currentState.platform }); const res = await window.electronAPI.deleteGiteaRepo({ owner, repo: repoName, platform: currentState.platform });
if (res.ok) { if (res.ok) {
element.remove(); element.remove();
showSuccess('Repository deleted'); showSuccess('Repository gelöscht');
} else { } else {
showError('Delete failed: ' + res.error); showError('Löschen fehlgeschlagen: ' + res.error);
} }
} catch (error) { } catch (error) {
console.error('Delete error:', error); console.error('Delete error:', error);
showError('Delete failed'); showError('Löschen fehlgeschlagen');
} }
} }
}, '#ef4444'); }, '#ef4444');
@@ -4832,9 +4832,9 @@ function showGiteaItemContextMenu(ev, item, owner, repo) {
addItem('🗑️', `Alle ${selectedItems.size} löschen`, async () => { addItem('🗑️', `Alle ${selectedItems.size} löschen`, async () => {
const ok = await showActionConfirmModal({ const ok = await showActionConfirmModal({
title: 'Mehrfach-Loeschen', title: 'Mehrfach-Löschen',
message: `${selectedItems.size} Elemente wirklich loeschen?`, message: `${selectedItems.size} Elemente wirklich löschen?`,
confirmText: 'Loeschen', confirmText: 'Löschen',
danger: true danger: true
}); });
if (!ok) return; if (!ok) return;
@@ -4912,9 +4912,9 @@ function showGiteaItemContextMenu(ev, item, owner, repo) {
// --- LÖSCHEN --- // --- LÖSCHEN ---
addItem('🗑️', 'Löschen', async () => { addItem('🗑️', 'Löschen', async () => {
const ok = await showActionConfirmModal({ const ok = await showActionConfirmModal({
title: 'Element loeschen', title: 'Element löschen',
message: `"${item.name}" wirklich loeschen?`, message: `"${item.name}" wirklich löschen?`,
confirmText: 'Loeschen', confirmText: 'Löschen',
danger: true danger: true
}); });
if (!ok) return; if (!ok) return;
@@ -4927,7 +4927,7 @@ function showGiteaItemContextMenu(ev, item, owner, repo) {
loadRepoContents(owner, repo, currentState.path); loadRepoContents(owner, repo, currentState.path);
} else { } else {
showError('Löschen fehlgeschlagen: ' + (res?.error || '')); showError('Löschen fehlgeschlagen: ' + (res?.error || ''));
await showInfoModal('Loeschen fehlgeschlagen', 'Loeschen fehlgeschlagen:\n' + (res?.error || 'Unbekannter Fehler'), true); await showInfoModal('Löschen fehlgeschlagen', 'Löschen fehlgeschlagen:\n' + (res?.error || 'Unbekannter Fehler'), true);
} }
}, '#ef4444'); }, '#ef4444');
@@ -4980,9 +4980,9 @@ function showLocalItemContextMenu(ev, node) {
addItem('🗑️', `Alle ${selectedItems.size} löschen`, async () => { addItem('🗑️', `Alle ${selectedItems.size} löschen`, async () => {
const ok = await showActionConfirmModal({ const ok = await showActionConfirmModal({
title: 'Mehrfach-Loeschen', title: 'Mehrfach-Löschen',
message: `${selectedItems.size} Elemente wirklich loeschen?`, message: `${selectedItems.size} Elemente wirklich löschen?`,
confirmText: 'Loeschen', confirmText: 'Löschen',
danger: true danger: true
}); });
if (!ok) return; if (!ok) return;
@@ -5042,9 +5042,9 @@ function showLocalItemContextMenu(ev, node) {
// --- LÖSCHEN --- // --- LÖSCHEN ---
addItem('🗑️', 'Löschen', async () => { addItem('🗑️', 'Löschen', async () => {
const ok = await showActionConfirmModal({ const ok = await showActionConfirmModal({
title: 'Element loeschen', title: 'Element löschen',
message: `"${node.name}" wirklich loeschen?`, message: `"${node.name}" wirklich löschen?`,
confirmText: 'Loeschen', confirmText: 'Löschen',
danger: true danger: true
}); });
if (!ok) return; if (!ok) return;
@@ -6807,9 +6807,9 @@ function createReleaseCard(release, isLatest) {
`; `;
deleteAssetBtn.onclick = async () => { deleteAssetBtn.onclick = async () => {
const ok = await showActionConfirmModal({ const ok = await showActionConfirmModal({
title: 'Asset loeschen', title: 'Asset löschen',
message: `Delete asset "${asset.name}"?`, message: `Asset "${asset.name}" wirklich löschen?`,
confirmText: 'Loeschen', confirmText: 'Löschen',
danger: true danger: true
}); });
if (ok) { if (ok) {
@@ -6820,7 +6820,7 @@ function createReleaseCard(release, isLatest) {
}); });
if (res.ok) { if (res.ok) {
assetItem.remove(); assetItem.remove();
setStatus('Asset deleted'); setStatus('Asset gelöscht');
} }
} }
}; };
@@ -6910,7 +6910,7 @@ function createReleaseCard(release, isLatest) {
addAssetBtn.onclick = () => showUploadAssetDialog(release); addAssetBtn.onclick = () => showUploadAssetDialog(release);
const deleteBtn = document.createElement('button'); const deleteBtn = document.createElement('button');
deleteBtn.textContent = '🗑️ Delete'; deleteBtn.textContent = '🗑️ Löschen';
deleteBtn.style.cssText = ` deleteBtn.style.cssText = `
background: transparent; background: transparent;
color: var(--danger); color: var(--danger);
@@ -6923,9 +6923,9 @@ function createReleaseCard(release, isLatest) {
`; `;
deleteBtn.onclick = async () => { deleteBtn.onclick = async () => {
const ok = await showActionConfirmModal({ const ok = await showActionConfirmModal({
title: 'Release loeschen', title: 'Release löschen',
message: `Delete release "${release.name || release.tag_name}"?`, message: `Release "${release.name || release.tag_name}" wirklich löschen?`,
confirmText: 'Loeschen', confirmText: 'Löschen',
danger: true danger: true
}); });
if (ok) { if (ok) {
@@ -7093,7 +7093,7 @@ function showCreateReleaseModal(owner, repo) {
} }
} catch (error) { } catch (error) {
console.error('Fehler beim Auswählen der Datei:', error); console.error('Fehler beim Auswählen der Datei:', error);
await showInfoModal('Dateidialog', 'Konnte Dateidialog nicht oeffnen.', true); await showInfoModal('Dateidialog', 'Konnte Dateidialog nicht öffnen.', true);
} }
}; };
@@ -8103,7 +8103,7 @@ async function initUpdater() {
$('btnImportSettingsBundle').onclick = async () => { $('btnImportSettingsBundle').onclick = async () => {
const ok = await showActionConfirmModal({ const ok = await showActionConfirmModal({
title: 'Backup importieren', title: 'Backup importieren',
message: 'Vorhandene Einstellungen koennen ueberschrieben werden. Fortfahren?', message: 'Vorhandene Einstellungen können überschrieben werden. Fortfahren?',
confirmText: 'Import starten', confirmText: 'Import starten',
danger: false danger: false
}); });