@@ -54,6 +54,25 @@ type NsdVersions = {
54
54
'IEC 61850-8-1' : NsdVersion ;
55
55
}
56
56
57
+ /** Represents a document to be opened. */
58
+ export interface LoadNsdocDetail {
59
+ nsdoc : string ;
60
+ filename : string ;
61
+ }
62
+ export type LoadNsdocEvent = CustomEvent < LoadNsdocDetail > ;
63
+ export function newLoadNsdocEvent (
64
+ nsdoc : string ,
65
+ filename : string ,
66
+ eventInitDict ?: CustomEventInit < Partial < LoadNsdocDetail > >
67
+ ) : LoadNsdocEvent {
68
+ return new CustomEvent < LoadNsdocDetail > ( 'load-nsdoc' , {
69
+ bubbles : true ,
70
+ composed : true ,
71
+ ...eventInitDict ,
72
+ detail : { nsdoc, filename, ...eventInitDict ?. detail } ,
73
+ } ) ;
74
+ }
75
+
57
76
/** Mixin that saves [[`Settings`]] to `localStorage`, reflecting them in the
58
77
* `settings` property, setting them through `setSetting(setting, value)`. */
59
78
export type SettingElement = Mixin < typeof Setting > ;
@@ -168,7 +187,7 @@ export function Setting<TBase extends LitElementConstructor>(Base: TBase) {
168
187
private renderFileSelect ( ) : TemplateResult {
169
188
return html `
170
189
< input id ="nsdoc-file " accept =".nsdoc " type ="file " hidden required multiple
171
- @change =${ ( evt : Event ) => this . loadNsdocFile ( evt ) } } >
190
+ @change =${ ( evt : Event ) => this . uploadNsdocFile ( evt ) } } >
172
191
< mwc-button label ="${ translate ( 'settings.selectFileButton' ) } "
173
192
id ="selectFileButton "
174
193
@click =${ ( ) => {
@@ -179,50 +198,63 @@ export function Setting<TBase extends LitElementConstructor>(Base: TBase) {
179
198
` ;
180
199
}
181
200
182
- private async loadNsdocFile ( evt : Event ) : Promise < void > {
183
- const nsdVersions = await this . nsdVersions ( ) ;
201
+ private async uploadNsdocFile ( evt : Event ) : Promise < void > {
184
202
const files = Array . from (
185
203
( < HTMLInputElement | null > evt . target ) ?. files ?? [ ]
186
204
) ;
187
-
205
+
188
206
if ( files . length == 0 ) return ;
189
- files . forEach ( async file => {
207
+ for ( const file of files ) {
190
208
const text = await file . text ( ) ;
191
- const nsdocElement = this . parseToXmlObject ( text ) . querySelector ( 'NSDoc' ) ;
192
- const id = nsdocElement ?. getAttribute ( 'id' ) ;
193
- if ( ! id ) {
194
- document
209
+ document
195
210
. querySelector ( 'open-scd' ) !
196
211
. dispatchEvent (
197
- newLogEvent ( { kind : 'error' , title : get ( 'settings.invalidFileNoIdFound' ) } )
198
- ) ;
199
- return ;
200
- }
201
- const nsdVersion = nsdVersions [ id as keyof NsdVersions ] ;
202
- const nsdocVersion = {
203
- version : nsdocElement ! . getAttribute ( 'version' ) ?? '' ,
204
- revision : nsdocElement ! . getAttribute ( 'revision' ) ?? '' ,
205
- release : nsdocElement ! . getAttribute ( 'release' ) ?? ''
206
- }
212
+ newLoadNsdocEvent ( text , file . name )
213
+ ) ;
214
+ }
215
+
216
+ this . nsdocFileUI . value = '' ;
217
+ this . requestUpdate ( ) ;
218
+ }
219
+
220
+ private async onLoadNsdoc ( event : LoadNsdocEvent ) {
221
+ const nsdocElement = this . parseToXmlObject ( event . detail . nsdoc ) . querySelector ( 'NSDoc' ) ;
207
222
208
- if ( ! this . isEqual ( nsdVersion , nsdocVersion ) ) {
209
- document
223
+ const id = nsdocElement ?. getAttribute ( 'id' ) ;
224
+ if ( ! id ) {
225
+ document
210
226
. querySelector ( 'open-scd' ) !
211
227
. dispatchEvent (
212
- newLogEvent ( { kind : 'error' , title : get ( 'settings.invalidNsdocVersion' , {
228
+ newLogEvent ( { kind : 'error' , title : get ( 'settings.invalidFileNoIdFound' , {
229
+ filename : event . detail . filename
230
+ } ) } )
231
+ ) ;
232
+ return ;
233
+ }
234
+
235
+ const nsdVersions = await this . nsdVersions ( ) ;
236
+ const nsdVersion = nsdVersions [ id as keyof NsdVersions ] ;
237
+ const nsdocVersion = {
238
+ version : nsdocElement ! . getAttribute ( 'version' ) ?? '' ,
239
+ revision : nsdocElement ! . getAttribute ( 'revision' ) ?? '' ,
240
+ release : nsdocElement ! . getAttribute ( 'release' ) ?? ''
241
+ }
242
+
243
+ if ( ! this . isEqual ( nsdVersion , nsdocVersion ) ) {
244
+ document
245
+ . querySelector ( 'open-scd' ) !
246
+ . dispatchEvent (
247
+ newLogEvent ( { kind : 'error' , title : get ( 'settings.invalidNsdocVersion' , {
213
248
id : id ,
249
+ filename : event . detail . filename ,
214
250
nsdVersion : `${ nsdVersion . version } ${ nsdVersion . revision } ${ nsdVersion . release } ` ,
215
251
nsdocVersion : `${ nsdocVersion . version } ${ nsdocVersion . revision } ${ nsdocVersion . release } `
216
252
} ) } )
217
- ) ;
218
- return ;
219
- }
220
-
221
- this . setSetting ( id as keyof Settings , text ) ;
222
- } )
253
+ ) ;
254
+ return ;
255
+ }
223
256
224
- this . nsdocFileUI . value = '' ;
225
- this . requestUpdate ( ) ;
257
+ this . setSetting ( id as keyof Settings , event . detail . nsdoc ) ;
226
258
}
227
259
228
260
/**
@@ -245,7 +277,7 @@ export function Setting<TBase extends LitElementConstructor>(Base: TBase) {
245
277
let nsdVersion : string | undefined | null ;
246
278
let nsdRevision : string | undefined | null ;
247
279
let nsdRelease : string | undefined | null ;
248
-
280
+
249
281
if ( nsdSetting ) {
250
282
const nsdoc = this . parseToXmlObject ( nsdSetting ) ! . querySelector ( 'NSDoc' ) ;
251
283
nsdVersion = nsdoc ?. getAttribute ( 'version' ) ;
@@ -273,6 +305,8 @@ export function Setting<TBase extends LitElementConstructor>(Base: TBase) {
273
305
274
306
registerTranslateConfig ( { loader, empty : key => key } ) ;
275
307
use ( this . settings . language ) ;
308
+
309
+ ( < any > this ) . addEventListener ( 'load-nsdoc' , this . onLoadNsdoc ) ;
276
310
}
277
311
278
312
render ( ) : TemplateResult {
0 commit comments