From 6d247f426cacb81f9bb38d3abd37f7a717a69d94 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Wed, 6 Jul 2022 20:54:17 +1000 Subject: [PATCH] Further refactoring --- lib/widget/bom_list.dart | 36 ++++++++++++--- lib/widget/paginator.dart | 89 +++++++++---------------------------- lib/widget/part_detail.dart | 4 +- 3 files changed, 53 insertions(+), 76 deletions(-) diff --git a/lib/widget/bom_list.dart b/lib/widget/bom_list.dart index 56d8faa5..14cd4906 100644 --- a/lib/widget/bom_list.dart +++ b/lib/widget/bom_list.dart @@ -16,6 +16,35 @@ import "package:inventree/widget/part_detail.dart"; import "package:inventree/widget/refreshable_state.dart"; +/* + * Widget for displaying a Bill of Materials for a specified Part instance + */ +class BillOfMaterialsWidget extends StatefulWidget { + + const BillOfMaterialsWidget(this.part, {Key? key}) : super(key: key); + + final InvenTreePart part; + + @override + _BillOfMaterialsState createState() => _BillOfMaterialsState(part); +} + +class _BillOfMaterialsState extends RefreshableState { + _BillOfMaterialsState(this.part); + + final InvenTreePart part; + + @override + String getAppBarTitle(BuildContext context) => L10().billOfMaterials; + + @override + Widget getBody(BuildContext context) { + return PaginatedBomList({ + "part": part.pk.toString(), + }); + } +} + /* * Create a paginated widget displaying a list of BomItem objects @@ -31,12 +60,13 @@ class PaginatedBomList extends StatefulWidget { @override _PaginatedBomListState createState() => _PaginatedBomListState(filters, onTotalChanged); + } class _PaginatedBomListState extends PaginatedSearchState { - _PaginatedBomListState(Map filters, this.onTotalChanged) : super(filters, fullscreen: true); + _PaginatedBomListState(Map filters, this.onTotalChanged) : super(filters); Function(int)? onTotalChanged; @@ -49,10 +79,6 @@ class _PaginatedBomListState extends PaginatedSearchState { "sub_part": L10().part, }; - - @override - String getAppBarTitle(BuildContext context) => L10().billOfMaterials; - @override Future requestPage(int limit, int offset, Map params) async { diff --git a/lib/widget/paginator.dart b/lib/widget/paginator.dart index a9971ecb..7781a3db 100644 --- a/lib/widget/paginator.dart +++ b/lib/widget/paginator.dart @@ -21,7 +21,7 @@ import "package:inventree/widget/refreshable_state.dart"; */ class PaginatedSearchState extends State with BaseWidgetProperties { - PaginatedSearchState(this.filters, {this.fullscreen = true}); + PaginatedSearchState(this.filters); final _key = GlobalKey(); @@ -29,9 +29,6 @@ class PaginatedSearchState extends State with BaseW static const _pageSize = 25; - // Determine if this widget is shown "fullscreen" (i.e. with appbar) - final bool fullscreen; - // Prefix for storing and loading pagination options // Override in implementing class String get prefix => "prefix_"; @@ -242,35 +239,16 @@ class PaginatedSearchState extends State with BaseW @override Widget build (BuildContext context) { - if (fullscreen) { - return Scaffold( - key: _key, - appBar: buildAppBar(context, _key), - drawer: getDrawer(context), - body: Builder( - builder: (BuildContext ctx) { - return getBody(ctx); - } - ) - ); - } else { - return getBody(context); - } - } - - @override - Widget getBody(BuildContext context) { return Column( mainAxisAlignment: MainAxisAlignment.start, children: [ - PaginatedSearchWidget(searchController, updateSearchTerm, resultCount), + buildSearchInput(context), Expanded( child: CustomScrollView( shrinkWrap: true, physics: ClampingScrollPhysics(), scrollDirection: Axis.vertical, slivers: [ - // TODO - Search input PagedSliverList.separated( pagingController: _pagingController, builderDelegate: PagedChildBuilderDelegate( @@ -290,64 +268,39 @@ class PaginatedSearchState extends State with BaseW ); } - @override - List getAppBarActions(BuildContext context) { - List actions = []; - - // If ordering options have been provided - if (orderingOptions.isNotEmpty) { - actions.add(IconButton( - icon: FaIcon(FontAwesomeIcons.sort), - onPressed: () => _saveOrderingOptions(context), - )); - } - - return actions; - } - -} - - -class PaginatedSearchWidget extends StatelessWidget { - - const PaginatedSearchWidget(this.controller, this.onChanged, this.results); - - final Function onChanged; - - final int results; - - final TextEditingController controller; - - @override - Widget build(BuildContext context) { + /* + * Construct a search input text field for the user to enter a search term + */ + Widget buildSearchInput(BuildContext context) { return ListTile( - leading: GestureDetector( - child: FaIcon(controller.text.isEmpty ? FontAwesomeIcons.search : FontAwesomeIcons.backspace), + leading: orderingOptions.isEmpty ? null : GestureDetector( + child: FaIcon(FontAwesomeIcons.sort), + onTap: () async { + _saveOrderingOptions(context); + }, + ), + trailing: GestureDetector( + child: FaIcon(searchController.text.isEmpty ? FontAwesomeIcons.search : FontAwesomeIcons.backspace), onTap: () { - controller.clear(); - onChanged(); + searchController.clear(); + updateSearchTerm(); }, ), title: TextFormField( - controller: controller, + controller: searchController, onChanged: (value) { - onChanged(); + updateSearchTerm(); }, decoration: InputDecoration( hintText: L10().search, + helperText: resultCount.toString(), ), - ), - trailing: Text( - "${results}", - style: TextStyle( - fontWeight: FontWeight.bold, - fontStyle: FontStyle.italic - ), - ), + ) ); } } + class NoResultsWidget extends StatelessWidget { const NoResultsWidget(this.description); diff --git a/lib/widget/part_detail.dart b/lib/widget/part_detail.dart index abf17423..8dc162fd 100644 --- a/lib/widget/part_detail.dart +++ b/lib/widget/part_detail.dart @@ -354,9 +354,7 @@ class _PartDisplayState extends RefreshableState { Navigator.push( context, MaterialPageRoute( - builder: (context) => PaginatedBomList({ - "part": part.pk.toString(), - }) + builder: (context) => BillOfMaterialsWidget(part) ) ); }