Filament moderne (groupes nav, 4 charts, filtres/badges) + Filament Shield (rôles/permissions) + noms exos localisés dans routines
Build & Deploy / build (push) Successful in 19s

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-19 05:09:29 +02:00
co-authored by Claude Opus 4.8
parent 3ec14f219b
commit 52fab9fbe5
47 changed files with 1644 additions and 292 deletions
@@ -2,16 +2,21 @@
namespace Functional\Routines\Http\Resources;
use Functional\Exercises\Models\Exercise;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
/**
* Une ligne du pivot routine_exercises, avec un sous-objet exercice minimal prêt-à-afficher.
* Une ligne du pivot routine_exercises, avec un sous-objet exercice minimal prêt-à-afficher
* (nom + muscle localisés selon la locale de la requête).
*/
class RoutineExerciseResource extends JsonResource
{
public function toArray(Request $request): array
{
$locale = (string) ($request->query('locale') ?: 'fr');
$exercise = $this->exercise;
return [
'exercise_id' => $this->exercise_id,
'position' => $this->position,
@@ -21,12 +26,12 @@ class RoutineExerciseResource extends JsonResource
'tempo' => $this->tempo,
'target_weight' => $this->target_weight,
'notes' => $this->notes,
'exercise' => [
'id' => $this->exercise->id,
'name' => $this->exercise->name,
'image_url' => $this->exercise->image_url,
'target' => $this->exercise->target,
],
'exercise' => $exercise ? [
'id' => $exercise->id,
'name' => $exercise->localizedName($locale),
'image_url' => $exercise->image_url,
'target' => Exercise::localizeTerm($exercise->target, $locale),
] : null,
];
}
}
+4 -3
View File
@@ -15,6 +15,7 @@ use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
use NotificationChannels\WebPush\HasPushSubscriptions;
use Spatie\Permission\Traits\HasRoles;
/**
* @property string $locale
@@ -28,12 +29,12 @@ use NotificationChannels\WebPush\HasPushSubscriptions;
#[UseFactory(UserFactory::class)]
class User extends Authenticatable implements FilamentUser
{
use HasApiTokens, HasFactory, HasPushSubscriptions, Notifiable;
use HasApiTokens, HasFactory, HasPushSubscriptions, HasRoles, Notifiable;
/** Accès au back-office Filament (à affiner : rôle admin plus tard). */
/** Accès au back-office Filament : réservé aux rôles "super_admin" ou "admin" (Filament Shield). */
public function canAccessPanel(Panel $panel): bool
{
return true;
return $this->hasAnyRole(['super_admin', 'admin']);
}
/**