Basic budget sliders
This commit is contained in:
@@ -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),
|
||||
|
||||
@@ -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)
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
)
|
||||
)
|
||||
)
|
||||
],
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
],
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
),
|
||||
|
||||
@@ -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});
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user