Merge pull request #183 from R0m1k3/1.1

1.1
This commit is contained in:
LogiFlow authored and GitHub committed 2025-08-16 15:13:53 +02:00
commit 958e99de0d
2 files changed
+48 -24

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

+48 -24
View File
@@ -4,7 +4,7 @@ import { useStore } from "@/components/Layout";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Badge } from "@/components/ui/badge"; import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { Megaphone, Plus, X, AlertTriangle, Info, Bell } from "lucide-react"; import { Megaphone, Plus, X, AlertTriangle, Clock, Circle } from "lucide-react";
import { useState } from "react"; import { useState } from "react";
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog";
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form";
@@ -199,20 +199,40 @@ export default function AnnouncementCard() {
); );
} }
const getPriorityConfig = (priority: string) => {
switch (priority) {
case 'urgent':
return {
color: 'destructive' as const,
icon: AlertTriangle,
label: 'Urgente'
};
case 'important':
return {
color: 'default' as const,
icon: Clock,
label: 'Importante'
};
case 'normal':
default:
return {
color: 'secondary' as const,
icon: Circle,
label: 'Normale'
};
}
};
return ( return (
<Card> <Card>
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2"> <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
<CardTitle className="text-sm font-medium">Informations</CardTitle> <CardTitle className="text-sm font-medium">Informations</CardTitle>
<Megaphone className="h-4 w-4 text-muted-foreground" /> <div className="flex items-center gap-2">
</CardHeader> {user?.role === 'admin' && (
<CardContent>
{user?.role === 'admin' && (
<div className="mb-4">
<Dialog open={isCreateDialogOpen} onOpenChange={setIsCreateDialogOpen}> <Dialog open={isCreateDialogOpen} onOpenChange={setIsCreateDialogOpen}>
<DialogTrigger asChild> <DialogTrigger asChild>
<Button size="sm" variant="outline" className="w-full"> <Button size="sm" variant="ghost" className="h-8 w-8 p-0">
<Plus className="h-4 w-4 mr-2" /> <Plus className="h-4 w-4" />
Nouvelle information
</Button> </Button>
</DialogTrigger> </DialogTrigger>
<DialogContent className="sm:max-w-[500px]"> <DialogContent className="sm:max-w-[500px]">
@@ -318,9 +338,11 @@ export default function AnnouncementCard() {
</Form> </Form>
</DialogContent> </DialogContent>
</Dialog> </Dialog>
</div> )}
)} <Megaphone className="h-4 w-4 text-muted-foreground" />
</div>
</CardHeader>
<CardContent>
{announcements.length === 0 ? ( {announcements.length === 0 ? (
<div className="text-center py-6"> <div className="text-center py-6">
<Megaphone className="h-8 w-8 text-muted-foreground mx-auto mb-2" /> <Megaphone className="h-8 w-8 text-muted-foreground mx-auto mb-2" />
@@ -331,6 +353,9 @@ export default function AnnouncementCard() {
) : ( ) : (
<div className="space-y-3"> <div className="space-y-3">
{announcements.map((announcement) => { {announcements.map((announcement) => {
const priorityConfig = getPriorityConfig(announcement.priority);
const PriorityIcon = priorityConfig.icon;
return ( return (
<div key={announcement.id} className="flex items-start justify-between p-3 rounded-lg border bg-card hover:bg-accent/50 transition-colors"> <div key={announcement.id} className="flex items-start justify-between p-3 rounded-lg border bg-card hover:bg-accent/50 transition-colors">
<div className="flex-1 min-w-0"> <div className="flex-1 min-w-0">
@@ -338,26 +363,25 @@ export default function AnnouncementCard() {
<h4 className="font-medium text-sm truncate"> <h4 className="font-medium text-sm truncate">
{announcement.title} {announcement.title}
</h4> </h4>
<Badge variant="secondary" className={getPriorityColor(announcement.priority)}> <Badge variant={priorityConfig.color} className="flex items-center gap-1 text-xs">
<span className="flex items-center gap-1"> <PriorityIcon className="w-2.5 h-2.5" />
{getPriorityIcon(announcement.priority)} {priorityConfig.label}
{announcement.priority === 'urgent' ? 'Urgent' :
announcement.priority === 'important' ? 'Important' : 'Normal'}
</span>
</Badge> </Badge>
</div> </div>
<p className="text-xs text-muted-foreground mb-1 line-clamp-2"> {announcement.content && (
{announcement.content} <p className="text-xs text-muted-foreground mb-1 line-clamp-1">
</p> {announcement.content}
</p>
)}
<div className="flex items-center gap-3 text-xs text-muted-foreground"> <div className="flex items-center gap-3 text-xs text-muted-foreground">
<span> <span>
Par {announcement.author.firstName} {announcement.author.lastName} {safeFormat(safeDate(announcement.createdAt), 'dd/MM à HH:mm')}
{announcement.group && ` • ${announcement.group.name}`}
</span> </span>
<span> <span>
{safeFormat(safeDate(announcement.createdAt), 'dd/MM HH:mm')} {announcement.author.firstName} {announcement.author.lastName}
{announcement.group && ` • ${announcement.group.name}`}
</span> </span>
</div> </div>
</div> </div>