@omicronenergy/oscd-shell 0.0.9 → 0.0.11
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/dist/foundation/cyrb64.js +0 -3
- package/dist/foundation/cyrb64.js.map +1 -1
- package/dist/foundation/events.d.ts +17 -0
- package/dist/foundation/events.js +2 -0
- package/dist/foundation/events.js.map +1 -0
- package/dist/foundation.js.map +1 -1
- package/dist/landing-page/landing-page.d.ts +26 -0
- package/dist/landing-page/landing-page.js +163 -0
- package/dist/landing-page/landing-page.js.map +1 -0
- package/dist/landing-page/landing-page.spec.d.ts +1 -0
- package/dist/landing-page/landing-page.spec.js +87 -0
- package/dist/landing-page/landing-page.spec.js.map +1 -0
- package/dist/locales/de.d.ts +0 -5
- package/dist/locales/de.js +0 -5
- package/dist/locales/de.js.map +1 -1
- package/dist/locales.js.map +1 -1
- package/dist/localization.d.ts +15 -0
- package/dist/localization.js +22 -0
- package/dist/localization.js.map +1 -0
- package/dist/menus/files-menu.d.ts +27 -0
- package/dist/menus/files-menu.js +102 -0
- package/dist/menus/files-menu.js.map +1 -0
- package/dist/menus/files-menu.spec.d.ts +1 -0
- package/dist/menus/files-menu.spec.js +33 -0
- package/dist/menus/files-menu.spec.js.map +1 -0
- package/dist/menus/plugins-menu.d.ts +32 -0
- package/dist/menus/plugins-menu.js +128 -0
- package/dist/menus/plugins-menu.js.map +1 -0
- package/dist/menus/plugins-menu.spec.d.ts +1 -0
- package/dist/menus/plugins-menu.spec.js +65 -0
- package/dist/menus/plugins-menu.spec.js.map +1 -0
- package/dist/oscd-shell.d.ts +70 -84
- package/dist/oscd-shell.js +422 -511
- package/dist/oscd-shell.js.map +1 -1
- package/dist/side-panel/editor-plugins-panel.d.ts +29 -0
- package/dist/side-panel/editor-plugins-panel.js +151 -0
- package/dist/side-panel/editor-plugins-panel.js.map +1 -0
- package/dist/side-panel/editor-plugins-panel.spec.d.ts +1 -0
- package/dist/side-panel/editor-plugins-panel.spec.js +87 -0
- package/dist/side-panel/editor-plugins-panel.spec.js.map +1 -0
- package/dist/utils/plugin-utils.d.ts +1 -1
- package/dist/utils/plugin-utils.js +8 -11
- package/dist/utils/plugin-utils.js.map +1 -1
- package/dist/utils/plugin-utils.spec.js.map +1 -1
- package/dist/utils/testing/plugin-helpers.d.ts +24 -0
- package/dist/utils/testing/plugin-helpers.js +74 -0
- package/dist/utils/testing/plugin-helpers.js.map +1 -0
- package/dist/utils/testing/test-doc-helpers.d.ts +7 -0
- package/dist/utils/testing/test-doc-helpers.js +28 -0
- package/dist/utils/testing/test-doc-helpers.js.map +1 -0
- package/dist/utils/testing/test-plugins.d.ts +44 -0
- package/dist/utils/testing/test-plugins.js +56 -0
- package/dist/utils/testing/test-plugins.js.map +1 -0
- package/package.json +62 -125
- package/dist/AddPlugins.js +0 -39
- package/dist/DemoPluginSrc.js +0 -7
- package/dist/embedded.html +0 -17
- package/dist/index.html +0 -112
package/dist/oscd-shell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oscd-shell.js","sourceRoot":"","sources":["../oscd-shell.ts"],"names":[],"mappings":"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","sourcesContent":["import '@webcomponents/scoped-custom-element-registry';\n\nimport { configureLocalization, localized, msg } from '@lit/localize';\nimport { css, html, LitElement, nothing, TemplateResult } from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { html as staticHtml, unsafeStatic } from 'lit/static-html.js';\n\nimport '@omicronenergy/oscd-ui/app-bar/oscd-app-bar.js';\nimport type { OscdDialog } from '@omicronenergy/oscd-ui/dialog/OscdDialog.js';\nimport '@omicronenergy/oscd-ui/dialog/oscd-dialog.js';\nimport '@omicronenergy/oscd-ui/divider/oscd-divider.js';\nimport type { OscdFilledIconButton } from '@omicronenergy/oscd-ui/iconbutton/OscdFilledIconButton.js';\nimport '@omicronenergy/oscd-ui/iconbutton/oscd-filled-icon-button.js';\nimport '@omicronenergy/oscd-ui/select/oscd-filled-select.js';\nimport '@omicronenergy/oscd-ui/textfield/oscd-filled-text-field.js';\nimport '@omicronenergy/oscd-ui/icon/oscd-icon.js';\nimport type { OscdList } from '@omicronenergy/oscd-ui/list/OscdList.js';\nimport '@omicronenergy/oscd-ui/list/oscd-list.js';\nimport '@omicronenergy/oscd-ui/list/oscd-list-item.js';\nimport type { OscdMenu } from '@omicronenergy/oscd-ui/menu/OscdMenu.js';\nimport '@omicronenergy/oscd-ui/menu/oscd-menu.js';\nimport '@omicronenergy/oscd-ui/menu/oscd-menu-item.js';\nimport type { OscdNavigationDrawer } from '@omicronenergy/oscd-ui/navigation-drawer/OscdNavigationDrawer.js';\nimport '@omicronenergy/oscd-ui/navigation-drawer/oscd-navigation-drawer.js';\nimport '@omicronenergy/oscd-ui/navigation-drawer/oscd-navigation-drawer-header.js';\nimport '@omicronenergy/oscd-ui/tabs/oscd-secondary-tab.js';\nimport '@omicronenergy/oscd-ui/select/oscd-select-option.js';\nimport '@omicronenergy/oscd-ui/tabs/oscd-tabs.js';\nimport type { OscdTabs } from '@omicronenergy/oscd-ui/tabs/OscdTabs.js';\nimport '@omicronenergy/oscd-ui/button/oscd-text-button.js';\nimport { XMLEditor } from '@omicronenergy/oscd-editor';\nimport {\n EditEventV2,\n EditV2,\n OpenEvent,\n Transactor,\n} from '@omicronenergy/oscd-api';\nimport { allLocales, sourceLocale, targetLocales } from './locales.js';\nimport { loadSourcedPlugins } from './utils/plugin-utils.js';\n\nconst _customElementsDefine = window.customElements.define;\nwindow.customElements.define = (name, cl, conf) => {\n if (!customElements.get(name)) {\n _customElementsDefine.call(window.customElements, name, cl, conf);\n }\n};\n\n/* Copied from API because the export is currently missing, this should be removed when the fixed oscd-api is released */\nexport interface Plugin {\n editor: Transactor<EditV2>;\n docs: Record<string, XMLDocument>;\n doc?: XMLDocument; // the document currently being edited\n docName?: string; // the current doc's name\n docVersion: unknown; // changes when the document is modified\n /** @deprecated Use `docVersion` instead */\n editCount: number; // the number of edits made to the document\n locale: string; // the end user's chosen locale\n}\n\nexport type PluginEntry = {\n name: string;\n translations?: Record<(typeof targetLocales)[number], string>;\n tagName: string;\n icon: string;\n requireDoc?: boolean;\n};\n\nexport type SourcedPluginEntry = {\n name: string;\n translations?: Record<(typeof targetLocales)[number], string>;\n src: string;\n icon: string;\n requireDoc?: boolean;\n};\nexport type PluginSet<P = PluginEntry> = {\n menu: P[];\n editor: P[];\n background: P[];\n};\n\ntype Control = {\n icon: string;\n getName: () => string;\n isDisabled: () => boolean;\n action?: () => void | Promise<void>;\n};\n\ntype RenderedPlugin = Control & { tagName: string };\n\ntype LocaleTag = (typeof allLocales)[number];\n\nconst { getLocale, setLocale } = configureLocalization({\n sourceLocale,\n targetLocales,\n loadLocale: locale =>\n import(new URL(`./locales/${locale}.js`, import.meta.url).href),\n});\n\nfunction renderActionItem(\n control: Control,\n slot = 'actionItems',\n): TemplateResult {\n return html`<oscd-filled-icon-button\n slot=\"${slot}\"\n aria-label=\"${control.getName()}\"\n ?disabled=${control.isDisabled()}\n @click=${control.action}\n ><oscd-icon>${control.icon}</oscd-icon></oscd-filled-icon-button\n >`;\n}\n\nfunction renderMenuItem(control: Control): TemplateResult {\n return html`\n <oscd-list-item\n type=\"button\"\n .disabled=${control.isDisabled()}\n @click=${control.action}\n >\n <oscd-icon slot=\"start\">${control.icon}</oscd-icon>\n <span>${control.getName()}</span>\n </oscd-list-item>\n `;\n}\n\n@customElement('oscd-shell')\n@localized()\nexport class OpenSCD extends LitElement {\n /** The file endings of editable files */\n @property({ type: Array, reflect: true }) editable = [\n 'cid',\n 'icd',\n 'iid',\n 'scd',\n 'sed',\n 'ssd',\n ];\n\n isEditable(docName: string): boolean {\n return !!this.editable.find(ext =>\n docName.toLowerCase().endsWith(`.${ext}`),\n );\n }\n\n @state()\n get editableDocs(): string[] {\n return Object.keys(this.docs).filter(name => this.isEditable(name));\n }\n\n private _docs: Record<string, XMLDocument> = {};\n\n /** The set of `XMLDocument`s currently loaded */\n @state()\n get docs(): Record<string, XMLDocument> {\n return this._docs;\n }\n\n set docs(newDocs: Record<string, XMLDocument>) {\n this._docs = newDocs;\n this.onDocsChanged();\n }\n\n onDocsChanged() {\n this.docVersion += 1;\n }\n\n /** The name of the [[`doc`]] currently being edited */\n @property({ type: String, reflect: true }) docName = '';\n\n @state()\n /** The `XMLDocument` currently being edited */\n get doc(): XMLDocument {\n return this.docs[this.docName];\n }\n\n @state()\n xmlEditor: XMLEditor = new XMLEditor();\n\n @state()\n docVersion: number = -1;\n\n @state()\n get last(): number {\n return this.xmlEditor.past.length - 1;\n }\n\n @state()\n get canUndo(): boolean {\n return this.xmlEditor.past.length >= 0;\n }\n\n @state()\n get canRedo(): boolean {\n return this.xmlEditor.future.length >= 0;\n }\n\n #plugins: PluginSet = { menu: [], editor: [], background: [] };\n\n @property({ type: Object })\n get plugins(): PluginSet {\n return this.#plugins;\n }\n\n set plugins(\n plugins: Partial<PluginSet<Partial<PluginEntry | SourcedPluginEntry>>>,\n ) {\n this.#plugins = Object.entries(plugins).reduce(\n (acc, [pluginType, kind]) => {\n const convertedPlugins = loadSourcedPlugins(kind);\n acc[pluginType as keyof PluginSet] = convertedPlugins;\n return acc;\n },\n { menu: [], editor: [], background: [] } as PluginSet,\n );\n }\n\n handleOpenDoc({ detail: { docName, doc } }: OpenEvent) {\n this.docs = {\n ...this.docs,\n [docName]: doc,\n };\n if (this.isEditable(docName)) {\n this.docName = docName;\n }\n this.requestUpdate();\n }\n\n /** Undo the last `n` [[Edit]]s committed */\n undo(n = 1) {\n if (!this.canUndo || n < 1) {\n return;\n }\n this.xmlEditor.undo();\n if (n > 1) {\n this.undo(n - 1);\n }\n this.requestUpdate();\n }\n\n /** Redo the last `n` [[Edit]]s that have been undone */\n redo(n = 1) {\n if (!this.canRedo || n < 1) {\n return;\n }\n this.xmlEditor.redo();\n if (n > 1) {\n this.redo(n - 1);\n }\n this.requestUpdate();\n }\n\n @query('#editFile')\n editFileUI!: OscdDialog;\n\n @query('#menu')\n menuUI!: OscdNavigationDrawer;\n\n @query('#fileName')\n fileNameUI!: HTMLInputElement;\n\n @query('#fileExtension')\n fileExtensionUI!: HTMLInputElement;\n\n @query('#fileMenu')\n fileMenuUI!: OscdMenu;\n\n @query('#fileMenuButton')\n fileMenuButtonUI?: OscdFilledIconButton;\n\n @property({ type: String, reflect: true })\n get locale() {\n return getLocale() as LocaleTag;\n }\n\n set locale(tag: LocaleTag) {\n try {\n setLocale(tag);\n } catch {\n // don't change locale if tag is invalid\n }\n }\n\n @state()\n private editorIndex = 0;\n\n @state()\n get editor() {\n return this.editors[this.editorIndex]?.tagName ?? '';\n }\n\n private controls: Record<'undo' | 'redo' | 'menu', Required<Control>> = {\n undo: {\n icon: 'undo',\n getName: () => msg('Undo'),\n action: () => {\n this.undo();\n this.menuUI.opened = false;\n },\n isDisabled: () => !this.canUndo,\n },\n redo: {\n icon: 'redo',\n getName: () => msg('Redo'),\n action: () => {\n this.redo();\n this.menuUI.opened = false;\n },\n isDisabled: () => !this.canRedo,\n },\n\n menu: {\n icon: 'menu',\n getName: () => msg('Menu'),\n action: async () => {\n this.menuUI.opened = !this.menuUI.opened;\n await this.menuUI.updateComplete;\n if (this.menuUI.opened) {\n this.menuUI.querySelector<OscdList>('oscd-list')!.focus();\n }\n },\n isDisabled: () => false,\n },\n };\n\n #actions = [this.controls.undo, this.controls.redo];\n\n @state()\n get menu() {\n return (<Required<Control>[]>this.plugins.menu\n ?.map(\n ({ name, tagName, requireDoc, icon, translations }): RenderedPlugin =>\n ({\n icon,\n getName: () =>\n translations?.[this.locale as (typeof targetLocales)[number]] ||\n name,\n isDisabled: () => (requireDoc && !this.docName) ?? false,\n tagName,\n action: () => {\n if (tagName) {\n this.shadowRoot!.querySelector<\n HTMLElement & { run: () => Promise<void> }\n >(tagName)!.run?.();\n this.menuUI.opened = false;\n }\n },\n }) as RenderedPlugin,\n )\n .filter(p => p !== undefined)).concat(this.#actions);\n }\n\n @state()\n get editors() {\n return <RenderedPlugin[]>this.plugins.editor?.map(\n ({\n name,\n tagName,\n requireDoc,\n icon,\n translations,\n }): RenderedPlugin | undefined =>\n ({\n icon,\n getName: () =>\n translations?.[this.locale as (typeof targetLocales)[number]] ||\n name,\n isDisabled: () => (requireDoc && !this.docName) ?? false,\n tagName,\n }) as RenderedPlugin,\n );\n }\n\n private hotkeys: Partial<Record<string, () => void>> = {\n m: this.controls.menu.action,\n z: this.controls.undo.action,\n y: this.controls.redo.action,\n Z: this.controls.redo.action,\n };\n\n private handleKeyPress(e: KeyboardEvent): void {\n if (!e.ctrlKey) {\n return;\n }\n if (!Object.prototype.hasOwnProperty.call(this.hotkeys, e.key)) {\n return;\n }\n this.hotkeys[e.key]!();\n e.preventDefault();\n }\n\n constructor() {\n super();\n\n document.addEventListener('keydown', event => this.handleKeyPress(event));\n\n this.addEventListener('oscd-open', event => this.handleOpenDoc(event));\n this.addEventListener('oscd-edit-v2', (event: EditEventV2) => {\n const { edit, title, squash } = event.detail;\n this.xmlEditor.commit(edit, { title, squash });\n });\n\n // Catch all edits (from commits AND events) and trigger an update\n this.xmlEditor.subscribe(() => {\n this.docVersion += 1;\n });\n }\n\n updated(changedProps: Map<string, unknown>) {\n super.updated(changedProps);\n\n this.updateComplete.then(() => {\n // Ensure the active tab is set after tabs are rendered\n const oscdTabs = this.shadowRoot!.querySelector('oscd-tabs');\n if (oscdTabs && oscdTabs.activeTabIndex !== this.editorIndex) {\n oscdTabs.activeTabIndex = this.editorIndex;\n }\n });\n }\n\n renderPlugin(tagName: string) {\n const tag = unsafeStatic(tagName);\n return staticHtml`<${tag} \n .locale=\"${this.locale}\"\n .docName=\"${this.docName}\"\n .doc=${this.doc}\n .docs=${this.docs} \n .editCount=${this.docVersion}\n .docVersion=${this.docVersion}\n .editor=${this.xmlEditor}>\n </${tag}>`;\n }\n\n render() {\n return html`<oscd-app-bar slot=\"appContent\">\n ${renderActionItem(this.controls.menu, 'actionStart')}\n <div slot=\"title\" id=\"title\">\n ${this.editableDocs.length > 1\n ? html`<oscd-filled-icon-button\n id=\"fileMenuButton\"\n @click=${() => this.fileMenuUI.show()}\n ><oscd-icon>arrow_drop_down</oscd-icon></oscd-filled-icon-button\n >`\n : nothing}\n ${this.docName}\n ${this.docName\n ? html`<oscd-filled-icon-button\n @click=${() => this.editFileUI.show()}\n ><oscd-icon>edit</oscd-icon></oscd-filled-icon-button\n >`\n : nothing}\n <oscd-menu\n fixed\n id=\"fileMenu\"\n anchor=\"fileMenuButton\"\n corner=\"BOTTOM_END\"\n >\n ${this.editableDocs.map(\n (name, index) =>\n html`<oscd-menu-item\n @click=${() => {\n this.docName = name;\n }}\n ?disabled=${!this.isEditable(name)}\n ?selected=${this.docName === name}\n id=${index}\n >${name}</oscd-menu-item\n >`,\n )}\n </oscd-menu>\n </div>\n\n <div slot=\"actionEnd\">\n ${this.#actions.map(op => renderActionItem(op))}\n </div>\n\n <oscd-tabs\n .activeTabIndex=${this.editorIndex}\n @change=${(event: Event) => {\n const tabs = event.currentTarget as OscdTabs;\n this.editorIndex = tabs.activeTabIndex;\n }}\n >\n ${this.editors.map(editor =>\n editor.isDisabled()\n ? nothing\n : html`<oscd-secondary-tab>\n <oscd-icon slot=\"icon\">${editor.icon}</oscd-icon>\n ${editor.getName()}\n </oscd-secondary-tab>`,\n )}\n </oscd-tabs>\n </oscd-app-bar>\n\n <oscd-navigation-drawer hasheader type=\"modal\" id=\"menu\">\n <oscd-navigation-drawer-header>\n <span slot=\"headline\">${msg('Menu')}</span>\n ${this.docName\n ? html`<span slot=\"supporting-text\">${this.docName}</span>`\n : ''}\n </oscd-navigation-drawer-header>\n <oscd-list>\n <oscd-divider></oscd-divider>\n ${this.menu.map(renderMenuItem)}\n </oscd-list>\n </oscd-navigation-drawer>\n\n ${this.editor ? this.renderPlugin(this.editor) : nothing}\n\n <oscd-dialog\n id=\"editFile\"\n @closed=${(event: CustomEvent) => {\n const dialog = event.target as OscdDialog;\n if (dialog.returnValue === 'remove') {\n delete this.docs[this.docName];\n this.docName = this.editableDocs[0] || '';\n }\n }}\n >\n <div slot=\"headline\">\n <oscd-icon>description</oscd-icon>${this.docName}\n </div>\n <form slot=\"content\" id=\"edit-file-form\" method=\"dialog\">\n <oscd-filled-text-field\n id=\"fileName\"\n label=\"${msg('Filename')}\"\n value=\"${this.docName.replace(/\\.[^.]+$/, '')}\"\n @input=${(event: Event) => {\n const input = event.target as HTMLInputElement;\n const { value } = input;\n const name = `${value}.${this.fileExtensionUI.value}`;\n if (name in this.docs && name !== this.docName) {\n input.setCustomValidity('File already exists!');\n } else {\n input.setCustomValidity('');\n }\n input.reportValidity();\n }}\n ></oscd-filled-text-field>\n <oscd-filled-select\n label=\"${msg('Extension')}\"\n fixedMenuPosition\n id=\"fileExtension\"\n @selected=${() => this.fileNameUI.reportValidity()}\n >\n ${this.editable.map(\n ext =>\n html`<oscd-select-option\n ?selected=${this.docName.endsWith(`.${ext}`)}\n value=\"${ext}\"\n >${ext}</oscd-select-option\n >`,\n )}\n </oscd-filled-select>\n </form>\n <div slot=\"actions\">\n <oscd-text-button\n form=\"edit-file-form\"\n class=\"edit-dialog-remove-button\"\n value=\"remove\"\n >\n <oscd-icon slot=\"icon\">delete</oscd-icon>\n ${msg('Close file')}\n </oscd-text-button>\n <oscd-text-button form=\"edit-file-form\" value=\"close\">\n ${msg('Cancel')}\n </oscd-text-button>\n <oscd-text-button\n @click=${() => {\n const valid = this.fileNameUI.checkValidity();\n if (!valid) {\n this.fileNameUI.reportValidity();\n return;\n }\n const newDocName = `${this.fileNameUI.value}.${this.fileExtensionUI.value}`;\n const doc = this.docs[this.docName];\n delete this.docs[this.docName];\n this.docs = {\n ...this.docs,\n [newDocName]: doc,\n };\n this.docName = newDocName;\n this.editFileUI.close();\n }}\n trailing-icon\n >\n <oscd-icon slot=\"icon\">edit</oscd-icon>\n ${msg('Rename')}\n </oscd-text-button>\n </div>\n </oscd-dialog>\n\n <aside>\n <div class=\"menu-plugins\">\n ${this.plugins.menu.map(plugin => this.renderPlugin(plugin.tagName))}\n </div>\n <div class=\"background-plugins\">\n ${this.plugins.background\n .filter(plugin => !plugin.requireDoc || !!this.docName)\n .map(plugin => this.renderPlugin(plugin.tagName))}\n </div>\n </aside> `;\n }\n\n firstUpdated() {\n const background = getComputedStyle(this.menuUI).getPropertyValue(\n '--oscd-base2',\n );\n document.body.style.background = background;\n }\n\n static styles = css`\n .fileext {\n opacity: 0.81;\n }\n\n .filename {\n caret-color: var(--oscd-secondary);\n }\n\n .filename:focus {\n outline: none;\n }\n\n aside {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 0;\n overflow: hidden;\n margin: 0;\n padding: 0;\n }\n\n abbr {\n text-decoration: none;\n }\n\n @media (prefers-color-scheme: light) {\n * {\n --oscd-primary: var(--oscd-theme-primary, #2aa198);\n --oscd-secondary: var(--oscd-theme-secondary, #6c71c4);\n --oscd-base03: var(--oscd-theme-base03, #002b36);\n --oscd-base02: var(--oscd-theme-base02, #073642);\n --oscd-base01: var(--oscd-theme-base01, #586e75);\n --oscd-base00: var(--oscd-theme-base00, #657b83);\n --oscd-base0: var(--oscd-theme-base0, #839496);\n --oscd-base1: var(--oscd-theme-base1, #93a1a1);\n --oscd-base2: var(--oscd-theme-base2, #eee8d5);\n --oscd-base3: var(--oscd-theme-base3, #fdf6e3);\n\n --mdc-theme-text-disabled-on-light: rgba(255, 255, 255, 0.38);\n }\n }\n\n @media (prefers-color-scheme: dark) {\n * {\n --oscd-primary: var(--oscd-theme-secondary, #6c71c4);\n --oscd-secondary: var(--oscd-theme-primary, #2aa198);\n --oscd-base03: var(--oscd-theme-base3, #fdf6e3);\n --oscd-base02: var(--oscd-theme-base2, #eee8d5);\n --oscd-base01: var(--oscd-theme-base1, #93a1a1);\n --oscd-base00: var(--oscd-theme-base0, #839496);\n --oscd-base0: var(--oscd-theme-base00, #657b83);\n --oscd-base1: var(--oscd-theme-base01, #586e75);\n --oscd-base2: var(--oscd-theme-base02, #073642);\n --oscd-base3: var(--oscd-theme-base03, #002b36);\n }\n }\n\n * {\n --oscd-error: var(--oscd-theme-error, #dc322f);\n\n --oscd-text-font: var(--oscd-theme-text-font, 'Roboto');\n --oscd-icon-font: var(--oscd-theme-icon-font, 'Material Icons');\n --oscd-text-font-mono: var(--oscd-theme-text-font-mono, 'Roboto Mono');\n\n --oscd-warning: var(--oscd-theme-warning, #b58900);\n --md-sys-color-primary: var(--oscd-primary);\n --md-sys-color-on-primary: var(--oscd-base3);\n\n --md-sys-color-secondary: var(--oscd-secondary);\n --md-sys-color-on-secondary: var(--oscd-base3);\n --md-sys-color-secondary-container: var(--oscd-base2);\n\n --md-sys-color-surface: var(--oscd-base3);\n --md-sys-color-on-surface: var(--oscd-base00);\n --md-sys-color-surface-variant: var(--oscd-base3);\n --md-sys-color-on-surface-variant: var(--oscd-base00);\n --md-sys-color-surface-bright: var(--oscd-base2);\n --md-sys-color-surface-container: var(--oscd-base3);\n --md-sys-color-surface-container-high: var(--oscd-base3);\n --md-sys-color-surface-container-highest: var(--oscd-base3);\n\n --md-sys-color-outline-variant: var(--oscd-primary);\n --md-sys-color-scrim: #000000;\n --md-sys-color-error: var(--oscd-error);\n --md-sys-color-on-error: var(--oscd-base3);\n\n /* --md-menu-item-selected-label-text-color: var(--oscd-base01); */\n --md-icon-button-disabled-icon-color: var(--oscd-base3);\n\n /* MDC Theme Colors \n * Needed for supporting any pluggins still using the depricated MWC Components\n */\n --mdc-theme-primary: var(--oscd-primary);\n --mdc-theme-secondary: var(--oscd-secondary);\n --mdc-theme-background: var(--oscd-base3);\n --mdc-theme-surface: var(--oscd-base3);\n --mdc-theme-on-primary: var(--oscd-base2);\n --mdc-theme-on-secondary: var(--oscd-base02);\n --mdc-theme-on-background: var(--oscd-base00);\n --mdc-theme-on-surface: var(--oscd-base00);\n --mdc-theme-text-primary-on-background: var(--oscd-base01);\n --mdc-theme-text-secondary-on-background: var(--oscd-base00);\n --mdc-theme-text-icon-on-background: var(--oscd-base00);\n --mdc-theme-error: var(--oscd-error);\n\n --mdc-button-disabled-ink-color: var(--oscd-base1);\n\n --mdc-drawer-heading-ink-color: var(--oscd-base00);\n\n --mdc-dialog-heading-ink-color: var(--oscd-base00);\n\n --mdc-text-field-fill-color: var(--oscd-base2);\n --mdc-text-field-ink-color: var(--oscd-base02);\n --mdc-text-field-label-ink-color: var(--oscd-base01);\n --mdc-text-field-idle-line-color: var(--oscd-base00);\n --mdc-text-field-hover-line-color: var(--oscd-base02);\n\n --mdc-select-fill-color: var(--oscd-base2);\n --mdc-select-ink-color: var(--oscd-base02);\n --mdc-select-label-ink-color: var(--oscd-base01);\n --mdc-select-idle-line-color: var(--oscd-base00);\n --mdc-select-hover-line-color: var(--oscd-base02);\n --mdc-select-dropdown-icon-color: var(--oscd-base01);\n\n --mdc-typography-font-family: var(--oscd-text-font);\n --mdc-icon-font: var(--oscd-icon-font);\n }\n\n oscd-navigation-drawer-header {\n --md-list-item-supporting-text-color: var(--md-sys-color-on-surface);\n }\n oscd-app-bar * {\n --md-filled-icon-button-disabled-container-opacity: 0;\n --md-filled-icon-button-disabled-icon-color: var(\n --md-sys-color-on-primary\n );\n }\n\n oscd-tabs {\n display: flex;\n flex-grow: 1;\n --md-secondary-tab-container-color: var(--oscd-primary);\n }\n oscd-secondary-tab {\n --md-sys-color-on-surface: var(--md-sys-color-on-primary);\n --md-sys-color-on-surface-variant: var(--md-sys-color-on-primary);\n --md-secondary-tab-active-indicator-color: var(--oscd-base2);\n }\n\n .edit-dialog-remove-button {\n --md-text-button-icon-color: var(--oscd-error);\n --md-text-button-label-text-color: var(--oscd-error);\n\n --md-text-button-focus-label-text-color: var(--oscd-error);\n --md-text-button-focus-icon-color: var(--oscd-error);\n\n --md-text-button-hover-label-text-color: var(--oscd-error);\n --md-text-button-hover-state-layer-color: var(--oscd-error);\n --md-text-button-hover-icon-color: var(--oscd-error);\n\n --md-text-button-pressed-label-text-color: var(--oscd-error);\n --md-text-button-pressed-state-layer-color: var(--oscd-error);\n --md-text-button-pressed-icon-color: var(--oscd-error);\n }\n\n #title {\n position: relative;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'oscd-shell': OpenSCD;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"oscd-shell.js","sourceRoot":"","sources":["../src/oscd-shell.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement, nothing } from 'lit';\nimport {\n customElement,\n property,\n query,\n queryAssignedNodes,\n state,\n} from 'lit/decorators.js';\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements/lit-element.js';\nimport { localized, msg } from '@lit/localize';\nimport { html as staticHtml, unsafeStatic } from 'lit/static-html.js';\n\nimport { OscdFilledIconButton } from '@omicronenergy/oscd-ui/iconbutton/OscdFilledIconButton.js';\nimport { XMLEditor } from '@omicronenergy/oscd-editor';\nimport { EditEventV2, OpenEvent } from '@openscd/oscd-api';\n\nimport { loadSourcedPlugins } from './utils/plugin-utils.js';\nimport {\n getLocale,\n LocaleTag,\n setLocale,\n Translations,\n} from './localization.js';\nimport { EditorPluginsPanel } from './side-panel/editor-plugins-panel.js';\nimport { PluginsMenu } from './menus/plugins-menu.js';\nimport { LandingPage } from './landing-page/landing-page.js';\nimport { RenameEvent, CloseEvent } from './foundation/events.js';\nimport { FilesMenu } from './menus/files-menu.js';\nimport { OscdAppBar } from '@omicronenergy/oscd-ui/app-bar/OscdAppBar.js';\nimport { OscdIcon } from '@omicronenergy/oscd-ui/icon/OscdIcon.js';\n\nexport type PluginEntry = {\n name: string;\n translations?: Translations;\n tagName: string;\n icon: string;\n requireDoc?: boolean;\n};\n\nexport type SourcedPluginEntry = {\n name: string;\n translations?: Translations;\n src: string;\n icon: string;\n requireDoc?: boolean;\n};\nexport type PluginSet<P = PluginEntry> = {\n menu: P[];\n editor: P[];\n background: P[];\n};\n\n@localized()\n@customElement('oscd-shell')\nexport class OscdShell extends ScopedElementsMixin(LitElement) {\n static scopedElements = {\n 'oscd-app-bar': OscdAppBar,\n 'oscd-filled-icon-button': OscdFilledIconButton,\n 'oscd-icon': OscdIcon,\n 'files-menu': FilesMenu,\n 'plugins-menu': PluginsMenu,\n 'editor-plugins-panel': EditorPluginsPanel,\n 'landing-page': LandingPage,\n };\n\n /*\n * Properties\n */\n\n /**\n * Url to the app icon displayed in the app bar\n */\n @property({ type: String })\n appIcon: string = '';\n\n @property({ type: String })\n appTitle: string = 'OpenSCD';\n\n @property({ type: String })\n landingPageHeading: string = 'Welcome to OpenSCD';\n\n @property({ type: String })\n landingPageSubHeading: string =\n 'Open Source IEC-61850-6 SCL Editing Platform';\n\n /** The file endings of editable files */\n @property({ type: Array, reflect: true }) editable = [\n 'cid',\n 'icd',\n 'iid',\n 'scd',\n 'sed',\n 'ssd',\n ];\n\n @property({ type: String, reflect: true })\n get locale() {\n return getLocale() as LocaleTag;\n }\n\n set locale(tag: LocaleTag) {\n try {\n if (tag) {\n setLocale(tag);\n }\n } catch {\n // don't change locale if tag is invalid\n }\n }\n\n _plugins: PluginSet = { menu: [], editor: [], background: [] };\n\n @property({ type: Object })\n get plugins(): PluginSet {\n return this._plugins;\n }\n\n set plugins(\n plugins: Partial<PluginSet<Partial<PluginEntry | SourcedPluginEntry>>>,\n ) {\n this._plugins = Object.entries(plugins).reduce(\n (acc, [pluginType, kind]) => {\n const convertedPlugins = loadSourcedPlugins(kind, this.registry!);\n acc[pluginType as keyof PluginSet] = convertedPlugins;\n return acc;\n },\n { menu: [], editor: [], background: [] } as PluginSet,\n );\n }\n\n /*\n * States\n */\n @state()\n get canRedo(): boolean {\n return this.xmlEditor.future.length >= 1;\n }\n\n @state()\n get canUndo(): boolean {\n return this.xmlEditor.past.length >= 1;\n }\n\n @state()\n get editor() {\n return this.plugins.editor[this.editorIndex]?.tagName ?? '';\n }\n\n @state()\n private editorIndex = 0;\n\n @state()\n /** The `XMLDocument` currently being edited */\n get doc(): XMLDocument {\n return this.docs[this.docName];\n }\n\n /** The name of the [[`doc`]] currently being edited */\n @property({ type: String, reflect: true })\n docName = '';\n\n /** The set of `XMLDocument`s currently loaded */\n private _docs: Record<string, XMLDocument> = {};\n\n @state()\n get docs(): Record<string, XMLDocument> {\n return this._docs;\n }\n\n set docs(newDocs: Record<string, XMLDocument>) {\n this._docs = newDocs;\n this.onDocsChanged();\n }\n\n @state()\n docVersion: number = -1;\n\n @state()\n get editableDocs(): string[] {\n return Object.keys(this.docs).filter(name => this.isEditable(name));\n }\n\n @state()\n get last(): number {\n return this.xmlEditor.past.length - 1;\n }\n\n @state()\n xmlEditor: XMLEditor = new XMLEditor();\n\n /*\n * All Queries\n */\n\n @query('plugins-menu')\n pluginsMenu!: PluginsMenu;\n\n @query('editor-plugins-panel')\n editorPluginsPanel!: EditorPluginsPanel;\n\n @queryAssignedNodes({ slot: 'landing-page' })\n private _landingPageNodes?: NodeListOf<HTMLElement>;\n\n /*\n * Constructor & life cycle methods\n */\n constructor() {\n super();\n // Catch all edits (from commits AND events) and trigger an update\n this.xmlEditor.subscribe(() => {\n this.docVersion += 1;\n });\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n document.addEventListener('keydown', this.handleKeyPress);\n this.addEventListener('oscd-open', this.handleOpenDoc);\n this.addEventListener('oscd-rename', this.handleRenameDoc);\n this.addEventListener('oscd-close', this.handleCloseDoc);\n this.addEventListener('oscd-edit-v2', this.handleEditV2);\n this.addEventListener('oscd-undo', this.handleUndo);\n this.addEventListener('oscd-redo', this.handleRedo);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n\n // Remove event listeners\n document.removeEventListener('keydown', this.handleKeyPress);\n this.removeEventListener('oscd-open', this.handleOpenDoc);\n this.removeEventListener('oscd-rename', this.handleRenameDoc);\n this.removeEventListener('oscd-edit-v2', this.handleEditV2);\n this.removeEventListener('oscd-undo', this.handleUndo);\n this.removeEventListener('oscd-redo', this.handleRedo);\n this.removeEventListener('oscd-close', this.handleCloseDoc);\n }\n\n /*\n * Event Handlers\n */\n\n handleOpenDoc = ({ detail: { docName, doc } }: OpenEvent) => {\n this.docs = {\n ...this.docs,\n [docName]: doc,\n };\n if (this.isEditable(docName)) {\n this.docName = docName;\n }\n this.requestUpdate();\n };\n\n handleRenameDoc = (customEvent: RenameEvent) => {\n const { oldName, newName } = customEvent.detail;\n if (!this.docs[oldName] || newName === oldName || this.docs[newName]) {\n return;\n }\n const doc = this.docs[oldName];\n delete this.docs[oldName];\n this.docs = {\n ...this.docs,\n [newName]: doc,\n };\n this.docName = newName;\n };\n\n handleEditV2 = (event: EditEventV2) => {\n const { edit, title, squash } = event.detail;\n this.xmlEditor.commit(edit, { title, squash });\n };\n\n handleCloseDoc = (event: CloseEvent) => {\n const docName = event.detail.docName as string;\n delete this.docs[docName];\n if (this.docName === docName) {\n this.docName = this.editableDocs[0] || '';\n }\n };\n\n handleUndo = () => {\n this.undo();\n };\n\n handleRedo = () => {\n this.redo();\n };\n\n private handleKeyPress = (e: KeyboardEvent) => {\n if (!e.ctrlKey) {\n return;\n }\n if (!Object.prototype.hasOwnProperty.call(this.hotkeys, e.key)) {\n return;\n }\n this.hotkeys[e.key]!.call(this);\n e.preventDefault();\n };\n\n handleOpenPluginMenu = () => {\n this.pluginsMenu.open();\n };\n\n /** Undo the last `n` [[Edit]]s committed */\n undo = (n = 1) => {\n if (!this.canUndo || n < 1) {\n return;\n }\n this.xmlEditor.undo();\n if (n > 1) {\n this.undo(n - 1);\n }\n this.requestUpdate();\n };\n\n /** Redo the last `n` [[Edit]]s that have been undone */\n redo = (n = 1) => {\n if (!this.canRedo || n < 1) {\n return;\n }\n this.xmlEditor.redo();\n if (n > 1) {\n this.redo(n - 1);\n }\n this.requestUpdate();\n };\n\n private hotkeys: Partial<Record<string, () => void>> = {\n m: this.handleOpenPluginMenu,\n z: this.undo,\n y: this.redo,\n Z: this.redo,\n };\n\n isEditable(docName: string): boolean {\n return !!this.editable.find(ext =>\n docName.toLowerCase().endsWith(`.${ext}`),\n );\n }\n\n onDocsChanged() {\n this.docVersion += 1;\n }\n\n renderPlugin(tagName: string) {\n const tag = unsafeStatic(tagName);\n return staticHtml`<${tag} \n .locale=\"${this.locale}\"\n .docName=\"${this.docName}\"\n .doc=${this.doc}\n .docs=${this.docs} \n .editCount=${this.docVersion}\n .docVersion=${this.docVersion}\n .editor=${this.xmlEditor}>\n </${tag}>`;\n }\n\n onMenuPluginSelect(customEvent: CustomEvent) {\n const plugin = customEvent.detail.plugin as PluginEntry;\n if (plugin.tagName) {\n this.shadowRoot!.querySelector<\n HTMLElement & { run: () => Promise<void> }\n >(plugin.tagName)!.run?.();\n }\n }\n\n renderOffScreenPlugins() {\n return html`\n <section class=\"off-screen-plugin-container\" aria-hidden=\"true\">\n <div class=\"menu-plugins\">\n ${this.plugins.menu\n .filter(plugin => !plugin.requireDoc || !!this.docName)\n .map(plugin => this.renderPlugin(plugin.tagName))}\n </div>\n <div class=\"background-plugins\">\n ${this.plugins.background\n .filter(plugin => !plugin.requireDoc || !!this.docName)\n .map(plugin => this.renderPlugin(plugin.tagName))}\n </div>\n </section>\n `;\n }\n\n renderDefaultLandingPage() {\n return html`\n <landing-page\n heading=${this.landingPageHeading}\n subHeading=${this.landingPageSubHeading}\n .menuPlugins=${this.plugins.menu.filter(\n plugin => !plugin.requireDoc || !!this.docName,\n )}\n .locale=${this.locale}\n @menu-plugin-select=${(event: CustomEvent) =>\n this.onMenuPluginSelect(event)}\n >\n </landing-page>\n `;\n }\n\n render() {\n const hasCustomLandingPage = !!this._landingPageNodes?.length;\n if (this.editableDocs.length === 0) {\n return html` <slot\n name=\"landing-page\"\n @slotchange=${() => this.requestUpdate()}\n ></slot>\n ${!hasCustomLandingPage ? this.renderDefaultLandingPage() : nothing}\n ${this.renderOffScreenPlugins()}`;\n }\n\n return html` <oscd-app-bar>\n <plugins-menu\n slot=\"alignStart\"\n appTitle=${this.appTitle}\n appIcon=${this.appIcon}\n .editableDocs=${this.editableDocs}\n .menuPlugins=${this.plugins.menu}\n .locale=${this.locale}\n @menu-plugin-select=${(event: CustomEvent) =>\n this.onMenuPluginSelect(event)}\n ></plugins-menu>\n\n <files-menu\n slot=\"alignMiddle\"\n .selectedDocName=${this.docName}\n .editableDocs=${this.editableDocs}\n .locale=${this.locale}\n @change=${(event: CustomEvent) => {\n const name = event.detail.name as string;\n this.docName = name;\n }}\n ></files-menu>\n\n <div slot=\"alignEnd\">\n <oscd-filled-icon-button\n aria-label=\"${msg('Undo')}\"\n ?disabled=${!this.canUndo}\n @click=${async () => {\n this.dispatchEvent(\n new CustomEvent('oscd-undo', {\n bubbles: true,\n composed: true,\n }),\n );\n }}\n ><oscd-icon>undo</oscd-icon></oscd-filled-icon-button\n >\n <oscd-filled-icon-button\n aria-label=\"${msg('Redo')}\"\n ?disabled=${!this.canRedo}\n @click=${async () => {\n this.dispatchEvent(\n new CustomEvent('oscd-redo', {\n bubbles: true,\n composed: true,\n }),\n );\n }}\n ><oscd-icon>redo</oscd-icon></oscd-filled-icon-button\n >\n </div>\n </oscd-app-bar>\n\n <main>\n <section class=\"editors-side-panel-section\">\n <editor-plugins-panel\n .editors=${this.plugins.editor}\n .editorIndex=${this.editorIndex}\n .locale=${this.locale}\n @editor-select=${(e: CustomEvent) => {\n this.editorIndex = e.detail.index;\n }}\n ></editor-plugins-panel>\n </section>\n\n <section class=\"editor-container\">\n ${this.editor ? this.renderPlugin(this.editor) : nothing}\n </section>\n\n ${this.renderOffScreenPlugins()}\n </main>`;\n }\n\n static styles = css`\n /* Theme variables with default values */\n * {\n --oscd-primary: var(--oscd-theme-primary, #0b335b);\n --oscd-secondary: var(--oscd-theme-secondary, #2485e5);\n --oscd-base03: var(--oscd-theme-base03, #121417);\n --oscd-base02: var(--oscd-theme-base02, #1a1e23);\n --oscd-base01: var(--oscd-theme-base01, #3d4651);\n --oscd-base00: var(--oscd-theme-base00, #46505d);\n --oscd-base0: var(--oscd-theme-base0, #8b97a7);\n --oscd-base1: var(--oscd-theme-base1, #96a1b0);\n --oscd-base2: var(--oscd-theme-base2, #f3f5f6);\n --oscd-base3: var(--oscd-theme-base3, white);\n --oscd-error: var(--oscd-theme-error, #dc322f);\n --oscd-warning: var(--oscd-theme-warning, #b58900);\n --oscd-text-font: var(--oscd-theme-text-font, 'Roboto');\n --oscd-text-font-mono: var(--oscd-theme-text-font-mono, 'Roboto Mono');\n --oscd-icon-font: var(\n --oscd-theme-icon-font,\n 'Material Symbols Outlined'\n );\n\n /* Fallbacks for Material Design variables */\n --md-sys-color-primary: var(--oscd-primary);\n --md-sys-color-on-primary: var(--oscd-base3);\n --md-sys-color-secondary: var(--oscd-secondary);\n --md-sys-color-on-secondary: var(--oscd-base3);\n --md-sys-color-secondary-container: var(--oscd-base2);\n --md-sys-color-surface: var(--oscd-base3);\n --md-sys-color-on-surface: var(--oscd-base00);\n --md-sys-color-surface-variant: var(--oscd-base3);\n --md-sys-color-on-surface-variant: var(--oscd-base00);\n --md-sys-color-surface-bright: var(--oscd-base2);\n --md-sys-color-surface-container: var(--oscd-base3);\n --md-sys-color-surface-container-high: var(--oscd-base3);\n --md-sys-color-surface-container-highest: var(--oscd-base3);\n --md-sys-color-outline-variant: var(--oscd-primary);\n --md-sys-color-scrim: #000000;\n --md-sys-color-error: var(--oscd-error);\n --md-sys-color-on-error: var(--oscd-base3);\n --md-icon-button-disabled-icon-color: var(--oscd-base3);\n /* --md-menu-item-selected-label-text-color: var(--oscd-base01); */\n --md-icon-button-disabled-icon-color: var(--oscd-base3);\n\n /* MDC Theme Colors \n * Needed for supporting any pluggins still using the depricated MWC Components\n */\n --mdc-theme-primary: var(--oscd-primary);\n --mdc-theme-secondary: var(--oscd-secondary);\n --mdc-theme-background: var(--oscd-base3);\n --mdc-theme-surface: var(--oscd-base3);\n --mdc-theme-on-primary: var(--oscd-base2);\n --mdc-theme-on-secondary: var(--oscd-base3);\n --mdc-theme-on-background: var(--oscd-base00);\n --mdc-theme-on-surface: var(--oscd-base00);\n --mdc-theme-text-primary-on-background: var(--oscd-base01);\n --mdc-theme-text-secondary-on-background: var(--oscd-base3);\n --mdc-theme-text-icon-on-background: var(--oscd-base3);\n --mdc-theme-error: var(--oscd-error);\n --mdc-button-disabled-ink-color: var(--oscd-base1);\n --mdc-drawer-heading-ink-color: var(--oscd-base00);\n --mdc-dialog-heading-ink-color: var(--oscd-base00);\n --mdc-text-field-fill-color: var(--oscd-base2);\n --mdc-text-field-ink-color: var(--oscd-base02);\n --mdc-text-field-label-ink-color: var(--oscd-base01);\n --mdc-text-field-idle-line-color: var(--oscd-base00);\n --mdc-text-field-hover-line-color: var(--oscd-base02);\n --mdc-select-fill-color: var(--oscd-base2);\n --mdc-select-ink-color: var(--oscd-base02);\n --mdc-select-label-ink-color: var(--oscd-base01);\n --mdc-select-idle-line-color: var(--oscd-base00);\n --mdc-select-hover-line-color: var(--oscd-base02);\n --mdc-select-dropdown-icon-color: var(--oscd-base01);\n --mdc-typography-font-family: var(--oscd-text-font);\n --mdc-icon-font: var(--oscd-icon-font);\n --mdc-theme-text-disabled-on-light: rgba(255, 255, 255, 0.38);\n }\n\n * {\n --app-bar-height: 54px;\n --side-panel-width: 280px;\n\n --md-sys-color-primary: var(--oscd-primary);\n --md-sys-color-on-primary: var(--oscd-base3);\n\n --md-sys-color-secondary-container: var(--oscd-base2);\n\n --md-sys-color-surface: var(--oscd-base3);\n --md-sys-color-on-surface: var(--oscd-base00);\n }\n\n :host {\n height: 100%;\n display: grid;\n grid-template-rows: min-content 1fr;\n grid-template-columns: 1fr;\n grid-template-areas:\n 'header'\n 'main';\n }\n\n oscd-app-bar {\n grid-area: header;\n box-shadow: var(--md-sys-elevation-level-2);\n z-index: 10;\n }\n\n main {\n grid-area: main;\n display: grid;\n grid-template-columns: var(--side-panel-width) 1fr;\n grid-template-areas: 'sidebar editor';\n overflow: hidden;\n }\n\n /* Side panel collapsed state */\n main.sidebar-collapsed {\n grid-template-columns: 0 1fr;\n }\n\n section.editors-side-panel-section {\n grid-area: sidebar;\n overflow-y: auto;\n overflow-x: hidden;\n transition: transform 0.3s ease-in-out;\n }\n\n /* Hide side panel when collapsed */\n main.sidebar-collapsed section.editors-side-panel-section {\n transform: translateX(-100%);\n }\n\n section.editor-container {\n grid-area: editor;\n background-color: var(--oscd-base3);\n padding: 8px;\n overflow: auto;\n position: relative;\n }\n\n .off-screen-plugin-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 0;\n overflow: hidden;\n margin: 0;\n padding: 0;\n }\n\n oscd-navigation-drawer-header {\n --md-list-item-supporting-text-color: var(--md-sys-color-on-surface);\n }\n\n oscd-app-bar * {\n --md-filled-icon-button-disabled-container-opacity: 0;\n --md-filled-icon-button-disabled-icon-color: var(\n --md-sys-color-on-primary\n );\n }\n\n .edit-dialog-remove-button {\n --md-text-button-icon-color: var(--oscd-error);\n --md-text-button-label-text-color: var(--oscd-error);\n --md-text-button-focus-label-text-color: var(--oscd-error);\n --md-text-button-focus-icon-color: var(--oscd-error);\n --md-text-button-hover-label-text-color: var(--oscd-error);\n --md-text-button-hover-state-layer-color: var(--oscd-error);\n --md-text-button-hover-icon-color: var(--oscd-error);\n --md-text-button-pressed-label-text-color: var(--oscd-error);\n --md-text-button-pressed-state-layer-color: var(--oscd-error);\n --md-text-button-pressed-icon-color: var(--oscd-error);\n }\n #title {\n position: relative;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'oscd-shell': OscdShell;\n }\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
import { OscdIconButton } from '@omicronenergy/oscd-ui/iconbutton/OscdIconButton.js';
|
|
3
|
+
import { OscdIcon } from '@omicronenergy/oscd-ui/icon/OscdIcon.js';
|
|
4
|
+
import { OscdList } from '@omicronenergy/oscd-ui/list/OscdList.js';
|
|
5
|
+
import { OscdListItem } from '@omicronenergy/oscd-ui/list/OscdListItem.js';
|
|
6
|
+
import { LocaleTag } from '../localization.js';
|
|
7
|
+
import { PluginEntry } from '../oscd-shell.js';
|
|
8
|
+
declare global {
|
|
9
|
+
interface HTMLElementTagNameMap {
|
|
10
|
+
'editor-plugins-panel': EditorPluginsPanel;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
declare const EditorPluginsPanel_base: typeof LitElement & import("@open-wc/scoped-elements/lit-element.js").ScopedElementsHostConstructor;
|
|
14
|
+
export declare class EditorPluginsPanel extends EditorPluginsPanel_base {
|
|
15
|
+
static scopedElements: {
|
|
16
|
+
'oscd-icon-button': typeof OscdIconButton;
|
|
17
|
+
'oscd-icon': typeof OscdIcon;
|
|
18
|
+
'oscd-list': typeof OscdList;
|
|
19
|
+
'oscd-list-item': typeof OscdListItem;
|
|
20
|
+
};
|
|
21
|
+
editors: PluginEntry[];
|
|
22
|
+
editorIndex: number;
|
|
23
|
+
locale: LocaleTag;
|
|
24
|
+
get expanded(): boolean;
|
|
25
|
+
set expanded(expanded: boolean);
|
|
26
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
27
|
+
static styles: import("lit").CSSResult;
|
|
28
|
+
}
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { css, html, LitElement, nothing } from 'lit';
|
|
3
|
+
import { property } from 'lit/decorators.js';
|
|
4
|
+
import { ScopedElementsMixin } from '@open-wc/scoped-elements/lit-element.js';
|
|
5
|
+
import { localized } from '@lit/localize';
|
|
6
|
+
import { OscdIconButton } from '@omicronenergy/oscd-ui/iconbutton/OscdIconButton.js';
|
|
7
|
+
import { OscdIcon } from '@omicronenergy/oscd-ui/icon/OscdIcon.js';
|
|
8
|
+
import { OscdList } from '@omicronenergy/oscd-ui/list/OscdList.js';
|
|
9
|
+
import { OscdListItem } from '@omicronenergy/oscd-ui/list/OscdListItem.js';
|
|
10
|
+
import { classMap } from 'lit/directives/class-map.js';
|
|
11
|
+
let EditorPluginsPanel = class EditorPluginsPanel extends ScopedElementsMixin(LitElement) {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this.editors = [];
|
|
15
|
+
this.editorIndex = 0;
|
|
16
|
+
}
|
|
17
|
+
// eslint-disable-next-line class-methods-use-this
|
|
18
|
+
get expanded() {
|
|
19
|
+
const expandedStr = localStorage.getItem('editorsPanel.expanded');
|
|
20
|
+
return expandedStr === 'false' ? false : true;
|
|
21
|
+
}
|
|
22
|
+
// eslint-disable-next-line class-methods-use-this
|
|
23
|
+
set expanded(expanded) {
|
|
24
|
+
localStorage.setItem('editorsPanel.expanded', String(expanded));
|
|
25
|
+
}
|
|
26
|
+
render() {
|
|
27
|
+
return html `
|
|
28
|
+
<oscd-list class="editors-list" role="tablist">
|
|
29
|
+
${this.editors.map((editor, index) => html `<oscd-list-item
|
|
30
|
+
class=${classMap({ active: this.editorIndex === index })}
|
|
31
|
+
type="button"
|
|
32
|
+
@click=${() => {
|
|
33
|
+
this.dispatchEvent(new CustomEvent('editor-select', {
|
|
34
|
+
detail: { editor, index },
|
|
35
|
+
bubbles: true,
|
|
36
|
+
composed: true,
|
|
37
|
+
}));
|
|
38
|
+
}}
|
|
39
|
+
>
|
|
40
|
+
<oscd-icon slot="start">${editor.icon}</oscd-icon>
|
|
41
|
+
${this.expanded
|
|
42
|
+
? html `<span
|
|
43
|
+
>${editor.translations?.[this.locale] ||
|
|
44
|
+
editor.name}</span
|
|
45
|
+
>`
|
|
46
|
+
: nothing}
|
|
47
|
+
</oscd-list-item>`)}
|
|
48
|
+
</oscd-list>
|
|
49
|
+
<div class="footer">
|
|
50
|
+
<oscd-icon-button
|
|
51
|
+
class="toggle-button"
|
|
52
|
+
@click=${() => {
|
|
53
|
+
this.expanded = !this.expanded;
|
|
54
|
+
}}
|
|
55
|
+
>
|
|
56
|
+
<oscd-icon
|
|
57
|
+
>${this.expanded
|
|
58
|
+
? 'left_panel_close'
|
|
59
|
+
: 'left_panel_open'}</oscd-icon
|
|
60
|
+
></oscd-icon-button
|
|
61
|
+
>
|
|
62
|
+
</div>
|
|
63
|
+
`;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
EditorPluginsPanel.scopedElements = {
|
|
67
|
+
'oscd-icon-button': OscdIconButton,
|
|
68
|
+
'oscd-icon': OscdIcon,
|
|
69
|
+
'oscd-list': OscdList,
|
|
70
|
+
'oscd-list-item': OscdListItem,
|
|
71
|
+
};
|
|
72
|
+
EditorPluginsPanel.styles = css `
|
|
73
|
+
:host {
|
|
74
|
+
width: 76px;
|
|
75
|
+
height: calc(100% - 20px);
|
|
76
|
+
display: grid;
|
|
77
|
+
grid-template-rows: 1fr auto;
|
|
78
|
+
min-height: 0;
|
|
79
|
+
padding-top: 20px;
|
|
80
|
+
transition: width 0.1s ease-in-out;
|
|
81
|
+
overflow-y: auto;
|
|
82
|
+
overflow-x: hidden;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.editors-list {
|
|
86
|
+
min-height: 0;
|
|
87
|
+
--md-list-item-leading-space: 22px;
|
|
88
|
+
--md-list-item-trailing-space: 10px;
|
|
89
|
+
--md-icon-size: 28px;
|
|
90
|
+
--md-list-container-color: rgba(0, 0, 0, 0);
|
|
91
|
+
--md-list-item-label-text-color: var(--oscd-base3);
|
|
92
|
+
--md-list-item-leading-icon-color: var(--oscd-base3);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.editors-list .active {
|
|
96
|
+
background-color: var(--oscd-primary);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.editors-list oscd-list-item span {
|
|
100
|
+
/* prevents jitter when collapsing */
|
|
101
|
+
white-space: nowrap;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.footer {
|
|
105
|
+
/* setting this to display:none until re-design is fixed and its safe to remove */
|
|
106
|
+
display: none;
|
|
107
|
+
/* justify-self: center;
|
|
108
|
+
justify-content: center;
|
|
109
|
+
padding-block: 22px; */
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.toggle-button {
|
|
113
|
+
--md-icon-color: var(--oscd-base3);
|
|
114
|
+
--md-icon-button-icon-size: 32px;
|
|
115
|
+
--md-icon-button-hover-state-layer-color: var(--oscd-base3);
|
|
116
|
+
--md-icon-button-hover-state-layer-opacity: 0.08;
|
|
117
|
+
--md-icon-button-icon-color: var(--oscd-base3);
|
|
118
|
+
--md-icon-button-hover-icon-color: var(--oscd-base3);
|
|
119
|
+
--md-icon-button-focus-icon-color: var(--oscd-base3);
|
|
120
|
+
--md-icon-button-pressed-icon-color: var(--oscd-base3);
|
|
121
|
+
--md-icon-button-state-layer-height: 48px;
|
|
122
|
+
--md-icon-button-state-layer-width: 48px;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
:host([expanded]) {
|
|
126
|
+
width: var(--side-panel-width, 240px);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/* :host([expanded]) .footer {
|
|
130
|
+
justify-self: flex-end;
|
|
131
|
+
justify-content: flex-end;
|
|
132
|
+
padding-inline: 22px;
|
|
133
|
+
} */
|
|
134
|
+
`;
|
|
135
|
+
__decorate([
|
|
136
|
+
property({ type: Array })
|
|
137
|
+
], EditorPluginsPanel.prototype, "editors", void 0);
|
|
138
|
+
__decorate([
|
|
139
|
+
property({ type: Number })
|
|
140
|
+
], EditorPluginsPanel.prototype, "editorIndex", void 0);
|
|
141
|
+
__decorate([
|
|
142
|
+
property({ type: String })
|
|
143
|
+
], EditorPluginsPanel.prototype, "locale", void 0);
|
|
144
|
+
__decorate([
|
|
145
|
+
property({ type: Boolean, reflect: true })
|
|
146
|
+
], EditorPluginsPanel.prototype, "expanded", null);
|
|
147
|
+
EditorPluginsPanel = __decorate([
|
|
148
|
+
localized()
|
|
149
|
+
], EditorPluginsPanel);
|
|
150
|
+
export { EditorPluginsPanel };
|
|
151
|
+
//# sourceMappingURL=editor-plugins-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor-plugins-panel.js","sourceRoot":"","sources":["../../src/side-panel/editor-plugins-panel.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements/lit-element.js';\nimport { localized } from '@lit/localize';\n\nimport { OscdIconButton } from '@omicronenergy/oscd-ui/iconbutton/OscdIconButton.js';\nimport { OscdIcon } from '@omicronenergy/oscd-ui/icon/OscdIcon.js';\nimport { OscdList } from '@omicronenergy/oscd-ui/list/OscdList.js';\nimport { OscdListItem } from '@omicronenergy/oscd-ui/list/OscdListItem.js';\n\nimport { LocaleTag, Translation } from '../localization.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { PluginEntry } from '../oscd-shell.js';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'editor-plugins-panel': EditorPluginsPanel;\n }\n}\n\n@localized()\nexport class EditorPluginsPanel extends ScopedElementsMixin(LitElement) {\n static scopedElements = {\n 'oscd-icon-button': OscdIconButton,\n 'oscd-icon': OscdIcon,\n 'oscd-list': OscdList,\n 'oscd-list-item': OscdListItem,\n };\n\n @property({ type: Array })\n editors: PluginEntry[] = [];\n\n @property({ type: Number })\n editorIndex = 0;\n\n @property({ type: String })\n locale!: LocaleTag;\n\n // eslint-disable-next-line class-methods-use-this\n @property({ type: Boolean, reflect: true })\n get expanded() {\n const expandedStr = localStorage.getItem('editorsPanel.expanded');\n return expandedStr === 'false' ? false : true;\n }\n // eslint-disable-next-line class-methods-use-this\n set expanded(expanded: boolean) {\n localStorage.setItem('editorsPanel.expanded', String(expanded));\n }\n\n render() {\n return html`\n <oscd-list class=\"editors-list\" role=\"tablist\">\n ${this.editors.map(\n (editor, index) =>\n html`<oscd-list-item\n class=${classMap({ active: this.editorIndex === index })}\n type=\"button\"\n @click=${() => {\n this.dispatchEvent(\n new CustomEvent('editor-select', {\n detail: { editor, index },\n bubbles: true,\n composed: true,\n }),\n );\n }}\n >\n <oscd-icon slot=\"start\">${editor.icon}</oscd-icon>\n ${this.expanded\n ? html`<span\n >${editor.translations?.[this.locale as Translation] ||\n editor.name}</span\n >`\n : nothing}\n </oscd-list-item>`,\n )}\n </oscd-list>\n <div class=\"footer\">\n <oscd-icon-button\n class=\"toggle-button\"\n @click=${() => {\n this.expanded = !this.expanded;\n }}\n >\n <oscd-icon\n >${this.expanded\n ? 'left_panel_close'\n : 'left_panel_open'}</oscd-icon\n ></oscd-icon-button\n >\n </div>\n `;\n }\n\n static styles = css`\n :host {\n width: 76px;\n height: calc(100% - 20px);\n display: grid;\n grid-template-rows: 1fr auto;\n min-height: 0;\n padding-top: 20px;\n transition: width 0.1s ease-in-out;\n overflow-y: auto;\n overflow-x: hidden;\n }\n\n .editors-list {\n min-height: 0;\n --md-list-item-leading-space: 22px;\n --md-list-item-trailing-space: 10px;\n --md-icon-size: 28px;\n --md-list-container-color: rgba(0, 0, 0, 0);\n --md-list-item-label-text-color: var(--oscd-base3);\n --md-list-item-leading-icon-color: var(--oscd-base3);\n }\n\n .editors-list .active {\n background-color: var(--oscd-primary);\n }\n\n .editors-list oscd-list-item span {\n /* prevents jitter when collapsing */\n white-space: nowrap;\n }\n\n .footer {\n /* setting this to display:none until re-design is fixed and its safe to remove */\n display: none;\n /* justify-self: center;\n justify-content: center;\n padding-block: 22px; */\n }\n\n .toggle-button {\n --md-icon-color: var(--oscd-base3);\n --md-icon-button-icon-size: 32px;\n --md-icon-button-hover-state-layer-color: var(--oscd-base3);\n --md-icon-button-hover-state-layer-opacity: 0.08;\n --md-icon-button-icon-color: var(--oscd-base3);\n --md-icon-button-hover-icon-color: var(--oscd-base3);\n --md-icon-button-focus-icon-color: var(--oscd-base3);\n --md-icon-button-pressed-icon-color: var(--oscd-base3);\n --md-icon-button-state-layer-height: 48px;\n --md-icon-button-state-layer-width: 48px;\n }\n\n :host([expanded]) {\n width: var(--side-panel-width, 240px);\n }\n\n /* :host([expanded]) .footer {\n justify-self: flex-end;\n justify-content: flex-end;\n padding-inline: 22px;\n } */\n `;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import '../oscd-shell.js';
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { expect, fixture, html } from '@open-wc/testing';
|
|
2
|
+
import '../oscd-shell.js';
|
|
3
|
+
import { createTestDocs } from '../utils/testing/test-doc-helpers.js';
|
|
4
|
+
import { sampleEditorPlugins } from '../utils/testing/plugin-helpers.js';
|
|
5
|
+
import { TestMenuPlugin1 } from '../utils/testing/test-plugins.js';
|
|
6
|
+
const findPanelToggleButton = (pluginsMenu) => {
|
|
7
|
+
const toggleButton = pluginsMenu.shadowRoot?.querySelector('oscd-icon-button.toggle-button');
|
|
8
|
+
expect(toggleButton).to.exist;
|
|
9
|
+
return toggleButton;
|
|
10
|
+
};
|
|
11
|
+
const isPanelExpanded = (pluginsMenu) => {
|
|
12
|
+
return pluginsMenu.hasAttribute('expanded') && pluginsMenu.expanded;
|
|
13
|
+
};
|
|
14
|
+
describe('editor-plugins-panel', () => {
|
|
15
|
+
let oscdShell;
|
|
16
|
+
let editorPluginsPanel;
|
|
17
|
+
let docs;
|
|
18
|
+
beforeEach(async () => {
|
|
19
|
+
docs = createTestDocs(1);
|
|
20
|
+
oscdShell = (await fixture(html `<oscd-shell
|
|
21
|
+
.docs=${docs}
|
|
22
|
+
docName=${Object.keys(docs)[0]}
|
|
23
|
+
></oscd-shell>`));
|
|
24
|
+
if (!oscdShell.registry?.get('test-menu-plugin1')) {
|
|
25
|
+
oscdShell.registry?.define('test-menu-plugin1', TestMenuPlugin1);
|
|
26
|
+
}
|
|
27
|
+
oscdShell.plugins = {
|
|
28
|
+
editor: sampleEditorPlugins,
|
|
29
|
+
};
|
|
30
|
+
editorPluginsPanel = oscdShell.shadowRoot.querySelector('editor-plugins-panel');
|
|
31
|
+
await oscdShell.updateComplete;
|
|
32
|
+
await editorPluginsPanel.updateComplete;
|
|
33
|
+
});
|
|
34
|
+
afterEach(() => {
|
|
35
|
+
oscdShell.remove();
|
|
36
|
+
localStorage.removeItem('editorsPanel.expanded');
|
|
37
|
+
});
|
|
38
|
+
it('collapses on toggle button click when already expanded ', async () => {
|
|
39
|
+
const toggleButton = findPanelToggleButton(editorPluginsPanel);
|
|
40
|
+
expect(isPanelExpanded(editorPluginsPanel)).to.be.true;
|
|
41
|
+
toggleButton.click();
|
|
42
|
+
await editorPluginsPanel.updateComplete;
|
|
43
|
+
expect(isPanelExpanded(editorPluginsPanel)).to.be.false;
|
|
44
|
+
});
|
|
45
|
+
it('expands on toggle button click when already collapsed', async () => {
|
|
46
|
+
const toggleButton = findPanelToggleButton(editorPluginsPanel);
|
|
47
|
+
expect(isPanelExpanded(editorPluginsPanel)).to.be.true;
|
|
48
|
+
toggleButton.click();
|
|
49
|
+
await editorPluginsPanel.updateComplete;
|
|
50
|
+
expect(isPanelExpanded(editorPluginsPanel)).to.be.false;
|
|
51
|
+
toggleButton.click();
|
|
52
|
+
await editorPluginsPanel.updateComplete;
|
|
53
|
+
expect(isPanelExpanded(editorPluginsPanel)).to.be.true;
|
|
54
|
+
});
|
|
55
|
+
it('initially appears expanded if no value found in localStorage', async () => {
|
|
56
|
+
expect(isPanelExpanded(editorPluginsPanel)).to.be.true;
|
|
57
|
+
});
|
|
58
|
+
it('uses value stored in localstorage initially', async () => {
|
|
59
|
+
localStorage.setItem('editorsPanel.expanded', 'false');
|
|
60
|
+
const oscdShell2 = (await fixture(html `<oscd-shell
|
|
61
|
+
.docs=${docs}
|
|
62
|
+
docName=${Object.keys(docs)[0]}
|
|
63
|
+
></oscd-shell>`));
|
|
64
|
+
oscdShell2.plugins = {
|
|
65
|
+
editor: sampleEditorPlugins,
|
|
66
|
+
};
|
|
67
|
+
const editorPluginsPanel2 = oscdShell2.shadowRoot.querySelector('editor-plugins-panel');
|
|
68
|
+
await oscdShell2.updateComplete;
|
|
69
|
+
await editorPluginsPanel2.updateComplete;
|
|
70
|
+
expect(isPanelExpanded(editorPluginsPanel2)).to.be.false;
|
|
71
|
+
oscdShell2.remove();
|
|
72
|
+
});
|
|
73
|
+
it('saves expanded/collapsed state (when toggled) in localStorage', async () => {
|
|
74
|
+
const toggleButton = findPanelToggleButton(editorPluginsPanel);
|
|
75
|
+
expect(localStorage.getItem('editorsPanel.expanded')).to.be.null;
|
|
76
|
+
expect(isPanelExpanded(editorPluginsPanel)).to.be.true;
|
|
77
|
+
toggleButton.click();
|
|
78
|
+
await editorPluginsPanel.updateComplete;
|
|
79
|
+
expect(isPanelExpanded(editorPluginsPanel)).to.be.false;
|
|
80
|
+
expect(localStorage.getItem('editorsPanel.expanded')).to.equal('false');
|
|
81
|
+
toggleButton.click();
|
|
82
|
+
await editorPluginsPanel.updateComplete;
|
|
83
|
+
expect(isPanelExpanded(editorPluginsPanel)).to.be.true;
|
|
84
|
+
expect(localStorage.getItem('editorsPanel.expanded')).to.equal('true');
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=editor-plugins-panel.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor-plugins-panel.spec.js","sourceRoot":"","sources":["../../src/side-panel/editor-plugins-panel.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture, html } from '@open-wc/testing';\nimport type { OscdShell } from '../oscd-shell.js';\nimport '../oscd-shell.js';\nimport { EditorPluginsPanel } from './editor-plugins-panel.js';\nimport { createTestDocs } from '../utils/testing/test-doc-helpers.js';\nimport { OscdFilledIconButton } from '@omicronenergy/oscd-ui/iconbutton/OscdFilledIconButton.js';\nimport { sampleEditorPlugins } from '../utils/testing/plugin-helpers.js';\nimport { TestMenuPlugin1 } from '../utils/testing/test-plugins.js';\n\nconst findPanelToggleButton = (pluginsMenu: EditorPluginsPanel) => {\n const toggleButton = pluginsMenu.shadowRoot?.querySelector(\n 'oscd-icon-button.toggle-button',\n ) as OscdFilledIconButton;\n expect(toggleButton).to.exist;\n return toggleButton;\n};\n\nconst isPanelExpanded = (pluginsMenu: EditorPluginsPanel) => {\n return pluginsMenu.hasAttribute('expanded') && pluginsMenu.expanded;\n};\n\ndescribe('editor-plugins-panel', () => {\n let oscdShell: OscdShell;\n let editorPluginsPanel: EditorPluginsPanel;\n let docs: Record<string, XMLDocument>;\n\n beforeEach(async () => {\n docs = createTestDocs(1);\n oscdShell = <OscdShell>(\n await fixture(\n html`<oscd-shell\n .docs=${docs}\n docName=${Object.keys(docs)[0]}\n ></oscd-shell>`,\n )\n );\n if (!oscdShell.registry?.get('test-menu-plugin1')) {\n oscdShell.registry?.define('test-menu-plugin1', TestMenuPlugin1);\n }\n oscdShell.plugins = {\n editor: sampleEditorPlugins,\n };\n editorPluginsPanel = oscdShell.shadowRoot!.querySelector(\n 'editor-plugins-panel',\n )!;\n await oscdShell.updateComplete;\n await editorPluginsPanel.updateComplete;\n });\n\n afterEach(() => {\n oscdShell.remove();\n localStorage.removeItem('editorsPanel.expanded');\n });\n\n it('collapses on toggle button click when already expanded ', async () => {\n const toggleButton = findPanelToggleButton(editorPluginsPanel);\n expect(isPanelExpanded(editorPluginsPanel)).to.be.true;\n toggleButton.click();\n await editorPluginsPanel.updateComplete;\n expect(isPanelExpanded(editorPluginsPanel)).to.be.false;\n });\n\n it('expands on toggle button click when already collapsed', async () => {\n const toggleButton = findPanelToggleButton(editorPluginsPanel);\n expect(isPanelExpanded(editorPluginsPanel)).to.be.true;\n toggleButton.click();\n await editorPluginsPanel.updateComplete;\n expect(isPanelExpanded(editorPluginsPanel)).to.be.false;\n toggleButton.click();\n await editorPluginsPanel.updateComplete;\n expect(isPanelExpanded(editorPluginsPanel)).to.be.true;\n });\n\n it('initially appears expanded if no value found in localStorage', async () => {\n expect(isPanelExpanded(editorPluginsPanel)).to.be.true;\n });\n\n it('uses value stored in localstorage initially', async () => {\n localStorage.setItem('editorsPanel.expanded', 'false');\n const oscdShell2 = <OscdShell>(\n await fixture(\n html`<oscd-shell\n .docs=${docs}\n docName=${Object.keys(docs)[0]}\n ></oscd-shell>`,\n )\n );\n oscdShell2.plugins = {\n editor: sampleEditorPlugins,\n };\n const editorPluginsPanel2 = oscdShell2.shadowRoot!.querySelector(\n 'editor-plugins-panel',\n )!;\n await oscdShell2.updateComplete;\n await editorPluginsPanel2.updateComplete;\n expect(isPanelExpanded(editorPluginsPanel2)).to.be.false;\n oscdShell2.remove();\n });\n\n it('saves expanded/collapsed state (when toggled) in localStorage', async () => {\n const toggleButton = findPanelToggleButton(editorPluginsPanel);\n expect(localStorage.getItem('editorsPanel.expanded')).to.be.null;\n expect(isPanelExpanded(editorPluginsPanel)).to.be.true;\n\n toggleButton.click();\n await editorPluginsPanel.updateComplete;\n expect(isPanelExpanded(editorPluginsPanel)).to.be.false;\n expect(localStorage.getItem('editorsPanel.expanded')).to.equal('false');\n\n toggleButton.click();\n await editorPluginsPanel.updateComplete;\n expect(isPanelExpanded(editorPluginsPanel)).to.be.true;\n expect(localStorage.getItem('editorsPanel.expanded')).to.equal('true');\n });\n});\n"]}
|
|
@@ -26,4 +26,4 @@ export declare function validatePlugin(plugin: unknown): PluginEntry | undefined
|
|
|
26
26
|
* @param plugins - Array of plugins to convert.
|
|
27
27
|
* @returns Array of plugins with tagName included.
|
|
28
28
|
*/
|
|
29
|
-
export declare function loadSourcedPlugins(plugins: Partial<PluginEntry | SourcedPluginEntry>[]): PluginEntry[];
|
|
29
|
+
export declare function loadSourcedPlugins(plugins: Partial<PluginEntry | SourcedPluginEntry>[], registry: CustomElementRegistry): PluginEntry[];
|
|
@@ -32,7 +32,6 @@ function generateErrorWcClass(plugin) {
|
|
|
32
32
|
alert('${title}\\n\\n ${details}; \\n\\n Check your plugins.json');
|
|
33
33
|
}
|
|
34
34
|
}`;
|
|
35
|
-
// eslint-disable-next-line no-new-func
|
|
36
35
|
return new Function(classString)();
|
|
37
36
|
}
|
|
38
37
|
/**
|
|
@@ -80,7 +79,6 @@ export function validatePlugin(plugin) {
|
|
|
80
79
|
missingFields.push('translations');
|
|
81
80
|
}
|
|
82
81
|
if (missingFields.length > 0) {
|
|
83
|
-
// eslint-disable-next-line no-console
|
|
84
82
|
console.error(`[Invalid Plugin]\n${JSON.stringify(plugin, null, 2)}\nMissing/Invalid fields [${missingFields.join(',')}] - skipping.`);
|
|
85
83
|
return undefined;
|
|
86
84
|
}
|
|
@@ -94,14 +92,13 @@ export function validatePlugin(plugin) {
|
|
|
94
92
|
* @param plugins - Array of plugins to convert.
|
|
95
93
|
* @returns Array of plugins with tagName included.
|
|
96
94
|
*/
|
|
97
|
-
export function loadSourcedPlugins(plugins) {
|
|
95
|
+
export function loadSourcedPlugins(plugins, registry) {
|
|
98
96
|
return plugins
|
|
99
97
|
.map(plugin => {
|
|
100
98
|
if (isPlugin(plugin)) {
|
|
101
99
|
return validatePlugin(plugin);
|
|
102
100
|
}
|
|
103
101
|
if (!isSourcedPlugin(plugin)) {
|
|
104
|
-
// eslint-disable-next-line no-console
|
|
105
102
|
console.error(`[Invalid Plugin] Requires a tagName or src - skipping. ${JSON.stringify(plugin)}`);
|
|
106
103
|
return undefined;
|
|
107
104
|
}
|
|
@@ -114,22 +111,22 @@ export function loadSourcedPlugins(plugins) {
|
|
|
114
111
|
if (!validatedPlugin) {
|
|
115
112
|
return undefined;
|
|
116
113
|
}
|
|
117
|
-
if (
|
|
114
|
+
if (registry.get(hashedTagName)) {
|
|
118
115
|
return validatedPlugin;
|
|
119
116
|
}
|
|
120
117
|
const url = new URL(src, window.location.href).toString();
|
|
121
|
-
import(url)
|
|
118
|
+
import(/* @vite-ignore */ url)
|
|
122
119
|
.then(mod => {
|
|
123
120
|
// Because this is async, we need to check (again) if the element is already defined.
|
|
124
|
-
if (!
|
|
125
|
-
|
|
121
|
+
if (!registry?.get(hashedTagName)) {
|
|
122
|
+
registry.define(hashedTagName, mod.default);
|
|
126
123
|
}
|
|
127
124
|
})
|
|
128
125
|
.catch(err => {
|
|
129
|
-
//
|
|
130
|
-
console.
|
|
126
|
+
// Log this as a warning because we load an Error WC in place of the plugin.
|
|
127
|
+
console.warn(`[Invalid Plugin] Failed to load plugin ${plugin.name} <${hashedTagName}/> from ${url}`, err);
|
|
131
128
|
const ErrWc = generateErrorWcClass(plugin);
|
|
132
|
-
|
|
129
|
+
registry.define(hashedTagName, ErrWc);
|
|
133
130
|
});
|
|
134
131
|
return validatedPlugin;
|
|
135
132
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-utils.js","sourceRoot":"","sources":["../../utils/plugin-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAGjD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE7C;;;;;GAKG;AACH,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,UAAU,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,MAA4B;IACxD,MAAM,KAAK,GAAG,+BAA+B,CAAC;IAC9C,MAAM,OAAO,GAAG,WAAW,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;IACpD,MAAM,WAAW,GAAG;;;;8BAIQ,KAAK,WAAW,OAAO;;;;eAItC,KAAK,UAAU,OAAO;;IAEjC,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin-utils.js","sourceRoot":"","sources":["../../src/utils/plugin-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { cyrb64 } from '../foundation/cyrb64.js';\nimport { PluginEntry, SourcedPluginEntry } from '../oscd-shell.js';\n\nconst pluginTags = new Map<string, string>();\n\n/*\n * Generates a unique tag name for a plugin based on its source URI.\n * This is used to ensure that each plugin has a unique identifier in the CustomElements registry.\n * @param uri - The source URI of the plugin.\n * @returns A unique tag name for the plugin.\n */\nfunction pluginTag(uri: string): string {\n if (!pluginTags.has(uri)) {\n pluginTags.set(uri, `oscd-p${cyrb64(uri)}`);\n }\n return pluginTags.get(uri)!;\n}\n\n/**\n * Generates a Web Component class that displays an error message when a plugin fails to load.\n * This is used to provide feedback to the Distro developer when a plugin cannot be loaded due to an error.\n * @param plugin - The plugin object that failed to load.\n * @returns A Web Component class that displays the error message.\n */\nfunction generateErrorWcClass(plugin: Partial<PluginEntry>) {\n const title = 'Error: Plugin failed to load.';\n const details = `Plugin: ${JSON.stringify(plugin)}`;\n const classString = `\n return class extends HTMLElement {\n\n connectedCallback() {\n this.innerHTML = '<h1>${title}</h1><p>${details}</p><emphasis>Check your plugins.json</emphasis>';\n }\n\n async run() {\n alert('${title}\\\\n\\\\n ${details}; \\\\n\\\\n Check your plugins.json');\n }\n }`;\n\n return new Function(classString)();\n}\n\n/**\n * Checks if the given object is a valid Plugin.\n * @param plugin - The object to check.\n * @returns true if the object is a Plugin, false otherwise.\n */\nexport function isPlugin(plugin: unknown): plugin is PluginEntry {\n return (\n typeof plugin === 'object' &&\n plugin !== null &&\n 'tagName' in plugin &&\n typeof plugin.tagName === 'string'\n );\n}\n\n/**\n * Checks if the given object is a SourcedPlugin.\n * @param plugin - The object to check.\n * @returns true if the object is a SourcedPlugin, false otherwise.\n */\nexport function isSourcedPlugin(plugin: unknown): plugin is SourcedPluginEntry {\n return (\n typeof plugin === 'object' &&\n plugin !== null &&\n 'src' in plugin &&\n typeof plugin.src === 'string'\n );\n}\n\n/**\n * Validates a Plugin object, checking for required fields and types.\n * If the plugin is invalid, it logs an error and returns undefined.\n * @param plugin - The plugin object to validate.\n * @returns The validated Plugin object or undefined if invalid.\n */\nexport function validatePlugin(plugin: unknown): PluginEntry | undefined {\n const missingFields = [];\n if (!isPlugin(plugin)) {\n missingFields.push('tagName');\n }\n\n const _plugin = plugin as PluginEntry;\n missingFields.push(\n ...(['name', 'icon'] as const).filter(\n field => !_plugin[field] || typeof _plugin[field] !== 'string',\n ),\n );\n if (\n typeof _plugin.requireDoc !== 'undefined' &&\n typeof _plugin.requireDoc !== 'boolean'\n ) {\n missingFields.push('requireDoc');\n }\n if (\n typeof _plugin.translations !== 'undefined' &&\n (typeof _plugin.translations !== 'object' ||\n Object.values(_plugin.translations).some(t => typeof t !== 'string'))\n ) {\n missingFields.push('translations');\n }\n\n if (missingFields.length > 0) {\n console.error(\n `[Invalid Plugin]\\n${JSON.stringify(plugin, null, 2)}\\nMissing/Invalid fields [${missingFields.join(',')}] - skipping.`,\n );\n return undefined;\n }\n return _plugin;\n}\n\n/**\n * Goes through all the plugins in the PluginSet and loads any sourced plugins, replacing the src field with a tagName.\n * If a plugin does not have a tagName, it will be generated based on its src.\n * All plugins returned are validated for required fields.\n * If a sourced plugin fails to load (bad src), it will be replaced with an Error Web Component.\n * @param plugins - Array of plugins to convert.\n * @returns Array of plugins with tagName included.\n */\nexport function loadSourcedPlugins(\n plugins: Partial<PluginEntry | SourcedPluginEntry>[],\n registry: CustomElementRegistry,\n): PluginEntry[] {\n return plugins\n .map(plugin => {\n if (isPlugin(plugin)) {\n return validatePlugin(plugin);\n }\n if (!isSourcedPlugin(plugin)) {\n console.error(\n `[Invalid Plugin] Requires a tagName or src - skipping. ${JSON.stringify(plugin)}`,\n );\n return undefined;\n }\n const { src, ...rest } = plugin as SourcedPluginEntry;\n const hashedTagName = pluginTag(src);\n const validatedPlugin = validatePlugin({\n ...rest,\n tagName: hashedTagName,\n });\n\n if (!validatedPlugin) {\n return undefined;\n }\n\n if (registry.get(hashedTagName)) {\n return validatedPlugin;\n }\n\n const url = new URL(src, window.location.href).toString();\n import(/* @vite-ignore */ url)\n .then(mod => {\n // Because this is async, we need to check (again) if the element is already defined.\n if (!registry?.get(hashedTagName)) {\n registry.define(hashedTagName, mod.default);\n }\n })\n .catch(err => {\n // Log this as a warning because we load an Error WC in place of the plugin.\n console.warn(\n `[Invalid Plugin] Failed to load plugin ${plugin.name} <${hashedTagName}/> from ${url}`,\n err,\n );\n const ErrWc = generateErrorWcClass(plugin);\n registry.define(hashedTagName, ErrWc);\n });\n return validatedPlugin;\n })\n .filter((plugin): plugin is PluginEntry => plugin !== undefined);\n}\n"]}
|