Skip to content
This repository has been archived by the owner on Oct 4, 2024. It is now read-only.

Mathisi/feature/99 UI create transaction detail page #296

Draft
wants to merge 15 commits into
base: main
Choose a base branch
from
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ class _CategoriesScreenState extends State<CategoriesScreen> {
late Map<Category, Iterable<Income>> incomesCategories;
late Map<Category, Iterable<Expense>> expenseCategories;

List<Income> incomes = List.empty();
List<Expense> expenses = List.empty();
List<Income> incomes = List.empty(growable: true);
List<Expense> expenses = List.empty(growable: true);

@override
void initState() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:cashcompass/controller/controller.dart';
import 'package:cashcompass/widgets/transactions_list_widgets/transactions_list.dart';
import 'package:cashcompass_hook/src/chart_of_accounts.dart/chart_of_accounts.dart';
import 'package:flutter/cupertino.dart';

class LatestTransactionsScreen extends StatefulWidget {
Expand All @@ -13,13 +14,14 @@ class LatestTransactionsScreen extends StatefulWidget {
class _LatestTransactionsScreenState extends State<LatestTransactionsScreen> {
@override
Widget build(BuildContext context) {
ChartOfAccounts chartOfAccounts =
ChartOfAccounts(Controller.accountManager);
return CupertinoPageScaffold(
navigationBar: const CupertinoNavigationBar(
middle: Text("Latest Transactions"),
),
child: SafeArea(
child: TransactionsList(
transactions: Controller.accountManager.data.transactions),
child: TransactionsList(),
),
);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,341 @@
import 'package:cashcompass/controller/controller.dart';
import 'package:cashcompass/widgets/transactions_list_widgets/InterpretedTransaction.dart';
import 'package:cashcompass_hook/src/accounts/category/category_icons.dart';
import 'package:cashcompass_hook/src/transactions/transactions/transaction.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

import 'package:cashcompass_hook/src/chart_of_accounts.dart/chart_of_accounts.dart';

import 'package:cashcompass_hook/src/data_storage/accout_manager.dart';
import '../../widgets/transactions_list_widgets/transactions_list.dart';

enum Selection { income, expense }

class TransactionsDetailScreen extends StatefulWidget {
bool editMode;
final Transaction? transaction;
TransactionsDetailScreen({Key? key, required this.editMode, this.transaction})
: super(key: key);

@override
_TransactionsDetailScreenState createState() =>
_TransactionsDetailScreenState();
}

class _TransactionsDetailScreenState extends State<TransactionsDetailScreen> {
Selection? selectedValue;
late TextEditingController _amountController;
late TextEditingController _walletController;
late TextEditingController _titleController;
late TextEditingController _noteController;
DateTime? _timestamp;
String _selectedDate = "";
CategoryIcons selectedIcon = CategoryIcons.values.first;

InterpretedTransaction? interpretedTransaction;

@override
void initState() {
super.initState();
_amountController = TextEditingController();
_walletController = TextEditingController();
_titleController = TextEditingController();
_noteController = TextEditingController();

if (widget.transaction != null) {
interpretedTransaction = interpretTransaction(widget.transaction!);
_amountController.text = widget.transaction!.amount.toString();
_walletController.text = interpretedTransaction!.walletName;
_titleController.text = widget.transaction!.label;
selectedValue = interpretedTransaction!.isExpense
? Selection.expense
: Selection.income;

// Set initial date from interpretedTransaction
DateTime transactionDate =
widget.transaction!.timestamp; // Assuming date format is yyyy-MM-dd
_selectedDate =
"${transactionDate.year}-${transactionDate.month.toString().padLeft(2, '0')}-${transactionDate.day.toString().padLeft(2, '0')}";
}
}

@override
void dispose() {
_amountController.dispose();
_walletController.dispose();
_titleController.dispose();
_noteController.dispose();
super.dispose();
}

Future<void> _selectDate(BuildContext context) async {
_timestamp = await showCupertinoModalPopup<DateTime>(
context: context,
builder: (BuildContext context) {
return Container(
height: 216,
padding: const EdgeInsets.only(top: 6.0),
color: CupertinoColors.white,
child: DefaultTextStyle(
style: const TextStyle(
color: CupertinoColors.black,
fontSize: 22.0,
),
child: GestureDetector(
onTap: () {
Navigator.of(context).pop();
},
child: SafeArea(
top: false,
child: CupertinoDatePicker(
mode: CupertinoDatePickerMode.date,
initialDateTime: DateTime.now(),
onDateTimeChanged: (DateTime newDate) {
setState(() {
_selectedDate =
"${newDate.year}-${newDate.month.toString().padLeft(2, '0')}-${newDate.day.toString().padLeft(2, '0')}";
});
},
),
),
),
),
);
},
);
}

Future<void> _showPicker() async {
await showCupertinoModalPopup<void>(
context: context,
builder: (BuildContext context) {
return Container(
height: 200,
padding: EdgeInsets.all(8.0),
color: CupertinoColors.white,
child: CupertinoPicker(
itemExtent: 35,
onSelectedItemChanged: (index) {
setState(() {
selectedIcon = CategoryIcons.values[index];
});
},
children: CategoryIcons.values
.map((icon) => Row(
children: [
Icon(icon.icon),
SizedBox(width: 10),
Text(icon.name),
],
))
.toList(),
),
);
},
);
}

@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text("Transaction Detail"),
trailing: IconButton(
icon: Icon(CupertinoIcons.pencil),
onPressed: () {
setState(() {
widget.editMode = !widget.editMode;
});
},
),
),
child: SafeArea(
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
children: [
FractionallySizedBox(
widthFactor: 1,
child: Padding(
padding: const EdgeInsets.only(bottom: 20.0),
child: CupertinoSlidingSegmentedControl<Selection>(
onValueChanged: widget.editMode
? handleExpenseIncomeChanged
: (Selection? selection) {},
children: {
Selection.income: Padding(
padding: EdgeInsets.all(10),
child: Text('Income'),
),
Selection.expense: Padding(
padding: EdgeInsets.all(10),
child: Text('Expense'),
),
},
groupValue: selectedValue,
),
),
),
Container(
decoration: BoxDecoration(
color: CupertinoColors.white,
borderRadius: BorderRadius.circular(15),
),
padding: EdgeInsets.all(8),
child: Table(
columnWidths: {
0: FractionColumnWidth(0.3),
},
defaultVerticalAlignment: TableCellVerticalAlignment.middle,
children: [
TableRow(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Text('Amount'),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: CupertinoTextField(
controller: _amountController,
readOnly: !widget.editMode,
keyboardType: TextInputType.number,
),
),
],
),
TableRow(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Text('Wallet'),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: CupertinoTextField(
controller: _walletController,
readOnly: !widget.editMode,
),
),
],
),
TableRow(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Text('Category'),
),
CupertinoButton(
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Icon(selectedIcon.icon),
SizedBox(width: 10),
Text(selectedIcon.name),
],
),
onPressed: widget.editMode ? _showPicker : null,
),
],
),
TableRow(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Text('Date'),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: GestureDetector(
onTap: widget.editMode
? () => _selectDate(context)
: null,
child: Container(
alignment: Alignment.centerLeft,
height: 44.0,
child: Text(
_selectedDate.isEmpty
? "Select Date"
: _selectedDate,
style: TextStyle(
color: _selectedDate.isEmpty
? CupertinoColors.placeholderText
: CupertinoColors.black,
),
),
),
),
),
],
),
TableRow(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Text('Title'),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: CupertinoTextField(
controller: _titleController,
readOnly: !widget.editMode,
),
),
],
),
TableRow(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Text('Note'),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: CupertinoTextField(
controller: _noteController,
readOnly: !widget.editMode,
maxLines: 3,
),
),
],
),
],
),
),
Padding(
padding: const EdgeInsets.all(20.0),
child: CupertinoButton(
child: Text(!widget.editMode ? "DELETE" : "SAVE"),
onPressed: handleDeleteTransaction,
color: !widget.editMode
? CupertinoColors.systemRed
: CupertinoColors.systemGreen,
),
),
],
),
),
),
),
);
}

void handleExpenseIncomeChanged(Selection? selection) {
setState(() {
selectedValue = selection;
});
}

void handleDeleteTransaction() {
var chart = ChartOfAccounts(Controller.accountManager);
chart.createTransaction(
Controller.accountManager.getAccount(22)!,
Controller.accountManager.getAccount(11)!,
_titleController.text,
double.parse(_amountController.text),
_timestamp ?? DateTime.now());
Navigator.of(context).pop();
}
}
Loading