initial commit

This commit is contained in:
bastien
2026-06-28 12:29:53 +02:00
parent 03e85d2f9d
commit b2443b654c
220 changed files with 24969 additions and 1 deletions
@@ -0,0 +1,142 @@
<script setup>
import SupervisorLayout from '@/Layouts/SupervisorLayout.vue';
import { Head, Link } from '@inertiajs/vue3';
defineProps({
machine: {
type: Object,
required: true,
},
recentEvents: {
type: Array,
default: () => [],
},
});
const formatDate = (iso) => {
if (!iso) return '—';
return new Intl.DateTimeFormat('fr-FR', {
dateStyle: 'medium',
timeStyle: 'short',
}).format(new Date(iso));
};
const statusColor = (status) => {
const colors = {
available: 'bg-green-100 text-green-800',
reserved: 'bg-yellow-100 text-yellow-800',
running: 'bg-blue-100 text-blue-800',
maintenance: 'bg-orange-100 text-orange-800',
offline: 'bg-gray-100 text-gray-800',
error: 'bg-red-100 text-red-800',
};
return colors[status] ?? 'bg-gray-100 text-gray-800';
};
</script>
<template>
<Head :title="machine.name" />
<SupervisorLayout>
<template #header>
<Link
:href="route('supervisor.machines.index')"
class="text-sm text-indigo-600 hover:text-indigo-800"
>
Retour aux machines
</Link>
</template>
<div class="mb-4">
<h1 class="text-2xl font-bold text-gray-900">{{ machine.name }}</h1>
<p class="text-sm text-gray-500">{{ machine.establishment?.name }}</p>
</div>
<div class="grid grid-cols-1 gap-6 lg:grid-cols-2">
<!-- Details -->
<div class="rounded-lg bg-white p-6 shadow">
<h2 class="mb-4 text-lg font-semibold text-gray-800">Informations</h2>
<dl class="space-y-3 text-sm">
<div class="flex justify-between">
<dt class="text-gray-500">Type</dt>
<dd class="font-medium text-gray-800">{{ machine.type_label }}</dd>
</div>
<div class="flex justify-between">
<dt class="text-gray-500">Statut</dt>
<dd>
<span
class="rounded-full px-2.5 py-0.5 text-xs font-medium"
:class="statusColor(machine.status)"
>
{{ machine.status_label }}
</span>
</dd>
</div>
<div class="flex justify-between">
<dt class="text-gray-500">QR code</dt>
<dd class="font-mono text-gray-800">{{ machine.qr_code }}</dd>
</div>
<div class="flex justify-between">
<dt class="text-gray-500">Dernier signal</dt>
<dd class="text-gray-800">{{ formatDate(machine.last_heartbeat_at) }}</dd>
</div>
<div v-if="machine.cycle_started_at" class="flex justify-between">
<dt class="text-gray-500">Cycle démarré</dt>
<dd class="text-gray-800">{{ formatDate(machine.cycle_started_at) }}</dd>
</div>
<div v-if="machine.cycle_ends_at" class="flex justify-between">
<dt class="text-gray-500">Fin de cycle prévue</dt>
<dd class="text-gray-800">{{ formatDate(machine.cycle_ends_at) }}</dd>
</div>
<div v-if="machine.current_user" class="flex justify-between">
<dt class="text-gray-500">Utilisateur actuel</dt>
<dd class="text-gray-800">
{{ machine.current_user.name }}
<span class="text-gray-500">({{ machine.current_user.email }})</span>
</dd>
</div>
</dl>
<div v-if="machine.establishment" class="mt-6 border-t pt-4">
<h3 class="mb-2 text-sm font-semibold text-gray-700">Établissement</h3>
<p class="text-sm text-gray-600">{{ machine.establishment.address }}</p>
<p v-if="machine.establishment.city" class="text-sm text-gray-600">
{{ machine.establishment.city }}
</p>
</div>
<div v-if="machine.integration" class="mt-6 border-t pt-4">
<h3 class="mb-2 text-sm font-semibold text-gray-700">Intégration</h3>
<dl class="space-y-2 text-sm">
<div class="flex justify-between">
<dt class="text-gray-500">Fournisseur</dt>
<dd>{{ machine.integration.provider }}</dd>
</div>
<div class="flex justify-between">
<dt class="text-gray-500">Mode</dt>
<dd>{{ machine.integration.mode }}</dd>
</div>
<div class="flex justify-between">
<dt class="text-gray-500">Active</dt>
<dd>{{ machine.integration.is_active ? 'Oui' : 'Non' }}</dd>
</div>
</dl>
</div>
</div>
<!-- Events -->
<div class="rounded-lg bg-white p-6 shadow">
<h2 class="mb-4 text-lg font-semibold text-gray-800">Événements récents</h2>
<div v-if="recentEvents.length === 0" class="text-sm text-gray-500">
Aucun événement enregistré.
</div>
<ul v-else class="divide-y divide-gray-100">
<li v-for="(event, index) in recentEvents" :key="index" class="py-3">
<p class="text-sm font-medium text-gray-800">{{ event.event_type_label }}</p>
<p class="text-xs text-gray-500">{{ formatDate(event.occurred_at) }}</p>
</li>
</ul>
</div>
</div>
</SupervisorLayout>
</template>