2026-05-04 11:32:50 +03:00

226 lines
5.9 KiB
Vue

<template>
<client-detail-template>
<template #button-return>
<div class="col-12">
<router-link
to="/interventions"
class="btn btn-outline-secondary btn-sm mb-3"
>
<i class="fas fa-arrow-left me-2"></i>Retour aux interventions
</router-link>
</div>
</template>
<template #client-detail-sidebar>
<div class="card position-sticky top-1 intervention-sidebar-card">
<div class="card-body text-center p-4">
<div class="avatar avatar-xxl position-relative mx-auto mb-3">
<div
class="intervention-avatar w-100 border-radius-xl shadow-sm d-flex align-items-center justify-content-center"
>
<i class="fas fa-notes-medical text-white text-xl"></i>
</div>
</div>
<soft-badge color="success" variant="gradient" size="sm" class="mb-3">
Nouvelle intervention
</soft-badge>
<h5 class="mb-1">Planifier une intervention</h5>
<p class="text-sm text-muted mb-0">
Préparez une fiche claire, liée au client et au défunt, dans le
style du dashboard.
</p>
</div>
</div>
<div class="card intervention-sidebar-card mt-4">
<div class="card-header pb-0">
<h6 class="mb-1">Repères</h6>
<p class="text-sm text-muted mb-0">
Les éléments ci-dessous suffisent pour démarrer correctement.
</p>
</div>
<div class="card-body pt-3">
<div class="check-item">
<span class="check-dot bg-gradient-success"></span>
<span class="text-sm">Associer le bon client</span>
</div>
<div class="check-item">
<span class="check-dot bg-gradient-info"></span>
<span class="text-sm">Définir le type d'intervention</span>
</div>
<div class="check-item">
<span class="check-dot bg-gradient-dark"></span>
<span class="text-sm">Renseigner la planification si connue</span>
</div>
</div>
</div>
</template>
<template #client-detail-content>
<div class="card intervention-hero-card mb-4">
<div class="card-body p-4">
<div
class="d-flex flex-column flex-lg-row align-items-lg-center justify-content-between gap-3"
>
<div>
<p
class="text-sm text-uppercase text-success font-weight-bold mb-2"
>
Dashboard intervention
</p>
<h4 class="mb-1">Créer une nouvelle intervention</h4>
<p class="text-sm text-muted mb-0">
Une mise en page plus propre, cohérente avec le reste de
l'application, centrée sur les informations métier utiles.
</p>
</div>
<div class="hero-pill-group">
<span class="hero-pill">
<i class="fas fa-user me-2 text-success"></i>Client
</span>
<span class="hero-pill">
<i class="fas fa-cross me-2 text-info"></i>Défunt
</span>
<span class="hero-pill">
<i class="fas fa-calendar-alt me-2 text-dark"></i>Planning
</span>
</div>
</div>
</div>
</div>
<intervention-form
:loading="loading"
:validation-errors="validationErrors"
:success="success"
:deceased-list="deceasedList"
:deceased-loading="deceasedLoading"
:client-list="clientList"
:client-loading="clientLoading"
:search-clients="searchClients"
:on-client-select="onClientSelect"
:search-deceased="searchDeceased"
:on-deceased-select="onDeceasedSelect"
@create-intervention="handleCreateIntervention"
/>
</template>
</client-detail-template>
</template>
<script setup>
import ClientDetailTemplate from "@/components/templates/CRM/ClientDetailTemplate.vue";
import InterventionForm from "@/components/molecules/Interventions/InterventionForm.vue";
import SoftBadge from "@/components/SoftBadge.vue";
import { defineProps, defineEmits } from "vue";
import { RouterLink } from "vue-router";
defineProps({
loading: {
type: Boolean,
default: false,
},
validationErrors: {
type: Object,
default: () => ({}),
},
success: {
type: Boolean,
default: false,
},
deceasedList: {
type: Array,
default: () => [],
},
deceasedLoading: {
type: Boolean,
default: false,
},
clientList: {
type: Array,
default: () => [],
},
clientLoading: {
type: Boolean,
default: false,
},
searchClients: {
type: Function,
required: true,
},
onClientSelect: {
type: Function,
required: true,
},
searchDeceased: {
type: Function,
required: true,
},
onDeceasedSelect: {
type: Function,
required: true,
},
});
const emit = defineEmits(["createIntervention"]);
const handleCreateIntervention = (data) => {
emit("createIntervention", data);
};
</script>
<style scoped>
.position-sticky {
top: 1rem;
}
.intervention-sidebar-card,
.intervention-hero-card {
border: 0;
box-shadow: 0 0 2rem 0 rgba(136, 152, 170, 0.15);
}
.intervention-avatar {
width: 100px;
height: 100px;
background: linear-gradient(135deg, #17c1e8 0%, #3a416f 100%);
}
.check-item {
display: flex;
align-items: center;
gap: 0.75rem;
}
.check-item + .check-item {
margin-top: 0.9rem;
}
.check-dot {
width: 10px;
height: 10px;
border-radius: 999px;
display: inline-block;
flex: 0 0 auto;
}
.hero-pill-group {
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
}
.hero-pill {
display: inline-flex;
align-items: center;
padding: 0.7rem 1rem;
border-radius: 999px;
background: rgba(248, 249, 250, 0.95);
color: #344767;
font-size: 0.875rem;
font-weight: 600;
box-shadow: 0 10px 30px rgba(15, 23, 42, 0.06);
}
</style>