add MudDatePicker in to Filtering Invoice List

This commit is contained in:
zzdrojewskipaw
2025-11-29 17:02:20 +01:00
parent 81f6d83fd0
commit 4782bd3a89
6 changed files with 162 additions and 94 deletions

View File

@@ -22,8 +22,7 @@ public class InvoiceController(BimAIDbContext context) : ControllerBase
var searchTerm = request.Search.ToLower(); var searchTerm = request.Search.ToLower();
query = query.Where(x => query = query.Where(x =>
x.DocumentNo.ToLower().Contains(searchTerm) || x.DocumentNo.ToLower().Contains(searchTerm) ||
x.ClientName.ToLower().Contains(searchTerm) || x.ClientName.ToLower().Contains(searchTerm)
(x.ClientNip != null && x.ClientNip.ToLower().Contains(searchTerm))
); );
} }
@@ -49,12 +48,26 @@ public class InvoiceController(BimAIDbContext context) : ControllerBase
if (request.RegisterDateFrom.HasValue) if (request.RegisterDateFrom.HasValue)
{ {
query = query.Where(x => x.RegisterDate >= request.RegisterDateFrom.Value); var from = request.RegisterDateFrom.Value.Date;
query = query.Where(x => x.RegisterDate >= from);
} }
if (request.RegisterDateTo.HasValue) if (request.RegisterDateTo.HasValue)
{ {
query = query.Where(x => x.RegisterDate <= request.RegisterDateTo.Value); var toExclusive = request.RegisterDateTo.Value.Date.AddDays(1);
query = query.Where(x => x.RegisterDate < toExclusive);
}
if (request.SellDateFrom.HasValue)
{
var from = request.SellDateFrom.Value.Date;
query = query.Where(x => x.SellDate >= from);
}
if (request.SellDateTo.HasValue)
{
var toExclusive = request.SellDateTo.Value.Date.AddDays(1);
query = query.Where(x => x.SellDate < toExclusive);
} }
var totalCount = await query.CountAsync(); var totalCount = await query.CountAsync();

View File

@@ -30,6 +30,8 @@ public class InvoiceFilterRequest
public string? Source { get; set; } public string? Source { get; set; }
public DateTime? RegisterDateFrom { get; set; } public DateTime? RegisterDateFrom { get; set; }
public DateTime? RegisterDateTo { get; set; } public DateTime? RegisterDateTo { get; set; }
public DateTime? SellDateFrom { get; set; }
public DateTime? SellDateTo { get; set; }
public int Page { get; set; } = 1; public int Page { get; set; } = 1;
public int PageSize { get; set; } = 20; public int PageSize { get; set; } = 20;
} }

View File

