From 90e1401cbdb28e3cb463df848d2cf475bdbc8fd9 Mon Sep 17 00:00:00 2001 From: Gareth Date: Thu, 15 Jan 2026 00:47:34 -0800 Subject: [PATCH] fix: loading progress indicators, fixed login layout --- webui/messages/ar.json | 3 +- webui/messages/bn.json | 3 +- webui/messages/de.json | 3 +- webui/messages/en.json | 1 + webui/messages/es.json | 3 +- webui/messages/fr.json | 3 +- webui/messages/hi.json | 3 +- webui/messages/id.json | 3 +- webui/messages/it.json | 3 +- webui/messages/pt.json | 3 +- webui/messages/ru.json | 3 +- webui/messages/zh.json | 3 +- webui/src/app/App.tsx | 16 ++++++++ webui/src/components/common/DynamicList.tsx | 4 +- webui/src/components/common/FormModal.tsx | 30 ++++++++++++-- webui/src/components/common/LogView.tsx | 4 +- webui/src/features/auth/LoginModal.tsx | 11 +++-- .../features/operations/OperationListView.tsx | 40 ++++++++++++------- .../features/operations/OperationTreeView.tsx | 13 ++++++ webui/src/lib/browserUtil.ts | 2 +- 20 files changed, 116 insertions(+), 38 deletions(-) diff --git a/webui/messages/ar.json b/webui/messages/ar.json index f582a127..f9459aab 100644 --- a/webui/messages/ar.json +++ b/webui/messages/ar.json @@ -363,5 +363,6 @@ "app_menu_edit_plan": "app_menu_edit_plan", "add_repo_modal_field_auto_unlock_tooltip": "ستؤدي خاصية الفتح التلقائي إلى إزالة ملفات القفل عند بدء معظم العمليات. قد يكون هذا غير آمن إذا تمت مشاركة المستودع بين عدة أجهزة عميلة، وإلا يُنصح باستخدامه في إعدادات العميل الواحد.", "op_row_cancel_op": "إلغاء العملية", - "op_row_confirm_cancel": "تأكيد إلغاء؟" + "op_row_confirm_cancel": "تأكيد إلغاء؟", + "app_menu_dashboard": "لوحة التحكم" } diff --git a/webui/messages/bn.json b/webui/messages/bn.json index b3b3dd37..5ba82dd8 100644 --- a/webui/messages/bn.json +++ b/webui/messages/bn.json @@ -363,5 +363,6 @@ "app_menu_edit_plan": "অ্যাপ_মেনু_সম্পাদনা_পরিকল্পনা", "add_repo_modal_field_auto_unlock_tooltip": "বেশিরভাগ অপারেশনের শুরুতেই অটো-আনলক লকফাইলগুলি সরিয়ে ফেলবে। একাধিক ক্লায়েন্ট ডিভাইস দ্বারা রেপো শেয়ার করা হলে এটি সম্ভাব্যভাবে অনিরাপদ, অন্যথায় একক-ক্লায়েন্ট সেটআপের জন্য সুপারিশ করা হয়।", "op_row_cancel_op": "অপারেশন বাতিল করুন", - "op_row_confirm_cancel": "বাতিল নিশ্চিত করবেন?" + "op_row_confirm_cancel": "বাতিল নিশ্চিত করবেন?", + "app_menu_dashboard": "ড্যাশবোর্ড" } diff --git a/webui/messages/de.json b/webui/messages/de.json index bb1d89bb..ff922663 100644 --- a/webui/messages/de.json +++ b/webui/messages/de.json @@ -363,5 +363,6 @@ "app_menu_edit_plan": "app_menu_edit_plan", "add_repo_modal_field_auto_unlock_tooltip": "Die automatische Entsperrung entfernt Sperrdateien zu Beginn der meisten Operationen. Dies kann unsicher sein, wenn das Repository von mehreren Clientgeräten gemeinsam genutzt wird; ansonsten wird diese Option für Einzelclient-Setups empfohlen.", "op_row_cancel_op": "Vorgang abbrechen", - "op_row_confirm_cancel": "Abbrechen bestätigen?" + "op_row_confirm_cancel": "Abbrechen bestätigen?", + "app_menu_dashboard": "Armaturenbrett" } diff --git a/webui/messages/en.json b/webui/messages/en.json index ef78c84b..6f65de41 100644 --- a/webui/messages/en.json +++ b/webui/messages/en.json @@ -145,6 +145,7 @@ "app_menu_add_repo": "Add Repo", "app_menu_remote_instances": "Remote Instances", "app_menu_settings": "Settings", + "app_menu_dashboard": "Dashboard", "app_error_initial_config": "Failed to fetch initial config, typically this means the UI could not connect to the backend", "login_success": "Logged in", "login_error": "Login failed: ", diff --git a/webui/messages/es.json b/webui/messages/es.json index 0ac66200..fbdca3ba 100644 --- a/webui/messages/es.json +++ b/webui/messages/es.json @@ -363,5 +363,6 @@ "app_menu_edit_plan": "menú_aplicación_editar_plan", "add_repo_modal_field_auto_unlock_tooltip": "El desbloqueo automático eliminará los archivos de bloqueo al inicio de la mayoría de las operaciones. Esto puede ser peligroso si el repositorio se comparte entre varios dispositivos cliente; de lo contrario, se recomienda para configuraciones de un solo cliente.", "op_row_cancel_op": "Cancelar operación", - "op_row_confirm_cancel": "¿Confirmar Cancelar?" + "op_row_confirm_cancel": "¿Confirmar Cancelar?", + "app_menu_dashboard": "Panel" } diff --git a/webui/messages/fr.json b/webui/messages/fr.json index bee71e0c..9caaba7e 100644 --- a/webui/messages/fr.json +++ b/webui/messages/fr.json @@ -363,5 +363,6 @@ "app_menu_edit_plan": "app_menu_edit_plan", "add_repo_modal_field_auto_unlock_tooltip": "Le déverrouillage automatique supprime les fichiers de verrouillage au début de la plupart des opérations. Cette opération peut s'avérer dangereuse si le dépôt est partagé par plusieurs appareils clients ; elle est par ailleurs recommandée pour les configurations mono-client.", "op_row_cancel_op": "Opération annulée", - "op_row_confirm_cancel": "Confirmer Annuler ?" + "op_row_confirm_cancel": "Confirmer Annuler ?", + "app_menu_dashboard": "Tableau de bord" } diff --git a/webui/messages/hi.json b/webui/messages/hi.json index 8b7b9dc7..fabd2189 100644 --- a/webui/messages/hi.json +++ b/webui/messages/hi.json @@ -363,5 +363,6 @@ "app_menu_edit_plan": "ऐप_मेनू_एडिट_प्लान", "add_repo_modal_field_auto_unlock_tooltip": "अधिकांश कार्यों की शुरुआत में ऑटो-अनलॉक लॉकफाइलों को हटा देगा। यदि रिपॉजिटरी को कई क्लाइंट डिवाइसों द्वारा साझा किया जाता है तो यह संभावित रूप से असुरक्षित हो सकता है, अन्यथा एकल-क्लाइंट सेटअप के लिए इसकी अनुशंसा की जाती है।", "op_row_cancel_op": "ऑपरेशन रद्द करें", - "op_row_confirm_cancel": "पुष्टि करें/रद्द करें?" + "op_row_confirm_cancel": "पुष्टि करें/रद्द करें?", + "app_menu_dashboard": "डैशबोर्ड" } diff --git a/webui/messages/id.json b/webui/messages/id.json index 656cef6d..90ec7d2a 100644 --- a/webui/messages/id.json +++ b/webui/messages/id.json @@ -363,5 +363,6 @@ "app_menu_edit_plan": "app_menu_edit_plan", "add_repo_modal_field_auto_unlock_tooltip": "Fitur buka kunci otomatis akan menghapus file kunci di awal sebagian besar operasi. Ini berpotensi tidak aman jika repositori digunakan bersama oleh beberapa perangkat klien, jika tidak, fitur ini direkomendasikan untuk pengaturan klien tunggal.", "op_row_cancel_op": "Batalkan Operasi", - "op_row_confirm_cancel": "Konfirmasi Batal?" + "op_row_confirm_cancel": "Konfirmasi Batal?", + "app_menu_dashboard": "Dasbor" } diff --git a/webui/messages/it.json b/webui/messages/it.json index 8a0c4c36..c4d3ad8e 100644 --- a/webui/messages/it.json +++ b/webui/messages/it.json @@ -363,5 +363,6 @@ "app_menu_edit_plan": "app_menu_edit_plan", "add_repo_modal_field_auto_unlock_tooltip": "Lo sblocco automatico rimuoverà i file di blocco all'inizio della maggior parte delle operazioni. Questa opzione è potenzialmente pericolosa se il repository è condiviso da più dispositivi client, altrimenti è consigliata per configurazioni con un solo client.", "op_row_cancel_op": "Annulla operazione", - "op_row_confirm_cancel": "Confermare l'annullamento?" + "op_row_confirm_cancel": "Confermare l'annullamento?", + "app_menu_dashboard": "Pannello di controllo" } diff --git a/webui/messages/pt.json b/webui/messages/pt.json index f5a84fd5..5b4faa86 100644 --- a/webui/messages/pt.json +++ b/webui/messages/pt.json @@ -363,5 +363,6 @@ "app_menu_edit_plan": "app_menu_editar_plano", "add_repo_modal_field_auto_unlock_tooltip": "O desbloqueio automático removerá os arquivos de bloqueio no início da maioria das operações. Isso pode ser inseguro se o repositório for compartilhado por vários dispositivos cliente; caso contrário, é recomendado para configurações com um único cliente.", "op_row_cancel_op": "Cancelar operação", - "op_row_confirm_cancel": "Confirmar Cancelar?" + "op_row_confirm_cancel": "Confirmar Cancelar?", + "app_menu_dashboard": "Painel" } diff --git a/webui/messages/ru.json b/webui/messages/ru.json index 6a95d173..527a8ec5 100644 --- a/webui/messages/ru.json +++ b/webui/messages/ru.json @@ -363,5 +363,6 @@ "app_menu_edit_plan": "app_menu_edit_plan", "add_repo_modal_field_auto_unlock_tooltip": "Автоматическая разблокировка удаляет файлы блокировки в начале большинства операций. Это потенциально небезопасно, если репозиторий используется несколькими клиентскими устройствами, в противном случае рекомендуется для конфигураций с одним клиентом.", "op_row_cancel_op": "Отменить операцию", - "op_row_confirm_cancel": "Подтвердить отмену?" + "op_row_confirm_cancel": "Подтвердить отмену?", + "app_menu_dashboard": "Панель управления" } diff --git a/webui/messages/zh.json b/webui/messages/zh.json index f8ee56a1..886019d5 100644 --- a/webui/messages/zh.json +++ b/webui/messages/zh.json @@ -365,5 +365,6 @@ "op_row_cancel_op": "取消操作", "op_row_confirm_cancel": "确认取消?", "op_row_delete": "删除操作", - "op_row_confirm_delete": "确认删除?" + "op_row_confirm_delete": "确认删除?", + "app_menu_dashboard": "仪表板" } diff --git a/webui/src/app/App.tsx b/webui/src/app/App.tsx index 3bb9bab9..eb3fffe2 100644 --- a/webui/src/app/App.tsx +++ b/webui/src/app/App.tsx @@ -12,6 +12,7 @@ import { FiServer, FiEdit2, FiMenu, + FiHome, } from "react-icons/fi"; import { @@ -237,6 +238,21 @@ const SidebarContent = ({ onClose }: { onClose?: () => void }) => { defaultValue={["plans", "repos", "authorized-clients"]} variant="plain" > + {/* DASHBOARD */} + handleNav("/")} + px={4} + py={2} + _hover={{ bg: "bg.muted" }} + userSelect="none" + > + + + {m.app_menu_dashboard()} + + + {/* PLANS SECTION */} diff --git a/webui/src/components/common/DynamicList.tsx b/webui/src/components/common/DynamicList.tsx index 7305ac7e..45cb6887 100644 --- a/webui/src/components/common/DynamicList.tsx +++ b/webui/src/components/common/DynamicList.tsx @@ -283,9 +283,9 @@ export const DynamicList = ({ {tooltip && ( - + {tooltip} - + )} ); diff --git a/webui/src/components/common/FormModal.tsx b/webui/src/components/common/FormModal.tsx index 0fd4f4b6..fa87fe51 100644 --- a/webui/src/components/common/FormModal.tsx +++ b/webui/src/components/common/FormModal.tsx @@ -20,7 +20,20 @@ interface FormModalProps { title: string; children: React.ReactNode; footer?: React.ReactNode; - size?: "default" | "large"; + size?: + | "xs" + | "sm" + | "md" + | "lg" + | "xl" + | "2xl" + | "3xl" + | "4xl" + | "5xl" + | "6xl" + | "full" + | "default" + | "large"; } export const FormModal: React.FC = ({ @@ -33,19 +46,28 @@ export const FormModal: React.FC = ({ }) => { // Map size "default" to "md" and "large" to "xl" or "2xl" // Chakra default sizes are xs, sm, md, lg, xl, 2xl, etc. - const chakraSize = size === "large" ? "xl" : "md"; + let chakraSize = size; + if (size === "default") chakraSize = "md"; + if (size === "large") chakraSize = "xl"; + + // Identify if the requested size is supported by the DialogRoot component directly + // definition: "xs" | "sm" | "md" | "lg" | "xl" | "full" | "cover" | undefined + const validRootSizes = ["xs", "sm", "md", "lg", "xl", "full", "cover"]; + const isRootSize = validRootSizes.includes(chakraSize); + const rootSize = isRootSize ? (chakraSize as any) : undefined; + const contentMaxW = !isRootSize ? chakraSize : undefined; return ( !e.open && onClose()} - size={chakraSize} + size={rootSize} scrollBehavior="inside" > - + {title} diff --git a/webui/src/components/common/LogView.tsx b/webui/src/components/common/LogView.tsx index 033d287e..5a42f287 100644 --- a/webui/src/components/common/LogView.tsx +++ b/webui/src/components/common/LogView.tsx @@ -98,8 +98,8 @@ export const LogView = ({ logref }: { logref: string }) => { ))} {loading && lines.length === 0 && ( -
- +
+
)} diff --git a/webui/src/features/auth/LoginModal.tsx b/webui/src/features/auth/LoginModal.tsx index 60d66769..223f8c33 100644 --- a/webui/src/features/auth/LoginModal.tsx +++ b/webui/src/features/auth/LoginModal.tsx @@ -51,6 +51,7 @@ export const LoginModal = () => { isOpen={true} onClose={() => {}} // Non-closable title={m.login_title()} + size="2xl" footer={