5 Commits

Author SHA1 Message Date
84b8541822 Fixed match edit error with game
Some checks failed
Pull Request Pipeline / test (pull_request) Successful in 39s
Pull Request Pipeline / lint (pull_request) Failing after 46s
2026-03-08 11:00:42 +01:00
544e55c4fd Merge branch 'development' into feature/132-verschiedene-regelsaetze-implementieren
# Conflicts:
#	lib/l10n/arb/app_de.arb
#	lib/l10n/arb/app_en.arb
#	lib/l10n/generated/app_localizations.dart
#	lib/l10n/generated/app_localizations_de.dart
#	lib/l10n/generated/app_localizations_en.dart
#	lib/presentation/views/main_menu/match_view/match_result_view.dart
2026-03-08 10:57:33 +01:00
c50ad288fa Implemented basic structure
Some checks failed
Pull Request Pipeline / test (pull_request) Successful in 39s
Pull Request Pipeline / lint (pull_request) Failing after 44s
2026-03-08 08:29:45 +01:00
494dec8c61 Added localizations 2026-03-08 08:29:15 +01:00
975679b048 Updated dependencie 2026-03-08 08:24:35 +01:00
7 changed files with 96 additions and 15 deletions

View File

@@ -22,10 +22,11 @@
"days_ago": "vor {count} Tagen", "days_ago": "vor {count} Tagen",
"delete": "Löschen", "delete": "Löschen",
"delete_all_data": "Alle Daten löschen", "delete_all_data": "Alle Daten löschen",
"delete_group": "Diese Gruppe löschen", "delete_group": "Gruppe löschen",
"delete_match": "Spiel löschen", "delete_match": "Spiel löschen",
"edit_group": "Gruppe bearbeiten", "edit_group": "Gruppe bearbeiten",
"edit_match": "Gruppe bearbeiten", "edit_match": "Gruppe bearbeiten",
"enter_points": "Punkte eingeben",
"enter_results": "Ergebnisse eintragen", "enter_results": "Ergebnisse eintragen",
"error_creating_group": "Fehler beim Erstellen der Gruppe, bitte erneut versuchen", "error_creating_group": "Fehler beim Erstellen der Gruppe, bitte erneut versuchen",
"error_deleting_group": "Fehler beim Löschen der Gruppe, bitte erneut versuchen", "error_deleting_group": "Fehler beim Löschen der Gruppe, bitte erneut versuchen",
@@ -87,7 +88,8 @@
"save_changes": "Änderungen speichern", "save_changes": "Änderungen speichern",
"search_for_groups": "Nach Gruppen suchen", "search_for_groups": "Nach Gruppen suchen",
"search_for_players": "Nach Spieler:innen suchen", "search_for_players": "Nach Spieler:innen suchen",
"select_winner": "Gewinner:in wählen:", "select_winner": "Gewinner:in wählen",
"select_loser": "Verlierer:in wählen",
"selected_players": "Ausgewählte Spieler:innen", "selected_players": "Ausgewählte Spieler:innen",
"settings": "Einstellungen", "settings": "Einstellungen",
"single_loser": "Ein:e Verlierer:in", "single_loser": "Ein:e Verlierer:in",

View File

