Skip to content

Commit

Permalink
Merge pull request #281 from flow-mn:develop
Browse files Browse the repository at this point in the history
RC Beta 0.11.0
  • Loading branch information
sadespresso authored Jan 26, 2025
2 parents 18d2a0c + 31aa51e commit b3c6f2c
Show file tree
Hide file tree
Showing 25 changed files with 631 additions and 264 deletions.
11 changes: 11 additions & 0 deletions assets/l10n/en_IN.json
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,8 @@
"transactions.query.filter.categories": "Categories",
"transactions.query.filter.categories.n": "{} categories",
"transactions.query.filter.categories.all": "All Categories",
"transactions.query.filter.groupBy": "Group by",
"transactions.query.filter.sort": "Sort",
"transactions.count": "{} transactions",

"category": "Category",
Expand Down Expand Up @@ -248,6 +250,8 @@
"tabs.stats.dailyReport.totalExpenseFor": "{} total expense",
"tabs.stats.summaryByAccount": "Summary by account",
"tabs.stats.summaryByCategory": "Summary by category",
"tabs.stats.topSpendingCategory": "Top spending category",
"tabs.stats.otherStats": "Other stats",
"tabs.accounts": "Accounts",
"tabs.accounts.reorder": "Reorder accounts",
"tabs.accounts.reorder.guide": "Long press and drag",
Expand Down Expand Up @@ -387,6 +391,13 @@
"enum.TransactionSearchMode@substring": "Partial match",
"enum.TransactionSearchMode@exact": "Exact match",

"enum.TransactionGroupRange": "Group unit",
"enum.TransactionGroupRange@hour": "Hour",
"enum.TransactionGroupRange@day": "Day",
"enum.TransactionGroupRange@week": "Week",
"enum.TransactionGroupRange@month": "Month",
"enum.TransactionGroupRange@year": "Year",

"error.route.404": "Page not found",
"error.route.400": "Failed to load the page",
"error.input.mustBeNotEmpty": "Please fill out this field",
Expand Down
11 changes: 11 additions & 0 deletions assets/l10n/en_US.json
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,8 @@
"transactions.query.filter.categories": "Categories",
"transactions.query.filter.categories.n": "{} categories",
"transactions.query.filter.categories.all": "All Categories",
"transactions.query.filter.groupBy": "Group by",
"transactions.query.filter.sort": "Sort",
"transactions.count": "{} transactions",

"category": "Category",
Expand Down Expand Up @@ -248,6 +250,8 @@
"tabs.stats.dailyReport.totalExpenseFor": "{} total expense",
"tabs.stats.summaryByAccount": "Summary by account",
"tabs.stats.summaryByCategory": "Summary by category",
"tabs.stats.topSpendingCategory": "Top spending category",
"tabs.stats.otherStats": "Other stats",
"tabs.accounts": "Accounts",
"tabs.accounts.reorder": "Reorder accounts",
"tabs.accounts.reorder.guide": "Long press and drag",
Expand Down Expand Up @@ -387,6 +391,13 @@
"enum.TransactionSearchMode@substring": "Partial match",
"enum.TransactionSearchMode@exact": "Exact match",

"enum.TransactionGroupRange": "Group unit",
"enum.TransactionGroupRange@hour": "Hour",
"enum.TransactionGroupRange@day": "Day",
"enum.TransactionGroupRange@week": "Week",
"enum.TransactionGroupRange@month": "Month",
"enum.TransactionGroupRange@year": "Year",

"error.route.404": "Page not found",
"error.route.400": "Failed to load the page",
"error.input.mustBeNotEmpty": "Please fill out this field",
Expand Down
11 changes: 11 additions & 0 deletions assets/l10n/it_IT.json
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,8 @@
"transactions.query.filter.categories": "Categorie",
"transactions.query.filter.categories.n": "{} categorie",
"transactions.query.filter.categories.all": "Tutte le categorie",
"transactions.query.filter.groupBy": "Raggruppa per",
"transactions.query.filter.sort": "Ordina",
"transactions.count": "{count} transazioni",

