central players list

This commit is contained in:
eneller
2026-01-31 00:31:01 +01:00
parent 665cb25d34
commit 5408a8d9b6
6 changed files with 42 additions and 65 deletions

View File

@@ -1,5 +1,5 @@
<main class="main"> <main class="main">
<app-screen-rotations></app-screen-rotations> <app-screen-basic [players]="players"></app-screen-basic>
</main> </main>
<router-outlet /> <router-outlet />

View File

@@ -7,6 +7,7 @@ import { CommonModule } from '@angular/common';
import { filter, take } from 'rxjs'; import { filter, take } from 'rxjs';
import { ScreenBasicComponent } from "./screen-basic/screen-basic.component"; import { ScreenBasicComponent } from "./screen-basic/screen-basic.component";
import { ScreenRotationsComponent } from './screen-rotations/screen-rotations.component'; import { ScreenRotationsComponent } from './screen-rotations/screen-rotations.component';
import { Player } from './model';
@Component({ @Component({
selector: 'app-root', selector: 'app-root',
@@ -16,12 +17,7 @@ import { ScreenRotationsComponent } from './screen-rotations/screen-rotations.co
}) })
export class AppComponent implements OnInit { export class AppComponent implements OnInit {
title = 'vb'; title = 'vb';
playerNamesValue = ""; players : Player[] = [];
numTeamsSelectorValue = "2";
numTeamsSelected = 2;
nTeamsValue = "4";
teamsArray: string[][] = [];
duplicateNames: string[] = [];
constructor(private activatedRoute: ActivatedRoute){} constructor(private activatedRoute: ActivatedRoute){}
@@ -30,50 +26,11 @@ export class AppComponent implements OnInit {
filter(params => Object.keys(params).length > 0), // Only proceed if params are not empty filter(params => Object.keys(params).length > 0), // Only proceed if params are not empty
take(1) take(1)
).subscribe(params => { ).subscribe(params => {
const names = params['names']?.replaceAll(',', '\n'); if (params['names']){
if (names) { this.players = params['names'].split(',').map((name: string) => new Player(name));
this.playerNamesValue = names;
} }
}); });
} }
onButtonGenerate(textinput: string): void{
if(this.numTeamsSelectorValue === 'n'){
this.numTeamsSelected = Number(this.nTeamsValue);
}
else{
this.numTeamsSelected = Number(this.numTeamsSelectorValue);
}
let nameslist = this.playerNamesValue
.split('\n')
.map(function(str){return str.trim();})
.filter(function(str){return str}); // boolean interpretation is same as non-empty
// remove duplicates by using a Set
let namesset = new Set(nameslist);
let names = [...namesset];
let teams = Array.from({ length: this.numTeamsSelected }, () => []);
let playersPerTeam = Math.floor(names.length / this.numTeamsSelected);
let nameslen = names.length;
function* iter(list: any[]){
let index = 0;
while(true){
yield list[index % list.length];
index++;
}
}
let iterator = iter(teams);
for(let i =0; i < nameslen; i++){
let index = Math.floor(Math.random()* names.length);
let n = names[index];
names.splice(index,1);
let team = iterator.next().value;
team.push(n);
}
this.teamsArray = teams;
}
} }

View File

@@ -1,11 +1,31 @@
export class Player{ export class Player{
name: string; name: string;
outside: boolean = false; outside: boolean;
middle: boolean = false; middle: boolean;
opposite: boolean = false; // dia opposite: boolean; // dia
setter: boolean = false; setter: boolean;
libero: boolean = false; libero: boolean;
constructor( name: string){
constructor(
name:string,
outside: boolean = false,
middle: boolean = false,
opposite: boolean = false, // dia
setter: boolean = false,
libero: boolean = false,
){
this.name = name; this.name = name;
this.outside = outside;
this.middle = middle;
this.opposite = opposite;
this.setter = setter;
this.libero = libero;
}
serialize(): string[] {
const values = 'OOOO'
return [this.name, values];
}
static deSerialize(name: string, values: string): Player{
return new Player(name);
} }
} }

View File

@@ -1,8 +1,10 @@
import { Component, OnInit} from '@angular/core'; // Original Team Generation Screen for arbitrary size and number of teams
import { Component, Input, OnInit} from '@angular/core';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import { RouterOutlet, ActivatedRoute } from '@angular/router'; import { RouterOutlet, ActivatedRoute } from '@angular/router';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { Player } from '../model';
@Component({ @Component({
selector: 'app-screen-basic', selector: 'app-screen-basic',
@@ -11,6 +13,7 @@ import { CommonModule } from '@angular/common';
styleUrl: './screen-basic.component.less' styleUrl: './screen-basic.component.less'
}) })
export class ScreenBasicComponent { export class ScreenBasicComponent {
@Input() players!: Player[];
playerNamesValue = ""; playerNamesValue = "";
numTeamsSelectorValue = "2"; numTeamsSelectorValue = "2";
numTeamsSelected = 2; numTeamsSelected = 2;
@@ -35,7 +38,6 @@ export class ScreenBasicComponent {
let teams = Array.from({ length: this.numTeamsSelected }, () => []); let teams = Array.from({ length: this.numTeamsSelected }, () => []);
let playersPerTeam = Math.floor(names.length / this.numTeamsSelected);
let nameslen = names.length; let nameslen = names.length;
function* iter(list: any[]){ function* iter(list: any[]){

View File

@@ -4,7 +4,7 @@
<ul class="list-group mb-3"> <ul class="list-group mb-3">
@for (player of players; track $index) { @for (player of players; track $index) {
<li class="list-group-item">{{ player.name }}</li> <li class="list-group-item">{{ player.name }}</li>
<button class="btn btn-outline-primary" (click)="open(player)"> <button class="btn btn-outline-primary" (click)="openPlayerModal(player)">
<div>Edit Roles</div> <div>Edit Roles</div>
</button> </button>
} }

View File

@@ -1,4 +1,5 @@
import { Component } from '@angular/core'; // Team Generation Screen respecting volleyball roles as defined by `../model/Player`
import { Component, Input } from '@angular/core';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import { Player } from '../model'; import { Player } from '../model';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
@@ -11,7 +12,7 @@ import { ModalRotationsComponent } from '../modal-rotations/modal-rotations.comp
styleUrl: './screen-rotations.component.less' styleUrl: './screen-rotations.component.less'
}) })
export class ScreenRotationsComponent { export class ScreenRotationsComponent {
players: Player[] = []; @Input() players!: Player[];
newItem: string = ""; newItem: string = "";
constructor(private modalService: NgbModal) {} constructor(private modalService: NgbModal) {}
@@ -23,20 +24,17 @@ export class ScreenRotationsComponent {
} }
} }
openPlayerDialog(player: Player) { openPlayerModal(player: Player){
const modalRef = this.modalService.open(ModalRotationsComponent); const modalRef = this.modalService.open(ModalRotationsComponent);
modalRef.componentInstance.player = player; modalRef.componentInstance.player = player;
/*
modalRef.result.then((updatedPlayer) => { modalRef.result.then((updatedPlayer) => {
// Handle the updated player data if needed // Handle the updated player data if needed
console.log('Player updated:', updatedPlayer); console.log('Player updated:', updatedPlayer);
}).catch((error) => { }).catch((error) => {
console.log('Modal dismissed'); console.log('Modal dismissed');
}); });
} */
open(player: Player){
const modalRef = this.modalService.open(ModalRotationsComponent);
modalRef.componentInstance.player = player;
} }
} }