Add user information and calendar list to sidebar

Backend changes:
- Add /api/user/info endpoint to fetch user details and calendar list
- Create UserInfo and CalendarInfo models for API responses
- Filter out generic calendar collections from sidebar display
- Extract readable calendar names with proper title case formatting

Frontend changes:
- Fetch and display user info (username, server URL) in sidebar header
- Show list of user's calendars with hover effects and styling
- Add loading states and error handling for user info
- Reorganize sidebar layout: header, navigation, calendar list, logout

Styling:
- Enhanced sidebar with user info section and calendar list
- Responsive design hides user info and calendar list on mobile
- Improved logout button positioning in sidebar footer
- Professional styling with proper spacing and visual hierarchy

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Connor Johnstone
2025-08-28 19:58:02 -04:00
parent 8a0d2286dc
commit 7c83a4522c
7 changed files with 338 additions and 10 deletions

View File

@@ -45,15 +45,39 @@ body {
}
.sidebar-header h1 {
margin: 0;
margin: 0 0 1rem 0;
font-size: 1.8rem;
font-weight: 600;
text-align: center;
}
.user-info {
text-align: center;
margin-bottom: 0.5rem;
}
.user-info .username {
font-size: 1.1rem;
font-weight: 600;
color: white;
margin-bottom: 0.25rem;
}
.user-info .server-url {
font-size: 0.8rem;
color: rgba(255,255,255,0.7);
word-break: break-all;
line-height: 1.2;
}
.user-info.loading {
font-size: 0.9rem;
color: rgba(255,255,255,0.6);
font-style: italic;
}
.sidebar-nav {
flex: 1;
padding: 1.5rem 1rem;
padding: 1rem;
display: flex;
flex-direction: column;
gap: 0.5rem;
@@ -80,6 +104,65 @@ body {
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.calendar-list {
flex: 1;
padding: 1rem;
border-top: 1px solid rgba(255,255,255,0.1);
}
.calendar-list h3 {
color: white;
font-size: 1rem;
font-weight: 600;
margin: 0 0 1rem 0;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.calendar-list ul {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.calendar-list li {
display: flex;
align-items: center;
padding: 0.5rem 0.75rem;
background: rgba(255,255,255,0.1);
border-radius: 6px;
transition: all 0.2s;
cursor: pointer;
}
.calendar-list li:hover {
background: rgba(255,255,255,0.15);
transform: translateX(2px);
}
.calendar-name {
color: white;
font-size: 0.9rem;
font-weight: 500;
}
.no-calendars {
padding: 1rem;
text-align: center;
color: rgba(255,255,255,0.6);
font-size: 0.9rem;
font-style: italic;
border-top: 1px solid rgba(255,255,255,0.1);
}
.sidebar-footer {
padding: 1rem;
border-top: 1px solid rgba(255,255,255,0.1);
}
.app-main {
flex: 1;
margin-left: 280px;
@@ -200,13 +283,12 @@ body {
cursor: pointer;
transition: all 0.2s;
font-weight: 500;
margin-top: auto;
margin-bottom: 1rem;
width: 100%;
}
.logout-button:hover {
background: rgba(255,255,255,0.2);
transform: translateX(4px);
transform: translateY(-1px);
}
/* Calendar View */
@@ -549,6 +631,10 @@ body {
margin: 0;
}
.user-info {
display: none; /* Hide user info on mobile to save space */
}
.sidebar-nav {
flex-direction: row;
padding: 0;
@@ -566,6 +652,16 @@ body {
margin: 0;
padding: 0.5rem 0.75rem;
font-size: 0.9rem;
width: auto;
}
.calendar-list {
display: none; /* Hide calendar list on mobile */
}
.sidebar-footer {
padding: 0;
border-top: none;
}
.app-main {