@@ -16,7 +16,6 @@ import '@material/mwc-list';
16
16
import '@material/mwc-list/mwc-list-item' ;
17
17
18
18
import {
19
- compareNames ,
20
19
getDescriptionAttribute ,
21
20
getNameAttribute ,
22
21
identity ,
@@ -25,7 +24,13 @@ import {
25
24
import { gooseIcon , smvIcon } from '../../icons/icons.js' ;
26
25
import { wizards } from '../../wizards/wizard-library.js' ;
27
26
28
- import { getFcdaTitleValue , newFcdaSelectEvent , styles } from './foundation.js' ;
27
+ import {
28
+ getFcdaTitleValue ,
29
+ newFcdaSelectEvent ,
30
+ styles ,
31
+ SubscriptionChangedEvent ,
32
+ } from './foundation.js' ;
33
+ import { getSubscribedExtRefElements } from './later-binding/foundation.js' ;
29
34
30
35
type controlTag = 'SampledValueControl' | 'GSEControl' ;
31
36
@@ -42,14 +47,18 @@ export class FcdaBindingList extends LitElement {
42
47
doc ! : XMLDocument ;
43
48
@property ( )
44
49
controlTag ! : controlTag ;
50
+ @property ( )
51
+ includeLaterBinding ! : boolean ;
45
52
46
53
// The selected Elements when a FCDA Line is clicked.
47
54
@state ( )
48
- selectedControlElement : Element | undefined ;
55
+ private selectedControlElement : Element | undefined ;
49
56
@state ( )
50
- selectedFcdaElement : Element | undefined ;
57
+ private selectedFcdaElement : Element | undefined ;
58
+ @state ( )
59
+ private extRefCounters = new Map ( ) ;
51
60
52
- iconControlLookup : iconLookup = {
61
+ private iconControlLookup : iconLookup = {
53
62
SampledValueControl : smvIcon ,
54
63
GSEControl : gooseIcon ,
55
64
} ;
@@ -59,13 +68,17 @@ export class FcdaBindingList extends LitElement {
59
68
60
69
this . resetSelection = this . resetSelection . bind ( this ) ;
61
70
parent . addEventListener ( 'open-doc' , this . resetSelection ) ;
71
+
72
+ const parentDiv = this . closest ( '.container' ) ;
73
+ if ( parentDiv ) {
74
+ this . resetExtRefCount = this . resetExtRefCount . bind ( this ) ;
75
+ parentDiv . addEventListener ( 'subscription-changed' , this . resetExtRefCount ) ;
76
+ }
62
77
}
63
78
64
79
private getControlElements ( ) : Element [ ] {
65
80
if ( this . doc ) {
66
- return Array . from (
67
- this . doc . querySelectorAll ( `LN0 > ${ this . controlTag } ` )
68
- ) . sort ( ( a , b ) => compareNames ( `${ identity ( a ) } ` , `${ identity ( b ) } ` ) ) ;
81
+ return Array . from ( this . doc . querySelectorAll ( `LN0 > ${ this . controlTag } ` ) ) ;
69
82
}
70
83
return [ ] ;
71
84
}
@@ -79,11 +92,40 @@ export class FcdaBindingList extends LitElement {
79
92
'datSet'
80
93
) } ] > FCDA`
81
94
)
82
- ) . sort ( ( a , b ) => compareNames ( ` ${ identity ( a ) } ` , ` ${ identity ( b ) } ` ) ) ;
95
+ ) ;
83
96
}
84
97
return [ ] ;
85
98
}
86
99
100
+ private resetExtRefCount ( event : SubscriptionChangedEvent ) : void {
101
+ if ( event . detail . control && event . detail . fcda ) {
102
+ const controlBlockFcdaId = `${ identity ( event . detail . control ) } ${ identity (
103
+ event . detail . fcda
104
+ ) } `;
105
+ this . extRefCounters . delete ( controlBlockFcdaId ) ;
106
+ }
107
+ }
108
+
109
+ private getExtRefCount (
110
+ fcdaElement : Element ,
111
+ controlElement : Element
112
+ ) : number {
113
+ const controlBlockFcdaId = `${ identity ( controlElement ) } ${ identity (
114
+ fcdaElement
115
+ ) } `;
116
+ if ( ! this . extRefCounters . has ( controlBlockFcdaId ) ) {
117
+ const extRefCount = getSubscribedExtRefElements (
118
+ < Element > this . doc . getRootNode ( ) ,
119
+ this . controlTag ,
120
+ fcdaElement ,
121
+ controlElement ! ,
122
+ this . includeLaterBinding
123
+ ) . length ;
124
+ this . extRefCounters . set ( controlBlockFcdaId , extRefCount ) ;
125
+ }
126
+ return this . extRefCounters . get ( controlBlockFcdaId ) ;
127
+ }
128
+
87
129
private openEditWizard ( controlElement : Element ) : void {
88
130
const wizard = wizards [ this . controlTag ] . edit ( controlElement ) ;
89
131
if ( wizard ) this . dispatchEvent ( newWizardEvent ( wizard ) ) ;
@@ -104,7 +146,8 @@ export class FcdaBindingList extends LitElement {
104
146
protected updated ( _changedProperties : PropertyValues ) : void {
105
147
super . updated ( _changedProperties ) ;
106
148
107
- // When the document is updated, we will fire the event again.
149
+ // When a new document is loaded or the selection is changed
150
+ // we will fire the FCDA Select Event.
108
151
if (
109
152
_changedProperties . has ( 'doc' ) ||
110
153
_changedProperties . has ( 'selectedControlElement' ) ||
@@ -117,11 +160,18 @@ export class FcdaBindingList extends LitElement {
117
160
)
118
161
) ;
119
162
}
163
+
164
+ // When a new document is loaded we will reset the Map to clear old entries.
165
+ if ( _changedProperties . has ( 'doc' ) ) {
166
+ this . extRefCounters = new Map ( ) ;
167
+ }
120
168
}
121
169
122
170
renderFCDA ( controlElement : Element , fcdaElement : Element ) : TemplateResult {
171
+ const fcdaCount = this . getExtRefCount ( fcdaElement , controlElement ) ;
123
172
return html `<mwc- lis t- item
124
173
graphic= "large"
174
+ ?has Meta= ${ fcdaCount !== 0 }
125
175
twoline
126
176
class= "subitem"
127
177
@click = ${ ( ) => this . onFcdaSelect ( controlElement , fcdaElement ) }
@@ -138,6 +188,7 @@ export class FcdaBindingList extends LitElement {
138
188
${ fcdaElement . getAttribute ( 'lnInst' ) }
139
189
</ span>
140
190
<mwc- icon slot= "graphic" > subdirectory_arrow_right </ mwc- icon>
191
+ ${ fcdaCount !== 0 ? html `<span slot= "meta" > ${ fcdaCount } </ span> ` : nothing }
141
192
</ mwc- lis t- item> ` ;
142
193
}
143
194
0 commit comments