From d9d84dd90ff127d83f11378303e0ea6d36121e77 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Mon, 30 Jun 2025 14:14:14 +0200 Subject: [PATCH] Add auto refresh to emails page (#976) --- .../Main/Components/Email/EmailPreview.razor | 2 +- .../Main/Components/Email/EmailRow.razor | 10 + .../Main/Pages/Emails/Home.razor | 379 +++++++++++++++--- .../Main/Pages/Settings/General.razor | 2 +- .../wwwroot/css/tailwind.css | 159 +++----- 5 files changed, 399 insertions(+), 153 deletions(-) diff --git a/apps/server/AliasVault.Client/Main/Components/Email/EmailPreview.razor b/apps/server/AliasVault.Client/Main/Components/Email/EmailPreview.razor index ab66802df..4ef04fce4 100644 --- a/apps/server/AliasVault.Client/Main/Components/Email/EmailPreview.razor +++ b/apps/server/AliasVault.Client/Main/Components/Email/EmailPreview.razor @@ -92,7 +92,7 @@ } else { -
+
diff --git a/apps/server/AliasVault.Client/Main/Components/Email/EmailRow.razor b/apps/server/AliasVault.Client/Main/Components/Email/EmailRow.razor index b20057653..138e37443 100644 --- a/apps/server/AliasVault.Client/Main/Components/Email/EmailRow.razor +++ b/apps/server/AliasVault.Client/Main/Components/Email/EmailRow.razor @@ -17,6 +17,10 @@ } + @if (IsNewEmail) + { +
+ }
@@ -55,4 +59,10 @@ /// [Parameter] public bool IsSelected { get; set; } + + /// + /// Whether this email is new and should show an indicator. + /// + [Parameter] + public bool IsNewEmail { get; set; } } diff --git a/apps/server/AliasVault.Client/Main/Pages/Emails/Home.razor b/apps/server/AliasVault.Client/Main/Pages/Emails/Home.razor index 556d72ee1..41112b37f 100644 --- a/apps/server/AliasVault.Client/Main/Pages/Emails/Home.razor +++ b/apps/server/AliasVault.Client/Main/Pages/Emails/Home.razor @@ -13,6 +13,7 @@ @inject HttpClient HttpClient @inject ILogger Logger @inject MinDurationLoadingService LoadingService +@implements IAsyncDisposable Emails @@ -26,6 +27,10 @@ Title="Emails" Description="You can view all emails received by your private email addresses below."> + @if (DbService.Settings.AutoEmailRefresh) + { +
+ }
@@ -96,7 +101,8 @@ else + IsSelected="false" + IsNewEmail="@(NewEmailIds.Contains(email.Id))" /> } } @@ -104,65 +110,71 @@ else
- diff --git a/apps/server/AliasVault.Client/wwwroot/css/tailwind.css b/apps/server/AliasVault.Client/wwwroot/css/tailwind.css index be18bb702..d7f8a6e4b 100644 --- a/apps/server/AliasVault.Client/wwwroot/css/tailwind.css +++ b/apps/server/AliasVault.Client/wwwroot/css/tailwind.css @@ -945,10 +945,6 @@ video { height: 2.25rem; } -.h-\[calc\(100vh-300px\)\] { - height: calc(100vh - 300px); -} - .h-full { height: 100%; } @@ -957,26 +953,30 @@ video { height: 1px; } -.max-h-32 { - max-height: 8rem; +.h-\[calc\(100vh-300px\)\] { + height: calc(100vh - 300px); } .max-h-\[90vh\] { max-height: 90vh; } +.max-h-32 { + max-height: 8rem; +} + .min-h-\[250px\] { min-height: 250px; } -.min-h-\[600px\] { - min-height: 600px; -} - .min-h-screen { min-height: 100vh; } +.min-h-\[600px\] { + min-height: 600px; +} + .w-1 { width: 0.25rem; } @@ -989,14 +989,6 @@ video { width: 50%; } -.w-1\/3 { - width: 33.333333%; -} - -.w-1\/4 { - width: 25%; -} - .w-10 { width: 2.5rem; } @@ -1033,10 +1025,6 @@ video { width: 1rem; } -.w-40 { - width: 10rem; -} - .w-48 { width: 12rem; } @@ -1045,6 +1033,10 @@ video { width: 1.25rem; } +.w-56 { + width: 14rem; +} + .w-6 { width: 1.5rem; } @@ -1069,8 +1061,20 @@ video { width: 100vw; } -.w-56 { - width: 14rem; +.w-1\/3 { + width: 33.333333%; +} + +.w-1\/4 { + width: 25%; +} + +.w-40 { + width: 10rem; +} + +.w-2 { + width: 0.5rem; } .min-w-0 { @@ -1279,12 +1283,6 @@ video { margin-left: calc(1.5rem * calc(1 - var(--tw-space-x-reverse))); } -.space-y-1 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); -} - .space-y-2 > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); @@ -1309,6 +1307,12 @@ video { margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); } +.space-y-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); +} + .divide-y > :not([hidden]) ~ :not([hidden]) { --tw-divide-y-reverse: 0; border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); @@ -1406,14 +1410,14 @@ video { border-width: 1px; } -.border-0 { - border-width: 0px; -} - .border-2 { border-width: 2px; } +.border-0 { + border-width: 0px; +} + .border-b { border-bottom-width: 1px; } @@ -1446,25 +1450,11 @@ video { border-right-width: 0px; } -.border-dashed { - border-style: dashed; -} - .border-amber-400 { --tw-border-opacity: 1; border-color: rgb(251 191 36 / var(--tw-border-opacity)); } -.border-blue-200 { - --tw-border-opacity: 1; - border-color: rgb(191 219 254 / var(--tw-border-opacity)); -} - -.border-blue-500 { - --tw-border-opacity: 1; - border-color: rgb(59 130 246 / var(--tw-border-opacity)); -} - .border-blue-700 { --tw-border-opacity: 1; border-color: rgb(29 78 216 / var(--tw-border-opacity)); @@ -1485,11 +1475,6 @@ video { border-color: rgb(209 213 219 / var(--tw-border-opacity)); } -.border-gray-400 { - --tw-border-opacity: 1; - border-color: rgb(156 163 175 / var(--tw-border-opacity)); -} - .border-green-500 { --tw-border-opacity: 1; border-color: rgb(34 197 94 / var(--tw-border-opacity)); @@ -1530,6 +1515,11 @@ video { border-color: rgb(251 203 116 / var(--tw-border-opacity)); } +.border-yellow-400 { + --tw-border-opacity: 1; + border-color: rgb(250 204 21 / var(--tw-border-opacity)); +} + .bg-amber-100 { --tw-bg-opacity: 1; background-color: rgb(254 243 199 / var(--tw-bg-opacity)); @@ -1704,6 +1694,11 @@ video { background-color: rgb(255 224 150 / var(--tw-bg-opacity)); } +.bg-yellow-500 { + --tw-bg-opacity: 1; + background-color: rgb(234 179 8 / var(--tw-bg-opacity)); +} + .bg-opacity-50 { --tw-bg-opacity: 0.5; } @@ -2045,11 +2040,6 @@ video { color: rgb(229 231 235 / var(--tw-text-opacity)); } -.text-gray-300 { - --tw-text-opacity: 1; - color: rgb(209 213 219 / var(--tw-text-opacity)); -} - .text-gray-400 { --tw-text-opacity: 1; color: rgb(156 163 175 / var(--tw-text-opacity)); @@ -2155,6 +2145,11 @@ video { color: rgb(133 77 14 / var(--tw-text-opacity)); } +.text-gray-300 { + --tw-text-opacity: 1; + color: rgb(209 213 219 / var(--tw-text-opacity)); +} + .underline { text-decoration-line: underline; } @@ -2167,14 +2162,14 @@ video { opacity: 1; } -.opacity-25 { - opacity: 0.25; -} - .opacity-50 { opacity: 0.5; } +.opacity-25 { + opacity: 0.25; +} + .opacity-75 { opacity: 0.75; } @@ -2311,11 +2306,6 @@ video { transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } -.hover\:bg-blue-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(219 234 254 / var(--tw-bg-opacity)); -} - .hover\:bg-blue-600:hover { --tw-bg-opacity: 1; background-color: rgb(37 99 235 / var(--tw-bg-opacity)); @@ -2638,11 +2628,6 @@ video { border-color: rgb(59 130 246 / var(--tw-border-opacity)); } -.dark\:border-blue-800:is(.dark *) { - --tw-border-opacity: 1; - border-color: rgb(30 64 175 / var(--tw-border-opacity)); -} - .dark\:border-gray-400:is(.dark *) { --tw-border-opacity: 1; border-color: rgb(156 163 175 / var(--tw-border-opacity)); @@ -2726,14 +2711,6 @@ video { background-color: rgb(30 58 138 / var(--tw-bg-opacity)); } -.dark\:bg-blue-900\/20:is(.dark *) { - background-color: rgb(30 58 138 / 0.2); -} - -.dark\:bg-blue-900\/30:is(.dark *) { - background-color: rgb(30 58 138 / 0.3); -} - .dark\:bg-gray-500:is(.dark *) { --tw-bg-opacity: 1; background-color: rgb(107 114 128 / var(--tw-bg-opacity)); @@ -2830,6 +2807,10 @@ video { background-color: rgb(123 74 30 / 0.3); } +.dark\:bg-yellow-900\/20:is(.dark *) { + background-color: rgb(113 63 18 / 0.2); +} + .dark\:bg-opacity-80:is(.dark *) { --tw-bg-opacity: 0.8; } @@ -2992,10 +2973,6 @@ video { background-color: rgb(29 78 216 / var(--tw-bg-opacity)); } -.dark\:hover\:bg-blue-900\/30:hover:is(.dark *) { - background-color: rgb(30 58 138 / 0.3); -} - .dark\:hover\:bg-gray-500:hover:is(.dark *) { --tw-bg-opacity: 1; background-color: rgb(107 114 128 / var(--tw-bg-opacity)); @@ -3090,11 +3067,6 @@ video { color: rgb(244 149 65 / var(--tw-text-opacity)); } -.dark\:hover\:text-red-300:hover:is(.dark *) { - --tw-text-opacity: 1; - color: rgb(252 165 165 / var(--tw-text-opacity)); -} - .dark\:hover\:text-red-400:hover:is(.dark *) { --tw-text-opacity: 1; color: rgb(248 113 113 / var(--tw-text-opacity)); @@ -3105,6 +3077,11 @@ video { color: rgb(255 255 255 / var(--tw-text-opacity)); } +.dark\:hover\:text-red-300:hover:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(252 165 165 / var(--tw-text-opacity)); +} + .dark\:hover\:file\:bg-primary-800\/60:is(.dark *)::file-selector-button:hover { background-color: rgb(154 93 38 / 0.6); } @@ -3423,10 +3400,6 @@ video { grid-template-columns: repeat(3, minmax(0, 1fr)); } - .lg\:grid-cols-4 { - grid-template-columns: repeat(4, minmax(0, 1fr)); - } - .lg\:flex-row { flex-direction: row; }