import { renderTable } from '../utils/uiUtils.js';
import { renderTeamDropdown } from '../utils/dropdownUtils.js';
import TeamCreation from './TeamCreation.js';
import TeamEdit from './TeamEdit.js';
import TeamCaptainEdit from './TeamCaptainEdit.js';
export default class TeamManagement {
constructor(store) {
this.store = store;
this.container = document.createElement('div');
this.container.id = 'teamManagementSection';
this.container.className = 'team-management-section';
this.container.style.display = 'block';
this.selectedTeamId = null;
this.teamCreation = new TeamCreation(store, () => {
this.refreshTable();
this.refreshTeamSelectDropdown();
});
this.teamEdit = new TeamEdit(store, this.container, () => {
this.refreshTable();
this.refreshTeamPlayersList();
});
this.teamCaptainEdit = new TeamCaptainEdit(store, this.container, () => {
this.refreshTable();
this.refreshTeamPlayersList();
});
}
async render() {
console.log('TeamManagement.js loaded');
this.container.innerHTML = `
Team Management
| Team Name |
Players |
Captain |
Action |
Edit Team Captain
`;
this.container.querySelector('#teamCreationContainer').appendChild(this.teamCreation.render());
this.teamEdit.setupEventListeners();
this.teamCaptainEdit.setupEventListeners();
await this.refreshTable();
await this.refreshTeamSelectDropdown();
this.setupEventListeners();
document.addEventListener('playerDatabaseUpdated', async () => {
console.log('Received playerDatabaseUpdated event');
await this.refreshTable();
await this.refreshTeamPlayersList();
});
document.addEventListener('teamDatabaseUpdated', async () => {
console.log('Received teamDatabaseUpdated event');
await this.refreshTable();
await this.refreshTeamSelectDropdown();
await this.refreshTeamPlayersList();
});
return this.container;
}
setupEventListeners() {
console.log('Setting up event listeners for TeamManagement');
this.container.addEventListener('click', (e) => {
const target = e.target.closest('button');
if (!target) return;
const teamId = target.closest('tr')?.dataset.teamId;
if (target.classList.contains('delete-team-btn') && teamId) {
console.log('Delete Team button clicked');
if (confirm('Are you sure you want to delete this team?')) {
this.store.deleteTeam(teamId);
this.refreshTable();
this.refreshTeamSelectDropdown();
this.refreshTeamPlayersList();
document.dispatchEvent(new CustomEvent('playerDatabaseUpdated'));
}
} else if (target.classList.contains('edit-team-btn') && teamId) {
console.log('Edit Team button clicked');
this.teamEdit.openEditTeamModal(teamId);
} else if (target.classList.contains('edit-captain-btn') && teamId) {
console.log('Edit Captain button clicked');
this.teamCaptainEdit.openEditCaptainModal(teamId);
}
});
this.container.querySelector('#teamSelect').addEventListener('change', (e) => {
console.log('Team select changed:', e.target.value);
this.selectedTeamId = e.target.value || null;
this.refreshTeamPlayersList();
});
}
async refreshTable() {
console.log('Refreshing team table');
const teamDatabase = this.store.getTeamDatabase() || [];
const playerDatabase = this.store.getPlayerDatabase() || [];
console.log('Team database:', teamDatabase);
console.log('Player database for team table:', playerDatabase);
const tbody = this.container.querySelector('#teamDatabaseTable tbody');
if (teamDatabase.length === 0) {
tbody.innerHTML = '| No teams found. Add a team to get started. |
';
return;
}
const fields = [
{ key: 'name', label: 'Team Name' },
{ key: 'playerIds', label: 'Players', transform: (playerIds) => {
return playerIds.map(pid => {
const player = playerDatabase.find(p => p.id === pid);
return player ? `${player.firstName} ${player.lastName}` : 'Unknown';
}).join(', ');
}},
{ key: 'captainId', label: 'Captain', transform: (captainId) => {
console.log('Rendering captain for captainId:', captainId);
const captain = playerDatabase.find(p => p.id === captainId);
return captain ? `${captain.firstName} ${captain.lastName}` : 'None';
}}
];
renderTable(this.container, teamDatabase, fields, (team) => `
| ${team.name} |
${team.playerIds.map(pid => {
const player = playerDatabase.find(p => p.id === pid);
return player ? `${player.firstName} ${player.lastName}` : 'Unknown';
}).join(', ')} |
${playerDatabase.find(p => p.id === team.captainId) ?
playerDatabase.find(p => p.id === team.captainId).firstName + ' ' +
playerDatabase.find(p => p.id === team.captainId).lastName : 'None'} |
|
`, false);
}
async refreshTeamSelectDropdown() {
console.log('Refreshing team select dropdown');
const teamDatabase = this.store.getTeamDatabase() || [];
console.log('Team database for dropdown:', teamDatabase);
renderTeamDropdown(this.container, teamDatabase, this.selectedTeamId, 'teamSelect');
}
async refreshTeamPlayersList() {
console.log('Refreshing team players list for teamId:', this.selectedTeamId);
const playerDatabase = this.store.getPlayerDatabase() || [];
const teamDatabase = this.store.getTeamDatabase() || [];
console.log('Team database for players list:', teamDatabase);
const teamPlayersList = this.container.querySelector('#teamPlayersList');
if (!this.selectedTeamId) {
teamPlayersList.innerHTML = 'Select a team to view its players.
';
return;
}
const team = teamDatabase.find(t => t.id === this.selectedTeamId);
if (!team) {
teamPlayersList.innerHTML = 'Team not found.
';
return;
}
const players = team.playerIds
.map(pid => playerDatabase.find(p => p.id === pid))
.filter(p => p)
.map(p => ({
...p,
isCaptain: p.id === team.captainId
}));
teamPlayersList.innerHTML = `
Players in ${team.name}
${players.map(player => `
- ${player.firstName} ${player.lastName}${player.isCaptain ? ' (Captain)' : ''}
`).join('')}
`;
}
}