From 19fdac46a7397c9a2cdb62e7d197cca963923389 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Wed, 11 Dec 2024 21:33:06 +1100 Subject: [PATCH 01/12] Pre-fill the "location" field when receiving an item --- ios/Runner.xcodeproj/project.pbxproj | 8 ++++---- lib/inventree/purchase_order.dart | 12 ++++-------- lib/widget/order/po_line_detail.dart | 11 +++++++++++ 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 3a6f42d2..bda4a2a4 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -272,7 +272,6 @@ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", "${BUILT_PRODUCTS_DIR}/DKImagePickerController/DKImagePickerController.framework", "${BUILT_PRODUCTS_DIR}/DKPhotoGallery/DKPhotoGallery.framework", - "${BUILT_PRODUCTS_DIR}/MTBBarcodeScanner/MTBBarcodeScanner.framework", "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework", "${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework", "${BUILT_PRODUCTS_DIR}/SwiftyGif/SwiftyGif.framework", @@ -280,21 +279,21 @@ "${BUILT_PRODUCTS_DIR}/camera_avfoundation/camera_avfoundation.framework", "${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework", "${BUILT_PRODUCTS_DIR}/file_picker/file_picker.framework", + "${BUILT_PRODUCTS_DIR}/flutter_zxing/flutter_zxing.framework", "${BUILT_PRODUCTS_DIR}/image_picker_ios/image_picker_ios.framework", "${BUILT_PRODUCTS_DIR}/open_filex/open_filex.framework", "${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework", "${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework", - "${BUILT_PRODUCTS_DIR}/qr_code_scanner/qr_code_scanner.framework", "${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework", "${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework", "${BUILT_PRODUCTS_DIR}/sqflite/sqflite.framework", "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework", + "${BUILT_PRODUCTS_DIR}/wakelock_plus/wakelock_plus.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DKImagePickerController.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DKPhotoGallery.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MTBBarcodeScanner.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Sentry.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyGif.framework", @@ -302,15 +301,16 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/camera_avfoundation.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info_plus.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/file_picker.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_zxing.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/image_picker_ios.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/open_filex.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/package_info_plus.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_foundation.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/qr_code_scanner.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sentry_flutter.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences_foundation.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqflite.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher_ios.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/wakelock_plus.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; diff --git a/lib/inventree/purchase_order.dart b/lib/inventree/purchase_order.dart index b224458d..ba19a30a 100644 --- a/lib/inventree/purchase_order.dart +++ b/lib/inventree/purchase_order.dart @@ -178,16 +178,10 @@ class InvenTreePOLineItem extends InvenTreeOrderLine { } @override - Map defaultGetFilters() { - return { - "part_detail": "true", - }; - } - - @override - Map defaultListFilters() { + Map defaultFilters() { return { "part_detail": "true", + "order_detail": "true", }; } @@ -228,6 +222,8 @@ class InvenTreePOLineItem extends InvenTreeOrderLine { int get destinationId => getInt("destination"); + Map get orderDetail => getMap("order_detail"); + Map get destinationDetail => getMap("destination_detail"); } diff --git a/lib/widget/order/po_line_detail.dart b/lib/widget/order/po_line_detail.dart index 9dc178fc..4482a942 100644 --- a/lib/widget/order/po_line_detail.dart +++ b/lib/widget/order/po_line_detail.dart @@ -133,6 +133,13 @@ class _POLineDetailWidgetState extends RefreshableState { // Launch a form to 'receive' this line item Future receiveLineItem(BuildContext context) async { + // Pre-fill the "destination" to receive into + int destination = widget.item.destinationId; + + if (destination < 0) { + destination = (widget.item.orderDetail["destination"] ?? -1) as int; + } + // Construct fields to receive Map fields = { "line_item": { @@ -164,6 +171,10 @@ class _POLineDetailWidgetState extends RefreshableState { } }; + if (destination > 0) { + fields["location"]?["value"] = destination; + } + showLoadingOverlay(context); var order = await InvenTreePurchaseOrder().get(widget.item.orderId); hideLoadingOverlay(); From d5a9f4310e6168def43da8d38eaf92874a83685b Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Wed, 11 Dec 2024 21:35:56 +1100 Subject: [PATCH 02/12] Refactoring --- lib/inventree/bom.dart | 9 +-------- lib/inventree/company.dart | 12 ++---------- lib/inventree/part.dart | 11 ++--------- lib/inventree/purchase_order.dart | 9 +-------- lib/inventree/sales_order.dart | 18 ++---------------- lib/inventree/stock.dart | 12 +----------- 6 files changed, 9 insertions(+), 62 deletions(-) diff --git a/lib/inventree/bom.dart b/lib/inventree/bom.dart index cf708c6f..8019ecf0 100644 --- a/lib/inventree/bom.dart +++ b/lib/inventree/bom.dart @@ -18,7 +18,7 @@ class InvenTreeBomItem extends InvenTreeModel { String get URL => "bom/"; @override - Map defaultListFilters() { + Map defaultFilters() { return { "sub_part_detail": "true", "part_detail": "true", @@ -26,13 +26,6 @@ class InvenTreeBomItem extends InvenTreeModel { }; } - @override - Map defaultGetFilters() { - return { - "sub_part_detail": "true", - }; - } - // Extract the 'reference' value associated with this BomItem String get reference => getString("reference"); diff --git a/lib/inventree/company.dart b/lib/inventree/company.dart index b9ac2142..3c3ac6a0 100644 --- a/lib/inventree/company.dart +++ b/lib/inventree/company.dart @@ -155,7 +155,8 @@ class InvenTreeSupplierPart extends InvenTreeModel { return fields; } - Map _filters() { + @override + Map defaultFilters() { return { "manufacturer_detail": "true", "supplier_detail": "true", @@ -163,15 +164,6 @@ class InvenTreeSupplierPart extends InvenTreeModel { }; } - @override - Map defaultListFilters() { - return _filters(); - } - - @override - Map defaultGetFilters() { - return _filters(); - } int get manufacturerId => getInt("pk", subKey: "manufacturer_detail"); diff --git a/lib/inventree/part.dart b/lib/inventree/part.dart index 11023931..103fa58c 100644 --- a/lib/inventree/part.dart +++ b/lib/inventree/part.dart @@ -227,16 +227,9 @@ class InvenTreePart extends InvenTreeModel { } @override - Map defaultListFilters() { + Map defaultFilters() { return { - "location_detail": "true", - }; - } - - @override - Map defaultGetFilters() { - return { - "category_detail": "true", // Include category detail information + "category_detail": "true", }; } diff --git a/lib/inventree/purchase_order.dart b/lib/inventree/purchase_order.dart index ba19a30a..f57dd135 100644 --- a/lib/inventree/purchase_order.dart +++ b/lib/inventree/purchase_order.dart @@ -64,14 +64,7 @@ class InvenTreePurchaseOrder extends InvenTreeOrder { } @override - Map defaultGetFilters() { - return { - "supplier_detail": "true", - }; - } - - @override - Map defaultListFilters() { + Map defaultFilters() { return { "supplier_detail": "true", }; diff --git a/lib/inventree/sales_order.dart b/lib/inventree/sales_order.dart index 5bdd4849..b1ee37fb 100644 --- a/lib/inventree/sales_order.dart +++ b/lib/inventree/sales_order.dart @@ -65,14 +65,7 @@ class InvenTreeSalesOrder extends InvenTreeOrder { } @override - Map defaultGetFilters() { - return { - "customer_detail": "true", - }; - } - - @override - Map defaultListFilters() { + Map defaultFilters() { return { "customer_detail": "true", }; @@ -180,14 +173,7 @@ class InvenTreeSOLineItem extends InvenTreeOrderLine { } @override - Map defaultGetFilters() { - return { - "part_detail": "true", - }; - } - - @override - Map defaultListFilters() { + Map defaultFilters() { return { "part_detail": "true", }; diff --git a/lib/inventree/stock.dart b/lib/inventree/stock.dart index df158031..7b03d18d 100644 --- a/lib/inventree/stock.dart +++ b/lib/inventree/stock.dart @@ -253,7 +253,7 @@ class InvenTreeStockItem extends InvenTreeModel { } @override - Map defaultGetFilters() { + Map defaultFilters() { return { "part_detail": "true", @@ -263,16 +263,6 @@ class InvenTreeStockItem extends InvenTreeModel { }; } - @override - Map defaultListFilters() { - - return { - "part_detail": "true", - "location_detail": "true", - "supplier_detail": "true", - }; - } - List testTemplates = []; int get testTemplateCount => testTemplates.length; From e44d1ea5b4c4f4d90caacdd579e35de9ee3fc3aa Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Wed, 11 Dec 2024 21:45:43 +1100 Subject: [PATCH 03/12] Refactor loading overlay --- lib/api_form.dart | 6 +++--- lib/barcode/controller.dart | 2 +- lib/inventree/purchase_order.dart | 5 +++++ lib/inventree/sales_order.dart | 5 +++++ lib/labels.dart | 2 +- lib/settings/app_settings.dart | 2 +- lib/settings/login.dart | 2 +- lib/widget/attachment_widget.dart | 4 ++-- lib/widget/company/supplier_part_detail.dart | 6 +++--- lib/widget/order/po_line_detail.dart | 6 +++--- lib/widget/order/po_line_list.dart | 2 +- lib/widget/order/purchase_order_detail.dart | 4 ++-- lib/widget/order/sales_order_detail.dart | 2 +- lib/widget/order/so_line_detail.dart | 2 +- lib/widget/order/so_line_list.dart | 2 +- lib/widget/part/bom_list.dart | 2 +- lib/widget/part/category_display.dart | 2 +- lib/widget/part/part_detail.dart | 4 ++-- lib/widget/part/part_parameter_widget.dart | 2 +- lib/widget/progress.dart | 5 ++++- lib/widget/stock/location_display.dart | 2 +- lib/widget/stock/stock_detail.dart | 6 +++--- 22 files changed, 44 insertions(+), 31 deletions(-) diff --git a/lib/api_form.dart b/lib/api_form.dart index 432e49cc..f8e335d9 100644 --- a/lib/api_form.dart +++ b/lib/api_form.dart @@ -977,7 +977,7 @@ Future launchApiForm( IconData icon = TablerIcons.device_floppy }) async { - showLoadingOverlay(context); + showLoadingOverlay(); // List of fields defined by the server Map serverFields = {}; @@ -1229,7 +1229,7 @@ class _APIFormWidgetState extends State { if (widget.method == "POST") { - showLoadingOverlay(context); + showLoadingOverlay(); final response = await InvenTreeAPI().post( widget.url, body: data, @@ -1240,7 +1240,7 @@ class _APIFormWidgetState extends State { return response; } else { - showLoadingOverlay(context); + showLoadingOverlay(); final response = await InvenTreeAPI().patch( widget.url, body: data, diff --git a/lib/barcode/controller.dart b/lib/barcode/controller.dart index 559bac9a..7a1fb1f8 100644 --- a/lib/barcode/controller.dart +++ b/lib/barcode/controller.dart @@ -65,7 +65,7 @@ class InvenTreeBarcodeControllerState extends State context = OneContext.hasContext ? OneContext().context : null; } - showLoadingOverlay(context); + showLoadingOverlay(); await pauseScan(); await widget.handler.processBarcode(data); diff --git a/lib/inventree/purchase_order.dart b/lib/inventree/purchase_order.dart index f57dd135..82cb0f34 100644 --- a/lib/inventree/purchase_order.dart +++ b/lib/inventree/purchase_order.dart @@ -3,6 +3,7 @@ import "package:inventree/helpers.dart"; import "package:inventree/inventree/company.dart"; import "package:inventree/inventree/model.dart"; import "package:inventree/inventree/orders.dart"; +import "package:inventree/widget/progress.dart"; /* @@ -121,7 +122,9 @@ class InvenTreePurchaseOrder extends InvenTreeOrder { return; } + showLoadingOverlay(); await api.post("${url}issue/", expectedStatusCode: 201); + hideLoadingOverlay(); } /// Mark this order as "cancelled" @@ -130,7 +133,9 @@ class InvenTreePurchaseOrder extends InvenTreeOrder { return; } + showLoadingOverlay(); await api.post("${url}cancel/", expectedStatusCode: 201); + hideLoadingOverlay(); } } diff --git a/lib/inventree/sales_order.dart b/lib/inventree/sales_order.dart index b1ee37fb..9acc374b 100644 --- a/lib/inventree/sales_order.dart +++ b/lib/inventree/sales_order.dart @@ -6,6 +6,7 @@ import "package:inventree/inventree/model.dart"; import "package:inventree/inventree/orders.dart"; import "package:inventree/api.dart"; +import "package:inventree/widget/progress.dart"; /* @@ -76,7 +77,9 @@ class InvenTreeSalesOrder extends InvenTreeOrder { return; } + showLoadingOverlay(); await api.post("${url}issue/", expectedStatusCode: 201); + hideLoadingOverlay(); } /// Mark this order as "cancelled" @@ -85,7 +88,9 @@ class InvenTreeSalesOrder extends InvenTreeOrder { return; } + showLoadingOverlay(); await api.post("${url}cancel/", expectedStatusCode: 201); + hideLoadingOverlay(); } int get customerId => getInt("customer"); diff --git a/lib/labels.dart b/lib/labels.dart index 4d053bad..1e15bd4a 100644 --- a/lib/labels.dart +++ b/lib/labels.dart @@ -98,7 +98,7 @@ Future selectAndPrintLabel( if (labelId != -1 && pluginKey != null) { - showLoadingOverlay(context); + showLoadingOverlay(); if (InvenTreeAPI().supportsModernLabelPrinting) { diff --git a/lib/settings/app_settings.dart b/lib/settings/app_settings.dart index 7b6b08de..8eba55bd 100644 --- a/lib/settings/app_settings.dart +++ b/lib/settings/app_settings.dart @@ -50,7 +50,7 @@ class _InvenTreeAppSettingsState extends State { Future loadSettings(BuildContext context) async { - showLoadingOverlay(context); + showLoadingOverlay(); barcodeSounds = await InvenTreeSettingsManager().getValue(INV_SOUNDS_BARCODE, true) as bool; serverSounds = await InvenTreeSettingsManager().getValue(INV_SOUNDS_SERVER, true) as bool; diff --git a/lib/settings/login.dart b/lib/settings/login.dart index d580b1d1..908d09a5 100644 --- a/lib/settings/login.dart +++ b/lib/settings/login.dart @@ -50,7 +50,7 @@ class _InvenTreeLoginState extends State { currentFocus.unfocus(); } - showLoadingOverlay(context); + showLoadingOverlay(); // Attempt login final response = await InvenTreeAPI().fetchToken(widget.profile, username, password); diff --git a/lib/widget/attachment_widget.dart b/lib/widget/attachment_widget.dart index ab9c61c2..42f3e84c 100644 --- a/lib/widget/attachment_widget.dart +++ b/lib/widget/attachment_widget.dart @@ -79,7 +79,7 @@ class _AttachmentWidgetState extends RefreshableState { if (file == null) return; - showLoadingOverlay(context); + showLoadingOverlay(); final bool result = await widget.attachmentClass.uploadAttachment( file, @@ -178,7 +178,7 @@ class _AttachmentWidgetState extends RefreshableState { subtitle: Text(attachment.comment), leading: Icon(attachment.icon, color: COLOR_ACTION), onTap: () async { - showLoadingOverlay(context); + showLoadingOverlay(); await attachment.downloadAttachment(); hideLoadingOverlay(); }, diff --git a/lib/widget/company/supplier_part_detail.dart b/lib/widget/company/supplier_part_detail.dart index 2b6a9d4c..c6c50468 100644 --- a/lib/widget/company/supplier_part_detail.dart +++ b/lib/widget/company/supplier_part_detail.dart @@ -119,7 +119,7 @@ class _SupplierPartDisplayState extends RefreshableState { fields["location"]?["value"] = destination; } - showLoadingOverlay(context); + showLoadingOverlay(); var order = await InvenTreePurchaseOrder().get(widget.item.orderId); hideLoadingOverlay(); @@ -210,7 +210,7 @@ class _POLineDetailWidgetState extends RefreshableState { leading: Icon(TablerIcons.box, color: COLOR_ACTION), trailing: api.getThumbnail(widget.item.partImage), onTap: () async { - showLoadingOverlay(context); + showLoadingOverlay(); var part = await InvenTreePart().get(widget.item.partId); hideLoadingOverlay(); @@ -228,7 +228,7 @@ class _POLineDetailWidgetState extends RefreshableState { subtitle: Text(widget.item.SKU), leading: Icon(TablerIcons.building, color: COLOR_ACTION), onTap: () async { - showLoadingOverlay(context); + showLoadingOverlay(); var part = await InvenTreeSupplierPart().get(widget.item.supplierPartId); hideLoadingOverlay(); diff --git a/lib/widget/order/po_line_list.dart b/lib/widget/order/po_line_list.dart index e7f53d4b..94c0d92d 100644 --- a/lib/widget/order/po_line_list.dart +++ b/lib/widget/order/po_line_list.dart @@ -77,7 +77,7 @@ class _PaginatedPOLineListState extends PaginatedSearchState POLineDetailWidget(item))); diff --git a/lib/widget/order/purchase_order_detail.dart b/lib/widget/order/purchase_order_detail.dart index f4a45d07..297bc46a 100644 --- a/lib/widget/order/purchase_order_detail.dart +++ b/lib/widget/order/purchase_order_detail.dart @@ -185,7 +185,7 @@ class _PurchaseOrderDetailState extends RefreshableState { color: Colors.blue, acceptText: L10().issue, onAccept: () async { - await widget.order.issueOrder().then((dynamic) { + widget.order.issueOrder().then((dynamic) { refresh(context); }); } diff --git a/lib/widget/order/so_line_detail.dart b/lib/widget/order/so_line_detail.dart index c2d41817..9dcd218b 100644 --- a/lib/widget/order/so_line_detail.dart +++ b/lib/widget/order/so_line_detail.dart @@ -187,7 +187,7 @@ class _SOLineDetailWidgetState extends RefreshableState { leading: Icon(TablerIcons.box, color: COLOR_ACTION), trailing: api.getThumbnail(widget.item.partImage), onTap: () async { - showLoadingOverlay(context); + showLoadingOverlay(); var part = await InvenTreePart().get(widget.item.partId); hideLoadingOverlay(); diff --git a/lib/widget/order/so_line_list.dart b/lib/widget/order/so_line_list.dart index 11ba2273..a4c74548 100644 --- a/lib/widget/order/so_line_list.dart +++ b/lib/widget/order/so_line_list.dart @@ -65,7 +65,7 @@ class _PaginatedSOLineListState extends PaginatedSearchState { leading: InvenTreeAPI().getThumbnail(subPart?.thumbnail ?? ""), onTap: subPart == null ? null : () async { - showLoadingOverlay(context); + showLoadingOverlay(); var part = await InvenTreePart().get(subPart.pk); hideLoadingOverlay(); diff --git a/lib/widget/part/category_display.dart b/lib/widget/part/category_display.dart index bc7ab089..79dd6025 100644 --- a/lib/widget/part/category_display.dart +++ b/lib/widget/part/category_display.dart @@ -159,7 +159,7 @@ class _CategoryDisplayState extends RefreshableState { Navigator.push(context, MaterialPageRoute(builder: (context) => CategoryDisplayWidget(null))); } else { - showLoadingOverlay(context); + showLoadingOverlay(); var cat = await InvenTreePartCategory().get(parentId); hideLoadingOverlay(); diff --git a/lib/widget/part/part_detail.dart b/lib/widget/part/part_detail.dart index 4718e6eb..0e2f2ca6 100644 --- a/lib/widget/part/part_detail.dart +++ b/lib/widget/part/part_detail.dart @@ -366,7 +366,7 @@ class _PartDisplayState extends RefreshableState { onTap: () async { if (part.categoryId > 0) { - showLoadingOverlay(context); + showLoadingOverlay(); var cat = await InvenTreePartCategory().get(part.categoryId); hideLoadingOverlay(); @@ -646,7 +646,7 @@ class _PartDisplayState extends RefreshableState { if (part.isTrackable) { // read the next available serial number - showLoadingOverlay(context); + showLoadingOverlay(); var response = await api.get("/api/part/${part.pk}/serial-numbers/", expectedStatusCode: null); hideLoadingOverlay(); diff --git a/lib/widget/part/part_parameter_widget.dart b/lib/widget/part/part_parameter_widget.dart index ea7e7dfc..53e772da 100644 --- a/lib/widget/part/part_parameter_widget.dart +++ b/lib/widget/part/part_parameter_widget.dart @@ -127,7 +127,7 @@ class _PaginatedParameterState extends PaginatedSearchState { Navigator.push(context, MaterialPageRoute( builder: (context) => LocationDisplayWidget(null))); } else { - showLoadingOverlay(context); + showLoadingOverlay(); var loc = await InvenTreeStockLocation().get(parentId); hideLoadingOverlay(); diff --git a/lib/widget/stock/stock_detail.dart b/lib/widget/stock/stock_detail.dart index 106d0509..00817089 100644 --- a/lib/widget/stock/stock_detail.dart +++ b/lib/widget/stock/stock_detail.dart @@ -523,7 +523,7 @@ class _StockItemDisplayState extends RefreshableState { onTap: () async { if (widget.item.partId > 0) { - showLoadingOverlay(context); + showLoadingOverlay(); var part = await InvenTreePart().get(widget.item.partId); hideLoadingOverlay(); @@ -566,7 +566,7 @@ class _StockItemDisplayState extends RefreshableState { onTap: () async { if (widget.item.locationId > 0) { - showLoadingOverlay(context); + showLoadingOverlay(); var loc = await InvenTreeStockLocation().get(widget.item.locationId); hideLoadingOverlay(); @@ -651,7 +651,7 @@ class _StockItemDisplayState extends RefreshableState { leading: Icon(TablerIcons.building, color: COLOR_ACTION), trailing: InvenTreeAPI().getThumbnail(widget.item.supplierImage, hideIfNull: true), onTap: () async { - showLoadingOverlay(context); + showLoadingOverlay(); var sp = await InvenTreeSupplierPart().get( widget.item.supplierPartId); hideLoadingOverlay(); From 2d9bc145bfea6a1d2b8b9fd70833c60dc7ef834d Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Wed, 11 Dec 2024 21:49:13 +1100 Subject: [PATCH 04/12] Update release notes --- assets/release_notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/release_notes.md b/assets/release_notes.md index c72bd2c1..a4457132 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -3,6 +3,7 @@ - Fixes barcode scanning bug which prevents scanning of DataMatrix codes - Display "destination" information in PurchaseOrder detail view +- Pre-fill "location" field when receiving items against PurchaseOrder - Adds "assigned to me" filter for Purchase Order list - Adds "assigned to me" filter for Sales Order list From 5c1ceb7a0cd3f78fe45ab5c8cbbb3a0385461d4f Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Wed, 11 Dec 2024 21:55:31 +1100 Subject: [PATCH 05/12] Remove unused var --- lib/barcode/controller.dart | 6 ------ lib/widget/progress.dart | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/lib/barcode/controller.dart b/lib/barcode/controller.dart index 7a1fb1f8..f1c3789b 100644 --- a/lib/barcode/controller.dart +++ b/lib/barcode/controller.dart @@ -59,12 +59,6 @@ class InvenTreeBarcodeControllerState extends State processingBarcode = true; }); - BuildContext? context; - - if (hasContext()) { - context = OneContext.hasContext ? OneContext().context : null; - } - showLoadingOverlay(); await pauseScan(); diff --git a/lib/widget/progress.dart b/lib/widget/progress.dart index 618941b3..a2a296d7 100644 --- a/lib/widget/progress.dart +++ b/lib/widget/progress.dart @@ -45,7 +45,7 @@ Widget progressIndicator() { void showLoadingOverlay() { - BuildContext? context = OneContext().context; + BuildContext? context = OneContext.hasContext ? OneContext().context : null; if (context == null) { return; From 2dd20d9565d489cc08a9631eba46ed93fadef0f6 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Wed, 11 Dec 2024 22:00:13 +1100 Subject: [PATCH 06/12] Cleanup --- lib/barcode/controller.dart | 4 ---- pubspec.lock | 8 ++++---- pubspec.yaml | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/lib/barcode/controller.dart b/lib/barcode/controller.dart index f1c3789b..3a8fa2c5 100644 --- a/lib/barcode/controller.dart +++ b/lib/barcode/controller.dart @@ -1,11 +1,7 @@ import "package:flutter/material.dart"; -import "package:inventree/helpers.dart"; -import "package:one_context/one_context.dart"; import "package:inventree/preferences.dart"; - import "package:inventree/barcode/handler.dart"; - import "package:inventree/widget/progress.dart"; /* diff --git a/pubspec.lock b/pubspec.lock index 2a5876ec..0d720b74 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -278,14 +278,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.1" - datetime_picker_formfield: + datetime_picker_formfield_new: dependency: "direct main" description: - name: datetime_picker_formfield - sha256: "6d0412c98cc5da18a5dca1f81f82a834fbacdb5d249fd6d9bed42d912339720e" + name: datetime_picker_formfield_new + sha256: "04e353b959fa9f2654bb41ec016100152bdcd0afdef7b7b74a83d7d97bdba0a3" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.0" dbus: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 84572dd5..079de530 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: camera: ^0.10.3 # Camera cupertino_icons: ^1.0.8 currency_formatter: ^2.2.1 # Currency formatting - datetime_picker_formfield: ^2.0.1 # Date / time picker + datetime_picker_formfield_new: ^2.1.0 # Date / time picker device_info_plus: ^10.1.2 # Information about the device dropdown_search: ^5.0.6 # Dropdown autocomplete form fields file_picker: ^8.1.2 # Select files from the device From 541eca387dbba53acdcc031b470fed0f65f8a636 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Wed, 11 Dec 2024 22:09:35 +1100 Subject: [PATCH 07/12] Revert package change --- pubspec.lock | 8 ++++---- pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 0d720b74..2a5876ec 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -278,14 +278,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.1" - datetime_picker_formfield_new: + datetime_picker_formfield: dependency: "direct main" description: - name: datetime_picker_formfield_new - sha256: "04e353b959fa9f2654bb41ec016100152bdcd0afdef7b7b74a83d7d97bdba0a3" + name: datetime_picker_formfield + sha256: "6d0412c98cc5da18a5dca1f81f82a834fbacdb5d249fd6d9bed42d912339720e" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.0.1" dbus: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 079de530..84572dd5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: camera: ^0.10.3 # Camera cupertino_icons: ^1.0.8 currency_formatter: ^2.2.1 # Currency formatting - datetime_picker_formfield_new: ^2.1.0 # Date / time picker + datetime_picker_formfield: ^2.0.1 # Date / time picker device_info_plus: ^10.1.2 # Information about the device dropdown_search: ^5.0.6 # Dropdown autocomplete form fields file_picker: ^8.1.2 # Select files from the device From 676de0dfe95ab5432acd804e7b4597a3aa9ead53 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Wed, 11 Dec 2024 22:23:52 +1100 Subject: [PATCH 08/12] Display part name --- lib/inventree/company.dart | 6 ++++-- lib/widget/order/po_line_list.dart | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/inventree/company.dart b/lib/inventree/company.dart index 3c3ac6a0..b9bba772 100644 --- a/lib/inventree/company.dart +++ b/lib/inventree/company.dart @@ -189,8 +189,10 @@ class InvenTreeSupplierPart extends InvenTreeModel { String get partImage => (jsondata["part_detail"]?["thumbnail"] ?? InvenTreeAPI.staticThumb) as String; - String get partName => getString("full_name", subKey: "part_detail"); - + String get partName => getString("name", subKey: "part_detail"); + + Map get partDetail => getMap("part_detail"); + String get partDescription => getString("description", subKey: "part_detail"); String get note => getString("note"); diff --git a/lib/widget/order/po_line_list.dart b/lib/widget/order/po_line_list.dart index 94c0d92d..5050477e 100644 --- a/lib/widget/order/po_line_list.dart +++ b/lib/widget/order/po_line_list.dart @@ -71,9 +71,10 @@ class _PaginatedPOLineListState extends PaginatedSearchState Date: Wed, 11 Dec 2024 22:25:41 +1100 Subject: [PATCH 09/12] Update release notes --- assets/release_notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/release_notes.md b/assets/release_notes.md index a4457132..1b226592 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -4,6 +4,7 @@ - Fixes barcode scanning bug which prevents scanning of DataMatrix codes - Display "destination" information in PurchaseOrder detail view - Pre-fill "location" field when receiving items against PurchaseOrder +- Fix display of part name in PurchaseOrderLineItem list - Adds "assigned to me" filter for Purchase Order list - Adds "assigned to me" filter for Sales Order list From e1912d68789f29b69a41e4dc3eb8c57121720357 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Wed, 11 Dec 2024 22:31:01 +1100 Subject: [PATCH 10/12] Tweak barcode overlay --- lib/barcode/camera_controller.dart | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/barcode/camera_controller.dart b/lib/barcode/camera_controller.dart index 0932995c..b3e26fc4 100644 --- a/lib/barcode/camera_controller.dart +++ b/lib/barcode/camera_controller.dart @@ -185,7 +185,12 @@ class _CameraBarcodeControllerState extends InvenTreeBarcodeControllerState { child: Align( alignment: Alignment.topCenter, child: Padding( - padding: EdgeInsets.all(10), + padding: EdgeInsets.only( + left: 10, + right: 10, + top: 75, + bottom: 10 + ), child: Text( widget.handler.getOverlayText(context), style: TextStyle( @@ -213,7 +218,12 @@ class _CameraBarcodeControllerState extends InvenTreeBarcodeControllerState { child: Align( alignment: Alignment.bottomCenter, child: Padding( - padding: EdgeInsets.all(10), + padding: EdgeInsets.only( + left: 10, + right: 10, + top: 10, + bottom: 75 + ), child: Text( text, textAlign: TextAlign.center, From d25c47ccc3f411e49e6a2235477178a6b37ab9b1 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Wed, 11 Dec 2024 22:39:33 +1100 Subject: [PATCH 11/12] Fix for unit test --- lib/widget/progress.dart | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/widget/progress.dart b/lib/widget/progress.dart index a2a296d7..cc00c85b 100644 --- a/lib/widget/progress.dart +++ b/lib/widget/progress.dart @@ -1,5 +1,7 @@ +import "dart:io"; + import "package:flutter/material.dart"; import "package:flutter_overlay_loader/flutter_overlay_loader.dart"; import "package:inventree/app_colors.dart"; @@ -45,6 +47,11 @@ Widget progressIndicator() { void showLoadingOverlay() { + // Do not show overlay if running unit tests + if (Platform.environment.containsKey("FLUTTER_TEST")) { + return; + } + BuildContext? context = OneContext.hasContext ? OneContext().context : null; if (context == null) { From 6690f10118036209e2073b0056b845a8aacba88f Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Wed, 11 Dec 2024 22:53:03 +1100 Subject: [PATCH 12/12] Handle condition where camera controller fails to initialize --- lib/barcode/camera_controller.dart | 26 ++++++++++++++++++++++++++ lib/l10n/app_en.arb | 3 +++ lib/widget/snacks.dart | 2 +- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/lib/barcode/camera_controller.dart b/lib/barcode/camera_controller.dart index b3e26fc4..4c6edd7a 100644 --- a/lib/barcode/camera_controller.dart +++ b/lib/barcode/camera_controller.dart @@ -1,10 +1,14 @@ import "dart:math"; import "dart:typed_data"; +import "package:camera/camera.dart"; import "package:flutter/material.dart"; import "package:flutter_tabler_icons/flutter_tabler_icons.dart"; import "package:inventree/app_colors.dart"; +import "package:inventree/inventree/sentry.dart"; import "package:inventree/preferences.dart"; +import "package:inventree/widget/snacks.dart"; +import "package:one_context/one_context.dart"; import "package:wakelock_plus/wakelock_plus.dart"; import "package:flutter_zxing/flutter_zxing.dart"; @@ -133,7 +137,28 @@ class _CameraBarcodeControllerState extends InvenTreeBarcodeControllerState { } }); } + } + void onControllerCreated(CameraController? controller, Exception? error) { + if (error != null) { + sentryReportError( + "CameraBarcodeController.onControllerCreated", + error, + null + ); + } + + if (controller == null) { + showSnackIcon( + L10().cameraCreationError, + icon: TablerIcons.camera_x, + success: false + ); + + if (OneContext.hasContext) { + Navigator.pop(OneContext().context!); + } + } } /* @@ -167,6 +192,7 @@ class _CameraBarcodeControllerState extends InvenTreeBarcodeControllerState { tryInverted: true, tryRotate: true, showGallery: false, + onControllerCreated: onControllerCreated, scanDelay: Duration(milliseconds: scan_delay), resolution: ResolutionPreset.high, lensDirection: CameraLensDirection.back, diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 72d5d92f..d6693bdc 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -202,6 +202,9 @@ "building": "Building", "@building": {}, + "cameraCreationError": "Could not open camera controller", + "@cameraCreationError": {}, + "cameraInternal": "Internal Camera", "@cameraInternal": {}, diff --git a/lib/widget/snacks.dart b/lib/widget/snacks.dart index c5a1aba8..398a4840 100644 --- a/lib/widget/snacks.dart +++ b/lib/widget/snacks.dart @@ -72,7 +72,7 @@ void showSnackIcon(String text, {IconData? icon, Function()? onAction, bool? suc onAction(); } ), - duration: Duration(seconds: onAction == null ? 1 : 2), + duration: Duration(seconds: onAction == null ? 5 : 10), ) );