"category": "Categoria",
Expand Down Expand Up @@ -248,6 +250,8 @@
"tabs.stats.dailyReport.totalExpenseFor": "Spesa totale {}",
"tabs.stats.summaryByAccount": "Riepilogo per conto",
"tabs.stats.summaryByCategory": "Riepilogo per categoria",
"tabs.stats.topSpendingCategory": "Categoria di spesa principale",
"tabs.stats.otherStats": "Altre statistiche",
"tabs.accounts": "Conti",
"tabs.accounts.reorder": "Riordina i conti",
"tabs.accounts.reorder.guide": "Premi a lungo e trascina",
Expand Down Expand Up @@ -387,6 +391,13 @@
"enum.TransactionSearchMode@substring": "Corrispondenza parziale",
"enum.TransactionSearchMode@exact": "Corrispondenza esatta",

"enum.TransactionGroupRange": "Unità di gruppo",
"enum.TransactionGroupRange@hour": "Ora",
"enum.TransactionGroupRange@day": "Giorno",
"enum.TransactionGroupRange@week": "Settimana",
"enum.TransactionGroupRange@month": "Mese",
"enum.TransactionGroupRange@year": "Anno",

"error.route.404": "Pagina non trovata",
"error.route.400": "Impossibile caricare la pagina",
"error.input.mustBeNotEmpty": "Si prega di compilare questo campo",
Expand Down
11 changes: 11 additions & 0 deletions assets/l10n/mn_MN.json
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,8 @@
"transactions.query.filter.categories": "Ангилал",
"transactions.query.filter.categories.n": "{} ангилал",
"transactions.query.filter.categories.all": "Бүх ангилал",
"transactions.query.filter.groupBy": "Бүлэглэх нэгж",
"transactions.query.filter.sort": "Эрэмбэ",
"transactions.count": "{} гүйлгээ",

"category": "Ангилал",
Expand Down Expand Up @@ -248,6 +250,8 @@
"tabs.stats.dailyReport.totalExpenseFor": "{}-н нийт зарлага",
"tabs.stats.summaryByAccount": "Данс бүрээр харах",
"tabs.stats.summaryByCategory": "Ангилал бүрээр харах",
"tabs.stats.topSpendingCategory": "Хамгийн зарлагатай ангилал",
"tabs.stats.otherStats": "Бусад тоо",
"tabs.accounts": "Данснууд",
"tabs.accounts.reorder": "Дараалал өөрчлөх",
"tabs.accounts.reorder.guide": "Удаан дарж чирнэ үү",
Expand Down Expand Up @@ -387,6 +391,13 @@
"enum.TransactionSearchMode@substring": "Хэсэгчлэн таарах",
"enum.TransactionSearchMode@exact": "Яг таарах",

"enum.TransactionGroupRange": "Бүлэглэх нэгж",
"enum.TransactionGroupRange@hour": "Цаг",
"enum.TransactionGroupRange@day": "Өдөр",
"enum.TransactionGroupRange@week": "Долоо хоног",
"enum.TransactionGroupRange@month": "Сар",
"enum.TransactionGroupRange@year": "Жил",

"error.route.404": "Хуудас олдсонгүй",
"error.route.400": "Хуудас ачаалахад алдаа гарлаа",
"error.input.mustBeNotEmpty": "Энэ талбарыг бөглөнө үү",
Expand Down
11 changes: 11 additions & 0 deletions assets/l10n/tr_TR.json
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,8 @@
"transactions.query.filter.categories": "Kategori",
"transactions.query.filter.categories.n": "{} kategoriler",
"transactions.query.filter.categories.all": "Tüm Kategoriler",
"transactions.query.filter.groupBy": "Şuna göre grupla",
"transactions.query.filter.sort": "Sırala",
"transactions.count": "{} İşlemler",

"category": "Kategori",
Expand Down Expand Up @@ -248,6 +250,8 @@
"tabs.stats.dailyReport.totalExpenseFor": "{} toplam gider",
"tabs.stats.summaryByAccount": "Hesaba göre özet",
"tabs.stats.summaryByCategory": "Kategoriye göre özet",
"tabs.stats.topSpendingCategory": "En çok harcama yapılan kategori",
"tabs.stats.otherStats": "Diğer istatistikler",
"tabs.accounts": "Hesap",
"tabs.accounts.reorder": "Hesapları yeniden sıralama",
"tabs.accounts.reorder.guide": "Uzun basın ve sürükleyin",
Expand Down Expand Up @@ -387,6 +391,13 @@
"enum.TransactionSearchMode@substring": "Kısmi eşleşme",
"enum.TransactionSearchMode@exact": "Tam eşleşme",

