Compare commits

...

4 commits

Author SHA1 Message Date
Matyáš Caras 1556b9bd1e
fix: allow changing date on entries 2024-01-30 22:19:26 +01:00
Matyáš Caras ae07720854
fix: disable overlay if search is not active 2024-01-30 22:03:03 +01:00
Matyáš Caras 5520655e32
docs: update changelog 2024-01-30 22:00:39 +01:00
Matyáš Caras dab4448c14
fix: actually save starting balance 2024-01-30 22:00:19 +01:00
6 changed files with 71 additions and 31 deletions

View file

@ -9,6 +9,8 @@
- Make search case-insensitive - Make search case-insensitive
- Added titles above graphs - Added titles above graphs
- Some extra optimization for iOS - Some extra optimization for iOS
- Fix starting balance not saving
- Fix overlay disabling tappig on edit/delete buttons on home view
# 1.0.0-alpha+5 # 1.0.0-alpha+5
- Add tests - Add tests
- Add searching through entries to homepage - Add searching through entries to homepage

View file

@ -113,5 +113,6 @@
"search":"Prohledat", "search":"Prohledat",
"expensesPerYear":"Měsíční výdaje v roce {year}", "expensesPerYear":"Měsíční výdaje v roce {year}",
"expensesPerMonth":"Denní výdaje během měsíce {monthYear}", "expensesPerMonth":"Denní výdaje během měsíce {monthYear}",
"expensesPerCategory":"Total expenses per category" "expensesPerCategory":"Total expenses per category",
"date":"Datum"
} }

View file

@ -247,5 +247,6 @@
} }
} }
}, },
"expensesPerCategory":"Total expenses per category" "expensesPerCategory":"Total expenses per category",
"date":"Date"
} }

View file

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:intl/intl.dart';
import 'package:prasule/api/category.dart'; import 'package:prasule/api/category.dart';
import 'package:prasule/api/entry_data.dart'; import 'package:prasule/api/entry_data.dart';
import 'package:prasule/api/wallet.dart'; import 'package:prasule/api/wallet.dart';
@ -13,7 +14,12 @@ import 'package:prasule/util/show_message.dart';
/// Used when user wants to add new entry /// Used when user wants to add new entry
class CreateSingleEntryView extends StatefulWidget { class CreateSingleEntryView extends StatefulWidget {
/// Used when user wants to add new entry /// Used when user wants to add new entry
const CreateSingleEntryView({required this.w, super.key, this.editEntry}); const CreateSingleEntryView({
required this.w,
super.key,
this.editEntry,
required this.locale,
});
/// The wallet, where the entry will be saved to /// The wallet, where the entry will be saved to
final Wallet w; final Wallet w;
@ -23,6 +29,8 @@ class CreateSingleEntryView extends StatefulWidget {
/// Is null unless we are editing an existing entry /// Is null unless we are editing an existing entry
final WalletSingleEntry? editEntry; final WalletSingleEntry? editEntry;
final String locale;
@override @override
State createState() => _CreateSingleEntryViewState(); State createState() => _CreateSingleEntryViewState();
} }
@ -184,6 +192,33 @@ class _CreateSingleEntryViewState extends State<CreateSingleEntryView> {
}, },
), ),
), ),
const SizedBox(
height: 20,
),
Text(AppLocalizations.of(context).date),
PlatformButton(
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(
Theme.of(context).colorScheme.primary,
),
foregroundColor: MaterialStateProperty.all(
Theme.of(context).colorScheme.onPrimary,
),
),
text: DateFormat.yMMMMd(widget.locale).format(newEntry.date),
onPressed: () async {
final date = await showDatePicker(
initialDate: newEntry.date,
context: context,
firstDate: DateTime.now()
.subtract(const Duration(days: 20 * 365)),
lastDate: DateTime.now().add(const Duration(days: 365)),
);
if (date == null) return;
newEntry.date = date;
setState(() {});
},
),
const SizedBox( const SizedBox(
height: 15, height: 15,
), ),

View file

