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(
if (err) return reject(err); `SELECT t.*, COUNT(tm.id) as memberCount
resolve(rows); 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,18 +171,30 @@ 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) => {
const stmt = this.db.prepare(`INSERT INTO TeamMembers (teamId, userId, role) VALUES (?, ?, ?)`); // First check if team already has 4 members
stmt.run(teamId, userId, role, function (this: RunResult, err: Error | null) { this.db.get(
if (err) return reject(err); `SELECT COUNT(*) as count FROM TeamMembers WHERE teamId = ?`,
resolve({ [teamId],
id: (this as any).lastID, (err: Error | null, row: any) => {
teamId, if (err) return reject(err);
userId, if (row.count >= 4) {
role, return reject(new Error('Team already has maximum of 4 members'));
joinedAt: new Date().toISOString(), }
});
}); const stmt = this.db.prepare(`INSERT INTO TeamMembers (teamId, userId, role) VALUES (?, ?, ?)`);
stmt.finalize(); stmt.run(teamId, userId, role, function (this: RunResult, err: Error | null) {
if (err) return reject(err);
resolve({
id: (this as any).lastID,
teamId,
userId,
role,
joinedAt: new Date().toISOString(),
});
});
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: [