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 };
/**
diff --git a/packages/plugins/src/directDialogMixin.ts b/packages/plugins/src/directDialogMixin.ts
deleted file mode 100644
index 0cc6e3c4..00000000
--- a/packages/plugins/src/directDialogMixin.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-import {
- LitElement,
- TemplateResult,
- html,
- state,
- query,
-} from 'lit-element';
-import { 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';
-
-/**
- * Base class for plugins that manage their own dialogs directly
- * without depending on oscd-wizard
- */
-export class DirectDialogMixin extends LitElement {
- /** FIFO queue of [[`Wizard`]]s to display. */
- @state()
- workflow: WizardFactory[] = [];
-
- @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()
- )
- )
- );
- }
-
- /**
- * 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()
- );
- }
-
- /**
- * Renders the wizard dialog component
- */
- protected renderWizardDialog(): TemplateResult {
- return html``;
- }
-}
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/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 {
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/wizard-mixin.ts b/packages/plugins/src/wizard-mixin.ts
new file mode 100644
index 00000000..54357fcb
--- /dev/null
+++ b/packages/plugins/src/wizard-mixin.ts
@@ -0,0 +1,62 @@
+import { LitElement, TemplateResult, html, state, query } from 'lit-element';
+import {
+ 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';
+
+/**
+ * Base class for plugins that manage their own wizards
+ * without depending on oscd-wizard
+ */
+export class WizardMixin extends LitElement {
+ /** FIFO queue of [[`Wizard`]]s to display. */
+ @state()
+ workflow: WizardFactory[] = [];
+
+ @query('wizard-dialog') wizardUI!: WizardDialog;
+
+ protected renderWizardDialog(): TemplateResult {
+ return html`
+
+ `;
+ }
+
+ connectedCallback(): void {
+ super.connectedCallback();
+ this.addEventListener('wizard', this.onWizard);
+ this.addEventListener('editor-action', this.onEditorAction);
+ }
+
+ 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();
+ };
+
+ private onEditorAction = () => {
+ this.wizardUI?.requestUpdate();
+ };
+}