fix: restore mobile layout and step details view - Fix mobile layout CSS constraints - Add step details view to mobile layout - Add print and note functionality to mobile layout

This commit is contained in:
Sean Sube 2025-06-14 19:49:16 -05:00
parent cca6f4176f
commit d9180ffe0a
No known key found for this signature in database
GPG Key ID: 3EED7B957D362AF1
3 changed files with 135 additions and 70 deletions

View File

@ -1,8 +1,15 @@
#root { #root {
max-width: 1280px; width: 100%;
margin: 0 auto; height: 100vh;
padding: 2rem; margin: 0;
text-align: center; padding: 0;
}
.app {
width: 100%;
height: 100vh;
margin: 0;
padding: 0;
} }
.logo { .logo {

View File

@ -1,87 +1,99 @@
import { CssBaseline, ThemeProvider, createTheme, CircularProgress, Box } from '@mui/material' import React, { useCallback } from 'react';
import { useDeviceType } from './hooks/useDeviceType' import { ApolloProvider } from '@apollo/client';
import { useTaskData } from './hooks/useTaskData' import { client } from './graphql/client';
import { DesktopLayout } from './layouts/DesktopLayout' import { DesktopLayout } from './layouts/DesktopLayout';
import { MobileLayout } from './layouts/MobileLayout' import { MobileLayout } from './layouts/MobileLayout';
import { StepDetails } from './components/StepDetails' import { UserSelection } from './components/UserSelection';
import type { GroupWithTasks, TaskWithSteps, StepWithNotes } from './types' import { useTaskData } from './hooks/useTaskData';
import { useDeviceType } from './hooks/useDeviceType';
const theme = createTheme() import { useUserSelection } from './hooks/useUserSelection';
import './App.css';
export function App() { export function App() {
const deviceType = useDeviceType() const { selectedUser, users, selectUser } = useUserSelection();
const deviceType = useDeviceType();
const { const {
loading,
groups, groups,
step, step,
loading,
selectedGroup, selectedGroup,
selectedTask, selectedTask,
selectedStep, selectedStep,
setSelectedGroup, setSelectedGroup,
setSelectedTask, setSelectedTask,
setSelectedStep, setSelectedStep,
handlePrintStep,
handlePrintTask, handlePrintTask,
handleAddNote, handlePrintStep,
} = useTaskData() handleAddNote
} = useTaskData();
const handleBack = () => { const handleBack = useCallback(() => {
if (selectedStep) { if (selectedStep) {
setSelectedStep(undefined) setSelectedStep(undefined);
} else if (selectedTask) { } else if (selectedTask) {
setSelectedTask(undefined) setSelectedTask(undefined);
} else if (selectedGroup) { } else if (selectedGroup) {
setSelectedGroup(undefined) setSelectedGroup(undefined);
} }
} }, [selectedStep, selectedTask, selectedGroup, setSelectedStep, setSelectedTask, setSelectedGroup]);
if (loading) { console.log('App render:', {
selectedUser,
deviceType,
loading,
groups,
step,
selectedGroup,
selectedTask,
selectedStep
});
console.log('App rendering main content, conditions:', {
hasUser: selectedUser !== null,
deviceType,
hasGroups: groups.length > 0,
hasStep: step !== null
});
if (!selectedUser) {
return ( return (
<Box sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '100vh' }}> <div className="app">
<CircularProgress /> <UserSelection users={users} onSelectUser={selectUser} />
</Box> </div>
) );
} }
return ( return (
<ThemeProvider theme={theme}> <ApolloProvider client={client}>
<CssBaseline /> <div className="app">
{deviceType === 'desktop' ? ( {deviceType === 'desktop' ? (
<DesktopLayout <DesktopLayout
groups={groups} groups={groups}
selectedGroup={selectedGroup} selectedGroup={selectedGroup}
selectedTask={selectedTask} selectedTask={selectedTask}
selectedStep={selectedStep} selectedStep={selectedStep}
onGroupSelect={setSelectedGroup} onGroupSelect={setSelectedGroup}
onTaskSelect={setSelectedTask} onTaskSelect={setSelectedTask}
onStepSelect={setSelectedStep} onStepSelect={setSelectedStep}
onPrintTask={handlePrintTask} onPrintTask={handlePrintTask}
onPrintStep={handlePrintStep} onPrintStep={handlePrintStep}
onAddNote={handleAddNote} onAddNote={handleAddNote}
/> />
) : ( ) : (
<> <MobileLayout
{selectedStep ? ( groups={groups}
<StepDetails selectedGroup={selectedGroup}
step={step!} selectedTask={selectedTask}
onPrint={() => handlePrintStep(String(selectedStep.id), '1')} // TODO: Get real user ID selectedStep={selectedStep}
onAddNote={(content) => handleAddNote(content, '1')} // TODO: Get real user ID onGroupSelect={setSelectedGroup}
onBack={handleBack} onTaskSelect={setSelectedTask}
/> onStepSelect={setSelectedStep}
) : ( onBack={handleBack}
<MobileLayout onPrintStep={handlePrintStep}
groups={groups} onAddNote={handleAddNote}
selectedGroup={selectedGroup} />
selectedTask={selectedTask} )}
selectedStep={selectedStep} </div>
onGroupSelect={setSelectedGroup} </ApolloProvider>
onTaskSelect={setSelectedTask} );
onStepSelect={setSelectedStep}
onBack={handleBack}
/>
)}
</>
)}
</ThemeProvider>
)
} }

