TeamManagement.js

🧩 Syntax:
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 = `
      <h2>Team Management</h2>
      <div id="teamCreationContainer"></div>
      <div class="form-group">
        <label for="teamSearchInput">Search Teams:</label>
        <div class="search-container">
          <span class="search-icon">🔍</span>
          <input type="text" id="teamSearchInput" placeholder="To be added" disabled>
        </div>
        <select id="teamSelect" class="team-select">
          <option value="">Select a team</option>
        </select>
        <div id="teamPlayersList" class="player-list-container"></div>
      </div>
      <table id="teamDatabaseTable" border="1">
        <thead>
          <tr>
            <th>Team Name</th>
            <th>Players</th>
            <th>Captain</th>
            <th>Action</th>
          </tr>
        </thead>
        <tbody></tbody>
      </table>
      <div id="editTeamModal" class="modal">
        <div class="modal-content">
          <h3>Edit Team</h3>
          <div class="form-group">
            <label for="editTeamName">Team Name: <span class="required">*</span></label>
            <input type="text" id="editTeamName" placeholder="Team Name" required>
          </div>
          <div class="form-group">
            <label for="editPlayerSearchInput">Team Members:</label>
            <div class="search-container">
              <span class="search-icon">🔍</span>
              <input type="text" id="editPlayerSearchInput" placeholder="Search players...">
              <span class="clear-icon edit-player-clear-icon" style="display: none;">X</span>
            </div>
            <div id="editPlayerSelect" class="player-select-container"></div>
          </div>
          <div class="modal-actions">
            <button id="saveEditTeamBtn" class="btn">Save</button>
            <button id="cancelEditTeamBtn" class="btn">Cancel</button>
          </div>
        </div>
      </div>
      <div id="editCaptainModal" class="modal">
        <div class="modal-content">
          <h3>Edit Team Captain</h3>
          <div class="form-group">
            <label for="editCaptainSearchInput">Select Captain:</label>
            <div class="search-container">
              <span class="search-icon">🔍</span>
              <input type="text" id="editCaptainSearchInput" placeholder="Search captain...">
              <span class="clear-icon edit-captain-clear-icon" style="display: none;">X</span>
            </div>
            <div id="editCaptainSelect" class="captain-select-container"></div>
          </div>
          <div class="modal-actions">
            <button id="saveEditCaptainBtn" class="btn">Save</button>
            <button id="cancelEditCaptainBtn" class="btn">Cancel</button>
          </div>
        </div>
      </div>
    `;
    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 = '<tr><td colspan="4">No teams found. Add a team to get started.</td></tr>';
      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) => `
      <tr data-team-id="${team.id}">
        <td>${team.name}</td>
        <td>${team.playerIds.map(pid => {
          const player = playerDatabase.find(p => p.id === pid);
          return player ? `${player.firstName} ${player.lastName}` : 'Unknown';
        }).join(', ')}</td>
        <td>${playerDatabase.find(p => p.id === team.captainId) ? 
          playerDatabase.find(p => p.id === team.captainId).firstName + ' ' + 
          playerDatabase.find(p => p.id === team.captainId).lastName : 'None'}</td>
        <td>
          <button class="edit-team-btn btn">Edit</button>
          <button class="edit-captain-btn btn">Edit Captain</button>
          <button class="delete-team-btn btn">Delete</button>
        </td>
      </tr>
    `, 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 = '<p>Select a team to view its players.</p>';
      return;
    }
    const team = teamDatabase.find(t => t.id === this.selectedTeamId);
    if (!team) {
      teamPlayersList.innerHTML = '<p>Team not found.</p>';
      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 = `
      <h3>Players in ${team.name}</h3>
      <ul>
        ${players.map(player => `
          <li>${player.firstName} ${player.lastName}${player.isCaptain ? ' (Captain)' : ''}</li>
        `).join('')}
      </ul>
    `;
  }
}
Cubefive

Cubefive

Member