diff --git a/lib/inventree/model.dart b/lib/inventree/model.dart index 35c0e756..ee2d58d6 100644 --- a/lib/inventree/model.dart +++ b/lib/inventree/model.dart @@ -23,8 +23,31 @@ class InvenTreeModel { // Override the endpoint URL for each subclass String URL = ""; + // Override the web URL for each subclass + // Note: If the WEB_URL is the same (except for /api/) as URL then just leave blank + String WEB_URL = ""; + String NAME = "Model"; + String get webUrl { + + if (api.isConnected()) { + String web = InvenTreeAPI().baseUrl; + + web += WEB_URL.isNotEmpty ? WEB_URL : URL; + + web += "/${pk}/"; + + web = web.replaceAll("//", "/"); + + return web; + + } else { + return ""; + } + + } + // JSON data which defines this object Map jsondata = {}; @@ -58,6 +81,15 @@ class InvenTreeModel { // Legacy API provided external link as "URL", while newer API uses "link" String get link => jsondata['link'] ?? jsondata['URL'] ?? ''; + void goToInvenTreePage() async { + + if (await canLaunch(webUrl)) { + await launch(webUrl); + } else { + // TODO + } + } + void openLink() async { if (link.isNotEmpty) { diff --git a/lib/widget/part_detail.dart b/lib/widget/part_detail.dart index 5b60374d..ea5cc846 100644 --- a/lib/widget/part_detail.dart +++ b/lib/widget/part_detail.dart @@ -42,6 +42,10 @@ class _PartDisplayState extends RefreshableState { @override List getAppBarActions(BuildContext context) { return [ + IconButton( + icon: FaIcon(FontAwesomeIcons.globe), + onPressed: _openInvenTreePage, + ), // TODO: Hide the 'edit' button if the user does not have permission!! IconButton( icon: FaIcon(FontAwesomeIcons.edit), @@ -55,6 +59,10 @@ class _PartDisplayState extends RefreshableState { // TODO } + Future _openInvenTreePage() async { + part.goToInvenTreePage(); + } + InvenTreePart part; @override @@ -291,7 +299,7 @@ class _PartDisplayState extends RefreshableState { ListTile( title: Text("${part.link}"), leading: FaIcon(FontAwesomeIcons.link), - trailing: Text(""), + trailing: FaIcon(FontAwesomeIcons.externalLinkAlt), onTap: () { part.openLink(); }, diff --git a/lib/widget/stock_detail.dart b/lib/widget/stock_detail.dart index 61b1d500..9d7c01b2 100644 --- a/lib/widget/stock_detail.dart +++ b/lib/widget/stock_detail.dart @@ -55,6 +55,28 @@ class _StockItemDisplayState extends RefreshableState { _StockItemDisplayState(this.item) { } + @override + List getAppBarActions(BuildContext context) { + return [ + IconButton( + icon: FaIcon(FontAwesomeIcons.globe), + onPressed: _openInvenTreePage, + ), + // TODO: Hide the 'edit' button if the user does not have permission!! + /* + IconButton( + icon: FaIcon(FontAwesomeIcons.edit), + tooltip: I18N.of(context).edit, + onPressed: _editPartDialog, + ) + */ + ]; + } + + Future _openInvenTreePage() async { + item.goToInvenTreePage(); + } + // StockItem object final InvenTreeStockItem item;