2
0
mirror of https://github.com/inventree/inventree-app.git synced 2025-04-29 14:06:47 +00:00

Further refactoring

This commit is contained in:
Oliver Walters 2022-07-06 20:54:17 +10:00
parent 7301243ed6
commit 6d247f426c
3 changed files with 53 additions and 76 deletions

View File

@ -16,6 +16,35 @@ import "package:inventree/widget/part_detail.dart";
import "package:inventree/widget/refreshable_state.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 * Create a paginated widget displaying a list of BomItem objects
@ -31,12 +60,13 @@ class PaginatedBomList extends StatefulWidget {
@override @override
_PaginatedBomListState createState() => _PaginatedBomListState(filters, onTotalChanged); _PaginatedBomListState createState() => _PaginatedBomListState(filters, onTotalChanged);
} }
class _PaginatedBomListState extends PaginatedSearchState<PaginatedBomList> { 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; Function(int)? onTotalChanged;
@ -49,10 +79,6 @@ class _PaginatedBomListState extends PaginatedSearchState<PaginatedBomList> {
"sub_part": L10().part, "sub_part": L10().part,
}; };
@override
String getAppBarTitle(BuildContext context) => L10().billOfMaterials;
@override @override
Future<InvenTreePageResponse?> requestPage(int limit, int offset, Map<String, String> params) async { Future<InvenTreePageResponse?> requestPage(int limit, int offset, Map<String, String> params) async {

View File

@ -21,7 +21,7 @@ import "package:inventree/widget/refreshable_state.dart";
*/ */
class PaginatedSearchState<T extends StatefulWidget> extends State<T> with BaseWidgetProperties { class PaginatedSearchState<T extends StatefulWidget> extends State<T> with BaseWidgetProperties {
PaginatedSearchState(this.filters, {this.fullscreen = true}); PaginatedSearchState(this.filters);
final _key = GlobalKey<ScaffoldState>(); final _key = GlobalKey<ScaffoldState>();
@ -29,9 +29,6 @@ class PaginatedSearchState<T extends StatefulWidget> extends State<T> with BaseW
static const _pageSize = 25; 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 // Prefix for storing and loading pagination options
// Override in implementing class // Override in implementing class
String get prefix => "prefix_"; String get prefix => "prefix_";
@ -242,35 +239,16 @@ class PaginatedSearchState<T extends StatefulWidget> extends State<T> with BaseW
@override @override
Widget build (BuildContext context) { 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( return Column(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
PaginatedSearchWidget(searchController, updateSearchTerm, resultCount), buildSearchInput(context),
Expanded( Expanded(
child: CustomScrollView( child: CustomScrollView(
shrinkWrap: true, shrinkWrap: true,
physics: ClampingScrollPhysics(), physics: ClampingScrollPhysics(),
scrollDirection: Axis.vertical, scrollDirection: Axis.vertical,
slivers: <Widget>[ slivers: <Widget>[
// TODO - Search input
PagedSliverList.separated( PagedSliverList.separated(
pagingController: _pagingController, pagingController: _pagingController,
builderDelegate: PagedChildBuilderDelegate<InvenTreeModel>( builderDelegate: PagedChildBuilderDelegate<InvenTreeModel>(
@ -290,64 +268,39 @@ class PaginatedSearchState<T extends StatefulWidget> extends State<T> with BaseW
); );
} }
@override /*
List<Widget> getAppBarActions(BuildContext context) { * Construct a search input text field for the user to enter a search term
List<Widget> actions = []; */
Widget buildSearchInput(BuildContext context) {
// 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) {
return ListTile( return ListTile(
leading: GestureDetector( leading: orderingOptions.isEmpty ? null : GestureDetector(
child: FaIcon(controller.text.isEmpty ? FontAwesomeIcons.search : FontAwesomeIcons.backspace), child: FaIcon(FontAwesomeIcons.sort),
onTap: () async {
_saveOrderingOptions(context);
},
),
trailing: GestureDetector(
child: FaIcon(searchController.text.isEmpty ? FontAwesomeIcons.search : FontAwesomeIcons.backspace),
onTap: () { onTap: () {
controller.clear(); searchController.clear();
onChanged(); updateSearchTerm();
}, },
), ),
title: TextFormField( title: TextFormField(
controller: controller, controller: searchController,
onChanged: (value) { onChanged: (value) {
onChanged(); updateSearchTerm();
}, },
decoration: InputDecoration( decoration: InputDecoration(
hintText: L10().search, hintText: L10().search,
helperText: resultCount.toString(),
), ),
), )
trailing: Text(
"${results}",
style: TextStyle(
fontWeight: FontWeight.bold,
fontStyle: FontStyle.italic
),
),
); );
} }
} }
class NoResultsWidget extends StatelessWidget { class NoResultsWidget extends StatelessWidget {
const NoResultsWidget(this.description); const NoResultsWidget(this.description);

View File

@ -354,9 +354,7 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute( MaterialPageRoute(
builder: (context) => PaginatedBomList({ builder: (context) => BillOfMaterialsWidget(part)
"part": part.pk.toString(),
})
) )
); );
} }