From 08f7e4900c73c6e4a5f94d6142c4e49bdda8c947 Mon Sep 17 00:00:00 2001 From: Scott Anderson <662325+scottanderson@users.noreply.github.com> Date: Sat, 6 Jun 2026 20:48:05 -0400 Subject: [PATCH] Improve anyone UX --- .editorconfig | 9 ++++++ .github/workflows/build.yml | 2 -- src/views/ChoreEdit/ChoreEdit.jsx | 51 +++++++++++++++++++++++-------- 3 files changed, 48 insertions(+), 14 deletions(-) create mode 100644 .editorconfig 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 8dcf06b..50eee74 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, @@ -407,15 +410,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(() => { @@ -465,7 +482,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') @@ -585,7 +603,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) { @@ -602,7 +620,7 @@ const ChoreEdit = () => { if (attemptToSave) { HandleValidateChore() } - }, [assignees, name, frequencyMetadata, attemptToSave, dueDate]) + }, [assignableTo, name, frequencyMetadata, attemptToSave, dueDate]) const handleDelete = () => { setConfirmModelConfig({ @@ -929,9 +947,9 @@ const ChoreEdit = () => { { - setAssignees([]) + setAnyone(!anyone) setIsPrivate(false) }} overlay @@ -944,10 +962,16 @@ 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, @@ -956,7 +980,6 @@ const ChoreEdit = () => { } else { setAssignees([...assignees, { userId: item.userId }]) } - setShowSaveAssigneeDefault(true) }} overlay disableIcon @@ -986,9 +1009,13 @@ const ChoreEdit = () => { }, }} onClick={() => { + localStorage.setItem( + 'defaultAnyoneSetting', + JSON.stringify(anyone), + ) localStorage.setItem( 'defaultAssigneeSetting', - JSON.stringify(assignees), + JSON.stringify(assignableTo), ) setShowSaveAssigneeDefault(false) }}