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``, 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 =