@@ -1,4 +1,5 @@
@using MudBlazor.Internal @using MudBlazor.Internal
@using System.Data
<MudText Typo="Typo.h4" Class="mb-4">Lista Faktur</MudText> <MudText Typo="Typo.h4" Class="mb-4">Lista Faktur</MudText>
<MudExpansionPanels Class="mb-4"> <MudExpansionPanels Class="mb-4">
@@ -13,7 +14,7 @@
Immediate="true" Immediate="true"
DebounceInterval="500" DebounceInterval="500"
OnDebounceIntervalElapsed="SearchInvoices" OnDebounceIntervalElapsed="SearchInvoices"
Clearable="true"/> Clearable="true" />
</MudItem> </MudItem>
<MudItem xs="12" sm="6" md="4"> <MudItem xs="12" sm="6" md="4">
@@ -22,16 +23,7 @@
Immediate="true" Immediate="true"
DebounceInterval="500" DebounceInterval="500"
OnDebounceIntervalElapsed="SearchInvoices" OnDebounceIntervalElapsed="SearchInvoices"
Clearable="true"/> Clearable="true" />
</MudItem>
<MudItem xs="12" sm="6" md="4">
<MudTextField @bind-Value="filterRequest.ClientName"
Label="Nazwa klienta"
Immediate="true"
DebounceInterval="500"
OnDebounceIntervalElapsed="SearchInvoices"
Clearable="true"/>
</MudItem> </MudItem>
<MudItem xs="12" sm="6" md="4"> <MudItem xs="12" sm="6" md="4">
@@ -40,7 +32,56 @@
Immediate="true" Immediate="true"
DebounceInterval="500" DebounceInterval="500"
OnDebounceIntervalElapsed="SearchInvoices" OnDebounceIntervalElapsed="SearchInvoices"
Clearable="true"/> Clearable="true" />
</MudItem>
<MudItem xs="12" sm="6" md="4">
<MudTextField @bind-Value="filterRequest.ClientName"
Label="Nazwa klienta"
Immediate="true"
DebounceInterval="500"
OnDebounceIntervalElapsed="SearchInvoices"
Clearable="true" />
</MudItem>
<MudItem xs="12" sm="6" md="4">
<MudDatePicker @bind-Date="filterRequest.RegisterDateFrom"
Label="Data rejestracji od"
DateFormat="dd.MM.yyyy"
Editable="true"
Clearable="true"
Immediate="true"
@bind-Date:after="OnFilterChanged" />
</MudItem>
<MudItem xs="12" sm="6" md="4">
<MudDatePicker @bind-Date="filterRequest.RegisterDateTo"
Label="Data rejestracji do"
DateFormat="d.MM.yyyy"
Editable="true"
Clearable="true"
Immediate="true"
@bind-Date:after="OnFilterChanged" />
</MudItem>
<MudItem xs="12" sm="6" md="4">
<MudDatePicker @bind-Date="filterRequest.SellDateFrom"
Label="Data sprzedaży od"
DateFormat="d.MM.yyyy"
Editable="true"
Clearable="true"
Immediate="true"
@bind-Date:after="OnFilterChanged" />
</MudItem>
<MudItem xs="12" sm="6" md="4">
<MudDatePicker @bind-Date="filterRequest.SellDateTo"
Label="Data sprzedaży do"
DateFormat="d.MM.yyyy"
Editable="true"
Clearable="true"
Immediate="true"
@bind-Date:after="OnFilterChanged" />
</MudItem> </MudItem>
<MudItem xs="12" sm="6" md="4"> <MudItem xs="12" sm="6" md="4">
@@ -52,7 +93,8 @@
</MudItem> </MudItem>
</MudGrid> </MudGrid>
</MudExpansionPanel> </MudExpansionPanel>
</MudExpansionPanels> </MudExpansionPanels>
<MudDivider Class="my-4"></MudDivider> <MudDivider Class="my-4"></MudDivider>
@@ -100,7 +142,7 @@
@if (invoices.TotalCount > 0) @if (invoices.TotalCount > 0)
{ {
<MudGrid Class="mt-4" AlignItems="Center.Center"> <MudGrid Class="mt-4" AlignItems="Center">
<MudItem xs="12" sm="6"> <MudItem xs="12" sm="6">
<MudText Typo="Typo.body2"> <MudText Typo="Typo.body2">
Wyniki @((invoices.Page - 1) * invoices.PageSize + 1) - @Math.Min(invoices.Page * invoices.PageSize, invoices.TotalCount) Wyniki @((invoices.Page - 1) * invoices.PageSize + 1) - @Math.Min(invoices.Page * invoices.PageSize, invoices.TotalCount)

View File

@@ -9,6 +9,7 @@ namespace BimAI.UI.Shared.Components;
public partial class InvoiceListComponent : ComponentBase public partial class InvoiceListComponent : ComponentBase
{ {
[Inject] private InvoiceService InvoiceService { get; set; } = default!; [Inject] private InvoiceService InvoiceService { get; set; } = default!;
[Inject] private ISnackbar Snackbar { get; set; } = default!;
private PagedResult<InvoiceDto> invoices = new(); private PagedResult<InvoiceDto> invoices = new();
private InvoiceFilterRequest filterRequest = new(); private InvoiceFilterRequest filterRequest = new();
@@ -16,28 +17,24 @@ public partial class InvoiceListComponent : ComponentBase
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
Console.WriteLine("========== InvoiceListComponent OnInitializedAsync ==========");
await LoadInvoices(); await LoadInvoices();
} }
private async Task LoadInvoices() private async Task LoadInvoices()
{ {
isLoading = true; isLoading = true;
Console.WriteLine($"========== LoadInvoices - Starting load with Page: {filterRequest.Page}, PageSize: {filterRequest.PageSize} ==========");
try try
{ {
invoices = await InvoiceService.GetInvoiceAsync(filterRequest); var result = await InvoiceService.GetInvoiceAsync(filterRequest);
Console.WriteLine($"========== LoadInvoices - Loaded {invoices.Items?.Count ?? 0} invoices, Total: {invoices.TotalCount} =========="); invoices = result ?? new PagedResult<InvoiceDto>();
} }
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine($"========== ERROR Loading invoices failed: {ex.Message} =========="); Console.WriteLine($"Loading invoices failed: {ex.Message}");
Console.WriteLine($"========== ERROR Stack trace: {ex.StackTrace} =========="); Console.WriteLine($"Stack trace: {ex.StackTrace}");
if (ex.InnerException != null) Snackbar.Add($"Błąd podczas ładowania faktur: {ex.Message}", Severity.Error);
{ invoices = new PagedResult<InvoiceDto>();
Console.WriteLine($"========== ERROR Inner exception: {ex.InnerException.Message} ==========");
}
} }
finally finally
{ {
@@ -56,6 +53,11 @@ public partial class InvoiceListComponent : ComponentBase
filterRequest.Page = page; filterRequest.Page = page;
await LoadInvoices(); await LoadInvoices();
} }
private async Task OnFilterChanged()
{
filterRequest.Page = 1;
await SearchInvoices();
}
private async Task ClearFilters() private async Task ClearFilters()
{ {

View File

@@ -5,6 +5,7 @@
<MudThemeProvider/> <MudThemeProvider/>
<MudDialogProvider/> <MudDialogProvider/>
<MudSnackbarProvider/> <MudSnackbarProvider/>
<MudPopoverProvider />
<MudLayout> <MudLayout>
<MudBreakpointProvider OnBreakpointChanged="OnBreakpointChanged"></MudBreakpointProvider> <MudBreakpointProvider OnBreakpointChanged="OnBreakpointChanged"></MudBreakpointProvider>

View File

@@ -21,44 +21,52 @@ public class InvoiceService(HttpClient httpClient)
["pageSize"] = request.PageSize.ToString(), ["pageSize"] = request.PageSize.ToString(),
}; };
// if (!string.IsNullOrWhiteSpace(request.Search)) if (!string.IsNullOrWhiteSpace(request.Search))
// { {
// queryParams["search"] = request.Search; queryParams["search"] = request.Search;
// } }
// if (!string.IsNullOrWhiteSpace(request.Name)) if (!string.IsNullOrWhiteSpace(request.ClientName))
// { {
// queryParams["name"] = request.Name; queryParams["clientName"] = request.ClientName;
// } }
// if (!string.IsNullOrWhiteSpace(request.Code)) if (!string.IsNullOrWhiteSpace(request.Type))
// { {
// queryParams["code"] = request.Code; queryParams["type"] = request.Type;
// } }
if (!string.IsNullOrWhiteSpace(request.DocumentNo))
// if (!string.IsNullOrWhiteSpace(request.Ean)) {
// { queryParams["documentNo"] = request.DocumentNo;
// queryParams["ean"] = request.Ean; }
// } if (request.RegisterDateFrom.HasValue)
{
queryParams["registerDateFrom"] = request.RegisterDateFrom.Value.ToString("yyyy-MM-dd");;
}
if (request.RegisterDateTo.HasValue)
{
queryParams["registerDateTo"] = request.RegisterDateTo.Value.ToString("yyyy-MM-dd");
}
if (request.SellDateFrom.HasValue)
{
queryParams["sellDateFrom"] = request.SellDateFrom.Value.ToString("yyyy-MM-dd");
}
if (request.SellDateTo.HasValue)
{
queryParams["sellDateTo"] = request.SellDateTo.Value.ToString("yyyy-MM-dd");
}
var uri = QueryHelpers.AddQueryString("api/invoice", queryParams); var uri = QueryHelpers.AddQueryString("api/invoice", queryParams);
Console.WriteLine($"========== InvoiceService - Full URL: {_httpClient.BaseAddress}{uri} ==========");
var response = await _httpClient.GetAsync(uri); var response = await _httpClient.GetAsync(uri);
Console.WriteLine($"========== InvoiceService - Response status: {response.StatusCode} ==========");
if (!response.IsSuccessStatusCode) if (!response.IsSuccessStatusCode)
{ {
var errorContent = await response.Content.ReadAsStringAsync(); var errorContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"========== InvoiceService - Error response: {errorContent} ==========");
} }
response.EnsureSuccessStatusCode(); response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync(); var json = await response.Content.ReadAsStringAsync();
Console.WriteLine($"========== InvoiceService - Response JSON length: {json.Length} ==========");
Console.WriteLine($"========== InvoiceService - Response JSON: {json.Substring(0, Math.Min(500, json.Length))} ==========");
var result = JsonSerializer.Deserialize<PagedResult<InvoiceDto>>(json, _jsonOptions); var result = JsonSerializer.Deserialize<PagedResult<InvoiceDto>>(json, _jsonOptions);
Console.WriteLine($"========== InvoiceService - Deserialized result - Items count: {result?.Items?.Count ?? 0}, Total: {result?.TotalCount ?? 0} ==========");
return result ?? new PagedResult<InvoiceDto>(); return result ?? new PagedResult<InvoiceDto>();
} }