From 5c0002404adb9bcf67559633ea1af6378c62cee1 Mon Sep 17 00:00:00 2001 From: Anthony Dresser Date: Mon, 12 Mar 2018 11:41:49 -0700 Subject: [PATCH] Task context + schema (#849) * commting .d.ts changes * added serverinfo to .d.ts * maybe its working? * works * updated contrib * remove unnecessary code * fix compile errors * update task schema and add the ability to specifiy a when clause * update defaults for tasks widget * add when to restore and back up tasks to not show up for cloud servers * formatting * fixing engine * add restore to server page --- .../databaseDashboardPage.contribution.ts | 2 +- .../pages/serverDashboardPage.contribution.ts | 2 +- .../widgets/tasks/tasksWidget.component.ts | 27 ++++++++++++++----- .../widgets/tasks/tasksWidget.contribution.ts | 25 ++++++++++++----- .../dashboard/common/widgetRegistry.ts | 10 ++++--- src/sql/platform/tasks/common/tasks.ts | 6 ++++- src/vs/workbench/workbench.main.ts | 4 +-- 7 files changed, 55 insertions(+), 21 deletions(-) diff --git a/src/sql/parts/dashboard/pages/databaseDashboardPage.contribution.ts b/src/sql/parts/dashboard/pages/databaseDashboardPage.contribution.ts index d45054827f..a653370889 100644 --- a/src/sql/parts/dashboard/pages/databaseDashboardPage.contribution.ts +++ b/src/sql/parts/dashboard/pages/databaseDashboardPage.contribution.ts @@ -95,7 +95,7 @@ export const databaseDashboardSettingSchema: IJSONSchema = { sizey: 1 }, widget: { - 'tasks-widget': {} + 'tasks-widget': [{ name: 'backup', when: '!mssql:iscloud' }, { name: 'restore', when: '!mssql:iscloud' }, 'configureDashboard', 'newQuery'] } }, { diff --git a/src/sql/parts/dashboard/pages/serverDashboardPage.contribution.ts b/src/sql/parts/dashboard/pages/serverDashboardPage.contribution.ts index a1771af529..6053d1725f 100644 --- a/src/sql/parts/dashboard/pages/serverDashboardPage.contribution.ts +++ b/src/sql/parts/dashboard/pages/serverDashboardPage.contribution.ts @@ -77,7 +77,7 @@ let defaultVal = [ { name: 'Tasks', widget: { - 'tasks-widget': {} + 'tasks-widget': [{ name: 'restore', when: '!mssql:iscloud' }, 'configureDashboard', 'newQuery'] }, gridItemConfig: { sizex: 1, diff --git a/src/sql/parts/dashboard/widgets/tasks/tasksWidget.component.ts b/src/sql/parts/dashboard/widgets/tasks/tasksWidget.component.ts index a09cfe62f7..e6ed136958 100644 --- a/src/sql/parts/dashboard/widgets/tasks/tasksWidget.component.ts +++ b/src/sql/parts/dashboard/widgets/tasks/tasksWidget.component.ts @@ -30,13 +30,17 @@ import { $, Builder } from 'vs/base/browser/builder'; import * as DOM from 'vs/base/browser/dom'; import { CommandsRegistry, ICommand } from 'vs/platform/commands/common/commands'; import { MenuRegistry, ICommandAction } from 'vs/platform/actions/common/actions'; +import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -interface IConfig { - tasks: Array; +interface ITask { + name: string; + when: string; } +const selector = 'tasks-widget'; + @Component({ - selector: 'tasks-widget', + selector, templateUrl: decodeURI(require.toUrl('sql/parts/dashboard/widgets/tasks/tasksWidget.component.html')) }) export class TasksWidget extends DashboardWidget implements IDashboardWidget, OnInit { @@ -58,11 +62,22 @@ export class TasksWidget extends DashboardWidget implements IDashboardWidget, On ) { super(); this._profile = this._bootstrap.connectionManagementService.connectionInfo.connectionProfile; - let tasksConfig = Object.values(this._config.widget)[0]; + let tasksConfig = this._config.widget[selector] as Array; let tasks = TaskRegistry.getTasks(); - if (tasksConfig.tasks) { - tasks = Object.keys(tasksConfig.tasks).filter(i => tasks.includes(i)); + if (types.isArray(tasksConfig) && tasksConfig.length > 0) { + tasks = tasksConfig.map(i => { + if (types.isString(i)) { + if (tasks.includes(i)) { + return i; + } + } else { + if (tasks.includes(i.name) && _bootstrap.contextKeyService.contextMatchesRules(ContextKeyExpr.deserialize(i.when))) { + return i.name; + } + } + return undefined; + }).filter(i => !!i); } this._tasks = tasks.map(i => MenuRegistry.getCommand(i)); diff --git a/src/sql/parts/dashboard/widgets/tasks/tasksWidget.contribution.ts b/src/sql/parts/dashboard/widgets/tasks/tasksWidget.contribution.ts index bd48db6026..0a04d09c1a 100644 --- a/src/sql/parts/dashboard/widgets/tasks/tasksWidget.contribution.ts +++ b/src/sql/parts/dashboard/widgets/tasks/tasksWidget.contribution.ts @@ -6,12 +6,25 @@ import { IJSONSchema } from 'vs/base/common/jsonSchema'; import { registerDashboardWidget } from 'sql/platform/dashboard/common/widgetRegistry'; import { TaskRegistry } from 'sql/platform/tasks/common/tasks'; -let tasksSchema: IJSONSchema = { - type: 'object', - properties: { - tasks: { - type: 'object' - } +const tasksSchema: IJSONSchema = { + type: 'array', + items: { + anyOf: [{ + type: 'string', + enum: TaskRegistry.getTasks() + }, + { + type: 'object', + properties: { + name: { + type: 'string', + enum: TaskRegistry.getTasks() + }, + when: { + type: 'string' + } + } + }] } }; diff --git a/src/sql/platform/dashboard/common/widgetRegistry.ts b/src/sql/platform/dashboard/common/widgetRegistry.ts index f874cafd16..b7cd615c59 100644 --- a/src/sql/platform/dashboard/common/widgetRegistry.ts +++ b/src/sql/platform/dashboard/common/widgetRegistry.ts @@ -6,8 +6,10 @@ import { IInsightsConfig } from 'sql/parts/dashboard/widgets/insights/interfaces import * as platform from 'vs/platform/registry/common/platform'; import { IJSONSchema, IJSONSchemaMap } from 'vs/base/common/jsonSchema'; +import { IJSONContributionRegistry, Extensions as JSONExtensions } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import * as nls from 'vs/nls'; -import { deepClone } from 'vs/base/common/objects'; + +const contributionRegistry = platform.Registry.as(JSONExtensions.JSONContribution); export type WidgetIdentifier = string; @@ -89,15 +91,15 @@ class DashboardWidgetRegistry implements IDashboardWidgetRegistry { } public get databaseWidgetSchema(): CustomIJSONSchema { - return deepClone(this._dashboardWidgetSchema); + return this._dashboardWidgetSchema; } public get serverWidgetSchema(): CustomIJSONSchema { - return deepClone(this._serverWidgetSchema); + return this._serverWidgetSchema; } public get allSchema(): CustomIJSONSchema { - return deepClone(this._allSchema); + return this._allSchema; } } diff --git a/src/sql/platform/tasks/common/tasks.ts b/src/sql/platform/tasks/common/tasks.ts index 478b49b72f..b5eedf9ab3 100644 --- a/src/sql/platform/tasks/common/tasks.ts +++ b/src/sql/platform/tasks/common/tasks.ts @@ -11,7 +11,7 @@ import { Action } from 'vs/base/common/actions'; import { IConstructorSignature3, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import * as nls from 'vs/nls'; import { ILocalizedString, IMenuItem, MenuRegistry, ICommandAction } from 'vs/platform/actions/common/actions'; -import Event from 'vs/base/common/event'; +import Event, { Emitter } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { IConnectionProfile } from 'sql/parts/connection/common/interfaces'; @@ -96,11 +96,14 @@ export interface ITaskRegistry { registerTask(id: string, command: ITaskHandler): IDisposable; registerTask(command: ITask): IDisposable; getTasks(): string[]; + onTaskRegistered: Event; } export const TaskRegistry: ITaskRegistry = new class implements ITaskRegistry { private _tasks = new Array(); + private _onTaskRegistered = new Emitter(); + public readonly onTaskRegistered: Event = this._onTaskRegistered.event; registerTask(idOrTask: string | ITask, handler?: ITaskHandler): IDisposable { let disposable: IDisposable; @@ -114,6 +117,7 @@ export const TaskRegistry: ITaskRegistry = new class implements ITaskRegistry { } this._tasks.push(id); + this._onTaskRegistered.fire(id); return { dispose: () => { diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index 1d20ba0e0c..d2db1c8986 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -153,6 +153,8 @@ import 'sql/parts/dashboard/widgets/insights/views/charts/types/scatterChart.con import 'sql/parts/dashboard/widgets/insights/views/charts/types/timeSeriesChart.contribution'; import 'sql/parts/dashboard/widgets/insights/views/countInsight.contribution'; import 'sql/parts/dashboard/widgets/insights/views/imageInsight.contribution'; +/* Tasks */ +import 'sql/workbench/common/actions.contribution'; /* Widgets */ import 'sql/parts/dashboard/widgets/insights/insightsWidget.contribution'; import 'sql/parts/dashboard/widgets/explorer/explorerWidget.contribution'; @@ -166,7 +168,5 @@ import 'sql/parts/dashboard/containers/dashboardWidgetContainer.contribution'; import 'sql/parts/dashboard/containers/dashboardContainer.contribution'; import 'sql/parts/dashboard/containers/dashboardNavSection.contribution'; import 'sql/parts/dashboard/common/dashboardTab.contribution'; -/* Tasks */ -import 'sql/workbench/common/actions.contribution'; /* Extension Host */ import 'sql/workbench/api/electron-browser/sqlExtensionHost.contribution';