From 53eb9b3c08eefbb8c9474f69fa5cc883c287c0c3 Mon Sep 17 00:00:00 2001 From: Mitchell McCaffrey Date: Sun, 14 Feb 2021 13:58:21 +1100 Subject: [PATCH] Updated select data UI edge cases --- src/modals/SelectDataModal.js | 104 ++++++++++++++++++++++------------ 1 file changed, 69 insertions(+), 35 deletions(-) diff --git a/src/modals/SelectDataModal.js b/src/modals/SelectDataModal.js index 3dbd89f..424f816 100644 --- a/src/modals/SelectDataModal.js +++ b/src/modals/SelectDataModal.js @@ -106,6 +106,70 @@ function SelectDataModal({ onConfirm(checkedMaps, checkedTokens); } + function handleSelectMapsChanged(event) { + setMaps((prevMaps) => { + let newMaps = { ...prevMaps }; + for (let id in newMaps) { + newMaps[id].checked = event.target.checked; + } + return newMaps; + }); + // If all token select is unchecked then ensure all tokens are unchecked + if (!event.target.checked && !tokensSelectChecked) { + setTokens((prevTokens) => { + let newTokens = { ...prevTokens }; + for (let id in newTokens) { + newTokens[id].checked = false; + } + return newTokens; + }); + } + } + + function handleMapChange(event, map) { + setMaps((prevMaps) => ({ + ...prevMaps, + [map.id]: { ...map, checked: event.target.checked }, + })); + // If all token select is unchecked then ensure tokens assosiated to this map are unchecked + if (!event.target.checked && !tokensSelectChecked) { + setTokens((prevTokens) => { + let newTokens = { ...prevTokens }; + for (let id in newTokens) { + if (tokensByMap[map.id].has(id) && tokenUsedCount[id] === 1) { + newTokens[id].checked = false; + } + } + return newTokens; + }); + } + } + + function handleSelectTokensChange(event) { + setTokens((prevTokens) => { + let newTokens = { ...prevTokens }; + for (let id in newTokens) { + if (!(id in tokenUsedCount)) { + newTokens[id].checked = event.target.checked; + } + } + return newTokens; + }); + } + + function handleTokenChange(event, token) { + setTokens((prevTokens) => ({ + ...prevTokens, + [token.id]: { ...token, checked: event.target.checked }, + })); + } + + // Some tokens are checked not by maps or all tokens are checked by maps + const tokensSelectChecked = + Object.values(tokens).some( + (token) => !(token.id in tokenUsedCount) && token.checked + ) || Object.values(tokens).every((token) => token.id in tokenUsedCount); + return ( map.checked)} - onChange={(e) => - setMaps((prevMaps) => { - let newMaps = { ...prevMaps }; - for (let id in newMaps) { - newMaps[id].checked = e.target.checked; - } - return newMaps; - }) - } + onChange={handleSelectMapsChanged} /> Maps @@ -164,12 +220,7 @@ function SelectDataModal({ > - setMaps((prevMaps) => ({ - ...prevMaps, - [map.id]: { ...map, checked: e.target.checked }, - })) - } + onChange={(e) => handleMapChange(e, map)} /> {map.name} @@ -181,20 +232,8 @@ function SelectDataModal({ <> @@ -203,12 +242,7 @@ function SelectDataModal({