diff --git a/src/Backend/DiunaBI.UI.Shared/Components/Dashboard.razor b/src/Backend/DiunaBI.UI.Shared/Components/Dashboard.razor
index 44f63a9..240c6c7 100644
--- a/src/Backend/DiunaBI.UI.Shared/Components/Dashboard.razor
+++ b/src/Backend/DiunaBI.UI.Shared/Components/Dashboard.razor
@@ -29,7 +29,7 @@
- ✅ Zalogowano przez Google
+ ✅ Signed in via Google
@@ -37,6 +37,6 @@
else
{
- Nie jesteś zalogowany
+ You are not logged in
}
\ No newline at end of file
diff --git a/src/Backend/DiunaBI.UI.Shared/Components/LayerListComponent.razor b/src/Backend/DiunaBI.UI.Shared/Components/LayerListComponent.razor
index c0d5e7f..4184a9d 100644
--- a/src/Backend/DiunaBI.UI.Shared/Components/LayerListComponent.razor
+++ b/src/Backend/DiunaBI.UI.Shared/Components/LayerListComponent.razor
@@ -1,25 +1,25 @@
@using MudBlazor.Internal
-
+
- Wyczyść filtry
+ Clear filters
@@ -32,7 +32,10 @@
Dense="true"
Hover="true"
Loading="isLoading"
- LoadingProgressColor="Color.Info">
+ LoadingProgressColor="Color.Info"
+ OnRowClick="@((TableRowClickEventArgs args) => OnRowClick(args.Item))"
+ T="LayerDto"
+ Style="cursor: pointer;">
Name
Type
@@ -45,7 +48,7 @@
No layers to display
- Ładowanie...
+ Loading...
@@ -54,8 +57,8 @@
- Wyniki @((layers.Page - 1) * layers.PageSize + 1) - @Math.Min(layers.Page * layers.PageSize, layers.TotalCount)
- z @layers.TotalCount
+ Results @((layers.Page - 1) * layers.PageSize + 1) - @Math.Min(layers.Page * layers.PageSize, layers.TotalCount)
+ of @layers.TotalCount
diff --git a/src/Backend/DiunaBI.UI.Shared/Components/LayerListComponent.razor.cs b/src/Backend/DiunaBI.UI.Shared/Components/LayerListComponent.razor.cs
index 37c3834..28ac7dd 100644
--- a/src/Backend/DiunaBI.UI.Shared/Components/LayerListComponent.razor.cs
+++ b/src/Backend/DiunaBI.UI.Shared/Components/LayerListComponent.razor.cs
@@ -6,10 +6,11 @@ using MudBlazor;
namespace DiunaBI.UI.Shared.Components;
-public partial class LayerListComponent : ComponentBase
+public partial class LayerListComponent : ComponentBase
{
[Inject] private LayerService LayerService { get; set; } = default!;
[Inject] private ISnackbar Snackbar { get; set; } = default!;
+ [Inject] private NavigationManager NavigationManager { get; set; } = default!;
private PagedResult layers = new();
@@ -54,6 +55,11 @@ public partial class LayerListComponent : ComponentBase
private async Task ClearFilters()
{
filterRequest = new LayerFilterRequest();
- await LoadLayers();
+ await LoadLayers();
+ }
+
+ private void OnRowClick(LayerDto layer)
+ {
+ NavigationManager.NavigateTo($"/layers/{layer.Id}");
}
}
\ No newline at end of file
diff --git a/src/Backend/DiunaBI.UI.Shared/Components/LoginCard.razor b/src/Backend/DiunaBI.UI.Shared/Components/LoginCard.razor
index 31d526b..20a5674 100644
--- a/src/Backend/DiunaBI.UI.Shared/Components/LoginCard.razor
+++ b/src/Backend/DiunaBI.UI.Shared/Components/LoginCard.razor
@@ -8,11 +8,11 @@
- Witaj w DiunaBI
+ Welcome to DiunaBI
- Zaloguj się używając konta Google
+ Sign in using your Google account
-
+
- Weryfikacja...
+ Verifying...
}
else
{
- Zaloguj z Google
+ Sign in with Google
}
@@ -76,7 +76,7 @@
}
catch (Exception ex)
{
- _errorMessage = "Błąd inicjalizacji Google Sign-In.";
+ _errorMessage = "Google Sign-In initialization error.";
Console.Error.WriteLine($"❌ Google Sign-In initialization error: {ex.Message}");
Console.Error.WriteLine($"Stack trace: {ex.StackTrace}");
}
@@ -89,12 +89,12 @@
_isLoading = true;
_errorMessage = string.Empty;
StateHasChanged();
-
+
await JS.InvokeVoidAsync("requestGoogleSignIn");
}
catch (Exception ex)
{
- _errorMessage = "Błąd podczas logowania. Spróbuj ponownie";
+ _errorMessage = "Login error. Please try again";
_isLoading = false;
StateHasChanged();
}
@@ -124,16 +124,16 @@
{
Console.WriteLine($"❌ Validation failed: {errorMessage}");
_instance._isLoading = false;
- _instance._errorMessage = errorMessage ?? "Nie udało się zalogować.";
+ _instance._errorMessage = errorMessage ?? "Login failed.";
}
-
+
await _instance.InvokeAsync(() => _instance.StateHasChanged());
}
catch (Exception ex)
{
Console.Error.WriteLine($"❌ OnGoogleSignInSuccess error: {ex.Message}");
_instance._isLoading = false;
- _instance._errorMessage = "Błąd podczas weryfikacji użytkownika.";
+ _instance._errorMessage = "User verification error.";
await _instance.InvokeAsync(() => _instance.StateHasChanged());
}
}
@@ -147,7 +147,7 @@
if (_instance != null)
{
_instance._isLoading = false;
- _instance._errorMessage = "Błąd logowania Google. Spróbuj ponownie";
+ _instance._errorMessage = "Google login error. Please try again";
await _instance.InvokeAsync(() => _instance.StateHasChanged());
}
}
diff --git a/src/Backend/DiunaBI.UI.Shared/MainLayout.razor b/src/Backend/DiunaBI.UI.Shared/MainLayout.razor
index 87ffbbe..07317b6 100644
--- a/src/Backend/DiunaBI.UI.Shared/MainLayout.razor
+++ b/src/Backend/DiunaBI.UI.Shared/MainLayout.razor
@@ -2,7 +2,7 @@
@inherits LayoutComponentBase
-
+
@@ -44,6 +44,18 @@
private bool _drawerOpen = true;
private DrawerVariant _drawerVariant = DrawerVariant.Persistent;
+ private MudTheme _theme = new MudTheme()
+ {
+ PaletteLight = new PaletteLight()
+ {
+ Primary = "#e7163d",
+ PrimaryDarken = "#c01234",
+ PrimaryLighten = "#f04366",
+ Secondary = "#424242",
+ AppbarBackground = "#e7163d",
+ }
+ };
+
void ToggleDrawer()
{
Console.WriteLine($"ToogleDrawer clickkk {DateTime.Now}");
diff --git a/src/Backend/DiunaBI.UI.Shared/Pages/LayerDetailPage.razor b/src/Backend/DiunaBI.UI.Shared/Pages/LayerDetailPage.razor
new file mode 100644
index 0000000..2b67498
--- /dev/null
+++ b/src/Backend/DiunaBI.UI.Shared/Pages/LayerDetailPage.razor
@@ -0,0 +1,112 @@
+@page "/layers/{id:guid}"
+@using DiunaBI.UI.Shared.Services
+@using DiunaBI.Application.DTOModels
+@using MudBlazor
+@inject LayerService LayerService
+@inject NavigationManager NavigationManager
+
+
+
+
+ Layer Details
+
+
+ Export
+ @if (layer != null && layer.Type == LayerType.Administration)
+ {
+ Duplicate
+ Edit
+ }
+ @if (layer != null && layer.Type == LayerType.Processed)
+ {
+ Process Layer
+ }
+
+
+
+ @if (isLoading)
+ {
+
+ }
+ else if (layer == null)
+ {
+ Layer not found
+ }
+ else
+ {
+
+
+
+
+
+ @if (layer.IsCancelled)
+ {
+
+ This layer is cancelled. Will not be used in any further processing.
+
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Code
+ @foreach (var column in displayedColumns)
+ {
+ @column
+ }
+
+
+ @context.Code
+ @foreach (var column in displayedColumns)
+ {
+ @GetRecordValue(context, column)
+ }
+
+
+ Value1 sum
+ @foreach (var column in displayedColumns)
+ {
+ @if (column == "Value1")
+ {
+ @valueSum.ToString("N2")
+ }
+ else
+ {
+
+ }
+ }
+
+
+ }
+
+
diff --git a/src/Backend/DiunaBI.UI.Shared/Pages/LayerDetailPage.razor.cs b/src/Backend/DiunaBI.UI.Shared/Pages/LayerDetailPage.razor.cs
new file mode 100644
index 0000000..90b14b8
--- /dev/null
+++ b/src/Backend/DiunaBI.UI.Shared/Pages/LayerDetailPage.razor.cs
@@ -0,0 +1,122 @@
+using DiunaBI.Application.DTOModels;
+using Microsoft.AspNetCore.Components;
+using MudBlazor;
+using System.Reflection;
+
+namespace DiunaBI.UI.Shared.Pages;
+
+public partial class LayerDetailPage : ComponentBase
+{
+ [Parameter]
+ public Guid Id { get; set; }
+
+ [Inject]
+ private ISnackbar Snackbar { get; set; } = null!;
+
+ private LayerDto? layer;
+ private List records = new();
+ private List displayedColumns = new();
+ private double valueSum = 0;
+ private bool isLoading = false;
+
+ protected override async Task OnInitializedAsync()
+ {
+ await LoadLayer();
+ }
+
+ protected override async Task OnParametersSetAsync()
+ {
+ await LoadLayer();
+ }
+
+ private async Task LoadLayer()
+ {
+ isLoading = true;
+ StateHasChanged();
+
+ try
+ {
+ layer = await LayerService.GetLayerByIdAsync(Id);
+
+ if (layer != null && layer.Records != null)
+ {
+ records = layer.Records;
+ CalculateDisplayedColumns();
+ CalculateValueSum();
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.Error.WriteLine($"Error loading layer: {ex.Message}");
+ Snackbar.Add("Error loading layer", Severity.Error);
+ }
+ finally
+ {
+ isLoading = false;
+ StateHasChanged();
+ }
+ }
+
+ private void CalculateDisplayedColumns()
+ {
+ displayedColumns.Clear();
+
+ // Check which Value columns have data
+ for (int i = 1; i <= 32; i++)
+ {
+ var columnName = $"Value{i}";
+ var hasData = records.Any(r => GetRecordValueByName(r, columnName) != null);
+
+ if (hasData)
+ {
+ displayedColumns.Add(columnName);
+ }
+ }
+
+ // Check if Desc1 has data
+ if (records.Any(r => !string.IsNullOrEmpty(r.Desc1)))
+ {
+ displayedColumns.Add("Description1");
+ }
+ }
+
+ private void CalculateValueSum()
+ {
+ valueSum = records
+ .Where(r => r.Value1.HasValue)
+ .Sum(r => r.Value1!.Value);
+ }
+
+ private string GetRecordValue(RecordDto record, string columnName)
+ {
+ if (columnName == "Description1")
+ {
+ return record.Desc1 ?? string.Empty;
+ }
+
+ var value = GetRecordValueByName(record, columnName);
+ return value.HasValue ? value.Value.ToString("N2") : string.Empty;
+ }
+
+ private double? GetRecordValueByName(RecordDto record, string columnName)
+ {
+ var property = typeof(RecordDto).GetProperty(columnName, BindingFlags.Public | BindingFlags.Instance);
+ if (property != null && property.PropertyType == typeof(double?))
+ {
+ return property.GetValue(record) as double?;
+ }
+ return null;
+ }
+
+ private void Export()
+ {
+ // TODO: Implement export functionality
+ Snackbar.Add("Export functionality coming soon", Severity.Error);
+ }
+
+ private void ProcessLayer()
+ {
+ // TODO: Implement process layer functionality
+ Snackbar.Add("Process layer functionality coming soon", Severity.Error);
+ }
+}
diff --git a/src/Backend/DiunaBI.UI.Shared/Services/AuthService.cs b/src/Backend/DiunaBI.UI.Shared/Services/AuthService.cs
index f467767..0b8180a 100644
--- a/src/Backend/DiunaBI.UI.Shared/Services/AuthService.cs
+++ b/src/Backend/DiunaBI.UI.Shared/Services/AuthService.cs
@@ -68,25 +68,25 @@ public class AuthService
else if (response.StatusCode == System.Net.HttpStatusCode.Unauthorized)
{
Console.WriteLine("❌ User not found in DiunaBI database");
- return (false, "Użytkownik nie istnieje w bazie DiunaBI.");
+ return (false, "User does not exist in DiunaBI database.");
}
else
{
Console.WriteLine($"❌ Backend error: {response.StatusCode}");
- return (false, "Błąd serwera DiunaBI. Spróbuj ponownie.");
+ return (false, "DiunaBI server error. Please try again.");
}
-
- return (false, "Nieoczekiwany błąd.");
+
+ return (false, "Unexpected error.");
}
catch (HttpRequestException ex)
{
Console.WriteLine($"❌ Network error: {ex.Message}");
- return (false, "Nie można połączyć się z serwerem DiunaBI.");
+ return (false, "Cannot connect to DiunaBI server.");
}
catch (Exception ex)
{
Console.WriteLine($"❌ Validation error: {ex.Message}");
- return (false, "Błąd podczas weryfikacji użytkownika.");
+ return (false, "User verification error.");
}
}
@@ -105,9 +105,9 @@ public class AuthService
{
_apiToken = token;
_userInfo = JsonSerializer.Deserialize(userInfoJson);
-
- // Przywróć header
- _httpClient.DefaultRequestHeaders.Authorization =
+
+ // Restore header
+ _httpClient.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", _apiToken);
Console.WriteLine($"✅ Session restored: {_userInfo?.Email}");
diff --git a/src/Backend/DiunaBI.UI.Web/wwwroot/app.css b/src/Backend/DiunaBI.UI.Web/wwwroot/app.css
index 7ac30e2..a69fc9f 100644
--- a/src/Backend/DiunaBI.UI.Web/wwwroot/app.css
+++ b/src/Backend/DiunaBI.UI.Web/wwwroot/app.css
@@ -3,17 +3,17 @@ html, body {
}
a, .btn-link {
- color: #006bb7;
+ color: #e7163d;
}
.btn-primary {
color: #fff;
- background-color: #1b6ec2;
- border-color: #1861ac;
+ background-color: #e7163d;
+ border-color: #c01234;
}
.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus {
- box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
+ box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #e7163d;
}
.content {