Fix "always show" for dashboard tab to behave like pinned by default (#879)

* make tab config settings overwrite always show

* formatting
This commit is contained in:
Abbie Petchtes
2018-03-09 10:18:07 -08:00
committed by GitHub
parent 52544fa953
commit bc4b399f87
4 changed files with 41 additions and 28 deletions

View File

@@ -9,7 +9,7 @@ import 'sql/parts/dashboard/common/dashboardPanelStyles';
import { Component, Inject, forwardRef, ViewChild, ElementRef, ViewChildren, QueryList, OnDestroy, ChangeDetectorRef } from '@angular/core'; import { Component, Inject, forwardRef, ViewChild, ElementRef, ViewChildren, QueryList, OnDestroy, ChangeDetectorRef } from '@angular/core';
import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service'; import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service';
import { WidgetConfig, TabConfig, PinConfig } from 'sql/parts/dashboard/common/dashboardWidget'; import { WidgetConfig, TabConfig, TabSettingConfig } from 'sql/parts/dashboard/common/dashboardWidget';
import { Extensions, IInsightRegistry } from 'sql/platform/dashboard/common/insightRegistry'; import { Extensions, IInsightRegistry } from 'sql/platform/dashboard/common/insightRegistry';
import { DashboardWidgetWrapper } from 'sql/parts/dashboard/contents/dashboardWidgetWrapper.component'; import { DashboardWidgetWrapper } from 'sql/parts/dashboard/contents/dashboardWidgetWrapper.component';
import { IPropertiesConfig } from 'sql/parts/dashboard/pages/serverDashboardPage.contribution'; import { IPropertiesConfig } from 'sql/parts/dashboard/pages/serverDashboardPage.contribution';
@@ -57,7 +57,7 @@ export abstract class DashboardPage extends Disposable implements OnDestroy {
protected panelActions: Action[]; protected panelActions: Action[];
private _tabsDispose: Array<IDisposable> = []; private _tabsDispose: Array<IDisposable> = [];
private _pinnedTabs: Array<PinConfig> = []; private _tabSettingConfigs: Array<TabSettingConfig> = [];
@ViewChildren(DashboardTab) private _tabs: QueryList<DashboardTab>; @ViewChildren(DashboardTab) private _tabs: QueryList<DashboardTab>;
@ViewChild(PanelComponent) private _panel: PanelComponent; @ViewChild(PanelComponent) private _panel: PanelComponent;
@@ -117,7 +117,7 @@ export abstract class DashboardPage extends Disposable implements OnDestroy {
private createTabs(homeWidgets: WidgetConfig[]) { private createTabs(homeWidgets: WidgetConfig[]) {
// Clear all tabs // Clear all tabs
this.tabs = []; this.tabs = [];
this._pinnedTabs = []; this._tabSettingConfigs = [];
this._tabsDispose.forEach(i => i.dispose()); this._tabsDispose.forEach(i => i.dispose());
this._tabsDispose = []; this._tabsDispose = [];
@@ -138,20 +138,29 @@ export abstract class DashboardPage extends Disposable implements OnDestroy {
let allTabs = dashboardHelper.filterConfigs(dashboardRegistry.tabs, this.dashboardService); let allTabs = dashboardHelper.filterConfigs(dashboardRegistry.tabs, this.dashboardService);
// Load always show tabs // Load tab setting configs
let alwaysShowTabs = allTabs.filter(tab => tab.alwaysShow); this._tabSettingConfigs = this.dashboardService.getSettings<Array<TabSettingConfig>>([this.context, 'tabs'].join('.'));
this.loadNewTabs(alwaysShowTabs);
// Load pinned tabs
this._pinnedTabs = this.dashboardService.getSettings<Array<PinConfig>>([this.context, 'tabs'].join('.'));
let pinnedDashboardTabs: IDashboardTab[] = []; let pinnedDashboardTabs: IDashboardTab[] = [];
this._pinnedTabs.forEach(pinnedTab => { let alwaysShowTabs = allTabs.filter(tab => tab.alwaysShow);
let tab = allTabs.find(i => i.id === pinnedTab.tabId);
if (tab) { this._tabSettingConfigs.forEach(config => {
pinnedDashboardTabs.push(tab); if (config.tabId && types.isBoolean(config.isPinned)) {
let tab = allTabs.find(i => i.id === config.tabId);
if (tab) {
if (config.isPinned) {
pinnedDashboardTabs.push(tab);
} else {
// overwrite always show if specify in user settings
let index = alwaysShowTabs.findIndex(i => i.id === tab.id);
alwaysShowTabs.splice(index, 1);
}
}
} }
}); });
this.loadNewTabs(pinnedDashboardTabs); this.loadNewTabs(pinnedDashboardTabs);
this.loadNewTabs(alwaysShowTabs);
// Set panel actions // Set panel actions
let openedTabs = [...pinnedDashboardTabs, ...alwaysShowTabs]; let openedTabs = [...pinnedDashboardTabs, ...alwaysShowTabs];
@@ -161,11 +170,11 @@ export abstract class DashboardPage extends Disposable implements OnDestroy {
this._cd.detectChanges(); this._cd.detectChanges();
this._tabsDispose.push(this.dashboardService.onPinUnpinTab(e => { this._tabsDispose.push(this.dashboardService.onPinUnpinTab(e => {
if (e.isPinned) { let tabConfig = this._tabSettingConfigs.find(i => i.tabId === e.tabId);
this._pinnedTabs.push(e); if (tabConfig) {
tabConfig.isPinned = e.isPinned;
} else { } else {
let index = this._pinnedTabs.findIndex(i => i.tabId === e.tabId); this._tabSettingConfigs.push(e);
this._pinnedTabs.splice(index, 1);
} }
this.rewriteConfig(); this.rewriteConfig();
})); }));
@@ -176,11 +185,8 @@ export abstract class DashboardPage extends Disposable implements OnDestroy {
} }
private rewriteConfig(): void { private rewriteConfig(): void {
let writeableConfig = objects.deepClone(this._pinnedTabs); let writeableConfig = objects.deepClone(this._tabSettingConfigs);
writeableConfig.forEach(i => {
delete i.isPinned;
});
let target: ConfigurationTarget = ConfigurationTarget.USER; let target: ConfigurationTarget = ConfigurationTarget.USER;
this.dashboardService.writeSettings([this.context, 'tabs'].join('.'), writeableConfig, target); this.dashboardService.writeSettings([this.context, 'tabs'].join('.'), writeableConfig, target);
} }
@@ -212,10 +218,14 @@ export abstract class DashboardPage extends Disposable implements OnDestroy {
return { id: v.id, title: v.title, container: containerResult.container, alwaysShow: v.alwaysShow }; return { id: v.id, title: v.title, container: containerResult.container, alwaysShow: v.alwaysShow };
}).map(v => { }).map(v => {
let actions = []; let actions = [];
if (!v.alwaysShow) { let tabConfig = this._tabSettingConfigs.find(i => i.tabId === v.id);
let pinnedTab = this._pinnedTabs.find(i => i.tabId === v.id); let isPinned = false;
actions.push(this.dashboardService.instantiationService.createInstance(PinUnpinTabAction, v.id, this.dashboardService.getUnderlyingUri(), !!pinnedTab)); if (tabConfig) {
isPinned = tabConfig.isPinned;
} else if (v.alwaysShow) {
isPinned = true;
} }
actions.push(this.dashboardService.instantiationService.createInstance(PinUnpinTabAction, v.id, this.dashboardService.getUnderlyingUri(), isPinned));
let config = v as TabConfig; let config = v as TabConfig;
config.context = this.context; config.context = this.context;

View File

@@ -51,9 +51,9 @@ export interface NavSectionConfig {
container: object; container: object;
} }
export interface PinConfig { export interface TabSettingConfig {
tabId: string; tabId: string;
isPinned?: boolean; isPinned: boolean;
} }
export abstract class DashboardWidget extends Disposable implements OnDestroy { export abstract class DashboardWidget extends Disposable implements OnDestroy {

View File

@@ -134,6 +134,9 @@ export function generateDashboardTabSchema(type?: 'database' | 'server'): IJSONS
enum: [], enum: [],
enumDescriptions: [], enumDescriptions: [],
errorMessage: localize('dashboardTabError', "Extension tab is unknown or not installed.") errorMessage: localize('dashboardTabError', "Extension tab is unknown or not installed.")
},
isPinned: {
type: 'boolean'
} }
} }
}; };

View File

@@ -22,7 +22,7 @@ import { ICapabilitiesService } from 'sql/services/capabilities/capabilitiesServ
import { IConnectionProfile } from 'sql/parts/connection/common/interfaces'; import { IConnectionProfile } from 'sql/parts/connection/common/interfaces';
import { AngularEventType, IAngularEvent, IAngularEventingService } from 'sql/services/angularEventing/angularEventingService'; import { AngularEventType, IAngularEvent, IAngularEventingService } from 'sql/services/angularEventing/angularEventingService';
import { IDashboardTab } from 'sql/platform/dashboard/common/dashboardRegistry'; import { IDashboardTab } from 'sql/platform/dashboard/common/dashboardRegistry';
import { PinConfig } from 'sql/parts/dashboard/common/dashboardWidget'; import { TabSettingConfig } from 'sql/parts/dashboard/common/dashboardWidget';
import { IDashboardWebviewService } from 'sql/services/dashboardWebview/common/dashboardWebviewService'; import { IDashboardWebviewService } from 'sql/services/dashboardWebview/common/dashboardWebviewService';
import { ProviderMetadata, DatabaseInfo, SimpleExecuteResult } from 'sqlops'; import { ProviderMetadata, DatabaseInfo, SimpleExecuteResult } from 'sqlops';
@@ -146,8 +146,8 @@ export class DashboardServiceInterface implements OnDestroy {
private _onDeleteWidget = new Emitter<string>(); private _onDeleteWidget = new Emitter<string>();
public readonly onDeleteWidget: Event<string> = this._onDeleteWidget.event; public readonly onDeleteWidget: Event<string> = this._onDeleteWidget.event;
private _onPinUnpinTab = new Emitter<PinConfig>(); private _onPinUnpinTab = new Emitter<TabSettingConfig>();
public readonly onPinUnpinTab: Event<PinConfig> = this._onPinUnpinTab.event; public readonly onPinUnpinTab: Event<TabSettingConfig> = this._onPinUnpinTab.event;
private _onAddNewTabs = new Emitter<Array<IDashboardTab>>(); private _onAddNewTabs = new Emitter<Array<IDashboardTab>>();
public readonly onAddNewTabs: Event<Array<IDashboardTab>> = this._onAddNewTabs.event; public readonly onAddNewTabs: Event<Array<IDashboardTab>> = this._onAddNewTabs.event;