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