Skip to content

Commit 459ab83

Browse files
committed
feat: Add a search/filter for collection pane #305
This feature adds a search/filter functionality to the collection pane, allowing users to easily search for specific requests based on their names. Users can input search queries to filter the requests displayed in the collection pane, improving the navigation and organization of requests within the application.
1 parent 610e45c commit 459ab83

File tree

2 files changed

+64
-5
lines changed

2 files changed

+64
-5
lines changed

lib/providers/collection_providers.dart

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:collection/collection.dart';
12
import 'package:flutter_riverpod/flutter_riverpod.dart';
23
import 'settings_providers.dart';
34
import 'ui_providers.dart';
@@ -8,6 +9,7 @@ import '../consts.dart';
89
import 'package:http/http.dart' as http;
910

1011
final selectedIdStateProvider = StateProvider<String?>((ref) => null);
12+
final searchQueryProvider = StateProvider<String>((ref) => '');
1113

1214
final selectedRequestModelProvider = StateProvider<RequestModel?>((ref) {
1315
final selectedId = ref.watch(selectedIdStateProvider);
@@ -31,7 +33,7 @@ final StateNotifierProvider<CollectionStateNotifier, Map<String, RequestModel>?>
3133
class CollectionStateNotifier
3234
extends StateNotifier<Map<String, RequestModel>?> {
3335
CollectionStateNotifier(this.ref, this.hiveHandler) : super(null) {
34-
var status = loadData();
36+
var status = filterRequests(ref.read(searchQueryProvider.notifier).state);
3537
Future.microtask(() {
3638
if (status) {
3739
ref.read(requestSequenceProvider.notifier).state = [
@@ -248,6 +250,37 @@ class CollectionStateNotifier
248250
}
249251
}
250252

253+
bool filterRequests(String query) {
254+
if (query.isEmpty) {
255+
256+
loadData();
257+
return true;
258+
} else {
259+
// Filter requests based on the query
260+
final filteredRequests = state?.values.where((request) =>
261+
request.name.toLowerCase().contains(query.toLowerCase())).toList();
262+
263+
264+
if (filteredRequests != null && filteredRequests.isNotEmpty) {
265+
266+
Map<String, RequestModel> requestMap = {};
267+
268+
for (var request in filteredRequests) {
269+
requestMap[request.id] = request;
270+
}
271+
272+
state = requestMap;
273+
274+
} else {
275+
print("No matching requests found");
276+
}
277+
278+
279+
280+
return false;
281+
}
282+
}
283+
251284
Future<void> saveData() async {
252285
ref.read(saveDataStateProvider.notifier).state = true;
253286
final saveResponse = ref.read(settingsProvider).saveResponses;

lib/screens/home_page/collection_pane.dart

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:flutter/cupertino.dart';
12
import 'package:flutter/material.dart';
23
import 'package:flutter_riverpod/flutter_riverpod.dart';
34
import 'package:apidash/providers/providers.dart';
@@ -66,10 +67,33 @@ class CollectionPane extends ConsumerWidget {
6667
style: kTextStyleButton,
6768
),
6869
),
70+
6971
],
7072
),
7173
),
72-
kVSpacer8,
74+
kVSpacer10,
75+
SizedBox(
76+
height:30,
77+
child:SearchBar(
78+
79+
onChanged: (value){
80+
if(value.isNotEmpty){
81+
ref.read(searchQueryProvider.notifier).state = value;
82+
ref.read(collectionStateNotifierProvider.notifier)
83+
.filterRequests(value);
84+
}
85+
else{
86+
87+
}
88+
89+
},
90+
hintText: "search",
91+
leading: Icon(Icons.search),
92+
textStyle: MaterialStateTextStyle.resolveWith((states) => TextStyle(fontSize: 15.0)),
93+
elevation: MaterialStateProperty.all(2.0),
94+
)),
95+
kVSpacer10,
96+
7397
const Expanded(
7498
child: RequestList(),
7599
),
@@ -110,15 +134,15 @@ class _RequestListState extends ConsumerState<RequestList> {
110134
final alwaysShowCollectionPaneScrollbar = ref.watch(settingsProvider
111135
.select((value) => value.alwaysShowCollectionPaneScrollbar));
112136

113-
return Scrollbar(
137+
return requestItems.isNotEmpty?Scrollbar(
114138
controller: controller,
115139
thumbVisibility: alwaysShowCollectionPaneScrollbar ? true : null,
116140
radius: const Radius.circular(12),
117141
child: ReorderableListView.builder(
118142
padding: kPr8CollectionPane,
119143
scrollController: controller,
120144
buildDefaultDragHandles: false,
121-
itemCount: requestSequence.length,
145+
itemCount: requestItems.length,
122146
onReorder: (int oldIndex, int newIndex) {
123147
if (oldIndex < newIndex) {
124148
newIndex -= 1;
@@ -131,6 +155,8 @@ class _RequestListState extends ConsumerState<RequestList> {
131155
},
132156
itemBuilder: (context, index) {
133157
var id = requestSequence[index];
158+
print(requestItems[id]!);
159+
134160
return ReorderableDragStartListener(
135161
key: ValueKey(id),
136162
index: index,
@@ -144,7 +170,7 @@ class _RequestListState extends ConsumerState<RequestList> {
144170
);
145171
},
146172
),
147-
);
173+
):Text("data");
148174
}
149175
}
150176

0 commit comments

Comments
 (0)