Skip to content

Commit ebb17d3

Browse files
committed
feat: add sorting and searching capabilities to ThemedTable2Controller
1 parent 395efcd commit ebb17d3

5 files changed

Lines changed: 64 additions & 1 deletion

File tree

.fvmrc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"flutter": "3.41.9"
3+
}

example/pubspec.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ packages:
390390
path: ".."
391391
relative: true
392392
source: path
393-
version: "7.5.28"
393+
version: "7.5.31"
394394
leak_tracker:
395395
dependency: transitive
396396
description:

lib/src/table2/src/controller.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,27 @@ class ThemedTable2Controller<T> {
2828
}
2929
}
3030

31+
void onSort({
32+
int columnIndex = 0,
33+
bool ascending = true,
34+
}) {
35+
for (var listener in _listeners) {
36+
listener(ThemedTable2OnSortEvent<T>(columnIndex: columnIndex, ascending: ascending));
37+
}
38+
}
39+
40+
void search(String search) {
41+
for (var listener in _listeners) {
42+
listener(ThemedTable2SearchEvent<T>(search: search));
43+
}
44+
}
45+
46+
void onSearch(String search) {
47+
for (var listener in _listeners) {
48+
listener(ThemedTable2OnSearchEvent<T>(search: search));
49+
}
50+
}
51+
3152
void refresh() {
3253
for (var listener in _listeners) {
3354
listener(ThemedTable2RefreshEvent());

lib/src/table2/src/events.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,30 @@ class ThemedTable2SortEvent<T> extends ThemedTable2Event<T> {
1212
});
1313
}
1414

15+
class ThemedTable2OnSortEvent<T> extends ThemedTable2Event<T> {
16+
final int columnIndex;
17+
final bool ascending;
18+
19+
ThemedTable2OnSortEvent({
20+
required this.columnIndex,
21+
required this.ascending,
22+
});
23+
}
24+
25+
class ThemedTable2SearchEvent<T> extends ThemedTable2Event<T> {
26+
final String search;
27+
28+
ThemedTable2SearchEvent({
29+
required this.search,
30+
});
31+
}
32+
33+
class ThemedTable2OnSearchEvent<T> extends ThemedTable2Event<T> {
34+
final String search;
35+
36+
ThemedTable2OnSearchEvent({
37+
required this.search,
38+
});
39+
}
40+
1541
class ThemedTable2RefreshEvent<T> extends ThemedTable2Event<T> {}

lib/src/table2/src/table.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ class _ThemedTable2State<T> extends State<ThemedTable2<T>> {
261261
];
262262
}
263263

264+
widget.controller?.onSearch(_searchController.text);
264265
if (_searchController.text.isNotEmpty) {
265266
final searchLower = _searchController.text.toLowerCase();
266267
items = items.where((row) {
@@ -279,6 +280,7 @@ class _ThemedTable2State<T> extends State<ThemedTable2<T>> {
279280
final sortKeys = [
280281
for (final item in items) _itemsStrings[item.hashCode]?[columnIndex] ?? _colSelected.valueBuilder(item),
281282
];
283+
widget.controller?.onSort(columnIndex: columnIndex, ascending: !_isReversed);
282284
_filteredData.value = await compute(
283285
_sort,
284286
_SortParams<T>(
@@ -334,6 +336,9 @@ class _ThemedTable2State<T> extends State<ThemedTable2<T>> {
334336
}
335337

336338
void _onControllerEvent(ThemedTable2Event event) {
339+
/// Handle sort events from the controller:
340+
341+
/// Sort events are handled by updating the selected column and sort order, then re-filtering and sorting the data.
337342
if (event is ThemedTable2SortEvent<T>) {
338343
final columnIndex = event.columnIndex;
339344
final ascending = event.ascending;
@@ -349,10 +354,18 @@ class _ThemedTable2State<T> extends State<ThemedTable2<T>> {
349354
return;
350355
}
351356

357+
/// Refresh events are handled by re-filtering and sorting the data.
352358
if (event is ThemedTable2RefreshEvent<T>) {
353359
_filterAndSort('CONTROLLER_REFRESH');
354360
return;
355361
}
362+
363+
/// Search events are handled by updating the search controller text, which triggers the search listener and re-filters the data.
364+
if (event is ThemedTable2SearchEvent<T>) {
365+
_searchController.text = event.search;
366+
_filterAndSort('CONTROLLER_SEARCH');
367+
return;
368+
}
356369
}
357370

358371
@override

0 commit comments

Comments
 (0)