View File

@ -1,5 +1,6 @@
import { Box, Paper, Typography, IconButton } from '@mui/material'; import { Box, Paper, Typography, IconButton, TextField, Button } from '@mui/material';
import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import ArrowBackIcon from '@mui/icons-material/ArrowBack';
import PrintIcon from '@mui/icons-material/Print';
import type { GroupWithTasks, TaskWithSteps, StepWithNotes } from '../types'; import type { GroupWithTasks, TaskWithSteps, StepWithNotes } from '../types';
import { CreateButtons } from '../components/CreateButtons'; import { CreateButtons } from '../components/CreateButtons';
@ -24,6 +25,8 @@ export function MobileLayout({
onTaskSelect, onTaskSelect,
onStepSelect, onStepSelect,
onBack, onBack,
onPrintStep,
onAddNote
}: { }: {
groups: GroupWithTasks[]; groups: GroupWithTasks[];
selectedGroup?: GroupWithTasks; selectedGroup?: GroupWithTasks;
@ -33,6 +36,8 @@ export function MobileLayout({
onTaskSelect: (task: TaskWithSteps | undefined) => void; onTaskSelect: (task: TaskWithSteps | undefined) => void;
onStepSelect: (step: StepWithNotes | undefined) => void; onStepSelect: (step: StepWithNotes | undefined) => void;
onBack: () => void; onBack: () => void;
onPrintStep?: (stepId: string, userId: string) => void;
onAddNote?: (content: string) => void;
}) { }) {
const groupList: GroupWithTasks[] = groups; const groupList: GroupWithTasks[] = groups;
const taskList: TaskWithSteps[] = (selectedGroup?.tasks as TaskWithSteps[]) ?? []; const taskList: TaskWithSteps[] = (selectedGroup?.tasks as TaskWithSteps[]) ?? [];
@ -41,7 +46,7 @@ export function MobileLayout({
return ( return (
<Box sx={{ height: '100vh', p: 2 }}> <Box sx={{ height: '100vh', p: 2 }}>
{/* Header with back button */} {/* Header with back button */}
{selectedGroup && ( {selectedGroup && !selectedTask && (
<Box sx={{ display: 'flex', alignItems: 'center', mb: 2 }}> <Box sx={{ display: 'flex', alignItems: 'center', mb: 2 }}>
<IconButton onClick={onBack} sx={{ mr: 1 }}> <IconButton onClick={onBack} sx={{ mr: 1 }}>
<ArrowBackIcon /> <ArrowBackIcon />
@ -65,6 +70,14 @@ export function MobileLayout({
<ArrowBackIcon /> <ArrowBackIcon />
</IconButton> </IconButton>
<Typography variant="h6">{selectedStep.name}</Typography> <Typography variant="h6">{selectedStep.name}</Typography>
{onPrintStep && (
<IconButton
onClick={() => onPrintStep(String(selectedStep.id), '1')} // TODO: Get real user ID
sx={{ ml: 'auto' }}
>
<PrintIcon />
</IconButton>
)}
</Box> </Box>
)} )}
@ -142,6 +155,39 @@ export function MobileLayout({
</Box> </Box>
</> </>
)} )}
{selectedStep && (
<>
<Typography sx={{ mb: 4 }}>{selectedStep.instructions}</Typography>
<Box sx={{ mb: 4 }}>
<Typography variant="h6" sx={{ mb: 2 }}>
Notes ({selectedStep.notes.length})
</Typography>
{selectedStep.notes.map((note) => (
<Box key={note.id} sx={{ mb: 2 }}>
<Typography variant="subtitle2">{note.user?.name}</Typography>
<Typography>{note.content}</Typography>
</Box>
))}
</Box>
<Box sx={{ mb: 4 }}>
<TextField
fullWidth
multiline
rows={4}
placeholder="Add a note..."
sx={{ mb: 2 }}
/>
{onAddNote && (
<Button variant="contained" onClick={() => onAddNote('New note')}>
Add Note
</Button>
)}
</Box>
</>
)}
</Paper> </Paper>
</Box> </Box>
); );