fune/browser/components/sidebar/sidebar-customize.mjs
Jonathan Sudiaman c758f0801b Bug 1892429 - Create an expanded sidebar state r=sidebar-reviewers,fluent-reviewers,kcochrane,sclements,extension-reviewers,robwu
Adds an `expanded` property, which, if enabled, shows labels along with their respective icons within the sidebar menu. Currently, this property is not controllable from the UI. As I understand it, the follow-up bugs are responsible for addressing that.

https://treeherder.mozilla.org/#/jobs?repo=try&revision=f269729808eed19051bea5fe4eb41550ff94ce03

Differential Revision: https://phabricator.services.mozilla.com/D210187
2024-05-28 15:55:49 +00:00

189 lines
5.4 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import { html, when } from "chrome://global/content/vendor/lit.all.mjs";
import { SidebarPage } from "./sidebar-page.mjs";
// eslint-disable-next-line import/no-unassigned-import
import "chrome://global/content/elements/moz-button.mjs";
const l10nMap = new Map([
["viewHistorySidebar", "sidebar-menu-history-label"],
["viewTabsSidebar", "sidebar-menu-synced-tabs-label"],
["viewBookmarksSidebar", "sidebar-menu-bookmarks-label"],
]);
export class SidebarCustomize extends SidebarPage {
constructor() {
super();
this.activeExtIndex = 0;
}
static properties = {
activeExtIndex: { type: Number },
};
static queries = {
toolInputs: { all: ".customize-firefox-tools input" },
extensionLinks: { all: ".extension-link" },
};
connectedCallback() {
super.connectedCallback();
this.getWindow().addEventListener("SidebarItemAdded", this);
this.getWindow().addEventListener("SidebarItemChanged", this);
this.getWindow().addEventListener("SidebarItemRemoved", this);
}
disconnectedCallback() {
super.disconnectedCallback();
this.getWindow().removeEventListener("SidebarItemAdded", this);
this.getWindow().removeEventListener("SidebarItemChanged", this);
this.getWindow().removeEventListener("SidebarItemRemoved", this);
}
get sidebarLauncher() {
return this.getWindow().document.querySelector("sidebar-launcher");
}
getWindow() {
return window.browsingContext.embedderWindowGlobal.browsingContext.window;
}
closeCustomizeView(e) {
e.preventDefault();
let view = e.target.getAttribute("view");
this.getWindow().SidebarController.toggle(view);
}
handleEvent(e) {
switch (e.type) {
case "SidebarItemAdded":
case "SidebarItemChanged":
case "SidebarItemRemoved":
this.requestUpdate();
break;
}
}
async onToggleInput(e) {
e.preventDefault();
this.getWindow().SidebarController.toggleTool(e.target.id);
}
getInputL10nId(view) {
return l10nMap.get(view);
}
inputTemplate(tool) {
return html`<div class="input-wrapper">
<input
type="checkbox"
id=${tool.view}
name=${tool.view}
@change=${this.onToggleInput}
?checked=${!tool.disabled}
/>
<label for=${tool.view}>
<img src=${tool.iconUrl} class="icon" role="presentation" />
<span data-l10n-id=${this.getInputL10nId(tool.view)} />
</label>
</div>`;
}
async manageAddon(extensionId) {
await this.getWindow().BrowserAddonUI.manageAddon(
extensionId,
"unifiedExtensions"
);
}
handleKeydown(e) {
if (e.code == "ArrowUp") {
if (this.activeExtIndex >= 0) {
this.focusIndex(this.activeExtIndex - 1);
}
} else if (e.code == "ArrowDown") {
if (this.activeExtIndex < this.extensionLinks.length) {
this.focusIndex(this.activeExtIndex + 1);
}
} else if (
(e.type == "keydown" && e.code == "Enter") ||
(e.type == "keydown" && e.code == "Space")
) {
this.manageAddon(e.target.getAttribute("extensionId"));
}
}
focusIndex(index) {
let extLinkList = Array.from(
this.shadowRoot.querySelectorAll(".extension-link")
);
extLinkList[index].focus();
this.activeExtIndex = index;
}
extensionTemplate(extension, index) {
return html` <div class="extension-item">
<img src=${extension.iconUrl} class="icon" role="presentation" />
<div
class="extension-link"
extensionId=${extension.extensionId}
tabindex=${index === this.activeExtIndex ? 0 : -1}
role="list-item"
@click=${() => this.manageAddon(extension.extensionId)}
@keydown=${this.handleKeydown}
>
<a
href="about:addons"
tabindex="-1"
target="_blank"
@click=${e => e.preventDefault()}
>${extension.tooltiptext}
</a>
</div>
</div>`;
}
render() {
let extensions = this.getWindow().SidebarController.getExtensions();
return html`
${this.stylesheet()}
<link rel="stylesheet" href="chrome://browser/content/sidebar/sidebar-customize.css"></link>
<div class="container">
<div class="customize-header">
<h2 data-l10n-id="sidebar-menu-customize-label"></h2>
<moz-button
class="customize-close-button"
@click=${this.closeCustomizeView}
view="viewCustomizeSidebar"
size="default"
type="icon ghost"
>
</moz-button>
</div>
<div class="customize-firefox-tools">
<h5 data-l10n-id="sidebar-customize-firefox-tools"></h5>
<div class="inputs">
${this.getWindow()
.SidebarController.getTools()
.map(tool => this.inputTemplate(tool))}
</div>
</div>
${when(
extensions.length,
() => html`<div class="customize-extensions">
<h5 data-l10n-id="sidebar-customize-extensions"></h5>
<div role="list" class="extensions">
${extensions.map((extension, index) =>
this.extensionTemplate(extension, index)
)}
</div>
</div>`
)}
</div>
`;
}
}
customElements.define("sidebar-customize", SidebarCustomize);