@ -117,7 +117,10 @@ class _HomeViewState extends State<HomeView> {
onTap: () async { onTap: () async {
final sw = await Navigator.of(context).push<Wallet>( final sw = await Navigator.of(context).push<Wallet>(
MaterialPageRoute( MaterialPageRoute(
builder: (c) => CreateSingleEntryView(w: selectedWallet!), builder: (c) => CreateSingleEntryView(
w: selectedWallet!,
locale: locale,
),
), ),
); );
if (sw != null) { if (sw != null) {
@ -419,6 +422,7 @@ class _HomeViewState extends State<HomeView> {
MaterialPageRoute( MaterialPageRoute(
builder: (c) => builder: (c) =>
CreateSingleEntryView( CreateSingleEntryView(
locale: locale,
w: selectedWallet!, w: selectedWallet!,
editEntry: element, editEntry: element,
), ),
@ -577,24 +581,25 @@ class _HomeViewState extends State<HomeView> {
], ],
), ),
), ),
OverlayEntry( if (_searchActive)
builder: (context) => SizedBox( OverlayEntry(
width: MediaQuery.of(context).size.width, builder: (context) => SizedBox(
height: MediaQuery.of(context).size.height, width: MediaQuery.of(context).size.width,
child: GestureDetector( height: MediaQuery.of(context).size.height,
onTap: () { child: GestureDetector(
if (!_searchActive) return; onTap: () {
if (!searchFocus.hasFocus) { if (!_searchActive) return;
_searchActive = false; if (!searchFocus.hasFocus) {
_filter = ""; _searchActive = false;
setState(() {}); _filter = "";
return; setState(() {});
} return;
searchFocus.unfocus(); }
}, searchFocus.unfocus();
},
),
), ),
), ),
),
], ],
), ),
), ),
@ -710,6 +715,7 @@ class _HomeViewState extends State<HomeView> {
await Navigator.of(context).push<WalletSingleEntry>( await Navigator.of(context).push<WalletSingleEntry>(
platformRoute<WalletSingleEntry>( platformRoute<WalletSingleEntry>(
(c) => CreateSingleEntryView( (c) => CreateSingleEntryView(
locale: locale,
w: selectedWallet!, w: selectedWallet!,
editEntry: WalletSingleEntry( editEntry: WalletSingleEntry(
data: EntryData( data: EntryData(

View file

@ -51,7 +51,7 @@ class _SetupViewState extends State<SetupView> {
); );
List<WalletCategory> categories = <WalletCategory>[]; List<WalletCategory> categories = <WalletCategory>[];
String name = ""; String name = "";
double balance = 0; final _balanceController = TextEditingController(text: "0.0");
@override @override
void didChangeDependencies() { void didChangeDependencies() {
@ -155,10 +155,10 @@ class _SetupViewState extends State<SetupView> {
return; return;
} }
final wallet = Wallet( final wallet = Wallet(
name: name, name: name,
currency: _selectedCurrency, currency: _selectedCurrency,
categories: categories, categories: categories,
); starterBalance: double.parse(_balanceController.text));
await WalletManager.saveWallet(wallet); await WalletManager.saveWallet(wallet);
if (widget.newWallet && context.mounted) { if (widget.newWallet && context.mounted) {
@ -267,7 +267,7 @@ class _SetupViewState extends State<SetupView> {
keyboardType: const TextInputType.numberWithOptions( keyboardType: const TextInputType.numberWithOptions(
decimal: true, decimal: true,
), ),
controller: TextEditingController(text: "0.0"), controller: _balanceController,
inputFormatters: [ inputFormatters: [
FilteringTextInputFormatter.allow( FilteringTextInputFormatter.allow(
RegExp(r'\d+[\.,]{0,1}\d{0,}'), RegExp(r'\d+[\.,]{0,1}\d{0,}'),
@ -277,11 +277,6 @@ class _SetupViewState extends State<SetupView> {
padding: const EdgeInsets.only(right: 4), padding: const EdgeInsets.only(right: 4),
child: Text(_selectedCurrency.symbol), child: Text(_selectedCurrency.symbol),
), ),
onChanged: (t) {
final b = double.tryParse(t);
if (b == null) return;
balance = b;
},
), ),
), ),
], ],