mirror of
https://github.com/zulip/zulip-desktop.git
synced 2025-10-25 09:03:42 +00:00
74 lines
1.9 KiB
TypeScript
74 lines
1.9 KiB
TypeScript
import {type Html, html} from "../../../common/html.ts";
|
|
import type {TabPage} from "../../../common/types.ts";
|
|
|
|
import {generateNodeFromHtml} from "./base.ts";
|
|
import Tab, {type TabProperties} from "./tab.ts";
|
|
|
|
export type FunctionalTabProperties = {
|
|
$view: Element;
|
|
page: TabPage;
|
|
} & TabProperties;
|
|
|
|
export default class FunctionalTab extends Tab {
|
|
$view: Element;
|
|
$el: Element;
|
|
$closeButton?: Element;
|
|
|
|
constructor({$view, ...properties}: FunctionalTabProperties) {
|
|
super(properties);
|
|
|
|
this.$view = $view;
|
|
this.$el = generateNodeFromHtml(this.templateHtml());
|
|
if (properties.page !== "Settings") {
|
|
this.properties.$root.append(this.$el);
|
|
this.$closeButton = this.$el.querySelector(".server-tab-badge")!;
|
|
this.registerListeners();
|
|
}
|
|
}
|
|
|
|
override async activate(): Promise<void> {
|
|
await super.activate();
|
|
this.$view.classList.add("active");
|
|
}
|
|
|
|
override async deactivate(): Promise<void> {
|
|
await super.deactivate();
|
|
this.$view.classList.remove("active");
|
|
}
|
|
|
|
override async destroy(): Promise<void> {
|
|
await super.destroy();
|
|
this.$view.remove();
|
|
}
|
|
|
|
templateHtml(): Html {
|
|
return html`
|
|
<div class="tab functional-tab" data-tab-id="${this.properties.tabIndex}">
|
|
<div class="server-tab-badge close-button">
|
|
<i class="material-icons">close</i>
|
|
</div>
|
|
<div class="server-tab">
|
|
<i class="material-icons">${this.properties.materialIcon}</i>
|
|
</div>
|
|
</div>
|
|
`;
|
|
}
|
|
|
|
override registerListeners(): void {
|
|
super.registerListeners();
|
|
|
|
this.$el.addEventListener("mouseover", () => {
|
|
this.$closeButton?.classList.add("active");
|
|
});
|
|
|
|
this.$el.addEventListener("mouseout", () => {
|
|
this.$closeButton?.classList.remove("active");
|
|
});
|
|
|
|
this.$closeButton?.addEventListener("click", (event) => {
|
|
this.properties.onDestroy?.();
|
|
event.stopPropagation();
|
|
});
|
|
}
|
|
}
|