Basic budget sliders

This commit is contained in:
2024-02-25 19:20:18 +01:00
parent 2b53d1ab74
commit 979fecb60a
10 changed files with 219 additions and 71 deletions

View File

@@ -11,7 +11,7 @@ class BudgetsPage extends StatelessWidget {
return Center(
child: Container(
constraints: const BoxConstraints(
maxWidth: 1000
maxWidth: 1000,
),
child: ListView(
padding: mediaQuery.padding.copyWith(left: 10.0, right: 10.0, bottom: 100.0),

View File

@@ -1,73 +1,104 @@
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:intl/intl.dart';
import 'package:tunas/domains/budget/budget_bloc.dart';
import 'package:tunas/pages/common/titled_container.dart';
import 'package:tunas/repositories/metadata/models/budget.dart';
import 'package:uuid/uuid.dart';
class MonthDistribution extends StatelessWidget {
const MonthDistribution({super.key});
List<Widget> _computeBudgetLines(BuildContext context, List<Budget> budgets, double initialBudget, double remainingBudget) {
List<Widget> list = [
Text('Money to spare: ${NumberFormat('#####00.00 €', 'fr_FR').format(remainingBudget)} € / $initialBudget'),
];
list.addAll(budgets.map((budget) => Row(
children: [
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(budget.label),
Text(NumberFormat('#####00.00 €', 'fr_FR').format(budget.value)),
],
)
),
Expanded(
child: SliderTheme(
data: SliderThemeData(
),
child: Slider(
min: 0,
max: initialBudget,
label: budget.value.round().toString(),
value: budget.value,
secondaryTrackValue: remainingBudget + budget.value,
onChanged: (value) => context.read<BudgetBloc>().add(BudgetSetValue(budget, value)),
),
)
)
],
)).toList());
return list;
}
@override
Widget build(BuildContext context) {
return Column(
children: [
TitledContainer(
title: 'Prepare',
child: Column(
children: [
Text('Money to spare: 2300 €'),
Text('Loyer'),
Slider(
min: 0,
max: 2300,
value: 200,
onChanged: (value) => {},
),
Text('Loyer'),
Slider(
min: 0,
max: 2300,
value: 200,
onChanged: (value) => {},
),
],
return BlocBuilder<BudgetBloc, BudgetState>(
builder: (context, state) => Column(
children: [
TitledContainer(
title: 'Prepare',
action: IconButton(
onPressed: () => context.read<BudgetBloc>().add(BudgetAdd(const Uuid().v8())),
icon: const Icon(Icons.add),
),
child: Column(
children: _computeBudgetLines(context, state.budgets, state.initialBudget, state.remainingBudget),
),
),
),
TitledContainer(
title: 'Compare',
height: 500,
child: Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Budget'),
],
TitledContainer(
title: 'Compare',
height: 500,
child: Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Budget'),
],
),
),
),
Expanded(
child: Column(
children: [
Row(
children: [
IconButton(
onPressed: () => {},
icon: const Icon(Icons.skip_previous)
),
Text('Fev 2024'),
IconButton(
onPressed: () => {},
icon: const Icon(Icons.skip_next)
),
],
),
],
Expanded(
child: Column(
children: [
Row(
children: [
IconButton(
onPressed: () => {},
icon: const Icon(Icons.skip_previous)
),
Text('Fev 2024'),
IconButton(
onPressed: () => {},
icon: const Icon(Icons.skip_next)
),
],
),
],
)
)
)
],
],
),
),
),
],
],
)
);
}
}

View File

@@ -11,6 +11,7 @@ class DataPage extends StatelessWidget {
MediaQueryData mediaQuery = MediaQuery.of(context);
return Center(
child: Container(
margin: const EdgeInsets.symmetric(vertical: 11, horizontal: 0),
constraints: const BoxConstraints(
maxWidth: 1000
),

View File

@@ -8,8 +8,6 @@ import 'package:tunas/pages/stats/widgets/monthly_categories_total_chart.dart';
import 'package:tunas/pages/stats/widgets/global_total_chart.dart';
import 'package:tunas/pages/stats/widgets/profit_indicator.dart';
import 'package:tunas/pages/stats/widgets/year_selector.dart';
import 'package:tunas/repositories/metadata/metadata_repository.dart';
import 'package:tunas/repositories/transactions/transactions_repository.dart';
class StatsPage extends StatelessWidget {
const StatsPage({super.key});

View File

@@ -57,8 +57,12 @@ class TransactionsHeader extends StatelessWidget {
return Container(
padding: const EdgeInsets.symmetric(vertical: 9, horizontal: 10),
margin: const EdgeInsets.symmetric(vertical: 2, horizontal: 10),
decoration: const BoxDecoration(
border: Border(bottom: BorderSide(color: Colors.black))
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: Theme.of(context).colorScheme.onPrimaryContainer
)
)
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,