Merge pull request 'Optionaler Match-Name' (#121) from enhancement/115-Optionaler-Match-Name into development

Reviewed-on: #121
This commit was merged in pull request #121.
This commit is contained in:
2026-01-01 21:50:11 +00:00
5 changed files with 31 additions and 25 deletions

View File

@@ -6,8 +6,8 @@ import 'package:game_tracker/data/dto/match.dart';
import 'package:game_tracker/data/dto/player.dart';
import 'package:game_tracker/presentation/widgets/app_skeleton.dart';
import 'package:game_tracker/presentation/widgets/buttons/quick_create_button.dart';
import 'package:game_tracker/presentation/widgets/tiles/game_tile.dart';
import 'package:game_tracker/presentation/widgets/tiles/info_tile.dart';
import 'package:game_tracker/presentation/widgets/tiles/match_summary_tile.dart';
import 'package:game_tracker/presentation/widgets/tiles/quick_info_tile.dart';
import 'package:provider/provider.dart';
@@ -112,13 +112,13 @@ class _HomeViewState extends State<HomeView> {
visible: !isLoading && loadedRecentMatches.isNotEmpty,
replacement: const Center(
heightFactor: 12,
child: Text('No recent games available'),
child: Text('No recent matches available'),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
MatchTile(
MatchSummaryTile(
matchTitle: recentMatches[0].name,
game: 'Winner',
ruleset: 'Ruleset',
@@ -132,20 +132,20 @@ class _HomeViewState extends State<HomeView> {
child: Divider(),
),
if (loadedRecentMatches.length > 1) ...[
MatchTile(
MatchSummaryTile(
matchTitle: recentMatches[1].name,
game: 'Winner',
ruleset: 'Ruleset',
players: _getPlayerText(recentMatches[1]),
winner: recentMatches[1].winner == null
? 'Game in progress...'
? 'Match in progress...'
: recentMatches[1].winner!.name,
),
const SizedBox(height: 8),
] else ...[
const Center(
heightFactor: 5.35,
child: Text('No second game available'),
child: Text('No second match available'),
),
],
],

View File

@@ -31,6 +31,9 @@ class _CreateMatchViewState extends State<CreateMatchView> {
/// Controller for the match name input field
final TextEditingController _matchNameController = TextEditingController();
/// Hint text for the match name input field
String hintText = 'Match Name';
/// List of all groups from the database
List<Group> groupsList = [];
@@ -132,7 +135,7 @@ class _CreateMatchViewState extends State<CreateMatchView> {
margin: const EdgeInsets.symmetric(horizontal: 12, vertical: 5),
child: TextInputField(
controller: _matchNameController,
hintText: 'Match name',
hintText: hintText,
),
),
ChooseTile(
@@ -151,11 +154,13 @@ class _CreateMatchViewState extends State<CreateMatchView> {
);
setState(() {
if (selectedGameIndex != -1) {
hintText = games[selectedGameIndex].$1;
selectedRuleset = games[selectedGameIndex].$3;
selectedRulesetIndex = rulesets.indexWhere(
(r) => r.$1 == selectedRuleset,
);
} else {
hintText = 'Match Name';
selectedRuleset = null;
}
});
@@ -228,7 +233,9 @@ class _CreateMatchViewState extends State<CreateMatchView> {
onPressed: _enableCreateGameButton()
? () async {
Match match = Match(
name: _matchNameController.text.trim(),
name: _matchNameController.text.isEmpty
? hintText
: _matchNameController.text.trim(),
createdAt: DateTime.now(),
group: selectedGroup,
players: selectedPlayers,
@@ -258,9 +265,8 @@ class _CreateMatchViewState extends State<CreateMatchView> {
/// Determines whether the "Create Game" button should be enabled based on
/// the current state of the input fields.
bool _enableCreateGameButton() {
return _matchNameController.text.isNotEmpty &&
(selectedGroup != null ||
(selectedPlayers != null && selectedPlayers!.length > 1)) &&
return selectedGroup != null ||
(selectedPlayers != null && selectedPlayers!.length > 1) &&
selectedRuleset != null;
}
}

View File

@@ -12,7 +12,7 @@ import 'package:game_tracker/presentation/views/main_menu/match_view/create_matc
import 'package:game_tracker/presentation/views/main_menu/match_view/match_result_view.dart';
import 'package:game_tracker/presentation/widgets/app_skeleton.dart';
import 'package:game_tracker/presentation/widgets/buttons/custom_width_button.dart';
import 'package:game_tracker/presentation/widgets/tiles/game_history_tile.dart';
import 'package:game_tracker/presentation/widgets/tiles/match_tile.dart';
import 'package:game_tracker/presentation/widgets/top_centered_message.dart';
import 'package:provider/provider.dart';
@@ -30,9 +30,9 @@ class _MatchViewState extends State<MatchView> {
List<Match> matches = List.filled(
4,
Match(
name: 'Skeleton Gamename',
name: 'Skeleton match name',
group: Group(
name: 'Groupname',
name: 'Group name',
members: List.filled(5, Player(name: 'Player')),
),
winner: Player(name: 'Player'),
@@ -74,7 +74,7 @@ class _MatchViewState extends State<MatchView> {
height: MediaQuery.paddingOf(context).bottom - 20,
);
}
return GameHistoryTile(
return MatchTile(
onTap: () async {
Navigator.push(
context,
@@ -96,7 +96,7 @@ class _MatchViewState extends State<MatchView> {
Positioned(
bottom: MediaQuery.paddingOf(context).bottom,
child: CustomWidthButton(
text: 'Create Game',
text: 'Create Match',
sizeRelativeToWidth: 0.90,
onPressed: () async {
Navigator.push(

View File

@@ -2,14 +2,14 @@ import 'package:flutter/material.dart';
import 'package:game_tracker/core/custom_theme.dart';
import 'package:skeletonizer/skeletonizer.dart';
class MatchTile extends StatefulWidget {
class MatchSummaryTile extends StatefulWidget {
final String matchTitle;
final String game;
final String ruleset;
final String players;
final String winner;
const MatchTile({
const MatchSummaryTile({
super.key,
required this.matchTitle,
required this.game,
@@ -19,10 +19,10 @@ class MatchTile extends StatefulWidget {
});
@override
State<MatchTile> createState() => _MatchTileState();
State<MatchSummaryTile> createState() => _MatchSummaryTileState();
}
class _MatchTileState extends State<MatchTile> {
class _MatchSummaryTileState extends State<MatchSummaryTile> {
@override
Widget build(BuildContext context) {
return Column(

View File

@@ -4,17 +4,17 @@ import 'package:game_tracker/data/dto/match.dart';
import 'package:game_tracker/presentation/widgets/tiles/text_icon_tile.dart';
import 'package:intl/intl.dart';
class GameHistoryTile extends StatefulWidget {
class MatchTile extends StatefulWidget {
final Match match;
final VoidCallback onTap;
const GameHistoryTile({super.key, required this.match, required this.onTap});
const MatchTile({super.key, required this.match, required this.onTap});
@override
State<GameHistoryTile> createState() => _GameHistoryTileState();
State<MatchTile> createState() => _MatchTileState();
}
class _GameHistoryTileState extends State<GameHistoryTile> {
class _MatchTileState extends State<MatchTile> {
@override
Widget build(BuildContext context) {
final group = widget.match.group;