From 834672de75972940844136064e0f60e54da7751c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 24 Oct 2025 08:10:10 +0000 Subject: [PATCH 1/9] Initial plan From 6d918cba69b93c8bf1c2bbbb25fd6c4d0df0df4d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 24 Oct 2025 08:30:05 +0000 Subject: [PATCH 2/9] Add mobile responsive layout to dashboard pages Co-authored-by: TechQuery <19969570+TechQuery@users.noreply.github.com> --- components/User/SessionBox.tsx | 161 +++++++++++++++++++++++++------ pages/dashboard/index.tsx | 39 ++++++-- pages/dashboard/project/[id].tsx | 88 ++++++++++++++--- 3 files changed, 239 insertions(+), 49 deletions(-) diff --git a/components/User/SessionBox.tsx b/components/User/SessionBox.tsx index 5f89820..f927f03 100644 --- a/components/User/SessionBox.tsx +++ b/components/User/SessionBox.tsx @@ -1,14 +1,34 @@ import { User } from '@idea2app/data-server'; -import { Box, List, ListItem, ListItemButton, ListItemText, Modal } from '@mui/material'; +import { + Box, + Drawer, + IconButton, + List, + ListItem, + ListItemButton, + ListItemText, + Modal, +} from '@mui/material'; import { observable } from 'mobx'; import { observer } from 'mobx-react'; import Link from 'next/link'; import { JWTProps } from 'next-ssr-middleware'; import { Component, HTMLAttributes, JSX } from 'react'; -import { PageHead } from '../PageHead'; import { SessionForm } from './SessionForm'; +const MenuIcon = () => ( + + + +); + export type MenuItem = Pick; export interface SessionBoxProps extends HTMLAttributes, JWTProps { @@ -21,52 +41,135 @@ export class SessionBox extends Component { @observable accessor modalShown = false; + @observable + accessor mobileMenuOpen = false; + componentDidMount() { this.modalShown = !this.props.jwtPayload; } + toggleMobileMenu = () => { + this.mobileMenuOpen = !this.mobileMenuOpen; + }; + + closeMobileMenu = () => { + this.mobileMenuOpen = false; + }; + + renderMenuItems() { + const { path, menu = [] } = this.props; + + return ( + + {menu.map(({ href, title }) => ( + + + + + + ))} + + ); + } + render() { - const { className = '', title, children, path, menu = [], jwtPayload, ...props } = this.props; + const { className = '', children, jwtPayload, ...props } = this.props; return ( -
-
- + {/* Mobile Menu Button */} + + - {menu.map(({ href, title }) => ( - - - - - - ))} - -
-
+ + + + + {/* Mobile Drawer */} + + {this.renderMenuItems()} + + + {/* Desktop Sidebar */} + + + {this.renderMenuItems()} + + + + {/* Main Content */} + {children} (this.modalShown = false)} /> -
-
+ + ); } } diff --git a/pages/dashboard/index.tsx b/pages/dashboard/index.tsx index 283c12a..7ecef60 100644 --- a/pages/dashboard/index.tsx +++ b/pages/dashboard/index.tsx @@ -37,14 +37,28 @@ const DashboardPage: FC = observer(({ route, jwtPayload }) = return ( - - + + {t('welcome_use')} = observer(({ route, jwtPayload }) = defaultValue={route.query.name} /> - + {t('recent_projects')} @@ -76,10 +101,10 @@ const DashboardPage: FC = observer(({ route, jwtPayload }) = jwtPayload?.roles.includes(2 as UserRole.Client) ? { createdBy: jwtPayload.id } : {} } renderList={allItems => ( - + {allItems[0] ? ( allItems.map(project => ( - + )) diff --git a/pages/dashboard/project/[id].tsx b/pages/dashboard/project/[id].tsx index 0e42cd2..203ebd4 100644 --- a/pages/dashboard/project/[id].tsx +++ b/pages/dashboard/project/[id].tsx @@ -95,21 +95,36 @@ export default class ProjectEvaluationPage extends ObservedComponent< display: 'flex', flexDirection: isBot ? 'row' : 'row-reverse', alignItems: 'flex-start', - maxWidth: '80%', + maxWidth: { xs: '95%', sm: '80%' }, gap: 1, }} > - + - + {name} @@ -117,7 +132,10 @@ export default class ProjectEvaluationPage extends ObservedComponent< )} @@ -130,7 +148,13 @@ export default class ProjectEvaluationPage extends ObservedComponent< /> )} {createdAt && ( - + {new Date(createdAt).toLocaleTimeString()} )} @@ -154,9 +178,26 @@ export default class ProjectEvaluationPage extends ObservedComponent< -

{title}

+ + {title} + {/* Chat Messages Area */} ( - + {allItems.map(this.renderChatMessage)} )} @@ -175,10 +222,22 @@ export default class ProjectEvaluationPage extends ObservedComponent< - + - + {t('recent_projects')} @@ -110,7 +93,7 @@ const DashboardPage: FC = observer(({ route, jwtPayload }) = )) ) : ( - + {t('no_project_data')} diff --git a/pages/dashboard/project/[id].tsx b/pages/dashboard/project/[id].tsx index 203ebd4..e56f235 100644 --- a/pages/dashboard/project/[id].tsx +++ b/pages/dashboard/project/[id].tsx @@ -80,62 +80,35 @@ export default class ProjectEvaluationPage extends ObservedComponent< const name = isBot ? `${t('ai_assistant')} 🤖` : createdBy?.name || 'User'; return ( - - - + {name} {content && ( )} @@ -148,19 +121,13 @@ export default class ProjectEvaluationPage extends ObservedComponent< /> )} {createdAt && ( - + {new Date(createdAt).toLocaleTimeString()} )} - - + + ); }; @@ -178,66 +145,36 @@ export default class ProjectEvaluationPage extends ObservedComponent< {title} {/* Chat Messages Area */} - +
( - +
{allItems.map(this.renderChatMessage)} - +
)} /> -
+
{/* Message Input Form */} - +
0} > {t('send')} - +
From c63934c4ca9d2c40e68b3d8c7e9b340f22a08f82 Mon Sep 17 00:00:00 2001 From: South Drifter Date: Fri, 24 Oct 2025 20:49:17 +0800 Subject: [PATCH 8/9] Update pages/dashboard/index.tsx --- pages/dashboard/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/dashboard/index.tsx b/pages/dashboard/index.tsx index 5bf77fb..e6db4e8 100644 --- a/pages/dashboard/index.tsx +++ b/pages/dashboard/index.tsx @@ -60,10 +60,10 @@ const DashboardPage: FC = observer(({ route, jwtPayload }) = defaultValue={route.query.name} /> From b3a51d5ea8716d086df37563843d0e08dbd1e489 Mon Sep 17 00:00:00 2001 From: South Drifter Date: Fri, 24 Oct 2025 20:50:11 +0800 Subject: [PATCH 9/9] Update components/User/SessionBox.tsx --- components/User/SessionBox.tsx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/components/User/SessionBox.tsx b/components/User/SessionBox.tsx index 87235bd..513fd65 100644 --- a/components/User/SessionBox.tsx +++ b/components/User/SessionBox.tsx @@ -37,13 +37,9 @@ export class SessionBox extends Component { this.modalShown = !this.props.jwtPayload; } - toggleDrawer = () => { - this.drawerOpen = !this.drawerOpen; - }; + toggleDrawer = () => (this.drawerOpen = !this.drawerOpen); - closeDrawer = () => { - this.drawerOpen = false; - }; + closeDrawer = () => (this.drawerOpen = false); renderMenuItems() { const { path, menu = [] } = this.props;