source: frontend/src/components/CalendarDay.tsx

main
Last change on this file was 700e2f9, checked in by 186079 <matej.milevski@…>, 5 days ago

Init

  • Property mode set to 100644
File size: 2.5 KB
Line 
1import { type Component, Show } from "solid-js";
2
3interface CalendarDayProps {
4 day: number | null;
5 isCurrentMonth: boolean;
6 hasEntry: boolean;
7 isFuture?: boolean;
8 isToday?: boolean;
9 isTherapistView?: boolean;
10 entry?: {
11 dailyRating: number;
12 content: string;
13 };
14 onClick?: () => void;
15}
16
17const getRatingColor = (rating: number) => {
18 if (rating <= 2) return "bg-red-100 border-red-300 text-red-800";
19 if (rating <= 4) return "bg-orange-100 border-orange-300 text-orange-800";
20 if (rating <= 6) return "bg-yellow-100 border-yellow-300 text-yellow-800";
21 if (rating <= 8) return "bg-green-100 border-green-300 text-green-800";
22 return "bg-blue-100 border-blue-300 text-blue-800";
23};
24
25const CalendarDay: Component<CalendarDayProps> = (props) => (
26 <Show
27 when={props.day !== null && props.isCurrentMonth}
28 fallback={
29 <div
30 class={`bg-gray-50 border border-gray-200 rounded-lg p-2 ${props.isTherapistView ? "h-16" : "h-24"}`}
31 />
32 }
33 >
34 <div
35 class={`rounded-lg p-2 transition-all ${props.isTherapistView ? "h-16" : "h-24"} ${
36 props.isToday ? "border-4 border-blue-600 shadow-lg" : "border-2"
37 } ${props.isFuture || props.isTherapistView ? "" : "cursor-pointer"} ${
38 props.hasEntry
39 ? `${getRatingColor(props.entry!.dailyRating)} hover:shadow-md`
40 : props.isFuture
41 ? "bg-white border-gray-200 text-gray-400 relative overflow-hidden"
42 : "bg-white border-gray-200 text-gray-300 hover:border-gray-300"
43 }`}
44 onClick={props.isFuture ? undefined : props.onClick}
45 style={
46 props.isFuture && !props.hasEntry
47 ? {
48 "background-image":
49 "repeating-linear-gradient(45deg, transparent, transparent 10px, rgba(0,0,0,0.03) 10px, rgba(0,0,0,0.03) 20px)",
50 }
51 : {}
52 }
53 >
54 <div class="flex justify-between items-start mb-1">
55 <span
56 class={`text-sm font-semibold ${
57 props.hasEntry ? "" : "text-gray-400"
58 }`}
59 >
60 {props.day}
61 </span>
62 <Show when={props.hasEntry}>
63 <span
64 class={`font-bold ${props.isTherapistView ? "text-base" : "text-xs"}`}
65 >
66 ★ {props.entry!.dailyRating}/10
67 </span>
68 </Show>
69 </div>
70 <Show when={props.hasEntry && !props.isTherapistView}>
71 <p class="text-xs line-clamp-2 overflow-hidden">
72 {props.entry!.content}
73 </p>
74 </Show>
75 </div>
76 </Show>
77);
78
79export default CalendarDay;
Note: See TracBrowser for help on using the repository browser.