mirror of
https://github.com/inventree/inventree-app.git
synced 2025-04-28 13:36:50 +00:00
Display part notes and stock notes
This commit is contained in:
parent
b0aaccb9e3
commit
90664bfe14
@ -101,6 +101,9 @@ class InvenTreeStockItem extends InvenTreeModel {
|
|||||||
@override
|
@override
|
||||||
String URL = "stock/";
|
String URL = "stock/";
|
||||||
|
|
||||||
|
@override
|
||||||
|
String WEB_URL = "stock/item/";
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Map<String, String> defaultGetFilters() {
|
Map<String, String> defaultGetFilters() {
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ class _CategoryDisplayState extends RefreshableState<CategoryDisplayWidget> {
|
|||||||
onPressed: () {
|
onPressed: () {
|
||||||
showSearch(
|
showSearch(
|
||||||
context: context,
|
context: context,
|
||||||
delegate: PartSearchDelegate(filters: {"category": "${category.pk}"})
|
delegate: PartSearchDelegate(context, filters: {"category": "${category.pk}"})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
|
@ -39,7 +39,7 @@ class InvenTreeDrawer extends StatelessWidget {
|
|||||||
|
|
||||||
showSearch(
|
showSearch(
|
||||||
context: context,
|
context: context,
|
||||||
delegate: PartSearchDelegate()
|
delegate: PartSearchDelegate(context)
|
||||||
);
|
);
|
||||||
|
|
||||||
//Navigator.push(context, MaterialPageRoute(builder: (context) => SearchWidget()));
|
//Navigator.push(context, MaterialPageRoute(builder: (context) => SearchWidget()));
|
||||||
@ -115,9 +115,12 @@ class InvenTreeDrawer extends StatelessWidget {
|
|||||||
leading: Image.asset(
|
leading: Image.asset(
|
||||||
"assets/image/icon.png",
|
"assets/image/icon.png",
|
||||||
fit: BoxFit.scaleDown,
|
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,
|
onTap: _home,
|
||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
|
@ -46,7 +46,7 @@ class _InvenTreeHomePageState extends State<InvenTreeHomePage> {
|
|||||||
|
|
||||||
showSearch(
|
showSearch(
|
||||||
context: context,
|
context: context,
|
||||||
delegate: PartSearchDelegate()
|
delegate: PartSearchDelegate(context)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ class _InvenTreeHomePageState extends State<InvenTreeHomePage> {
|
|||||||
|
|
||||||
showSearch(
|
showSearch(
|
||||||
context: context,
|
context: context,
|
||||||
delegate: StockSearchDelegate()
|
delegate: StockSearchDelegate(context)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ class _LocationDisplayState extends RefreshableState<LocationDisplayWidget> {
|
|||||||
onPressed: () {
|
onPressed: () {
|
||||||
showSearch(
|
showSearch(
|
||||||
context: context,
|
context: context,
|
||||||
delegate: StockSearchDelegate(filters: {"location": "${location.pk}"})
|
delegate: StockSearchDelegate(context, filters: {"location": "${location.pk}"})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:InvenTree/inventree/stock.dart';
|
import 'package:InvenTree/inventree/stock.dart';
|
||||||
|
import 'package:InvenTree/widget/part_notes.dart';
|
||||||
import 'package:InvenTree/widget/progress.dart';
|
import 'package:InvenTree/widget/progress.dart';
|
||||||
import 'package:InvenTree/widget/snacks.dart';
|
import 'package:InvenTree/widget/snacks.dart';
|
||||||
import 'package:InvenTree/widget/stock_detail.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/material.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
import 'package:font_awesome_flutter/font_awesome_flutter.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/inventree/part.dart';
|
||||||
import 'package:InvenTree/widget/full_screen_image.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/api.dart';
|
||||||
import 'package:InvenTree/widget/refreshable_state.dart';
|
import 'package:InvenTree/widget/refreshable_state.dart';
|
||||||
|
|
||||||
|
|
||||||
class PartDetailWidget extends StatefulWidget {
|
class PartDetailWidget extends StatefulWidget {
|
||||||
|
|
||||||
PartDetailWidget(this.part, {Key key}) : super(key: key);
|
PartDetailWidget(this.part, {Key key}) : super(key: key);
|
||||||
@ -325,7 +325,13 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
|
|||||||
title: Text("Notes"),
|
title: Text("Notes"),
|
||||||
leading: FaIcon(FontAwesomeIcons.stickyNote),
|
leading: FaIcon(FontAwesomeIcons.stickyNote),
|
||||||
trailing: Text(""),
|
trailing: Text(""),
|
||||||
onTap: null,
|
onTap: () {
|
||||||
|
print("Hello");
|
||||||
|
Navigator.push(
|
||||||
|
context,
|
||||||
|
MaterialPageRoute(builder: (context) => PartNotesWidget(part))
|
||||||
|
);
|
||||||
|
},
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
39
lib/widget/part_notes.dart
Normal file
39
lib/widget/part_notes.dart
Normal 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,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,13 +1,11 @@
|
|||||||
|
|
||||||
import 'package:InvenTree/widget/part_detail.dart';
|
import 'package:InvenTree/widget/part_detail.dart';
|
||||||
import 'package:InvenTree/widget/progress.dart';
|
import 'package:InvenTree/widget/progress.dart';
|
||||||
import 'package:InvenTree/widget/snacks.dart';
|
|
||||||
import 'package:InvenTree/widget/stock_detail.dart';
|
import 'package:InvenTree/widget/stock_detail.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/app_localizations.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/part.dart';
|
||||||
import 'package:InvenTree/inventree/stock.dart';
|
import 'package:InvenTree/inventree/stock.dart';
|
||||||
|
|
||||||
@ -19,17 +17,22 @@ class PartSearchDelegate extends SearchDelegate<InvenTreePart> {
|
|||||||
|
|
||||||
final key = GlobalKey<ScaffoldState>();
|
final key = GlobalKey<ScaffoldState>();
|
||||||
|
|
||||||
|
BuildContext context;
|
||||||
|
|
||||||
bool _searching = false;
|
bool _searching = false;
|
||||||
|
|
||||||
// Custom filters for the part search
|
// Custom filters for the part search
|
||||||
Map<String, String> filters = {};
|
Map<String, String> filters = {};
|
||||||
|
|
||||||
PartSearchDelegate({this.filters}) {
|
PartSearchDelegate(this.context, {this.filters}) {
|
||||||
if (filters == null) {
|
if (filters == null) {
|
||||||
filters = {};
|
filters = {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get searchFieldLabel => I18N.of(context).searchParts;
|
||||||
|
|
||||||
// List of part results
|
// List of part results
|
||||||
List<InvenTreePart> partResults = [];
|
List<InvenTreePart> partResults = [];
|
||||||
|
|
||||||
@ -184,17 +187,22 @@ class StockSearchDelegate extends SearchDelegate<InvenTreeStockItem> {
|
|||||||
|
|
||||||
final key = GlobalKey<ScaffoldState>();
|
final key = GlobalKey<ScaffoldState>();
|
||||||
|
|
||||||
|
final BuildContext context;
|
||||||
|
|
||||||
bool _searching = false;
|
bool _searching = false;
|
||||||
|
|
||||||
// Custom filters for the stock item search
|
// Custom filters for the stock item search
|
||||||
Map<String, String> filters;
|
Map<String, String> filters;
|
||||||
|
|
||||||
StockSearchDelegate({this.filters}) {
|
StockSearchDelegate(this.context, {this.filters}) {
|
||||||
if (filters == null) {
|
if (filters == null) {
|
||||||
filters = {};
|
filters = {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get searchFieldLabel => I18N.of(context).searchStock;
|
||||||
|
|
||||||
// List of StockItem results
|
// List of StockItem results
|
||||||
List<InvenTreeStockItem> itemResults = [];
|
List<InvenTreeStockItem> itemResults = [];
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@ import 'package:InvenTree/widget/progress.dart';
|
|||||||
import 'package:InvenTree/widget/refreshable_state.dart';
|
import 'package:InvenTree/widget/refreshable_state.dart';
|
||||||
import 'package:InvenTree/widget/snacks.dart';
|
import 'package:InvenTree/widget/snacks.dart';
|
||||||
import 'package:InvenTree/widget/stock_item_test_results.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/cupertino.dart';
|
||||||
import 'package:flutter/material.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/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_typeahead/flutter_typeahead.dart';
|
||||||
import 'package:flutter/services.dart';
|
|
||||||
import 'package:font_awesome_flutter/font_awesome_flutter.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 {
|
class StockDetailWidget extends StatefulWidget {
|
||||||
|
|
||||||
@ -429,7 +425,7 @@ class _StockItemDisplayState extends RefreshableState<StockDetailWidget> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Stocktake?
|
||||||
|
|
||||||
// Supplier part?
|
// Supplier part?
|
||||||
// TODO: Display supplier part info page?
|
// TODO: Display supplier part info page?
|
||||||
@ -499,6 +495,10 @@ class _StockItemDisplayState extends RefreshableState<StockDetailWidget> {
|
|||||||
leading: FaIcon(FontAwesomeIcons.stickyNote),
|
leading: FaIcon(FontAwesomeIcons.stickyNote),
|
||||||
trailing: Text(""),
|
trailing: Text(""),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
|
Navigator.push(
|
||||||
|
context,
|
||||||
|
MaterialPageRoute(builder: (context) => StockNotesWidget(item))
|
||||||
|
);
|
||||||
// TODO: Load notes in markdown viewer widget
|
// TODO: Load notes in markdown viewer widget
|
||||||
// TODO: Make this widget editable?
|
// TODO: Make this widget editable?
|
||||||
}
|
}
|
||||||
|
39
lib/widget/stock_notes.dart
Normal file
39
lib/widget/stock_notes.dart
Normal 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,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user