limit team members to 4 and display member count in list

This commit is contained in:
2026-03-11 18:40:28 +01:00
parent 9408889ba6
commit 4074d0287c
5 changed files with 68 additions and 24 deletions

View File

@@ -1,7 +1,7 @@
name,tag,description
Team Alpha,ALPH,A competitive esports team
Team Beta,BETA,New challengers on the scene
Team Gamma,GAMM,Veteran tournament winners
Team Delta,DELT,Rising stars in the community
Team Epsilon,EPSI,Strategic gameplay specialists
Team Zeta,ZETA,Fast-paced aggressive players
Team Alpha,ALP,A competitive esports team
Team Beta,BET,New challengers on the scene
Team Gamma,GAM,Veteran tournament winners
Team Delta,DEL,Rising stars in the community
Team Epsilon,EPS,Strategic gameplay specialists
Team Zeta,ZET,Fast-paced aggressive players
1 name tag description
2 Team Alpha ALPH ALP A competitive esports team
3 Team Beta BETA BET New challengers on the scene
4 Team Gamma GAMM GAM Veteran tournament winners
5 Team Delta DELT DEL Rising stars in the community
6 Team Epsilon EPSI EPS Strategic gameplay specialists
7 Team Zeta ZETA ZET Fast-paced aggressive players

View File

@@ -48,10 +48,16 @@ export class TeamService {
getAllTeams(): Promise<Team[]> {
return new Promise<Team[]>((resolve, reject) => {
this.db.all(`SELECT * FROM Teams`, (err: Error | null, rows: Team[]) => {
this.db.all(
`SELECT t.*, COUNT(tm.id) as memberCount
FROM Teams t
LEFT JOIN TeamMembers tm ON t.id = tm.teamId
GROUP BY t.id`,
(err: Error | null, rows: Team[]) => {
if (err) return reject(err);
resolve(rows);
});
}
);
});
}
@@ -165,6 +171,16 @@ export class TeamService {
addTeamMember(teamId: number, userId: number, role: 'owner' | 'member' = 'member'): Promise<TeamMember> {
return new Promise<TeamMember>((resolve, reject) => {
// First check if team already has 4 members
this.db.get(
`SELECT COUNT(*) as count FROM TeamMembers WHERE teamId = ?`,
[teamId],
(err: Error | null, row: any) => {
if (err) return reject(err);
if (row.count >= 4) {
return reject(new Error('Team already has maximum of 4 members'));
}
const stmt = this.db.prepare(`INSERT INTO TeamMembers (teamId, userId, role) VALUES (?, ?, ?)`);
stmt.run(teamId, userId, role, function (this: RunResult, err: Error | null) {
if (err) return reject(err);
@@ -177,6 +193,8 @@ export class TeamService {
});
});
stmt.finalize();
}
);
});
}

View File

@@ -19,4 +19,8 @@ Folgende Dateien wurden in diesem Prompt verändert:
- tournament_detail_page.dart
- teams_page.dart (erstellt, aber nicht verwendet)
-
- Ensure a team can only have a maximum of four members, also show the member count in the team list.<br><br>
Folgende Dateien wurden in diesem Prompt verändert:
- backend_splatournament_manager/src/services/team-service.ts
- frontend_splatournament_manager/lib/models/team.dart
- frontend_splatournament_manager/lib/pages/teams_page.dart

View File

@@ -4,6 +4,7 @@ class Team {
final String tag;
final String description;
final String createdAt;
final int? memberCount;
Team({
required this.id,
@@ -11,6 +12,7 @@ class Team {
required this.tag,
required this.description,
required this.createdAt,
this.memberCount,
});
factory Team.fromJson(Map<String, dynamic> json) {
@@ -20,6 +22,7 @@ class Team {
tag: json['tag'] as String,
description: (json['description'] as String?) ?? '',
createdAt: (json['createdAt'] as String?) ?? '',
memberCount: json['memberCount'] as int?,
);
}
@@ -30,6 +33,7 @@ class Team {
'tag': tag,
'description': description,
'createdAt': createdAt,
if (memberCount != null) 'memberCount': memberCount,
};
}
}

View File

@@ -128,6 +128,10 @@ class TeamListItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
final memberCountText = team.memberCount != null
? '${team.memberCount}/4 members'
: 'No members';
return Card(
margin: const EdgeInsets.symmetric(vertical: 8),
child: ListTile(
@@ -135,7 +139,21 @@ class TeamListItem extends StatelessWidget {
child: Text(team.tag),
),
title: Text(team.name),
subtitle: Text(team.description.isEmpty ? 'No description' : team.description),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(team.description.isEmpty ? 'No description' : team.description),
const SizedBox(height: 4),
Text(
memberCountText,
style: const TextStyle(
fontSize: 12,
fontWeight: FontWeight.w500,
),
),
],
),
isThreeLine: true,
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [