From 254ecbfd14212070bb0be009108c7edfc7d96fa2 Mon Sep 17 00:00:00 2001 From: Cosmo Date: Thu, 16 Apr 2026 09:15:55 +0000 Subject: [PATCH] fix: remove services from main, compact calendar + large events panel --- src/app/(dashboard)/page.tsx | 10 +- src/components/widgets/CalendarWidget.tsx | 275 +++++++++++----------- 2 files changed, 142 insertions(+), 143 deletions(-) diff --git a/src/app/(dashboard)/page.tsx b/src/app/(dashboard)/page.tsx index 99b3c5b..f6a9ee6 100644 --- a/src/app/(dashboard)/page.tsx +++ b/src/app/(dashboard)/page.tsx @@ -4,7 +4,6 @@ import { WeatherWidget } from "@/components/widgets/WeatherWidget"; import { CalendarWidget } from "@/components/widgets/CalendarWidget"; import { ClaudeUsageWidget } from "@/components/widgets/ClaudeUsageWidget"; import { ClaudeApiWidget } from "@/components/widgets/ClaudeApiWidget"; -import { ServicesGrid } from "@/components/widgets/ServicesGrid"; import { DashboardHeader } from "@/components/widgets/DashboardHeader"; export default function DashboardPage() { @@ -21,15 +20,10 @@ export default function DashboardPage() {
-
- - -
+ +
- - {/* Services */} - ); } diff --git a/src/components/widgets/CalendarWidget.tsx b/src/components/widgets/CalendarWidget.tsx index f12a369..ad510b3 100644 --- a/src/components/widgets/CalendarWidget.tsx +++ b/src/components/widgets/CalendarWidget.tsx @@ -27,7 +27,6 @@ export function CalendarWidget() { const [newEvent, setNewEvent] = useState({ title: "", startTime: "09:00", endTime: "10:00", allDay: false }); const [creating, setCreating] = useState(false); const [createError, setCreateError] = useState(""); - const [calError, setCalError] = useState(null); const monthStr = `${year}-${String(month + 1).padStart(2, "0")}`; @@ -35,8 +34,6 @@ export function CalendarWidget() { try { const res = await fetch(`/api/calendar?month=${monthStr}`); const data = await res.json(); - if (data.error && data.events?.length === 0) setCalError(data.error); - else setCalError(null); setMonthEvents(data.events ?? []); } catch { setMonthEvents([]); } }, [monthStr]); @@ -68,7 +65,6 @@ export function CalendarWidget() { const daysInMonth = new Date(year, month + 1, 0).getDate(); const startOffset = firstDay === 0 ? 6 : firstDay - 1; const cells = Array(startOffset).fill(null).concat(Array.from({ length: daysInMonth }, (_, i) => i + 1)); - const datesWithEvents = new Set(monthEvents.map(e => (e.start || "").split("T")[0])); const createEvent = async () => { @@ -86,155 +82,164 @@ export function CalendarWidget() { setNewEvent({ title: "", startTime: "09:00", endTime: "10:00", allDay: false }); fetchDay(selectedDate); fetchMonth(); - } catch (e: unknown) { setCreateError(e instanceof Error ? e.message : "Ошибка создания"); } + } catch (e: unknown) { setCreateError(e instanceof Error ? e.message : "Ошибка"); } finally { setCreating(false); } }; const todayStr = `${today.getFullYear()}-${String(today.getMonth()+1).padStart(2,"0")}-${String(today.getDate()).padStart(2,"0")}`; - if (calError === "Google Calendar not configured") { - return ( -
-
📅
-
Google Calendar
-
Не настроен. Добавь переменные окружения в Coolify.
-
- ); - } - return ( -
- {/* Header */} -
- - {MONTHS[month]} {year} - -
+
+
- {/* Weekday labels */} -
- {WEEK_DAYS.map(d => ( -
{d}
- ))} - {cells.map((day, i) => { - if (!day) return
; - const dateStr = `${year}-${String(month+1).padStart(2,"0")}-${String(day).padStart(2,"0")}`; - const isToday = dateStr === todayStr; - const isSelected = dateStr === selectedDate; - const hasEvents = datesWithEvents.has(dateStr); - return ( - - ); - })} -
- - {/* Day events panel */} - {selectedDate && ( -
+ {/* LEFT: compact calendar */} +
+ {/* Month nav */}
- - {new Date(selectedDate + "T12:00:00").toLocaleDateString("ru-RU", { day: "numeric", month: "long" })} - - + {MONTHS[month]} {year} +
- {showCreate && ( -
- setNewEvent(n => ({ ...n, title: e.target.value }))} - onKeyDown={e => e.key === "Enter" && createEvent()} - /> -
- + {/* Grid */} +
+ {WEEK_DAYS.map(d => ( +
{d}
+ ))} + {cells.map((day, i) => { + if (!day) return
; + const dateStr = `${year}-${String(month+1).padStart(2,"0")}-${String(day).padStart(2,"0")}`; + const isToday = dateStr === todayStr; + const isSelected = dateStr === selectedDate; + const hasEvents = datesWithEvents.has(dateStr); + return ( + + ); + })} +
+
+ + {/* RIGHT: events for selected day */} +
+ {!selectedDate ? ( +
+ 📅 + Выбери день +
+ ) : ( + <> + {/* Day header */} +
+ + {new Date(selectedDate + "T12:00:00").toLocaleDateString("ru-RU", { day: "numeric", month: "long" })} + +
- {!newEvent.allDay && ( -
- setNewEvent(n => ({ ...n, startTime: e.target.value }))} - className="flex-1 bg-white/5 rounded-lg px-2 py-1.5 text-xs text-white outline-none focus:ring-1 focus:ring-violet-500" /> - - setNewEvent(n => ({ ...n, endTime: e.target.value }))} - className="flex-1 bg-white/5 rounded-lg px-2 py-1.5 text-xs text-white outline-none focus:ring-1 focus:ring-violet-500" /> + + {/* Create form */} + {showCreate && ( +
+ setNewEvent(n => ({ ...n, title: e.target.value }))} + onKeyDown={e => e.key === "Enter" && createEvent()} + autoFocus + /> + + {!newEvent.allDay && ( +
+ setNewEvent(n => ({ ...n, startTime: e.target.value }))} + className="flex-1 bg-white/5 rounded-lg px-2 py-1.5 text-xs text-white outline-none focus:ring-1 focus:ring-violet-500" /> + + setNewEvent(n => ({ ...n, endTime: e.target.value }))} + className="flex-1 bg-white/5 rounded-lg px-2 py-1.5 text-xs text-white outline-none focus:ring-1 focus:ring-violet-500" /> +
+ )} + {createError &&
{createError}
} +
+ + +
)} - {createError &&
{createError}
} -
- - -
-
- )} - {loadingDay ? ( -
- {[1,2].map(i =>
)} -
- ) : dayEvents.length === 0 ? ( -
Нет событий
- ) : ( -
- {dayEvents.map(ev => ( -
-
-
-
{ev.title}
-
- - {ev.allDay ? "Весь день" : formatTime(ev.start)} - {ev.end && !ev.allDay && ` — ${formatTime(ev.end)}`} -
+ {/* Events list */} +
+ {loadingDay ? ( +
+ {[1,2,3].map(i =>
)}
- {ev.htmlLink && ( - - - - )} -
- ))} -
+ ) : dayEvents.length === 0 ? ( +
+ 🗓 + Нет событий + +
+ ) : ( + dayEvents.map(ev => ( +
+
+
+
{ev.title}
+
+ + {ev.allDay ? "Весь день" : formatTime(ev.start)} + {ev.end && !ev.allDay && ` — ${formatTime(ev.end)}`} +
+
+ {ev.htmlLink && ( + + + + )} +
+ )) + )} +
+ )}
- )} +
); }