Skip to content

Commit 0288860

Browse files
Merge pull request #812 from TransactionProcessing/copilot/fix-transaction-summary-grid-again
Transaction Summary by Operator: add grid sorting, paging, and fix filter button alignment
2 parents c3bdc13 + 5d22367 commit 0288860

2 files changed

Lines changed: 131 additions & 13 deletions

File tree

EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryOperator.razor

Lines changed: 58 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,14 @@
9797
</select>
9898
</div>
9999
</div>
100-
<div class="mt-4">
101-
<button @onclick="ApplyFilters" class="btn btn-primary">
100+
<div class="mt-4 flex items-center gap-2">
101+
<button @onclick="ApplyFilters" class="btn btn-primary inline-flex items-center">
102102
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
103103
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z"></path>
104104
</svg>
105105
Apply Filters
106106
</button>
107-
<button @onclick="ClearFilters" class="btn btn-secondary ml-2">
107+
<button @onclick="ClearFilters" class="btn btn-secondary inline-flex items-center">
108108
Clear Filters
109109
</button>
110110
</div>
@@ -174,19 +174,40 @@
174174
<table class="table">
175175
<thead>
176176
<tr>
177-
<th>Operator Name</th>
178-
<th class="!text-right">Transaction Count</th>
179-
<th class="!text-right">Transaction Value</th>
177+
<th class="cursor-pointer select-none" @onclick='() => SortBy("OperatorName")'>
178+
Operator Name
179+
@if (_sortColumn == "OperatorName") { <span>@(_sortAscending ? "" : "")</span> }
180+
</th>
181+
<th class="!text-right cursor-pointer select-none" @onclick='() => SortBy("TotalCount")'>
182+
Transaction Count
183+
@if (_sortColumn == "TotalCount") { <span>@(_sortAscending ? "" : "")</span> }
184+
</th>
185+
<th class="!text-right cursor-pointer select-none" @onclick='() => SortBy("TotalValue")'>
186+
Transaction Value
187+
@if (_sortColumn == "TotalValue") { <span>@(_sortAscending ? "" : "")</span> }
188+
</th>
180189
@* <th class="!text-right">Fees Earned</th> *@
181-
<th class="!text-right">Average Value</th>
182-
<th class="!text-right">Successful</th>
183-
<th class="!text-right">Failed</th>
184-
<th class="!text-right">Success Rate</th>
190+
<th class="!text-right cursor-pointer select-none" @onclick='() => SortBy("AverageValue")'>
191+
Average Value
192+
@if (_sortColumn == "AverageValue") { <span>@(_sortAscending ? "" : "")</span> }
193+
</th>
194+
<th class="!text-right cursor-pointer select-none" @onclick='() => SortBy("AuthorisedCount")'>
195+
Successful
196+
@if (_sortColumn == "AuthorisedCount") { <span>@(_sortAscending ? "" : "")</span> }
197+
</th>
198+
<th class="!text-right cursor-pointer select-none" @onclick='() => SortBy("DeclinedCount")'>
199+
Failed
200+
@if (_sortColumn == "DeclinedCount") { <span>@(_sortAscending ? "" : "")</span> }
201+
</th>
202+
<th class="!text-right cursor-pointer select-none" @onclick='() => SortBy("AuthorisedPercentage")'>
203+
Success Rate
204+
@if (_sortColumn == "AuthorisedPercentage") { <span>@(_sortAscending ? "" : "")</span> }
205+
</th>
185206
<th class="!text-center">Actions</th>
186207
</tr>
187208
</thead>
188209
<tbody>
189-
@foreach (var item in summaryData.Operators)
210+
@foreach (var item in PagedOperators)
190211
{
191212
<tr>
192213
<td class="font-medium">@item.OperatorName</td>
@@ -237,6 +258,32 @@
237258
</tfoot> *@
238259
</table>
239260
</div>
261+
@if (TotalPages > 1)
262+
{
263+
<div class="flex items-center justify-between mt-4">
264+
<div class="text-sm text-gray-700">
265+
Showing @((_currentPage - 1) * _pageSize + 1)@(Math.Min(_currentPage * _pageSize, summaryData.Operators.Count)) of @summaryData.Operators.Count results
266+
</div>
267+
<div class="flex items-center gap-1">
268+
<button @onclick='() => GoToPage(1)' disabled="@(_currentPage == 1)" class="btn btn-sm btn-secondary">«</button>
269+
<button @onclick='() => GoToPage(_currentPage - 1)' disabled="@(_currentPage == 1)" class="btn btn-sm btn-secondary">‹</button>
270+
@{
271+
int pageStart = Math.Max(1, _currentPage - 2);
272+
int pageEnd = Math.Min(TotalPages, _currentPage + 2);
273+
}
274+
@for (int p = pageStart; p <= pageEnd; p++)
275+
{
276+
var pageNum = p;
277+
<button @onclick='() => GoToPage(pageNum)'
278+
class="btn btn-sm @(_currentPage == pageNum ? "btn-primary" : "btn-secondary")">
279+
@pageNum
280+
</button>
281+
}
282+
<button @onclick='() => GoToPage(_currentPage + 1)' disabled="@(_currentPage == TotalPages)" class="btn btn-sm btn-secondary">›</button>
283+
<button @onclick='() => GoToPage(TotalPages)' disabled="@(_currentPage == TotalPages)" class="btn btn-sm btn-secondary">»</button>
284+
</div>
285+
</div>
286+
}
240287
}
241288
else
242289
{

EstateManagementUI.BlazorServer/Components/Pages/Reporting/TransactionSummaryOperator.razor.cs

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,76 @@ public partial class TransactionSummaryOperator
2121
private List<MerchantModels.MerchantDropDownModel>? merchants;
2222
private List<OperatorModels.OperatorDropDownModel>? operators;
2323

24+
// Sorting
25+
private string _sortColumn = "OperatorName";
26+
private bool _sortAscending = true;
27+
28+
// Paging
29+
private int _pageSize = 10;
30+
private int _currentPage = 1;
31+
32+
private int TotalPages => summaryData?.Operators != null
33+
? (int)Math.Ceiling(summaryData.Operators.Count / (double)_pageSize)
34+
: 0;
35+
36+
private IEnumerable<TransactionModels.OperatorDetail> PagedOperators
37+
{
38+
get
39+
{
40+
if (summaryData?.Operators == null)
41+
return Enumerable.Empty<TransactionModels.OperatorDetail>();
42+
43+
IEnumerable<TransactionModels.OperatorDetail> sorted = _sortColumn switch
44+
{
45+
"TotalCount" => _sortAscending
46+
? summaryData.Operators.OrderBy(o => o.TotalCount)
47+
: summaryData.Operators.OrderByDescending(o => o.TotalCount),
48+
"TotalValue" => _sortAscending
49+
? summaryData.Operators.OrderBy(o => o.TotalValue)
50+
: summaryData.Operators.OrderByDescending(o => o.TotalValue),
51+
"AverageValue" => _sortAscending
52+
? summaryData.Operators.OrderBy(o => o.AverageValue)
53+
: summaryData.Operators.OrderByDescending(o => o.AverageValue),
54+
"AuthorisedCount" => _sortAscending
55+
? summaryData.Operators.OrderBy(o => o.AuthorisedCount)
56+
: summaryData.Operators.OrderByDescending(o => o.AuthorisedCount),
57+
"DeclinedCount" => _sortAscending
58+
? summaryData.Operators.OrderBy(o => o.DeclinedCount)
59+
: summaryData.Operators.OrderByDescending(o => o.DeclinedCount),
60+
"AuthorisedPercentage" => _sortAscending
61+
? summaryData.Operators.OrderBy(o => o.AuthorisedPercentage)
62+
: summaryData.Operators.OrderByDescending(o => o.AuthorisedPercentage),
63+
_ => _sortAscending
64+
? summaryData.Operators.OrderBy(o => o.OperatorName)
65+
: summaryData.Operators.OrderByDescending(o => o.OperatorName),
66+
};
67+
68+
return sorted.Skip((_currentPage - 1) * _pageSize).Take(_pageSize);
69+
}
70+
}
71+
72+
private void SortBy(string column)
73+
{
74+
if (_sortColumn == column)
75+
{
76+
_sortAscending = !_sortAscending;
77+
}
78+
else
79+
{
80+
_sortColumn = column;
81+
_sortAscending = true;
82+
}
83+
_currentPage = 1;
84+
}
85+
86+
private void GoToPage(int page)
87+
{
88+
if (page >= 1 && page <= TotalPages)
89+
{
90+
_currentPage = page;
91+
}
92+
}
93+
2494
protected override async Task OnAfterRenderAsync(bool firstRender)
2595
{
2696
if (!firstRender)
@@ -102,6 +172,7 @@ private async Task<Result> LoadSummaryData()
102172
if (result.IsSuccess && result.Data != null)
103173
{
104174
summaryData = result.Data;
175+
_currentPage = 1;
105176
}
106177
else
107178
{
@@ -135,8 +206,8 @@ private async Task ClearFilters()
135206
{
136207
_startDate = DateOnly.FromDateTime(DateTime.Now.AddDays(-7));
137208
_endDate = DateOnly.FromDateTime(DateTime.Now);
138-
_selectedMerchant = "";
139-
_selectedOperator = "";
209+
_selectedMerchant = "-1";
210+
_selectedOperator = "-1";
140211
await LoadSummaryData();
141212
}
142213

0 commit comments

Comments
 (0)