|
@@ -370,6 +370,24 @@ const repairBoundElement = (
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+/**
|
|
|
+ * Remove an element's frameId if its containing frame is non-existent
|
|
|
+ *
|
|
|
+ * NOTE mutates elements.
|
|
|
+ */
|
|
|
+const repairFrameMembership = (
|
|
|
+ element: Mutable<ExcalidrawElement>,
|
|
|
+ elementsMap: Map<string, Mutable<ExcalidrawElement>>,
|
|
|
+) => {
|
|
|
+ if (element.frameId) {
|
|
|
+ const containingFrame = elementsMap.get(element.frameId);
|
|
|
+
|
|
|
+ if (!containingFrame) {
|
|
|
+ element.frameId = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
export const restoreElements = (
|
|
|
elements: ImportedDataState["elements"],
|
|
|
/** NOTE doesn't serve for reconciliation */
|
|
@@ -410,6 +428,10 @@ export const restoreElements = (
|
|
|
// repair binding. Mutates elements.
|
|
|
const restoredElementsMap = arrayToMap(restoredElements);
|
|
|
for (const element of restoredElements) {
|
|
|
+ if (element.frameId) {
|
|
|
+ repairFrameMembership(element, restoredElementsMap);
|
|
|
+ }
|
|
|
+
|
|
|
if (isTextElement(element) && element.containerId) {
|
|
|
repairBoundElement(element, restoredElementsMap);
|
|
|
} else if (element.boundElements) {
|