feat: NCS-63 User account implementation (#2)

User Profile info, no game before login/register, menu bar

---------

Co-authored-by: Lala, Shahd <Shahd.Lala@sybit.de>
Co-authored-by: shahdlala66 <shahd.lala66@gmail.com>
Reviewed-on: #2
This commit was merged in pull request #2.
This commit is contained in:
2026-05-06 10:51:30 +02:00
parent 2de003e497
commit ff75c8ce2f
104 changed files with 4232 additions and 978 deletions
@@ -7,6 +7,8 @@ interface BoardSquare {
pieceCode: string | null;
}
type BoardTheme = 'arabian' | 'classic';
@Component({
selector: 'app-chess-board',
standalone: true,
@@ -18,10 +20,14 @@ export class ChessBoardComponent implements OnChanges {
@Input({ required: true }) fen = '';
@Input() selectedSquare: string | null = null;
@Input() highlightedSquares: string[] = [];
@Input() boardTheme: BoardTheme = 'arabian';
@Output() squareSelected = new EventEmitter<string>();
squares: BoardSquare[] = [];
private highlightedSquareSet = new Set<string>();
private draggingFromSquare: string | null = null;
private dragOverSquare: string | null = null;
private suppressNextClick = false;
ngOnChanges(changes: SimpleChanges): void {
if (changes['fen']) {
@@ -38,9 +44,61 @@ export class ChessBoardComponent implements OnChanges {
}
onSquareClick(square: BoardSquare): void {
if (this.suppressNextClick) {
this.suppressNextClick = false;
return;
}
this.squareSelected.emit(square.coordinate);
}
onPieceDragStart(event: DragEvent, square: BoardSquare): void {
if (!square.pieceCode) {
event.preventDefault();
return;
}
this.draggingFromSquare = square.coordinate;
if (event.dataTransfer) {
event.dataTransfer.setData('text/plain', square.coordinate);
event.dataTransfer.effectAllowed = 'move';
}
this.squareSelected.emit(square.coordinate);
}
onSquareDragOver(event: DragEvent, square: BoardSquare): void {
if (!this.draggingFromSquare) {
return;
}
event.preventDefault();
if (event.dataTransfer) {
event.dataTransfer.dropEffect = 'move';
}
this.dragOverSquare = square.coordinate === this.draggingFromSquare ? null : square.coordinate;
}
onSquareDrop(event: DragEvent, square: BoardSquare): void {
event.preventDefault();
if (!this.draggingFromSquare) {
return;
}
const fromSquare = this.draggingFromSquare;
this.clearDragState();
if (fromSquare === square.coordinate) {
return;
}
this.suppressNextClick = true;
this.squareSelected.emit(square.coordinate);
}
onSquareDragEnd(): void {
this.clearDragState();
}
isSelected(square: BoardSquare): boolean {
return this.selectedSquare === square.coordinate;
}
@@ -49,6 +107,14 @@ export class ChessBoardComponent implements OnChanges {
return this.highlightedSquareSet.has(square.coordinate);
}
isDraggingSource(square: BoardSquare): boolean {
return this.draggingFromSquare === square.coordinate;
}
isDragOver(square: BoardSquare): boolean {
return this.dragOverSquare === square.coordinate;
}
private buildSquares(fen: string): BoardSquare[] {
const placement = fen.split(' ')[0] ?? '';
const rows = placement.split('/');
@@ -87,4 +153,9 @@ export class ChessBoardComponent implements OnChanges {
pieceCode
};
}
private clearDragState(): void {
this.draggingFromSquare = null;
this.dragOverSquare = null;
}
}