mirror of
				https://github.com/inventree/inventree-app.git
				synced 2025-10-31 21:35:42 +00:00 
			
		
		
		
	Further refactoring
This commit is contained in:
		| @@ -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<BillOfMaterialsWidget> { | ||||
|   _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<PaginatedBomList> { | ||||
|  | ||||
|   _PaginatedBomListState(Map<String, String> filters, this.onTotalChanged) : super(filters, fullscreen: true); | ||||
|   _PaginatedBomListState(Map<String, String> filters, this.onTotalChanged) : super(filters); | ||||
|  | ||||
|   Function(int)? onTotalChanged; | ||||
|  | ||||
| @@ -49,10 +79,6 @@ class _PaginatedBomListState extends PaginatedSearchState<PaginatedBomList> { | ||||
|     "sub_part": L10().part, | ||||
|   }; | ||||
|  | ||||
|  | ||||
|   @override | ||||
|   String getAppBarTitle(BuildContext context) => L10().billOfMaterials; | ||||
|  | ||||
|   @override | ||||
|   Future<InvenTreePageResponse?> requestPage(int limit, int offset, Map<String, String> params) async { | ||||
|  | ||||
|   | ||||
| @@ -21,7 +21,7 @@ import "package:inventree/widget/refreshable_state.dart"; | ||||
|  */ | ||||
| class PaginatedSearchState<T extends StatefulWidget> extends State<T> with BaseWidgetProperties { | ||||
|  | ||||
|   PaginatedSearchState(this.filters, {this.fullscreen = true}); | ||||
|   PaginatedSearchState(this.filters); | ||||
|  | ||||
|   final _key = GlobalKey<ScaffoldState>(); | ||||
|  | ||||
| @@ -29,9 +29,6 @@ class PaginatedSearchState<T extends StatefulWidget> extends State<T> 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<T extends StatefulWidget> extends State<T> 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: <Widget>[ | ||||
|                     // TODO - Search input | ||||
|                     PagedSliverList.separated( | ||||
|                       pagingController: _pagingController, | ||||
|                       builderDelegate: PagedChildBuilderDelegate<InvenTreeModel>( | ||||
| @@ -290,64 +268,39 @@ class PaginatedSearchState<T extends StatefulWidget> extends State<T> with BaseW | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   List<Widget> getAppBarActions(BuildContext context) { | ||||
|     List<Widget> 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); | ||||
|   | ||||
| @@ -354,9 +354,7 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> { | ||||
|                   Navigator.push( | ||||
|                     context, | ||||
|                     MaterialPageRoute( | ||||
|                       builder: (context) => PaginatedBomList({ | ||||
|                         "part": part.pk.toString(), | ||||
|                       }) | ||||
|                       builder: (context) => BillOfMaterialsWidget(part) | ||||
|                     ) | ||||
|                   ); | ||||
|                 } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user