WIP: Bearbeiten und Löschen von Gruppen #148

Draft
sneeex wants to merge 19 commits from feature/118-bearbeiten-und-löschen-von-gruppen into development
Owner

WIP: Bearbeiten und Löschen von Gruppen

Zugehörige Issue(s):
Closes #118 #155

Beschreibung

Es wurde ein View zum Bearbeiten und Löschen von Gruppen erstellt.

Zusätzliche Anmerkungen

Ich habe einen Key zu jedem ScaffoldMessenger hinzugefügt, weil es ohne in dem Group_Detail_View nicht funktioniert hat, obwohl es ohne Key durch das PlayerSelection Widget, was in dem View benutzt wird, funktioniert hat.

# WIP: Bearbeiten und Löschen von Gruppen **Zugehörige Issue(s):** Closes #118 #155 ## Beschreibung Es wurde ein View zum Bearbeiten und Löschen von Gruppen erstellt. ## Zusätzliche Anmerkungen Ich habe einen Key zu jedem ScaffoldMessenger hinzugefügt, weil es ohne in dem `Group_Detail_View` nicht funktioniert hat, obwohl es ohne Key durch das PlayerSelection Widget, was in dem View benutzt wird, funktioniert hat.
sneeex added the
PR
Ready for Review
2
label 2026-01-10 19:17:37 +00:00
sneeex self-assigned this 2026-01-10 19:17:37 +00:00
sneeex added 1 commit 2026-01-10 19:17:38 +00:00
implement group edit view
Some checks failed
Pull Request Pipeline / test (pull_request) Successful in 2m1s
Pull Request Pipeline / lint (pull_request) Failing after 2m3s
45a419cae7
sneeex requested review from Owners 2026-01-10 19:17:38 +00:00
sneeex removed the
PR
Ready for Review
2
label 2026-01-10 19:17:50 +00:00
sneeex added a new dependency 2026-01-10 19:18:00 +00:00
sneeex added 1 commit 2026-01-10 20:48:26 +00:00
Merge branch 'development' into feature/118-bearbeiten-und-löschen-von-gruppen
Some checks failed
Pull Request Pipeline / test (pull_request) Successful in 2m1s
Pull Request Pipeline / lint (pull_request) Failing after 2m3s
525acec1d3
sneeex added 1 commit 2026-01-10 21:11:32 +00:00
rename CreateGroupView to GroupDetailView for clarity and consistency
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 2m3s
Pull Request Pipeline / lint (pull_request) Successful in 2m4s
b6dd0541ae
sneeex added 1 commit 2026-01-10 21:13:49 +00:00
remove questionmark
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 2m2s
Pull Request Pipeline / lint (pull_request) Successful in 2m5s
ee84c60ba6
sneeex added 1 commit 2026-01-10 21:19:23 +00:00
Merge remote-tracking branch 'origin/development' into feature/118-bearbeiten-und-löschen-von-gruppen
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 2m33s
Pull Request Pipeline / lint (pull_request) Successful in 2m44s
38663c6b67
# Conflicts:
#	lib/l10n/arb/app_de.arb
#	lib/l10n/arb/app_en.arb
#	lib/l10n/generated/app_localizations_de.dart
#	lib/presentation/views/main_menu/settings_view.dart
sneeex added 1 commit 2026-01-10 21:20:16 +00:00
fix merge mistake
All checks were successful
Pull Request Pipeline / lint (pull_request) Successful in 3m9s
Pull Request Pipeline / test (pull_request) Successful in 2m30s
caf60d046b
flixcoo added a new dependency 2026-01-12 18:36:05 +00:00
sneeex added 3 commits 2026-01-13 20:07:52 +00:00
# Conflicts:
#	lib/presentation/views/main_menu/settings_view.dart
merge dev into #118
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 1m59s
Pull Request Pipeline / lint (pull_request) Successful in 2m7s
ed642e3d4f
flixcoo removed a dependency 2026-01-13 20:12:02 +00:00
sneeex added 1 commit 2026-01-13 20:35:14 +00:00
fix snackbar showing also showing on other screens (#155)
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 2m10s
Pull Request Pipeline / lint (pull_request) Successful in 2m12s
1b297d15b0
sneeex added 1 commit 2026-01-13 20:38:57 +00:00
add context to mounted check
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 2m3s
Pull Request Pipeline / lint (pull_request) Successful in 2m9s
016c1ceb6e
Owner

Ich hatte vergessen, dass du das Feature schon angefangen hast. Hatte auch schon angefangen, dass bearbeiten zu implementiert. Hab mir deine loadPlayerList() angeschaut und gedacht, maybe willst du das eher so machen wie ich das hatte, ist etwas simpler und kürzer beim gleichen outcome (Kommentare wären mindestens gut, für die unterschiedlichen Fälle):

  void loadPlayerList() {
    _allPlayersFuture = Future.wait([
      db.playerDao.getAllPlayers(),
      Future.delayed(Constants.minimumSkeletonDuration),
    ]).then((results) => results[0] as List<Player>);
    if (mounted) {
      _allPlayersFuture.then((loadedPlayers) {
        loadedPlayers.sort((a, b) => a.name.compareTo(b.name));

        setState(() {
          if (widget.availablePlayers != null) {
            // CASE 1: Available players are provided

            widget.availablePlayers!.sort((a, b) => a.name.compareTo(b.name));
            allPlayers = [...widget.availablePlayers!];
            suggestedPlayers = [...allPlayers];

            if (widget.initialSelectedPlayers != null) {
              // CASE 1.1: Available players & initial selected players are provided
              // If so, ensure only valid players are pre-selected

              selectedPlayers = widget.initialSelectedPlayers!
                  .where(
                    (p) => widget.availablePlayers!.any(
                      (available) => available.id == p.id,
                    ),
                  )
                  .toList();
            }
          } else if (widget.initialSelectedPlayers != null) {
            // CASE 2: Only initial selected players are provided
            // If so, pre-select them and ensure no duplicates
            // in suggested players

            allPlayers = [...loadedPlayers];
            selectedPlayers = [...widget.initialSelectedPlayers!];
            suggestedPlayers = allPlayers
                .where((player) => !selectedPlayers.contains(player))
                .toList();
          } else {
            /// Case 3: No players are provided, use all from database

            allPlayers = [...loadedPlayers];
            suggestedPlayers = [...loadedPlayers];
            selectedPlayers = [];
          }
          isLoading = false;
        });
      });
    }
  }

Ich hatte vergessen, dass du das Feature schon angefangen hast. Hatte auch schon angefangen, dass bearbeiten zu implementiert. Hab mir deine `loadPlayerList()` angeschaut und gedacht, maybe willst du das eher so machen wie ich das hatte, ist etwas simpler und kürzer beim gleichen outcome (Kommentare wären mindestens gut, für die unterschiedlichen Fälle): ```dart void loadPlayerList() { _allPlayersFuture = Future.wait([ db.playerDao.getAllPlayers(), Future.delayed(Constants.minimumSkeletonDuration), ]).then((results) => results[0] as List<Player>); if (mounted) { _allPlayersFuture.then((loadedPlayers) { loadedPlayers.sort((a, b) => a.name.compareTo(b.name)); setState(() { if (widget.availablePlayers != null) { // CASE 1: Available players are provided widget.availablePlayers!.sort((a, b) => a.name.compareTo(b.name)); allPlayers = [...widget.availablePlayers!]; suggestedPlayers = [...allPlayers]; if (widget.initialSelectedPlayers != null) { // CASE 1.1: Available players & initial selected players are provided // If so, ensure only valid players are pre-selected selectedPlayers = widget.initialSelectedPlayers! .where( (p) => widget.availablePlayers!.any( (available) => available.id == p.id, ), ) .toList(); } } else if (widget.initialSelectedPlayers != null) { // CASE 2: Only initial selected players are provided // If so, pre-select them and ensure no duplicates // in suggested players allPlayers = [...loadedPlayers]; selectedPlayers = [...widget.initialSelectedPlayers!]; suggestedPlayers = allPlayers .where((player) => !selectedPlayers.contains(player)) .toList(); } else { /// Case 3: No players are provided, use all from database allPlayers = [...loadedPlayers]; suggestedPlayers = [...loadedPlayers]; selectedPlayers = []; } isLoading = false; }); }); } } ```
flixcoo reviewed 2026-01-16 23:21:19 +00:00
@@ -248,0 +250,4 @@
// Excludes already selected players from the suggested players list.
suggestedPlayers = loadedPlayers.where((p) => !widget.initialSelectedPlayers!.any((ip) => ip.id == p.id)).toList();
// Ensures that only players available for selection are pre-selected.
selectedPlayers = widget.initialSelectedPlayers!
Owner

Bzw das ist doch nicht notwendig oder? Ansonsten lass die doch so, das ist gut. Aber ergänz mal Kommentare zu den unterschiedlichen Cases

Bzw das ist doch nicht notwendig oder? Ansonsten lass die doch so, das ist gut. Aber ergänz mal Kommentare zu den unterschiedlichen Cases
sneeex marked this conversation as resolved
Author
Owner

Ich hatte vergessen, dass du das Feature schon angefangen hast. Hatte auch schon angefangen, dass bearbeiten zu implementiert. Hab mir deine loadPlayerList() angeschaut und gedacht, maybe willst du das eher so machen wie ich das hatte, ist etwas simpler und kürzer beim gleichen outcome (Kommentare wären mindestens gut, für die unterschiedlichen Fälle):

  void loadPlayerList() {
    _allPlayersFuture = Future.wait([
      db.playerDao.getAllPlayers(),
      Future.delayed(Constants.minimumSkeletonDuration),
    ]).then((results) => results[0] as List<Player>);
    if (mounted) {
      _allPlayersFuture.then((loadedPlayers) {
        loadedPlayers.sort((a, b) => a.name.compareTo(b.name));

        setState(() {
          if (widget.availablePlayers != null) {
            // CASE 1: Available players are provided

            widget.availablePlayers!.sort((a, b) => a.name.compareTo(b.name));
            allPlayers = [...widget.availablePlayers!];
            suggestedPlayers = [...allPlayers];

            if (widget.initialSelectedPlayers != null) {
              // CASE 1.1: Available players & initial selected players are provided
              // If so, ensure only valid players are pre-selected

              selectedPlayers = widget.initialSelectedPlayers!
                  .where(
                    (p) => widget.availablePlayers!.any(
                      (available) => available.id == p.id,
                    ),
                  )
                  .toList();
            }
          } else if (widget.initialSelectedPlayers != null) {
            // CASE 2: Only initial selected players are provided
            // If so, pre-select them and ensure no duplicates
            // in suggested players

            allPlayers = [...loadedPlayers];
            selectedPlayers = [...widget.initialSelectedPlayers!];
            suggestedPlayers = allPlayers
                .where((player) => !selectedPlayers.contains(player))
                .toList();
          } else {
            /// Case 3: No players are provided, use all from database

            allPlayers = [...loadedPlayers];
            suggestedPlayers = [...loadedPlayers];
            selectedPlayers = [];
          }
          isLoading = false;
        });
      });
    }
  }

Du bist wirklich dumm

> Ich hatte vergessen, dass du das Feature schon angefangen hast. Hatte auch schon angefangen, dass bearbeiten zu implementiert. Hab mir deine `loadPlayerList()` angeschaut und gedacht, maybe willst du das eher so machen wie ich das hatte, ist etwas simpler und kürzer beim gleichen outcome (Kommentare wären mindestens gut, für die unterschiedlichen Fälle): > > ```dart > void loadPlayerList() { > _allPlayersFuture = Future.wait([ > db.playerDao.getAllPlayers(), > Future.delayed(Constants.minimumSkeletonDuration), > ]).then((results) => results[0] as List<Player>); > if (mounted) { > _allPlayersFuture.then((loadedPlayers) { > loadedPlayers.sort((a, b) => a.name.compareTo(b.name)); > > setState(() { > if (widget.availablePlayers != null) { > // CASE 1: Available players are provided > > widget.availablePlayers!.sort((a, b) => a.name.compareTo(b.name)); > allPlayers = [...widget.availablePlayers!]; > suggestedPlayers = [...allPlayers]; > > if (widget.initialSelectedPlayers != null) { > // CASE 1.1: Available players & initial selected players are provided > // If so, ensure only valid players are pre-selected > > selectedPlayers = widget.initialSelectedPlayers! > .where( > (p) => widget.availablePlayers!.any( > (available) => available.id == p.id, > ), > ) > .toList(); > } > } else if (widget.initialSelectedPlayers != null) { > // CASE 2: Only initial selected players are provided > // If so, pre-select them and ensure no duplicates > // in suggested players > > allPlayers = [...loadedPlayers]; > selectedPlayers = [...widget.initialSelectedPlayers!]; > suggestedPlayers = allPlayers > .where((player) => !selectedPlayers.contains(player)) > .toList(); > } else { > /// Case 3: No players are provided, use all from database > > allPlayers = [...loadedPlayers]; > suggestedPlayers = [...loadedPlayers]; > selectedPlayers = []; > } > isLoading = false; > }); > }); > } > } > > ``` Du bist wirklich dumm
sneeex added 2 commits 2026-01-17 09:21:57 +00:00
# Conflicts:
#	lib/presentation/views/main_menu/group_view/create_group_view.dart
#	lib/presentation/views/main_menu/settings_view/settings_view.dart
#	lib/presentation/widgets/tiles/group_tile.dart
fix merge conflicts
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 2m4s
Pull Request Pipeline / lint (pull_request) Successful in 2m9s
919a38afe5
flixcoo added 1 commit 2026-01-17 15:05:20 +00:00
Merge remote-tracking branch 'origin/development' into feature/118-bearbeiten-und-löschen-von-gruppen
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 2m7s
Pull Request Pipeline / lint (pull_request) Successful in 2m9s
8b7300eac3
# Conflicts:
#	pubspec.yaml
sneeex added 1 commit 2026-01-18 09:51:56 +00:00
delete group view & update build nr
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 2m6s
Pull Request Pipeline / lint (pull_request) Successful in 2m14s
f1df067824
flixcoo added the
Workflow
On Hold
3
label 2026-01-18 10:14:46 +00:00
sneeex added 2 commits 2026-01-18 10:41:53 +00:00
# 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/group_view/groups_view.dart
#	lib/presentation/views/main_menu/match_view/create_match/create_match_view.dart
#	lib/presentation/widgets/tiles/group_tile.dart
#	pubspec.yaml
merge & made group_detail_view.dart & group_create_view.dart work together when editing
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 2m5s
Pull Request Pipeline / lint (pull_request) Successful in 2m10s
e4c3bc1c5e
sneeex added 2 commits 2026-01-18 11:25:50 +00:00
# Conflicts:
#	lib/presentation/views/main_menu/group_view/create_group_view.dart
#	pubspec.yaml
merge fix
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 2m2s
Pull Request Pipeline / lint (pull_request) Successful in 2m8s
810f635987
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 2m2s
Required
Details
Pull Request Pipeline / lint (pull_request) Successful in 2m8s
Required
Details
This pull request has changes conflicting with the target branch.
  • lib/presentation/views/main_menu/custom_navigation_bar.dart
  • lib/presentation/views/main_menu/group_view/create_group_view.dart
  • lib/presentation/views/main_menu/group_view/group_profile_view.dart
  • lib/presentation/views/main_menu/group_view/groups_view.dart
  • pubspec.yaml
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feature/118-bearbeiten-und-löschen-von-gruppen:feature/118-bearbeiten-und-löschen-von-gruppen
git checkout feature/118-bearbeiten-und-löschen-von-gruppen
Sign in to join this conversation.
No Reviewers
liquid-development/Owners
2 Participants
Notifications
Due Date
No due date set.
Depends on
#88 Neue Datenbank-Struktur
liquid-development/game-tracker
Reference: liquid-development/game-tracker#148