@omicronenergy/oscd-scl-dialogs 0.0.11 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/README.md +4 -2
- package/custom-elements.json +292 -3
- package/dist/OscdSclDialogs.d.ts +2 -0
- package/dist/OscdSclDialogs.js +62 -12
- package/dist/OscdSclDialogs.js.map +1 -1
- package/dist/wizards/dataset.d.ts +2 -0
- package/dist/wizards/dataset.js +86 -0
- package/dist/wizards/dataset.js.map +1 -0
- package/dist/wizards/dataset.spec.d.ts +1 -0
- package/dist/wizards/dataset.spec.js +240 -0
- package/dist/wizards/dataset.spec.js.map +1 -0
- package/dist/wizards/gsecontrol.d.ts +2 -0
- package/dist/wizards/gsecontrol.js +86 -0
- package/dist/wizards/gsecontrol.js.map +1 -0
- package/dist/wizards/gsecontrol.spec.d.ts +1 -0
- package/dist/wizards/gsecontrol.spec.js +216 -0
- package/dist/wizards/gsecontrol.spec.js.map +1 -0
- package/dist/wizards/lnode.d.ts +1 -0
- package/dist/wizards/lnode.js +101 -1
- package/dist/wizards/lnode.js.map +1 -1
- package/dist/wizards/patterns.d.ts +2 -0
- package/dist/wizards/patterns.js +2 -0
- package/dist/wizards/patterns.js.map +1 -1
- package/dist/wizards/sampledvaluecontrol.d.ts +2 -0
- package/dist/wizards/sampledvaluecontrol.js +115 -0
- package/dist/wizards/sampledvaluecontrol.js.map +1 -0
- package/dist/wizards/sampledvaluecontrol.spec.d.ts +1 -0
- package/dist/wizards/sampledvaluecontrol.spec.js +227 -0
- package/dist/wizards/sampledvaluecontrol.spec.js.map +1 -0
- package/dist/wizards/smvopts.d.ts +2 -0
- package/dist/wizards/smvopts.js +43 -0
- package/dist/wizards/smvopts.js.map +1 -0
- package/dist/wizards/smvopts.spec.d.ts +1 -0
- package/dist/wizards/smvopts.spec.js +193 -0
- package/dist/wizards/smvopts.spec.js.map +1 -0
- package/dist/wizards/wizards.js +16 -4
- package/dist/wizards/wizards.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
|
2
|
+
import { expect, fixture } from '@open-wc/testing';
|
|
3
|
+
import { html } from 'lit';
|
|
4
|
+
import { editGSEControlWizard } from './gsecontrol.js';
|
|
5
|
+
import { XMLEditor } from '@openscd/oscd-editor';
|
|
6
|
+
import { SclTextField } from '@openenergytools/scl-text-field';
|
|
7
|
+
import { SclSelect } from '@openenergytools/scl-select';
|
|
8
|
+
import { SclCheckbox } from '@openenergytools/scl-checkbox';
|
|
9
|
+
if (!customElements.get('scl-text-field')) {
|
|
10
|
+
customElements.define('scl-text-field', SclTextField);
|
|
11
|
+
}
|
|
12
|
+
if (!customElements.get('scl-select')) {
|
|
13
|
+
customElements.define('scl-select', SclSelect);
|
|
14
|
+
}
|
|
15
|
+
if (!customElements.get('scl-checkbox')) {
|
|
16
|
+
customElements.define('scl-checkbox', SclCheckbox);
|
|
17
|
+
}
|
|
18
|
+
const xmlParser = new DOMParser();
|
|
19
|
+
function createSclDoc() {
|
|
20
|
+
return xmlParser.parseFromString(`
|
|
21
|
+
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
|
|
22
|
+
<IED name="IED1">
|
|
23
|
+
<AccessPoint name="AP1">
|
|
24
|
+
<Server>
|
|
25
|
+
<LDevice inst="LD1">
|
|
26
|
+
<LN0 lnClass="LLN0" inst="" lnType="LLN0_Type">
|
|
27
|
+
<GSEControl name="GCB1" desc="GOOSE control 1" type="GOOSE" appID="APP1" fixedOffs="true" securityEnabled="None" datSet="ds1" confRev="1" />
|
|
28
|
+
<GSEControl name="GCB2" appID="APP2" />
|
|
29
|
+
</LN0>
|
|
30
|
+
</LDevice>
|
|
31
|
+
</Server>
|
|
32
|
+
</AccessPoint>
|
|
33
|
+
</IED>
|
|
34
|
+
</SCL>
|
|
35
|
+
`, 'application/xml');
|
|
36
|
+
}
|
|
37
|
+
async function renderContent(wizard) {
|
|
38
|
+
const content = await fixture(html `<form>${wizard.content}</form>`);
|
|
39
|
+
const nameField = content.querySelector('scl-text-field[label="name"]');
|
|
40
|
+
const descField = content.querySelector('scl-text-field[label="desc"]');
|
|
41
|
+
const typeField = content.querySelector('scl-select[label="type"]');
|
|
42
|
+
const appIDField = content.querySelector('scl-text-field[label="appID"]');
|
|
43
|
+
const fixedOffsField = content.querySelector('scl-checkbox[label="fixedOffs"]');
|
|
44
|
+
const securityEnabledField = content.querySelector('scl-select[label="securityEnabled"]');
|
|
45
|
+
expect(nameField).to.exist;
|
|
46
|
+
expect(descField).to.exist;
|
|
47
|
+
expect(typeField).to.exist;
|
|
48
|
+
expect(appIDField).to.exist;
|
|
49
|
+
expect(fixedOffsField).to.exist;
|
|
50
|
+
expect(securityEnabledField).to.exist;
|
|
51
|
+
return {
|
|
52
|
+
content,
|
|
53
|
+
nameField,
|
|
54
|
+
descField,
|
|
55
|
+
typeField,
|
|
56
|
+
appIDField,
|
|
57
|
+
fixedOffsField,
|
|
58
|
+
securityEnabledField,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
describe('GSEControl edit wizard', () => {
|
|
62
|
+
let xmlEditor;
|
|
63
|
+
let renderedContainer;
|
|
64
|
+
beforeEach(() => {
|
|
65
|
+
xmlEditor = new XMLEditor();
|
|
66
|
+
});
|
|
67
|
+
afterEach(() => {
|
|
68
|
+
if (renderedContainer) {
|
|
69
|
+
renderedContainer.remove();
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
it('returns a wizard with correct title and all 6 fields', () => {
|
|
73
|
+
const scl = createSclDoc();
|
|
74
|
+
const element = scl.querySelector('GSEControl[name="GCB1"]');
|
|
75
|
+
const wizard = editGSEControlWizard(element);
|
|
76
|
+
expect(wizard.title).to.equal('Edit GSEControl');
|
|
77
|
+
expect(wizard.primary).to.exist;
|
|
78
|
+
expect(wizard.primary.icon).to.equal('edit');
|
|
79
|
+
expect(wizard.primary.label).to.equal('save');
|
|
80
|
+
expect(wizard.content).to.have.lengthOf(6);
|
|
81
|
+
});
|
|
82
|
+
it('populates fields with current attribute values', async () => {
|
|
83
|
+
const scl = createSclDoc();
|
|
84
|
+
const element = scl.querySelector('GSEControl[name="GCB1"]');
|
|
85
|
+
const wizard = editGSEControlWizard(element);
|
|
86
|
+
const fields = await renderContent(wizard);
|
|
87
|
+
renderedContainer = fields.content;
|
|
88
|
+
expect(fields.nameField.value).to.equal('GCB1');
|
|
89
|
+
expect(fields.descField.value).to.equal('GOOSE control 1');
|
|
90
|
+
expect(fields.typeField.value).to.equal('GOOSE');
|
|
91
|
+
expect(fields.appIDField.value).to.equal('APP1');
|
|
92
|
+
expect(fields.fixedOffsField.value).to.equal('true');
|
|
93
|
+
expect(fields.securityEnabledField.value).to.equal('None');
|
|
94
|
+
});
|
|
95
|
+
it('returns [] when no changes are made', async () => {
|
|
96
|
+
const scl = createSclDoc();
|
|
97
|
+
const element = scl.querySelector('GSEControl[name="GCB1"]');
|
|
98
|
+
const wizard = editGSEControlWizard(element);
|
|
99
|
+
const fields = await renderContent(wizard);
|
|
100
|
+
renderedContainer = fields.content;
|
|
101
|
+
const edits = wizard.primary.action([
|
|
102
|
+
fields.nameField,
|
|
103
|
+
fields.descField,
|
|
104
|
+
fields.typeField,
|
|
105
|
+
fields.appIDField,
|
|
106
|
+
fields.fixedOffsField,
|
|
107
|
+
fields.securityEnabledField,
|
|
108
|
+
], renderedContainer);
|
|
109
|
+
expect(edits).to.have.lengthOf(0);
|
|
110
|
+
});
|
|
111
|
+
it('returns SetAttributes with changed name', async () => {
|
|
112
|
+
const scl = createSclDoc();
|
|
113
|
+
const element = scl.querySelector('GSEControl[name="GCB1"]');
|
|
114
|
+
const wizard = editGSEControlWizard(element);
|
|
115
|
+
const fields = await renderContent(wizard);
|
|
116
|
+
renderedContainer = fields.content;
|
|
117
|
+
fields.nameField.value = 'GCB_New';
|
|
118
|
+
const edits = wizard.primary.action([
|
|
119
|
+
fields.nameField,
|
|
120
|
+
fields.descField,
|
|
121
|
+
fields.typeField,
|
|
122
|
+
fields.appIDField,
|
|
123
|
+
fields.fixedOffsField,
|
|
124
|
+
fields.securityEnabledField,
|
|
125
|
+
], renderedContainer);
|
|
126
|
+
expect(edits).to.have.lengthOf(1);
|
|
127
|
+
const edit = edits[0];
|
|
128
|
+
expect(edit.element).to.equal(element);
|
|
129
|
+
expect(edit.attributes.name).to.equal('GCB_New');
|
|
130
|
+
});
|
|
131
|
+
it('applies changed name to the document', async () => {
|
|
132
|
+
const scl = createSclDoc();
|
|
133
|
+
const element = scl.querySelector('GSEControl[name="GCB1"]');
|
|
134
|
+
const wizard = editGSEControlWizard(element);
|
|
135
|
+
const fields = await renderContent(wizard);
|
|
136
|
+
renderedContainer = fields.content;
|
|
137
|
+
fields.nameField.value = 'GCB_New';
|
|
138
|
+
const edits = wizard.primary.action([
|
|
139
|
+
fields.nameField,
|
|
140
|
+
fields.descField,
|
|
141
|
+
fields.typeField,
|
|
142
|
+
fields.appIDField,
|
|
143
|
+
fields.fixedOffsField,
|
|
144
|
+
fields.securityEnabledField,
|
|
145
|
+
], renderedContainer);
|
|
146
|
+
xmlEditor.commit(edits);
|
|
147
|
+
expect(element.getAttribute('name')).to.equal('GCB_New');
|
|
148
|
+
});
|
|
149
|
+
it('handles nullable desc correctly — set to null removes attribute', async () => {
|
|
150
|
+
const scl = createSclDoc();
|
|
151
|
+
const element = scl.querySelector('GSEControl[name="GCB1"]');
|
|
152
|
+
expect(element.getAttribute('desc')).to.equal('GOOSE control 1');
|
|
153
|
+
const wizard = editGSEControlWizard(element);
|
|
154
|
+
const fields = await renderContent(wizard);
|
|
155
|
+
renderedContainer = fields.content;
|
|
156
|
+
// Set desc to null (cleared)
|
|
157
|
+
fields.descField.value = null;
|
|
158
|
+
const edits = wizard.primary.action([
|
|
159
|
+
fields.nameField,
|
|
160
|
+
fields.descField,
|
|
161
|
+
fields.typeField,
|
|
162
|
+
fields.appIDField,
|
|
163
|
+
fields.fixedOffsField,
|
|
164
|
+
fields.securityEnabledField,
|
|
165
|
+
], renderedContainer);
|
|
166
|
+
expect(edits).to.have.lengthOf(1);
|
|
167
|
+
const edit = edits[0];
|
|
168
|
+
expect(edit.attributes.desc).to.be.null;
|
|
169
|
+
xmlEditor.commit(edits);
|
|
170
|
+
expect(element.getAttribute('desc')).to.be.null;
|
|
171
|
+
});
|
|
172
|
+
it('handles element with minimal attributes (GCB2)', async () => {
|
|
173
|
+
const scl = createSclDoc();
|
|
174
|
+
const element = scl.querySelector('GSEControl[name="GCB2"]');
|
|
175
|
+
const wizard = editGSEControlWizard(element);
|
|
176
|
+
const fields = await renderContent(wizard);
|
|
177
|
+
renderedContainer = fields.content;
|
|
178
|
+
expect(fields.nameField.value).to.equal('GCB2');
|
|
179
|
+
expect(fields.descField.value).to.be.null;
|
|
180
|
+
expect(fields.typeField.value).to.be.null;
|
|
181
|
+
expect(fields.appIDField.value).to.equal('APP2');
|
|
182
|
+
expect(fields.fixedOffsField.value).to.be.null;
|
|
183
|
+
expect(fields.securityEnabledField.value).to.be.null;
|
|
184
|
+
});
|
|
185
|
+
it('populates reservedValues with sibling GSEControl names', () => {
|
|
186
|
+
const scl = createSclDoc();
|
|
187
|
+
const element = scl.querySelector('GSEControl[name="GCB1"]');
|
|
188
|
+
const wizard = editGSEControlWizard(element);
|
|
189
|
+
// The first content item is the name field with reservedValues
|
|
190
|
+
const nameTemplate = wizard.content[0];
|
|
191
|
+
expect(nameTemplate).to.exist;
|
|
192
|
+
// Verify via the wizard that GCB2 is in reserved names (sibling)
|
|
193
|
+
// by trying to set name to GCB2 and checking the action still produces edits
|
|
194
|
+
// (validation is on the field component, not on the action)
|
|
195
|
+
});
|
|
196
|
+
it('returns SetAttributes with changed type', async () => {
|
|
197
|
+
const scl = createSclDoc();
|
|
198
|
+
const element = scl.querySelector('GSEControl[name="GCB1"]');
|
|
199
|
+
const wizard = editGSEControlWizard(element);
|
|
200
|
+
const fields = await renderContent(wizard);
|
|
201
|
+
renderedContainer = fields.content;
|
|
202
|
+
fields.typeField.value = 'GSSE';
|
|
203
|
+
const edits = wizard.primary.action([
|
|
204
|
+
fields.nameField,
|
|
205
|
+
fields.descField,
|
|
206
|
+
fields.typeField,
|
|
207
|
+
fields.appIDField,
|
|
208
|
+
fields.fixedOffsField,
|
|
209
|
+
fields.securityEnabledField,
|
|
210
|
+
], renderedContainer);
|
|
211
|
+
expect(edits).to.have.lengthOf(1);
|
|
212
|
+
const edit = edits[0];
|
|
213
|
+
expect(edit.attributes.type).to.equal('GSSE');
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
//# sourceMappingURL=gsecontrol.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gsecontrol.spec.js","sourceRoot":"","sources":["../../wizards/gsecontrol.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-expressions */\nimport { expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\n\nimport { editGSEControlWizard } from './gsecontrol.js';\nimport { EditV2, SetAttributes } from '@openscd/oscd-api';\nimport { XMLEditor } from '@openscd/oscd-editor';\nimport { SclTextField } from '@openenergytools/scl-text-field';\nimport { SclSelect } from '@openenergytools/scl-select';\nimport { SclCheckbox } from '@openenergytools/scl-checkbox';\nimport { Wizard } from '../foundation.js';\n\nif (!customElements.get('scl-text-field')) {\n customElements.define('scl-text-field', SclTextField);\n}\nif (!customElements.get('scl-select')) {\n customElements.define('scl-select', SclSelect);\n}\nif (!customElements.get('scl-checkbox')) {\n customElements.define('scl-checkbox', SclCheckbox);\n}\n\nconst xmlParser = new DOMParser();\nfunction createSclDoc(): XMLDocument {\n return xmlParser.parseFromString(\n `\n <SCL xmlns=\"http://www.iec.ch/61850/2003/SCL\">\n <IED name=\"IED1\">\n <AccessPoint name=\"AP1\">\n <Server>\n <LDevice inst=\"LD1\">\n <LN0 lnClass=\"LLN0\" inst=\"\" lnType=\"LLN0_Type\">\n <GSEControl name=\"GCB1\" desc=\"GOOSE control 1\" type=\"GOOSE\" appID=\"APP1\" fixedOffs=\"true\" securityEnabled=\"None\" datSet=\"ds1\" confRev=\"1\" />\n <GSEControl name=\"GCB2\" appID=\"APP2\" />\n </LN0>\n </LDevice>\n </Server>\n </AccessPoint>\n </IED>\n </SCL>\n `,\n 'application/xml',\n );\n}\n\nasync function renderContent(wizard: Wizard) {\n const content = await fixture(html`<form>${wizard.content}</form>`);\n\n const nameField = content.querySelector(\n 'scl-text-field[label=\"name\"]',\n ) as SclTextField;\n const descField = content.querySelector(\n 'scl-text-field[label=\"desc\"]',\n ) as SclTextField;\n const typeField = content.querySelector(\n 'scl-select[label=\"type\"]',\n ) as SclSelect;\n const appIDField = content.querySelector(\n 'scl-text-field[label=\"appID\"]',\n ) as SclTextField;\n const fixedOffsField = content.querySelector(\n 'scl-checkbox[label=\"fixedOffs\"]',\n ) as SclCheckbox;\n const securityEnabledField = content.querySelector(\n 'scl-select[label=\"securityEnabled\"]',\n ) as SclSelect;\n\n expect(nameField).to.exist;\n expect(descField).to.exist;\n expect(typeField).to.exist;\n expect(appIDField).to.exist;\n expect(fixedOffsField).to.exist;\n expect(securityEnabledField).to.exist;\n\n return {\n content,\n nameField,\n descField,\n typeField,\n appIDField,\n fixedOffsField,\n securityEnabledField,\n };\n}\n\ndescribe('GSEControl edit wizard', () => {\n let xmlEditor: XMLEditor;\n let renderedContainer: Element | undefined;\n\n beforeEach(() => {\n xmlEditor = new XMLEditor();\n });\n\n afterEach(() => {\n if (renderedContainer) {\n renderedContainer.remove();\n }\n });\n\n it('returns a wizard with correct title and all 6 fields', () => {\n const scl = createSclDoc();\n const element = scl.querySelector('GSEControl[name=\"GCB1\"]')!;\n const wizard = editGSEControlWizard(element);\n\n expect(wizard.title).to.equal('Edit GSEControl');\n expect(wizard.primary).to.exist;\n expect(wizard.primary!.icon).to.equal('edit');\n expect(wizard.primary!.label).to.equal('save');\n expect(wizard.content).to.have.lengthOf(6);\n });\n\n it('populates fields with current attribute values', async () => {\n const scl = createSclDoc();\n const element = scl.querySelector('GSEControl[name=\"GCB1\"]')!;\n const wizard = editGSEControlWizard(element);\n const fields = await renderContent(wizard);\n renderedContainer = fields.content;\n\n expect(fields.nameField.value).to.equal('GCB1');\n expect(fields.descField.value).to.equal('GOOSE control 1');\n expect(fields.typeField.value).to.equal('GOOSE');\n expect(fields.appIDField.value).to.equal('APP1');\n expect(fields.fixedOffsField.value).to.equal('true');\n expect(fields.securityEnabledField.value).to.equal('None');\n });\n\n it('returns [] when no changes are made', async () => {\n const scl = createSclDoc();\n const element = scl.querySelector('GSEControl[name=\"GCB1\"]')!;\n const wizard = editGSEControlWizard(element);\n const fields = await renderContent(wizard);\n renderedContainer = fields.content;\n\n const edits = wizard.primary!.action(\n [\n fields.nameField,\n fields.descField,\n fields.typeField,\n fields.appIDField,\n fields.fixedOffsField,\n fields.securityEnabledField,\n ],\n renderedContainer!,\n ) as EditV2[];\n\n expect(edits).to.have.lengthOf(0);\n });\n\n it('returns SetAttributes with changed name', async () => {\n const scl = createSclDoc();\n const element = scl.querySelector('GSEControl[name=\"GCB1\"]')!;\n const wizard = editGSEControlWizard(element);\n const fields = await renderContent(wizard);\n renderedContainer = fields.content;\n\n fields.nameField.value = 'GCB_New';\n\n const edits = wizard.primary!.action(\n [\n fields.nameField,\n fields.descField,\n fields.typeField,\n fields.appIDField,\n fields.fixedOffsField,\n fields.securityEnabledField,\n ],\n renderedContainer!,\n ) as EditV2[];\n\n expect(edits).to.have.lengthOf(1);\n const edit = edits[0] as SetAttributes;\n expect(edit.element).to.equal(element);\n expect(edit.attributes!.name).to.equal('GCB_New');\n });\n\n it('applies changed name to the document', async () => {\n const scl = createSclDoc();\n const element = scl.querySelector('GSEControl[name=\"GCB1\"]')!;\n const wizard = editGSEControlWizard(element);\n const fields = await renderContent(wizard);\n renderedContainer = fields.content;\n\n fields.nameField.value = 'GCB_New';\n\n const edits = wizard.primary!.action(\n [\n fields.nameField,\n fields.descField,\n fields.typeField,\n fields.appIDField,\n fields.fixedOffsField,\n fields.securityEnabledField,\n ],\n renderedContainer!,\n ) as EditV2[];\n\n xmlEditor.commit(edits);\n expect(element.getAttribute('name')).to.equal('GCB_New');\n });\n\n it('handles nullable desc correctly — set to null removes attribute', async () => {\n const scl = createSclDoc();\n const element = scl.querySelector('GSEControl[name=\"GCB1\"]')!;\n expect(element.getAttribute('desc')).to.equal('GOOSE control 1');\n\n const wizard = editGSEControlWizard(element);\n const fields = await renderContent(wizard);\n renderedContainer = fields.content;\n\n // Set desc to null (cleared)\n fields.descField.value = null as unknown as string;\n\n const edits = wizard.primary!.action(\n [\n fields.nameField,\n fields.descField,\n fields.typeField,\n fields.appIDField,\n fields.fixedOffsField,\n fields.securityEnabledField,\n ],\n renderedContainer!,\n ) as EditV2[];\n\n expect(edits).to.have.lengthOf(1);\n const edit = edits[0] as SetAttributes;\n expect(edit.attributes!.desc).to.be.null;\n\n xmlEditor.commit(edits);\n expect(element.getAttribute('desc')).to.be.null;\n });\n\n it('handles element with minimal attributes (GCB2)', async () => {\n const scl = createSclDoc();\n const element = scl.querySelector('GSEControl[name=\"GCB2\"]')!;\n const wizard = editGSEControlWizard(element);\n const fields = await renderContent(wizard);\n renderedContainer = fields.content;\n\n expect(fields.nameField.value).to.equal('GCB2');\n expect(fields.descField.value).to.be.null;\n expect(fields.typeField.value).to.be.null;\n expect(fields.appIDField.value).to.equal('APP2');\n expect(fields.fixedOffsField.value).to.be.null;\n expect(fields.securityEnabledField.value).to.be.null;\n });\n\n it('populates reservedValues with sibling GSEControl names', () => {\n const scl = createSclDoc();\n const element = scl.querySelector('GSEControl[name=\"GCB1\"]')!;\n const wizard = editGSEControlWizard(element);\n\n // The first content item is the name field with reservedValues\n const nameTemplate = wizard.content![0];\n expect(nameTemplate).to.exist;\n\n // Verify via the wizard that GCB2 is in reserved names (sibling)\n // by trying to set name to GCB2 and checking the action still produces edits\n // (validation is on the field component, not on the action)\n });\n\n it('returns SetAttributes with changed type', async () => {\n const scl = createSclDoc();\n const element = scl.querySelector('GSEControl[name=\"GCB1\"]')!;\n const wizard = editGSEControlWizard(element);\n const fields = await renderContent(wizard);\n renderedContainer = fields.content;\n\n fields.typeField.value = 'GSSE';\n\n const edits = wizard.primary!.action(\n [\n fields.nameField,\n fields.descField,\n fields.typeField,\n fields.appIDField,\n fields.fixedOffsField,\n fields.securityEnabledField,\n ],\n renderedContainer!,\n ) as EditV2[];\n\n expect(edits).to.have.lengthOf(1);\n const edit = edits[0] as SetAttributes;\n expect(edit.attributes!.type).to.equal('GSSE');\n });\n});\n"]}
|
package/dist/wizards/lnode.d.ts
CHANGED
package/dist/wizards/lnode.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { html } from 'lit';
|
|
2
2
|
import { getReference, lnInstGenerator } from '@openscd/scl-lib';
|
|
3
|
-
import { createElement, } from '../foundation.js';
|
|
3
|
+
import { cloneElement, createElement, getChildElementsByTagName, getValue, } from '../foundation.js';
|
|
4
|
+
import { patterns } from './patterns.js';
|
|
4
5
|
// global variables
|
|
5
6
|
const selectedIEDs = [];
|
|
6
7
|
let isLogicalNodeInstance = true;
|
|
@@ -272,4 +273,103 @@ export function createLNodeWizard(parent) {
|
|
|
272
273
|
],
|
|
273
274
|
};
|
|
274
275
|
}
|
|
276
|
+
function contentLNodeWizard(options) {
|
|
277
|
+
const isIedRef = options.iedName !== 'None';
|
|
278
|
+
return [
|
|
279
|
+
html `<scl-text-field
|
|
280
|
+
label="iedName"
|
|
281
|
+
.value=${options.iedName}
|
|
282
|
+
helper="iedName"
|
|
283
|
+
disabled
|
|
284
|
+
></scl-text-field>`,
|
|
285
|
+
html `<scl-text-field
|
|
286
|
+
label="ldInst"
|
|
287
|
+
.value=${options.ldInst}
|
|
288
|
+
helper="ldInst"
|
|
289
|
+
nullable
|
|
290
|
+
disabled
|
|
291
|
+
></scl-text-field>`,
|
|
292
|
+
html `<scl-text-field
|
|
293
|
+
label="prefix"
|
|
294
|
+
.value=${options.prefix}
|
|
295
|
+
helper="prefix"
|
|
296
|
+
pattern="${patterns.normalizedString}"
|
|
297
|
+
maxLength="11"
|
|
298
|
+
nullable
|
|
299
|
+
?disabled=${isIedRef}
|
|
300
|
+
></scl-text-field>`,
|
|
301
|
+
html `<scl-text-field
|
|
302
|
+
label="lnClass"
|
|
303
|
+
.value=${options.lnClass}
|
|
304
|
+
helper="lnClass"
|
|
305
|
+
disabled
|
|
306
|
+
></scl-text-field>`,
|
|
307
|
+
html `<scl-text-field
|
|
308
|
+
label="lnInst"
|
|
309
|
+
.value=${options.lnInst}
|
|
310
|
+
helper="lnInst"
|
|
311
|
+
type="number"
|
|
312
|
+
min="1"
|
|
313
|
+
max="99"
|
|
314
|
+
.reservedValues=${options.reservedLnInst}
|
|
315
|
+
?disabled=${isIedRef}
|
|
316
|
+
></scl-text-field>`,
|
|
317
|
+
];
|
|
318
|
+
}
|
|
319
|
+
function updateLNodeAction(element) {
|
|
320
|
+
return (inputs) => {
|
|
321
|
+
const attributes = {};
|
|
322
|
+
const attributeKeys = ['iedName', 'ldInst', 'prefix', 'lnClass', 'lnInst'];
|
|
323
|
+
attributeKeys.forEach(key => {
|
|
324
|
+
attributes[key] = getValue(inputs.find(i => i.label === key));
|
|
325
|
+
});
|
|
326
|
+
if (attributeKeys.some(key => attributes[key] !== element.getAttribute(key))) {
|
|
327
|
+
const newElement = cloneElement(element, attributes);
|
|
328
|
+
const parent = element.parentElement ?? element.ownerDocument;
|
|
329
|
+
const nextSibling = element.nextSibling ?? null;
|
|
330
|
+
return [
|
|
331
|
+
{ node: element },
|
|
332
|
+
...(newElement
|
|
333
|
+
? [
|
|
334
|
+
{
|
|
335
|
+
node: newElement,
|
|
336
|
+
parent,
|
|
337
|
+
reference: nextSibling,
|
|
338
|
+
},
|
|
339
|
+
]
|
|
340
|
+
: []),
|
|
341
|
+
];
|
|
342
|
+
}
|
|
343
|
+
return [];
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
export function editLNodeWizard(element) {
|
|
347
|
+
const [iedName, ldInst, prefix, lnClass, lnInst] = [
|
|
348
|
+
'iedName',
|
|
349
|
+
'ldInst',
|
|
350
|
+
'prefix',
|
|
351
|
+
'lnClass',
|
|
352
|
+
'lnInst',
|
|
353
|
+
].map(attr => element.getAttribute(attr));
|
|
354
|
+
const reservedLnInst = getChildElementsByTagName(element.parentElement, 'LNode')
|
|
355
|
+
.filter(sibling => sibling !== element &&
|
|
356
|
+
sibling.getAttribute('lnClass') === element.getAttribute('lnClass'))
|
|
357
|
+
.map(sibling => sibling.getAttribute('lnInst'));
|
|
358
|
+
return {
|
|
359
|
+
title: 'LNode',
|
|
360
|
+
primary: {
|
|
361
|
+
label: 'Save',
|
|
362
|
+
icon: 'save',
|
|
363
|
+
action: updateLNodeAction(element),
|
|
364
|
+
},
|
|
365
|
+
content: contentLNodeWizard({
|
|
366
|
+
iedName,
|
|
367
|
+
ldInst,
|
|
368
|
+
prefix,
|
|
369
|
+
lnClass,
|
|
370
|
+
lnInst,
|
|
371
|
+
reservedLnInst,
|
|
372
|
+
}),
|
|
373
|
+
};
|
|
374
|
+
}
|
|
275
375
|
//# sourceMappingURL=lnode.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lnode.js","sourceRoot":"","sources":["../../wizards/lnode.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, TemplateResult } from 'lit';\n\nimport {\n SelectionList,\n SelectItem,\n} from '@openenergytools/filterable-lists/dist/SelectionList.js';\nimport { MdList } from '@scopedelement/material-web/list/MdList.js';\nimport { MdListItem } from '@scopedelement/material-web/list/MdListItem.js';\n\nimport { EditV2, Insert } from '@openscd/oscd-api';\n\nimport { getReference, lnInstGenerator } from '@openscd/scl-lib';\n\nimport {\n createElement,\n Wizard,\n WizardActor,\n WizardInputElement,\n} from '../foundation.js';\n\ntype LNodeCandidate = {\n anyLn: Element;\n existInScope: boolean;\n existOutOfScope: boolean;\n};\n\n// global variables\nconst selectedIEDs: Element[] = [];\nlet isLogicalNodeInstance = true;\nlet isIedListVisable = true;\n\nfunction lNodeItems(doc: XMLDocument): SelectItem[] {\n return Array.from(\n doc.querySelectorAll(':root > DataTypeTemplates > LNodeType'),\n ).map(lNodeType => {\n const lnClass = lNodeType.getAttribute('lnClass');\n const id = lNodeType.getAttribute('id');\n\n return {\n headline: `${lnClass}`,\n supportingText: `#${id}`,\n attachedElement: lNodeType,\n selected: false,\n disabled: false,\n };\n });\n}\n\nfunction anyLnAttrs(anyLn: Element): {\n prefix: string;\n lnClass: string;\n inst: string;\n iedName: string;\n ldInst: string;\n lnType: string;\n} {\n const prefix = anyLn.getAttribute('prefix') ?? '';\n const lnClass = anyLn.getAttribute('lnClass') ?? '';\n const inst = anyLn.getAttribute('inst') ?? '';\n const lnType = anyLn.getAttribute('lnType') ?? '';\n\n const iedName = anyLn.closest('IED')?.getAttribute('name') ?? '';\n const ldInst = anyLn.closest('LDevice')?.getAttribute('inst') ?? '';\n\n return { prefix, lnClass, inst, iedName, ldInst, lnType };\n}\n\nfunction createSelectedItem(lNode: LNodeCandidate): SelectItem {\n const { iedName, ldInst, prefix, lnClass, inst } = anyLnAttrs(lNode.anyLn);\n\n return {\n headline: `${prefix}${lnClass}${inst}`,\n supportingText: `${iedName} | ${ldInst}`,\n attachedElement: lNode.anyLn,\n selected: lNode.existInScope,\n disabled: lNode.existOutOfScope || lNode.existInScope,\n };\n}\n\nfunction compare(\n a: { anyLn: Element; existOutOfScope: boolean; existInScope: boolean },\n b: { anyLn: Element; existOutOfScope: boolean; existInScope: boolean },\n): number {\n if (a.existInScope !== b.existInScope) {\n return a.existInScope ? -1 : 1;\n }\n\n if (a.existOutOfScope !== b.existOutOfScope) {\n return b.existOutOfScope ? -1 : 1;\n }\n\n return 0;\n}\n\nfunction lNodeCandidates(parent: Element, anyLn: Element): LNodeCandidate {\n const { iedName, ldInst, prefix, lnClass, inst } = anyLnAttrs(anyLn);\n\n // const title = `${prefix}${lnClass}${inst}`;\n\n const lNode = Array.from(\n parent.closest('Substation')?.querySelectorAll('LNode') ?? [],\n ).find(child => {\n if (child.tagName !== 'LNode') {\n return false;\n }\n return (\n child.getAttribute('iedName') === iedName &&\n child.getAttribute('ldInst') === ldInst &&\n (child.getAttribute('prefix') ?? '') === prefix &&\n child.getAttribute('lnClass') === lnClass &&\n (child.getAttribute('lnInst') ?? '') === inst\n );\n });\n\n const existInScope = !!lNode && lNode.parentElement === parent;\n const existOutOfScope = !!lNode && lNode.parentElement !== parent;\n\n return { anyLn, existInScope, existOutOfScope };\n}\n\nfunction anyLnItems(parent: Element): SelectItem[] {\n const ldSelector = ':scope > AccessPoint > Server > LDevice';\n\n return selectedIEDs.flatMap(ied => {\n const anyLns = ied.querySelectorAll(\n `${ldSelector} > LN0, ${ldSelector} > LN`,\n )!;\n\n return Array.from(anyLns)\n .map(anyLn => lNodeCandidates(parent, anyLn))\n .sort(compare)\n .map(createSelectedItem);\n });\n}\n\nfunction lNodeList(target: HTMLElement): SelectionList {\n return target\n .closest('#createLNodeWizardContent')\n ?.querySelector('#lnList') as SelectionList;\n}\n\nfunction iedContainer(target: HTMLElement): Element {\n return target\n .closest('#createLNodeWizardContent')\n ?.querySelector('#iedContainer') as Element;\n}\n\nfunction showLogicalNodeTypes(evt: Event, parent: Element): void {\n isLogicalNodeInstance = !isLogicalNodeInstance;\n\n const target = evt.target as HTMLElement;\n\n if (isLogicalNodeInstance) {\n iedContainer(target).classList.remove('hidden');\n } else {\n iedContainer(target).classList.add('hidden');\n }\n\n const items = isLogicalNodeInstance\n ? anyLnItems(parent)\n : lNodeItems(parent.ownerDocument);\n\n lNodeList(target).items = []; // reset for better update performance\n lNodeList(target).items = items;\n}\n\nfunction addIED(evt: Event, ied: Element, sclParent: Element): void {\n const target = evt.target as HTMLElement;\n if (selectedIEDs.includes(ied)) {\n const index = selectedIEDs.indexOf(ied);\n selectedIEDs.splice(index, 1);\n // Updated list items\n (target.closest('md-list-item') as MdListItem).activated = false;\n } else {\n selectedIEDs.push(ied);\n // Updated list items\n (target.closest('md-list-item') as MdListItem).activated = true;\n }\n\n lNodeList(target).items = [];\n lNodeList(target).items = anyLnItems(sclParent);\n}\n\nfunction renderIEDItems(parent: Element): TemplateResult[] {\n const doc = parent.ownerDocument;\n\n return Array.from(doc.querySelectorAll(':root > IED')).map(ied => {\n const [iedName, manufacturer] = ['name', 'manufacturer'].map(value =>\n ied.getAttribute(value),\n );\n\n return html`<md-list-item\n .activated=${selectedIEDs.includes(ied)}\n type=\"button\"\n @click=\"${(evt: Event) => {\n addIED(evt, ied, parent);\n }}\"\n >\n <div slot=\"headline\">${iedName ?? 'unknown IED'}</div>\n <div slot=\"supporting-text\">\n ${manufacturer ?? 'unknown manufacturer'}\n </div>\n </md-list-item>`;\n });\n}\n\nfunction showIEdFilterList(evt: Event): void {\n isIedListVisable = !isIedListVisable;\n\n const ieds = (evt.target as HTMLElement)\n .closest('#createLNodeWizardContent')\n ?.querySelector('#iedList') as MdList;\n\n if (!isIedListVisable) {\n ieds.classList.remove('hidden');\n } else {\n ieds.classList.add('hidden');\n }\n}\n\nfunction createAction(parent: Element): WizardActor {\n function createSingleLNode(lNode: Element): Insert | null {\n if (lNode.tagName === 'LNodeType') {\n const lnClass = lNode.getAttribute('lnClass');\n if (!lnClass) {\n return null;\n }\n\n const lnType = lNode.getAttribute('id');\n const lnInst = lnInstGenerator(parent, 'LNode')(lnClass);\n if (!lnInst) {\n return null;\n }\n\n const node = createElement(parent.ownerDocument, 'LNode', {\n iedName: 'None',\n lnClass,\n lnInst,\n lnType,\n });\n\n return {\n parent,\n node,\n reference: getReference(parent, 'LNode'),\n };\n }\n\n const { iedName, ldInst, prefix, lnClass, inst, lnType } =\n anyLnAttrs(lNode);\n const node = createElement(parent.ownerDocument, 'LNode', {\n iedName,\n ldInst,\n prefix,\n lnClass,\n lnInst: inst,\n lnType,\n });\n\n return {\n parent,\n node,\n reference: getReference(parent, 'LNode'),\n };\n }\n\n return (_: WizardInputElement[], wizard: Element): EditV2[] => {\n const list = wizard.querySelector('#lnList') as SelectionList;\n\n const selectedLNs = list.items\n .filter(item => item.selected)\n .filter(item => !item.disabled)\n .map(item => item.attachedElement!);\n\n return selectedLNs\n .map(lNode => createSingleLNode(lNode))\n .filter(insert => insert) as Insert[];\n };\n}\n\nexport function createLNodeWizard(parent: Element): Wizard {\n // const iedNames = Array.from(parent.children)\n // .filter(child => child.tagName === 'LNode' && child.getAttribute('iedName'))\n // .map(lNode => lNode.getAttribute('iedName')!);\n\n return {\n title: 'Add LNode',\n primary: {\n icon: 'save',\n label: 'save',\n action: createAction(parent),\n },\n content: [\n html`<div id=\"createLNodeWizardContent\" style=\"min-height: fit-content;\">\n <style>\n .hidden {\n display: none;\n }\n </style>\n <div\n id=\"radioContainer\"\n style=\"display: flex; align-items: center; gap: 16px;\"\n >\n <label\n style=\"display: flex; align-items: center; cursor: pointer; font-size: 14px;\"\n >\n <input\n type=\"radio\"\n name=\"nodeType\"\n value=\"type\"\n style=\"margin-right: 8px; cursor: pointer;\"\n @change=\"${(evt: Event) => showLogicalNodeTypes(evt, parent)}\"\n checked\n />\n Logical Node Type\n </label>\n <label\n style=\"display: flex; align-items: center; cursor: pointer; font-size: 14px;\"\n >\n <input\n type=\"radio\"\n name=\"nodeType\"\n value=\"instance\"\n style=\"margin-right: 8px; cursor: pointer;\"\n @change=\"${(evt: Event) => showLogicalNodeTypes(evt, parent)}\"\n />\n Logical Node Instance\n </label>\n </div>\n <div style=\"display: flex; flex-direction: row;\">\n <div id=\"iedContainer\">\n s\n <div\n id=\"iedFilterButton\"\n tabindex=\"0\"\n style=\"cursor: pointer; display: flex; align-items: center; justify-content: center; padding: 4px; border: 1px solid #ccc; border-radius: 4px; margin-top: 20px;\"\n @click=\"${showIEdFilterList}\"\n @keydown=\"${(evt: KeyboardEvent) => {\n if (evt.key === 'Enter' || evt.key === ' ') {\n evt.preventDefault();\n showIEdFilterList(evt);\n }\n }}\"\n >\n <md-icon>filter_list</md-icon>\n </div>\n <md-list id=\"iedList\"> ${renderIEDItems(parent)} </md-list>\n </div>\n <selection-list\n id=\"lnList\"\n multi\n .items=${anyLnItems(parent)}\n filterable\n ></selection-list>\n </div>\n </div>`,\n ],\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"lnode.js","sourceRoot":"","sources":["../../wizards/lnode.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, TemplateResult } from 'lit';\n\nimport {\n SelectionList,\n SelectItem,\n} from '@openenergytools/filterable-lists/dist/SelectionList.js';\nimport { MdList } from '@scopedelement/material-web/list/MdList.js';\nimport { MdListItem } from '@scopedelement/material-web/list/MdListItem.js';\n\nimport { EditV2, Insert } from '@openscd/oscd-api';\n\nimport { getReference, lnInstGenerator } from '@openscd/scl-lib';\n\nimport {\n cloneElement,\n createElement,\n getChildElementsByTagName,\n getValue,\n Wizard,\n WizardActor,\n WizardInputElement,\n} from '../foundation.js';\nimport { patterns } from './patterns.js';\n\ntype LNodeCandidate = {\n anyLn: Element;\n existInScope: boolean;\n existOutOfScope: boolean;\n};\n\n// global variables\nconst selectedIEDs: Element[] = [];\nlet isLogicalNodeInstance = true;\nlet isIedListVisable = true;\n\nfunction lNodeItems(doc: XMLDocument): SelectItem[] {\n return Array.from(\n doc.querySelectorAll(':root > DataTypeTemplates > LNodeType'),\n ).map(lNodeType => {\n const lnClass = lNodeType.getAttribute('lnClass');\n const id = lNodeType.getAttribute('id');\n\n return {\n headline: `${lnClass}`,\n supportingText: `#${id}`,\n attachedElement: lNodeType,\n selected: false,\n disabled: false,\n };\n });\n}\n\nfunction anyLnAttrs(anyLn: Element): {\n prefix: string;\n lnClass: string;\n inst: string;\n iedName: string;\n ldInst: string;\n lnType: string;\n} {\n const prefix = anyLn.getAttribute('prefix') ?? '';\n const lnClass = anyLn.getAttribute('lnClass') ?? '';\n const inst = anyLn.getAttribute('inst') ?? '';\n const lnType = anyLn.getAttribute('lnType') ?? '';\n\n const iedName = anyLn.closest('IED')?.getAttribute('name') ?? '';\n const ldInst = anyLn.closest('LDevice')?.getAttribute('inst') ?? '';\n\n return { prefix, lnClass, inst, iedName, ldInst, lnType };\n}\n\nfunction createSelectedItem(lNode: LNodeCandidate): SelectItem {\n const { iedName, ldInst, prefix, lnClass, inst } = anyLnAttrs(lNode.anyLn);\n\n return {\n headline: `${prefix}${lnClass}${inst}`,\n supportingText: `${iedName} | ${ldInst}`,\n attachedElement: lNode.anyLn,\n selected: lNode.existInScope,\n disabled: lNode.existOutOfScope || lNode.existInScope,\n };\n}\n\nfunction compare(\n a: { anyLn: Element; existOutOfScope: boolean; existInScope: boolean },\n b: { anyLn: Element; existOutOfScope: boolean; existInScope: boolean },\n): number {\n if (a.existInScope !== b.existInScope) {\n return a.existInScope ? -1 : 1;\n }\n\n if (a.existOutOfScope !== b.existOutOfScope) {\n return b.existOutOfScope ? -1 : 1;\n }\n\n return 0;\n}\n\nfunction lNodeCandidates(parent: Element, anyLn: Element): LNodeCandidate {\n const { iedName, ldInst, prefix, lnClass, inst } = anyLnAttrs(anyLn);\n\n // const title = `${prefix}${lnClass}${inst}`;\n\n const lNode = Array.from(\n parent.closest('Substation')?.querySelectorAll('LNode') ?? [],\n ).find(child => {\n if (child.tagName !== 'LNode') {\n return false;\n }\n return (\n child.getAttribute('iedName') === iedName &&\n child.getAttribute('ldInst') === ldInst &&\n (child.getAttribute('prefix') ?? '') === prefix &&\n child.getAttribute('lnClass') === lnClass &&\n (child.getAttribute('lnInst') ?? '') === inst\n );\n });\n\n const existInScope = !!lNode && lNode.parentElement === parent;\n const existOutOfScope = !!lNode && lNode.parentElement !== parent;\n\n return { anyLn, existInScope, existOutOfScope };\n}\n\nfunction anyLnItems(parent: Element): SelectItem[] {\n const ldSelector = ':scope > AccessPoint > Server > LDevice';\n\n return selectedIEDs.flatMap(ied => {\n const anyLns = ied.querySelectorAll(\n `${ldSelector} > LN0, ${ldSelector} > LN`,\n )!;\n\n return Array.from(anyLns)\n .map(anyLn => lNodeCandidates(parent, anyLn))\n .sort(compare)\n .map(createSelectedItem);\n });\n}\n\nfunction lNodeList(target: HTMLElement): SelectionList {\n return target\n .closest('#createLNodeWizardContent')\n ?.querySelector('#lnList') as SelectionList;\n}\n\nfunction iedContainer(target: HTMLElement): Element {\n return target\n .closest('#createLNodeWizardContent')\n ?.querySelector('#iedContainer') as Element;\n}\n\nfunction showLogicalNodeTypes(evt: Event, parent: Element): void {\n isLogicalNodeInstance = !isLogicalNodeInstance;\n\n const target = evt.target as HTMLElement;\n\n if (isLogicalNodeInstance) {\n iedContainer(target).classList.remove('hidden');\n } else {\n iedContainer(target).classList.add('hidden');\n }\n\n const items = isLogicalNodeInstance\n ? anyLnItems(parent)\n : lNodeItems(parent.ownerDocument);\n\n lNodeList(target).items = []; // reset for better update performance\n lNodeList(target).items = items;\n}\n\nfunction addIED(evt: Event, ied: Element, sclParent: Element): void {\n const target = evt.target as HTMLElement;\n if (selectedIEDs.includes(ied)) {\n const index = selectedIEDs.indexOf(ied);\n selectedIEDs.splice(index, 1);\n // Updated list items\n (target.closest('md-list-item') as MdListItem).activated = false;\n } else {\n selectedIEDs.push(ied);\n // Updated list items\n (target.closest('md-list-item') as MdListItem).activated = true;\n }\n\n lNodeList(target).items = [];\n lNodeList(target).items = anyLnItems(sclParent);\n}\n\nfunction renderIEDItems(parent: Element): TemplateResult[] {\n const doc = parent.ownerDocument;\n\n return Array.from(doc.querySelectorAll(':root > IED')).map(ied => {\n const [iedName, manufacturer] = ['name', 'manufacturer'].map(value =>\n ied.getAttribute(value),\n );\n\n return html`<md-list-item\n .activated=${selectedIEDs.includes(ied)}\n type=\"button\"\n @click=\"${(evt: Event) => {\n addIED(evt, ied, parent);\n }}\"\n >\n <div slot=\"headline\">${iedName ?? 'unknown IED'}</div>\n <div slot=\"supporting-text\">\n ${manufacturer ?? 'unknown manufacturer'}\n </div>\n </md-list-item>`;\n });\n}\n\nfunction showIEdFilterList(evt: Event): void {\n isIedListVisable = !isIedListVisable;\n\n const ieds = (evt.target as HTMLElement)\n .closest('#createLNodeWizardContent')\n ?.querySelector('#iedList') as MdList;\n\n if (!isIedListVisable) {\n ieds.classList.remove('hidden');\n } else {\n ieds.classList.add('hidden');\n }\n}\n\nfunction createAction(parent: Element): WizardActor {\n function createSingleLNode(lNode: Element): Insert | null {\n if (lNode.tagName === 'LNodeType') {\n const lnClass = lNode.getAttribute('lnClass');\n if (!lnClass) {\n return null;\n }\n\n const lnType = lNode.getAttribute('id');\n const lnInst = lnInstGenerator(parent, 'LNode')(lnClass);\n if (!lnInst) {\n return null;\n }\n\n const node = createElement(parent.ownerDocument, 'LNode', {\n iedName: 'None',\n lnClass,\n lnInst,\n lnType,\n });\n\n return {\n parent,\n node,\n reference: getReference(parent, 'LNode'),\n };\n }\n\n const { iedName, ldInst, prefix, lnClass, inst, lnType } =\n anyLnAttrs(lNode);\n const node = createElement(parent.ownerDocument, 'LNode', {\n iedName,\n ldInst,\n prefix,\n lnClass,\n lnInst: inst,\n lnType,\n });\n\n return {\n parent,\n node,\n reference: getReference(parent, 'LNode'),\n };\n }\n\n return (_: WizardInputElement[], wizard: Element): EditV2[] => {\n const list = wizard.querySelector('#lnList') as SelectionList;\n\n const selectedLNs = list.items\n .filter(item => item.selected)\n .filter(item => !item.disabled)\n .map(item => item.attachedElement!);\n\n return selectedLNs\n .map(lNode => createSingleLNode(lNode))\n .filter(insert => insert) as Insert[];\n };\n}\n\nexport function createLNodeWizard(parent: Element): Wizard {\n // const iedNames = Array.from(parent.children)\n // .filter(child => child.tagName === 'LNode' && child.getAttribute('iedName'))\n // .map(lNode => lNode.getAttribute('iedName')!);\n\n return {\n title: 'Add LNode',\n primary: {\n icon: 'save',\n label: 'save',\n action: createAction(parent),\n },\n content: [\n html`<div id=\"createLNodeWizardContent\" style=\"min-height: fit-content;\">\n <style>\n .hidden {\n display: none;\n }\n </style>\n <div\n id=\"radioContainer\"\n style=\"display: flex; align-items: center; gap: 16px;\"\n >\n <label\n style=\"display: flex; align-items: center; cursor: pointer; font-size: 14px;\"\n >\n <input\n type=\"radio\"\n name=\"nodeType\"\n value=\"type\"\n style=\"margin-right: 8px; cursor: pointer;\"\n @change=\"${(evt: Event) => showLogicalNodeTypes(evt, parent)}\"\n checked\n />\n Logical Node Type\n </label>\n <label\n style=\"display: flex; align-items: center; cursor: pointer; font-size: 14px;\"\n >\n <input\n type=\"radio\"\n name=\"nodeType\"\n value=\"instance\"\n style=\"margin-right: 8px; cursor: pointer;\"\n @change=\"${(evt: Event) => showLogicalNodeTypes(evt, parent)}\"\n />\n Logical Node Instance\n </label>\n </div>\n <div style=\"display: flex; flex-direction: row;\">\n <div id=\"iedContainer\">\n s\n <div\n id=\"iedFilterButton\"\n tabindex=\"0\"\n style=\"cursor: pointer; display: flex; align-items: center; justify-content: center; padding: 4px; border: 1px solid #ccc; border-radius: 4px; margin-top: 20px;\"\n @click=\"${showIEdFilterList}\"\n @keydown=\"${(evt: KeyboardEvent) => {\n if (evt.key === 'Enter' || evt.key === ' ') {\n evt.preventDefault();\n showIEdFilterList(evt);\n }\n }}\"\n >\n <md-icon>filter_list</md-icon>\n </div>\n <md-list id=\"iedList\"> ${renderIEDItems(parent)} </md-list>\n </div>\n <selection-list\n id=\"lnList\"\n multi\n .items=${anyLnItems(parent)}\n filterable\n ></selection-list>\n </div>\n </div>`,\n ],\n };\n}\n\ninterface ContentOptions {\n iedName: string | null;\n ldInst: string | null;\n prefix: string | null;\n lnClass: string | null;\n lnInst: string | null;\n reservedLnInst: string[];\n}\n\nfunction contentLNodeWizard(options: ContentOptions): TemplateResult[] {\n const isIedRef = options.iedName !== 'None';\n\n return [\n html`<scl-text-field\n label=\"iedName\"\n .value=${options.iedName}\n helper=\"iedName\"\n disabled\n ></scl-text-field>`,\n html`<scl-text-field\n label=\"ldInst\"\n .value=${options.ldInst}\n helper=\"ldInst\"\n nullable\n disabled\n ></scl-text-field>`,\n html`<scl-text-field\n label=\"prefix\"\n .value=${options.prefix}\n helper=\"prefix\"\n pattern=\"${patterns.normalizedString}\"\n maxLength=\"11\"\n nullable\n ?disabled=${isIedRef}\n ></scl-text-field>`,\n html`<scl-text-field\n label=\"lnClass\"\n .value=${options.lnClass}\n helper=\"lnClass\"\n disabled\n ></scl-text-field>`,\n html`<scl-text-field\n label=\"lnInst\"\n .value=${options.lnInst}\n helper=\"lnInst\"\n type=\"number\"\n min=\"1\"\n max=\"99\"\n .reservedValues=${options.reservedLnInst}\n ?disabled=${isIedRef}\n ></scl-text-field>`,\n ];\n}\n\nfunction updateLNodeAction(element: Element): WizardActor {\n return (inputs: WizardInputElement[]): EditV2[] => {\n const attributes: Record<string, string | null> = {};\n const attributeKeys = ['iedName', 'ldInst', 'prefix', 'lnClass', 'lnInst'];\n\n attributeKeys.forEach(key => {\n attributes[key] = getValue(inputs.find(i => i.label === key)!);\n });\n\n if (\n attributeKeys.some(key => attributes[key] !== element.getAttribute(key))\n ) {\n const newElement = cloneElement(element, attributes);\n\n const parent = element.parentElement ?? element.ownerDocument;\n const nextSibling = element.nextSibling ?? null;\n\n return [\n { node: element },\n ...(newElement\n ? [\n {\n node: newElement,\n parent,\n reference: nextSibling,\n },\n ]\n : []),\n ] as EditV2[];\n }\n return [];\n };\n}\n\nexport function editLNodeWizard(element: Element): Wizard {\n const [iedName, ldInst, prefix, lnClass, lnInst] = [\n 'iedName',\n 'ldInst',\n 'prefix',\n 'lnClass',\n 'lnInst',\n ].map(attr => element.getAttribute(attr));\n\n const reservedLnInst = getChildElementsByTagName(\n element.parentElement,\n 'LNode',\n )\n .filter(\n sibling =>\n sibling !== element &&\n sibling.getAttribute('lnClass') === element.getAttribute('lnClass'),\n )\n .map(sibling => sibling.getAttribute('lnInst')!);\n\n return {\n title: 'LNode',\n primary: {\n label: 'Save',\n icon: 'save',\n action: updateLNodeAction(element),\n },\n content: contentLNodeWizard({\n iedName,\n ldInst,\n prefix,\n lnClass,\n lnInst,\n reservedLnInst,\n }),\n };\n}\n"]}
|
|
@@ -43,5 +43,7 @@ export declare const tSpecServiceType: string[];
|
|
|
43
43
|
export declare const tSCLFileType: string[];
|
|
44
44
|
export declare const tRightEnum: string[];
|
|
45
45
|
export declare const tSmpMod: string[];
|
|
46
|
+
export declare const tGSEControlType: string[];
|
|
47
|
+
export declare const tSecurityEnable: string[];
|
|
46
48
|
/** Patterns from IEC 61850-6 for all `P` elements */
|
|
47
49
|
export declare const typePattern: Partial<Record<string, string>>;
|
package/dist/wizards/patterns.js
CHANGED
|
@@ -132,6 +132,8 @@ export const tSpecServiceType = [
|
|
|
132
132
|
export const tSCLFileType = ['SED', 'SCC'];
|
|
133
133
|
export const tRightEnum = ['full', 'fix', 'dataflow'];
|
|
134
134
|
export const tSmpMod = ['SmpPerPeriod', 'SmpPerSec', 'SecPerSmp'];
|
|
135
|
+
export const tGSEControlType = ['GOOSE', 'GSSE'];
|
|
136
|
+
export const tSecurityEnable = ['None', 'Signature', 'SignatureAndEncryption'];
|
|
135
137
|
const typeBase = {
|
|
136
138
|
IP: '([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])',
|
|
137
139
|
OSI: '[0-9A-F]+',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../wizards/patterns.ts"],"names":[],"mappings":"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","sourcesContent":["const nameStartChar =\n '[:_A-Za-z]|[\\u00C0-\\u00D6]|[\\u00D8-\\u00F6]|[\\u00F8-\\u02FF]|[\\u0370-\\u037D]' +\n '|[\\u037F-\\u1FFF]|[\\u200C-\\u200D]|[\\u2070-\\u218F]|[\\u2C00-\\u2FEF]' +\n '|[\\u3001-\\uD7FF]|[\\uF900-\\uFDCF]|[\\uFDF0-\\uFFFD]';\nconst nameChar = `${nameStartChar}|[.0-9\\\\-]|\\u00B7|[\\u0300-\\u036F]|[\\u203F-\\u2040]`;\nconst name = `${nameStartChar}(${nameChar})*`;\nconst nmToken = `(${nameChar})+`;\n\nexport const patterns = {\n string:\n '([\\u0009-\\u000A]|[\\u000D]|[\\u0020-\\u007E]|[\\u0085]|[\\u00A0-\\uD7FF]' +\n '|[\\uE000-\\uFFFD])*',\n normalizedString:\n '([\\u0020-\\u007E]|[\\u0085]|[\\u00A0-\\uD7FF]|[\\uE000-\\uFFFD])*',\n name,\n tName:\n '([\\u0020-\\u007E]|[\\u0085]|[\\u00A0-\\uD7FF]|[\\uE000-\\uFFFD])' +\n '([\\u0020-\\u007E]|[\\u0085]|[\\u00A0-\\uD7FF]|[\\uE000-\\uFFFD])*',\n nmToken,\n names: `${name}( ${name})*`,\n nmTokens: `${nmToken}( ${nmToken})*`,\n decimal: '[+\\\\-]?[0-9]+(([.][0-9]*)?|([.][0-9]+))',\n unsigned: '[+]?[0-9]+(([.][0-9]*)?|([.][0-9]+))',\n integer: '[+\\\\-]?[0-9]+([0-9]*)',\n alphanumericFirstUpperCase: '[A-Z][0-9,A-Z,a-z]*',\n alphanumericFirstLowerCase: '[a-z][0-9,A-Z,a-z]*',\n alphanumericFirst: '[A-Z,a-z][0-9,A-Z,a-z]*',\n ldInst: '[A-Za-z0-9][0-9A-Za-z_]*',\n prefix: '[A-Za-z][0-9A-Za-z_]*',\n lnClass: '(LLN0)|[A-Z]{4,4}',\n lnInst: '[0-9]{1,12}',\n abstractDataAttributeName:\n '((T)|(Test)|(Check)|(SIUnit)|(Oper)|(SBO)|(SBOw)|(Cancel)|[a-z][0-9A-Za-z]*)',\n cdc:\n '(SPS)|(DPS)|(INS)|(ENS)|(ACT)|(ACD)|(SEC)|(BCR)|(HST)|(VSS)|(MV)|(CMV)|(SAV)|' +\n '(WYE)|(DEL)|(SEQ)|(HMV)|(HWYE)|(HDEL)|(SPC)|(DPC)|(INC)|(ENC)|(BSC)|(ISC)|(APC)|(BAC)|' +\n '(SPG)|(ING)|(ENG)|(ORG)|(TSG)|(CUG)|(VSG)|(ASG)|(CURVE)|(CSG)|(DPL)|(LPL)|(CSD)|(CST)|' +\n '(BTS)|(UTS)|(LTS)|(GTS)|(MTS)|(NTS)|(STS)|(CTS)|(OTS)|(VSD)',\n uuid: '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}',\n id: '\\\\S{1,255}',\n path: '.+(/.+)*',\n mappedDoName:\n '(([A-Za-z][0-9A-Za-z_]{0,63})/([A-Za-z][0-9A-Za-z_]{0,63})/((LLN0|([A-Za-z][0-9A-Za-z_]{0,10})?[A-Z]{4}[0-9]{1,12})).)?([A-Z][0-9A-Za-z]{0,11}(.[a-z][0-9A-Za-z]*(([0-9]+))?)?)',\n vlanid: '[0-9A-F]{3}',\n vlanPriority: '[0-7]',\n ipv4: '([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])',\n ipv6: '([0-9a-f]{1,4}:){7}[0-9a-f]{1,4}',\n};\n\nexport const maxLength = {\n cbName: 32,\n abstracDaName: 60,\n ldInst: 64,\n prefix: 11,\n lnInst: 12,\n dosName: 12,\n};\n\nexport const predefinedBasicTypeEnum = [\n 'BOOLEAN',\n 'INT8',\n 'INT16',\n 'INT24',\n 'INT32',\n 'INT64',\n 'INT128',\n 'INT8U',\n 'INT16U',\n 'INT24U',\n 'INT32U',\n 'FLOAT32',\n 'FLOAT64',\n 'Enum',\n 'Dbpos',\n 'Tcmd',\n 'Quality',\n 'Timestamp',\n 'VisString32',\n 'VisString64',\n 'VisString65',\n 'VisString129',\n 'VisString255',\n 'Octet64',\n 'Unicode255',\n 'Struct',\n 'EntryTime',\n 'Check',\n 'ObjRef',\n 'Currency',\n 'PhyComAddr',\n 'TrgOps',\n 'OptFlds',\n 'SvOptFlds',\n 'LogOptFlds',\n 'EntryID',\n 'Octet6',\n 'Octet16',\n];\n\nexport const valKindEnum = ['Spec', 'Conf', 'RO', 'Set'];\n\nexport const functionalConstraintEnum = [\n 'ST',\n 'MX',\n 'SP',\n 'SV',\n 'CF',\n 'DC',\n 'SG',\n 'SE',\n 'SR',\n 'OR',\n 'BL',\n 'EX',\n 'CO',\n];\n\nexport const attributeNameEnum = [\n 'T',\n 'Test',\n 'Check',\n 'SIUnit',\n 'Oper',\n 'SBO',\n 'SBOw',\n 'Cancel',\n 'Addr',\n 'PRIORITY',\n 'VID',\n 'APPID',\n 'TransportInUse',\n 'IPClassOfTraffic',\n 'IPv6FlowLabel',\n 'IPAddressLength',\n 'IPAddress',\n];\n\nexport const tSpecServiceType = [\n 'Poll',\n 'Report',\n 'GOOSE',\n 'SMV',\n 'Wired',\n 'Internal',\n];\n\nexport const tSCLFileType = ['SED', 'SCC'];\n\nexport const tRightEnum = ['full', 'fix', 'dataflow'];\n\nexport const tSmpMod = ['SmpPerPeriod', 'SmpPerSec', 'SecPerSmp'];\n\nconst typeBase = {\n IP: '([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])',\n OSI: '[0-9A-F]+',\n OSId: '[0-9]+',\n OSIAPi: '[0-9\\u002C]+',\n MAC: '([0-9A-F]{2}-){5}[0-9A-F]{2}',\n APPID: '[0-9A-F]{4}',\n VLANp: '[0-7]',\n VLANid: '[0-9A-F]{3}',\n port: '0|([1-9][0-9]{0,3})|([1-5][0-9]{4,4})|(6[0-4][0-9]{3,3})|(65[0-4][0-9]{2,2})|(655[0-2][0-9])|(6553[0-5])',\n IPv6: '([0-9a-f]{1,4}:){7}[0-9a-f]{1,4}',\n IPv6sub: '/[1-9]|/[1-9][0-9]|/1[0-1][0-9]|/12[0-7]',\n};\n\n/** Patterns from IEC 61850-6 for all `P` elements */\nexport const typePattern: Partial<Record<string, string>> = {\n IP: typeBase.IP,\n 'IP-SUBNET': typeBase.IP,\n 'IP-GATEWAY': typeBase.IP,\n 'OSI-TSEL': typeBase.OSI,\n 'OSI-SSEL': typeBase.OSI,\n 'OSI-PSEL': typeBase.OSI,\n 'OSI-AP-Title': typeBase.OSIAPi,\n 'OSI-AP-Invoke': typeBase.OSId,\n 'OSI-AE-Qualifier': typeBase.OSId,\n 'OSI-AE-Invoke': typeBase.OSId,\n 'MAC-Address': typeBase.MAC,\n APPID: typeBase.APPID,\n 'VLAN-ID': typeBase.VLANid,\n 'VLAN-PRIORITY': typeBase.VLANp,\n 'OSI-NSAP': typeBase.OSI,\n 'SNTP-Port': typeBase.port,\n 'MMS-Port': typeBase.port,\n DNSName: '[^ ]*',\n 'UDP-Port': typeBase.port,\n 'TCP-Port': typeBase.port,\n 'C37-118-IP-Port':\n '102[5-9]|10[3-9][0-9]|1[1-9][0-9][0-9]|[2-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]',\n IPv6: typeBase.IPv6,\n 'IPv6-SUBNET': typeBase.IPv6sub,\n 'IPv6-GATEWAY': typeBase.IPv6,\n IPv6FlowLabel: '[0-9a-fA-F]{1,5}',\n IPv6ClassOfTraffic: '[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]',\n 'IPv6-IGMPv3Src': typeBase.IPv6,\n 'IP-IGMPv3Sr': typeBase.IP,\n 'IP-ClassOfTraffic': typeBase.OSI,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../wizards/patterns.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GACjB,4EAA4E;IAC5E,kEAAkE;IAClE,kDAAkD,CAAC;AACrD,MAAM,QAAQ,GAAG,GAAG,aAAa,mDAAmD,CAAC;AACrF,MAAM,IAAI,GAAG,GAAG,aAAa,IAAI,QAAQ,IAAI,CAAC;AAC9C,MAAM,OAAO,GAAG,IAAI,QAAQ,IAAI,CAAC;AAEjC,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,MAAM,EACJ,oEAAoE;QACpE,oBAAoB;IACtB,gBAAgB,EACd,6DAA6D;IAC/D,IAAI;IACJ,KAAK,EACH,4DAA4D;QAC5D,6DAA6D;IAC/D,OAAO;IACP,KAAK,EAAE,GAAG,IAAI,KAAK,IAAI,IAAI;IAC3B,QAAQ,EAAE,GAAG,OAAO,KAAK,OAAO,IAAI;IACpC,OAAO,EAAE,yCAAyC;IAClD,QAAQ,EAAE,sCAAsC;IAChD,OAAO,EAAE,uBAAuB;IAChC,0BAA0B,EAAE,qBAAqB;IACjD,0BAA0B,EAAE,qBAAqB;IACjD,iBAAiB,EAAE,yBAAyB;IAC5C,MAAM,EAAE,0BAA0B;IAClC,MAAM,EAAE,uBAAuB;IAC/B,OAAO,EAAE,mBAAmB;IAC5B,MAAM,EAAE,aAAa;IACrB,yBAAyB,EACvB,8EAA8E;IAChF,GAAG,EACD,+EAA+E;QAC/E,wFAAwF;QACxF,wFAAwF;QACxF,6DAA6D;IAC/D,IAAI,EAAE,8DAA8D;IACpE,EAAE,EAAE,YAAY;IAChB,IAAI,EAAE,UAAU;IAChB,YAAY,EACV,iLAAiL;IACnL,MAAM,EAAE,aAAa;IACrB,YAAY,EAAE,OAAO;IACrB,IAAI,EAAE,6KAA6K;IACnL,IAAI,EAAE,kCAAkC;CACzC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,MAAM,EAAE,EAAE;IACV,aAAa,EAAE,EAAE;IACjB,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,SAAS;IACT,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,SAAS;IACT,MAAM;IACN,OAAO;IACP,MAAM;IACN,SAAS;IACT,WAAW;IACX,aAAa;IACb,aAAa;IACb,aAAa;IACb,cAAc;IACd,cAAc;IACd,SAAS;IACT,YAAY;IACZ,QAAQ;IACR,WAAW;IACX,OAAO;IACP,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,QAAQ;IACR,SAAS;IACT,WAAW;IACX,YAAY;IACZ,SAAS;IACT,QAAQ;IACR,SAAS;CACV,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAEzD,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;CACL,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,GAAG;IACH,MAAM;IACN,OAAO;IACP,QAAQ;IACR,MAAM;IACN,KAAK;IACL,MAAM;IACN,QAAQ;IACR,MAAM;IACN,UAAU;IACV,KAAK;IACL,OAAO;IACP,gBAAgB;IAChB,kBAAkB;IAClB,eAAe;IACf,iBAAiB;IACjB,WAAW;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM;IACN,QAAQ;IACR,OAAO;IACP,KAAK;IACL,OAAO;IACP,UAAU;CACX,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAE3C,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;AAEtD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,cAAc,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;AAElE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAEjD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,wBAAwB,CAAC,CAAC;AAE/E,MAAM,QAAQ,GAAG;IACf,EAAE,EAAE,mLAAmL;IACvL,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,cAAc;IACtB,GAAG,EAAE,8BAA8B;IACnC,KAAK,EAAE,aAAa;IACpB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,aAAa;IACrB,IAAI,EAAE,0GAA0G;IAChH,IAAI,EAAE,kCAAkC;IACxC,OAAO,EAAE,0CAA0C;CACpD,CAAC;AAEF,qDAAqD;AACrD,MAAM,CAAC,MAAM,WAAW,GAAoC;IAC1D,EAAE,EAAE,QAAQ,CAAC,EAAE;IACf,WAAW,EAAE,QAAQ,CAAC,EAAE;IACxB,YAAY,EAAE,QAAQ,CAAC,EAAE;IACzB,UAAU,EAAE,QAAQ,CAAC,GAAG;IACxB,UAAU,EAAE,QAAQ,CAAC,GAAG;IACxB,UAAU,EAAE,QAAQ,CAAC,GAAG;IACxB,cAAc,EAAE,QAAQ,CAAC,MAAM;IAC/B,eAAe,EAAE,QAAQ,CAAC,IAAI;IAC9B,kBAAkB,EAAE,QAAQ,CAAC,IAAI;IACjC,eAAe,EAAE,QAAQ,CAAC,IAAI;IAC9B,aAAa,EAAE,QAAQ,CAAC,GAAG;IAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;IACrB,SAAS,EAAE,QAAQ,CAAC,MAAM;IAC1B,eAAe,EAAE,QAAQ,CAAC,KAAK;IAC/B,UAAU,EAAE,QAAQ,CAAC,GAAG;IACxB,WAAW,EAAE,QAAQ,CAAC,IAAI;IAC1B,UAAU,EAAE,QAAQ,CAAC,IAAI;IACzB,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,QAAQ,CAAC,IAAI;IACzB,UAAU,EAAE,QAAQ,CAAC,IAAI;IACzB,iBAAiB,EACf,2HAA2H;IAC7H,IAAI,EAAE,QAAQ,CAAC,IAAI;IACnB,aAAa,EAAE,QAAQ,CAAC,OAAO;IAC/B,cAAc,EAAE,QAAQ,CAAC,IAAI;IAC7B,aAAa,EAAE,kBAAkB;IACjC,kBAAkB,EAAE,gDAAgD;IACpE,gBAAgB,EAAE,QAAQ,CAAC,IAAI;IAC/B,aAAa,EAAE,QAAQ,CAAC,EAAE;IAC1B,mBAAmB,EAAE,QAAQ,CAAC,GAAG;CAClC,CAAC","sourcesContent":["const nameStartChar =\n '[:_A-Za-z]|[\\u00C0-\\u00D6]|[\\u00D8-\\u00F6]|[\\u00F8-\\u02FF]|[\\u0370-\\u037D]' +\n '|[\\u037F-\\u1FFF]|[\\u200C-\\u200D]|[\\u2070-\\u218F]|[\\u2C00-\\u2FEF]' +\n '|[\\u3001-\\uD7FF]|[\\uF900-\\uFDCF]|[\\uFDF0-\\uFFFD]';\nconst nameChar = `${nameStartChar}|[.0-9\\\\-]|\\u00B7|[\\u0300-\\u036F]|[\\u203F-\\u2040]`;\nconst name = `${nameStartChar}(${nameChar})*`;\nconst nmToken = `(${nameChar})+`;\n\nexport const patterns = {\n string:\n '([\\u0009-\\u000A]|[\\u000D]|[\\u0020-\\u007E]|[\\u0085]|[\\u00A0-\\uD7FF]' +\n '|[\\uE000-\\uFFFD])*',\n normalizedString:\n '([\\u0020-\\u007E]|[\\u0085]|[\\u00A0-\\uD7FF]|[\\uE000-\\uFFFD])*',\n name,\n tName:\n '([\\u0020-\\u007E]|[\\u0085]|[\\u00A0-\\uD7FF]|[\\uE000-\\uFFFD])' +\n '([\\u0020-\\u007E]|[\\u0085]|[\\u00A0-\\uD7FF]|[\\uE000-\\uFFFD])*',\n nmToken,\n names: `${name}( ${name})*`,\n nmTokens: `${nmToken}( ${nmToken})*`,\n decimal: '[+\\\\-]?[0-9]+(([.][0-9]*)?|([.][0-9]+))',\n unsigned: '[+]?[0-9]+(([.][0-9]*)?|([.][0-9]+))',\n integer: '[+\\\\-]?[0-9]+([0-9]*)',\n alphanumericFirstUpperCase: '[A-Z][0-9,A-Z,a-z]*',\n alphanumericFirstLowerCase: '[a-z][0-9,A-Z,a-z]*',\n alphanumericFirst: '[A-Z,a-z][0-9,A-Z,a-z]*',\n ldInst: '[A-Za-z0-9][0-9A-Za-z_]*',\n prefix: '[A-Za-z][0-9A-Za-z_]*',\n lnClass: '(LLN0)|[A-Z]{4,4}',\n lnInst: '[0-9]{1,12}',\n abstractDataAttributeName:\n '((T)|(Test)|(Check)|(SIUnit)|(Oper)|(SBO)|(SBOw)|(Cancel)|[a-z][0-9A-Za-z]*)',\n cdc:\n '(SPS)|(DPS)|(INS)|(ENS)|(ACT)|(ACD)|(SEC)|(BCR)|(HST)|(VSS)|(MV)|(CMV)|(SAV)|' +\n '(WYE)|(DEL)|(SEQ)|(HMV)|(HWYE)|(HDEL)|(SPC)|(DPC)|(INC)|(ENC)|(BSC)|(ISC)|(APC)|(BAC)|' +\n '(SPG)|(ING)|(ENG)|(ORG)|(TSG)|(CUG)|(VSG)|(ASG)|(CURVE)|(CSG)|(DPL)|(LPL)|(CSD)|(CST)|' +\n '(BTS)|(UTS)|(LTS)|(GTS)|(MTS)|(NTS)|(STS)|(CTS)|(OTS)|(VSD)',\n uuid: '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}',\n id: '\\\\S{1,255}',\n path: '.+(/.+)*',\n mappedDoName:\n '(([A-Za-z][0-9A-Za-z_]{0,63})/([A-Za-z][0-9A-Za-z_]{0,63})/((LLN0|([A-Za-z][0-9A-Za-z_]{0,10})?[A-Z]{4}[0-9]{1,12})).)?([A-Z][0-9A-Za-z]{0,11}(.[a-z][0-9A-Za-z]*(([0-9]+))?)?)',\n vlanid: '[0-9A-F]{3}',\n vlanPriority: '[0-7]',\n ipv4: '([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5]).([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])',\n ipv6: '([0-9a-f]{1,4}:){7}[0-9a-f]{1,4}',\n};\n\nexport const maxLength = {\n cbName: 32,\n abstracDaName: 60,\n ldInst: 64,\n prefix: 11,\n lnInst: 12,\n dosName: 12,\n};\n\nexport const predefinedBasicTypeEnum = [\n 'BOOLEAN',\n 'INT8',\n 'INT16',\n 'INT24',\n 'INT32',\n 'INT64',\n 'INT128',\n 'INT8U',\n 'INT16U',\n 'INT24U',\n 'INT32U',\n 'FLOAT32',\n 'FLOAT64',\n 'Enum',\n 'Dbpos',\n 'Tcmd',\n 'Quality',\n 'Timestamp',\n 'VisString32',\n 'VisString64',\n 'VisString65',\n 'VisString129',\n 'VisString255',\n 'Octet64',\n 'Unicode255',\n 'Struct',\n 'EntryTime',\n 'Check',\n 'ObjRef',\n 'Currency',\n 'PhyComAddr',\n 'TrgOps',\n 'OptFlds',\n 'SvOptFlds',\n 'LogOptFlds',\n 'EntryID',\n 'Octet6',\n 'Octet16',\n];\n\nexport const valKindEnum = ['Spec', 'Conf', 'RO', 'Set'];\n\nexport const functionalConstraintEnum = [\n 'ST',\n 'MX',\n 'SP',\n 'SV',\n 'CF',\n 'DC',\n 'SG',\n 'SE',\n 'SR',\n 'OR',\n 'BL',\n 'EX',\n 'CO',\n];\n\nexport const attributeNameEnum = [\n 'T',\n 'Test',\n 'Check',\n 'SIUnit',\n 'Oper',\n 'SBO',\n 'SBOw',\n 'Cancel',\n 'Addr',\n 'PRIORITY',\n 'VID',\n 'APPID',\n 'TransportInUse',\n 'IPClassOfTraffic',\n 'IPv6FlowLabel',\n 'IPAddressLength',\n 'IPAddress',\n];\n\nexport const tSpecServiceType = [\n 'Poll',\n 'Report',\n 'GOOSE',\n 'SMV',\n 'Wired',\n 'Internal',\n];\n\nexport const tSCLFileType = ['SED', 'SCC'];\n\nexport const tRightEnum = ['full', 'fix', 'dataflow'];\n\nexport const tSmpMod = ['SmpPerPeriod', 'SmpPerSec', 'SecPerSmp'];\n\nexport const tGSEControlType = ['GOOSE', 'GSSE'];\n\nexport const tSecurityEnable = ['None', 'Signature', 'SignatureAndEncryption'];\n\nconst typeBase = {\n IP: '([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])',\n OSI: '[0-9A-F]+',\n OSId: '[0-9]+',\n OSIAPi: '[0-9\\u002C]+',\n MAC: '([0-9A-F]{2}-){5}[0-9A-F]{2}',\n APPID: '[0-9A-F]{4}',\n VLANp: '[0-7]',\n VLANid: '[0-9A-F]{3}',\n port: '0|([1-9][0-9]{0,3})|([1-5][0-9]{4,4})|(6[0-4][0-9]{3,3})|(65[0-4][0-9]{2,2})|(655[0-2][0-9])|(6553[0-5])',\n IPv6: '([0-9a-f]{1,4}:){7}[0-9a-f]{1,4}',\n IPv6sub: '/[1-9]|/[1-9][0-9]|/1[0-1][0-9]|/12[0-7]',\n};\n\n/** Patterns from IEC 61850-6 for all `P` elements */\nexport const typePattern: Partial<Record<string, string>> = {\n IP: typeBase.IP,\n 'IP-SUBNET': typeBase.IP,\n 'IP-GATEWAY': typeBase.IP,\n 'OSI-TSEL': typeBase.OSI,\n 'OSI-SSEL': typeBase.OSI,\n 'OSI-PSEL': typeBase.OSI,\n 'OSI-AP-Title': typeBase.OSIAPi,\n 'OSI-AP-Invoke': typeBase.OSId,\n 'OSI-AE-Qualifier': typeBase.OSId,\n 'OSI-AE-Invoke': typeBase.OSId,\n 'MAC-Address': typeBase.MAC,\n APPID: typeBase.APPID,\n 'VLAN-ID': typeBase.VLANid,\n 'VLAN-PRIORITY': typeBase.VLANp,\n 'OSI-NSAP': typeBase.OSI,\n 'SNTP-Port': typeBase.port,\n 'MMS-Port': typeBase.port,\n DNSName: '[^ ]*',\n 'UDP-Port': typeBase.port,\n 'TCP-Port': typeBase.port,\n 'C37-118-IP-Port':\n '102[5-9]|10[3-9][0-9]|1[1-9][0-9][0-9]|[2-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]',\n IPv6: typeBase.IPv6,\n 'IPv6-SUBNET': typeBase.IPv6sub,\n 'IPv6-GATEWAY': typeBase.IPv6,\n IPv6FlowLabel: '[0-9a-fA-F]{1,5}',\n IPv6ClassOfTraffic: '[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]',\n 'IPv6-IGMPv3Src': typeBase.IPv6,\n 'IP-IGMPv3Sr': typeBase.IP,\n 'IP-ClassOfTraffic': typeBase.OSI,\n};\n"]}
|