Checkpoint: Refonte complète du système de rappels pour permettre une gestion granulaire par séquence
Fonctionnalités ajoutées : - Table de liaison rappelSequences pour associer rappels et séquences - Composant SequenceMultiSelect avec recherche et multi-sélection - Gestion des associations dans les procédures create/update - Modification du scheduler pour filtrer les séquences selon les associations - Si aucune séquence n'est sélectionnée, le rappel s'applique à toutes les séquences (comportement par défaut) Le système permet maintenant de configurer des rappels spécifiques pour certaines dates/séquences particulières, offrant une flexibilité complète dans la gestion des rappels automatiques.
This commit is contained in:
@@ -25,6 +25,7 @@ import { trpc } from "@/lib/trpc";
|
||||
import { Bell, Edit, Plus, Trash2 } from "lucide-react";
|
||||
import { toast } from "sonner";
|
||||
import { FileUpload } from "@/components/FileUpload";
|
||||
import { SequenceMultiSelect } from "@/components/SequenceMultiSelect";
|
||||
|
||||
// Types de templates disponibles pour les rappels
|
||||
const TEMPLATE_TYPES = [
|
||||
@@ -47,6 +48,7 @@ export default function AdminRappels() {
|
||||
joursAvant: 7,
|
||||
heureEnvoi: "09:00",
|
||||
actif: true,
|
||||
sequenceIds: [] as number[],
|
||||
fichier: null as {
|
||||
nomFichier: string;
|
||||
urlFichier: string;
|
||||
@@ -57,6 +59,7 @@ export default function AdminRappels() {
|
||||
});
|
||||
|
||||
const { data: rappels, refetch } = trpc.rappels.list.useQuery();
|
||||
const { data: sequences } = trpc.sequences.list.useQuery();
|
||||
const createMutation = trpc.rappels.create.useMutation({
|
||||
onSuccess: () => {
|
||||
toast.success("Rappel créé avec succès");
|
||||
@@ -111,6 +114,7 @@ export default function AdminRappels() {
|
||||
joursAvant: 7,
|
||||
heureEnvoi: "09:00",
|
||||
actif: true,
|
||||
sequenceIds: [],
|
||||
});
|
||||
};
|
||||
|
||||
@@ -131,6 +135,7 @@ export default function AdminRappels() {
|
||||
joursAvant: rappel.joursAvant,
|
||||
heureEnvoi: rappel.heureEnvoi,
|
||||
actif: rappel.actif,
|
||||
sequenceIds: rappel.sequenceIds || [],
|
||||
fichier: rappel.nomFichier ? {
|
||||
nomFichier: rappel.nomFichier,
|
||||
urlFichier: rappel.urlFichier,
|
||||
@@ -376,6 +381,23 @@ export default function AdminRappels() {
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="space-y-2">
|
||||
<Label>Séquences concernées (optionnel)</Label>
|
||||
<SequenceMultiSelect
|
||||
sequences={sequences?.map(seq => ({
|
||||
id: seq.id,
|
||||
nom: seq.nom,
|
||||
formationNom: seq.formation?.nom
|
||||
})) || []}
|
||||
selectedIds={formData.sequenceIds}
|
||||
onChange={(sequenceIds) => setFormData({ ...formData, sequenceIds })}
|
||||
placeholder="Toutes les séquences (par défaut)"
|
||||
/>
|
||||
<p className="text-sm text-muted-foreground">
|
||||
Si aucune séquence n'est sélectionnée, le rappel s'appliquera à toutes les séquences
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<FileUpload
|
||||
value={formData.fichier}
|
||||
onChange={(fichier) => setFormData({ ...formData, fichier })}
|
||||
@@ -503,6 +525,23 @@ export default function AdminRappels() {
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="space-y-2">
|
||||
<Label>Séquences concernées (optionnel)</Label>
|
||||
<SequenceMultiSelect
|
||||
sequences={sequences?.map(seq => ({
|
||||
id: seq.id,
|
||||
nom: seq.nom,
|
||||
formationNom: seq.formation?.nom
|
||||
})) || []}
|
||||
selectedIds={formData.sequenceIds}
|
||||
onChange={(sequenceIds) => setFormData({ ...formData, sequenceIds })}
|
||||
placeholder="Toutes les séquences (par défaut)"
|
||||
/>
|
||||
<p className="text-sm text-muted-foreground">
|
||||
Si aucune séquence n'est sélectionnée, le rappel s'appliquera à toutes les séquences
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<FileUpload
|
||||
value={formData.fichier}
|
||||
onChange={(fichier) => setFormData({ ...formData, fichier })}
|
||||
|
||||
Reference in New Issue
Block a user