|
|
|
|
@@ -24,7 +24,7 @@ class CreateMatchView extends StatefulWidget {
|
|
|
|
|
const CreateMatchView({
|
|
|
|
|
super.key,
|
|
|
|
|
this.onWinnerChanged,
|
|
|
|
|
this.match,
|
|
|
|
|
this.matchToEdit,
|
|
|
|
|
this.onMatchUpdated,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@@ -35,7 +35,7 @@ class CreateMatchView extends StatefulWidget {
|
|
|
|
|
final void Function(Match)? onMatchUpdated;
|
|
|
|
|
|
|
|
|
|
/// An optional match to prefill the fields
|
|
|
|
|
final Match? match;
|
|
|
|
|
final Match? matchToEdit;
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
State<CreateMatchView> createState() => _CreateMatchViewState();
|
|
|
|
|
@@ -56,12 +56,6 @@ class _CreateMatchViewState extends State<CreateMatchView> {
|
|
|
|
|
/// List of all players from the database
|
|
|
|
|
List<Player> playerList = [];
|
|
|
|
|
|
|
|
|
|
/// List of players filtered based on the selected group
|
|
|
|
|
/// If a group is selected, this list contains all players from [playerList]
|
|
|
|
|
/// who are not members of the selected group. If no group is selected,
|
|
|
|
|
/// this list is identical to [playerList].
|
|
|
|
|
/*List<Player> filteredPlayerList = [];*/
|
|
|
|
|
|
|
|
|
|
/// The currently selected group
|
|
|
|
|
Group? selectedGroup;
|
|
|
|
|
|
|
|
|
|
@@ -92,7 +86,7 @@ class _CreateMatchViewState extends State<CreateMatchView> {
|
|
|
|
|
playerList = result[1] as List<Player>;
|
|
|
|
|
|
|
|
|
|
// If a match is provided, prefill the fields
|
|
|
|
|
if (widget.match != null) {
|
|
|
|
|
if (widget.matchToEdit != null) {
|
|
|
|
|
prefillMatchDetails();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
@@ -119,10 +113,10 @@ class _CreateMatchViewState extends State<CreateMatchView> {
|
|
|
|
|
@override
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
final loc = AppLocalizations.of(context);
|
|
|
|
|
final buttonText = widget.match != null
|
|
|
|
|
final buttonText = widget.matchToEdit != null
|
|
|
|
|
? loc.save_changes
|
|
|
|
|
: loc.create_match;
|
|
|
|
|
final viewTitle = widget.match != null
|
|
|
|
|
final viewTitle = widget.matchToEdit != null
|
|
|
|
|
? loc.edit_match
|
|
|
|
|
: loc.create_new_match;
|
|
|
|
|
|
|
|
|
|
@@ -237,15 +231,16 @@ class _CreateMatchViewState extends State<CreateMatchView> {
|
|
|
|
|
/// - A ruleset is selected AND
|
|
|
|
|
/// - Either a group is selected OR at least 2 players are selected
|
|
|
|
|
bool _enableCreateGameButton() {
|
|
|
|
|
return (selectedGroup != null || (selectedPlayers.length > 1));
|
|
|
|
|
return (selectedGroup != null ||
|
|
|
|
|
(selectedPlayers.length > 1) && selectedGameIndex != -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If a match was provied to the view, it updates the match in the database
|
|
|
|
|
// If a match was provided to the view, it updates the match in the database
|
|
|
|
|
// and navigates back to the previous screen.
|
|
|
|
|
// If no match was provided, it creates a new match in the database and
|
|
|
|
|
// navigates to the MatchResultView for the newly created match.
|
|
|
|
|
void buttonNavigation(BuildContext context) async {
|
|
|
|
|
if (widget.match != null) {
|
|
|
|
|
if (widget.matchToEdit != null) {
|
|
|
|
|
await updateMatch();
|
|
|
|
|
if (context.mounted) {
|
|
|
|
|
Navigator.pop(context);
|
|
|
|
|
@@ -275,51 +270,51 @@ class _CreateMatchViewState extends State<CreateMatchView> {
|
|
|
|
|
final tempGame = await getTemporaryGame();
|
|
|
|
|
|
|
|
|
|
final updatedMatch = Match(
|
|
|
|
|
id: widget.match!.id,
|
|
|
|
|
id: widget.matchToEdit!.id,
|
|
|
|
|
name: _matchNameController.text.isEmpty
|
|
|
|
|
? (hintText ?? '')
|
|
|
|
|
: _matchNameController.text.trim(),
|
|
|
|
|
group: selectedGroup,
|
|
|
|
|
players: selectedPlayers,
|
|
|
|
|
game: tempGame,
|
|
|
|
|
winner: widget.match!.winner,
|
|
|
|
|
createdAt: widget.match!.createdAt,
|
|
|
|
|
endedAt: widget.match!.endedAt,
|
|
|
|
|
notes: widget.match!.notes,
|
|
|
|
|
winner: widget.matchToEdit!.winner,
|
|
|
|
|
createdAt: widget.matchToEdit!.createdAt,
|
|
|
|
|
endedAt: widget.matchToEdit!.endedAt,
|
|
|
|
|
notes: widget.matchToEdit!.notes,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if (widget.match!.name != updatedMatch.name) {
|
|
|
|
|
if (widget.matchToEdit!.name != updatedMatch.name) {
|
|
|
|
|
await db.matchDao.updateMatchName(
|
|
|
|
|
matchId: widget.match!.id,
|
|
|
|
|
matchId: widget.matchToEdit!.id,
|
|
|
|
|
newName: updatedMatch.name,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (widget.match!.group?.id != updatedMatch.group?.id) {
|
|
|
|
|
if (widget.matchToEdit!.group?.id != updatedMatch.group?.id) {
|
|
|
|
|
await db.matchDao.updateMatchGroup(
|
|
|
|
|
matchId: widget.match!.id,
|
|
|
|
|
matchId: widget.matchToEdit!.id,
|
|
|
|
|
newGroupId: updatedMatch.group?.id,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Add players who are in updatedMatch but not in the original match
|
|
|
|
|
for (var player in updatedMatch.players) {
|
|
|
|
|
if (!widget.match!.players.any((p) => p.id == player.id)) {
|
|
|
|
|
if (!widget.matchToEdit!.players.any((p) => p.id == player.id)) {
|
|
|
|
|
await db.playerMatchDao.addPlayerToMatch(
|
|
|
|
|
matchId: widget.match!.id,
|
|
|
|
|
matchId: widget.matchToEdit!.id,
|
|
|
|
|
playerId: player.id,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Remove players who are in the original match but not in updatedMatch
|
|
|
|
|
for (var player in widget.match!.players) {
|
|
|
|
|
for (var player in widget.matchToEdit!.players) {
|
|
|
|
|
if (!updatedMatch.players.any((p) => p.id == player.id)) {
|
|
|
|
|
await db.playerMatchDao.removePlayerFromMatch(
|
|
|
|
|
matchId: widget.match!.id,
|
|
|
|
|
matchId: widget.matchToEdit!.id,
|
|
|
|
|
playerId: player.id,
|
|
|
|
|
);
|
|
|
|
|
if (widget.match!.winner?.id == player.id) {
|
|
|
|
|
if (widget.matchToEdit!.winner?.id == player.id) {
|
|
|
|
|
updatedMatch.winner = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -350,19 +345,6 @@ class _CreateMatchViewState extends State<CreateMatchView> {
|
|
|
|
|
Future<Game> getTemporaryGame() async {
|
|
|
|
|
Game? game;
|
|
|
|
|
|
|
|
|
|
// No game is selected
|
|
|
|
|
if (selectedGameIndex == -1) {
|
|
|
|
|
// Use the first game as default if none selected
|
|
|
|
|
final selectedGame = games[0];
|
|
|
|
|
game = Game(
|
|
|
|
|
name: selectedGame.$1,
|
|
|
|
|
description: selectedGame.$2,
|
|
|
|
|
ruleset: selectedGame.$3,
|
|
|
|
|
color: GameColor.blue,
|
|
|
|
|
icon: '',
|
|
|
|
|
);
|
|
|
|
|
} else {
|
|
|
|
|
// Use the selected game from the list
|
|
|
|
|
final selectedGame = games[selectedGameIndex];
|
|
|
|
|
game = Game(
|
|
|
|
|
name: selectedGame.$1,
|
|
|
|
|
@@ -371,15 +353,14 @@ class _CreateMatchViewState extends State<CreateMatchView> {
|
|
|
|
|
color: GameColor.blue,
|
|
|
|
|
icon: '',
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
// Add the game to the database if it doesn't exist
|
|
|
|
|
|
|
|
|
|
await db.gameDao.addGame(game: game);
|
|
|
|
|
return game;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If a match was provided to the view, this method prefills the input fields
|
|
|
|
|
void prefillMatchDetails() {
|
|
|
|
|
final match = widget.match!;
|
|
|
|
|
final match = widget.matchToEdit!;
|
|
|
|
|
_matchNameController.text = match.name;
|
|
|
|
|
selectedPlayers = match.players;
|
|
|
|
|
|
|
|
|
|
|