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:
parent
cca6f4176f
commit
d9180ffe0a
@ -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 {
|
||||||
|
@ -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>
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
@ -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>
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user