diff --git a/src/views/ChoreEdit/ChoreView.jsx b/src/views/ChoreEdit/ChoreView.jsx index 8b2d2ed..3347ed7 100644 --- a/src/views/ChoreEdit/ChoreView.jsx +++ b/src/views/ChoreEdit/ChoreView.jsx @@ -103,12 +103,13 @@ const ChoreView = () => { } }, [chore, performers]) const handleUpdatePriority = priority => { - if (priority.value === 0) { - setChorePriority(null) - } else { - setChorePriority(priority) - } - UpdateChorePriority(choreId, priority.value) + UpdateChorePriority(choreId, priority.value).then(response => { + if (response.ok) { + response.json().then(data => { + setChorePriority(priority) + }) + } + }) } const generateInfoCards = chore => { const cards = [ @@ -265,7 +266,6 @@ const ChoreView = () => { ? `Due at ${moment(chore.nextDueDate).format('MM/DD/YYYY hh:mm A')}` : 'N/A'} - {/* show each label : */} {chore?.labelsV2?.map((label, index) => ( { const [activeUserId, setActiveUserId] = React.useState(0) const [isChangeDueDateModalOpen, setIsChangeDueDateModalOpen] = @@ -504,6 +506,13 @@ const ChoreCard = ({ ? 'warning' : 'neutral' } + startDecorator={ + Priorities.find(p => p.value === chore.priority)?.icon + } + onClick={e => { + e.stopPropagation() + onChipClick({ priority: chore.priority }) + }} > P{chore.priority} @@ -512,16 +521,22 @@ const ChoreCard = ({ return ( { + // e.stopPropagation() + // onChipClick({ label: l }) + // }} // startDecorator={getIconForLabel(label)} > @@ -719,7 +734,9 @@ const ChoreCard = ({ handleAssigneChange(selected.id) }} /> - + {confirmModelConfig?.isOpen && ( + + )} { + const [anchorEl, setAnchorEl] = useState(null) + const menuRef = useRef(null) + + const handleMenuOpen = event => { + setAnchorEl(event.currentTarget) + } + + const handleMenuClose = () => { + setAnchorEl(null) + } + useEffect(() => { + document.addEventListener('mousedown', handleMenuOutsideClick) + return () => { + document.removeEventListener('mousedown', handleMenuOutsideClick) + } + }, [anchorEl]) + + const handleMenuOutsideClick = event => { + if (menuRef.current && !menuRef.current.contains(event.target)) { + handleMenuClose() + } + } + + return ( + <> + + {icon} + + + + {options?.map(item => ( + { + onItemSelect(item) + setSelectedItem?.selectedItem(item.name) + handleMenuClose() + }} + > + {useChips ? ( + + {item.name} + + ) : ( + <> + {item?.icon} + {item.name} + + )} + + ))} + {/* {selectedItem && selectedItem !== 'All' && ( + { + onItemSelect(null) + setSelectedItem?.setSelectedItem('All') + }} + > + Cancel All Filters + + )} */} + + + ) +} +export default IconButtonWithMenu diff --git a/src/views/Chores/MyChores.jsx b/src/views/Chores/MyChores.jsx index cc7ab58..eb93df6 100644 --- a/src/views/Chores/MyChores.jsx +++ b/src/views/Chores/MyChores.jsx @@ -3,10 +3,12 @@ import { CancelRounded, EditCalendar, FilterAlt, - FilterAltOff, + PriorityHigh, + Style, } from '@mui/icons-material' import { Box, + Button, Chip, Container, IconButton, @@ -23,9 +25,11 @@ import { useNavigate } from 'react-router-dom' import { UserContext } from '../../contexts/UserContext' import { useChores } from '../../queries/ChoreQueries' import { GetAllUsers, GetUserProfile } from '../../utils/Fetcher' +import Priorities from '../../utils/Priorities' import LoadingComponent from '../components/Loading' import { useLabels } from '../Labels/LabelQueries' import ChoreCard from './ChoreCard' +import IconButtonWithMenu from './IconButtonWithMenu' const MyChores = () => { const { userProfile, setUserProfile } = useContext(UserContext) @@ -122,6 +126,28 @@ const MyChores = () => { const handleFilterMenuClose = () => { setAnchorEl(null) } + + const handleLabelFiltering = chipClicked => { + console.log('chipClicked', chipClicked) + + if (chipClicked.label) { + const label = chipClicked.label + const labelFiltered = [...chores].filter(chore => + chore.labelsV2.some(l => l.id === label.id), + ) + console.log('labelFiltered', labelFiltered) + setFilteredChores(labelFiltered) + setSelectedFilter('Label: ' + label.name) + } else if (chipClicked.priority) { + const priority = chipClicked.priority + const priorityFiltered = chores.filter( + chore => chore.priority === priority, + ) + setFilteredChores(priorityFiltered) + setSelectedFilter('Priority: ' + priority) + } + } + const handleChoreUpdated = (updatedChore, event) => { const newChores = chores.map(chore => { if (chore.id === updatedChore.id) { @@ -175,13 +201,16 @@ const MyChores = () => { chores.map(c => ({ ...c, raw_label: c.labelsV2 - .map(l => userLabels.find(x => (x.id = l.id)).name) + .map(l => userLabels.find(x => x.id === l.id).name) .join(' '), })), searchOptions, ) const handleSearchChange = e => { + if (selectedFilter !== 'All') { + setSelectedFilter('All') + } const search = e.target.value if (search === '') { setFilteredChores(chores) @@ -209,7 +238,6 @@ const MyChores = () => { My Chores */} {/* */} - {/* Search box to filter */} { justifyContent: 'space-between', alignContent: 'center', alignItems: 'center', - gap: 1, + gap: 0.5, }} > { ) } /> + } + options={Priorities} + selectedItem={selectedFilter} + onItemSelect={selected => { + handleLabelFiltering({ priority: selected.value }) + }} + mouseClickHandler={handleMenuOutsideClick} + isActive={selectedFilter.startsWith('Priority: ')} + /> + } + options={userLabels} + selectedItem={selectedFilter} + onItemSelect={selected => { + handleLabelFiltering({ label: selected }) + }} + isActive={selectedFilter.startsWith('Label: ')} + mouseClickHandler={handleMenuOutsideClick} + useChips + /> + { borderRadius: 24, }} > - {selectedFilter && selectedFilter != 'All' ? ( - - ) : ( - - )} + - {/* */} - - {Object.keys(FILTERS).map(filter => ( + {Object.keys(FILTERS).map((filter, index) => ( { const filterFunction = FILTERS[filter] const filteredChores = @@ -310,10 +348,40 @@ const MyChores = () => { ))} + {selectedFilter.startsWith('Label: ') || + (selectedFilter.startsWith('Priority: ') && ( + { + setFilteredChores(chores) + setSelectedFilter('All') + }} + > + Cancel All Filters + + ))} - + {selectedFilter !== 'All' && ( + { + setFilteredChores(chores) + setSelectedFilter('All') + }} + endDecorator={} + onClick={() => { + setFilteredChores(chores) + setSelectedFilter('All') + }} + > + Current Filter: {selectedFilter} + + )} {/* */} {filteredChores.length === 0 && ( { Nothing scheduled + {chores.length > 0 && ( + <> + + + )} )} @@ -346,6 +425,7 @@ const MyChores = () => { onChoreRemove={handleChoreDeleted} performers={performers} userLabels={userLabels} + onChipClick={handleLabelFiltering} /> ))} @@ -421,6 +501,13 @@ const FILTERS = { ) }) }, + 'Due Later': function (chores) { + return chores.filter(chore => { + return ( + new Date(chore.nextDueDate) > new Date(Date.now() + 24 * 60 * 60 * 1000) + ) + }) + }, 'Created By Me': function (chores, userID) { return chores.filter(chore => { return chore.createdBy === userID