1
1
import {
2
+ css ,
2
3
customElement ,
3
4
html ,
4
5
LitElement ,
5
6
property ,
7
+ PropertyValues ,
8
+ state ,
6
9
TemplateResult ,
7
10
} from 'lit-element' ;
8
11
import { translate } from 'lit-translate' ;
9
12
10
13
import '@material/mwc-list' ;
11
14
import '@material/mwc-list/mwc-list-item' ;
12
15
16
+ import { SelectedItemsChangedEvent } from '../oscd-filter-button.js' ;
17
+
18
+ import '../filtered-list.js' ;
19
+ import '../oscd-filter-button.js' ;
20
+
13
21
import {
14
22
CompasSclDataService ,
15
23
SDS_NAMESPACE ,
@@ -21,7 +29,7 @@ export interface SclSelectedDetail {
21
29
}
22
30
export type SclSelectedEvent = CustomEvent < SclSelectedDetail > ;
23
31
export function newSclSelectedEvent ( docId : string ) : SclSelectedEvent {
24
- return new CustomEvent < SclSelectedDetail > ( 'sclSelected ' , {
32
+ return new CustomEvent < SclSelectedDetail > ( 'scl-selected ' , {
25
33
bubbles : true ,
26
34
composed : true ,
27
35
detail : { docId } ,
@@ -30,54 +38,146 @@ export function newSclSelectedEvent(docId: string): SclSelectedEvent {
30
38
31
39
@customElement ( 'compas-scl-list' )
32
40
export class CompasSclList extends LitElement {
33
- @property ( { type : String } )
34
- type = '' ;
35
-
36
41
@property ( )
37
- scls ! : Element [ ] ;
42
+ type ?: string ;
43
+
44
+ @state ( )
45
+ private items ?: Element [ ] ;
46
+
47
+ @state ( )
48
+ private labels : string [ ] = [ ] ;
49
+
50
+ @state ( )
51
+ private selectedLabels : string [ ] = [ ] ;
52
+
53
+ @state ( )
54
+ private get filteredItems ( ) : Element [ ] | undefined {
55
+ // If items are still being retrieved, return undefined.
56
+ if ( ! this . items ) {
57
+ return undefined ;
58
+ }
59
+
60
+ // If all labels are selected, show all items, including the ones not having a Label.
61
+ if ( this . labels . length === this . selectedLabels . length ) {
62
+ return this . items ;
63
+ }
64
+
65
+ return this . items . filter ( item => {
66
+ const labels = Array . from ( item . querySelectorAll ( 'Label' ) ?? [ ] )
67
+ . map ( element => element . textContent )
68
+ . filter ( value => ! ! value ) as string [ ] ;
69
+ return (
70
+ labels . filter ( label => this . selectedLabels . includes ( label ) ) . length > 0
71
+ ) ;
72
+ } ) ;
73
+ }
38
74
39
75
firstUpdated ( ) : void {
40
76
this . fetchData ( ) ;
41
77
}
42
78
79
+ protected updated ( _changedProperties : PropertyValues ) : void {
80
+ super . updated ( _changedProperties ) ;
81
+
82
+ // When the document is updated, we reset the selected IED.
83
+ if ( _changedProperties . has ( 'type' ) ) {
84
+ this . items = undefined ;
85
+ this . labels = [ ] ;
86
+ this . selectedLabels = [ ] ;
87
+ this . fetchData ( ) ;
88
+ }
89
+ }
90
+
43
91
fetchData ( ) : void {
44
- CompasSclDataService ( )
45
- . listScls ( this . type )
46
- . then ( xmlResponse => {
47
- this . scls = Array . from ( xmlResponse . querySelectorAll ( 'Item' ) ?? [ ] ) ;
48
- } ) ;
92
+ if ( this . type ) {
93
+ CompasSclDataService ( )
94
+ . listScls ( this . type )
95
+ . then ( xmlResponse => {
96
+ this . items = Array . from ( xmlResponse . querySelectorAll ( 'Item' ) ?? [ ] ) ;
97
+ this . labels = Array . from (
98
+ new Set (
99
+ Array . from ( xmlResponse . querySelectorAll ( 'Label' ) ?? [ ] )
100
+ . map ( element => element . textContent )
101
+ . filter ( value => ! ! value )
102
+ )
103
+ ) as string [ ] ;
104
+ this . selectedLabels = this . labels ;
105
+ } ) ;
106
+ }
49
107
}
50
108
51
109
render ( ) : TemplateResult {
52
- if ( ! this . scls ) {
110
+ if ( ! this . items ) {
53
111
return html ` <compas- loading> </ compas- loading> ` ;
54
112
}
55
- if ( this . scls ?. length <= 0 ) {
113
+ if ( this . items ?. length <= 0 ) {
56
114
return html ` <mwc- lis t>
57
115
<mwc- lis t- item> <i> ${ translate ( 'compas.noScls' ) } </ i> </ mwc- lis t- item>
58
116
</ mwc- lis t> ` ;
59
117
}
60
- return html ` < mwc-list >
61
- ${ this . scls . map ( item => {
62
- const id =
63
- item . getElementsByTagNameNS ( SDS_NAMESPACE , 'Id' ) . item ( 0 ) !
64
- . textContent ?? '' ;
65
- let name =
66
- item . getElementsByTagNameNS ( SDS_NAMESPACE , 'Name' ) . item ( 0 ) !
67
- . textContent ?? '' ;
68
- if ( name === '' ) {
69
- name = id ;
70
- }
71
- const version =
72
- item . getElementsByTagNameNS ( SDS_NAMESPACE , 'Version' ) . item ( 0 ) !
73
- . textContent ?? '' ;
74
- return html `< mwc-list-item
75
- tabindex ="0 "
76
- @click =${ ( ) => this . dispatchEvent ( newSclSelectedEvent ( id ) ) }
118
+ const filteredItems = this . filteredItems ;
119
+ return html `<div class= "filters" >
120
+ <span> ${ translate ( 'compas.sclFilter' ) } </ span>
121
+ <oscd- filter- butto n
122
+ id= "labelsFilter"
123
+ icon = "label"
124
+ multi = "true"
125
+ ?dis abled= "${ this . labels . length <= 0 } "
126
+ .header = ${ translate ( 'compas.label.selectLabels' ) }
127
+ @selected-items-changed = "${ ( e : SelectedItemsChangedEvent ) => {
128
+ this . selectedLabels = e . detail . selectedItems ;
129
+ this . requestUpdate ( 'items' ) ;
130
+ this . requestUpdate ( 'filteredItems' ) ;
131
+ } } "
77
132
>
78
- ${ name } (${ version } )
79
- </ mwc-list-item > ` ;
80
- } ) }
81
- </ mwc-list > ` ;
133
+ ${ this . labels . map ( label => {
134
+ return html `<mwc- check- lis t- item
135
+ value= "${ label } "
136
+ ?selected= "${ this . selectedLabels . includes ( label ) } "
137
+ >
138
+ ${ label }
139
+ </ mwc- check- lis t- item> ` ;
140
+ } ) }
141
+ </ oscd- filter- butto n>
142
+ </ div>
143
+ ${ filteredItems && filteredItems . length > 0
144
+ ? html ` <filtered- lis t>
145
+ ${ filteredItems . map ( item => {
146
+ const id =
147
+ item . getElementsByTagNameNS ( SDS_NAMESPACE , 'Id' ) . item ( 0 ) !
148
+ . textContent ?? '' ;
149
+ let name =
150
+ item . getElementsByTagNameNS ( SDS_NAMESPACE , 'Name' ) . item ( 0 ) !
151
+ . textContent ?? '' ;
152
+ if ( name === '' ) {
153
+ name = id ;
154
+ }
155
+ const version =
156
+ item . getElementsByTagNameNS ( SDS_NAMESPACE , 'Version' ) . item ( 0 ) !
157
+ . textContent ?? '' ;
158
+ return html `<mwc- lis t- item
159
+ tabindex= "0"
160
+ @click = ${ ( ) => this . dispatchEvent ( newSclSelectedEvent ( id ) ) }
161
+ >
162
+ ${ name } (${ version } )
163
+ </ mwc- lis t- item> ` ;
164
+ } ) }
165
+ </ filtered- lis t> `
166
+ : html ` <mwc- lis t>
167
+ <mwc- lis t- item>
168
+ <i> ${ translate ( 'compas.noFilteredScls' ) } </ i>
169
+ </ mwc- lis t- item>
170
+ </ mwc- lis t> ` } `;
82
171
}
172
+
173
+ static styles = css `
174
+ .filters {
175
+ padding-left : var (--mdc-list-side-padding , 16px );
176
+ display : flex;
177
+ }
178
+
179
+ .filters > span {
180
+ line-height : 48px ;
181
+ }
182
+ ` ;
83
183
}
0 commit comments