diff --git a/src/translations/de.ts b/src/translations/de.ts
index 217a46839c..1fe67b7ecf 100644
--- a/src/translations/de.ts
+++ b/src/translations/de.ts
@@ -40,6 +40,12 @@ export const de: Translations = {
smpMod: 'Abtast-Art',
smpRate: 'Abtastrate',
nofASDU: 'Abtastpunkte pro Datenpacket',
+ SmvOpts: 'Optionale Informationen',
+ refreshTime: 'Zeitstempel des Abtastwertes zu Telegram hinzufügen',
+ sampleRate: 'Abtastrate zu Telegram hinzufügen',
+ dataSet: 'Datensatznamen zu Telegram hinzufügen',
+ security: 'Potentiel in Zukunft für z.B. digitale Signature',
+ synchSourceId: 'Identität der Zeitquelle zu Telegram hinzufügen',
},
settings: {
title: 'Einstellungen',
@@ -51,7 +57,7 @@ export const de: Translations = {
selectFileButton: 'Datei auswählen',
loadNsdTranslations: 'NSDoc-Dateien hochladen',
invalidFileNoIdFound: 'Ungültiges NSDoc; kein \'id\'-Attribut in der Datei gefunden',
- invalidNsdocVersion: '???'
+ invalidNsdocVersion: 'Die Version {{ id }} NSD ({{ nsdVersion }}) passt nicht zu der geladenen NSDoc ({{ nsdocVersion }})'
},
menu: {
new: 'Neues projekt',
diff --git a/src/translations/en.ts b/src/translations/en.ts
index bc86ea5f74..573e9d025d 100644
--- a/src/translations/en.ts
+++ b/src/translations/en.ts
@@ -37,7 +37,13 @@ export const en = {
multicast: 'SMV acc. to IEC 61850 9-2',
smpMod: 'Sample mode',
smpRate: 'Sample rate',
- nofASDU: 'Samples per paket',
+ nofASDU: 'Samples per packet',
+ SmvOpts: 'Optional Information',
+ refreshTime: 'Add timestamp to SMV packet',
+ sampleRate: 'Add sample rate to SMV packet',
+ dataSet: 'Add DataSet name to SMV packet',
+ security: 'Potential future use. e.g. digital signature',
+ synchSourceId: 'Add sync source id to SMV packet',
},
settings: {
title: 'Settings',
diff --git a/src/wizards/sampledvaluecontrol.ts b/src/wizards/sampledvaluecontrol.ts
index 76761e85b8..2dd26df14e 100644
--- a/src/wizards/sampledvaluecontrol.ts
+++ b/src/wizards/sampledvaluecontrol.ts
@@ -28,6 +28,7 @@ import {
import { securityEnableEnum, smpModEnum } from './foundation/enums.js';
import { maxLength, patterns } from './foundation/limits.js';
import { editSMvWizard } from './smv.js';
+import { editSmvOptsWizard } from './smvopts.js';
function getSMV(element: Element): Element | null {
const cbName = element.getAttribute('name');
@@ -224,6 +225,7 @@ export function editSampledValueControlWizard(element: Element): Wizard {
const securityEnable = element.getAttribute('securityEnabled');
const sMV = getSMV(element);
+ const smvOpts = element.querySelector('SmvOpts')!;
return [
{
@@ -257,6 +259,16 @@ export function editSampledValueControlWizard(element: Element): Wizard {
}}}"
>`
: html``,
+ html` {
+ e.target?.dispatchEvent(
+ newSubWizardEvent(() => editSmvOptsWizard(smvOpts))
+ );
+ }}}"
+ >`,
html`
+ html``
+ );
+}
+
+function updateSmvOptsAction(element: Element): WizardActor {
+ return (inputs: WizardInput[]): WizardAction[] => {
+ const attributes: Record = {};
+ const attributeKeys = [
+ 'refreshTime',
+ 'sampleRate',
+ 'dataSet',
+ 'security',
+ 'synchSourceId',
+ ];
+ attributeKeys.forEach(key => {
+ attributes[key] = getValue(inputs.find(i => i.label === key)!);
+ });
+
+ if (
+ !attributeKeys.some(key => attributes[key] !== element.getAttribute(key))
+ )
+ return [];
+
+ const newElement = cloneElement(element, attributes);
+ return [{ old: { element }, new: { element: newElement } }];
+ };
+}
+
+export function editSmvOptsWizard(element: Element): Wizard {
+ const [refreshTime, sampleRate, dataSet, security, synchSourceId] = [
+ 'refreshTime',
+ 'sampleRate',
+ 'dataSet',
+ 'security',
+ 'synchSourceId',
+ ].map(smvopt => element.getAttribute(smvopt));
+
+ return [
+ {
+ title: get('wizard.title.edit', { tagName: element.tagName }),
+ element,
+ primary: {
+ icon: 'save',
+ label: get('save'),
+ action: updateSmvOptsAction(element),
+ },
+ content: [
+ ...contentSmvOptsWizard({
+ refreshTime,
+ sampleRate,
+ dataSet,
+ security,
+ synchSourceId,
+ }),
+ ],
+ },
+ ];
+}
diff --git a/test/integration/wizards/sampledvaluecontrol-wizarding-editing.test.ts b/test/integration/wizards/sampledvaluecontrol-wizarding-editing.test.ts
index af102339f3..fa9dbbc2ad 100644
--- a/test/integration/wizards/sampledvaluecontrol-wizarding-editing.test.ts
+++ b/test/integration/wizards/sampledvaluecontrol-wizarding-editing.test.ts
@@ -9,6 +9,7 @@ import { ListItemBase } from '@material/mwc-list/mwc-list-item-base';
import { FilteredList } from '../../../src/filtered-list.js';
import { WizardTextField } from '../../../src/wizard-textfield.js';
import { selectSampledValueControlWizard } from '../../../src/wizards/sampledvaluecontrol.js';
+import { WizardCheckbox } from '../../../src/wizard-checkbox.js';
describe('Wizards for SCL element SampledValueControl', () => {
let doc: XMLDocument;
@@ -239,6 +240,28 @@ describe('Wizards for SCL element SampledValueControl', () => {
);
});
+ it('opens a edit wizard for SMV on edit SMV button click', async () => {
+ const editSmvOptsButton =