Compare commits

..

1 commit

Author SHA1 Message Date
Matyáš Caras
fedb98c500
Added translation using Weblate (Slovak) 2024-01-22 16:36:42 +01:00
7 changed files with 388 additions and 503 deletions

View file

@ -1,7 +1,3 @@
# 1.0.0-alpha+5
- Add tests
- Add searching through entries to homepage
# 1.0.0-alpha+4 # 1.0.0-alpha+4
- Fix OCR downloads - Fix OCR downloads
# 1.0.0-alpha+3 # 1.0.0-alpha+3

View file

@ -4,8 +4,7 @@
<application <application
android:label="Prašule" android:label="Prašule"
android:name="${applicationName}" android:name="${applicationName}"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher">
android:enableOnBackInvokedCallback="true">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:exported="true" android:exported="true"

View file

@ -90,6 +90,5 @@
"startingWithDate": "počínaje datem", "startingWithDate": "počínaje datem",
"evenMoney":"Váš stav je stejný jako minulý měsíc.", "evenMoney":"Váš stav je stejný jako minulý měsíc.",
"balanceStatusA": "Váš stav je ", "balanceStatusA": "Váš stav je ",
"balanceStatusB": " oproti minulému měsíci.", "balanceStatusB": " oproti minulému měsíci."
"searchLabel":"Prohledat záznamy..."
} }

View file

@ -206,6 +206,5 @@
}, },
"evenMoney":"You're on the same balance as last month.", "evenMoney":"You're on the same balance as last month.",
"balanceStatusA": "Your balance is ", "balanceStatusA": "Your balance is ",
"balanceStatusB": " compared to last month.", "balanceStatusB": " compared to last month."
"searchLabel":"Search entries..."
} }

View file

@ -21,8 +21,6 @@ class PlatformField extends PlatformWidget<TextField, CupertinoTextField> {
this.textStyle, this.textStyle,
this.textAlign = TextAlign.start, this.textAlign = TextAlign.start,
this.maxLines = 1, this.maxLines = 1,
this.focusNode,
this.inputBorder = const OutlineInputBorder(),
}); });
final TextEditingController? controller; final TextEditingController? controller;
final bool? enabled; final bool? enabled;
@ -36,8 +34,6 @@ class PlatformField extends PlatformWidget<TextField, CupertinoTextField> {
final TextStyle? textStyle; final TextStyle? textStyle;
final TextAlign textAlign; final TextAlign textAlign;
final int? maxLines; final int? maxLines;
final InputBorder inputBorder;
final FocusNode? focusNode;
@override @override
TextField createAndroidWidget(BuildContext context) => TextField( TextField createAndroidWidget(BuildContext context) => TextField(
@ -47,11 +43,10 @@ class PlatformField extends PlatformWidget<TextField, CupertinoTextField> {
obscureText: obscureText, obscureText: obscureText,
decoration: InputDecoration( decoration: InputDecoration(
labelText: labelText, labelText: labelText,
border: inputBorder, border: OutlineInputBorder(borderRadius: BorderRadius.circular(4)),
), ),
autocorrect: autocorrect, autocorrect: autocorrect,
keyboardType: keyboardType, keyboardType: keyboardType,
focusNode: focusNode,
style: textStyle, style: textStyle,
inputFormatters: inputFormatters, inputFormatters: inputFormatters,
onChanged: onChanged, onChanged: onChanged,
@ -71,7 +66,6 @@ class PlatformField extends PlatformWidget<TextField, CupertinoTextField> {
keyboardType: keyboardType, keyboardType: keyboardType,
inputFormatters: inputFormatters, inputFormatters: inputFormatters,
onChanged: onChanged, onChanged: onChanged,
focusNode: focusNode,
maxLines: maxLines, maxLines: maxLines,
style: textStyle, style: textStyle,
); );

View file

@ -22,7 +22,6 @@ import 'package:prasule/main.dart';
import 'package:prasule/network/tessdata.dart'; import 'package:prasule/network/tessdata.dart';
import 'package:prasule/pw/platformbutton.dart'; import 'package:prasule/pw/platformbutton.dart';
import 'package:prasule/pw/platformdialog.dart'; import 'package:prasule/pw/platformdialog.dart';
import 'package:prasule/pw/platformfield.dart';
import 'package:prasule/pw/platformroute.dart'; import 'package:prasule/pw/platformroute.dart';
import 'package:prasule/util/drawer.dart'; import 'package:prasule/util/drawer.dart';
import 'package:prasule/util/text_color.dart'; import 'package:prasule/util/text_color.dart';
@ -45,9 +44,6 @@ class _HomeViewState extends State<HomeView> {
List<Wallet> wallets = []; List<Wallet> wallets = [];
DateTime? prevDate; DateTime? prevDate;
late String locale; late String locale;
var _searchActive = false;
var _filter = "";
final searchFocus = FocusNode();
@override @override
void didChangeDependencies() { void didChangeDependencies() {
super.didChangeDependencies(); super.didChangeDependencies();
@ -77,16 +73,7 @@ class _HomeViewState extends State<HomeView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return PopScope( return Scaffold(
canPop: !_searchActive, // don't pop when we just want
// to deactivate searchfield
onPopInvoked: (b) {
if (b) return;
_searchActive = false;
_filter = "";
setState(() {});
},
child: Scaffold(
drawer: makeDrawer(context, 1), drawer: makeDrawer(context, 1),
floatingActionButton: SpeedDial( floatingActionButton: SpeedDial(
icon: Icons.add, icon: Icons.add,
@ -128,8 +115,7 @@ class _HomeViewState extends State<HomeView> {
label: AppLocalizations.of(context).addCamera, label: AppLocalizations.of(context).addCamera,
onTap: () async { onTap: () async {
final picker = ImagePicker(); final picker = ImagePicker();
final media = final media = await picker.pickImage(source: ImageSource.camera);
await picker.pickImage(source: ImageSource.camera);
logger.i(media?.name); logger.i(media?.name);
}, },
), ),
@ -143,24 +129,9 @@ class _HomeViewState extends State<HomeView> {
], ],
), ),
appBar: AppBar( appBar: AppBar(
title: AnimatedCrossFade( title: DropdownButton<int>(
duration: const Duration(milliseconds: 500), value:
crossFadeState: _searchActive (selectedWallet == null) ? -1 : wallets.indexOf(selectedWallet!),
? CrossFadeState.showFirst
: CrossFadeState.showSecond,
firstChild: PlatformField(
inputBorder: InputBorder.none,
focusNode: searchFocus,
onChanged: (e) {
_filter = e;
setState(() {});
},
labelText: AppLocalizations.of(context).searchLabel,
),
secondChild: DropdownButton<int>(
value: (selectedWallet == null)
? -1
: wallets.indexOf(selectedWallet!),
items: [ items: [
...wallets.map( ...wallets.map(
(e) => DropdownMenuItem( (e) => DropdownMenuItem(
@ -193,17 +164,7 @@ class _HomeViewState extends State<HomeView> {
setState(() {}); setState(() {});
}, },
), ),
),
actions: [ actions: [
if (!_searchActive)
IconButton(
onPressed: () {
_searchActive = true;
setState(() {});
},
icon: const Icon(Icons.search),
),
if (!_searchActive)
PopupMenuButton( PopupMenuButton(
itemBuilder: (context) => [ itemBuilder: (context) => [
AppLocalizations.of(context).settings, AppLocalizations.of(context).settings,
@ -261,18 +222,13 @@ class _HomeViewState extends State<HomeView> {
), ),
], ],
) )
: Overlay( : Column(
initialEntries: [
OverlayEntry(
builder: (context) => Column(
children: [ children: [
Text( Text(
NumberFormat.compactCurrency( NumberFormat.compactCurrency(
locale: locale, locale: locale,
symbol: selectedWallet!.currency.symbol, symbol: selectedWallet!.currency.symbol,
).format( ).format(selectedWallet!.calculateCurrentBalance()),
selectedWallet!.calculateCurrentBalance(),
),
style: const TextStyle( style: const TextStyle(
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
fontSize: 22, fontSize: 22,
@ -326,11 +282,9 @@ class _HomeViewState extends State<HomeView> {
), ),
text: NumberFormat.compactCurrency( text: NumberFormat.compactCurrency(
locale: locale, locale: locale,
symbol: symbol: selectedWallet!.currency.symbol,
selectedWallet!.currency.symbol,
).format( ).format(
selectedWallet! selectedWallet!.calculateMonthStatus(
.calculateMonthStatus(
DateTime.now().month, DateTime.now().month,
DateTime.now().year, DateTime.now().year,
), ),
@ -349,53 +303,35 @@ class _HomeViewState extends State<HomeView> {
Expanded( Expanded(
child: GroupedListView( child: GroupedListView(
groupHeaderBuilder: (element) => Text( groupHeaderBuilder: (element) => Text(
DateFormat.yMMMM(locale) DateFormat.yMMMM(locale).format(element.date),
.format(element.date),
style: TextStyle( style: TextStyle(
color: Theme.of(context) color: Theme.of(context).colorScheme.primary,
.colorScheme
.primary,
), ),
), ),
elements: selectedWallet!.entries elements: selectedWallet!.entries,
.where((element) => itemComparator: (a, b) => b.date.compareTo(a.date),
element.data.name.contains(_filter))
.toList(),
itemComparator: (a, b) =>
b.date.compareTo(a.date),
groupBy: (e) => groupBy: (e) =>
DateFormat.yMMMM(locale).format(e.date), DateFormat.yMMMM(locale).format(e.date),
groupComparator: (a, b) { groupComparator: (a, b) {
// TODO: better sorting algorithm lol // TODO: better sorting algorithm lol
final yearA = final yearA = RegExp(r'\d+').firstMatch(a);
RegExp(r'\d+').firstMatch(a);
if (yearA == null) return 0; if (yearA == null) return 0;
final yearB = final yearB = RegExp(r'\d+').firstMatch(b);
RegExp(r'\d+').firstMatch(b);
if (yearB == null) return 0; if (yearB == null) return 0;
final compareYears = final compareYears = int.parse(yearB.group(0)!)
int.parse(yearB.group(0)!).compareTo( .compareTo(int.parse(yearA.group(0)!));
int.parse(yearA.group(0)!), if (compareYears != 0) return compareYears;
);
if (compareYears != 0) {
return compareYears;
}
final months = List<String>.generate( final months = List<String>.generate(
12, 12,
(index) => (index) => DateFormat.MMMM(locale).format(
DateFormat.MMMM(locale).format(
DateTime(2023, index + 1), DateTime(2023, index + 1),
), ),
); );
final monthA = final monthA = RegExp('[^0-9 ]+').firstMatch(a);
RegExp('[^0-9 ]+').firstMatch(a);
if (monthA == null) return 0; if (monthA == null) return 0;
final monthB = final monthB = RegExp('[^0-9 ]+').firstMatch(b);
RegExp('[^0-9 ]+').firstMatch(b);
if (monthB == null) return 0; if (monthB == null) return 0;
return months return months.indexOf(monthB.group(0)!).compareTo(
.indexOf(monthB.group(0)!)
.compareTo(
months.indexOf(monthA.group(0)!), months.indexOf(monthA.group(0)!),
); );
}, },
@ -408,8 +344,7 @@ class _HomeViewState extends State<HomeView> {
Navigator.of(context) Navigator.of(context)
.push<WalletSingleEntry>( .push<WalletSingleEntry>(
MaterialPageRoute( MaterialPageRoute(
builder: (c) => builder: (c) => CreateSingleEntryView(
CreateSingleEntryView(
w: selectedWallet!, w: selectedWallet!,
editEntry: element, editEntry: element,
), ),
@ -417,9 +352,7 @@ class _HomeViewState extends State<HomeView> {
) )
.then( .then(
(editedEntry) { (editedEntry) {
if (editedEntry == null) { if (editedEntry == null) return;
return;
}
selectedWallet!.entries selectedWallet!.entries
.remove(element); .remove(element);
selectedWallet!.entries selectedWallet!.entries
@ -431,48 +364,40 @@ class _HomeViewState extends State<HomeView> {
}, },
); );
}, },
backgroundColor: Theme.of(context) backgroundColor:
.colorScheme Theme.of(context).colorScheme.secondary,
.secondary,
foregroundColor: Theme.of(context) foregroundColor: Theme.of(context)
.colorScheme .colorScheme
.onSecondary, .onSecondary,
icon: Icons.edit, icon: Icons.edit,
), ),
SlidableAction( SlidableAction(
backgroundColor: Theme.of(context) backgroundColor:
.colorScheme Theme.of(context).colorScheme.error,
.error, foregroundColor:
foregroundColor: Theme.of(context) Theme.of(context).colorScheme.onError,
.colorScheme
.onError,
icon: Icons.delete, icon: Icons.delete,
onPressed: (c) { onPressed: (c) {
showDialog( showDialog(
context: context, context: context,
builder: (cx) => PlatformDialog( builder: (cx) => PlatformDialog(
title: AppLocalizations.of( title: AppLocalizations.of(context)
context, .sureDialog,
).sureDialog,
content: Text( content: Text(
AppLocalizations.of(context) AppLocalizations.of(context)
.deleteSure, .deleteSure,
), ),
actions: [ actions: [
PlatformButton( PlatformButton(
text: AppLocalizations.of( text: AppLocalizations.of(context)
context, .yes,
).yes,
onPressed: () { onPressed: () {
selectedWallet?.entries selectedWallet?.entries
.removeWhere( .removeWhere(
(e) => (e) => e.id == element.id,
e.id ==
element.id,
); );
WalletManager WalletManager.saveWallet(
.saveWallet(
selectedWallet!, selectedWallet!,
); );
Navigator.of(cx).pop(); Navigator.of(cx).pop();
@ -480,9 +405,8 @@ class _HomeViewState extends State<HomeView> {
}, },
), ),
PlatformButton( PlatformButton(
text: AppLocalizations.of( text: AppLocalizations.of(context)
context, .no,
).no,
onPressed: () { onPressed: () {
Navigator.of(cx).pop(); Navigator.of(cx).pop();
}, },
@ -497,8 +421,7 @@ class _HomeViewState extends State<HomeView> {
child: ListTile( child: ListTile(
leading: Container( leading: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: borderRadius: BorderRadius.circular(16),
BorderRadius.circular(16),
color: element.category.color, color: element.category.color,
), ),
child: Padding( child: Padding(
@ -516,8 +439,8 @@ class _HomeViewState extends State<HomeView> {
children: [ children: [
TextSpan( TextSpan(
text: NumberFormat.currency( text: NumberFormat.currency(
symbol: selectedWallet! symbol:
.currency.symbol, selectedWallet!.currency.symbol,
).format(element.data.amount), ).format(element.data.amount),
style: TextStyle( style: TextStyle(
color: (element.type == color: (element.type ==
@ -525,10 +448,8 @@ class _HomeViewState extends State<HomeView> {
? (MediaQuery.of(context) ? (MediaQuery.of(context)
.platformBrightness == .platformBrightness ==
Brightness.dark) Brightness.dark)
? Colors ? Colors.green.shade300
.green.shade300 : Colors.green.harmonizeWith(
: Colors.green
.harmonizeWith(
Theme.of(context) Theme.of(context)
.colorScheme .colorScheme
.primary, .primary,
@ -537,8 +458,7 @@ class _HomeViewState extends State<HomeView> {
.platformBrightness == .platformBrightness ==
Brightness.dark) Brightness.dark)
? Colors.red.shade300 ? Colors.red.shade300
: Colors.red : Colors.red.harmonizeWith(
.harmonizeWith(
Theme.of(context) Theme.of(context)
.colorScheme .colorScheme
.primary, .primary,
@ -565,28 +485,6 @@ class _HomeViewState extends State<HomeView> {
], ],
), ),
), ),
OverlayEntry(
builder: (context) => SizedBox(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
child: GestureDetector(
onTap: () {
if (!_searchActive) return;
if (!searchFocus.hasFocus) {
_searchActive = false;
_filter = "";
setState(() {});
return;
}
searchFocus.unfocus();
},
),
),
),
],
),
),
),
), ),
); );
} }

View file

@ -1,7 +1,7 @@
name: prasule name: prasule
description: Open-source private expense tracker description: Open-source private expense tracker
version: 1.0.0-alpha+5 version: 1.0.0-alpha+4
environment: environment:
sdk: '>=3.1.0-262.2.beta <4.0.0' sdk: '>=3.1.0-262.2.beta <4.0.0'