CRUD Final 5 : Vue, Inertia & Laravel
Thème :
Intermédiaire
1 vues ·5/6 leçons

Show.vue

<script setup lang="ts">
import { Head, Link } from '@inertiajs/vue3';
import type { Student } from '@/types/student';
import * as studentsRoute from '@/routes/students';
import { Button } from '@/components/ui/button';

import { ArrowLeft, Mail, Globe, Languages } from 'lucide-vue-next';

interface Props {
    student: Student;
}

defineProps<Props>();
</script>

<template>
    <Head :title="student.name" />

    <div class="bg-white py-12">
        <div class="mx-auto max-w-4xl space-y-6 sm:px-6 lg:px-8">
            <!-- Bouton retour -->
            <Link :href="studentsRoute.index().url">
                <Button variant="ghost" size="sm">
                    <ArrowLeft class="mr-2 h-4 w-4" />
                    Retour à la liste
                </Button>
            </Link>

            <span>Profil de l'étudiant</span>

            <div class="space-y-6 bg-white">
                <!-- Photo et infos principales -->
                <div class="flex items-start gap-6 bg-white">
                    <img
                        v-if="student.profile_url"
                        :src="student.profile_url"
                        :alt="student.name"
                        class="h-32 w-32 rounded-full border-2 object-cover"
                    />
                    <div v-else class="flex h-32 w-32 items-center justify-center rounded-full bg-gray-200 text-4xl font-bold dark:bg-gray-700">
                        {{ student.name.charAt(0).toUpperCase() }}
                    </div>

                    <div class="flex-1 space-y-3">
                        <div>
                            <h2 class="text-3xl font-bold">{{ student.name }}</h2>
                            <p class="mt-1 flex items-center gap-2 text-muted-foreground">
                                <Mail class="h-4 w-4" />
                                {{ student.email }}
                            </p>
                        </div>

                        <div class="flex flex-wrap gap-2">
                            <span>
                                {{ student.sexe === 'male' ? 'Masculin' : student.sexe === 'female' ? 'Féminin' : 'Autre' }}
                            </span>
                            <span variant="outline" class="flex items-center gap-1">
                                <Globe class="h-3 w-3" />
                                {{ student.country }}
                            </span>
                            <span variant="outline" class="flex items-center gap-1">
                                <Languages class="h-3 w-3" />
                                {{ student.language === 'fr' ? 'Français' : 'English' }}
                            </span>
                        </div>
                    </div>
                </div>

                <!-- Programmes -->
                <div class="space-y-2">
                    <h3 class="text-lg font-semibold">Programmes maîtrisés</h3>
                    <div class="flex flex-wrap gap-2">
                        <span v-for="program in student.programs" :key="program" variant="secondary" class="px-3 py-1 text-sm">
                            {{ program.toUpperCase() }}
                        </span>
                    </div>
                </div>

                <!-- Bio -->
                <div v-if="student.bio" class="space-y-2">
                    <h3 class="text-lg font-semibold">Biographie</h3>
                    <p class="leading-relaxed text-muted-foreground">
                        {{ student.bio }}
                    </p>
                </div>

                <!-- Date de création -->
                <div class="border-t pt-4 text-sm text-muted-foreground">Membre depuis le {{ student.created_at }}</div>

                <!-- Actions -->
                <div class="flex gap-3 pt-4">
                    <Link :href="studentsRoute.edit(student.id).url">
                        <Button>Modifier</Button>
                    </Link>
                </div>
            </div>
        </div>
    </div>
</template>

Prêt à passer à la suite ?

Vous avez terminé cette leçon sur Show.vue. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.