From 7e88ebc0c54d71d6453104cff21521c221c592ed Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Sun, 8 Feb 2026 20:18:43 +0800 Subject: [PATCH 01/21] iOS stuff --- assets/l10n/en.json | 1 + assets/l10n/mn_MN.json | 1 + ios/Runner.xcodeproj/project.pbxproj | 12 + ios/Runner/Info.plist | 822 ++++++++++---------- ios/Runner/RecordTransactionIntent.swift | 23 + ios/Runner/RecordedTransaction.swift | 20 + ios/Runner/RecordedTransactionService.swift | 26 + ios/Runner/Runner.entitlements | 2 + lib/services/integrations/eny.dart | 2 +- 9 files changed, 497 insertions(+), 412 deletions(-) create mode 100644 ios/Runner/RecordTransactionIntent.swift create mode 100644 ios/Runner/RecordedTransaction.swift create mode 100644 ios/Runner/RecordedTransactionService.swift diff --git a/assets/l10n/en.json b/assets/l10n/en.json index 755abf65..cbf45c34 100644 --- a/assets/l10n/en.json +++ b/assets/l10n/en.json @@ -669,6 +669,7 @@ "transaction.edit.selectCategory.multiple": "Select categories", "transaction.edit.selectTags": "Select tags", "transaction.external.added": "A new transaction was added", + "transaction.external.added.from": "A new transaction was added by {name}", "transaction.external.from": "Added from {name}", "transaction.fallbackTitle": "Untitled transaction", "transaction.location": "Location", diff --git a/assets/l10n/mn_MN.json b/assets/l10n/mn_MN.json index b436b3dd..f6db5cfa 100644 --- a/assets/l10n/mn_MN.json +++ b/assets/l10n/mn_MN.json @@ -669,6 +669,7 @@ "transaction.edit.selectCategory.multiple": "Ангилаллууд сонгох", "transaction.edit.selectTags": "Шошгууд сонгох", "transaction.external.added": "Шинэ гүйлгээ нэмэгдлээ", + "transaction.external.added.from": "{name}-с шинэ гүйлгээ нэмэгдлээ", "transaction.external.from": "{name}-с нэмэгдсэн гүйлгээ", "transaction.fallbackTitle": "Гарчиггүй гүйлгээ", "transaction.location": "Байршил", diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 48fda4f2..a2865b2b 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -8,6 +8,9 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 2F5FC4CA2F38B4010045CB46 /* RecordTransactionIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F5FC4C92F38B4010045CB46 /* RecordTransactionIntent.swift */; }; + 2F5FC4CD2F38B5F80045CB46 /* RecordedTransactionService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F5FC4CC2F38B5F80045CB46 /* RecordedTransactionService.swift */; }; + 2F5FC4CE2F38B5F80045CB46 /* RecordedTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F5FC4CB2F38B5F80045CB46 /* RecordedTransaction.swift */; }; 2FA9672D2EAA8E7900D758DC /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FA9672C2EAA8E7900D758DC /* WidgetKit.framework */; }; 2FA9672F2EAA8E7900D758DC /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FA9672E2EAA8E7900D758DC /* SwiftUI.framework */; }; 2FA9673E2EAA8E7A00D758DC /* Flow WidgetsExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 2FA9672B2EAA8E7900D758DC /* Flow WidgetsExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; @@ -68,6 +71,9 @@ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 2C95C2C1064154F5713B5FDA /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 2F5FC4C92F38B4010045CB46 /* RecordTransactionIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTransactionIntent.swift; sourceTree = ""; }; + 2F5FC4CB2F38B5F80045CB46 /* RecordedTransaction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordedTransaction.swift; sourceTree = ""; }; + 2F5FC4CC2F38B5F80045CB46 /* RecordedTransactionService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordedTransactionService.swift; sourceTree = ""; }; 2F88D2CA2D82C1E200BE0559 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; 2FA9672B2EAA8E7900D758DC /* Flow WidgetsExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Flow WidgetsExtension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; 2FA9672C2EAA8E7900D758DC /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; @@ -206,6 +212,8 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( + 2F5FC4CB2F38B5F80045CB46 /* RecordedTransaction.swift */, + 2F5FC4CC2F38B5F80045CB46 /* RecordedTransactionService.swift */, 2F88D2CA2D82C1E200BE0559 /* Runner.entitlements */, 2F7D63EA2CD8F63D00B8BE47 /* LauncherIcons */, 97C146FA1CF9000F007C117D /* Main.storyboard */, @@ -216,6 +224,7 @@ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + 2F5FC4C92F38B4010045CB46 /* RecordTransactionIntent.swift */, ); path = Runner; sourceTree = ""; @@ -527,6 +536,9 @@ files = ( 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + 2F5FC4CD2F38B5F80045CB46 /* RecordedTransactionService.swift in Sources */, + 2F5FC4CE2F38B5F80045CB46 /* RecordedTransaction.swift in Sources */, + 2F5FC4CA2F38B4010045CB46 /* RecordTransactionIntent.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 26589e95..88bb319c 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -1,434 +1,434 @@ + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Flow + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIcons - CADisableMinimumFrameDurationOnPhone - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - Flow - CFBundleExecutable - $(EXECUTABLE_NAME) - FlutterDeepLinkingEnabled - - CFBundleIcons + CFBundleAlternateIcons - CFBundleAlternateIcons - - blissfulBerry - - CFBundleIconFiles - - blissfulBerry - - UIPrerenderedIcon - - - bohemianBlue - - CFBundleIconFiles - - bohemianBlue - - UIPrerenderedIcon - - - burntSienna - - CFBundleIconFiles - - burntSienna - - UIPrerenderedIcon - - - cherryPlum - - CFBundleIconFiles - - cherryPlum - - UIPrerenderedIcon - - - crispChristmasCranberries - - CFBundleIconFiles - - crispChristmasCranberries - - UIPrerenderedIcon - - - egyptianBlue - - CFBundleIconFiles - - egyptianBlue - - UIPrerenderedIcon - - - flagGreen - - CFBundleIconFiles - - flagGreen - - UIPrerenderedIcon - - - hydraTurquoise - - CFBundleIconFiles - - hydraTurquoise - - UIPrerenderedIcon - - - peacockBlue - - CFBundleIconFiles - - peacockBlue - - UIPrerenderedIcon - - - shadeOfViolet - - CFBundleIconFiles - - shadeOfViolet - - UIPrerenderedIcon - - - soilOfAvagddu - - CFBundleIconFiles - - soilOfAvagddu - - UIPrerenderedIcon - - - spaceBattleBlue - - CFBundleIconFiles - - spaceBattleBlue - - UIPrerenderedIcon - - - spreadsheetGreen - - CFBundleIconFiles - - spreadsheetGreen - - UIPrerenderedIcon - - - tokiwaGreen - - CFBundleIconFiles - - tokiwaGreen - - UIPrerenderedIcon - - - toyCamouflage - - CFBundleIconFiles - - toyCamouflage - - UIPrerenderedIcon - - - tropicana - - CFBundleIconFiles - - tropicana - - UIPrerenderedIcon - - - - CFBundlePrimaryIcon + blissfulBerry + + CFBundleIconFiles + + blissfulBerry + + UIPrerenderedIcon + + + bohemianBlue + + CFBundleIconFiles + + bohemianBlue + + UIPrerenderedIcon + + + burntSienna + + CFBundleIconFiles + + burntSienna + + UIPrerenderedIcon + + + cherryPlum + + CFBundleIconFiles + + cherryPlum + + UIPrerenderedIcon + + + crispChristmasCranberries + + CFBundleIconFiles + + crispChristmasCranberries + + UIPrerenderedIcon + + + egyptianBlue + + CFBundleIconFiles + + egyptianBlue + + UIPrerenderedIcon + + + flagGreen + + CFBundleIconFiles + + flagGreen + + UIPrerenderedIcon + + + hydraTurquoise + + CFBundleIconFiles + + hydraTurquoise + + UIPrerenderedIcon + + + peacockBlue + + CFBundleIconFiles + + peacockBlue + + UIPrerenderedIcon + + + shadeOfViolet CFBundleIconFiles shadeOfViolet UIPrerenderedIcon - + + + soilOfAvagddu + + CFBundleIconFiles + + soilOfAvagddu + + UIPrerenderedIcon + + + spaceBattleBlue + + CFBundleIconFiles + + spaceBattleBlue + + UIPrerenderedIcon + + + spreadsheetGreen + + CFBundleIconFiles + + spreadsheetGreen + + UIPrerenderedIcon + + + tokiwaGreen + + CFBundleIconFiles + + tokiwaGreen + + UIPrerenderedIcon + + + toyCamouflage + + CFBundleIconFiles + + toyCamouflage + + UIPrerenderedIcon + + + tropicana + + CFBundleIconFiles + + tropicana + + UIPrerenderedIcon + - CFBundleIcons~ipad + CFBundlePrimaryIcon + + CFBundleIconFiles + + shadeOfViolet + + UIPrerenderedIcon + + + + CFBundleIcons~ipad + + CFBundleAlternateIcons - CFBundleAlternateIcons - - blissfulBerry - - CFBundleIconFiles - - blissfulBerry-ipad - blissfulBerry-ipad-pro - - UIPrerenderedIcon - - - bohemianBlue - - CFBundleIconFiles - - bohemianBlue-ipad - bohemianBlue-ipad-pro - - UIPrerenderedIcon - - - burntSienna - - CFBundleIconFiles - - burntSienna-ipad - burntSienna-ipad-pro - - UIPrerenderedIcon - - - cherryPlum - - CFBundleIconFiles - - cherryPlum-ipad - cherryPlum-ipad-pro - - UIPrerenderedIcon - - - crispChristmasCranberries - - CFBundleIconFiles - - crispChristmasCranberries-ipad - crispChristmasCranberries-ipad-pro - - UIPrerenderedIcon - - - egyptianBlue - - CFBundleIconFiles - - egyptianBlue-ipad - egyptianBlue-ipad-pro - - UIPrerenderedIcon - - - flagGreen - - CFBundleIconFiles - - flagGreen-ipad - flagGreen-ipad-pro - - UIPrerenderedIcon - - - hydraTurquoise - - CFBundleIconFiles - - hydraTurquoise-ipad - hydraTurquoise-ipad-pro - - UIPrerenderedIcon - - - peacockBlue - - CFBundleIconFiles - - peacockBlue-ipad - peacockBlue-ipad-pro - - UIPrerenderedIcon - - - shadeOfViolet - - CFBundleIconFiles - - shadeOfViolet-ipad - shadeOfViolet-ipad-pro - - UIPrerenderedIcon - - - soilOfAvagddu - - CFBundleIconFiles - - soilOfAvagddu-ipad - soilOfAvagddu-ipad-pro - - UIPrerenderedIcon - - - spaceBattleBlue - - CFBundleIconFiles - - spaceBattleBlue-ipad - spaceBattleBlue-ipad-pro - - UIPrerenderedIcon - - - spreadsheetGreen - - CFBundleIconFiles - - spreadsheetGreen-ipad - spreadsheetGreen-ipad-pro - - UIPrerenderedIcon - - - tokiwaGreen - - CFBundleIconFiles - - tokiwaGreen-ipad - tokiwaGreen-ipad-pro - - UIPrerenderedIcon - - - toyCamouflage - - CFBundleIconFiles - - toyCamouflage-ipad - toyCamouflage-ipad-pro - - UIPrerenderedIcon - - - tropicana - - CFBundleIconFiles - - tropicana-ipad - tropicana-ipad-pro - - UIPrerenderedIcon - - - - CFBundlePrimaryIcon + blissfulBerry CFBundleIconFiles - shadeOfViolet + blissfulBerry-ipad + blissfulBerry-ipad-pro UIPrerenderedIcon - + + bohemianBlue + + CFBundleIconFiles + + bohemianBlue-ipad + bohemianBlue-ipad-pro + + UIPrerenderedIcon + + + burntSienna + + CFBundleIconFiles + + burntSienna-ipad + burntSienna-ipad-pro + + UIPrerenderedIcon + + + cherryPlum + + CFBundleIconFiles + + cherryPlum-ipad + cherryPlum-ipad-pro + + UIPrerenderedIcon + + + crispChristmasCranberries + + CFBundleIconFiles + + crispChristmasCranberries-ipad + crispChristmasCranberries-ipad-pro + + UIPrerenderedIcon + + + egyptianBlue + + CFBundleIconFiles + + egyptianBlue-ipad + egyptianBlue-ipad-pro + + UIPrerenderedIcon + + + flagGreen + + CFBundleIconFiles + + flagGreen-ipad + flagGreen-ipad-pro + + UIPrerenderedIcon + + + hydraTurquoise + + CFBundleIconFiles + + hydraTurquoise-ipad + hydraTurquoise-ipad-pro + + UIPrerenderedIcon + + + peacockBlue + + CFBundleIconFiles + + peacockBlue-ipad + peacockBlue-ipad-pro + + UIPrerenderedIcon + + + shadeOfViolet + + CFBundleIconFiles + + shadeOfViolet-ipad + shadeOfViolet-ipad-pro + + UIPrerenderedIcon + + + soilOfAvagddu + + CFBundleIconFiles + + soilOfAvagddu-ipad + soilOfAvagddu-ipad-pro + + UIPrerenderedIcon + + + spaceBattleBlue + + CFBundleIconFiles + + spaceBattleBlue-ipad + spaceBattleBlue-ipad-pro + + UIPrerenderedIcon + + + spreadsheetGreen + + CFBundleIconFiles + + spreadsheetGreen-ipad + spreadsheetGreen-ipad-pro + + UIPrerenderedIcon + + + tokiwaGreen + + CFBundleIconFiles + + tokiwaGreen-ipad + tokiwaGreen-ipad-pro + + UIPrerenderedIcon + + + toyCamouflage + + CFBundleIconFiles + + toyCamouflage-ipad + toyCamouflage-ipad-pro + + UIPrerenderedIcon + + + tropicana + + CFBundleIconFiles + + tropicana-ipad + tropicana-ipad-pro + + UIPrerenderedIcon + + + + CFBundlePrimaryIcon + + CFBundleIconFiles + + shadeOfViolet + + UIPrerenderedIcon + - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleLocalizations - - en - mn - it - tr - fr - ar - de - ru - es - uk - - CFBundleName - flow - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleTypeRole - Viewer - CFBundleURLIconFile - shadeOfViolet@3x - CFBundleURLName - mn.flow.flow - CFBundleURLSchemes - - flow-mn - - - - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - ITSAppUsesNonExemptEncryption - - LSRequiresIPhoneOS - - LSSupportsOpeningDocumentsInPlace - - NSFaceIDUsageDescription - Flow uses Face ID if you choose to require Face ID to open the app for authentication - NSCameraUsageDescription - Flow uses camera if you choose to take photos or videos and attach it to a transaction - NSMicrophoneUsageDescription - Flow uses microphone if you choose to record audio/video and attach it to a transaction - NSLocationWhenInUseUsageDescription - Location is used if you choose to auto-attach your current location to your + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleLocalizations + + en + mn + it + tr + fr + ar + de + ru + es + uk + + CFBundleName + flow + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleTypeRole + Viewer + CFBundleURLIconFile + shadeOfViolet@3x + CFBundleURLName + mn.flow.flow + CFBundleURLSchemes + + flow-mn + + + + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + FlutterDeepLinkingEnabled + + ITSAppUsesNonExemptEncryption + + LSRequiresIPhoneOS + + LSSupportsOpeningDocumentsInPlace + + NSCameraUsageDescription + Flow uses camera if you choose to take photos or videos and attach it to a transaction + NSContactsUsageDescription + Flow will need access to your contacts if you want to attach contact tags to your transactions. - NSPhotoLibraryUsageDescription - Flow uses the photo library when user updates their picture, or chooses to use image as - category/account icon - NSContactsUsageDescription - Flow will need access to your contacts if you want to attach contact tags to your + NSFaceIDUsageDescription + Flow uses Face ID if you choose to require Face ID to open the app for authentication + NSLocationWhenInUseUsageDescription + Location is used if you choose to auto-attach your current location to your transactions. - UIApplicationSupportsIndirectInputEvents - - UIFileSharingEnabled - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - \ No newline at end of file + NSMicrophoneUsageDescription + Flow uses microphone if you choose to record audio/video and attach it to a transaction + NSPhotoLibraryUsageDescription + Flow uses the photo library when user updates their picture, or chooses to use image as + category/account icon + UIApplicationSupportsIndirectInputEvents + + UIFileSharingEnabled + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/ios/Runner/RecordTransactionIntent.swift b/ios/Runner/RecordTransactionIntent.swift new file mode 100644 index 00000000..6998158e --- /dev/null +++ b/ios/Runner/RecordTransactionIntent.swift @@ -0,0 +1,23 @@ +import AppIntents + +struct RecordTransactionIntent: AppIntent { + static var title: LocalizedStringResource = "Record Transaction" + static var description: IntentDescription = "Log transactions from Siri." + + @Parameter(title: "Account") + var account: String + + @Parameter(title: "Amount") + var amount: Double + + @Parameter(title: "Category") + var category: String + + static var openAppWhenRun = false + + func perform() async throws -> some IntentResult { + let tx = RecordedTransaction(amount: amount, note: category) + try RecordedTransactionService.append(tx) + return .result(value: "Recorded transaction for \(account): $\(amount) in category \(category).") + } +} diff --git a/ios/Runner/RecordedTransaction.swift b/ios/Runner/RecordedTransaction.swift new file mode 100644 index 00000000..2cab1add --- /dev/null +++ b/ios/Runner/RecordedTransaction.swift @@ -0,0 +1,20 @@ +import Foundation + +struct RecordedTransaction: Codable { + let id: UUID + let amount: Double + let note: String + let createdAt: Date + + init( + id: UUID = UUID(), + amount: Double, + note: String = "", + createdAt: Date = Date() + ) { + self.id = id + self.amount = amount + self.note = note + self.createdAt = createdAt + } +} diff --git a/ios/Runner/RecordedTransactionService.swift b/ios/Runner/RecordedTransactionService.swift new file mode 100644 index 00000000..140c3159 --- /dev/null +++ b/ios/Runner/RecordedTransactionService.swift @@ -0,0 +1,26 @@ +struct RecordedTransactionService { + static let groupId = "group.mn.flow.flow" + static let fileName = "recorded_transactions.jsonl" + + static func append(_ tx: RecordedTransaction) throws { + let fm = FileManager.default + let url = fm + .containerURL(forSecurityApplicationGroupIdentifier: groupId)! + .appendingPathComponent(fileName) + let encoder = JSONEncoder() + encoder.dateEncodingStrategy = .iso8601 + encoder.outputFormatting = .withoutEscapingSlashes + + let data = try encoder.encode(tx) + let line = data + Data([0x0A]) // newline + + if fm.fileExists(atPath: url.path) { + let handle = try FileHandle(forWritingTo: url) + try handle.seekToEnd() + try handle.write(contentsOf: line) + try handle.close() + } else { + try line.write(to: url) + } + } +} diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements index db75016e..af3dddd6 100644 --- a/ios/Runner/Runner.entitlements +++ b/ios/Runner/Runner.entitlements @@ -13,6 +13,8 @@ CloudKit CloudDocuments + com.apple.developer.siri + com.apple.developer.ubiquity-container-identifiers iCloud.mn.flow.flow diff --git a/lib/services/integrations/eny.dart b/lib/services/integrations/eny.dart index 7335eb6c..1adffc90 100644 --- a/lib/services/integrations/eny.dart +++ b/lib/services/integrations/eny.dart @@ -355,7 +355,7 @@ class EnyService { .catchError((error) => false); if (succeeded) { ExternalToastsService().addToast( - "transaction.external.added".tr(), + "transaction.external.added.from".tr("Eny"), .success, ); } From 68e839fbe0a1203a28707cf0470ec7ff4eba270f Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Sun, 8 Feb 2026 20:25:02 +0800 Subject: [PATCH 02/21] siri initial draft --- CHANGELOG.md | 6 +++++ ios/Runner.xcodeproj/project.pbxproj | 23 ++++++++----------- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- pubspec.yaml | 2 +- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f67f26f3..ca1ebd48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Next + +### New features + +* Added a Siri integration (intent). + ## 0.18.2 ### Fixes diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a2865b2b..9fe04113 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -332,7 +332,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - BuildIndependentTargetsInParallel = NO; + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 2600; LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; @@ -609,6 +609,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = NJH37247C9; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -623,6 +624,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = YES; SUPPORTED_PLATFORMS = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; @@ -639,10 +641,9 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = NJH37247C9; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -671,7 +672,6 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = NJH37247C9; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; @@ -717,7 +717,6 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = NJH37247C9; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; @@ -760,7 +759,6 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = NJH37247C9; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; @@ -796,7 +794,6 @@ CODE_SIGN_IDENTITY = "Apple Distribution: Batmend Ganbaatar (NJH37247C9)"; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = NJH37247C9; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = mn.flow.flow.RunnerTests; @@ -816,7 +813,6 @@ CODE_SIGN_IDENTITY = "Apple Distribution: Batmend Ganbaatar (NJH37247C9)"; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = NJH37247C9; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = mn.flow.flow.RunnerTests; @@ -834,7 +830,6 @@ CODE_SIGN_IDENTITY = "Apple Distribution: Batmend Ganbaatar (NJH37247C9)"; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = NJH37247C9; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = mn.flow.flow.RunnerTests; @@ -876,6 +871,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = NJH37247C9; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -897,6 +893,7 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -933,6 +930,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = NJH37247C9; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -947,6 +945,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = YES; SUPPORTED_PLATFORMS = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; @@ -965,10 +964,9 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = NJH37247C9; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -993,10 +991,9 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = NJH37247C9; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c3fedb29..95d6e55f 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,7 +1,7 @@ + version = "1.7"> diff --git a/pubspec.yaml b/pubspec.yaml index 99f2e122..076c1fc2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: A personal finance managing app publish_to: "none" # Remove this line if you wish to publish to pub.dev -version: "0.18.2+317" +version: "0.19.0+317" environment: sdk: ">=3.10.0 <4.0.0" From 84fc9458b820ae41e572385533d5c7f8bb2f038b Mon Sep 17 00:00:00 2001 From: Aref Bahreini Date: Mon, 9 Feb 2026 00:03:01 +0330 Subject: [PATCH 03/21] Add translation --- assets/l10n/fa_IR.json | 758 ++++++++++++++++++++++++++++++ lib/l10n/supported_languages.dart | 1 + 2 files changed, 759 insertions(+) create mode 100644 assets/l10n/fa_IR.json diff --git a/assets/l10n/fa_IR.json b/assets/l10n/fa_IR.json new file mode 100644 index 00000000..ccf6dbdd --- /dev/null +++ b/assets/l10n/fa_IR.json @@ -0,0 +1,758 @@ +{ + "account": "حساب", + "account.archive": "غیرفعال کردن", + "account.archive.description": "غیرفعال کردن حساب، آن را در همه‌جا به‌جز گزارش‌ها مخفی می‌کند. می‌توانید بعد از غیرفعال‌سازی، حساب را به‌همراه تراکنش‌های مرتبط، برای همیشه حذف کنید.", + "account.archived": "غیرفعال", + "account.balance": "موجودی", + "account.balance.upcomingDescription": "تراکنش‌های آتی روی موجودی فعلی اثر ندارند", + "account.creditLimit": "سقف اعتبار", + "account.delete": "حذف حساب", + "account.delete.description": "با حذف این حساب، {transactionCount} تراکنش مرتبط هم حذف می‌شود. این کار غیرقابل بازگشت است و در سطل زباله هم قرار نمی‌گیرد!", + "account.edit": "ویرایش حساب", + "account.edit.selectCurrency": "یک ارز انتخاب کنید", + "account.excludeFromTotalBalance": "عدم لحاظ در موجودی کل", + "account.excludeFromTotalBalance.description": "اگر این گزینه را فعال کنید، موجودی این حساب در موجودی کل لحاظ نمی‌شود. مناسب برای پس‌انداز یا حساب‌های غیرشخصی.", + "account.name": "نام حساب", + "account.new": "افزودن حساب", + "account.noAccounts": "هیچ حسابی ندارید!", + "account.postTransactionBalance": "موجودی پس از این تراکنش", + "account.primaryAccount": "حساب اصلی", + "account.primaryAccount.changeDescription": "می‌توانید با رفتن به صفحه ویرایش یک حساب دیگر، آن را به‌عنوان حساب اصلی تنظیم کنید.", + "account.primaryAccount.description": "حساب اصلی به‌عنوان حساب پیش‌فرض برای تراکنش‌های جدید و برخی قابلیت‌های دیگر استفاده می‌شود.", + "account.primaryAccount.notPrimary": "حساب اصلی نیست", + "account.primaryAccount.set": "تنظیم به‌عنوان حساب اصلی", + "account.thisMonth": "این ماه", + "account.transactions": "تراکنش‌ها", + "account.transactions.title": "تراکنش‌های «{account}»", + "account.type": "نوع حساب", + "account.updateBalance": "به‌روزرسانی موجودی", + "account.updateBalance.chooseUpdateMode": "انتخاب روش به‌روزرسانی", + "account.updateBalance.transactionTitle": "به‌روزرسانی موجودی", + "account.updateBalance.updateAtDate": "همگام‌سازی موجودی گذشته بر اساس تاریخ", + "account.updateBalance.updateAtDate.description": "مناسب وقتی که موجودی دقیق در یک تاریخ مشخص را می‌دانید", + "account.updateBalance.updateCurrent": "به‌روزرسانی موجودی فعلی", + "accounts": "حساب‌ها", + "appName": "Flow", + "appShortDesc": "مدیریت مالی شخصی شما", + "categories": "دسته‌بندی‌ها", + "categories.addFromPresets": "افزودن از پیش‌فرض‌ها", + "categories.noCategories": "هیچ دسته‌بندی‌ای ندارید", + "category": "دسته‌بندی", + "category.delete": "حذف دسته‌بندی", + "category.delete.description": "با حذف این دسته‌بندی، {transactionCount} تراکنش بدون دسته‌بندی می‌ماند. این کار غیرقابل بازگشت است!", + "category.name": "نام دسته‌بندی", + "category.new": "افزودن دسته‌بندی", + "category.none": "بدون دسته‌بندی", + "category.skip": "بدون دسته‌بندی", + "contributors": "مشارکت‌کنندگان", + "currency": "ارز", + "currency.searchHint": "جستجو... (کشور، ارز، کد)", + "enum.AccountType": "نوع حساب", + "enum.AccountType@asset": "دارایی", + "enum.AccountType@creditLine": "اعتباری (مثلاً کارت)", + "enum.AccountType@debit": "جاری", + "enum.AccountType@loan": "وام", + "enum.AccountType@other": "سایر", + "enum.AccountType@savings": "پس‌انداز", + "enum.BackupEntryType@automated": "پشتیبان‌گیری خودکار", + "enum.BackupEntryType@automated.description": "نسخه پشتیبان به‌صورت خودکار (یعنی زمان‌بندی‌شده) ساخته شده است", + "enum.BackupEntryType@manual": "دستی", + "enum.BackupEntryType@manual.description": "نسخه پشتیبان توسط کاربر ساخته شده است", + "enum.BackupEntryType@other": "پشتیبان دیگر", + "enum.BackupEntryType@other.description": "پشتیبان دیگر", + "enum.BackupEntryType@preAccountDeletion": "احتیاطی (حذف حساب)", + "enum.BackupEntryType@preAccountDeletion.description": "نسخه پشتیبان به‌عنوان احتیاط قبل از حذف یک حساب توسط کاربر ساخته شده است", + "enum.BackupEntryType@preImport": "احتیاطی (پیش از ایمپورت)", + "enum.BackupEntryType@preImport.description": "نسخه پشتیبان به‌عنوان احتیاط قبل از ایمپورت از نسخه پشتیبان قبلی ساخته شده است", + "enum.CSVHeader": "سربرگ‌های CSV", + "enum.CSVHeader@account": "حساب", + "enum.CSVHeader@accountUuid": "شناسه حساب", + "enum.CSVHeader@amount": "مبلغ", + "enum.CSVHeader@category": "دسته‌بندی", + "enum.CSVHeader@categoryUuid": "شناسه دسته‌بندی", + "enum.CSVHeader@createdDate": "تاریخ ایجاد", + "enum.CSVHeader@currency": "ارز", + "enum.CSVHeader@extra": "اضافی (JSON)", + "enum.CSVHeader@latitude": "عرض جغرافیایی", + "enum.CSVHeader@longitude": "طول جغرافیایی", + "enum.CSVHeader@notes": "یادداشت‌ها", + "enum.CSVHeader@subtype": "کلاس تراکنش", + "enum.CSVHeader@title": "عنوان", + "enum.CSVHeader@transactionDate": "تاریخ تراکنش", + "enum.CSVHeader@transactionDateIso8601": "تاریخ تراکنش (ISO 8601)", + "enum.CSVHeader@type": "نوع", + "enum.CSVHeader@uuid": "شناسه", + "enum.FlowButtonType": "نوع تراکنش", + "enum.FlowButtonType@eny": "Eny", + "enum.FlowButtonType@expense": "هزینه", + "enum.FlowButtonType@income": "درآمد", + "enum.FlowButtonType@transfer": "انتقال", + "enum.ImportCSVProgress@creatingAccounts": "در حال ساخت حساب‌ها", + "enum.ImportCSVProgress@creatingCategories": "در حال ساخت دسته‌بندی‌ها", + "enum.ImportCSVProgress@creatingTransactions": "در حال ساخت تراکنش‌ها", + "enum.ImportCSVProgress@erasing": "در حال پاک کردن داده‌های فعلی", + "enum.ImportCSVProgress@error": "مشکلی پیش آمد ({error})", + "enum.ImportCSVProgress@parsing": "در حال پردازش داده‌ها", + "enum.ImportCSVProgress@success": "موفق", + "enum.ImportCSVProgress@waitingConfirmation": "در انتظار تأیید", + "enum.ImportV1Progress@copyingFileAttachments": "در حال کپی پیوست‌های فایل", + "enum.ImportV1Progress@erasing": "در حال پاک کردن داده‌های فعلی", + "enum.ImportV1Progress@error": "مشکلی پیش آمد ({error})", + "enum.ImportV1Progress@resolvingTransactions": "در حال مرتب‌سازی تراکنش‌ها", + "enum.ImportV1Progress@success": "موفق", + "enum.ImportV1Progress@waitingConfirmation": "در انتظار تأیید", + "enum.ImportV1Progress@writingAccounts": "در حال نوشتن حساب‌ها", + "enum.ImportV1Progress@writingCategories": "در حال نوشتن دسته‌بندی‌ها", + "enum.ImportV1Progress@writingTransactions": "در حال نوشتن تراکنش‌ها", + "enum.ImportV2Progress@copyingImages": "در حال کپی تصاویر", + "enum.ImportV2Progress@erasing": "در حال پاک کردن داده‌های فعلی", + "enum.ImportV2Progress@error": "مشکلی پیش آمد ({error})", + "enum.ImportV2Progress@resolvingTransactions": "در حال مرتب‌سازی تراکنش‌ها", + "enum.ImportV2Progress@settingPrimaryCurrency": "در حال تنظیم ارز اصلی", + "enum.ImportV2Progress@success": "موفق", + "enum.ImportV2Progress@waitingConfirmation": "در انتظار تأیید", + "enum.ImportV2Progress@writingAccounts": "در حال نوشتن حساب‌ها", + "enum.ImportV2Progress@writingCategories": "در حال نوشتن دسته‌بندی‌ها", + "enum.ImportV2Progress@writingFileAttachments": "در حال نوشتن پیوست‌های فایل", + "enum.ImportV2Progress@writingProfile": "در حال نوشتن اطلاعات پروفایل", + "enum.ImportV2Progress@writingRecurringTransactions": "در حال نوشتن تراکنش‌های تکرارشونده", + "enum.ImportV2Progress@writingTransactionTags": "در حال نوشتن برچسب‌های تراکنش", + "enum.ImportV2Progress@writingTransactions": "در حال نوشتن تراکنش‌ها", + "enum.ImportV2Progress@writingTranscationFilterPresets": "در حال نوشتن پریست‌های فیلتر تراکنش", + "enum.ImportV2Progress@writingUserPreferences": "در حال نوشتن تنظیمات کاربر", + "enum.PDFHeader@account": "حساب", + "enum.PDFHeader@amount": "مبلغ", + "enum.PDFHeader@category": "دسته‌بندی", + "enum.PDFHeader@title": "عنوان", + "enum.PDFHeader@transactionDate": "تاریخ تراکنش", + "enum.RecurrenceMode@custom": "سفارشی", + "enum.RecurrenceMode@every2Week": "هر ۲ هفته، {weekday}", + "enum.RecurrenceMode@everyDay": "هر روز", + "enum.RecurrenceMode@everyMonth": "هر ماه، {dayOfMonth}", + "enum.RecurrenceMode@everyWeek": "هر هفته، {weekday}", + "enum.RecurrenceMode@everyYear": "هر سال، {monthAndDay}", + "enum.RecurringUpdateMode@all": "همه تراکنش‌ها", + "enum.RecurringUpdateMode@current": "این تراکنش", + "enum.RecurringUpdateMode@thisAndFuture": "این و تراکنش‌های آینده", + "enum.TransactionEditMode@normal": "عادی", + "enum.TransactionEditMode@pending": "در انتظار", + "enum.TransactionEditMode@recurring": "تکرارشونده", + "enum.TransactionEntryAction": "اقدام", + "enum.TransactionEntryAction@attachFiles": "پیوست فایل", + "enum.TransactionEntryAction@inputAmount": "وارد کردن مبلغ", + "enum.TransactionEntryAction@inputNote": "وارد کردن توضیحات", + "enum.TransactionEntryAction@inputTitle": "وارد کردن عنوان", + "enum.TransactionEntryAction@selectAccount": "انتخاب حساب", + "enum.TransactionEntryAction@selectCategoryOrTransferAccount": "انتخاب دسته‌بندی/حساب انتقال", + "enum.TransactionEntryAction@selectPrimaryAccount": "انتخاب حساب اصلی", + "enum.TransactionEntryAction@selectTags": "انتخاب برچسب‌ها", + "enum.TransactionFilterRangePreset@allTime": "تمام مدت", + "enum.TransactionFilterRangePreset@last30Days": "۳۰ روز اخیر", + "enum.TransactionFilterRangePreset@thisMonth": "این ماه", + "enum.TransactionFilterRangePreset@thisWeek": "این هفته", + "enum.TransactionFilterRangePreset@thisYear": "امسال", + "enum.TransactionGroupRange": "واحد گروه‌بندی", + "enum.TransactionGroupRange@allTime": "تمام مدت", + "enum.TransactionGroupRange@day": "روز", + "enum.TransactionGroupRange@hour": "ساعت", + "enum.TransactionGroupRange@month": "ماه", + "enum.TransactionGroupRange@week": "هفته", + "enum.TransactionGroupRange@year": "سال", + "enum.TransactionSearchMode": "حالت جستجو", + "enum.TransactionSearchMode@exact": "تطابق دقیق", + "enum.TransactionSearchMode@none": "بدون عنوان", + "enum.TransactionSearchMode@smart": "هوشمند", + "enum.TransactionSearchMode@substring": "تطابق جزئی", + "enum.TransactionSubtype": "زیرنوع", + "enum.TransactionSubtype#null": "پیش‌فرض", + "enum.TransactionSubtype@givenLoan": "وام (داده‌شده)", + "enum.TransactionSubtype@receivedLoan": "وام (گرفته‌شده)", + "enum.TransactionSubtype@transactionFee": "کارمزد تراکنش", + "enum.TransactionSubtype@updateBalance": "به‌روزرسانی موجودی", + "enum.TransactionTagType": "نوع برچسب", + "enum.TransactionTagType@contact": "شخص", + "enum.TransactionTagType@generic": "عمومی", + "enum.TransactionTagType@location": "موقعیت", + "enum.TransactionType": "نوع تراکنش", + "enum.TransactionType@expense": "هزینه", + "enum.TransactionType@income": "درآمد", + "enum.TransactionType@transfer": "انتقال", + "error.exchangeRates.cannotFetch": "دریافت ناموفق بود، لطفاً اتصال اینترنت را بررسی کنید.", + "error.exchangeRates.inaccurateDataDueToMissingRates": "دریافت نرخ ارز ناموفق بود؛ ممکن است داده‌های تراکنش کاملاً دقیق نباشد", + "error.failedLocalAuth": "احراز هویت ناموفق بود، لطفاً دوباره تلاش کنید.", + "error.input.cropFailed": "حین برش تصویر خطایی رخ داد", + "error.input.duplicate.accountName": "نام «{}» قبلاً استفاده شده است. نام دیگری انتخاب کنید.", + "error.input.invalidZip": "این فایل zip معتبرِ Flow نیست", + "error.input.mustBeNotEmpty": "لطفاً این فیلد را پر کنید", + "error.input.noFilePicked": "هیچ فایلی انتخاب نشد", + "error.input.noImagePicked": "هیچ تصویری انتخاب نشد", + "error.input.pasteFormatMismatch": "امکان پردازش وجود ندارد", + "error.input.wrongFileType": "لطفاً یک فایل {type} انتخاب کنید", + "error.noConnection": "اتصال اینترنت وجود ندارد", + "error.route.400": "بارگذاری صفحه ناموفق بود", + "error.route.404": "صفحه پیدا نشد", + "error.sync.exportFailed": "امکان خروجی گرفتن نیست، لطفاً با توسعه‌دهنده تماس بگیرید.", + "error.sync.fileDeleteFailed": "حین حذف نسخه پشتیبان خطایی رخ داد", + "error.sync.fileNotFound": "فایل پیدا نشد", + "error.sync.invalidBackupFile": "فایل پشتیبان نامعتبر است", + "error.sync.safetyBackupFailed": "امکان شروع ایمپورت نیست", + "error.transaction.missingAccount": "لطفاً یک حساب انتخاب کنید", + "error.url.cannotOpen": "باز کردن لینک ممکن نیست", + "fileAttachment": "فایل", + "fileAttachment.add": "افزودن فایل‌ها", + "fileAttachment.cleanupHangingFiles": "حذف فایل‌های استفاده‌نشده", + "fileAttachment.cleanupHangingFiles.description": "این کار تمام پیوست‌هایی را که به هیچ تراکنشی وصل نیستند حذف می‌کند. اگر تراکنش مرتبط در سطل زباله باشد، فایل حذف نمی‌شود. این کار غیرقابل بازگشت است.", + "fileAttachment.delete": "حذف فایل", + "fileAttachment.delete.description": "این کار فقط کپی ذخیره‌شده در Flow را حذف می‌کند و فایل اصلی دست‌نخورده می‌ماند. می‌توانید بعداً فایل اصلی را دوباره اضافه کنید، اما این عمل قابل بازگشت نیست.", + "fileAttachment.delete.success": "فایل با موفقیت حذف شد", + "fileAttachment.file": "انتخاب از فایل‌ها", + "fileAttachment.open": "{name} باز شود؟", + "fileAttachment.open.description": "مطمئن هستید این فایل را باز کنید؟", + "fileAttachment.photo": "انتخاب یک عکس", + "fileAttachment.photos": "انتخاب چند رسانه", + "fileAttachment.pick": "انتخاب فایل(ها)", + "fileAttachment.share": "اشتراک‌گذاری فایل", + "fileAttachment.takePhoto": "گرفتن عکس", + "flowIcon.change": "تغییر آیکن", + "flowIcon.type.character": "ایموجی/حرف", + "flowIcon.type.character.description": "برای استفاده به‌عنوان آیکن، یک ایموجی یا حرف وارد کنید", + "flowIcon.type.icon": "آیکن", + "flowIcon.type.icon.brands": "برندها و لوگوها", + "flowIcon.type.icon.search": "جستجوی آیکن‌ها...", + "flowIcon.type.icon.symbols": "نمادها", + "flowIcon.type.image": "تصویر", + "flowIcon.type.image.description": "برای استفاده به‌عنوان آیکن، یک تصویر انتخاب کنید", + "flowIcon.type.image.paste": "چسباندن تصویر", + "flowIcon.type.image.pick": "انتخاب تصویر", + "general.areYouSure": "مطمئن هستید؟", + "general.back": "بازگشت", + "general.cancel": "انصراف", + "general.confirm": "تأیید", + "general.copy": "کپی", + "general.copy.clickToCopy": "برای کپی کلیک کنید", + "general.copy.success": "در کلیپ‌بورد کپی شد", + "general.delete": "حذف", + "general.delete.all": "حذف همه", + "general.delete.confirmName": "حذف {name} را تأیید می‌کنید؟", + "general.delete.permanentWarning": "این کار غیرقابل بازگشت است", + "general.delete.unsavedProgress": "بدون ذخیره ببندم؟", + "general.delete.unsavedProgress.description": "تمام تغییرات از بین می‌رود.", + "general.disabled": "غیرفعال", + "general.done": "انجام شد", + "general.edit": "ویرایش", + "general.enabled": "فعال", + "general.flow": "Flow", + "general.nextNDays": "{} روز آینده", + "general.paste": "چسباندن", + "general.save": "ذخیره", + "general.search": "جستجو...", + "general.select": "انتخاب", + "general.select.all": "انتخاب همه", + "general.selectLocation": "انتخاب موقعیت", + "general.unlockToOpen": "برای باز کردن Flow قفل را باز کنید", + "integrations.eny": "Eny", + "integrations.eny.connect": "اتصال Eny", + "integrations.eny.connect.conflict": "یک حساب قبلاً متصل شده است؛ می‌خواهید جایگزین شود؟", + "integrations.eny.connect.success": "Eny با موفقیت متصل شد", + "integrations.eny.connected#false": "قطع اتصال", + "integrations.eny.connected#true": "متصل", + "integrations.eny.creditsRemaining": "اعتبار باقی‌مانده", + "integrations.eny.dashboard": "داشبورد Eny", + "integrations.eny.dashboard.description": "می‌توانید حساب Eny خود را از داشبورد متصل کنید", + "integrations.eny.disconnect": "قطع اتصال Eny", + "integrations.eny.invalidCredentials": "اطلاعات ورود نامعتبر است", + "integrations.eny.invalidCredentials.configure": "پیکربندی", + "integrations.eny.invalidCredentials.description": "از داشبورد دوباره Eny را متصل کنید", + "integrations.eny.multipleImagesNotice": "{n} تصویر برای پردازش ارسال شود؟", + "integrations.eny.multipleImagesNotice.checkNotice": "حتی اگر برخی تصاویر ناموفق باشند هم اعتبار مصرف می‌شود. پس قبل از تأیید، تصاویر را دوباره چک کنید. حداکثر ۵ تصویر را هم‌زمان می‌توانید ارسال کنید.", + "integrations.eny.multipleImagesNotice.description": "مصرف {n} اعتبار Eny", + "integrations.eny.privacyNotice": "اعلان حریم خصوصی", + "integrations.eny.privacyNotice.dataSharing": "داده‌های شما به اینجا ارسال می‌شود:", + "integrations.eny.privacyNotice.dataSharing#eny": "Eny", + "integrations.eny.privacyNotice.dataSharing#google": "Google", + "integrations.eny.privacyNotice.description": "این یک سرویس خارجی است که داده‌های شما را پردازش می‌کند؛ پس درباره چیزی که می‌فرستید دقت کنید. Flow به نمایندگی از شما چیزی ارسال نمی‌کند؛ فقط همان تصاویر/داده‌ای که انتخاب می‌کنید ارسال می‌شود.", + "integrations.eny.privacyNotice.legal": "لطفاً شرایط استفاده و سیاست حریم خصوصی Eny را بررسی کنید.", + "integrations.eny.send": "ارسال", + "integrations.eny.sent": "در حال پردازش رسید، لطفاً صبر کنید...", + "logs.delete": "حذف فایل لاگ", + "logs.delete.confirmation": "مطمئنید می‌خواهید این فایل لاگ را حذف کنید؟", + "logs.deleted": "فایل لاگ با موفقیت حذف شد", + "notifications.alarm.androidDescription": "برای دریافت یادآوری‌های دقیق، مجوز «Alarms and Reminder» (آخرین گزینه در لیست مجوزها) را بدهید.", + "notifications.alarm.permissionNotGranted": "مجوز آلارم/یادآوری داده نشده", + "notifications.openSettingsToGrantPermission": "مجوز اعلان را از تنظیمات سیستم بدهید", + "notifications.permissionNotGranted": "مجوز اعلان داده نشده", + "notifications.reminderText#1": "امروز هزینه‌هایت را ثبت کردی؟", + "notifications.reminderText#2": "ثبت تراکنش‌ها را فراموش نکن!", + "notifications.reminderText#3": "وقت ثبت هزینه‌های امروز است.", + "notifications.reminderText#4": "وضعیت مالی‌ات را کنترل کن، تراکنش‌ها را اضافه کن!", + "notifications.reminderText#5": "Flow یادآوری می‌کند هزینه‌هایت را ثبت کنی!", + "notifications.reminderText#6": "تراکنش‌ها را به‌روزرسانی کن و مدیریت مالی‌ات را حفظ کن.", + "notifications.reminderText#7": "فراموش نکن امروز تراکنش‌هایت را اضافه کنی!", + "preferences": "تنظیمات", + "preferences.appearance": "ظاهر", + "preferences.changeVisuals": "تغییر", + "preferences.changeVisuals.arrow": "فلش", + "preferences.changeVisuals.clickToChange": "برای تغییر، روی فلش/رنگ کلیک کنید", + "preferences.changeVisuals.color": "رنگ", + "preferences.changeVisuals.expenseIncrease": "افزایش هزینه", + "preferences.changeVisuals.incomeIncrease": "افزایش درآمد", + "preferences.dateFormat": "فرمت تاریخ", + "preferences.feedback": "مشکلات و بازخورد", + "preferences.feedback.debugLogs": "مشاهده لاگ‌های دیباگ", + "preferences.hapticFeedback": "بازخورد دکمه", + "preferences.hapticFeedback.description": "بازخورد صوتی/هپتیک هنگام کلیک", + "preferences.integrations": "یکپارچه‌سازی‌ها", + "preferences.language": "زبان", + "preferences.language.choose": "یک زبان انتخاب کنید", + "preferences.moneyFormatting": "فرمت نمایش پول", + "preferences.moneyFormatting.preferFull": "ترجیح مقدار کامل", + "preferences.moneyFormatting.preferFull.description": "تا جای ممکن اعداد را خلاصه نکن", + "preferences.moneyFormatting.setICUPattern": "انتخاب فرمت سفارشی", + "preferences.moneyFormatting.setICUPattern.default": "پیش‌فرض", + "preferences.moneyFormatting.useCurrencySymbol": "استفاده از نماد ارز", + "preferences.moneyFormatting.useCurrencySymbol.description": "مثلاً «$5» به‌جای «5 USD»", + "preferences.numpad": "صفحه‌کلید عددی", + "preferences.numpad.layout": "چیدمان صفحه‌کلید عددی", + "preferences.numpad.layout.classic": "کلاسیک", + "preferences.numpad.layout.modern": "مدرن", + "preferences.primaryCurrency": "ارز اصلی", + "preferences.privacy": "حریم خصوصی", + "preferences.privacy.appLock": "قفل برنامه", + "preferences.privacy.appLock.description#Android": "برای باز کردن برنامه، احراز هویت بیومتریک لازم باشد", + "preferences.privacy.appLock.description#iOS": "برای باز کردن برنامه، Face ID یا Touch ID لازم باشد", + "preferences.privacy.appLock.lockAfterClosing": "قفل پس از بستن", + "preferences.privacy.maskAtShake": "مخفی‌سازی اعداد (*) با تکان دادن دستگاه", + "preferences.privacy.maskAtStartup": "مخفی‌سازی اعداد (*) هنگام شروع", + "preferences.reminders": "یادآوری", + "preferences.reminders.remindDaily": "یادآوری روزانه", + "preferences.reminders.remindDaily.description": "روزانه یادآوری کند هزینه‌ها را ثبت کنید", + "preferences.reminders.remindDaily.expiryWarning": "اگر ۷ روز پشت‌سرهم Flow را باز نکنید، یادآوری‌ها متوقف می‌شود", + "preferences.reminders.remindDaily.time": "یادآوری در ساعت", + "preferences.reminders.unsupportedPlatform": "زمان‌بندی اعلان‌ها در این پلتفرم پشتیبانی نمی‌شود", + "preferences.scan": "اسکن مدارک", + "preferences.scan.createTransactionsPerItemInScans": "ساخت یک تراکنش برای هر آیتم", + "preferences.scan.createTransactionsPerItemInScans.description": "برای رسیدهای طولانی ممکن است شلوغ شود", + "preferences.scan.markPendingThreshold": "علامت‌گذاری تراکنش‌ها به‌صورت در انتظار", + "preferences.scan.markPendingThreshold.description": "اگر خاموش باشد، تراکنش‌هایی که تاریخِ استخراج‌شده‌شان بیش از ۶ ساعت قبل باشد هم در حالت در انتظار می‌مانند", + "preferences.sync": "همگام‌سازی", + "preferences.sync.autoBackup": "پشتیبان‌گیری خودکار", + "preferences.sync.autoBackup.disabled": "غیرفعال", + "preferences.sync.autoBackup.interval": "فاصله پشتیبان‌گیری", + "preferences.sync.autoBackup.interval.description": "پشتیبان‌ها به‌صورت خودکار هنگام باز کردن برنامه ساخته می‌شوند، به شرط اینکه از آخرین پشتیبان، بازه زمانی تنظیم‌شده گذشته باشد.", + "preferences.sync.iCloud": "همگام‌سازی با iCloud", + "preferences.sync.iCloud.connectionFailed": "اتصال به iCloud ممکن نیست!", + "preferences.sync.iCloud.connectionFailed.tips#1": "اتصال اینترنت را بررسی کنید", + "preferences.sync.iCloud.connectionFailed.tips#2": "مطمئن شوید با Apple Account روی دستگاه وارد شده‌اید", + "preferences.sync.iCloud.connectionFailed.tips#3": "مطمئن شوید iCloud را در System Settings > Apple Account > iCloud > Drive فعال کرده‌اید", + "preferences.sync.iCloud.lastSyncFailed": "آخرین تلاش برای پشتیبان‌گیری در iCloud ناموفق بود. برای دیدن راه‌حل اینجا را کلیک کنید.", + "preferences.sync.iCloud.lastSyncedAt": "آخرین همگام‌سازی در {date}", + "preferences.sync.iCloud.noOfBackupsToKeep": "تعداد نسخه‌های پشتیبان قابل نگه‌داری", + "preferences.sync.iCloud.noOfBackupsToKeep.description": "حداکثر تعداد فایل پشتیبان که در iCloud نگه‌داری می‌شود. چون این فضا از iCloud شما مصرف می‌کند، شاید بخواهید این عدد کم باشد. بسته به این تنظیم، پشتیبان‌های قدیمی‌تر هنگام شروع برنامه حذف می‌شوند.", + "preferences.sync.iCloud.noOfBackupsToKeep.infiniteBackups": "نسخه‌های پشتیبان نامحدود", + "preferences.sync.iCloud.noOfBackupsToKeep.nBackups": "{n} نسخه پشتیبان", + "preferences.sync.iCloud.privacyNotice": "داده‌های شما در iCloud شما و در یک کانتینر خصوصی ذخیره می‌شود که فقط Flow به آن دسترسی دارد. هیچ‌کس دیگر به داده‌ها دسترسی ندارد و Flow هم به هیچ داده دیگری در iCloud شما دسترسی ندارد", + "preferences.sync.iCloud.singleDeviceSupportDisclaimer": "این قابلیت از همگام‌سازی روی بیش از یک دستگاه پشتیبانی نمی‌کند. استفاده از چند دستگاه ممکن است باعث از دست رفتن داده‌ها شود", + "preferences.theme": "پوسته", + "preferences.theme.choose": "یک پوسته انتخاب کنید", + "preferences.theme.enableDynamicTheme": "پوسته پویا", + "preferences.theme.enableOledTheme": "استفاده از پوسته OLED", + "preferences.theme.other": "پوسته‌های دیگر", + "preferences.theme.themeChangesAppIcon": "آیکن برنامه با پوسته هماهنگ شود", + "preferences.transactionButtonOrder": "جای‌گذاری دکمه‌ها", + "preferences.transactionButtonOrder.description": "جای دکمه تراکنش جدید را تغییر دهید", + "preferences.transactionButtonOrder.guide": "برای مرتب‌سازی، دکمه‌ها را بکشید و جابه‌جا کنید", + "preferences.transactionButtonOrder.widgetDescription": "این ترتیب در ویجت دکمه‌های تراکنش روی صفحه اصلی هم اعمال می‌شود", + "preferences.transactionEntryFlow": "ثبت تراکنش", + "preferences.transactionEntryFlow.abandonUponCancelForm": "اگر یکی از فرم‌ها بسته شد، جریان را متوقف کن", + "preferences.transactionEntryFlow.actions": "فهرست اقدامات", + "preferences.transactionEntryFlow.actions.description": "می‌توانید با کشیدن، ترتیب را تغییر دهید", + "preferences.transactionEntryFlow.actions.lastItem": "باید آخرین مورد باشد", + "preferences.transactionEntryFlow.description": "برای صرفه‌جویی در زمان، Flow هنگام ساخت تراکنش برخی فرم‌ها را خودکار باز می‌کند. اگر ترجیح می‌دهید هر فرم را دستی باز کنید، می‌توانید همه ورودی‌ها را غیرفعال کنید.", + "preferences.transactionEntryFlow.skipSelectedFields": "رد کردن فیلدهای از قبل انتخاب‌شده", + "preferences.transactions": "تراکنش‌ها", + "preferences.transactions.geo": "موقعیت تراکنش", + "preferences.transactions.geo.auto.description": "به‌صورت خودکار موقعیت فعلی شما را به تراکنش‌های جدید اضافه می‌کند. حتی اگر این گزینه خاموش باشد، باز هم می‌توانید روی نقشه یک موقعیت انتخاب کنید و بچسبانید.", + "preferences.transactions.geo.auto.enable": "پیوست خودکار", + "preferences.transactions.geo.auto.enabled": "پیوست خودکار فعال است", + "preferences.transactions.geo.auto.permissionDenied": "مجوز موقعیت مکانی داده نشده است", + "preferences.transactions.geo.disableInstructions": "می‌توانید این بخش را در تنظیمات مخفی کنید", + "preferences.transactions.geo.enable": "فعال کردن", + "preferences.transactions.listTile": "نمایش آیتم‌های لیست", + "preferences.transactions.listTile.fallbackToCategoryName": "برای تراکنش‌های بدون عنوان، دسته‌بندی را نشان بده", + "preferences.transactions.listTile.leading": "آیکن ابتدای آیتم", + "preferences.transactions.listTile.leading.account": "حساب", + "preferences.transactions.listTile.leading.category": "دسته‌بندی", + "preferences.transactions.listTile.preview": "پیش‌نمایش", + "preferences.transactions.listTile.showCategoryInList": "نمایش دسته‌بندی بعد از حساب", + "preferences.transactions.listTile.transactionListTileRelaxedDensity": "چیدمان خلوت‌تر", + "preferences.transactions.pending": "تراکنش‌های در انتظار", + "preferences.transactions.pending.homeTimeframe": "نمایش در صفحه خانه", + "preferences.transactions.pending.notify": "اعلان", + "preferences.transactions.pending.notify.earlyReminder": "یادآوری زودتر", + "preferences.transactions.pending.notify.earlyReminder.none": "هیچ‌کدام", + "preferences.transactions.pending.notify.schedulingUnsupported": "وقتی Flow باز نباشد، اعلان‌ها کار نمی‌کنند", + "preferences.transactions.pending.notify.schedulingUnsupported.description": "اعلان‌های زمان‌بندی‌شده فقط روی Android، iOS و macOS در دسترس است", + "preferences.transactions.pending.requireConfirmation": "نیاز به تأیید", + "preferences.transactions.pending.requireConfirmation.description": "تراکنش‌های در انتظار در درآمد، هزینه و موجودی حساب لحاظ نمی‌شوند", + "preferences.transactions.pending.updateDateUponConfirmation": "به‌روزرسانی تاریخ هنگام تأیید", + "preferences.transactions.pending.updateDateUponConfirmation.description": "خاموش کنید تا تاریخ اصلی تراکنش حفظ شود", + "preferences.transactions.tags": "برچسب‌های تراکنش", + "preferences.transactions.tags.contactUsageDescription": "برای راحتی می‌توانید از مخاطبین خود استفاده کنید. این کار نیاز به مجوز مخاطبین دارد. اطلاعات مخاطبین از دستگاه شما خارج نمی‌شود، اما ممکن است بخشی از آن در پشتیبان‌ها ذخیره شود. مخاطبین ممکن است پس از تعویض/ریست گوشی به‌هم بریزند، اما نام‌ها باقی می‌مانند.", + "preferences.transfer": "انتقال‌ها", + "preferences.transfer.combineTransferTransaction": "چیدمان", + "preferences.transfer.combineTransferTransaction.combine": "ترکیبی", + "preferences.transfer.combineTransferTransaction.combineSupportDisclaimer": "در بعضی بخش‌ها انتقال‌ها همیشه جدا نمایش داده می‌شوند", + "preferences.transfer.combineTransferTransaction.separate": "جدا", + "preferences.transfer.description": "ترکیب در یک مورد، عدم لحاظ در هزینه/درآمد", + "preferences.transfer.excludeTransferFromFlow": "عدم لحاظ در مجموع‌ها", + "preferences.transfer.excludeTransferFromFlow.description": "در مجموع هزینه/درآمد حساب نشود", + "preferences.trashBin": "سطل زباله", + "preferences.trashBin.emptyBin": "خالی کردن سطل زباله", + "preferences.trashBin.emptyBin.description": "حذف دائمی همه موارد داخل سطل زباله. این کار غیرقابل بازگشت است", + "preferences.trashBin.retention": "مدت نگه‌داری", + "preferences.trashBin.retention.description": "تراکنش‌ها بعد از پایان مدت نگه‌داری به‌صورت خودکار حذف می‌شوند", + "preferences.trashBin.retention.forever": "برای همیشه", + "preferences.trashBin.seeItems": "مشاهده موارد", + "profile.name": "نام", + "select.color": "تغییر رنگ", + "select.color.clear": "پاک کردن رنگ", + "select.color.none": "رنگ پیش‌فرض", + "select.contact": "انتخاب مخاطب", + "select.contact.editPermissions": "باز کردن تنظیمات", + "select.contact.empty": "هیچ مخاطبی پیدا نشد", + "select.contact.emptyPermissionSuggestion": "مجوزها ندارید؟ مخاطبین را دوباره بارگذاری کنید یا مجوز بدهید", + "select.contact.none": "پاک کردن انتخاب", + "select.dropFile": "انتخاب یا رها کردن فایل", + "select.dropFile.acceptedTypes": "فرمت‌های مجاز: {types}", + "select.dropFile.dropHere": "فایل(ها) را اینجا رها کنید", + "select.recurrence": "تکرار", + "select.recurrence.addMore": "افزودن بیشتر", + "select.recurrence.from": "شروع از", + "select.recurrence.occurrences": "تعداد دفعات را وارد کنید", + "select.recurrence.occurrences.n": "{n} بار", + "select.recurrence.occurrences.times.prefix": "", + "select.recurrence.occurrences.times.suffix": "بار", + "select.recurrence.until": "پایان در", + "select.recurrence.until.date": "در یک تاریخ", + "select.recurrence.until.never": "هرگز", + "select.recurrence.until.noOfOccurrences": "تعداد دفعات", + "select.time.now": "اکنون", + "select.time.select.month": "انتخاب ماه", + "select.time.select.year": "انتخاب سال", + "select.timeRange": "انتخاب بازه", + "select.timeRange.allTime": "تمام مدت", + "select.timeRange.changeMode": "گزینه‌های بیشتر", + "select.timeRange.last30Days": "۳۰ روز اخیر", + "select.timeRange.mode.byMonth": "بر اساس ماه", + "select.timeRange.mode.byWeek": "بر اساس هفته", + "select.timeRange.mode.byYear": "بر اساس سال", + "select.timeRange.mode.custom": "بازه سفارشی", + "select.timeRange.presets": "گزینه‌های رایج", + "select.timeRange.thisMonth": "این ماه", + "select.timeRange.thisWeek": "این هفته", + "select.timeRange.thisYear": "امسال", + "setup.accounts.addAccount": "افزودن حساب جدید", + "setup.accounts.description": "حساب‌های جدید بسازید و/یا از پیش‌فرض‌ها اضافه کنید. بعداً می‌توانید این را در تب «حساب‌ها» تغییر دهید.", + "setup.accounts.preset.cash": "نقدی", + "setup.accounts.preset.main": "اصلی", + "setup.accounts.preset.savings": "پس‌انداز", + "setup.accounts.setup": "راه‌اندازی حساب‌ها", + "setup.categories.description": "دسته‌بندی‌ها را بسازید و/یا از پیش‌فرض‌ها اضافه کنید. بعداً می‌توانید این را در منوی «پروفایل > دسته‌بندی‌ها» تغییر دهید.", + "setup.categories.existing": "دسته‌بندی‌های موجود", + "setup.categories.preset.beauty": "زیبایی", + "setup.categories.preset.childCare": "مراقبت کودک", + "setup.categories.preset.donations": "کمک‌های مالی", + "setup.categories.preset.drinks": "نوشیدنی‌ها", + "setup.categories.preset.eatingOut": "غذا بیرون", + "setup.categories.preset.education": "آموزش", + "setup.categories.preset.entertainment": "سرگرمی", + "setup.categories.preset.fitness": "تناسب اندام", + "setup.categories.preset.gadgets": "گجت‌ها", + "setup.categories.preset.gifts": "هدایا", + "setup.categories.preset.groceries": "خواربار", + "setup.categories.preset.health": "سلامت", + "setup.categories.preset.hobby": "سرگرمی/علاقه‌مندی", + "setup.categories.preset.hygiene": "بهداشت", + "setup.categories.preset.insurance": "بیمه", + "setup.categories.preset.onlineServices": "اشتراک‌های آنلاین", + "setup.categories.preset.paychecks": "حقوق", + "setup.categories.preset.petCare": "رسیدگی به حیوان خانگی", + "setup.categories.preset.petrol": "بنزین", + "setup.categories.preset.rent": "اجاره", + "setup.categories.preset.services": "خدمات", + "setup.categories.preset.shopping": "خرید", + "setup.categories.preset.snacks": "تنقلات", + "setup.categories.preset.stationery": "لوازم‌التحریر", + "setup.categories.preset.taxes": "مالیات", + "setup.categories.preset.transport": "حمل‌ونقل", + "setup.categories.preset.travel": "سفر", + "setup.categories.preset.utils": "قبوض/هزینه‌های عمومی", + "setup.categories.setup": "راه‌اندازی دسته‌بندی‌ها", + "setup.getStarted": "شروع", + "setup.next": "بعدی", + "setup.onboarding": "شروع کنیم", + "setup.onboarding.freshStart": "شروع از صفر", + "setup.onboarding.freshStart.description": "اولین بار است از Flow استفاده می‌کنم", + "setup.onboarding.importExisting": "ایمپورت از نسخه پشتیبان", + "setup.onboarding.importExisting.description": "بازیابی داده از نسخه پشتیبان قبلی Flow", + "setup.onboarding.recoverICloudBackup": "بازیابی از iCloud", + "setup.onboarding.recoverICloudBackup.description": "بازیابی از iCloud (آخرین همگام‌سازی در {lastSynced})", + "setup.primaryCurrency.choose": "یک ارز انتخاب کنید", + "setup.primaryCurrency.description": "این ارزِ اصلی شما خواهد بود. بعداً می‌توانید آن را در منوی «تنظیمات» تغییر دهید.", + "setup.primaryCurrency.setup": "انتخاب یک ارز", + "setup.profile.addPhoto": "افزودن عکس", + "setup.profile.addPhoto.skip": "رد کردن", + "setup.profile.setup": "نام شما چیست؟", + "setup.slides.foss.description": "کاملاً رایگان و کد منبع به‌صورت عمومی در دسترس است.", + "setup.slides.foss.seeRepo": "مشاهده پروژه در GitHub", + "setup.slides.foss.title": "رایگان و متن‌باز", + "setup.slides.privacy": "کنترل داده‌ها دست شماست", + "setup.slides.privacy.description": "تمام داده‌های شما فقط روی دستگاه (یا ارائه‌دهنده خصوصی فضای ابری شما) ذخیره می‌شود و امکان خروجی گرفتن کامل وجود دارد", + "setup.transactionTags": "انتخاب برچسب‌ها", + "support": "پشتیبانی", + "support.contribute": "مشارکت در کدنویسی", + "support.contribute.description": "اگر توسعه‌دهنده هستید می‌توانید در توسعه Flow مشارکت کنید. فهرست مشارکت‌کنندگان منتظر اضافه شدن نام شماست.", + "support.description": "Flow با عشق ساخته شده؛ رایگان و برای همه باز است. اگر Flow برایتان ارزشمند است، در رشد پروژه کمک کنید. چند راه برای این کار:", + "support.donateDeveloper": "انعام به سازنده", + "support.donateDeveloper.action": "یک قهوه مهمان سازنده کنید", + "support.donateDeveloper.description": "تمام قابلیت‌های Flow رایگان است و انعام دادن هیچ ویژگی اضافی را باز نمی‌کند", + "support.leaveAReview": "ثبت نظر", + "support.leaveAReview.action": "امتیاز دادن به Flow", + "support.leaveAReview.description": "می‌توانید در {appStore} به Flow امتیاز بدهید و نظر ثبت کنید", + "support.requestFeatures": "ایده بدهید", + "support.requestFeatures.action": "رفتن به Issue Tracker", + "support.requestFeatures.description": "می‌توانید با بازخورد و پیشنهاد ایده‌ها هم از Flow حمایت کنید.", + "support.starOnGitHub": "ستاره دادن در GitHub", + "support.starOnGitHub.description": "ستاره دادن به Flow در GitHub باعث می‌شود افراد بیشتری آن را پیدا کنند", + "sync.export": "خروجی گرفتن", + "sync.export.asCSV": "به‌صورت CSV", + "sync.export.asCSV.description": "برای بازیابی/ایمپورت قابل استفاده نیست! مناسب برای باز کردن در ابزارهایی مثل Google Sheets", + "sync.export.asJSON": "به‌صورت پشتیبان (json)", + "sync.export.asJSON.description": "فقط داده‌های ضروری؛ تصاویر و فایل‌های پیوست شامل نمی‌شود.", + "sync.export.asPDF": "صورت‌حساب‌ها (PDF)", + "sync.export.asPDF.description": "صورت‌حساب حساب(ها)؛ مناسب برای چاپ. این سند رسمی نیست و فقط برای استفاده شخصی شماست.", + "sync.export.asZIP": "به‌صورت پشتیبان (zip)", + "sync.export.asZIP.description": "بعداً به‌طور کامل قابل بازیابی است. شامل فایل‌های پیوست", + "sync.export.autoBackup": "پشتیبان‌گیری خودکار", + "sync.export.deleteCloudBackupConfirmation": "با حذف این پشتیبان، کپی iCloud هم حذف می‌شود. این عمل غیرقابل بازگشت نیست!", + "sync.export.fileDeleted": "فایل پیدا نشد", + "sync.export.history": "تاریخچه پشتیبان‌ها", + "sync.export.history.description": "پشتیبان‌هایی که شما ساخته‌اید و همچنین پشتیبان‌های خودکار را ببینید", + "sync.export.history.empty": "هیچ پشتیبانی ندارید", + "sync.export.history.empty.description": "پشتیبان‌های دستی و خودکار اینجا نمایش داده می‌شوند", + "sync.export.onDeviceWarning": "همه پشتیبان‌ها روی دستگاه ذخیره می‌شوند؛ یعنی اگر Flow را حذف کنید یا دستگاه را ریست کنید، همه پشتیبان‌ها از بین می‌روند!", + "sync.export.pdf.accounts": "حساب‌ها", + "sync.export.pdf.accounts.selected": "{n} انتخاب شد (از {total})", + "sync.export.pdf.categories": "دسته‌بندی‌ها", + "sync.export.pdf.categories.selected": "{n} انتخاب شد (از {total})", + "sync.export.pdf.header": "Flow - سوابق مالی شخصی (غیررسمی، {range})", + "sync.export.pdf.notice[0]": "تولید شده توسط ", + "sync.export.pdf.notice[1]": ". این سند قانونی نیست. این یک صورت‌حساب مالی نیست. این رسید نیست. این هیچ ادعایی درباره واقعیت به هیچ شکل و صورتی ندارد. صرفاً برای استفاده شخصی است.", + "sync.export.pdf.size": "اندازه کاغذ", + "sync.export.pdf.summary": "خلاصه بر اساس حساب ({range})", + "sync.export.pdf.summary.allAcounts": "همه حساب‌ها", + "sync.export.pdf.summary.expense": "هزینه", + "sync.export.pdf.summary.flow": "Flow", + "sync.export.pdf.summary.income": "درآمد", + "sync.export.pdf.timeRange": "بازه زمانی", + "sync.export.save": "ذخیره پشتیبان", + "sync.export.save.shareTitle": "پشتیبان Flow ({type}، {date})", + "sync.export.savedTo": "ذخیره شد در {path}", + "sync.export.success": "خروجی با موفقیت گرفته شد!", + "sync.export.success.filePath[0]": "ذخیره شد در ", + "sync.export.success.filePath[1]": "", + "sync.export.type": "خروجی ({type})", + "sync.import": "ایمپورت", + "sync.import.emergencyBackup": "برای احتیاط، Flow قبل از ادامه تلاش می‌کند از داده‌های فعلی روی دستگاه شما پشتیبان بگیرد", + "sync.import.emergencyBackup.successful": "از داده‌های قبلی پشتیبان گرفته شد. می‌توانید فایل پشتیبان را از Backup > Backup history ذخیره کنید", + "sync.import.eraseWarning": "ادامه دادن باعث پاک شدن همه داده‌های فعلی می‌شود", + "sync.import.getCSVTemplate": "دریافت قالب CSV", + "sync.import.other": "گزینه‌های دیگر", + "sync.import.pickCurrencies": "اختصاص ارز به حساب‌ها", + "sync.import.pickCurrencies.incomplete": "لطفاً برای هر حساب یک ارز تعیین کنید", + "sync.import.pickFile": "انتخاب فایل", + "sync.import.pickFile.description": "یک فایل پشتیبان Flow برای بازیابی انتخاب کنید. فرمت‌های مجاز: {exts}", + "sync.import.pickFile.dropzone.active": "اینجا رها کنید", + "sync.import.pickFile.pickOrDrop": "انتخاب یا رها کردن فایل", + "sync.import.start": "شروع ایمپورت", + "sync.import.success": "ایمپورت با موفقیت انجام شد!", + "sync.import.syncData.createdDate": "تاریخ پشتیبان", + "sync.import.syncData.olderBackupWarning": "چون این پشتیبان با نسخه قدیمی‌تری از برنامه ساخته شده، ممکن است مشکلی پیش بیاید!", + "sync.import.syncData.parsedEstimate": "برآورد داده‌های قابل بازیابی", + "sync.import.syncData.parsedEstimate.accountCount": "{count} حساب", + "sync.import.syncData.parsedEstimate.budgetCount": "{count} بودجه", + "sync.import.syncData.parsedEstimate.categoryCount": "{count} دسته‌بندی", + "sync.import.syncData.parsedEstimate.fileAttachmentsCount": "{count} پیوست فایل", + "sync.import.syncData.parsedEstimate.goalCount": "{count} هدف", + "sync.import.syncData.parsedEstimate.transactionCount": "{count} تراکنش", + "sync.import.syncData.parsedEstimate.transactionFilterPresets": "{count} پریست فیلتر تراکنش", + "sync.import.syncData.parsedEstimate.transactionTagCount": "{count} برچسب تراکنش", + "sync.import.zipWarning": "حتماً فایل ZIPی را ایمپورت کنید که توسط خودِ برنامه Flow ساخته شده باشد!", + "tabs.accounts": "حساب‌ها", + "tabs.accounts.reorder": "مرتب‌سازی حساب‌ها", + "tabs.accounts.reorder.guide": "لمس طولانی و کشیدن", + "tabs.home": "خانه", + "tabs.home.flow": "Flow", + "tabs.home.greetings": "سلام، {name}!", + "tabs.home.last7days": "۷ روز اخیر", + "tabs.home.noTransactions": "هیچ تراکنشی مطابق معیارها نیست", + "tabs.home.noTransactions.addSome": "برای افزودن تراکنش جدید، روی دکمه (+) پایین کلیک کنید", + "tabs.home.noTransactions.tryChangingFilters": "فیلترها را تغییر دهید", + "tabs.home.pendingTransactions": "در انتظار ({count})", + "tabs.home.pendingTransactions.needAttention": "{} تراکنش نیاز به تأیید دارد", + "tabs.home.pendingTransactions.seeAll": "مشاهده همه", + "tabs.home.reminders.autoBackup": "یک نسخه پشتیبان ساخته شد", + "tabs.home.reminders.autoBackup.subtitle": "به‌صورت خودکار ساخته شده", + "tabs.home.reminders.rateApp": "به Flow در {store} امتیاز بدهید!", + "tabs.home.reminders.rateApp.action": "امتیاز دادن", + "tabs.home.reminders.starOnGitHub": "به Flow در GitHub ستاره بدهید", + "tabs.home.reminders.turnOnICloudSync": "می‌توانید پشتیبان iCloud را فعال کنید", + "tabs.home.reminders.turnOnICloudSync.action": "فعال کردن", + "tabs.home.reminders.turnOnICloudSync.subtitle": "پشتیبان‌گیری قابل‌اعتماد و رایگان از داده‌ها", + "tabs.home.totalBalance": "موجودی کل", + "tabs.home.transactionsCount": "{count} تراکنش", + "tabs.profile": "پروفایل", + "tabs.profile.backup": "پشتیبان", + "tabs.profile.community": "جامعه", + "tabs.profile.guide": "راهنمای استفاده", + "tabs.profile.import": "ایمپورت", + "tabs.profile.joinDiscord": "عضویت در Discord Flow", + "tabs.profile.other": "سایر", + "tabs.profile.preferences": "تنظیمات", + "tabs.profile.recommend": "پیشنهاد Flow", + "tabs.profile.support": "حمایت از Flow", + "tabs.profile.withLoveFromTheCreator": "با 🤍 از sadespresso", + "tabs.stats": "آمار", + "tabs.stats.categories": "دسته‌بندی‌ها", + "tabs.stats.categories.seeAll": "مشاهده همه دسته‌بندی‌ها", + "tabs.stats.categories.top": "بیشترین هزینه", + "tabs.stats.chart.noData": "داده‌ای برای نمایش نیست", + "tabs.stats.chart.select.clickToSelect": "برای انتخاب کلیک کنید", + "tabs.stats.chart.total": "جمع", + "tabs.stats.intervalReport.averages.expense": "هزینه", + "tabs.stats.intervalReport.averages.flow": "Flow", + "tabs.stats.intervalReport.averages.income": "درآمد", + "tabs.stats.intervalReport.averages@day": "میانگین‌ها بر اساس روز", + "tabs.stats.intervalReport.averages@hour": "میانگین‌ها بر اساس ساعت", + "tabs.stats.intervalReport.averages@month": "میانگین‌ها بر اساس ماه", + "tabs.stats.intervalReport.averages@week": "میانگین‌ها بر اساس هفته", + "tabs.stats.intervalReport.averages@year": "میانگین‌ها بر اساس سال", + "tabs.stats.intervalReport.forecast": "پیش‌بینی هزینه برای {}", + "tabs.stats.intervalReport.totalExpense": "مجموع هزینه {}", + "tabs.stats.trends": "روندها", + "tabs.stats.trends.average": "میانگین هزینه", + "tabs.stats.trends.average.description": "میانگین مبلغ هزینه در بازه زمانی انتخاب‌شده", + "tabs.stats.trends.median": "میانه هزینه", + "tabs.stats.trends.median.description": "میانه مبلغ هزینه در بازه زمانی انتخاب‌شده", + "tabs.stats.trends.topSpendingTitles": "تراکنش‌های پرتکرار", + "tabs.stats.trends.topSpendingTitles.description": "عنوان‌های پرتکرارِ تراکنش‌ها", + "transaction": "تراکنش", + "transaction.actions": "اقدامات", + "transaction.attachments": "پیوست‌های فایل", + "transaction.attachments.warning": "پیوست(ها) در پشتیبان‌های شما {size} فضا می‌گیرند. اگر از پشتیبان ابری (مثل iCloud) استفاده کنید، فضای مصرفی افزایش می‌یابد.", + "transaction.createdDate": "ایجاد شده در", + "transaction.date": "تاریخ تراکنش", + "transaction.delete": "حذف تراکنش", + "transaction.deleted": "اخیراً حذف شده", + "transaction.description": "یادداشت‌ها", + "transaction.description.add": "افزودن یادداشت", + "transaction.description.markdownSupported": "پشتیبانی از Markdown", + "transaction.description.placeholder": "جزئیات تراکنش...", + "transaction.description.preview": "پیش‌نمایش", + "transaction.duplicate": "کپی تراکنش", + "transaction.duplicate.success": "تراکنش کپی شد", + "transaction.edit": "ویرایش تراکنش", + "transaction.edit.selectAccount": "یک حساب انتخاب کنید", + "transaction.edit.selectAccount.multiple": "انتخاب حساب‌ها", + "transaction.edit.selectAccount.noPossibleChoice": "هیچ حسابی برای انتخاب وجود ندارد", + "transaction.edit.selectCategory": "یک دسته‌بندی انتخاب کنید", + "transaction.edit.selectCategory.multiple": "انتخاب دسته‌بندی‌ها", + "transaction.edit.selectTags": "انتخاب برچسب‌ها", + "transaction.external.added": "یک تراکنش جدید اضافه شد", + "transaction.external.from": "اضافه شده از {name}", + "transaction.fallbackTitle": "تراکنش بدون عنوان", + "transaction.location": "موقعیت", + "transaction.location.add": "افزودن موقعیت", + "transaction.location.edit": "برای ویرایش روی نقشه بزنید", + "transaction.moveToTrashBin": "انتقال به سطل زباله", + "transaction.moveToTrashBin.restore": "بازیابی تراکنش", + "transaction.moveToTrashBin.restore.success": "تراکنش بازیابی شد", + "transaction.moveToTrashBin.success": "به سطل زباله منتقل شد", + "transaction.new": "تراکنش جدید", + "transaction.pending": "در انتظار", + "transaction.pending.preapproved": "پیش‌تأیید شده", + "transaction.recurring": "تراکنش تکرارشونده", + "transaction.recurring.delete": "حذف تراکنش تکرارشونده", + "transaction.recurring.delete.deleteAllDisclaimer": "این کار همه تراکنش‌های مرتبط را حذف می‌کند و ساخت تراکنش‌های جدید را متوقف می‌کند. بازیابی تراکنش‌ها از سطل زباله باعث ساخت دوباره تراکنش‌های جدید نمی‌شود.", + "transaction.recurring.edit": "ویرایش تراکنش تکرارشونده", + "transaction.recurring.setup": "تنظیم تراکنش تکرارشونده", + "transaction.tags": "برچسب‌ها", + "transaction.tags.contact.name": "نام مخاطب", + "transaction.tags.contact.select": "انتخاب مخاطب از گوشی", + "transaction.tags.delete": "حذف برچسب", + "transaction.tags.delete.description": "با حذف این برچسب، برچسبِ {transactionCount} تراکنش جدا می‌شود. این کار غیرقابل بازگشت است!", + "transaction.tags.editGuide": "برای ویرایش برچسب‌ها ضربه بزنید", + "transaction.tags.location.name": "نام موقعیت", + "transaction.tags.location.useCurrent": "استفاده از موقعیت فعلی", + "transaction.tags.name": "نام برچسب", + "transaction.tags.new": "برچسب جدید", + "transaction.transfer.conversionRate": "نرخ تبدیل", + "transaction.transfer.from": "حساب فرستنده", + "transaction.transfer.from.select": "انتقال از", + "transaction.transfer.from.title": "از {account}", + "transaction.transfer.fromToTitle": "از {from} به {to}", + "transaction.transfer.to": "حساب گیرنده", + "transaction.transfer.to.select": "انتقال به", + "transaction.transfer.to.title": "به {account}", + "transactionFilterPreset": "پریست فیلتر", + "transactionFilterPreset.default": "پریست پیش‌فرض", + "transactionFilterPreset.delete": "حذف پریست", + "transactionFilterPreset.invalid": "نامعتبر", + "transactionFilterPreset.invalid.description": "بعضی حساب/دسته‌بندی‌های این پریست حذف شده‌اند. لطفاً پریست را دوباره بسازید یا حذف کنید", + "transactionFilterPreset.makeDefault": "تنظیم به‌عنوان پیش‌فرض", + "transactionFilterPreset.saveAsNew": "ذخیره به‌عنوان جدید", + "transactionFilterPreset.saveAsNew.guide": "برای ذخیره یک پریست جدید، فیلترها را تغییر دهید و دوباره به اینجا برگردید", + "transactionFilterPreset.saveAsNew.name": "نام پریست", + "transactions.all": "همه تراکنش‌ها", + "transactions.batch.assignAccountForAll": "اختصاص حساب برای همه", + "transactions.batch.assignAccountIndividually": "اختصاص حساب به‌صورت جداگانه", + "transactions.batch.import": "ایمپورت گروهی", + "transactions.batch.import.success": "{n} تراکنش با موفقیت ایمپورت شد", + "transactions.batch.importN": "ایمپورت {n} تراکنش", + "transactions.batch.review": "لطفاً تراکنش‌ها را بررسی کنید", + "transactions.count": "{} تراکنش", + "transactions.pending": "تراکنش‌های در انتظار", + "transactions.query.clearAll": "پاک کردن فیلترها", + "transactions.query.clearSelection": "پاک کردن انتخاب‌ها", + "transactions.query.filter.accounts": "حساب‌ها", + "transactions.query.filter.accounts.all": "همه حساب‌ها", + "transactions.query.filter.accounts.n": "{} حساب", + "transactions.query.filter.categories": "دسته‌بندی‌ها", + "transactions.query.filter.categories.all": "همه دسته‌بندی‌ها", + "transactions.query.filter.categories.n": "{} دسته‌بندی", + "transactions.query.filter.currency": "ارز", + "transactions.query.filter.groupBy": "گروه‌بندی بر اساس", + "transactions.query.filter.hasAttachments": "پیوست‌ها", + "transactions.query.filter.hasAttachments#false": "بدون پیوست", + "transactions.query.filter.hasAttachments#true": "دارای پیوست", + "transactions.query.filter.hasAttachments.all": "پیوست‌ها", + "transactions.query.filter.isPending": "وضعیت در انتظار", + "transactions.query.filter.isPending#false": "در انتظار نیست", + "transactions.query.filter.isPending#true": "در انتظار", + "transactions.query.filter.isPending.all": "همه", + "transactions.query.filter.keyword": "جستجو", + "transactions.query.filter.keyword.all": "جستجو", + "transactions.query.filter.keyword.clear": "پاک کردن", + "transactions.query.filter.keyword.hint": "جستجو بر اساس عنوان...", + "transactions.query.filter.keyword.includeDescription": "شامل توضیحات هم باشد", + "transactions.query.filter.sort": "مرتب‌سازی", + "transactions.query.filter.tags": "برچسب‌ها", + "transactions.query.filter.tags.all": "همه برچسب‌ها", + "transactions.query.filter.tags.n": "{} برچسب", + "transactions.query.filter.timeRange": "بازه زمانی", + "transactions.query.filter.timeRange.all": "تمام مدت", + "transactions.query.filter.transactionType": "نوع", + "transactions.query.noResult": "هیچ تراکنشی برای نمایش نیست", + "transactions.query.noResult.description": "فیلترها را به‌روزرسانی کنید", + "visitGitHubRepo": "مشاهده ریپو در GitHub" +} diff --git a/lib/l10n/supported_languages.dart b/lib/l10n/supported_languages.dart index 4eca4b01..ba99455e 100644 --- a/lib/l10n/supported_languages.dart +++ b/lib/l10n/supported_languages.dart @@ -16,4 +16,5 @@ final Map supportedLanguages = { const Locale("es", "ES"): ("Spanish (Spain)", "Español (España)"), const Locale("uk", "UA"): ("Ukrainian (Ukraine)", "Українська (Україна)"), const Locale("ar"): ("Arabic", "العربية"), + const Locale("fa", "IR"): ("Farsi (Iran)", "فارسی (ایران)"), }; From c3f8916c3e430074873b01534747e866c8a0fa6b Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Mon, 9 Feb 2026 11:48:36 +0800 Subject: [PATCH 04/21] (l10n)format, review --- CHANGELOG.md | 6 ++++++ assets/l10n/fa_IR.json | 6 +++--- lib/l10n/supported_languages.dart | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f67f26f3..3fd00516 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Next + +### New features + +* Persian (Iran) support thanks to @arefbhrn[https://github.com/arefbhrn] + ## 0.18.2 ### Fixes diff --git a/assets/l10n/fa_IR.json b/assets/l10n/fa_IR.json index ccf6dbdd..d995ec08 100644 --- a/assets/l10n/fa_IR.json +++ b/assets/l10n/fa_IR.json @@ -534,11 +534,11 @@ "sync.export.asZIP": "به‌صورت پشتیبان (zip)", "sync.export.asZIP.description": "بعداً به‌طور کامل قابل بازیابی است. شامل فایل‌های پیوست", "sync.export.autoBackup": "پشتیبان‌گیری خودکار", - "sync.export.deleteCloudBackupConfirmation": "با حذف این پشتیبان، کپی iCloud هم حذف می‌شود. این عمل غیرقابل بازگشت نیست!", + "sync.export.deleteCloudBackupConfirmation": "با حذف این پشتیبان، کپی iCloud هم حذف می‌شود. این عمل غیرقابل بازگشت است!", "sync.export.fileDeleted": "فایل پیدا نشد", "sync.export.history": "تاریخچه پشتیبان‌ها", "sync.export.history.description": "پشتیبان‌هایی که شما ساخته‌اید و همچنین پشتیبان‌های خودکار را ببینید", - "sync.export.history.empty": "هیچ پشتیبانی ندارید", + "sync.export.history.empty": "هیچ پشتیبان ندارید", "sync.export.history.empty.description": "پشتیبان‌های دستی و خودکار اینجا نمایش داده می‌شوند", "sync.export.onDeviceWarning": "همه پشتیبان‌ها روی دستگاه ذخیره می‌شوند؛ یعنی اگر Flow را حذف کنید یا دستگاه را ریست کنید، همه پشتیبان‌ها از بین می‌روند!", "sync.export.pdf.accounts": "حساب‌ها", @@ -755,4 +755,4 @@ "transactions.query.noResult": "هیچ تراکنشی برای نمایش نیست", "transactions.query.noResult.description": "فیلترها را به‌روزرسانی کنید", "visitGitHubRepo": "مشاهده ریپو در GitHub" -} +} \ No newline at end of file diff --git a/lib/l10n/supported_languages.dart b/lib/l10n/supported_languages.dart index ba99455e..fc75bbb6 100644 --- a/lib/l10n/supported_languages.dart +++ b/lib/l10n/supported_languages.dart @@ -16,5 +16,5 @@ final Map supportedLanguages = { const Locale("es", "ES"): ("Spanish (Spain)", "Español (España)"), const Locale("uk", "UA"): ("Ukrainian (Ukraine)", "Українська (Україна)"), const Locale("ar"): ("Arabic", "العربية"), - const Locale("fa", "IR"): ("Farsi (Iran)", "فارسی (ایران)"), + const Locale("fa", "IR"): ("Persian (Iran)", "فارسی (ایران)"), }; From 930b5d34f604d7287cf38bb76572648496eaa32c Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Sat, 14 Feb 2026 00:54:36 +0800 Subject: [PATCH 05/21] siri draft 2 --- .vscode/settings.json | 3 +- assets/images/2.0x/siri.png | Bin 0 -> 53143 bytes assets/images/3.0x/siri.png | Bin 0 -> 102763 bytes assets/images/4.0x/siri.png | Bin 0 -> 167169 bytes assets/images/siri.png | Bin 0 -> 18444 bytes assets/l10n/ar.json | 1 + assets/l10n/cs_CZ.json | 1 + assets/l10n/de_DE.json | 1 + assets/l10n/es_ES.json | 1 + assets/l10n/fa_IR.json | 1 + assets/l10n/fr_FR.json | 1 + assets/l10n/it_IT.json | 1 + assets/l10n/ru_RU.json | 1 + assets/l10n/tr_TR.json | 1 + assets/l10n/uk_UA.json | 1 + ios/Podfile.lock | 6 ++ ios/Runner.xcodeproj/project.pbxproj | 4 + ios/Runner/RecordTransactionIntent.swift | 14 +-- ios/Runner/RecordedTransaction.swift | 7 +- ios/Runner/TransactionType.swift | 5 + lib/constants.dart | 2 + lib/entity/transaction.dart | 2 + lib/main.dart | 37 +++++++ lib/routes/transaction_page.dart | 41 ++----- lib/services/user_preferences.dart | 3 +- lib/utils/ios/get_siri_transactions.dart | 102 ++++++++++++++++++ .../transaction/imported_from_eny.dart | 34 ++++++ .../transaction/imported_from_siri.dart | 26 +++++ macos/Flutter/GeneratedPluginRegistrant.swift | 2 + pubspec.lock | 8 ++ pubspec.yaml | 3 +- scripts/translate_missing.dart | 1 + 32 files changed, 268 insertions(+), 42 deletions(-) create mode 100644 assets/images/2.0x/siri.png create mode 100644 assets/images/3.0x/siri.png create mode 100644 assets/images/4.0x/siri.png create mode 100644 assets/images/siri.png create mode 100644 ios/Runner/TransactionType.swift create mode 100644 lib/utils/ios/get_siri_transactions.dart create mode 100644 lib/widgets/transaction/imported_from_eny.dart create mode 100644 lib/widgets/transaction/imported_from_siri.dart diff --git a/.vscode/settings.json b/.vscode/settings.json index cfd503c5..1eee6b6c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,5 +2,6 @@ "cmake.configureOnOpen": false, "IDX.aI.enableInlineCompletion": true, "IDX.aI.enableCodebaseIndexing": true, - "editor.tabSize": 2 + "editor.tabSize": 2, + "swift.swiftSDK": "arm64-apple-ios" } diff --git a/assets/images/2.0x/siri.png b/assets/images/2.0x/siri.png new file mode 100644 index 0000000000000000000000000000000000000000..6b9c9145698d62b0f831b0a837201860cb3c3355 GIT binary patch literal 53143 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�Tve2^#;QP^8S+?BL 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

S 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 literal 0 HcmV?d00001 diff --git a/assets/images/4.0x/siri.png b/assets/images/4.0x/siri.png new file mode 100644 index 0000000000000000000000000000000000000000..ad37467b1ad10737e512923ec7567742f2b5973a GIT binary patch literal 167169 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πc#6vd`!NxZ#=1~ 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 z%0A*ds=F1gaOgkgK&Oq_-T?c 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%0A@90X2lnP+Flc9iW@CX?b@QUP9>4Ir0 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

#E~jWPi08ixkoFA#LtX?a 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 literal 0 HcmV?d00001 diff --git a/assets/l10n/ar.json b/assets/l10n/ar.json index d4f6bacf..fcc42bf1 100644 --- a/assets/l10n/ar.json +++ b/assets/l10n/ar.json @@ -669,6 +669,7 @@ "transaction.edit.selectCategory.multiple": "اختر الفئات", "transaction.edit.selectTags": "اختر الوسوم", "transaction.external.added": "تمت إضافة معاملة جديدة", + "transaction.external.added.from": "تمت إضافة معاملة جديدة بواسطة {name}", "transaction.external.from": "مضافة من {name}", "transaction.fallbackTitle": "معاملة بدون عنوان", "transaction.location": "الموقع", diff --git a/assets/l10n/cs_CZ.json b/assets/l10n/cs_CZ.json index b3ca12ae..803e0112 100644 --- a/assets/l10n/cs_CZ.json +++ b/assets/l10n/cs_CZ.json @@ -669,6 +669,7 @@ "transaction.edit.selectCategory.multiple": "Vyberte kategorie", "transaction.edit.selectTags": "Vybrat štítky", "transaction.external.added": "Byla přidána nová transakce", + "transaction.external.added.from": "Nová transakce byla přidána uživatelem {name}.", "transaction.external.from": "Přidáno z {name}", "transaction.fallbackTitle": "Nepojmenovaná transakce", "transaction.location": "Místo", diff --git a/assets/l10n/de_DE.json b/assets/l10n/de_DE.json index 7d631578..fb931833 100644 --- a/assets/l10n/de_DE.json +++ b/assets/l10n/de_DE.json @@ -669,6 +669,7 @@ "transaction.edit.selectCategory.multiple": "Kategorien auswählen", "transaction.edit.selectTags": "Tags auswählen", "transaction.external.added": "Eine neue Transaktion wurde hinzugefügt", + "transaction.external.added.from": "Eine neue Transaktion wurde von {name} hinzugefügt", "transaction.external.from": "Hinzugefügt von {name}", "transaction.fallbackTitle": "Buchung ohne Titel", "transaction.location": "Standort", diff --git a/assets/l10n/es_ES.json b/assets/l10n/es_ES.json index 83f79a23..1917f544 100644 --- a/assets/l10n/es_ES.json +++ b/assets/l10n/es_ES.json @@ -669,6 +669,7 @@ "transaction.edit.selectCategory.multiple": "Seleccionar categorías", "transaction.edit.selectTags": "Seleccionar etiquetas", "transaction.external.added": "Se ha añadido una nueva transacción", + "transaction.external.added.from": "Una nueva transacción ha sido añadida por {name}", "transaction.external.from": "Añadido desde {name}", "transaction.fallbackTitle": "Transacción sin título", "transaction.location": "Ubicación", diff --git a/assets/l10n/fa_IR.json b/assets/l10n/fa_IR.json index d995ec08..315411fe 100644 --- a/assets/l10n/fa_IR.json +++ b/assets/l10n/fa_IR.json @@ -669,6 +669,7 @@ "transaction.edit.selectCategory.multiple": "انتخاب دسته‌بندی‌ها", "transaction.edit.selectTags": "انتخاب برچسب‌ها", "transaction.external.added": "یک تراکنش جدید اضافه شد", + "transaction.external.added.from": "تراکنش جدیدی توسط {name} اضافه شد.", "transaction.external.from": "اضافه شده از {name}", "transaction.fallbackTitle": "تراکنش بدون عنوان", "transaction.location": "موقعیت", diff --git a/assets/l10n/fr_FR.json b/assets/l10n/fr_FR.json index 78be3204..00160079 100644 --- a/assets/l10n/fr_FR.json +++ b/assets/l10n/fr_FR.json @@ -669,6 +669,7 @@ "transaction.edit.selectCategory.multiple": "Sélectionner des catégories", "transaction.edit.selectTags": "Sélectionner des étiquettes", "transaction.external.added": "Une nouvelle transaction a été ajoutée", + "transaction.external.added.from": "Une nouvelle transaction a été ajoutée par {name}", "transaction.external.from": "Ajouté depuis {name}", "transaction.fallbackTitle": "Transaction sans titre", "transaction.location": "Lieu", diff --git a/assets/l10n/it_IT.json b/assets/l10n/it_IT.json index 5b2a90c5..bd5aac5a 100644 --- a/assets/l10n/it_IT.json +++ b/assets/l10n/it_IT.json @@ -669,6 +669,7 @@ "transaction.edit.selectCategory.multiple": "Seleziona categorie", "transaction.edit.selectTags": "Seleziona tag", "transaction.external.added": "È stata aggiunta una nuova transazione", + "transaction.external.added.from": "Una nuova transazione è stata aggiunta da {name}", "transaction.external.from": "Aggiunta da {name}", "transaction.fallbackTitle": "Transazione senza titolo", "transaction.location": "Posizione", diff --git a/assets/l10n/ru_RU.json b/assets/l10n/ru_RU.json index 8e66c10e..fbc569f5 100644 --- a/assets/l10n/ru_RU.json +++ b/assets/l10n/ru_RU.json @@ -669,6 +669,7 @@ "transaction.edit.selectCategory.multiple": "Выберите категории", "transaction.edit.selectTags": "Выберите теги", "transaction.external.added": "Добавлена новая транзакция", + "transaction.external.added.from": "Новая транзакция была добавлена пользователем {name}", "transaction.external.from": "Добавлено от {name}", "transaction.fallbackTitle": "Транзакция без названия", "transaction.location": "Местоположение", diff --git a/assets/l10n/tr_TR.json b/assets/l10n/tr_TR.json index 424c175d..c2b789c9 100644 --- a/assets/l10n/tr_TR.json +++ b/assets/l10n/tr_TR.json @@ -669,6 +669,7 @@ "transaction.edit.selectCategory.multiple": "Kategorileri seçin", "transaction.edit.selectTags": "Etiketleri seç", "transaction.external.added": "Yeni bir işlem eklendi", + "transaction.external.added.from": "{name} tarafından eklendi", "transaction.external.from": "{name} tarafından eklendi", "transaction.fallbackTitle": "İsimsiz işlem", "transaction.location": "Konum", diff --git a/assets/l10n/uk_UA.json b/assets/l10n/uk_UA.json index e5f0bcb0..3fd213a1 100644 --- a/assets/l10n/uk_UA.json +++ b/assets/l10n/uk_UA.json @@ -669,6 +669,7 @@ "transaction.edit.selectCategory.multiple": "Виберіть категорії", "transaction.edit.selectTags": "Виберіть теги", "transaction.external.added": "Додано нову транзакцію", + "transaction.external.added.from": "Додано з {name}", "transaction.external.from": "Додано з {name}", "transaction.fallbackTitle": "Транзакція без назви", "transaction.location": "Місцезнаходження", diff --git a/ios/Podfile.lock b/ios/Podfile.lock index cd2f6636..775202ac 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -42,6 +42,8 @@ PODS: - file_saver (0.0.1): - Flutter - Flutter (1.0.0) + - flutter_app_group_directory (0.0.1): + - Flutter - flutter_contacts (0.0.1): - Flutter - flutter_dynamic_icon_plus (1.0.0): @@ -106,6 +108,7 @@ DEPENDENCIES: - file_picker (from `.symlinks/plugins/file_picker/ios`) - file_saver (from `.symlinks/plugins/file_saver/ios`) - Flutter (from `Flutter`) + - flutter_app_group_directory (from `.symlinks/plugins/flutter_app_group_directory/ios`) - flutter_contacts (from `.symlinks/plugins/flutter_contacts/ios`) - flutter_dynamic_icon_plus (from `.symlinks/plugins/flutter_dynamic_icon_plus/ios`) - flutter_keyboard_visibility_temp_fork (from `.symlinks/plugins/flutter_keyboard_visibility_temp_fork/ios`) @@ -151,6 +154,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/file_saver/ios" Flutter: :path: Flutter + flutter_app_group_directory: + :path: ".symlinks/plugins/flutter_app_group_directory/ios" flutter_contacts: :path: ".symlinks/plugins/flutter_contacts/ios" flutter_dynamic_icon_plus: @@ -205,6 +210,7 @@ SPEC CHECKSUMS: file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be file_saver: 6cdbcddd690cb02b0c1a0c225b37cd805c2bf8b6 Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 + flutter_app_group_directory: 55b5362007d1c0cb45dc1dd1e94f67d615f45a6b flutter_contacts: 5383945387e7ca37cf963d4be57c21f2fc15ca9f flutter_dynamic_icon_plus: 3ddd12bc2316b98ffdd4048e9cdd3cf51e02095d flutter_keyboard_visibility_temp_fork: 95b2d534bacf6ac62e7fcbe5c2a9e2c2a17ce06f diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 9fe04113..4ca4ffa6 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 2F5FC4CA2F38B4010045CB46 /* RecordTransactionIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F5FC4C92F38B4010045CB46 /* RecordTransactionIntent.swift */; }; 2F5FC4CD2F38B5F80045CB46 /* RecordedTransactionService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F5FC4CC2F38B5F80045CB46 /* RecordedTransactionService.swift */; }; 2F5FC4CE2F38B5F80045CB46 /* RecordedTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F5FC4CB2F38B5F80045CB46 /* RecordedTransaction.swift */; }; + 2F9A54282F3F806F001A859E /* TransactionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F9A54272F3F806F001A859E /* TransactionType.swift */; }; 2FA9672D2EAA8E7900D758DC /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FA9672C2EAA8E7900D758DC /* WidgetKit.framework */; }; 2FA9672F2EAA8E7900D758DC /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FA9672E2EAA8E7900D758DC /* SwiftUI.framework */; }; 2FA9673E2EAA8E7A00D758DC /* Flow WidgetsExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 2FA9672B2EAA8E7900D758DC /* Flow WidgetsExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; @@ -75,6 +76,7 @@ 2F5FC4CB2F38B5F80045CB46 /* RecordedTransaction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordedTransaction.swift; sourceTree = ""; }; 2F5FC4CC2F38B5F80045CB46 /* RecordedTransactionService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordedTransactionService.swift; sourceTree = ""; }; 2F88D2CA2D82C1E200BE0559 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + 2F9A54272F3F806F001A859E /* TransactionType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionType.swift; sourceTree = ""; }; 2FA9672B2EAA8E7900D758DC /* Flow WidgetsExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Flow WidgetsExtension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; 2FA9672C2EAA8E7900D758DC /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; 2FA9672E2EAA8E7900D758DC /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; @@ -212,6 +214,7 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( + 2F9A54272F3F806F001A859E /* TransactionType.swift */, 2F5FC4CB2F38B5F80045CB46 /* RecordedTransaction.swift */, 2F5FC4CC2F38B5F80045CB46 /* RecordedTransactionService.swift */, 2F88D2CA2D82C1E200BE0559 /* Runner.entitlements */, @@ -538,6 +541,7 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 2F5FC4CD2F38B5F80045CB46 /* RecordedTransactionService.swift in Sources */, 2F5FC4CE2F38B5F80045CB46 /* RecordedTransaction.swift in Sources */, + 2F9A54282F3F806F001A859E /* TransactionType.swift in Sources */, 2F5FC4CA2F38B4010045CB46 /* RecordTransactionIntent.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/ios/Runner/RecordTransactionIntent.swift b/ios/Runner/RecordTransactionIntent.swift index 6998158e..10fb01ae 100644 --- a/ios/Runner/RecordTransactionIntent.swift +++ b/ios/Runner/RecordTransactionIntent.swift @@ -1,23 +1,23 @@ import AppIntents struct RecordTransactionIntent: AppIntent { - static var title: LocalizedStringResource = "Record Transaction" - static var description: IntentDescription = "Log transactions from Siri." + static var title: LocalizedStringResource = "Record an Expense" + static var description: IntentDescription = "Log expenses from Siri." - @Parameter(title: "Account") + @Parameter(title: "Account", description: "Exact name, or UUID of the target account") var account: String - @Parameter(title: "Amount") + @Parameter(title: "Amount", description: "Expense amount. Sign doesn't matter.") var amount: Double - @Parameter(title: "Category") + @Parameter(title: "Category", description: "Exact name, or UUID of the target account") var category: String static var openAppWhenRun = false - func perform() async throws -> some IntentResult { + func perform() async throws -> some IntentResult & ProvidesDialog { let tx = RecordedTransaction(amount: amount, note: category) try RecordedTransactionService.append(tx) - return .result(value: "Recorded transaction for \(account): $\(amount) in category \(category).") + return .result(dialog: "Recorded transaction for \(account): $\(amount) in category \(category).") } } diff --git a/ios/Runner/RecordedTransaction.swift b/ios/Runner/RecordedTransaction.swift index 2cab1add..ba7a1587 100644 --- a/ios/Runner/RecordedTransaction.swift +++ b/ios/Runner/RecordedTransaction.swift @@ -4,17 +4,20 @@ struct RecordedTransaction: Codable { let id: UUID let amount: Double let note: String - let createdAt: Date + let transactionDate: Date + let type: TransactionType init( id: UUID = UUID(), amount: Double, note: String = "", - createdAt: Date = Date() + transactionDate: Date = Date(), + type: TransactionType = .expense ) { self.id = id self.amount = amount self.note = note self.createdAt = createdAt + self.type = type } } diff --git a/ios/Runner/TransactionType.swift b/ios/Runner/TransactionType.swift new file mode 100644 index 00000000..27adf399 --- /dev/null +++ b/ios/Runner/TransactionType.swift @@ -0,0 +1,5 @@ +enum TransactionType: String, Codable { + case expense + case income + case transfer +} \ No newline at end of file diff --git a/lib/constants.dart b/lib/constants.dart index 07c4d90c..7ac98ea3 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -37,3 +37,5 @@ const LatLng sukhbaatarSquareCenter = LatLng( sukhbaatarSquareCenterLat, sukhbaatarSquareCenterLong, ); + +const String iOSAppGroupId = "group.mn.flow.flow"; diff --git a/lib/entity/transaction.dart b/lib/entity/transaction.dart index f816c563..e77e0431 100644 --- a/lib/entity/transaction.dart +++ b/lib/entity/transaction.dart @@ -91,6 +91,8 @@ class Transaction implements EntityBase { /// in [extra]. List extraTags; + static const String importedFromSiriTag = "ios:importedFromSiri"; + @Transient() @JsonKey(includeFromJson: false, includeToJson: false) ExtensionsWrapper get extensions => ExtensionsWrapper.parse(extra); diff --git a/lib/main.dart b/lib/main.dart index fdcc257b..179f670b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -21,7 +21,9 @@ import "dart:ui"; import "package:flow/constants.dart"; import "package:flow/data/flow_icon.dart"; +import "package:flow/data/transaction_programmable_object.dart"; import "package:flow/entity/profile.dart"; +import "package:flow/entity/transaction.dart"; import "package:flow/graceful_migrations.dart"; import "package:flow/l10n/flow_localizations.dart"; import "package:flow/logging.dart"; @@ -44,6 +46,7 @@ import "package:flow/services/user_preferences.dart"; import "package:flow/theme/color_themes/registry.dart"; import "package:flow/theme/flow_color_scheme.dart"; import "package:flow/theme/theme.dart"; +import "package:flow/utils/ios/get_siri_transactions.dart"; import "package:flow/widgets/flow_themes.dart"; import "package:flow/widgets/general/flow_icon.dart"; import "package:flutter/material.dart"; @@ -216,6 +219,8 @@ class FlowState extends State { migratePrimaryCurrencyToDb(); migrateThemePrefsToDb(); migratePrivacyPreferencesToUserPreferences(); + + _resolveSiriTransactions(); }); _tryUnlockTempLock(); @@ -529,3 +534,35 @@ void initializeNotifications() async { startupLog.fine("No daily reminder set, skipping scheduling"); } } + +void _resolveSiriTransactions() async { + try { + if (!Platform.isIOS) { + mainLogger.fine("Not on iOS, skipping Siri transactions resolution"); + return; + } + + final bool markPendingAllTransactions = + UserPreferencesService().scansPendingThresholdInHours == 0; + + final List transactions = + await getSiriTransactions(); + + for (final TransactionProgrammableObject transaction in transactions) { + try { + transaction.save( + extraTags: [Transaction.importedFromSiriTag], + isPendingOverride: markPendingAllTransactions, + ); + } catch (e, stackTrace) { + mainLogger.severe( + "Failed to save transaction from Siri: $transaction", + e, + stackTrace, + ); + } + } + } catch (e, stackTrace) { + mainLogger.severe("Failed to resolve Siri transactions", e, stackTrace); + } +} diff --git a/lib/routes/transaction_page.dart b/lib/routes/transaction_page.dart index 0e4759b5..76e20b7f 100644 --- a/lib/routes/transaction_page.dart +++ b/lib/routes/transaction_page.dart @@ -42,7 +42,6 @@ import "package:flow/services/transactions.dart"; import "package:flow/services/user_preferences.dart"; import "package:flow/theme/theme.dart"; import "package:flow/utils/utils.dart"; -import "package:flow/widgets/animated_eny_logo.dart"; import "package:flow/widgets/general/button.dart"; import "package:flow/widgets/general/directional_chevron.dart"; import "package:flow/widgets/general/flow_icon.dart"; @@ -52,6 +51,8 @@ import "package:flow/widgets/general/money_text.dart"; import "package:flow/widgets/location_picker_sheet.dart"; import "package:flow/widgets/open_street_map.dart"; import "package:flow/widgets/sheets/select_transaction_tags_sheet.dart"; +import "package:flow/widgets/transaction/imported_from_eny.dart"; +import "package:flow/widgets/transaction/imported_from_siri.dart"; import "package:flow/widgets/transaction/type_selector.dart"; import "package:flutter/foundation.dart" hide Category; import "package:flutter/material.dart"; @@ -150,6 +151,7 @@ class _TransactionPageState extends State { bool _isPending = false; bool _importedFromEny = false; + bool _importedFromSiri = false; @override void initState() { @@ -224,6 +226,9 @@ class _TransactionPageState extends State { ); _geo = _currentlyEditing.extensions.geo; _importedFromEny = _currentlyEditing.extensions.eny != null; + _importedFromSiri = _currentlyEditing.extraTags.contains( + Transaction.importedFromSiriTag, + ); _isPending = _currentlyEditing.isPending ?? _isPending; if (_currentlyEditing.isTransfer == true) { _conversionRate = @@ -622,35 +627,11 @@ class _TransactionPageState extends State { ), if (_importedFromEny) ...[ const SizedBox(height: 8.0), - GestureDetector( - onTap: () { - openUrl(enyHomeLink); - }, - child: RichText( - text: TextSpan( - style: context.textTheme.bodyMedium?.semi( - context, - ), - children: [ - WidgetSpan( - child: SizedBox.square( - dimension: 16.0, - child: AnimatedEnyLogo( - noAnimation: true, - ), - ), - ), - TextSpan(text: " "), - TextSpan( - text: "transaction.external.from".t( - context, - "Eny", - ), - ), - ], - ), - ), - ), + ImportedFromEny(), + ], + if (_importedFromSiri) ...[ + const SizedBox(height: 8.0), + ImportedFromSiri(), ], ], ), diff --git a/lib/services/user_preferences.dart b/lib/services/user_preferences.dart index 301d68f7..b93549d1 100644 --- a/lib/services/user_preferences.dart +++ b/lib/services/user_preferences.dart @@ -1,6 +1,7 @@ import "dart:async"; import "dart:math"; +import "package:flow/constants.dart"; import "package:flow/data/flow_button_type.dart"; import "package:flow/data/flow_notification_payload.dart"; import "package:flow/data/prefs/change_visuals.dart"; @@ -351,7 +352,7 @@ class UserPreferencesService { .where((e) => e != FlowButtonType.eny) .map((e) => e.value) .join(","); - await HomeWidget.setAppGroupId("group.mn.flow.flow"); + await HomeWidget.setAppGroupId(iOSAppGroupId); await HomeWidget.saveWidgetData("buttonOrder", value); await Future.wait([ HomeWidget.updateWidget( diff --git a/lib/utils/ios/get_siri_transactions.dart b/lib/utils/ios/get_siri_transactions.dart new file mode 100644 index 00000000..7c4869d1 --- /dev/null +++ b/lib/utils/ios/get_siri_transactions.dart @@ -0,0 +1,102 @@ +import "dart:async"; +import "dart:convert"; +import "dart:io"; + +import "package:flow/constants.dart"; +import "package:flow/data/transaction_programmable_object.dart"; +import "package:flutter_app_group_directory/flutter_app_group_directory.dart"; + +final String _siriFileName = "recorded_transactions.jsonl"; + +Future _getAppGroupFile(String filename) async { + try { + final Directory? directory = + await FlutterAppGroupDirectory.getAppGroupDirectory(iOSAppGroupId); + + if (directory == null) { + throw Exception("App group directory not found"); + } + + final File file = File("${directory.path}/$filename"); + + if (!(await file.exists())) { + throw Exception("File not found"); + } else { + return file; + } + } catch (e) { + return null; + } +} + +Future _readAppGroupFile(String filename) async { + try { + final File? file = await _getAppGroupFile(filename); + + if (file == null) { + throw Exception("File not found"); + } + + final String contents = await file.readAsString(); + return contents; + } catch (e) { + return null; + } +} + +/// Returns whether the file was successfully deleted or not. +/// If the file doesn't exist, it returns false. +Future _deleteAppGroupFile(String filename) async { + try { + final File? file = await _getAppGroupFile(filename); + + if (file == null) { + throw Exception("File not found"); + } + + await file.delete(); + return true; + } catch (e) { + return false; + } +} + +Future> getSiriTransactions() async { + final String? fileContent = await _readAppGroupFile(_siriFileName); + + if (fileContent == null) { + return []; + } + + try { + final List lines = fileContent + .split("\n") + .where((line) => line.trim().isNotEmpty) + .toList(); + + final List transactions = []; + + for (final String line in lines) { + try { + final TransactionProgrammableObject? transaction = + TransactionProgrammableObject.tryParse(jsonDecode(line)); + if (transaction != null) { + transactions.add(transaction); + } + } catch (e) { + // If a line is malformed, skip it and continue processing other lines + } + } + + unawaited( + _deleteAppGroupFile("recorded_transactions.jsonl").catchError((_) { + // If deletion fails, we can ignore it since it's not critical for the app's functionality + return false; + }), + ); + + return transactions; + } catch (e) { + return []; + } +} diff --git a/lib/widgets/transaction/imported_from_eny.dart b/lib/widgets/transaction/imported_from_eny.dart new file mode 100644 index 00000000..26e487c7 --- /dev/null +++ b/lib/widgets/transaction/imported_from_eny.dart @@ -0,0 +1,34 @@ +import "package:flow/constants.dart"; +import "package:flow/l10n/extensions.dart"; +import "package:flow/theme/helpers.dart"; +import "package:flow/utils/utils.dart"; +import "package:flow/widgets/animated_eny_logo.dart"; +import "package:flutter/material.dart"; + +class ImportedFromEny extends StatelessWidget { + const ImportedFromEny({super.key}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + openUrl(enyHomeLink); + }, + child: RichText( + text: TextSpan( + style: context.textTheme.bodyMedium?.semi(context), + children: [ + WidgetSpan( + child: SizedBox.square( + dimension: 16.0, + child: AnimatedEnyLogo(noAnimation: true), + ), + ), + TextSpan(text: " "), + TextSpan(text: "transaction.external.added.from".t(context, "Eny")), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/transaction/imported_from_siri.dart b/lib/widgets/transaction/imported_from_siri.dart new file mode 100644 index 00000000..9e894d74 --- /dev/null +++ b/lib/widgets/transaction/imported_from_siri.dart @@ -0,0 +1,26 @@ +import "package:flow/l10n/extensions.dart"; +import "package:flow/theme/helpers.dart"; +import "package:flutter/material.dart"; + +class ImportedFromSiri extends StatelessWidget { + const ImportedFromSiri({super.key}); + + @override + Widget build(BuildContext context) { + return RichText( + text: TextSpan( + style: context.textTheme.bodyMedium?.semi(context), + children: [ + WidgetSpan( + child: SizedBox.square( + dimension: 16.0, + child: Image.asset("assets/images/siri.png"), + ), + ), + TextSpan(text: " "), + TextSpan(text: "transaction.external.from".t(context, "Siri")), + ], + ), + ); + } +} diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index c6217fb9..b7f06a0d 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -11,6 +11,7 @@ import desktop_drop import file_picker import file_saver import file_selector_macos +import flutter_app_group_directory import flutter_local_notifications import flutter_timezone import geolocator_apple @@ -35,6 +36,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) FileSaverPlugin.register(with: registry.registrar(forPlugin: "FileSaverPlugin")) FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) + FlutterAppGroupDirectoryPlugin.register(with: registry.registrar(forPlugin: "FlutterAppGroupDirectoryPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) FlutterTimezonePlugin.register(with: registry.registrar(forPlugin: "FlutterTimezonePlugin")) GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) diff --git a/pubspec.lock b/pubspec.lock index 713ed4b6..e0c505f7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -526,6 +526,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_app_group_directory: + dependency: "direct main" + description: + name: flutter_app_group_directory + sha256: "680ef9b2dee84c237cd7bb7fc78bc45867b32556a8a5f0de61278078b9fefd05" + url: "https://pub.dev" + source: hosted + version: "1.1.0" flutter_colorpicker: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 076c1fc2..9d2a7e4b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: A personal finance managing app publish_to: "none" # Remove this line if you wish to publish to pub.dev -version: "0.19.0+317" +version: "0.19.0+318" environment: sdk: ">=3.10.0 <4.0.0" @@ -25,6 +25,7 @@ dependencies: fl_chart: ^1.1.1 flutter: sdk: flutter + flutter_app_group_directory: ^1.1.0 flutter_contacts: ^1.1.9+2 flutter_dynamic_icon_plus: ^1.4.0 flutter_local_notifications: ^20.0.0 diff --git a/scripts/translate_missing.dart b/scripts/translate_missing.dart index bbfa7b98..fc1c9160 100644 --- a/scripts/translate_missing.dart +++ b/scripts/translate_missing.dart @@ -53,6 +53,7 @@ final Map filenameToTargetLanguageMapping = { "en.json": "English (generic)", "es_ES.json": "Spanish (Spain)", "fr_FR.json": "French (France)", + "fa_IR.json": "Persian (Iran)", "it_IT.json": "Italian (Italy)", "mn_MN.json": "Mongolian (Mongolia)", "ru_RU.json": "Russian (Russia)", From 2bf347c29f7150045f21251d6229f985d70b3529 Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Sat, 14 Feb 2026 00:54:54 +0800 Subject: [PATCH 06/21] fix transactionDate --- ios/Runner/RecordedTransaction.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/Runner/RecordedTransaction.swift b/ios/Runner/RecordedTransaction.swift index ba7a1587..5d2923c2 100644 --- a/ios/Runner/RecordedTransaction.swift +++ b/ios/Runner/RecordedTransaction.swift @@ -17,7 +17,7 @@ struct RecordedTransaction: Codable { self.id = id self.amount = amount self.note = note - self.createdAt = createdAt + self.transactionDate = transactionDate self.type = type } } From 8438cc35459e86b09b3c149d471e1128dfeb100b Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Sat, 14 Feb 2026 01:51:57 +0800 Subject: [PATCH 07/21] fix arabic icons, update Swift struct for siri --- CHANGELOG.md | 9 +++ assets/l10n/ar.json | 2 +- assets/l10n/cs_CZ.json | 2 +- assets/l10n/de_DE.json | 2 +- assets/l10n/en.json | 3 +- assets/l10n/es_ES.json | 2 +- assets/l10n/fa_IR.json | 2 +- assets/l10n/fr_FR.json | 2 +- assets/l10n/it_IT.json | 2 +- assets/l10n/mn_MN.json | 3 +- assets/l10n/ru_RU.json | 2 +- assets/l10n/tr_TR.json | 2 +- assets/l10n/uk_UA.json | 2 +- ios/Runner/RecordTransactionIntent.swift | 2 +- ios/Runner/RecordedTransaction.swift | 23 ++++++- lib/data/transaction_programmable_object.dart | 25 +++++++ lib/entity/transaction.dart | 12 ++++ lib/entity/user_preferences.dart | 2 + lib/entity/user_preferences.g.dart | 4 ++ lib/main.dart | 39 +---------- lib/objectbox/objectbox-model.json | 7 +- lib/objectbox/objectbox.g.dart | 19 +++++- lib/routes/account/account_edit_page.dart | 4 +- lib/routes/export/export_pdf_page.dart | 12 ++-- lib/routes/home/stats_tab.dart | 2 +- .../integrations/eny_preferences_page.dart | 2 +- .../money_formatting_preferences_page.dart | 2 +- ...list_item_appearance_preferences_page.dart | 16 ++++- lib/routes/preferences_page.dart | 39 +++++------ lib/routes/transaction_page.dart | 40 ++++++----- .../sections/description_section.dart | 2 +- .../sections/tags_section.dart | 2 +- .../select_account_sheet.dart | 2 +- .../select_category_sheet.dart | 2 +- .../select_until_mode_sheet.dart | 2 +- .../select_recurring_update_mode_sheet.dart | 2 +- lib/routes/transaction_tag_page.dart | 8 +-- lib/services/integrations/siri_pending.dart | 66 ++++++++++++++++++ lib/services/user_preferences.dart | 10 +++ lib/utils/ios/get_siri_transactions.dart | 2 + lib/widgets/flow_themes.dart | 2 + lib/widgets/general/directional_chevron.dart | 7 +- .../home/stats/most_spending_category.dart | 2 +- .../eny_page/eny_error_sheet.dart | 2 +- .../select_color_scheme_list_tile.dart | 2 +- .../setup/icloud_backup_picker_sheet.dart | 2 +- .../sheets/select_account_type_sheet.dart | 2 +- .../sheets/select_flow_icon_sheet.dart | 6 +- .../sheets/select_time_range_mode_sheet.dart | 6 +- .../sheets/select_transaction_type_sheet.dart | 2 +- .../transaction/imported_from_eny.dart | 1 + .../transaction/imported_from_siri.dart | 1 + lib/widgets/transaction_list_tile.dart | 67 ++++++++++++------- .../transaction_subtitle.dart | 29 ++++++++ lib/widgets/transaction_list_tile_theme.dart | 11 +++ 55 files changed, 368 insertions(+), 157 deletions(-) create mode 100644 lib/services/integrations/siri_pending.dart create mode 100644 lib/widgets/transaction_list_tile/transaction_subtitle.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index eaadfd4e..eddf8025 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ * Added a Siri integration (intent). * Persian (Iran) support thanks to @arefbhrn[https://github.com/arefbhrn] +### Changes + +* Added an option to show/hide external source (Eny, Siri) in transactions + +### Fixes + +* Action arrows are now correctly displayed in RTL languages (Arabic, Persian) + IDK why it was flipped, probably Flutter update did something. + ## 0.18.2 ### Fixes diff --git a/assets/l10n/ar.json b/assets/l10n/ar.json index fcc42bf1..2688bcbf 100644 --- a/assets/l10n/ar.json +++ b/assets/l10n/ar.json @@ -384,7 +384,7 @@ "preferences.transactions.listTile.leading.category": "الفئة", "preferences.transactions.listTile.preview": "معاينة", "preferences.transactions.listTile.showCategoryInList": "عرض الفئة بعد الحساب", - "preferences.transactions.listTile.transactionListTileRelaxedDensity": "تخطيط أقل كثافة", + "preferences.transactions.listTile.relaxedDensity": "تخطيط أقل كثافة", "preferences.transactions.pending": "المعاملات المعلقة", "preferences.transactions.pending.homeTimeframe": "عرضها على الصفحة الرئيسية", "preferences.transactions.pending.notify": "إعلام", diff --git a/assets/l10n/cs_CZ.json b/assets/l10n/cs_CZ.json index 803e0112..1430be8a 100644 --- a/assets/l10n/cs_CZ.json +++ b/assets/l10n/cs_CZ.json @@ -384,7 +384,7 @@ "preferences.transactions.listTile.leading.category": "Kategorie", "preferences.transactions.listTile.preview": "Náhled", "preferences.transactions.listTile.showCategoryInList": "Zobrazit kategorii vedle účtu", - "preferences.transactions.listTile.transactionListTileRelaxedDensity": "Volnější rozložení seznamu", + "preferences.transactions.listTile.relaxedDensity": "Volnější rozložení seznamu", "preferences.transactions.pending": "Čekající transakce", "preferences.transactions.pending.homeTimeframe": "Zobrazit na domovské obrazovce", "preferences.transactions.pending.notify": "Upozornit", diff --git a/assets/l10n/de_DE.json b/assets/l10n/de_DE.json index fb931833..e46443f1 100644 --- a/assets/l10n/de_DE.json +++ b/assets/l10n/de_DE.json @@ -384,7 +384,7 @@ "preferences.transactions.listTile.leading.category": "Kategorie", "preferences.transactions.listTile.preview": "Vorschau", "preferences.transactions.listTile.showCategoryInList": "Kategorie nach dem Konto anzeigen", - "preferences.transactions.listTile.transactionListTileRelaxedDensity": "Weniger dichtes Layout", + "preferences.transactions.listTile.relaxedDensity": "Weniger dichtes Layout", "preferences.transactions.pending": "Ausstehende Buchungen", "preferences.transactions.pending.homeTimeframe": "Auf der Startseite anzeigen", "preferences.transactions.pending.notify": "Benachrichtigen", diff --git a/assets/l10n/en.json b/assets/l10n/en.json index cbf45c34..396281dd 100644 --- a/assets/l10n/en.json +++ b/assets/l10n/en.json @@ -384,7 +384,8 @@ "preferences.transactions.listTile.leading.category": "Category", "preferences.transactions.listTile.preview": "Preview", "preferences.transactions.listTile.showCategoryInList": "Show category after the account", - "preferences.transactions.listTile.transactionListTileRelaxedDensity": "Less dense layout", + "preferences.transactions.listTile.showExternalSource": "Show external sources (e.g., Eny)", + "preferences.transactions.listTile.relaxedDensity": "Less dense layout", "preferences.transactions.pending": "Pending transactions", "preferences.transactions.pending.homeTimeframe": "Show on home", "preferences.transactions.pending.notify": "Notify", diff --git a/assets/l10n/es_ES.json b/assets/l10n/es_ES.json index 1917f544..430eedd3 100644 --- a/assets/l10n/es_ES.json +++ b/assets/l10n/es_ES.json @@ -384,7 +384,7 @@ "preferences.transactions.listTile.leading.category": "Categoría", "preferences.transactions.listTile.preview": "Vista previa", "preferences.transactions.listTile.showCategoryInList": "Mostrar categoría después de la cuenta", - "preferences.transactions.listTile.transactionListTileRelaxedDensity": "Diseño menos denso", + "preferences.transactions.listTile.relaxedDensity": "Diseño menos denso", "preferences.transactions.pending": "Transacciones pendientes", "preferences.transactions.pending.homeTimeframe": "Mostrar en inicio", "preferences.transactions.pending.notify": "Notificar", diff --git a/assets/l10n/fa_IR.json b/assets/l10n/fa_IR.json index 315411fe..6f9fead0 100644 --- a/assets/l10n/fa_IR.json +++ b/assets/l10n/fa_IR.json @@ -384,7 +384,7 @@ "preferences.transactions.listTile.leading.category": "دسته‌بندی", "preferences.transactions.listTile.preview": "پیش‌نمایش", "preferences.transactions.listTile.showCategoryInList": "نمایش دسته‌بندی بعد از حساب", - "preferences.transactions.listTile.transactionListTileRelaxedDensity": "چیدمان خلوت‌تر", + "preferences.transactions.listTile.relaxedDensity": "چیدمان خلوت‌تر", "preferences.transactions.pending": "تراکنش‌های در انتظار", "preferences.transactions.pending.homeTimeframe": "نمایش در صفحه خانه", "preferences.transactions.pending.notify": "اعلان", diff --git a/assets/l10n/fr_FR.json b/assets/l10n/fr_FR.json index 00160079..e483627e 100644 --- a/assets/l10n/fr_FR.json +++ b/assets/l10n/fr_FR.json @@ -384,7 +384,7 @@ "preferences.transactions.listTile.leading.category": "Catégorie", "preferences.transactions.listTile.preview": "Aperçu", "preferences.transactions.listTile.showCategoryInList": "Afficher la catégorie après le compte", - "preferences.transactions.listTile.transactionListTileRelaxedDensity": "Affichage moins dense", + "preferences.transactions.listTile.relaxedDensity": "Affichage moins dense", "preferences.transactions.pending": "Transactions en attente", "preferences.transactions.pending.homeTimeframe": "Afficher sur l'accueil", "preferences.transactions.pending.notify": "Notifier", diff --git a/assets/l10n/it_IT.json b/assets/l10n/it_IT.json index bd5aac5a..c73abda7 100644 --- a/assets/l10n/it_IT.json +++ b/assets/l10n/it_IT.json @@ -384,7 +384,7 @@ "preferences.transactions.listTile.leading.category": "Categoria", "preferences.transactions.listTile.preview": "Anteprima", "preferences.transactions.listTile.showCategoryInList": "Mostra categoria dopo il conto", - "preferences.transactions.listTile.transactionListTileRelaxedDensity": "Layout meno denso", + "preferences.transactions.listTile.relaxedDensity": "Layout meno denso", "preferences.transactions.pending": "Transazioni in sospeso", "preferences.transactions.pending.homeTimeframe": "Mostra in Home", "preferences.transactions.pending.notify": "Notifica", diff --git a/assets/l10n/mn_MN.json b/assets/l10n/mn_MN.json index f6db5cfa..32718b1a 100644 --- a/assets/l10n/mn_MN.json +++ b/assets/l10n/mn_MN.json @@ -384,7 +384,8 @@ "preferences.transactions.listTile.leading.category": "Ангилал", "preferences.transactions.listTile.preview": "Урьдчилан харах", "preferences.transactions.listTile.showCategoryInList": "Дансны ард ангилал харуулах", - "preferences.transactions.listTile.transactionListTileRelaxedDensity": "Илүү сийрэг байршил", + "preferences.transactions.listTile.showExternalSource": "Гадны эх сурвалжийг харуулах", + "preferences.transactions.listTile.relaxedDensity": "Илүү сийрэг байршил", "preferences.transactions.pending": "Хүлээгдэж буй гүйлгээнүүд", "preferences.transactions.pending.homeTimeframe": "Нүүр хуудсанд харуулах", "preferences.transactions.pending.notify": "Мэдэгдэл илгээх", diff --git a/assets/l10n/ru_RU.json b/assets/l10n/ru_RU.json index fbc569f5..66fe76bd 100644 --- a/assets/l10n/ru_RU.json +++ b/assets/l10n/ru_RU.json @@ -384,7 +384,7 @@ "preferences.transactions.listTile.leading.category": "Категория", "preferences.transactions.listTile.preview": "Предпросмотр", "preferences.transactions.listTile.showCategoryInList": "Показывать категорию после счета", - "preferences.transactions.listTile.transactionListTileRelaxedDensity": "Менее плотная компоновка", + "preferences.transactions.listTile.relaxedDensity": "Менее плотная компоновка", "preferences.transactions.pending": "Ожидающие транзакции", "preferences.transactions.pending.homeTimeframe": "Показывать на главном экране", "preferences.transactions.pending.notify": "Уведомлять", diff --git a/assets/l10n/tr_TR.json b/assets/l10n/tr_TR.json index c2b789c9..d6c639d3 100644 --- a/assets/l10n/tr_TR.json +++ b/assets/l10n/tr_TR.json @@ -384,7 +384,7 @@ "preferences.transactions.listTile.leading.category": "Kategori", "preferences.transactions.listTile.preview": "Önizleme", "preferences.transactions.listTile.showCategoryInList": "Hesaptan sonra kategoriyi göster", - "preferences.transactions.listTile.transactionListTileRelaxedDensity": "Daha seyrek yerleşim", + "preferences.transactions.listTile.relaxedDensity": "Daha seyrek yerleşim", "preferences.transactions.pending": "Bekleyen işlemler", "preferences.transactions.pending.homeTimeframe": "Ana sayfada göster", "preferences.transactions.pending.notify": "Bildirim", diff --git a/assets/l10n/uk_UA.json b/assets/l10n/uk_UA.json index 3fd213a1..f3f28b3b 100644 --- a/assets/l10n/uk_UA.json +++ b/assets/l10n/uk_UA.json @@ -384,7 +384,7 @@ "preferences.transactions.listTile.leading.category": "Категорія", "preferences.transactions.listTile.preview": "Попередній перегляд", "preferences.transactions.listTile.showCategoryInList": "Показувати категорію після рахунку", - "preferences.transactions.listTile.transactionListTileRelaxedDensity": "Менш щільне компонування", + "preferences.transactions.listTile.relaxedDensity": "Менш щільне компонування", "preferences.transactions.pending": "Очікувані транзакції", "preferences.transactions.pending.homeTimeframe": "Показувати на головному екрані", "preferences.transactions.pending.notify": "Сповіщати", diff --git a/ios/Runner/RecordTransactionIntent.swift b/ios/Runner/RecordTransactionIntent.swift index 10fb01ae..9a8ed598 100644 --- a/ios/Runner/RecordTransactionIntent.swift +++ b/ios/Runner/RecordTransactionIntent.swift @@ -16,7 +16,7 @@ struct RecordTransactionIntent: AppIntent { static var openAppWhenRun = false func perform() async throws -> some IntentResult & ProvidesDialog { - let tx = RecordedTransaction(amount: amount, note: category) + let tx = RecordedTransaction(amount: amount, category: category, account: account) try RecordedTransactionService.append(tx) return .result(dialog: "Recorded transaction for \(account): $\(amount) in category \(category).") } diff --git a/ios/Runner/RecordedTransaction.swift b/ios/Runner/RecordedTransaction.swift index 5d2923c2..d121757b 100644 --- a/ios/Runner/RecordedTransaction.swift +++ b/ios/Runner/RecordedTransaction.swift @@ -1,22 +1,39 @@ import Foundation +enum TransactionType: String, Codable { + case income + case expense +} + struct RecordedTransaction: Codable { let id: UUID let amount: Double - let note: String + let title: String? + let notes: String? + let fromAccount: String? + let toAccount: String? + let category: String? let transactionDate: Date let type: TransactionType init( id: UUID = UUID(), amount: Double, - note: String = "", + title: String?, + fromAccount: String?, + toAccount: String?, + category: String?, + notes: String?, transactionDate: Date = Date(), type: TransactionType = .expense ) { self.id = id self.amount = amount - self.note = note + self.title = title + self.notes = notes + self.fromAccount = fromAccount + self.toAccount = toAccount + self.category = category self.transactionDate = transactionDate self.type = type } diff --git a/lib/data/transaction_programmable_object.dart b/lib/data/transaction_programmable_object.dart index 0dcbc1af..f40c03d2 100644 --- a/lib/data/transaction_programmable_object.dart +++ b/lib/data/transaction_programmable_object.dart @@ -3,6 +3,7 @@ import "package:flow/entity/transaction/type.dart"; import "package:flow/services/user_preferences.dart"; import "package:flow/utils/loose_parsers.dart"; import "package:flow/utils/utils.dart"; +import "package:uuid/uuid.dart"; class TransactionProgrammableObject { final String? title; @@ -134,6 +135,30 @@ class TransactionProgrammableObject { } } + static TransactionProgrammableObject? fromSiriJson(Map json) { + try { + if (json["account"] case String account) { + if (Uuid.isValidUUID(fromString: account)) { + json["fromAccountUuid"] = account; + } else { + json["fromAccount"] = account; + } + } + + if (json["category"] case String category) { + if (Uuid.isValidUUID(fromString: category)) { + json["categoryUuid"] = category; + } else { + json["category"] = category; + } + } + + return parse(json.cast()); + } catch (e) { + return null; + } + } + static TransactionProgrammableObject? fromEnyJson(Map json) { String? itemsToNote(List items) { return items diff --git a/lib/entity/transaction.dart b/lib/entity/transaction.dart index e77e0431..2897c0f0 100644 --- a/lib/entity/transaction.dart +++ b/lib/entity/transaction.dart @@ -93,6 +93,18 @@ class Transaction implements EntityBase { static const String importedFromSiriTag = "ios:importedFromSiri"; + String? get externalProviderName { + if (extraTags.contains(importedFromSiriTag)) { + return "Siri"; + } + + if (extensions.eny != null) { + return "Eny"; + } + + return null; + } + @Transient() @JsonKey(includeFromJson: false, includeToJson: false) ExtensionsWrapper get extensions => ExtensionsWrapper.parse(extra); diff --git a/lib/entity/user_preferences.dart b/lib/entity/user_preferences.dart index 12a5c476..3eb5b78e 100644 --- a/lib/entity/user_preferences.dart +++ b/lib/entity/user_preferences.dart @@ -63,6 +63,7 @@ class UserPreferences implements EntityBase { bool transactionListTileShowCategoryName; bool transactionListTileShowAccountForLeading; + bool transactionListTileShowExternalSource; bool transactionListTileRelaxedDensity; bool createTransactionsPerItemInScans; @@ -161,6 +162,7 @@ class UserPreferences implements EntityBase { this.useCategoryNameForUntitledTransactions = false, this.transactionListTileShowCategoryName = false, this.transactionListTileShowAccountForLeading = false, + this.transactionListTileShowExternalSource = true, this.transactionListTileRelaxedDensity = false, this.createTransactionsPerItemInScans = true, this.scansPendingThresholdInHours = 6, diff --git a/lib/entity/user_preferences.g.dart b/lib/entity/user_preferences.g.dart index f2ac9907..2d492d71 100644 --- a/lib/entity/user_preferences.g.dart +++ b/lib/entity/user_preferences.g.dart @@ -17,6 +17,8 @@ UserPreferences _$UserPreferencesFromJson(Map json) => json['transactionListTileShowCategoryName'] as bool? ?? false, transactionListTileShowAccountForLeading: json['transactionListTileShowAccountForLeading'] as bool? ?? false, + transactionListTileShowExternalSource: + json['transactionListTileShowExternalSource'] as bool? ?? true, transactionListTileRelaxedDensity: json['transactionListTileRelaxedDensity'] as bool? ?? false, createTransactionsPerItemInScans: @@ -64,6 +66,8 @@ Map _$UserPreferencesToJson( instance.transactionListTileShowCategoryName, 'transactionListTileShowAccountForLeading': instance.transactionListTileShowAccountForLeading, + 'transactionListTileShowExternalSource': + instance.transactionListTileShowExternalSource, 'transactionListTileRelaxedDensity': instance.transactionListTileRelaxedDensity, 'createTransactionsPerItemInScans': instance.createTransactionsPerItemInScans, diff --git a/lib/main.dart b/lib/main.dart index 179f670b..1bd654e8 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -21,9 +21,7 @@ import "dart:ui"; import "package:flow/constants.dart"; import "package:flow/data/flow_icon.dart"; -import "package:flow/data/transaction_programmable_object.dart"; import "package:flow/entity/profile.dart"; -import "package:flow/entity/transaction.dart"; import "package:flow/graceful_migrations.dart"; import "package:flow/l10n/flow_localizations.dart"; import "package:flow/logging.dart"; @@ -36,6 +34,7 @@ import "package:flow/providers/transaction_tags_provider.dart"; import "package:flow/routes.dart"; import "package:flow/services/currency_registry.dart"; import "package:flow/services/exchange_rates.dart"; +import "package:flow/services/integrations/siri_pending.dart"; import "package:flow/services/local_auth.dart"; import "package:flow/services/navigation.dart"; import "package:flow/services/notifications.dart"; @@ -46,7 +45,6 @@ import "package:flow/services/user_preferences.dart"; import "package:flow/theme/color_themes/registry.dart"; import "package:flow/theme/flow_color_scheme.dart"; import "package:flow/theme/theme.dart"; -import "package:flow/utils/ios/get_siri_transactions.dart"; import "package:flow/widgets/flow_themes.dart"; import "package:flow/widgets/general/flow_icon.dart"; import "package:flutter/material.dart"; @@ -220,7 +218,7 @@ class FlowState extends State { migrateThemePrefsToDb(); migratePrivacyPreferencesToUserPreferences(); - _resolveSiriTransactions(); + unawaited(SiriPendingService().resolveSiriTransactions()); }); _tryUnlockTempLock(); @@ -237,6 +235,7 @@ class FlowState extends State { onShow: () { if (!mounted) return; _tryUnlockTempLock(); + unawaited(SiriPendingService().resolveSiriTransactions()); if (LocalAuthService.platformSupported && LocalPreferences().requireLocalAuthOnBlur.get()) { _tempLock = true; @@ -534,35 +533,3 @@ void initializeNotifications() async { startupLog.fine("No daily reminder set, skipping scheduling"); } } - -void _resolveSiriTransactions() async { - try { - if (!Platform.isIOS) { - mainLogger.fine("Not on iOS, skipping Siri transactions resolution"); - return; - } - - final bool markPendingAllTransactions = - UserPreferencesService().scansPendingThresholdInHours == 0; - - final List transactions = - await getSiriTransactions(); - - for (final TransactionProgrammableObject transaction in transactions) { - try { - transaction.save( - extraTags: [Transaction.importedFromSiriTag], - isPendingOverride: markPendingAllTransactions, - ); - } catch (e, stackTrace) { - mainLogger.severe( - "Failed to save transaction from Siri: $transaction", - e, - stackTrace, - ); - } - } - } catch (e, stackTrace) { - mainLogger.severe("Failed to resolve Siri transactions", e, stackTrace); - } -} diff --git a/lib/objectbox/objectbox-model.json b/lib/objectbox/objectbox-model.json index 2684db13..06509ff8 100644 --- a/lib/objectbox/objectbox-model.json +++ b/lib/objectbox/objectbox-model.json @@ -362,7 +362,7 @@ }, { "id": "10:7829328581176695647", - "lastPropertyId": "28:7803371152939021971", + "lastPropertyId": "29:4843097333162455732", "name": "UserPreferences", "properties": [ { @@ -497,6 +497,11 @@ "id": "28:7803371152939021971", "name": "privacyModeUponShaking", "type": 1 + }, + { + "id": "29:4843097333162455732", + "name": "transactionListTileShowExternalSource", + "type": 1 } ], "relations": [] diff --git a/lib/objectbox/objectbox.g.dart b/lib/objectbox/objectbox.g.dart index 67a4a523..e2d36470 100644 --- a/lib/objectbox/objectbox.g.dart +++ b/lib/objectbox/objectbox.g.dart @@ -455,7 +455,7 @@ final _entities = [ obx_int.ModelEntity( id: const obx_int.IdUid(10, 7829328581176695647), name: 'UserPreferences', - lastPropertyId: const obx_int.IdUid(28, 7803371152939021971), + lastPropertyId: const obx_int.IdUid(29, 4843097333162455732), flags: 0, properties: [ obx_int.ModelProperty( @@ -615,6 +615,12 @@ final _entities = [ type: 1, flags: 0, ), + obx_int.ModelProperty( + id: const obx_int.IdUid(29, 4843097333162455732), + name: 'transactionListTileShowExternalSource', + type: 1, + flags: 0, + ), ], relations: [], backlinks: [], @@ -1634,7 +1640,7 @@ obx_int.ModelDefinition getObjectBoxModel() { final primaryAccountUuidOffset = object.primaryAccountUuid == null ? null : fbb.writeString(object.primaryAccountUuid!); - fbb.startTable(29); + fbb.startTable(30); fbb.addInt64(0, object.id); fbb.addOffset(1, uuidOffset); fbb.addBool(2, object.combineTransfers); @@ -1661,6 +1667,7 @@ obx_int.ModelDefinition getObjectBoxModel() { fbb.addInt64(25, object.scansPendingThresholdInHours); fbb.addBool(26, object.privacyModeUponLaunch); fbb.addBool(27, object.privacyModeUponShaking); + fbb.addBool(28, object.transactionListTileShowExternalSource); fbb.finish(fbb.endTable()); return object.id; }, @@ -1691,6 +1698,8 @@ obx_int.ModelDefinition getObjectBoxModel() { .vTableGet(buffer, rootOffset, 24, false); final transactionListTileShowAccountForLeadingParam = const fb.BoolReader().vTableGet(buffer, rootOffset, 26, false); + final transactionListTileShowExternalSourceParam = const fb.BoolReader() + .vTableGet(buffer, rootOffset, 60, false); final transactionListTileRelaxedDensityParam = const fb.BoolReader() .vTableGet(buffer, rootOffset, 46, false); final createTransactionsPerItemInScansParam = const fb.BoolReader() @@ -1761,6 +1770,8 @@ obx_int.ModelDefinition getObjectBoxModel() { transactionListTileShowCategoryNameParam, transactionListTileShowAccountForLeading: transactionListTileShowAccountForLeadingParam, + transactionListTileShowExternalSource: + transactionListTileShowExternalSourceParam, transactionListTileRelaxedDensity: transactionListTileRelaxedDensityParam, createTransactionsPerItemInScans: @@ -2639,6 +2650,10 @@ class UserPreferences_ { /// See [UserPreferences.privacyModeUponShaking]. static final privacyModeUponShaking = obx.QueryBooleanProperty(_entities[6].properties[25]); + + /// See [UserPreferences.transactionListTileShowExternalSource]. + static final transactionListTileShowExternalSource = + obx.QueryBooleanProperty(_entities[6].properties[26]); } /// [Budget] entity fields to define ObjectBox queries. diff --git a/lib/routes/account/account_edit_page.dart b/lib/routes/account/account_edit_page.dart index b069f1a0..183d0660 100644 --- a/lib/routes/account/account_edit_page.dart +++ b/lib/routes/account/account_edit_page.dart @@ -225,7 +225,7 @@ class _AccountEditPageState extends State { Text(_currency, style: context.textTheme.labelLarge), if (widget.isNewAccount) ...[ const SizedBox(width: 8.0), - const DirectionalChevron(), + const LeChevron(), ], ], ), @@ -242,7 +242,7 @@ class _AccountEditPageState extends State { style: context.textTheme.labelLarge, ), const SizedBox(width: 8.0), - const DirectionalChevron(), + const LeChevron(), ], ), onTap: selectAccountType, diff --git a/lib/routes/export/export_pdf_page.dart b/lib/routes/export/export_pdf_page.dart index 4b53397e..b5c02fda 100644 --- a/lib/routes/export/export_pdf_page.dart +++ b/lib/routes/export/export_pdf_page.dart @@ -88,7 +88,7 @@ class _ExportPdfPageState extends State { const Spacer(), Button( onTap: canGenerate ? _generatePDF : null, - trailing: DirectionalChevron(), + trailing: const LeChevron(), child: Text("general.confirm".t(context)), ), ], @@ -128,10 +128,10 @@ class _ExportPdfPageState extends State { }), ), onTap: _selectAccounts, - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), ListTile( - leading: Icon(Symbols.category_rounded), + leading: const Icon(Symbols.category_rounded), title: Text("sync.export.pdf.categories".t(context)), subtitle: Text( "sync.export.pdf.categories.selected".tr({ @@ -140,21 +140,21 @@ class _ExportPdfPageState extends State { }), ), onTap: _selectCategories, - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), ListTile( leading: Icon(Symbols.schedule_rounded), title: Text("sync.export.pdf.timeRange".t(context)), subtitle: Text(rangeText), onTap: _selectRange, - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), ListTile( leading: Icon(Symbols.expand_content_rounded), title: Text("sync.export.pdf.size".t(context)), subtitle: Text(_useA4 ? "A4" : "Letter"), onTap: _selectPaperSize, - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), ], ), diff --git a/lib/routes/home/stats_tab.dart b/lib/routes/home/stats_tab.dart index b3083932..c2bddc8a 100644 --- a/lib/routes/home/stats_tab.dart +++ b/lib/routes/home/stats_tab.dart @@ -291,7 +291,7 @@ class _StatsTabState extends State label: Text( "tabs.stats.categories.seeAll".t(context), ), - icon: DirectionalChevron(), + icon: const LeChevron(), iconAlignment: IconAlignment.end, ), ), diff --git a/lib/routes/preferences/integrations/eny_preferences_page.dart b/lib/routes/preferences/integrations/eny_preferences_page.dart index 0cfe551b..340e2669 100644 --- a/lib/routes/preferences/integrations/eny_preferences_page.dart +++ b/lib/routes/preferences/integrations/eny_preferences_page.dart @@ -71,7 +71,7 @@ class _EnyPreferencesPageState extends State { child: AnimatedEnyLogo(noAnimation: true), ), title: Text("integrations.eny.dashboard".t(context)), - trailing: const DirectionalChevron(), + trailing: const LeChevron(), onTap: () { openUrl(enyDashboardLink, .externalApplication); }, diff --git a/lib/routes/preferences/money_formatting_preferences_page.dart b/lib/routes/preferences/money_formatting_preferences_page.dart index d13741a7..8c758ba5 100644 --- a/lib/routes/preferences/money_formatting_preferences_page.dart +++ b/lib/routes/preferences/money_formatting_preferences_page.dart @@ -70,7 +70,7 @@ class _MoneyFormattingPreferencesPageState "preferences.moneyFormatting.setICUPattern".t(context), ), onTap: updateCustomICUCurrencyFormatter, - trailing: const DirectionalChevron(), + trailing: const LeChevron(), ), ], ), diff --git a/lib/routes/preferences/transaction_list_item_appearance_preferences_page.dart b/lib/routes/preferences/transaction_list_item_appearance_preferences_page.dart index c6c04589..e36d68ae 100644 --- a/lib/routes/preferences/transaction_list_item_appearance_preferences_page.dart +++ b/lib/routes/preferences/transaction_list_item_appearance_preferences_page.dart @@ -30,6 +30,8 @@ class _TransactionListItemAppearancePreferencesPageState UserPreferencesService().useCategoryNameForUntitledTransactions; final bool transactionListTileShowCategoryName = UserPreferencesService().transactionListTileShowCategoryName; + final bool transactionListTileShowExternalSource = + UserPreferencesService().transactionListTileShowExternalSource; final bool transactionListTileShowAccountForLeading = UserPreferencesService().transactionListTileShowAccountForLeading; final bool transactionListTileRelaxedDensity = @@ -90,9 +92,21 @@ class _TransactionListItemAppearancePreferencesPageState ), SwitchListTile( title: Text( - "preferences.transactions.listTile.transactionListTileRelaxedDensity" + "preferences.transactions.listTile.transactionListTileShowExternalSource" .t(context), ), + value: transactionListTileShowExternalSource, + onChanged: (bool newValue) { + UserPreferencesService() + .transactionListTileShowExternalSource = + newValue; + setState(() {}); + }, + ), + SwitchListTile( + title: Text( + "preferences.transactions.listTile.relaxedDensity".t(context), + ), value: transactionListTileRelaxedDensity, onChanged: (bool newValue) { UserPreferencesService().transactionListTileRelaxedDensity = diff --git a/lib/routes/preferences_page.dart b/lib/routes/preferences_page.dart index e1d4d4ec..cb39626a 100644 --- a/lib/routes/preferences_page.dart +++ b/lib/routes/preferences_page.dart @@ -18,7 +18,6 @@ import "package:flow/utils/extensions.dart"; import "package:flow/widgets/animated_eny_logo.dart"; import "package:flow/widgets/general/directional_chevron.dart"; import "package:flow/widgets/general/list_header.dart"; -import "package:flow/widgets/general/rtl_flipper.dart"; import "package:flow/widgets/sheets/select_currency_sheet.dart"; import "package:flutter/material.dart" hide Flow; import "package:go_router/go_router.dart"; @@ -89,23 +88,21 @@ class PreferencesPageState extends State { title: Text("preferences.sync".t(context)), leading: const Icon(Symbols.sync_rounded), onTap: () => _pushAndRefreshAfter("/preferences/sync"), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), if (flowDebugMode || NotificationsService.schedulingSupported) ListTile( title: Text("preferences.reminders".t(context)), leading: const Icon(Symbols.notifications_rounded), onTap: () => _pushAndRefreshAfter("/preferences/reminders"), - trailing: RTLFlipper( - child: const Icon(Symbols.chevron_right_rounded), - ), + trailing: const LeChevron(), ), ListTile( title: Text("preferences.language".t(context)), leading: const Icon(Symbols.language_rounded), onTap: () => _updateLanguage(), subtitle: Text(FlowLocalizations.of(context).locale.endonym), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), ListTile( title: Text("preferences.primaryCurrency".t(context)), @@ -113,7 +110,7 @@ class PreferencesPageState extends State { leading: const Icon(Symbols.universal_currency_alt_rounded), onTap: () => _updatePrimaryCurrency(), subtitle: Text(currentPrimaryCurrency), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), ListTile( title: Text("preferences.transfer".t(context)), @@ -124,19 +121,19 @@ class PreferencesPageState extends State { maxLines: 1, overflow: TextOverflow.ellipsis, ), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), ListTile( title: Text("preferences.trashBin".t(context)), leading: const Icon(Symbols.delete_rounded), onTap: () => _pushAndRefreshAfter("/preferences/trashBin"), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), ListTile( title: Text("preferences.moneyFormatting".t(context)), leading: const Icon(Symbols.numbers_rounded), onTap: () => _pushAndRefreshAfter("/preferences/moneyFormatting"), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), const SizedBox(height: 24.0), ListHeader("preferences.integrations".t(context)), @@ -150,7 +147,7 @@ class PreferencesPageState extends State { ), onTap: () => _pushAndRefreshAfter("/preferences/integrations/eny"), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), const SizedBox(height: 24.0), ListHeader("preferences.transactions".t(context)), @@ -165,7 +162,7 @@ class PreferencesPageState extends State { leading: const Icon(Symbols.search_activity_rounded), onTap: () => _pushAndRefreshAfter("/preferences/pendingTransactions"), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), ListTile( title: Text("preferences.transactions.geo".t(context)), @@ -182,7 +179,7 @@ class PreferencesPageState extends State { maxLines: 1, overflow: TextOverflow.ellipsis, ), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), ListTile( leading: const Icon(Symbols.list_rounded), @@ -190,14 +187,14 @@ class PreferencesPageState extends State { onTap: () => _pushAndRefreshAfter( "/preferences/transactionListItemAppearance", ), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), ListTile( leading: const Icon(Symbols.automation_rounded), title: Text("preferences.transactionEntryFlow".t(context)), onTap: () => _pushAndRefreshAfter("/preferences/transactionEntryFlow"), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), const SizedBox(height: 24.0), ListHeader("preferences.appearance".t(context)), @@ -211,7 +208,7 @@ class PreferencesPageState extends State { themeNames[currentTheme.name] ?? currentTheme.name, ), onTap: _openTheme, - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), ListTile( title: Text("preferences.numpad".t(context)), @@ -222,7 +219,7 @@ class PreferencesPageState extends State { ? "preferences.numpad.layout.modern".t(context) : "preferences.numpad.layout.classic".t(context), ), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), ListTile( title: Text("preferences.transactionButtonOrder".t(context)), @@ -234,13 +231,13 @@ class PreferencesPageState extends State { maxLines: 1, overflow: TextOverflow.ellipsis, ), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), ListTile( title: Text("preferences.changeVisuals".t(context)), leading: const Icon(Symbols.moving_rounded), onTap: () => _pushAndRefreshAfter("/preferences/changeVisuals"), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), const SizedBox(height: 24.0), ListHeader("preferences.privacy".t(context)), @@ -258,13 +255,13 @@ class PreferencesPageState extends State { title: Text("fileAttachment.cleanupHangingFiles".t(context)), leading: const Icon(Symbols.bug_report_rounded), onTap: () => _deleteHangingFiles(), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), ListTile( title: Text("preferences.feedback.debugLogs".t(context)), leading: const Icon(Symbols.bug_report_rounded), onTap: () => context.push("/_debug/logs"), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), const SizedBox(height: 16.0), ], diff --git a/lib/routes/transaction_page.dart b/lib/routes/transaction_page.dart index 76e20b7f..8ebd5bc1 100644 --- a/lib/routes/transaction_page.dart +++ b/lib/routes/transaction_page.dart @@ -150,9 +150,6 @@ class _TransactionPageState extends State { bool _isPending = false; - bool _importedFromEny = false; - bool _importedFromSiri = false; - @override void initState() { super.initState(); @@ -225,10 +222,6 @@ class _TransactionPageState extends State { _currentlyEditing.extensions.transfer?.toAccountUuid, ); _geo = _currentlyEditing.extensions.geo; - _importedFromEny = _currentlyEditing.extensions.eny != null; - _importedFromSiri = _currentlyEditing.extraTags.contains( - Transaction.importedFromSiriTag, - ); _isPending = _currentlyEditing.isPending ?? _isPending; if (_currentlyEditing.isTransfer == true) { _conversionRate = @@ -418,7 +411,7 @@ class _TransactionPageState extends State { ), onTap: () => inputPostConversionAmount(), trailing: _selectedAccountTransferTo == null - ? DirectionalChevron() + ? LeChevron() : null, focusNode: _selectAccountTransferToFocusNode, ), @@ -475,7 +468,7 @@ class _TransactionPageState extends State { title: Text(transactionDate.toMoment().LLL), onTap: () => selectTransactionDate(), leading: Icon(Symbols.calendar_month_rounded), - trailing: const DirectionalChevron(), + trailing: const LeChevron(), ), SwitchListTile( title: Text("transaction.pending".t(context)), @@ -507,7 +500,7 @@ class _TransactionPageState extends State { "transaction.recurring.setup".t(context), ), onTap: _setupRecurring, - trailing: const DirectionalChevron(), + trailing: const LeChevron(), ), ), ), @@ -625,14 +618,25 @@ class _TransactionPageState extends State { context, ), ), - if (_importedFromEny) ...[ - const SizedBox(height: 8.0), - ImportedFromEny(), - ], - if (_importedFromSiri) ...[ - const SizedBox(height: 8.0), - ImportedFromSiri(), - ], + if (UserPreferencesService() + .transactionListTileShowExternalSource) + if (_currentlyEditing.externalProviderName + case String providerName) ...[ + const SizedBox(height: 8.0), + switch (providerName.toLowerCase()) { + "eny" => const ImportedFromEny(), + "siri" => const ImportedFromSiri(), + _ => Text( + "transaction.external.from".t( + context, + providerName, + ), + style: context.textTheme.bodyMedium?.semi( + context, + ), + ), + }, + ], ], ), ), diff --git a/lib/routes/transaction_page/sections/description_section.dart b/lib/routes/transaction_page/sections/description_section.dart index 5ea20204..65a61767 100644 --- a/lib/routes/transaction_page/sections/description_section.dart +++ b/lib/routes/transaction_page/sections/description_section.dart @@ -55,7 +55,7 @@ class _DescriptionSectionState extends State { onTap: () => showEditModal(context), title: Text("transaction.description.add".t(context)), leading: Icon(Symbols.add_notes_rounded), - trailing: const DirectionalChevron(), + trailing: const LeChevron(), ) : InkWell( onTap: () => showEditModal(context), diff --git a/lib/routes/transaction_page/sections/tags_section.dart b/lib/routes/transaction_page/sections/tags_section.dart index a9f21a84..d4adc993 100644 --- a/lib/routes/transaction_page/sections/tags_section.dart +++ b/lib/routes/transaction_page/sections/tags_section.dart @@ -57,7 +57,7 @@ class TagsSection extends StatelessWidget { : ListTile( leading: Icon(Symbols.style_rounded), title: Text("transaction.edit.selectTags".t(context)), - trailing: DirectionalChevron(), + trailing: LeChevron(), onTap: selectTags, ), onTap: () { diff --git a/lib/routes/transaction_page/select_account_sheet.dart b/lib/routes/transaction_page/select_account_sheet.dart index 9d78cdf9..fbeb90b6 100644 --- a/lib/routes/transaction_page/select_account_sheet.dart +++ b/lib/routes/transaction_page/select_account_sheet.dart @@ -103,7 +103,7 @@ class _SelectAccountSheetState extends State { ) : null, leading: FlowIcon(account.icon), - trailing: widget.showTrailing ? DirectionalChevron() : null, + trailing: widget.showTrailing ? LeChevron() : null, onTap: () => context.pop(account), selected: widget.currentlySelectedAccountId == account.id, ), diff --git a/lib/routes/transaction_page/select_category_sheet.dart b/lib/routes/transaction_page/select_category_sheet.dart index a49266d5..d22c9df4 100644 --- a/lib/routes/transaction_page/select_category_sheet.dart +++ b/lib/routes/transaction_page/select_category_sheet.dart @@ -79,7 +79,7 @@ class _SelectCategorySheetState extends State { category.icon, colorScheme: category.colorScheme, ), - trailing: widget.showTrailing ? DirectionalChevron() : null, + trailing: widget.showTrailing ? LeChevron() : null, onTap: () => context.pop(Optional(category)), selected: widget.currentlySelectedCategoryId == category.id, ), diff --git a/lib/routes/transaction_page/select_recurrence/select_until_mode_sheet.dart b/lib/routes/transaction_page/select_recurrence/select_until_mode_sheet.dart index e63c6f36..c6f3e2df 100644 --- a/lib/routes/transaction_page/select_recurrence/select_until_mode_sheet.dart +++ b/lib/routes/transaction_page/select_recurrence/select_until_mode_sheet.dart @@ -23,7 +23,7 @@ class SelectUntilModeSheet extends StatelessWidget { onTap: () { context.pop(value); }, - trailing: const DirectionalChevron(), + trailing: const LeChevron(), ), ) .toList(), diff --git a/lib/routes/transaction_page/select_recurring_update_mode_sheet.dart b/lib/routes/transaction_page/select_recurring_update_mode_sheet.dart index 5f2d0484..aac8b20c 100644 --- a/lib/routes/transaction_page/select_recurring_update_mode_sheet.dart +++ b/lib/routes/transaction_page/select_recurring_update_mode_sheet.dart @@ -56,7 +56,7 @@ class SelectRecurringUpdateModeSheet extends StatelessWidget { key: ValueKey(mode), title: Text(mode.localizedNameContext(context)), onTap: () => context.pop(mode), - trailing: showTrailing ? DirectionalChevron() : null, + trailing: showTrailing ? LeChevron() : null, selected: current == mode, ), ), diff --git a/lib/routes/transaction_tag_page.dart b/lib/routes/transaction_tag_page.dart index d0cc9492..b8f30093 100644 --- a/lib/routes/transaction_tag_page.dart +++ b/lib/routes/transaction_tag_page.dart @@ -216,20 +216,20 @@ class _TransactionTagPageState extends State { _type == TransactionTagType.location) ListTile( enabled: !_locationBusy, - leading: Icon(Symbols.my_location_rounded), + leading: const Icon(Symbols.my_location_rounded), onTap: _useMyLocation, title: Text( "transaction.tags.location.useCurrent".t(context), ), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), if ((Platform.isAndroid || Platform.isIOS) && _type == TransactionTagType.contact) ...[ ListTile( - leading: Icon(Symbols.contact_page_rounded), + leading: const Icon(Symbols.contact_page_rounded), onTap: _selectContact, title: Text("transaction.tags.contact.select".t(context)), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), Frame( child: InfoText( diff --git a/lib/services/integrations/siri_pending.dart b/lib/services/integrations/siri_pending.dart new file mode 100644 index 00000000..1f091943 --- /dev/null +++ b/lib/services/integrations/siri_pending.dart @@ -0,0 +1,66 @@ +import "dart:io"; + +import "package:flow/data/transaction_programmable_object.dart"; +import "package:flow/entity/transaction.dart"; +import "package:flow/l10n/extensions.dart"; +import "package:flow/objectbox/actions.dart"; +import "package:flow/services/external_toasts.dart"; +import "package:flow/services/user_preferences.dart"; +import "package:flow/utils/ios/get_siri_transactions.dart"; +import "package:logging/logging.dart"; + +final Logger _log = Logger("SiriPendingService"); + +class SiriPendingService { + static SiriPendingService? _instance; + + factory SiriPendingService() => _instance ??= SiriPendingService._internal(); + + SiriPendingService._internal() { + // Constructor + } + + Future resolveSiriTransactions() async { + try { + if (!Platform.isIOS) { + _log.fine("Not on iOS, skipping Siri transactions resolution"); + return; + } + + final bool markPendingAllTransactions = + UserPreferencesService().scansPendingThresholdInHours == 0; + + final List transactions = + await getSiriTransactions(); + + int saved = 0; + + for (final TransactionProgrammableObject transaction in transactions) { + try { + transaction.save( + extraTags: [Transaction.importedFromSiriTag], + isPendingOverride: markPendingAllTransactions, + ); + saved++; + } catch (e, stackTrace) { + _log.severe( + "Failed to save transaction from Siri: $transaction", + e, + stackTrace, + ); + } + } + if (saved > 0) { + ExternalToastsService().addToast( + "transaction.external.added.from".tr("Siri"), + .success, + ); + } + _log.info( + "Successfully imported $saved out of ${transactions.length} transactions from Siri", + ); + } catch (e, stackTrace) { + _log.severe("Failed to resolve Siri transactions", e, stackTrace); + } + } +} diff --git a/lib/services/user_preferences.dart b/lib/services/user_preferences.dart index b93549d1..dca2b25d 100644 --- a/lib/services/user_preferences.dart +++ b/lib/services/user_preferences.dart @@ -167,6 +167,16 @@ class UserPreferencesService { ObjectBox().box().put(value); } + bool get transactionListTileShowExternalSource => + value.transactionListTileShowExternalSource; + set transactionListTileShowExternalSource( + bool newTransactionListTileShowExternalSource, + ) { + value.transactionListTileShowExternalSource = + newTransactionListTileShowExternalSource; + ObjectBox().box().put(value); + } + bool get transactionListTileRelaxedDensity => value.transactionListTileRelaxedDensity; set transactionListTileRelaxedDensity( diff --git a/lib/utils/ios/get_siri_transactions.dart b/lib/utils/ios/get_siri_transactions.dart index 7c4869d1..a12a81f6 100644 --- a/lib/utils/ios/get_siri_transactions.dart +++ b/lib/utils/ios/get_siri_transactions.dart @@ -74,6 +74,8 @@ Future> getSiriTransactions() async { .where((line) => line.trim().isNotEmpty) .toList(); + print(lines); + final List transactions = []; for (final String line in lines) { diff --git a/lib/widgets/flow_themes.dart b/lib/widgets/flow_themes.dart index 7088861b..4d6e7634 100644 --- a/lib/widgets/flow_themes.dart +++ b/lib/widgets/flow_themes.dart @@ -36,6 +36,8 @@ class _FlowThemesState extends State { UserPreferencesService().useCategoryNameForUntitledTransactions, useAccountIconForLeading: UserPreferencesService().transactionListTileShowAccountForLeading, + showExternalSource: + UserPreferencesService().transactionListTileShowExternalSource, showCategory: UserPreferencesService().transactionListTileShowCategoryName, padding: relaxed diff --git a/lib/widgets/general/directional_chevron.dart b/lib/widgets/general/directional_chevron.dart index 6ddd6c15..b408bc8c 100644 --- a/lib/widgets/general/directional_chevron.dart +++ b/lib/widgets/general/directional_chevron.dart @@ -1,12 +1,11 @@ -import "package:flow/widgets/general/rtl_flipper.dart"; import "package:flutter/material.dart"; import "package:material_symbols_icons/symbols.dart"; -class DirectionalChevron extends StatelessWidget { - const DirectionalChevron({super.key}); +class LeChevron extends StatelessWidget { + const LeChevron({super.key}); @override Widget build(BuildContext context) { - return const RTLFlipper(child: Icon(Symbols.chevron_right_rounded)); + return const Icon(Symbols.chevron_right_rounded); } } diff --git a/lib/widgets/home/stats/most_spending_category.dart b/lib/widgets/home/stats/most_spending_category.dart index c019c89e..fe9c4635 100644 --- a/lib/widgets/home/stats/most_spending_category.dart +++ b/lib/widgets/home/stats/most_spending_category.dart @@ -103,7 +103,7 @@ class _MostSpendingCategoryState extends State { ], ), ), - DirectionalChevron(), + const LeChevron(), ], ), ), diff --git a/lib/widgets/integrations/eny_page/eny_error_sheet.dart b/lib/widgets/integrations/eny_page/eny_error_sheet.dart index a2acf140..d29dd0e5 100644 --- a/lib/widgets/integrations/eny_page/eny_error_sheet.dart +++ b/lib/widgets/integrations/eny_page/eny_error_sheet.dart @@ -26,7 +26,7 @@ class EnyErrorSheet extends StatelessWidget { } context.push("/preferences/integrations/eny"); }, - trailing: DirectionalChevron(), + trailing: LeChevron(), child: Text( "integrations.eny.invalidCredentials.configure".t(context), ), diff --git a/lib/widgets/select_color_scheme_list_tile.dart b/lib/widgets/select_color_scheme_list_tile.dart index b11d9e2f..79b0e066 100644 --- a/lib/widgets/select_color_scheme_list_tile.dart +++ b/lib/widgets/select_color_scheme_list_tile.dart @@ -63,7 +63,7 @@ class _SelectColorSchemeListTileState extends State { ), duration: const Duration(milliseconds: 200), ), - DirectionalChevron(), + const LeChevron(), ], ), ); diff --git a/lib/widgets/setup/icloud_backup_picker_sheet.dart b/lib/widgets/setup/icloud_backup_picker_sheet.dart index f4b1553f..be6880b4 100644 --- a/lib/widgets/setup/icloud_backup_picker_sheet.dart +++ b/lib/widgets/setup/icloud_backup_picker_sheet.dart @@ -41,7 +41,7 @@ class _ICloudBackupPickerSheetState extends State { title: Text(backup.inferredBackupDate!.toMoment().lll), subtitle: Text(path.extension(backup.path).substring(1)), onTap: () => context.pop(backup), - trailing: DirectionalChevron(), + trailing: LeChevron(), ), ) .toList(), diff --git a/lib/widgets/sheets/select_account_type_sheet.dart b/lib/widgets/sheets/select_account_type_sheet.dart index 57fafe0f..4bb55eb2 100644 --- a/lib/widgets/sheets/select_account_type_sheet.dart +++ b/lib/widgets/sheets/select_account_type_sheet.dart @@ -23,7 +23,7 @@ class SelectAccountTypeSheet extends StatelessWidget { (value) => ListTile( title: Text(value.localizedNameContext(context)), selected: currentlySelected == value, - trailing: const DirectionalChevron(), + trailing: const LeChevron(), onTap: () => context.pop(value), ), ) diff --git a/lib/widgets/sheets/select_flow_icon_sheet.dart b/lib/widgets/sheets/select_flow_icon_sheet.dart index 068ce9c9..b1612900 100644 --- a/lib/widgets/sheets/select_flow_icon_sheet.dart +++ b/lib/widgets/sheets/select_flow_icon_sheet.dart @@ -32,19 +32,19 @@ class _SelectFlowIconSheetState extends State children: [ ListTile( leading: const Icon(Symbols.category_rounded), - trailing: DirectionalChevron(), + trailing: const LeChevron(), title: Text("flowIcon.type.icon".t(context)), onTap: () => _selectIcon(), ), ListTile( leading: const Icon(Symbols.glyphs_rounded), - trailing: DirectionalChevron(), + trailing: const LeChevron(), title: Text("flowIcon.type.character".t(context)), onTap: () => _selectEmoji(), ), ListTile( leading: const Icon(Symbols.image_rounded), - trailing: DirectionalChevron(), + trailing: const LeChevron(), title: Text("flowIcon.type.image".t(context)), onTap: () => _selectImage(), ), diff --git a/lib/widgets/sheets/select_time_range_mode_sheet.dart b/lib/widgets/sheets/select_time_range_mode_sheet.dart index 056b8759..01f72ee3 100644 --- a/lib/widgets/sheets/select_time_range_mode_sheet.dart +++ b/lib/widgets/sheets/select_time_range_mode_sheet.dart @@ -109,17 +109,17 @@ class SelectTimeRangeModeSheet extends StatelessWidget { ListTile( title: Text("select.timeRange.mode.byMonth".t(context)), onTap: () => context.pop(TimeRangeMode.byMonth), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), ListTile( title: Text("select.timeRange.mode.byYear".t(context)), onTap: () => context.pop(TimeRangeMode.byYear), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), ListTile( title: Text("select.timeRange.mode.custom".t(context)), onTap: () => context.pop(TimeRangeMode.custom), - trailing: DirectionalChevron(), + trailing: const LeChevron(), ), ], ), diff --git a/lib/widgets/sheets/select_transaction_type_sheet.dart b/lib/widgets/sheets/select_transaction_type_sheet.dart index c71c8a1e..0ae5f0c2 100644 --- a/lib/widgets/sheets/select_transaction_type_sheet.dart +++ b/lib/widgets/sheets/select_transaction_type_sheet.dart @@ -34,7 +34,7 @@ class SelectTransactionTypeSheet extends StatelessWidget { (value) => ListTile( title: Text(value.localizedNameContext(context)), selected: currentlySelected == value, - trailing: const DirectionalChevron(), + trailing: const LeChevron(), onTap: () => context.pop(value), ), ) diff --git a/lib/widgets/transaction/imported_from_eny.dart b/lib/widgets/transaction/imported_from_eny.dart index 26e487c7..d396402c 100644 --- a/lib/widgets/transaction/imported_from_eny.dart +++ b/lib/widgets/transaction/imported_from_eny.dart @@ -23,6 +23,7 @@ class ImportedFromEny extends StatelessWidget { dimension: 16.0, child: AnimatedEnyLogo(noAnimation: true), ), + alignment: .middle, ), TextSpan(text: " "), TextSpan(text: "transaction.external.added.from".t(context, "Eny")), diff --git a/lib/widgets/transaction/imported_from_siri.dart b/lib/widgets/transaction/imported_from_siri.dart index 9e894d74..11f663ab 100644 --- a/lib/widgets/transaction/imported_from_siri.dart +++ b/lib/widgets/transaction/imported_from_siri.dart @@ -16,6 +16,7 @@ class ImportedFromSiri extends StatelessWidget { dimension: 16.0, child: Image.asset("assets/images/siri.png"), ), + alignment: .middle, ), TextSpan(text: " "), TextSpan(text: "transaction.external.from".t(context, "Siri")), diff --git a/lib/widgets/transaction_list_tile.dart b/lib/widgets/transaction_list_tile.dart index 41f5ce61..db86f328 100644 --- a/lib/widgets/transaction_list_tile.dart +++ b/lib/widgets/transaction_list_tile.dart @@ -1,3 +1,4 @@ +import "package:flow/constants.dart"; import "package:flow/data/flow_icon.dart"; import "package:flow/data/money.dart"; import "package:flow/data/transaction_filter.dart"; @@ -11,6 +12,7 @@ import "package:flow/utils/extensions/transaction.dart"; import "package:flow/widgets/general/directional_slidable.dart"; import "package:flow/widgets/general/flow_icon.dart"; import "package:flow/widgets/general/money_text.dart"; +import "package:flow/widgets/transaction_list_tile/transaction_subtitle.dart"; import "package:flow/widgets/transaction_list_tile_theme.dart"; import "package:flutter/material.dart"; import "package:flutter_slidable/flutter_slidable.dart"; @@ -94,30 +96,50 @@ class TransactionListTile extends StatelessWidget { ? transaction.extensions.transfer : null; - final TextDirection textDirection = Directionality.of(context); - - final List subtitleParts = [ - (transaction.isTransfer && combineTransfers) - ? "${AccountsProvider.of(context).getName(transfer!.fromAccountUuid)} → ${AccountsProvider.of(context).getName(transfer.toAccountUuid)}" - : (AccountsProvider.of(context).getName(transaction.accountUuid) ?? - transaction.account.target?.name), + final List subtitleComponents = [ + TextSpan( + text: (transaction.isTransfer && combineTransfers) + ? "${AccountsProvider.of(context).getName(transfer!.fromAccountUuid)} → ${AccountsProvider.of(context).getName(transfer.toAccountUuid)}" + : (AccountsProvider.of(context).getName(transaction.accountUuid) ?? + transaction.account.target?.name), + ), if (effectiveTheme.showCategoryOrDefault && transaction.category.target != null) - transaction.category.target!.name, - dateString, + TextSpan(text: transaction.category.target!.name), + if (effectiveTheme.showExternalSourceOrDefault) + if (transaction.externalProviderName + case String externalProviderName) ...[ + TextSpan( + children: [ + if (externalProviderName == "Siri") + WidgetSpan( + child: Padding( + padding: .only(right: 4.0), + child: Image.asset("assets/images/siri.png", height: 12.0), + ), + alignment: .middle, + ), + if (externalProviderName == "Eny") + WidgetSpan( + child: Padding( + padding: .only(right: 4.0), + child: Image.network(enyLogoUrl, height: 12.0), + ), + alignment: .middle, + ), + TextSpan(text: externalProviderName), + ], + ), + ], + TextSpan(text: dateString), if (transaction.transactionDate.isFuture) - transaction.isPending == true - ? "transaction.pending".t(context) - : "transaction.pending.preapproved".t(context), + TextSpan( + text: transaction.isPending == true + ? "transaction.pending".t(context) + : "transaction.pending.preapproved".t(context), + ), ]; - final String subtitle = - (textDirection == TextDirection.ltr - ? subtitleParts - : subtitleParts.reversed) - .nonNulls - .join(" • "); - final WidgetSpan? titleLeadingIconSpan = transaction.isRecurring ? titleIconSpan(context, Symbols.repeat_rounded) : (transaction.transactionDate.isFutureAnchored( @@ -166,12 +188,7 @@ class TransactionListTile extends StatelessWidget { maxLines: 3, overflow: TextOverflow.ellipsis, ), - Text( - subtitle, - style: context.textTheme.labelSmall, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), + TransactionSubtitle(components: subtitleComponents), ], ), ), diff --git a/lib/widgets/transaction_list_tile/transaction_subtitle.dart b/lib/widgets/transaction_list_tile/transaction_subtitle.dart new file mode 100644 index 00000000..3599049c --- /dev/null +++ b/lib/widgets/transaction_list_tile/transaction_subtitle.dart @@ -0,0 +1,29 @@ +import "package:flutter/material.dart"; + +class TransactionSubtitle extends StatelessWidget { + final List components; + + const TransactionSubtitle({super.key, required this.components}); + + @override + Widget build(BuildContext context) { + final TextDirection textDirection = Directionality.of(context); + const TextSpan divider = TextSpan(text: " • "); + + final List orderedComponents = [ + for (int i = 0; i < components.length; i++) ...[ + if (i != 0) divider, + components[i], + ], + ]; + + return RichText( + text: TextSpan( + children: textDirection == TextDirection.ltr + ? orderedComponents + : orderedComponents.reversed.toList(), + style: Theme.of(context).textTheme.labelSmall, + ), + ); + } +} diff --git a/lib/widgets/transaction_list_tile_theme.dart b/lib/widgets/transaction_list_tile_theme.dart index 231fe4be..87d62267 100644 --- a/lib/widgets/transaction_list_tile_theme.dart +++ b/lib/widgets/transaction_list_tile_theme.dart @@ -32,6 +32,7 @@ class TransactionListTileThemeData { final bool? useCategoryNameForUntitledTransactions; final bool? useAccountIconForLeading; + final bool? showExternalSource; final bool? showCategory; final double? spacing; @@ -48,6 +49,9 @@ class TransactionListTileThemeData { bool get showCategoryOrDefault => showCategory ?? fallback.showCategory!; + bool get showExternalSourceOrDefault => + showExternalSource ?? fallback.showExternalSource!; + double get spacingOrDefault => spacing ?? fallback.spacing!; double get titleSpacingOrDefault => titleSpacing ?? fallback.titleSpacing!; @@ -56,6 +60,7 @@ class TransactionListTileThemeData { this.padding, this.useCategoryNameForUntitledTransactions, this.useAccountIconForLeading, + this.showExternalSource, this.showCategory, this.spacing, this.titleSpacing, @@ -66,6 +71,7 @@ class TransactionListTileThemeData { padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 4.0), useCategoryNameForUntitledTransactions: true, useAccountIconForLeading: false, + showExternalSource: true, showCategory: false, spacing: 8.0, titleSpacing: 0.0, @@ -79,6 +85,7 @@ class TransactionListTileThemeData { useCategoryNameForUntitledTransactions, useAccountIconForLeading: other?.useAccountIconForLeading ?? useAccountIconForLeading, + showExternalSource: other?.showExternalSource ?? showExternalSource, showCategory: other?.showCategory ?? showCategory, spacing: other?.spacing ?? spacing, titleSpacing: other?.titleSpacing ?? titleSpacing, @@ -88,6 +95,7 @@ class TransactionListTileThemeData { EdgeInsetsGeometry? padding, bool? useCategoryNameForUntitledTransactions, bool? useAccountIconForLeading, + bool? showExternalSource, bool? showCategory, double? spacing, double? titleSpacing, @@ -99,6 +107,7 @@ class TransactionListTileThemeData { this.useCategoryNameForUntitledTransactions, useAccountIconForLeading: useAccountIconForLeading ?? this.useAccountIconForLeading, + showExternalSource: showExternalSource ?? this.showExternalSource, showCategory: showCategory ?? this.showCategory, spacing: spacing ?? this.spacing, titleSpacing: titleSpacing ?? this.titleSpacing, @@ -113,6 +122,7 @@ class TransactionListTileThemeData { useCategoryNameForUntitledTransactions == other.useCategoryNameForUntitledTransactions && useAccountIconForLeading == other.useAccountIconForLeading && + showExternalSource == other.showExternalSource && showCategory == other.showCategory && spacing == other.spacing && titleSpacing == other.titleSpacing; @@ -124,6 +134,7 @@ class TransactionListTileThemeData { padding, useCategoryNameForUntitledTransactions, useAccountIconForLeading, + showExternalSource, showCategory, spacing, titleSpacing, From ca59264a5c47bbaacc690f170e6844cd3b7477e1 Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Sat, 14 Feb 2026 02:25:20 +0800 Subject: [PATCH 08/21] siri rc 1 --- ios/Runner/RecordTransactionIntent.swift | 2 +- ios/Runner/RecordedTransaction.swift | 27 ++++++++----------- lib/data/transaction_programmable_object.dart | 12 +++++---- lib/utils/ios/get_siri_transactions.dart | 4 +-- pubspec.yaml | 2 +- 5 files changed, 21 insertions(+), 26 deletions(-) diff --git a/ios/Runner/RecordTransactionIntent.swift b/ios/Runner/RecordTransactionIntent.swift index 9a8ed598..fa40f093 100644 --- a/ios/Runner/RecordTransactionIntent.swift +++ b/ios/Runner/RecordTransactionIntent.swift @@ -16,7 +16,7 @@ struct RecordTransactionIntent: AppIntent { static var openAppWhenRun = false func perform() async throws -> some IntentResult & ProvidesDialog { - let tx = RecordedTransaction(amount: amount, category: category, account: account) + let tx = RecordedTransaction(type: .expense, amount: amount, fromAccount: account, category: category) try RecordedTransactionService.append(tx) return .result(dialog: "Recorded transaction for \(account): $\(amount) in category \(category).") } diff --git a/ios/Runner/RecordedTransaction.swift b/ios/Runner/RecordedTransaction.swift index d121757b..c8cc4a5b 100644 --- a/ios/Runner/RecordedTransaction.swift +++ b/ios/Runner/RecordedTransaction.swift @@ -1,40 +1,35 @@ import Foundation -enum TransactionType: String, Codable { - case income - case expense -} - struct RecordedTransaction: Codable { let id: UUID + let transactionDate: Date + let type: TransactionType let amount: Double let title: String? let notes: String? let fromAccount: String? let toAccount: String? let category: String? - let transactionDate: Date - let type: TransactionType init( id: UUID = UUID(), - amount: Double, - title: String?, - fromAccount: String?, - toAccount: String?, - category: String?, - notes: String?, transactionDate: Date = Date(), - type: TransactionType = .expense + type: TransactionType = .expense, + amount: Double, + title: String? = nil, + fromAccount: String? = nil, + toAccount: String? = nil, + category: String? = nil, + notes: String? = nil ) { self.id = id + self.transactionDate = transactionDate + self.type = type self.amount = amount self.title = title self.notes = notes self.fromAccount = fromAccount self.toAccount = toAccount self.category = category - self.transactionDate = transactionDate - self.type = type } } diff --git a/lib/data/transaction_programmable_object.dart b/lib/data/transaction_programmable_object.dart index f40c03d2..e5ac355f 100644 --- a/lib/data/transaction_programmable_object.dart +++ b/lib/data/transaction_programmable_object.dart @@ -137,22 +137,24 @@ class TransactionProgrammableObject { static TransactionProgrammableObject? fromSiriJson(Map json) { try { - if (json["account"] case String account) { + if (json["fromAccount"] case String account) { if (Uuid.isValidUUID(fromString: account)) { json["fromAccountUuid"] = account; - } else { - json["fromAccount"] = account; + json["fromAccount"] = null; } } if (json["category"] case String category) { if (Uuid.isValidUUID(fromString: category)) { json["categoryUuid"] = category; - } else { - json["category"] = category; + json["category"] = null; } } + if (json["amount"] case num amount) { + json["amount"] = -(amount.toDouble().abs()); + } + return parse(json.cast()); } catch (e) { return null; diff --git a/lib/utils/ios/get_siri_transactions.dart b/lib/utils/ios/get_siri_transactions.dart index a12a81f6..d1e253b5 100644 --- a/lib/utils/ios/get_siri_transactions.dart +++ b/lib/utils/ios/get_siri_transactions.dart @@ -74,14 +74,12 @@ Future> getSiriTransactions() async { .where((line) => line.trim().isNotEmpty) .toList(); - print(lines); - final List transactions = []; for (final String line in lines) { try { final TransactionProgrammableObject? transaction = - TransactionProgrammableObject.tryParse(jsonDecode(line)); + TransactionProgrammableObject.fromSiriJson(jsonDecode(line)); if (transaction != null) { transactions.add(transaction); } diff --git a/pubspec.yaml b/pubspec.yaml index 9d2a7e4b..04319a52 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: A personal finance managing app publish_to: "none" # Remove this line if you wish to publish to pub.dev -version: "0.19.0+318" +version: "0.19.0+319" environment: sdk: ">=3.10.0 <4.0.0" From a112b718e57be6bad7b815102a6b825c8173bb1d Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Sat, 14 Feb 2026 02:31:39 +0800 Subject: [PATCH 09/21] l10n --- assets/l10n/ar.json | 3 ++- assets/l10n/cs_CZ.json | 3 ++- assets/l10n/de_DE.json | 3 ++- assets/l10n/en.json | 2 +- assets/l10n/es_ES.json | 3 ++- assets/l10n/fa_IR.json | 3 ++- assets/l10n/fr_FR.json | 3 ++- assets/l10n/it_IT.json | 3 ++- assets/l10n/mn_MN.json | 2 +- assets/l10n/ru_RU.json | 3 ++- assets/l10n/tr_TR.json | 3 ++- assets/l10n/uk_UA.json | 3 ++- scripts/translate_missing.dart | 2 +- 13 files changed, 23 insertions(+), 13 deletions(-) diff --git a/assets/l10n/ar.json b/assets/l10n/ar.json index 2688bcbf..3ff13967 100644 --- a/assets/l10n/ar.json +++ b/assets/l10n/ar.json @@ -383,8 +383,9 @@ "preferences.transactions.listTile.leading.account": "الحساب", "preferences.transactions.listTile.leading.category": "الفئة", "preferences.transactions.listTile.preview": "معاينة", - "preferences.transactions.listTile.showCategoryInList": "عرض الفئة بعد الحساب", "preferences.transactions.listTile.relaxedDensity": "تخطيط أقل كثافة", + "preferences.transactions.listTile.showCategoryInList": "عرض الفئة بعد الحساب", + "preferences.transactions.listTile.showExternalSource": "عرض المصادر الخارجية (مثل Eny)", "preferences.transactions.pending": "المعاملات المعلقة", "preferences.transactions.pending.homeTimeframe": "عرضها على الصفحة الرئيسية", "preferences.transactions.pending.notify": "إعلام", diff --git a/assets/l10n/cs_CZ.json b/assets/l10n/cs_CZ.json index 1430be8a..f6d1d81c 100644 --- a/assets/l10n/cs_CZ.json +++ b/assets/l10n/cs_CZ.json @@ -383,8 +383,9 @@ "preferences.transactions.listTile.leading.account": "Účet", "preferences.transactions.listTile.leading.category": "Kategorie", "preferences.transactions.listTile.preview": "Náhled", - "preferences.transactions.listTile.showCategoryInList": "Zobrazit kategorii vedle účtu", "preferences.transactions.listTile.relaxedDensity": "Volnější rozložení seznamu", + "preferences.transactions.listTile.showCategoryInList": "Zobrazit kategorii vedle účtu", + "preferences.transactions.listTile.showExternalSource": "Zobrazit externí zdroje (např. Eny)", "preferences.transactions.pending": "Čekající transakce", "preferences.transactions.pending.homeTimeframe": "Zobrazit na domovské obrazovce", "preferences.transactions.pending.notify": "Upozornit", diff --git a/assets/l10n/de_DE.json b/assets/l10n/de_DE.json index e46443f1..cb434d9c 100644 --- a/assets/l10n/de_DE.json +++ b/assets/l10n/de_DE.json @@ -383,8 +383,9 @@ "preferences.transactions.listTile.leading.account": "Konto", "preferences.transactions.listTile.leading.category": "Kategorie", "preferences.transactions.listTile.preview": "Vorschau", - "preferences.transactions.listTile.showCategoryInList": "Kategorie nach dem Konto anzeigen", "preferences.transactions.listTile.relaxedDensity": "Weniger dichtes Layout", + "preferences.transactions.listTile.showCategoryInList": "Kategorie nach dem Konto anzeigen", + "preferences.transactions.listTile.showExternalSource": "Externe Quellen anzeigen (z. B. Eny)", "preferences.transactions.pending": "Ausstehende Buchungen", "preferences.transactions.pending.homeTimeframe": "Auf der Startseite anzeigen", "preferences.transactions.pending.notify": "Benachrichtigen", diff --git a/assets/l10n/en.json b/assets/l10n/en.json index 396281dd..e2d751a6 100644 --- a/assets/l10n/en.json +++ b/assets/l10n/en.json @@ -383,9 +383,9 @@ "preferences.transactions.listTile.leading.account": "Account", "preferences.transactions.listTile.leading.category": "Category", "preferences.transactions.listTile.preview": "Preview", + "preferences.transactions.listTile.relaxedDensity": "Less dense layout", "preferences.transactions.listTile.showCategoryInList": "Show category after the account", "preferences.transactions.listTile.showExternalSource": "Show external sources (e.g., Eny)", - "preferences.transactions.listTile.relaxedDensity": "Less dense layout", "preferences.transactions.pending": "Pending transactions", "preferences.transactions.pending.homeTimeframe": "Show on home", "preferences.transactions.pending.notify": "Notify", diff --git a/assets/l10n/es_ES.json b/assets/l10n/es_ES.json index 430eedd3..f5a4a40c 100644 --- a/assets/l10n/es_ES.json +++ b/assets/l10n/es_ES.json @@ -383,8 +383,9 @@ "preferences.transactions.listTile.leading.account": "Cuenta", "preferences.transactions.listTile.leading.category": "Categoría", "preferences.transactions.listTile.preview": "Vista previa", - "preferences.transactions.listTile.showCategoryInList": "Mostrar categoría después de la cuenta", "preferences.transactions.listTile.relaxedDensity": "Diseño menos denso", + "preferences.transactions.listTile.showCategoryInList": "Mostrar categoría después de la cuenta", + "preferences.transactions.listTile.showExternalSource": "Mostrar fuentes externas (p. ej., Eny)", "preferences.transactions.pending": "Transacciones pendientes", "preferences.transactions.pending.homeTimeframe": "Mostrar en inicio", "preferences.transactions.pending.notify": "Notificar", diff --git a/assets/l10n/fa_IR.json b/assets/l10n/fa_IR.json index 6f9fead0..e344672a 100644 --- a/assets/l10n/fa_IR.json +++ b/assets/l10n/fa_IR.json @@ -383,8 +383,9 @@ "preferences.transactions.listTile.leading.account": "حساب", "preferences.transactions.listTile.leading.category": "دسته‌بندی", "preferences.transactions.listTile.preview": "پیش‌نمایش", - "preferences.transactions.listTile.showCategoryInList": "نمایش دسته‌بندی بعد از حساب", "preferences.transactions.listTile.relaxedDensity": "چیدمان خلوت‌تر", + "preferences.transactions.listTile.showCategoryInList": "نمایش دسته‌بندی بعد از حساب", + "preferences.transactions.listTile.showExternalSource": "نمایش منابع خارجی (مثلاً Eny)", "preferences.transactions.pending": "تراکنش‌های در انتظار", "preferences.transactions.pending.homeTimeframe": "نمایش در صفحه خانه", "preferences.transactions.pending.notify": "اعلان", diff --git a/assets/l10n/fr_FR.json b/assets/l10n/fr_FR.json index e483627e..ccec0113 100644 --- a/assets/l10n/fr_FR.json +++ b/assets/l10n/fr_FR.json @@ -383,8 +383,9 @@ "preferences.transactions.listTile.leading.account": "Compte", "preferences.transactions.listTile.leading.category": "Catégorie", "preferences.transactions.listTile.preview": "Aperçu", - "preferences.transactions.listTile.showCategoryInList": "Afficher la catégorie après le compte", "preferences.transactions.listTile.relaxedDensity": "Affichage moins dense", + "preferences.transactions.listTile.showCategoryInList": "Afficher la catégorie après le compte", + "preferences.transactions.listTile.showExternalSource": "Afficher les sources externes (p. ex. : Eny)", "preferences.transactions.pending": "Transactions en attente", "preferences.transactions.pending.homeTimeframe": "Afficher sur l'accueil", "preferences.transactions.pending.notify": "Notifier", diff --git a/assets/l10n/it_IT.json b/assets/l10n/it_IT.json index c73abda7..4d9b3bf5 100644 --- a/assets/l10n/it_IT.json +++ b/assets/l10n/it_IT.json @@ -383,8 +383,9 @@ "preferences.transactions.listTile.leading.account": "Conto", "preferences.transactions.listTile.leading.category": "Categoria", "preferences.transactions.listTile.preview": "Anteprima", - "preferences.transactions.listTile.showCategoryInList": "Mostra categoria dopo il conto", "preferences.transactions.listTile.relaxedDensity": "Layout meno denso", + "preferences.transactions.listTile.showCategoryInList": "Mostra categoria dopo il conto", + "preferences.transactions.listTile.showExternalSource": "Mostra fonti esterne (ad es. Eny)", "preferences.transactions.pending": "Transazioni in sospeso", "preferences.transactions.pending.homeTimeframe": "Mostra in Home", "preferences.transactions.pending.notify": "Notifica", diff --git a/assets/l10n/mn_MN.json b/assets/l10n/mn_MN.json index 32718b1a..76496e51 100644 --- a/assets/l10n/mn_MN.json +++ b/assets/l10n/mn_MN.json @@ -383,9 +383,9 @@ "preferences.transactions.listTile.leading.account": "Данс", "preferences.transactions.listTile.leading.category": "Ангилал", "preferences.transactions.listTile.preview": "Урьдчилан харах", + "preferences.transactions.listTile.relaxedDensity": "Илүү сийрэг байршил", "preferences.transactions.listTile.showCategoryInList": "Дансны ард ангилал харуулах", "preferences.transactions.listTile.showExternalSource": "Гадны эх сурвалжийг харуулах", - "preferences.transactions.listTile.relaxedDensity": "Илүү сийрэг байршил", "preferences.transactions.pending": "Хүлээгдэж буй гүйлгээнүүд", "preferences.transactions.pending.homeTimeframe": "Нүүр хуудсанд харуулах", "preferences.transactions.pending.notify": "Мэдэгдэл илгээх", diff --git a/assets/l10n/ru_RU.json b/assets/l10n/ru_RU.json index 66fe76bd..37b2b6fa 100644 --- a/assets/l10n/ru_RU.json +++ b/assets/l10n/ru_RU.json @@ -383,8 +383,9 @@ "preferences.transactions.listTile.leading.account": "Счет", "preferences.transactions.listTile.leading.category": "Категория", "preferences.transactions.listTile.preview": "Предпросмотр", - "preferences.transactions.listTile.showCategoryInList": "Показывать категорию после счета", "preferences.transactions.listTile.relaxedDensity": "Менее плотная компоновка", + "preferences.transactions.listTile.showCategoryInList": "Показывать категорию после счета", + "preferences.transactions.listTile.showExternalSource": "Показывать внешние источники (например, Eny)", "preferences.transactions.pending": "Ожидающие транзакции", "preferences.transactions.pending.homeTimeframe": "Показывать на главном экране", "preferences.transactions.pending.notify": "Уведомлять", diff --git a/assets/l10n/tr_TR.json b/assets/l10n/tr_TR.json index d6c639d3..ebac69c7 100644 --- a/assets/l10n/tr_TR.json +++ b/assets/l10n/tr_TR.json @@ -383,8 +383,9 @@ "preferences.transactions.listTile.leading.account": "Hesap", "preferences.transactions.listTile.leading.category": "Kategori", "preferences.transactions.listTile.preview": "Önizleme", - "preferences.transactions.listTile.showCategoryInList": "Hesaptan sonra kategoriyi göster", "preferences.transactions.listTile.relaxedDensity": "Daha seyrek yerleşim", + "preferences.transactions.listTile.showCategoryInList": "Hesaptan sonra kategoriyi göster", + "preferences.transactions.listTile.showExternalSource": "Harici kaynakları göster (örn. Eny)", "preferences.transactions.pending": "Bekleyen işlemler", "preferences.transactions.pending.homeTimeframe": "Ana sayfada göster", "preferences.transactions.pending.notify": "Bildirim", diff --git a/assets/l10n/uk_UA.json b/assets/l10n/uk_UA.json index f3f28b3b..bd5cdef9 100644 --- a/assets/l10n/uk_UA.json +++ b/assets/l10n/uk_UA.json @@ -383,8 +383,9 @@ "preferences.transactions.listTile.leading.account": "Рахунок", "preferences.transactions.listTile.leading.category": "Категорія", "preferences.transactions.listTile.preview": "Попередній перегляд", - "preferences.transactions.listTile.showCategoryInList": "Показувати категорію після рахунку", "preferences.transactions.listTile.relaxedDensity": "Менш щільне компонування", + "preferences.transactions.listTile.showCategoryInList": "Показувати категорію після рахунку", + "preferences.transactions.listTile.showExternalSource": "Показувати зовнішні джерела (наприклад, Eny)", "preferences.transactions.pending": "Очікувані транзакції", "preferences.transactions.pending.homeTimeframe": "Показувати на головному екрані", "preferences.transactions.pending.notify": "Сповіщати", diff --git a/scripts/translate_missing.dart b/scripts/translate_missing.dart index fc1c9160..9a434012 100644 --- a/scripts/translate_missing.dart +++ b/scripts/translate_missing.dart @@ -25,7 +25,7 @@ Future?> translate( messages: [ ChatCompletionMessage.developer( content: ChatCompletionDeveloperMessageContent.text( - "You are a professional translator with expertise in user interface design. You will be provided a JSON localization file in english, and you should translate the file into a localization json in $targetLanguage language.", + "You are a professional translator with expertise in user interface design. You will be provided a JSON localization file in english, and you should translate the file into a localization json in $targetLanguage language. If there's no input, just output nothing. The output should be a valid JSON object with the same keys as the input, but with the values translated to $targetLanguage. Do not include any explanations or additional text, just the JSON object.", ), ), ChatCompletionMessage.user( From 58744c7f34c93d6d1fe8961998ec01f352a509e9 Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Sat, 14 Feb 2026 22:04:14 +0800 Subject: [PATCH 10/21] fix #648 --- assets/l10n/ar.json | 2 - assets/l10n/cs_CZ.json | 2 - assets/l10n/de_DE.json | 2 - assets/l10n/en.json | 14 +-- assets/l10n/es_ES.json | 2 - assets/l10n/fa_IR.json | 2 - assets/l10n/fr_FR.json | 2 - assets/l10n/it_IT.json | 2 - assets/l10n/mn_MN.json | 14 +-- assets/l10n/ru_RU.json | 2 - assets/l10n/tr_TR.json | 2 - assets/l10n/uk_UA.json | 2 - ios/Runner/Info.plist | 2 + .../transaction/extensions/default/geo.dart | 4 + lib/providers/transaction_tags_provider.dart | 43 +++++++ lib/routes/home/accounts_tab.dart | 2 + .../button_order_preferences_page.dart | 59 ++++----- lib/routes/transaction_page.dart | 8 ++ .../sections/tags_section.dart | 112 ++++++++++++------ lib/widgets/home/greetings_bar.dart | 2 +- lib/widgets/transaction_tag_add_chip.dart | 17 ++- lib/widgets/transaction_tag_chip.dart | 60 +++++++++- pubspec.lock | 16 +-- pubspec.yaml | 4 +- 24 files changed, 255 insertions(+), 122 deletions(-) diff --git a/assets/l10n/ar.json b/assets/l10n/ar.json index 3ff13967..06874543 100644 --- a/assets/l10n/ar.json +++ b/assets/l10n/ar.json @@ -668,7 +668,6 @@ "transaction.edit.selectAccount.noPossibleChoice": "لا يوجد حساب للاختيار", "transaction.edit.selectCategory": "اختر فئة", "transaction.edit.selectCategory.multiple": "اختر الفئات", - "transaction.edit.selectTags": "اختر الوسوم", "transaction.external.added": "تمت إضافة معاملة جديدة", "transaction.external.added.from": "تمت إضافة معاملة جديدة بواسطة {name}", "transaction.external.from": "مضافة من {name}", @@ -693,7 +692,6 @@ "transaction.tags.contact.select": "اختر جهة اتصال من الهاتف", "transaction.tags.delete": "حذف الوسم", "transaction.tags.delete.description": "سيؤدي حذف هذا الوسم إلى فك ارتباطه عن {transactionCount} معاملة. لا يمكن التراجع عن هذا الإجراء!", - "transaction.tags.editGuide": "اضغط لتعديل الوسوم", "transaction.tags.location.name": "اسم الموقع", "transaction.tags.location.useCurrent": "استخدام الموقع الحالي", "transaction.tags.name": "اسم الوسم", diff --git a/assets/l10n/cs_CZ.json b/assets/l10n/cs_CZ.json index f6d1d81c..22948960 100644 --- a/assets/l10n/cs_CZ.json +++ b/assets/l10n/cs_CZ.json @@ -668,7 +668,6 @@ "transaction.edit.selectAccount.noPossibleChoice": "Žádné účty k výběru.", "transaction.edit.selectCategory": "Vyberte kategorii", "transaction.edit.selectCategory.multiple": "Vyberte kategorie", - "transaction.edit.selectTags": "Vybrat štítky", "transaction.external.added": "Byla přidána nová transakce", "transaction.external.added.from": "Nová transakce byla přidána uživatelem {name}.", "transaction.external.from": "Přidáno z {name}", @@ -693,7 +692,6 @@ "transaction.tags.contact.select": "Vybrat kontakt z telefonu", "transaction.tags.delete": "Smazat štítek", "transaction.tags.delete.description": "Smazáním tohoto štítku se odstraní ze všech ({transactionCount}) transakcí. Tato akce je nevratná!", - "transaction.tags.editGuide": "Klepněte pro úpravu štítků", "transaction.tags.location.name": "Název místa", "transaction.tags.location.useCurrent": "Použít aktuální polohu", "transaction.tags.name": "Název štítku", diff --git a/assets/l10n/de_DE.json b/assets/l10n/de_DE.json index cb434d9c..cef5df93 100644 --- a/assets/l10n/de_DE.json +++ b/assets/l10n/de_DE.json @@ -668,7 +668,6 @@ "transaction.edit.selectAccount.noPossibleChoice": "Keine Konten zur Auswahl.", "transaction.edit.selectCategory": "Kategorie auswählen", "transaction.edit.selectCategory.multiple": "Kategorien auswählen", - "transaction.edit.selectTags": "Tags auswählen", "transaction.external.added": "Eine neue Transaktion wurde hinzugefügt", "transaction.external.added.from": "Eine neue Transaktion wurde von {name} hinzugefügt", "transaction.external.from": "Hinzugefügt von {name}", @@ -693,7 +692,6 @@ "transaction.tags.contact.select": "Kontakt vom Telefon auswählen", "transaction.tags.delete": "Schlagwort löschen", "transaction.tags.delete.description": "Wenn Sie dieses Schlagwort löschen, wird seine Verknüpfung mit {transactionCount} Transaktionen entfernt. Diese Aktion kann nicht rückgängig gemacht werden!", - "transaction.tags.editGuide": "Zum Bearbeiten der Tags tippen", "transaction.tags.location.name": "Standortname", "transaction.tags.location.useCurrent": "Aktuellen Standort verwenden", "transaction.tags.name": "Tag-Name", diff --git a/assets/l10n/en.json b/assets/l10n/en.json index e2d751a6..37e6c217 100644 --- a/assets/l10n/en.json +++ b/assets/l10n/en.json @@ -116,8 +116,8 @@ "enum.ImportV2Progress@writingFileAttachments": "Writing file attachments", "enum.ImportV2Progress@writingProfile": "Writing profile data", "enum.ImportV2Progress@writingRecurringTransactions": "Writing recurring transactions", - "enum.ImportV2Progress@writingTransactionTags": "Writing transaction tags", "enum.ImportV2Progress@writingTransactions": "Writing transactions", + "enum.ImportV2Progress@writingTransactionTags": "Writing transaction tags", "enum.ImportV2Progress@writingTranscationFilterPresets": "Writing transaction filter presets", "enum.ImportV2Progress@writingUserPreferences": "Writing user preferences", "enum.PDFHeader@account": "Account", @@ -164,11 +164,11 @@ "enum.TransactionSearchMode@smart": "Smart", "enum.TransactionSearchMode@substring": "Partial match", "enum.TransactionSubtype": "Type", - "enum.TransactionSubtype#null": "Default", "enum.TransactionSubtype@givenLoan": "Loan (given)", "enum.TransactionSubtype@receivedLoan": "Loan (taken)", "enum.TransactionSubtype@transactionFee": "Transaction fee", "enum.TransactionSubtype@updateBalance": "Update balance", + "enum.TransactionSubtype#null": "Default", "enum.TransactionTagType": "Tag type", "enum.TransactionTagType@contact": "Person", "enum.TransactionTagType@generic": "Generic", @@ -344,8 +344,8 @@ "preferences.sync.iCloud.connectionFailed.tips#1": "Please check your internet connection", "preferences.sync.iCloud.connectionFailed.tips#2": "Make sure you've logged in with your Apple Account on your device", "preferences.sync.iCloud.connectionFailed.tips#3": "Make sure to enable iCloud in System Settings > Apple Account > iCloud > Drive", - "preferences.sync.iCloud.lastSyncFailed": "Last attempt to backup to iCloud failed. Click here to see how to fix.", "preferences.sync.iCloud.lastSyncedAt": "Last synced at {date}", + "preferences.sync.iCloud.lastSyncFailed": "Last attempt to backup to iCloud failed. Click here to see how to fix.", "preferences.sync.iCloud.noOfBackupsToKeep": "Number of backups to keep", "preferences.sync.iCloud.noOfBackupsToKeep.description": "The maximum number of backup files to keep in iCloud. Because this will take up space in your iCloud, you may want to keep this number low. Depending on this setting, the older backups are deleted at each startup.", "preferences.sync.iCloud.noOfBackupsToKeep.infiniteBackups": "Infinite backups", @@ -668,7 +668,6 @@ "transaction.edit.selectAccount.noPossibleChoice": "No accounts to select", "transaction.edit.selectCategory": "Select a category", "transaction.edit.selectCategory.multiple": "Select categories", - "transaction.edit.selectTags": "Select tags", "transaction.external.added": "A new transaction was added", "transaction.external.added.from": "A new transaction was added by {name}", "transaction.external.from": "Added from {name}", @@ -689,15 +688,16 @@ "transaction.recurring.edit": "Edit recurring transaction", "transaction.recurring.setup": "Setup recurring transaction", "transaction.tags": "Tags", + "transaction.tags.add": "Add tags", "transaction.tags.contact.name": "Contact name", "transaction.tags.contact.select": "Select contact from phone", "transaction.tags.delete": "Delete tag", "transaction.tags.delete.description": "Deleting this tag will detach {transactionCount} transactions' tag. This action is irreversible!", - "transaction.tags.editGuide": "Tap to edit the tags", "transaction.tags.location.name": "Location name", "transaction.tags.location.useCurrent": "Use current location", "transaction.tags.name": "Tag name", "transaction.tags.new": "New tag", + "transaction.tags.suggestionGuide": "Tap on the suggested tag to add", "transaction.transfer.conversionRate": "Conversion rate", "transaction.transfer.from": "Sending account", "transaction.transfer.from.select": "Transfer from", @@ -735,13 +735,13 @@ "transactions.query.filter.currency": "Currency", "transactions.query.filter.groupBy": "Group by", "transactions.query.filter.hasAttachments": "Attachments", + "transactions.query.filter.hasAttachments.all": "Attachments", "transactions.query.filter.hasAttachments#false": "Has No Attachments", "transactions.query.filter.hasAttachments#true": "Has Attachments", - "transactions.query.filter.hasAttachments.all": "Attachments", "transactions.query.filter.isPending": "Pending status", + "transactions.query.filter.isPending.all": "All", "transactions.query.filter.isPending#false": "Not Pending", "transactions.query.filter.isPending#true": "Pending", - "transactions.query.filter.isPending.all": "All", "transactions.query.filter.keyword": "Search", "transactions.query.filter.keyword.all": "Search", "transactions.query.filter.keyword.clear": "Clear", diff --git a/assets/l10n/es_ES.json b/assets/l10n/es_ES.json index f5a4a40c..7d66e2dc 100644 --- a/assets/l10n/es_ES.json +++ b/assets/l10n/es_ES.json @@ -668,7 +668,6 @@ "transaction.edit.selectAccount.noPossibleChoice": "No hay cuentas para seleccionar", "transaction.edit.selectCategory": "Seleccionar una categoría", "transaction.edit.selectCategory.multiple": "Seleccionar categorías", - "transaction.edit.selectTags": "Seleccionar etiquetas", "transaction.external.added": "Se ha añadido una nueva transacción", "transaction.external.added.from": "Una nueva transacción ha sido añadida por {name}", "transaction.external.from": "Añadido desde {name}", @@ -693,7 +692,6 @@ "transaction.tags.contact.select": "Seleccionar contacto del teléfono", "transaction.tags.delete": "Eliminar etiqueta", "transaction.tags.delete.description": "Al eliminar esta etiqueta, se quitará la etiqueta de {transactionCount} transacciones. ¡Esta acción es irreversible!", - "transaction.tags.editGuide": "Toca para editar las etiquetas", "transaction.tags.location.name": "Nombre de la ubicación", "transaction.tags.location.useCurrent": "Usar ubicación actual", "transaction.tags.name": "Nombre de la etiqueta", diff --git a/assets/l10n/fa_IR.json b/assets/l10n/fa_IR.json index e344672a..7bfa5568 100644 --- a/assets/l10n/fa_IR.json +++ b/assets/l10n/fa_IR.json @@ -668,7 +668,6 @@ "transaction.edit.selectAccount.noPossibleChoice": "هیچ حسابی برای انتخاب وجود ندارد", "transaction.edit.selectCategory": "یک دسته‌بندی انتخاب کنید", "transaction.edit.selectCategory.multiple": "انتخاب دسته‌بندی‌ها", - "transaction.edit.selectTags": "انتخاب برچسب‌ها", "transaction.external.added": "یک تراکنش جدید اضافه شد", "transaction.external.added.from": "تراکنش جدیدی توسط {name} اضافه شد.", "transaction.external.from": "اضافه شده از {name}", @@ -693,7 +692,6 @@ "transaction.tags.contact.select": "انتخاب مخاطب از گوشی", "transaction.tags.delete": "حذف برچسب", "transaction.tags.delete.description": "با حذف این برچسب، برچسبِ {transactionCount} تراکنش جدا می‌شود. این کار غیرقابل بازگشت است!", - "transaction.tags.editGuide": "برای ویرایش برچسب‌ها ضربه بزنید", "transaction.tags.location.name": "نام موقعیت", "transaction.tags.location.useCurrent": "استفاده از موقعیت فعلی", "transaction.tags.name": "نام برچسب", diff --git a/assets/l10n/fr_FR.json b/assets/l10n/fr_FR.json index ccec0113..db0b9d52 100644 --- a/assets/l10n/fr_FR.json +++ b/assets/l10n/fr_FR.json @@ -668,7 +668,6 @@ "transaction.edit.selectAccount.noPossibleChoice": "Aucun compte à sélectionner", "transaction.edit.selectCategory": "Sélectionner une catégorie", "transaction.edit.selectCategory.multiple": "Sélectionner des catégories", - "transaction.edit.selectTags": "Sélectionner des étiquettes", "transaction.external.added": "Une nouvelle transaction a été ajoutée", "transaction.external.added.from": "Une nouvelle transaction a été ajoutée par {name}", "transaction.external.from": "Ajouté depuis {name}", @@ -693,7 +692,6 @@ "transaction.tags.contact.select": "Sélectionner un contact du téléphone", "transaction.tags.delete": "Supprimer l’étiquette", "transaction.tags.delete.description": "La suppression de cette étiquette la dissociera de {transactionCount} transactions. Cette action est irréversible !", - "transaction.tags.editGuide": "Appuyez pour modifier les étiquettes", "transaction.tags.location.name": "Nom du lieu", "transaction.tags.location.useCurrent": "Utiliser la position actuelle", "transaction.tags.name": "Nom de l’étiquette", diff --git a/assets/l10n/it_IT.json b/assets/l10n/it_IT.json index 4d9b3bf5..f2e7c798 100644 --- a/assets/l10n/it_IT.json +++ b/assets/l10n/it_IT.json @@ -668,7 +668,6 @@ "transaction.edit.selectAccount.noPossibleChoice": "Nessun conto da selezionare", "transaction.edit.selectCategory": "Seleziona una categoria", "transaction.edit.selectCategory.multiple": "Seleziona categorie", - "transaction.edit.selectTags": "Seleziona tag", "transaction.external.added": "È stata aggiunta una nuova transazione", "transaction.external.added.from": "Una nuova transazione è stata aggiunta da {name}", "transaction.external.from": "Aggiunta da {name}", @@ -693,7 +692,6 @@ "transaction.tags.contact.select": "Seleziona contatto dalla rubrica", "transaction.tags.delete": "Elimina tag", "transaction.tags.delete.description": "L'eliminazione di questo tag lo rimuoverà da {transactionCount} transazioni. Questa azione è irreversibile!", - "transaction.tags.editGuide": "Tocca per modificare i tag", "transaction.tags.location.name": "Nome posizione", "transaction.tags.location.useCurrent": "Usa posizione attuale", "transaction.tags.name": "Nome tag", diff --git a/assets/l10n/mn_MN.json b/assets/l10n/mn_MN.json index 76496e51..87e2b2e2 100644 --- a/assets/l10n/mn_MN.json +++ b/assets/l10n/mn_MN.json @@ -116,8 +116,8 @@ "enum.ImportV2Progress@writingFileAttachments": "Файлын хавсралтуудыг бичиж байна", "enum.ImportV2Progress@writingProfile": "Бүртгэлийг бичиж байна", "enum.ImportV2Progress@writingRecurringTransactions": "Давтамжит гүйлгээнүүдийг бичиж байна", - "enum.ImportV2Progress@writingTransactionTags": "Гүйлгээний шошгуудыг бичиж байна", "enum.ImportV2Progress@writingTransactions": "Гүйлгээнүүдийг бичиж байна", + "enum.ImportV2Progress@writingTransactionTags": "Гүйлгээний шошгуудыг бичиж байна", "enum.ImportV2Progress@writingTranscationFilterPresets": "Гүйлгээ шүүх загваруудыг бичиж байна", "enum.ImportV2Progress@writingUserPreferences": "Хэрэглэгчийн тохиргоог бичиж байна", "enum.PDFHeader@account": "Данс", @@ -164,11 +164,11 @@ "enum.TransactionSearchMode@smart": "Ухаалаг", "enum.TransactionSearchMode@substring": "Хэсэгчлэн таарах", "enum.TransactionSubtype": "Төрөл", - "enum.TransactionSubtype#null": "Хэвийн", "enum.TransactionSubtype@givenLoan": "Өгсөн зээл", "enum.TransactionSubtype@receivedLoan": "Авсан зээл", "enum.TransactionSubtype@transactionFee": "Гүйлгээний шимтгэл", "enum.TransactionSubtype@updateBalance": "Үлдэгдэл өөрчлөх", + "enum.TransactionSubtype#null": "Хэвийн", "enum.TransactionTagType": "Шошгоны төрөл", "enum.TransactionTagType@contact": "Хүн", "enum.TransactionTagType@generic": "Ерөнхий", @@ -344,8 +344,8 @@ "preferences.sync.iCloud.connectionFailed.tips#1": "Интернэт холболтоо шалгана уу", "preferences.sync.iCloud.connectionFailed.tips#2": "Төхөөрөмж дээрээ Apple бүртгэлээрээ нэвтэрсэн эсэхийг шалгана уу", "preferences.sync.iCloud.connectionFailed.tips#3": "iCloud-г идэвхжүүлсэн эсэхийг шалгана уу. System Settings > Apple Account > iCloud > Drive", - "preferences.sync.iCloud.lastSyncFailed": "iCloud руу нөөцлөх сүүлийн оролдлого амжилтгүй боллоо. Хэрхэн засахыг харахын тулд энд дарна уу.", "preferences.sync.iCloud.lastSyncedAt": "Сүүлд {date}-д нөөцлөв", + "preferences.sync.iCloud.lastSyncFailed": "iCloud руу нөөцлөх сүүлийн оролдлого амжилтгүй боллоо. Хэрхэн засахыг харахын тулд энд дарна уу.", "preferences.sync.iCloud.noOfBackupsToKeep": "Хадгалах нөөцийн тоо", "preferences.sync.iCloud.noOfBackupsToKeep.description": "iCloud-д хадгалах хамгийн их нөөцийн тоо. Энэ нь таны iCloud-ын зайг эзлэх тул бага тоо сонгох нь зүйтэй. Энэ тохиргооноос хамаарч хуучин нөөцүүд аппыг нээх бүрт устгагдана.", "preferences.sync.iCloud.noOfBackupsToKeep.infiniteBackups": "Хязгааргүй нөөц", @@ -668,7 +668,6 @@ "transaction.edit.selectAccount.noPossibleChoice": "Сонгох боломжтой данс алга байна", "transaction.edit.selectCategory": "Ангилал сонгох", "transaction.edit.selectCategory.multiple": "Ангилаллууд сонгох", - "transaction.edit.selectTags": "Шошгууд сонгох", "transaction.external.added": "Шинэ гүйлгээ нэмэгдлээ", "transaction.external.added.from": "{name}-с шинэ гүйлгээ нэмэгдлээ", "transaction.external.from": "{name}-с нэмэгдсэн гүйлгээ", @@ -689,15 +688,16 @@ "transaction.recurring.edit": "Давтамжит гүйлгээг засварлах", "transaction.recurring.setup": "Давтамжит гүйлгээ тохируулах", "transaction.tags": "Шошго", + "transaction.tags.add": "Шошго нэмэх", "transaction.tags.contact.name": "Хүний нэр", "transaction.tags.contact.select": "Утасны дэвтрээс сонгох", "transaction.tags.delete": "Шошго устгах", "transaction.tags.delete.description": "Энэ шошгыг устгавал холбоотой {transactionCount} гүйлгээний шошго цуг арилахыг анхаарна уу. Энэ үйлдлийг буцаах боломжгүй юм!", - "transaction.tags.editGuide": "Товшиж шошгуудыг өөрчлөх боломжтой", "transaction.tags.location.name": "Байршлын нэр", "transaction.tags.location.useCurrent": "Одоогийн байршлыг ашиглах", "transaction.tags.name": "Шошгоны нэр", "transaction.tags.new": "Шинэ шошго", + "transaction.tags.suggestionGuide": "Санал болгож буй шошгоны дээр товшиж нэмэх боломжтой", "transaction.transfer.conversionRate": "Хөрвүүлэх ханш", "transaction.transfer.from": "Илгээх данс", "transaction.transfer.from.select": "Илгээх данс", @@ -735,13 +735,13 @@ "transactions.query.filter.currency": "Валют", "transactions.query.filter.groupBy": "Бүлэглэх нэгж", "transactions.query.filter.hasAttachments": "Файл хавсралт", + "transactions.query.filter.hasAttachments.all": "Бүгд", "transactions.query.filter.hasAttachments#false": "Файл хавсралтгүй", "transactions.query.filter.hasAttachments#true": "Файл хавсралттай", - "transactions.query.filter.hasAttachments.all": "Бүгд", "transactions.query.filter.isPending": "Төлөв", + "transactions.query.filter.isPending.all": "Бүгд", "transactions.query.filter.isPending#false": "Аль хэдийн биелсэн", "transactions.query.filter.isPending#true": "Хүлээгдэж буй", - "transactions.query.filter.isPending.all": "Бүгд", "transactions.query.filter.keyword": "Хайх", "transactions.query.filter.keyword.all": "Хайх", "transactions.query.filter.keyword.clear": "Цэвэрлэх", diff --git a/assets/l10n/ru_RU.json b/assets/l10n/ru_RU.json index 37b2b6fa..5e2813c1 100644 --- a/assets/l10n/ru_RU.json +++ b/assets/l10n/ru_RU.json @@ -668,7 +668,6 @@ "transaction.edit.selectAccount.noPossibleChoice": "Нет счетов для выбора", "transaction.edit.selectCategory": "Выберите категорию", "transaction.edit.selectCategory.multiple": "Выберите категории", - "transaction.edit.selectTags": "Выберите теги", "transaction.external.added": "Добавлена новая транзакция", "transaction.external.added.from": "Новая транзакция была добавлена пользователем {name}", "transaction.external.from": "Добавлено от {name}", @@ -693,7 +692,6 @@ "transaction.tags.contact.select": "Выбрать контакт из телефона", "transaction.tags.delete": "Удалить тег", "transaction.tags.delete.description": "Удаление этого тега снимет его с {transactionCount} транзакций. Это действие необратимо!", - "transaction.tags.editGuide": "Нажмите, чтобы редактировать теги", "transaction.tags.location.name": "Название места", "transaction.tags.location.useCurrent": "Использовать текущее местоположение", "transaction.tags.name": "Название тега", diff --git a/assets/l10n/tr_TR.json b/assets/l10n/tr_TR.json index ebac69c7..babc86f0 100644 --- a/assets/l10n/tr_TR.json +++ b/assets/l10n/tr_TR.json @@ -668,7 +668,6 @@ "transaction.edit.selectAccount.noPossibleChoice": "Seçilecek hesap yok", "transaction.edit.selectCategory": "Bir kategori seçin", "transaction.edit.selectCategory.multiple": "Kategorileri seçin", - "transaction.edit.selectTags": "Etiketleri seç", "transaction.external.added": "Yeni bir işlem eklendi", "transaction.external.added.from": "{name} tarafından eklendi", "transaction.external.from": "{name} tarafından eklendi", @@ -693,7 +692,6 @@ "transaction.tags.contact.select": "Telefondan kişi seç", "transaction.tags.delete": "Etiketi sil", "transaction.tags.delete.description": "Bu etiketi silmek, {transactionCount} işlemden etiketi kaldırır. Bu işlem geri alınamaz!", - "transaction.tags.editGuide": "Etiketleri düzenlemek için dokunun", "transaction.tags.location.name": "Konum adı", "transaction.tags.location.useCurrent": "Mevcut konumu kullan", "transaction.tags.name": "Etiket adı", diff --git a/assets/l10n/uk_UA.json b/assets/l10n/uk_UA.json index bd5cdef9..7e66845e 100644 --- a/assets/l10n/uk_UA.json +++ b/assets/l10n/uk_UA.json @@ -668,7 +668,6 @@ "transaction.edit.selectAccount.noPossibleChoice": "Немає рахунків для вибору", "transaction.edit.selectCategory": "Виберіть категорію", "transaction.edit.selectCategory.multiple": "Виберіть категорії", - "transaction.edit.selectTags": "Виберіть теги", "transaction.external.added": "Додано нову транзакцію", "transaction.external.added.from": "Додано з {name}", "transaction.external.from": "Додано з {name}", @@ -693,7 +692,6 @@ "transaction.tags.contact.select": "Вибрати контакт із телефону", "transaction.tags.delete": "Видалити мітку", "transaction.tags.delete.description": "Видалення цієї мітки від’єднає її від {transactionCount} транзакцій. Цю дію неможливо скасувати!", - "transaction.tags.editGuide": "Торкніться, щоб редагувати теги", "transaction.tags.location.name": "Назва локації", "transaction.tags.location.useCurrent": "Використати поточну локацію", "transaction.tags.name": "Назва тега", diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 88bb319c..32742108 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -409,6 +409,8 @@ NSPhotoLibraryUsageDescription Flow uses the photo library when user updates their picture, or chooses to use image as category/account icon + NSSiriUsageDescription + Flow provides shortcuts to record transactions if you choose to use them UIApplicationSupportsIndirectInputEvents UIFileSharingEnabled diff --git a/lib/entity/transaction/extensions/default/geo.dart b/lib/entity/transaction/extensions/default/geo.dart index 0b0b8099..7b5819bf 100644 --- a/lib/entity/transaction/extensions/default/geo.dart +++ b/lib/entity/transaction/extensions/default/geo.dart @@ -88,4 +88,8 @@ class Geo extends TransactionExtension implements Jasonable { List? toLatLng() => (latitude != null && longitude != null) ? [latitude!, longitude!] : null; + + LatLng? toLatLngPosition() => (latitude != null && longitude != null) + ? LatLng(latitude!, longitude!) + : null; } diff --git a/lib/providers/transaction_tags_provider.dart b/lib/providers/transaction_tags_provider.dart index 503c641d..92c93ab5 100644 --- a/lib/providers/transaction_tags_provider.dart +++ b/lib/providers/transaction_tags_provider.dart @@ -1,11 +1,13 @@ import "package:flow/data/prefs/frecency_group.dart"; import "package:flow/entity/transaction_tag.dart"; +import "package:flow/entity/transaction_type/payload.dart"; import "package:flow/objectbox.dart"; import "package:flow/objectbox/objectbox.g.dart"; import "package:flow/prefs/transitive.dart"; import "package:flow/utils/extensions/iterables.dart"; import "package:flow/widgets/transaction_watcher.dart"; import "package:flutter/material.dart"; +import "package:latlong2/latlong.dart"; class TransactionTagsProviderScope extends StatefulWidget { final Widget child; @@ -66,6 +68,47 @@ class TransactionTagsProvider extends InheritedWidget { String? getName(dynamic id) => get(id)?.title; + List getCloseGeoTags( + LatLng latLng, { + double thresholdInMeters = 50, + List? exclusionList, + }) { + final Distance distance = const Distance(); + + final List<(TransactionTag tag, double distanceInMeters)> tagsByDistance = + tags + .map((tag) { + if (exclusionList?.any( + (excludedTag) => excludedTag.uuid == tag.uuid, + ) == + true) { + return (null, double.infinity); + } + if (tag.parsedPayload?.location + case TransactionTagLocationPayload locationPayload) { + final double distanceInMeters = distance.as( + LengthUnit.Meter, + latLng, + locationPayload.latLng, + ); + + return (tag, distanceInMeters); + } + return (null, double.infinity); + }) + .where( + (tagAndDistance) => + tagAndDistance.$1 != null && + tagAndDistance.$2 <= thresholdInMeters, + ) + .cast<(TransactionTag tag, double distanceInMeters)>() + .toList(); + + tagsByDistance.sort((a, b) => a.$2.compareTo(b.$2)); + + return tagsByDistance.map((e) => e.$1).toList(); + } + TransactionTag? get(dynamic id) => switch (id) { String uuid => _tags?.firstWhereOrNull((tag) => tag.uuid == uuid), int id => _tags?.firstWhereOrNull((tag) => tag.id == id), diff --git a/lib/routes/home/accounts_tab.dart b/lib/routes/home/accounts_tab.dart index 11333d1a..39eb986d 100644 --- a/lib/routes/home/accounts_tab.dart +++ b/lib/routes/home/accounts_tab.dart @@ -14,6 +14,7 @@ import "package:flow/widgets/general/frame.dart"; import "package:flow/widgets/general/spinner.dart"; import "package:flow/widgets/home/home/account/no_accounts.dart"; import "package:flow/widgets/home/home/account/total_balance.dart"; +import "package:flow/widgets/home/privacy_toggler.dart"; import "package:flutter/material.dart"; import "package:go_router/go_router.dart"; import "package:material_symbols_icons/symbols.dart"; @@ -165,6 +166,7 @@ class _AccountsTabState extends State ? const Icon(Symbols.check_rounded) : const Icon(Symbols.reorder_rounded), ), + const PrivacyToggler(), ], ), TotalBalance(), diff --git a/lib/routes/preferences/button_order_preferences_page.dart b/lib/routes/preferences/button_order_preferences_page.dart index 036ad140..db71ab92 100644 --- a/lib/routes/preferences/button_order_preferences_page.dart +++ b/lib/routes/preferences/button_order_preferences_page.dart @@ -1,6 +1,6 @@ import "dart:developer"; -import "package:dotted_border/dotted_border.dart"; +import "package:dashed_border/dashed_border.dart"; import "package:flow/data/flow_button_type.dart"; import "package:flow/l10n/extensions.dart"; import "package:flow/services/integrations/eny.dart"; @@ -140,37 +140,38 @@ class ButtonOrderPreferencesPageState left: position.dx, top: position.dy, child: Container( - decoration: BoxDecoration(borderRadius: .all(widget.radius)), - clipBehavior: .none, - child: DottedBorder( - options: RoundedRectDottedBorderOptions( + decoration: BoxDecoration( + borderRadius: .all(widget.radius), + border: DashedBorder( color: Theme.of(context).dividerColor.withAlpha(0x80), - strokeWidth: 4.0, - radius: widget.radius, - strokeCap: .round, - dashPattern: const [6.0, 10.0], + width: 4.0, + borderRadius: BorderRadius.all(widget.radius), + dashLength: 6.0, + dashGap: 10.0, + style: .dashed, ), - child: SizedBox.square( - dimension: size, - child: DragTarget( - onWillAcceptWithDetails: (details) => - details.data != transactionType, - onAcceptWithDetails: (details) => - swap(transactionButtonOrder, details.data, transactionType), - onMove: (details) => updateAnimationData( - transactionButtonOrder, - details.data, - transactionType, - ), - builder: - ( - BuildContext context, - List candidateData, - List rejectedData, - ) { - return SizedBox.shrink(); - }, + ), + clipBehavior: .none, + child: SizedBox.square( + dimension: size, + child: DragTarget( + onWillAcceptWithDetails: (details) => + details.data != transactionType, + onAcceptWithDetails: (details) => + swap(transactionButtonOrder, details.data, transactionType), + onMove: (details) => updateAnimationData( + transactionButtonOrder, + details.data, + transactionType, ), + builder: + ( + BuildContext context, + List candidateData, + List rejectedData, + ) { + return SizedBox.shrink(); + }, ), ), ), diff --git a/lib/routes/transaction_page.dart b/lib/routes/transaction_page.dart index 8ebd5bc1..6ad4ba0a 100644 --- a/lib/routes/transaction_page.dart +++ b/lib/routes/transaction_page.dart @@ -442,6 +442,8 @@ class _TransactionPageState extends State { TagsSection( selectTags: selectTags, selectedTags: _selectedTags, + onTagsChanged: onTagsChanged, + location: _geo, ), DescriptionSection( value: _descriptionMarkdown, @@ -1011,6 +1013,12 @@ class _TransactionPageState extends State { setState(() {}); } + void onTagsChanged(List newTags) { + _selectedTags = newTags; + + setState(() {}); + } + Future selectTags([bool fromAutomatedFlow = false]) async { final List allTags = TransactionTagsProvider.of( context, diff --git a/lib/routes/transaction_page/sections/tags_section.dart b/lib/routes/transaction_page/sections/tags_section.dart index d4adc993..f52e9999 100644 --- a/lib/routes/transaction_page/sections/tags_section.dart +++ b/lib/routes/transaction_page/sections/tags_section.dart @@ -1,65 +1,95 @@ +import "package:flow/entity/transaction/extensions/default/geo.dart"; import "package:flow/entity/transaction_tag.dart"; import "package:flow/l10n/extensions.dart"; import "package:flow/prefs/local_preferences.dart"; +import "package:flow/providers/transaction_tags_provider.dart"; import "package:flow/routes/transaction_page/section.dart"; -import "package:flow/widgets/general/directional_chevron.dart"; import "package:flow/widgets/general/frame.dart"; import "package:flow/widgets/general/info_text.dart"; +import "package:flow/widgets/transaction_tag_add_chip.dart"; import "package:flow/widgets/transaction_tag_chip.dart"; import "package:flutter/material.dart"; import "package:flutter/services.dart"; -import "package:material_symbols_icons/symbols.dart"; +import "package:latlong2/latlong.dart"; class TagsSection extends StatelessWidget { final List? selectedTags; final VoidCallback selectTags; + final ValueChanged> onTagsChanged; - const TagsSection({super.key, this.selectedTags, required this.selectTags}); + /// Used for suggesting nearby tags based on the transaction's location. + final Geo? location; + + const TagsSection({ + super.key, + this.selectedTags, + required this.selectTags, + required this.onTagsChanged, + this.location, + }); @override Widget build(BuildContext context) { + final List? suggestedGeoTags = switch (location + ?.toLatLngPosition()) { + LatLng latLng => TransactionTagsProvider.of( + context, + ).getCloseGeoTags(latLng, exclusionList: selectedTags), + _ => null, + }; + + final bool hasSuggestedGeoTags = suggestedGeoTags?.isNotEmpty == true; + return Section( title: "transaction.tags".t(context), child: GestureDetector( behavior: HitTestBehavior.opaque, - child: selectedTags?.isNotEmpty == true - ? Frame( - child: Padding( - padding: const EdgeInsets.only(top: 8.0), - child: Align( - alignment: AlignmentDirectional.topStart, - child: Column( - crossAxisAlignment: .start, - spacing: 8.0, - children: [ - IgnorePointer( - child: Wrap( - spacing: 12.0, - runSpacing: 8.0, - children: selectedTags! - .map( - (tag) => TransactionTagChip( - tag: tag, - selected: true, - ), - ) - .toList(), + child: Frame( + child: Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Align( + alignment: AlignmentDirectional.topStart, + child: Column( + crossAxisAlignment: .start, + spacing: 8.0, + children: [ + Wrap( + spacing: 12.0, + runSpacing: 8.0, + children: [ + TransactionTagAddChip( + onPressed: selectTags, + title: "transaction.tags.add".t(context), + ), + if (hasSuggestedGeoTags) + ...suggestedGeoTags!.map( + (tag) => TransactionTagChip( + tag: tag, + selected: false, + isSuggestion: true, + onPressed: () { + _addTag(context, tag); + }, ), ), - InfoText( - child: Text("transaction.tags.editGuide".t(context)), + ...selectedTags!.map( + (tag) => IgnorePointer( + child: TransactionTagChip(tag: tag, selected: true), ), - ], - ), + ), + ], ), - ), - ) - : ListTile( - leading: Icon(Symbols.style_rounded), - title: Text("transaction.edit.selectTags".t(context)), - trailing: LeChevron(), - onTap: selectTags, + if (hasSuggestedGeoTags) + InfoText( + child: Text( + "transaction.tags.suggestionGuide".t(context), + ), + ), + ], ), + ), + ), + ), onTap: () { if (LocalPreferences().enableHapticFeedback.get()) { HapticFeedback.lightImpact(); @@ -70,4 +100,14 @@ class TagsSection extends StatelessWidget { ), ); } + + void _addTag(BuildContext context, TransactionTag tag) { + if (selectedTags!.contains(tag)) return; + + if (LocalPreferences().enableHapticFeedback.get()) { + HapticFeedback.lightImpact(); + } + + onTagsChanged([...selectedTags!, tag]); + } } diff --git a/lib/widgets/home/greetings_bar.dart b/lib/widgets/home/greetings_bar.dart index 823f4c85..01d2cf05 100644 --- a/lib/widgets/home/greetings_bar.dart +++ b/lib/widgets/home/greetings_bar.dart @@ -41,7 +41,7 @@ class GreetingsBar extends StatelessWidget { ), ), const SizedBox(width: 12.0), - PrivacyToggler(), + const PrivacyToggler(), ], ); }, diff --git a/lib/widgets/transaction_tag_add_chip.dart b/lib/widgets/transaction_tag_add_chip.dart index d302eb87..f409028b 100644 --- a/lib/widgets/transaction_tag_add_chip.dart +++ b/lib/widgets/transaction_tag_add_chip.dart @@ -1,22 +1,27 @@ import "package:flow/data/flow_icon.dart"; +import "package:flow/entity/transaction_tag.dart"; import "package:flow/l10n/flow_localizations.dart"; -import "package:flow/widgets/general/flow_icon.dart"; +import "package:flow/widgets/transaction_tag_chip.dart"; import "package:flutter/material.dart"; import "package:material_symbols_icons/symbols.dart"; class TransactionTagAddChip extends StatelessWidget { + final String? title; + final VoidCallback? onPressed; - const TransactionTagAddChip({super.key, this.onPressed}); + const TransactionTagAddChip({super.key, this.onPressed, this.title}); @override Widget build(BuildContext context) { - return InputChip( - label: Text("transaction.tags.new".t(context)), + return TransactionTagChip( + tag: TransactionTag( + title: title ?? "transaction.tags.new".t(context), + iconCode: FlowIconData.icon(Symbols.add_rounded).toString(), + ), selected: false, + isSuggestion: false, onPressed: onPressed ?? () {}, - showCheckmark: false, - avatar: FlowIcon(FlowIconData.icon(Symbols.add_rounded), size: 16.0), ); } } diff --git a/lib/widgets/transaction_tag_chip.dart b/lib/widgets/transaction_tag_chip.dart index 5ad6dbdf..03a68472 100644 --- a/lib/widgets/transaction_tag_chip.dart +++ b/lib/widgets/transaction_tag_chip.dart @@ -1,18 +1,26 @@ +import "dart:math"; + +import "package:dashed_border/dashed_border.dart"; import "package:flow/entity/transaction_tag.dart"; import "package:flow/theme/flow_color_scheme.dart"; +import "package:flow/theme/theme.dart"; import "package:flow/widgets/general/flow_icon.dart"; import "package:flutter/material.dart"; +import "package:material_symbols_icons/material_symbols_icons.dart"; class TransactionTagChip extends StatelessWidget { final TransactionTag tag; final bool selected; + final bool isSuggestion; + final VoidCallback? onPressed; const TransactionTagChip({ super.key, required this.tag, this.selected = false, + this.isSuggestion = false, this.onPressed, }); @@ -20,12 +28,52 @@ class TransactionTagChip extends StatelessWidget { Widget build(BuildContext context) { final FlowColorScheme? colorScheme = tag.colorScheme; - return InputChip( - label: Text(tag.title), - selected: selected, - onPressed: onPressed ?? () {}, - showCheckmark: false, - avatar: FlowIcon(tag.icon, colorScheme: colorScheme, size: 16.0), + final Widget childn = GestureDetector( + onTap: onPressed, + behavior: onPressed != null ? .opaque : .translucent, + child: Container( + margin: .symmetric(vertical: 4.0), + decoration: BoxDecoration( + color: selected + ? context.colorScheme.secondary + : context.colorScheme.surface, + borderRadius: .circular(8.0), + border: isSuggestion + ? DashedBorder( + color: context.colorScheme.outline.withAlpha(0x80), + width: 2.0, + borderRadius: .circular(8.0), + dashLength: 4.0, + dashGap: 4.0, + ) + : Border.all( + color: selected + ? kTransparent + : context.colorScheme.outline.withAlpha(0x80), + width: 1.0, + ), + ), + padding: EdgeInsets.symmetric( + horizontal: 12.0, + vertical: 8.0 + (selected ? 1.0 : (isSuggestion ? 0.0 : 1.0)), + ), + child: Row( + spacing: 8.0, + mainAxisSize: .min, + children: [ + FlowIcon(tag.icon, colorScheme: colorScheme, size: 16.0), + Text(tag.title, style: context.textTheme.labelLarge), + if (isSuggestion) + Icon( + Symbols.add_rounded, + size: 16.0, + color: context.colorScheme.outline, + ), + ], + ), + ), ); + + return childn; } } diff --git a/pubspec.lock b/pubspec.lock index e0c505f7..8584938b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -369,6 +369,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.3" + dashed_border: + dependency: "direct main" + description: + name: dashed_border + sha256: "5138b2a05da270238aedc6c6decddf9c1d151850d1857023ab8cb51c4a2b434f" + url: "https://pub.dev" + source: hosted + version: "1.0.2" dbus: dependency: transitive description: @@ -409,14 +417,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" - dotted_border: - dependency: "direct main" - description: - name: dotted_border - sha256: "99b091ec6891ba0c5331fdc2b502993c7c108f898995739a73c6845d71dad70c" - url: "https://pub.dev" - source: hosted - version: "3.1.0" equatable: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 04319a52..81afdc12 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: A personal finance managing app publish_to: "none" # Remove this line if you wish to publish to pub.dev -version: "0.19.0+319" +version: "0.19.0+320" environment: sdk: ">=3.10.0 <4.0.0" @@ -19,7 +19,7 @@ dependencies: cross_file: ^0.3.5+2 csv: ^6.0.0 desktop_drop: ^0.7.0 - dotted_border: ^3.1.0 + dashed_border: ^1.0.2 file_picker: ^10.3.10 file_saver: ^0.3.1 fl_chart: ^1.1.1 From d0c69ac8b484e77f7b02340de4867e889de337c3 Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Sat, 14 Feb 2026 22:05:11 +0800 Subject: [PATCH 11/21] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index eddf8025..f5d68fbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ * Added a Siri integration (intent). * Persian (Iran) support thanks to @arefbhrn[https://github.com/arefbhrn] +* Location tags are suggested if you're within 50m of the tag. Requires location + to be enabled. Closes [#648](https://github.com/flow-mn/flow/issues/648) ### Changes From 71f055b32d3181846fa7d24e1e3ee8af96d36fe2 Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Sat, 14 Feb 2026 22:11:50 +0800 Subject: [PATCH 12/21] translate --- assets/l10n/ar.json | 2 ++ assets/l10n/cs_CZ.json | 2 ++ assets/l10n/de_DE.json | 2 ++ assets/l10n/en.json | 10 +++++----- assets/l10n/es_ES.json | 2 ++ assets/l10n/fa_IR.json | 2 ++ assets/l10n/fr_FR.json | 2 ++ assets/l10n/it_IT.json | 2 ++ assets/l10n/mn_MN.json | 10 +++++----- assets/l10n/ru_RU.json | 2 ++ assets/l10n/tr_TR.json | 2 ++ assets/l10n/uk_UA.json | 2 ++ 12 files changed, 30 insertions(+), 10 deletions(-) diff --git a/assets/l10n/ar.json b/assets/l10n/ar.json index 06874543..98ffc668 100644 --- a/assets/l10n/ar.json +++ b/assets/l10n/ar.json @@ -688,6 +688,7 @@ "transaction.recurring.edit": "تعديل المعاملة المتكررة", "transaction.recurring.setup": "إعداد المعاملة المتكررة", "transaction.tags": "الوسوم", + "transaction.tags.add": "إضافة وسوم", "transaction.tags.contact.name": "اسم جهة الاتصال", "transaction.tags.contact.select": "اختر جهة اتصال من الهاتف", "transaction.tags.delete": "حذف الوسم", @@ -696,6 +697,7 @@ "transaction.tags.location.useCurrent": "استخدام الموقع الحالي", "transaction.tags.name": "اسم الوسم", "transaction.tags.new": "وسم جديد", + "transaction.tags.suggestionGuide": "اضغط على الوسم المقترح لإضافته", "transaction.transfer.conversionRate": "سعر التحويل", "transaction.transfer.from": "الحساب المرسل", "transaction.transfer.from.select": "التحويل من", diff --git a/assets/l10n/cs_CZ.json b/assets/l10n/cs_CZ.json index 22948960..4bc53c1b 100644 --- a/assets/l10n/cs_CZ.json +++ b/assets/l10n/cs_CZ.json @@ -688,6 +688,7 @@ "transaction.recurring.edit": "Upravit opakující se transakci", "transaction.recurring.setup": "Nastavit opakující se transakci", "transaction.tags": "Štítky", + "transaction.tags.add": "Přidat štítky", "transaction.tags.contact.name": "Jméno kontaktu", "transaction.tags.contact.select": "Vybrat kontakt z telefonu", "transaction.tags.delete": "Smazat štítek", @@ -696,6 +697,7 @@ "transaction.tags.location.useCurrent": "Použít aktuální polohu", "transaction.tags.name": "Název štítku", "transaction.tags.new": "Nový štítek", + "transaction.tags.suggestionGuide": "Klepněte na navržený štítek pro jeho přidání", "transaction.transfer.conversionRate": "Směnný kurz", "transaction.transfer.from": "Z účtu", "transaction.transfer.from.select": "Převést z", diff --git a/assets/l10n/de_DE.json b/assets/l10n/de_DE.json index cef5df93..9f62bcb1 100644 --- a/assets/l10n/de_DE.json +++ b/assets/l10n/de_DE.json @@ -688,6 +688,7 @@ "transaction.recurring.edit": "Wiederkehrende Buchung bearbeiten", "transaction.recurring.setup": "Wiederkehrende Buchung einrichten", "transaction.tags": "Tags", + "transaction.tags.add": "Tags hinzufügen", "transaction.tags.contact.name": "Kontaktname", "transaction.tags.contact.select": "Kontakt vom Telefon auswählen", "transaction.tags.delete": "Schlagwort löschen", @@ -696,6 +697,7 @@ "transaction.tags.location.useCurrent": "Aktuellen Standort verwenden", "transaction.tags.name": "Tag-Name", "transaction.tags.new": "Neues Tag", + "transaction.tags.suggestionGuide": "Tippe auf den vorgeschlagenen Tag, um ihn hinzuzufügen", "transaction.transfer.conversionRate": "Umrechnungskurs", "transaction.transfer.from": "Senderkonto", "transaction.transfer.from.select": "Umbuchen von", diff --git a/assets/l10n/en.json b/assets/l10n/en.json index 37e6c217..484b216a 100644 --- a/assets/l10n/en.json +++ b/assets/l10n/en.json @@ -116,8 +116,8 @@ "enum.ImportV2Progress@writingFileAttachments": "Writing file attachments", "enum.ImportV2Progress@writingProfile": "Writing profile data", "enum.ImportV2Progress@writingRecurringTransactions": "Writing recurring transactions", - "enum.ImportV2Progress@writingTransactions": "Writing transactions", "enum.ImportV2Progress@writingTransactionTags": "Writing transaction tags", + "enum.ImportV2Progress@writingTransactions": "Writing transactions", "enum.ImportV2Progress@writingTranscationFilterPresets": "Writing transaction filter presets", "enum.ImportV2Progress@writingUserPreferences": "Writing user preferences", "enum.PDFHeader@account": "Account", @@ -164,11 +164,11 @@ "enum.TransactionSearchMode@smart": "Smart", "enum.TransactionSearchMode@substring": "Partial match", "enum.TransactionSubtype": "Type", + "enum.TransactionSubtype#null": "Default", "enum.TransactionSubtype@givenLoan": "Loan (given)", "enum.TransactionSubtype@receivedLoan": "Loan (taken)", "enum.TransactionSubtype@transactionFee": "Transaction fee", "enum.TransactionSubtype@updateBalance": "Update balance", - "enum.TransactionSubtype#null": "Default", "enum.TransactionTagType": "Tag type", "enum.TransactionTagType@contact": "Person", "enum.TransactionTagType@generic": "Generic", @@ -344,8 +344,8 @@ "preferences.sync.iCloud.connectionFailed.tips#1": "Please check your internet connection", "preferences.sync.iCloud.connectionFailed.tips#2": "Make sure you've logged in with your Apple Account on your device", "preferences.sync.iCloud.connectionFailed.tips#3": "Make sure to enable iCloud in System Settings > Apple Account > iCloud > Drive", - "preferences.sync.iCloud.lastSyncedAt": "Last synced at {date}", "preferences.sync.iCloud.lastSyncFailed": "Last attempt to backup to iCloud failed. Click here to see how to fix.", + "preferences.sync.iCloud.lastSyncedAt": "Last synced at {date}", "preferences.sync.iCloud.noOfBackupsToKeep": "Number of backups to keep", "preferences.sync.iCloud.noOfBackupsToKeep.description": "The maximum number of backup files to keep in iCloud. Because this will take up space in your iCloud, you may want to keep this number low. Depending on this setting, the older backups are deleted at each startup.", "preferences.sync.iCloud.noOfBackupsToKeep.infiniteBackups": "Infinite backups", @@ -735,13 +735,13 @@ "transactions.query.filter.currency": "Currency", "transactions.query.filter.groupBy": "Group by", "transactions.query.filter.hasAttachments": "Attachments", - "transactions.query.filter.hasAttachments.all": "Attachments", "transactions.query.filter.hasAttachments#false": "Has No Attachments", "transactions.query.filter.hasAttachments#true": "Has Attachments", + "transactions.query.filter.hasAttachments.all": "Attachments", "transactions.query.filter.isPending": "Pending status", - "transactions.query.filter.isPending.all": "All", "transactions.query.filter.isPending#false": "Not Pending", "transactions.query.filter.isPending#true": "Pending", + "transactions.query.filter.isPending.all": "All", "transactions.query.filter.keyword": "Search", "transactions.query.filter.keyword.all": "Search", "transactions.query.filter.keyword.clear": "Clear", diff --git a/assets/l10n/es_ES.json b/assets/l10n/es_ES.json index 7d66e2dc..ac603f87 100644 --- a/assets/l10n/es_ES.json +++ b/assets/l10n/es_ES.json @@ -688,6 +688,7 @@ "transaction.recurring.edit": "Editar transacción recurrente", "transaction.recurring.setup": "Configurar transacción recurrente", "transaction.tags": "Etiquetas", + "transaction.tags.add": "Añadir etiquetas", "transaction.tags.contact.name": "Nombre del contacto", "transaction.tags.contact.select": "Seleccionar contacto del teléfono", "transaction.tags.delete": "Eliminar etiqueta", @@ -696,6 +697,7 @@ "transaction.tags.location.useCurrent": "Usar ubicación actual", "transaction.tags.name": "Nombre de la etiqueta", "transaction.tags.new": "Nueva etiqueta", + "transaction.tags.suggestionGuide": "Pulsa la etiqueta sugerida para añadirla", "transaction.transfer.conversionRate": "Tasa de conversión", "transaction.transfer.from": "Cuenta de envío", "transaction.transfer.from.select": "Transferir desde", diff --git a/assets/l10n/fa_IR.json b/assets/l10n/fa_IR.json index 7bfa5568..91b54562 100644 --- a/assets/l10n/fa_IR.json +++ b/assets/l10n/fa_IR.json @@ -688,6 +688,7 @@ "transaction.recurring.edit": "ویرایش تراکنش تکرارشونده", "transaction.recurring.setup": "تنظیم تراکنش تکرارشونده", "transaction.tags": "برچسب‌ها", + "transaction.tags.add": "افزودن برچسب‌ها", "transaction.tags.contact.name": "نام مخاطب", "transaction.tags.contact.select": "انتخاب مخاطب از گوشی", "transaction.tags.delete": "حذف برچسب", @@ -696,6 +697,7 @@ "transaction.tags.location.useCurrent": "استفاده از موقعیت فعلی", "transaction.tags.name": "نام برچسب", "transaction.tags.new": "برچسب جدید", + "transaction.tags.suggestionGuide": "برای افزودن، روی برچسب پیشنهادی ضربه بزنید", "transaction.transfer.conversionRate": "نرخ تبدیل", "transaction.transfer.from": "حساب فرستنده", "transaction.transfer.from.select": "انتقال از", diff --git a/assets/l10n/fr_FR.json b/assets/l10n/fr_FR.json index db0b9d52..b388192e 100644 --- a/assets/l10n/fr_FR.json +++ b/assets/l10n/fr_FR.json @@ -688,6 +688,7 @@ "transaction.recurring.edit": "Modifier la transaction récurrente", "transaction.recurring.setup": "Configurer la transaction récurrente", "transaction.tags": "Étiquettes", + "transaction.tags.add": "Ajouter des étiquettes", "transaction.tags.contact.name": "Nom du contact", "transaction.tags.contact.select": "Sélectionner un contact du téléphone", "transaction.tags.delete": "Supprimer l’étiquette", @@ -696,6 +697,7 @@ "transaction.tags.location.useCurrent": "Utiliser la position actuelle", "transaction.tags.name": "Nom de l’étiquette", "transaction.tags.new": "Nouvelle étiquette", + "transaction.tags.suggestionGuide": "Appuyez sur l'étiquette suggérée pour l'ajouter", "transaction.transfer.conversionRate": "Taux de conversion", "transaction.transfer.from": "Compte d'envoi", "transaction.transfer.from.select": "Transférer depuis", diff --git a/assets/l10n/it_IT.json b/assets/l10n/it_IT.json index f2e7c798..a19dd1ab 100644 --- a/assets/l10n/it_IT.json +++ b/assets/l10n/it_IT.json @@ -688,6 +688,7 @@ "transaction.recurring.edit": "Modifica transazione ricorrente", "transaction.recurring.setup": "Configurare la transazione ricorrente", "transaction.tags": "Tag", + "transaction.tags.add": "Aggiungi tag", "transaction.tags.contact.name": "Nome del contatto", "transaction.tags.contact.select": "Seleziona contatto dalla rubrica", "transaction.tags.delete": "Elimina tag", @@ -696,6 +697,7 @@ "transaction.tags.location.useCurrent": "Usa posizione attuale", "transaction.tags.name": "Nome tag", "transaction.tags.new": "Nuovo tag", + "transaction.tags.suggestionGuide": "Tocca il tag suggerito per aggiungerlo", "transaction.transfer.conversionRate": "Tasso di conversione", "transaction.transfer.from": "Conto di origine", "transaction.transfer.from.select": "Trasferisci da", diff --git a/assets/l10n/mn_MN.json b/assets/l10n/mn_MN.json index 87e2b2e2..f7cbc2e4 100644 --- a/assets/l10n/mn_MN.json +++ b/assets/l10n/mn_MN.json @@ -116,8 +116,8 @@ "enum.ImportV2Progress@writingFileAttachments": "Файлын хавсралтуудыг бичиж байна", "enum.ImportV2Progress@writingProfile": "Бүртгэлийг бичиж байна", "enum.ImportV2Progress@writingRecurringTransactions": "Давтамжит гүйлгээнүүдийг бичиж байна", - "enum.ImportV2Progress@writingTransactions": "Гүйлгээнүүдийг бичиж байна", "enum.ImportV2Progress@writingTransactionTags": "Гүйлгээний шошгуудыг бичиж байна", + "enum.ImportV2Progress@writingTransactions": "Гүйлгээнүүдийг бичиж байна", "enum.ImportV2Progress@writingTranscationFilterPresets": "Гүйлгээ шүүх загваруудыг бичиж байна", "enum.ImportV2Progress@writingUserPreferences": "Хэрэглэгчийн тохиргоог бичиж байна", "enum.PDFHeader@account": "Данс", @@ -164,11 +164,11 @@ "enum.TransactionSearchMode@smart": "Ухаалаг", "enum.TransactionSearchMode@substring": "Хэсэгчлэн таарах", "enum.TransactionSubtype": "Төрөл", + "enum.TransactionSubtype#null": "Хэвийн", "enum.TransactionSubtype@givenLoan": "Өгсөн зээл", "enum.TransactionSubtype@receivedLoan": "Авсан зээл", "enum.TransactionSubtype@transactionFee": "Гүйлгээний шимтгэл", "enum.TransactionSubtype@updateBalance": "Үлдэгдэл өөрчлөх", - "enum.TransactionSubtype#null": "Хэвийн", "enum.TransactionTagType": "Шошгоны төрөл", "enum.TransactionTagType@contact": "Хүн", "enum.TransactionTagType@generic": "Ерөнхий", @@ -344,8 +344,8 @@ "preferences.sync.iCloud.connectionFailed.tips#1": "Интернэт холболтоо шалгана уу", "preferences.sync.iCloud.connectionFailed.tips#2": "Төхөөрөмж дээрээ Apple бүртгэлээрээ нэвтэрсэн эсэхийг шалгана уу", "preferences.sync.iCloud.connectionFailed.tips#3": "iCloud-г идэвхжүүлсэн эсэхийг шалгана уу. System Settings > Apple Account > iCloud > Drive", - "preferences.sync.iCloud.lastSyncedAt": "Сүүлд {date}-д нөөцлөв", "preferences.sync.iCloud.lastSyncFailed": "iCloud руу нөөцлөх сүүлийн оролдлого амжилтгүй боллоо. Хэрхэн засахыг харахын тулд энд дарна уу.", + "preferences.sync.iCloud.lastSyncedAt": "Сүүлд {date}-д нөөцлөв", "preferences.sync.iCloud.noOfBackupsToKeep": "Хадгалах нөөцийн тоо", "preferences.sync.iCloud.noOfBackupsToKeep.description": "iCloud-д хадгалах хамгийн их нөөцийн тоо. Энэ нь таны iCloud-ын зайг эзлэх тул бага тоо сонгох нь зүйтэй. Энэ тохиргооноос хамаарч хуучин нөөцүүд аппыг нээх бүрт устгагдана.", "preferences.sync.iCloud.noOfBackupsToKeep.infiniteBackups": "Хязгааргүй нөөц", @@ -735,13 +735,13 @@ "transactions.query.filter.currency": "Валют", "transactions.query.filter.groupBy": "Бүлэглэх нэгж", "transactions.query.filter.hasAttachments": "Файл хавсралт", - "transactions.query.filter.hasAttachments.all": "Бүгд", "transactions.query.filter.hasAttachments#false": "Файл хавсралтгүй", "transactions.query.filter.hasAttachments#true": "Файл хавсралттай", + "transactions.query.filter.hasAttachments.all": "Бүгд", "transactions.query.filter.isPending": "Төлөв", - "transactions.query.filter.isPending.all": "Бүгд", "transactions.query.filter.isPending#false": "Аль хэдийн биелсэн", "transactions.query.filter.isPending#true": "Хүлээгдэж буй", + "transactions.query.filter.isPending.all": "Бүгд", "transactions.query.filter.keyword": "Хайх", "transactions.query.filter.keyword.all": "Хайх", "transactions.query.filter.keyword.clear": "Цэвэрлэх", diff --git a/assets/l10n/ru_RU.json b/assets/l10n/ru_RU.json index 5e2813c1..72aa8367 100644 --- a/assets/l10n/ru_RU.json +++ b/assets/l10n/ru_RU.json @@ -688,6 +688,7 @@ "transaction.recurring.edit": "Редактировать повторяющуюся транзакцию", "transaction.recurring.setup": "Настроить повторяющуюся транзакцию", "transaction.tags": "Теги", + "transaction.tags.add": "Добавить теги", "transaction.tags.contact.name": "Имя контакта", "transaction.tags.contact.select": "Выбрать контакт из телефона", "transaction.tags.delete": "Удалить тег", @@ -696,6 +697,7 @@ "transaction.tags.location.useCurrent": "Использовать текущее местоположение", "transaction.tags.name": "Название тега", "transaction.tags.new": "Новый тег", + "transaction.tags.suggestionGuide": "Нажмите на предложенный тег, чтобы добавить", "transaction.transfer.conversionRate": "Курс конвертации", "transaction.transfer.from": "Счет отправителя", "transaction.transfer.from.select": "Перевести из", diff --git a/assets/l10n/tr_TR.json b/assets/l10n/tr_TR.json index babc86f0..240c9be9 100644 --- a/assets/l10n/tr_TR.json +++ b/assets/l10n/tr_TR.json @@ -688,6 +688,7 @@ "transaction.recurring.edit": "Yinelenen işlemi düzenle", "transaction.recurring.setup": "Yinelenen işlemi ayarlayın", "transaction.tags": "Etiketler", + "transaction.tags.add": "Etiket ekle", "transaction.tags.contact.name": "Kişi adı", "transaction.tags.contact.select": "Telefondan kişi seç", "transaction.tags.delete": "Etiketi sil", @@ -696,6 +697,7 @@ "transaction.tags.location.useCurrent": "Mevcut konumu kullan", "transaction.tags.name": "Etiket adı", "transaction.tags.new": "Yeni etiket", + "transaction.tags.suggestionGuide": "Eklemek için önerilen etikete dokunun", "transaction.transfer.conversionRate": "Dönüşüm oranı", "transaction.transfer.from": "Hesap gönderiliyor", "transaction.transfer.from.select": "Transfer etmek", diff --git a/assets/l10n/uk_UA.json b/assets/l10n/uk_UA.json index 7e66845e..8877a517 100644 --- a/assets/l10n/uk_UA.json +++ b/assets/l10n/uk_UA.json @@ -688,6 +688,7 @@ "transaction.recurring.edit": "Редагувати повторювану транзакцію", "transaction.recurring.setup": "Налаштувати повторювану транзакцію", "transaction.tags": "Теги", + "transaction.tags.add": "Додати теги", "transaction.tags.contact.name": "Ім’я контакту", "transaction.tags.contact.select": "Вибрати контакт із телефону", "transaction.tags.delete": "Видалити мітку", @@ -696,6 +697,7 @@ "transaction.tags.location.useCurrent": "Використати поточну локацію", "transaction.tags.name": "Назва тега", "transaction.tags.new": "Новий тег", + "transaction.tags.suggestionGuide": "Торкніться запропонованого тегу, щоб додати", "transaction.transfer.conversionRate": "Курс конвертації", "transaction.transfer.from": "Рахунок відправника", "transaction.transfer.from.select": "Переказати з", From 4f77e0a1540a060fbae5af4171fc3d39062e390b Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Sun, 15 Feb 2026 01:37:50 +0800 Subject: [PATCH 13/21] fix? --- ios/Runner/RecordTransactionIntent.swift | 2 +- pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/Runner/RecordTransactionIntent.swift b/ios/Runner/RecordTransactionIntent.swift index fa40f093..dce62e1e 100644 --- a/ios/Runner/RecordTransactionIntent.swift +++ b/ios/Runner/RecordTransactionIntent.swift @@ -2,7 +2,7 @@ import AppIntents struct RecordTransactionIntent: AppIntent { static var title: LocalizedStringResource = "Record an Expense" - static var description: IntentDescription = "Log expenses from Siri." + static var description: IntentDescription = "Log expenses" @Parameter(title: "Account", description: "Exact name, or UUID of the target account") var account: String diff --git a/pubspec.yaml b/pubspec.yaml index 81afdc12..f9d3054c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: A personal finance managing app publish_to: "none" # Remove this line if you wish to publish to pub.dev -version: "0.19.0+320" +version: "0.19.0+321" environment: sdk: ">=3.10.0 <4.0.0" From c3e2c823d7fbe9f7dbadd16cf826224675cafe70 Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Sun, 15 Feb 2026 02:10:58 +0800 Subject: [PATCH 14/21] add fields to siri --- ios/Runner/RecordTransactionIntent.swift | 14 ++++++++++---- pubspec.yaml | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/ios/Runner/RecordTransactionIntent.swift b/ios/Runner/RecordTransactionIntent.swift index dce62e1e..2b2e5bf8 100644 --- a/ios/Runner/RecordTransactionIntent.swift +++ b/ios/Runner/RecordTransactionIntent.swift @@ -4,20 +4,26 @@ struct RecordTransactionIntent: AppIntent { static var title: LocalizedStringResource = "Record an Expense" static var description: IntentDescription = "Log expenses" - @Parameter(title: "Account", description: "Exact name, or UUID of the target account") + @Parameter(title: "Account", description: "Exact name, or UUID of the target account.") var account: String @Parameter(title: "Amount", description: "Expense amount. Sign doesn't matter.") var amount: Double - @Parameter(title: "Category", description: "Exact name, or UUID of the target account") + @Parameter(title: "Category", description: "Exact name, or UUID of the target account.") var category: String + + @Parameter(title: "Notes", description: "Transaction notes. Markdown supported.") + var notes: String + + @Parameter(title: "Title", description: "Transaction title.") + var title: String static var openAppWhenRun = false func perform() async throws -> some IntentResult & ProvidesDialog { - let tx = RecordedTransaction(type: .expense, amount: amount, fromAccount: account, category: category) + let tx = RecordedTransaction(type: .expense, amount: amount, fromAccount: account, category: category, title: title, notes: notes) try RecordedTransactionService.append(tx) - return .result(dialog: "Recorded transaction for \(account): $\(amount) in category \(category).") + return .result(dialog: "Expense recorded ✅") } } diff --git a/pubspec.yaml b/pubspec.yaml index f9d3054c..55e11933 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: A personal finance managing app publish_to: "none" # Remove this line if you wish to publish to pub.dev -version: "0.19.0+321" +version: "0.19.0+322" environment: sdk: ">=3.10.0 <4.0.0" From b975a359bc0fa6d799da8050023ee73108cfa1a2 Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Sun, 15 Feb 2026 02:32:32 +0800 Subject: [PATCH 15/21] fix order --- ios/Runner/RecordTransactionIntent.swift | 2 +- pubspec.lock | 12 ++++++------ pubspec.yaml | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ios/Runner/RecordTransactionIntent.swift b/ios/Runner/RecordTransactionIntent.swift index 2b2e5bf8..97dc990d 100644 --- a/ios/Runner/RecordTransactionIntent.swift +++ b/ios/Runner/RecordTransactionIntent.swift @@ -22,7 +22,7 @@ struct RecordTransactionIntent: AppIntent { static var openAppWhenRun = false func perform() async throws -> some IntentResult & ProvidesDialog { - let tx = RecordedTransaction(type: .expense, amount: amount, fromAccount: account, category: category, title: title, notes: notes) + let tx = RecordedTransaction(type: .expense, amount: amount, title: title, fromAccount: account, category: category, notes: notes) try RecordedTransactionService.append(tx) return .result(dialog: "Expense recorded ✅") } diff --git a/pubspec.lock b/pubspec.lock index 8584938b..ff0af732 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -618,10 +618,10 @@ packages: dependency: "direct main" description: name: flutter_local_notifications - sha256: "76cd20bcfa72fabe50ea27eeaf165527f446f55d3033021462084b87805b4cac" + sha256: "2b50e938a275e1ad77352d6a25e25770f4130baa61eaf02de7a9a884680954ad" url: "https://pub.dev" source: hosted - version: "20.0.0" + version: "20.1.0" flutter_local_notifications_linux: dependency: transitive description: @@ -642,10 +642,10 @@ packages: dependency: transitive description: name: flutter_local_notifications_windows - sha256: "7ddd964fa85b6a23e96956c5b63ef55cdb9e5947b71b95712204db42ad46da61" + sha256: e97a1a3016512437d9c0b12fae7d1491c3c7b9aa7f03a69b974308840656b02a url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" flutter_localizations: dependency: "direct main" description: flutter @@ -1233,10 +1233,10 @@ packages: dependency: "direct main" description: name: moment_dart - sha256: "04599f4f21a577debfd666249b73f91c89b2e11c864b857c2ef63cada0a84ddb" + sha256: c868448a4813e57d07a2a236ea010a4960311895b1166aeaf7a8e0750c2cb0dd url: "https://pub.dev" source: hosted - version: "5.3.0+1" + version: "5.3.1" nm: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 55e11933..8504dd5b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: A personal finance managing app publish_to: "none" # Remove this line if you wish to publish to pub.dev -version: "0.19.0+322" +version: "0.19.0+323" environment: sdk: ">=3.10.0 <4.0.0" @@ -28,7 +28,7 @@ dependencies: flutter_app_group_directory: ^1.1.0 flutter_contacts: ^1.1.9+2 flutter_dynamic_icon_plus: ^1.4.0 - flutter_local_notifications: ^20.0.0 + flutter_local_notifications: ^20.1.0 flutter_localizations: sdk: flutter flutter_map: ^8.2.2 @@ -56,7 +56,7 @@ dependencies: markdown: ^7.3.0 markdown_quill: ^4.3.0 material_symbols_icons: ^4.2906.0 - moment_dart: ^5.3.0+1 + moment_dart: ^5.3.1 objectbox: ^5.1.0 objectbox_flutter_libs: ^5.1.0 open_app_file: ^4.0.4 From 6da0fe67a603c16047c767e36c9482e9a42122d8 Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Sun, 15 Feb 2026 14:23:45 +0800 Subject: [PATCH 16/21] fixes, duplicate transfer --- CHANGELOG.md | 1 + lib/objectbox/actions.dart | 37 +++++++++++++++- lib/routes/debug/debug_theme_page.dart | 10 +++++ lib/routes/transaction_page.dart | 13 +++--- .../sections/tags_section.dart | 28 ++++++------ lib/widgets/account_card.dart | 12 +++-- lib/widgets/transaction_list_tile.dart | 4 +- lib/widgets/transaction_tag_chip.dart | 44 +++++++++---------- pubspec.yaml | 2 +- 9 files changed, 98 insertions(+), 53 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5d68fbc..d41f77ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ * Persian (Iran) support thanks to @arefbhrn[https://github.com/arefbhrn] * Location tags are suggested if you're within 50m of the tag. Requires location to be enabled. Closes [#648](https://github.com/flow-mn/flow/issues/648) +* Now it's possible to duplicate transfers ### Changes diff --git a/lib/objectbox/actions.dart b/lib/objectbox/actions.dart index b04b3be1..73ece6ab 100644 --- a/lib/objectbox/actions.dart +++ b/lib/objectbox/actions.dart @@ -614,8 +614,40 @@ extension TransactionActions on Transaction { /// Returns the ObjectBox ID for the newly created transaction int duplicate() { - if (isTransfer) { - throw Exception("Cannot duplicate transfer transactions"); + if (extensions.transfer case Transfer transferDetails) { + final Account? fromAccount = AccountsService().findOneSync( + transferDetails.fromAccountUuid, + ); + final Account? toAccount = AccountsService().findOneSync( + transferDetails.toAccountUuid, + ); + + if (fromAccount == null || toAccount == null) { + _log.severe( + "Failed to duplicate transfer transaction due to missing account data", + ); + throw Exception( + "Failed to duplicate transfer transaction due to missing account data", + ); + } + + final (int a, _) = fromAccount.transferTo( + targetAccount: toAccount, + amount: amount, + description: description, + createdDate: Moment.now(), + isPending: isPending, + transactionDate: transactionDate, + title: title, + tags: tags.toList(), + attachments: attachments.toList(), + extraTags: extraTags, + extensions: extensions.data, + latitude: extensions.geo?.latitude, + longitude: extensions.geo?.longitude, + ); + + return a; } final Transaction duplicate = @@ -630,6 +662,7 @@ extension TransactionActions on Transaction { uuid: Uuid().v4(), extraTags: extraTags, subtype: subtype, + location: extensions.geo?.toLatLng(), ) ..setTags(tags.toList()) ..setAttachments(attachments.toList()) diff --git a/lib/routes/debug/debug_theme_page.dart b/lib/routes/debug/debug_theme_page.dart index 9f2d23f3..211e2250 100644 --- a/lib/routes/debug/debug_theme_page.dart +++ b/lib/routes/debug/debug_theme_page.dart @@ -11,6 +11,7 @@ import "package:flow/widgets/general/frame.dart"; import "package:flow/widgets/general/list_header.dart"; import "package:flow/widgets/general/wavy_divider.dart"; import "package:flow/widgets/transaction_list_tile.dart"; +import "package:flow/widgets/transaction_tag_chip.dart"; import "package:flutter/material.dart"; import "package:go_router/go_router.dart"; import "package:material_symbols_icons/symbols.dart"; @@ -56,6 +57,15 @@ class DebugThemePage extends StatelessWidget { selected: true, ), ActionChip(label: Text("ActionChip"), onPressed: () {}), + TransactionTagChip(tag: .new(title: "Example Tag")), + TransactionTagChip( + tag: .new(title: "Example Tag"), + selected: true, + ), + TransactionTagChip( + tag: .new(title: "Example Tag"), + isSuggestion: true, + ), ], ), ), diff --git a/lib/routes/transaction_page.dart b/lib/routes/transaction_page.dart index 6ad4ba0a..f74cbe63 100644 --- a/lib/routes/transaction_page.dart +++ b/lib/routes/transaction_page.dart @@ -579,14 +579,11 @@ class _TransactionPageState extends State { child: Column( mainAxisSize: MainAxisSize.min, children: [ - if (!isTransfer) - ListTile( - leading: Icon(Symbols.content_copy_rounded), - title: Text( - "transaction.duplicate".t(context), - ), - onTap: () => _duplicate(), - ), + ListTile( + leading: Icon(Symbols.content_copy_rounded), + title: Text("transaction.duplicate".t(context)), + onTap: () => _duplicate(), + ), if (_currentlyEditing.isDeleted == true) ListTile( leading: Icon(Symbols.restore_page_rounded), diff --git a/lib/routes/transaction_page/sections/tags_section.dart b/lib/routes/transaction_page/sections/tags_section.dart index f52e9999..1402cf32 100644 --- a/lib/routes/transaction_page/sections/tags_section.dart +++ b/lib/routes/transaction_page/sections/tags_section.dart @@ -38,6 +38,9 @@ class TagsSection extends StatelessWidget { _ => null, }; + print("suggestedGeoTags: $suggestedGeoTags"); + print("location: $location"); + final bool hasSuggestedGeoTags = suggestedGeoTags?.isNotEmpty == true; return Section( @@ -61,18 +64,17 @@ class TagsSection extends StatelessWidget { onPressed: selectTags, title: "transaction.tags.add".t(context), ), - if (hasSuggestedGeoTags) - ...suggestedGeoTags!.map( - (tag) => TransactionTagChip( - tag: tag, - selected: false, - isSuggestion: true, - onPressed: () { - _addTag(context, tag); - }, - ), + ...?suggestedGeoTags?.map( + (tag) => TransactionTagChip( + tag: tag, + selected: false, + isSuggestion: true, + onPressed: () { + _addTag(context, tag); + }, ), - ...selectedTags!.map( + ), + ...?selectedTags?.map( (tag) => IgnorePointer( child: TransactionTagChip(tag: tag, selected: true), ), @@ -102,12 +104,12 @@ class TagsSection extends StatelessWidget { } void _addTag(BuildContext context, TransactionTag tag) { - if (selectedTags!.contains(tag)) return; + if (selectedTags?.contains(tag) == true) return; if (LocalPreferences().enableHapticFeedback.get()) { HapticFeedback.lightImpact(); } - onTagsChanged([...selectedTags!, tag]); + onTagsChanged([...?selectedTags, tag]); } } diff --git a/lib/widgets/account_card.dart b/lib/widgets/account_card.dart index 14b44f5a..cddf52b0 100644 --- a/lib/widgets/account_card.dart +++ b/lib/widgets/account_card.dart @@ -86,10 +86,14 @@ class AccountCard extends StatelessWidget { if (primary) WidgetSpan( alignment: .middle, - child: Icon( - Symbols.star_rounded, - size: context.textTheme.titleSmall?.fontSize, - color: context.colorScheme.primary, + child: Padding( + padding: const EdgeInsets.only(right: 4.0), + child: Icon( + Symbols.star_rounded, + size: + context.textTheme.titleSmall?.fontSize, + color: context.colorScheme.primary, + ), ), ), TextSpan( diff --git a/lib/widgets/transaction_list_tile.dart b/lib/widgets/transaction_list_tile.dart index db86f328..0104e489 100644 --- a/lib/widgets/transaction_list_tile.dart +++ b/lib/widgets/transaction_list_tile.dart @@ -72,9 +72,7 @@ class TransactionListTile extends StatelessWidget { confirmFn != null && transaction.confirmable(); final bool showDuplicateButton = - transaction.isDeleted != true && - !transaction.isTransfer && - duplicateFn != null; + transaction.isDeleted != true && duplicateFn != null; final bool showHoldButton = confirmFn != null && transaction.holdable(); final bool showConfirmButton = confirmFn != null && transaction.confirmable(); diff --git a/lib/widgets/transaction_tag_chip.dart b/lib/widgets/transaction_tag_chip.dart index 03a68472..cd3de39b 100644 --- a/lib/widgets/transaction_tag_chip.dart +++ b/lib/widgets/transaction_tag_chip.dart @@ -28,7 +28,13 @@ class TransactionTagChip extends StatelessWidget { Widget build(BuildContext context) { final FlowColorScheme? colorScheme = tag.colorScheme; - final Widget childn = GestureDetector( + final Color borderColor = selected + ? kTransparent + : context.colorScheme.outline.withAlpha(0x80); + + final BorderRadius borderRadius = .circular(8.0); + + final Widget child = GestureDetector( onTap: onPressed, behavior: onPressed != null ? .opaque : .translucent, child: Container( @@ -37,43 +43,37 @@ class TransactionTagChip extends StatelessWidget { color: selected ? context.colorScheme.secondary : context.colorScheme.surface, - borderRadius: .circular(8.0), + borderRadius: borderRadius, border: isSuggestion ? DashedBorder( - color: context.colorScheme.outline.withAlpha(0x80), - width: 2.0, - borderRadius: .circular(8.0), + color: borderColor, + width: 1.0, + borderRadius: borderRadius, dashLength: 4.0, dashGap: 4.0, ) - : Border.all( - color: selected - ? kTransparent - : context.colorScheme.outline.withAlpha(0x80), - width: 1.0, - ), - ), - padding: EdgeInsets.symmetric( - horizontal: 12.0, - vertical: 8.0 + (selected ? 1.0 : (isSuggestion ? 0.0 : 1.0)), + : Border.all(color: borderColor, width: 1.0), ), + padding: EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0), child: Row( spacing: 8.0, mainAxisSize: .min, children: [ FlowIcon(tag.icon, colorScheme: colorScheme, size: 16.0), Text(tag.title, style: context.textTheme.labelLarge), - if (isSuggestion) - Icon( - Symbols.add_rounded, - size: 16.0, - color: context.colorScheme.outline, - ), ], ), ), ); - return childn; + if (isSuggestion) { + return Badge( + label: Icon(Symbols.star_rounded, color: context.colorScheme.onPrimary), + backgroundColor: context.colorScheme.primary, + child: Opacity(opacity: .7, child: child), + ); + } + + return child; } } diff --git a/pubspec.yaml b/pubspec.yaml index 8504dd5b..f3a55cee 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: A personal finance managing app publish_to: "none" # Remove this line if you wish to publish to pub.dev -version: "0.19.0+323" +version: "0.19.0+324" environment: sdk: ">=3.10.0 <4.0.0" From 95db7a49557039b8b4d9ea4c7011a11cf14b18f2 Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Sun, 15 Feb 2026 15:46:33 +0800 Subject: [PATCH 17/21] update changelog --- CHANGELOG.md | 2 +- lib/routes/transaction_page.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d41f77ea..312a7a61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ ### New features -* Added a Siri integration (intent). +* Added a Siri integration (intent), fix [#657](https://github.com/flow-mn/flow/issues/657) * Persian (Iran) support thanks to @arefbhrn[https://github.com/arefbhrn] * Location tags are suggested if you're within 50m of the tag. Requires location to be enabled. Closes [#648](https://github.com/flow-mn/flow/issues/648) diff --git a/lib/routes/transaction_page.dart b/lib/routes/transaction_page.dart index f74cbe63..e292fc38 100644 --- a/lib/routes/transaction_page.dart +++ b/lib/routes/transaction_page.dart @@ -855,7 +855,7 @@ class _TransactionPageState extends State { } Future selectCategory([bool fromAutomatedFlow = false]) async { - final categories = CategoriesProvider.of(context).categories; + final List categories = CategoriesProvider.of(context).categories; if (fromAutomatedFlow && categories.isEmpty) { return true; From 452f8393f926fbc4921d13a6265410912dd200f2 Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Tue, 17 Feb 2026 21:15:41 +0800 Subject: [PATCH 18/21] fix #666, show pending group sum/count --- CHANGELOG.md | 2 + assets/l10n/ar.json | 8 +- assets/l10n/cs_CZ.json | 8 +- assets/l10n/de_DE.json | 8 +- assets/l10n/en.json | 8 +- assets/l10n/es_ES.json | 8 +- assets/l10n/fa_IR.json | 8 +- assets/l10n/fr_FR.json | 8 +- assets/l10n/it_IT.json | 8 +- assets/l10n/mn_MN.json | 8 +- assets/l10n/ru_RU.json | 8 +- assets/l10n/tr_TR.json | 8 +- assets/l10n/uk_UA.json | 8 +- .../pending_time_range.dart | 126 ++++++++++++++++++ lib/entity/user_preferences.dart | 11 ++ lib/entity/user_preferences.g.dart | 4 + lib/graceful_migrations.dart | 47 +++++++ lib/objectbox/objectbox-model.json | 7 +- lib/objectbox/objectbox.g.dart | 27 +++- lib/routes/home/home_tab.dart | 38 +++--- ...pending_transactions_preferences_page.dart | 44 +++--- .../sections/tags_section.dart | 3 - lib/services/notifications.dart | 1 + lib/services/sync.dart | 1 - lib/services/user_preferences.dart | 12 ++ lib/utils/time_and_range.dart | 6 + ...euled_notification_permission_builder.dart | 9 +- lib/widgets/transactions_date_header.dart | 42 +++--- macos/Podfile.lock | 6 + 29 files changed, 399 insertions(+), 83 deletions(-) create mode 100644 lib/data/transactions_filter/pending_time_range.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 312a7a61..54d1be54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ ### Changes * Added an option to show/hide external source (Eny, Siri) in transactions +* Enhanced home tab pending transactions timeframe options, closes [#666](https://github.com/flow-mn/flow/issues/666) +* Home tab pending transaction group now shows sum and count of transactions ### Fixes diff --git a/assets/l10n/ar.json b/assets/l10n/ar.json index 98ffc668..7e9da657 100644 --- a/assets/l10n/ar.json +++ b/assets/l10n/ar.json @@ -125,6 +125,12 @@ "enum.PDFHeader@category": "الفئة", "enum.PDFHeader@title": "العنوان", "enum.PDFHeader@transactionDate": "تاريخ المعاملة", + "enum.PendingTimeRange@allTime": "كل الأوقات", + "enum.PendingTimeRange@followHome": "كما في المنزل", + "enum.PendingTimeRange@nextNDays": "الأيام الـ{n} القادمة", + "enum.PendingTimeRange@thisMonth": "هذا الشهر", + "enum.PendingTimeRange@thisWeek": "هذا الأسبوع", + "enum.PendingTimeRange@thisYear": "هذا العام", "enum.RecurrenceMode@custom": "مخصص", "enum.RecurrenceMode@every2Week": "كل أسبوعين، {weekday}", "enum.RecurrenceMode@everyDay": "كل يوم", @@ -242,7 +248,7 @@ "general.edit": "تحرير", "general.enabled": "مُفعّل", "general.flow": "Flow", - "general.nextNDays": "الأيام القادمة {}", + "general.nextNDays": "الأيام القادمة {n}", "general.paste": "لصق", "general.save": "حفظ", "general.search": "ابحث...", diff --git a/assets/l10n/cs_CZ.json b/assets/l10n/cs_CZ.json index 4bc53c1b..e9cc0741 100644 --- a/assets/l10n/cs_CZ.json +++ b/assets/l10n/cs_CZ.json @@ -125,6 +125,12 @@ "enum.PDFHeader@category": "Kategorie", "enum.PDFHeader@title": "Název", "enum.PDFHeader@transactionDate": "Datum transakce", + "enum.PendingTimeRange@allTime": "Celkově", + "enum.PendingTimeRange@followHome": "Stejné jako doma", + "enum.PendingTimeRange@nextNDays": "Následujících {n} dní", + "enum.PendingTimeRange@thisMonth": "Tento měsíc", + "enum.PendingTimeRange@thisWeek": "Tento týden", + "enum.PendingTimeRange@thisYear": "Tento rok", "enum.RecurrenceMode@custom": "Vlastní", "enum.RecurrenceMode@every2Week": "Každé 2 týdny, v {weekday}", "enum.RecurrenceMode@everyDay": "Každý den", @@ -242,7 +248,7 @@ "general.edit": "Upravit", "general.enabled": "Zapnuto", "general.flow": "Tok", - "general.nextNDays": "Dalších {count} dní", + "general.nextNDays": "Dalších {n} dní", "general.paste": "Vložit", "general.save": "Uložit", "general.search": "Hledat...", diff --git a/assets/l10n/de_DE.json b/assets/l10n/de_DE.json index 9f62bcb1..c465451e 100644 --- a/assets/l10n/de_DE.json +++ b/assets/l10n/de_DE.json @@ -125,6 +125,12 @@ "enum.PDFHeader@category": "Kategorie", "enum.PDFHeader@title": "Titel", "enum.PDFHeader@transactionDate": "Buchungsdatum", + "enum.PendingTimeRange@allTime": "Gesamter Zeitraum", + "enum.PendingTimeRange@followHome": "Wie zu Hause", + "enum.PendingTimeRange@nextNDays": "Nächste {n} Tage", + "enum.PendingTimeRange@thisMonth": "Diesen Monat", + "enum.PendingTimeRange@thisWeek": "Diese Woche", + "enum.PendingTimeRange@thisYear": "Dieses Jahr", "enum.RecurrenceMode@custom": "Benutzerdefiniert", "enum.RecurrenceMode@every2Week": "Alle 2 Wochen, {weekday}", "enum.RecurrenceMode@everyDay": "Jeden Tag", @@ -242,7 +248,7 @@ "general.edit": "Bearbeiten", "general.enabled": "Aktiviert", "general.flow": "Flow", - "general.nextNDays": "Die nächsten {} Tag(e)", + "general.nextNDays": "Die nächsten {n} Tag(e)", "general.paste": "Einfügen", "general.save": "Speichern", "general.search": "Suchen...", diff --git a/assets/l10n/en.json b/assets/l10n/en.json index 484b216a..77653671 100644 --- a/assets/l10n/en.json +++ b/assets/l10n/en.json @@ -125,6 +125,12 @@ "enum.PDFHeader@category": "Category", "enum.PDFHeader@title": "Title", "enum.PDFHeader@transactionDate": "Transaction date", + "enum.PendingTimeRange@allTime": "All time", + "enum.PendingTimeRange@followHome": "Same as home", + "enum.PendingTimeRange@nextNDays": "Next {n} days", + "enum.PendingTimeRange@thisMonth": "This month", + "enum.PendingTimeRange@thisWeek": "This week", + "enum.PendingTimeRange@thisYear": "This year", "enum.RecurrenceMode@custom": "Custom", "enum.RecurrenceMode@every2Week": "Every 2 weeks, {weekday}", "enum.RecurrenceMode@everyDay": "Every day", @@ -242,7 +248,7 @@ "general.edit": "Edit", "general.enabled": "Enabled", "general.flow": "Flow", - "general.nextNDays": "Next {} day(s)", + "general.nextNDays": "Next {n} day(s)", "general.paste": "Paste", "general.save": "Save", "general.search": "Search...", diff --git a/assets/l10n/es_ES.json b/assets/l10n/es_ES.json index ac603f87..0c49cf76 100644 --- a/assets/l10n/es_ES.json +++ b/assets/l10n/es_ES.json @@ -125,6 +125,12 @@ "enum.PDFHeader@category": "Categoría", "enum.PDFHeader@title": "Título", "enum.PDFHeader@transactionDate": "Fecha de transacción", + "enum.PendingTimeRange@allTime": "Todo el tiempo", + "enum.PendingTimeRange@followHome": "Igual que en Inicio", + "enum.PendingTimeRange@nextNDays": "Próximos {n} días", + "enum.PendingTimeRange@thisMonth": "Este mes", + "enum.PendingTimeRange@thisWeek": "Esta semana", + "enum.PendingTimeRange@thisYear": "Este año", "enum.RecurrenceMode@custom": "Personalizado", "enum.RecurrenceMode@every2Week": "Cada 2 semanas, {weekday}", "enum.RecurrenceMode@everyDay": "Cada día", @@ -242,7 +248,7 @@ "general.edit": "Editar", "general.enabled": "Activado", "general.flow": "Flow", - "general.nextNDays": "Próximos {} día(s)", + "general.nextNDays": "Próximos {n} día(s)", "general.paste": "Pegar", "general.save": "Guardar", "general.search": "Buscar...", diff --git a/assets/l10n/fa_IR.json b/assets/l10n/fa_IR.json index 91b54562..1bcc31d4 100644 --- a/assets/l10n/fa_IR.json +++ b/assets/l10n/fa_IR.json @@ -125,6 +125,12 @@ "enum.PDFHeader@category": "دسته‌بندی", "enum.PDFHeader@title": "عنوان", "enum.PDFHeader@transactionDate": "تاریخ تراکنش", + "enum.PendingTimeRange@allTime": "همه زمان‌ها", + "enum.PendingTimeRange@followHome": "مشابه خانه", + "enum.PendingTimeRange@nextNDays": "{n} روز آینده", + "enum.PendingTimeRange@thisMonth": "این ماه", + "enum.PendingTimeRange@thisWeek": "این هفته", + "enum.PendingTimeRange@thisYear": "امسال", "enum.RecurrenceMode@custom": "سفارشی", "enum.RecurrenceMode@every2Week": "هر ۲ هفته، {weekday}", "enum.RecurrenceMode@everyDay": "هر روز", @@ -242,7 +248,7 @@ "general.edit": "ویرایش", "general.enabled": "فعال", "general.flow": "Flow", - "general.nextNDays": "{} روز آینده", + "general.nextNDays": "{n} روز آینده", "general.paste": "چسباندن", "general.save": "ذخیره", "general.search": "جستجو...", diff --git a/assets/l10n/fr_FR.json b/assets/l10n/fr_FR.json index b388192e..3e2b41be 100644 --- a/assets/l10n/fr_FR.json +++ b/assets/l10n/fr_FR.json @@ -125,6 +125,12 @@ "enum.PDFHeader@category": "Catégorie", "enum.PDFHeader@title": "Titre", "enum.PDFHeader@transactionDate": "Date de transaction", + "enum.PendingTimeRange@allTime": "Toutes les périodes", + "enum.PendingTimeRange@followHome": "Identique à l'accueil", + "enum.PendingTimeRange@nextNDays": "Prochains {n} jours", + "enum.PendingTimeRange@thisMonth": "Ce mois-ci", + "enum.PendingTimeRange@thisWeek": "Cette semaine", + "enum.PendingTimeRange@thisYear": "Cette année", "enum.RecurrenceMode@custom": "Personnalisé", "enum.RecurrenceMode@every2Week": "Toutes les 2 semaines, {weekday}", "enum.RecurrenceMode@everyDay": "Tous les jours", @@ -242,7 +248,7 @@ "general.edit": "Modifier", "general.enabled": "Activé", "general.flow": "Flow", - "general.nextNDays": "Prochain(s) {} jour(s)", + "general.nextNDays": "Prochain(s) {n} jour(s)", "general.paste": "Coller", "general.save": "Enregistrer", "general.search": "Rechercher...", diff --git a/assets/l10n/it_IT.json b/assets/l10n/it_IT.json index a19dd1ab..e8de6fe8 100644 --- a/assets/l10n/it_IT.json +++ b/assets/l10n/it_IT.json @@ -125,6 +125,12 @@ "enum.PDFHeader@category": "Categoria", "enum.PDFHeader@title": "Titolo", "enum.PDFHeader@transactionDate": "Data transazione", + "enum.PendingTimeRange@allTime": "Tutto il periodo", + "enum.PendingTimeRange@followHome": "Come nella home", + "enum.PendingTimeRange@nextNDays": "Prossimi {n} giorni", + "enum.PendingTimeRange@thisMonth": "Questo mese", + "enum.PendingTimeRange@thisWeek": "Questa settimana", + "enum.PendingTimeRange@thisYear": "Quest'anno", "enum.RecurrenceMode@custom": "Personalizzata", "enum.RecurrenceMode@every2Week": "Ogni 2 settimane, {weekday}", "enum.RecurrenceMode@everyDay": "Ogni giorno", @@ -242,7 +248,7 @@ "general.edit": "Modifica", "general.enabled": "Abilitato", "general.flow": "Flusso", - "general.nextNDays": "Prossimi {} giorni", + "general.nextNDays": "Prossimi {n} giorni", "general.paste": "Incolla", "general.save": "Salva", "general.search": "Cerca...", diff --git a/assets/l10n/mn_MN.json b/assets/l10n/mn_MN.json index f7cbc2e4..0e8635d9 100644 --- a/assets/l10n/mn_MN.json +++ b/assets/l10n/mn_MN.json @@ -125,6 +125,12 @@ "enum.PDFHeader@category": "Ангилал", "enum.PDFHeader@title": "Гарчиг", "enum.PDFHeader@transactionDate": "Гүйлгээний огноо", + "enum.PendingTimeRange@allTime": "Бүх цаг үе", + "enum.PendingTimeRange@followHome": "Нүүр хуудасны тохиргоог дагах", + "enum.PendingTimeRange@nextNDays": "Ирэх {n} хоног", + "enum.PendingTimeRange@thisMonth": "Энэ сар", + "enum.PendingTimeRange@thisWeek": "Энэ долоо хоног", + "enum.PendingTimeRange@thisYear": "Энэ жил", "enum.RecurrenceMode@custom": "Өөрөө тохируулах", "enum.RecurrenceMode@every2Week": "Хоёр долоо хоног бүр, {weekday}", "enum.RecurrenceMode@everyDay": "Өдөр бүр", @@ -242,7 +248,7 @@ "general.edit": "Засварлах", "general.enabled": "Идэвхтэй", "general.flow": "Урсгал", - "general.nextNDays": "Ирэх {} хоног", + "general.nextNDays": "Ирэх {n} хоног", "general.paste": "Буулгах", "general.save": "Хадгалах", "general.search": "Хайх...", diff --git a/assets/l10n/ru_RU.json b/assets/l10n/ru_RU.json index 72aa8367..1bb91adc 100644 --- a/assets/l10n/ru_RU.json +++ b/assets/l10n/ru_RU.json @@ -125,6 +125,12 @@ "enum.PDFHeader@category": "Категория", "enum.PDFHeader@title": "Название", "enum.PDFHeader@transactionDate": "Дата транзакции", + "enum.PendingTimeRange@allTime": "Всё время", + "enum.PendingTimeRange@followHome": "Как для дома", + "enum.PendingTimeRange@nextNDays": "Следующие {n} дней", + "enum.PendingTimeRange@thisMonth": "В этом месяце", + "enum.PendingTimeRange@thisWeek": "На этой неделе", + "enum.PendingTimeRange@thisYear": "В этом году", "enum.RecurrenceMode@custom": "Пользовательский", "enum.RecurrenceMode@every2Week": "Каждые 2 недели, {weekday}", "enum.RecurrenceMode@everyDay": "Каждый день", @@ -242,7 +248,7 @@ "general.edit": "Редактировать", "general.enabled": "Включено", "general.flow": "Flow", - "general.nextNDays": "Следующие {} дн.", + "general.nextNDays": "Следующие {n} дн.", "general.paste": "Вставить", "general.save": "Сохранить", "general.search": "Поиск...", diff --git a/assets/l10n/tr_TR.json b/assets/l10n/tr_TR.json index 240c9be9..de5331d3 100644 --- a/assets/l10n/tr_TR.json +++ b/assets/l10n/tr_TR.json @@ -125,6 +125,12 @@ "enum.PDFHeader@category": "Kategori", "enum.PDFHeader@title": "Başlık", "enum.PDFHeader@transactionDate": "İşlem tarihi", + "enum.PendingTimeRange@allTime": "Tüm zamanlar", + "enum.PendingTimeRange@followHome": "Ev ile aynı", + "enum.PendingTimeRange@nextNDays": "Gelecek {n} gün", + "enum.PendingTimeRange@thisMonth": "Bu ay", + "enum.PendingTimeRange@thisWeek": "Bu hafta", + "enum.PendingTimeRange@thisYear": "Bu yıl", "enum.RecurrenceMode@custom": "Özel", "enum.RecurrenceMode@every2Week": "Her 2 haftada bir, {weekday}", "enum.RecurrenceMode@everyDay": "Her gün", @@ -242,7 +248,7 @@ "general.edit": "Düzenlemek", "general.enabled": "Etkin", "general.flow": "Akış", - "general.nextNDays": "Sonraki {} gün", + "general.nextNDays": "Sonraki {n} gün", "general.paste": "Yapıştır", "general.save": "Kaydetmek", "general.search": "Ara...", diff --git a/assets/l10n/uk_UA.json b/assets/l10n/uk_UA.json index 8877a517..3935894d 100644 --- a/assets/l10n/uk_UA.json +++ b/assets/l10n/uk_UA.json @@ -125,6 +125,12 @@ "enum.PDFHeader@category": "Категорія", "enum.PDFHeader@title": "Назва", "enum.PDFHeader@transactionDate": "Дата транзакції", + "enum.PendingTimeRange@allTime": "За весь час", + "enum.PendingTimeRange@followHome": "Як удома", + "enum.PendingTimeRange@nextNDays": "Наступні {n} днів", + "enum.PendingTimeRange@thisMonth": "Цього місяця", + "enum.PendingTimeRange@thisWeek": "Цього тижня", + "enum.PendingTimeRange@thisYear": "Цього року", "enum.RecurrenceMode@custom": "Користувацький", "enum.RecurrenceMode@every2Week": "Кожні 2 тижні, {weekday}", "enum.RecurrenceMode@everyDay": "Щодня", @@ -242,7 +248,7 @@ "general.edit": "Редагувати", "general.enabled": "Увімкнено", "general.flow": "Flow", - "general.nextNDays": "Наступні {} дн.", + "general.nextNDays": "Наступні {n} дн.", "general.paste": "Вставити", "general.save": "Зберегти", "general.search": "Пошук...", diff --git a/lib/data/transactions_filter/pending_time_range.dart b/lib/data/transactions_filter/pending_time_range.dart new file mode 100644 index 00000000..b2ed5244 --- /dev/null +++ b/lib/data/transactions_filter/pending_time_range.dart @@ -0,0 +1,126 @@ +import "package:flow/l10n/named_enum.dart"; +import "package:flow/utils/time_and_range.dart"; +import "package:moment_dart/moment_dart.dart"; + +class PendingTimeRange with LocalizedEnum { + final String value; + final Duration? futureDuration; + + static const List presets = [ + PendingTimeRange.followHome(), + PendingTimeRange.duration(Duration(days: 3)), + PendingTimeRange.duration(Duration(days: 7)), + PendingTimeRange.duration(Duration(days: 14)), + PendingTimeRange.duration(Duration(days: 30)), + PendingTimeRange.duration(Duration(days: 60)), + PendingTimeRange.thisWeek(), + PendingTimeRange.thisMonth(), + PendingTimeRange.thisYear(), + PendingTimeRange.allTime(), + ]; + + factory PendingTimeRange._normalized( + String? value, + Duration? futureDuration, + ) { + if (value == "nextNDays") { + if (futureDuration == null) { + throw ArgumentError( + "futureDuration must be provided for nextNDays preset", + ); + } + return PendingTimeRange.duration(futureDuration); + } + + switch (value) { + case "followHome": + return const PendingTimeRange.followHome(); + case "thisWeek": + return const PendingTimeRange.thisWeek(); + case "thisMonth": + return const PendingTimeRange.thisMonth(); + case "thisYear": + return const PendingTimeRange.thisYear(); + case "allTime": + return const PendingTimeRange.allTime(); + default: + throw ArgumentError("Invalid value for PendingTimeRange: $value"); + } + } + + const PendingTimeRange._(this.value, {this.futureDuration}); + const PendingTimeRange.duration(this.futureDuration) : value = "nextNDays"; + const PendingTimeRange.followHome() : this._("followHome"); + const PendingTimeRange.thisWeek() : this._("thisWeek"); + const PendingTimeRange.thisMonth() : this._("thisMonth"); + const PendingTimeRange.thisYear() : this._("thisYear"); + const PendingTimeRange.allTime() : this._("allTime"); + + @override + String toString() { + if (value == "nextNDays") { + return (futureDuration ?? Duration.zero).abs().inSeconds.toRadixString( + 36, + ); + } + + return value; + } + + static PendingTimeRange? tryParse(String? value) { + if (value == null) return null; + + if (value == "followHome") return const PendingTimeRange.followHome(); + if (value == "thisWeek") return const PendingTimeRange.thisWeek(); + if (value == "thisMonth") return const PendingTimeRange.thisMonth(); + if (value == "thisYear") return const PendingTimeRange.thisYear(); + if (value == "allTime") return const PendingTimeRange.allTime(); + + try { + final int seconds = int.parse(value, radix: 36); + return PendingTimeRange.duration(Duration(seconds: seconds)); + } catch (_) { + return null; + } + } + + /// Throws [FormatException] if the value is not valid + static PendingTimeRange parse(String value) { + return tryParse(value) ?? + (throw FormatException("Invalid PendingTimeRangePreset value: $value")); + } + + PendingTimeRange copyWith({String? value, Duration? futureDuration}) { + return PendingTimeRange._normalized( + value ?? this.value, + futureDuration ?? this.futureDuration, + ); + } + + @override + String get localizationEnumName => "PendingTimeRange"; + + @override + String get localizationEnumValue => value; + + @override + bool operator ==(Object other) { + if (other is! PendingTimeRange) return false; + if (identical(this, other)) return true; + + return value == other.value && futureDuration == other.futureDuration; + } + + @override + int get hashCode => Object.hash(value, futureDuration); + + TimeRange range({TimeRange? homeTimeRange}) => switch (value) { + "nextNDays" => nextNDaysRange(futureDuration?.inDays ?? 0), + "thisWeek" => TimeRange.thisLocalWeek(), + "thisMonth" => TimeRange.thisMonth(), + "thisYear" => TimeRange.thisYear(), + "allTime" => TimeRange.allTime(), + "followHome" when homeTimeRange != null => homeTimeRange, + _ => nextNDaysRange(7), + }; +} diff --git a/lib/entity/user_preferences.dart b/lib/entity/user_preferences.dart index 3eb5b78e..5cc60a08 100644 --- a/lib/entity/user_preferences.dart +++ b/lib/entity/user_preferences.dart @@ -1,5 +1,6 @@ import "package:flow/data/flow_button_type.dart"; import "package:flow/data/prefs/change_visuals.dart"; +import "package:flow/data/transactions_filter/pending_time_range.dart"; import "package:flow/entity/_base.dart"; import "package:flow/entity/user_preferences/transaction_entry_flow.dart"; import "package:flow/utils/json/utc_datetime_converter.dart"; @@ -41,6 +42,15 @@ class UserPreferences implements EntityBase { /// Le UUID of it String? defaultFilterPreset; + String? homePendingTransactionsTimeRangeSerialized; + + /// The time range for the home pending transactions list + /// + /// If null, the default time range is used + PendingTimeRange get homePendingTransactionsTimeRange => + PendingTimeRange.tryParse(homePendingTransactionsTimeRangeSerialized) ?? + PendingTimeRange.duration(Duration(days: 7)); + /// It's a added to a start of the day /// /// e.g., to set a daily reminder at 9:00 AM, set it to 9 hours @@ -170,6 +180,7 @@ class UserPreferences implements EntityBase { this.privacyModeUponShaking = false, this.trashBinRetentionDays = 30, this.defaultFilterPreset, + this.homePendingTransactionsTimeRangeSerialized, this.enableICloudSync = false, this.iCloudBackupsToKeep = 10, this.autoBackupIntervalInHours = 72, diff --git a/lib/entity/user_preferences.g.dart b/lib/entity/user_preferences.g.dart index 2d492d71..1d5675d5 100644 --- a/lib/entity/user_preferences.g.dart +++ b/lib/entity/user_preferences.g.dart @@ -31,6 +31,8 @@ UserPreferences _$UserPreferencesFromJson(Map json) => trashBinRetentionDays: (json['trashBinRetentionDays'] as num?)?.toInt() ?? 30, defaultFilterPreset: json['defaultFilterPreset'] as String?, + homePendingTransactionsTimeRangeSerialized: + json['homePendingTransactionsTimeRangeSerialized'] as String?, enableICloudSync: json['enableICloudSync'] as bool? ?? false, iCloudBackupsToKeep: (json['iCloudBackupsToKeep'] as num?)?.toInt() ?? 10, @@ -59,6 +61,8 @@ Map _$UserPreferencesToJson( 'excludeTransfersFromFlow': instance.excludeTransfersFromFlow, 'trashBinRetentionDays': instance.trashBinRetentionDays, 'defaultFilterPreset': instance.defaultFilterPreset, + 'homePendingTransactionsTimeRangeSerialized': + instance.homePendingTransactionsTimeRangeSerialized, 'remindDailyAtRelativeSeconds': instance.remindDailyAtRelativeSeconds, 'useCategoryNameForUntitledTransactions': instance.useCategoryNameForUntitledTransactions, diff --git a/lib/graceful_migrations.dart b/lib/graceful_migrations.dart index 40a761a8..19b554a7 100644 --- a/lib/graceful_migrations.dart +++ b/lib/graceful_migrations.dart @@ -1,4 +1,5 @@ import "package:flow/data/transaction_filter.dart"; +import "package:flow/data/transactions_filter/pending_time_range.dart"; import "package:flow/entity/transaction.dart"; import "package:flow/entity/transaction/extensions/default/geo.dart"; import "package:flow/l10n/flow_localizations.dart"; @@ -263,3 +264,49 @@ void migrateGeoExtensionToLocation() async { ); } } + +void migrateHomePendingTransactionsRange() async { + const String migrationUuid = "2130fe7d-6cdc-45c2-9632-56ba9de56c08"; + + try { + final SharedPreferencesWithCache prefs = + await SharedPreferencesWithCache.create( + cacheOptions: SharedPreferencesWithCacheOptions(), + ); + + final ok = prefs.getString("flow.migration.$migrationUuid"); + + if (ok != null) return; + + try { + final int? old = LocalPreferences().pendingTransactions.homeTimeframe + .get(); + + if (old != null) { + final PendingTimeRange newRange = PendingTimeRange.duration( + Duration(days: old.abs()), + ); + + UserPreferencesService().homePendingTransactionsTimeRange = newRange; + } else { + UserPreferencesService().homePendingTransactionsTimeRange = + PendingTimeRange.followHome(); + } + + await prefs.setString("flow.migration.$migrationUuid", "ok"); + _log.info( + "Migrated home pending transactions range for migration $migrationUuid", + ); + } catch (e) { + _log.warning( + "Failed to migrate home pending transactions range for migration $migrationUuid", + e, + ); + } + } catch (e) { + _log.warning( + "Failed to read migration status for migration $migrationUuid", + e, + ); + } +} diff --git a/lib/objectbox/objectbox-model.json b/lib/objectbox/objectbox-model.json index 06509ff8..e17bce61 100644 --- a/lib/objectbox/objectbox-model.json +++ b/lib/objectbox/objectbox-model.json @@ -362,7 +362,7 @@ }, { "id": "10:7829328581176695647", - "lastPropertyId": "29:4843097333162455732", + "lastPropertyId": "30:5353888497210708730", "name": "UserPreferences", "properties": [ { @@ -502,6 +502,11 @@ "id": "29:4843097333162455732", "name": "transactionListTileShowExternalSource", "type": 1 + }, + { + "id": "30:5353888497210708730", + "name": "homePendingTransactionsTimeRangeSerialized", + "type": 9 } ], "relations": [] diff --git a/lib/objectbox/objectbox.g.dart b/lib/objectbox/objectbox.g.dart index e2d36470..c65d886f 100644 --- a/lib/objectbox/objectbox.g.dart +++ b/lib/objectbox/objectbox.g.dart @@ -455,7 +455,7 @@ final _entities = [ obx_int.ModelEntity( id: const obx_int.IdUid(10, 7829328581176695647), name: 'UserPreferences', - lastPropertyId: const obx_int.IdUid(29, 4843097333162455732), + lastPropertyId: const obx_int.IdUid(30, 5353888497210708730), flags: 0, properties: [ obx_int.ModelProperty( @@ -621,6 +621,12 @@ final _entities = [ type: 1, flags: 0, ), + obx_int.ModelProperty( + id: const obx_int.IdUid(30, 5353888497210708730), + name: 'homePendingTransactionsTimeRangeSerialized', + type: 9, + flags: 0, + ), ], relations: [], backlinks: [], @@ -1640,7 +1646,13 @@ obx_int.ModelDefinition getObjectBoxModel() { final primaryAccountUuidOffset = object.primaryAccountUuid == null ? null : fbb.writeString(object.primaryAccountUuid!); - fbb.startTable(30); + final homePendingTransactionsTimeRangeSerializedOffset = + object.homePendingTransactionsTimeRangeSerialized == null + ? null + : fbb.writeString( + object.homePendingTransactionsTimeRangeSerialized!, + ); + fbb.startTable(31); fbb.addInt64(0, object.id); fbb.addOffset(1, uuidOffset); fbb.addBool(2, object.combineTransfers); @@ -1668,6 +1680,7 @@ obx_int.ModelDefinition getObjectBoxModel() { fbb.addBool(26, object.privacyModeUponLaunch); fbb.addBool(27, object.privacyModeUponShaking); fbb.addBool(28, object.transactionListTileShowExternalSource); + fbb.addOffset(29, homePendingTransactionsTimeRangeSerializedOffset); fbb.finish(fbb.endTable()); return object.id; }, @@ -1723,6 +1736,10 @@ obx_int.ModelDefinition getObjectBoxModel() { final defaultFilterPresetParam = const fb.StringReader( asciiOptimization: true, ).vTableGetNullable(buffer, rootOffset, 12); + final homePendingTransactionsTimeRangeSerializedParam = + const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 62); final enableICloudSyncParam = const fb.BoolReader().vTableGet( buffer, rootOffset, @@ -1781,6 +1798,8 @@ obx_int.ModelDefinition getObjectBoxModel() { privacyModeUponShaking: privacyModeUponShakingParam, trashBinRetentionDays: trashBinRetentionDaysParam, defaultFilterPreset: defaultFilterPresetParam, + homePendingTransactionsTimeRangeSerialized: + homePendingTransactionsTimeRangeSerializedParam, enableICloudSync: enableICloudSyncParam, iCloudBackupsToKeep: iCloudBackupsToKeepParam, autoBackupIntervalInHours: autoBackupIntervalInHoursParam, @@ -2654,6 +2673,10 @@ class UserPreferences_ { /// See [UserPreferences.transactionListTileShowExternalSource]. static final transactionListTileShowExternalSource = obx.QueryBooleanProperty(_entities[6].properties[26]); + + /// See [UserPreferences.homePendingTransactionsTimeRangeSerialized]. + static final homePendingTransactionsTimeRangeSerialized = + obx.QueryStringProperty(_entities[6].properties[27]); } /// [Budget] entity fields to define ObjectBox queries. diff --git a/lib/routes/home/home_tab.dart b/lib/routes/home/home_tab.dart index 08ec19fe..0c116a34 100644 --- a/lib/routes/home/home_tab.dart +++ b/lib/routes/home/home_tab.dart @@ -4,6 +4,7 @@ import "package:flow/data/actionable_nofications/actionable_notification.dart"; import "package:flow/data/exchange_rates.dart"; import "package:flow/data/single_currency_flow.dart"; import "package:flow/data/transaction_filter.dart"; +import "package:flow/data/transactions_filter/pending_time_range.dart"; import "package:flow/data/transactions_filter/time_range.dart"; import "package:flow/entity/transaction.dart"; import "package:flow/entity/transaction_filter_preset.dart"; @@ -43,7 +44,7 @@ class _HomeTabState extends State with AutomaticKeepAliveClientMixin { late final AppLifecycleListener _listener; late final Timer _timer; - late int _plannedTransactionsNextNDays; + late PendingTimeRange _plannedTransactionsTimeRange; late TransactionFilter defaultFilter; DateTime dateKey = Moment.startOfToday(); @@ -53,19 +54,17 @@ class _HomeTabState extends State with AutomaticKeepAliveClientMixin { late TransactionFilter currentFilter; TransactionFilter get currentFilterWithPlanned { - final DateTime plannedTransactionTo = Moment.now() - .add(Duration(days: _plannedTransactionsNextNDays)) - .startOfNextDay(); - final TimeRange? timeRange = currentFilter.range?.range; + final TimeRange plannedTranasctionsTimeRange = _plannedTransactionsTimeRange + .range(homeTimeRange: timeRange); if (timeRange != null && timeRange.contains(Moment.now()) && - !timeRange.contains(plannedTransactionTo)) { + !timeRange.contains(plannedTranasctionsTimeRange.to)) { return currentFilter.copyWithOptional( range: Optional( TransactionFilterTimeRange.fromTimeRange( - CustomTimeRange(timeRange.from, plannedTransactionTo), + CustomTimeRange(timeRange.from, plannedTranasctionsTimeRange.to), ), ), ); @@ -80,9 +79,6 @@ class _HomeTabState extends State with AutomaticKeepAliveClientMixin { void initState() { super.initState(); _updatePlannedTransactionDays(); - LocalPreferences().pendingTransactions.homeTimeframe.addListener( - _updatePlannedTransactionDays, - ); _rawUpdateDefaultFilter(); @@ -98,6 +94,9 @@ class _HomeTabState extends State with AutomaticKeepAliveClientMixin { ); UserPreferencesService().valueNotifier.addListener(_rawUpdateDefaultFilter); + UserPreferencesService().valueNotifier.addListener( + _updatePlannedTransactionDays, + ); ActionableNotificationsService().notifications.addListener( _updateActionableNotification, ); @@ -109,13 +108,13 @@ class _HomeTabState extends State with AutomaticKeepAliveClientMixin { @override void dispose() { _listener.dispose(); - LocalPreferences().pendingTransactions.homeTimeframe.removeListener( - _updatePlannedTransactionDays, - ); _timer.cancel(); UserPreferencesService().valueNotifier.removeListener( _rawUpdateDefaultFilter, ); + UserPreferencesService().valueNotifier.removeListener( + _updatePlannedTransactionDays, + ); ActionableNotificationsService().notifications.removeListener( _updateActionableNotification, ); @@ -139,16 +138,16 @@ class _HomeTabState extends State with AutomaticKeepAliveClientMixin { ), builder: (context, snapshot) { final DateTime now = Moment.now().startOfNextMinute(); - final DateTime cutoffPlanned = now - .add(Duration(days: _plannedTransactionsNextNDays)) - .startOfNextDay(); + final TimeRange cutoffPlanned = _plannedTransactionsTimeRange.range( + homeTimeRange: currentFilter.range?.range, + ); final List? transactions = snapshot.data; if (currentFilter.range?.range?.contains(now) == true) { transactions?.removeWhere((transaction) { if (transaction.transactionDate <= now) return false; - return transaction.transactionDate > cutoffPlanned; + return transaction.transactionDate > cutoffPlanned.to; }); } @@ -336,9 +335,8 @@ class _HomeTabState extends State with AutomaticKeepAliveClientMixin { } void _updatePlannedTransactionDays() { - _plannedTransactionsNextNDays = - LocalPreferences().pendingTransactions.homeTimeframe.get() ?? - PendingTransactionsLocalPreferences.homeTimeframeDefault; + _plannedTransactionsTimeRange = + UserPreferencesService().homePendingTransactionsTimeRange; setState(() {}); } diff --git a/lib/routes/preferences/pending_transactions_preferences_page.dart b/lib/routes/preferences/pending_transactions_preferences_page.dart index 078a343a..627459ee 100644 --- a/lib/routes/preferences/pending_transactions_preferences_page.dart +++ b/lib/routes/preferences/pending_transactions_preferences_page.dart @@ -1,9 +1,12 @@ import "dart:async"; +import "package:flow/data/transactions_filter/pending_time_range.dart"; import "package:flow/l10n/extensions.dart"; +import "package:flow/l10n/named_enum.dart"; import "package:flow/prefs/local_preferences.dart"; import "package:flow/services/notifications.dart"; import "package:flow/services/transactions.dart"; +import "package:flow/services/user_preferences.dart"; import "package:flow/widgets/general/frame.dart"; import "package:flow/widgets/general/info_text.dart"; import "package:flow/widgets/general/list_header.dart"; @@ -31,9 +34,8 @@ class _PendingTransactionPreferencesPageState @override Widget build(BuildContext context) { - final int pendingTransactionsHomeTimeframe = - LocalPreferences().pendingTransactions.homeTimeframe.get() ?? - PendingTransactionsLocalPreferences.homeTimeframeDefault; + final PendingTimeRange pendingTransactionsHomeTimeframe = + UserPreferencesService().homePendingTransactionsTimeRange; final bool pendingTransactionsRequireConfrimation = LocalPreferences() .pendingTransactions .requireConfrimation @@ -76,24 +78,24 @@ class _PendingTransactionPreferencesPageState child: Wrap( spacing: 12.0, runSpacing: 8.0, - children: [1, 2, 3, 5, 7, 14, 30] - .map( - (value) => FilterChip( - showCheckmark: false, - key: ValueKey(value), - label: Text( - "general.nextNDays".t(context, value), + children: [ + ...PendingTimeRange.presets.map( + (value) => FilterChip( + showCheckmark: false, + key: ValueKey(value), + label: Text( + value.localizedNameContext( + context, + value.futureDuration?.inDays, ), - onSelected: (bool selected) => selected - ? updatePendingTransactionsHomeTimeframe( - value, - ) - : null, - selected: - value == pendingTransactionsHomeTimeframe, ), - ) - .toList(), + onSelected: (bool selected) => selected + ? updatePendingTransactionsHomeTimeframe(value) + : null, + selected: value == pendingTransactionsHomeTimeframe, + ), + ), + ], ), ), const SizedBox(height: 16.0), @@ -219,8 +221,8 @@ class _PendingTransactionPreferencesPageState ); } - void updatePendingTransactionsHomeTimeframe(int days) async { - await LocalPreferences().pendingTransactions.homeTimeframe.set(days); + void updatePendingTransactionsHomeTimeframe(PendingTimeRange newValue) async { + UserPreferencesService().homePendingTransactionsTimeRange = newValue; if (mounted) setState(() {}); } diff --git a/lib/routes/transaction_page/sections/tags_section.dart b/lib/routes/transaction_page/sections/tags_section.dart index 1402cf32..5c4e6d59 100644 --- a/lib/routes/transaction_page/sections/tags_section.dart +++ b/lib/routes/transaction_page/sections/tags_section.dart @@ -38,9 +38,6 @@ class TagsSection extends StatelessWidget { _ => null, }; - print("suggestedGeoTags: $suggestedGeoTags"); - print("location: $location"); - final bool hasSuggestedGeoTags = suggestedGeoTags?.isNotEmpty == true; return Section( diff --git a/lib/services/notifications.dart b/lib/services/notifications.dart index 3438c309..2ddaec38 100644 --- a/lib/services/notifications.dart +++ b/lib/services/notifications.dart @@ -554,6 +554,7 @@ class NotificationsService { return null; } + /// Throws if notifications are not available or permissions are not granted Future _checkSupportAndPermission() async { if (!available) { _log.warning("Notifications not available"); diff --git a/lib/services/sync.dart b/lib/services/sync.dart index 0cdd0d2f..a87dd250 100644 --- a/lib/services/sync.dart +++ b/lib/services/sync.dart @@ -122,7 +122,6 @@ class SyncService { } } - // TODO @sadespresso - enable multi-syncer support Future putToAll( BackupEntry entry, { Function(double)? onProgress, diff --git a/lib/services/user_preferences.dart b/lib/services/user_preferences.dart index dca2b25d..5dcd8e81 100644 --- a/lib/services/user_preferences.dart +++ b/lib/services/user_preferences.dart @@ -5,6 +5,7 @@ import "package:flow/constants.dart"; import "package:flow/data/flow_button_type.dart"; import "package:flow/data/flow_notification_payload.dart"; import "package:flow/data/prefs/change_visuals.dart"; +import "package:flow/data/transactions_filter/pending_time_range.dart"; import "package:flow/entity/account.dart"; import "package:flow/entity/transaction_filter_preset.dart"; import "package:flow/entity/user_preferences.dart"; @@ -68,6 +69,17 @@ class UserPreferencesService { } } + PendingTimeRange get homePendingTransactionsTimeRange => + value.homePendingTransactionsTimeRange; + + set homePendingTransactionsTimeRange( + PendingTimeRange newHomePendingTransactionsTimeRange, + ) { + value.homePendingTransactionsTimeRangeSerialized = + newHomePendingTransactionsTimeRange.toString(); + ObjectBox().box().put(value); + } + ChangeVisuals get changeVisuals { final ChangeVisuals? parsed = ChangeVisuals.tryParse(value.changeVisuals); diff --git a/lib/utils/time_and_range.dart b/lib/utils/time_and_range.dart index b351953b..ce195989 100644 --- a/lib/utils/time_and_range.dart +++ b/lib/utils/time_and_range.dart @@ -72,3 +72,9 @@ CustomTimeRange last30DaysRange([DateTime? anchor]) => (anchor ?? Moment.now()) .subtract(const Duration(days: 29)) .startOfDay() .rangeTo(Moment.endOfToday()); + +CustomTimeRange nextNDaysRange(int n, [DateTime? anchor]) => + (anchor ?? Moment.now()) + .add(Duration(days: n - 1)) + .startOfDay() + .rangeTo(Moment.endOfToday()); diff --git a/lib/widgets/schdeuled_notification_permission_builder.dart b/lib/widgets/schdeuled_notification_permission_builder.dart index 4e2b5aa0..d3a7d4a2 100644 --- a/lib/widgets/schdeuled_notification_permission_builder.dart +++ b/lib/widgets/schdeuled_notification_permission_builder.dart @@ -79,7 +79,14 @@ class _SchdeuledNotificationPermissionBuilderState Future _checkNotificationPermission() async { try { - _hasNotificationPermission = await Permission.notification.isGranted; + if (Platform.isLinux) { + _hasNotificationPermission = false; + } else if (Platform.isMacOS) { + _hasNotificationPermission = + (await NotificationsService().hasPermissions()) ?? false; + } else { + _hasNotificationPermission = await Permission.notification.isGranted; + } } finally { if (mounted) { setState(() {}); diff --git a/lib/widgets/transactions_date_header.dart b/lib/widgets/transactions_date_header.dart index 5a7d5995..2a5dbf55 100644 --- a/lib/widgets/transactions_date_header.dart +++ b/lib/widgets/transactions_date_header.dart @@ -134,31 +134,29 @@ class _TransactionListDateHeaderState extends State { style: context.textTheme.headlineSmall!, child: title, ), - if (!widget.pendingGroup) - // - MoneyTextBuilder( - builder: (context, formattedSum, originalSum) => RichText( - text: TextSpan( - style: context.textTheme.labelMedium, - children: [ - TextSpan( - text: "$formattedSum$exclamation", - style: showMissingExchangeRatesWarning - ? TextStyle(color: context.colorScheme.error) - : null, + MoneyTextBuilder( + builder: (context, formattedSum, originalSum) => RichText( + text: TextSpan( + style: context.textTheme.labelMedium, + children: [ + TextSpan( + text: "$formattedSum$exclamation", + style: showMissingExchangeRatesWarning + ? TextStyle(color: context.colorScheme.error) + : null, + ), + TextSpan(text: " • "), + TextSpan( + text: "tabs.home.transactionsCount".t( + context, + widget.transactions.renderableCount, ), - TextSpan(text: " • "), - TextSpan( - text: "tabs.home.transactionsCount".t( - context, - widget.transactions.renderableCount, - ), - ), - ], - ), + ), + ], ), - money: mergedFlow.totalFlow, ), + money: mergedFlow.totalFlow, + ), ], ), ), diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 3dc65f72..dfb79dc3 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -11,6 +11,8 @@ PODS: - FlutterMacOS - file_selector_macos (0.0.1): - FlutterMacOS + - flutter_app_group_directory (0.0.1): + - FlutterMacOS - flutter_local_notifications (0.0.1): - FlutterMacOS - flutter_timezone (0.1.0): @@ -58,6 +60,7 @@ DEPENDENCIES: - file_picker (from `Flutter/ephemeral/.symlinks/plugins/file_picker/macos`) - file_saver (from `Flutter/ephemeral/.symlinks/plugins/file_saver/macos`) - file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`) + - flutter_app_group_directory (from `Flutter/ephemeral/.symlinks/plugins/flutter_app_group_directory/macos`) - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) - flutter_timezone (from `Flutter/ephemeral/.symlinks/plugins/flutter_timezone/macos`) - FlutterMacOS (from `Flutter/ephemeral`) @@ -93,6 +96,8 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/file_saver/macos file_selector_macos: :path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos + flutter_app_group_directory: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_app_group_directory/macos flutter_local_notifications: :path: Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos flutter_timezone: @@ -135,6 +140,7 @@ SPEC CHECKSUMS: file_picker: 7584aae6fa07a041af2b36a2655122d42f578c1a file_saver: e35bd97de451dde55ff8c38862ed7ad0f3418d0f file_selector_macos: 9e9e068e90ebee155097d00e89ae91edb2374db7 + flutter_app_group_directory: 14eb7e7a2b0e30a6a68bb855197b4ed6f5063e55 flutter_local_notifications: 4bf37a31afde695b56091b4ae3e4d9c7a7e6cda0 flutter_timezone: d272288c69082ad571630e0d17140b3d6b93dc0c FlutterMacOS: d0db08ddef1a9af05a5ec4b724367152bb0500b1 From 927ed9287a0b89efce4e76bfedcab2177de1b09e Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Tue, 17 Feb 2026 21:15:45 +0800 Subject: [PATCH 19/21] bump ver --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index f3a55cee..34358a1e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: A personal finance managing app publish_to: "none" # Remove this line if you wish to publish to pub.dev -version: "0.19.0+324" +version: "0.19.0+325" environment: sdk: ">=3.10.0 <4.0.0" From 22673d6b313b77140cf0b276ec8d83d08f6e09a9 Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Wed, 18 Feb 2026 10:08:18 +0800 Subject: [PATCH 20/21] chore: update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54d1be54..63cf7224 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## Next +## 0.19.0 ### New features From 72bc1b7c164ec9f67afda1513a86a0099e21116a Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Wed, 18 Feb 2026 10:08:29 +0800 Subject: [PATCH 21/21] bump ver --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 34358a1e..b2c194bf 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: A personal finance managing app publish_to: "none" # Remove this line if you wish to publish to pub.dev -version: "0.19.0+325" +version: "0.19.0+326" environment: sdk: ">=3.10.0 <4.0.0"