Skip to content

Commit

Permalink
fix: column filtering bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
ibrahimozkn committed Sep 21, 2024
1 parent 5038622 commit 20c0086
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 73 deletions.
27 changes: 0 additions & 27 deletions designer_v2/lib/features/dashboard/dashboard_state.dart
Original file line number Diff line number Diff line change
Expand Up @@ -98,33 +98,6 @@ class DashboardState extends Equatable {
return result;
}

/*List<Study> filterStudyByColumn(List<Study> studies, String filter) {
switch (filter) {
case "Standalone":
return studies.where((s) => s.type == StudyType.standalone).toList();
case "Template":
return studies.where((s) => s.type == StudyType.template).toList();
case "Substudy":
return studies.where((s) => s.type == StudyType.subStudy).toList();
case "Live":
return studies.where((s) => s.status == StudyStatus.running).toList();
case "Draft":
return studies.where((s) => s.status == StudyStatus.draft).toList();
case "Closed":
return studies.where((s) => s.status == StudyStatus.closed).toList();
case "Invite-Only":
return studies
.where((s) => s.participation == Participation.invite)
.toList();
case "Everyone":
return studies
.where((s) => s.participation == Participation.open)
.toList();
default:
return studies;
}
}*/

List<Study> filter({List<Study>? studiesToFilter}) {
studiesToFilter = studiesToFilter ?? studies.value!;
if (query.isEmpty) return studiesToFilter;
Expand Down
86 changes: 42 additions & 44 deletions designer_v2/lib/features/dashboard/studies_table.dart
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ class StudiesTable extends StatelessWidget {
filterable: true,
filterOptions: [
"Everyone",
"Invite-only",
"Invite Only",
],
),
StudiesTableColumn.createdAt: isSuperCompact
Expand Down Expand Up @@ -293,54 +293,52 @@ class StudiesTable extends StatelessWidget {
}
: null,
onFilter: columnDefinition.filterable
? (String? query) {
final currentUri = Uri.base;
final List<StudiesFilter> filters = [];
final Map<String, String> newQueryParameters =
Map.of(currentUri.queryParameters);

if (query != null && query.isNotEmpty) {
final List<String> queryParts = query.split(',');
final List<String> allQueryParameters = [
...currentUri.queryParameters.values,
...queryParts
];

for (final queryParam in allQueryParameters) {
filters.addAll(
StudiesFilter.values.where(
(filter) => filter
.toString()
.split('.')
.last
.toLowerCase()
.contains(queryParam.toLowerCase()),
),
);
}

newQueryParameters['title'] = query;

/// This function is a filter handler for filtering table columns individually.
///
/// `title`: The key representing the column name.
/// `query`: The value to filter by. If it's null or empty, the existing filter for column title is removed.
///
/// Each value in `queryParameters` is checked against the available `StudiesFilter` enum values. If a match is found
/// the corresponding `StudiesFilter` is added to the `filters` list.
/// The `dashboardController.setStudiesFilter(filters)` method is called to apply the filter settings to the dashboard.
/// If the column is not filterable, the function returns `null`.
//TODO: Add support for filtering by multiple values.
? (String title, String? query) {
final Map<String, String> queryParameters =
Map.of(Uri.base.queryParameters);

List<StudiesFilter> filters = [];

final List<String> titleParts =
queryParameters[title]?.split(',') ?? [];

if (query == null || query.isEmpty) {
queryParameters.remove(title);
} else if (titleParts.contains(query)) {
return;
} else {
newQueryParameters.remove('title');

for (final queryParam in newQueryParameters.values) {
filters.addAll(
StudiesFilter.values.where(
(filter) => filter
.toString()
.split('.')
.last
.toLowerCase()
.contains(queryParam.toLowerCase()),
),
);
}
queryParameters[title] =
query.replaceAll(' ', '').toLowerCase();
}

for (final filter in queryParameters.values) {
filters.addAll(
StudiesFilter.values.where(
(filterEnum) => filterEnum
.toString()
.split('.')
.last
.toLowerCase()
.contains(filter.toLowerCase()),
),
);
}

dashboardController.setStudiesFilter(filters);

final newUri =
currentUri.replace(queryParameters: newQueryParameters);
final newUri = Uri.base.replace(queryParameters: queryParameters);

html.window.history.pushState(null, '', newUri.toString());
}
: null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class StudiesTableColumnHeader extends StatefulWidget {
final bool filterable;
final List<String>? filterOptions;
final void Function()? onSort;
final void Function(String)? onFilter;
final void Function(String, String?)? onFilter;

const StudiesTableColumnHeader(
this.title, {
Expand Down Expand Up @@ -155,6 +155,8 @@ class _StudiesTableColumnHeaderState extends State<StudiesTableColumnHeader> {
setState(() {
if (value == true) {
selectedOptions.add(option);
selectedOptions.removeWhere(
(element) => element != option);
} else {
selectedOptions.remove(option);
}
Expand All @@ -176,7 +178,8 @@ class _StudiesTableColumnHeaderState extends State<StudiesTableColumnHeader> {
),
TextButton(
onPressed: () {
widget.onFilter?.call(selectedOptions.join(','));
widget.onFilter
?.call(widget.title, selectedOptions.join(','));
_activeOverlayEntry?.remove();
_activeOverlayEntry = null;
},
Expand Down

0 comments on commit 20c0086

Please sign in to comment.