@@ -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 > ;
@@ -165,64 +182,44 @@ export function Setting<TBase extends LitElementConstructor>(Base: TBase) {
165
182
if ( changedProperties . has ( 'settings' ) ) use ( this . settings . language ) ;
166
183
}
167
184
168
- private renderFileSelect ( ) : TemplateResult {
169
- return html `
170
- < input id ="nsdoc-file " accept =".nsdoc " type ="file " hidden required multiple
171
- @change =${ ( evt : Event ) => this . loadNsdocFile ( evt ) } } >
172
- < mwc-button label ="${ translate ( 'settings.selectFileButton' ) } "
173
- id ="selectFileButton "
174
- @click =${ ( ) => {
175
- const input = < HTMLInputElement | null > this . shadowRoot ! . querySelector ( "#nsdoc-file" ) ;
176
- input ?. click ( ) ;
177
- } } >
178
- </ mwc-button >
179
- ` ;
180
- }
185
+ private async onLoadNsdoc ( event : LoadNsdocEvent ) {
186
+ const nsdocElement = this . parseToXmlObject ( event . detail . nsdoc ) . querySelector ( 'NSDoc' ) ;
181
187
182
- private async loadNsdocFile ( evt : Event ) : Promise < void > {
183
- const nsdVersions = await this . nsdVersions ( ) ;
184
- const files = Array . from (
185
- ( < HTMLInputElement | null > evt . target ) ?. files ?? [ ]
186
- ) ;
187
-
188
- if ( files . length == 0 ) return ;
189
- files . forEach ( async file => {
190
- const text = await file . text ( ) ;
191
- const nsdocElement = this . parseToXmlObject ( text ) . querySelector ( 'NSDoc' ) ;
192
- const id = nsdocElement ?. getAttribute ( 'id' ) ;
193
- if ( ! id ) {
194
- document
188
+ const id = nsdocElement ?. getAttribute ( 'id' ) ;
189
+ if ( ! id ) {
190
+ document
195
191
. querySelector ( 'open-scd' ) !
196
192
. 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
- }
193
+ newLogEvent ( { kind : 'error' , title : get ( 'settings.invalidFileNoIdFound' , {
194
+ filename : event . detail . filename
195
+ } ) } )
196
+ ) ;
197
+ return ;
198
+ }
207
199
208
- if ( ! this . isEqual ( nsdVersion , nsdocVersion ) ) {
209
- document
200
+ const nsdVersions = await this . nsdVersions ( ) ;
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
+ }
207
+
208
+ if ( ! this . isEqual ( nsdVersion , nsdocVersion ) ) {
209
+ document
210
210
. querySelector ( 'open-scd' ) !
211
211
. dispatchEvent (
212
- newLogEvent ( { kind : 'error' , title : get ( 'settings.invalidNsdocVersion' , {
212
+ newLogEvent ( { kind : 'error' , title : get ( 'settings.invalidNsdocVersion' , {
213
213
id : id ,
214
+ filename : event . detail . filename ,
214
215
nsdVersion : `${ nsdVersion . version } ${ nsdVersion . revision } ${ nsdVersion . release } ` ,
215
216
nsdocVersion : `${ nsdocVersion . version } ${ nsdocVersion . revision } ${ nsdocVersion . release } `
216
217
} ) } )
217
- ) ;
218
- return ;
219
- }
220
-
221
- this . setSetting ( id as keyof Settings , text ) ;
222
- } )
218
+ ) ;
219
+ return ;
220
+ }
223
221
224
- this . nsdocFileUI . value = '' ;
225
- this . requestUpdate ( ) ;
222
+ this . setSetting ( id as keyof Settings , event . detail . nsdoc ) ;
226
223
}
227
224
228
225
/**
@@ -245,7 +242,7 @@ export function Setting<TBase extends LitElementConstructor>(Base: TBase) {
245
242
let nsdVersion : string | undefined | null ;
246
243
let nsdRevision : string | undefined | null ;
247
244
let nsdRelease : string | undefined | null ;
248
-
245
+
249
246
if ( nsdSetting ) {
250
247
const nsdoc = this . parseToXmlObject ( nsdSetting ) ! . querySelector ( 'NSDoc' ) ;
251
248
nsdVersion = nsdoc ?. getAttribute ( 'version' ) ;
@@ -273,6 +270,8 @@ export function Setting<TBase extends LitElementConstructor>(Base: TBase) {
273
270
274
271
registerTranslateConfig ( { loader, empty : key => key } ) ;
275
272
use ( this . settings . language ) ;
273
+
274
+ ( < any > this ) . addEventListener ( 'load-nsdoc' , this . onLoadNsdoc ) ;
276
275
}
277
276
278
277
render ( ) : TemplateResult {
@@ -321,7 +320,6 @@ export function Setting<TBase extends LitElementConstructor>(Base: TBase) {
321
320
< wizard-divider > </ wizard-divider >
322
321
< section >
323
322
< h3 > ${ translate ( 'settings.loadNsdTranslations' ) } </ h3 >
324
- ${ this . renderFileSelect ( ) }
325
323
</ section >
326
324
< mwc-list id ="nsdocList ">
327
325
${ this . renderNsdocItem ( 'IEC 61850-7-2' ) }
0 commit comments