Tab contribution support both inline container and registered container (#766)

* accept inline nav section contribution

* contribution accepted both inline container and registered container

* address comments

* formatting
This commit is contained in:
Abbie Petchtes
2018-02-23 15:12:30 -08:00
committed by GitHub
parent f9d8f479b5
commit bd7341ddc2
13 changed files with 183 additions and 157 deletions

View File

@@ -6,12 +6,27 @@ import * as types from 'vs/base/common/types';
import { generateUuid } from 'vs/base/common/uuid';
import { Registry } from 'vs/platform/registry/common/platform';
import { Severity } from 'vs/platform/message/common/message';
import { error } from 'sql/base/common/log';
import * as nls from 'vs/nls';
import { WidgetConfig } from 'sql/parts/dashboard/common/dashboardWidget';
import { Extensions, IInsightRegistry } from 'sql/platform/dashboard/common/insightRegistry';
import { ConnectionManagementInfo } from 'sql/parts/connection/common/connectionManagementInfo';
import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service';
import { WIDGETS_CONTAINER } from 'sql/parts/dashboard/containers/dashboardWidgetContainer.contribution';
import { GRID_CONTAINER } from 'sql/parts/dashboard/containers/dashboardGridContainer.contribution';
import { WEBVIEW_CONTAINER } from 'sql/parts/dashboard/containers/dashboardWebviewContainer.contribution';
import { NAV_SECTION } from 'sql/parts/dashboard/containers/dashboardNavSection.contribution';
import { IDashboardContainerRegistry, Extensions as DashboardContainerExtensions, IDashboardContainer, registerContainerType } from 'sql/platform/dashboard/common/dashboardContainerRegistry';
import { IDashboardTab } from 'sql/platform/dashboard/common/dashboardRegistry';
const dashboardcontainerRegistry = Registry.as<IDashboardContainerRegistry>(DashboardContainerExtensions.dashboardContainerContributions);
const containerTypes = [
WIDGETS_CONTAINER,
GRID_CONTAINER,
WEBVIEW_CONTAINER,
NAV_SECTION
];
/**
@@ -172,4 +187,26 @@ export function filterConfigs<T extends { provider?: string | string[], edition?
return true;
}
});
}
/**
* Get registered container if it is specified as the key
* @param container dashboard container
*/
export function getDashboardContainer(container: object): object {
if (Object.keys(container).length !== 1) {
error(nls.localize('moreThanOneDashboardContainersError', 'Exactly 1 dashboard container must be defined per space'));
}
let key = Object.keys(container)[0];
let containerTypeFound = containerTypes.find(c => (c === key));
if (!containerTypeFound) {
let dashboardContainer = dashboardcontainerRegistry.getRegisteredContainer(key);
if (!dashboardContainer) {
error(nls.localize('unknownDashboardContainerError', 'The specified dashboard container is unknown.'));
} else {
container = dashboardContainer.container;
}
}
return container;
}

View File

@@ -21,7 +21,7 @@ import { IBootstrapService, BOOTSTRAP_SERVICE_ID } from 'sql/services/bootstrap/
import { AngularEventType } from 'sql/services/angularEventing/angularEventingService';
import { DashboardTab } from 'sql/parts/dashboard/common/interfaces';
import { error } from 'sql/base/common/log';
import * as widgetHelper from 'sql/parts/dashboard/common/dashboardWidgetHelper';
import * as dashboardHelper from 'sql/parts/dashboard/common/dashboardHelper';
import { WIDGETS_CONTAINER } from 'sql/parts/dashboard/containers/dashboardWidgetContainer.contribution';
import { GRID_CONTAINER } from 'sql/parts/dashboard/containers/dashboardGridContainer.contribution';
@@ -72,16 +72,16 @@ export abstract class DashboardPage extends Disposable implements OnDestroy {
// a set of config modifiers
private readonly _configModifiers: Array<(item: Array<WidgetConfig>, dashboardServer: DashboardServiceInterface, context: string) => Array<WidgetConfig>> = [
widgetHelper.removeEmpty,
widgetHelper.initExtensionConfigs,
widgetHelper.addProvider,
widgetHelper.addEdition,
widgetHelper.addContext,
widgetHelper.filterConfigs
dashboardHelper.removeEmpty,
dashboardHelper.initExtensionConfigs,
dashboardHelper.addProvider,
dashboardHelper.addEdition,
dashboardHelper.addContext,
dashboardHelper.filterConfigs
];
private readonly _gridModifiers: Array<(item: Array<WidgetConfig>, originalConfig: Array<WidgetConfig>) => Array<WidgetConfig>> = [
widgetHelper.validateGridConfig
dashboardHelper.validateGridConfig
];
protected abstract propertiesWidget: WidgetConfig;
@@ -140,7 +140,7 @@ export abstract class DashboardPage extends Disposable implements OnDestroy {
this.addNewTab(homeTab);
this._panel.selectTab(homeTab.id);
let allTabs = widgetHelper.filterConfigs(dashboardRegistry.tabs, this.dashboardService);
let allTabs = dashboardHelper.filterConfigs(dashboardRegistry.tabs, this.dashboardService);
// Load always show tabs
let alwaysShowTabs = allTabs.filter(tab => tab.alwaysShow);
@@ -192,14 +192,11 @@ export abstract class DashboardPage extends Disposable implements OnDestroy {
private loadNewTabs(dashboardTabs: IDashboardTab[]) {
if (dashboardTabs && dashboardTabs.length > 0) {
let selectedTabs = dashboardTabs.map(v => {
let container = dashboardHelper.getDashboardContainer(v.container);
let key = Object.keys(container)[0];
if (Object.keys(v.container).length !== 1) {
error('Exactly 1 content must be defined per space');
}
let key = Object.keys(v.container)[0];
if (key === WIDGETS_CONTAINER || key === GRID_CONTAINER) {
let configs = <WidgetConfig[]>Object.values(v.container)[0];
let configs = <WidgetConfig[]>Object.values(container)[0];
this._configModifiers.forEach(cb => {
configs = cb.apply(this, [configs, this.dashboardService, this.context]);
});
@@ -213,7 +210,7 @@ export abstract class DashboardPage extends Disposable implements OnDestroy {
return { id: v.id, title: v.title, container: { 'grid-container': configs }, alwaysShow: v.alwaysShow };
}
}
return v;
return { id: v.id, title: v.title, container: container, alwaysShow: v.alwaysShow };
}).map(v => {
let actions = [];
if (!v.alwaysShow) {

View File

@@ -6,7 +6,8 @@ import { IExtensionPointUser, ExtensionsRegistry } from 'vs/platform/extensions/
import { IJSONSchema } from 'vs/base/common/jsonSchema';
import { localize } from 'vs/nls';
import { registerTab, generateTabContentSchemaProperties } from 'sql/platform/dashboard/common/dashboardRegistry';
import { registerTab } from 'sql/platform/dashboard/common/dashboardRegistry';
import { generateContainerTypeSchemaProperties } from 'sql/platform/dashboard/common/dashboardContainerRegistry';
export interface IDashboardTabContrib {
id: string;
@@ -64,7 +65,7 @@ const tabSchema: IJSONSchema = {
container: {
description: localize('sqlops.extension.contributes.dashboard.tab.container', "The container that will be displayed in this tab."),
type: 'object',
properties: generateTabContentSchemaProperties()
properties: generateContainerTypeSchemaProperties()
},
alwaysShow: {
description: localize('sqlops.extension.contributes.dashboard.tab.alwaysShow', "Whether or not this tab should always be shown or only when the user adds it."),

View File

@@ -41,6 +41,15 @@ export interface TabConfig extends IDashboardTab {
actions?: Array<Action>;
}
export type IUserFriendlyIcon = string | { light: string; dark: string; };
export interface NavSectionConfig {
id: string;
title: string;
icon?: IUserFriendlyIcon;
container: object;
}
export interface PinConfig {
tabId: string;
isPinned?: boolean;