@omicronenergy/oscd-scl-dialogs 0.0.11 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/README.md +4 -2
- package/custom-elements.json +292 -3
- package/dist/OscdSclDialogs.d.ts +2 -0
- package/dist/OscdSclDialogs.js +62 -12
- package/dist/OscdSclDialogs.js.map +1 -1
- package/dist/wizards/dataset.d.ts +2 -0
- package/dist/wizards/dataset.js +86 -0
- package/dist/wizards/dataset.js.map +1 -0
- package/dist/wizards/dataset.spec.d.ts +1 -0
- package/dist/wizards/dataset.spec.js +240 -0
- package/dist/wizards/dataset.spec.js.map +1 -0
- package/dist/wizards/gsecontrol.d.ts +2 -0
- package/dist/wizards/gsecontrol.js +86 -0
- package/dist/wizards/gsecontrol.js.map +1 -0
- package/dist/wizards/gsecontrol.spec.d.ts +1 -0
- package/dist/wizards/gsecontrol.spec.js +216 -0
- package/dist/wizards/gsecontrol.spec.js.map +1 -0
- package/dist/wizards/lnode.d.ts +1 -0
- package/dist/wizards/lnode.js +101 -1
- package/dist/wizards/lnode.js.map +1 -1
- package/dist/wizards/patterns.d.ts +2 -0
- package/dist/wizards/patterns.js +2 -0
- package/dist/wizards/patterns.js.map +1 -1
- package/dist/wizards/sampledvaluecontrol.d.ts +2 -0
- package/dist/wizards/sampledvaluecontrol.js +115 -0
- package/dist/wizards/sampledvaluecontrol.js.map +1 -0
- package/dist/wizards/sampledvaluecontrol.spec.d.ts +1 -0
- package/dist/wizards/sampledvaluecontrol.spec.js +227 -0
- package/dist/wizards/sampledvaluecontrol.spec.js.map +1 -0
- package/dist/wizards/smvopts.d.ts +2 -0
- package/dist/wizards/smvopts.js +43 -0
- package/dist/wizards/smvopts.js.map +1 -0
- package/dist/wizards/smvopts.spec.d.ts +1 -0
- package/dist/wizards/smvopts.spec.js +193 -0
- package/dist/wizards/smvopts.spec.js.map +1 -0
- package/dist/wizards/wizards.js +16 -4
- package/dist/wizards/wizards.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OscdSclDialogs.js","sourceRoot":"","sources":["../OscdSclDialogs.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement, TemplateResult } from 'lit';\nimport { property, query, queryAll, state } from 'lit/decorators.js';\n\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements/lit-element.js';\n\nimport { EditV2 } from '@openscd/oscd-api';\nimport { SclCheckbox } from '@openenergytools/scl-checkbox';\nimport { SclSelect } from '@openenergytools/scl-select';\nimport { SclTextField } from '@openenergytools/scl-text-field';\n\nimport { ActionList } from '@openenergytools/filterable-lists/dist/ActionList.js';\nimport { SelectionList } from '@openenergytools/filterable-lists/dist/SelectionList.js';\n\nimport { MdDialog } from '@scopedelement/material-web/dialog/MdDialog.js';\nimport { MdFilledSelect } from '@scopedelement/material-web/select/MdFilledSelect.js';\nimport { MdFilledTextField } from '@scopedelement/material-web/textfield/MdFilledTextField.js';\nimport { MdIcon } from '@scopedelement/material-web/icon/MdIcon.js';\nimport { MdIconButton } from '@scopedelement/material-web/iconbutton/MdIconButton.js';\nimport { MdFilledButton } from '@scopedelement/material-web/button/MdFilledButton.js';\nimport { MdList } from '@scopedelement/material-web/list/MdList.js';\nimport { MdListItem } from '@scopedelement/material-web/list/MdListItem.js';\nimport { MdSelectOption } from '@scopedelement/material-web/select/MdSelectOption.js';\nimport { MdTextButton } from '@scopedelement/material-web/button/MdTextButton.js';\n\nimport { wizards } from './wizards/wizards.js';\n\nimport { Wizard, WizardActor, WizardInputElement } from './foundation.js';\nimport OscdTextEditor, {\n formatXml,\n newOscdTextEditV2,\n serializeXml,\n} from './OscdTextEditor.js';\nimport { classMap } from 'lit/directives/class-map.js';\n\nexport type EditWizard = {\n element: Element;\n};\n\nexport type CreateWizard = {\n parent: Element;\n tagName: string;\n};\n\nexport type WizardType = EditWizard | CreateWizard;\n\nfunction isCreateWizard(wizardType: unknown): wizardType is CreateWizard {\n return (\n 'parent' in (wizardType as CreateWizard) &&\n 'tagName' in (wizardType as CreateWizard)\n );\n}\n\nfunction isEditWizard(wizardType: unknown): wizardType is EditWizard {\n return (\n !!wizardType &&\n 'element' in (wizardType as EditWizard) &&\n (wizardType as EditWizard).element instanceof Element\n );\n}\n\nfunction getWizard(wizardType: WizardType): Wizard | undefined {\n if (isCreateWizard(wizardType)) {\n const { parent, tagName } = wizardType;\n const wizard = wizards[tagName].create(parent);\n return wizard;\n }\n\n if (isEditWizard(wizardType)) {\n const { element } = wizardType;\n const wizard = wizards[element.tagName].edit(element);\n\n return wizard;\n }\n\n return undefined;\n}\n\nfunction wizardContent(wizardType: WizardType | null): TemplateResult[] {\n return (\n (wizardType && getWizard(wizardType)?.content) || [\n html`<div>Invalid wizard type definition</div>`,\n ]\n );\n}\n\nfunction wizardTitle(wizardType: WizardType | null): string {\n return (\n (wizardType && getWizard(wizardType)?.title) ||\n 'Invalid wizard type definition'\n );\n}\n\nfunction wizardAction(wizardType: WizardType): WizardActor | undefined {\n if (!wizardType) {\n return undefined;\n }\n return getWizard(wizardType)?.primary?.action;\n}\n\nclass BaseElement extends ScopedElementsMixin(LitElement) {}\n\nexport default class OscdSclDialogs extends BaseElement {\n @property({ type: Object })\n wizardType: EditWizard | CreateWizard | null = null;\n\n private dialogClosePromise: {\n resolve: (value: EditV2[]) => void;\n reject: () => void;\n } | null = null;\n\n static scopedElements = {\n 'md-dialog': MdDialog,\n 'md-text-button': MdTextButton,\n 'md-filled-button': MdFilledButton,\n 'scl-checkbox': SclCheckbox,\n 'scl-text-field': SclTextField,\n 'scl-select': SclSelect,\n 'md-filled-textfield': MdFilledTextField,\n 'md-filled-select': MdFilledSelect,\n 'md-select-option': MdSelectOption,\n 'md-icon-button': MdIconButton,\n 'md-icon': MdIcon,\n 'selection-list': SelectionList,\n 'action-list': ActionList,\n 'md-list': MdList,\n 'md-list-item': MdListItem,\n 'oscd-text-editor': OscdTextEditor,\n };\n\n @state()\n private editorMode: boolean = false;\n\n @query('md-dialog')\n dialog!: MdDialog;\n\n @query('oscd-text-editor')\n textEditor!: OscdTextEditor;\n\n @queryAll(\n 'scl-text-field, scl-select, scl-checkbox, md-filled-textfield, md-filled-select',\n )\n inputs!: WizardInputElement[];\n\n @state()\n private initialEditorText: string | undefined;\n\n @state()\n private currentEditorText: string | undefined;\n\n private checkValidity(): boolean {\n return Array.from(this.inputs).every(input => input.checkValidity());\n }\n\n private reportValidity(): void {\n this.inputs.forEach(input => {\n input.reportValidity();\n });\n }\n\n async create(wizardType: CreateWizard): Promise<EditV2[]> {\n this.wizardType = wizardType;\n let edits: EditV2[] = [];\n try {\n edits = await new Promise<EditV2[]>((resolve, reject) => {\n this.dialogClosePromise = { resolve, reject };\n\n this.dialog.show();\n });\n } catch {\n // ignore\n }\n this.close();\n return edits;\n }\n\n async edit(wizardType: EditWizard): Promise<EditV2[]> {\n this.wizardType = wizardType;\n let edits: EditV2[] = [];\n this.initialEditorText = formatXml(serializeXml(this.wizardType.element));\n try {\n edits = await new Promise<EditV2[]>((resolve, reject) => {\n this.dialogClosePromise = { resolve, reject };\n\n this.dialog.show();\n });\n this.close();\n } catch {\n // ignore\n }\n return edits;\n }\n\n /**\n * Close triggers the dialog to close, which in turn triggers the `closed` event that resets the state of the dialog.\n * Why? Because click-away will also close the dialog - no matter how it closes, we want to reset.\n */\n close(): void {\n this.dialog.close();\n }\n\n /**\n * No need to call this directly as the `closed` event will trigger a reset of the dialog's state, but this can be\n * used to manually reset the dialog if needed.\n */\n reset(): void {\n this.editorMode = false;\n this.initialEditorText = undefined;\n this.currentEditorText = undefined;\n this.wizardType = null;\n this.inputs.forEach(input => {\n input.value = '';\n if ('setCustomValidity' in input) {\n input.setCustomValidity('');\n }\n input.reportValidity();\n });\n }\n\n private async applyTextEdits(): Promise<void> {\n if (\n !this.wizardType ||\n !isEditWizard(this.wizardType) ||\n !this.currentEditorText ||\n this.currentEditorText === this.initialEditorText\n ) {\n return;\n }\n\n const element = this.wizardType.element;\n const edits = newOscdTextEditV2({\n element,\n newText: this.currentEditorText,\n });\n if (edits) {\n this.dialogClosePromise?.resolve(edits);\n }\n\n this.close();\n }\n\n private async applyFormValues(action?: WizardActor): Promise<boolean> {\n if (action === undefined) {\n return false;\n }\n\n if (!this.checkValidity()) {\n this.reportValidity();\n return false;\n }\n\n const edits = action(Array.from(this.inputs), this.dialog);\n this.dialogClosePromise?.resolve(edits);\n return true;\n }\n\n private handleToggleEditorMode(): void {\n if (this.editorMode && this.currentEditorText !== this.initialEditorText) {\n const confirmLeave = window.confirm(\n 'You have unsaved changes. Are you sure you want to switch to form view? Your changes will be lost.',\n );\n if (!confirmLeave) {\n return;\n }\n }\n this.editorMode = !this.editorMode;\n // Until we can safely sync edits between the Form and the Editor, we will need to\n // reset the editor text. If the user navigated away from the Editor mode with changes\n // they were already warned those changes would be lost.\n if (this.editorMode && isEditWizard(this.wizardType)) {\n this.currentEditorText = this.initialEditorText;\n }\n }\n\n render(): TemplateResult {\n return html`<div>\n <md-dialog\n class=\"${classMap({\n 'editor-mode': this.editorMode,\n })}\"\n @closed=\"${() => {\n this.reset();\n }}\"\n @cancel=\"${() => {\n this.dialogClosePromise?.reject();\n }}\"\n >\n <div slot=\"headline\" class=\"dialog-header\">\n <span class=\"title\">${wizardTitle(this.wizardType)}</span>\n\n <span class=\"header-actions\">\n <md-icon-button\n ?disabled=\"${!isEditWizard(this.wizardType)}\"\n aria-label=\"Code\"\n @click=\"${() => this.handleToggleEditorMode()}\"\n >\n <md-icon>code</md-icon>\n </md-icon-button>\n </span>\n </div>\n <form slot=\"content\" method=\"dialog\">\n ${this.editorMode\n ? html`<div class=\"editor-content\">\n <oscd-text-editor\n .value=${this.initialEditorText}\n @change=${(e: CustomEvent<string>) => {\n this.currentEditorText = e.detail;\n }}\n ></oscd-text-editor>\n </div>`\n : html`<div class=\"wizard-content\">\n ${wizardContent(this.wizardType)}\n </div>`}\n </form>\n <div slot=\"actions\">\n <md-text-button\n id=\"close-button\"\n form=\"add-data-object\"\n @click=\"${(event: Event) => {\n event.stopImmediatePropagation();\n this.close();\n }}\"\n >Cancel</md-text-button\n >\n <md-filled-button\n form=\"add-data-object\"\n @click=${() =>\n this.editorMode\n ? this.applyTextEdits()\n : this.applyFormValues(wizardAction(this.wizardType!))}\n >Save</md-filled-button\n >\n </div>\n </md-dialog>\n </div>`;\n }\n\n static styles = css`\n *,\n md-filled-button * {\n --md-dialog-container-color: var(\n --wizard-dialog-background-color,\n var(--oscd-base3)\n );\n --md-dialog-headline-color: var(\n --wizard-dialog-text-color,\n var(--oscd-base00)\n );\n --md-dialog-headline-font: var(\n --wizard-dialog-text-font,\n var(--oscd-text-font)\n );\n --md-dialog-supporting-text-color: var(\n --wizard-dialog-text-color,\n var(--oscd-base00)\n );\n --md-dialog-supporting-text-font: var(\n --wizard-dialog-text-font,\n var(--oscd-text-font)\n );\n\n --md-sys-color-primary: var(--wizard-dialog-primary, var(--oscd-primary));\n --md-sys-color-secondary: var(\n --wizard-dialog-secondary,\n var(--oscd-secondary)\n );\n --md-sys-typescale-body-large-font: var(\n --wizard-dialog-text-font,\n var(--oscd-text-font)\n );\n\n --md-sys-color-surface-container-highest: var(\n --wizard-dailog-input-background-color,\n var(--oscd-base3)\n );\n --md-outlined-text-field-input-text-color: var(\n --wizard-dialog-text-color,\n var(--oscd-base00)\n );\n --md-sys-color-on-surface: var(\n --wizard-dialog-text-color,\n var(--oscd-base00)\n );\n --md-sys-color-on-primary: var(\n --wizard-dialog-background-color,\n var(--oscd-base3)\n );\n\n --md-sys-color-surface: var(--wizard-dialog-surface, var(--oscd-base3));\n --md-sys-color-on-surface-variant: var(\n --wizard-dialog-text-color,\n var(--oscd-base00)\n );\n\n --md-menu-container-color: var(\n --wizard-dialog-background-color,\n var(--oscd-base3)\n );\n\n --md-menu-item-selected-container-color: rgb(\n from var(--wizard-dialog-primary, var(--oscd-primary)) r g b / 0.38\n );\n }\n\n md-dialog {\n --md-dialog-container-max-height: 100%;\n --md-dialog-container-max-width: 100%;\n }\n\n md-dialog.editor-mode {\n width: 80%;\n height: 80%;\n }\n\n .dialog-header {\n display: flex;\n align-items: center;\n }\n\n .dialog-header .title {\n flex: 1;\n }\n\n .editor-mode form,\n .editor-content,\n .editor-content oscd-text-editor {\n height: 100%;\n }\n\n .editor-mode form {\n padding-inline: 0px;\n }\n\n .editor-mode form .editor-content {\n border-top: 1px solid var(--oscd-base0);\n border-bottom: 1px solid var(--oscd-base0);\n }\n\n .wizard-content {\n display: flex;\n flex-direction: column;\n }\n\n .wizard-content > * {\n display: block;\n margin-top: 16px;\n }\n `;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"OscdSclDialogs.js","sourceRoot":"","sources":["../OscdSclDialogs.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement, TemplateResult } from 'lit';\nimport { property, query, queryAll, state } from 'lit/decorators.js';\n\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements/lit-element.js';\n\nimport { EditV2 } from '@openscd/oscd-api';\nimport { SclCheckbox } from '@openenergytools/scl-checkbox';\nimport { SclSelect } from '@openenergytools/scl-select';\nimport { SclTextField } from '@openenergytools/scl-text-field';\n\nimport { ActionList } from '@openenergytools/filterable-lists/dist/ActionList.js';\nimport { SelectionList } from '@openenergytools/filterable-lists/dist/SelectionList.js';\n\nimport { MdDialog } from '@scopedelement/material-web/dialog/MdDialog.js';\nimport { MdFilledSelect } from '@scopedelement/material-web/select/MdFilledSelect.js';\nimport { MdFilledTextField } from '@scopedelement/material-web/textfield/MdFilledTextField.js';\nimport { MdIcon } from '@scopedelement/material-web/icon/MdIcon.js';\nimport { MdIconButton } from '@scopedelement/material-web/iconbutton/MdIconButton.js';\nimport { MdFilledButton } from '@scopedelement/material-web/button/MdFilledButton.js';\nimport { MdOutlinedButton } from '@scopedelement/material-web/button/MdOutlinedButton.js';\nimport { MdList } from '@scopedelement/material-web/list/MdList.js';\nimport { MdListItem } from '@scopedelement/material-web/list/MdListItem.js';\nimport { MdSelectOption } from '@scopedelement/material-web/select/MdSelectOption.js';\nimport { MdTextButton } from '@scopedelement/material-web/button/MdTextButton.js';\n\nimport { wizards } from './wizards/wizards.js';\n\nimport { Wizard, WizardActor, WizardInputElement } from './foundation.js';\nimport OscdTextEditor, {\n formatXml,\n newOscdTextEditV2,\n serializeXml,\n} from './OscdTextEditor.js';\nimport { classMap } from 'lit/directives/class-map.js';\n\nexport type EditWizard = {\n element: Element;\n};\n\nexport type CreateWizard = {\n parent: Element;\n tagName: string;\n};\n\nexport type WizardType = EditWizard | CreateWizard;\n\nfunction isCreateWizard(wizardType: unknown): wizardType is CreateWizard {\n return (\n 'parent' in (wizardType as CreateWizard) &&\n 'tagName' in (wizardType as CreateWizard)\n );\n}\n\nfunction isEditWizard(wizardType: unknown): wizardType is EditWizard {\n return (\n !!wizardType &&\n 'element' in (wizardType as EditWizard) &&\n (wizardType as EditWizard).element instanceof Element\n );\n}\n\nfunction getWizard(wizardType: WizardType): Wizard | undefined {\n if (isCreateWizard(wizardType)) {\n const { parent, tagName } = wizardType;\n const wizard = wizards[tagName].create(parent);\n return wizard;\n }\n\n if (isEditWizard(wizardType)) {\n const { element } = wizardType;\n const wizard = wizards[element.tagName].edit(element);\n\n return wizard;\n }\n\n return undefined;\n}\n\nfunction wizardContent(wizardType: WizardType | null): TemplateResult[] {\n const wizard = wizardType && getWizard(wizardType);\n\n if (wizard?.content) {\n return wizard.content;\n }\n\n if (wizardType && isCreateWizard(wizardType)) {\n return [\n html`<div>\n Creating <strong>${wizardType.tagName}</strong> is not yet supported.\n </div>`,\n ];\n }\n\n if (wizardType && isEditWizard(wizardType)) {\n return [\n html`<div class=\"unsupported-message\">\n <p>\n Editing <strong>${wizardType.element.tagName}</strong> Elements is not\n yet supported.\n </p>\n </div>`,\n ];\n }\n\n return [html`<div>Invalid wizard type definition</div>`];\n}\n\nfunction wizardTitle(wizardType: WizardType | null): string {\n const wizard = wizardType && getWizard(wizardType);\n\n if (wizard?.title) {\n return wizard.title;\n }\n\n if (wizardType && isCreateWizard(wizardType)) {\n return `Add ${wizardType.tagName}`;\n }\n\n if (wizardType && isEditWizard(wizardType)) {\n return `Edit ${wizardType.element.tagName}`;\n }\n\n return 'Error';\n}\n\nfunction wizardAction(wizardType: WizardType): WizardActor | undefined {\n if (!wizardType) {\n return undefined;\n }\n return getWizard(wizardType)?.primary?.action;\n}\n\nclass BaseElement extends ScopedElementsMixin(LitElement) {}\n\nexport default class OscdSclDialogs extends BaseElement {\n @property({ type: Object })\n wizardType: EditWizard | CreateWizard | null = null;\n\n private dialogClosePromise: {\n resolve: (value: EditV2[]) => void;\n reject: () => void;\n } | null = null;\n\n static scopedElements = {\n 'md-dialog': MdDialog,\n 'md-text-button': MdTextButton,\n 'md-filled-button': MdFilledButton,\n 'md-outlined-button': MdOutlinedButton,\n 'scl-checkbox': SclCheckbox,\n 'scl-text-field': SclTextField,\n 'scl-select': SclSelect,\n 'md-filled-textfield': MdFilledTextField,\n 'md-filled-select': MdFilledSelect,\n 'md-select-option': MdSelectOption,\n 'md-icon-button': MdIconButton,\n 'md-icon': MdIcon,\n 'selection-list': SelectionList,\n 'action-list': ActionList,\n 'md-list': MdList,\n 'md-list-item': MdListItem,\n 'oscd-text-editor': OscdTextEditor,\n };\n\n @state()\n private editorMode: boolean = false;\n\n @query('md-dialog')\n dialog!: MdDialog;\n\n @query('oscd-text-editor')\n textEditor!: OscdTextEditor;\n\n @queryAll(\n 'scl-text-field, scl-select, scl-checkbox, md-filled-textfield, md-filled-select',\n )\n inputs!: WizardInputElement[];\n\n @state()\n private initialEditorText: string | undefined;\n\n @state()\n private currentEditorText: string | undefined;\n\n private checkValidity(): boolean {\n return Array.from(this.inputs).every(input => input.checkValidity());\n }\n\n private reportValidity(): void {\n this.inputs.forEach(input => {\n input.reportValidity();\n });\n }\n\n async create(wizardType: CreateWizard): Promise<EditV2[]> {\n this.wizardType = wizardType;\n let edits: EditV2[] = [];\n try {\n edits = await new Promise<EditV2[]>((resolve, reject) => {\n this.dialogClosePromise = { resolve, reject };\n\n this.dialog.show();\n });\n } catch {\n // ignore\n }\n this.close();\n return edits;\n }\n\n async edit(wizardType: EditWizard): Promise<EditV2[]> {\n this.wizardType = wizardType;\n let edits: EditV2[] = [];\n this.initialEditorText = formatXml(serializeXml(this.wizardType.element));\n try {\n edits = await new Promise<EditV2[]>((resolve, reject) => {\n this.dialogClosePromise = { resolve, reject };\n\n this.dialog.show();\n });\n this.close();\n } catch {\n // ignore\n }\n return edits;\n }\n\n /**\n * Close triggers the dialog to close, which in turn triggers the `closed` event that resets the state of the dialog.\n * Why? Because click-away will also close the dialog - no matter how it closes, we want to reset.\n */\n close(): void {\n this.dialog.close();\n }\n\n /**\n * No need to call this directly as the `closed` event will trigger a reset of the dialog's state, but this can be\n * used to manually reset the dialog if needed.\n */\n reset(): void {\n this.editorMode = false;\n this.initialEditorText = undefined;\n this.currentEditorText = undefined;\n this.wizardType = null;\n this.inputs.forEach(input => {\n input.value = '';\n if ('setCustomValidity' in input) {\n input.setCustomValidity('');\n }\n input.reportValidity();\n });\n }\n\n private async applyTextEdits(): Promise<void> {\n if (\n !this.wizardType ||\n !isEditWizard(this.wizardType) ||\n !this.currentEditorText ||\n this.currentEditorText === this.initialEditorText\n ) {\n return;\n }\n\n const element = this.wizardType.element;\n const edits = newOscdTextEditV2({\n element,\n newText: this.currentEditorText,\n });\n if (edits) {\n this.dialogClosePromise?.resolve(edits);\n }\n\n this.close();\n }\n\n private async applyFormValues(action?: WizardActor): Promise<boolean> {\n if (action === undefined) {\n return false;\n }\n\n if (!this.checkValidity()) {\n this.reportValidity();\n return false;\n }\n\n const edits = action(Array.from(this.inputs), this.dialog);\n this.dialogClosePromise?.resolve(edits);\n return true;\n }\n\n private handleToggleEditorMode(): void {\n if (this.editorMode && this.currentEditorText !== this.initialEditorText) {\n const confirmLeave = window.confirm(\n 'You have unsaved changes. Are you sure you want to switch to form view? Your changes will be lost.',\n );\n if (!confirmLeave) {\n return;\n }\n }\n this.editorMode = !this.editorMode;\n // Until we can safely sync edits between the Form and the Editor, we will need to\n // reset the editor text. If the user navigated away from the Editor mode with changes\n // they were already warned those changes would be lost.\n if (this.editorMode && isEditWizard(this.wizardType)) {\n this.currentEditorText = this.initialEditorText;\n }\n }\n\n render(): TemplateResult {\n return html`<div>\n <md-dialog\n class=\"${classMap({\n 'editor-mode': this.editorMode,\n })}\"\n @closed=\"${() => {\n this.reset();\n }}\"\n @cancel=\"${() => {\n this.dialogClosePromise?.reject();\n }}\"\n >\n <div slot=\"headline\" class=\"dialog-header\">\n <span class=\"title\">${wizardTitle(this.wizardType)}</span>\n\n <span class=\"header-actions\">\n <md-icon-button\n ?disabled=\"${!isEditWizard(this.wizardType)}\"\n aria-label=\"Code\"\n @click=\"${() => this.handleToggleEditorMode()}\"\n >\n <md-icon>code</md-icon>\n </md-icon-button>\n </span>\n </div>\n <form slot=\"content\" method=\"dialog\">\n ${this.editorMode\n ? html`<div class=\"editor-content\">\n <oscd-text-editor\n .value=${this.initialEditorText}\n @change=${(e: CustomEvent<string>) => {\n this.currentEditorText = e.detail;\n }}\n ></oscd-text-editor>\n </div>`\n : html`<div class=\"wizard-content\">\n ${wizardContent(this.wizardType)}\n </div>`}\n </form>\n <div slot=\"actions\">\n <md-text-button\n id=\"close-button\"\n form=\"add-data-object\"\n @click=\"${(event: Event) => {\n event.stopImmediatePropagation();\n this.close();\n }}\"\n >Cancel</md-text-button\n >\n ${!this.editorMode && !(this.wizardType && getWizard(this.wizardType))\n ? html`<md-outlined-button\n @click=\"${(event: Event) => {\n event.stopImmediatePropagation();\n event.preventDefault();\n this.editorMode = true;\n }}\"\n >Use Editor</md-outlined-button\n >`\n : html`<md-filled-button\n form=\"add-data-object\"\n @click=${() =>\n this.editorMode\n ? this.applyTextEdits()\n : this.applyFormValues(wizardAction(this.wizardType!))}\n >Save</md-filled-button\n >`}\n </div>\n </md-dialog>\n </div>`;\n }\n\n static styles = css`\n *,\n md-filled-button * {\n --md-dialog-container-color: var(\n --wizard-dialog-background-color,\n var(--oscd-base3)\n );\n --md-dialog-headline-color: var(\n --wizard-dialog-text-color,\n var(--oscd-base00)\n );\n --md-dialog-headline-font: var(\n --wizard-dialog-text-font,\n var(--oscd-text-font)\n );\n --md-dialog-supporting-text-color: var(\n --wizard-dialog-text-color,\n var(--oscd-base00)\n );\n --md-dialog-supporting-text-font: var(\n --wizard-dialog-text-font,\n var(--oscd-text-font)\n );\n\n --md-sys-color-primary: var(--wizard-dialog-primary, var(--oscd-primary));\n --md-sys-color-secondary: var(\n --wizard-dialog-secondary,\n var(--oscd-secondary)\n );\n --md-sys-typescale-body-large-font: var(\n --wizard-dialog-text-font,\n var(--oscd-text-font)\n );\n\n --md-sys-color-surface-container-highest: var(\n --wizard-dailog-input-background-color,\n var(--oscd-base3)\n );\n --md-outlined-text-field-input-text-color: var(\n --wizard-dialog-text-color,\n var(--oscd-base00)\n );\n --md-sys-color-on-surface: var(\n --wizard-dialog-text-color,\n var(--oscd-base00)\n );\n --md-sys-color-on-primary: var(\n --wizard-dialog-background-color,\n var(--oscd-base3)\n );\n\n --md-sys-color-surface: var(--wizard-dialog-surface, var(--oscd-base3));\n --md-sys-color-on-surface-variant: var(\n --wizard-dialog-text-color,\n var(--oscd-base00)\n );\n\n --md-menu-container-color: var(\n --wizard-dialog-background-color,\n var(--oscd-base3)\n );\n\n --md-menu-item-selected-container-color: rgb(\n from var(--wizard-dialog-primary, var(--oscd-primary)) r g b / 0.38\n );\n }\n\n md-dialog {\n --md-dialog-container-max-height: 100%;\n --md-dialog-container-max-width: 100%;\n }\n\n md-dialog.editor-mode {\n width: 80%;\n height: 80%;\n }\n\n .dialog-header {\n display: flex;\n align-items: center;\n }\n\n .dialog-header .title {\n flex: 1;\n }\n\n .editor-mode form,\n .editor-content,\n .editor-content oscd-text-editor {\n height: 100%;\n }\n\n .editor-mode form {\n padding-inline: 0px;\n }\n\n .editor-mode form .editor-content {\n border-top: 1px solid var(--oscd-base0);\n border-bottom: 1px solid var(--oscd-base0);\n }\n\n .wizard-content {\n display: flex;\n flex-direction: column;\n }\n\n .wizard-content > * {\n display: block;\n margin-top: 16px;\n }\n\n .unsupported-message {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n }\n\n .unsupported-message md-outlined-button {\n align-self: flex-end;\n }\n `;\n}\n"]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { html } from 'lit';
|
|
2
|
+
import { getValue, } from '../foundation.js';
|
|
3
|
+
function fcdaLabel(fcda) {
|
|
4
|
+
const parts = [];
|
|
5
|
+
const ldInst = fcda.getAttribute('ldInst');
|
|
6
|
+
if (ldInst)
|
|
7
|
+
parts.push(ldInst);
|
|
8
|
+
const prefix = fcda.getAttribute('prefix') ?? '';
|
|
9
|
+
const lnClass = fcda.getAttribute('lnClass') ?? '';
|
|
10
|
+
const lnInst = fcda.getAttribute('lnInst') ?? '';
|
|
11
|
+
if (lnClass)
|
|
12
|
+
parts.push(`${prefix}${lnClass}${lnInst}`);
|
|
13
|
+
const doName = fcda.getAttribute('doName');
|
|
14
|
+
if (doName)
|
|
15
|
+
parts.push(doName);
|
|
16
|
+
const daName = fcda.getAttribute('daName');
|
|
17
|
+
if (daName)
|
|
18
|
+
parts.push(daName);
|
|
19
|
+
const fc = fcda.getAttribute('fc');
|
|
20
|
+
if (fc)
|
|
21
|
+
parts.push(`[${fc}]`);
|
|
22
|
+
return parts.join('.');
|
|
23
|
+
}
|
|
24
|
+
function render(options) {
|
|
25
|
+
return [
|
|
26
|
+
html `<scl-text-field
|
|
27
|
+
label="name"
|
|
28
|
+
.value=${options.name}
|
|
29
|
+
disabled
|
|
30
|
+
dialogInitialFocus
|
|
31
|
+
></scl-text-field>`,
|
|
32
|
+
html `<scl-text-field
|
|
33
|
+
label="desc"
|
|
34
|
+
.value=${options.desc}
|
|
35
|
+
nullable
|
|
36
|
+
></scl-text-field>`,
|
|
37
|
+
html `<selection-list
|
|
38
|
+
id="fcda-list"
|
|
39
|
+
.items=${options.fcdas.map(fcda => ({
|
|
40
|
+
headline: fcdaLabel(fcda),
|
|
41
|
+
attachedElement: fcda,
|
|
42
|
+
selected: true,
|
|
43
|
+
}))}
|
|
44
|
+
></selection-list>`,
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
function updateAction(element) {
|
|
48
|
+
return (inputs, wizard) => {
|
|
49
|
+
const name = getValue(inputs.find(i => i.label === 'name'));
|
|
50
|
+
const desc = getValue(inputs.find(i => i.label === 'desc'));
|
|
51
|
+
const edits = [];
|
|
52
|
+
// Collect FCDA removals from the selection list
|
|
53
|
+
const list = wizard.querySelector('#fcda-list');
|
|
54
|
+
if (list) {
|
|
55
|
+
const selectedFcdas = new Set(list.selectedElements);
|
|
56
|
+
const allFcdas = Array.from(element.querySelectorAll('FCDA'));
|
|
57
|
+
for (const fcda of allFcdas) {
|
|
58
|
+
if (!selectedFcdas.has(fcda)) {
|
|
59
|
+
edits.push({ node: fcda });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Collect attribute changes
|
|
64
|
+
if (name !== element.getAttribute('name') ||
|
|
65
|
+
desc !== element.getAttribute('desc')) {
|
|
66
|
+
edits.push({ element, attributes: { name, desc } });
|
|
67
|
+
}
|
|
68
|
+
return edits;
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export function editDataSetWizard(element) {
|
|
72
|
+
return {
|
|
73
|
+
title: 'Edit DataSet',
|
|
74
|
+
primary: {
|
|
75
|
+
icon: 'edit',
|
|
76
|
+
label: 'save',
|
|
77
|
+
action: updateAction(element),
|
|
78
|
+
},
|
|
79
|
+
content: render({
|
|
80
|
+
name: element.getAttribute('name') ?? '',
|
|
81
|
+
desc: element.getAttribute('desc'),
|
|
82
|
+
fcdas: Array.from(element.querySelectorAll('FCDA')),
|
|
83
|
+
}),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=dataset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataset.js","sourceRoot":"","sources":["../../wizards/dataset.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, TemplateResult } from 'lit';\n\nimport { EditV2 } from '@openscd/oscd-api';\n\nimport { SelectionList } from '@openenergytools/filterable-lists/dist/SelectionList.js';\n\nimport {\n getValue,\n Wizard,\n WizardActor,\n WizardInputElement,\n} from '../foundation.js';\n\ntype RenderOptions = {\n name: string;\n desc: string | null;\n fcdas: Element[];\n};\n\nfunction fcdaLabel(fcda: Element): string {\n const parts: string[] = [];\n\n const ldInst = fcda.getAttribute('ldInst');\n if (ldInst) parts.push(ldInst);\n\n const prefix = fcda.getAttribute('prefix') ?? '';\n const lnClass = fcda.getAttribute('lnClass') ?? '';\n const lnInst = fcda.getAttribute('lnInst') ?? '';\n if (lnClass) parts.push(`${prefix}${lnClass}${lnInst}`);\n\n const doName = fcda.getAttribute('doName');\n if (doName) parts.push(doName);\n\n const daName = fcda.getAttribute('daName');\n if (daName) parts.push(daName);\n\n const fc = fcda.getAttribute('fc');\n if (fc) parts.push(`[${fc}]`);\n\n return parts.join('.');\n}\n\nfunction render(options: RenderOptions): TemplateResult[] {\n return [\n html`<scl-text-field\n label=\"name\"\n .value=${options.name}\n disabled\n dialogInitialFocus\n ></scl-text-field>`,\n html`<scl-text-field\n label=\"desc\"\n .value=${options.desc}\n nullable\n ></scl-text-field>`,\n html`<selection-list\n id=\"fcda-list\"\n .items=${options.fcdas.map(fcda => ({\n headline: fcdaLabel(fcda),\n attachedElement: fcda,\n selected: true,\n }))}\n ></selection-list>`,\n ];\n}\n\nfunction updateAction(element: Element): WizardActor {\n return (inputs: WizardInputElement[], wizard: Element): EditV2[] => {\n const name = getValue(inputs.find(i => i.label === 'name')!)!;\n const desc = getValue(inputs.find(i => i.label === 'desc')!);\n\n const edits: EditV2[] = [];\n\n // Collect FCDA removals from the selection list\n const list = wizard.querySelector('#fcda-list') as SelectionList | null;\n if (list) {\n const selectedFcdas = new Set(list.selectedElements);\n const allFcdas = Array.from(element.querySelectorAll('FCDA'));\n for (const fcda of allFcdas) {\n if (!selectedFcdas.has(fcda)) {\n edits.push({ node: fcda });\n }\n }\n }\n\n // Collect attribute changes\n if (\n name !== element.getAttribute('name') ||\n desc !== element.getAttribute('desc')\n ) {\n edits.push({ element, attributes: { name, desc } });\n }\n\n return edits;\n };\n}\n\nexport function editDataSetWizard(element: Element): Wizard {\n return {\n title: 'Edit DataSet',\n primary: {\n icon: 'edit',\n label: 'save',\n action: updateAction(element),\n },\n content: render({\n name: element.getAttribute('name') ?? '',\n desc: element.getAttribute('desc'),\n fcdas: Array.from(element.querySelectorAll('FCDA')),\n }),\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
|
2
|
+
import { expect, fixture } from '@open-wc/testing';
|
|
3
|
+
import { html } from 'lit';
|
|
4
|
+
import { editDataSetWizard } from './dataset.js';
|
|
5
|
+
import { XMLEditor } from '@openscd/oscd-editor';
|
|
6
|
+
import { SclTextField } from '@openenergytools/scl-text-field';
|
|
7
|
+
import { SelectionList } from '@openenergytools/filterable-lists/dist/SelectionList.js';
|
|
8
|
+
if (!customElements.get('scl-text-field')) {
|
|
9
|
+
customElements.define('scl-text-field', SclTextField);
|
|
10
|
+
}
|
|
11
|
+
if (!customElements.get('selection-list')) {
|
|
12
|
+
customElements.define('selection-list', SelectionList);
|
|
13
|
+
}
|
|
14
|
+
const xmlParser = new DOMParser();
|
|
15
|
+
function createSclDoc() {
|
|
16
|
+
return xmlParser.parseFromString(`
|
|
17
|
+
<SCL xmlns="http://www.iec.ch/61850/2003/SCL">
|
|
18
|
+
<IED name="IED1">
|
|
19
|
+
<AccessPoint name="AP1">
|
|
20
|
+
<Server>
|
|
21
|
+
<LDevice inst="LD1">
|
|
22
|
+
<LN0 lnClass="LLN0" inst="" lnType="LLN0_Type">
|
|
23
|
+
<DataSet name="DS1" desc="Data set 1">
|
|
24
|
+
<FCDA ldInst="LD1" lnClass="LLN0" doName="Beh" daName="stVal" fc="ST" />
|
|
25
|
+
<FCDA ldInst="LD1" lnClass="LLN0" doName="Beh" daName="q" fc="ST" />
|
|
26
|
+
<FCDA ldInst="LD1" lnClass="MMXU" lnInst="1" doName="TotW" fc="MX" />
|
|
27
|
+
</DataSet>
|
|
28
|
+
<DataSet name="DS2" />
|
|
29
|
+
</LN0>
|
|
30
|
+
</LDevice>
|
|
31
|
+
</Server>
|
|
32
|
+
</AccessPoint>
|
|
33
|
+
</IED>
|
|
34
|
+
</SCL>
|
|
35
|
+
`, 'application/xml');
|
|
36
|
+
}
|
|
37
|
+
async function renderContent(wizard) {
|
|
38
|
+
const content = await fixture(html `<form>${wizard.content}</form>`);
|
|
39
|
+
const nameField = content.querySelector('scl-text-field[label="name"]');
|
|
40
|
+
const descField = content.querySelector('scl-text-field[label="desc"]');
|
|
41
|
+
const fcdaList = content.querySelector('selection-list#fcda-list');
|
|
42
|
+
expect(nameField).to.exist;
|
|
43
|
+
expect(descField).to.exist;
|
|
44
|
+
return {
|
|
45
|
+
content,
|
|
46
|
+
nameField,
|
|
47
|
+
descField,
|
|
48
|
+
fcdaList,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
describe('DataSet edit wizard', () => {
|
|
52
|
+
let xmlEditor;
|
|
53
|
+
let renderedContainer;
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
xmlEditor = new XMLEditor();
|
|
56
|
+
});
|
|
57
|
+
afterEach(() => {
|
|
58
|
+
if (renderedContainer) {
|
|
59
|
+
renderedContainer.remove();
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
it('returns a wizard with correct title and 3 content items', () => {
|
|
63
|
+
const scl = createSclDoc();
|
|
64
|
+
const element = scl.querySelector('DataSet[name="DS1"]');
|
|
65
|
+
const wizard = editDataSetWizard(element);
|
|
66
|
+
expect(wizard.title).to.equal('Edit DataSet');
|
|
67
|
+
expect(wizard.primary).to.exist;
|
|
68
|
+
expect(wizard.primary.icon).to.equal('edit');
|
|
69
|
+
expect(wizard.primary.label).to.equal('save');
|
|
70
|
+
expect(wizard.content).to.have.lengthOf(3);
|
|
71
|
+
});
|
|
72
|
+
it('populates fields with current attribute values', async () => {
|
|
73
|
+
const scl = createSclDoc();
|
|
74
|
+
const element = scl.querySelector('DataSet[name="DS1"]');
|
|
75
|
+
const wizard = editDataSetWizard(element);
|
|
76
|
+
const fields = await renderContent(wizard);
|
|
77
|
+
renderedContainer = fields.content;
|
|
78
|
+
expect(fields.nameField.value).to.equal('DS1');
|
|
79
|
+
expect(fields.descField.value).to.equal('Data set 1');
|
|
80
|
+
});
|
|
81
|
+
it('renders name field as disabled', async () => {
|
|
82
|
+
const scl = createSclDoc();
|
|
83
|
+
const element = scl.querySelector('DataSet[name="DS1"]');
|
|
84
|
+
const wizard = editDataSetWizard(element);
|
|
85
|
+
const fields = await renderContent(wizard);
|
|
86
|
+
renderedContainer = fields.content;
|
|
87
|
+
expect(fields.nameField.disabled).to.be.true;
|
|
88
|
+
});
|
|
89
|
+
it('renders the FCDA selection list', async () => {
|
|
90
|
+
const scl = createSclDoc();
|
|
91
|
+
const element = scl.querySelector('DataSet[name="DS1"]');
|
|
92
|
+
const wizard = editDataSetWizard(element);
|
|
93
|
+
const fields = await renderContent(wizard);
|
|
94
|
+
renderedContainer = fields.content;
|
|
95
|
+
expect(fields.fcdaList).to.exist;
|
|
96
|
+
expect(fields.fcdaList.items).to.have.lengthOf(3);
|
|
97
|
+
expect(fields.fcdaList.items[0].selected).to.be.true;
|
|
98
|
+
expect(fields.fcdaList.items[1].selected).to.be.true;
|
|
99
|
+
expect(fields.fcdaList.items[2].selected).to.be.true;
|
|
100
|
+
});
|
|
101
|
+
it('renders FCDA labels with ldInst, lnClass, doName, daName, fc', async () => {
|
|
102
|
+
const scl = createSclDoc();
|
|
103
|
+
const element = scl.querySelector('DataSet[name="DS1"]');
|
|
104
|
+
const wizard = editDataSetWizard(element);
|
|
105
|
+
const fields = await renderContent(wizard);
|
|
106
|
+
renderedContainer = fields.content;
|
|
107
|
+
expect(fields.fcdaList.items[0].headline).to.equal('LD1.LLN0.Beh.stVal.[ST]');
|
|
108
|
+
expect(fields.fcdaList.items[1].headline).to.equal('LD1.LLN0.Beh.q.[ST]');
|
|
109
|
+
expect(fields.fcdaList.items[2].headline).to.equal('LD1.MMXU1.TotW.[MX]');
|
|
110
|
+
});
|
|
111
|
+
it('returns [] when no changes are made', async () => {
|
|
112
|
+
const scl = createSclDoc();
|
|
113
|
+
const element = scl.querySelector('DataSet[name="DS1"]');
|
|
114
|
+
const wizard = editDataSetWizard(element);
|
|
115
|
+
const fields = await renderContent(wizard);
|
|
116
|
+
renderedContainer = fields.content;
|
|
117
|
+
const edits = wizard.primary.action([fields.nameField, fields.descField], renderedContainer);
|
|
118
|
+
expect(edits).to.have.lengthOf(0);
|
|
119
|
+
});
|
|
120
|
+
it('returns SetAttributes with changed desc', async () => {
|
|
121
|
+
const scl = createSclDoc();
|
|
122
|
+
const element = scl.querySelector('DataSet[name="DS1"]');
|
|
123
|
+
const wizard = editDataSetWizard(element);
|
|
124
|
+
const fields = await renderContent(wizard);
|
|
125
|
+
renderedContainer = fields.content;
|
|
126
|
+
fields.descField.value = 'Updated description';
|
|
127
|
+
const edits = wizard.primary.action([fields.nameField, fields.descField], renderedContainer);
|
|
128
|
+
expect(edits).to.have.lengthOf(1);
|
|
129
|
+
const edit = edits[0];
|
|
130
|
+
expect(edit.element).to.equal(element);
|
|
131
|
+
expect(edit.attributes.desc).to.equal('Updated description');
|
|
132
|
+
});
|
|
133
|
+
it('applies changed desc to the document', async () => {
|
|
134
|
+
const scl = createSclDoc();
|
|
135
|
+
const element = scl.querySelector('DataSet[name="DS1"]');
|
|
136
|
+
const wizard = editDataSetWizard(element);
|
|
137
|
+
const fields = await renderContent(wizard);
|
|
138
|
+
renderedContainer = fields.content;
|
|
139
|
+
fields.descField.value = 'Updated description';
|
|
140
|
+
const edits = wizard.primary.action([fields.nameField, fields.descField], renderedContainer);
|
|
141
|
+
xmlEditor.commit(edits);
|
|
142
|
+
expect(element.getAttribute('desc')).to.equal('Updated description');
|
|
143
|
+
expect(element.getAttribute('name')).to.equal('DS1');
|
|
144
|
+
});
|
|
145
|
+
it('handles nullable desc — set to null removes attribute', async () => {
|
|
146
|
+
const scl = createSclDoc();
|
|
147
|
+
const element = scl.querySelector('DataSet[name="DS1"]');
|
|
148
|
+
expect(element.getAttribute('desc')).to.equal('Data set 1');
|
|
149
|
+
const wizard = editDataSetWizard(element);
|
|
150
|
+
const fields = await renderContent(wizard);
|
|
151
|
+
renderedContainer = fields.content;
|
|
152
|
+
fields.descField.value = null;
|
|
153
|
+
const edits = wizard.primary.action([fields.nameField, fields.descField], renderedContainer);
|
|
154
|
+
expect(edits).to.have.lengthOf(1);
|
|
155
|
+
const edit = edits[0];
|
|
156
|
+
expect(edit.attributes.desc).to.be.null;
|
|
157
|
+
xmlEditor.commit(edits);
|
|
158
|
+
expect(element.getAttribute('desc')).to.be.null;
|
|
159
|
+
});
|
|
160
|
+
it('handles element with no FCDAs (DS2)', async () => {
|
|
161
|
+
const scl = createSclDoc();
|
|
162
|
+
const element = scl.querySelector('DataSet[name="DS2"]');
|
|
163
|
+
const wizard = editDataSetWizard(element);
|
|
164
|
+
const fields = await renderContent(wizard);
|
|
165
|
+
renderedContainer = fields.content;
|
|
166
|
+
expect(fields.nameField.value).to.equal('DS2');
|
|
167
|
+
expect(fields.descField.value).to.be.null;
|
|
168
|
+
expect(fields.fcdaList).to.exist;
|
|
169
|
+
expect(fields.fcdaList.items).to.have.lengthOf(0);
|
|
170
|
+
});
|
|
171
|
+
it('returns [] when no-attribute element is unchanged', async () => {
|
|
172
|
+
const scl = createSclDoc();
|
|
173
|
+
const element = scl.querySelector('DataSet[name="DS2"]');
|
|
174
|
+
const wizard = editDataSetWizard(element);
|
|
175
|
+
const fields = await renderContent(wizard);
|
|
176
|
+
renderedContainer = fields.content;
|
|
177
|
+
const edits = wizard.primary.action([fields.nameField, fields.descField], renderedContainer);
|
|
178
|
+
expect(edits).to.have.lengthOf(0);
|
|
179
|
+
});
|
|
180
|
+
it('returns Remove edits for deselected FCDAs', async () => {
|
|
181
|
+
const scl = createSclDoc();
|
|
182
|
+
const element = scl.querySelector('DataSet[name="DS1"]');
|
|
183
|
+
const allFcdas = Array.from(element.querySelectorAll('FCDA'));
|
|
184
|
+
expect(allFcdas).to.have.lengthOf(3);
|
|
185
|
+
const wizard = editDataSetWizard(element);
|
|
186
|
+
const fields = await renderContent(wizard);
|
|
187
|
+
renderedContainer = fields.content;
|
|
188
|
+
// Deselect the second FCDA
|
|
189
|
+
fields.fcdaList.items = fields.fcdaList.items.map((item, index) => ({
|
|
190
|
+
...item,
|
|
191
|
+
selected: index !== 1,
|
|
192
|
+
}));
|
|
193
|
+
const edits = wizard.primary.action([fields.nameField, fields.descField], renderedContainer);
|
|
194
|
+
expect(edits).to.have.lengthOf(1);
|
|
195
|
+
const removeEdit = edits[0];
|
|
196
|
+
expect(removeEdit.node).to.equal(allFcdas[1]);
|
|
197
|
+
});
|
|
198
|
+
it('returns both Remove and SetAttributes when desc changed and FCDA deselected', async () => {
|
|
199
|
+
const scl = createSclDoc();
|
|
200
|
+
const element = scl.querySelector('DataSet[name="DS1"]');
|
|
201
|
+
const allFcdas = Array.from(element.querySelectorAll('FCDA'));
|
|
202
|
+
const wizard = editDataSetWizard(element);
|
|
203
|
+
const fields = await renderContent(wizard);
|
|
204
|
+
renderedContainer = fields.content;
|
|
205
|
+
// Deselect the first FCDA
|
|
206
|
+
fields.fcdaList.items = fields.fcdaList.items.map((item, index) => ({
|
|
207
|
+
...item,
|
|
208
|
+
selected: index !== 0,
|
|
209
|
+
}));
|
|
210
|
+
// Also change desc
|
|
211
|
+
fields.descField.value = 'New desc';
|
|
212
|
+
const edits = wizard.primary.action([fields.nameField, fields.descField], renderedContainer);
|
|
213
|
+
expect(edits).to.have.lengthOf(2);
|
|
214
|
+
// Remove edit comes first
|
|
215
|
+
const removeEdit = edits[0];
|
|
216
|
+
expect(removeEdit.node).to.equal(allFcdas[0]);
|
|
217
|
+
// SetAttributes edit comes second
|
|
218
|
+
const setAttrs = edits[1];
|
|
219
|
+
expect(setAttrs.element).to.equal(element);
|
|
220
|
+
expect(setAttrs.attributes.desc).to.equal('New desc');
|
|
221
|
+
});
|
|
222
|
+
it('applies FCDA removal to the document', async () => {
|
|
223
|
+
const scl = createSclDoc();
|
|
224
|
+
const element = scl.querySelector('DataSet[name="DS1"]');
|
|
225
|
+
expect(element.querySelectorAll('FCDA')).to.have.lengthOf(3);
|
|
226
|
+
const wizard = editDataSetWizard(element);
|
|
227
|
+
const fields = await renderContent(wizard);
|
|
228
|
+
renderedContainer = fields.content;
|
|
229
|
+
// Deselect first and third FCDAs
|
|
230
|
+
fields.fcdaList.items = fields.fcdaList.items.map((item, index) => ({
|
|
231
|
+
...item,
|
|
232
|
+
selected: index === 1,
|
|
233
|
+
}));
|
|
234
|
+
const edits = wizard.primary.action([fields.nameField, fields.descField], renderedContainer);
|
|
235
|
+
expect(edits).to.have.lengthOf(2);
|
|
236
|
+
xmlEditor.commit(edits);
|
|
237
|
+
expect(element.querySelectorAll('FCDA')).to.have.lengthOf(1);
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
//# sourceMappingURL=dataset.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataset.spec.js","sourceRoot":"","sources":["../../wizards/dataset.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-expressions */\nimport { expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\n\nimport { editDataSetWizard } from './dataset.js';\nimport { EditV2, Remove, SetAttributes } from '@openscd/oscd-api';\nimport { XMLEditor } from '@openscd/oscd-editor';\nimport { SclTextField } from '@openenergytools/scl-text-field';\nimport { SelectionList } from '@openenergytools/filterable-lists/dist/SelectionList.js';\nimport { Wizard } from '../foundation.js';\n\nif (!customElements.get('scl-text-field')) {\n customElements.define('scl-text-field', SclTextField);\n}\nif (!customElements.get('selection-list')) {\n customElements.define('selection-list', SelectionList);\n}\n\nconst xmlParser = new DOMParser();\nfunction createSclDoc(): XMLDocument {\n return xmlParser.parseFromString(\n `\n <SCL xmlns=\"http://www.iec.ch/61850/2003/SCL\">\n <IED name=\"IED1\">\n <AccessPoint name=\"AP1\">\n <Server>\n <LDevice inst=\"LD1\">\n <LN0 lnClass=\"LLN0\" inst=\"\" lnType=\"LLN0_Type\">\n <DataSet name=\"DS1\" desc=\"Data set 1\">\n <FCDA ldInst=\"LD1\" lnClass=\"LLN0\" doName=\"Beh\" daName=\"stVal\" fc=\"ST\" />\n <FCDA ldInst=\"LD1\" lnClass=\"LLN0\" doName=\"Beh\" daName=\"q\" fc=\"ST\" />\n <FCDA ldInst=\"LD1\" lnClass=\"MMXU\" lnInst=\"1\" doName=\"TotW\" fc=\"MX\" />\n </DataSet>\n <DataSet name=\"DS2\" />\n </LN0>\n </LDevice>\n </Server>\n </AccessPoint>\n </IED>\n </SCL>\n `,\n 'application/xml',\n );\n}\n\nasync function renderContent(wizard: Wizard) {\n const content = await fixture(html`<form>${wizard.content}</form>`);\n\n const nameField = content.querySelector(\n 'scl-text-field[label=\"name\"]',\n ) as SclTextField;\n const descField = content.querySelector(\n 'scl-text-field[label=\"desc\"]',\n ) as SclTextField;\n const fcdaList = content.querySelector(\n 'selection-list#fcda-list',\n ) as SelectionList;\n\n expect(nameField).to.exist;\n expect(descField).to.exist;\n\n return {\n content,\n nameField,\n descField,\n fcdaList,\n };\n}\n\ndescribe('DataSet edit wizard', () => {\n let xmlEditor: XMLEditor;\n let renderedContainer: Element | undefined;\n\n beforeEach(() => {\n xmlEditor = new XMLEditor();\n });\n\n afterEach(() => {\n if (renderedContainer) {\n renderedContainer.remove();\n }\n });\n\n it('returns a wizard with correct title and 3 content items', () => {\n const scl = createSclDoc();\n const element = scl.querySelector('DataSet[name=\"DS1\"]')!;\n const wizard = editDataSetWizard(element);\n\n expect(wizard.title).to.equal('Edit DataSet');\n expect(wizard.primary).to.exist;\n expect(wizard.primary!.icon).to.equal('edit');\n expect(wizard.primary!.label).to.equal('save');\n expect(wizard.content).to.have.lengthOf(3);\n });\n\n it('populates fields with current attribute values', async () => {\n const scl = createSclDoc();\n const element = scl.querySelector('DataSet[name=\"DS1\"]')!;\n const wizard = editDataSetWizard(element);\n const fields = await renderContent(wizard);\n renderedContainer = fields.content;\n\n expect(fields.nameField.value).to.equal('DS1');\n expect(fields.descField.value).to.equal('Data set 1');\n });\n\n it('renders name field as disabled', async () => {\n const scl = createSclDoc();\n const element = scl.querySelector('DataSet[name=\"DS1\"]')!;\n const wizard = editDataSetWizard(element);\n const fields = await renderContent(wizard);\n renderedContainer = fields.content;\n\n expect(fields.nameField.disabled).to.be.true;\n });\n\n it('renders the FCDA selection list', async () => {\n const scl = createSclDoc();\n const element = scl.querySelector('DataSet[name=\"DS1\"]')!;\n const wizard = editDataSetWizard(element);\n const fields = await renderContent(wizard);\n renderedContainer = fields.content;\n\n expect(fields.fcdaList).to.exist;\n expect(fields.fcdaList.items).to.have.lengthOf(3);\n expect(fields.fcdaList.items[0].selected).to.be.true;\n expect(fields.fcdaList.items[1].selected).to.be.true;\n expect(fields.fcdaList.items[2].selected).to.be.true;\n });\n\n it('renders FCDA labels with ldInst, lnClass, doName, daName, fc', async () => {\n const scl = createSclDoc();\n const element = scl.querySelector('DataSet[name=\"DS1\"]')!;\n const wizard = editDataSetWizard(element);\n const fields = await renderContent(wizard);\n renderedContainer = fields.content;\n\n expect(fields.fcdaList.items[0].headline).to.equal(\n 'LD1.LLN0.Beh.stVal.[ST]',\n );\n expect(fields.fcdaList.items[1].headline).to.equal('LD1.LLN0.Beh.q.[ST]');\n expect(fields.fcdaList.items[2].headline).to.equal('LD1.MMXU1.TotW.[MX]');\n });\n\n it('returns [] when no changes are made', async () => {\n const scl = createSclDoc();\n const element = scl.querySelector('DataSet[name=\"DS1\"]')!;\n const wizard = editDataSetWizard(element);\n const fields = await renderContent(wizard);\n renderedContainer = fields.content;\n\n const edits = wizard.primary!.action(\n [fields.nameField, fields.descField],\n renderedContainer!,\n ) as EditV2[];\n\n expect(edits).to.have.lengthOf(0);\n });\n\n it('returns SetAttributes with changed desc', async () => {\n const scl = createSclDoc();\n const element = scl.querySelector('DataSet[name=\"DS1\"]')!;\n const wizard = editDataSetWizard(element);\n const fields = await renderContent(wizard);\n renderedContainer = fields.content;\n\n fields.descField.value = 'Updated description';\n\n const edits = wizard.primary!.action(\n [fields.nameField, fields.descField],\n renderedContainer!,\n ) as EditV2[];\n\n expect(edits).to.have.lengthOf(1);\n const edit = edits[0] as SetAttributes;\n expect(edit.element).to.equal(element);\n expect(edit.attributes!.desc).to.equal('Updated description');\n });\n\n it('applies changed desc to the document', async () => {\n const scl = createSclDoc();\n const element = scl.querySelector('DataSet[name=\"DS1\"]')!;\n const wizard = editDataSetWizard(element);\n const fields = await renderContent(wizard);\n renderedContainer = fields.content;\n\n fields.descField.value = 'Updated description';\n\n const edits = wizard.primary!.action(\n [fields.nameField, fields.descField],\n renderedContainer!,\n ) as EditV2[];\n\n xmlEditor.commit(edits);\n expect(element.getAttribute('desc')).to.equal('Updated description');\n expect(element.getAttribute('name')).to.equal('DS1');\n });\n\n it('handles nullable desc — set to null removes attribute', async () => {\n const scl = createSclDoc();\n const element = scl.querySelector('DataSet[name=\"DS1\"]')!;\n expect(element.getAttribute('desc')).to.equal('Data set 1');\n\n const wizard = editDataSetWizard(element);\n const fields = await renderContent(wizard);\n renderedContainer = fields.content;\n\n fields.descField.value = null as unknown as string;\n\n const edits = wizard.primary!.action(\n [fields.nameField, fields.descField],\n renderedContainer!,\n ) as EditV2[];\n\n expect(edits).to.have.lengthOf(1);\n const edit = edits[0] as SetAttributes;\n expect(edit.attributes!.desc).to.be.null;\n\n xmlEditor.commit(edits);\n expect(element.getAttribute('desc')).to.be.null;\n });\n\n it('handles element with no FCDAs (DS2)', async () => {\n const scl = createSclDoc();\n const element = scl.querySelector('DataSet[name=\"DS2\"]')!;\n const wizard = editDataSetWizard(element);\n const fields = await renderContent(wizard);\n renderedContainer = fields.content;\n\n expect(fields.nameField.value).to.equal('DS2');\n expect(fields.descField.value).to.be.null;\n expect(fields.fcdaList).to.exist;\n expect(fields.fcdaList.items).to.have.lengthOf(0);\n });\n\n it('returns [] when no-attribute element is unchanged', async () => {\n const scl = createSclDoc();\n const element = scl.querySelector('DataSet[name=\"DS2\"]')!;\n const wizard = editDataSetWizard(element);\n const fields = await renderContent(wizard);\n renderedContainer = fields.content;\n\n const edits = wizard.primary!.action(\n [fields.nameField, fields.descField],\n renderedContainer!,\n ) as EditV2[];\n\n expect(edits).to.have.lengthOf(0);\n });\n\n it('returns Remove edits for deselected FCDAs', async () => {\n const scl = createSclDoc();\n const element = scl.querySelector('DataSet[name=\"DS1\"]')!;\n const allFcdas = Array.from(element.querySelectorAll('FCDA'));\n expect(allFcdas).to.have.lengthOf(3);\n\n const wizard = editDataSetWizard(element);\n const fields = await renderContent(wizard);\n renderedContainer = fields.content;\n\n // Deselect the second FCDA\n fields.fcdaList.items = fields.fcdaList.items.map((item, index) => ({\n ...item,\n selected: index !== 1,\n }));\n\n const edits = wizard.primary!.action(\n [fields.nameField, fields.descField],\n renderedContainer!,\n ) as EditV2[];\n\n expect(edits).to.have.lengthOf(1);\n const removeEdit = edits[0] as Remove;\n expect(removeEdit.node).to.equal(allFcdas[1]);\n });\n\n it('returns both Remove and SetAttributes when desc changed and FCDA deselected', async () => {\n const scl = createSclDoc();\n const element = scl.querySelector('DataSet[name=\"DS1\"]')!;\n const allFcdas = Array.from(element.querySelectorAll('FCDA'));\n\n const wizard = editDataSetWizard(element);\n const fields = await renderContent(wizard);\n renderedContainer = fields.content;\n\n // Deselect the first FCDA\n fields.fcdaList.items = fields.fcdaList.items.map((item, index) => ({\n ...item,\n selected: index !== 0,\n }));\n\n // Also change desc\n fields.descField.value = 'New desc';\n\n const edits = wizard.primary!.action(\n [fields.nameField, fields.descField],\n renderedContainer!,\n ) as EditV2[];\n\n expect(edits).to.have.lengthOf(2);\n\n // Remove edit comes first\n const removeEdit = edits[0] as Remove;\n expect(removeEdit.node).to.equal(allFcdas[0]);\n\n // SetAttributes edit comes second\n const setAttrs = edits[1] as SetAttributes;\n expect(setAttrs.element).to.equal(element);\n expect(setAttrs.attributes!.desc).to.equal('New desc');\n });\n\n it('applies FCDA removal to the document', async () => {\n const scl = createSclDoc();\n const element = scl.querySelector('DataSet[name=\"DS1\"]')!;\n expect(element.querySelectorAll('FCDA')).to.have.lengthOf(3);\n\n const wizard = editDataSetWizard(element);\n const fields = await renderContent(wizard);\n renderedContainer = fields.content;\n\n // Deselect first and third FCDAs\n fields.fcdaList.items = fields.fcdaList.items.map((item, index) => ({\n ...item,\n selected: index === 1,\n }));\n\n const edits = wizard.primary!.action(\n [fields.nameField, fields.descField],\n renderedContainer!,\n ) as EditV2[];\n\n expect(edits).to.have.lengthOf(2);\n xmlEditor.commit(edits);\n expect(element.querySelectorAll('FCDA')).to.have.lengthOf(1);\n });\n});\n"]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { html } from 'lit';
|
|
2
|
+
import { getValue, reservedNames, } from '../foundation.js';
|
|
3
|
+
import { maxLength, tGSEControlType, tSecurityEnable } from './patterns.js';
|
|
4
|
+
function render(options) {
|
|
5
|
+
return [
|
|
6
|
+
html `<scl-text-field
|
|
7
|
+
label="name"
|
|
8
|
+
.value=${options.name}
|
|
9
|
+
required
|
|
10
|
+
maxLength="${maxLength.cbName}"
|
|
11
|
+
.reservedValues=${options.reservedValues}
|
|
12
|
+
dialogInitialFocus
|
|
13
|
+
></scl-text-field>`,
|
|
14
|
+
html `<scl-text-field
|
|
15
|
+
label="desc"
|
|
16
|
+
.value=${options.desc}
|
|
17
|
+
nullable
|
|
18
|
+
></scl-text-field>`,
|
|
19
|
+
html `<scl-select
|
|
20
|
+
label="type"
|
|
21
|
+
.selectOptions=${tGSEControlType}
|
|
22
|
+
.value=${options.type}
|
|
23
|
+
nullable
|
|
24
|
+
></scl-select>`,
|
|
25
|
+
html `<scl-text-field
|
|
26
|
+
label="appID"
|
|
27
|
+
.value=${options.appID}
|
|
28
|
+
required
|
|
29
|
+
></scl-text-field>`,
|
|
30
|
+
html `<scl-checkbox
|
|
31
|
+
label="fixedOffs"
|
|
32
|
+
.value=${options.fixedOffs}
|
|
33
|
+
nullable
|
|
34
|
+
></scl-checkbox>`,
|
|
35
|
+
html `<scl-select
|
|
36
|
+
label="securityEnabled"
|
|
37
|
+
.selectOptions=${tSecurityEnable}
|
|
38
|
+
.value=${options.securityEnabled}
|
|
39
|
+
nullable
|
|
40
|
+
></scl-select>`,
|
|
41
|
+
];
|
|
42
|
+
}
|
|
43
|
+
function updateAction(element) {
|
|
44
|
+
return (inputs) => {
|
|
45
|
+
const name = getValue(inputs.find(i => i.label === 'name'));
|
|
46
|
+
const desc = getValue(inputs.find(i => i.label === 'desc'));
|
|
47
|
+
const type = getValue(inputs.find(i => i.label === 'type'));
|
|
48
|
+
const appID = getValue(inputs.find(i => i.label === 'appID'));
|
|
49
|
+
const fixedOffs = getValue(inputs.find(i => i.label === 'fixedOffs'));
|
|
50
|
+
const securityEnabled = getValue(inputs.find(i => i.label === 'securityEnabled'));
|
|
51
|
+
if (name === element.getAttribute('name') &&
|
|
52
|
+
desc === element.getAttribute('desc') &&
|
|
53
|
+
type === element.getAttribute('type') &&
|
|
54
|
+
appID === element.getAttribute('appID') &&
|
|
55
|
+
fixedOffs === element.getAttribute('fixedOffs') &&
|
|
56
|
+
securityEnabled === element.getAttribute('securityEnabled')) {
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
return [
|
|
60
|
+
{
|
|
61
|
+
element,
|
|
62
|
+
attributes: { name, desc, type, appID, fixedOffs, securityEnabled },
|
|
63
|
+
},
|
|
64
|
+
];
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function editGSEControlWizard(element) {
|
|
68
|
+
return {
|
|
69
|
+
title: 'Edit GSEControl',
|
|
70
|
+
primary: {
|
|
71
|
+
icon: 'edit',
|
|
72
|
+
label: 'save',
|
|
73
|
+
action: updateAction(element),
|
|
74
|
+
},
|
|
75
|
+
content: render({
|
|
76
|
+
name: element.getAttribute('name') ?? '',
|
|
77
|
+
reservedValues: reservedNames(element),
|
|
78
|
+
desc: element.getAttribute('desc'),
|
|
79
|
+
type: element.getAttribute('type'),
|
|
80
|
+
appID: element.getAttribute('appID') ?? '',
|
|
81
|
+
fixedOffs: element.getAttribute('fixedOffs'),
|
|
82
|
+
securityEnabled: element.getAttribute('securityEnabled'),
|
|
83
|
+
}),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=gsecontrol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gsecontrol.js","sourceRoot":"","sources":["../../wizards/gsecontrol.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, TemplateResult } from 'lit';\n\nimport { EditV2 } from '@openscd/oscd-api';\n\nimport {\n getValue,\n reservedNames,\n Wizard,\n WizardActor,\n WizardInputElement,\n} from '../foundation.js';\nimport { maxLength, tGSEControlType, tSecurityEnable } from './patterns.js';\n\ntype RenderOptions = {\n name: string;\n reservedValues: string[];\n desc: string | null;\n type: string | null;\n appID: string;\n fixedOffs: string | null;\n securityEnabled: string | null;\n};\n\nfunction render(options: RenderOptions): TemplateResult[] {\n return [\n html`<scl-text-field\n label=\"name\"\n .value=${options.name}\n required\n maxLength=\"${maxLength.cbName}\"\n .reservedValues=${options.reservedValues}\n dialogInitialFocus\n ></scl-text-field>`,\n html`<scl-text-field\n label=\"desc\"\n .value=${options.desc}\n nullable\n ></scl-text-field>`,\n html`<scl-select\n label=\"type\"\n .selectOptions=${tGSEControlType}\n .value=${options.type}\n nullable\n ></scl-select>`,\n html`<scl-text-field\n label=\"appID\"\n .value=${options.appID}\n required\n ></scl-text-field>`,\n html`<scl-checkbox\n label=\"fixedOffs\"\n .value=${options.fixedOffs}\n nullable\n ></scl-checkbox>`,\n html`<scl-select\n label=\"securityEnabled\"\n .selectOptions=${tSecurityEnable}\n .value=${options.securityEnabled}\n nullable\n ></scl-select>`,\n ];\n}\n\nfunction updateAction(element: Element): WizardActor {\n return (inputs: WizardInputElement[]): EditV2[] => {\n const name = getValue(inputs.find(i => i.label === 'name')!)!;\n const desc = getValue(inputs.find(i => i.label === 'desc')!);\n const type = getValue(inputs.find(i => i.label === 'type')!);\n const appID = getValue(inputs.find(i => i.label === 'appID')!)!;\n const fixedOffs = getValue(inputs.find(i => i.label === 'fixedOffs')!);\n const securityEnabled = getValue(\n inputs.find(i => i.label === 'securityEnabled')!,\n );\n\n if (\n name === element.getAttribute('name') &&\n desc === element.getAttribute('desc') &&\n type === element.getAttribute('type') &&\n appID === element.getAttribute('appID') &&\n fixedOffs === element.getAttribute('fixedOffs') &&\n securityEnabled === element.getAttribute('securityEnabled')\n ) {\n return [];\n }\n\n return [\n {\n element,\n attributes: { name, desc, type, appID, fixedOffs, securityEnabled },\n },\n ];\n };\n}\n\nexport function editGSEControlWizard(element: Element): Wizard {\n return {\n title: 'Edit GSEControl',\n primary: {\n icon: 'edit',\n label: 'save',\n action: updateAction(element),\n },\n content: render({\n name: element.getAttribute('name') ?? '',\n reservedValues: reservedNames(element),\n desc: element.getAttribute('desc'),\n type: element.getAttribute('type'),\n appID: element.getAttribute('appID') ?? '',\n fixedOffs: element.getAttribute('fixedOffs'),\n securityEnabled: element.getAttribute('securityEnabled'),\n }),\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|