@omicronenergy/oscd-scl-dialogs 0.0.7 → 0.0.8
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 +7 -0
- package/README.md +123 -1
- package/custom-elements.json +409 -80
- package/dist/OscdSclDialogs.d.ts +21 -3
- package/dist/OscdSclDialogs.js +129 -9
- package/dist/OscdSclDialogs.js.map +1 -1
- package/dist/OscdTextEditor.d.ts +41 -0
- package/dist/OscdTextEditor.js +222 -0
- package/dist/OscdTextEditor.js.map +1 -0
- package/dist/scripts/update-readme.js +28 -5
- package/dist/scripts/update-readme.js.map +1 -1
- package/dist/wizards/ldevice.js +4 -2
- package/dist/wizards/ldevice.js.map +1 -1
- package/dist/wizards/ln0.js +2 -2
- package/dist/wizards/ln0.js.map +1 -1
- package/package.json +31 -22
- package/dist/demo/demo-editor-plugin.d.ts +0 -18
- package/dist/demo/demo-editor-plugin.js +0 -199
- package/dist/demo/demo-editor-plugin.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OscdTextEditor.js","sourceRoot":"","sources":["../OscdTextEditor.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, css, type PropertyValueMap } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements/lit-element.js';\nimport type * as AceGlobal from 'ace-builds';\nimport 'ace-builds/src-noconflict/ace.js';\nimport 'ace-builds/src-noconflict/theme-sqlserver.js';\nimport 'ace-builds/src-noconflict/mode-xml.js';\nimport 'ace-builds/src-noconflict/ext-searchbox.js';\nimport AceEditor from 'ace-custom-element';\nimport { EditV2 } from '@openscd/oscd-api';\n\ndeclare global {\n interface Window {\n ace: typeof AceGlobal;\n }\n}\n\nconst serializer = new XMLSerializer();\nconst parser = new DOMParser();\n\nconst ACE_DEFAULT_OPTIONS = {\n fontSize: '14',\n theme: 'ace/theme/sqlserver',\n mode: 'ace/mode/xml',\n};\nconst storageKey = 'oscd:ace-options';\n\nconst getStoredAceOptions = (): Omit<\n Partial<AceGlobal.Ace.EditorOptions>,\n 'theme' | 'mode'\n> &\n Pick<AceGlobal.Ace.EditorOptions, 'theme' | 'mode'> => {\n try {\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n return {\n ...ACE_DEFAULT_OPTIONS,\n ...JSON.parse(stored),\n };\n }\n } catch (error) {\n console.warn('Failed to retrieve Ace options from storage:', error);\n }\n return ACE_DEFAULT_OPTIONS;\n};\n\nlet aceOptions = getStoredAceOptions();\n\nfunction manageAceOptionChange(editor: AceGlobal.Ace.Editor) {\n editor.setOptions(aceOptions);\n\n const originalSetOption = editor.setOption.bind(editor);\n const originalSetOptions = editor.setOptions.bind(editor);\n const persistOptions = () => {\n try {\n aceOptions = {\n ...ACE_DEFAULT_OPTIONS,\n ...editor.getOptions(),\n };\n localStorage.setItem(storageKey, JSON.stringify(aceOptions));\n } catch (error) {\n console.warn('Failed to store Ace options:', error);\n }\n };\n\n editor.setOption = (name: string, value: unknown) => {\n originalSetOption(\n name as keyof AceGlobal.Ace.EditorOptions,\n value as never,\n );\n persistOptions();\n };\n\n editor.setOptions = (options: Partial<AceGlobal.Ace.EditorOptions>) => {\n originalSetOptions(options);\n persistOptions();\n };\n}\n\nexport function parseXml(xml: string): XMLDocument {\n const parsed = parser.parseFromString(xml, 'application/xml');\n const parseError = parsed.querySelector('parsererror');\n if (parseError) {\n const error = new Error(parseError.textContent ?? 'Invalid XML');\n console.error('XML Parsing Error:', error);\n }\n return parsed;\n}\n\nexport function serializeXml(xml: XMLDocument | Element): string {\n return serializer.serializeToString(xml);\n}\n\nexport function formatXml(\n rawXml: string | undefined,\n initialIndent: string = '',\n): string {\n if (!rawXml) {\n return '';\n }\n\n // Trim leading and trailing whitespace to avoid injecting extra < or >\n const xml = rawXml.trim();\n\n let formatted = '';\n let indent = '';\n\n const tab = '\\t';\n const nodes = xml.split(/>\\s*</);\n nodes.forEach(function (node, index) {\n // Remove leading < from first node and trailing > from last node. Allow for selection leading or trailing whitespace.\n if (index === 0) {\n node = node.replace(/^\\s*</, '');\n }\n if (index === nodes.length - 1) {\n node = node.replace(/>\\s*$/, '');\n }\n\n if (node.match(/^\\/\\w/)) {\n indent = indent.substring(tab!.length);\n }\n formatted += initialIndent + indent + '<' + node + '>\\r\\n';\n if (node.match(/^<?\\w[^>]*[^/]$/)) {\n indent += tab;\n }\n });\n\n return formatted.trim();\n}\n\nexport function newOscdTextEditV2({\n element,\n newText,\n}: {\n element: Element;\n newText: string;\n}): EditV2[] | null {\n let newDoc: XMLDocument | null = null;\n try {\n newDoc = newText ? parseXml(newText) : null;\n } catch (error) {\n console.error('Failed to parse XML:', error);\n return null;\n }\n if (element) {\n // get the parent and if we don't have a parent, use the documentElement\n const parent = element.parentElement ?? element.ownerDocument;\n const nextSibling = element.nextSibling ?? null;\n const newElement = newDoc\n ? element.ownerDocument.importNode(newDoc?.documentElement, true)\n : 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 null;\n}\n\nclass BaseElement extends ScopedElementsMixin(LitElement) {}\n\n/**\n * Intent is to keep this generic so it can be migrated to oscd-ui.\n */\nexport default class OscdTextEditor extends BaseElement {\n static scopedElements = {\n 'ace-editor': AceEditor,\n };\n\n @property()\n value: string | undefined;\n\n @query('ace-editor')\n aceEditor!: AceEditor;\n\n public format() {\n const rawXml =\n this.aceEditor?.editor?.getSelectedText() || this.aceEditor.value;\n\n let initialIndent = '';\n if (this.aceEditor?.editor?.getSelectedText()) {\n const range = this.aceEditor.editor.getSelectionRange();\n // Get the starting line of the selection and detect its leading whitespace\n const startLine = range.start.row;\n const lineContent = this.aceEditor.editor.session.getLine(startLine);\n initialIndent = lineContent.match(/^(\\s*)/)?.[1] || '';\n }\n\n const formatted = formatXml(rawXml, initialIndent);\n if (this.aceEditor?.editor?.getSelectedText()) {\n const range = this.aceEditor.editor.getSelectionRange();\n // Remove the trailing \\r\\n\n this.aceEditor.editor.session.replace(\n range,\n formatted.substring(0, formatted.length - 2),\n );\n } else {\n this.value = formatted;\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n window.ace?.config?.addEventListener?.('editor', manageAceOptionChange);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n window.ace?.config?.removeEventListener?.('editor', manageAceOptionChange);\n }\n\n private handleAceChange(e: CustomEvent<string>): void {\n if (typeof e.detail !== 'string') {\n return;\n }\n\n if (this.value !== e.detail) {\n this.dispatchEvent(\n new CustomEvent('change', {\n detail: e.detail,\n }),\n );\n }\n }\n\n protected updated(changedProps: PropertyValueMap<OscdTextEditor>): void {\n if (changedProps.has('value')) {\n // Clear selection when content updates\n setTimeout(() => {\n if (this.aceEditor?.editor) {\n /* For reasons unknown the ace editor initially selects all code, so we need to clear that*/\n this.aceEditor.editor.selection.clearSelection();\n this.aceEditor.editor.moveCursorTo(0, 0);\n }\n }, 10);\n }\n }\n\n render() {\n return html`\n <ace-editor\n .value=${this.value}\n mode=${aceOptions.mode}\n theme=${aceOptions.theme}\n @change=${(e: CustomEvent<string>) => {\n this.handleAceChange(e);\n }}\n >\n </ace-editor>\n `;\n }\n\n static styles = css`\n :host {\n height: 100%;\n width: 100%;\n overflow: auto;\n }\n\n ace-editor {\n height: 100%;\n width: 100%;\n }\n `;\n}\n"]}
|
|
@@ -1,12 +1,35 @@
|
|
|
1
1
|
import { readFileSync, writeFileSync } from 'fs';
|
|
2
|
-
import { emptyWizard, wizards } from '../wizards/wizards.js';
|
|
3
2
|
/*
|
|
4
|
-
* This
|
|
5
|
-
*
|
|
3
|
+
* This script generates the README.md file from a template. It is used to create a support table for the wizards.
|
|
4
|
+
*
|
|
5
|
+
* The DOMParser and fetch are mocked to allow importing the wizards without
|
|
6
|
+
* errors in a Node.js environment. If this offends your eyes - squint & scroll.
|
|
6
7
|
*/
|
|
8
|
+
class DocumentStub {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.documentElement = { nodeName: 'root' };
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
class MockDOMParser {
|
|
14
|
+
// eslint-disable-next-line class-methods-use-this
|
|
15
|
+
parseFromString(_s, _type) {
|
|
16
|
+
return new DocumentStub(); // return anything non-null
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
20
|
+
globalThis.DOMParser = MockDOMParser;
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
22
|
+
globalThis.fetch = async () => ({
|
|
23
|
+
ok: true,
|
|
24
|
+
status: 200,
|
|
25
|
+
json: async () => ({}),
|
|
26
|
+
text: async () => '{}',
|
|
27
|
+
});
|
|
7
28
|
const supported = '✅';
|
|
8
29
|
const notSupported = '❌';
|
|
9
30
|
async function generateSupportTable() {
|
|
31
|
+
// Dynamically import the wizards to avoid issues with DOMParser and fetch in Node.js
|
|
32
|
+
const { wizards, emptyWizard } = await import('../wizards/wizards.js');
|
|
10
33
|
let table = '| Tag Name | Supports Create | Supports Edit |\n';
|
|
11
34
|
table += '|-------------|----------------|----------------|\n';
|
|
12
35
|
for (const [key, value] of Object.entries(wizards)) {
|
|
@@ -17,10 +40,10 @@ async function generateSupportTable() {
|
|
|
17
40
|
return table;
|
|
18
41
|
}
|
|
19
42
|
async function main() {
|
|
20
|
-
const template = readFileSync('./README.template.md', 'utf-8');
|
|
43
|
+
const template = readFileSync('./scripts/README.template.md', 'utf-8');
|
|
21
44
|
const statusTable = await generateSupportTable();
|
|
22
45
|
const output = template.replace('<!-- STATUS_TABLE -->', statusTable);
|
|
23
|
-
writeFileSync('
|
|
46
|
+
writeFileSync('./README.md', output);
|
|
24
47
|
console.log('README.md generated from template.');
|
|
25
48
|
}
|
|
26
49
|
main().catch(console.error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-readme.js","sourceRoot":"","sources":["../../scripts/update-readme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"update-readme.js","sourceRoot":"","sources":["../../scripts/update-readme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAEjD;;;;;GAKG;AAEH,MAAM,YAAY;IAAlB;QACE,oBAAe,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACzC,CAAC;CAAA;AAED,MAAM,aAAa;IACjB,kDAAkD;IAClD,eAAe,CAAC,EAAU,EAAE,KAAa;QACvC,OAAO,IAAI,YAAY,EAAE,CAAC,CAAC,2BAA2B;IACxD,CAAC;CACF;AAED,8DAA8D;AAC7D,UAAkB,CAAC,SAAS,GAAG,aAAa,CAAC;AAC9C,8DAA8D;AAC7D,UAAkB,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC;IACvC,EAAE,EAAE,IAAI;IACR,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;IACtB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;CACvB,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,GAAG,CAAC;AACtB,MAAM,YAAY,GAAG,GAAG,CAAC;AAEzB,KAAK,UAAU,oBAAoB;IACjC,qFAAqF;IACrF,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;IACvE,IAAI,KAAK,GAAG,kDAAkD,CAAC;IAC/D,KAAK,IAAI,qDAAqD,CAAC;IAE/D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,aAAa,GACjB,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1D,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;QAE1E,KAAK,IAAI,KAAK,GAAG,MAAM,aAAa,MAAM,WAAW,MAAM,CAAC;IAC9D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,QAAQ,GAAG,YAAY,CAAC,8BAA8B,EAAE,OAAO,CAAC,CAAC;IACvE,MAAM,WAAW,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAEjD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,uBAAuB,EAAE,WAAW,CAAC,CAAC;IACtE,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;AACpD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC","sourcesContent":["import { readFileSync, writeFileSync } from 'fs';\n\n/*\n * This script generates the README.md file from a template. It is used to create a support table for the wizards.\n *\n * The DOMParser and fetch are mocked to allow importing the wizards without\n * errors in a Node.js environment. If this offends your eyes - squint & scroll.\n */\n\nclass DocumentStub {\n documentElement = { nodeName: 'root' };\n}\n\nclass MockDOMParser {\n // eslint-disable-next-line class-methods-use-this\n parseFromString(_s: string, _type: string) {\n return new DocumentStub(); // return anything non-null\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(globalThis as any).DOMParser = MockDOMParser;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(globalThis as any).fetch = async () => ({\n ok: true,\n status: 200,\n json: async () => ({}),\n text: async () => '{}',\n});\n\nconst supported = '✅';\nconst notSupported = '❌';\n\nasync function generateSupportTable() {\n // Dynamically import the wizards to avoid issues with DOMParser and fetch in Node.js\n const { wizards, emptyWizard } = await import('../wizards/wizards.js');\n let table = '| Tag Name | Supports Create | Supports Edit |\\n';\n table += '|-------------|----------------|----------------|\\n';\n\n for (const [key, value] of Object.entries(wizards)) {\n const createSupport =\n value.create === emptyWizard ? notSupported : supported;\n const editSupport = value.edit === emptyWizard ? notSupported : supported;\n\n table += `| ${key} | ${createSupport} | ${editSupport} |\\n`;\n }\n\n return table;\n}\n\nasync function main() {\n const template = readFileSync('./scripts/README.template.md', 'utf-8');\n const statusTable = await generateSupportTable();\n\n const output = template.replace('<!-- STATUS_TABLE -->', statusTable);\n writeFileSync('./README.md', output);\n console.log('README.md generated from template.');\n}\n\nmain().catch(console.error);\n"]}
|
package/dist/wizards/ldevice.js
CHANGED
|
@@ -96,16 +96,18 @@ export function createAction(parent) {
|
|
|
96
96
|
export function updateAction(element) {
|
|
97
97
|
return (inputs) => {
|
|
98
98
|
const ldNameAllowed = ldNameIsAllowed(element);
|
|
99
|
+
const desc = getValue(inputs.find(i => i.label === 'desc'));
|
|
99
100
|
const ldName = ldNameAllowed
|
|
100
101
|
? getValue(inputs.find(i => i.label === 'ldName'))
|
|
101
102
|
: null;
|
|
102
|
-
if (
|
|
103
|
+
if (ldName === element.getAttribute('ldName') &&
|
|
104
|
+
desc === element.getAttribute('desc')) {
|
|
103
105
|
return [];
|
|
104
106
|
}
|
|
105
107
|
return [
|
|
106
108
|
{
|
|
107
109
|
element,
|
|
108
|
-
attributes: { ldName },
|
|
110
|
+
attributes: { ldName, desc },
|
|
109
111
|
},
|
|
110
112
|
];
|
|
111
113
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ldevice.js","sourceRoot":"","sources":["../../wizards/ldevice.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ldevice.js","sourceRoot":"","sources":["../../wizards/ldevice.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, TemplateResult } from 'lit';\n\nimport { EditV2 } from '@openscd/oscd-api';\n\nimport { getReference } from '@openscd/scl-lib';\n\nimport {\n createElement,\n getValue,\n Wizard,\n WizardActor,\n WizardInputElement,\n} from '../foundation.js';\nimport { patterns } from './patterns.js';\nimport { SclTextField } from '@openenergytools/scl-text-field';\n\nexport function lDeviceNamePattern(): string {\n return (\n '[A-Za-z][0-9A-Za-z_]{0,2}|' +\n '[A-Za-z][0-9A-Za-z_]{4,63}|' +\n '[A-MO-Za-z][0-9A-Za-z_]{3}|' +\n 'N[0-9A-Za-np-z_][0-9A-Za-z_]{2}|' +\n 'No[0-9A-Za-mo-z_][0-9A-Za-z_]|' +\n 'Non[0-9A-Za-df-z_]'\n );\n}\n\nfunction ldNameIsAllowed(element: Element): boolean {\n return !!element.closest('IED')?.querySelector('Services > ConfLdName');\n}\n\nfunction reservedInstLDevice(currentElement: Element): string[] {\n const ied = currentElement.closest('IED');\n if (!ied) {\n return [];\n }\n\n return Array.from(\n ied.querySelectorAll(':scope > AccessPoint > Server > LDevice'),\n )\n .map(ld => ld.getAttribute('inst') ?? '')\n .filter(name => name !== currentElement.getAttribute('inst'));\n}\n\nfunction render(\n inst: string | null,\n ldName: string | null,\n desc: string | null,\n reservedInsts: string[],\n allowLdName: boolean,\n disableInst: boolean,\n): TemplateResult[] {\n const content = [\n allowLdName\n ? html`<scl-text-field\n label=\"ldName\"\n .value=${ldName}\n nullable\n supportingText=\"Logical device name\"\n validationMessage=\"Required\"\n dialogInitialFocus\n pattern=\"${lDeviceNamePattern()}\"\n ></scl-text-field>`\n : html`<scl-text-field\n label=\"ldName\"\n .value=${ldName}\n supportingText=\"IED doesn't support Functional Naming\"\n helperPersistent\n readOnly\n disabled\n ></scl-text-field>`,\n html`<scl-text-field\n label=\"desc\"\n .value=${desc}\n nullable\n supportingText=\"Logical device description\"\n pattern=\"${patterns.normalizedString}\"\n ></scl-text-field>`,\n html`<scl-text-field\n label=\"inst\"\n .value=${inst}\n ?disabled=${disableInst}\n required\n supportingText=\"Logical device inst\"\n pattern=\"${patterns.normalizedString}\"\n @input=${(e: Event) => {\n const input = e.target as SclTextField;\n const currentValue = getValue(input) ?? '';\n let customValidityMsg = '';\n if (reservedInsts.includes(currentValue)) {\n customValidityMsg = `\"${currentValue}\" is already in use`;\n }\n input.setCustomValidity(customValidityMsg);\n input.reportValidity();\n }}\n .reservedValues=${reservedInsts}\n ></scl-text-field>`,\n ];\n return content;\n}\n\nexport function createAction(parent: Element): WizardActor {\n return (inputs: WizardInputElement[]): EditV2[] => {\n const inst = getValue(inputs.find(i => i.label === 'inst')!)!;\n const ldNameAllowed = ldNameIsAllowed(parent);\n const ldName = ldNameAllowed\n ? getValue(inputs.find(i => i.label === 'ldName')!)\n : null;\n const desc = getValue(inputs.find(i => i.label === 'desc')!);\n const node = createElement(parent.ownerDocument, 'LDevice', {\n inst,\n ldName,\n desc,\n });\n\n return [\n {\n parent,\n node,\n reference: getReference(parent, 'LDevice'),\n },\n ];\n };\n}\n\nexport function updateAction(element: Element): WizardActor {\n return (inputs: WizardInputElement[]): EditV2[] => {\n const ldNameAllowed = ldNameIsAllowed(element);\n const desc = getValue(inputs.find(i => i.label === 'desc')!);\n const ldName = ldNameAllowed\n ? getValue(inputs.find(i => i.label === 'ldName')!)\n : null;\n\n if (\n ldName === element.getAttribute('ldName') &&\n desc === element.getAttribute('desc')\n ) {\n return [];\n }\n\n return [\n {\n element,\n attributes: { ldName, desc },\n },\n ];\n };\n}\n\nexport function createLDeviceWizard(parent: Element): Wizard {\n return {\n title: 'Add LDevice',\n primary: {\n icon: '',\n label: 'save',\n action: createAction(parent),\n },\n content: render(\n null,\n null,\n null,\n reservedInstLDevice(parent),\n ldNameIsAllowed(parent),\n false,\n ),\n };\n}\n\nexport function editLDeviceWizard(element: Element): Wizard {\n return {\n title: 'Edit LDevice',\n primary: {\n icon: 'edit',\n label: 'save',\n action: updateAction(element),\n },\n content: render(\n element.getAttribute('inst'),\n element.getAttribute('ldName'),\n element.getAttribute('desc'),\n reservedInstLDevice(element),\n ldNameIsAllowed(element),\n true,\n ),\n };\n}\n"]}
|
package/dist/wizards/ln0.js
CHANGED
|
@@ -48,8 +48,8 @@ function render(element, lnodeTypeIds) {
|
|
|
48
48
|
function updateAction(element) {
|
|
49
49
|
return (inputs) => {
|
|
50
50
|
const attributes = {};
|
|
51
|
-
//
|
|
52
|
-
const keys = ['lnType', 'desc'
|
|
51
|
+
// Key attributes omitted from update are: 'lnClass', 'inst'.
|
|
52
|
+
const keys = ['lnType', 'desc'];
|
|
53
53
|
keys.forEach(key => {
|
|
54
54
|
attributes[key] = getValue(inputs.find(i => i.label === key));
|
|
55
55
|
});
|
package/dist/wizards/ln0.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ln0.js","sourceRoot":"","sources":["../../wizards/ln0.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAkB,MAAM,KAAK,CAAC;AAI3C,OAAO,EACL,QAAQ,GAIT,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,SAAS,mBAAmB,CAAC,OAAgB;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC;IAClC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAC3B,GAAG,CAAC,gBAAgB,CAAC,+CAA+C,CAAC,CACtE,CAAC;IACF,OAAO,UAAU;SACd,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;SACpC,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,MAAM,CAAC,OAAgB,EAAE,YAAsB;IACtD,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAE1C,OAAO;QACL,IAAI,CAAA;;eAEO,MAAM;;uBAEE,YAAY;mBAChB;QACf,IAAI,CAAA;;eAEO,IAAI;;;iBAGF,QAAQ,CAAC,gBAAgB;uBACnB;QACnB,IAAI,CAAA;;eAEO,OAAO;;;;;iBAKL,QAAQ,CAAC,OAAO;uBACV;QACnB,IAAI,CAAA;;eAEO,IAAI;;;;uBAII;KACpB,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,OAAgB;IACpC,OAAO,CAAC,MAA4B,EAAY,EAAE;QAChD,MAAM,UAAU,GAAkC,EAAE,CAAC;QACrD,
|
|
1
|
+
{"version":3,"file":"ln0.js","sourceRoot":"","sources":["../../wizards/ln0.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAkB,MAAM,KAAK,CAAC;AAI3C,OAAO,EACL,QAAQ,GAIT,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,SAAS,mBAAmB,CAAC,OAAgB;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC;IAClC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAC3B,GAAG,CAAC,gBAAgB,CAAC,+CAA+C,CAAC,CACtE,CAAC;IACF,OAAO,UAAU;SACd,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;SACpC,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,MAAM,CAAC,OAAgB,EAAE,YAAsB;IACtD,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAE1C,OAAO;QACL,IAAI,CAAA;;eAEO,MAAM;;uBAEE,YAAY;mBAChB;QACf,IAAI,CAAA;;eAEO,IAAI;;;iBAGF,QAAQ,CAAC,gBAAgB;uBACnB;QACnB,IAAI,CAAA;;eAEO,OAAO;;;;;iBAKL,QAAQ,CAAC,OAAO;uBACV;QACnB,IAAI,CAAA;;eAEO,IAAI;;;;uBAII;KACpB,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,OAAgB;IACpC,OAAO,CAAC,MAA4B,EAAY,EAAE;QAChD,MAAM,UAAU,GAAkC,EAAE,CAAC;QACrD,6DAA6D;QAC7D,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACjB,UAAU,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAE,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAC1B,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CACrD,CAAC;QACF,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO;YACL;gBACE,OAAO;gBACP,UAAU;aACX;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,MAAM,YAAY,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAElD,OAAO;QACL,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE;YACP,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC;SAC9B;QACD,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC;KACvC,CAAC;AACJ,CAAC","sourcesContent":["import { html, TemplateResult } from 'lit';\n\nimport { EditV2 } from '@openscd/oscd-api';\n\nimport {\n getValue,\n Wizard,\n WizardActor,\n WizardInputElement,\n} from '../foundation.js';\nimport { patterns } from './patterns.js';\n\nfunction getLNodeTypeOptions(element: Element): string[] {\n const doc = element.ownerDocument;\n const lNodeTypes = Array.from(\n doc.querySelectorAll('DataTypeTemplates > LNodeType[lnClass=\"LLN0\"]'),\n );\n return lNodeTypes\n .map(type => type.getAttribute('id'))\n .filter((id): id is string => !!id);\n}\n\nfunction render(element: Element, lnodeTypeIds: string[]): TemplateResult[] {\n const lnType = element.getAttribute('lnType');\n const desc = element.getAttribute('desc');\n const lnClass = element.getAttribute('lnClass');\n const inst = element.getAttribute('inst');\n\n return [\n html`<scl-select\n label=\"lnType\"\n .value=${lnType}\n required\n .selectOptions=${lnodeTypeIds}\n ></scl-select>`,\n html`<scl-text-field\n label=\"desc\"\n .value=${desc}\n nullable\n supportingText=\"Logical node zero description\"\n pattern=\"${patterns.normalizedString}\"\n ></scl-text-field>`,\n html`<scl-text-field\n label=\"lnClass\"\n .value=${lnClass}\n readOnly\n disabled\n required\n supportingText=\"Logical node class\"\n pattern=\"${patterns.lnClass}\"\n ></scl-text-field>`,\n html`<scl-text-field\n label=\"inst\"\n .value=${inst}\n readOnly\n disabled\n supportingText=\"Logical node instance\"\n ></scl-text-field>`,\n ];\n}\n\nfunction updateAction(element: Element): WizardActor {\n return (inputs: WizardInputElement[]): EditV2[] => {\n const attributes: Record<string, string | null> = {};\n // Key attributes omitted from update are: 'lnClass', 'inst'.\n const keys = ['lnType', 'desc'];\n keys.forEach(key => {\n attributes[key] = getValue(inputs.find(i => i.label === key)!);\n });\n\n const hasChanges = keys.some(\n key => attributes[key] !== element.getAttribute(key),\n );\n if (!hasChanges) {\n return [];\n }\n\n return [\n {\n element,\n attributes,\n },\n ];\n };\n}\n\nexport function updateLN0Wizard(element: Element): Wizard {\n const lnodeTypeIds = getLNodeTypeOptions(element);\n\n return {\n title: 'Edit LN0',\n primary: {\n icon: 'edit',\n label: 'save',\n action: updateAction(element),\n },\n content: render(element, lnodeTypeIds),\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@omicronenergy/oscd-scl-dialogs",
|
|
3
3
|
"description": "Provides a resuable dialog for adding and editing SCL elements in OpenSCD.",
|
|
4
4
|
"displayName": "OpenSCD Edit Dialog",
|
|
5
|
-
"version": "0.0.
|
|
5
|
+
"version": "0.0.8",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
8
|
"url": "git+https://github.com/OMICRONEnergyOSS/oscd-scl-dialogs.git"
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
".": "./dist/foundation.js",
|
|
27
27
|
"./OscdSclDialogs.js": "./dist/OscdSclDialogs.js",
|
|
28
28
|
"./oscd-scl-dialogs.js": "./dist/oscd-scl-dialogs.js",
|
|
29
|
+
"./OscdTextEditor.js": "./dist/OscdTextEditor.js",
|
|
29
30
|
"./oscd-scl-dialogs-events.js": "./dist/oscd-scl-dialogs-events.js",
|
|
30
31
|
"./wizards.js": "./dist/wizards/wizards.js",
|
|
31
32
|
"./patterns.js": "./dist/wizards/patterns.js"
|
|
@@ -41,7 +42,9 @@
|
|
|
41
42
|
"lint": "eslint .",
|
|
42
43
|
"format": "eslint . --fix",
|
|
43
44
|
"analyze": "cem analyze",
|
|
44
|
-
"start": "tsc && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wds\"",
|
|
45
|
+
"start": "rimraf dist && tsc && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wds --watch --node-resolve\"",
|
|
46
|
+
"start:bundle": "npm run bundle && concurrently -k -r \"rollup -c rollup.config.js --watch\" \"wds --watch --root-dir ./dist\"",
|
|
47
|
+
"start:vite": "vite",
|
|
45
48
|
"build": "rimraf dist && tsc && npm run analyze -- --exclude dist",
|
|
46
49
|
"build:watch": "rimraf dist && npm run analyze -- --exclude dist && tsc --watch --preserveWatchOutput",
|
|
47
50
|
"bundle": "rimraf dist && rollup -c rollup.config.js",
|
|
@@ -55,7 +58,7 @@
|
|
|
55
58
|
"prepare": "husky"
|
|
56
59
|
},
|
|
57
60
|
"dependencies": {
|
|
58
|
-
"@omicronenergy/oscd-shell": "^0.0.
|
|
61
|
+
"@omicronenergy/oscd-shell": "^0.0.11",
|
|
59
62
|
"@open-wc/scoped-elements": "^3.0.6",
|
|
60
63
|
"@openenergytools/filterable-lists": "^1.2.0",
|
|
61
64
|
"@openenergytools/scl-checkbox": "^2.0.0",
|
|
@@ -65,49 +68,55 @@
|
|
|
65
68
|
"@openscd/oscd-editor": "^1.8.0",
|
|
66
69
|
"@openscd/scl-lib": "^2.0.0",
|
|
67
70
|
"@scopedelement/material-web": "^3.12.0",
|
|
68
|
-
"
|
|
71
|
+
"@webcomponents/scoped-custom-element-registry": "^0.0.10",
|
|
72
|
+
"ace-builds": "^1.43.6",
|
|
73
|
+
"ace-custom-element": "^1.6.5",
|
|
74
|
+
"lit": "^3.3.2",
|
|
69
75
|
"tslib": "^2.8.1"
|
|
70
76
|
},
|
|
71
77
|
"devDependencies": {
|
|
72
|
-
"@commitlint/cli": "^
|
|
73
|
-
"@commitlint/config-conventional": "^
|
|
74
|
-
"@custom-elements-manifest/analyzer": "^0.
|
|
75
|
-
"@eslint/eslintrc": "^3.3.
|
|
76
|
-
"@eslint/js": "^9.
|
|
78
|
+
"@commitlint/cli": "^20.4.1",
|
|
79
|
+
"@commitlint/config-conventional": "^20.4.1",
|
|
80
|
+
"@custom-elements-manifest/analyzer": "^0.11.0",
|
|
81
|
+
"@eslint/eslintrc": "^3.3.3",
|
|
82
|
+
"@eslint/js": "^9.39.1",
|
|
77
83
|
"@esm-bundle/chai": "^4.3.4-fix.0",
|
|
84
|
+
"@open-wc/dev-server-hmr": "^0.2.0",
|
|
78
85
|
"@open-wc/eslint-config": "^13.0.0",
|
|
79
86
|
"@open-wc/testing": "^4.0.0",
|
|
80
|
-
"@rollup/plugin-typescript": "^12.
|
|
87
|
+
"@rollup/plugin-typescript": "^12.3.0",
|
|
81
88
|
"@types/mocha": "^10.0.10",
|
|
82
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
83
|
-
"@typescript-eslint/parser": "^8.
|
|
89
|
+
"@typescript-eslint/eslint-plugin": "^8.55.0",
|
|
90
|
+
"@typescript-eslint/parser": "^8.55.0",
|
|
84
91
|
"@web/dev-server": "^0.4.6",
|
|
92
|
+
"@web/dev-server-esbuild": "^1.0.5",
|
|
85
93
|
"@web/dev-server-polyfill": "^1.0.6",
|
|
86
94
|
"@web/dev-server-storybook": "^2.0.3",
|
|
87
|
-
"@web/rollup-plugin-import-meta-assets": "^2.3.
|
|
95
|
+
"@web/rollup-plugin-import-meta-assets": "^2.3.2",
|
|
88
96
|
"@web/test-runner": "0.20.2",
|
|
89
97
|
"@web/test-runner-commands": "0.9.0",
|
|
90
98
|
"@web/test-runner-playwright": "0.11.1",
|
|
91
99
|
"@web/test-runner-visual-regression": "0.10.0",
|
|
92
100
|
"@webcomponents/scoped-custom-element-registry": "0.0.10",
|
|
93
101
|
"concurrently": "^9.2.1",
|
|
94
|
-
"eslint": "^9.
|
|
102
|
+
"eslint": "^9.39.1",
|
|
95
103
|
"eslint-config-prettier": "^10.1.8",
|
|
96
104
|
"eslint-plugin-html": "^8.1.3",
|
|
97
105
|
"eslint-plugin-lit": "^2.1.1",
|
|
98
106
|
"eslint-plugin-lit-a11y": "^5.1.1",
|
|
99
107
|
"eslint-plugin-no-only-tests": "^3.3.0",
|
|
100
108
|
"eslint-plugin-prettier": "^5.5.4",
|
|
101
|
-
"eslint-plugin-tsdoc": "^0.
|
|
102
|
-
"eslint-plugin-wc": "^3.0.
|
|
109
|
+
"eslint-plugin-tsdoc": "^0.5.0",
|
|
110
|
+
"eslint-plugin-wc": "^3.0.2",
|
|
103
111
|
"husky": "^9.1.7",
|
|
104
|
-
"lint-staged": "^16.
|
|
105
|
-
"prettier": "^3.
|
|
106
|
-
"rimraf": "^6.
|
|
112
|
+
"lint-staged": "^16.2.7",
|
|
113
|
+
"prettier": "^3.8.1",
|
|
114
|
+
"rimraf": "^6.1.2",
|
|
107
115
|
"rollup-plugin-copy": "^3.5.0",
|
|
108
|
-
"sinon": "^21.0.
|
|
109
|
-
"typedoc": "^0.28.
|
|
110
|
-
"typescript": "^5.9.
|
|
116
|
+
"sinon": "^21.0.1",
|
|
117
|
+
"typedoc": "^0.28.16",
|
|
118
|
+
"typescript": "^5.9.3",
|
|
119
|
+
"vite": "^7.3.1"
|
|
111
120
|
},
|
|
112
121
|
"customElements": "custom-elements.json",
|
|
113
122
|
"prettier": {
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { LitElement } from 'lit';
|
|
2
|
-
import type WizardDialog from '../OscdSclDialogs.js';
|
|
3
|
-
import '../oscd-scl-dialogs.js';
|
|
4
|
-
import { XMLEditor } from '@openscd/oscd-editor';
|
|
5
|
-
export default class TriggerWizard extends LitElement {
|
|
6
|
-
doc: XMLDocument;
|
|
7
|
-
editor: XMLEditor;
|
|
8
|
-
docsState: unknown;
|
|
9
|
-
newTagName: HTMLSelectElement;
|
|
10
|
-
parentSelector: HTMLInputElement;
|
|
11
|
-
childinput: HTMLInputElement;
|
|
12
|
-
tagSelector: HTMLInputElement;
|
|
13
|
-
editDialog: WizardDialog;
|
|
14
|
-
triggerWizardCreate(): Promise<void>;
|
|
15
|
-
triggerWizardEdit(): Promise<void>;
|
|
16
|
-
render(): import("lit-html").TemplateResult<1>;
|
|
17
|
-
static styles: import("lit").CSSResult;
|
|
18
|
-
}
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
|
-
import { css, html, LitElement } from 'lit';
|
|
3
|
-
import { property, query } from 'lit/decorators.js';
|
|
4
|
-
import '../oscd-scl-dialogs.js';
|
|
5
|
-
import { convertEdit } from '@openscd/oscd-api/utils.js';
|
|
6
|
-
import { emptyWizard, wizards } from '../wizards/wizards.js';
|
|
7
|
-
function prettyPrintXml(xml) {
|
|
8
|
-
const serializer = new XMLSerializer();
|
|
9
|
-
const xmlStr = serializer.serializeToString(xml);
|
|
10
|
-
// Insert line breaks between tags
|
|
11
|
-
const xmlString = xmlStr.replace(/>(\s*)</g, '>\n<');
|
|
12
|
-
let formatted = '';
|
|
13
|
-
let pad = 0;
|
|
14
|
-
xmlString.split('\n').forEach(node => {
|
|
15
|
-
if (node.match(/^<\/[^>]+>/)) {
|
|
16
|
-
pad -= 2;
|
|
17
|
-
} // Closing tag
|
|
18
|
-
if (pad < 0) {
|
|
19
|
-
pad = 0;
|
|
20
|
-
}
|
|
21
|
-
formatted += ' '.repeat(pad) + node + '\n';
|
|
22
|
-
if (node.match(/^<[^!?/][^>]*[^/]>$/)) {
|
|
23
|
-
pad += 2;
|
|
24
|
-
} // Opening tag (not self-closing, not comment/doctype)
|
|
25
|
-
});
|
|
26
|
-
return formatted.trim();
|
|
27
|
-
}
|
|
28
|
-
const supportedCreateTagNames = Object.entries(wizards)
|
|
29
|
-
.filter(([, value]) => value.create !== emptyWizard)
|
|
30
|
-
.map(([key]) => key);
|
|
31
|
-
const supportedEditTagNames = Object.entries(wizards)
|
|
32
|
-
.filter(([, value]) => value.edit !== emptyWizard)
|
|
33
|
-
.map(([key]) => key);
|
|
34
|
-
class TriggerWizard extends LitElement {
|
|
35
|
-
async triggerWizardCreate() {
|
|
36
|
-
const parent = this.doc.querySelector(this.parentSelector.value);
|
|
37
|
-
const tagName = this.newTagName.value;
|
|
38
|
-
if (!parent || !tagName) {
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
const wizardType = {
|
|
42
|
-
parent,
|
|
43
|
-
tagName,
|
|
44
|
-
};
|
|
45
|
-
const edits = await this.editDialog.create(wizardType);
|
|
46
|
-
this.editor.commit(convertEdit(edits));
|
|
47
|
-
this.requestUpdate();
|
|
48
|
-
}
|
|
49
|
-
async triggerWizardEdit() {
|
|
50
|
-
const element = this.doc.querySelector(this.tagSelector.value);
|
|
51
|
-
if (!element) {
|
|
52
|
-
this.tagSelector.setCustomValidity('Terrible selector, try again.');
|
|
53
|
-
this.tagSelector.reportValidity();
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
else if (!supportedEditTagNames.includes(element.tagName)) {
|
|
57
|
-
this.tagSelector.setCustomValidity('This tag name is not currently supported.');
|
|
58
|
-
this.tagSelector.reportValidity();
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
this.tagSelector.setCustomValidity('');
|
|
63
|
-
}
|
|
64
|
-
const wizardType = {
|
|
65
|
-
element,
|
|
66
|
-
};
|
|
67
|
-
const edits = await this.editDialog.edit(wizardType);
|
|
68
|
-
this.editor.commit(edits);
|
|
69
|
-
this.requestUpdate();
|
|
70
|
-
}
|
|
71
|
-
render() {
|
|
72
|
-
return html ` <div class="card">
|
|
73
|
-
<h2>Add Element</h2>
|
|
74
|
-
<p>
|
|
75
|
-
Use this section to trigger the oscd-scl-dialogs to Add/Inert the
|
|
76
|
-
specified Element to the specified Parent
|
|
77
|
-
</p>
|
|
78
|
-
<label>Parent Selector:</label
|
|
79
|
-
><input id="parentSelector" value="Substation" />
|
|
80
|
-
<label for="newTagName">Tag Name:</label
|
|
81
|
-
><select id="newTagName">
|
|
82
|
-
${supportedCreateTagNames.map(tagName => html `<option value=${tagName}>${tagName}</option>`)}
|
|
83
|
-
</select>
|
|
84
|
-
<button @click="${this.triggerWizardCreate}">Add</button>
|
|
85
|
-
</div>
|
|
86
|
-
|
|
87
|
-
<div class="card">
|
|
88
|
-
<h2>Edit existing Element</h2>
|
|
89
|
-
<p>
|
|
90
|
-
Use this section to trigger the oscd-scl-dialogs to Edit the specified
|
|
91
|
-
existing Element
|
|
92
|
-
</p>
|
|
93
|
-
<label>Tag Selector</label>
|
|
94
|
-
<div>
|
|
95
|
-
<input
|
|
96
|
-
id="tagSelector"
|
|
97
|
-
value="Substation"
|
|
98
|
-
aria-describedby="supportedEditElements"
|
|
99
|
-
/>
|
|
100
|
-
<div
|
|
101
|
-
role="tooltip"
|
|
102
|
-
id="supportedEditElements"
|
|
103
|
-
aria-label="Supported Elements for Editing"
|
|
104
|
-
>
|
|
105
|
-
<h3>Supported Elements for Editing</h3>
|
|
106
|
-
<ul>
|
|
107
|
-
${supportedEditTagNames.map(tagName => html `<li>${tagName}</li>`)}
|
|
108
|
-
</ul>
|
|
109
|
-
</div>
|
|
110
|
-
</div>
|
|
111
|
-
<button @click="${this.triggerWizardEdit}">Edit</button>
|
|
112
|
-
</div>
|
|
113
|
-
|
|
114
|
-
<div class="card">
|
|
115
|
-
<h2>Document Content</h2>
|
|
116
|
-
<pre style="white-space: break-spaces">${prettyPrintXml(this.doc)}</pre>
|
|
117
|
-
</div>
|
|
118
|
-
|
|
119
|
-
<oscd-scl-dialogs></oscd-scl-dialogs>`;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
TriggerWizard.styles = css `
|
|
123
|
-
.card {
|
|
124
|
-
display: grid;
|
|
125
|
-
grid-template-columns: 1fr 1fr;
|
|
126
|
-
gap: 1rem 2rem;
|
|
127
|
-
align-items: center;
|
|
128
|
-
justify-items: center;
|
|
129
|
-
padding: 2rem;
|
|
130
|
-
background: #fafbfc;
|
|
131
|
-
border-radius: 8px;
|
|
132
|
-
max-width: 500px;
|
|
133
|
-
margin: 2rem auto;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
.card h2,
|
|
137
|
-
.card p,
|
|
138
|
-
.card button {
|
|
139
|
-
grid-column: 1 / -1;
|
|
140
|
-
text-align: center;
|
|
141
|
-
margin-block: 0;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
.card label,
|
|
145
|
-
.card select,
|
|
146
|
-
.card input,
|
|
147
|
-
.card > div,
|
|
148
|
-
.card button {
|
|
149
|
-
width: 100%;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
.card button {
|
|
153
|
-
text-align: center;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
[role='tooltip'],
|
|
157
|
-
.hide-tooltip.hide-tooltip.hide-tooltip + [role='tooltip'] {
|
|
158
|
-
visibility: hidden;
|
|
159
|
-
position: absolute;
|
|
160
|
-
background: black;
|
|
161
|
-
color: white;
|
|
162
|
-
padding: 1rem;
|
|
163
|
-
border-radius: 8px;
|
|
164
|
-
}
|
|
165
|
-
[aria-describedby]:hover,
|
|
166
|
-
[aria-describedby]:focus {
|
|
167
|
-
position: relative;
|
|
168
|
-
}
|
|
169
|
-
[aria-describedby]:hover + [role='tooltip'],
|
|
170
|
-
[aria-describedby]:focus + [role='tooltip'] {
|
|
171
|
-
visibility: visible;
|
|
172
|
-
}
|
|
173
|
-
`;
|
|
174
|
-
export default TriggerWizard;
|
|
175
|
-
__decorate([
|
|
176
|
-
property()
|
|
177
|
-
], TriggerWizard.prototype, "doc", void 0);
|
|
178
|
-
__decorate([
|
|
179
|
-
property()
|
|
180
|
-
], TriggerWizard.prototype, "editor", void 0);
|
|
181
|
-
__decorate([
|
|
182
|
-
property()
|
|
183
|
-
], TriggerWizard.prototype, "docsState", void 0);
|
|
184
|
-
__decorate([
|
|
185
|
-
query('#newTagName')
|
|
186
|
-
], TriggerWizard.prototype, "newTagName", void 0);
|
|
187
|
-
__decorate([
|
|
188
|
-
query('#parentSelector')
|
|
189
|
-
], TriggerWizard.prototype, "parentSelector", void 0);
|
|
190
|
-
__decorate([
|
|
191
|
-
query('#childtag')
|
|
192
|
-
], TriggerWizard.prototype, "childinput", void 0);
|
|
193
|
-
__decorate([
|
|
194
|
-
query('#tagSelector')
|
|
195
|
-
], TriggerWizard.prototype, "tagSelector", void 0);
|
|
196
|
-
__decorate([
|
|
197
|
-
query('oscd-scl-dialogs')
|
|
198
|
-
], TriggerWizard.prototype, "editDialog", void 0);
|
|
199
|
-
//# sourceMappingURL=demo-editor-plugin.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"demo-editor-plugin.js","sourceRoot":"","sources":["../../demo/demo-editor-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport type WizardDialog from '../OscdSclDialogs.js';\n\nimport '../oscd-scl-dialogs.js';\nimport { XMLEditor } from '@openscd/oscd-editor';\nimport { convertEdit } from '@openscd/oscd-api/utils.js';\nimport { Edit } from '@openscd/oscd-api';\nimport { emptyWizard, wizards } from '../wizards/wizards.js';\n\nfunction prettyPrintXml(xml: XMLDocument | Element): string {\n const serializer = new XMLSerializer();\n const xmlStr = serializer.serializeToString(xml);\n\n // Insert line breaks between tags\n const xmlString = xmlStr.replace(/>(\\s*)</g, '>\\n<');\n let formatted = '';\n let pad = 0;\n\n xmlString.split('\\n').forEach(node => {\n if (node.match(/^<\\/[^>]+>/)) {\n pad -= 2;\n } // Closing tag\n if (pad < 0) {\n pad = 0;\n }\n formatted += ' '.repeat(pad) + node + '\\n';\n if (node.match(/^<[^!?/][^>]*[^/]>$/)) {\n pad += 2;\n } // Opening tag (not self-closing, not comment/doctype)\n });\n\n return formatted.trim();\n}\n\nconst supportedCreateTagNames = Object.entries(wizards)\n .filter(([, value]) => value.create !== emptyWizard)\n .map(([key]) => key);\n\nconst supportedEditTagNames = Object.entries(wizards)\n .filter(([, value]) => value.edit !== emptyWizard)\n .map(([key]) => key);\n\nexport default class TriggerWizard extends LitElement {\n @property()\n doc!: XMLDocument;\n\n @property()\n editor!: XMLEditor;\n\n @property()\n docsState!: unknown;\n\n @query('#newTagName') newTagName!: HTMLSelectElement;\n\n @query('#parentSelector') parentSelector!: HTMLInputElement;\n\n @query('#childtag') childinput!: HTMLInputElement;\n\n @query('#tagSelector') tagSelector!: HTMLInputElement;\n\n @query('oscd-scl-dialogs') editDialog!: WizardDialog;\n\n async triggerWizardCreate(): Promise<void> {\n const parent = this.doc.querySelector(this.parentSelector.value);\n const tagName = this.newTagName.value;\n if (!parent || !tagName) {\n return;\n }\n\n const wizardType = {\n parent,\n tagName,\n };\n const edits = await this.editDialog.create(wizardType);\n this.editor.commit(convertEdit(edits as Edit[]));\n this.requestUpdate();\n }\n\n async triggerWizardEdit(): Promise<void> {\n const element = this.doc.querySelector(this.tagSelector.value);\n\n if (!element) {\n this.tagSelector.setCustomValidity('Terrible selector, try again.');\n this.tagSelector.reportValidity();\n return;\n } else if (!supportedEditTagNames.includes(element.tagName)) {\n this.tagSelector.setCustomValidity(\n 'This tag name is not currently supported.',\n );\n this.tagSelector.reportValidity();\n return;\n } else {\n this.tagSelector.setCustomValidity('');\n }\n\n const wizardType = {\n element,\n };\n const edits = await this.editDialog.edit(wizardType);\n this.editor.commit(edits);\n this.requestUpdate();\n }\n\n render() {\n return html` <div class=\"card\">\n <h2>Add Element</h2>\n <p>\n Use this section to trigger the oscd-scl-dialogs to Add/Inert the\n specified Element to the specified Parent\n </p>\n <label>Parent Selector:</label\n ><input id=\"parentSelector\" value=\"Substation\" />\n <label for=\"newTagName\">Tag Name:</label\n ><select id=\"newTagName\">\n ${supportedCreateTagNames.map(\n tagName => html`<option value=${tagName}>${tagName}</option>`,\n )}\n </select>\n <button @click=\"${this.triggerWizardCreate}\">Add</button>\n </div>\n\n <div class=\"card\">\n <h2>Edit existing Element</h2>\n <p>\n Use this section to trigger the oscd-scl-dialogs to Edit the specified\n existing Element\n </p>\n <label>Tag Selector</label>\n <div>\n <input\n id=\"tagSelector\"\n value=\"Substation\"\n aria-describedby=\"supportedEditElements\"\n />\n <div\n role=\"tooltip\"\n id=\"supportedEditElements\"\n aria-label=\"Supported Elements for Editing\"\n >\n <h3>Supported Elements for Editing</h3>\n <ul>\n ${supportedEditTagNames.map(tagName => html`<li>${tagName}</li>`)}\n </ul>\n </div>\n </div>\n <button @click=\"${this.triggerWizardEdit}\">Edit</button>\n </div>\n\n <div class=\"card\">\n <h2>Document Content</h2>\n <pre style=\"white-space: break-spaces\">${prettyPrintXml(this.doc)}</pre>\n </div>\n\n <oscd-scl-dialogs></oscd-scl-dialogs>`;\n }\n\n static styles = css`\n .card {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1rem 2rem;\n align-items: center;\n justify-items: center;\n padding: 2rem;\n background: #fafbfc;\n border-radius: 8px;\n max-width: 500px;\n margin: 2rem auto;\n }\n\n .card h2,\n .card p,\n .card button {\n grid-column: 1 / -1;\n text-align: center;\n margin-block: 0;\n }\n\n .card label,\n .card select,\n .card input,\n .card > div,\n .card button {\n width: 100%;\n }\n\n .card button {\n text-align: center;\n }\n\n [role='tooltip'],\n .hide-tooltip.hide-tooltip.hide-tooltip + [role='tooltip'] {\n visibility: hidden;\n position: absolute;\n background: black;\n color: white;\n padding: 1rem;\n border-radius: 8px;\n }\n [aria-describedby]:hover,\n [aria-describedby]:focus {\n position: relative;\n }\n [aria-describedby]:hover + [role='tooltip'],\n [aria-describedby]:focus + [role='tooltip'] {\n visibility: visible;\n }\n `;\n}\n"]}
|