-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Combine filters * Fix selected option overlay * Order items in value selection dialog * Add search to value selection dialog * Fix search field * Move and refactor dialogs * Refactor filters * Fix borrowing rules tests * Polish * Refactor user selection dialog to use value selection dialog * Switch User Filter to users collection * Refactor multiselect button * Refactor filters into a provider
- Loading branch information
Showing
26 changed files
with
592 additions
and
703 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,13 +1,15 @@ | ||
import 'package:spare_parts/entities/custom_user.dart'; | ||
import 'package:spare_parts/entities/inventory_item.dart'; | ||
import 'package:spare_parts/factories/factory.dart'; | ||
|
||
class InventoryItemFactory extends Factory<InventoryItem> { | ||
@override | ||
InventoryItem create({String? name}) { | ||
InventoryItem create({String? name, CustomUser? borrower}) { | ||
return InventoryItem( | ||
id: faker.guid.guid(), | ||
type: faker.company.suffix(), | ||
name: name ?? faker.company.name(), | ||
borrower: borrower | ||
); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
29 changes: 29 additions & 0 deletions
29
lib/pages/home_page/inventory_view/filters/inventory_view_filter_selection.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
import 'package:flutter/foundation.dart'; | ||
import 'package:spare_parts/entities/custom_user.dart'; | ||
|
||
class InventoryViewFilterSelection extends ChangeNotifier { | ||
List<String> selectedItemTypes = []; | ||
List<CustomUser> selectedBorrowers = []; | ||
bool showOnlyAvailableItems = false; | ||
|
||
InventoryViewFilterSelection({ | ||
this.selectedItemTypes = const [], | ||
this.selectedBorrowers = const [], | ||
this.showOnlyAvailableItems = false, | ||
}); | ||
|
||
void updateSelectedItemTypes(List<String> selectedItemTypes) { | ||
this.selectedItemTypes = selectedItemTypes; | ||
notifyListeners(); | ||
} | ||
|
||
void updateSelectedBorrowers(List<CustomUser> selectedBorrowers) { | ||
this.selectedBorrowers = selectedBorrowers; | ||
notifyListeners(); | ||
} | ||
|
||
void toggleShowOnlyAvailableItems() { | ||
showOnlyAvailableItems = !showOnlyAvailableItems; | ||
notifyListeners(); | ||
} | ||
} |
33 changes: 33 additions & 0 deletions
33
lib/pages/home_page/inventory_view/filters/inventory_view_filters.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
import 'package:flutter/material.dart'; | ||
import 'package:provider/provider.dart'; | ||
import 'package:spare_parts/pages/home_page/inventory_view/filters/available_items_filter.dart'; | ||
import 'package:spare_parts/pages/home_page/inventory_view/filters/item_type_filter.dart'; | ||
import 'package:spare_parts/pages/home_page/inventory_view/filters/user_filter.dart'; | ||
import 'package:spare_parts/utilities/constants.dart'; | ||
|
||
class InventoryViewFilters extends StatelessWidget { | ||
const InventoryViewFilters({ | ||
super.key, | ||
}); | ||
|
||
@override | ||
Widget build(BuildContext context) { | ||
bool isAdmin = context.watch<UserRole>() == UserRole.admin; | ||
|
||
return SingleChildScrollView( | ||
scrollDirection: Axis.horizontal, | ||
child: Row( | ||
children: [ | ||
SizedBox(width: 5), | ||
ItemTypeFilter(), | ||
if (isAdmin) ...[ | ||
SizedBox(width: 10), | ||
UserFilter(), | ||
SizedBox(width: 10), | ||
AvailableItemsFilter(), | ||
], | ||
], | ||
), | ||
); | ||
} | ||
} |
37 changes: 37 additions & 0 deletions
37
lib/pages/home_page/inventory_view/filters/item_type_filter.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
import 'package:flutter/material.dart'; | ||
import 'package:provider/provider.dart'; | ||
import 'package:spare_parts/pages/home_page/inventory_view/filters/inventory_view_filter_selection.dart'; | ||
import 'package:spare_parts/utilities/constants.dart'; | ||
import 'package:spare_parts/widgets/dialogs/value_selection_dialog.dart'; | ||
import 'package:spare_parts/widgets/inputs/multiselect_button.dart'; | ||
|
||
class ItemTypeFilter extends StatelessWidget { | ||
const ItemTypeFilter({ | ||
super.key, | ||
}); | ||
|
||
void onChanged(BuildContext context, List<String> selectedItemTypes) { | ||
final selection = context.read<InventoryViewFilterSelection>(); | ||
selection.updateSelectedItemTypes(selectedItemTypes); | ||
} | ||
|
||
@override | ||
Widget build(BuildContext context) { | ||
final selectedItemTypes = | ||
context.select<InventoryViewFilterSelection, List<String>>( | ||
(selection) => selection.selectedItemTypes); | ||
|
||
return MultiselectButton<String>( | ||
buttonLabel: 'Item Types', | ||
hasSelection: selectedItemTypes.isNotEmpty, | ||
onConfirm: (values) => onChanged(context, values), | ||
dialog: ValueSelectionDialog<String>( | ||
values: itemTypes.keys.toList(), | ||
selectedValues: selectedItemTypes, | ||
title: 'Pick Item Types', | ||
leadingBuilder: (itemType) => | ||
Icon(itemTypes[itemType] ?? itemTypes['Other']!), | ||
), | ||
); | ||
} | ||
} |
36 changes: 0 additions & 36 deletions
36
lib/pages/home_page/inventory_view/filters/search_field.dart
This file was deleted.
Oops, something went wrong.
71 changes: 20 additions & 51 deletions
71
lib/pages/home_page/inventory_view/filters/user_filter.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,65 +1,34 @@ | ||
import 'package:flutter/material.dart'; | ||
import 'package:provider/provider.dart'; | ||
import 'package:spare_parts/dtos/user_dto.dart'; | ||
import 'package:spare_parts/services/callable_service.dart'; | ||
import 'package:spare_parts/entities/custom_user.dart'; | ||
import 'package:spare_parts/pages/home_page/inventory_view/filters/inventory_view_filter_selection.dart'; | ||
import 'package:spare_parts/widgets/dialogs/user_selection_dialog.dart'; | ||
import 'package:spare_parts/widgets/inputs/multiselect_button.dart'; | ||
import 'package:spare_parts/widgets/user_avatar.dart'; | ||
|
||
class UserFilter extends StatefulWidget { | ||
final List<String> selectedUsers; | ||
final void Function(List<String>) onChanged; | ||
final IconData? icon; | ||
|
||
class UserFilter extends StatelessWidget { | ||
const UserFilter({ | ||
super.key, | ||
required this.selectedUsers, | ||
required this.onChanged, | ||
this.icon, | ||
super.key | ||
}); | ||
|
||
@override | ||
State<UserFilter> createState() => _UserFilterState(); | ||
} | ||
|
||
class _UserFilterState extends State<UserFilter> { | ||
late Future<List<UserDto>> _userQuery; | ||
|
||
@override | ||
void initState() { | ||
final callableService = context.read<CallableService>(); | ||
_userQuery = callableService.getUsers(); | ||
|
||
super.initState(); | ||
void onChanged(BuildContext context, List<CustomUser> selectedUsers) { | ||
final selection = context.read<InventoryViewFilterSelection>(); | ||
selection.updateSelectedBorrowers(selectedUsers); | ||
} | ||
|
||
@override | ||
Widget build(BuildContext context) { | ||
return FutureBuilder<List<UserDto>>( | ||
future: _userQuery, | ||
builder: (context, snap) { | ||
if (!snap.hasData || snap.hasError) { | ||
return SizedBox.square( | ||
dimension: 20, | ||
child: CircularProgressIndicator(strokeWidth: 3), | ||
); | ||
} | ||
|
||
final users = snap.data!; | ||
|
||
return MultiselectButton( | ||
buttonLabel: 'Borrowers', | ||
values: users.map((u) => u.id).toList(), | ||
selectedValues: widget.selectedUsers, | ||
onConfirm: widget.onChanged, | ||
icon: widget.icon, | ||
labelBuilder: (uid) => | ||
users.singleWhere((user) => user.id == uid).name, | ||
leadingBuilder: (uid) { | ||
final user = users.singleWhere((user) => user.id == uid); | ||
return UserAvatar(photoUrl: user.photoUrl); | ||
}, | ||
); | ||
}, | ||
final selectedUsers = | ||
context.select<InventoryViewFilterSelection, List<CustomUser>>( | ||
(selection) => selection.selectedBorrowers); | ||
|
||
return MultiselectButton<CustomUser>( | ||
buttonLabel: 'Borrowers', | ||
hasSelection: selectedUsers.isNotEmpty, | ||
onConfirm: (values) => onChanged(context, values), | ||
dialog: UserSelectionDialog( | ||
selectedUsers: selectedUsers, | ||
title: 'Pick Borrowers', | ||
), | ||
); | ||
} | ||
} |
Oops, something went wrong.