From d171afe223fa20c4e88f0773a66c4d32b2e0e3cd Mon Sep 17 00:00:00 2001 From: Brandon Henry <11.henrybm@gmail.com> Date: Sun, 29 Aug 2021 00:17:52 -0400 Subject: [PATCH 1/3] add search bar to top of page, update materials per category as search changes --- lib/features/bank/pages/material.dart | 46 +++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/lib/features/bank/pages/material.dart b/lib/features/bank/pages/material.dart index 96142aa..24c06b3 100644 --- a/lib/features/bank/pages/material.dart +++ b/lib/features/bank/pages/material.dart @@ -9,7 +9,15 @@ import 'package:guildwars2_companion/features/bank/models/material_category.dart import 'package:guildwars2_companion/features/item/enums/item_section.dart'; import 'package:guildwars2_companion/features/item/widgets/item_box.dart'; -class MaterialBankPage extends StatelessWidget { + +class MaterialBankPage extends StatefulWidget { + @override + _MaterialBankPageState createState() => _MaterialBankPageState(); +} + +class _MaterialBankPageState extends State { + String _search = ""; + @override Widget build(BuildContext context) { return CompanionAccent( @@ -39,10 +47,26 @@ class MaterialBankPage extends StatelessWidget { BlocProvider.of(context).add(LoadBankEvent()); await Future.delayed(Duration(milliseconds: 200), () {}); }, - child: CompanionListView( - children: state.materialCategories - .map((c) => _MaterialCategoryCard(category: c)) - .toList(), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0), + child: TextFormField( + decoration: InputDecoration( + hintText: "Item to search for", + labelText: "Search", + contentPadding: EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0), + focusColor: Theme.of(context).accentColor + ), + onChanged: (String value) { + setState(() => _search = value ); + }, + ), + ), + Expanded( + child: buildCategories(state, this._search) + ) + ] ), ); } @@ -55,12 +79,21 @@ class MaterialBankPage extends StatelessWidget { ), ); } + + CompanionListView buildCategories(LoadedBankState state, String search) { + return CompanionListView( + children: state.materialCategories + .map((c) => _MaterialCategoryCard(category: c, search: search)) + .toList(), + ); + } } class _MaterialCategoryCard extends StatelessWidget { final MaterialCategory category; + String search; - _MaterialCategoryCard({@required this.category}); + _MaterialCategoryCard({@required this.category, @required this.search}); @override Widget build(BuildContext context) { @@ -83,6 +116,7 @@ class _MaterialCategoryCard extends StatelessWidget { spacing: 4.0, runSpacing: 4.0, children: category.materials + .where((i) => i.itemInfo.name.toLowerCase().contains(search.toLowerCase())) .map((i) => ItemBox( item: i.itemInfo, quantity: i.count, From 4a561ebdd2d2c8439f41a6c8a6a785e8393f7af4 Mon Sep 17 00:00:00 2001 From: Brandon Henry <11.henrybm@gmail.com> Date: Sun, 29 Aug 2021 00:26:29 -0400 Subject: [PATCH 2/3] don't show material category if it's empty after search filter --- lib/features/bank/pages/material.dart | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/lib/features/bank/pages/material.dart b/lib/features/bank/pages/material.dart index 24c06b3..cd0772b 100644 --- a/lib/features/bank/pages/material.dart +++ b/lib/features/bank/pages/material.dart @@ -97,6 +97,21 @@ class _MaterialCategoryCard extends StatelessWidget { @override Widget build(BuildContext context) { + var items = category.materials + .where((i) => i.itemInfo.name.toLowerCase().contains(search.toLowerCase())) + .map((i) => ItemBox( + item: i.itemInfo, + quantity: i.count, + hero: '${i.id} ${category.materials.indexOf(i)}', + includeMargin: false, + section: ItemSection.MATERIAL, + )) + .toList(); + + if (items.isEmpty) { + return Container(); + } + return Padding( padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0), child: Column( @@ -115,16 +130,7 @@ class _MaterialCategoryCard extends StatelessWidget { alignment: WrapAlignment.center, spacing: 4.0, runSpacing: 4.0, - children: category.materials - .where((i) => i.itemInfo.name.toLowerCase().contains(search.toLowerCase())) - .map((i) => ItemBox( - item: i.itemInfo, - quantity: i.count, - hero: '${i.id} ${category.materials.indexOf(i)}', - includeMargin: false, - section: ItemSection.MATERIAL, - )) - .toList(), + children: items, ), ), ], From 38c396613efe092708b352231f39fd9126fb1429 Mon Sep 17 00:00:00 2001 From: Brandon Henry <11.henrybm@gmail.com> Date: Mon, 30 Aug 2021 00:41:29 -0400 Subject: [PATCH 3/3] pull search into its own widget, use that in materials & bank pages --- lib/core/widgets/search_page.dart | 39 +++++++++++++++++++++++ lib/features/bank/pages/generic_bank.dart | 18 +++++++++++ lib/features/bank/pages/material.dart | 25 ++------------- 3 files changed, 59 insertions(+), 23 deletions(-) create mode 100644 lib/core/widgets/search_page.dart diff --git a/lib/core/widgets/search_page.dart b/lib/core/widgets/search_page.dart new file mode 100644 index 0000000..95f390c --- /dev/null +++ b/lib/core/widgets/search_page.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; + +class SearchPage extends StatefulWidget { + final Widget Function(BuildContext, String) builder; + + SearchPage({@required this.builder}); + + @override + _SearchPageState createState() => _SearchPageState(); +} + +class _SearchPageState extends State { + String _search = ""; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0), + child: TextFormField( + decoration: InputDecoration( + hintText: "Item to search for", + labelText: "Search", + contentPadding: EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0), + focusColor: Theme.of(context).accentColor + ), + onChanged: (String value) { + setState(() => _search = value ); + }, + ), + ), + Expanded( + child: widget.builder(context, _search) + ) + ] + ); + } +} diff --git a/lib/features/bank/pages/generic_bank.dart b/lib/features/bank/pages/generic_bank.dart index 567dbe7..1d8f9b1 100644 --- a/lib/features/bank/pages/generic_bank.dart +++ b/lib/features/bank/pages/generic_bank.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:guildwars2_companion/core/widgets/accent.dart'; import 'package:guildwars2_companion/core/widgets/appbar.dart'; +import 'package:guildwars2_companion/core/widgets/search_page.dart'; import 'package:guildwars2_companion/features/error/widgets/error.dart'; import 'package:guildwars2_companion/core/widgets/list_view.dart'; import 'package:guildwars2_companion/features/bank/bloc/bank_bloc.dart'; @@ -71,6 +72,10 @@ class _BankListView extends StatelessWidget { @override Widget build(BuildContext context) { + return SearchPage(builder: buildBankList); + } + + CompanionListView buildBankList(BuildContext context, String search) { return CompanionListView( children: Iterable .generate((inventory.length / 30).ceil()) @@ -78,8 +83,21 @@ class _BankListView extends StatelessWidget { List bankTab = inventory .skip(index * 30) .take(30) + .where((i) { + if (search.isEmpty) { + return true; + } + + return i.itemInfo != null + && i.itemInfo.name != null + && i.itemInfo.name.toLowerCase().contains(search.toLowerCase()); + }) .toList(); + if (bankTab.isEmpty) { + return Container(); + } + return Padding( padding: EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0), child: Column( diff --git a/lib/features/bank/pages/material.dart b/lib/features/bank/pages/material.dart index cd0772b..3606337 100644 --- a/lib/features/bank/pages/material.dart +++ b/lib/features/bank/pages/material.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:guildwars2_companion/core/widgets/accent.dart'; import 'package:guildwars2_companion/core/widgets/appbar.dart'; +import 'package:guildwars2_companion/core/widgets/search_page.dart'; import 'package:guildwars2_companion/features/error/widgets/error.dart'; import 'package:guildwars2_companion/core/widgets/list_view.dart'; import 'package:guildwars2_companion/features/bank/bloc/bank_bloc.dart'; @@ -16,8 +17,6 @@ class MaterialBankPage extends StatefulWidget { } class _MaterialBankPageState extends State { - String _search = ""; - @override Widget build(BuildContext context) { return CompanionAccent( @@ -47,27 +46,7 @@ class _MaterialBankPageState extends State { BlocProvider.of(context).add(LoadBankEvent()); await Future.delayed(Duration(milliseconds: 200), () {}); }, - child: Column( - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0), - child: TextFormField( - decoration: InputDecoration( - hintText: "Item to search for", - labelText: "Search", - contentPadding: EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0), - focusColor: Theme.of(context).accentColor - ), - onChanged: (String value) { - setState(() => _search = value ); - }, - ), - ), - Expanded( - child: buildCategories(state, this._search) - ) - ] - ), + child: SearchPage(builder: (context, search) { return buildCategories(state, search); }) ); }