Skip to content

Commit 0fca298

Browse files
committed
feat(SidebarTab): allow to define web component on first usage
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
1 parent ff2cffd commit 0fca298

1 file changed

Lines changed: 22 additions & 6 deletions

File tree

lib/sidebar/SidebarTab.ts

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,19 @@ export interface ISidebarContext {
3232
* @see https://developer.mozilla.org/en-US/docs/Web/API/Web_components
3333
* @see https://vuejs.org/guide/extras/web-components#building-custom-elements-with-vue
3434
*/
35-
export interface SidebarComponent extends HTMLElement, ISidebarContext {
35+
export interface SidebarTabComponent extends ISidebarContext {
3636
/**
37-
* This method is called by the files app if the sidebar tab state changes.
38-
*
39-
* @param active - The new active state
37+
* The active state of the sidebar tab.
38+
* It will be set to true if this component is the currently active tab.
4039
*/
41-
setActive(active: boolean): Promise<void>
40+
active: boolean
4241
}
4342

43+
/**
44+
* The instance type of a sidebar tab web component.
45+
*/
46+
export type SidebarTabComponentInstance = SidebarTabComponent & HTMLElement
47+
4448
/**
4549
* Implementation of a custom sidebar tab within the files app.
4650
*/
@@ -69,7 +73,10 @@ export interface ISidebarTab {
6973

7074
/**
7175
* The tag name of the web component.
72-
* The web component must already be registered under that tag name with `CustomElementRegistry.define()`.
76+
*
77+
* The web component must be defined using this name with `CustomElementRegistry.define()`,
78+
* either on initialization or within the `onInit` callback (preferred).
79+
* When rendering the sidebar tab, the files app will wait for the component to be defined in the registry (`customElements.whenDefined()`).
7380
*
7481
* To avoid name clashes the name has to start with your appid (e.g. `your_app`).
7582
* So in addition with the web component naming rules a good name would be `your_app-files-sidebar-tab`.
@@ -82,6 +89,15 @@ export interface ISidebarTab {
8289
* @param context - The current context of the files app
8390
*/
8491
enabled: (context: ISidebarContext) => boolean
92+
93+
/**
94+
* Called when the sidebar tab is rendered the first time in the sidebar.
95+
* This should be used to register the web componen (`CustomElementRegistry.define()`).
96+
*
97+
* The sidebar itself will anyways wait for the component to be defined in the registry (`customElements.whenDefined()`).
98+
* But also will wait for the promise returned by this method to resolve before rendering the tab.
99+
*/
100+
onInit?: () => Promise<void>
85101
}
86102

87103
/**

0 commit comments

Comments
 (0)