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 name,tag,description
Team Alpha,ALPH,A competitive esports team Team Alpha,ALP,A competitive esports team
Team Beta,BETA,New challengers on the scene Team Beta,BET,New challengers on the scene
Team Gamma,GAMM,Veteran tournament winners Team Gamma,GAM,Veteran tournament winners
Team Delta,DELT,Rising stars in the community Team Delta,DEL,Rising stars in the community
Team Epsilon,EPSI,Strategic gameplay specialists Team Epsilon,EPS,Strategic gameplay specialists
Team Zeta,ZETA,Fast-paced aggressive players 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[]> { getAllTeams(): Promise<Team[]> {
return new Promise<Team[]>((resolve, reject) => { 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); if (err) return reject(err);
resolve(rows); resolve(rows);
}); }
);
}); });
} }
@@ -165,6 +171,16 @@ export class TeamService {
addTeamMember(teamId: number, userId: number, role: 'owner' | 'member' = 'member'): Promise<TeamMember> { addTeamMember(teamId: number, userId: number, role: 'owner' | 'member' = 'member'): Promise<TeamMember> {
return new Promise<TeamMember>((resolve, reject) => { 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 (?, ?, ?)`); const stmt = this.db.prepare(`INSERT INTO TeamMembers (teamId, userId, role) VALUES (?, ?, ?)`);
stmt.run(teamId, userId, role, function (this: RunResult, err: Error | null) { stmt.run(teamId, userId, role, function (this: RunResult, err: Error | null) {
if (err) return reject(err); if (err) return reject(err);
@@ -177,6 +193,8 @@ export class TeamService {
}); });
}); });
stmt.finalize(); stmt.finalize();
}
);
}); });
} }

View File

@@ -19,4 +19,8 @@ Folgende Dateien wurden in diesem Prompt verändert:
- tournament_detail_page.dart - tournament_detail_page.dart
- teams_page.dart (erstellt, aber nicht verwendet) - 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 tag;
final String description; final String description;
final String createdAt; final String createdAt;
final int? memberCount;
Team({ Team({
required this.id, required this.id,
@@ -11,6 +12,7 @@ class Team {
required this.tag, required this.tag,
required this.description, required this.description,
required this.createdAt, required this.createdAt,
this.memberCount,
}); });
factory Team.fromJson(Map<String, dynamic> json) { factory Team.fromJson(Map<String, dynamic> json) {
@@ -20,6 +22,7 @@ class Team {
tag: json['tag'] as String, tag: json['tag'] as String,
description: (json['description'] as String?) ?? '', description: (json['description'] as String?) ?? '',
createdAt: (json['createdAt'] as String?) ?? '', createdAt: (json['createdAt'] as String?) ?? '',
memberCount: json['memberCount'] as int?,
); );
} }
@@ -30,6 +33,7 @@ class Team {
'tag': tag, 'tag': tag,
'description': description, 'description': description,
'createdAt': createdAt, 'createdAt': createdAt,
if (memberCount != null) 'memberCount': memberCount,
}; };
} }
} }

View File

@@ -128,6 +128,10 @@ class TeamListItem extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final memberCountText = team.memberCount != null
? '${team.memberCount}/4 members'
: 'No members';
return Card( return Card(
margin: const EdgeInsets.symmetric(vertical: 8), margin: const EdgeInsets.symmetric(vertical: 8),
child: ListTile( child: ListTile(
@@ -135,7 +139,21 @@ class TeamListItem extends StatelessWidget {
child: Text(team.tag), child: Text(team.tag),
), ),
title: Text(team.name), 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( trailing: Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [