Compare commits

..

2 Commits

Author SHA1 Message Date
6a9da33283 updated libs, fixed transaction form 2024-04-20 21:06:25 +02:00
35930d188c editable label & color 2024-03-10 15:57:40 +01:00
19 changed files with 305 additions and 96 deletions

View File

@@ -20,11 +20,17 @@ class JsonStorageClient {
} }
Future<File> _getJson(String filename) async { Future<File> _getJson(String filename) async {
final dir = await getApplicationDocumentsDirectory(); final rootDirectory = Platform.isAndroid ? await getExternalStorageDirectory() : await getApplicationDocumentsDirectory();
final file = File('${dir.path}/$filename');
if (!file.existsSync()) { final appDirectory = Directory('${rootDirectory!.path}/krezus');
file.createSync(); if (!appDirectory.existsSync()) {
appDirectory.createSync();
} }
return file;
final targetFile = File('${rootDirectory.path}/krezus/$filename');
if (!targetFile.existsSync()) {
targetFile.createSync();
}
return targetFile;
} }
} }

View File

@@ -75,7 +75,7 @@ class AccountBloc extends Bloc<AccountEvent, AccountState> {
} }
_onAccountImportCSV(AccountImportCSV event, Emitter<AccountState> emit) async { _onAccountImportCSV(AccountImportCSV event, Emitter<AccountState> emit) async {
int colorIndex = 0; // int colorIndex = 0;
FilePickerResult? result = await FilePicker.platform.pickFiles(); FilePickerResult? result = await FilePicker.platform.pickFiles();
final csvPath = result?.files.first.path; final csvPath = result?.files.first.path;
@@ -172,7 +172,7 @@ class AccountBloc extends Bloc<AccountEvent, AccountState> {
} }
_onAccountEditLabel(AccountEditLabel event, Emitter<AccountState> emit) { _onAccountEditLabel(AccountEditLabel event, Emitter<AccountState> emit) {
Account account = event.account; // Account account = event.account;
// TODO check for existance, rename every transaction // TODO check for existance, rename every transaction
} }

View File

@@ -95,6 +95,8 @@ class ChartBloc extends Bloc<ChartEvent, ChartState> {
categoriesTotals[transaction.category] = categoryTotal; categoriesTotals[transaction.category] = categoryTotal;
} }
accountsTotals.removeWhere((key, value) => value.round() == 0);
return _computeStateScopedStats(state.copyWith( return _computeStateScopedStats(state.copyWith(
transactionsLines: transactionsLines, transactionsLines: transactionsLines,
globalTotal: globalTotal, globalTotal: globalTotal,

View File

@@ -167,11 +167,11 @@ class TransactionBloc extends Bloc<TransactionEvent, TransactionState> {
emit(state.copyWith( emit(state.copyWith(
currentTransaction: null, currentTransaction: null,
transactionDate: const TransactionDate.pure(), // transactionDate: const TransactionDate.pure(),
transactionCategory: const TransactionCategory.pure(), // transactionCategory: const TransactionCategory.pure(),
transactionDescription: const TransactionDescription.pure(), // transactionDescription: const TransactionDescription.pure(),
transactionAccount: const TransactionAccount.pure(), // transactionAccount: const TransactionAccount.pure(),
transactionValue: const TransactionValue.pure(), // transactionValue: const TransactionValue.pure(),
transactions: transactions, transactions: transactions,
transactionsLines: computeResult.list, transactionsLines: computeResult.list,
transactionsLinesFiltered: _applyCategoryFilter(computeResult.list), transactionsLinesFiltered: _applyCategoryFilter(computeResult.list),

View File

@@ -1,6 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:intl/intl.dart';
import 'package:krezus/domains/budget/budget_bloc.dart'; import 'package:krezus/domains/budget/budget_bloc.dart';
import 'package:krezus/pages/budgets/widgets/budget_cards.dart'; import 'package:krezus/pages/budgets/widgets/budget_cards.dart';
import 'package:krezus/pages/budgets/widgets/budget_compare_selector.dart'; import 'package:krezus/pages/budgets/widgets/budget_compare_selector.dart';

View File

@@ -25,7 +25,7 @@ class BudgetMaker extends StatelessWidget {
keyboardType: const TextInputType.numberWithOptions(decimal: false), keyboardType: const TextInputType.numberWithOptions(decimal: false),
decoration: InputDecoration( decoration: InputDecoration(
icon: const Icon(Icons.euro), icon: const Icon(Icons.euro),
hintText: '\$\$\$', label: const Text('Revenu par mois'),
border: OutlineInputBorder( border: OutlineInputBorder(
borderRadius: BorderRadius.circular(5), borderRadius: BorderRadius.circular(5),
), ),

View File

@@ -0,0 +1,22 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:krezus/domains/budget/budget_bloc.dart';
import 'package:krezus/pages/common/titled_container.dart';
class BudgetProjection extends StatelessWidget {
const BudgetProjection({super.key});
@override
Widget build(BuildContext context) {
return BlocBuilder<BudgetBloc, BudgetState>(
builder: (context, state) => TitledContainer(
title: 'Projection',
child: Column(
children: [
],
)
),
);
}
}

View File

@@ -0,0 +1,100 @@
import 'package:flutter/material.dart';
class EditableColor extends StatelessWidget {
final Color color;
final ValueChanged<Color>? onChanged;
const EditableColor({super.key, required this.color, this.onChanged});
@override
Widget build(BuildContext context) {
return IconButton(
onPressed: () => EditableColorDialog.show(context, color, onChanged),
icon: const Icon(Icons.palette),
color: color,
);
}
}
class EditableColorDialog extends StatefulWidget {
final Color initialColor;
final ValueChanged<Color>? onChanged;
const EditableColorDialog({super.key, required this.initialColor, this.onChanged});
static void show(BuildContext context, Color color, ValueChanged<Color>? onChanged) {
showDialog(
context: context,
barrierDismissible: false,
useRootNavigator: false,
builder: (context) => EditableColorDialog(initialColor: color, onChanged: onChanged)
);
}
static void hide(BuildContext context) => Navigator.pop(context);
@override
State<EditableColorDialog> createState() => _EditableColorDialogState();
}
class _EditableColorDialogState extends State<EditableColorDialog> {
Color? color;
List<Widget> _buildColorList() {
return colors.map((color) => IconButton(
onPressed: () => setState(() => this.color = color),
icon: Icon(
color.value == this.color?.value ? Icons.radio_button_checked : Icons.radio_button_off,
color: color,
)
)).toList();
}
@override
Widget build(BuildContext context) {
color ??= widget.initialColor;
return AlertDialog(
actions: [
IconButton(
onPressed: () => EditableColorDialog.hide(context),
icon: const Icon(Icons.close)
),
IconButton(
onPressed: () {
EditableColorDialog.hide(context);
if (color != null && widget.onChanged != null) {
widget.onChanged!(color!);
}
},
icon: const Icon(Icons.save)
),
],
title: const Text('Edit color'),
content: Row(
children: _buildColorList(),
),
);
}
}
const List<Color> colors = [
Colors.black,
Colors.white,
Colors.red,
Colors.pink,
Colors.purple,
Colors.indigo,
Colors.blue,
Colors.lightBlue,
Colors.cyan,
Colors.teal,
Colors.green,
Colors.lime,
Colors.yellow,
Colors.amber,
Colors.orange,
Colors.deepOrange,
Colors.brown,
Colors.grey,
Colors.blueGrey,
];

View File

@@ -0,0 +1,74 @@
import 'package:flutter/material.dart';
class EditableLabel extends StatefulWidget {
final String initialValue;
final String? hintText;
final ValueChanged<String>? onChanged;
final TextInputType? keyboardType;
const EditableLabel({super.key, required this.initialValue, this.onChanged, this.hintText, this.keyboardType});
@override
State<EditableLabel> createState() => _EditableLabelState();
}
class _EditableLabelState extends State<EditableLabel> {
bool editMode = false;
String? value;
Widget _editMode() {
return Row(
children: [
SizedBox(
width: 200,
height: 50,
child: TextFormField(
keyboardType: widget.keyboardType,
decoration: InputDecoration(
hintText: widget.hintText,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(5),
),
),
initialValue: widget.initialValue,
onChanged: (value) => this.value = value,
)
),
IconButton(
onPressed: () => setState(() {
editMode = !editMode;
}),
icon: const Icon(Icons.close),
),
IconButton(
onPressed: () => setState(() {
editMode = !editMode;
if (value != null && widget.onChanged != null) {
widget.onChanged!(value!);
}
}),
icon: const Icon(Icons.save),
),
],
);
}
Widget _readMode() {
return Row(
children: [
Text(widget.initialValue),
IconButton(
onPressed: () => setState(() {
editMode = !editMode;
}),
icon: const Icon(Icons.edit),
),
],
);
}
@override
Widget build(BuildContext context) {
return editMode ? _editMode() : _readMode();
}
}

View File

@@ -1,6 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:krezus/domains/account/account_bloc.dart'; import 'package:krezus/domains/account/account_bloc.dart';
import 'package:krezus/pages/common/editable_color.dart';
import 'package:krezus/pages/common/editable_label.dart';
import 'package:krezus/pages/common/titled_container.dart'; import 'package:krezus/pages/common/titled_container.dart';
import 'package:krezus/repositories/metadata/models/account.dart'; import 'package:krezus/repositories/metadata/models/account.dart';
@@ -10,10 +12,9 @@ class AccountSettings extends StatelessWidget {
List<Widget> _computeCategoryList(BuildContext context, List<Account> accounts) { List<Widget> _computeCategoryList(BuildContext context, List<Account> accounts) {
return accounts.map((account) => Row( return accounts.map((account) => Row(
children: [ children: [
IconButton( EditableColor(
onPressed: () {},
icon: const Icon(Icons.palette),
color: account.rgbToColor(), color: account.rgbToColor(),
onChanged: (color) => context.read<AccountBloc>().add(AccountEditColor(account, color.value.toRadixString(16).toUpperCase().padLeft(8, '0'))),
), ),
IconButton( IconButton(
onPressed: () => context.read<AccountBloc>().add(AccountEditSaving(account, !account.saving)), onPressed: () => context.read<AccountBloc>().add(AccountEditSaving(account, !account.saving)),
@@ -22,11 +23,12 @@ class AccountSettings extends StatelessWidget {
), ),
Container(width: 5), Container(width: 5),
Expanded( Expanded(
child: Text(account.label) child: EditableLabel(
), initialValue: account.label,
IconButton( onChanged: (value) => context.read<AccountBloc>().add(AccountEditLabel(account, value)),
onPressed: () {}, hintText: 'Acount name',
icon: const Icon(Icons.edit), keyboardType: TextInputType.text,
),
), ),
IconButton( IconButton(
onPressed: () => context.read<AccountBloc>().add(AccountRemove(account)), onPressed: () => context.read<AccountBloc>().add(AccountRemove(account)),

View File

@@ -1,6 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:krezus/domains/category/category_bloc.dart'; import 'package:krezus/domains/category/category_bloc.dart';
import 'package:krezus/pages/common/editable_color.dart';
import 'package:krezus/pages/common/editable_label.dart';
import 'package:krezus/pages/common/titled_container.dart'; import 'package:krezus/pages/common/titled_container.dart';
import 'package:krezus/repositories/metadata/models/category.dart'; import 'package:krezus/repositories/metadata/models/category.dart';
@@ -10,10 +12,9 @@ class CategoriesSettings extends StatelessWidget {
List<Widget> _computeCategoryList(BuildContext context, List<Category> categories) { List<Widget> _computeCategoryList(BuildContext context, List<Category> categories) {
return categories.map((category) => Row( return categories.map((category) => Row(
children: [ children: [
IconButton( EditableColor(
onPressed: () {},
icon: const Icon(Icons.palette),
color: category.rgbToColor(), color: category.rgbToColor(),
onChanged: (color) => context.read<CategoryBloc>().add(CategoryEditColor(category, color.value.toRadixString(16).toUpperCase().padLeft(8, '0'))),
), ),
IconButton( IconButton(
onPressed: () => context.read<CategoryBloc>().add(CategoryEditTransfert(category, !category.transfert)), onPressed: () => context.read<CategoryBloc>().add(CategoryEditTransfert(category, !category.transfert)),
@@ -27,11 +28,12 @@ class CategoriesSettings extends StatelessWidget {
), ),
Container(width: 5), Container(width: 5),
Expanded( Expanded(
child: Text(category.label) child: EditableLabel(
), initialValue: category.label,
IconButton( onChanged: (value) => context.read<CategoryBloc>().add(CategoryEditLabel(category, value)),
onPressed: () {}, hintText: 'Acount name',
icon: const Icon(Icons.edit), keyboardType: TextInputType.text,
),
), ),
IconButton( IconButton(
onPressed: () => context.read<CategoryBloc>().add(CategoryRemove(category)), onPressed: () => context.read<CategoryBloc>().add(CategoryRemove(category)),

View File

@@ -16,7 +16,7 @@ class ImportSettings extends StatelessWidget {
children: [ children: [
FilledButton.icon( FilledButton.icon(
onPressed: () => context.read<AccountBloc>().add(const ClearData()), onPressed: () => context.read<AccountBloc>().add(const ClearData()),
label: const Text('ClearData'), label: const Text('Clear all data'),
icon: const Icon(Icons.delete_forever), icon: const Icon(Icons.delete_forever),
), ),
const SizedBox(height: 5), const SizedBox(height: 5),

View File

@@ -80,6 +80,8 @@ class StatsPage extends StatelessWidget {
child: SizedBox( child: SizedBox(
height: 450, height: 450,
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
CategoriesTotalsChart(categoriesTotals: state.scopedCategoriesPositiveTotals, categoriesTotalsPercents: state.scopedSimplifiedCategoriesPositiveTotalsPercents), CategoriesTotalsChart(categoriesTotals: state.scopedCategoriesPositiveTotals, categoriesTotalsPercents: state.scopedSimplifiedCategoriesPositiveTotalsPercents),
CategoriesTotalsChart(categoriesTotals: state.scopedCategoriesNegativeTotals, categoriesTotalsPercents: state.scopedSimplifiedCategoriesNegativeTotalsPercents), CategoriesTotalsChart(categoriesTotals: state.scopedCategoriesNegativeTotals, categoriesTotalsPercents: state.scopedSimplifiedCategoriesNegativeTotalsPercents),

View File

@@ -29,7 +29,7 @@ class GlobalTotalChart extends StatelessWidget {
lineTouchData: LineTouchData( lineTouchData: LineTouchData(
touchTooltipData: LineTouchTooltipData( touchTooltipData: LineTouchTooltipData(
maxContentWidth: 100, maxContentWidth: 100,
tooltipBgColor: Theme.of(context).colorScheme.primaryContainer, getTooltipColor: (LineBarSpot _) => Theme.of(context).colorScheme.primaryContainer,
getTooltipItems: (touchedSpots) { getTooltipItems: (touchedSpots) {
return touchedSpots.map((LineBarSpot touchedSpot) { return touchedSpots.map((LineBarSpot touchedSpot) {
final textStyle = TextStyle( final textStyle = TextStyle(

View File

@@ -94,7 +94,8 @@ class MonthlyCategoriesTotalChart extends StatelessWidget {
enabled: true, enabled: true,
handleBuiltInTouches: false, handleBuiltInTouches: false,
touchTooltipData: BarTouchTooltipData( touchTooltipData: BarTouchTooltipData(
tooltipBgColor: Colors.transparent, // tooltipBgColor: Colors.transparent,
getTooltipColor: (BarChartGroupData _) => Colors.transparent,
tooltipMargin: 0, tooltipMargin: 0,
getTooltipItem:(group, groupIndex, rod, rodIndex) { getTooltipItem:(group, groupIndex, rod, rodIndex) {
String value = NumberFormat("#00").format(rod.toY); String value = NumberFormat("#00").format(rod.toY);

View File

@@ -15,13 +15,13 @@ class TransactionForm extends StatelessWidget {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
_TransactionDateInput(), _TransactionDateInput(),
const SizedBox(height: 10,), const SizedBox(height: 35,),
_TransactionCategoryInput(), _TransactionCategoryInput(),
const SizedBox(height: 10,), const SizedBox(height: 35,),
_TransactionDescriptionInput(), _TransactionDescriptionInput(),
const SizedBox(height: 10,), const SizedBox(height: 35,),
_TransactionAccountInput(), _TransactionAccountInput(),
const SizedBox(height: 10,), const SizedBox(height: 35,),
_TransactionValueInput() _TransactionValueInput()
], ],
); );
@@ -37,8 +37,11 @@ class _TransactionDateInput extends StatelessWidget {
builder: (context, state) => SizedBox( builder: (context, state) => SizedBox(
width: 500, width: 500,
child: TextFormField( child: TextFormField(
initialValue: DateFormat('dd-MM-yyyy', 'fr_FR').format(state.transactionDate.value ?? DateTime.now()),
keyboardType: TextInputType.datetime, keyboardType: TextInputType.datetime,
readOnly: true,
controller: TextEditingController(
text: DateFormat('dd-MM-yyyy', 'fr_FR').format(state.transactionDate.value ?? DateTime.now()),
),
onTap: () { onTap: () {
FocusScope.of(context).requestFocus(FocusNode()); FocusScope.of(context).requestFocus(FocusNode());
showDatePicker( showDatePicker(
@@ -53,7 +56,7 @@ class _TransactionDateInput extends StatelessWidget {
}, },
decoration: InputDecoration( decoration: InputDecoration(
icon: const Icon(Icons.calendar_month), icon: const Icon(Icons.calendar_month),
hintText: 'Date', label: const Text('Date'),
errorText: state.transactionDate.isNotValid ? state.transactionDate.error?.message : null, errorText: state.transactionDate.isNotValid ? state.transactionDate.error?.message : null,
border: OutlineInputBorder( border: OutlineInputBorder(
borderRadius: BorderRadius.circular(5), borderRadius: BorderRadius.circular(5),
@@ -79,7 +82,7 @@ class _TransactionCategoryInput extends StatelessWidget {
items: categoryState.categories.map((e) => DropdownMenuItem(value: e.label, child: Text(e.label))).toList(), items: categoryState.categories.map((e) => DropdownMenuItem(value: e.label, child: Text(e.label))).toList(),
decoration: InputDecoration( decoration: InputDecoration(
icon: const Icon(Icons.category), icon: const Icon(Icons.category),
hintText: 'Category', label: const Text('Category'),
errorText: state.transactionCategory.isNotValid ? state.transactionCategory.error?.message : null, errorText: state.transactionCategory.isNotValid ? state.transactionCategory.error?.message : null,
border: OutlineInputBorder( border: OutlineInputBorder(
borderRadius: BorderRadius.circular(5), borderRadius: BorderRadius.circular(5),
@@ -101,7 +104,7 @@ class _TransactionDescriptionInput extends StatelessWidget {
child: TextFormField( child: TextFormField(
decoration: InputDecoration( decoration: InputDecoration(
icon: const Icon(Icons.description), icon: const Icon(Icons.description),
hintText: 'Description', label: const Text('Description'),
errorText: state.transactionDescription.isNotValid ? state.transactionDescription.error?.message : null, errorText: state.transactionDescription.isNotValid ? state.transactionDescription.error?.message : null,
border: OutlineInputBorder( border: OutlineInputBorder(
borderRadius: BorderRadius.circular(5), borderRadius: BorderRadius.circular(5),
@@ -129,7 +132,7 @@ class _TransactionAccountInput extends StatelessWidget {
items: accountState.accounts.map((e) => DropdownMenuItem(value: e.label, child: Text(e.label))).toList(), items: accountState.accounts.map((e) => DropdownMenuItem(value: e.label, child: Text(e.label))).toList(),
decoration: InputDecoration( decoration: InputDecoration(
icon: const Icon(Icons.account_box), icon: const Icon(Icons.account_box),
hintText: 'Account', label: const Text('Account'),
errorText: state.transactionAccount.isNotValid ? state.transactionAccount.error?.message : null, errorText: state.transactionAccount.isNotValid ? state.transactionAccount.error?.message : null,
border: OutlineInputBorder( border: OutlineInputBorder(
borderRadius: BorderRadius.circular(5), borderRadius: BorderRadius.circular(5),
@@ -152,7 +155,7 @@ class _TransactionValueInput extends StatelessWidget {
keyboardType: TextInputType.number, keyboardType: TextInputType.number,
decoration: InputDecoration( decoration: InputDecoration(
icon: const Icon(Icons.euro), icon: const Icon(Icons.euro),
hintText: '\$\$\$', label: const Text('\$\$\$'),
errorText: state.transactionValue.isNotValid ? state.transactionValue.error?.message : null, errorText: state.transactionValue.isNotValid ? state.transactionValue.error?.message : null,
border: OutlineInputBorder( border: OutlineInputBorder(
borderRadius: BorderRadius.circular(5), borderRadius: BorderRadius.circular(5),

View File

@@ -4,11 +4,13 @@ class Account {
String label; String label;
String color; String color;
bool saving; bool saving;
double interest;
Account({ Account({
this.label = '', this.label = '',
this.color = '', this.color = '',
this.saving = false, this.saving = false,
this.interest = 0.0,
}); });
factory Account.fromJson(Map<String, dynamic> json) { factory Account.fromJson(Map<String, dynamic> json) {
@@ -16,6 +18,7 @@ class Account {
label: json['label'], label: json['label'],
color: json['color'], color: json['color'],
saving: bool.parse(json['saving']), saving: bool.parse(json['saving']),
interest: double.parse(json['intereset']),
); );
} }
@@ -23,6 +26,7 @@ class Account {
'label': label, 'label': label,
'color': color, 'color': color,
'saving': saving.toString(), 'saving': saving.toString(),
'intereset': interest.toString(),
}; };
Color rgbToColor() { Color rgbToColor() {

View File

@@ -13,10 +13,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: args name: args
sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.4.2" version: "2.5.0"
async: async:
dependency: transitive dependency: transitive
description: description:
@@ -29,10 +29,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: bloc name: bloc
sha256: f53a110e3b48dcd78136c10daa5d51512443cea5e1348c9d80a320095fa2db9e sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "8.1.3" version: "8.1.4"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
@@ -89,6 +89,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.1.1" version: "3.1.1"
cross_file:
dependency: transitive
description:
name: cross_file
sha256: fedaadfa3a6996f75211d835aaeb8fede285dae94262485698afd832371b9a5e
url: "https://pub.dev"
source: hosted
version: "0.3.3+8"
crypto: crypto:
dependency: transitive dependency: transitive
description: description:
@@ -101,26 +109,26 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: csv name: csv
sha256: "63ed2871dd6471193dffc52c0e6c76fb86269c00244d244297abbb355c84a86e" sha256: c6aa2679b2a18cb57652920f674488d89712efaf4d3fdf2e537215b35fc19d6c
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.1.1" version: "6.0.0"
cupertino_icons: cupertino_icons:
dependency: "direct main" dependency: "direct main"
description: description:
name: cupertino_icons name: cupertino_icons
sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.6" version: "1.0.8"
dynamic_color: dynamic_color:
dependency: "direct main" dependency: "direct main"
description: description:
name: dynamic_color name: dynamic_color
sha256: a866f1f8947bfdaf674d7928e769eac7230388a2e7a2542824fad4bb5b87be3b sha256: eae98052fa6e2826bdac3dd2e921c6ce2903be15c6b7f8b6d8a5d49b5086298d
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.6.9" version: "1.7.0"
equatable: equatable:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -149,10 +157,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: file_picker name: file_picker
sha256: "4e42aacde3b993c5947467ab640882c56947d9d27342a5b6f2895b23956954a6" sha256: d1d0ac3966b36dc3e66eeefb40280c17feb87fa2099c6e22e6a1fc959327bd03
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.1.1" version: "8.0.0+1"
fixnum: fixnum:
dependency: transitive dependency: transitive
description: description:
@@ -165,26 +173,26 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: fl_chart name: fl_chart
sha256: "00b74ae680df6b1135bdbea00a7d1fc072a9180b7c3f3702e4b19a9943f5ed7d" sha256: "2b7c1f5d867da9a054661641c8f499c55c47c39acccb97b3bc673f5fa9a39e74"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.66.2" version: "0.67.0"
flex_color_picker: flex_color_picker:
dependency: "direct main" dependency: "direct main"
description: description:
name: flex_color_picker name: flex_color_picker
sha256: "0871edc170153cfc3de316d30625f40a85daecfa76ce541641f3cc0ec7757cbf" sha256: "5c846437069fb7afdd7ade6bf37e628a71d2ab0787095ddcb1253bf9345d5f3a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.3.1" version: "3.4.1"
flex_seed_scheme: flex_seed_scheme:
dependency: transitive dependency: transitive
description: description:
name: flex_seed_scheme name: flex_seed_scheme
sha256: "29c12aba221eb8a368a119685371381f8035011d18de5ba277ad11d7dfb8657f" sha256: "4cee2f1d07259f77e8b36f4ec5f35499d19e74e17c7dce5b819554914082bc01"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.4.0" version: "1.5.0"
flutter: flutter:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
@@ -194,10 +202,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_bloc name: flutter_bloc
sha256: "87325da1ac757fcc4813e6b34ed5dd61169973871fdf181d6c2109dd6935ece1" sha256: f0ecf6e6eb955193ca60af2d5ca39565a86b8a142452c5b24d96fb477428f4d2
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "8.1.4" version: "8.1.5"
flutter_keyboard_visibility: flutter_keyboard_visibility:
dependency: transitive dependency: transitive
description: description:
@@ -258,23 +266,18 @@ packages:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: flutter_lints name: flutter_lints
sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7 sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.1" version: "3.0.2"
flutter_localizations:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_plugin_android_lifecycle: flutter_plugin_android_lifecycle:
dependency: transitive dependency: transitive
description: description:
name: flutter_plugin_android_lifecycle name: flutter_plugin_android_lifecycle
sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da sha256: "8cf40eebf5dec866a6d1956ad7b4f7016e6c0cc69847ab946833b7d43743809f"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.17" version: "2.0.19"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@@ -309,14 +312,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.1.7" version: "4.1.7"
intl:
dependency: "direct main"
description:
name: intl
sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d"
url: "https://pub.dev"
source: hosted
version: "0.18.1"
js: js:
dependency: transitive dependency: transitive
description: description:
@@ -393,18 +388,18 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: path_provider name: path_provider
sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.2" version: "2.1.3"
path_provider_android: path_provider_android:
dependency: transitive dependency: transitive
description: description:
name: path_provider_android name: path_provider_android
sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.2" version: "2.2.4"
path_provider_foundation: path_provider_foundation:
dependency: transitive dependency: transitive
description: description:
@@ -497,18 +492,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: pointycastle name: pointycastle
sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29" sha256: "79fbafed02cfdbe85ef3fd06c7f4bc2cbcba0177e61b765264853d4253b21744"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.7.4" version: "3.9.0"
provider: provider:
dependency: transitive dependency: transitive
description: description:
name: provider name: provider
sha256: "9a96a0a19b594dbc5bf0f1f27d2bc67d5f95957359b461cd9feb44ed6ae75096" sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.1.1" version: "6.1.2"
rxdart: rxdart:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -590,10 +585,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: uuid name: uuid
sha256: cd210a09f7c18cbe5a02511718e0334de6559871052c90a90c0cca46a4aa81c8 sha256: "814e9e88f21a176ae1359149021870e87f7cddaf633ab678a5d2b0bff7fd1ba8"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.3.3" version: "4.4.0"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:

View File

@@ -12,17 +12,14 @@ dependencies:
sdk: flutter sdk: flutter
cupertino_icons: ^1.0.2 cupertino_icons: ^1.0.2
fl_chart: ^0.66.2 fl_chart: ^0.67.0
logging: ^1.2.0 logging: ^1.2.0
flutter_bloc: ^8.1.4 flutter_bloc: ^8.1.4
path_provider: ^2.1.1 path_provider: ^2.1.1
equatable: ^2.0.5 equatable: ^2.0.5
rxdart: ^0.27.7 rxdart: ^0.27.7
file_picker: ^6.1.1 file_picker: ^8.0.0+1
csv: ^5.1.1 csv: ^6.0.0
flutter_localizations:
sdk: flutter
intl: any
formz: ^0.7.0 formz: ^0.7.0
uuid: ^4.3.2 uuid: ^4.3.2
flutter_typeahead: ^5.2.0 flutter_typeahead: ^5.2.0