@@ -5,55 +5,53 @@ import { stringify } from 'csv-stringify/browser/esm/sync';
5
5
import { compareNames } from '../foundation.js' ;
6
6
7
7
import { stripExtensionFromName } from '../compas/foundation.js' ;
8
+ import { get } from 'lit-translate' ;
8
9
9
- import settings from '../../public/conf/export-ied-parameters.json' ;
10
+ type ColumnSettings = {
11
+ header : string ;
12
+ attributeName ?: string ;
13
+ selector ?: string ;
14
+ useOwnerDocument ?: boolean ;
15
+ dataAttributePath ?: string [ ] ;
16
+ } ;
10
17
11
- function getDataElement ( typeElement : Element , name : string ) : Element | null {
12
- if ( typeElement . tagName === 'LNodeType' ) {
13
- return typeElement . querySelector ( `:scope > DO[name="${ name } "]` ) ;
14
- } else if ( typeElement . tagName === 'DOType' ) {
15
- return typeElement . querySelector (
16
- `:scope > SDO[name="${ name } "], :scope > DA[name="${ name } "]`
17
- ) ;
18
- } else {
19
- return typeElement . querySelector ( `:scope > BDA[name="${ name } "]` ) ;
20
- }
21
- }
18
+ export type Settings = {
19
+ columns : ColumnSettings [ ] ;
20
+ } ;
22
21
23
- function getValue ( element : Element , attributeName : string | undefined ) : string {
24
- if ( attributeName ) {
25
- return element . getAttribute ( attributeName ) ?? '' ;
22
+ export default class ExportIEDParamsPlugin extends LitElement {
23
+ @property ( ) doc ! : XMLDocument ;
24
+ @property ( ) docName ! : string ;
25
+
26
+ get ieds ( ) : Element [ ] {
27
+ return Array . from ( this . doc . querySelectorAll ( `IED` ) ) ;
26
28
}
27
- return element . textContent ?? '' ;
28
- }
29
29
30
- function getSelector ( selector : string , iedName : string ) {
31
- return selector . replace ( '{{ iedName }}' , iedName ) ;
32
- }
30
+ private getSelector ( selector : string , iedName : string ) {
31
+ return selector . replace ( / { { \s * i e d N a m e \s * } } / , iedName ) ;
32
+ }
33
33
34
- function getElements (
35
- iedElement : Element ,
36
- selector : string | undefined ,
37
- useOwnerDocument : boolean
38
- ) : Element [ ] {
39
- let elements : Element [ ] = [ iedElement ] ;
40
- if ( selector ) {
41
- const iedName = iedElement . getAttribute ( 'name' ) ?? '' ;
42
- const substitutedSelector = getSelector ( selector , iedName ) ;
43
- if ( useOwnerDocument ) {
44
- elements = Array . from (
45
- iedElement . ownerDocument . querySelectorAll ( substitutedSelector )
34
+ private getDataElement ( typeElement : Element , name : string ) : Element | null {
35
+ if ( typeElement . tagName === 'LNodeType' ) {
36
+ return typeElement . querySelector ( `:scope > DO[name="${ name } "]` ) ;
37
+ } else if ( typeElement . tagName === 'DOType' ) {
38
+ return typeElement . querySelector (
39
+ `:scope > SDO[name="${ name } "], :scope > DA[name="${ name } "]`
46
40
) ;
47
41
} else {
48
- elements = Array . from ( iedElement . querySelectorAll ( substitutedSelector ) ) ;
42
+ return typeElement . querySelector ( `:scope > BDA[name=" ${ name } "]` ) ;
49
43
}
50
44
}
51
- return elements ;
52
- }
53
45
54
- export default class ExportIEDParametersPlugin extends LitElement {
55
- @property ( ) doc ! : XMLDocument ;
56
- @property ( ) docName ! : string ;
46
+ private getValue (
47
+ element : Element ,
48
+ attributeName : string | undefined
49
+ ) : string {
50
+ if ( attributeName ) {
51
+ return element . getAttribute ( attributeName ) ?? '' ;
52
+ }
53
+ return element . textContent ?? '' ;
54
+ }
57
55
58
56
private getTypeElement ( lastElement : Element | null ) : Element | null {
59
57
if ( lastElement ) {
@@ -72,20 +70,20 @@ export default class ExportIEDParametersPlugin extends LitElement {
72
70
}
73
71
74
72
private getDataAttributeTemplateValue (
75
- element : Element ,
73
+ lnElement : Element ,
76
74
dataAttributePath : string [ ]
77
75
) : string | null {
78
76
// This is only useful if the element to start from is the LN(0) Element.
79
- if ( [ 'LN' , 'LN0' ] . includes ( element . tagName ) ) {
77
+ if ( [ 'LN' , 'LN0' ] . includes ( lnElement . tagName ) ) {
80
78
// Search LNodeType Element that is linked to the LN(0) Element.
81
- const type = element . getAttribute ( 'lnType' ) ;
79
+ const type = lnElement . getAttribute ( 'lnType' ) ;
82
80
let typeElement = this . doc . querySelector ( `LNodeType[id="${ type } "]` ) ;
83
81
let lastElement : Element | null = null ;
84
82
85
83
// Now start search through the Template section jumping between the type elements.
86
84
dataAttributePath . forEach ( name => {
87
85
if ( typeElement ) {
88
- lastElement = getDataElement ( typeElement , name ) ;
86
+ lastElement = this . getDataElement ( typeElement , name ) ;
89
87
typeElement = this . getTypeElement ( lastElement ) ;
90
88
}
91
89
} ) ;
@@ -134,46 +132,80 @@ export default class ExportIEDParametersPlugin extends LitElement {
134
132
return value ?? '' ;
135
133
}
136
134
137
- private content ( ) : string [ ] [ ] {
138
- return Array . from ( this . doc . querySelectorAll ( `IED` ) )
139
- . sort ( compareNames )
140
- . map ( iedElement => {
141
- return settings . columns . map ( value => {
142
- const elements = getElements (
143
- iedElement ,
144
- value . selector ,
145
- value . useOwnerDocument ?? false
146
- ) ;
147
-
148
- return elements
149
- . map ( element => {
150
- if ( value . dataAttributePath ) {
151
- return this . getDataAttributeValue (
152
- element ,
153
- value . dataAttributePath
154
- ) ;
155
- }
156
- return getValue ( element , value . attributeName ) ;
157
- } )
158
- . filter ( value => value ! )
159
- . join ( ' / ' ) ;
160
- } ) ;
161
- } ) ;
135
+ private getElements (
136
+ iedElement : Element ,
137
+ selector : string | undefined ,
138
+ useOwnerDocument : boolean
139
+ ) : Element [ ] {
140
+ let elements : Element [ ] = [ iedElement ] ;
141
+ if ( selector ) {
142
+ const iedName = iedElement . getAttribute ( 'name' ) ?? '' ;
143
+ const substitutedSelector = this . getSelector ( selector , iedName ) ;
144
+ if ( useOwnerDocument ) {
145
+ elements = Array . from (
146
+ iedElement . ownerDocument . querySelectorAll ( substitutedSelector )
147
+ ) ;
148
+ } else {
149
+ elements = Array . from ( iedElement . querySelectorAll ( substitutedSelector ) ) ;
150
+ }
151
+ }
152
+ return elements ;
153
+ }
154
+
155
+ private contentIED ( settings : Settings , iedElement : Element ) : string [ ] {
156
+ return settings . columns . map ( value => {
157
+ const elements = this . getElements (
158
+ iedElement ,
159
+ value . selector ,
160
+ value . useOwnerDocument ?? false
161
+ ) ;
162
+
163
+ return elements
164
+ . map ( element => {
165
+ if ( value . dataAttributePath ) {
166
+ return this . getDataAttributeValue ( element , value . dataAttributePath ) ;
167
+ }
168
+ return this . getValue ( element , value . attributeName ) ;
169
+ } )
170
+ . filter ( value => value ! )
171
+ . join ( ' / ' ) ;
172
+ } ) ;
173
+ }
174
+
175
+ private content ( settings : Settings ) : string [ ] [ ] {
176
+ const ieds = this . ieds ;
177
+ if ( ieds . length > 0 ) {
178
+ return ieds
179
+ . sort ( compareNames )
180
+ . map ( iedElement => this . contentIED ( settings , iedElement ) ) ;
181
+ }
182
+ return [ [ get ( 'compas.exportIEDParams.noIEDs' ) ] ] ;
162
183
}
163
184
164
- private columnHeaders ( ) : string [ ] {
185
+ private columnHeaders ( settings : Settings ) : string [ ] {
165
186
return settings . columns . map ( value => value . header ) ;
166
187
}
167
188
189
+ async getSettings ( ) : Promise < Settings > {
190
+ return await import ( '../../public/conf/export-ied-parameters.json' ) . then (
191
+ module => module . default
192
+ ) ;
193
+ }
194
+
168
195
async run ( ) : Promise < void > {
169
- const content = stringify ( this . content ( ) , {
196
+ // Import the JSON Configuration needed for the import.
197
+ const settings = await this . getSettings ( ) ;
198
+
199
+ // Create the content using a CSV Writer.
200
+ const content = stringify ( this . content ( settings ) , {
170
201
header : true ,
171
- columns : this . columnHeaders ( ) ,
202
+ columns : this . columnHeaders ( settings ) ,
172
203
} ) ;
173
204
const blob = new Blob ( [ content ] , {
174
205
type : 'text/csv' ,
175
206
} ) ;
176
207
208
+ // Push the data back to the user.
177
209
const a = document . createElement ( 'a' ) ;
178
210
a . download = stripExtensionFromName ( this . docName ) + '-ied-parameters.csv' ;
179
211
a . href = URL . createObjectURL ( blob ) ;
0 commit comments