diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..fb081ea --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +# EditorConfig is awesome: https://EditorConfig.org +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8087038..a49b178 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,9 +2,7 @@ name: Build validation on: push: - branches: [ "main", "develop" ] pull_request: - branches: [ "main", "develop" ] jobs: build: diff --git a/src/views/ChoreEdit/ChoreEdit.jsx b/src/views/ChoreEdit/ChoreEdit.jsx index fd6548b..77001b9 100644 --- a/src/views/ChoreEdit/ChoreEdit.jsx +++ b/src/views/ChoreEdit/ChoreEdit.jsx @@ -83,7 +83,8 @@ const ChoreEdit = () => { const [name, setName] = useState('') const [description, setDescription] = useState('') const [confirmModelConfig, setConfirmModelConfig] = useState({}) - const [assignees, setAssignees] = useState([]) + const [anyone, setAnyone] = useState(false) + const [assignableTo, setAssignableTo] = useState([]) const [performers, setPerformers] = useState([]) const [assignStrategy, setAssignStrategy] = useState(ASSIGN_STRATEGIES[2]) const [dueDate, setDueDate] = useState(null) @@ -158,6 +159,7 @@ const ChoreEdit = () => { const Navigate = useNavigate() + const assignees = anyone ? performers : assignableTo const HandleValidateChore = () => { const errors = {} @@ -330,6 +332,7 @@ const ChoreEdit = () => { if (searchParams.get('clone') === 'true') { newChoreId = null } + const assignees = anyone ? [] : assignableTo const chore = { id: Number(newChoreId), name: name, @@ -419,15 +422,29 @@ const ChoreEdit = () => { setIsNotificable(JSON.parse(defaultNotificationSetting)) } + const defaultAnyoneSetting = localStorage.getItem('defaultAnyoneSetting') + if (defaultAnyoneSetting != null) { + const savedAnyone = JSON.parse(defaultAnyoneSetting) + setAnyone(savedAnyone) + } + const defaultAssigneeSetting = localStorage.getItem( 'defaultAssigneeSetting', ) if (defaultAssigneeSetting !== null) { const savedAssignees = JSON.parse(defaultAssigneeSetting) - setAssignees(savedAssignees) + setAssignableTo(savedAssignees) } } }, []) + useEffect(() => { + const anyoneSetting = localStorage.getItem('defaultAnyoneSetting') + const anyoneDirty = anyoneSetting !== JSON.stringify(anyone) + const assigneeSetting = localStorage.getItem('defaultAssigneeSetting') + const assigneeDirty = assigneeSetting !== JSON.stringify(assignableTo) + const dirty = anyoneDirty || (!anyone && assigneeDirty) + setShowSaveAssigneeDefault(dirty) + }, [anyone, assignableTo]) // Keyboard shortcuts useEffect(() => { @@ -477,7 +494,8 @@ const ChoreEdit = () => { setChore(data.res) setName(data.res.name ? data.res.name : '') setDescription(data.res.description ? data.res.description : '') - setAssignees(data.res.assignees ? data.res.assignees : []) + setAssignableTo(data.res.assignees ? data.res.assignees : []) + setAnyone((data.res.assignees?.length || 0) === 0) setAssignedTo(data.res.assignedTo) setFrequencyType(data.res.frequencyType ? data.res.frequencyType : 'once') @@ -597,7 +615,7 @@ const ChoreEdit = () => { setAssignStrategy(ASSIGN_STRATEGIES[2]) // default to least_completed } } - }, [assignees, assignStrategy]) + }, [assignStrategy, assignedTo, assignees]) // useEffect(() => { // if (performers.length > 0 && assignees.length === 0 && userProfile) { @@ -614,7 +632,7 @@ const ChoreEdit = () => { if (attemptToSave) { HandleValidateChore() } - }, [assignees, name, frequencyMetadata, attemptToSave, dueDate]) + }, [assignableTo, name, frequencyMetadata, attemptToSave, dueDate]) const handleDelete = () => { setConfirmModelConfig({ @@ -941,9 +959,9 @@ const ChoreEdit = () => { { - setAssignees([]) + setAnyone(!anyone) setIsPrivate(false) }} overlay @@ -956,19 +974,25 @@ const ChoreEdit = () => { {performers?.map((item, index) => ( a.userId == item.userId) != null - } + checked={assignableTo.some(a => a.userId == item.userId)} + disabled={anyone} onClick={() => { + if (anyone) { + setAnyone(false) + setAssignableTo([{ userId: item.userId }]) + return + } + const assignees = assignableTo + const setAssignees = setAssignableTo if (assignees.some(a => a.userId === item.userId)) { const newAssignees = assignees.filter( a => a.userId !== item.userId, ) + setAnyone(newAssignees.length === 0) setAssignees(newAssignees) } else { setAssignees([...assignees, { userId: item.userId }]) } - setShowSaveAssigneeDefault(true) }} overlay disableIcon @@ -998,9 +1022,13 @@ const ChoreEdit = () => { }, }} onClick={() => { + localStorage.setItem( + 'defaultAnyoneSetting', + JSON.stringify(anyone), + ) localStorage.setItem( 'defaultAssigneeSetting', - JSON.stringify(assignees), + JSON.stringify(assignableTo), ) setShowSaveAssigneeDefault(false) }}