I also tried to just create shape with already defined groupId and that doesn’t help.
Hey @jirimoarichi,
Yes, you will have to ungroup/regroup to add new items to a group. This shouldnt be too much work, pseudo code:
const groupItems = async (item, addTo) => {
const targetGroup = await miro.board.get({ addTo.groupId })
if (targetGroup) {
const items = await targetGroup.ungroup()
await miro.board.group({ items: [...items, item] })
} else {
await miro.board.group({ items: [item, addTo] })
}
}
Let me know if this helps!
Cheers,
Mettin
Yes, thank you. Although i came accross another problem for another post maybe. If i delete item in group in UI, ‘group’ object is not updated (when i do board.get() again). So when i try to run this code it gives me error like ‘cant find object by id: id’, because this item with this id no longer exists (cause i deleted it in UI). But if i ungroup and regroup those items again in UI it works fine (because new group with new items generated). And group.sync() is not implemented yet unfortunately.
Im assuming you are caching the `group` object in your code. Always make sure to fetch the items/group on click in your app. That way it should not be possible to have a deleted group in reference.
Yeah, i edited my reply when i thought about this. I call this code on click, yes. So when i delete item in group in UI and then do onClick() i also get group with non existing item.
Could you provide a minimal reproducible example? Maybe just post your code that executes the grouping here even. Then I can test it in our playground and help you out.
I did a post about persistence here. There you can see my actions and a code snippet that fetches group. As for the code for grouping - it basicly same as yours (only on JS, it called onClick() also):
async function groupItems(item, addTo) {
let targetGroup = await miro.board.getById(addTo.groupId)
console.log(targetGroup);
if (targetGroup) {
let items = await targetGroup.ungroup()
await miro.board.group({items: ...items, item]})
} else {
await miro.board.group({items: item, addTo]})
}
}
And it called from chain of methods in app.jsx;
<div className="cs1 ce12">
<a
onClick={(event) => addHighlightUI()} // which leads to grouping method
className="button button-primary"
>
Add highlight
</a>
</div>
And i can just “not delete items manualy”, instead i can call code which will delete those items (i will track them in my plugin anyway) and then regroup those that left. So it’s not a big deal