2
0
mirror of https://github.com/inventree/inventree-app.git synced 2025-05-02 07:26:50 +00:00

Add "starred parts" to home screen

This commit is contained in:
Oliver Walters 2021-02-12 23:48:50 +11:00
parent e53170ed7e
commit ddafed1fe6
5 changed files with 130 additions and 10 deletions

View File

@ -299,6 +299,15 @@ class InvenTreePart extends InvenTreeModel {
return img.isNotEmpty ? img : InvenTreeAPI.staticThumb;
}
// Return the "starred" status of this part
bool get starred => jsondata['starred'] as bool ?? false;
// Toggle the starred status
Future<void> setStarred(BuildContext context, bool status) async {
// TODO - Toggle the "starred" status of the part using the API
return;
}
InvenTreePart() : super();
InvenTreePart.fromJson(Map<String, dynamic> json) : super.fromJson(json) {

View File

@ -1,4 +1,5 @@
import 'package:InvenTree/user_profile.dart';
import 'package:InvenTree/widget/starred_parts.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
@ -224,19 +225,17 @@ class _InvenTreeHomePageState extends State<InvenTreeHomePage> {
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
/*
Column(
children: <Widget>[
IconButton(
icon: new FaIcon(FontAwesomeIcons.search),
tooltip: 'Search',
tooltip: I18N.of(context).search,
onPressed: _search,
),
Text("Search"),
Text(I18N.of(context).search),
],
),
*/
Column(
children: <Widget>[
IconButton(
@ -263,6 +262,17 @@ class _InvenTreeHomePageState extends State<InvenTreeHomePage> {
Text(I18N.of(context).parts),
],
),
Column(
children: <Widget>[
IconButton(
icon: FaIcon(FontAwesomeIcons.solidStar),
onPressed: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => StarredPartWidget()));
},
),
Text("Starred Parts"),
]
),
Column(
children: <Widget>[
IconButton(

View File

@ -73,6 +73,11 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
await part.getTestTemplates(context);
}
void _toggleStar() async {
await part.setStarred(context, !part.starred);
refresh();
}
void _savePart(Map<String, String> values) async {
final bool result = await part.update(context, values: values);
@ -145,6 +150,10 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
child: ListTile(
title: Text("${part.fullname}"),
subtitle: Text("${part.description}"),
trailing: IconButton(
icon: FaIcon(part.starred ? FontAwesomeIcons.solidStar : FontAwesomeIcons.star),
onPressed: null, // TODO: _toggleStar,
),
leading: GestureDetector(
child: InvenTreeAPI().getImage(part.thumbnail),
onTap: () {

View File

@ -61,12 +61,6 @@ class PartSearchDelegate extends SearchDelegate<InvenTreePart> {
@override
List<Widget> buildActions(BuildContext context) {
return [
IconButton(
icon: FaIcon(FontAwesomeIcons.search),
onPressed: () {
search(context);
}
),
IconButton(
icon: FaIcon(FontAwesomeIcons.backspace),
onPressed: () {
@ -74,6 +68,12 @@ class PartSearchDelegate extends SearchDelegate<InvenTreePart> {
search(context);
},
),
IconButton(
icon: FaIcon(FontAwesomeIcons.search),
onPressed: () {
search(context);
}
),
];
}

View File

@ -0,0 +1,92 @@
import 'package:InvenTree/inventree/part.dart';
import 'package:InvenTree/widget/part_detail.dart';
import 'package:InvenTree/widget/progress.dart';
import 'package:InvenTree/widget/refreshable_state.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import '../api.dart';
class StarredPartWidget extends StatefulWidget {
StarredPartWidget({Key key}) : super(key: key);
@override
_StarredPartState createState() => _StarredPartState();
}
class _StarredPartState extends RefreshableState<StarredPartWidget> {
List<InvenTreePart> starredParts = [];
@override
String getAppBarTitle(BuildContext context) => "Starred Parts";
@override
Future<void> request(BuildContext context) async {
final parts = await InvenTreePart().list(context, filters: {"starred": "true"});
starredParts.clear();
for (int idx = 0; idx < parts.length; idx++) {
if (parts[idx] is InvenTreePart) {
starredParts.add(parts[idx]);
}
}
}
Widget _partResult(BuildContext context, int index) {
final part = starredParts[index];
return ListTile(
title: Text(part.fullname),
subtitle: Text(part.description),
leading: InvenTreeAPI().getImage(
part.thumbnail,
width: 40,
height: 40
),
onTap: () {
InvenTreePart().get(context, part.pk).then((var prt) {
if (prt is InvenTreePart) {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => PartDetailWidget(prt))
);
}
});
}
);
}
@override
Widget getBody(BuildContext context) {
if (loading) {
return progressIndicator();
}
if (starredParts.length == 0) {
return ListView(
children: [
ListTile(
title: Text("No Parts"),
subtitle: Text("No starred parts available")
)
],
);
}
return ListView.separated(
itemCount: starredParts.length,
itemBuilder: _partResult,
separatorBuilder: (_, __) => const Divider(height: 3),
physics: ClampingScrollPhysics(),
);
}
}