Aggiornamento grafica

This commit is contained in:
Lorenzo Sanesi
2026-04-04 01:40:43 +02:00
parent e2fe8b264f
commit 162e0de62a
83 changed files with 16246 additions and 157 deletions
@@ -0,0 +1,113 @@
import {ChangeDetectionStrategy, Component, inject, OnInit, signal, computed} from '@angular/core';
import {CommonModule} from '@angular/common';
import {MatIconModule} from '@angular/material/icon';
import {RouterModule, Router} from '@angular/router';
import {ReactiveFormsModule, FormBuilder, FormGroup, Validators, FormControl} from '@angular/forms';
import {GroupService} from '../../services/group';
import {UserService} from '../../services/user';
import {User, Group} from '../../models/data.models';
import {debounceTime, distinctUntilChanged, switchMap, of} from 'rxjs';
@Component({
selector: 'app-create-group',
standalone: true,
imports: [CommonModule, MatIconModule, RouterModule, ReactiveFormsModule],
templateUrl: './create-group.html',
styleUrl: './create-group.css',
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class CreateGroup implements OnInit {
private fb = inject(FormBuilder);
private router = inject(Router);
private groupService = inject(GroupService);
private userService = inject(UserService);
groupForm: FormGroup = this.fb.group({
name: ['', [Validators.required]],
description: [''],
isPrivate: [false],
avatarUrl: ['https://picsum.photos/seed/avatar/200/200']
});
searchControl = new FormControl('');
searchResults = signal<User[]>([]);
selectedMembers = signal<User[]>([]);
groupAvatar = computed(() => this.groupForm.get('avatarUrl')?.value);
isEditing = false;
editingId: number | null = null;
ngOnInit() {
// Ricerca utenti per i membri
this.searchControl.valueChanges.pipe(
debounceTime(300),
distinctUntilChanged(),
switchMap(query => {
if (!query || query.length < 2) return of([]);
return this.userService.searchUsers(query);
})
).subscribe(users => {
this.searchResults.set(users);
});
const navigation = this.router.getCurrentNavigation();
const state = navigation?.extras.state as { group: Group };
const historyState = typeof window !== 'undefined' ? window.history.state as { group?: Group } : null;
const group = state?.group || historyState?.group;
if (group) {
this.isEditing = true;
this.editingId = group.id;
this.groupForm.patchValue({
name: group.name,
description: group.description,
isPrivate: group.isPrivate,
avatarUrl: group.avatarUrl
});
if (group.members) {
this.selectedMembers.set(group.members);
}
}
}
addMember(user: User) {
if (!this.selectedMembers().find(m => m.id === user.id)) {
this.selectedMembers.update(prev => [...prev, user]);
}
this.searchControl.setValue('');
this.searchResults.set([]);
}
removeMember(userId: string) {
this.selectedMembers.update(prev => prev.filter(m => m.id !== userId));
}
onSubmit() {
if (this.groupForm.valid) {
const formValue = this.groupForm.value;
const memberIds = this.selectedMembers().map(m => m.id);
const payload = {
name: formValue.name,
description: formValue.description,
isPrivate: formValue.isPrivate,
avatarUrl: formValue.avatarUrl,
members: memberIds
};
if (this.isEditing && this.editingId) {
this.groupService.updateGroup(this.editingId, payload).subscribe({
next: () => this.router.navigate(['/groups']),
error: (err) => console.error('Error updating group:', err)
});
} else {
this.groupService.createGroup(payload).subscribe({
next: () => this.router.navigate(['/groups']),
error: (err) => console.error('Error creating group:', err)
});
}
}
}
}