diff --git a/backend/main.py b/backend/main.py index 8834467..9cc9988 100644 --- a/backend/main.py +++ b/backend/main.py @@ -31,6 +31,18 @@ def _migrate(): logging.info("Migration: added week_start_day column") except Exception: pass # Column already exists + try: + conn.execute(text("ALTER TABLE calendars ADD COLUMN sidebar_hidden BOOLEAN DEFAULT 0")) + conn.commit() + logging.info("Migration: added sidebar_hidden to calendars") + except Exception: + pass + try: + conn.execute(text("ALTER TABLE google_calendars ADD COLUMN sidebar_hidden BOOLEAN DEFAULT 0")) + conn.commit() + logging.info("Migration: added sidebar_hidden to google_calendars") + except Exception: + pass _migrate() diff --git a/backend/models.py b/backend/models.py index 55920db..eef1bc3 100644 --- a/backend/models.py +++ b/backend/models.py @@ -59,6 +59,7 @@ class Calendar(Base): name = Column(String(100), nullable=False) color = Column(String(7), nullable=True) enabled = Column(Boolean, default=True) + sidebar_hidden = Column(Boolean, default=False) account = relationship("CalDAVAccount", back_populates="calendars") @@ -168,5 +169,6 @@ class GoogleCalendar(Base): name = Column(String(255), nullable=False) color = Column(String(7), nullable=True) enabled = Column(Boolean, default=True) + sidebar_hidden = Column(Boolean, default=False) account = relationship("GoogleAccount", back_populates="calendars") diff --git a/backend/routers/caldav_router.py b/backend/routers/caldav_router.py index 67b851b..a0d61aa 100644 --- a/backend/routers/caldav_router.py +++ b/backend/routers/caldav_router.py @@ -29,6 +29,7 @@ class CalendarUpdate(BaseModel): enabled: Optional[bool] = None color: Optional[str] = None name: Optional[str] = None + sidebar_hidden: Optional[bool] = None class EventCreate(BaseModel): @@ -67,6 +68,7 @@ def _account_dict(a: models.CalDAVAccount) -> dict: "color": c.color or a.color, "enabled": c.enabled, "cal_id": c.cal_id, + "sidebar_hidden": bool(c.sidebar_hidden), } for c in a.calendars ], @@ -225,6 +227,8 @@ def update_calendar( calendar.color = data.color if data.name is not None: calendar.name = data.name + if data.sidebar_hidden is not None: + calendar.sidebar_hidden = data.sidebar_hidden db.commit() return {"ok": True} diff --git a/backend/routers/google_router.py b/backend/routers/google_router.py index e2a7e03..a944a05 100644 --- a/backend/routers/google_router.py +++ b/backend/routers/google_router.py @@ -131,6 +131,7 @@ def _account_dict(a: models.GoogleAccount) -> dict: "name": c.name, "color": c.color or "#4285f4", "enabled": c.enabled, + "sidebar_hidden": bool(c.sidebar_hidden), } for c in a.calendars ], @@ -325,6 +326,7 @@ class GoogleCalendarUpdate(BaseModel): enabled: Optional[bool] = None color: Optional[str] = None name: Optional[str] = None + sidebar_hidden: Optional[bool] = None @router.put("/calendars/{calendar_id}") @@ -351,6 +353,8 @@ def update_calendar( gcal.color = data.color if data.name is not None: gcal.name = data.name + if data.sidebar_hidden is not None: + gcal.sidebar_hidden = data.sidebar_hidden db.commit() return {"ok": True} diff --git a/frontend/css/app.css b/frontend/css/app.css index 0d541f8..0e1cbbb 100644 --- a/frontend/css/app.css +++ b/frontend/css/app.css @@ -335,6 +335,7 @@ a { color: var(--primary); text-decoration: none; } border-right: 1px solid var(--border); flex-shrink: 0; overflow-y: auto; + overflow-x: hidden; transition: transform var(--transition); } .sidebar.collapsed { transform: translateX(calc(-1 * var(--sidebar-w))); margin-right: calc(-1 * var(--sidebar-w)); } diff --git a/frontend/js/calendar.js b/frontend/js/calendar.js index ac402e2..49cfadd 100644 --- a/frontend/js/calendar.js +++ b/frontend/js/calendar.js @@ -262,7 +262,7 @@ function renderCalendarList() { // ── CalDAV accounts ──────────────────────────────────── if (state.accounts.length) { html += state.accounts.map(acc => { - const visibleCals = acc.calendars.filter(c => !c._hidden); + const visibleCals = acc.calendars.filter(c => !c.sidebar_hidden); if (!visibleCals.length) return ''; return `