From d10f8ec63dcd0569cf0d8363058137904eb2a535 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 25 Oct 2025 13:35:05 +0000 Subject: [PATCH 1/2] Add checkbox for project saving and convert display to table format MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add "Projekt speichern" checkbox that appears when version is selected - "Als Projekt speichern" button now only shows when checkbox is checked AND version is selected - Convert saved projects display from card grid to WordPress standard table format - Update CSS for improved table layout and styling - Improve user experience with clearer project management workflow 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- advanced-github-plugin-installer.php | 195 +++++++++++---------------- installer-script.js | 25 +++- 2 files changed, 101 insertions(+), 119 deletions(-) diff --git a/advanced-github-plugin-installer.php b/advanced-github-plugin-installer.php index ba9fb8d..3f5cf42 100644 --- a/advanced-github-plugin-installer.php +++ b/advanced-github-plugin-installer.php @@ -81,101 +81,6 @@ function github_plugin_installer_page() { ?>

@@ -228,6 +172,13 @@ function github_plugin_installer_page() { + + + + +

Wenn aktiviert, wird das Projekt gespeichert und kann später aktualisiert werden.

+ +
@@ -241,28 +192,38 @@ function github_plugin_installer_page() {

Gespeicherte Projekte

-
- -
-

-
-

Repository:

-

Version:

-

Status:

-

Zuletzt synchronisiert:

-
-
- - -
-
-
- -
+ + + + + + + + + + + + + + + + + + + + + + + +
ProjektnameRepositoryVersionStatusZuletzt synchronisiertAktionen
+ + +
+

Keine gespeicherten Projekte vorhanden. FĂĽgen Sie oben ein neues Projekt hinzu.

diff --git a/installer-script.js b/installer-script.js index 30a4f97..6d512ac 100644 --- a/installer-script.js +++ b/installer-script.js @@ -17,14 +17,32 @@ jQuery(document).ready(function() { previewTimer = setTimeout(updatePreviewAndVersions, 500); }); - // Show "Save as Project" button when version is selected + // Show "Save as Project" checkbox row when version is selected jQuery('#version').on('change', function() { if(jQuery(this).val()) { + jQuery('#save_project_row').show(); + updateSaveButtonVisibility(); + } else { + jQuery('#save_project_row').hide(); + jQuery('#save_project_btn').hide(); + } + }); + + // Show/hide save button based on checkbox state + jQuery('#save_project_checkbox').on('change', function() { + updateSaveButtonVisibility(); + }); + + function updateSaveButtonVisibility() { + var isChecked = jQuery('#save_project_checkbox').is(':checked'); + var hasVersion = jQuery('#version').val(); + + if(isChecked && hasVersion) { jQuery('#save_project_btn').show(); } else { jQuery('#save_project_btn').hide(); } - }); + } function updatePreviewAndVersions() { previewRepo(); @@ -94,18 +112,21 @@ jQuery(document).ready(function() { jQuery('#version_row').show(); } else { jQuery('#version_row').hide(); + jQuery('#save_project_row').hide(); jQuery('#save_project_btn').hide(); console.error('Failed to fetch versions:', response.data); } }, error: function() { jQuery('#version_row').hide(); + jQuery('#save_project_row').hide(); jQuery('#save_project_btn').hide(); console.error('An error occurred while fetching the repository versions.'); } }); } else { jQuery('#version_row').hide(); + jQuery('#save_project_row').hide(); jQuery('#save_project_btn').hide(); } } From f57ef3cecc97b949dca4ec2025c221a7b89159a8 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 25 Oct 2025 14:31:13 +0000 Subject: [PATCH 2/2] =?UTF-8?q?Komplett=20=C3=BCberarbeitete=20Settings-Se?= =?UTF-8?q?ite=20mit=20verbesserter=20UX?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Settings-Seite wurde von Grund auf neu gestaltet, um die Probleme mit der versteckten Checkbox zu beheben: Hauptverbesserungen: - Checkbox "Als Projekt speichern" ist jetzt immer sichtbar und direkt zugänglich - Modernes Karten-Design für bessere Übersichtlichkeit - Automatisches Vorausfüllen des Projektnamens aus der Repository-URL - Projektname-Feld erscheint nur wenn Checkbox aktiviert wird - Verbesserte Formularvalidierung und Fehlermeldungen - Optimierte Projektliste mit Icons und besserer Formatierung - Status-Meldungen werden direkt unter dem jeweiligen Projekt angezeigt Technische Änderungen: - Vereinfachtes JavaScript mit besserer Event-Handling-Logik - Entfernung unnötiger versteckter Felder und komplexer Abhängigkeiten - Besseres responsive Design - Klarere Benutzerführung durch progressive Disclosure 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- advanced-github-plugin-installer.php | 233 +++++++++++++++------- installer-script.js | 284 +++++++++++---------------- 2 files changed, 278 insertions(+), 239 deletions(-) diff --git a/advanced-github-plugin-installer.php b/advanced-github-plugin-installer.php index 3f5cf42..13e42c8 100644 --- a/advanced-github-plugin-installer.php +++ b/advanced-github-plugin-installer.php @@ -73,33 +73,79 @@ function github_plugin_installer_page() { $is_private = isset($_POST['is_private']) ? true : false; $access_token = $is_private ? sanitize_text_field($_POST['access_token']) : ''; $selected_version = sanitize_text_field($_POST['version']); + $save_as_project = isset($_POST['save_as_project']) ? true : false; + $project_name = sanitize_text_field($_POST['project_name']); + // Install/Update the plugin install_update_github_plugin($repo_url, $access_token, $selected_version); + + // Save as project if checkbox was checked + if ($save_as_project && !empty($project_name)) { + $project_data = array( + 'name' => $project_name, + 'repo_url' => $repo_url, + 'is_private' => $is_private, + 'access_token' => $access_token, + 'version' => $selected_version + ); + save_project($project_data); + echo '

Projekt erfolgreich gespeichert!

'; + } } $saved_projects = get_saved_projects(); ?> -
+

-
-

Neues Projekt hinzufĂĽgen

+ +
+

Plugin installieren oder aktualisieren

- - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ + +

Die vollständige URL zu Ihrem GitHub Repository

+
+ +
+ +
+ + + + + +
+ +

Wenn aktiviert, können Sie dieses Plugin später einfach über die Projektliste aktualisieren

+
+ + + +
+ +
+
- -
-
+ +

Gespeicherte Projekte

- +

Diese Projekte können mit einem Klick aktualisiert werden

+ +
- - - - - - + + + + + + - + - - + + + + +
ProjektnameRepositoryVersionStatusZuletzt synchronisiertAktionenProjektnameRepositoryVersionTypLetzte AktualisierungAktionen
- + - -
+
+
-
-

Keine gespeicherten Projekte vorhanden. FĂĽgen Sie oben ein neues Projekt hinzu.

+
+
+

đź’ˇ Tipp: Aktivieren Sie "Als Projekt speichern" beim Installieren eines Plugins, um es hier zur einfachen Verwaltung zu speichern.

+
-- Bitte warten, lade Versionen... --'); - function updateSaveButtonVisibility() { - var isChecked = jQuery('#save_project_checkbox').is(':checked'); - var hasVersion = jQuery('#version').val(); - - if(isChecked && hasVersion) { - jQuery('#save_project_btn').show(); - } else { - jQuery('#save_project_btn').hide(); - } - } - - function updatePreviewAndVersions() { - previewRepo(); - getVersions(); - } - - function previewRepo() { - var repoUrl = jQuery('#repo_url').val(); - var isPrivate = jQuery('#is_private').is(':checked'); - var accessToken = jQuery('#access_token').val(); - - if (repoUrl) { - jQuery.ajax({ - url: github_installer.ajax_url, - type: 'POST', - data: { - action: 'preview_github_repo', - nonce: github_installer.nonce, - repo_url: repoUrl, - is_private: isPrivate, - access_token: accessToken - }, - success: function(response) { - if (response.success) { - jQuery('#repo_content').html(response.data); - jQuery('#repo_preview').show(); - } else { - jQuery('#repo_content').html('

' + response.data + '

'); - jQuery('#repo_preview').show(); - } - }, - error: function() { - jQuery('#repo_content').html('

An error occurred while fetching the repository content.

'); - jQuery('#repo_preview').show(); - } - }); - } else { - jQuery('#repo_preview').hide(); - } - } - - function getVersions() { - var repoUrl = jQuery('#repo_url').val(); - var isPrivate = jQuery('#is_private').is(':checked'); - var accessToken = jQuery('#access_token').val(); - - if (repoUrl) { - jQuery.ajax({ - url: github_installer.ajax_url, - type: 'POST', - data: { - action: 'get_github_versions', - nonce: github_installer.nonce, - repo_url: repoUrl, - is_private: isPrivate, - access_token: accessToken - }, - success: function(response) { - if (response.success) { - var versions = response.data; - var versionSelect = jQuery('#version'); - versionSelect.empty(); - versionSelect.append(jQuery('').attr('value', '').text('-- Wählen Sie eine Version --')); - jQuery.each(versions, function(index, version) { - versionSelect.append(jQuery('').attr('value', version).text(version)); - }); - jQuery('#version_row').show(); - } else { - jQuery('#version_row').hide(); - jQuery('#save_project_row').hide(); - jQuery('#save_project_btn').hide(); - console.error('Failed to fetch versions:', response.data); - } - }, - error: function() { - jQuery('#version_row').hide(); - jQuery('#save_project_row').hide(); - jQuery('#save_project_btn').hide(); - console.error('An error occurred while fetching the repository versions.'); - } - }); - } else { - jQuery('#version_row').hide(); - jQuery('#save_project_row').hide(); - jQuery('#save_project_btn').hide(); - } - } - - // Save project button handler - jQuery('#save_project_btn').on('click', function(e) { - e.preventDefault(); - - var projectName = jQuery('#project_name').val(); - var repoUrl = jQuery('#repo_url').val(); - var isPrivate = jQuery('#is_private').is(':checked'); - var accessToken = jQuery('#access_token').val(); - var version = jQuery('#version').val(); - - if (!projectName) { - alert('Bitte geben Sie einen Projektnamen ein.'); + if (!repoUrl || repoUrl.length < 10) { return; } - if (!repoUrl || !version) { - alert('Bitte füllen Sie alle erforderlichen Felder aus.'); - return; - } + // Show loading + $('#version_section').slideDown(); + $('#version-loading').show(); - jQuery.ajax({ + $.ajax({ url: github_installer.ajax_url, type: 'POST', data: { - action: 'save_github_project', + action: 'get_github_versions', nonce: github_installer.nonce, - name: projectName, repo_url: repoUrl, is_private: isPrivate, - access_token: accessToken, - version: version + access_token: accessToken }, success: function(response) { - if (response.success) { - alert(response.data.message); - location.reload(); + $('#version-loading').hide(); + + if (response.success && response.data.length > 0) { + var versions = response.data; + var versionSelect = $('#version'); + versionSelect.empty(); + versionSelect.append($('').attr('value', '').text('-- Wählen Sie eine Version --')); + $.each(versions, function(index, version) { + versionSelect.append($('').attr('value', version).text(version)); + }); + $('#version_section').slideDown(); } else { - alert('Fehler: ' + response.data); + $('#version').html(''); + console.error('Keine Versionen gefunden:', response.data); } }, - error: function() { - alert('Ein Fehler ist beim Speichern des Projekts aufgetreten.'); + error: function(xhr, status, error) { + $('#version-loading').hide(); + $('#version').html(''); + console.error('Fehler beim Laden der Versionen:', error); } }); + } + + // Form validation before submit + $('#github-project-form').on('submit', function(e) { + var saveAsProject = $('#save_as_project').is(':checked'); + var projectName = $('#project_name').val(); + var repoUrl = $('#repo_url').val(); + var version = $('#version').val(); + + // Check if save as project is checked but no project name + if (saveAsProject && !projectName) { + e.preventDefault(); + alert('Bitte geben Sie einen Projektnamen ein oder deaktivieren Sie "Als Projekt speichern".'); + $('#project_name').focus(); + return false; + } + + // Check if repo URL is provided + if (!repoUrl) { + e.preventDefault(); + alert('Bitte geben Sie eine GitHub Repository URL ein.'); + $('#repo_url').focus(); + return false; + } + + // Warning if no version selected + if (!version) { + return confirm('Sie haben keine Version ausgewählt. Es wird die neueste Version vom Hauptbranch verwendet. Fortfahren?'); + } + + return true; }); // Sync project button handler - jQuery(document).on('click', '.github-sync-btn', function() { - var projectId = jQuery(this).data('project-id'); - var button = jQuery(this); - var statusDiv = jQuery('.github-sync-status[data-project-id="' + projectId + '"]'); + $(document).on('click', '.github-sync-btn', function() { + var projectId = $(this).data('project-id'); + var button = $(this); + var statusRow = $('.github-sync-status-row[data-project-id="' + projectId + '"]'); + var statusDiv = $('.github-sync-status[data-project-id="' + projectId + '"]'); - button.prop('disabled', true); + button.prop('disabled', true).html(' Lädt...'); + statusRow.show(); statusDiv.removeClass('success error').addClass('loading').text('Synchronisierung läuft...').show(); - jQuery.ajax({ + $.ajax({ url: github_installer.ajax_url, type: 'POST', data: { @@ -195,32 +140,35 @@ jQuery(document).ready(function() { project_id: projectId }, success: function(response) { - button.prop('disabled', false); + button.prop('disabled', false).html(' Update'); if (response.success) { - statusDiv.removeClass('loading error').addClass('success').text(response.data); + statusDiv.removeClass('loading error').addClass('success').html('✓ ' + response.data); setTimeout(function() { location.reload(); }, 1500); } else { - statusDiv.removeClass('loading success').addClass('error').text('Fehler: ' + response.data); + statusDiv.removeClass('loading success').addClass('error').html('✗ Fehler: ' + response.data); } }, error: function() { - button.prop('disabled', false); - statusDiv.removeClass('loading success').addClass('error').text('Ein Fehler ist aufgetreten.'); + button.prop('disabled', false).html(' Update'); + statusDiv.removeClass('loading success').addClass('error').html('✗ Ein Fehler ist aufgetreten.'); } }); }); // Delete project button handler - jQuery(document).on('click', '.github-delete-btn', function() { - var projectId = jQuery(this).data('project-id'); + $(document).on('click', '.github-delete-btn', function() { + var projectId = $(this).data('project-id'); - if (!confirm('Möchten Sie dieses Projekt wirklich löschen?')) { + if (!confirm('Möchten Sie dieses Projekt wirklich löschen?\n\nDas Plugin selbst wird nicht deinstalliert, nur die Projektverwaltung wird entfernt.')) { return; } - jQuery.ajax({ + var button = $(this); + button.prop('disabled', true); + + $.ajax({ url: github_installer.ajax_url, type: 'POST', data: { @@ -230,14 +178,18 @@ jQuery(document).ready(function() { }, success: function(response) { if (response.success) { - alert(response.data); - location.reload(); + // Fade out the row and reload + $('tr[data-project-id="' + projectId + '"]').fadeOut(300, function() { + location.reload(); + }); } else { - alert('Fehler: ' + response.data); + alert('Fehler beim Löschen: ' + response.data); + button.prop('disabled', false); } }, error: function() { alert('Ein Fehler ist beim Löschen des Projekts aufgetreten.'); + button.prop('disabled', false); } }); });