"enum.TransactionGroupRange": "Grup birimi",
"enum.TransactionGroupRange@hour": "Saat",
"enum.TransactionGroupRange@day": "Gün",
"enum.TransactionGroupRange@week": "Hafta",
"enum.TransactionGroupRange@month": "Ay",
"enum.TransactionGroupRange@year": "Yıl",

"error.route.404": "Sayfa bulunamadı",
"error.route.400": "Sayfa yüklenemedi",
"error.input.mustBeNotEmpty": "Lütfen bu alanı doldurun",
Expand Down
19 changes: 12 additions & 7 deletions lib/data/flow_standard_report.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import "package:flow/entity/transaction.dart";
import "package:flow/objectbox.dart";
import "package:flow/objectbox/actions.dart";
import "package:flow/prefs.dart";
import "package:flow/services/exchange_rates.dart";
import "package:moment_dart/moment_dart.dart";

/// Only capable of working with the primary currency
Expand Down Expand Up @@ -182,13 +181,20 @@ class FlowStandardReport {
previousDailyAvgExpenditure! + previousDailyAvgIncome!;
}

static Future<FlowStandardReport> generate(TimeRange range) async {
/// When [rates] is not available, ignores all other currencies.
///
/// It's a good idea to show a notice to the user that the report is not accurate.
static Future<FlowStandardReport> generate(
TimeRange range,
ExchangeRates? rates,
) async {
final Map<int, MoneyFlow<DayTimeRange>> currentFlowByDay =
await _reportMonthRangeFlowByDayInPrimaryCurrencyOnly(range);
await _reportMonthRangeFlowByDayInPrimaryCurrencyOnly(range, rates);
final Map<int, MoneyFlow<DayTimeRange>>? previousFlowByDay =
switch (range) {
PageableRange pageable =>
await _reportMonthRangeFlowByDayInPrimaryCurrencyOnly(pageable.last),
await _reportMonthRangeFlowByDayInPrimaryCurrencyOnly(
pageable.last, rates),
_ => null,
};

Expand All @@ -200,10 +206,9 @@ class FlowStandardReport {
}

static Future<Map<int, MoneyFlow<DayTimeRange>>>
_reportMonthRangeFlowByDayInPrimaryCurrencyOnly(TimeRange range) async {
_reportMonthRangeFlowByDayInPrimaryCurrencyOnly(
TimeRange range, ExchangeRates? rates) async {
final String primaryCurrency = LocalPreferences().getPrimaryCurrency();
final ExchangeRates? rates =
ExchangeRatesService().getPrimaryCurrencyRates();

final List<Transaction> transactions =
await ObjectBox().transcationsByRange(range);
Expand Down
2 changes: 1 addition & 1 deletion lib/data/money_flow.dart
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ class MoneyFlow<T> {

/// Returns the converted sum of all expenses in given [currency],
/// or rates.baseCurrency if null
Money getTotalExpense(ExchangeRates rates, String? currency) {
Money getTotalExpense(ExchangeRates rates, [String? currency]) {
currency ??= rates.baseCurrency;

double amount = 0.0;
Expand Down
38 changes: 38 additions & 0 deletions lib/data/transactions_filter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import "package:flow/data/transactions_filter/search_data.dart";
import "package:flow/entity/account.dart";
import "package:flow/entity/category.dart";
import "package:flow/entity/transaction.dart";
import "package:flow/l10n/named_enum.dart";
import "package:flow/objectbox.dart";
import "package:flow/objectbox/objectbox.g.dart";
import "package:flow/utils/optional.dart";
Expand All @@ -19,6 +20,34 @@ enum TransactionSortField {
createdDate;
}

enum TransactionGroupRange implements LocalizedEnum {
hour,

/// Default
day,
week,
month,
year;

@override
String get localizationEnumName => "TransactionGroupRange";

@override
String get localizationEnumValue => name;

TimeRange fromTransaction(Transaction t) => switch (this) {
TransactionGroupRange.hour =>
HourTimeRange.fromDateTime(t.transactionDate),
TransactionGroupRange.day =>
DayTimeRange.fromDateTime(t.transactionDate),
TransactionGroupRange.week => LocalWeekTimeRange(t.transactionDate),
TransactionGroupRange.month =>
MonthTimeRange.fromDateTime(t.transactionDate),
TransactionGroupRange.year =>
YearTimeRange.fromDateTime(t.transactionDate),
};
}

/// For all fields, disabled if it's null.
///
/// All values must be wrapped by [Optional]
Expand All @@ -36,6 +65,8 @@ class TransactionFilter {
final bool sortDescending;
final TransactionSortField sortBy;

final TransactionGroupRange groupBy;

final bool? isPending;

final double? minAmount;
Expand All @@ -55,6 +86,7 @@ class TransactionFilter {
this.sortDescending = true,
this.searchData = const TransactionSearchData(),
this.sortBy = TransactionSortField.transactionDate,
this.groupBy = TransactionGroupRange.day,
});

static const empty = TransactionFilter();
Expand Down Expand Up @@ -186,6 +218,7 @@ class TransactionFilter {
Optional<List<Account>>? accounts,
bool? sortDescending,
TransactionSortField? sortBy,
Optional<TransactionGroupRange>? groupBy,
Optional<bool>? isPending,
Optional<double>? minAmount,
Optional<double>? maxAmount,
Expand All @@ -198,6 +231,9 @@ class TransactionFilter {
categories: categories == null ? this.categories : categories.value,
accounts: accounts == null ? this.accounts : accounts.value,
sortBy: sortBy ?? this.sortBy,
groupBy: (groupBy == null || groupBy.value == null)
? this.groupBy
: groupBy.value!,
sortDescending: sortDescending ?? this.sortDescending,
isPending: isPending == null ? this.isPending : isPending.value,
minAmount: minAmount == null ? this.minAmount : minAmount.value,
Expand All @@ -215,6 +251,7 @@ class TransactionFilter {
accounts,
sortDescending,
sortBy,
groupBy,
isPending,
minAmount,
maxAmount,
Expand All @@ -232,6 +269,7 @@ class TransactionFilter {
return other.range == range &&
other.sortDescending == sortDescending &&
other.sortBy == sortBy &&
other.groupBy == groupBy &&
other.searchData == searchData &&
other.isPending == isPending &&
other.minAmount == minAmount &&
Expand Down
3 changes: 0 additions & 3 deletions lib/objectbox/actions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,6 @@ extension MainActions on ObjectBox {
Future<FlowAnalytics<Category?>> flowByCategories({
required TimeRange range,
bool ignoreTransfers = true,
String? currencyOverride,
}) async {
final List<Transaction> transactions = await transcationsByRange(range);

Expand All @@ -201,8 +200,6 @@ extension MainActions on ObjectBox {
Future<FlowAnalytics<Account>> flowByAccounts({
required TimeRange range,
bool ignoreTransfers = true,
bool omitZeroes = true,
String? currencyOverride,
}) async {
final List<Transaction> transactions = await transcationsByRange(range);

Expand Down
37 changes: 20 additions & 17 deletions lib/routes/home/accounts_tab.dart
Original file line number Diff line number Diff line change
Expand Up @@ -67,26 +67,29 @@ class _AccountsTabState extends State<AccountsTab>
builder: (context, excludeTransfersInTotal, child) {
return Expanded(
child: _reordering
? ReorderableListView.builder(
padding: const EdgeInsets.all(16.0)
.copyWith(bottom: 96.0),
itemBuilder: (context, index) =>
Padding(
key: ValueKey(accounts[index].uuid),
? Frame(
child: ReorderableListView.builder(
padding: const EdgeInsets.only(
bottom: 16.0),
child: AccountCard(
account: accounts[index],
useCupertinoContextMenu: false,
excludeTransfersInTotal:
excludeTransfersInTotal == true,
bottom: 96.0),
itemBuilder: (context, index) =>
Padding(
key: ValueKey(accounts[index].uuid),
padding: const EdgeInsets.only(
bottom: 16.0),
child: AccountCard(
account: accounts[index],
useCupertinoContextMenu: false,
excludeTransfersInTotal:
excludeTransfersInTotal ==
true,
),
),
proxyDecorator: proxyDecorator,
itemCount: accounts.length,
onReorder: (oldIndex, newIndex) =>
onReorder(
accounts, oldIndex, newIndex),
),
proxyDecorator: proxyDecorator,
itemCount: accounts.length,
onReorder: (oldIndex, newIndex) =>
onReorder(
accounts, oldIndex, newIndex),
)
: ListView(
padding: const EdgeInsets.all(16.0),
Expand Down
Loading

0 comments on commit b3c6f2c

Please sign in to comment.