@@ -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
3445function 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