192 lines
5.5 KiB
JavaScript
192 lines
5.5 KiB
JavaScript
import {
|
||
Box,
|
||
Card,
|
||
Checkbox,
|
||
Grid,
|
||
List,
|
||
ListItem,
|
||
Option,
|
||
Select,
|
||
Typography,
|
||
} from '@mui/joy'
|
||
import { useState } from 'react'
|
||
const ASSIGN_STRATEGIES = [
|
||
'random',
|
||
'least_assigned',
|
||
'least_completed',
|
||
'keep_last_assigned',
|
||
]
|
||
const DemoAssignee = () => {
|
||
const [assignStrategy, setAssignStrategy] = useState('random')
|
||
const [assignees, setAssignees] = useState([
|
||
{
|
||
userId: 3,
|
||
id: 3,
|
||
displayName: 'Ryan',
|
||
},
|
||
])
|
||
const [assignedTo, setAssignedTo] = useState(3)
|
||
const performers = [
|
||
{
|
||
userId: 1,
|
||
id: 1,
|
||
displayName: 'Mo',
|
||
},
|
||
{
|
||
userId: 2,
|
||
id: 2,
|
||
displayName: 'Jiji',
|
||
},
|
||
{
|
||
userId: 3,
|
||
id: 3,
|
||
displayName: 'Ryan',
|
||
},
|
||
]
|
||
return (
|
||
<>
|
||
<Grid item xs={12} sm={6} data-aos-create-chore-assignee>
|
||
<Box
|
||
mt={2}
|
||
data-aos-delay={200}
|
||
data-aos-anchor='[data-aos-create-chore-assignee]'
|
||
data-aos='fade-right'
|
||
>
|
||
<Typography level='h4'>Assignees :</Typography>
|
||
<Typography level='h5'>Who can do this chore?</Typography>
|
||
<Card>
|
||
<List
|
||
orientation='horizontal'
|
||
wrap
|
||
sx={{
|
||
'--List-gap': '8px',
|
||
'--ListItem-radius': '20px',
|
||
}}
|
||
>
|
||
{performers?.map(item => (
|
||
<ListItem key={item.id}>
|
||
<Checkbox
|
||
// disabled={index === 0}
|
||
checked={assignees.find(a => a.userId == item.id) != null}
|
||
onClick={() => {
|
||
if (assignees.find(a => a.userId == item.id)) {
|
||
setAssignees(
|
||
assignees.filter(i => i.userId !== item.id),
|
||
)
|
||
} else {
|
||
setAssignees([...assignees, { userId: item.id }])
|
||
}
|
||
}}
|
||
overlay
|
||
disableIcon
|
||
variant='soft'
|
||
label={item.displayName}
|
||
/>
|
||
</ListItem>
|
||
))}
|
||
</List>
|
||
</Card>
|
||
</Box>
|
||
<Box
|
||
mt={2}
|
||
data-aos-delay={300}
|
||
data-aos-anchor='[data-aos-create-chore-assignee]'
|
||
data-aos='fade-right'
|
||
>
|
||
<Typography level='h4'>Assigned :</Typography>
|
||
<Typography level='h5'>
|
||
Who is assigned the next due chore?
|
||
</Typography>
|
||
|
||
<Select
|
||
placeholder={
|
||
assignees.length === 0
|
||
? 'No Assignees yet can perform this chore'
|
||
: 'Select an assignee for this chore'
|
||
}
|
||
disabled={assignees.length === 0}
|
||
value={assignedTo > -1 ? assignedTo : null}
|
||
>
|
||
{performers
|
||
?.filter(p => assignees.find(a => a.userId == p.userId))
|
||
.map((item, index) => (
|
||
<Option
|
||
value={item.id}
|
||
key={item.displayName}
|
||
onClick={() => {}}
|
||
>
|
||
{item.displayName}
|
||
{/* <Chip size='sm' color='neutral' variant='soft'>
|
||
</Chip> */}
|
||
</Option>
|
||
))}
|
||
</Select>
|
||
</Box>
|
||
<Box
|
||
mt={2}
|
||
data-aos-delay={400}
|
||
data-aos-anchor='[data-aos-create-chore-assignee]'
|
||
data-aos='fade-right'
|
||
>
|
||
<Typography level='h4'>Picking Mode :</Typography>
|
||
<Typography level='h5'>
|
||
How to pick the next assignee for the following chore?
|
||
</Typography>
|
||
|
||
<Card>
|
||
<List
|
||
orientation='horizontal'
|
||
wrap
|
||
sx={{
|
||
'--List-gap': '8px',
|
||
'--ListItem-radius': '20px',
|
||
}}
|
||
>
|
||
{ASSIGN_STRATEGIES.map((item, idx) => (
|
||
<ListItem key={item}>
|
||
<Checkbox
|
||
// disabled={index === 0}
|
||
checked={assignStrategy === item}
|
||
onClick={() => setAssignStrategy(item)}
|
||
overlay
|
||
disableIcon
|
||
variant='soft'
|
||
label={item
|
||
.split('_')
|
||
.map(x => x.charAt(0).toUpperCase() + x.slice(1))
|
||
.join(' ')}
|
||
/>
|
||
</ListItem>
|
||
))}
|
||
</List>
|
||
</Card>
|
||
</Box>
|
||
</Grid>
|
||
<Grid item xs={12} sm={6} data-aos-create-chore-section-assignee>
|
||
<Card
|
||
sx={{
|
||
p: 4,
|
||
py: 6,
|
||
}}
|
||
data-aos-delay={200}
|
||
data-aos-anchor='[data-aos-create-chore-section-assignee]'
|
||
data-aos='fade-left'
|
||
>
|
||
<Typography level='h3' textAlign='center' sx={{ mt: 2, mb: 4 }}>
|
||
Flexible Task Assignment
|
||
</Typography>
|
||
<Typography level='body-lg' textAlign='center' sx={{ mb: 4 }}>
|
||
Whether you’re a solo user managing personal tasks or coordinating
|
||
chores with others, Donetick provides robust assignment options.
|
||
Assign tasks to different people and choose specific rotation
|
||
strategies, such as assigning tasks based on who completed the most
|
||
or least, randomly rotating assignments, or sticking with the last
|
||
assigned person.
|
||
</Typography>
|
||
</Card>
|
||
</Grid>
|
||
</>
|
||
)
|
||
}
|
||
|
||
export default DemoAssignee
|