mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 10:58:30 -05:00
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:
@@ -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;
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user