From 98bc750ae6b07925d9f88f9cd61dc724e8625202 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20Russ?= Date: Thu, 28 Aug 2025 08:00:23 +0200 Subject: [PATCH 1/5] fix: type errors --- .../src/editors/protocol104/foundation/foundation.ts | 2 +- .../plugins/src/editors/subscription/fcda-binding-list.ts | 4 ++-- packages/plugins/src/editors/substation/l-node-editor.ts | 6 ++---- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/plugins/src/editors/protocol104/foundation/foundation.ts b/packages/plugins/src/editors/protocol104/foundation/foundation.ts index 001a34be..a8360d6f 100644 --- a/packages/plugins/src/editors/protocol104/foundation/foundation.ts +++ b/packages/plugins/src/editors/protocol104/foundation/foundation.ts @@ -373,7 +373,7 @@ export function getDaElementByDaiElement( * @param daElement - The DA Element for which to check. */ function isEnumType(daElement: Element | undefined) { - return daElement?.getAttribute('bType') === 'Enum' ?? false; + return daElement?.getAttribute('bType') === 'Enum'; } /** diff --git a/packages/plugins/src/editors/subscription/fcda-binding-list.ts b/packages/plugins/src/editors/subscription/fcda-binding-list.ts index f4ec432e..ecc19ec1 100644 --- a/packages/plugins/src/editors/subscription/fcda-binding-list.ts +++ b/packages/plugins/src/editors/subscription/fcda-binding-list.ts @@ -82,7 +82,7 @@ export class FcdaBindingList extends LitElement { `fcda-binding-list-${ this.includeLaterBinding ? 'later-binding' : 'data-binding' }-${this.controlTag}$hideSubscribed` - ) === 'true' ?? false + ) === 'true' ); } @@ -109,7 +109,7 @@ export class FcdaBindingList extends LitElement { `fcda-binding-list-${ this.includeLaterBinding ? 'later-binding' : 'data-binding' }-${this.controlTag}$hideNotSubscribed` - ) === 'true' ?? false + ) === 'true' ); } diff --git a/packages/plugins/src/editors/substation/l-node-editor.ts b/packages/plugins/src/editors/substation/l-node-editor.ts index 9c0aeb42..4b9cdc78 100644 --- a/packages/plugins/src/editors/substation/l-node-editor.ts +++ b/packages/plugins/src/editors/substation/l-node-editor.ts @@ -14,9 +14,7 @@ import { newWizardEvent, } from '@openscd/open-scd/src/foundation.js'; -import { - cloneElement, -} from '@openscd/xml'; +import { cloneElement } from '@openscd/xml'; import { newActionEvent } from '@openscd/core/foundation/deprecated/editor.js'; import { @@ -86,7 +84,7 @@ export class LNodeEditor extends LitElement { } @state() private get missingIedReference(): boolean { - return this.element.getAttribute('iedName') === 'None' ?? false; + return this.element.getAttribute('iedName') === 'None'; } @state() private get isIEDReference(): boolean { From d271ddaa3551083a9a42baada2cb3a517b3eb480 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20Russ?= Date: Thu, 28 Aug 2025 08:04:05 +0200 Subject: [PATCH 2/5] fix: import path --- packages/openscd/src/translations/loader.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/openscd/src/translations/loader.ts b/packages/openscd/src/translations/loader.ts index 9b7a74b9..1309d1b8 100644 --- a/packages/openscd/src/translations/loader.ts +++ b/packages/openscd/src/translations/loader.ts @@ -1,6 +1,6 @@ import { de } from './de.js'; import { en } from './en.js'; -import { Language } from '@openscd/core/dist/foundation/deprecated/settings'; +import { Language } from '@openscd/core/foundation/deprecated/settings'; export const languages = { en, de }; /** From db02165fe6f34baa61494b662530d9a1936e7fca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20Russ?= Date: Thu, 28 Aug 2025 08:08:18 +0200 Subject: [PATCH 3/5] ref: rename mixin --- packages/plugins/src/editors/Cleanup.ts | 19 ++++++++--- packages/plugins/src/editors/Communication.ts | 25 +++++++------- .../src/editors/GooseSubscriberDataBinding.ts | 4 +-- .../editors/GooseSubscriberMessageBinding.ts | 4 +-- packages/plugins/src/editors/IED.ts | 10 +++--- packages/plugins/src/editors/Protocol104.ts | 4 +-- .../src/editors/SMVSubscriberDataBinding.ts | 4 +-- .../editors/SMVSubscriberMessageBinding.ts | 4 +-- .../plugins/src/editors/SingleLineDiagram.ts | 4 +-- packages/plugins/src/editors/Substation.ts | 4 +-- packages/plugins/src/editors/Templates.ts | 33 ++++++++----------- packages/plugins/src/menu/CompareIED.ts | 4 +-- packages/plugins/src/menu/Help.ts | 19 ++++++----- packages/plugins/src/menu/ImportIEDs.ts | 7 ++-- packages/plugins/src/menu/Merge.ts | 4 +-- packages/plugins/src/menu/NewProject.ts | 16 ++++----- packages/plugins/src/menu/OpenProject.ts | 4 +-- packages/plugins/src/menu/SaveProject.ts | 4 +-- packages/plugins/src/menu/SclHistory.ts | 4 +-- packages/plugins/src/menu/SubscriberInfo.ts | 4 +-- packages/plugins/src/menu/UpdateSubstation.ts | 4 +-- .../src/validators/ValidateTemplates.ts | 4 +-- .../{directDialogMixin.ts => wizard-mixin.ts} | 17 +++++----- 23 files changed, 106 insertions(+), 100 deletions(-) rename packages/plugins/src/{directDialogMixin.ts => wizard-mixin.ts} (81%) diff --git a/packages/plugins/src/editors/Cleanup.ts b/packages/plugins/src/editors/Cleanup.ts index 26038f1a..d7f3d069 100644 --- a/packages/plugins/src/editors/Cleanup.ts +++ b/packages/plugins/src/editors/Cleanup.ts @@ -3,14 +3,14 @@ import { css, html, LitElement, property, TemplateResult } from 'lit-element'; import { styles } from './templates/foundation.js'; -import { DirectDialogMixin } from '../directDialogMixin.js'; +import { WizardMixin } from '../wizard-mixin.js'; import './cleanup/datasets-container.js'; import './cleanup/control-blocks-container.js'; import './cleanup/datatypes-container.js'; /** An editor [[`plugin`]] for cleaning SCL references and definitions. */ -export default class Cleanup extends DirectDialogMixin { +export default class Cleanup extends WizardMixin { /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ @property() doc!: XMLDocument; @@ -20,9 +20,18 @@ export default class Cleanup extends DirectDialogMixin { render(): TemplateResult { return html`
- - - + + +
${this.renderWizardDialog()} `; diff --git a/packages/plugins/src/editors/Communication.ts b/packages/plugins/src/editors/Communication.ts index 2637d482..da5d5b2e 100644 --- a/packages/plugins/src/editors/Communication.ts +++ b/packages/plugins/src/editors/Communication.ts @@ -10,16 +10,16 @@ import './ied/access-point-container.js'; import { newWizardEvent, WizardEvent, - isPublic + isPublic, } from '@openscd/open-scd/src/foundation.js'; import { createElement } from '@openscd/xml'; import { newActionEvent } from '@openscd/core/foundation/deprecated/editor.js'; import { wizards } from '../wizards/wizard-library.js'; import { createSubNetworkWizard } from '../wizards/subnetwork.js'; -import { DirectDialogMixin } from '../directDialogMixin.js'; +import { WizardMixin } from '../wizard-mixin.js'; /** An editor [[`plugin`]] for editing the `Communication` section. */ -export default class CommunicationPlugin extends DirectDialogMixin { +export default class CommunicationPlugin extends WizardMixin { /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ @property() doc!: XMLDocument; @@ -55,15 +55,16 @@ export default class CommunicationPlugin extends DirectDialogMixin { render(): TemplateResult { if (!this.doc?.querySelector(':root > Communication >SubNetwork')) return html`

- ${get('communication.missing')} this.openCreateSubNetworkWizard()} - > -

- ${this.renderWizardDialog()}`; + ${get('communication.missing')} this.openCreateSubNetworkWizard()} + > + + ${this.renderWizardDialog()}`; return html``; } return html`

- ${get('iededitor.missing')} -

- ${this.renderWizardDialog()}`; + ${get('iededitor.missing')} + + ${this.renderWizardDialog()}`; } static styles = css` diff --git a/packages/plugins/src/editors/Protocol104.ts b/packages/plugins/src/editors/Protocol104.ts index 6538831d..f286d5f0 100644 --- a/packages/plugins/src/editors/Protocol104.ts +++ b/packages/plugins/src/editors/Protocol104.ts @@ -26,12 +26,12 @@ import { import { newWizardEvent } from '@openscd/open-scd/src/foundation.js'; import { wizards } from '../wizards/wizard-library.js'; -import { DirectDialogMixin } from '../directDialogMixin.js'; +import { WizardMixin } from '../wizard-mixin.js'; /** Defining view outside the class, which makes it persistent. */ let selectedViewProtocol104Plugin: View = View.VALUES; -export default class Communication104Plugin extends DirectDialogMixin { +export default class Communication104Plugin extends WizardMixin { @property() doc!: XMLDocument; @property({ type: Number }) diff --git a/packages/plugins/src/editors/SMVSubscriberDataBinding.ts b/packages/plugins/src/editors/SMVSubscriberDataBinding.ts index ee64e6df..3976ff7e 100644 --- a/packages/plugins/src/editors/SMVSubscriberDataBinding.ts +++ b/packages/plugins/src/editors/SMVSubscriberDataBinding.ts @@ -4,10 +4,10 @@ import { Nsdoc } from '@openscd/open-scd/src/foundation/nsdoc.js'; import './subscription/fcda-binding-list.js'; import './subscription/later-binding/ext-ref-ln-binding-list.js'; -import { DirectDialogMixin } from '../directDialogMixin.js'; +import { WizardMixin } from '../wizard-mixin.js'; /** An editor [[`plugin`]] for Subscribe Data Binding (SMV). */ -export default class SMVSubscribeDataBindingPlugin extends DirectDialogMixin { +export default class SMVSubscribeDataBindingPlugin extends WizardMixin { @property({ attribute: false }) doc!: XMLDocument; @property({ type: Number }) diff --git a/packages/plugins/src/editors/SMVSubscriberMessageBinding.ts b/packages/plugins/src/editors/SMVSubscriberMessageBinding.ts index e2641ffe..b69f0e84 100644 --- a/packages/plugins/src/editors/SMVSubscriberMessageBinding.ts +++ b/packages/plugins/src/editors/SMVSubscriberMessageBinding.ts @@ -14,13 +14,13 @@ import './subscription/sampledvalues/subscriber-list.js'; import './subscription/sampledvalues/smv-list.js'; import './subscription/ied-list.js'; import { newViewEvent, View, ViewEvent } from './subscription/foundation.js'; -import { DirectDialogMixin } from '../directDialogMixin.js'; +import { WizardMixin } from '../wizard-mixin.js'; /** Defining view outside the class, which makes it persistent. */ let view: View = View.PUBLISHER; /** An editor [[`plugin`]] for subscribing IEDs to Sampled Values. */ -export default class SMVSubscriberMessageBindingPlugin extends DirectDialogMixin { +export default class SMVSubscriberMessageBindingPlugin extends WizardMixin { /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ @property() doc!: XMLDocument; diff --git a/packages/plugins/src/editors/SingleLineDiagram.ts b/packages/plugins/src/editors/SingleLineDiagram.ts index 66bbc159..8c3851a1 100644 --- a/packages/plugins/src/editors/SingleLineDiagram.ts +++ b/packages/plugins/src/editors/SingleLineDiagram.ts @@ -48,7 +48,7 @@ import { isSCLNamespace } from '@openscd/open-scd/src/schemas.js'; import { wizards } from './singlelinediagram/wizards/wizard-library.js'; import { SingleSelectedEvent } from '@material/mwc-list/mwc-list-foundation'; import { get } from '../translation.js'; -import { DirectDialogMixin } from '../directDialogMixin.js'; +import { WizardMixin } from '../wizard-mixin.js'; import '@material/mwc-list/mwc-list-item'; import '@material/mwc-select'; @@ -71,7 +71,7 @@ addEventListener('open-doc', onOpenDocResetSelectedSubstation); /** * Main class plugin for Single Line Diagram editor. */ -export default class SingleLineDiagramPlugin extends DirectDialogMixin { +export default class SingleLineDiagramPlugin extends WizardMixin { // The full given XML document. @property({ attribute: false }) doc!: XMLDocument; diff --git a/packages/plugins/src/editors/Substation.ts b/packages/plugins/src/editors/Substation.ts index 9b9b4a2e..f03aadb4 100644 --- a/packages/plugins/src/editors/Substation.ts +++ b/packages/plugins/src/editors/Substation.ts @@ -6,10 +6,10 @@ import '@material/mwc-fab'; import './substation/zeroline-pane.js'; import { newWizardEvent } from '@openscd/open-scd/src/foundation.js'; import { wizards } from '../wizards/wizard-library.js'; -import { DirectDialogMixin } from '../directDialogMixin.js'; +import { WizardMixin } from '../wizard-mixin.js'; /** An editor [[`plugin`]] for editing the `Substation` section. */ -export default class SubstationPlugin extends DirectDialogMixin { +export default class SubstationPlugin extends WizardMixin { /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ @property() doc!: XMLDocument; diff --git a/packages/plugins/src/editors/Templates.ts b/packages/plugins/src/editors/Templates.ts index faf74d9f..30aab1f9 100644 --- a/packages/plugins/src/editors/Templates.ts +++ b/packages/plugins/src/editors/Templates.ts @@ -7,14 +7,9 @@ import '@material/mwc-list'; import '@material/mwc-list/mwc-list-item'; import '@openscd/open-scd/src/filtered-list.js'; -import { - identity, - newWizardEvent, -} from '@openscd/open-scd/src/foundation.js'; +import { identity, newWizardEvent } from '@openscd/open-scd/src/foundation.js'; -import { - createElement, -} from '@openscd/xml'; +import { createElement } from '@openscd/xml'; import { newActionEvent } from '@openscd/core/foundation/deprecated/editor.js'; import { styles } from './templates/foundation.js'; @@ -40,7 +35,7 @@ import { List } from '@material/mwc-list'; import { ListItem } from '@material/mwc-list/mwc-list-item'; import { SingleSelectedEvent } from '@material/mwc-list/mwc-list-foundation'; -import { DirectDialogMixin } from '../directDialogMixin.js'; +import { WizardMixin } from '../wizard-mixin.js'; const templates = fetch('public/xml/templates.scd') .then(response => response.text()) @@ -55,14 +50,14 @@ const nsd7420 = fetch('public/xml/IEC_61850-7-420_2019A4.nsd') .then(str => new DOMParser().parseFromString(str, 'application/xml')); /** An editor [[`plugin`]] for editing the `DataTypeTemplates` section. */ -export default class TemplatesPlugin extends DirectDialogMixin { +export default class TemplatesPlugin extends WizardMixin { /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ @property({ attribute: false }) doc!: XMLDocument; @property({ type: Number }) editCount = -1; - @property({attribute:false}) api: unknown + @property({ attribute: false }) api: unknown; updated(changedProperties: Map): void { if (changedProperties.has('api')) { @@ -171,15 +166,15 @@ export default class TemplatesPlugin extends DirectDialogMixin { render(): TemplateResult { if (!this.doc?.querySelector(':root > DataTypeTemplates')) return html`

- ${get('templates.missing')} - this.createDataTypeTemplates()} - > -

- ${this.renderWizardDialog()}`; + ${get('templates.missing')} + this.createDataTypeTemplates()} + > + + ${this.renderWizardDialog()}`; return html`
diff --git a/packages/plugins/src/menu/CompareIED.ts b/packages/plugins/src/menu/CompareIED.ts index fb8c8629..7e286132 100644 --- a/packages/plugins/src/menu/CompareIED.ts +++ b/packages/plugins/src/menu/CompareIED.ts @@ -29,7 +29,7 @@ import { } from '@openscd/open-scd/src/foundation.js'; import { newPendingStateEvent } from '@openscd/core/foundation/deprecated/waiter.js'; import { DiffFilter } from '@openscd/open-scd/src/foundation/compare.js'; -import { DirectDialogMixin } from '../directDialogMixin.js'; +import { WizardMixin } from '../wizard-mixin.js'; const tctrClass = `LN[lnClass='TCTR']`; const tvtrClass = `LN[lnClass='TVTR']`; @@ -74,7 +74,7 @@ filterToIgnore[`${tvtrClass} DOI[name='Rat'] ${setMag}`] = { filterToIgnore[`${tvtrClass} DOI[name='VRtgSec'] ${setVal}`] = { full: true, }; -export default class CompareIEDPlugin extends DirectDialogMixin { +export default class CompareIEDPlugin extends WizardMixin { @property({ attribute: false }) doc!: XMLDocument; @property({ type: Number }) diff --git a/packages/plugins/src/menu/Help.ts b/packages/plugins/src/menu/Help.ts index ba36e6ef..6e488a31 100644 --- a/packages/plugins/src/menu/Help.ts +++ b/packages/plugins/src/menu/Help.ts @@ -8,10 +8,11 @@ import '@openscd/open-scd/src/finder-list.js'; import { newWizardEvent, Wizard } from '@openscd/open-scd/src/foundation.js'; import { openSCDIcon } from '@openscd/open-scd/src/icons/icons.js'; import { Directory } from '@openscd/open-scd/src/finder-list.js'; -import { DirectDialogMixin } from '../directDialogMixin.js'; +import { WizardMixin } from '../wizard-mixin.js'; -const GITHUB_WIKI_LINK_PATTERN = /https:\/\/github\.com\/openscd\/open-scd\/wiki\/([^)]*)/g; -const MD_LINK_TITLE_PATTERN ='([^\\]]*)'; +const GITHUB_WIKI_LINK_PATTERN = + /https:\/\/github\.com\/openscd\/open-scd\/wiki\/([^)]*)/g; +const MD_LINK_TITLE_PATTERN = '([^\\]]*)'; const HYPHEN_PATTERN = /-/g; function aboutBox(version: string) { @@ -50,9 +51,12 @@ async function getLinkedPages(path: string[]): Promise { const page = path[path.length - 1].replace(/ /g, '-'); const res = await fetch(`/openscd/public/md/${page}.md`); const md = await res.text(); - const MD_LINK_REPLACEMENT = `$1` + const MD_LINK_REPLACEMENT = `$1`; const unlinkedMd = md.replace( - new RegExp(`\\[${MD_LINK_TITLE_PATTERN}\\]\\(${GITHUB_WIKI_LINK_PATTERN.source}\\)`, 'g'), + new RegExp( + `\\[${MD_LINK_TITLE_PATTERN}\\]\\(${GITHUB_WIKI_LINK_PATTERN.source}\\)`, + 'g' + ), MD_LINK_REPLACEMENT ); @@ -61,8 +65,7 @@ async function getLinkedPages(path: string[]): Promise { ${unsafeHTML(marked.parse(unlinkedMd))}
`; const entries = Array.from( - md.matchAll( new RegExp(`\\(${GITHUB_WIKI_LINK_PATTERN.source}\\)`, 'g')) - + md.matchAll(new RegExp(`\\(${GITHUB_WIKI_LINK_PATTERN.source}\\)`, 'g')) ).map(([_, child]) => child.replace(HYPHEN_PATTERN, ' ')); return { path, header, entries }; @@ -82,7 +85,7 @@ export function aboutBoxWizard(): Wizard { ]; } -export default class HelpPlugin extends DirectDialogMixin { +export default class HelpPlugin extends WizardMixin { async run(): Promise { this.dispatchEvent(newWizardEvent(aboutBoxWizard())); } diff --git a/packages/plugins/src/menu/ImportIEDs.ts b/packages/plugins/src/menu/ImportIEDs.ts index ab809a3b..01afa8cc 100644 --- a/packages/plugins/src/menu/ImportIEDs.ts +++ b/packages/plugins/src/menu/ImportIEDs.ts @@ -26,7 +26,7 @@ import { newActionEvent, } from '@openscd/core/foundation/deprecated/editor.js'; import { newLogEvent } from '@openscd/core/foundation/deprecated/history'; -import { DirectDialogMixin } from '../directDialogMixin.js'; +import { WizardMixin } from '../wizard-mixin.js'; function uniqueTemplateIedName(doc: XMLDocument, ied: Element): string { const [manufacturer, type] = ['manufacturer', 'type'].map(attr => @@ -368,7 +368,7 @@ function isIedNameUnique(ied: Element, doc: Document): boolean { return true; } -export default class ImportingIedPlugin extends DirectDialogMixin { +export default class ImportingIedPlugin extends WizardMixin { @property({ attribute: false }) doc!: XMLDocument; @property({ type: Number }) @@ -577,7 +577,8 @@ export default class ImportingIedPlugin extends DirectDialogMixin { } render(): TemplateResult { - return html`${this.iedSelection}${this.renderInput()}${this.renderWizardDialog()}`; + return html`${this + .iedSelection}${this.renderInput()}${this.renderWizardDialog()}`; } static styles = css` diff --git a/packages/plugins/src/menu/Merge.ts b/packages/plugins/src/menu/Merge.ts index 20d07997..37dbafc4 100644 --- a/packages/plugins/src/menu/Merge.ts +++ b/packages/plugins/src/menu/Merge.ts @@ -2,9 +2,9 @@ import { css, html, LitElement, query, TemplateResult } from 'lit-element'; import { newWizardEvent } from '@openscd/open-scd/src/foundation.js'; import { mergeWizard } from '@openscd/open-scd/src/wizards.js'; -import { DirectDialogMixin } from '../directDialogMixin.js'; +import { WizardMixin } from '../wizard-mixin.js'; -export default class MergePlugin extends DirectDialogMixin { +export default class MergePlugin extends WizardMixin { doc!: XMLDocument; @query('#merge-plugin-input') pluginFileUI!: HTMLInputElement; diff --git a/packages/plugins/src/menu/NewProject.ts b/packages/plugins/src/menu/NewProject.ts index c19c5be8..78c16723 100644 --- a/packages/plugins/src/menu/NewProject.ts +++ b/packages/plugins/src/menu/NewProject.ts @@ -18,23 +18,21 @@ import { newEmptySCD, SupportedVersion, } from '@openscd/open-scd/src/schemas.js'; -import { DirectDialogMixin } from '../directDialogMixin.js'; - -export default class NewProjectPlugin extends DirectDialogMixin { +import { WizardMixin } from '../wizard-mixin.js'; +export default class NewProjectPlugin extends WizardMixin { private createNewProject( inputs: WizardInputElement[], wizard: Element ): EditorAction[] { + let docName = inputs[0].value ?? ''; - let docName = inputs[0].value ?? '' - - const acceptedFileExtension = ['.ssd', '.scd','.fsd']; - const isValidFileFormat = acceptedFileExtension.some((extension) => { + const acceptedFileExtension = ['.ssd', '.scd', '.fsd']; + const isValidFileFormat = acceptedFileExtension.some(extension => { return inputs[0].value?.endsWith(extension); - }) + }); - if(!isValidFileFormat) { + if (!isValidFileFormat) { docName = docName + '.scd'; } diff --git a/packages/plugins/src/menu/OpenProject.ts b/packages/plugins/src/menu/OpenProject.ts index 5cfe182a..37e7a287 100644 --- a/packages/plugins/src/menu/OpenProject.ts +++ b/packages/plugins/src/menu/OpenProject.ts @@ -2,9 +2,9 @@ import { css, html, LitElement, query, TemplateResult } from 'lit-element'; import { newOpenDocEvent } from '@openscd/core/foundation/deprecated/open-event.js'; import { newLogEvent } from '@openscd/core/foundation/deprecated/history.js'; -import { DirectDialogMixin } from '../directDialogMixin.js'; +import { WizardMixin } from '../wizard-mixin.js'; -export default class OpenProjectPlugin extends DirectDialogMixin { +export default class OpenProjectPlugin extends WizardMixin { @query('#open-plugin-input') pluginFileUI!: HTMLInputElement; async openDoc(event: Event): Promise { diff --git a/packages/plugins/src/menu/SaveProject.ts b/packages/plugins/src/menu/SaveProject.ts index 8819af91..f4eae17a 100644 --- a/packages/plugins/src/menu/SaveProject.ts +++ b/packages/plugins/src/menu/SaveProject.ts @@ -1,5 +1,5 @@ import { LitElement, property, html, TemplateResult } from 'lit-element'; -import { DirectDialogMixin } from '../directDialogMixin.js'; +import { WizardMixin } from '../wizard-mixin.js'; function formatXml(xml: string, tab?: string) { let formatted = '', @@ -14,7 +14,7 @@ function formatXml(xml: string, tab?: string) { return formatted.substring(1, formatted.length - 3); } -export default class SaveProjectPlugin extends DirectDialogMixin { +export default class SaveProjectPlugin extends WizardMixin { @property() doc!: XMLDocument; @property() docName!: string; diff --git a/packages/plugins/src/menu/SclHistory.ts b/packages/plugins/src/menu/SclHistory.ts index 148ebee1..38bbe766 100644 --- a/packages/plugins/src/menu/SclHistory.ts +++ b/packages/plugins/src/menu/SclHistory.ts @@ -13,9 +13,9 @@ import '@material/mwc-dialog'; import '@material/mwc-list'; import '@material/mwc-list/mwc-list-item'; import { Dialog } from '@material/mwc-dialog'; -import { DirectDialogMixin } from '../directDialogMixin.js'; +import { WizardMixin } from '../wizard-mixin.js'; -export default class SclHistoryPlugin extends DirectDialogMixin { +export default class SclHistoryPlugin extends WizardMixin { @property({ attribute: false }) doc!: XMLDocument; @property({ type: Number }) diff --git a/packages/plugins/src/menu/SubscriberInfo.ts b/packages/plugins/src/menu/SubscriberInfo.ts index 052efd7a..e4436c56 100644 --- a/packages/plugins/src/menu/SubscriberInfo.ts +++ b/packages/plugins/src/menu/SubscriberInfo.ts @@ -15,7 +15,7 @@ import '@material/mwc-list'; import '@material/mwc-list/mwc-list-item'; import '@openscd/open-scd/src/filtered-list.js'; -import { DirectDialogMixin } from '../directDialogMixin.js'; +import { WizardMixin } from '../wizard-mixin.js'; import { getVersion } from '@openscd/open-scd/src/foundation.js'; @@ -165,7 +165,7 @@ export function createMissingIEDNameSubscriberInfo( return simpleAction; } -export default class SubscriberInfoPlugin extends DirectDialogMixin { +export default class SubscriberInfoPlugin extends WizardMixin { doc!: XMLDocument; async run(): Promise { diff --git a/packages/plugins/src/menu/UpdateSubstation.ts b/packages/plugins/src/menu/UpdateSubstation.ts index 627fc7dd..b913a6d3 100644 --- a/packages/plugins/src/menu/UpdateSubstation.ts +++ b/packages/plugins/src/menu/UpdateSubstation.ts @@ -16,7 +16,7 @@ import '@material/mwc-list'; import { Dialog } from '@material/mwc-dialog'; import { List } from '@material/mwc-list'; -import { DirectDialogMixin } from '../directDialogMixin.js'; +import { WizardMixin } from '../wizard-mixin.js'; import { crossProduct, @@ -129,7 +129,7 @@ export function mergeSubstation( ); } -export default class UpdateSubstationPlugin extends DirectDialogMixin { +export default class UpdateSubstationPlugin extends WizardMixin { doc!: XMLDocument; @query('#update-substation-plugin-input') pluginFileUI!: HTMLInputElement; diff --git a/packages/plugins/src/validators/ValidateTemplates.ts b/packages/plugins/src/validators/ValidateTemplates.ts index e94110ec..f28a0830 100644 --- a/packages/plugins/src/validators/ValidateTemplates.ts +++ b/packages/plugins/src/validators/ValidateTemplates.ts @@ -7,11 +7,11 @@ import { newLogEvent, } from '@openscd/core/foundation/deprecated/history.js'; import { validateChildren } from './templates/foundation.js'; -import { DirectDialogMixin } from '../directDialogMixin.js'; +import { WizardMixin } from '../wizard-mixin.js'; type ValidationResult = LogDetailBase | LogDetail; -export default class ValidateTemplates extends DirectDialogMixin { +export default class ValidateTemplates extends WizardMixin { @property({ attribute: false }) doc!: XMLDocument; @property() diff --git a/packages/plugins/src/directDialogMixin.ts b/packages/plugins/src/wizard-mixin.ts similarity index 81% rename from packages/plugins/src/directDialogMixin.ts rename to packages/plugins/src/wizard-mixin.ts index 0cc6e3c4..23822783 100644 --- a/packages/plugins/src/directDialogMixin.ts +++ b/packages/plugins/src/wizard-mixin.ts @@ -1,11 +1,8 @@ +import { LitElement, TemplateResult, html, state, query } from 'lit-element'; import { - LitElement, - TemplateResult, - html, - state, - query, -} from 'lit-element'; -import { WizardEvent, WizardFactory } from '@openscd/open-scd/src/foundation.js'; + WizardEvent, + WizardFactory, +} from '@openscd/open-scd/src/foundation.js'; import { WizardDialog } from '@openscd/open-scd/src/wizard-dialog.js'; import '@openscd/open-scd/src/wizard-dialog.js'; @@ -13,7 +10,7 @@ import '@openscd/open-scd/src/wizard-dialog.js'; * Base class for plugins that manage their own dialogs directly * without depending on oscd-wizard */ -export class DirectDialogMixin extends LitElement { +export class WizardMixin extends LitElement { /** FIFO queue of [[`Wizard`]]s to display. */ @state() workflow: WizardFactory[] = []; @@ -53,6 +50,8 @@ export class DirectDialogMixin extends LitElement { * Renders the wizard dialog component */ protected renderWizardDialog(): TemplateResult { - return html``; + return html``; } } From 9e46e835867ec9ef7f54d98f49fb0154deb21286 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20Russ?= Date: Thu, 28 Aug 2025 08:56:30 +0200 Subject: [PATCH 4/5] ref: wizardmixin --- packages/plugins/src/wizard-mixin.ts | 75 ++++++++++++++++------------ 1 file changed, 44 insertions(+), 31 deletions(-) diff --git a/packages/plugins/src/wizard-mixin.ts b/packages/plugins/src/wizard-mixin.ts index 23822783..ad5458d9 100644 --- a/packages/plugins/src/wizard-mixin.ts +++ b/packages/plugins/src/wizard-mixin.ts @@ -7,7 +7,7 @@ import { WizardDialog } from '@openscd/open-scd/src/wizard-dialog.js'; import '@openscd/open-scd/src/wizard-dialog.js'; /** - * Base class for plugins that manage their own dialogs directly + * Base class for plugins that manage their own wizards * without depending on oscd-wizard */ export class WizardMixin extends LitElement { @@ -17,41 +17,54 @@ export class WizardMixin extends LitElement { @query('wizard-dialog') wizardUI!: WizardDialog; - /** - * Handles wizard events by adding or removing wizards from the workflow - */ - private onWizard(we: WizardEvent) { - const wizard = we.detail.wizard; - if (wizard === null) this.workflow.shift(); - else if (we.detail.subwizard) this.workflow.unshift(wizard); - else this.workflow.push(wizard); - this.requestUpdate('workflow'); - this.updateComplete.then(() => - this.wizardUI?.updateComplete.then(() => - this.wizardUI?.dialog?.updateComplete.then(() => - this.wizardUI?.dialog?.focus() - ) - ) - ); + protected renderWizardDialog(): TemplateResult { + return html` + + `; } - /** - * Add event listeners for wizard events and editor actions - */ connectedCallback(): void { super.connectedCallback(); - this.addEventListener('wizard', this.onWizard.bind(this)); - this.addEventListener('editor-action', () => - this.wizardUI?.requestUpdate() - ); + this.addEventListener('wizard', this.onWizard); + this.addEventListener('editor-action', this.onEditorAction); } - /** - * Renders the wizard dialog component - */ - protected renderWizardDialog(): TemplateResult { - return html``; + disconnectedCallback(): void { + super.disconnectedCallback(); + this.removeEventListener('wizard', this.onWizard); + this.removeEventListener('editor-action', this.onEditorAction); } + + private onWizard = async (we: WizardEvent) => { + we.stopImmediatePropagation(); + we.stopPropagation(); + + const wizard = we.detail.wizard; + if (wizard === null) { + this.workflow.shift(); + } else if (we.detail.subwizard) { + this.workflow.unshift(wizard); + } else { + this.workflow.push(wizard); + } + + this.requestUpdate('workflow'); + + await this.updateComplete; + await this.wizardUI?.updateComplete; + await this.wizardUI.dialog?.updateComplete; + this.wizardUI.dialog?.focus(); + + // this.updateComplete.then(() => + // this.wizardUI?.updateComplete.then(() => + // this.wizardUI?.dialog?.updateComplete.then(() => + // this.wizardUI?.dialog?.focus() + // ) + // ) + // ); + }; + + private onEditorAction = () => { + this.wizardUI?.requestUpdate(); + }; } From 3745ef54fd3fb010c11a012380eb4adf3d566cf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20Russ?= Date: Thu, 28 Aug 2025 11:09:53 +0200 Subject: [PATCH 5/5] ref: remove dead code --- packages/plugins/src/wizard-mixin.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/plugins/src/wizard-mixin.ts b/packages/plugins/src/wizard-mixin.ts index ad5458d9..54357fcb 100644 --- a/packages/plugins/src/wizard-mixin.ts +++ b/packages/plugins/src/wizard-mixin.ts @@ -54,14 +54,6 @@ export class WizardMixin extends LitElement { await this.wizardUI?.updateComplete; await this.wizardUI.dialog?.updateComplete; this.wizardUI.dialog?.focus(); - - // this.updateComplete.then(() => - // this.wizardUI?.updateComplete.then(() => - // this.wizardUI?.dialog?.updateComplete.then(() => - // this.wizardUI?.dialog?.focus() - // ) - // ) - // ); }; private onEditorAction = () => {