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";
|
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 {
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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(),
|
|
||||||
})
|
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user