diff --git a/android/app/build.gradle.dev b/android/app/build.gradle.dev index 09bdac86256..6f8945c0387 100644 --- a/android/app/build.gradle.dev +++ b/android/app/build.gradle.dev @@ -26,7 +26,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 33 + compileSdkVersion 34 ndkVersion flutter.ndkVersion compileOptions { diff --git a/android/app/build.gradle.prod b/android/app/build.gradle.prod index bf0e56224c0..20fbe3b008d 100644 --- a/android/app/build.gradle.prod +++ b/android/app/build.gradle.prod @@ -31,7 +31,7 @@ def keystoreProperties = new Properties() keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) android { - compileSdkVersion 33 + compileSdkVersion 34 ndkVersion flutter.ndkVersion compileOptions { diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 9625e105df3..7c569640062 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 11.0 + 12.0 diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 322e3e9d27e..cc2b95851b8 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,43 +1,43 @@ PODS: - - AppAuth (1.6.2): - - AppAuth/Core (= 1.6.2) - - AppAuth/ExternalUserAgent (= 1.6.2) - - AppAuth/Core (1.6.2) - - AppAuth/ExternalUserAgent (1.6.2): + - AppAuth (1.7.5): + - AppAuth/Core (= 1.7.5) + - AppAuth/ExternalUserAgent (= 1.7.5) + - AppAuth/Core (1.7.5) + - AppAuth/ExternalUserAgent (1.7.5): - AppAuth/Core - contacts_service (0.2.2): - Flutter - device_info_plus (0.0.1): - Flutter - - DKImagePickerController/Core (4.3.4): + - DKImagePickerController/Core (4.3.9): - DKImagePickerController/ImageDataManager - DKImagePickerController/Resource - - DKImagePickerController/ImageDataManager (4.3.4) - - DKImagePickerController/PhotoGallery (4.3.4): + - DKImagePickerController/ImageDataManager (4.3.9) + - DKImagePickerController/PhotoGallery (4.3.9): - DKImagePickerController/Core - DKPhotoGallery - - DKImagePickerController/Resource (4.3.4) - - DKPhotoGallery (0.0.17): - - DKPhotoGallery/Core (= 0.0.17) - - DKPhotoGallery/Model (= 0.0.17) - - DKPhotoGallery/Preview (= 0.0.17) - - DKPhotoGallery/Resource (= 0.0.17) + - DKImagePickerController/Resource (4.3.9) + - DKPhotoGallery (0.0.19): + - DKPhotoGallery/Core (= 0.0.19) + - DKPhotoGallery/Model (= 0.0.19) + - DKPhotoGallery/Preview (= 0.0.19) + - DKPhotoGallery/Resource (= 0.0.19) - SDWebImage - SwiftyGif - - DKPhotoGallery/Core (0.0.17): + - DKPhotoGallery/Core (0.0.19): - DKPhotoGallery/Model - DKPhotoGallery/Preview - SDWebImage - SwiftyGif - - DKPhotoGallery/Model (0.0.17): + - DKPhotoGallery/Model (0.0.19): - SDWebImage - SwiftyGif - - DKPhotoGallery/Preview (0.0.17): + - DKPhotoGallery/Preview (0.0.19): - DKPhotoGallery/Model - DKPhotoGallery/Resource - SDWebImage - SwiftyGif - - DKPhotoGallery/Resource (0.0.17): + - DKPhotoGallery/Resource (0.0.19): - SDWebImage - SwiftyGif - file_picker (0.0.1): @@ -45,16 +45,23 @@ PODS: - Flutter - Flutter (1.0.0) - google_sign_in_ios (0.0.1): + - AppAuth (>= 1.7.4) - Flutter - - GoogleSignIn (~> 7.0) - - GoogleSignIn (7.0.0): - - AppAuth (~> 1.5) - - GTMAppAuth (< 3.0, >= 1.3) - - GTMSessionFetcher/Core (< 4.0, >= 1.1) - - GTMAppAuth (2.0.0): - - AppAuth/Core (~> 1.6) - - GTMSessionFetcher/Core (< 4.0, >= 1.5) - - GTMSessionFetcher/Core (3.3.1) + - FlutterMacOS + - GoogleSignIn (~> 7.1) + - GTMSessionFetcher (>= 3.4.0) + - GoogleSignIn (7.1.0): + - AppAuth (< 2.0, >= 1.7.3) + - GTMAppAuth (< 5.0, >= 4.1.1) + - GTMSessionFetcher/Core (~> 3.3) + - GTMAppAuth (4.1.1): + - AppAuth/Core (~> 1.7) + - GTMSessionFetcher/Core (< 4.0, >= 3.3) + - GTMSessionFetcher (3.4.1): + - GTMSessionFetcher/Full (= 3.4.1) + - GTMSessionFetcher/Core (3.4.1) + - GTMSessionFetcher/Full (3.4.1): + - GTMSessionFetcher/Core - image_cropper (0.0.4): - Flutter - TOCropViewController (~> 2.6.1) @@ -65,7 +72,9 @@ PODS: - FlutterMacOS - in_app_review (0.2.0): - Flutter - - local_auth_ios (0.0.1): + - ios_open_subscriptions_settings (0.0.2): + - Flutter + - local_auth_darwin (0.0.1): - Flutter - package_info (0.0.1): - Flutter @@ -74,20 +83,20 @@ PODS: - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS - - permission_handler_apple (9.1.1): + - permission_handler_apple (9.3.0): - Flutter - printing (1.0.0): - Flutter - - SDWebImage (5.18.10): - - SDWebImage/Core (= 5.18.10) - - SDWebImage/Core (5.18.10) - - Sentry/HybridSDK (8.18.0): - - SentryPrivate (= 8.18.0) - - sentry_flutter (0.0.1): + - SDWebImage (5.19.2): + - SDWebImage/Core (= 5.19.2) + - SDWebImage/Core (5.19.2) + - Sentry/HybridSDK (8.21.0): + - SentryPrivate (= 8.21.0) + - sentry_flutter (7.20.0): - Flutter - FlutterMacOS - - Sentry/HybridSDK (= 8.18.0) - - SentryPrivate (8.18.0) + - Sentry/HybridSDK (= 8.21.0) + - SentryPrivate (8.21.0) - share_plus (0.0.1): - Flutter - shared_preferences_foundation (0.0.1): @@ -97,7 +106,7 @@ PODS: - Flutter - smart_auth (0.0.1): - Flutter - - SwiftyGif (5.4.4) + - SwiftyGif (5.4.5) - TOCropViewController (2.6.1) - url_launcher_ios (0.0.1): - Flutter @@ -111,12 +120,13 @@ DEPENDENCIES: - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - file_picker (from `.symlinks/plugins/file_picker/ios`) - Flutter (from `Flutter`) - - google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/ios`) + - google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/darwin`) - image_cropper (from `.symlinks/plugins/image_cropper/ios`) - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - in_app_purchase_storekit (from `.symlinks/plugins/in_app_purchase_storekit/darwin`) - in_app_review (from `.symlinks/plugins/in_app_review/ios`) - - local_auth_ios (from `.symlinks/plugins/local_auth_ios/ios`) + - ios_open_subscriptions_settings (from `.symlinks/plugins/ios_open_subscriptions_settings/ios`) + - local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`) - package_info (from `.symlinks/plugins/package_info/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) @@ -155,7 +165,7 @@ EXTERNAL SOURCES: Flutter: :path: Flutter google_sign_in_ios: - :path: ".symlinks/plugins/google_sign_in_ios/ios" + :path: ".symlinks/plugins/google_sign_in_ios/darwin" image_cropper: :path: ".symlinks/plugins/image_cropper/ios" image_picker_ios: @@ -164,8 +174,10 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/in_app_purchase_storekit/darwin" in_app_review: :path: ".symlinks/plugins/in_app_review/ios" - local_auth_ios: - :path: ".symlinks/plugins/local_auth_ios/ios" + ios_open_subscriptions_settings: + :path: ".symlinks/plugins/ios_open_subscriptions_settings/ios" + local_auth_darwin: + :path: ".symlinks/plugins/local_auth_darwin/darwin" package_info: :path: ".symlinks/plugins/package_info/ios" package_info_plus: @@ -194,39 +206,40 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/widget_kit_plugin/ios" SPEC CHECKSUMS: - AppAuth: 3bb1d1cd9340bd09f5ed189fb00b1cc28e1e8570 + AppAuth: 501c04eda8a8d11f179dbe8637b7a91bb7e5d2fa contacts_service: 849e1f84281804c8bfbec1b4c3eedcb23c5d3eca device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6 - DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac - DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 + DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c + DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 file_picker: ce3938a0df3cc1ef404671531facef740d03f920 - Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 - google_sign_in_ios: 8115e3fbe097e6509beb819ed602d47369d9011f - GoogleSignIn: b232380cf495a429b8095d3178a8d5855b42e842 - GTMAppAuth: 99fb010047ba3973b7026e45393f51f27ab965ae - GTMSessionFetcher: 8a1b34ad97ebe6f909fb8b9b77fba99943007556 + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + google_sign_in_ios: 07375bfbf2620bc93a602c0e27160d6afc6ead38 + GoogleSignIn: d4281ab6cf21542b1cfaff85c191f230b399d2db + GTMAppAuth: f69bd07d68cd3b766125f7e072c45d7340dea0de + GTMSessionFetcher: 8000756fc1c19d2e5697b90311f7832d2e33f6cd image_cropper: a3291c624a953049bc6a02e1f8c8ceb162a24b25 - image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5 - in_app_purchase_storekit: 4fb7ee9e824b1f09107fbfbbce8c4b276366dc43 + image_picker_ios: b545a5f16c0fa88e3ecbbce3ed4de45567a8ec18 + in_app_purchase_storekit: 0e4b3c2e43ba1e1281f4f46dd71b0593ce529892 in_app_review: 318597b3a06c22bb46dc454d56828c85f444f99d - local_auth_ios: c6cf091ded637a88f24f86a8875d8b0f526e2605 + ios_open_subscriptions_settings: 77d0506aefda2042facefdd3dadc04417e7857cc + local_auth_darwin: c7e464000a6a89e952235699e32b329457608d98 package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 - package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 - path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 - permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6 + package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c + path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c + permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 printing: 233e1b73bd1f4a05615548e9b5a324c98588640b - SDWebImage: fc8f2d48bbfd72ef39d70e981bd24a3f3be53fec - Sentry: 8984a4ffb2b9bd2894d74fb36e6f5833865bc18e - sentry_flutter: c87a0556eeb6cbf7f9f924d30e878bdedf22d364 - SentryPrivate: 2f0c9ba4c3fc993f70eab6ca95673509561e0085 + SDWebImage: dfe95b2466a9823cf9f0c6d01217c06550d7b29a + Sentry: ebc12276bd17613a114ab359074096b6b3725203 + sentry_flutter: df6e28477322fc5202bbe20aafdd7404b6e97729 + SentryPrivate: d651efb234cf385ec9a1cdd3eff94b5e78a0e0fe share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5 - shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 + shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695 sign_in_with_apple: f3bf75217ea4c2c8b91823f225d70230119b8440 smart_auth: 4bedbc118723912d0e45a07e8ab34039c19e04f2 - SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f + SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 TOCropViewController: edfd4f25713d56905ad1e0b9f5be3fbe0f59c863 - url_launcher_ios: bf5ce03e0e2088bad9cc378ea97fa0ed5b49673b - webview_flutter_wkwebview: 2e2d318f21a5e036e2c3f26171342e95908bd60a + url_launcher_ios: 6116280ddcfe98ab8820085d8d76ae7449447586 + webview_flutter_wkwebview: be0f0d33777f1bfd0c9fdcb594786704dbf65f36 widget_kit_plugin: a245a5248f0cd2bde580285ebe6bee5c6f1f6ce1 PODFILE CHECKSUM: 3005ff604479ae2d844823dff36ae514d2c44ab9 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a40620ba19c..71a696120c6 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -144,6 +144,7 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, BF7C1F8639D4505C503E67EF /* [CP] Embed Pods Frameworks */, + 3E0BA3A20B86A31EC1FC163D /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -160,7 +161,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1430; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -219,6 +220,23 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; + 3E0BA3A20B86A31EC1FC163D /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -348,7 +366,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -430,7 +448,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -479,7 +497,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index a6b826db27d..5e31d3d342f 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ [ + clients, + credits, + expenses, + invoices, + invoice_items, + purchase_orders, + purchase_order_items, + quotes, + quote_items, + payments, + products, + tasks, + vendors, + ].contains(this); + static BuiltSet get values => _$exportValues; static ExportType valueOf(String name) => _$exportValueOf(name); diff --git a/lib/data/models/import_model.g.dart b/lib/data/models/import_model.g.dart index 2752d47843b..11b3ae9cb5e 100644 --- a/lib/data/models/import_model.g.dart +++ b/lib/data/models/import_model.g.dart @@ -62,10 +62,10 @@ const ExportType _$payments = const ExportType._('payments'); const ExportType _$products = const ExportType._('products'); const ExportType _$tasks = const ExportType._('tasks'); const ExportType _$profitloss = const ExportType._('profitloss'); -const ExportType _$vendor = const ExportType._('vendor'); -const ExportType _$purchase_order = const ExportType._('purchase_order'); -const ExportType _$purchase_order_item = - const ExportType._('purchase_order_item'); +const ExportType _$vendors = const ExportType._('vendors'); +const ExportType _$purchase_orders = const ExportType._('purchase_orders'); +const ExportType _$purchase_order_items = + const ExportType._('purchase_order_items'); const ExportType _$ar_detailed = const ExportType._('ar_detailed'); const ExportType _$ar_summary = const ExportType._('ar_summary'); const ExportType _$client_balance = const ExportType._('client_balance'); @@ -105,12 +105,12 @@ ExportType _$exportValueOf(String name) { return _$tasks; case 'profitloss': return _$profitloss; - case 'vendor': - return _$vendor; - case 'purchase_order': - return _$purchase_order; - case 'purchase_order_item': - return _$purchase_order_item; + case 'vendors': + return _$vendors; + case 'purchase_orders': + return _$purchase_orders; + case 'purchase_order_items': + return _$purchase_order_items; case 'ar_detailed': return _$ar_detailed; case 'ar_summary': @@ -145,9 +145,9 @@ final BuiltSet _$exportValues = _$products, _$tasks, _$profitloss, - _$vendor, - _$purchase_order, - _$purchase_order_item, + _$vendors, + _$purchase_orders, + _$purchase_order_items, _$ar_detailed, _$ar_summary, _$client_balance, diff --git a/lib/data/models/invoice_model.dart b/lib/data/models/invoice_model.dart index ffda4efda0a..c2668f5cf79 100644 --- a/lib/data/models/invoice_model.dart +++ b/lib/data/models/invoice_model.dart @@ -1611,14 +1611,18 @@ class TaskItemFields { abstract class InvoiceItemEntity implements Built { - factory InvoiceItemEntity( - {String? productKey, double? quantity, String? typeId}) { + factory InvoiceItemEntity({String? productKey, String? typeId}) { + final store = StoreProvider.of(navigatorKey.currentContext!); + final state = store.state; + final company = state.company; + return _$InvoiceItemEntity._( productKey: productKey ?? '', notes: '', cost: 0, productCost: 0, - quantity: quantity ?? 1, + quantity: + (company.defaultQuantity || !company.enableProductQuantity) ? 1 : 0, taxName1: '', taxRate1: 0, taxName2: '', @@ -1730,6 +1734,10 @@ abstract class InvoiceItemEntity calculateTaxAmount(invoice.taxRate3); } + InvoiceItemEntity get clone => rebuild((b) => b + ..expenseId = '' + ..taskId = ''); + double netTotal(InvoiceEntity invoice, int precision) => total(invoice, precision) - taxAmount(invoice, precision); diff --git a/lib/redux/credit/credit_actions.dart b/lib/redux/credit/credit_actions.dart index 6c6daf5622f..0f33815d18f 100644 --- a/lib/redux/credit/credit_actions.dart +++ b/lib/redux/credit/credit_actions.dart @@ -168,8 +168,12 @@ class RemoveCreditContact implements PersistUI { } class AddCreditItem implements PersistUI { - AddCreditItem({this.creditItem}); + AddCreditItem({ + this.creditItem, + this.index, + }); + final int? index; final InvoiceItemEntity? creditItem; } diff --git a/lib/redux/credit/credit_reducer.dart b/lib/redux/credit/credit_reducer.dart index 9195a0b0be2..9b5cd195f99 100644 --- a/lib/redux/credit/credit_reducer.dart +++ b/lib/redux/credit/credit_reducer.dart @@ -160,8 +160,12 @@ InvoiceEntity? _updateEditing(InvoiceEntity? credit, dynamic action) { } InvoiceEntity _addCreditItem(InvoiceEntity? credit, AddCreditItem action) { - return credit!.rebuild( - (b) => b..lineItems.add(action.creditItem ?? InvoiceItemEntity())); + final item = action.creditItem ?? InvoiceItemEntity(); + if (action.index == null) { + return credit!.rebuild((b) => b..lineItems.add(item)); + } else { + return credit!.rebuild((b) => b..lineItems.insert(action.index!, item)); + } } InvoiceEntity _addCreditItems(InvoiceEntity? credit, AddCreditItems action) { diff --git a/lib/redux/purchase_order/purchase_order_actions.dart b/lib/redux/purchase_order/purchase_order_actions.dart index 5d499e44561..87a0b5807b8 100644 --- a/lib/redux/purchase_order/purchase_order_actions.dart +++ b/lib/redux/purchase_order/purchase_order_actions.dart @@ -468,8 +468,9 @@ class RemovePurchaseOrderContact implements PersistUI { } class AddPurchaseOrderItem implements PersistUI { - AddPurchaseOrderItem({this.purchaseOrderItem}); + AddPurchaseOrderItem({this.purchaseOrderItem, this.index,}); + final int? index; final InvoiceItemEntity? purchaseOrderItem; } diff --git a/lib/redux/purchase_order/purchase_order_reducer.dart b/lib/redux/purchase_order/purchase_order_reducer.dart index 74f45dfe205..f9ba58fae9b 100644 --- a/lib/redux/purchase_order/purchase_order_reducer.dart +++ b/lib/redux/purchase_order/purchase_order_reducer.dart @@ -187,8 +187,13 @@ InvoiceEntity? _updateEditing(InvoiceEntity? purchaseOrder, dynamic action) { InvoiceEntity _addPurchaseOrderItem( InvoiceEntity? purchaseOrder, AddPurchaseOrderItem action) { - return purchaseOrder!.rebuild( - (b) => b..lineItems.add(action.purchaseOrderItem ?? InvoiceItemEntity())); + final item = action.purchaseOrderItem ?? InvoiceItemEntity(); + if (action.index == null) { + return purchaseOrder!.rebuild((b) => b..lineItems.add(item)); + } else { + return purchaseOrder! + .rebuild((b) => b..lineItems.insert(action.index!, item)); + } } InvoiceEntity _addPurchaseOrderItems( diff --git a/lib/redux/quote/quote_actions.dart b/lib/redux/quote/quote_actions.dart index 0bcf2021b04..74c8203dc01 100644 --- a/lib/redux/quote/quote_actions.dart +++ b/lib/redux/quote/quote_actions.dart @@ -169,8 +169,12 @@ class RemoveQuoteContact implements PersistUI { } class AddQuoteItem implements PersistUI { - AddQuoteItem({this.quoteItem}); + AddQuoteItem({ + this.quoteItem, + this.index, + }); + final int? index; final InvoiceItemEntity? quoteItem; } diff --git a/lib/redux/quote/quote_reducer.dart b/lib/redux/quote/quote_reducer.dart index bcbee7a02c4..10fe72f2860 100644 --- a/lib/redux/quote/quote_reducer.dart +++ b/lib/redux/quote/quote_reducer.dart @@ -161,8 +161,12 @@ InvoiceEntity? _updateEditing(InvoiceEntity? quote, dynamic action) { } InvoiceEntity _addQuoteItem(InvoiceEntity? quote, AddQuoteItem action) { - return quote!.rebuild( - (b) => b..lineItems.add(action.quoteItem ?? InvoiceItemEntity())); + final item = action.quoteItem ?? InvoiceItemEntity(); + if (action.index == null) { + return quote!.rebuild((b) => b..lineItems.add(item)); + } else { + return quote!.rebuild((b) => b..lineItems.insert(action.index!, item)); + } } InvoiceEntity _addQuoteItems(InvoiceEntity? quote, AddQuoteItems action) { diff --git a/lib/redux/recurring_invoice/recurring_invoice_actions.dart b/lib/redux/recurring_invoice/recurring_invoice_actions.dart index 969b7852567..ff4179c11cf 100644 --- a/lib/redux/recurring_invoice/recurring_invoice_actions.dart +++ b/lib/redux/recurring_invoice/recurring_invoice_actions.dart @@ -200,8 +200,9 @@ class AddRecurringInvoiceSuccess implements StopSaving, PersistData, PersistUI { } class AddRecurringInvoiceItem implements PersistUI { - AddRecurringInvoiceItem({this.invoiceItem}); + AddRecurringInvoiceItem({this.invoiceItem, this.index,}); + final int? index; final InvoiceItemEntity? invoiceItem; } diff --git a/lib/redux/recurring_invoice/recurring_invoice_reducer.dart b/lib/redux/recurring_invoice/recurring_invoice_reducer.dart index 4ff6948e627..5b7d52f3d44 100644 --- a/lib/redux/recurring_invoice/recurring_invoice_reducer.dart +++ b/lib/redux/recurring_invoice/recurring_invoice_reducer.dart @@ -199,7 +199,12 @@ InvoiceEntity? _updateEditing(InvoiceEntity? recurringInvoice, dynamic action) { InvoiceEntity _addRecurringInvoiceItem( InvoiceEntity? recurringInvoice, AddRecurringInvoiceItem action) { final item = action.invoiceItem ?? InvoiceItemEntity(); - return recurringInvoice!.rebuild((b) => b..lineItems.add(item)); + if (action.index == null) { + return recurringInvoice!.rebuild((b) => b..lineItems.add(item)); + } else { + return recurringInvoice! + .rebuild((b) => b..lineItems.insert(action.index!, item)); + } } InvoiceEntity _addRecurringInvoiceItems( diff --git a/lib/ui/credit/edit/credit_edit_items_vm.dart b/lib/ui/credit/edit/credit_edit_items_vm.dart index e92bf45d72e..61197284352 100644 --- a/lib/ui/credit/edit/credit_edit_items_vm.dart +++ b/lib/ui/credit/edit/credit_edit_items_vm.dart @@ -55,6 +55,7 @@ class CreditEditItemsVM extends EntityEditItemsVM { InvoiceEntity? invoice, int? invoiceItemIndex, Function? addLineItem, + Function? cloneLineItem, Function? deleteLineItem, Function(int)? onRemoveInvoiceItemPressed, Function? onDoneInvoiceItemPressed, @@ -65,6 +66,7 @@ class CreditEditItemsVM extends EntityEditItemsVM { company: company, invoice: invoice, addLineItem: addLineItem, + cloneLineItem: cloneLineItem, deleteLineItem: deleteLineItem, invoiceItemIndex: invoiceItemIndex, onRemoveInvoiceItemPressed: onRemoveInvoiceItemPressed, @@ -74,10 +76,14 @@ class CreditEditItemsVM extends EntityEditItemsVM { ); factory CreditEditItemsVM.fromStore(Store store, bool isTasks) { + final state = store.state; + final company = state.company; + final credit = store.state.creditUIState.editing; + return CreditEditItemsVM( - state: store.state, - company: store.state.company, - invoice: store.state.creditUIState.editing, + state: state, + company: company, + invoice: credit, invoiceItemIndex: store.state.creditUIState.editingItemIndex, onRemoveInvoiceItemPressed: (index) { store.dispatch(DeleteCreditItem(index)); @@ -103,6 +109,22 @@ class CreditEditItemsVM extends EntityEditItemsVM { MoveCreditItem(oldIndex: oldIndex, newIndex: newIndex), ); }, + addLineItem: ([int? index]) { + store.dispatch( + AddCreditItem( + index: index, + creditItem: InvoiceItemEntity(), + ), + ); + }, + cloneLineItem: (int? index) { + store.dispatch( + AddCreditItem( + index: index, + creditItem: credit!.lineItems[index!].clone, + ), + ); + }, ); } } diff --git a/lib/ui/invoice/edit/invoice_edit_items_desktop.dart b/lib/ui/invoice/edit/invoice_edit_items_desktop.dart index 3f63871f57d..71254cdd8e4 100644 --- a/lib/ui/invoice/edit/invoice_edit_items_desktop.dart +++ b/lib/ui/invoice/edit/invoice_edit_items_desktop.dart @@ -575,12 +575,7 @@ class _InvoiceEditItemsDesktopState extends State { ); } - if (lineItems.where((item) => item.isEmpty).isEmpty) { - lineItems.add(InvoiceItemEntity( - quantity: company.defaultQuantity || !company.enableProductQuantity - ? 1 - : 0)); - } + lineItems.add(InvoiceItemEntity()); tableHeaderColumns.addAll([ TableHeader( @@ -1194,12 +1189,16 @@ class _InvoiceEditItemsDesktopState extends State { ), PopupMenuButton( icon: Icon(Icons.more_vert), - enabled: !lineItems[index].isEmpty, + enabled: !lineItems[index].isEmpty || + index < includedLineItems.length, itemBuilder: (BuildContext context) { final sectionIndex = includedLineItems.indexOf(lineItems[index]); final options = { - localization.insertBelow: MdiIcons.plus, + if (!lineItems[index].isEmpty) + localization.clone: Icons.control_point_duplicate, + if (includedLineItems.length > 1) + localization.insertBelow: MdiIcons.plus, if (widget.isTasks && (lineItems[index].taskId ?? '').isNotEmpty) localization.viewTask: MdiIcons.chevronDoubleRight, @@ -1242,6 +1241,8 @@ class _InvoiceEditItemsDesktopState extends State { viewModel.onRemoveInvoiceItemPressed!(index); } else if (action == localization.insertBelow) { viewModel.addLineItem!(index + 1); + } else if (action == localization.clone) { + viewModel.cloneLineItem!(index); } _updateTable(); }, diff --git a/lib/ui/invoice/edit/invoice_edit_items_vm.dart b/lib/ui/invoice/edit/invoice_edit_items_vm.dart index 02ea68d048e..70106c7934e 100644 --- a/lib/ui/invoice/edit/invoice_edit_items_vm.dart +++ b/lib/ui/invoice/edit/invoice_edit_items_vm.dart @@ -53,6 +53,7 @@ class EntityEditItemsVM { required this.company, required this.invoice, required this.addLineItem, + required this.cloneLineItem, required this.deleteLineItem, required this.invoiceItemIndex, required this.onRemoveInvoiceItemPressed, @@ -66,6 +67,7 @@ class EntityEditItemsVM { final InvoiceEntity? invoice; final int? invoiceItemIndex; final Function? addLineItem; + final Function? cloneLineItem; final Function? deleteLineItem; final Function(int)? onRemoveInvoiceItemPressed; final Function? clearSelectedInvoiceItem; @@ -80,6 +82,7 @@ class InvoiceEditItemsVM extends EntityEditItemsVM { InvoiceEntity? invoice, int? invoiceItemIndex, Function([int])? addLineItem, + Function(int)? cloneLineItem, Function(int)? deleteLineItem, Function(int)? onRemoveInvoiceItemPressed, Function? clearSelectedInvoiceItem, @@ -90,6 +93,7 @@ class InvoiceEditItemsVM extends EntityEditItemsVM { company: company, invoice: invoice, addLineItem: addLineItem, + cloneLineItem: cloneLineItem, deleteLineItem: deleteLineItem, invoiceItemIndex: invoiceItemIndex, onRemoveInvoiceItemPressed: onRemoveInvoiceItemPressed, @@ -102,11 +106,15 @@ class InvoiceEditItemsVM extends EntityEditItemsVM { Store store, bool isTasks, ) { + final state = store.state; + final company = state.company; + final invoice = state.invoiceUIState.editing; + return InvoiceEditItemsVM( - state: store.state, - company: store.state.company, - invoice: store.state.invoiceUIState.editing, - invoiceItemIndex: store.state.invoiceUIState.editingItemIndex, + state: state, + company: company, + invoice: invoice, + invoiceItemIndex: state.invoiceUIState.editingItemIndex, addLineItem: ([int? index]) { store.dispatch(AddInvoiceItem( index: index, @@ -115,6 +123,14 @@ class InvoiceEditItemsVM extends EntityEditItemsVM { ? InvoiceItemEntity.TYPE_TASK : InvoiceItemEntity.TYPE_STANDARD))); }, + cloneLineItem: (int? index) { + store.dispatch( + AddInvoiceItem( + index: index, + invoiceItem: invoice!.lineItems[index!].clone, + ), + ); + }, deleteLineItem: null, onRemoveInvoiceItemPressed: (index) { store.dispatch(DeleteInvoiceItem(index)); diff --git a/lib/ui/invoice/edit/invoice_item_selector.dart b/lib/ui/invoice/edit/invoice_item_selector.dart index 93f1d61834e..fa0d36ba305 100644 --- a/lib/ui/invoice/edit/invoice_item_selector.dart +++ b/lib/ui/invoice/edit/invoice_item_selector.dart @@ -64,8 +64,6 @@ class _InvoiceItemSelectorState extends State void _addBlankItem(CompanyEntity company) { widget.onItemsSelected!([ InvoiceItemEntity( - quantity: - company.defaultQuantity || !company.enableProductQuantity ? 1 : 0, typeId: _tabController.index == 1 ? InvoiceItemEntity.TYPE_TASK : null, ) ]); diff --git a/lib/ui/purchase_order/edit/purchase_order_edit_items_vm.dart b/lib/ui/purchase_order/edit/purchase_order_edit_items_vm.dart index 9a0f2dc6455..0489ed97ba7 100644 --- a/lib/ui/purchase_order/edit/purchase_order_edit_items_vm.dart +++ b/lib/ui/purchase_order/edit/purchase_order_edit_items_vm.dart @@ -53,6 +53,7 @@ class PurchaseOrderEditItemsVM extends EntityEditItemsVM { InvoiceEntity? invoice, int? invoiceItemIndex, Function? addLineItem, + Function? cloneLineItem, Function? deleteLineItem, Function(int)? onRemoveInvoiceItemPressed, Function? onDoneInvoiceItemPressed, @@ -63,6 +64,7 @@ class PurchaseOrderEditItemsVM extends EntityEditItemsVM { company: company, invoice: invoice, addLineItem: addLineItem, + cloneLineItem: cloneLineItem, deleteLineItem: deleteLineItem, invoiceItemIndex: invoiceItemIndex, onRemoveInvoiceItemPressed: onRemoveInvoiceItemPressed, @@ -72,10 +74,14 @@ class PurchaseOrderEditItemsVM extends EntityEditItemsVM { ); factory PurchaseOrderEditItemsVM.fromStore(Store store) { + final state = store.state; + final company = state.company; + final purchaseOrder = store.state.purchaseOrderUIState.editing; + return PurchaseOrderEditItemsVM( - state: store.state, - company: store.state.company, - invoice: store.state.purchaseOrderUIState.editing, + state: state, + company: company, + invoice: purchaseOrder, invoiceItemIndex: store.state.purchaseOrderUIState.editingItemIndex, onRemoveInvoiceItemPressed: (index) { store.dispatch(DeletePurchaseOrderItem(index)); @@ -98,6 +104,22 @@ class PurchaseOrderEditItemsVM extends EntityEditItemsVM { MovePurchaseOrderItem(oldIndex: oldIndex, newIndex: newIndex), ); }, + addLineItem: ([int? index]) { + store.dispatch( + AddPurchaseOrderItem( + index: index, + purchaseOrderItem: InvoiceItemEntity(), + ), + ); + }, + cloneLineItem: (int? index) { + store.dispatch( + AddPurchaseOrderItem( + index: index, + purchaseOrderItem: purchaseOrder!.lineItems[index!].clone, + ), + ); + }, ); } } diff --git a/lib/ui/quote/edit/quote_edit_items_vm.dart b/lib/ui/quote/edit/quote_edit_items_vm.dart index a6200100548..894ed2164cc 100644 --- a/lib/ui/quote/edit/quote_edit_items_vm.dart +++ b/lib/ui/quote/edit/quote_edit_items_vm.dart @@ -55,6 +55,7 @@ class QuoteEditItemsVM extends EntityEditItemsVM { InvoiceEntity? invoice, int? invoiceItemIndex, Function? addLineItem, + Function? cloneLineItem, Function? deleteLineItem, Function(int)? onRemoveInvoiceItemPressed, Function? onDoneInvoiceItemPressed, @@ -65,6 +66,7 @@ class QuoteEditItemsVM extends EntityEditItemsVM { company: company, invoice: invoice, addLineItem: addLineItem, + cloneLineItem: cloneLineItem, deleteLineItem: deleteLineItem, invoiceItemIndex: invoiceItemIndex, onRemoveInvoiceItemPressed: onRemoveInvoiceItemPressed, @@ -77,11 +79,15 @@ class QuoteEditItemsVM extends EntityEditItemsVM { Store store, bool isTasks, ) { + final state = store.state; + final company = state.company; + final quote = store.state.quoteUIState.editing; + return QuoteEditItemsVM( - state: store.state, - company: store.state.company, - invoice: store.state.quoteUIState.editing, - invoiceItemIndex: store.state.quoteUIState.editingItemIndex, + state: state, + company: company, + invoice: quote, + invoiceItemIndex: state.quoteUIState.editingItemIndex, onRemoveInvoiceItemPressed: (index) { store.dispatch(DeleteQuoteItem(index)); }, @@ -105,6 +111,22 @@ class QuoteEditItemsVM extends EntityEditItemsVM { MoveQuoteItem(oldIndex: oldIndex, newIndex: newIndex), ); }, + addLineItem: ([int? index]) { + store.dispatch( + AddQuoteItem( + index: index, + quoteItem: InvoiceItemEntity(), + ), + ); + }, + cloneLineItem: (int? index) { + store.dispatch( + AddQuoteItem( + index: index, + quoteItem: quote!.lineItems[index!].clone, + ), + ); + }, ); } } diff --git a/lib/ui/recurring_invoice/edit/recurring_invoice_edit_items_vm.dart b/lib/ui/recurring_invoice/edit/recurring_invoice_edit_items_vm.dart index 66c319ff5b1..94f06eb728e 100644 --- a/lib/ui/recurring_invoice/edit/recurring_invoice_edit_items_vm.dart +++ b/lib/ui/recurring_invoice/edit/recurring_invoice_edit_items_vm.dart @@ -55,6 +55,7 @@ class RecurringInvoiceEditItemsVM extends EntityEditItemsVM { InvoiceEntity? invoice, int? invoiceItemIndex, Function? addLineItem, + Function? cloneLineItem, Function? deleteLineItem, Function(int)? onRemoveInvoiceItemPressed, Function? onDoneInvoiceItemPressed, @@ -65,6 +66,7 @@ class RecurringInvoiceEditItemsVM extends EntityEditItemsVM { company: company, invoice: invoice, addLineItem: addLineItem, + cloneLineItem: cloneLineItem, deleteLineItem: deleteLineItem, invoiceItemIndex: invoiceItemIndex, onRemoveInvoiceItemPressed: onRemoveInvoiceItemPressed, @@ -75,10 +77,14 @@ class RecurringInvoiceEditItemsVM extends EntityEditItemsVM { factory RecurringInvoiceEditItemsVM.fromStore( Store store, bool isTasks) { + final state = store.state; + final company = state.company; + final invoice = store.state.recurringInvoiceUIState.editing; + return RecurringInvoiceEditItemsVM( - state: store.state, - company: store.state.company, - invoice: store.state.recurringInvoiceUIState.editing, + state: state, + company: company, + invoice: invoice, invoiceItemIndex: store.state.recurringInvoiceUIState.editingItemIndex, onRemoveInvoiceItemPressed: (index) { store.dispatch(DeleteRecurringInvoiceItem(index)); @@ -103,6 +109,22 @@ class RecurringInvoiceEditItemsVM extends EntityEditItemsVM { MoveRecurringInvoiceItem(oldIndex: oldIndex, newIndex: newIndex), ); }, + addLineItem: ([int? index]) { + store.dispatch( + AddRecurringInvoiceItem( + index: index, + invoiceItem: InvoiceItemEntity(), + ), + ); + }, + cloneLineItem: (int? index) { + store.dispatch( + AddRecurringInvoiceItem( + index: index, + invoiceItem: invoice!.lineItems[index!].clone, + ), + ); + }, ); } } diff --git a/lib/ui/settings/import_export.dart b/lib/ui/settings/import_export.dart index 0f528ce1747..400bdb643fd 100644 --- a/lib/ui/settings/import_export.dart +++ b/lib/ui/settings/import_export.dart @@ -18,7 +18,9 @@ import 'package:invoiceninja_flutter/redux/bank_account/bank_account_actions.dar import 'package:invoiceninja_flutter/redux/bank_account/bank_account_selectors.dart'; import 'package:invoiceninja_flutter/ui/app/entity_dropdown.dart'; import 'package:invoiceninja_flutter/ui/app/forms/app_dropdown_button.dart'; +import 'package:invoiceninja_flutter/ui/app/forms/bool_dropdown_button.dart'; import 'package:invoiceninja_flutter/ui/app/forms/date_picker.dart'; +import 'package:invoiceninja_flutter/utils/icons.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; // Project imports: @@ -66,6 +68,7 @@ class _ImportExportState extends State { var _exportDateRange = ''; var _exportStartDate = ''; var _exportEndDate = ''; + bool _exportDocuments = false; bool _isExporting = false; @@ -306,6 +309,20 @@ class _ImportExportState extends State { ] ], ], + if (_exportFormat == ImportType.csv && + _exportType.hasDocuments) + Padding( + padding: const EdgeInsets.only(top: 16), + child: BoolDropdownButton( + iconData: getEntityIcon(EntityType.document), + label: localization.attachDocuments, + value: _exportDocuments, + onChanged: (value) { + setState(() { + _exportDocuments = value == true; + }); + }), + ), Row( children: [ Expanded( @@ -353,6 +370,9 @@ class _ImportExportState extends State { 'date_range': _exportDateRange, 'start_date': _exportStartDate, 'end_date': _exportEndDate, + 'document_email_attachment': _exportDocuments, + 'include_deleted': + state.company.reportIncludeDeleted, }; if (_exportType == ExportType.profitloss) { @@ -375,20 +395,23 @@ class _ImportExportState extends State { }, ), ), - SizedBox(width: kGutterWidth), - Expanded( + if (_exportFormat == ImportType.csv) ...[ + SizedBox(width: kGutterWidth), + Expanded( child: AppButton( - label: localization.schedule, - iconData: Icons.schedule, - onPressed: () { - createEntity( - entity: ScheduleEntity( - ScheduleEntity.TEMPLATE_EMAIL_REPORT) - .rebuild((b) => b - ..parameters.reportName = - _exportType.name)); - }, - )) + label: localization.schedule, + iconData: Icons.schedule, + onPressed: () { + createEntity( + entity: ScheduleEntity( + ScheduleEntity.TEMPLATE_EMAIL_REPORT) + .rebuild((b) => b + ..parameters.reportName = + _exportType.name)); + }, + ), + ), + ], ], ) ], diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 96fd011302d..17f149499e7 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -1,4 +1,10 @@ PODS: + - AppAuth (1.7.5): + - AppAuth/Core (= 1.7.5) + - AppAuth/ExternalUserAgent (= 1.7.5) + - AppAuth/Core (1.7.5) + - AppAuth/ExternalUserAgent (1.7.5): + - AppAuth/Core - desktop_drop (0.0.1): - FlutterMacOS - device_info_plus (0.0.1): @@ -6,6 +12,24 @@ PODS: - file_selector_macos (0.0.1): - FlutterMacOS - FlutterMacOS (1.0.0) + - google_sign_in_ios (0.0.1): + - AppAuth (>= 1.7.4) + - Flutter + - FlutterMacOS + - GoogleSignIn (~> 7.1) + - GTMSessionFetcher (>= 3.4.0) + - GoogleSignIn (7.1.0): + - AppAuth (< 2.0, >= 1.7.3) + - GTMAppAuth (< 5.0, >= 4.1.1) + - GTMSessionFetcher/Core (~> 3.3) + - GTMAppAuth (4.1.1): + - AppAuth/Core (~> 1.7) + - GTMSessionFetcher/Core (< 4.0, >= 3.3) + - GTMSessionFetcher (3.4.1): + - GTMSessionFetcher/Full (= 3.4.1) + - GTMSessionFetcher/Core (3.4.1) + - GTMSessionFetcher/Full (3.4.1): + - GTMSessionFetcher/Core - in_app_purchase_storekit (0.0.1): - Flutter - FlutterMacOS @@ -22,13 +46,13 @@ PODS: - FlutterMacOS - screen_retriever (0.0.1): - FlutterMacOS - - Sentry/HybridSDK (8.18.0): - - SentryPrivate (= 8.18.0) - - sentry_flutter (0.0.1): + - Sentry/HybridSDK (8.21.0): + - SentryPrivate (= 8.21.0) + - sentry_flutter (7.20.0): - Flutter - FlutterMacOS - - Sentry/HybridSDK (= 8.18.0) - - SentryPrivate (8.18.0) + - Sentry/HybridSDK (= 8.21.0) + - SentryPrivate (8.21.0) - share_plus (0.0.1): - FlutterMacOS - shared_preferences_foundation (0.0.1): @@ -50,6 +74,7 @@ DEPENDENCIES: - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) - file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`) - FlutterMacOS (from `Flutter/ephemeral`) + - google_sign_in_ios (from `Flutter/ephemeral/.symlinks/plugins/google_sign_in_ios/darwin`) - in_app_purchase_storekit (from `Flutter/ephemeral/.symlinks/plugins/in_app_purchase_storekit/darwin`) - in_app_review (from `Flutter/ephemeral/.symlinks/plugins/in_app_review/macos`) - package_info (from `Flutter/ephemeral/.symlinks/plugins/package_info/macos`) @@ -68,6 +93,10 @@ DEPENDENCIES: SPEC REPOS: trunk: + - AppAuth + - GoogleSignIn + - GTMAppAuth + - GTMSessionFetcher - Sentry - SentryPrivate @@ -80,6 +109,8 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos FlutterMacOS: :path: Flutter/ephemeral + google_sign_in_ios: + :path: Flutter/ephemeral/.symlinks/plugins/google_sign_in_ios/darwin in_app_purchase_storekit: :path: Flutter/ephemeral/.symlinks/plugins/in_app_purchase_storekit/darwin in_app_review: @@ -112,22 +143,27 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/window_manager/macos SPEC CHECKSUMS: + AppAuth: 501c04eda8a8d11f179dbe8637b7a91bb7e5d2fa desktop_drop: 69eeff437544aa619c8db7f4481b3a65f7696898 device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f file_selector_macos: 468fb6b81fac7c0e88d71317f3eec34c3b008ff9 FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 - in_app_purchase_storekit: 4fb7ee9e824b1f09107fbfbbce8c4b276366dc43 + google_sign_in_ios: 07375bfbf2620bc93a602c0e27160d6afc6ead38 + GoogleSignIn: d4281ab6cf21542b1cfaff85c191f230b399d2db + GTMAppAuth: f69bd07d68cd3b766125f7e072c45d7340dea0de + GTMSessionFetcher: 8000756fc1c19d2e5697b90311f7832d2e33f6cd + in_app_purchase_storekit: 0e4b3c2e43ba1e1281f4f46dd71b0593ce529892 in_app_review: a850789fad746e89bce03d4aeee8078b45a53fd0 package_info: 6eba2fd8d3371dda2d85c8db6fe97488f24b74b2 - package_info_plus: 02d7a575e80f194102bef286361c6c326e4c29ce - path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + package_info_plus: fa739dd842b393193c5ca93c26798dff6e3d0e0c + path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c printing: 1dd6a1fce2209ec240698e2439a4adbb9b427637 screen_retriever: 59634572a57080243dd1bf715e55b6c54f241a38 - Sentry: 8984a4ffb2b9bd2894d74fb36e6f5833865bc18e - sentry_flutter: c87a0556eeb6cbf7f9f924d30e878bdedf22d364 - SentryPrivate: 2f0c9ba4c3fc993f70eab6ca95673509561e0085 + Sentry: ebc12276bd17613a114ab359074096b6b3725203 + sentry_flutter: df6e28477322fc5202bbe20aafdd7404b6e97729 + SentryPrivate: d651efb234cf385ec9a1cdd3eff94b5e78a0e0fe share_plus: 76dd39142738f7a68dd57b05093b5e8193f220f7 - shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 + shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695 sign_in_with_apple: a9e97e744e8edc36aefc2723111f652102a7a727 smart_auth: b38e3ab4bfe089eacb1e233aca1a2340f96c28e9 url_launcher_macos: d2691c7dd33ed713bf3544850a623080ec693d95 diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 9715076a496..4afe32f32e1 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -282,6 +282,7 @@ 3399D490228B24CF009A79C7 /* ShellScript */, 4A8F10BFEE9B664055EA40D7 /* [CP] Embed Pods Frameworks */, F9395FAC2A3A30DF0066F1E7 /* Embed Foundation Extensions */, + 3A7FF4E2915137CEBBD1632D /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -336,7 +337,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1420; - LastUpgradeCheck = 1430; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 33CC10EC2044A3C60003C045 = { @@ -448,6 +449,23 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; + 3A7FF4E2915137CEBBD1632D /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; 4A8F10BFEE9B664055EA40D7 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 4a0fcf5869f..553df6b23be 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@