Skip to content

Commit df16680

Browse files
fix(removeDataType): avoid pre remove
1 parent a8a4778 commit df16680

File tree

2 files changed

+36
-9
lines changed

2 files changed

+36
-9
lines changed

tDataTypeTemplates/removeDataType.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,16 @@ describe("Function to recursively remove data types ", () => {
2323

2424
expect(removes.length).equals(6);
2525
expect(removes[0].node).equal(doType);
26+
27+
removes.forEach(remove => expect(remove.node.parentElement).to.not.be.null);
2628
});
2729

2830
it("does not remove linked data types with force option set", () => {
2931
const removes = removeDataType({ node: lNodeType });
3032

3133
expect(removes.length).equals(15);
3234
expect(removes[0].node).equal(lNodeType);
35+
36+
removes.forEach(remove => expect(remove.node.parentElement).to.not.be.null);
3337
});
3438
});

tDataTypeTemplates/removeDataType.ts

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,46 @@ function removeOrphans(orphans: Element[]): void {
2020
orphans.forEach((orphan) => orphan.remove());
2121
}
2222

23-
function isLinked(dataType: Element): boolean {
23+
function isLNodeTypeReferenced(lNodeType:Element):boolean {
24+
const dtt = lNodeType.closest("DataTypeTemplates");
25+
26+
const id = lNodeType.getAttribute("id");
27+
28+
const linkedAnyLn = dtt?.ownerDocument.querySelector(
29+
`:root > IED *[lnType="${id}"]`
30+
);
31+
return !!linkedAnyLn;
32+
}
33+
34+
function isDataTypeReferenced(dataType: Element): boolean {
2435
const dtt = dataType.closest("DataTypeTemplates");
2536

2637
const id = dataType.getAttribute("id");
2738

28-
const linkedData = dtt?.ownerDocument.querySelector(
29-
`:root > DataTypeTemplates *[type="${id}"], :root > IED *[lnType="${id}"]`
39+
const linkedData = dtt?.querySelector(
40+
`:scope *[type="${id}"]`
3041
);
3142
return !!linkedData;
3243
}
3344

3445
function getOrphans(ddt: Element, saveOrphans: Element[] = []): Element[] {
3546
return Array.from(ddt.querySelectorAll(":scope > *"))
36-
.filter((dataType) => !isLinked(dataType))
47+
.filter((dataType) => !isDataTypeReferenced(dataType))
3748
.filter((orphan) => !saveOrphans.includes(orphan));
3849
}
3950

51+
function clonedDataType(dtt:Element,dataType:Element):Element {
52+
53+
return dtt.querySelector(`:scope > *[id="${dataType.getAttribute('id')}"]`)!;
54+
55+
}
56+
57+
function isDataTypeLinked(dataType:Element): boolean {
58+
if (dataType.tagName === 'LNodeType') return isLNodeTypeReferenced(dataType);
59+
60+
return isDataTypeReferenced(dataType);
61+
}
62+
4063
/**
4164
* Utility function to remove data types LNodeType, DOType, DAType or EnumType.
4265
* The function makes sure to not leave new unlinked data types .
@@ -50,19 +73,19 @@ export function removeDataType(
5073
const dataType = dtRemove.node as Element;
5174

5275
const dtt = dataType.closest("DataTypeTemplates");
53-
const dttClone = dataType.closest("DataTypeTemplates")?.cloneNode(true);
76+
const dttClone = dataType.closest("DataTypeTemplates")?.cloneNode(true) as Element;
5477
if (!dttClone) return [];
5578

56-
if (isLinked(dataType) && !options.force) return [];
79+
if (isDataTypeLinked(dataType) && !options.force) return [];
5780

58-
const saveOrphans = getOrphans(dtt!);
81+
const saveOrphans = getOrphans(dttClone);
5982

6083
const removes: Remove[] = [];
61-
let orphans = [dataType];
84+
let orphans = [clonedDataType(dttClone,dataType)];
6285
while (orphans.length > 0) {
6386
removes.push(...orphanRemoves(dtt!, orphans));
6487
removeOrphans(orphans);
65-
orphans = getOrphans(dtt!, saveOrphans);
88+
orphans = getOrphans(dttClone!, saveOrphans);
6689
}
6790

6891
return removes;

0 commit comments

Comments
 (0)