From 80096bfbf9e25bf025e5752a3eb229bbc66ed964 Mon Sep 17 00:00:00 2001 From: logikonline Date: Tue, 17 Mar 2026 21:42:39 -0400 Subject: [PATCH] feat(ui): add loading indicators for AI generation actions Show loading spinner and message when AI content generation or translation is in progress. Disables submit button and hides form to prevent duplicate submissions. Adds Copilot icon to AI buttons. Marks file inputs with data-ays-ignore to prevent "unsaved changes" warnings. Improves UX by providing visual feedback during long-running AI operations. --- options/locale/locale_en-US.json | 2 ++ templates/repo/settings/pages.tmpl | 23 +++++++++++++++++--- templates/repo/settings/pages_brand.tmpl | 4 ++-- templates/repo/settings/pages_languages.tmpl | 22 ++++++++++++++++++- 4 files changed, 45 insertions(+), 6 deletions(-) diff --git a/options/locale/locale_en-US.json b/options/locale/locale_en-US.json index 1b2d574572..bd5b092033 100644 --- a/options/locale/locale_en-US.json +++ b/options/locale/locale_en-US.json @@ -4572,6 +4572,7 @@ "repo.settings.pages.ai_generate": "AI Content Generator", "repo.settings.pages.ai_generate_desc": "Automatically generate landing page content (headline, features, stats, CTAs) from your repository's README and metadata using AI.", "repo.settings.pages.ai_generate_button": "Generate Content with AI", + "repo.settings.pages.ai_generating": "Generating content with AI\u2026 This may take a moment.", "repo.settings.pages.ai_generate_success": "Landing page content has been generated successfully. Review and customize it in the other tabs.", "repo.settings.pages.ai_generate_failed": "Failed to generate content with AI. Please try again later or configure the content manually.", "repo.settings.pages.languages": "Languages", @@ -4587,6 +4588,7 @@ "repo.settings.pages.ai_translate_all": "Translate All (AI)", "repo.settings.pages.ai_translate_all_success": "Successfully translated %d languages.", "repo.settings.pages.ai_translate_all_partial": "Translated %d of %d languages. %d failed.", + "repo.settings.pages.ai_translating": "Translating with AI\u2026 This may take a moment.", "repo.settings.pages.delete_translation": "Delete", "repo.settings.pages.save_translation": "Save Translation", "repo.settings.pages.translation_saved": "Translation saved successfully.", diff --git a/templates/repo/settings/pages.tmpl b/templates/repo/settings/pages.tmpl index 3e222bc05b..d0501cccbe 100644 --- a/templates/repo/settings/pages.tmpl +++ b/templates/repo/settings/pages.tmpl @@ -29,15 +29,19 @@ {{if .AIEnabled}}
-
+ {{.CsrfTokenHtml}}

{{ctx.Locale.Tr "repo.settings.pages.ai_generate_desc"}}

-
- +
+ +
+
+
+

{{ctx.Locale.Tr "repo.settings.pages.ai_generating"}}

{{end}} @@ -169,4 +173,17 @@
{{end}} + {{template "repo/settings/layout_footer" .}} diff --git a/templates/repo/settings/pages_brand.tmpl b/templates/repo/settings/pages_brand.tmpl index 26cbea3256..d6c5270bba 100644 --- a/templates/repo/settings/pages_brand.tmpl +++ b/templates/repo/settings/pages_brand.tmpl @@ -26,7 +26,7 @@
- + @@ -59,7 +59,7 @@
- + diff --git a/templates/repo/settings/pages_languages.tmpl b/templates/repo/settings/pages_languages.tmpl index 0f0fff8cd1..17250eb50c 100644 --- a/templates/repo/settings/pages_languages.tmpl +++ b/templates/repo/settings/pages_languages.tmpl @@ -60,7 +60,7 @@ -
+ {{.CsrfTokenHtml}} @@ -73,6 +73,10 @@
+
+
+

{{ctx.Locale.Tr "repo.settings.pages.ai_translating"}}

+
{{/* ── Language panels (one per non-default language, only one visible at a time) ── */}} {{range .Config.I18n.Languages}} @@ -350,6 +354,22 @@ selector.addEventListener('change', showPanel); // Show first language on load showPanel(); + + // Loading spinners for AI translate buttons + function showTranslateLoading(form) { + if (!form) return; + form.addEventListener('submit', function() { + var btn = form.querySelector('button[type="submit"]'); + btn.classList.add('loading', 'disabled'); + btn.disabled = true; + // Hide all lang panels and action bar buttons, show loader + document.querySelectorAll('.lang-panel').forEach(function(p) { p.style.display = 'none'; }); + var loading = document.getElementById('ai-translate-loading'); + if (loading) loading.classList.remove('tw-hidden'); + }); + } + showTranslateLoading(document.getElementById('ai-translate-form')); + showTranslateLoading(document.getElementById('ai-translate-all-form')); })(); {{template "repo/settings/layout_footer" .}}