2
0
mirror of https://github.com/inventree/inventree-app.git synced 2025-04-28 05:26:47 +00:00

Display part notes and stock notes

This commit is contained in:
Oliver Walters 2021-02-13 22:36:44 +11:00
parent b0aaccb9e3
commit 90664bfe14
10 changed files with 118 additions and 20 deletions

View File

@ -101,6 +101,9 @@ class InvenTreeStockItem extends InvenTreeModel {
@override
String URL = "stock/";
@override
String WEB_URL = "stock/item/";
@override
Map<String, String> defaultGetFilters() {

View File

@ -46,7 +46,7 @@ class _CategoryDisplayState extends RefreshableState<CategoryDisplayWidget> {
onPressed: () {
showSearch(
context: context,
delegate: PartSearchDelegate(filters: {"category": "${category.pk}"})
delegate: PartSearchDelegate(context, filters: {"category": "${category.pk}"})
);
}
),

View File

@ -39,7 +39,7 @@ class InvenTreeDrawer extends StatelessWidget {
showSearch(
context: context,
delegate: PartSearchDelegate()
delegate: PartSearchDelegate(context)
);
//Navigator.push(context, MaterialPageRoute(builder: (context) => SearchWidget()));
@ -115,9 +115,12 @@ class InvenTreeDrawer extends StatelessWidget {
leading: Image.asset(
"assets/image/icon.png",
fit: BoxFit.scaleDown,
width: 40,
width: 30,
),
title: Text(
I18N.of(context).appTitle,
style: TextStyle(fontWeight: FontWeight.bold),
),
title: Text(I18N.of(context).appTitle),
onTap: _home,
),
ListTile(

View File

@ -46,7 +46,7 @@ class _InvenTreeHomePageState extends State<InvenTreeHomePage> {
showSearch(
context: context,
delegate: PartSearchDelegate()
delegate: PartSearchDelegate(context)
);
}
@ -55,7 +55,7 @@ class _InvenTreeHomePageState extends State<InvenTreeHomePage> {
showSearch(
context: context,
delegate: StockSearchDelegate()
delegate: StockSearchDelegate(context)
);
}

View File

@ -45,7 +45,7 @@ class _LocationDisplayState extends RefreshableState<LocationDisplayWidget> {
onPressed: () {
showSearch(
context: context,
delegate: StockSearchDelegate(filters: {"location": "${location.pk}"})
delegate: StockSearchDelegate(context, filters: {"location": "${location.pk}"})
);
}
),

View File

@ -1,6 +1,7 @@
import 'dart:io';
import 'package:InvenTree/inventree/stock.dart';
import 'package:InvenTree/widget/part_notes.dart';
import 'package:InvenTree/widget/progress.dart';
import 'package:InvenTree/widget/snacks.dart';
import 'package:InvenTree/widget/stock_detail.dart';
@ -9,8 +10,6 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:InvenTree/inventree/part.dart';
import 'package:InvenTree/widget/full_screen_image.dart';
@ -20,6 +19,7 @@ import 'package:InvenTree/widget/fields.dart';
import 'package:InvenTree/api.dart';
import 'package:InvenTree/widget/refreshable_state.dart';
class PartDetailWidget extends StatefulWidget {
PartDetailWidget(this.part, {Key key}) : super(key: key);
@ -325,7 +325,13 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
title: Text("Notes"),
leading: FaIcon(FontAwesomeIcons.stickyNote),
trailing: Text(""),
onTap: null,
onTap: () {
print("Hello");
Navigator.push(
context,
MaterialPageRoute(builder: (context) => PartNotesWidget(part))
);
},
)
);
}

View File

@ -0,0 +1,39 @@
import 'package:InvenTree/inventree/part.dart';
import 'package:InvenTree/widget/refreshable_state.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class PartNotesWidget extends StatefulWidget {
final InvenTreePart part;
PartNotesWidget(this.part, {Key key}) : super(key: key);
@override
_PartNotesState createState() => _PartNotesState(part);
}
class _PartNotesState extends RefreshableState<PartNotesWidget> {
final InvenTreePart part;
_PartNotesState(this.part);
@override
String getAppBarTitle(BuildContext context) => I18N.of(context).partNotes;
@override
Widget getBody(BuildContext context) {
return Markdown(
selectable: false,
data: part.notes,
);
}
}

View File

@ -1,13 +1,11 @@
import 'package:InvenTree/widget/part_detail.dart';
import 'package:InvenTree/widget/progress.dart';
import 'package:InvenTree/widget/snacks.dart';
import 'package:InvenTree/widget/stock_detail.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:InvenTree/widget/refreshable_state.dart';
import 'package:InvenTree/inventree/part.dart';
import 'package:InvenTree/inventree/stock.dart';
@ -19,17 +17,22 @@ class PartSearchDelegate extends SearchDelegate<InvenTreePart> {
final key = GlobalKey<ScaffoldState>();
BuildContext context;
bool _searching = false;
// Custom filters for the part search
Map<String, String> filters = {};
PartSearchDelegate({this.filters}) {
PartSearchDelegate(this.context, {this.filters}) {
if (filters == null) {
filters = {};
}
}
@override
String get searchFieldLabel => I18N.of(context).searchParts;
// List of part results
List<InvenTreePart> partResults = [];
@ -184,17 +187,22 @@ class StockSearchDelegate extends SearchDelegate<InvenTreeStockItem> {
final key = GlobalKey<ScaffoldState>();
final BuildContext context;
bool _searching = false;
// Custom filters for the stock item search
Map<String, String> filters;
StockSearchDelegate({this.filters}) {
StockSearchDelegate(this.context, {this.filters}) {
if (filters == null) {
filters = {};
}
}
@override
String get searchFieldLabel => I18N.of(context).searchStock;
// List of StockItem results
List<InvenTreeStockItem> itemResults = [];

View File

@ -12,6 +12,7 @@ import 'package:InvenTree/widget/progress.dart';
import 'package:InvenTree/widget/refreshable_state.dart';
import 'package:InvenTree/widget/snacks.dart';
import 'package:InvenTree/widget/stock_item_test_results.dart';
import 'package:InvenTree/widget/stock_notes.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
@ -19,13 +20,8 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:InvenTree/api.dart';
import 'package:InvenTree/widget/drawer.dart';
import 'package:InvenTree/widget/refreshable_state.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:flutter/services.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:http/http.dart';
class StockDetailWidget extends StatefulWidget {
@ -429,7 +425,7 @@ class _StockItemDisplayState extends RefreshableState<StockDetailWidget> {
);
}
// Stocktake?
// Supplier part?
// TODO: Display supplier part info page?
@ -499,6 +495,10 @@ class _StockItemDisplayState extends RefreshableState<StockDetailWidget> {
leading: FaIcon(FontAwesomeIcons.stickyNote),
trailing: Text(""),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => StockNotesWidget(item))
);
// TODO: Load notes in markdown viewer widget
// TODO: Make this widget editable?
}

View File

@ -0,0 +1,39 @@
import 'package:InvenTree/inventree/stock.dart';
import 'package:InvenTree/widget/refreshable_state.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class StockNotesWidget extends StatefulWidget {
final InvenTreeStockItem item;
StockNotesWidget(this.item, {Key key}) : super(key: key);
@override
_StockNotesState createState() => _StockNotesState(item);
}
class _StockNotesState extends RefreshableState<StockNotesWidget> {
final InvenTreeStockItem item;
_StockNotesState(this.item);
@override
String getAppBarTitle(BuildContext context) => I18N.of(context).stockItemNotes;
@override
Widget getBody(BuildContext context) {
return Markdown(
selectable: false,
data: item.notes,
);
}
}