@@ -18,6 +18,8 @@ import { Language, languages, loader } from './translations/loader.js';
18
18
import './WizardDivider.js' ;
19
19
import { WizardDialog } from './wizard-dialog.js' ;
20
20
21
+ import { iec6185072 , iec6185073 , iec6185074 , iec6185081 } from "./validators/templates/foundation.js" ;
22
+
21
23
export type Settings = {
22
24
language : Language ;
23
25
theme : 'light' | 'dark' ;
@@ -39,6 +41,19 @@ export const defaults: Settings = {
39
41
'IEC 61850-8-1' : undefined
40
42
} ;
41
43
44
+ type NsdVersion = {
45
+ version : string | undefined ,
46
+ revision : string | undefined ,
47
+ release : string | undefined
48
+ }
49
+
50
+ type NsdVersions = {
51
+ 'IEC 61850-7-2' : NsdVersion ;
52
+ 'IEC 61850-7-3' : NsdVersion ;
53
+ 'IEC 61850-7-4' : NsdVersion ;
54
+ 'IEC 61850-8-1' : NsdVersion ;
55
+ }
56
+
42
57
/** Mixin that saves [[`Settings`]] to `localStorage`, reflecting them in the
43
58
* `settings` property, setting them through `setSetting(setting, value)`. */
44
59
export type SettingElement = Mixin < typeof Setting > ;
@@ -60,6 +75,38 @@ export function Setting<TBase extends LitElementConstructor>(Base: TBase) {
60
75
} ;
61
76
}
62
77
78
+ /**
79
+ * Get the versions of the current OpenSCD NSD files.
80
+ * @returns Current version, revision and release for all current OpenSCD NSD files.
81
+ */
82
+ private async nsdVersions ( ) : Promise < NsdVersions > {
83
+ const [ nsd72 , nsd73 , nsd74 , nsd81 ] = await Promise . all ( [ iec6185072 , iec6185073 , iec6185074 , iec6185081 ] ) ;
84
+ const [ nsd72Ns , nsd73Ns , nsd74Ns , nsd81Ns ] = [ nsd72 . querySelector ( 'NS' ) , nsd73 . querySelector ( 'NS' ) , nsd74 . querySelector ( 'NS' ) , nsd81 . querySelector ( 'ServiceNS' ) ] ;
85
+
86
+ return {
87
+ 'IEC 61850-7-2' : {
88
+ version : nsd72Ns ?. getAttribute ( 'version' ) ?? undefined ,
89
+ revision : nsd72Ns ?. getAttribute ( 'revision' ) ?? undefined ,
90
+ release : nsd72Ns ?. getAttribute ( 'release' ) ?? undefined ,
91
+ } ,
92
+ 'IEC 61850-7-3' : {
93
+ version : nsd73Ns ?. getAttribute ( 'version' ) ?? undefined ,
94
+ revision : nsd73Ns ?. getAttribute ( 'revision' ) ?? undefined ,
95
+ release : nsd73Ns ?. getAttribute ( 'release' ) ?? undefined ,
96
+ } ,
97
+ 'IEC 61850-7-4' : {
98
+ version : nsd74Ns ?. getAttribute ( 'version' ) ?? undefined ,
99
+ revision : nsd74Ns ?. getAttribute ( 'revision' ) ?? undefined ,
100
+ release : nsd74Ns ?. getAttribute ( 'release' ) ?? undefined ,
101
+ } ,
102
+ 'IEC 61850-8-1' : {
103
+ version : nsd81Ns ?. getAttribute ( 'version' ) ?? undefined ,
104
+ revision : nsd81Ns ?. getAttribute ( 'revision' ) ?? undefined ,
105
+ release : nsd81Ns ?. getAttribute ( 'release' ) ?? undefined ,
106
+ }
107
+ }
108
+ }
109
+
63
110
@query ( '#settings' )
64
111
settingsUI ! : Dialog ;
65
112
@query ( '#language' )
@@ -133,14 +180,16 @@ export function Setting<TBase extends LitElementConstructor>(Base: TBase) {
133
180
}
134
181
135
182
private async loadNsdocFile ( evt : Event ) : Promise < void > {
183
+ const nsdVersions = await this . nsdVersions ( ) ;
136
184
const files = Array . from (
137
185
( < HTMLInputElement | null > evt . target ) ?. files ?? [ ]
138
186
) ;
139
187
140
188
if ( files . length == 0 ) return ;
141
189
files . forEach ( async file => {
142
190
const text = await file . text ( ) ;
143
- const id = this . parseToXmlObject ( text ) . querySelector ( 'NSDoc' ) ?. getAttribute ( 'id' ) ;
191
+ const nsdocElement = this . parseToXmlObject ( text ) . querySelector ( 'NSDoc' ) ;
192
+ const id = nsdocElement ?. getAttribute ( 'id' ) ;
144
193
if ( ! id ) {
145
194
document
146
195
. querySelector ( 'open-scd' ) !
@@ -149,6 +198,25 @@ export function Setting<TBase extends LitElementConstructor>(Base: TBase) {
149
198
) ;
150
199
return ;
151
200
}
201
+ const nsdVersion = nsdVersions [ id as keyof NsdVersions ] ;
202
+ const nsdocVersion = {
203
+ version : nsdocElement ! . getAttribute ( 'version' ) ?? undefined ,
204
+ revision : nsdocElement ! . getAttribute ( 'revision' ) ?? undefined ,
205
+ release : nsdocElement ! . getAttribute ( 'release' ) ?? undefined
206
+ }
207
+
208
+ if ( ! this . isEqual ( nsdVersion , nsdocVersion ) ) {
209
+ document
210
+ . querySelector ( 'open-scd' ) !
211
+ . dispatchEvent (
212
+ newLogEvent ( { kind : 'error' , title : get ( 'settings.invalidNsdocVersion' , {
213
+ id : id ,
214
+ nsdVersion : `${ nsdVersion . version } ${ nsdVersion . revision } ${ nsdVersion . release } ` ,
215
+ nsdocVersion : `${ nsdocVersion . version } ${ nsdocVersion . revision } ${ nsdocVersion . release } `
216
+ } ) } )
217
+ ) ;
218
+ return ;
219
+ }
152
220
153
221
this . setSetting ( id as keyof Settings , text ) ;
154
222
} )
@@ -157,6 +225,16 @@ export function Setting<TBase extends LitElementConstructor>(Base: TBase) {
157
225
this . requestUpdate ( ) ;
158
226
}
159
227
228
+ /**
229
+ * Check the equality of two NsdVersions.
230
+ * @param versionA - First version to compare.
231
+ * @param versionB - Second version to compare.
232
+ * @returns Are they equal or not.
233
+ */
234
+ private isEqual ( versionA : NsdVersion , versionB : NsdVersion ) : boolean {
235
+ return versionA . version == versionB . version && versionA . revision == versionB . revision && versionA . release == versionB . release ;
236
+ }
237
+
160
238
/**
161
239
* Render one .nsdoc item in the Settings wizard
162
240
* @param key - The key of the nsdoc file in the settings.
0 commit comments