Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 8 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
- Tri par date de création ou priorité

### 💬 Gestion des commentaires
- Ajout de commentaires sur un projet (associés à une tâche système si nécessaire)
- Ajout de commentaires sur un projet
- Affichage des commentaires récents avec auteur et date

### 🌤️ Météo des émotions
Expand Down Expand Up @@ -70,8 +70,8 @@

### 1. Cloner le dépôt
```bash
git clone https://github.com/<user>/<repo>.git
cd <repo>
git clone https://github.com/Denis40-prog/TeamTask.git
cd TeamTask
```

---
Expand All @@ -93,17 +93,17 @@ Configurer la connexion à la base de données dans .env.

---

### 4. Lancer les migrations et seeders
### 4. Lancer le serveur
```bash
sail artisan migrate --seed
sail up
sail npm run dev
```

---

### 5. Lancer le serveur
### 5. Lancer les migrations et seeders
```bash
sail up
sail npm run dev
sail artisan migrate --seed
```

---
Expand All @@ -121,9 +121,6 @@ sail npm run dev
## Système de notifications :
- Internes (UI)
- Base technique pour notifications email
- Tests unitaires et fonctionnels
- Documentation technique & utilisateur complète
- Mise en production

## Mise en concurrence hebdomadaire
- Challenge sous forme de mission hebdomadaire
Expand Down
101 changes: 81 additions & 20 deletions app/Livewire/Dashboard.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,37 @@
use App\Models\TeamUser;
use App\Models\User;
use Livewire\Component;
use Livewire\WithPagination;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Gate;

class Dashboard extends Component
{
public $showCreateForm = false;
public $newTeamName = '';
public $newTeamDescription = '';
use WithPagination;

public function toggleCreateForm()
// Création d'équipe
public bool $showCreateForm = false;
public string $newTeamName = '';
public string $newTeamDescription = '';

// Liste / filtre / tri
public string $search = '';
public string $sortBy = 'name';
public string $sortDirection = 'asc';

protected $queryString = [
'search' => ['except' => ''],
'sortBy' => ['except' => 'name'],
'sortDirection' => ['except' => 'asc'],
];

public function toggleCreateForm(): void
{
$this->showCreateForm = !$this->showCreateForm;
$this->showCreateForm = ! $this->showCreateForm;
$this->reset(['newTeamName', 'newTeamDescription']);
}

public function createTeam()
public function createTeam(): void
{
$this->validate([
'newTeamName' => 'required|string|max:255',
Expand All @@ -34,49 +49,95 @@ public function createTeam()
'owner_id' => Auth::id(),
]);

// Ajouter l'utilisateur à l'équipe
// Ajouter l'utilisateur créateur comme admin de l'équipe
TeamUser::create([
'team_id' => $team->id,
'user_id' => Auth::id(),
'role' => 'admin',
'role' => 'admin', // rôle pivot: 'admin' | 'user' | 'rh'
]);

$this->reset(['newTeamName', 'newTeamDescription', 'showCreateForm']);

$this->dispatch('flash', type: 'success', text: 'Équipe créée avec succès !');
}

public function deleteTeam(Team $team)
public function deleteTeam(Team $team): void
{
// Vérifier les permissions
if (!Gate::allows('deleteTeam', $team)) {
if (! Gate::allows('deleteTeam', $team)) {
$this->dispatch('flash', type: 'error', text: 'Vous n\'avez pas les permissions pour supprimer cette équipe.');
return;
}

try {
$teamName = $team->name;
$team->delete();
$this->dispatch('flash', type: 'success', text: 'L\'équipe "' . $teamName . '" a été supprimée avec succès.');
} catch (\Exception $e) {
$this->dispatch('flash', type: 'success', text: 'L\'équipe "'.$teamName.'" a été supprimée avec succès.');
} catch (\Throwable $e) {
$this->dispatch('flash', type: 'error', text: 'Une erreur est survenue lors de la suppression de l\'équipe.');
}
}

/* --------- Comportements liste --------- */

// Reset pagination quand la recherche change
public function updatingSearch(): void
{
$this->resetPage();
}

// Toggle tri / reset page quand on change de champ
public function sortBy(string $field): void
{
$allowed = ['name', 'created_at'];
if (! in_array($field, $allowed, true)) {
$field = 'name';
}

if ($this->sortBy === $field) {
$this->sortDirection = $this->sortDirection === 'asc' ? 'desc' : 'asc';
} else {
$this->sortBy = $field;
$this->sortDirection = 'asc';
$this->resetPage();
}
}

public function render()
{
$user = Auth::user();

// Si c'est l'admin du site, il voit toutes les équipes
if ($user->role === User::ROLE_ADMIN) {
$teams = Team::all();
} else {
// Sinon, seulement ses équipes
$teams = $user->teams;
// Base query
$query = Team::query()->select('teams.*');

// Scope d'appartenance: si pas admin site, ne montrer que les équipes dont il est membre
if ($user->role !== User::ROLE_ADMIN) {
$query->whereHas('users', fn ($q) => $q->where('users.id', $user->id));
}

// Recherche (reste dans le scope ci-dessus)
if (filled($this->search)) {
$s = '%' . str_replace('%', '\%', $this->search) . '%';
$query->where(function ($q) use ($s) {
$q->where('teams.name', 'like', $s)
->orWhere('teams.description', 'like', $s);
});
}

// Compteurs attendus par l'UI
$query->withCount(['users', 'projects']);

// Tri sécurisé (qualifier)
$allowed = ['name', 'created_at'];
if (! in_array($this->sortBy, $allowed, true)) {
$this->sortBy = 'name';
}
$query->orderBy('teams.' . $this->sortBy, $this->sortDirection);

// Pagination
$teams = $query->paginate(10);

return view('livewire.dashboard', [
'teams' => $teams
'teams' => $teams,
]);
}
}
4 changes: 2 additions & 2 deletions app/Livewire/ProjectComponent.php
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ public function addMember()
return;
}

$this->team->users()->attach($user, ['role' => 'member']);
$this->team->users()->attach($user, ['role' => 'user']);
$this->newMemberEmail = '';
$this->team->refresh();

Expand Down Expand Up @@ -166,7 +166,7 @@ public function demoteFromAdmin($userId)
return;
}

$this->team->users()->updateExistingPivot($userId, ['role' => 'member']);
$this->team->users()->updateExistingPivot($userId, ['role' => 'user']);
$this->team->refresh();

$user = User::find($userId);
Expand Down
90 changes: 0 additions & 90 deletions app/Livewire/TeamComponent.php

This file was deleted.

Loading
Loading