@@ -83,6 +83,9 @@
"@edit_match": { "@edit_match": {
"description": "Button & Appbar label for editing a match" "description": "Button & Appbar label for editing a match"
}, },
"@enter_points": {
"description": "Label to enter players points"
},
"@enter_results": { "@enter_results": {
"description": "Button text to enter match results" "description": "Button text to enter match results"
}, },
@@ -271,6 +274,9 @@
"@select_winner": { "@select_winner": {
"description": "Label to select the winner" "description": "Label to select the winner"
}, },
"@select_loser": {
"description": "Label to select the loser"
},
"@selected_players": { "@selected_players": {
"description": "Shows the number of selected players" "description": "Shows the number of selected players"
}, },
@@ -351,6 +357,7 @@
"delete_match": "Delete Match", "delete_match": "Delete Match",
"edit_group": "Edit Group", "edit_group": "Edit Group",
"edit_match": "Edit Match", "edit_match": "Edit Match",
"enter_points": "Enter points",
"enter_results": "Enter Results", "enter_results": "Enter Results",
"error_creating_group": "Error while creating group, please try again", "error_creating_group": "Error while creating group, please try again",
"error_deleting_group": "Error while deleting group, please try again", "error_deleting_group": "Error while deleting group, please try again",
@@ -411,7 +418,8 @@
"save_changes": "Save Changes", "save_changes": "Save Changes",
"search_for_groups": "Search for groups", "search_for_groups": "Search for groups",
"search_for_players": "Search for players", "search_for_players": "Search for players",
"select_winner": "Select Winner:", "select_winner": "Select Winner",
"select_loser": "Select Loser",
"selected_players": "Selected players", "selected_players": "Selected players",
"settings": "Settings", "settings": "Settings",
"single_loser": "Single Loser", "single_loser": "Single Loser",

View File

