Skip to content

Commit a9d15cd

Browse files
committed
feat: Improve current page maintenance
1 parent bd302eb commit a9d15cd

File tree

1 file changed

+36
-29
lines changed

1 file changed

+36
-29
lines changed

SimpleDataGrid/Pagination/PagedCollection.cs

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public void SetSource(IReadOnlyList<T> items)
101101
{
102102
ArgumentNullException.ThrowIfNull(items);
103103
_source = items;
104-
ApplyFiltering();
104+
ApplyFiltering(false);
105105
SourceChanged?.Invoke(this, EventArgs.Empty);
106106
}
107107

@@ -125,7 +125,7 @@ public void SetFilter(string key, Func<T, bool> filter)
125125
ArgumentNullException.ThrowIfNull(key);
126126
ArgumentNullException.ThrowIfNull(filter);
127127
_filters[key] = filter;
128-
ApplyFiltering();
128+
ApplyFiltering(true);
129129
FilterChanged?.Invoke(this, EventArgs.Empty);
130130
}
131131

@@ -138,7 +138,7 @@ public void RemoveFilter(string key)
138138
ArgumentNullException.ThrowIfNull(key);
139139
if (_filters.Remove(key))
140140
{
141-
ApplyFiltering();
141+
ApplyFiltering(true);
142142
FilterChanged?.Invoke(this, EventArgs.Empty);
143143
}
144144
}
@@ -156,7 +156,7 @@ public void RemoveFilter(string key)
156156
public void ClearFilters()
157157
{
158158
_filters.Clear();
159-
ApplyFiltering();
159+
ApplyFiltering(false);
160160
FilterChanged?.Invoke(this, EventArgs.Empty);
161161
}
162162

@@ -199,7 +199,7 @@ public void SetSearch(IEnumerable<Func<T, string>> selectors, string? term, bool
199199
}
200200
else
201201
{
202-
ApplyFiltering();
202+
ApplyFiltering(false);
203203
SearchChanged?.Invoke(this, EventArgs.Empty);
204204
}
205205
}
@@ -230,13 +230,14 @@ public void SetSearchAll(IEnumerable<Func<T, string>> selectors, string? term, b
230230
}
231231
else
232232
{
233-
ApplyFilteringAll();
233+
ApplyFilteringAll(false);
234234
SearchChanged?.Invoke(this, EventArgs.Empty);
235235
}
236236
}
237237

238-
private void ApplyFilteringAll()
238+
private void ApplyFilteringAll(bool maintainPosition = false)
239239
{
240+
var oldFirstItemIndex = _currentPage * _pageSize;
240241
IEnumerable<T> query = _source;
241242

242243
foreach (var filter in _filters.Values)
@@ -281,7 +282,15 @@ private void ApplyFilteringAll()
281282
}
282283

283284
_filtered = query.ToList();
284-
_currentPage = 0;
285+
286+
if (maintainPosition && _filtered.Any())
287+
{
288+
_currentPage = Math.Clamp(oldFirstItemIndex / _pageSize, 0, TotalPages - 1);
289+
}
290+
else
291+
{
292+
_currentPage = 0;
293+
}
285294
RaiseAllChanged();
286295
}
287296

@@ -293,7 +302,7 @@ public void ClearSearch()
293302
_searchSelectors = [];
294303
_searchTerm = null;
295304
_useWildcards = false;
296-
ApplyFiltering();
305+
ApplyFiltering(false);
297306
SearchChanged?.Invoke(this, EventArgs.Empty);
298307
}
299308

@@ -308,7 +317,7 @@ public void SetSort<TKey>(Func<T, TKey> selector, bool ascending)
308317
ArgumentNullException.ThrowIfNull(selector);
309318
_sorts.Clear();
310319
_sorts.Add((x => selector(x)!, ascending));
311-
ApplyFiltering();
320+
ApplyFiltering(true);
312321
SortChanged?.Invoke(this, EventArgs.Empty);
313322
}
314323

@@ -318,12 +327,13 @@ public void SetSort<TKey>(Func<T, TKey> selector, bool ascending)
318327
public void ClearSort()
319328
{
320329
_sorts.Clear();
321-
ApplyFiltering();
330+
ApplyFiltering(false);
322331
SortChanged?.Invoke(this, EventArgs.Empty);
323332
}
324333

325-
private void ApplyFiltering()
334+
private void ApplyFiltering(bool maintainPosition = false)
326335
{
336+
var oldFirstItemIndex = _currentPage * _pageSize;
327337
IEnumerable<T> query = _source;
328338

329339
foreach (var filter in _filters.Values)
@@ -350,25 +360,14 @@ private void ApplyFiltering()
350360
query = query.Where(item => _searchSelectors.Any(selector => matches(selector(item) ?? string.Empty)));
351361
}
352362

353-
if (_sorts.Count > 0)
363+
if (maintainPosition && _filtered.Any())
354364
{
355-
IOrderedEnumerable<T>? orderedQuery = null;
356-
foreach (var (selector, ascending) in _sorts)
357-
{
358-
if (orderedQuery == null)
359-
{
360-
orderedQuery = ascending ? query.OrderBy(selector) : query.OrderByDescending(selector);
361-
}
362-
else
363-
{
364-
orderedQuery = ascending ? orderedQuery.ThenBy(selector) : orderedQuery.ThenByDescending(selector);
365-
}
366-
}
367-
query = orderedQuery ?? query;
365+
_currentPage = Math.Clamp(oldFirstItemIndex / _pageSize, 0, TotalPages - 1);
366+
}
367+
else
368+
{
369+
_currentPage = 0;
368370
}
369-
370-
_filtered = query.ToList();
371-
_currentPage = 0;
372371
RaiseAllChanged();
373372
}
374373

@@ -490,6 +489,14 @@ public void GoToLastPage()
490489
GoToPage(TotalPages);
491490
}
492491

492+
/// <summary>
493+
/// Resets the current page to the first page.
494+
/// </summary>
495+
public void ResetToFirstPage()
496+
{
497+
GoToPage(1);
498+
}
499+
493500
/// <summary>
494501
/// Sets the number of items to display per page.
495502
/// </summary>

0 commit comments

Comments
 (0)