fix: OpenImage dialog checkboxes - use "indeterminate" value when blocks have two properties
This commit is contained in:
parent
81f80a8887
commit
c03369953b
1 changed files with 20 additions and 7 deletions
|
|
@ -49,7 +49,7 @@ function OpenImage({ close }: DialogProps) {
|
||||||
const [stageWidth, setStageWidth] = useState(0);
|
const [stageWidth, setStageWidth] = useState(0);
|
||||||
|
|
||||||
const [selectedBlocks, setSelectedBlocks] = useState<string[]>(Object.keys(blockData));
|
const [selectedBlocks, setSelectedBlocks] = useState<string[]>(Object.keys(blockData));
|
||||||
const [blockTypeCheckboxesChecked, setBlockTypeCheckboxesChecked] = useState({
|
const [blockTypeCheckboxesChecked, setBlockTypeCheckboxesChecked] = useState<Record<string, CheckedState>>({
|
||||||
creative: false,
|
creative: false,
|
||||||
tile_entity: false,
|
tile_entity: false,
|
||||||
falling: false,
|
falling: false,
|
||||||
|
|
@ -160,13 +160,26 @@ function OpenImage({ close }: DialogProps) {
|
||||||
}, [isFinished, centerCanvas, close]);
|
}, [isFinished, centerCanvas, close]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
Object.keys(blockTypeCheckboxesChecked).forEach((property) => {
|
setBlockTypeCheckboxesChecked((prev) => {
|
||||||
|
const newState = { ...prev };
|
||||||
|
|
||||||
|
Object.keys(prev).forEach((property) => {
|
||||||
const blocksWithProperty = Object.entries(blockData)
|
const blocksWithProperty = Object.entries(blockData)
|
||||||
.filter(([, data]) => data[property as keyof BlockData[string]] === true)
|
.filter(([, data]) => data[property as keyof BlockData[string]] === true)
|
||||||
.map(([blockName]) => blockName);
|
.map(([blockName]) => blockName);
|
||||||
|
|
||||||
const propertyChecked = blocksWithProperty.every((block) => selectedBlocks.includes(block));
|
const selectedCount = blocksWithProperty.filter((block) => selectedBlocks.includes(block)).length;
|
||||||
setBlockTypeCheckboxesChecked((prev) => ({ ...prev, [property]: propertyChecked }));
|
|
||||||
|
if (selectedCount === 0) {
|
||||||
|
newState[property] = false;
|
||||||
|
} else if (selectedCount === blocksWithProperty.length) {
|
||||||
|
newState[property] = true;
|
||||||
|
} else {
|
||||||
|
newState[property] = "indeterminate";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return newState;
|
||||||
});
|
});
|
||||||
}, [selectedBlocks]);
|
}, [selectedBlocks]);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue