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:
parent
7301243ed6
commit
6d247f426c
@ -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)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user