Feat: Macht die Dashboard-Seite funktional

This commit is contained in:
2025-12-31 16:44:29 +01:00
parent f765ba6268
commit 4014757319
9 changed files with 845 additions and 239 deletions

View File

@@ -0,0 +1,250 @@
import 'dart:async';
import 'package:drift/drift.dart';
import 'package:flutter/material.dart';
import '../Entities/drift_database.dart';
import '../Pages/Dialog/dialog_action.dart';
import '../Pages/Dialog/dialog_input_field.dart';
import '../Pages/Dialog/dialog_input_field_type_enum.dart';
import '../Pages/Dialog/dialog_type_enum.dart';
import '../Pages/Dialog/dynamic_dialog.dart';
import '../Repositories/transaction_repository.dart';
import 'account_controller.dart';
/// Steuert die Interaktion mit den Transaktionen
class TransactionController {
/// Gibt die aktuell gültige Instanz der Klasse zurück
factory TransactionController() => _instance;
/// Erstellt eine neue Instanz dieser Klasse
TransactionController._internal() {
_newTransactionDialog = DynamicDialog(
title: 'Neue Transaktion erstellen',
icon: Icons.swap_horiz,
inputFields: [
const DialogInputField(id: 'name', label: 'Name', autoFocus: true),
DialogInputField(
id: 'date',
label: 'Transaktionsdatum',
keyboardType: TextInputType.datetime,
inputType: DialogInputFieldTypeEnum.date,
initialValue: DateTime.now(),
),
const DialogInputField(
id: 'amount',
label: 'Betrag €',
keyboardType: TextInputType.number,
),
],
actions: [
DialogAction(label: 'Abbruch'),
DialogAction(
label: 'Speichern',
isPrimary: true,
onPressed: _saveNewTransaction,
),
],
);
_errorTransactionValueEmptyDialog = DynamicDialog(
title: 'Fehler!',
icon: Icons.error,
content: const Text('Es wurden nicht alle Werte eingetragen!'),
dialogType: DialogTypeEnum.error,
);
_transactionCreatedDialog = DynamicDialog(
title: 'Transaktion erstellt!',
icon: Icons.check_circle,
content: const Text('Die Transaktion wurde erfolgreich erstellt!'),
dialogType: DialogTypeEnum.success,
);
_selectedAccount = _accountController.selected.value;
_accountController.selected.addListener(() {
_selectedAccount = _accountController.selected.value;
unawaited(updateTransactions());
});
unawaited(updateTransactions());
}
static final TransactionController _instance =
TransactionController._internal();
final TransactionRepository _transactionRepository = TransactionRepository();
final AccountController _accountController = AccountController();
DynamicDialog? _newTransactionDialog;
DynamicDialog? _errorTransactionValueEmptyDialog;
DynamicDialog? _transactionCreatedDialog;
final ValueNotifier<List<Transaction>> _transactions =
ValueNotifier<List<Transaction>>([]);
/// Stellt die Liste der Transaktionen dar
ValueNotifier<List<Transaction>> get transactions {
if (_transactions.value == []) {
unawaited(updateTransactions());
}
return _transactions;
}
set transactions(final List<Transaction> transactions) {
_transactions.value = transactions;
}
Account? _selectedAccount;
/// Aktualisiert die Transaktionen in der internen Liste
Future<void> updateTransactions() async {
if (_selectedAccount != null) {
final List<Transaction> transactions = await _transactionRepository
.findBy(account: _selectedAccount, orderBy: 'dateDesc');
_transactions.value = transactions;
}
}
/// Startet den Prozess, um eine neue Transaktion anzulegen
void newTransactionHandler() {
unawaited(_newTransactionDialog?.show());
}
/// Startet den Prozess, um eine Transaktion zu bearbeiten
Future<void> editTransaction(final int transactionId) async {
final Transaction? transaction = await _transactionRepository.find(
transactionId,
);
if (transaction != null) {
final editTransactionDialog = DynamicDialog(
title: '${transaction.name} umbenennen',
icon: Icons.edit,
inputFields: [
DialogInputField(
id: 'name',
label: 'Name',
autoFocus: true,
initialValue: transaction.name,
),
DialogInputField(
id: 'date',
label: 'Transaktionsdatum',
keyboardType: TextInputType.datetime,
inputType: DialogInputFieldTypeEnum.date,
initialValue: transaction.date,
),
DialogInputField(
id: 'amount',
label: 'Betrag €',
keyboardType: TextInputType.number,
initialValue: transaction.amount.toString(),
),
],
actions: [
DialogAction(label: 'Abbruch'),
DialogAction(
label: 'Speichern',
isPrimary: true,
onPressed: _editTransaction,
),
],
hiddenValues: {'transaction': transaction},
);
unawaited(editTransactionDialog.show());
}
}
/// Startet den Prozess, um eine Transaktion zu löschen
Future<void> deleteTransactionHandler(final int transactionId) async {
final Transaction? transaction = await _transactionRepository.find(
transactionId,
);
if (transaction != null) {
final deleteTransactionDialog = DynamicDialog(
dialogType: DialogTypeEnum.error,
title: '${transaction.name} löschen',
content: Text('Willst du ${transaction.name} wirklich löschen?'),
icon: Icons.delete_forever,
actions: [
DialogAction(label: 'Abbruch', isPrimary: true),
DialogAction(
label: 'Transaktion löschen',
onPressed: _deleteTransaction,
),
],
hiddenValues: {'transaction': transaction},
);
unawaited(deleteTransactionDialog.show());
}
}
Future<void> _saveNewTransaction(final Map<String, dynamic> values) async {
if (values['name'] == null ||
values['name'] == '' ||
values['date'] == null ||
values['date'] == '' ||
values['amount'] == null ||
values['amount'] == '' ||
_selectedAccount == null) {
await _errorTransactionValueEmptyDialog?.show();
} else {
final String amount = values['amount'];
values['amount'] = double.tryParse(amount);
if (values['amount'] == null || values['amount'] == 0) {
await _errorTransactionValueEmptyDialog?.show();
} else {
final transaction = TransactionsCompanion(
name: Value(values['name']),
date: Value(values['date']),
amount: Value(values['amount']),
accountId: Value(_selectedAccount!.id),
);
await _transactionRepository.add(transaction);
await _transactionCreatedDialog?.show();
await updateTransactions();
}
}
}
Future<void> _editTransaction(final Map<String, dynamic> values) async {
if (values['transaction'] != null &&
values['transaction'] != null &&
values['date'] != null &&
values['date'] != '' &&
values['amount'] != null &&
values['amount'] != '') {
final String amount = values['amount'];
values['amount'] = double.tryParse(amount);
if (values['amount'] != null && values['amount'] != 0) {
final Transaction transaction = values['transaction'];
final rtc = TransactionsCompanion(
id: Value(transaction.id),
name: Value(values['name']),
date: Value(values['date']),
amount: Value(values['amount']),
accountId: Value(transaction.accountId),
);
await _transactionRepository.update(rtc);
await updateTransactions();
}
}
}
Future<void> _deleteTransaction(final Map<String, dynamic> values) async {
if (values['transaction'] != null) {
final Transaction transaction = values['transaction'];
await _transactionRepository.remove(transaction);
await updateTransactions();
}
}
}