@@ -254,6 +254,12 @@ abstract class AppLocalizations {
/// **'Edit Match'** /// **'Edit Match'**
String get edit_match; String get edit_match;
/// Label to enter players points
///
/// In en, this message translates to:
/// **'Enter points'**
String get enter_points;
/// Button text to enter match results /// Button text to enter match results
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@@ -617,9 +623,15 @@ abstract class AppLocalizations {
/// Label to select the winner /// Label to select the winner
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Select Winner:'** /// **'Select Winner'**
String get select_winner; String get select_winner;
/// Label to select the loser
///
/// In en, this message translates to:
/// **'Select Loser'**
String get select_loser;
/// Shows the number of selected players /// Shows the number of selected players
/// ///
/// In en, this message translates to: /// In en, this message translates to:

View File

@@ -79,7 +79,7 @@ class AppLocalizationsDe extends AppLocalizations {
String get delete_all_data => 'Alle Daten löschen'; String get delete_all_data => 'Alle Daten löschen';
@override @override
String get delete_group => 'Diese Gruppe löschen'; String get delete_group => 'Gruppe löschen';
@override @override
String get delete_match => 'Spiel löschen'; String get delete_match => 'Spiel löschen';
@@ -90,6 +90,9 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get edit_match => 'Gruppe bearbeiten'; String get edit_match => 'Gruppe bearbeiten';
@override
String get enter_points => 'Punkte eingeben';
@override @override
String get enter_results => 'Ergebnisse eintragen'; String get enter_results => 'Ergebnisse eintragen';
@@ -281,7 +284,10 @@ class AppLocalizationsDe extends AppLocalizations {
String get search_for_players => 'Nach Spieler:innen suchen'; String get search_for_players => 'Nach Spieler:innen suchen';
@override @override
String get select_winner => 'Gewinner:in wählen:'; String get select_winner => 'Gewinner:in wählen';
@override
String get select_loser => 'Verlierer:in wählen';
@override @override
String get selected_players => 'Ausgewählte Spieler:innen'; String get selected_players => 'Ausgewählte Spieler:innen';

View File

@@ -90,6 +90,9 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get edit_match => 'Edit Match'; String get edit_match => 'Edit Match';
@override
String get enter_points => 'Enter points';
@override @override
String get enter_results => 'Enter Results'; String get enter_results => 'Enter Results';
@@ -281,7 +284,10 @@ class AppLocalizationsEn extends AppLocalizations {
String get search_for_players => 'Search for players'; String get search_for_players => 'Search for players';
@override @override
String get select_winner => 'Select Winner:'; String get select_winner => 'Select Winner';
@override
String get select_loser => 'Select Loser';
@override @override
String get selected_players => 'Selected players'; String get selected_players => 'Selected players';

View File

@@ -363,6 +363,7 @@ class _CreateMatchViewState extends State<CreateMatchView> {
final match = widget.matchToEdit!; final match = widget.matchToEdit!;
_matchNameController.text = match.name; _matchNameController.text = match.name;
selectedPlayers = match.players; selectedPlayers = match.players;
selectedGameIndex = 0;
if (match.group != null) { if (match.group != null) {
selectedGroup = match.group; selectedGroup = match.group;

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/dto/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/dto/player.dart';
@@ -11,11 +12,18 @@ class MatchResultView extends StatefulWidget {
/// A view that allows selecting and saving the winner of a match /// A view that allows selecting and saving the winner of a match
/// [match]: The match for which the winner is to be selected /// [match]: The match for which the winner is to be selected
/// [onWinnerChanged]: Optional callback invoked when the winner is changed /// [onWinnerChanged]: Optional callback invoked when the winner is changed
const MatchResultView({super.key, required this.match, this.onWinnerChanged}); const MatchResultView({
super.key,
required this.match,
this.ruleset = Ruleset.singleWinner,
this.onWinnerChanged,
});
/// The match for which the winner is to be selected /// The match for which the winner is to be selected
final Match match; final Match match;
final Ruleset ruleset;
/// Optional callback invoked when the winner is changed /// Optional callback invoked when the winner is changed
final VoidCallback? onWinnerChanged; final VoidCallback? onWinnerChanged;
@@ -50,6 +58,7 @@ class _MatchResultViewState extends State<MatchResultView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final loc = AppLocalizations.of(context); final loc = AppLocalizations.of(context);
return Scaffold( return Scaffold(
backgroundColor: CustomTheme.backgroundColor, backgroundColor: CustomTheme.backgroundColor,
appBar: AppBar( appBar: AppBar(
@@ -85,7 +94,7 @@ class _MatchResultViewState extends State<MatchResultView> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
loc.select_winner, '${getTitleForRuleset(loc)}:',
style: const TextStyle( style: const TextStyle(
fontSize: 18, fontSize: 18,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
@@ -99,7 +108,7 @@ class _MatchResultViewState extends State<MatchResultView> {
setState(() { setState(() {
_selectedPlayer = value; _selectedPlayer = value;
}); });
await _handleWinnerSaving(); await _handleSaving();
}, },
child: ListView.builder( child: ListView.builder(
itemCount: allPlayers.length, itemCount: allPlayers.length,
@@ -118,7 +127,7 @@ class _MatchResultViewState extends State<MatchResultView> {
(_selectedPlayer = value); (_selectedPlayer = value);
} }
}); });
await _handleWinnerSaving(); await _handleSaving();
}, },
); );
}, },
@@ -137,15 +146,52 @@ class _MatchResultViewState extends State<MatchResultView> {
/// Handles saving or removing the winner in the database /// Handles saving or removing the winner in the database
/// based on the current selection. /// based on the current selection.
Future<void> _handleWinnerSaving() async { Future<void> _handleSaving() async {
if (widget.ruleset == Ruleset.singleWinner) {
await _handleWinner();
} else if (widget.ruleset == Ruleset.singleLoser) {
await _handleLoser();
} else if (widget.ruleset == Ruleset.lowestScore ||
widget.ruleset == Ruleset.highestScore) {
await _handleScores();
}
widget.onWinnerChanged?.call();
}
Future<bool> _handleWinner() async {
if (_selectedPlayer == null) { if (_selectedPlayer == null) {
await db.matchDao.removeWinner(matchId: widget.match.id); return await db.matchDao.removeWinner(matchId: widget.match.id);
} else { } else {
await db.matchDao.setWinner( return await db.matchDao.setWinner(
matchId: widget.match.id, matchId: widget.match.id,
winnerId: _selectedPlayer!.id, winnerId: _selectedPlayer!.id,
); );
} }
widget.onWinnerChanged?.call(); }
Future<bool> _handleLoser() async {
if (_selectedPlayer == null) {
//TODO: removeLoser() method
return false;
} else {
//TODO: setLoser() method
return false;
}
}
Future<bool> _handleScores() async {
return false;
}
String getTitleForRuleset(AppLocalizations loc) {
switch (widget.ruleset) {
case Ruleset.singleWinner:
return loc.select_winner;
case Ruleset.singleLoser:
return loc.select_loser;
default:
return loc.enter_points;
}
} }
} }