Skip to content

Commit 2e470cb

Browse files
author
Rob Tjalma
authored
feat(Settings): Handle difference in version before uploading nsdoc file (openscd#541)
feat(Settings): Handle difference in version before uploading nsdoc file
1 parent 1940571 commit 2e470cb

File tree

3 files changed

+83
-3
lines changed

3 files changed

+83
-3
lines changed

src/Setting.ts

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import { Language, languages, loader } from './translations/loader.js';
1818
import './WizardDivider.js';
1919
import { WizardDialog } from './wizard-dialog.js';
2020

21+
import { iec6185072, iec6185073, iec6185074, iec6185081 } from "./validators/templates/foundation.js";
22+
2123
export type Settings = {
2224
language: Language;
2325
theme: 'light' | 'dark';
@@ -39,6 +41,19 @@ export const defaults: Settings = {
3941
'IEC 61850-8-1': undefined
4042
};
4143

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+
4257
/** Mixin that saves [[`Settings`]] to `localStorage`, reflecting them in the
4358
* `settings` property, setting them through `setSetting(setting, value)`. */
4459
export type SettingElement = Mixin<typeof Setting>;
@@ -60,6 +75,38 @@ export function Setting<TBase extends LitElementConstructor>(Base: TBase) {
6075
};
6176
}
6277

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+
63110
@query('#settings')
64111
settingsUI!: Dialog;
65112
@query('#language')
@@ -133,14 +180,16 @@ export function Setting<TBase extends LitElementConstructor>(Base: TBase) {
133180
}
134181

135182
private async loadNsdocFile(evt: Event): Promise<void> {
183+
const nsdVersions = await this.nsdVersions();
136184
const files = Array.from(
137185
(<HTMLInputElement | null>evt.target)?.files ?? []
138186
);
139187

140188
if (files.length == 0) return;
141189
files.forEach(async file => {
142190
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');
144193
if (!id) {
145194
document
146195
.querySelector('open-scd')!
@@ -149,6 +198,25 @@ export function Setting<TBase extends LitElementConstructor>(Base: TBase) {
149198
);
150199
return;
151200
}
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+
}
152220

153221
this.setSetting(id as keyof Settings, text);
154222
})
@@ -157,6 +225,16 @@ export function Setting<TBase extends LitElementConstructor>(Base: TBase) {
157225
this.requestUpdate();
158226
}
159227

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+
160238
/**
161239
* Render one .nsdoc item in the Settings wizard
162240
* @param key - The key of the nsdoc file in the settings.

src/translations/de.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ export const de: Translations = {
5050
showieds: 'Zeige IEDs im Substation-Editor',
5151
selectFileButton: 'Datei auswählen',
5252
loadNsdTranslations: 'NSDoc-Dateien hochladen',
53-
invalidFileNoIdFound: 'Ungültiges NSDoc; kein \'id\'-Attribut in der Datei gefunden'
53+
invalidFileNoIdFound: 'Ungültiges NSDoc; kein \'id\'-Attribut in der Datei gefunden',
54+
invalidNsdocVersion: '???'
5455
},
5556
menu: {
5657
new: 'Neues projekt',

src/translations/en.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ export const en = {
4848
showieds: 'Show IEDs in substation editor',
4949
selectFileButton: 'Select file',
5050
loadNsdTranslations: 'Uploading NSDoc files',
51-
invalidFileNoIdFound: 'Invalid NSDoc; no \'id\' attribute found in file'
51+
invalidFileNoIdFound: 'Invalid NSDoc; no \'id\' attribute found in file',
52+
invalidNsdocVersion: 'The version of {{ id }} NSD ({{ nsdVersion }}) does not correlate with the version of the corresponding NSDoc ({{ nsdocVersion }})'
5253
},
5354
menu: {
5455
new: 'New project',

0 commit comments

Comments
 (0)