mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-17 17:22:42 -05:00
* initial changes for actionbar collapsing * fix more not always all showing after resizing * collapse toolbar if window size is already small when dashboard is opened * make wrapping default behavior and collapse opt in * fix so keyboard navigation works in overflow * more keyboard fixing so that the actions in overflow get triggered * change overflow background with theme * change margin * udpate more button * use icon for ... * addressing comments * overflow css changes to match portal * arrow navigation working * handle tab and shift tab in overflow * keep arrow navigation within overflow * move reused code to helper methods * set roles for overflow * use actionsList instead of document.getElementById all the time * move collapsible action bar to its own class * renamve to overflowActionBar * fix focus rectangle around more element * hide overflow after an action is executed * hide overflow when clicking an action * hide overflow when focus leaves and loop focus within overflow when using arrow keys * fix double down arrow to move focus in overflow * update comment * fix clicking more not hiding overflow * add box-shadow for themes * fix hygiene error * fix hygiene error * widen focused outline for overflow actions
162 lines
4.8 KiB
TypeScript
162 lines
4.8 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
import 'vs/css!./media/taskbar';
|
|
import 'vs/css!./media/icons';
|
|
|
|
import { ActionBar } from './actionbar';
|
|
|
|
import { IActionRunner, IAction } from 'vs/base/common/actions';
|
|
import { ActionsOrientation, IActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar';
|
|
import { IToolBarOptions } from 'vs/base/browser/ui/toolbar/toolbar';
|
|
import { OverflowActionBar } from 'sql/base/browser/ui/taskbar/overflowActionbar';
|
|
|
|
/**
|
|
* A wrapper for the different types of content a QueryTaskbar can display
|
|
*/
|
|
export interface ITaskbarContent {
|
|
|
|
// Display the element created by this IAction
|
|
action?: IAction;
|
|
|
|
// Display a pre-created element
|
|
element?: HTMLElement;
|
|
}
|
|
|
|
/**
|
|
* A widget that combines an action bar for actions. This class was needed because we
|
|
* want the ability to use the custom QueryActionBar in order to display other HTML
|
|
* in our taskbar. Based off import ToolBar from vs/base/browser/ui/toolbar/toolbar.
|
|
*/
|
|
export class Taskbar {
|
|
private options: IToolBarOptions;
|
|
private actionBar: ActionBar;
|
|
|
|
constructor(container: HTMLElement, options: IToolBarOptions = { orientation: ActionsOrientation.HORIZONTAL }, collapseOverflow: boolean = false) {
|
|
this.options = options;
|
|
|
|
let element = document.createElement('div');
|
|
element.className = 'monaco-toolbar carbon-taskbar';
|
|
container.appendChild(element);
|
|
|
|
if (collapseOverflow) {
|
|
this.actionBar = new OverflowActionBar(
|
|
element,
|
|
{
|
|
orientation: options.orientation,
|
|
ariaLabel: options.ariaLabel,
|
|
actionViewItemProvider: (action: IAction): IActionViewItem | undefined => {
|
|
return options.actionViewItemProvider ? options.actionViewItemProvider(action) : undefined;
|
|
}
|
|
}
|
|
);
|
|
} else {
|
|
this.actionBar = new ActionBar(
|
|
element,
|
|
{
|
|
orientation: options.orientation,
|
|
ariaLabel: options.ariaLabel,
|
|
actionViewItemProvider: (action: IAction): IActionViewItem | undefined => {
|
|
return options.actionViewItemProvider ? options.actionViewItemProvider(action) : undefined;
|
|
}
|
|
}
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Creates an HTML vertical separator.
|
|
*/
|
|
public static createTaskbarSeparator(): HTMLElement {
|
|
let element = document.createElement('div');
|
|
element.className = 'taskbarSeparator';
|
|
element.innerHTML = ' ';
|
|
return element;
|
|
}
|
|
|
|
/**
|
|
* Creates an HTML spinner.
|
|
*/
|
|
public static createTaskbarSpinner(): HTMLElement {
|
|
let spinnerContainer = document.createElement('div');
|
|
spinnerContainer.className = 'taskbar-progress codicon in-progress ';
|
|
spinnerContainer.style.visibility = 'hidden';
|
|
return spinnerContainer;
|
|
}
|
|
|
|
/**
|
|
* Creates an HTML text separator.
|
|
*/
|
|
public static createTaskbarText(inputText: string): HTMLElement {
|
|
let element = document.createElement('div');
|
|
element.className = 'taskbarTextSeparator';
|
|
element.textContent = inputText;
|
|
return element;
|
|
}
|
|
|
|
public set actionRunner(actionRunner: IActionRunner) {
|
|
this.actionBar.actionRunner = actionRunner;
|
|
}
|
|
|
|
public get actionRunner(): IActionRunner {
|
|
return this.actionBar.actionRunner;
|
|
}
|
|
|
|
public set context(context: any) {
|
|
this.actionBar.context = context;
|
|
}
|
|
|
|
public getContainer(): HTMLElement {
|
|
return this.actionBar.getContainer();
|
|
}
|
|
|
|
public setAriaLabel(label: string): void {
|
|
this.actionBar.setAriaLabel(label);
|
|
}
|
|
|
|
public length(): number {
|
|
return this.actionBar.length();
|
|
}
|
|
|
|
public pull(index: number) {
|
|
this.actionBar.pull(index);
|
|
}
|
|
|
|
/**
|
|
* Push HTMLElements and icons for IActions into the ActionBar UI. Push IActions into ActionBar's private collection.
|
|
*/
|
|
public setContent(content: ITaskbarContent[]): void {
|
|
let contentToSet: ITaskbarContent[] = content ? content.slice(0) : [];
|
|
this.actionBar.clear();
|
|
|
|
for (let item of contentToSet) {
|
|
if (item.action) {
|
|
this.actionBar.pushAction(item.action, { icon: true, label: true, keybinding: this.getKeybindingLabel(item.action) });
|
|
} else if (item.element) {
|
|
this.actionBar.pushElement(item.element);
|
|
}
|
|
}
|
|
}
|
|
|
|
private getKeybindingLabel(action: IAction): string {
|
|
const key = this.options.getKeyBinding ? this.options.getKeyBinding(action) : undefined;
|
|
const label = key ? key.getLabel() : undefined;
|
|
return label || '';
|
|
}
|
|
|
|
public addAction(primaryAction: IAction): void {
|
|
this.actionBar.pushAction(primaryAction, { icon: true, label: false, keybinding: this.getKeybindingLabel(primaryAction) });
|
|
}
|
|
|
|
public addElement(element: HTMLElement): void {
|
|
this.actionBar.pushElement(element);
|
|
}
|
|
|
|
public dispose(): void {
|
|
this.actionBar.dispose();
|
|
}
|
|
|
|
}
|