Compare commits
56 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8a3509e006 | ||
|
|
1d3ead4031 | ||
|
|
498bb47d7f | ||
|
|
f2df9f3917 | ||
|
|
0414ab6e6a | ||
|
|
14a7a5534f | ||
|
|
edc60e0ad1 | ||
|
|
1a97e3de06 | ||
|
|
f5b1bd0bc2 | ||
|
|
05d7e24e66 | ||
|
|
83842ee9e1 | ||
|
|
a13039b14b | ||
|
|
8fce79f385 | ||
|
|
2efea63000 | ||
|
|
c208abf0c5 | ||
|
|
1359354387 | ||
|
|
cd0f9b71c5 | ||
|
|
04ec9caad1 | ||
|
|
259306a8db | ||
|
|
36a8991682 | ||
|
|
1461929f86 | ||
|
|
4bfc549927 | ||
|
|
40db0d6f6f | ||
|
|
6aac0b6056 | ||
|
|
8e234d9b2d | ||
|
|
70819252a9 | ||
|
|
ba264d8311 | ||
|
|
5de002e5c1 | ||
|
|
0b771abad2 | ||
|
|
00041c8ecd | ||
|
|
0225d6d9f9 | ||
|
|
fb4260d71c | ||
|
|
fa253158f4 | ||
|
|
45e3c6ae49 | ||
|
|
d526fe0f7f | ||
|
|
5707b58fda | ||
|
|
1a9f72dfe0 | ||
|
|
078f3a2b54 | ||
|
|
5bcfb9ab32 | ||
|
|
9bd45cf66a | ||
|
|
89c48bbe75 | ||
|
|
6b549696c5 | ||
|
|
3aaf8a24bf | ||
|
|
41ffd6e8ae | ||
|
|
c0a6f3e012 | ||
|
|
eae8de0373 | ||
|
|
23ec6ac567 | ||
|
|
f4cfb4a5ef | ||
|
|
80a9c82813 | ||
|
|
bcd6178d67 | ||
|
|
f10e281ffc | ||
|
|
c2b32fd64a | ||
|
|
80f150dfb4 | ||
|
|
a5c5fcbde1 | ||
|
|
0d76e845d5 | ||
|
|
979d50eb0e |
15
CHANGELOG.md
@@ -1,5 +1,20 @@
|
|||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
|
## Version 0.29.3
|
||||||
|
* Release date: May 7, 2018
|
||||||
|
* Release status: Public Preview
|
||||||
|
|
||||||
|
## What's new in this version
|
||||||
|
The May release is focused on stabilization and bug fixes leading up to the Build conference. This build contains the following highlights.
|
||||||
|
|
||||||
|
* Announcing **Redgate SQL Search** extension available in Extension Manager
|
||||||
|
* Community Localization available for 10 languages: **German, Spanish, French, Italian, Japanese, Korean, Portuguese, Russian, Simplified Chinese and Traditional Chinese!**
|
||||||
|
* **GDPR-compliant** build has reduced telemetry collection, improved [opt-out](https://github.com/Microsoft/sqlopsstudio/wiki/How-to-Disable-Telemetry-Reporting) experience and in-product links to [Privacy Statement](https://privacy.microsoft.com/en-us/privacystatement)
|
||||||
|
* Extension Manager has improved Marketplace experience to easily discover community extensions
|
||||||
|
* SQL Agent extension Jobs and Job History view improvement
|
||||||
|
* Updates for **whoisactive** and **Server Reports** extensions
|
||||||
|
* Continue to fix GitHub issues
|
||||||
|
|
||||||
## Version 0.28.6
|
## Version 0.28.6
|
||||||
* Release date: April 25, 2018
|
* Release date: April 25, 2018
|
||||||
* Release status: Public Preview
|
* Release status: Public Preview
|
||||||
|
|||||||
27
README.md
@@ -4,16 +4,16 @@
|
|||||||
|
|
||||||
SQL Operations Studio is a data management tool that enables you to work with SQL Server, Azure SQL DB and SQL DW from Windows, macOS and Linux.
|
SQL Operations Studio is a data management tool that enables you to work with SQL Server, Azure SQL DB and SQL DW from Windows, macOS and Linux.
|
||||||
|
|
||||||
**Download SQL Operations Studio March Public Preview**
|
**Download SQL Operations Studio May Public Preview**
|
||||||
|
|
||||||
Platform | Link
|
Platform | Link
|
||||||
-- | --
|
-- | --
|
||||||
Windows Setup Installer | https://go.microsoft.com/fwlink/?linkid=872717
|
Windows Setup Installer | https://go.microsoft.com/fwlink/?linkid=873386
|
||||||
Windows ZIP | https://go.microsoft.com/fwlink/?linkid=872718
|
Windows ZIP | https://go.microsoft.com/fwlink/?linkid=873387
|
||||||
macOS ZIP | https://go.microsoft.com/fwlink/?linkid=872719
|
macOS ZIP | https://go.microsoft.com/fwlink/?linkid=873388
|
||||||
Linux TAR.GZ | https://go.microsoft.com/fwlink/?linkid=872720
|
Linux TAR.GZ | https://go.microsoft.com/fwlink/?linkid=873389
|
||||||
Linux DEB | https://go.microsoft.com/fwlink/?linkid=872722
|
Linux RPM | https://go.microsoft.com/fwlink/?linkid=873390
|
||||||
Linux RPM | https://go.microsoft.com/fwlink/?linkid=872721
|
Linux DEB | https://go.microsoft.com/fwlink/?linkid=873391
|
||||||
|
|
||||||
Go to our [download page](https://aka.ms/sqlopsstudio) for more specific instructions.
|
Go to our [download page](https://aka.ms/sqlopsstudio) for more specific instructions.
|
||||||
|
|
||||||
@@ -74,7 +74,18 @@ We would like to thank all our users who raised issues, and in particular the fo
|
|||||||
* SebastianPfliegel `Remove sqlExtensionHelp (#312)`
|
* SebastianPfliegel `Remove sqlExtensionHelp (#312)`
|
||||||
* olljanat for `Implemented npm version check (#314)`
|
* olljanat for `Implemented npm version check (#314)`
|
||||||
* Adam Mechanic for helping with the `whoisactive` extension
|
* Adam Mechanic for helping with the `whoisactive` extension
|
||||||
* All community localization contributors *(will get list of individuals next month)*
|
* All community localization contributors
|
||||||
|
* French: Adrien Clerbois, ANAS BELABBES, Antoine Griffard, Arian Papillon, Eric Macarez, Eric Van Thorre, Jérémy LANDON, Matthias GROSPERRIN, Maxime COQUEREL, Olivier Guinart, thierry DEMAN-BARCELÒ, Thomas Potier
|
||||||
|
* Italian: Aldo Donetti, Alessandro Alpi, Andrea Dottor, Bruni Luca, Gianluca Hotz, Luca Nardi, Luigi Bruno, Marco Dal Pino, Mirco Vanini, Pasquale Ceglie, Riccardo Cappello, Sergio Govoni, Stefano Demiliani
|
||||||
|
* German: Anna Henke-Gunvaldson, Ben Weissman, David Ullmer, J.M. ., Kai Modo, Konstantin Staschill, Kostja Klein, Lennart Trunk, Markus Ehrenmüller-Jensen, Mascha Kroenlein, Matthias Knoll, Mourad Louha, Thomas Hütter, Wolfgang Straßer
|
||||||
|
* Spanish: Alberto Poblacion, Andy Gonzalez, Carlos Mendible, Christian Araujo, Daniel D, Eickhel Mendoza, Ernesto Cardenas, Ivan Toledo Ivanovic, Fran Diaz, JESUS GIL, Jorge Serrano Pérez, José Saturnino Pimentel Juárez, Mauricio Hidalgo, Pablo Iglesias, Rikhardo Estrada Rdez, Thierry DEMAN, YOLANDA CUESTA ALTIERI
|
||||||
|
* Japanese: Fujio Kojima, Kazushi KAMEGAWA, Masayoshi Yamada, Masayuki Ozawa , Seiji Momoto, Takashi Kanai, Takayoshi Tanaka, Yoshihisa Ozaki, 庄垣内治
|
||||||
|
* Chinese (simplified): DAN YE, Joel Yang, Lynne Dong, Ryan(Yu) Zhang, Sheng Jiang, Wei Zhang, Zhiliang Xu
|
||||||
|
* Chinese (Traditional): Bruce Chen, Chiayi Yen, Kevin Yang, Winnie Lin, 保哥 Will, 謝政廷
|
||||||
|
* Korean: Do-Kyun Kim, Evelyn Kim, Helen Jung, Hong Jmee, jeongwoo choi, Jun Hyoung Lee, Jungsun Kim정선, Justin Yoo, Kavrith mucha, Kiwoong Youm, MinGyu Ju, MVP_JUNO BEA, Sejun Kim, SOONMAN KWON, sung man ko, Yeongrak Choi, younggun kim, Youngjae Kim, 소영 이
|
||||||
|
* Russian: Andrey Veselov, Anton Fontanov, Anton Savin, Elena Ostrovskaia, Igor Babichev, Maxim Zelensky, Rodion Fedechkin, Tasha T, Vladimir Zyryanov
|
||||||
|
* Portuguese Brazil: Daniel de Sousa, Diogo Duarte, Douglas Correa, Douglas Eccker, José Emanuel Mendes, Marcelo Fernandes, Marcondes Alexandre, Roberto Fonseca, Rodrigo Crespi
|
||||||
|
|
||||||
|
|
||||||
And of course we'd like to thank the authors of all upstream dependencies. Please see a full list in the [ThirdPartyNotices.txt](https://raw.githubusercontent.com/Microsoft/sqlopsstudio/master/ThirdPartyNotices.txt)
|
And of course we'd like to thank the authors of all upstream dependencies. Please see a full list in the [ThirdPartyNotices.txt](https://raw.githubusercontent.com/Microsoft/sqlopsstudio/master/ThirdPartyNotices.txt)
|
||||||
|
|
||||||
|
|||||||
@@ -77,7 +77,8 @@ const vsce = require('vsce');
|
|||||||
const sqlBuiltInExtensions = [
|
const sqlBuiltInExtensions = [
|
||||||
// Add SQL built-in extensions here.
|
// Add SQL built-in extensions here.
|
||||||
// the extension will be excluded from SQLOps package and will have separate vsix packages
|
// the extension will be excluded from SQLOps package and will have separate vsix packages
|
||||||
'agent'
|
'agent',
|
||||||
|
'profiler'
|
||||||
];
|
];
|
||||||
|
|
||||||
const vscodeEntryPoints = _.flatten([
|
const vscodeEntryPoints = _.flatten([
|
||||||
|
|||||||
@@ -37,9 +37,8 @@ exports.defaultLanguages = [
|
|||||||
// languages requested by the community to non-stable builds
|
// languages requested by the community to non-stable builds
|
||||||
exports.extraLanguages = [
|
exports.extraLanguages = [
|
||||||
{ id: 'pt-br', folderName: 'ptb' },
|
{ id: 'pt-br', folderName: 'ptb' },
|
||||||
// {{SQL CARBON EDIT}}
|
{ id: 'hu', folderName: 'hun' },
|
||||||
// { id: 'hu', folderName: 'hun' },
|
{ id: 'tr', folderName: 'trk' }
|
||||||
// { id: 'tr', folderName: 'trk' }
|
|
||||||
];
|
];
|
||||||
// non built-in extensions also that are transifex and need to be part of the language packs
|
// non built-in extensions also that are transifex and need to be part of the language packs
|
||||||
var externalExtensionsWithTranslations = {
|
var externalExtensionsWithTranslations = {
|
||||||
|
|||||||
@@ -35,7 +35,8 @@ const extensions = [
|
|||||||
'merge-conflict',
|
'merge-conflict',
|
||||||
'insights-default',
|
'insights-default',
|
||||||
'account-provider-azure',
|
'account-provider-azure',
|
||||||
'agent'
|
'agent',
|
||||||
|
'profiler'
|
||||||
];
|
];
|
||||||
|
|
||||||
extensions.forEach(extension => yarnInstall(`extensions/${extension}`));
|
extensions.forEach(extension => yarnInstall(`extensions/${extension}`));
|
||||||
|
|||||||
@@ -658,7 +658,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#0.1.5",
|
"dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#0.1.7",
|
||||||
"opener": "^1.4.3",
|
"opener": "^1.4.3",
|
||||||
"service-downloader": "github:anthonydresser/service-downloader#0.1.2",
|
"service-downloader": "github:anthonydresser/service-downloader#0.1.2",
|
||||||
"vscode-extension-telemetry": "^0.0.15"
|
"vscode-extension-telemetry": "^0.0.15"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"downloadUrl": "https://github.com/Microsoft/sqltoolsservice/releases/download/v{#version#}/microsoft.sqltools.servicelayer-{#fileName#}",
|
"downloadUrl": "https://github.com/Microsoft/sqltoolsservice/releases/download/v{#version#}/microsoft.sqltools.servicelayer-{#fileName#}",
|
||||||
"version": "1.4.0-alpha.30",
|
"version": "1.4.0-alpha.35",
|
||||||
"downloadFileNames": {
|
"downloadFileNames": {
|
||||||
"Windows_86": "win-x86-netcoreapp2.1.zip",
|
"Windows_86": "win-x86-netcoreapp2.1.zip",
|
||||||
"Windows_64": "win-x64-netcoreapp2.1.zip",
|
"Windows_64": "win-x64-netcoreapp2.1.zip",
|
||||||
|
|||||||
@@ -49,9 +49,9 @@ core-util-is@~1.0.0:
|
|||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
|
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
|
||||||
|
|
||||||
"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#0.1.5":
|
"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#0.1.7":
|
||||||
version "0.1.5"
|
version "0.1.7"
|
||||||
resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/21b0bacfc759689a6c280408528c6029a21b1abf"
|
resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/d50285b03d0d5073c086362c5c96afb279320607"
|
||||||
dependencies:
|
dependencies:
|
||||||
vscode-languageclient "3.5.0"
|
vscode-languageclient "3.5.0"
|
||||||
|
|
||||||
|
|||||||
2
extensions/profiler/.vscodeignore
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
client/src/**
|
||||||
|
client/tsconfig.json
|
||||||
25
extensions/profiler/README.md
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# SQL Server Profiler for SQL Operations Studio
|
||||||
|
|
||||||
|
Welcome to the SQL Server Profiler for SQL Operations Studio! The SQL Server Profiler extension provides a simple SQL Server tracing solution similar to SSMS Profiler except built using XEvents. SSMS Profiler is very easy to use and has good default values for the most common tracing configurations. The UX is optimized for browsing through events and viewing the associated T-SQL text. The SQL Server Profiler for SQL Operations Studio also assumes good default values for collecting T-SQL execution activities with an easy to use UX.
|
||||||
|
|
||||||
|
Common SQL Profiler use-cases taken from https://docs.microsoft.com/en-us/sql/tools/sql-server-profiler/sql-server-profiler.
|
||||||
|
|
||||||
|
- Stepping through problem queries to find the cause of the problem.
|
||||||
|
- Finding and diagnosing slow-running queries.
|
||||||
|
- Capturing the series of Transact-SQL statements that lead to a problem.
|
||||||
|
- Monitoring the performance of SQL Server to tune workloads.
|
||||||
|
- Correlating performance counters to diagnose problems.
|
||||||
|
|
||||||
|
## Code of Conduct
|
||||||
|
|
||||||
|
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
|
||||||
|
|
||||||
|
## Privacy Statement
|
||||||
|
|
||||||
|
The [Microsoft Enterprise and Developer Privacy Statement](https://privacy.microsoft.com/en-us/privacystatement) describes the privacy statement of this software.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
|
||||||
|
Licensed under the [Source EULA](https://raw.githubusercontent.com/Microsoft/sqlopsstudio/master/LICENSE.txt).
|
||||||
63
extensions/profiler/client/src/apiWrapper.ts
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
import * as vscode from 'vscode';
|
||||||
|
import * as data from 'sqlops';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper class to act as a facade over VSCode and Data APIs and allow us to test / mock callbacks into
|
||||||
|
* this API from our code
|
||||||
|
*
|
||||||
|
* @export
|
||||||
|
* @class ApiWrapper
|
||||||
|
*/
|
||||||
|
export class ApiWrapper {
|
||||||
|
// Data APIs
|
||||||
|
|
||||||
|
public registerWebviewProvider(widgetId: string, handler: (webview: data.DashboardWebview) => void): void {
|
||||||
|
return data.dashboard.registerWebviewProvider(widgetId, handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public registerControlHostProvider(widgetId: string, handler: (webview: data.DashboardWebview) => void): void {
|
||||||
|
return data.dashboard.registerWebviewProvider(widgetId, handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the configuration for a extensionName
|
||||||
|
* @param extensionName The string name of the extension to get the configuration for
|
||||||
|
* @param resource The optional URI, as a URI object or a string, to use to get resource-scoped configurations
|
||||||
|
*/
|
||||||
|
public getConfiguration(extensionName: string, resource?: vscode.Uri | string): vscode.WorkspaceConfiguration {
|
||||||
|
if (typeof resource === 'string') {
|
||||||
|
try {
|
||||||
|
resource = this.parseUri(resource);
|
||||||
|
} catch (e) {
|
||||||
|
resource = undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return vscode.workspace.getConfiguration(extensionName, resource as vscode.Uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse uri
|
||||||
|
*/
|
||||||
|
public parseUri(uri: string): vscode.Uri {
|
||||||
|
return vscode.Uri.parse(uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
public showOpenDialog(options: vscode.OpenDialogOptions): Thenable<vscode.Uri[] | undefined> {
|
||||||
|
return vscode.window.showOpenDialog(options);
|
||||||
|
}
|
||||||
|
|
||||||
|
public showErrorMessage(message: string, ...items: string[]): Thenable<string | undefined> {
|
||||||
|
return vscode.window.showErrorMessage(message, ...items);
|
||||||
|
}
|
||||||
|
|
||||||
|
public get workspaceRootPath(): string {
|
||||||
|
return vscode.workspace.rootPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
23
extensions/profiler/client/src/main.ts
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import vscode = require('vscode');
|
||||||
|
import { MainController } from './mainController';
|
||||||
|
import { ApiWrapper } from './apiWrapper';
|
||||||
|
export let controller: MainController;
|
||||||
|
|
||||||
|
export function activate(context: vscode.ExtensionContext) {
|
||||||
|
let apiWrapper = new ApiWrapper();
|
||||||
|
controller = new MainController(context, apiWrapper);
|
||||||
|
controller.activate();
|
||||||
|
}
|
||||||
|
|
||||||
|
// this method is called when your extension is deactivated
|
||||||
|
export function deactivate(): void {
|
||||||
|
if (controller) {
|
||||||
|
controller.deactivate();
|
||||||
|
}
|
||||||
|
}
|
||||||
32
extensions/profiler/client/src/mainController.ts
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import * as vscode from 'vscode';
|
||||||
|
import * as data from 'sqlops';
|
||||||
|
import { ApiWrapper } from './apiWrapper';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The main controller class that initializes the extension
|
||||||
|
*/
|
||||||
|
export class MainController {
|
||||||
|
protected _apiWrapper: ApiWrapper;
|
||||||
|
protected _context: vscode.ExtensionContext;
|
||||||
|
|
||||||
|
// PUBLIC METHODS //////////////////////////////////////////////////////
|
||||||
|
public constructor(context: vscode.ExtensionContext, apiWrapper?: ApiWrapper) {
|
||||||
|
this._apiWrapper = apiWrapper || new ApiWrapper();
|
||||||
|
this._context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deactivates the extension
|
||||||
|
*/
|
||||||
|
public deactivate(): void {
|
||||||
|
}
|
||||||
|
|
||||||
|
public activate(): void {
|
||||||
|
}
|
||||||
|
}
|
||||||
8
extensions/profiler/client/src/typings/ref.d.ts
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/// <reference path='../../../../../src/vs/vscode.d.ts'/>
|
||||||
|
/// <reference path='../../../../../src/sql/sqlops.d.ts'/>
|
||||||
|
/// <reference types='@types/node'/>
|
||||||
19
extensions/profiler/client/tsconfig.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"compileOnSave": true,
|
||||||
|
"compilerOptions": {
|
||||||
|
"module": "commonjs",
|
||||||
|
"target": "es6",
|
||||||
|
"outDir": "./out",
|
||||||
|
"lib": [
|
||||||
|
"es6", "es2015.promise"
|
||||||
|
],
|
||||||
|
"sourceMap": true,
|
||||||
|
"emitDecoratorMetadata": true,
|
||||||
|
"experimentalDecorators": true,
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"declaration": true
|
||||||
|
},
|
||||||
|
"exclude": [
|
||||||
|
"node_modules"
|
||||||
|
]
|
||||||
|
}
|
||||||
BIN
extensions/profiler/images/sqlserver.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
44
extensions/profiler/package.json
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"name": "profiler",
|
||||||
|
"displayName": "SQL Server Profiler",
|
||||||
|
"description": "SQL Server Profiler for SQL Operations Studio",
|
||||||
|
"version": "0.30.0",
|
||||||
|
"publisher": "Microsoft",
|
||||||
|
"preview": true,
|
||||||
|
"license": "https://raw.githubusercontent.com/Microsoft/sqlopsstudio/master/LICENSE.txt",
|
||||||
|
"icon": "images/sqlserver.png",
|
||||||
|
"aiKey": "AIF-5574968e-856d-40d2-af67-c89a14e76412",
|
||||||
|
"engines": {
|
||||||
|
"vscode": "0.10.x"
|
||||||
|
},
|
||||||
|
"activationEvents": [
|
||||||
|
"*"
|
||||||
|
],
|
||||||
|
"main": "./client/out/main",
|
||||||
|
"scripts": {
|
||||||
|
"compile": "gulp compile-extension:profiler-client"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/Microsoft/sqlopsstudio.git"
|
||||||
|
},
|
||||||
|
"extensionDependencies": [
|
||||||
|
"Microsoft.mssql"
|
||||||
|
],
|
||||||
|
"contributes": {
|
||||||
|
|
||||||
|
"commands": [
|
||||||
|
{
|
||||||
|
"command": "profiler.newProfiler",
|
||||||
|
"title": "New Profiler",
|
||||||
|
"category": "Profiler"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputChannels": [
|
||||||
|
"sqlprofiler"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"vscode": "1.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
2085
extensions/profiler/yarn.lock
Normal file
@@ -73,7 +73,7 @@
|
|||||||
"panel.background": "#FFFFFE",
|
"panel.background": "#FFFFFE",
|
||||||
"panel.border": "#C8C8C8",
|
"panel.border": "#C8C8C8",
|
||||||
"panelTitle.activeForeground": "#212121",
|
"panelTitle.activeForeground": "#212121",
|
||||||
"panelTitle.inactiveForeground": "#888888"
|
"panelTitle.inactiveForeground": "#757575"
|
||||||
},
|
},
|
||||||
"tokenColors": [
|
"tokenColors": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "sqlops",
|
"name": "sqlops",
|
||||||
"version": "0.29.3",
|
"version": "0.30.3",
|
||||||
"distro": "8c3e97e3425cc9814496472ab73e076de2ba99ee",
|
"distro": "8c3e97e3425cc9814496472ab73e076de2ba99ee",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Microsoft Corporation"
|
"name": "Microsoft Corporation"
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
"reflect-metadata": "^0.1.8",
|
"reflect-metadata": "^0.1.8",
|
||||||
"rxjs": "5.4.0",
|
"rxjs": "5.4.0",
|
||||||
"semver": "4.3.6",
|
"semver": "4.3.6",
|
||||||
"slickgrid": "github:anthonydresser/SlickGrid#2.3.16",
|
"slickgrid": "github:anthonydresser/SlickGrid#2.3.17",
|
||||||
"spdlog": "0.6.0",
|
"spdlog": "0.6.0",
|
||||||
"svg.js": "^2.2.5",
|
"svg.js": "^2.2.5",
|
||||||
"sudo-prompt": "^8.0.0",
|
"sudo-prompt": "^8.0.0",
|
||||||
@@ -162,4 +162,4 @@
|
|||||||
"windows-mutex": "^0.2.0",
|
"windows-mutex": "^0.2.0",
|
||||||
"windows-process-tree": "0.1.6"
|
"windows-process-tree": "0.1.6"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,6 +38,9 @@ See [Paul Randal's wait types library] for more information about each wait type
|
|||||||
We would like to thank all our users who raised issues, and in particular the following users who helped contribute fixes:
|
We would like to thank all our users who raised issues, and in particular the following users who helped contribute fixes:
|
||||||
* flyfishingdba for Add square brackets for ms_foreachdb call (#1023)
|
* flyfishingdba for Add square brackets for ms_foreachdb call (#1023)
|
||||||
|
|
||||||
|
## What's new in Server Reports v1.2?
|
||||||
|
* Created left nav bar and added 2 categories for insight widgets: monitor and performance
|
||||||
|
|
||||||
## What's new in Server Reports v1.1?
|
## What's new in Server Reports v1.1?
|
||||||
* Fixed DB Space Usage where it threw an error when database names contain special characters
|
* Fixed DB Space Usage where it threw an error when database names contain special characters
|
||||||
* Changed DB Space Usage and DB Buffer Usage to show only top 10 data
|
* Changed DB Space Usage and DB Buffer Usage to show only top 10 data
|
||||||
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 52 KiB |
2
samples/serverReports/package-lock.json
generated
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "server-report",
|
"name": "server-report",
|
||||||
"version": "0.1.0",
|
"version": "0.1.2",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"name": "server-report",
|
"name": "server-report",
|
||||||
"displayName": "Server Reports",
|
"displayName": "Server Reports",
|
||||||
"description": "Server Reports",
|
"description": "Server Reports",
|
||||||
"version": "0.1.1",
|
"version": "0.1.2",
|
||||||
"publisher": "Microsoft",
|
"publisher": "Microsoft",
|
||||||
"preview": true,
|
"preview": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -30,7 +30,30 @@
|
|||||||
"title": "Server Reports",
|
"title": "Server Reports",
|
||||||
"description": "This extension shows useful reports for a server.",
|
"description": "This extension shows useful reports for a server.",
|
||||||
"container": {
|
"container": {
|
||||||
"server-insights1": null
|
"nav-section": [
|
||||||
|
{
|
||||||
|
"id": "server-reports-monitoring",
|
||||||
|
"title": "Monitor",
|
||||||
|
"icon": {
|
||||||
|
"light": "./out/src/media/monitor.svg",
|
||||||
|
"dark": "./out/src/media/monitor_inverse.svg"
|
||||||
|
},
|
||||||
|
"container": {
|
||||||
|
"server-reports-monitoring-container": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "server-reports-performance",
|
||||||
|
"title": "Performance",
|
||||||
|
"icon": {
|
||||||
|
"light": "./out/src/media/performance.svg",
|
||||||
|
"dark": "./out/src/media/performance_inverse.svg"
|
||||||
|
},
|
||||||
|
"container": {
|
||||||
|
"server-reports-performance-container": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -122,7 +145,7 @@
|
|||||||
],
|
],
|
||||||
"dashboard.containers": [
|
"dashboard.containers": [
|
||||||
{
|
{
|
||||||
"id": "server-insights1",
|
"id": "server-reports-monitoring-container",
|
||||||
"container": {
|
"container": {
|
||||||
"widgets-container": [
|
"widgets-container": [
|
||||||
{
|
{
|
||||||
@@ -164,7 +187,14 @@
|
|||||||
"widget": {
|
"widget": {
|
||||||
"extension-backup-growth-trend": {}
|
"extension-backup-growth-trend": {}
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "server-reports-performance-container",
|
||||||
|
"container": {
|
||||||
|
"widgets-container": [
|
||||||
{
|
{
|
||||||
"name": "Wait Counts by Paul Randal",
|
"name": "Wait Counts by Paul Randal",
|
||||||
"gridItemConfig": {
|
"gridItemConfig": {
|
||||||
|
|||||||
1
samples/serverReports/src/media/monitor.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><title>usage</title><path d="M7,7H0A6.88,6.88,0,0,1,.25,5.14,7,7,0,0,1,5.14.25,6.92,6.92,0,0,1,7,0ZM6.75,8,1.88,12.87a6.91,6.91,0,0,1-1.4-2.26A7.33,7.33,0,0,1,0,8ZM6,1.08a6,6,0,0,0-1.77.6A6,6,0,0,0,1.68,4.23,6,6,0,0,0,1.08,6H6ZM1.08,9a6.63,6.63,0,0,0,.32,1.23A5.58,5.58,0,0,0,2,11.37L4.34,9ZM8,1l.89,0a8.52,8.52,0,0,1,.86.09,8.14,8.14,0,0,1,.84.18,6.66,6.66,0,0,1,.84.29,7.51,7.51,0,0,1,4.25,4.73,7.58,7.58,0,0,1,.06,4.18A7.51,7.51,0,0,1,15,12.29,7.49,7.49,0,0,1,12.29,15a7.5,7.5,0,0,1-1.79.75,7.63,7.63,0,0,1-4.87-.3A7.53,7.53,0,0,1,3.2,13.8l-.35-.35L8,8.29Zm.5,14a6.31,6.31,0,0,0,1.73-.23,6.66,6.66,0,0,0,1.55-.66,6.5,6.5,0,0,0,2.33-2.33,6.64,6.64,0,0,0,.66-1.55,6.47,6.47,0,0,0,0-3.36,6.69,6.69,0,0,0-.59-1.49,6.45,6.45,0,0,0-.93-1.29,6.63,6.63,0,0,0-1.21-1,6.49,6.49,0,0,0-1.44-.71A6.32,6.32,0,0,0,9,2v6.7L4.27,13.44a6.39,6.39,0,0,0,2,1.16A6.47,6.47,0,0,0,8.5,15Z"/></svg>
|
||||||
|
After Width: | Height: | Size: 969 B |
1
samples/serverReports/src/media/monitor_inverse.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.cls-1{fill:#fff;}</style></defs><title>usage_inverse</title><path class="cls-1" d="M7,7H0A6.88,6.88,0,0,1,.25,5.14,7,7,0,0,1,5.14.25,6.92,6.92,0,0,1,7,0ZM6.75,8,1.88,12.87a6.91,6.91,0,0,1-1.4-2.26A7.33,7.33,0,0,1,0,8ZM6,1.08a6,6,0,0,0-1.77.6A6,6,0,0,0,1.68,4.23,6,6,0,0,0,1.08,6H6ZM1.08,9a6.63,6.63,0,0,0,.32,1.23A5.58,5.58,0,0,0,2,11.37L4.34,9ZM8,1l.89,0a8.52,8.52,0,0,1,.86.09,8.14,8.14,0,0,1,.84.18,6.66,6.66,0,0,1,.84.29,7.51,7.51,0,0,1,4.25,4.73,7.58,7.58,0,0,1,.06,4.18A7.51,7.51,0,0,1,15,12.29,7.49,7.49,0,0,1,12.29,15a7.5,7.5,0,0,1-1.79.75,7.63,7.63,0,0,1-4.87-.3A7.53,7.53,0,0,1,3.2,13.8l-.35-.35L8,8.29Zm.5,14a6.31,6.31,0,0,0,1.73-.23,6.66,6.66,0,0,0,1.55-.66,6.5,6.5,0,0,0,2.33-2.33,6.64,6.64,0,0,0,.66-1.55,6.47,6.47,0,0,0,0-3.36,6.69,6.69,0,0,0-.59-1.49,6.45,6.45,0,0,0-.93-1.29,6.63,6.63,0,0,0-1.21-1,6.49,6.49,0,0,0-1.44-.71A6.32,6.32,0,0,0,9,2v6.7L4.27,13.44a6.39,6.39,0,0,0,2,1.16A6.47,6.47,0,0,0,8.5,15Z"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
1
samples/serverReports/src/media/performance.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.cls-1{fill:#101e23;}.cls-2{fill:#4bb8d1;}.cls-3{fill:#0c1011;}</style></defs><title>health</title><path class="cls-1" d="M12.58,1.51A6.36,6.36,0,0,0,8,3.9,6.32,6.32,0,0,0,3.41,1.51,3.81,3.81,0,0,0,0,5.35,5.7,5.7,0,0,0,.64,7.88h.72l0-.08A5.18,5.18,0,0,1,.64,5.39c.07-1.25.87-3.14,2.8-3.23h.12A5.81,5.81,0,0,1,7.73,4.63L8,5.06l.27-.43a5.72,5.72,0,0,1,4.28-2.47c1.93.09,2.73,2,2.8,3.23a5.15,5.15,0,0,1-.64,2.34l0,0a2.38,2.38,0,0,1-.34.68,19.45,19.45,0,0,1-6.57,6.06,11.11,11.11,0,0,1-1.25-.81c-.34-.25-.66-.52-1-.8h0a22.83,22.83,0,0,1-2.76-3H2a18.68,18.68,0,0,0,5.76,5.29h0l0,0h0c3.49-1.63,7-5.73,7.49-7.18V8A5.85,5.85,0,0,0,16,5.35,3.81,3.81,0,0,0,12.58,1.51Z"/><path class="cls-1" d="M1.41,8l-.1-.15h0Z"/><path class="cls-1" d="M7.79,15.22v0h0Z"/><path class="cls-1" d="M7.76,15.23h0v0Z"/><path class="cls-1" d="M14.72,7.73l0,0a.13.13,0,0,0,0,0Z"/><path class="cls-2" d="M12.62,8.7v.12a.48.48,0,0,1-.48.48H8.66l0,.07L7.38,12.65h0A.72.72,0,0,1,6,12.53V9.44H6V6.6L5,9.05H5a.56.56,0,0,1-.52.37H.92V8.36H4.13l0-.07L5.41,5h0a.72.72,0,0,1,1.42.12V8.22h0v2.84L7.77,8.6h0a.56.56,0,0,1,.52-.37h3.84A.48.48,0,0,1,12.62,8.7Z"/><path class="cls-3" d="M12.62,8.7v.12a.48.48,0,0,1-.48.48H8.66l0,.07L7.38,12.65h0A.72.72,0,0,1,6,12.53V9.44H6V6.6L5,9.05H5a.56.56,0,0,1-.52.37H.92V8.36H4.13l0-.07L5.41,5h0a.72.72,0,0,1,1.42.12V8.22h0v2.84L7.77,8.6h0a.56.56,0,0,1,.52-.37h3.84A.48.48,0,0,1,12.62,8.7Z"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
1
samples/serverReports/src/media/performance_inverse.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.cls-1{fill:#fff;}.cls-2{fill:#101e23;}.cls-3{fill:#4bb8d1;}</style></defs><title>health_inverse</title><path class="cls-1" d="M12.58,1.51A6.36,6.36,0,0,0,8,3.9,6.32,6.32,0,0,0,3.41,1.51,3.81,3.81,0,0,0,0,5.35,5.7,5.7,0,0,0,.64,7.88h.72l0-.08A5.18,5.18,0,0,1,.64,5.39c.07-1.25.87-3.14,2.8-3.23h.12A5.81,5.81,0,0,1,7.73,4.63L8,5.06l.27-.43a5.72,5.72,0,0,1,4.28-2.47c1.93.09,2.73,2,2.8,3.23a5.15,5.15,0,0,1-.64,2.34l0,0a2.38,2.38,0,0,1-.34.68,19.45,19.45,0,0,1-6.57,6.06,11.11,11.11,0,0,1-1.25-.81c-.34-.25-.66-.52-1-.8h0a22.83,22.83,0,0,1-2.76-3H2a18.68,18.68,0,0,0,5.76,5.29h0l0,0h0c3.49-1.63,7-5.73,7.49-7.18V8A5.85,5.85,0,0,0,16,5.35,3.81,3.81,0,0,0,12.58,1.51Z"/><path class="cls-2" d="M1.41,8l-.1-.15h0Z"/><path class="cls-2" d="M7.79,15.22v0h0Z"/><path class="cls-2" d="M7.76,15.23h0v0Z"/><path class="cls-2" d="M14.72,7.73l0,0a.13.13,0,0,0,0,0Z"/><path class="cls-3" d="M12.62,8.7v.12a.48.48,0,0,1-.48.48H8.66l0,.07L7.38,12.65h0A.72.72,0,0,1,6,12.53V9.44H6V6.6L5,9.05H5a.56.56,0,0,1-.52.37H.92V8.36H4.13l0-.07L5.41,5h0a.72.72,0,0,1,1.42.12V8.22h0v2.84L7.77,8.6h0a.56.56,0,0,1,.52-.37h3.84A.48.48,0,0,1,12.62,8.7Z"/><path class="cls-1" d="M12.62,8.7v.12a.48.48,0,0,1-.48.48H8.66l0,.07L7.38,12.65h0A.72.72,0,0,1,6,12.53V9.44H6V6.6L5,9.05H5a.56.56,0,0,1-.52.37H.92V8.36H4.13l0-.07L5.41,5h0a.72.72,0,0,1,1.42.12V8.22h0v2.84L7.77,8.6h0a.56.56,0,0,1,.52-.37h3.84A.48.48,0,0,1,12.62,8.7Z"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
489
samples/sqlservices/package-lock.json
generated
@@ -27,6 +27,12 @@
|
|||||||
"through2": "2.0.3"
|
"through2": "2.0.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@types/handlebars": {
|
||||||
|
"version": "4.0.37",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/handlebars/-/handlebars-4.0.37.tgz",
|
||||||
|
"integrity": "sha512-c/g99PQsJEFYdK3LT1qgPAZ61fu/oFOaEhov/6ZuUNMi1xQFbAOSThlX8fAQLf+QoGXtyv4S39OjIRXf3HkBtw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"@types/node": {
|
"@types/node": {
|
||||||
"version": "7.0.58",
|
"version": "7.0.58",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.58.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.58.tgz",
|
||||||
@@ -51,11 +57,30 @@
|
|||||||
"json-schema-traverse": "0.3.1"
|
"json-schema-traverse": "0.3.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"align-text": {
|
||||||
|
"version": "0.1.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
|
||||||
|
"integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
|
||||||
|
"requires": {
|
||||||
|
"kind-of": "3.2.2",
|
||||||
|
"longest": "1.0.1",
|
||||||
|
"repeat-string": "1.6.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"kind-of": {
|
||||||
|
"version": "3.2.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||||
|
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
||||||
|
"requires": {
|
||||||
|
"is-buffer": "1.1.6"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"amdefine": {
|
"amdefine": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
|
||||||
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
|
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"ansi-colors": {
|
"ansi-colors": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
@@ -136,6 +161,15 @@
|
|||||||
"integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
|
"integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"argparse": {
|
||||||
|
"version": "1.0.10",
|
||||||
|
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
|
||||||
|
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"sprintf-js": "1.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
"arr-diff": {
|
"arr-diff": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
|
||||||
@@ -289,6 +323,11 @@
|
|||||||
"integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
|
"integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"async": {
|
||||||
|
"version": "1.5.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
|
||||||
|
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
|
||||||
|
},
|
||||||
"async-done": {
|
"async-done": {
|
||||||
"version": "1.2.4",
|
"version": "1.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/async-done/-/async-done-1.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/async-done/-/async-done-1.2.4.tgz",
|
||||||
@@ -420,6 +459,12 @@
|
|||||||
"inherits": "2.0.3"
|
"inherits": "2.0.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"boolbase": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"boom": {
|
"boom": {
|
||||||
"version": "2.10.1",
|
"version": "2.10.1",
|
||||||
"resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
|
"resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
|
||||||
@@ -538,6 +583,16 @@
|
|||||||
"integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
|
"integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"center-align": {
|
||||||
|
"version": "0.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
|
||||||
|
"integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"align-text": "0.1.4",
|
||||||
|
"lazy-cache": "1.0.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"chalk": {
|
"chalk": {
|
||||||
"version": "1.1.3",
|
"version": "1.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
|
||||||
@@ -551,6 +606,20 @@
|
|||||||
"supports-color": "2.0.0"
|
"supports-color": "2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"cheerio": {
|
||||||
|
"version": "1.0.0-rc.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz",
|
||||||
|
"integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"css-select": "1.2.0",
|
||||||
|
"dom-serializer": "0.1.0",
|
||||||
|
"entities": "1.1.1",
|
||||||
|
"htmlparser2": "3.9.2",
|
||||||
|
"lodash": "4.17.10",
|
||||||
|
"parse5": "3.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
"child-process-promise": {
|
"child-process-promise": {
|
||||||
"version": "2.2.1",
|
"version": "2.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/child-process-promise/-/child-process-promise-2.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/child-process-promise/-/child-process-promise-2.2.1.tgz",
|
||||||
@@ -888,6 +957,24 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"css-select": {
|
||||||
|
"version": "1.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
|
||||||
|
"integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"boolbase": "1.0.0",
|
||||||
|
"css-what": "2.1.0",
|
||||||
|
"domutils": "1.5.1",
|
||||||
|
"nth-check": "1.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"css-what": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
|
||||||
|
"integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"d": {
|
"d": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
|
||||||
@@ -954,8 +1041,7 @@
|
|||||||
"decamelize": {
|
"decamelize": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
|
||||||
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
|
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"decode-uri-component": {
|
"decode-uri-component": {
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
@@ -1043,6 +1129,12 @@
|
|||||||
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
|
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"denodeify": {
|
||||||
|
"version": "1.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz",
|
||||||
|
"integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"detect-file": {
|
"detect-file": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
|
||||||
@@ -1061,6 +1153,49 @@
|
|||||||
"integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==",
|
"integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"dom-serializer": {
|
||||||
|
"version": "0.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
|
||||||
|
"integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"domelementtype": "1.1.3",
|
||||||
|
"entities": "1.1.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"domelementtype": {
|
||||||
|
"version": "1.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
|
||||||
|
"integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"domelementtype": {
|
||||||
|
"version": "1.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
|
||||||
|
"integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"domhandler": {
|
||||||
|
"version": "2.4.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
|
||||||
|
"integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"domelementtype": "1.3.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"domutils": {
|
||||||
|
"version": "1.5.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
|
||||||
|
"integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"dom-serializer": "0.1.0",
|
||||||
|
"domelementtype": "1.3.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"duplexer": {
|
"duplexer": {
|
||||||
"version": "0.1.1",
|
"version": "0.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
|
||||||
@@ -1143,6 +1278,12 @@
|
|||||||
"once": "1.4.0"
|
"once": "1.4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"entities": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
|
||||||
|
"integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"error-ex": {
|
"error-ex": {
|
||||||
"version": "1.3.1",
|
"version": "1.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
|
||||||
@@ -1630,6 +1771,16 @@
|
|||||||
"integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=",
|
"integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"fs-extra": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
|
||||||
|
"requires": {
|
||||||
|
"graceful-fs": "4.1.11",
|
||||||
|
"jsonfile": "4.0.0",
|
||||||
|
"universalify": "0.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"fs-mkdirp-stream": {
|
"fs-mkdirp-stream": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz",
|
||||||
@@ -2762,8 +2913,7 @@
|
|||||||
"graceful-fs": {
|
"graceful-fs": {
|
||||||
"version": "4.1.11",
|
"version": "4.1.11",
|
||||||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
|
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
|
||||||
"integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
|
"integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"growl": {
|
"growl": {
|
||||||
"version": "1.10.3",
|
"version": "1.10.3",
|
||||||
@@ -3928,6 +4078,27 @@
|
|||||||
"glogg": "1.0.1"
|
"glogg": "1.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"handlebars": {
|
||||||
|
"version": "4.0.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
|
||||||
|
"integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
|
||||||
|
"requires": {
|
||||||
|
"async": "1.5.2",
|
||||||
|
"optimist": "0.6.1",
|
||||||
|
"source-map": "0.4.4",
|
||||||
|
"uglify-js": "2.8.29"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"source-map": {
|
||||||
|
"version": "0.4.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
|
||||||
|
"integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
|
||||||
|
"requires": {
|
||||||
|
"amdefine": "1.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"har-schema": {
|
"har-schema": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
|
||||||
@@ -4047,6 +4218,20 @@
|
|||||||
"integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==",
|
"integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"htmlparser2": {
|
||||||
|
"version": "3.9.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz",
|
||||||
|
"integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"domelementtype": "1.3.0",
|
||||||
|
"domhandler": "2.4.2",
|
||||||
|
"domutils": "1.5.1",
|
||||||
|
"entities": "1.1.1",
|
||||||
|
"inherits": "2.0.3",
|
||||||
|
"readable-stream": "2.3.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
"http-signature": {
|
"http-signature": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
|
||||||
@@ -4135,8 +4320,7 @@
|
|||||||
"is-buffer": {
|
"is-buffer": {
|
||||||
"version": "1.1.6",
|
"version": "1.1.6",
|
||||||
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
|
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
|
||||||
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
|
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"is-builtin-module": {
|
"is-builtin-module": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
@@ -4443,6 +4627,14 @@
|
|||||||
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
|
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"jsonfile": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
|
||||||
|
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
|
||||||
|
"requires": {
|
||||||
|
"graceful-fs": "4.1.11"
|
||||||
|
}
|
||||||
|
},
|
||||||
"jsonify": {
|
"jsonify": {
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
|
||||||
@@ -4497,6 +4689,12 @@
|
|||||||
"es6-weak-map": "2.0.2"
|
"es6-weak-map": "2.0.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"lazy-cache": {
|
||||||
|
"version": "1.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
|
||||||
|
"integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
"lazystream": {
|
"lazystream": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
|
||||||
@@ -4540,6 +4738,15 @@
|
|||||||
"resolve": "1.6.0"
|
"resolve": "1.6.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"linkify-it": {
|
||||||
|
"version": "2.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.3.tgz",
|
||||||
|
"integrity": "sha1-2UpGSPmxwXnWT6lykSaL22zpQ08=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"uc.micro": "1.0.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
"load-json-file": {
|
"load-json-file": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
|
||||||
@@ -4553,6 +4760,12 @@
|
|||||||
"strip-bom": "2.0.0"
|
"strip-bom": "2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"lodash": {
|
||||||
|
"version": "4.17.10",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
|
||||||
|
"integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"lodash._basecopy": {
|
"lodash._basecopy": {
|
||||||
"version": "3.0.1",
|
"version": "3.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
|
||||||
@@ -4678,6 +4891,11 @@
|
|||||||
"lodash.escape": "3.2.0"
|
"lodash.escape": "3.2.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"longest": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
|
||||||
|
"integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
|
||||||
|
},
|
||||||
"lru-cache": {
|
"lru-cache": {
|
||||||
"version": "4.1.2",
|
"version": "4.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz",
|
||||||
@@ -4738,6 +4956,19 @@
|
|||||||
"object-visit": "1.0.1"
|
"object-visit": "1.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"markdown-it": {
|
||||||
|
"version": "8.4.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.1.tgz",
|
||||||
|
"integrity": "sha512-CzzqSSNkFRUf9vlWvhK1awpJreMRqdCrBvZ8DIoDWTOkESMIF741UPAhuAmbyWmdiFPA6WARNhnu2M6Nrhwa+A==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"argparse": "1.0.10",
|
||||||
|
"entities": "1.1.1",
|
||||||
|
"linkify-it": "2.0.3",
|
||||||
|
"mdurl": "1.0.1",
|
||||||
|
"uc.micro": "1.0.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
"matchdep": {
|
"matchdep": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz",
|
||||||
@@ -4750,6 +4981,12 @@
|
|||||||
"stack-trace": "0.0.10"
|
"stack-trace": "0.0.10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"mdurl": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
|
||||||
|
"integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"memoizee": {
|
"memoizee": {
|
||||||
"version": "0.4.12",
|
"version": "0.4.12",
|
||||||
"resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.12.tgz",
|
"resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.12.tgz",
|
||||||
@@ -4796,6 +5033,12 @@
|
|||||||
"to-regex": "3.0.2"
|
"to-regex": "3.0.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"mime": {
|
||||||
|
"version": "1.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
|
||||||
|
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"mime-db": {
|
"mime-db": {
|
||||||
"version": "1.33.0",
|
"version": "1.33.0",
|
||||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
|
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
|
||||||
@@ -4941,6 +5184,12 @@
|
|||||||
"integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0=",
|
"integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"mute-stream": {
|
||||||
|
"version": "0.0.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
|
||||||
|
"integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"nan": {
|
"nan": {
|
||||||
"version": "2.10.0",
|
"version": "2.10.0",
|
||||||
"resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
|
"resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
|
||||||
@@ -5019,6 +5268,15 @@
|
|||||||
"once": "1.4.0"
|
"once": "1.4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"nth-check": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz",
|
||||||
|
"integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"boolbase": "1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"number-is-nan": {
|
"number-is-nan": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
|
||||||
@@ -5207,7 +5465,6 @@
|
|||||||
"version": "0.6.1",
|
"version": "0.6.1",
|
||||||
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
|
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
|
||||||
"integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
|
"integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"minimist": "0.0.10",
|
"minimist": "0.0.10",
|
||||||
"wordwrap": "0.0.3"
|
"wordwrap": "0.0.3"
|
||||||
@@ -5216,8 +5473,7 @@
|
|||||||
"minimist": {
|
"minimist": {
|
||||||
"version": "0.0.10",
|
"version": "0.0.10",
|
||||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
|
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
|
||||||
"integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
|
"integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
|
||||||
"dev": true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -5230,6 +5486,12 @@
|
|||||||
"readable-stream": "2.3.5"
|
"readable-stream": "2.3.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"os-homedir": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
|
||||||
|
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"os-locale": {
|
"os-locale": {
|
||||||
"version": "1.4.0",
|
"version": "1.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
|
||||||
@@ -5239,6 +5501,22 @@
|
|||||||
"lcid": "1.0.0"
|
"lcid": "1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"os-tmpdir": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
|
||||||
|
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"osenv": {
|
||||||
|
"version": "0.1.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
|
||||||
|
"integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"os-homedir": "1.0.2",
|
||||||
|
"os-tmpdir": "1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"p-map": {
|
"p-map": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
|
||||||
@@ -5300,6 +5578,24 @@
|
|||||||
"integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
|
"integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"parse-semver": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz",
|
||||||
|
"integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"semver": "5.5.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"parse5": {
|
||||||
|
"version": "3.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz",
|
||||||
|
"integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@types/node": "7.0.58"
|
||||||
|
}
|
||||||
|
},
|
||||||
"pascalcase": {
|
"pascalcase": {
|
||||||
"version": "0.1.1",
|
"version": "0.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
|
||||||
@@ -5564,6 +5860,15 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"read": {
|
||||||
|
"version": "1.0.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
|
||||||
|
"integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"mute-stream": "0.0.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
"read-pkg": {
|
"read-pkg": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
|
||||||
@@ -5684,8 +5989,7 @@
|
|||||||
"repeat-string": {
|
"repeat-string": {
|
||||||
"version": "1.6.1",
|
"version": "1.6.1",
|
||||||
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
|
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
|
||||||
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
|
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"replace-ext": {
|
"replace-ext": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
@@ -5915,6 +6219,15 @@
|
|||||||
"integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
|
"integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"right-align": {
|
||||||
|
"version": "0.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
|
||||||
|
"integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"align-text": "0.1.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"rimraf": {
|
"rimraf": {
|
||||||
"version": "2.6.2",
|
"version": "2.6.2",
|
||||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
|
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
|
||||||
@@ -6136,8 +6449,7 @@
|
|||||||
"source-map": {
|
"source-map": {
|
||||||
"version": "0.5.7",
|
"version": "0.5.7",
|
||||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
|
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
|
||||||
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
|
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"source-map-resolve": {
|
"source-map-resolve": {
|
||||||
"version": "0.5.1",
|
"version": "0.5.1",
|
||||||
@@ -6536,6 +6848,15 @@
|
|||||||
"next-tick": "1.0.0"
|
"next-tick": "1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"tmp": {
|
||||||
|
"version": "0.0.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz",
|
||||||
|
"integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"os-tmpdir": "1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"to-absolute-glob": {
|
"to-absolute-glob": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
|
||||||
@@ -6653,6 +6974,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"tunnel": {
|
||||||
|
"version": "0.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz",
|
||||||
|
"integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"tunnel-agent": {
|
"tunnel-agent": {
|
||||||
"version": "0.4.3",
|
"version": "0.4.3",
|
||||||
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
|
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
|
||||||
@@ -6666,6 +6993,16 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"optional": true
|
"optional": true
|
||||||
},
|
},
|
||||||
|
"typed-rest-client": {
|
||||||
|
"version": "0.12.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-0.12.0.tgz",
|
||||||
|
"integrity": "sha1-Y3b1Un9CfaEh3K/f1+QeEyHgcgw=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"tunnel": "0.0.4",
|
||||||
|
"underscore": "1.8.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
"typedarray": {
|
"typedarray": {
|
||||||
"version": "0.0.6",
|
"version": "0.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
|
||||||
@@ -6678,12 +7015,78 @@
|
|||||||
"integrity": "sha512-Ao/f6d/4EPLq0YwzsQz8iXflezpTkQzqAyenTiw4kCUGr1uPiFLC3+fZ+gMZz6eeI/qdRUqvC+HxIJzUAzEFdg==",
|
"integrity": "sha512-Ao/f6d/4EPLq0YwzsQz8iXflezpTkQzqAyenTiw4kCUGr1uPiFLC3+fZ+gMZz6eeI/qdRUqvC+HxIJzUAzEFdg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"uc.micro": {
|
||||||
|
"version": "1.0.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.5.tgz",
|
||||||
|
"integrity": "sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"uglify-js": {
|
||||||
|
"version": "2.8.29",
|
||||||
|
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
|
||||||
|
"integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"source-map": "0.5.7",
|
||||||
|
"uglify-to-browserify": "1.0.2",
|
||||||
|
"yargs": "3.10.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"camelcase": {
|
||||||
|
"version": "1.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
|
||||||
|
"integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"cliui": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
|
||||||
|
"integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"center-align": "0.1.3",
|
||||||
|
"right-align": "0.1.3",
|
||||||
|
"wordwrap": "0.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"wordwrap": {
|
||||||
|
"version": "0.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
|
||||||
|
"integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"yargs": {
|
||||||
|
"version": "3.10.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
|
||||||
|
"integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"camelcase": "1.2.1",
|
||||||
|
"cliui": "2.1.0",
|
||||||
|
"decamelize": "1.2.0",
|
||||||
|
"window-size": "0.1.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uglify-to-browserify": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
|
||||||
|
"integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
"unc-path-regex": {
|
"unc-path-regex": {
|
||||||
"version": "0.1.2",
|
"version": "0.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
|
||||||
"integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
|
"integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"underscore": {
|
||||||
|
"version": "1.8.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
|
||||||
|
"integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"underscore.string": {
|
"underscore.string": {
|
||||||
"version": "3.3.4",
|
"version": "3.3.4",
|
||||||
"resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz",
|
"resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz",
|
||||||
@@ -6762,6 +7165,11 @@
|
|||||||
"through2-filter": "2.0.0"
|
"through2-filter": "2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"universalify": {
|
||||||
|
"version": "0.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
|
||||||
|
"integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc="
|
||||||
|
},
|
||||||
"unset-value": {
|
"unset-value": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
|
||||||
@@ -6814,6 +7222,12 @@
|
|||||||
"integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
|
"integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"url-join": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz",
|
||||||
|
"integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"url-parse": {
|
"url-parse": {
|
||||||
"version": "1.3.0",
|
"version": "1.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.3.0.tgz",
|
||||||
@@ -6983,6 +7397,31 @@
|
|||||||
"vinyl": "2.1.0"
|
"vinyl": "2.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"vsce": {
|
||||||
|
"version": "1.36.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/vsce/-/vsce-1.36.2.tgz",
|
||||||
|
"integrity": "sha512-LiQjHdoaXOHKdk/PRN5OWWeEm/4w7tnFLf8EM+pzvlz/8uk7uJiqtMjVYAYawnU7c8KbMSz9nE9M6nCTV4ZSQA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"cheerio": "1.0.0-rc.2",
|
||||||
|
"commander": "2.15.1",
|
||||||
|
"denodeify": "1.2.1",
|
||||||
|
"glob": "7.1.2",
|
||||||
|
"lodash": "4.17.10",
|
||||||
|
"markdown-it": "8.4.1",
|
||||||
|
"mime": "1.6.0",
|
||||||
|
"minimatch": "3.0.4",
|
||||||
|
"osenv": "0.1.5",
|
||||||
|
"parse-semver": "1.1.1",
|
||||||
|
"read": "1.0.7",
|
||||||
|
"semver": "5.5.0",
|
||||||
|
"tmp": "0.0.29",
|
||||||
|
"url-join": "1.1.0",
|
||||||
|
"vso-node-api": "6.5.0",
|
||||||
|
"yauzl": "2.9.1",
|
||||||
|
"yazl": "2.4.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
"vscode": {
|
"vscode": {
|
||||||
"version": "1.1.14",
|
"version": "1.1.14",
|
||||||
"resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.14.tgz",
|
"resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.14.tgz",
|
||||||
@@ -7010,6 +7449,17 @@
|
|||||||
"resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-3.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-3.2.2.tgz",
|
||||||
"integrity": "sha512-/Ur1+tgazwd51+ncRyoy0UIu4dvMdVXS9XMUULQlZIBoNGEwOhwEx9x+hHWoUjldMrOQ32t2CGKo0u6D4R6/hg=="
|
"integrity": "sha512-/Ur1+tgazwd51+ncRyoy0UIu4dvMdVXS9XMUULQlZIBoNGEwOhwEx9x+hHWoUjldMrOQ32t2CGKo0u6D4R6/hg=="
|
||||||
},
|
},
|
||||||
|
"vso-node-api": {
|
||||||
|
"version": "6.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/vso-node-api/-/vso-node-api-6.5.0.tgz",
|
||||||
|
"integrity": "sha512-hFjPLMJkq02zF8U+LhZ4airH0ivaiKzGdlNAQlYFB3lWuGH/UANUrl63DVPUQOyGw+7ZNQ+ufM44T6mWN92xyg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"tunnel": "0.0.4",
|
||||||
|
"typed-rest-client": "0.12.0",
|
||||||
|
"underscore": "1.8.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
"which": {
|
"which": {
|
||||||
"version": "1.3.0",
|
"version": "1.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
|
||||||
@@ -7025,11 +7475,16 @@
|
|||||||
"integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
|
"integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"window-size": {
|
||||||
|
"version": "0.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
|
||||||
|
"integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
"wordwrap": {
|
"wordwrap": {
|
||||||
"version": "0.0.3",
|
"version": "0.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
|
||||||
"integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
|
"integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"wrap-ansi": {
|
"wrap-ansi": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
|
|||||||
@@ -16,6 +16,24 @@
|
|||||||
],
|
],
|
||||||
"main": "./out/src/extension",
|
"main": "./out/src/extension",
|
||||||
"contributes": {
|
"contributes": {
|
||||||
|
"commands": [
|
||||||
|
{
|
||||||
|
"command": "sqlservices.openDialog",
|
||||||
|
"title": "openDialog"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": "sqlservices.openEditor",
|
||||||
|
"title": "sqlservices.openEditor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": "sqlservices.openEditorWithWebView",
|
||||||
|
"title": "sqlservices.openEditorWithWebView"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": "sqlservices.openEditorWithWebView2",
|
||||||
|
"title": "sqlservices.openEditorWithWebView2"
|
||||||
|
}
|
||||||
|
],
|
||||||
"dashboard.tabs": [
|
"dashboard.tabs": [
|
||||||
{
|
{
|
||||||
"id": "sqlservices.tab",
|
"id": "sqlservices.tab",
|
||||||
@@ -62,7 +80,9 @@
|
|||||||
"postinstall": "node ./node_modules/vscode/bin/install && node ./node_modules/sqlops/bin/install && gulp copytypings"
|
"postinstall": "node ./node_modules/vscode/bin/install && node ./node_modules/sqlops/bin/install && gulp copytypings"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"vscode-nls": "^3.2.2"
|
"vscode-nls": "^3.2.2",
|
||||||
|
"fs-extra": "^5.0.0",
|
||||||
|
"handlebars": "^4.0.11"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^7.0.43",
|
"@types/node": "^7.0.43",
|
||||||
@@ -76,6 +96,8 @@
|
|||||||
"sqlops": "github:anthonydresser/sqlops-extension-sqlops",
|
"sqlops": "github:anthonydresser/sqlops-extension-sqlops",
|
||||||
"tslint": "^3.14.0",
|
"tslint": "^3.14.0",
|
||||||
"typescript": "^2.6.1",
|
"typescript": "^2.6.1",
|
||||||
"vscode": "^1.1.14"
|
"vscode": "^1.1.14",
|
||||||
|
"@types/handlebars": "^4.0.11",
|
||||||
|
"vsce": "1.36.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
18
samples/sqlservices/src/controllers/button.html
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<!--
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
-->
|
||||||
|
<html>
|
||||||
|
<header>
|
||||||
|
</header>
|
||||||
|
<body>
|
||||||
|
<button onclick="count()">Count</button>
|
||||||
|
<script>
|
||||||
|
function count() {
|
||||||
|
parent.postMessage('count', '*');
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
21
samples/sqlservices/src/controllers/counter.html
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<!--
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
-->
|
||||||
|
<html>
|
||||||
|
<header>
|
||||||
|
|
||||||
|
</header>
|
||||||
|
<body>
|
||||||
|
<div id="output">Total Counts: 0</div>
|
||||||
|
<script>
|
||||||
|
let output = document.getElementById('output');
|
||||||
|
window.addEventListener("message", receiveMessage, false);
|
||||||
|
function receiveMessage(e) {
|
||||||
|
output.innerText = 'Total Counts: ' + e.data;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -9,6 +9,8 @@ import * as sqlops from 'sqlops';
|
|||||||
import * as Utils from '../utils';
|
import * as Utils from '../utils';
|
||||||
import * as vscode from 'vscode';
|
import * as vscode from 'vscode';
|
||||||
import SplitPropertiesPanel from './splitPropertiesPanel';
|
import SplitPropertiesPanel from './splitPropertiesPanel';
|
||||||
|
import * as fs from 'fs';
|
||||||
|
import * as path from 'path';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The main controller class that initializes the extension
|
* The main controller class that initializes the extension
|
||||||
@@ -33,6 +35,8 @@ export default class MainController implements vscode.Disposable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public activate(): Promise<boolean> {
|
public activate(): Promise<boolean> {
|
||||||
|
const buttonHtml = fs.readFileSync(path.join(__dirname, 'button.html')).toString();
|
||||||
|
const counterHtml = fs.readFileSync(path.join(__dirname, 'counter.html')).toString();
|
||||||
this.registerSqlServicesModelView();
|
this.registerSqlServicesModelView();
|
||||||
this.registerSplitPanelModelView();
|
this.registerSplitPanelModelView();
|
||||||
|
|
||||||
@@ -40,11 +44,247 @@ export default class MainController implements vscode.Disposable {
|
|||||||
vscode.window.showInformationMessage(`Clicked from profile ${profile.serverName}.${profile.databaseName}`);
|
vscode.window.showInformationMessage(`Clicked from profile ${profile.serverName}.${profile.databaseName}`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
vscode.commands.registerCommand('sqlservices.openDialog', () => {
|
||||||
|
this.openDialog();
|
||||||
|
});
|
||||||
|
|
||||||
|
vscode.commands.registerCommand('sqlservices.openEditor', () => {
|
||||||
|
this.openEditor();
|
||||||
|
});
|
||||||
|
|
||||||
|
vscode.commands.registerCommand('sqlservices.openEditorWithWebView', () => {
|
||||||
|
this.openEditorWithWebview(buttonHtml, counterHtml);
|
||||||
|
});
|
||||||
|
|
||||||
|
vscode.commands.registerCommand('sqlservices.openEditorWithWebView2', () => {
|
||||||
|
this.openEditorWithWebview2();
|
||||||
|
});
|
||||||
|
|
||||||
return Promise.resolve(true);
|
return Promise.resolve(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private openDialog(): void {
|
||||||
|
let dialog = sqlops.window.modelviewdialog.createDialog('Test dialog');
|
||||||
|
let tab1 = sqlops.window.modelviewdialog.createTab('Test tab 1');
|
||||||
|
|
||||||
|
let tab2 = sqlops.window.modelviewdialog.createTab('Test tab 2');
|
||||||
|
tab2.content = 'sqlservices';
|
||||||
|
dialog.content = [tab1, tab2];
|
||||||
|
dialog.okButton.onClick(() => console.log('ok clicked!'));
|
||||||
|
dialog.cancelButton.onClick(() => console.log('cancel clicked!'));
|
||||||
|
dialog.okButton.label = 'ok';
|
||||||
|
dialog.cancelButton.label = 'no';
|
||||||
|
let customButton1 = sqlops.window.modelviewdialog.createButton('Test button 1');
|
||||||
|
customButton1.onClick(() => console.log('button 1 clicked!'));
|
||||||
|
let customButton2 = sqlops.window.modelviewdialog.createButton('Test button 2');
|
||||||
|
customButton2.onClick(() => console.log('button 2 clicked!'));
|
||||||
|
dialog.customButtons = [customButton1, customButton2];
|
||||||
|
tab1.registerContent(async (view) => {
|
||||||
|
let inputBox = view.modelBuilder.inputBox()
|
||||||
|
.withProperties({
|
||||||
|
//width: 300
|
||||||
|
}).component();
|
||||||
|
let inputBox2 = view.modelBuilder.inputBox().component();
|
||||||
|
|
||||||
|
let checkbox = view.modelBuilder.checkBox()
|
||||||
|
.withProperties({
|
||||||
|
label: 'Copy-only backup'
|
||||||
|
})
|
||||||
|
.component();
|
||||||
|
checkbox.onChanged(e => {
|
||||||
|
console.info("inputBox.enabled " + inputBox.enabled);
|
||||||
|
inputBox.enabled = !inputBox.enabled;
|
||||||
|
});
|
||||||
|
let button = view.modelBuilder.button()
|
||||||
|
.withProperties({
|
||||||
|
label: '+'
|
||||||
|
}).component();
|
||||||
|
let button3 = view.modelBuilder.button()
|
||||||
|
.withProperties({
|
||||||
|
label: '-'
|
||||||
|
|
||||||
|
}).component();
|
||||||
|
let button2 = view.modelBuilder.button()
|
||||||
|
.component();
|
||||||
|
button.onDidClick(e => {
|
||||||
|
inputBox2.value = 'Button clicked';
|
||||||
|
});
|
||||||
|
let dropdown = view.modelBuilder.dropDown()
|
||||||
|
.withProperties({
|
||||||
|
value: 'Full',
|
||||||
|
values: ['Full', 'Differential', 'Transaction Log']
|
||||||
|
})
|
||||||
|
.component();
|
||||||
|
let f = 0;
|
||||||
|
inputBox.onTextChanged((params) => {
|
||||||
|
vscode.window.showInformationMessage(inputBox.value);
|
||||||
|
f = f + 1;
|
||||||
|
inputBox2.value = f.toString();
|
||||||
|
});
|
||||||
|
dropdown.onValueChanged((params) => {
|
||||||
|
vscode.window.showInformationMessage(inputBox2.value);
|
||||||
|
inputBox.value = dropdown.value;
|
||||||
|
});
|
||||||
|
let radioButton = view.modelBuilder.radioButton()
|
||||||
|
.withProperties({
|
||||||
|
value: 'option1',
|
||||||
|
name: 'radioButtonOptions',
|
||||||
|
label: 'Option 1',
|
||||||
|
checked: true
|
||||||
|
//width: 300
|
||||||
|
}).component();
|
||||||
|
let radioButton2 = view.modelBuilder.radioButton()
|
||||||
|
.withProperties({
|
||||||
|
value: 'option2',
|
||||||
|
name: 'radioButtonOptions',
|
||||||
|
label: 'Option 2'
|
||||||
|
}).component();
|
||||||
|
let inputBox3 = view.modelBuilder.inputBox().component();
|
||||||
|
let inputBox4 = view.modelBuilder.inputBox().component();
|
||||||
|
let form2Model = view.modelBuilder.formContainer()
|
||||||
|
.withFormItems([{
|
||||||
|
component: inputBox3,
|
||||||
|
title: 'inputBox3'
|
||||||
|
}, {
|
||||||
|
component: inputBox4,
|
||||||
|
title: 'inputBox4'
|
||||||
|
}], {
|
||||||
|
horizontal: true
|
||||||
|
}).component();
|
||||||
|
let groupModel1 = view.modelBuilder.groupContainer()
|
||||||
|
.withLayout({
|
||||||
|
}).withItems([
|
||||||
|
form2Model
|
||||||
|
]).component();
|
||||||
|
radioButton.onDidClick(() => {
|
||||||
|
inputBox.value = radioButton.value;
|
||||||
|
groupModel1.enabled = true;
|
||||||
|
});
|
||||||
|
radioButton2.onDidClick(() => {
|
||||||
|
inputBox.value = radioButton.value;
|
||||||
|
groupModel1.enabled = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
let flexRadioButtonsModel = view.modelBuilder.flexContainer()
|
||||||
|
.withLayout({
|
||||||
|
flexFlow: 'column',
|
||||||
|
alignItems: 'left',
|
||||||
|
height: 50
|
||||||
|
}).withItems([
|
||||||
|
radioButton, groupModel1, radioButton2]
|
||||||
|
, { flex: '1 1 50%' }).component();
|
||||||
|
let formModel = view.modelBuilder.formContainer()
|
||||||
|
.withFormItems([{
|
||||||
|
component: inputBox,
|
||||||
|
title: 'Backup name'
|
||||||
|
}, {
|
||||||
|
component: inputBox2,
|
||||||
|
title: 'Recovery model'
|
||||||
|
}, {
|
||||||
|
component: dropdown,
|
||||||
|
title: 'Backup type'
|
||||||
|
}, {
|
||||||
|
component: checkbox,
|
||||||
|
title: ''
|
||||||
|
}, {
|
||||||
|
component: inputBox2,
|
||||||
|
title: 'Backup files',
|
||||||
|
actions: [button, button3]
|
||||||
|
}, {
|
||||||
|
component: flexRadioButtonsModel,
|
||||||
|
title: 'Options'
|
||||||
|
}], {
|
||||||
|
horizontal: false,
|
||||||
|
componentWidth: 400
|
||||||
|
}).component();
|
||||||
|
await view.initializeModel(formModel);
|
||||||
|
});
|
||||||
|
|
||||||
|
sqlops.window.modelviewdialog.openDialog(dialog);
|
||||||
|
}
|
||||||
|
|
||||||
|
private openEditor(): void {
|
||||||
|
let editor = sqlops.workspace.createModelViewEditor('Test Model View');
|
||||||
|
editor.registerContent(async view => {
|
||||||
|
let inputBox = view.modelBuilder.inputBox()
|
||||||
|
.withValidation(component => component.value !== 'valid')
|
||||||
|
.component();
|
||||||
|
let formModel = view.modelBuilder.formContainer()
|
||||||
|
.withFormItems([{
|
||||||
|
component: inputBox,
|
||||||
|
title: 'Enter anything but "valid"'
|
||||||
|
}]).component();
|
||||||
|
view.onClosed((params) => {
|
||||||
|
vscode.window.showInformationMessage('The model view editor is closed.');
|
||||||
|
});
|
||||||
|
await view.initializeModel(formModel);
|
||||||
|
});
|
||||||
|
editor.openEditor();
|
||||||
|
}
|
||||||
|
|
||||||
|
private openEditorWithWebview(html1: string, html2: string): void {
|
||||||
|
let editor = sqlops.workspace.createModelViewEditor('Editor webview', { retainContextWhenHidden: true });
|
||||||
|
editor.registerContent(async view => {
|
||||||
|
let count = 0;
|
||||||
|
let webview1 = view.modelBuilder.webView()
|
||||||
|
.withProperties({
|
||||||
|
html: html1
|
||||||
|
})
|
||||||
|
.component();
|
||||||
|
let webview2 = view.modelBuilder.webView()
|
||||||
|
.withProperties({
|
||||||
|
html: html2
|
||||||
|
})
|
||||||
|
.component();
|
||||||
|
webview1.onMessage((params) => {
|
||||||
|
count++;
|
||||||
|
webview2.message = count;
|
||||||
|
});
|
||||||
|
|
||||||
|
let flexModel = view.modelBuilder.flexContainer()
|
||||||
|
.withLayout({
|
||||||
|
flexFlow: 'column',
|
||||||
|
alignItems: 'flex-start',
|
||||||
|
height: 500
|
||||||
|
}).withItems([
|
||||||
|
webview1, webview2
|
||||||
|
], { flex: '1 1 50%' })
|
||||||
|
.component();
|
||||||
|
await view.initializeModel(flexModel);
|
||||||
|
});
|
||||||
|
editor.openEditor();
|
||||||
|
}
|
||||||
|
|
||||||
|
private openEditorWithWebview2(): void {
|
||||||
|
let editor = sqlops.workspace.createModelViewEditor('Editor webview2', { retainContextWhenHidden: true });
|
||||||
|
editor.registerContent(async view => {
|
||||||
|
|
||||||
|
let webview = view.modelBuilder.webView()
|
||||||
|
.component();
|
||||||
|
let flexModel = view.modelBuilder.flexContainer()
|
||||||
|
.withLayout({
|
||||||
|
flexFlow: 'column',
|
||||||
|
alignItems: 'stretch',
|
||||||
|
height: '100%'
|
||||||
|
}).withItems([
|
||||||
|
webview
|
||||||
|
], { flex: '1 1 50%' })
|
||||||
|
.component();
|
||||||
|
|
||||||
|
let templateValues = {url: 'http://whoisactive.com/docs/'};
|
||||||
|
Utils.renderTemplateHtml(path.join(__dirname, '..'), 'templateTab.html', templateValues)
|
||||||
|
.then(html => {
|
||||||
|
webview.html = html;
|
||||||
|
});
|
||||||
|
|
||||||
|
await view.initializeModel(flexModel);
|
||||||
|
});
|
||||||
|
editor.openEditor();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private registerSqlServicesModelView(): void {
|
private registerSqlServicesModelView(): void {
|
||||||
sqlops.dashboard.registerModelViewProvider('sqlservices', async (view) => {
|
sqlops.ui.registerModelViewProvider('sqlservices', async (view) => {
|
||||||
let flexModel = view.modelBuilder.flexContainer()
|
let flexModel = view.modelBuilder.flexContainer()
|
||||||
.withLayout({
|
.withLayout({
|
||||||
flexFlow: 'row',
|
flexFlow: 'row',
|
||||||
@@ -62,7 +302,7 @@ export default class MainController implements vscode.Disposable {
|
|||||||
.withProperties<sqlops.CardProperties>({
|
.withProperties<sqlops.CardProperties>({
|
||||||
label: 'label1',
|
label: 'label1',
|
||||||
value: 'value1',
|
value: 'value1',
|
||||||
actions: [{ label: 'action', taskId: 'sqlservices.clickTask' }]
|
actions: [{ label: 'action' }]
|
||||||
})
|
})
|
||||||
.component()
|
.component()
|
||||||
]).component(),
|
]).component(),
|
||||||
@@ -74,7 +314,7 @@ export default class MainController implements vscode.Disposable {
|
|||||||
.withProperties<sqlops.CardProperties>({
|
.withProperties<sqlops.CardProperties>({
|
||||||
label: 'label2',
|
label: 'label2',
|
||||||
value: 'value2',
|
value: 'value2',
|
||||||
actions: [{ label: 'action', taskId: 'sqlservices.clickTask' }]
|
actions: [{ label: 'action' }]
|
||||||
})
|
})
|
||||||
.component()
|
.component()
|
||||||
]).component()
|
]).component()
|
||||||
@@ -85,7 +325,7 @@ export default class MainController implements vscode.Disposable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private registerSplitPanelModelView(): void {
|
private registerSplitPanelModelView(): void {
|
||||||
sqlops.dashboard.registerModelViewProvider('splitPanel', async (view) => {
|
sqlops.ui.registerModelViewProvider('splitPanel', async (view) => {
|
||||||
let numPanels = 3;
|
let numPanels = 3;
|
||||||
let splitPanel = new SplitPropertiesPanel(view, numPanels);
|
let splitPanel = new SplitPropertiesPanel(view, numPanels);
|
||||||
await view.initializeModel(splitPanel.modelBase);
|
await view.initializeModel(splitPanel.modelBase);
|
||||||
|
|||||||
36
samples/sqlservices/src/resources/templateTab.html
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<!--
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
-->
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<script type="text/javascript">
|
||||||
|
window.onload = function() {
|
||||||
|
document.getElementById('frame').src = "{{{url}}}";
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
#frame {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<iframe id="frame" width="100%" height="100%" frameborder="0"></iframe>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -19,6 +19,14 @@
|
|||||||
normalize-path "^2.0.1"
|
normalize-path "^2.0.1"
|
||||||
through2 "^2.0.3"
|
through2 "^2.0.3"
|
||||||
|
|
||||||
|
"@types/handlebars@^4.0.11":
|
||||||
|
version "4.0.37"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/handlebars/-/handlebars-4.0.37.tgz#a3bc3eba0c0f03f753cac00841a5b21e26a02c03"
|
||||||
|
|
||||||
|
"@types/node@*":
|
||||||
|
version "10.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.1.3.tgz#5c16980936c4e3c83ce64e8ed71fb37bd7aea135"
|
||||||
|
|
||||||
"@types/node@^7.0.43":
|
"@types/node@^7.0.43":
|
||||||
version "7.0.58"
|
version "7.0.58"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.58.tgz#ae852120137f40a29731a559e48003bd2d5d19f7"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.58.tgz#ae852120137f40a29731a559e48003bd2d5d19f7"
|
||||||
@@ -47,6 +55,14 @@ ajv@^5.1.0:
|
|||||||
fast-json-stable-stringify "^2.0.0"
|
fast-json-stable-stringify "^2.0.0"
|
||||||
json-schema-traverse "^0.3.0"
|
json-schema-traverse "^0.3.0"
|
||||||
|
|
||||||
|
align-text@^0.1.1, align-text@^0.1.3:
|
||||||
|
version "0.1.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
|
||||||
|
dependencies:
|
||||||
|
kind-of "^3.0.2"
|
||||||
|
longest "^1.0.1"
|
||||||
|
repeat-string "^1.5.2"
|
||||||
|
|
||||||
amdefine@>=0.0.4:
|
amdefine@>=0.0.4:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
|
resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
|
||||||
@@ -115,6 +131,12 @@ are-we-there-yet@~1.1.2:
|
|||||||
delegates "^1.0.0"
|
delegates "^1.0.0"
|
||||||
readable-stream "^2.0.6"
|
readable-stream "^2.0.6"
|
||||||
|
|
||||||
|
argparse@^1.0.7:
|
||||||
|
version "1.0.10"
|
||||||
|
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
|
||||||
|
dependencies:
|
||||||
|
sprintf-js "~1.0.2"
|
||||||
|
|
||||||
arr-diff@^1.0.1:
|
arr-diff@^1.0.1:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a"
|
resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a"
|
||||||
@@ -250,6 +272,10 @@ async-settle@^1.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
async-done "^1.2.2"
|
async-done "^1.2.2"
|
||||||
|
|
||||||
|
async@^1.4.0:
|
||||||
|
version "1.5.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
|
||||||
|
|
||||||
asynckit@^0.4.0:
|
asynckit@^0.4.0:
|
||||||
version "0.4.0"
|
version "0.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
|
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
|
||||||
@@ -324,6 +350,10 @@ block-stream@*:
|
|||||||
dependencies:
|
dependencies:
|
||||||
inherits "~2.0.0"
|
inherits "~2.0.0"
|
||||||
|
|
||||||
|
boolbase@~1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
|
||||||
|
|
||||||
boom@2.x.x:
|
boom@2.x.x:
|
||||||
version "2.10.1"
|
version "2.10.1"
|
||||||
resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
|
resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
|
||||||
@@ -408,6 +438,10 @@ cache-base@^1.0.1:
|
|||||||
union-value "^1.0.0"
|
union-value "^1.0.0"
|
||||||
unset-value "^1.0.0"
|
unset-value "^1.0.0"
|
||||||
|
|
||||||
|
camelcase@^1.0.2:
|
||||||
|
version "1.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
|
||||||
|
|
||||||
camelcase@^3.0.0:
|
camelcase@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
|
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
|
||||||
@@ -420,6 +454,13 @@ caseless@~0.12.0:
|
|||||||
version "0.12.0"
|
version "0.12.0"
|
||||||
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
|
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
|
||||||
|
|
||||||
|
center-align@^0.1.1:
|
||||||
|
version "0.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
|
||||||
|
dependencies:
|
||||||
|
align-text "^0.1.3"
|
||||||
|
lazy-cache "^1.0.3"
|
||||||
|
|
||||||
chalk@^1.0.0, chalk@^1.1.1:
|
chalk@^1.0.0, chalk@^1.1.1:
|
||||||
version "1.1.3"
|
version "1.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
|
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
|
||||||
@@ -430,6 +471,17 @@ chalk@^1.0.0, chalk@^1.1.1:
|
|||||||
strip-ansi "^3.0.0"
|
strip-ansi "^3.0.0"
|
||||||
supports-color "^2.0.0"
|
supports-color "^2.0.0"
|
||||||
|
|
||||||
|
cheerio@^1.0.0-rc.1:
|
||||||
|
version "1.0.0-rc.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db"
|
||||||
|
dependencies:
|
||||||
|
css-select "~1.2.0"
|
||||||
|
dom-serializer "~0.1.0"
|
||||||
|
entities "~1.1.1"
|
||||||
|
htmlparser2 "^3.9.1"
|
||||||
|
lodash "^4.15.0"
|
||||||
|
parse5 "^3.0.1"
|
||||||
|
|
||||||
child-process-promise@^2.2.1:
|
child-process-promise@^2.2.1:
|
||||||
version "2.2.1"
|
version "2.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/child-process-promise/-/child-process-promise-2.2.1.tgz#4730a11ef610fad450b8f223c79d31d7bdad8074"
|
resolved "https://registry.yarnpkg.com/child-process-promise/-/child-process-promise-2.2.1.tgz#4730a11ef610fad450b8f223c79d31d7bdad8074"
|
||||||
@@ -465,6 +517,14 @@ class-utils@^0.3.5:
|
|||||||
isobject "^3.0.0"
|
isobject "^3.0.0"
|
||||||
static-extend "^0.1.1"
|
static-extend "^0.1.1"
|
||||||
|
|
||||||
|
cliui@^2.1.0:
|
||||||
|
version "2.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
|
||||||
|
dependencies:
|
||||||
|
center-align "^0.1.1"
|
||||||
|
right-align "^0.1.1"
|
||||||
|
wordwrap "0.0.2"
|
||||||
|
|
||||||
cliui@^3.2.0:
|
cliui@^3.2.0:
|
||||||
version "3.2.0"
|
version "3.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
|
resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
|
||||||
@@ -546,7 +606,7 @@ commander@2.11.0:
|
|||||||
version "2.11.0"
|
version "2.11.0"
|
||||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
|
||||||
|
|
||||||
commander@^2.9.0:
|
commander@^2.8.1, commander@^2.9.0:
|
||||||
version "2.15.1"
|
version "2.15.1"
|
||||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
|
||||||
|
|
||||||
@@ -609,6 +669,19 @@ cryptiles@3.x.x:
|
|||||||
dependencies:
|
dependencies:
|
||||||
boom "5.x.x"
|
boom "5.x.x"
|
||||||
|
|
||||||
|
css-select@~1.2.0:
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
|
||||||
|
dependencies:
|
||||||
|
boolbase "~1.0.0"
|
||||||
|
css-what "2.1"
|
||||||
|
domutils "1.5.1"
|
||||||
|
nth-check "~1.0.1"
|
||||||
|
|
||||||
|
css-what@2.1:
|
||||||
|
version "2.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
|
||||||
|
|
||||||
css@2.X, css@^2.2.1:
|
css@2.X, css@^2.2.1:
|
||||||
version "2.2.1"
|
version "2.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/css/-/css-2.2.1.tgz#73a4c81de85db664d4ee674f7d47085e3b2d55dc"
|
resolved "https://registry.yarnpkg.com/css/-/css-2.2.1.tgz#73a4c81de85db664d4ee674f7d47085e3b2d55dc"
|
||||||
@@ -654,7 +727,7 @@ debug@^2.2.0, debug@^2.3.3:
|
|||||||
dependencies:
|
dependencies:
|
||||||
ms "2.0.0"
|
ms "2.0.0"
|
||||||
|
|
||||||
decamelize@^1.1.1:
|
decamelize@^1.0.0, decamelize@^1.1.1:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
|
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
|
||||||
|
|
||||||
@@ -727,6 +800,10 @@ delegates@^1.0.0:
|
|||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
|
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
|
||||||
|
|
||||||
|
denodeify@^1.2.1:
|
||||||
|
version "1.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631"
|
||||||
|
|
||||||
detect-file@^1.0.0:
|
detect-file@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
|
resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
|
||||||
@@ -747,6 +824,41 @@ diff@^2.2.1:
|
|||||||
version "2.2.3"
|
version "2.2.3"
|
||||||
resolved "https://registry.yarnpkg.com/diff/-/diff-2.2.3.tgz#60eafd0d28ee906e4e8ff0a52c1229521033bf99"
|
resolved "https://registry.yarnpkg.com/diff/-/diff-2.2.3.tgz#60eafd0d28ee906e4e8ff0a52c1229521033bf99"
|
||||||
|
|
||||||
|
dom-serializer@0, dom-serializer@~0.1.0:
|
||||||
|
version "0.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
|
||||||
|
dependencies:
|
||||||
|
domelementtype "~1.1.1"
|
||||||
|
entities "~1.1.1"
|
||||||
|
|
||||||
|
domelementtype@1, domelementtype@^1.3.0:
|
||||||
|
version "1.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
|
||||||
|
|
||||||
|
domelementtype@~1.1.1:
|
||||||
|
version "1.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
|
||||||
|
|
||||||
|
domhandler@^2.3.0:
|
||||||
|
version "2.4.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
|
||||||
|
dependencies:
|
||||||
|
domelementtype "1"
|
||||||
|
|
||||||
|
domutils@1.5.1:
|
||||||
|
version "1.5.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
|
||||||
|
dependencies:
|
||||||
|
dom-serializer "0"
|
||||||
|
domelementtype "1"
|
||||||
|
|
||||||
|
domutils@^1.5.1:
|
||||||
|
version "1.7.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
|
||||||
|
dependencies:
|
||||||
|
dom-serializer "0"
|
||||||
|
domelementtype "1"
|
||||||
|
|
||||||
duplexer2@0.0.2:
|
duplexer2@0.0.2:
|
||||||
version "0.0.2"
|
version "0.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db"
|
resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db"
|
||||||
@@ -785,6 +897,10 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
once "^1.4.0"
|
once "^1.4.0"
|
||||||
|
|
||||||
|
entities@^1.1.1, entities@~1.1.1:
|
||||||
|
version "1.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
|
||||||
|
|
||||||
error-ex@^1.2.0:
|
error-ex@^1.2.0:
|
||||||
version "1.3.1"
|
version "1.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
|
resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
|
||||||
@@ -834,7 +950,7 @@ event-emitter@^0.3.5:
|
|||||||
d "1"
|
d "1"
|
||||||
es5-ext "~0.10.14"
|
es5-ext "~0.10.14"
|
||||||
|
|
||||||
event-stream@^3.3.1, event-stream@~3.3.4:
|
event-stream@^3.3.1, event-stream@^3.3.4, event-stream@~3.3.4:
|
||||||
version "3.3.4"
|
version "3.3.4"
|
||||||
resolved "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571"
|
resolved "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -1068,6 +1184,14 @@ from@~0:
|
|||||||
version "0.1.7"
|
version "0.1.7"
|
||||||
resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe"
|
resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe"
|
||||||
|
|
||||||
|
fs-extra@^5.0.0:
|
||||||
|
version "5.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd"
|
||||||
|
dependencies:
|
||||||
|
graceful-fs "^4.1.2"
|
||||||
|
jsonfile "^4.0.0"
|
||||||
|
universalify "^0.1.0"
|
||||||
|
|
||||||
fs-mkdirp-stream@^1.0.0:
|
fs-mkdirp-stream@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb"
|
resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb"
|
||||||
@@ -1201,7 +1325,7 @@ glob-watcher@^5.0.0:
|
|||||||
just-debounce "^1.0.0"
|
just-debounce "^1.0.0"
|
||||||
object.defaults "^1.1.0"
|
object.defaults "^1.1.0"
|
||||||
|
|
||||||
glob@7.1.2, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2:
|
glob@7.1.2, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2:
|
||||||
version "7.1.2"
|
version "7.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
|
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -1314,6 +1438,16 @@ gulp-gunzip@1.0.0:
|
|||||||
through2 "~0.6.5"
|
through2 "~0.6.5"
|
||||||
vinyl "~0.4.6"
|
vinyl "~0.4.6"
|
||||||
|
|
||||||
|
gulp-remote-src-vscode@^0.5.0:
|
||||||
|
version "0.5.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/gulp-remote-src-vscode/-/gulp-remote-src-vscode-0.5.0.tgz#71785553bc491880088ad971f90910c4b2d80a99"
|
||||||
|
dependencies:
|
||||||
|
event-stream "^3.3.4"
|
||||||
|
node.extend "^1.1.2"
|
||||||
|
request "^2.79.0"
|
||||||
|
through2 "^2.0.3"
|
||||||
|
vinyl "^2.0.1"
|
||||||
|
|
||||||
gulp-remote-src@^0.4.3:
|
gulp-remote-src@^0.4.3:
|
||||||
version "0.4.3"
|
version "0.4.3"
|
||||||
resolved "https://registry.yarnpkg.com/gulp-remote-src/-/gulp-remote-src-0.4.3.tgz#5728cfd643433dd4845ddef0969f0f971a2ab4a1"
|
resolved "https://registry.yarnpkg.com/gulp-remote-src/-/gulp-remote-src-0.4.3.tgz#5728cfd643433dd4845ddef0969f0f971a2ab4a1"
|
||||||
@@ -1386,6 +1520,16 @@ gulp-untar@^0.0.6:
|
|||||||
tar "^2.2.1"
|
tar "^2.2.1"
|
||||||
through2 "~2.0.3"
|
through2 "~2.0.3"
|
||||||
|
|
||||||
|
gulp-untar@^0.0.7:
|
||||||
|
version "0.0.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/gulp-untar/-/gulp-untar-0.0.7.tgz#92067d79e0fa1e92d60562a100233a44a5aa08b4"
|
||||||
|
dependencies:
|
||||||
|
event-stream "~3.3.4"
|
||||||
|
streamifier "~0.1.1"
|
||||||
|
tar "^2.2.1"
|
||||||
|
through2 "~2.0.3"
|
||||||
|
vinyl "^1.2.0"
|
||||||
|
|
||||||
gulp-util@~3.0.7, gulp-util@~3.0.8:
|
gulp-util@~3.0.7, gulp-util@~3.0.8:
|
||||||
version "3.0.8"
|
version "3.0.8"
|
||||||
resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f"
|
resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f"
|
||||||
@@ -1436,6 +1580,16 @@ gulplog@^1.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
glogg "^1.0.0"
|
glogg "^1.0.0"
|
||||||
|
|
||||||
|
handlebars@^4.0.11:
|
||||||
|
version "4.0.11"
|
||||||
|
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc"
|
||||||
|
dependencies:
|
||||||
|
async "^1.4.0"
|
||||||
|
optimist "^0.6.1"
|
||||||
|
source-map "^0.4.4"
|
||||||
|
optionalDependencies:
|
||||||
|
uglify-js "^2.6"
|
||||||
|
|
||||||
har-schema@^1.0.5:
|
har-schema@^1.0.5:
|
||||||
version "1.0.5"
|
version "1.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
|
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
|
||||||
@@ -1558,6 +1712,17 @@ hosted-git-info@^2.1.4:
|
|||||||
version "2.6.0"
|
version "2.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222"
|
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222"
|
||||||
|
|
||||||
|
htmlparser2@^3.9.1:
|
||||||
|
version "3.9.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338"
|
||||||
|
dependencies:
|
||||||
|
domelementtype "^1.3.0"
|
||||||
|
domhandler "^2.3.0"
|
||||||
|
domutils "^1.5.1"
|
||||||
|
entities "^1.1.1"
|
||||||
|
inherits "^2.0.1"
|
||||||
|
readable-stream "^2.0.2"
|
||||||
|
|
||||||
http-signature@~1.1.0:
|
http-signature@~1.1.0:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
|
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
|
||||||
@@ -1886,6 +2051,12 @@ json-stringify-safe@~5.0.1:
|
|||||||
version "5.0.1"
|
version "5.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
|
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
|
||||||
|
|
||||||
|
jsonfile@^4.0.0:
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
|
||||||
|
optionalDependencies:
|
||||||
|
graceful-fs "^4.1.6"
|
||||||
|
|
||||||
jsonify@~0.0.0:
|
jsonify@~0.0.0:
|
||||||
version "0.0.0"
|
version "0.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
|
resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
|
||||||
@@ -1938,6 +2109,10 @@ last-run@^1.1.0:
|
|||||||
default-resolution "^2.0.0"
|
default-resolution "^2.0.0"
|
||||||
es6-weak-map "^2.0.1"
|
es6-weak-map "^2.0.1"
|
||||||
|
|
||||||
|
lazy-cache@^1.0.3:
|
||||||
|
version "1.0.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
|
||||||
|
|
||||||
lazystream@^1.0.0:
|
lazystream@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4"
|
resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4"
|
||||||
@@ -1969,6 +2144,12 @@ liftoff@^2.5.0:
|
|||||||
rechoir "^0.6.2"
|
rechoir "^0.6.2"
|
||||||
resolve "^1.1.7"
|
resolve "^1.1.7"
|
||||||
|
|
||||||
|
linkify-it@^2.0.0:
|
||||||
|
version "2.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.3.tgz#d94a4648f9b1c179d64fa97291268bdb6ce9434f"
|
||||||
|
dependencies:
|
||||||
|
uc.micro "^1.0.1"
|
||||||
|
|
||||||
load-json-file@^1.0.0:
|
load-json-file@^1.0.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
|
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
|
||||||
@@ -2066,6 +2247,14 @@ lodash.templatesettings@^3.0.0:
|
|||||||
lodash._reinterpolate "^3.0.0"
|
lodash._reinterpolate "^3.0.0"
|
||||||
lodash.escape "^3.0.0"
|
lodash.escape "^3.0.0"
|
||||||
|
|
||||||
|
lodash@^4.15.0:
|
||||||
|
version "4.17.10"
|
||||||
|
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
|
||||||
|
|
||||||
|
longest@^1.0.1:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
|
||||||
|
|
||||||
lru-cache@^4.0.1:
|
lru-cache@^4.0.1:
|
||||||
version "4.1.2"
|
version "4.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.2.tgz#45234b2e6e2f2b33da125624c4664929a0224c3f"
|
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.2.tgz#45234b2e6e2f2b33da125624c4664929a0224c3f"
|
||||||
@@ -2099,6 +2288,16 @@ map-visit@^1.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
object-visit "^1.0.0"
|
object-visit "^1.0.0"
|
||||||
|
|
||||||
|
markdown-it@^8.3.1:
|
||||||
|
version "8.4.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.1.tgz#206fe59b0e4e1b78a7c73250af9b34a4ad0aaf44"
|
||||||
|
dependencies:
|
||||||
|
argparse "^1.0.7"
|
||||||
|
entities "~1.1.1"
|
||||||
|
linkify-it "^2.0.0"
|
||||||
|
mdurl "^1.0.1"
|
||||||
|
uc.micro "^1.0.5"
|
||||||
|
|
||||||
matchdep@^2.0.0:
|
matchdep@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e"
|
resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e"
|
||||||
@@ -2108,6 +2307,10 @@ matchdep@^2.0.0:
|
|||||||
resolve "^1.4.0"
|
resolve "^1.4.0"
|
||||||
stack-trace "0.0.10"
|
stack-trace "0.0.10"
|
||||||
|
|
||||||
|
mdurl@^1.0.1:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
|
||||||
|
|
||||||
memoizee@0.4.X:
|
memoizee@0.4.X:
|
||||||
version "0.4.12"
|
version "0.4.12"
|
||||||
resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.12.tgz#780e99a219c50c549be6d0fc61765080975c58fb"
|
resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.12.tgz#780e99a219c50c549be6d0fc61765080975c58fb"
|
||||||
@@ -2173,7 +2376,11 @@ mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.7:
|
|||||||
dependencies:
|
dependencies:
|
||||||
mime-db "~1.33.0"
|
mime-db "~1.33.0"
|
||||||
|
|
||||||
"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4:
|
mime@^1.3.4:
|
||||||
|
version "1.6.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
|
||||||
|
|
||||||
|
"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4:
|
||||||
version "3.0.4"
|
version "3.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
|
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -2242,6 +2449,10 @@ mute-stdout@^1.0.0:
|
|||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.0.tgz#5b32ea07eb43c9ded6130434cf926f46b2a7fd4d"
|
resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.0.tgz#5b32ea07eb43c9ded6130434cf926f46b2a7fd4d"
|
||||||
|
|
||||||
|
mute-stream@~0.0.4:
|
||||||
|
version "0.0.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
|
||||||
|
|
||||||
nan@^2.3.0:
|
nan@^2.3.0:
|
||||||
version "2.10.0"
|
version "2.10.0"
|
||||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
|
resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
|
||||||
@@ -2287,7 +2498,7 @@ node-version@^1.0.0:
|
|||||||
version "1.1.3"
|
version "1.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.1.3.tgz#1081c87cce6d2dbbd61d0e51e28c287782678496"
|
resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.1.3.tgz#1081c87cce6d2dbbd61d0e51e28c287782678496"
|
||||||
|
|
||||||
node.extend@~1.1.2:
|
node.extend@^1.1.2, node.extend@~1.1.2:
|
||||||
version "1.1.6"
|
version "1.1.6"
|
||||||
resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-1.1.6.tgz#a7b882c82d6c93a4863a5504bd5de8ec86258b96"
|
resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-1.1.6.tgz#a7b882c82d6c93a4863a5504bd5de8ec86258b96"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -2330,6 +2541,12 @@ npmlog@^4.0.2:
|
|||||||
gauge "~2.7.3"
|
gauge "~2.7.3"
|
||||||
set-blocking "~2.0.0"
|
set-blocking "~2.0.0"
|
||||||
|
|
||||||
|
nth-check@~1.0.1:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4"
|
||||||
|
dependencies:
|
||||||
|
boolbase "~1.0.0"
|
||||||
|
|
||||||
number-is-nan@^1.0.0:
|
number-is-nan@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
|
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
|
||||||
@@ -2415,7 +2632,7 @@ once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.3.3, once@^1.4.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
wrappy "1"
|
wrappy "1"
|
||||||
|
|
||||||
optimist@~0.6.0:
|
optimist@^0.6.1, optimist@~0.6.0:
|
||||||
version "0.6.1"
|
version "0.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
|
resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -2445,11 +2662,11 @@ os-locale@^1.4.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
lcid "^1.0.0"
|
lcid "^1.0.0"
|
||||||
|
|
||||||
os-tmpdir@^1.0.0:
|
os-tmpdir@^1.0.0, os-tmpdir@~1.0.1:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
|
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
|
||||||
|
|
||||||
osenv@^0.1.4:
|
osenv@^0.1.3, osenv@^0.1.4:
|
||||||
version "0.1.5"
|
version "0.1.5"
|
||||||
resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
|
resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -2487,6 +2704,18 @@ parse-passwd@^1.0.0:
|
|||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
|
resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
|
||||||
|
|
||||||
|
parse-semver@^1.1.1:
|
||||||
|
version "1.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/parse-semver/-/parse-semver-1.1.1.tgz#9a4afd6df063dc4826f93fba4a99cf223f666cb8"
|
||||||
|
dependencies:
|
||||||
|
semver "^5.1.0"
|
||||||
|
|
||||||
|
parse5@^3.0.1:
|
||||||
|
version "3.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c"
|
||||||
|
dependencies:
|
||||||
|
"@types/node" "*"
|
||||||
|
|
||||||
pascalcase@^0.1.1:
|
pascalcase@^0.1.1:
|
||||||
version "0.1.1"
|
version "0.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
|
resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
|
||||||
@@ -2683,6 +2912,12 @@ read-pkg@^1.0.0:
|
|||||||
normalize-package-data "^2.3.2"
|
normalize-package-data "^2.3.2"
|
||||||
path-type "^1.0.0"
|
path-type "^1.0.0"
|
||||||
|
|
||||||
|
read@^1.0.7:
|
||||||
|
version "1.0.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
|
||||||
|
dependencies:
|
||||||
|
mute-stream "~0.0.4"
|
||||||
|
|
||||||
"readable-stream@>=1.0.33-1 <1.1.0-0":
|
"readable-stream@>=1.0.33-1 <1.1.0-0":
|
||||||
version "1.0.34"
|
version "1.0.34"
|
||||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
|
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
|
||||||
@@ -2811,6 +3046,31 @@ request@2.81.0:
|
|||||||
tunnel-agent "^0.6.0"
|
tunnel-agent "^0.6.0"
|
||||||
uuid "^3.0.0"
|
uuid "^3.0.0"
|
||||||
|
|
||||||
|
request@^2.79.0:
|
||||||
|
version "2.87.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e"
|
||||||
|
dependencies:
|
||||||
|
aws-sign2 "~0.7.0"
|
||||||
|
aws4 "^1.6.0"
|
||||||
|
caseless "~0.12.0"
|
||||||
|
combined-stream "~1.0.5"
|
||||||
|
extend "~3.0.1"
|
||||||
|
forever-agent "~0.6.1"
|
||||||
|
form-data "~2.3.1"
|
||||||
|
har-validator "~5.0.3"
|
||||||
|
http-signature "~1.2.0"
|
||||||
|
is-typedarray "~1.0.0"
|
||||||
|
isstream "~0.1.2"
|
||||||
|
json-stringify-safe "~5.0.1"
|
||||||
|
mime-types "~2.1.17"
|
||||||
|
oauth-sign "~0.8.2"
|
||||||
|
performance-now "^2.1.0"
|
||||||
|
qs "~6.5.1"
|
||||||
|
safe-buffer "^5.1.1"
|
||||||
|
tough-cookie "~2.3.3"
|
||||||
|
tunnel-agent "^0.6.0"
|
||||||
|
uuid "^3.1.0"
|
||||||
|
|
||||||
request@^2.83.0:
|
request@^2.83.0:
|
||||||
version "2.85.0"
|
version "2.85.0"
|
||||||
resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa"
|
resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa"
|
||||||
@@ -2902,6 +3162,12 @@ ret@~0.1.10:
|
|||||||
version "0.1.15"
|
version "0.1.15"
|
||||||
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
|
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
|
||||||
|
|
||||||
|
right-align@^0.1.1:
|
||||||
|
version "0.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
|
||||||
|
dependencies:
|
||||||
|
align-text "^0.1.1"
|
||||||
|
|
||||||
rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1:
|
rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1:
|
||||||
version "2.6.2"
|
version "2.6.2"
|
||||||
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
|
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
|
||||||
@@ -2924,7 +3190,7 @@ semver-greatest-satisfied-range@^1.1.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
sver-compat "^1.5.0"
|
sver-compat "^1.5.0"
|
||||||
|
|
||||||
"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1:
|
"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1:
|
||||||
version "5.5.0"
|
version "5.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
|
resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
|
||||||
|
|
||||||
@@ -3036,7 +3302,13 @@ source-map@^0.1.38:
|
|||||||
dependencies:
|
dependencies:
|
||||||
amdefine ">=0.0.4"
|
amdefine ">=0.0.4"
|
||||||
|
|
||||||
source-map@^0.5.6, source-map@~0.5.3:
|
source-map@^0.4.4:
|
||||||
|
version "0.4.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
|
||||||
|
dependencies:
|
||||||
|
amdefine ">=0.0.4"
|
||||||
|
|
||||||
|
source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3:
|
||||||
version "0.5.7"
|
version "0.5.7"
|
||||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
|
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
|
||||||
|
|
||||||
@@ -3086,6 +3358,10 @@ sprintf-js@^1.0.3:
|
|||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c"
|
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c"
|
||||||
|
|
||||||
|
sprintf-js@~1.0.2:
|
||||||
|
version "1.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
|
||||||
|
|
||||||
"sqlops@github:anthonydresser/sqlops-extension-sqlops":
|
"sqlops@github:anthonydresser/sqlops-extension-sqlops":
|
||||||
version "1.1.11"
|
version "1.1.11"
|
||||||
resolved "https://codeload.github.com/anthonydresser/sqlops-extension-sqlops/tar.gz/dac501bbaa03a25239c060c6371dfdcf06707599"
|
resolved "https://codeload.github.com/anthonydresser/sqlops-extension-sqlops/tar.gz/dac501bbaa03a25239c060c6371dfdcf06707599"
|
||||||
@@ -3281,6 +3557,12 @@ timers-ext@^0.1.2:
|
|||||||
es5-ext "~0.10.14"
|
es5-ext "~0.10.14"
|
||||||
next-tick "1"
|
next-tick "1"
|
||||||
|
|
||||||
|
tmp@0.0.29:
|
||||||
|
version "0.0.29"
|
||||||
|
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0"
|
||||||
|
dependencies:
|
||||||
|
os-tmpdir "~1.0.1"
|
||||||
|
|
||||||
to-absolute-glob@^0.1.1:
|
to-absolute-glob@^0.1.1:
|
||||||
version "0.1.1"
|
version "0.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f"
|
resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f"
|
||||||
@@ -3350,10 +3632,21 @@ tunnel-agent@~0.4.1:
|
|||||||
version "0.4.3"
|
version "0.4.3"
|
||||||
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
|
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
|
||||||
|
|
||||||
|
tunnel@0.0.4:
|
||||||
|
version "0.0.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.4.tgz#2d3785a158c174c9a16dc2c046ec5fc5f1742213"
|
||||||
|
|
||||||
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
|
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
|
||||||
version "0.14.5"
|
version "0.14.5"
|
||||||
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
|
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
|
||||||
|
|
||||||
|
typed-rest-client@^0.12.0:
|
||||||
|
version "0.12.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/typed-rest-client/-/typed-rest-client-0.12.0.tgz#6376f5527f427da121dcafdfd7e41e1321e0720c"
|
||||||
|
dependencies:
|
||||||
|
tunnel "0.0.4"
|
||||||
|
underscore "1.8.3"
|
||||||
|
|
||||||
typedarray@^0.0.6:
|
typedarray@^0.0.6:
|
||||||
version "0.0.6"
|
version "0.0.6"
|
||||||
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
|
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
|
||||||
@@ -3362,6 +3655,23 @@ typescript@^2.6.1:
|
|||||||
version "2.8.1"
|
version "2.8.1"
|
||||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.1.tgz#6160e4f8f195d5ba81d4876f9c0cc1fbc0820624"
|
resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.1.tgz#6160e4f8f195d5ba81d4876f9c0cc1fbc0820624"
|
||||||
|
|
||||||
|
uc.micro@^1.0.1, uc.micro@^1.0.5:
|
||||||
|
version "1.0.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376"
|
||||||
|
|
||||||
|
uglify-js@^2.6:
|
||||||
|
version "2.8.29"
|
||||||
|
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
|
||||||
|
dependencies:
|
||||||
|
source-map "~0.5.1"
|
||||||
|
yargs "~3.10.0"
|
||||||
|
optionalDependencies:
|
||||||
|
uglify-to-browserify "~1.0.0"
|
||||||
|
|
||||||
|
uglify-to-browserify@~1.0.0:
|
||||||
|
version "1.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
|
||||||
|
|
||||||
uid-number@^0.0.6:
|
uid-number@^0.0.6:
|
||||||
version "0.0.6"
|
version "0.0.6"
|
||||||
resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
|
resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
|
||||||
@@ -3377,6 +3687,10 @@ underscore.string@^3.3.4:
|
|||||||
sprintf-js "^1.0.3"
|
sprintf-js "^1.0.3"
|
||||||
util-deprecate "^1.0.2"
|
util-deprecate "^1.0.2"
|
||||||
|
|
||||||
|
underscore@1.8.3:
|
||||||
|
version "1.8.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022"
|
||||||
|
|
||||||
undertaker-registry@^1.0.0:
|
undertaker-registry@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50"
|
resolved "https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50"
|
||||||
@@ -3411,6 +3725,10 @@ unique-stream@^2.0.2:
|
|||||||
json-stable-stringify "^1.0.0"
|
json-stable-stringify "^1.0.0"
|
||||||
through2-filter "^2.0.0"
|
through2-filter "^2.0.0"
|
||||||
|
|
||||||
|
universalify@^0.1.0:
|
||||||
|
version "0.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7"
|
||||||
|
|
||||||
unset-value@^1.0.0:
|
unset-value@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
|
resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
|
||||||
@@ -3426,6 +3744,10 @@ urix@^0.1.0, urix@~0.1.0:
|
|||||||
version "0.1.0"
|
version "0.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
|
resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
|
||||||
|
|
||||||
|
url-join@^1.1.0:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78"
|
||||||
|
|
||||||
url-parse@^1.1.9:
|
url-parse@^1.1.9:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.2.0.tgz#3a19e8aaa6d023ddd27dcc44cb4fc8f7fec23986"
|
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.2.0.tgz#3a19e8aaa6d023ddd27dcc44cb4fc8f7fec23986"
|
||||||
@@ -3554,7 +3876,7 @@ vinyl@^0.5.0:
|
|||||||
clone-stats "^0.0.1"
|
clone-stats "^0.0.1"
|
||||||
replace-ext "0.0.1"
|
replace-ext "0.0.1"
|
||||||
|
|
||||||
vinyl@^1.0.0:
|
vinyl@^1.0.0, vinyl@^1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884"
|
resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -3562,7 +3884,7 @@ vinyl@^1.0.0:
|
|||||||
clone-stats "^0.0.1"
|
clone-stats "^0.0.1"
|
||||||
replace-ext "0.0.1"
|
replace-ext "0.0.1"
|
||||||
|
|
||||||
vinyl@^2.0.0, vinyl@^2.0.2:
|
vinyl@^2.0.0, vinyl@^2.0.1, vinyl@^2.0.2:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.1.0.tgz#021f9c2cf951d6b939943c89eb5ee5add4fd924c"
|
resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.1.0.tgz#021f9c2cf951d6b939943c89eb5ee5add4fd924c"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -3585,21 +3907,43 @@ vinyl@~2.0.1:
|
|||||||
remove-trailing-separator "^1.0.1"
|
remove-trailing-separator "^1.0.1"
|
||||||
replace-ext "^1.0.0"
|
replace-ext "^1.0.0"
|
||||||
|
|
||||||
|
vsce@1.36.2:
|
||||||
|
version "1.36.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/vsce/-/vsce-1.36.2.tgz#dfcfca722bc6aa6bfcbffb1efd23176ba99b2944"
|
||||||
|
dependencies:
|
||||||
|
cheerio "^1.0.0-rc.1"
|
||||||
|
commander "^2.8.1"
|
||||||
|
denodeify "^1.2.1"
|
||||||
|
glob "^7.0.6"
|
||||||
|
lodash "^4.15.0"
|
||||||
|
markdown-it "^8.3.1"
|
||||||
|
mime "^1.3.4"
|
||||||
|
minimatch "^3.0.3"
|
||||||
|
osenv "^0.1.3"
|
||||||
|
parse-semver "^1.1.1"
|
||||||
|
read "^1.0.7"
|
||||||
|
semver "^5.1.0"
|
||||||
|
tmp "0.0.29"
|
||||||
|
url-join "^1.1.0"
|
||||||
|
vso-node-api "^6.1.2-preview"
|
||||||
|
yauzl "^2.3.1"
|
||||||
|
yazl "^2.2.2"
|
||||||
|
|
||||||
vscode-nls@^3.2.2:
|
vscode-nls@^3.2.2:
|
||||||
version "3.2.2"
|
version "3.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.2.tgz#3817eca5b985c2393de325197cf4e15eb2aa5350"
|
resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.2.tgz#3817eca5b985c2393de325197cf4e15eb2aa5350"
|
||||||
|
|
||||||
vscode@^1.1.6:
|
vscode@^1.1.14:
|
||||||
version "1.1.14"
|
version "1.1.18"
|
||||||
resolved "https://registry.yarnpkg.com/vscode/-/vscode-1.1.14.tgz#f327f5fd45c085d12def616962af205b2bc75db5"
|
resolved "https://registry.yarnpkg.com/vscode/-/vscode-1.1.18.tgz#e9227265dc72fc826bd6cd7bd21193f4e48fa671"
|
||||||
dependencies:
|
dependencies:
|
||||||
glob "^7.1.2"
|
glob "^7.1.2"
|
||||||
gulp-chmod "^2.0.0"
|
gulp-chmod "^2.0.0"
|
||||||
gulp-filter "^5.0.1"
|
gulp-filter "^5.0.1"
|
||||||
gulp-gunzip "1.0.0"
|
gulp-gunzip "1.0.0"
|
||||||
gulp-remote-src "^0.4.3"
|
gulp-remote-src-vscode "^0.5.0"
|
||||||
gulp-symdest "^1.1.0"
|
gulp-symdest "^1.1.0"
|
||||||
gulp-untar "^0.0.6"
|
gulp-untar "^0.0.7"
|
||||||
gulp-vinyl-zip "^2.1.0"
|
gulp-vinyl-zip "^2.1.0"
|
||||||
mocha "^4.0.1"
|
mocha "^4.0.1"
|
||||||
request "^2.83.0"
|
request "^2.83.0"
|
||||||
@@ -3608,6 +3952,14 @@ vscode@^1.1.6:
|
|||||||
url-parse "^1.1.9"
|
url-parse "^1.1.9"
|
||||||
vinyl-source-stream "^1.1.0"
|
vinyl-source-stream "^1.1.0"
|
||||||
|
|
||||||
|
vso-node-api@^6.1.2-preview:
|
||||||
|
version "6.5.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/vso-node-api/-/vso-node-api-6.5.0.tgz#5f3453f27d211b0fd54423c4c73116c1e8fea0c6"
|
||||||
|
dependencies:
|
||||||
|
tunnel "0.0.4"
|
||||||
|
typed-rest-client "^0.12.0"
|
||||||
|
underscore "1.8.3"
|
||||||
|
|
||||||
which-module@^1.0.0:
|
which-module@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
|
resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
|
||||||
@@ -3624,6 +3976,14 @@ wide-align@^1.1.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
string-width "^1.0.2"
|
string-width "^1.0.2"
|
||||||
|
|
||||||
|
window-size@0.1.0:
|
||||||
|
version "0.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
|
||||||
|
|
||||||
|
wordwrap@0.0.2:
|
||||||
|
version "0.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
|
||||||
|
|
||||||
wordwrap@~0.0.2:
|
wordwrap@~0.0.2:
|
||||||
version "0.0.3"
|
version "0.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
|
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
|
||||||
@@ -3675,14 +4035,23 @@ yargs@^7.1.0:
|
|||||||
y18n "^3.2.1"
|
y18n "^3.2.1"
|
||||||
yargs-parser "^5.0.0"
|
yargs-parser "^5.0.0"
|
||||||
|
|
||||||
yauzl@^2.2.1:
|
yargs@~3.10.0:
|
||||||
|
version "3.10.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
|
||||||
|
dependencies:
|
||||||
|
camelcase "^1.0.2"
|
||||||
|
cliui "^2.1.0"
|
||||||
|
decamelize "^1.0.0"
|
||||||
|
window-size "0.1.0"
|
||||||
|
|
||||||
|
yauzl@^2.2.1, yauzl@^2.3.1:
|
||||||
version "2.9.1"
|
version "2.9.1"
|
||||||
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.9.1.tgz#a81981ea70a57946133883f029c5821a89359a7f"
|
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.9.1.tgz#a81981ea70a57946133883f029c5821a89359a7f"
|
||||||
dependencies:
|
dependencies:
|
||||||
buffer-crc32 "~0.2.3"
|
buffer-crc32 "~0.2.3"
|
||||||
fd-slicer "~1.0.1"
|
fd-slicer "~1.0.1"
|
||||||
|
|
||||||
yazl@^2.2.1:
|
yazl@^2.2.1, yazl@^2.2.2:
|
||||||
version "2.4.3"
|
version "2.4.3"
|
||||||
resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.4.3.tgz#ec26e5cc87d5601b9df8432dbdd3cd2e5173a071"
|
resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.4.3.tgz#ec26e5cc87d5601b9df8432dbdd3cd2e5173a071"
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|||||||
@@ -21,6 +21,12 @@ panel {
|
|||||||
.tabbedPanel .composite.title {
|
.tabbedPanel .composite.title {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex: 0 0 auto;
|
flex: 0 0 auto;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabbedPanel .tabContainer {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tabbedPanel .tabList {
|
.tabbedPanel .tabList {
|
||||||
@@ -31,6 +37,7 @@ panel {
|
|||||||
line-height: 35px;
|
line-height: 35px;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tabbedPanel .tabList .tab {
|
.tabbedPanel .tabList .tab {
|
||||||
@@ -65,15 +72,6 @@ panel {
|
|||||||
line-height: 45px;
|
line-height: 45px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tabbedPanel .tabList .tab:hover .tabLabel,
|
|
||||||
.tabbedPanel .tabList .tab .tabLabel.active {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tabbedPanel .tabList .tab .tabLabel {
|
|
||||||
opacity: 0.8;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tabbedPanel .tabList .tab .tabLabel.icon {
|
.tabbedPanel .tabList .tab .tabLabel.icon {
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: center center;
|
background-position: center center;
|
||||||
@@ -97,17 +95,13 @@ panel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.composite.title .title-actions {
|
.composite.title .title-actions {
|
||||||
flex: 1 1 auto;
|
flex: 0 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tab > .tabLabel.active {
|
.tab > .tabLabel.active {
|
||||||
border-bottom: 1px solid;
|
border-bottom: 1px solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
.composite.title ~ tab.fullsize > :first-child {
|
|
||||||
height: calc(100% - 38px);
|
|
||||||
}
|
|
||||||
|
|
||||||
.tabbedPanel .title-actions .panel-actions .actions-container {
|
.tabbedPanel .title-actions .panel-actions .actions-container {
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ import { Component, ContentChildren, QueryList, AfterContentInit, Inject, forwar
|
|||||||
|
|
||||||
import { TabComponent } from './tab.component';
|
import { TabComponent } from './tab.component';
|
||||||
import { TabHeaderComponent } from './tabHeader.component';
|
import { TabHeaderComponent } from './tabHeader.component';
|
||||||
|
import { ScrollableDirective } from 'sql/base/browser/ui/scrollable/scrollable.directive';
|
||||||
import './panelStyles';
|
import './panelStyles';
|
||||||
|
|
||||||
import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar';
|
import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar';
|
||||||
import { Action } from 'vs/base/common/actions';
|
import { Action } from 'vs/base/common/actions';
|
||||||
import * as types from 'vs/base/common/types';
|
import * as types from 'vs/base/common/types';
|
||||||
import { mixin } from 'vs/base/common/objects';
|
import { mixin } from 'vs/base/common/objects';
|
||||||
import { ScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement';
|
|
||||||
import { ScrollbarVisibility } from 'vs/base/common/scrollable';
|
import { ScrollbarVisibility } from 'vs/base/common/scrollable';
|
||||||
import { addDisposableListener, EventType } from 'vs/base/browser/dom';
|
import { addDisposableListener, EventType } from 'vs/base/browser/dom';
|
||||||
import { Disposable } from 'vs/base/common/lifecycle';
|
import { Disposable } from 'vs/base/common/lifecycle';
|
||||||
@@ -46,12 +46,13 @@ let idPool = 0;
|
|||||||
@Component({
|
@Component({
|
||||||
selector: 'panel',
|
selector: 'panel',
|
||||||
template: `
|
template: `
|
||||||
|
<div class="tabbedPanel fullsize" [ngClass]="options.layout === NavigationBarLayout.vertical ? 'vertical' : 'horizontal'">
|
||||||
<div class="tabbedPanel fullsize" #tabbedPanel>
|
<div *ngIf="!options.showTabsWhenOne ? _tabs.length !== 1 : true" class="composite title">
|
||||||
<div *ngIf="!options.showTabsWhenOne ? _tabs.length !== 1 : true" class="composite title" #titleContainer>
|
<div class="tabContainer">
|
||||||
<div class="tabList" #tabList role="tablist">
|
<div class="tabList" role="tablist" scrollable [horizontalScroll]="ScrollbarVisibility.Auto" [verticalScroll]="ScrollbarVisibility.Hidden" [scrollYToX]="true">
|
||||||
<div *ngFor="let tab of _tabs">
|
<div role="presentation" *ngFor="let tab of _tabs">
|
||||||
<tab-header [tab]="tab" [showIcon]="options.showIcon" (onSelectTab)='selectTab($event)' (onCloseTab)='closeTab($event)'> </tab-header>
|
<tab-header role="presentation" [active]="_activeTab === tab" [tab]="tab" [showIcon]="options.showIcon" (onSelectTab)='selectTab($event)' (onCloseTab)='closeTab($event)'></tab-header>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="title-actions">
|
<div class="title-actions">
|
||||||
@@ -67,11 +68,12 @@ let idPool = 0;
|
|||||||
</div>
|
</div>
|
||||||
`
|
`
|
||||||
})
|
})
|
||||||
export class PanelComponent extends Disposable implements AfterContentInit, OnInit, OnChanges, OnDestroy, AfterViewInit {
|
export class PanelComponent extends Disposable {
|
||||||
@Input() public options: IPanelOptions;
|
@Input() public options: IPanelOptions;
|
||||||
@Input() public actions: Array<Action>;
|
@Input() public actions: Array<Action>;
|
||||||
@ContentChildren(TabComponent) private _tabs: QueryList<TabComponent>;
|
@ContentChildren(TabComponent) private _tabs: QueryList<TabComponent>;
|
||||||
@ViewChildren(TabHeaderComponent) private _headerTabs: QueryList<TabHeaderComponent>;
|
@ViewChildren(TabHeaderComponent) private _headerTabs: QueryList<TabHeaderComponent>;
|
||||||
|
@ViewChild(ScrollableDirective) private scrollable: ScrollableDirective;
|
||||||
|
|
||||||
@Output() public onTabChange = new EventEmitter<TabComponent>();
|
@Output() public onTabChange = new EventEmitter<TabComponent>();
|
||||||
@Output() public onTabClose = new EventEmitter<TabComponent>();
|
@Output() public onTabClose = new EventEmitter<TabComponent>();
|
||||||
@@ -79,12 +81,11 @@ export class PanelComponent extends Disposable implements AfterContentInit, OnIn
|
|||||||
private _activeTab: TabComponent;
|
private _activeTab: TabComponent;
|
||||||
private _actionbar: ActionBar;
|
private _actionbar: ActionBar;
|
||||||
private _mru: TabComponent[];
|
private _mru: TabComponent[];
|
||||||
private _scrollableElement: ScrollableElement;
|
|
||||||
|
private ScrollbarVisibility = ScrollbarVisibility;
|
||||||
|
private NavigationBarLayout = NavigationBarLayout;
|
||||||
|
|
||||||
@ViewChild('panelActionbar', { read: ElementRef }) private _actionbarRef: ElementRef;
|
@ViewChild('panelActionbar', { read: ElementRef }) private _actionbarRef: ElementRef;
|
||||||
@ViewChild('tabbedPanel', { read: ElementRef }) private _tabbedPanelRef: ElementRef;
|
|
||||||
@ViewChild('titleContainer', { read: ElementRef }) private _titleContainer: ElementRef;
|
|
||||||
@ViewChild('tabList', { read: ElementRef }) private _tabList: ElementRef;
|
|
||||||
constructor( @Inject(forwardRef(() => NgZone)) private _zone: NgZone) {
|
constructor( @Inject(forwardRef(() => NgZone)) private _zone: NgZone) {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
@@ -96,51 +97,14 @@ export class PanelComponent extends Disposable implements AfterContentInit, OnIn
|
|||||||
|
|
||||||
ngAfterContentInit(): void {
|
ngAfterContentInit(): void {
|
||||||
if (this._tabs && this._tabs.length > 0) {
|
if (this._tabs && this._tabs.length > 0) {
|
||||||
this._activeTab = this._tabs.first;
|
this.selectTab(this._tabs.first);
|
||||||
this._activeTab.active = true;
|
} else {
|
||||||
}
|
const sub = this._tabs.changes.subscribe(() => {
|
||||||
}
|
if (this._tabs && this._tabs.length > 0) {
|
||||||
|
this.selectTab(this._tabs.first);
|
||||||
ngAfterViewInit(): void {
|
sub.unsubscribe();
|
||||||
if (!this.options.showTabsWhenOne ? this._tabs.length !== 1 : true) {
|
}
|
||||||
let container = this._titleContainer.nativeElement as HTMLElement;
|
|
||||||
let tabList = this._tabList.nativeElement as HTMLElement;
|
|
||||||
container.removeChild(tabList);
|
|
||||||
|
|
||||||
this._scrollableElement = new ScrollableElement(tabList, {
|
|
||||||
horizontal: ScrollbarVisibility.Auto,
|
|
||||||
vertical: ScrollbarVisibility.Hidden,
|
|
||||||
scrollYToX: true,
|
|
||||||
useShadows: false,
|
|
||||||
horizontalScrollbarSize: 3
|
|
||||||
});
|
});
|
||||||
|
|
||||||
this._scrollableElement.onScroll(e => {
|
|
||||||
tabList.scrollLeft = e.scrollLeft;
|
|
||||||
});
|
|
||||||
|
|
||||||
container.insertBefore(this._scrollableElement.getDomNode(), container.firstChild);
|
|
||||||
|
|
||||||
this._scrollableElement.setScrollDimensions({
|
|
||||||
width: tabList.offsetWidth,
|
|
||||||
scrollWidth: tabList.scrollWidth
|
|
||||||
});
|
|
||||||
|
|
||||||
this._register(addDisposableListener(window, EventType.RESIZE, () => {
|
|
||||||
// Todo: Need to set timeout because we have to make sure that the grids have already rearraged before the getContentHeight gets called.
|
|
||||||
setTimeout(() => {
|
|
||||||
this._scrollableElement.setScrollDimensions({
|
|
||||||
width: tabList.offsetWidth,
|
|
||||||
scrollWidth: tabList.scrollWidth
|
|
||||||
});
|
|
||||||
}, 100);
|
|
||||||
}));
|
|
||||||
|
|
||||||
if (this.options.layout === NavigationBarLayout.horizontal) {
|
|
||||||
(<HTMLElement>this._tabbedPanelRef.nativeElement).classList.add(horizontalLayout);
|
|
||||||
} else {
|
|
||||||
(<HTMLElement>this._tabbedPanelRef.nativeElement).classList.add(verticalLayout);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,6 +118,17 @@ export class PanelComponent extends Disposable implements AfterContentInit, OnIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngAfterViewInit(): void {
|
||||||
|
this._tabs.changes.subscribe(() => {
|
||||||
|
if (this.scrollable) {
|
||||||
|
this.scrollable.layout();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (this.scrollable) {
|
||||||
|
this.scrollable.layout();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ngOnDestroy() {
|
ngOnDestroy() {
|
||||||
if (this._actionbar) {
|
if (this._actionbar) {
|
||||||
this._actionbar.dispose();
|
this._actionbar.dispose();
|
||||||
@@ -210,12 +185,6 @@ export class PanelComponent extends Disposable implements AfterContentInit, OnIn
|
|||||||
this.setMostRecentlyUsed(tab);
|
this.setMostRecentlyUsed(tab);
|
||||||
this._activeTab.active = true;
|
this._activeTab.active = true;
|
||||||
|
|
||||||
// Make the tab header focus on the new selected tab
|
|
||||||
let activeTabHeader = this._headerTabs.find(i => i.tab === this._activeTab);
|
|
||||||
if (activeTabHeader) {
|
|
||||||
activeTabHeader.focusOnTabHeader();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.onTabChange.emit(tab);
|
this.onTabChange.emit(tab);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,11 @@ import { TabComponent } from './tab.component';
|
|||||||
import { TabHeaderComponent } from './tabHeader.component';
|
import { TabHeaderComponent } from './tabHeader.component';
|
||||||
import { PanelComponent } from './panel.component';
|
import { PanelComponent } from './panel.component';
|
||||||
|
|
||||||
|
import { ScrollableModule } from 'sql/base/browser/ui/scrollable/scrollable.module';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [CommonModule],
|
imports: [CommonModule, ScrollableModule],
|
||||||
exports: [TabComponent, PanelComponent],
|
exports: [TabComponent, PanelComponent],
|
||||||
declarations: [TabComponent, TabHeaderComponent, PanelComponent]
|
declarations: [TabComponent, TabHeaderComponent, PanelComponent]
|
||||||
})
|
})
|
||||||
export class PanelModule { }
|
export class PanelModule { }
|
||||||
|
|||||||
@@ -66,6 +66,8 @@ export class TabbedPanel extends Disposable implements IThemable {
|
|||||||
this.$header.append(actionbarcontainer);
|
this.$header.append(actionbarcontainer);
|
||||||
this.$parent.append(this.$header);
|
this.$parent.append(this.$header);
|
||||||
this.$body = $('tabBody');
|
this.$body = $('tabBody');
|
||||||
|
this.$body.attr('role', 'tabpanel');
|
||||||
|
this.$body.attr('tabindex', '0');
|
||||||
this.$parent.append(this.$body);
|
this.$parent.append(this.$body);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,7 +94,7 @@ export class TabbedPanel extends Disposable implements IThemable {
|
|||||||
tabHeaderElement.attr('tabindex', '0');
|
tabHeaderElement.attr('tabindex', '0');
|
||||||
tabHeaderElement.attr('role', 'tab');
|
tabHeaderElement.attr('role', 'tab');
|
||||||
tabHeaderElement.attr('aria-selected', 'false');
|
tabHeaderElement.attr('aria-selected', 'false');
|
||||||
tabHeaderElement.attr('aria-label', tab.title);
|
tabHeaderElement.attr('aria-controls', tab.identifier);
|
||||||
let tabElement = $('.tab');
|
let tabElement = $('.tab');
|
||||||
tabHeaderElement.append(tabElement);
|
tabHeaderElement.append(tabElement);
|
||||||
let tabLabel = $('a.tabLabel');
|
let tabLabel = $('a.tabLabel');
|
||||||
@@ -124,6 +126,7 @@ export class TabbedPanel extends Disposable implements IThemable {
|
|||||||
this._shownTab = id;
|
this._shownTab = id;
|
||||||
this.$body.clearChildren();
|
this.$body.clearChildren();
|
||||||
let tab = this._tabMap.get(this._shownTab);
|
let tab = this._tabMap.get(this._shownTab);
|
||||||
|
this.$body.attr('aria-labelledby', tab.identifier);
|
||||||
tab.label.addClass('active');
|
tab.label.addClass('active');
|
||||||
tab.header.addClass('active');
|
tab.header.addClass('active');
|
||||||
tab.header.attr('aria-selected', 'true');
|
tab.header.attr('aria-selected', 'true');
|
||||||
|
|||||||
@@ -5,33 +5,33 @@
|
|||||||
import 'vs/css!./media/panel';
|
import 'vs/css!./media/panel';
|
||||||
|
|
||||||
import { registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService';
|
import { registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService';
|
||||||
import { TAB_ACTIVE_FOREGROUND, TAB_INACTIVE_FOREGROUND, PANEL_ACTIVE_TITLE_BORDER } from 'vs/workbench/common/theme';
|
import { PANEL_ACTIVE_TITLE_FOREGROUND, PANEL_INACTIVE_TITLE_FOREGROUND, PANEL_ACTIVE_TITLE_BORDER } from 'vs/workbench/common/theme';
|
||||||
import { activeContrastBorder, focusBorder } from 'vs/platform/theme/common/colorRegistry';
|
import { activeContrastBorder, focusBorder } from 'vs/platform/theme/common/colorRegistry';
|
||||||
|
|
||||||
registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
|
registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
|
||||||
|
|
||||||
// Title Active
|
// Title Active
|
||||||
const titleActive = theme.getColor(TAB_ACTIVE_FOREGROUND);
|
const titleActive = theme.getColor(PANEL_ACTIVE_TITLE_FOREGROUND);
|
||||||
const titleActiveBorder = theme.getColor(PANEL_ACTIVE_TITLE_BORDER);
|
const titleActiveBorder = theme.getColor(PANEL_ACTIVE_TITLE_BORDER);
|
||||||
if (titleActive || titleActiveBorder) {
|
if (titleActive || titleActiveBorder) {
|
||||||
collector.addRule(`
|
collector.addRule(`
|
||||||
.tabbedPanel > .title > .tabList .tab:hover .tabLabel,
|
.tabbedPanel > .title .tabList .tab:hover .tabLabel,
|
||||||
.tabbedPanel > .title > .tabList .tab .tabLabel.active {
|
.tabbedPanel > .title .tabList .tab .tabLabel.active {
|
||||||
color: ${titleActive};
|
color: ${titleActive};
|
||||||
border-bottom-color: ${titleActiveBorder};
|
border-bottom-color: ${titleActiveBorder};
|
||||||
}
|
}
|
||||||
|
|
||||||
.tabbedPanel > .title > .tabList .tab-header.active {
|
.tabbedPanel > .title .tabList .tab-header.active {
|
||||||
outline: none;
|
outline: none;
|
||||||
}
|
}
|
||||||
`);
|
`);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Title Inactive
|
// Title Inactive
|
||||||
const titleInactive = theme.getColor(TAB_INACTIVE_FOREGROUND);
|
const titleInactive = theme.getColor(PANEL_INACTIVE_TITLE_FOREGROUND);
|
||||||
if (titleInactive) {
|
if (titleInactive) {
|
||||||
collector.addRule(`
|
collector.addRule(`
|
||||||
.tabbedPanel > .title > .tabList .tab .tabLabel {
|
.tabbedPanel > .title .tabList .tab .tabLabel {
|
||||||
color: ${titleInactive};
|
color: ${titleInactive};
|
||||||
}
|
}
|
||||||
`);
|
`);
|
||||||
@@ -41,7 +41,7 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
|
|||||||
const focusBorderColor = theme.getColor(focusBorder);
|
const focusBorderColor = theme.getColor(focusBorder);
|
||||||
if (focusBorderColor) {
|
if (focusBorderColor) {
|
||||||
collector.addRule(`
|
collector.addRule(`
|
||||||
.tabbedPanel > .title > .tabList .tab .tabLabel:focus {
|
.tabbedPanel > .title .tabList .tab .tabLabel:focus {
|
||||||
color: ${titleActive};
|
color: ${titleActive};
|
||||||
border-bottom-color: ${focusBorderColor} !important;
|
border-bottom-color: ${focusBorderColor} !important;
|
||||||
border-bottom: 1px solid;
|
border-bottom: 1px solid;
|
||||||
@@ -54,8 +54,8 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
|
|||||||
const outline = theme.getColor(activeContrastBorder);
|
const outline = theme.getColor(activeContrastBorder);
|
||||||
if (outline) {
|
if (outline) {
|
||||||
collector.addRule(`
|
collector.addRule(`
|
||||||
.tabbedPanel > .title > .tabList .tab-header.active,
|
.tabbedPanel > .title .tabList .tab-header.active,
|
||||||
.tabbedPanel > .title > .tabList .tab-header:hover {
|
.tabbedPanel > .title .tabList .tab-header:hover {
|
||||||
outline-color: ${outline};
|
outline-color: ${outline};
|
||||||
outline-width: 1px;
|
outline-width: 1px;
|
||||||
outline-style: solid;
|
outline-style: solid;
|
||||||
@@ -63,7 +63,7 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
|
|||||||
outline-offset: -5px;
|
outline-offset: -5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tabbedPanel > .title > .tabList .tab-header:hover:not(.active) {
|
.tabbedPanel > .title .tabList .tab-header:hover:not(.active) {
|
||||||
outline-style: dashed;
|
outline-style: dashed;
|
||||||
}
|
}
|
||||||
`);
|
`);
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
import { Component, Input, ContentChild, OnDestroy } from '@angular/core';
|
import { Component, Input, ContentChild, OnDestroy, TemplateRef, ChangeDetectorRef, forwardRef, Inject } from '@angular/core';
|
||||||
|
|
||||||
import { Action } from 'vs/base/common/actions';
|
import { Action } from 'vs/base/common/actions';
|
||||||
|
|
||||||
@@ -13,13 +13,14 @@ export abstract class TabChild {
|
|||||||
@Component({
|
@Component({
|
||||||
selector: 'tab',
|
selector: 'tab',
|
||||||
template: `
|
template: `
|
||||||
<div class="visibility" [class.hidden]="!active && visibilityType == 'visibility'" *ngIf="visibilityType == 'visibility' || active" class="fullsize">
|
<div role="tabpanel" [attr.aria-labelledby]="identifier" tabindex="0" class="visibility" [class.hidden]="shouldBeHidden()" *ngIf="shouldBeIfed()" class="fullsize">
|
||||||
<ng-content class="body fullsize"></ng-content>
|
<ng-container *ngTemplateOutlet="templateRef"></ng-container>
|
||||||
</div>
|
</div>
|
||||||
`
|
`
|
||||||
})
|
})
|
||||||
export class TabComponent implements OnDestroy {
|
export class TabComponent implements OnDestroy {
|
||||||
@ContentChild(TabChild) private _child: TabChild;
|
@ContentChild(TabChild) private _child: TabChild;
|
||||||
|
@ContentChild(TemplateRef) templateRef;
|
||||||
@Input() public title: string;
|
@Input() public title: string;
|
||||||
@Input() public canClose: boolean;
|
@Input() public canClose: boolean;
|
||||||
@Input() public actions: Array<Action>;
|
@Input() public actions: Array<Action>;
|
||||||
@@ -27,9 +28,18 @@ export class TabComponent implements OnDestroy {
|
|||||||
public _active = false;
|
public _active = false;
|
||||||
@Input() public identifier: string;
|
@Input() public identifier: string;
|
||||||
@Input() private visibilityType: 'if' | 'visibility' = 'if';
|
@Input() private visibilityType: 'if' | 'visibility' = 'if';
|
||||||
|
private rendered = false;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
@Inject(forwardRef(() => ChangeDetectorRef)) private _cd: ChangeDetectorRef
|
||||||
|
) { }
|
||||||
|
|
||||||
public set active(val: boolean) {
|
public set active(val: boolean) {
|
||||||
this._active = val;
|
this._active = val;
|
||||||
|
if (this.active) {
|
||||||
|
this.rendered = true;
|
||||||
|
}
|
||||||
|
this._cd.detectChanges();
|
||||||
if (this.active && this._child) {
|
if (this.active && this._child) {
|
||||||
this._child.layout();
|
this._child.layout();
|
||||||
}
|
}
|
||||||
@@ -45,4 +55,21 @@ export class TabComponent implements OnDestroy {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
shouldBeIfed(): boolean {
|
||||||
|
if (this.active) {
|
||||||
|
return true;
|
||||||
|
} else if (this.visibilityType === 'visibility' && this.rendered) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
shouldBeHidden(): boolean {
|
||||||
|
if (this.visibilityType === 'visibility' && !this.active) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ import { CloseTabAction } from './tabActions';
|
|||||||
@Component({
|
@Component({
|
||||||
selector: 'tab-header',
|
selector: 'tab-header',
|
||||||
template: `
|
template: `
|
||||||
<div #actionHeader class="tab-header" style="flex: 0 0; flex-direction: row;" [class.active]="tab.active" tabindex="0" (keyup)="onKey($event)">
|
<div #actionHeader role="presentation" class="tab-header" style="flex: 0 0; flex-direction: row; height: 100%" [class.active]="tab.active" tabindex="0" (keyup)="onKey($event)">
|
||||||
<span class="tab" (click)="selectTab(tab)" role="tab" [attr.aria-selected]="tab.active" [attr.aria-label]="tab.title">
|
<span class="tab" (click)="selectTab(tab)" role="tab" [attr.aria-selected]="tab.active" [attr.aria-controls]="tab.title">
|
||||||
<a class="tabLabel" [class.active]="tab.active" #tabLabel>
|
<a class="tabLabel" [class.active]="tab.active" #tabLabel>
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
@@ -31,6 +31,7 @@ import { CloseTabAction } from './tabActions';
|
|||||||
export class TabHeaderComponent extends Disposable implements AfterContentInit, OnDestroy {
|
export class TabHeaderComponent extends Disposable implements AfterContentInit, OnDestroy {
|
||||||
@Input() public tab: TabComponent;
|
@Input() public tab: TabComponent;
|
||||||
@Input() public showIcon: boolean;
|
@Input() public showIcon: boolean;
|
||||||
|
@Input() public active: boolean;
|
||||||
@Output() public onSelectTab: EventEmitter<TabComponent> = new EventEmitter<TabComponent>();
|
@Output() public onSelectTab: EventEmitter<TabComponent> = new EventEmitter<TabComponent>();
|
||||||
@Output() public onCloseTab: EventEmitter<TabComponent> = new EventEmitter<TabComponent>();
|
@Output() public onCloseTab: EventEmitter<TabComponent> = new EventEmitter<TabComponent>();
|
||||||
|
|
||||||
|
|||||||
83
src/sql/base/browser/ui/radioButton/radioButton.ts
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
import * as DOM from 'vs/base/browser/dom';
|
||||||
|
import { IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview';
|
||||||
|
import { Color } from 'vs/base/common/color';
|
||||||
|
import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox';
|
||||||
|
import Event, { Emitter } from 'vs/base/common/event';
|
||||||
|
import { Widget } from 'vs/base/browser/ui/widget';
|
||||||
|
|
||||||
|
export interface IRadioButtonOptions {
|
||||||
|
label: string;
|
||||||
|
enabled?: boolean;
|
||||||
|
checked?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class RadioButton extends Widget {
|
||||||
|
|
||||||
|
private inputElement: HTMLInputElement;
|
||||||
|
private _onClicked = new Emitter<void>();
|
||||||
|
public readonly onClicked: Event<void> = this._onClicked.event;
|
||||||
|
private _label: HTMLSpanElement;
|
||||||
|
|
||||||
|
constructor(container: HTMLElement, opts: IRadioButtonOptions) {
|
||||||
|
super();
|
||||||
|
this.inputElement = document.createElement('input');
|
||||||
|
this.inputElement.type = 'radio';
|
||||||
|
|
||||||
|
this._label = document.createElement('span');
|
||||||
|
|
||||||
|
this.label = opts.label;
|
||||||
|
this.enabled = opts.enabled || true;
|
||||||
|
this.checked = opts.checked || false;
|
||||||
|
this.onclick(this.inputElement, () => this._onClicked.fire());
|
||||||
|
|
||||||
|
container.appendChild(this.inputElement);
|
||||||
|
container.appendChild(this._label);
|
||||||
|
}
|
||||||
|
|
||||||
|
public set name(value: string) {
|
||||||
|
this.inputElement.setAttribute('name', value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public get name(): string {
|
||||||
|
return this.inputElement.getAttribute('name');
|
||||||
|
}
|
||||||
|
|
||||||
|
public set value(value: string) {
|
||||||
|
this.inputElement.setAttribute('value', value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public get value(): string {
|
||||||
|
return this.inputElement.getAttribute('value');
|
||||||
|
}
|
||||||
|
|
||||||
|
public set checked(val: boolean) {
|
||||||
|
this.inputElement.checked = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get checked(): boolean {
|
||||||
|
return this.inputElement.checked;
|
||||||
|
}
|
||||||
|
|
||||||
|
public set enabled(val: boolean) {
|
||||||
|
this.inputElement.disabled = !val;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get enabled(): boolean {
|
||||||
|
return !this.inputElement.disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public isEnabled(): boolean {
|
||||||
|
return !this.inputElement.hasAttribute('disabled');
|
||||||
|
}
|
||||||
|
|
||||||
|
public set label(val: string) {
|
||||||
|
this._label.innerText = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -3,11 +3,11 @@
|
|||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
import { Directive, Inject, forwardRef, ElementRef } from '@angular/core';
|
import { Directive, Inject, forwardRef, ElementRef, Input } from '@angular/core';
|
||||||
|
|
||||||
import { ScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement';
|
import { ScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement';
|
||||||
import { ScrollbarVisibility } from 'vs/base/common/scrollable';
|
import { ScrollbarVisibility } from 'vs/base/common/scrollable';
|
||||||
import { getContentHeight, addDisposableListener, EventType } from 'vs/base/browser/dom';
|
import { getContentHeight, addDisposableListener, EventType, getContentWidth } from 'vs/base/browser/dom';
|
||||||
import { AngularDisposable } from 'sql/base/common/lifecycle';
|
import { AngularDisposable } from 'sql/base/common/lifecycle';
|
||||||
|
|
||||||
@Directive({
|
@Directive({
|
||||||
@@ -17,33 +17,45 @@ export class ScrollableDirective extends AngularDisposable {
|
|||||||
private scrollableElement: ScrollableElement;
|
private scrollableElement: ScrollableElement;
|
||||||
private parent: HTMLElement;
|
private parent: HTMLElement;
|
||||||
private scrolled: HTMLElement;
|
private scrolled: HTMLElement;
|
||||||
|
@Input() horizontalScroll: ScrollbarVisibility;
|
||||||
|
@Input() verticalScroll: ScrollbarVisibility;
|
||||||
|
@Input() useShadow = false;
|
||||||
|
@Input() scrollYToX = false;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(forwardRef(() => ElementRef)) private _el: ElementRef
|
@Inject(forwardRef(() => ElementRef)) private _el: ElementRef
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
this.scrolled = this._el.nativeElement as HTMLElement;
|
this.scrolled = this._el.nativeElement as HTMLElement;
|
||||||
this.parent = this.scrolled.parentElement;
|
this.parent = this.scrolled.parentElement;
|
||||||
|
const next = this.scrolled.nextSibling;
|
||||||
this.parent.removeChild(this.scrolled);
|
this.parent.removeChild(this.scrolled);
|
||||||
|
|
||||||
this.scrolled.style.position = 'relative';
|
this.scrolled.style.position = 'relative';
|
||||||
|
|
||||||
this.scrollableElement = new ScrollableElement(this.scrolled, {
|
this.scrollableElement = new ScrollableElement(this.scrolled, {
|
||||||
horizontal: ScrollbarVisibility.Hidden,
|
horizontal: this.horizontalScroll,
|
||||||
vertical: ScrollbarVisibility.Auto,
|
vertical: this.verticalScroll,
|
||||||
useShadows: false
|
useShadows: this.useShadow,
|
||||||
|
scrollYToX: this.scrollYToX,
|
||||||
|
horizontalScrollbarSize: 3
|
||||||
});
|
});
|
||||||
|
|
||||||
this.scrollableElement.onScroll(e => {
|
this.scrollableElement.onScroll(e => {
|
||||||
this.scrolled.style.bottom = e.scrollTop + 'px';
|
if (this.verticalScroll === ScrollbarVisibility.Auto) {
|
||||||
|
this.scrolled.style.bottom = e.scrollTop + 'px';
|
||||||
|
} else if (this.horizontalScroll === ScrollbarVisibility.Auto) {
|
||||||
|
this.scrolled.scrollLeft = e.scrollLeft;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
this.parent.appendChild(this.scrollableElement.getDomNode());
|
this.parent.insertBefore(this.scrollableElement.getDomNode(), next);
|
||||||
const initialHeight = getContentHeight(this.scrolled);
|
const initialHeight = getContentHeight(this.scrolled);
|
||||||
this.scrollableElement.setScrollDimensions({
|
const initalWidth = getContentWidth(this.scrolled);
|
||||||
scrollHeight: getContentHeight(this.scrolled),
|
this.resetScrollDimensions();
|
||||||
height: getContentHeight(this.parent)
|
|
||||||
});
|
|
||||||
|
|
||||||
this._register(addDisposableListener(window, EventType.RESIZE, () => {
|
this._register(addDisposableListener(window, EventType.RESIZE, () => {
|
||||||
this.resetScrollDimensions();
|
this.resetScrollDimensions();
|
||||||
@@ -52,24 +64,23 @@ export class ScrollableDirective extends AngularDisposable {
|
|||||||
// unforunately because of angular rendering behavior we need to do a double check to make sure nothing changed after this point
|
// unforunately because of angular rendering behavior we need to do a double check to make sure nothing changed after this point
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
let currentheight = getContentHeight(this.scrolled);
|
let currentheight = getContentHeight(this.scrolled);
|
||||||
if (initialHeight !== currentheight) {
|
let currentWidth = getContentWidth(this.scrolled);
|
||||||
this.scrollableElement.setScrollDimensions({
|
if (initialHeight !== currentheight || initalWidth !== currentWidth) {
|
||||||
scrollHeight: currentheight,
|
this.resetScrollDimensions();
|
||||||
height: getContentHeight(this.parent)
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}, 200);
|
}, 200);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private resetScrollDimensions() {
|
private resetScrollDimensions() {
|
||||||
this.scrollableElement.setScrollDimensions({
|
this.scrollableElement.setScrollDimensions({
|
||||||
scrollHeight: getContentHeight(this.scrolled),
|
scrollHeight: this.verticalScroll === ScrollbarVisibility.Auto ? getContentHeight(this.scrolled) : undefined,
|
||||||
height: getContentHeight(this.parent)
|
height: this.verticalScroll === ScrollbarVisibility.Auto ? getContentHeight(this.parent) : undefined,
|
||||||
|
scrollWidth: this.horizontalScroll === ScrollbarVisibility.Auto ? this.scrolled.scrollWidth : undefined,
|
||||||
|
width: this.horizontalScroll === ScrollbarVisibility.Auto ? this.scrolled.offsetWidth : undefined
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public layout() {
|
public layout() {
|
||||||
|
this.resetScrollDimensions();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
15
src/sql/base/browser/ui/scrollable/scrollable.module.ts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
import { NgModule } from '@angular/core';
|
||||||
|
import { CommonModule } from '@angular/common';
|
||||||
|
|
||||||
|
import { ScrollableDirective } from './scrollable.directive';
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
imports: [CommonModule],
|
||||||
|
exports: [ScrollableDirective],
|
||||||
|
declarations: [ScrollableDirective]
|
||||||
|
})
|
||||||
|
export class ScrollableModule { }
|
||||||
@@ -67,7 +67,7 @@ export class AutoColumnSize<T> implements Slick.Plugin<T> {
|
|||||||
let rowEl = this.createRow(columnDef);
|
let rowEl = this.createRow(columnDef);
|
||||||
let data = this._grid.getData();
|
let data = this._grid.getData();
|
||||||
let viewPort = this._grid.getViewport();
|
let viewPort = this._grid.getViewport();
|
||||||
let start = Math.max(0, viewPort.top + 1);
|
let start = Math.max(0, viewPort.top);
|
||||||
let end = Math.min(data.getLength(), viewPort.bottom);
|
let end = Math.min(data.getLength(), viewPort.bottom);
|
||||||
for (let i = start; i < end; i++) {
|
for (let i = start; i < end; i++) {
|
||||||
texts.push(data.getItem(i)[columnDef.field]);
|
texts.push(data.getItem(i)[columnDef.field]);
|
||||||
|
|||||||
@@ -131,6 +131,14 @@
|
|||||||
background: url("filter_inverse.svg") center center no-repeat !important;
|
background: url("filter_inverse.svg") center center no-repeat !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.vs .icon.filterLabel {
|
||||||
|
background-image: url("filter.svg");
|
||||||
|
}
|
||||||
|
|
||||||
|
.vs-dark .icon.filterLabel,
|
||||||
|
.hc-black .icon.filterLabel {
|
||||||
|
background-image: url("filter_inverse.svg");
|
||||||
|
}
|
||||||
|
|
||||||
.vs .icon.warning-badge,
|
.vs .icon.warning-badge,
|
||||||
.vs-dark .icon.warning-badge,
|
.vs-dark .icon.warning-badge,
|
||||||
|
|||||||
@@ -34,20 +34,28 @@ import { AccountProviderAddedEventParams, UpdateAccountListEventParams } from 's
|
|||||||
import { FixedListView } from 'sql/platform/views/fixedListView';
|
import { FixedListView } from 'sql/platform/views/fixedListView';
|
||||||
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||||
|
|
||||||
|
export interface IProviderViewUiComponent {
|
||||||
|
view: FixedListView<sqlops.Account>;
|
||||||
|
addAccountAction: AddAccountAction;
|
||||||
|
}
|
||||||
|
|
||||||
export class AccountDialog extends Modal {
|
export class AccountDialog extends Modal {
|
||||||
public static ACCOUNTLIST_HEIGHT = 77;
|
public static ACCOUNTLIST_HEIGHT = 77;
|
||||||
|
|
||||||
public viewModel: AccountViewModel;
|
public viewModel: AccountViewModel;
|
||||||
|
|
||||||
// MEMBER VARIABLES ////////////////////////////////////////////////////
|
// MEMBER VARIABLES ////////////////////////////////////////////////////
|
||||||
private _providerViews: { [providerId: string]: FixedListView<sqlops.Account> } = {};
|
private _providerViews: { [providerId: string]: IProviderViewUiComponent } = {};
|
||||||
|
|
||||||
private _closeButton: Button;
|
private _closeButton: Button;
|
||||||
|
private _addAccountButton: Button;
|
||||||
private _delegate: AccountListDelegate;
|
private _delegate: AccountListDelegate;
|
||||||
private _accountRenderer: AccountListRenderer;
|
private _accountRenderer: AccountListRenderer;
|
||||||
private _actionRunner: ActionRunner;
|
private _actionRunner: ActionRunner;
|
||||||
private _splitView: SplitView;
|
private _splitView: SplitView;
|
||||||
private _container: HTMLElement;
|
private _container: HTMLElement;
|
||||||
|
private _splitViewContainer: HTMLElement;
|
||||||
|
private _noaccountViewContainer: HTMLElement;
|
||||||
|
|
||||||
// EVENTING ////////////////////////////////////////////////////////////
|
// EVENTING ////////////////////////////////////////////////////////////
|
||||||
private _onAddAccountErrorEmitter: Emitter<string>;
|
private _onAddAccountErrorEmitter: Emitter<string>;
|
||||||
@@ -89,6 +97,14 @@ export class AccountDialog extends Modal {
|
|||||||
this.viewModel.addProviderEvent(arg => { self.addProvider(arg); });
|
this.viewModel.addProviderEvent(arg => { self.addProvider(arg); });
|
||||||
this.viewModel.removeProviderEvent(arg => { self.removeProvider(arg); });
|
this.viewModel.removeProviderEvent(arg => { self.removeProvider(arg); });
|
||||||
this.viewModel.updateAccountListEvent(arg => { self.updateProviderAccounts(arg); });
|
this.viewModel.updateAccountListEvent(arg => { self.updateProviderAccounts(arg); });
|
||||||
|
|
||||||
|
// Load the initial contents of the view model
|
||||||
|
this.viewModel.initialize()
|
||||||
|
.then(addedProviders => {
|
||||||
|
for (let addedProvider of addedProviders) {
|
||||||
|
self.addProvider(addedProvider);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// MODAL OVERRIDE METHODS //////////////////////////////////////////////
|
// MODAL OVERRIDE METHODS //////////////////////////////////////////////
|
||||||
@@ -104,26 +120,35 @@ export class AccountDialog extends Modal {
|
|||||||
attachModalDialogStyler(this, this._themeService);
|
attachModalDialogStyler(this, this._themeService);
|
||||||
this._closeButton = this.addFooterButton(localize('accountDialog.close', 'Close'), () => this.close());
|
this._closeButton = this.addFooterButton(localize('accountDialog.close', 'Close'), () => this.close());
|
||||||
this.registerListeners();
|
this.registerListeners();
|
||||||
|
|
||||||
// Load the initial contents of the view model
|
|
||||||
this.viewModel.initialize()
|
|
||||||
.then(addedProviders => {
|
|
||||||
for (let addedProvider of addedProviders) {
|
|
||||||
self.addProvider(addedProvider);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected renderBody(container: HTMLElement) {
|
protected renderBody(container: HTMLElement) {
|
||||||
this._container = container;
|
this._container = container;
|
||||||
let viewBody = DOM.$('div.account-view');
|
this._splitViewContainer = DOM.$('div.account-view');
|
||||||
DOM.append(container, viewBody);
|
DOM.append(container, this._splitViewContainer);
|
||||||
this._splitView = new SplitView(viewBody);
|
this._splitView = new SplitView(this._splitViewContainer);
|
||||||
|
|
||||||
|
this._noaccountViewContainer = DOM.$('div.no-account-view');
|
||||||
|
let noAccountTitle = DOM.append(this._noaccountViewContainer, DOM.$('.no-account-view-label'));
|
||||||
|
let noAccountLabel = localize('accountDialog.noAccountLabel', 'There is no linked account. Please add an acount.');
|
||||||
|
noAccountTitle.innerHTML = noAccountLabel;
|
||||||
|
|
||||||
|
// Show the add account button for the first provider
|
||||||
|
// Todo: If we have more than 1 provider, need to show all add account buttons for all providers
|
||||||
|
let buttonSection = DOM.append(this._noaccountViewContainer, DOM.$('div.button-section'));
|
||||||
|
this._addAccountButton = new Button(buttonSection);
|
||||||
|
this._addAccountButton.label = localize('accountDialog.addConnection', 'Add an account');
|
||||||
|
this._register(this._addAccountButton.onDidClick(() => {
|
||||||
|
(<IProviderViewUiComponent>Object.values(this._providerViews)[0]).addAccountAction.run();
|
||||||
|
}));
|
||||||
|
|
||||||
|
DOM.append(container, this._noaccountViewContainer);
|
||||||
}
|
}
|
||||||
|
|
||||||
private registerListeners(): void {
|
private registerListeners(): void {
|
||||||
// Theme styler
|
// Theme styler
|
||||||
this._register(attachButtonStyler(this._closeButton, this._themeService));
|
this._register(attachButtonStyler(this._closeButton, this._themeService));
|
||||||
|
this._register(attachButtonStyler(this._addAccountButton, this._themeService));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Overwrite escape key behavior */
|
/* Overwrite escape key behavior */
|
||||||
@@ -143,12 +168,48 @@ export class AccountDialog extends Modal {
|
|||||||
|
|
||||||
public open() {
|
public open() {
|
||||||
this.show();
|
this.show();
|
||||||
|
if (!this.isEmptyLinkedAccount()) {
|
||||||
|
this.showSplitView();
|
||||||
|
} else {
|
||||||
|
this._splitViewContainer.hidden = true;
|
||||||
|
this._noaccountViewContainer.hidden = false;
|
||||||
|
this._addAccountButton.focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private showSplitView() {
|
||||||
|
this._splitViewContainer.hidden = false;
|
||||||
|
this._noaccountViewContainer.hidden = true;
|
||||||
|
let views = this._splitView.getViews();
|
||||||
|
if (views && views.length > 0) {
|
||||||
|
let firstView = views[0];
|
||||||
|
if (firstView instanceof FixedListView) {
|
||||||
|
firstView.list.setSelection([0]);
|
||||||
|
firstView.list.domFocus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private isEmptyLinkedAccount(): boolean {
|
||||||
|
for (var providerId in this._providerViews) {
|
||||||
|
var listView = this._providerViews[providerId].view;
|
||||||
|
if (listView && listView.list.length > 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public dispose(): void {
|
public dispose(): void {
|
||||||
super.dispose();
|
super.dispose();
|
||||||
for (let key in this._providerViews) {
|
for (let key in this._providerViews) {
|
||||||
this._providerViews[key].dispose();
|
if (this._providerViews[key].addAccountAction) {
|
||||||
|
this._providerViews[key].addAccountAction.dispose();
|
||||||
|
}
|
||||||
|
if (this._providerViews[key].view) {
|
||||||
|
this._providerViews[key].view.dispose();
|
||||||
|
}
|
||||||
delete this._providerViews[key];
|
delete this._providerViews[key];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -199,21 +260,26 @@ export class AccountDialog extends Modal {
|
|||||||
|
|
||||||
// Set the initial items of the list
|
// Set the initial items of the list
|
||||||
providerView.updateList(newProvider.initialAccounts);
|
providerView.updateList(newProvider.initialAccounts);
|
||||||
|
|
||||||
|
if (newProvider.initialAccounts.length > 0 && this._splitViewContainer.hidden) {
|
||||||
|
this.showSplitView();
|
||||||
|
}
|
||||||
|
|
||||||
this.layout();
|
this.layout();
|
||||||
|
|
||||||
// Store the view for the provider
|
// Store the view for the provider and action
|
||||||
this._providerViews[newProvider.addedProvider.id] = providerView;
|
this._providerViews[newProvider.addedProvider.id] = { view: providerView, addAccountAction: addAccountAction };
|
||||||
}
|
}
|
||||||
|
|
||||||
private removeProvider(removedProvider: sqlops.AccountProviderMetadata) {
|
private removeProvider(removedProvider: sqlops.AccountProviderMetadata) {
|
||||||
// Skip removing the provider if it doesn't exist
|
// Skip removing the provider if it doesn't exist
|
||||||
let providerView = this._providerViews[removedProvider.id];
|
let providerView = this._providerViews[removedProvider.id];
|
||||||
if (!providerView) {
|
if (!providerView || !providerView.view) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove the list view from the split view
|
// Remove the list view from the split view
|
||||||
this._splitView.removeView(providerView);
|
this._splitView.removeView(providerView.view);
|
||||||
this._splitView.layout(DOM.getContentHeight(this._container));
|
this._splitView.layout(DOM.getContentHeight(this._container));
|
||||||
|
|
||||||
// Remove the list view from our internal map
|
// Remove the list view from our internal map
|
||||||
@@ -223,10 +289,15 @@ export class AccountDialog extends Modal {
|
|||||||
|
|
||||||
private updateProviderAccounts(args: UpdateAccountListEventParams) {
|
private updateProviderAccounts(args: UpdateAccountListEventParams) {
|
||||||
let providerMapping = this._providerViews[args.providerId];
|
let providerMapping = this._providerViews[args.providerId];
|
||||||
if (!providerMapping) {
|
if (!providerMapping || !providerMapping.view) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
providerMapping.updateList(args.accountList);
|
providerMapping.view.updateList(args.accountList);
|
||||||
|
|
||||||
|
if (args.accountList.length > 0 && this._splitViewContainer.hidden) {
|
||||||
|
this.showSplitView();
|
||||||
|
}
|
||||||
|
|
||||||
this.layout();
|
this.layout();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,9 +2,49 @@
|
|||||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
.no-account-view {
|
||||||
|
font-size: 12px;
|
||||||
|
padding: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
.account-view .monaco-split-view .split-view-view .header {
|
.no-account-view .no-account-view-label {
|
||||||
|
padding-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.account-view .header {
|
||||||
|
position: relative;
|
||||||
|
line-height: 22px;
|
||||||
|
font-size: 11px;
|
||||||
|
font-weight: bold;
|
||||||
|
text-transform: uppercase;
|
||||||
|
padding-left: 20px;
|
||||||
padding-right: 12px;
|
padding-right: 12px;
|
||||||
|
overflow: hidden;
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.account-view .header .title {
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-start;
|
||||||
|
flex: 1 1 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.account-view .header .actions {
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
.account-view .header .actions .action-item .action-label {
|
||||||
|
width: 30px;
|
||||||
|
background-size: 16px;
|
||||||
|
background-position: center center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
margin-right: 0;
|
||||||
|
height: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.account-view .header .count-badge-wrapper {
|
||||||
|
justify-content: flex-end;
|
||||||
}
|
}
|
||||||
|
|
||||||
.account-view .provider-view .list-row {
|
.account-view .provider-view .list-row {
|
||||||
@@ -58,24 +98,4 @@
|
|||||||
.account-view .provider-view .monaco-list .monaco-list-row.selected .list-row .actions-container,
|
.account-view .provider-view .monaco-list .monaco-list-row.selected .list-row .actions-container,
|
||||||
.account-view .provider-view .monaco-list .monaco-list-row.focused .list-row .actions-container{
|
.account-view .provider-view .monaco-list .monaco-list-row.focused .list-row .actions-container{
|
||||||
display: block;
|
display: block;
|
||||||
}
|
|
||||||
|
|
||||||
.account-view .split-view-view .header .title {
|
|
||||||
display: flex;
|
|
||||||
justify-content: flex-start;
|
|
||||||
flex: 1 1 auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.account-view .split-view-view .header .actions {
|
|
||||||
display: flex;
|
|
||||||
justify-content: flex-end;
|
|
||||||
}
|
|
||||||
|
|
||||||
.account-view .split-view-view .header .actions .action-item .action-label {
|
|
||||||
width: 30px;
|
|
||||||
background-size: 16px;
|
|
||||||
background-position: center center;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
margin-right: 0;
|
|
||||||
height: 22px;
|
|
||||||
}
|
}
|
||||||
@@ -205,11 +205,11 @@ export class FirewallRuleDialog extends Modal {
|
|||||||
this._register(this._themeService.onDidColorThemeChange(e => this.updateTheme(e)));
|
this._register(this._themeService.onDidColorThemeChange(e => this.updateTheme(e)));
|
||||||
this.updateTheme(this._themeService.getColorTheme());
|
this.updateTheme(this._themeService.getColorTheme());
|
||||||
|
|
||||||
jQuery(this._IPAddressInput).on('click', () => {
|
$(this._IPAddressInput).on(DOM.EventType.CLICK, () => {
|
||||||
this.onFirewallRuleOptionSelected(true);
|
this.onFirewallRuleOptionSelected(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
jQuery(this._subnetIPRangeInput).on('click', () => {
|
$(this._subnetIPRangeInput).on(DOM.EventType.CLICK, () => {
|
||||||
this.onFirewallRuleOptionSelected(false);
|
this.onFirewallRuleOptionSelected(false);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
|
|
||||||
import { ChangeDetectorRef, ElementRef, Component, forwardRef, Inject } from '@angular/core';
|
import { ChangeDetectorRef, ElementRef, Component, forwardRef, Inject } from '@angular/core';
|
||||||
import { NgForm } from '@angular/forms';
|
import { NgForm } from '@angular/forms';
|
||||||
import { IBootstrapService, BOOTSTRAP_SERVICE_ID } from 'sql/services/bootstrap/bootstrapService';
|
|
||||||
import { TaskDialogComponentParams } from 'sql/services/bootstrap/bootstrapParams';
|
import { ITaskDialogComponentParams } from 'sql/services/bootstrap/bootstrapParams';
|
||||||
import { ConnectionManagementInfo } from 'sql/parts/connection/common/connectionManagementInfo';
|
import { ConnectionManagementInfo } from 'sql/parts/connection/common/connectionManagementInfo';
|
||||||
import { IAdminService } from 'sql/parts/admin/common/adminService';
|
import { IAdminService } from 'sql/parts/admin/common/adminService';
|
||||||
import { ITaskDialogComponent } from 'sql/parts/tasks/common/tasks';
|
import { ITaskDialogComponent } from 'sql/parts/tasks/common/tasks';
|
||||||
@@ -31,8 +31,6 @@ export interface DatabaseFile {
|
|||||||
})
|
})
|
||||||
export class CreateDatabaseComponent implements ITaskDialogComponent {
|
export class CreateDatabaseComponent implements ITaskDialogComponent {
|
||||||
|
|
||||||
private _adminService: IAdminService;
|
|
||||||
|
|
||||||
public formSubmitted: boolean = false;
|
public formSubmitted: boolean = false;
|
||||||
|
|
||||||
public ownerUri: string;
|
public ownerUri: string;
|
||||||
@@ -49,9 +47,8 @@ export class CreateDatabaseComponent implements ITaskDialogComponent {
|
|||||||
constructor(
|
constructor(
|
||||||
@Inject(forwardRef(() => ElementRef)) private _el: ElementRef,
|
@Inject(forwardRef(() => ElementRef)) private _el: ElementRef,
|
||||||
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeDetectorRef: ChangeDetectorRef,
|
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeDetectorRef: ChangeDetectorRef,
|
||||||
@Inject(BOOTSTRAP_SERVICE_ID) private _bootstrapService: IBootstrapService
|
@Inject(IAdminService) private _adminService: IAdminService
|
||||||
) {
|
) {
|
||||||
this._adminService = this._bootstrapService.adminService;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private getDatabaseInfo(form: NgForm): sqlops.DatabaseInfo {
|
private getDatabaseInfo(form: NgForm): sqlops.DatabaseInfo {
|
||||||
@@ -77,7 +74,7 @@ export class CreateDatabaseComponent implements ITaskDialogComponent {
|
|||||||
|
|
||||||
public onSelectOwner(): void { }
|
public onSelectOwner(): void { }
|
||||||
|
|
||||||
public injectBootstapper(parameters: TaskDialogComponentParams): void {
|
public injectBootstapper(parameters: ITaskDialogComponentParams): void {
|
||||||
let self = this;
|
let self = this;
|
||||||
this.ownerUri = parameters.ownerUri;
|
this.ownerUri = parameters.ownerUri;
|
||||||
this._adminService.getDefaultDatabaseInfo(this.ownerUri).then(dbInfo => {
|
this._adminService.getDefaultDatabaseInfo(this.ownerUri).then(dbInfo => {
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
import { ElementRef, Component, Inject, forwardRef } from '@angular/core';
|
import { ElementRef, Component, Inject, forwardRef } from '@angular/core';
|
||||||
import { IBootstrapService, BOOTSTRAP_SERVICE_ID } from 'sql/services/bootstrap/bootstrapService';
|
import { IBootstrapParams } from 'sql/services/bootstrap/bootstrapService';
|
||||||
import { DashboardComponentParams } from 'sql/services/bootstrap/bootstrapParams';
|
import { IDashboardComponentParams } from 'sql/services/bootstrap/bootstrapParams';
|
||||||
import { ConnectionManagementInfo } from 'sql/parts/connection/common/connectionManagementInfo';
|
import { ConnectionManagementInfo } from 'sql/parts/connection/common/connectionManagementInfo';
|
||||||
|
|
||||||
export const CREATELOGIN_SELECTOR: string = 'createlogin-component';
|
export const CREATELOGIN_SELECTOR: string = 'createlogin-component';
|
||||||
@@ -22,9 +22,7 @@ export class CreateLoginComponent {
|
|||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(forwardRef(() => ElementRef)) private _el: ElementRef,
|
@Inject(forwardRef(() => ElementRef)) private _el: ElementRef,
|
||||||
@Inject(BOOTSTRAP_SERVICE_ID) private _bootstrapService: IBootstrapService
|
@Inject(IBootstrapParams) private _params: IDashboardComponentParams
|
||||||
) {
|
) {
|
||||||
let parameters: DashboardComponentParams = this._bootstrapService.getBootstrapParams(this._el.nativeElement.tagName);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,37 +3,43 @@
|
|||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
import { NgModule, Inject, forwardRef, ApplicationRef, ComponentFactoryResolver } from '@angular/core';
|
import { NgModule, Inject, forwardRef, ApplicationRef, ComponentFactoryResolver, Type } from '@angular/core';
|
||||||
import { APP_BASE_HREF, CommonModule } from '@angular/common';
|
import { APP_BASE_HREF, CommonModule } from '@angular/common';
|
||||||
import { BrowserModule } from '@angular/platform-browser';
|
import { BrowserModule } from '@angular/platform-browser';
|
||||||
import { IBootstrapService, BOOTSTRAP_SERVICE_ID } from 'sql/services/bootstrap/bootstrapService';
|
import { IBootstrapParams } from 'sql/services/bootstrap/bootstrapService';
|
||||||
|
|
||||||
import { CreateLoginComponent, CREATELOGIN_SELECTOR } from 'sql/parts/admin/security/createLogin.component';
|
import { CreateLoginComponent, CREATELOGIN_SELECTOR } from 'sql/parts/admin/security/createLogin.component';
|
||||||
|
|
||||||
// Connection Dashboard main angular module
|
// Connection Dashboard main angular module
|
||||||
@NgModule({
|
export const CreateLoginModule = (params: IBootstrapParams, selector: string): Type<any> => {
|
||||||
declarations: [
|
|
||||||
CreateLoginComponent
|
|
||||||
],
|
|
||||||
entryComponents: [CreateLoginComponent],
|
|
||||||
imports: [
|
|
||||||
CommonModule,
|
|
||||||
BrowserModule
|
|
||||||
],
|
|
||||||
providers: [{ provide: APP_BASE_HREF, useValue: '/' }]
|
|
||||||
})
|
|
||||||
export class CreateLoginModule {
|
|
||||||
|
|
||||||
constructor(
|
@NgModule({
|
||||||
@Inject(forwardRef(() => ComponentFactoryResolver)) private _resolver: ComponentFactoryResolver,
|
declarations: [
|
||||||
@Inject(BOOTSTRAP_SERVICE_ID) private _bootstrapService: IBootstrapService
|
CreateLoginComponent
|
||||||
) {
|
],
|
||||||
|
entryComponents: [CreateLoginComponent],
|
||||||
|
imports: [
|
||||||
|
CommonModule,
|
||||||
|
BrowserModule
|
||||||
|
],
|
||||||
|
providers: [
|
||||||
|
{ provide: APP_BASE_HREF, useValue: '/' },
|
||||||
|
{ provide: IBootstrapParams, useValue: params }
|
||||||
|
]
|
||||||
|
})
|
||||||
|
class ModuleClass {
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
@Inject(forwardRef(() => ComponentFactoryResolver)) private _resolver: ComponentFactoryResolver
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
ngDoBootstrap(appRef: ApplicationRef) {
|
||||||
|
const factory = this._resolver.resolveComponentFactory(CreateLoginComponent);
|
||||||
|
(<any>factory).factory.selector = selector;
|
||||||
|
appRef.bootstrap(factory);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ngDoBootstrap(appRef: ApplicationRef) {
|
return ModuleClass;
|
||||||
const factory = this._resolver.resolveComponentFactory(CreateLoginComponent);
|
};
|
||||||
const uniqueSelector: string = this._bootstrapService.getUniqueSelector(CREATELOGIN_SELECTOR);
|
|
||||||
(<any>factory).factory.selector = uniqueSelector;
|
|
||||||
appRef.bootstrap(factory);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -17,8 +17,7 @@ import { IConnectionManagementService } from 'sql/parts/connection/common/connec
|
|||||||
import { IMetadataService } from 'sql/services/metadata/metadataService';
|
import { IMetadataService } from 'sql/services/metadata/metadataService';
|
||||||
import { IScriptingService } from 'sql/services/scripting/scriptingService';
|
import { IScriptingService } from 'sql/services/scripting/scriptingService';
|
||||||
import { IQueryEditorService } from 'sql/parts/query/common/queryEditorService';
|
import { IQueryEditorService } from 'sql/parts/query/common/queryEditorService';
|
||||||
import { IBootstrapService } from 'sql/services/bootstrap/bootstrapService';
|
import { bootstrapAngular, IBootstrapParams } from 'sql/services/bootstrap/bootstrapService';
|
||||||
import { BootstrapParams } from 'sql/services/bootstrap/bootstrapParams';
|
|
||||||
import { CREATELOGIN_SELECTOR } from 'sql/parts/admin/security/createLogin.component';
|
import { CREATELOGIN_SELECTOR } from 'sql/parts/admin/security/createLogin.component';
|
||||||
|
|
||||||
export class CreateLoginEditor extends BaseEditor {
|
export class CreateLoginEditor extends BaseEditor {
|
||||||
@@ -32,8 +31,7 @@ export class CreateLoginEditor extends BaseEditor {
|
|||||||
@IConnectionManagementService private _connectionService: IConnectionManagementService,
|
@IConnectionManagementService private _connectionService: IConnectionManagementService,
|
||||||
@IMetadataService private _metadataService: IMetadataService,
|
@IMetadataService private _metadataService: IMetadataService,
|
||||||
@IScriptingService private _scriptingService: IScriptingService,
|
@IScriptingService private _scriptingService: IScriptingService,
|
||||||
@IQueryEditorService private _queryEditorService: IQueryEditorService,
|
@IQueryEditorService private _queryEditorService: IQueryEditorService
|
||||||
@IBootstrapService private _bootstrapService: IBootstrapService
|
|
||||||
) {
|
) {
|
||||||
super(CreateLoginEditor.ID, telemetryService, themeService);
|
super(CreateLoginEditor.ID, telemetryService, themeService);
|
||||||
}
|
}
|
||||||
@@ -96,11 +94,11 @@ export class CreateLoginEditor extends BaseEditor {
|
|||||||
private bootstrapAngular(input: CreateLoginInput): void {
|
private bootstrapAngular(input: CreateLoginInput): void {
|
||||||
|
|
||||||
// Get the bootstrap params and perform the bootstrap
|
// Get the bootstrap params and perform the bootstrap
|
||||||
let params: BootstrapParams = {
|
let params: IBootstrapParams = {
|
||||||
connection: input.getConnectionProfile(),
|
connection: input.getConnectionProfile(),
|
||||||
ownerUri: input.getUri()
|
ownerUri: input.getUri()
|
||||||
};
|
};
|
||||||
let uniqueSelector = this._bootstrapService.bootstrap(
|
let uniqueSelector = this.instantiationService.invokeFunction(bootstrapAngular,
|
||||||
CreateLoginModule,
|
CreateLoginModule,
|
||||||
this.getContainer().getHTMLElement(),
|
this.getContainer().getHTMLElement(),
|
||||||
CREATELOGIN_SELECTOR,
|
CREATELOGIN_SELECTOR,
|
||||||
|
|||||||
@@ -5,8 +5,10 @@
|
|||||||
import * as types from 'vs/base/common/types';
|
import * as types from 'vs/base/common/types';
|
||||||
import { generateUuid } from 'vs/base/common/uuid';
|
import { generateUuid } from 'vs/base/common/uuid';
|
||||||
import { Registry } from 'vs/platform/registry/common/platform';
|
import { Registry } from 'vs/platform/registry/common/platform';
|
||||||
import { error } from 'sql/base/common/log';
|
|
||||||
import * as nls from 'vs/nls';
|
import * as nls from 'vs/nls';
|
||||||
|
import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||||
|
|
||||||
|
import { error } from 'sql/base/common/log';
|
||||||
import { WidgetConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
import { WidgetConfig } 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 { ConnectionManagementInfo } from 'sql/parts/connection/common/connectionManagementInfo';
|
import { ConnectionManagementInfo } from 'sql/parts/connection/common/connectionManagementInfo';
|
||||||
@@ -19,7 +21,7 @@ import { CONTROLHOST_CONTAINER } from 'sql/parts/dashboard/containers/dashboardC
|
|||||||
import { NAV_SECTION } from 'sql/parts/dashboard/containers/dashboardNavSection.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 { IDashboardContainerRegistry, Extensions as DashboardContainerExtensions, IDashboardContainer, registerContainerType } from 'sql/platform/dashboard/common/dashboardContainerRegistry';
|
||||||
import { IDashboardTab } from 'sql/platform/dashboard/common/dashboardRegistry';
|
import { IDashboardTab } from 'sql/platform/dashboard/common/dashboardRegistry';
|
||||||
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
|
import { SingleConnectionManagementService } from 'sql/services/common/commonServiceInterface.service';
|
||||||
|
|
||||||
const dashboardcontainerRegistry = Registry.as<IDashboardContainerRegistry>(DashboardContainerExtensions.dashboardContainerContributions);
|
const dashboardcontainerRegistry = Registry.as<IDashboardContainerRegistry>(DashboardContainerExtensions.dashboardContainerContributions);
|
||||||
const containerTypes = [
|
const containerTypes = [
|
||||||
@@ -118,8 +120,8 @@ export function initExtensionConfigs(configurations: WidgetConfig[]): Array<Widg
|
|||||||
* Add provider to the passed widgets and returns the new widgets
|
* Add provider to the passed widgets and returns the new widgets
|
||||||
* @param widgets Array of widgets to add provider onto
|
* @param widgets Array of widgets to add provider onto
|
||||||
*/
|
*/
|
||||||
export function addProvider(config: WidgetConfig[], dashboardService: DashboardServiceInterface): Array<WidgetConfig> {
|
export function addProvider<T extends { connectionManagementService: SingleConnectionManagementService }>(config: WidgetConfig[], collection: T): Array<WidgetConfig> {
|
||||||
let provider = dashboardService.connectionManagementService.connectionInfo.providerId;
|
let provider = collection.connectionManagementService.connectionInfo.providerId;
|
||||||
return config.map((item) => {
|
return config.map((item) => {
|
||||||
if (item.provider === undefined) {
|
if (item.provider === undefined) {
|
||||||
item.provider = provider;
|
item.provider = provider;
|
||||||
@@ -132,8 +134,8 @@ export function addProvider(config: WidgetConfig[], dashboardService: DashboardS
|
|||||||
* Adds the edition to the passed widgets and returns the new widgets
|
* Adds the edition to the passed widgets and returns the new widgets
|
||||||
* @param widgets Array of widgets to add edition onto
|
* @param widgets Array of widgets to add edition onto
|
||||||
*/
|
*/
|
||||||
export function addEdition(config: WidgetConfig[], dashboardService: DashboardServiceInterface): Array<WidgetConfig> {
|
export function addEdition<T extends { connectionManagementService: SingleConnectionManagementService }>(config: WidgetConfig[], collection: DashboardServiceInterface): Array<WidgetConfig> {
|
||||||
let connectionInfo: ConnectionManagementInfo = dashboardService.connectionManagementService.connectionInfo;
|
let connectionInfo: ConnectionManagementInfo = collection.connectionManagementService.connectionInfo;
|
||||||
let edition = connectionInfo.serverInfo.engineEditionId;
|
let edition = connectionInfo.serverInfo.engineEditionId;
|
||||||
return config.map((item) => {
|
return config.map((item) => {
|
||||||
if (item.edition === undefined) {
|
if (item.edition === undefined) {
|
||||||
@@ -147,7 +149,7 @@ export function addEdition(config: WidgetConfig[], dashboardService: DashboardSe
|
|||||||
* Adds the context to the passed widgets and returns the new widgets
|
* Adds the context to the passed widgets and returns the new widgets
|
||||||
* @param widgets Array of widgets to add context to
|
* @param widgets Array of widgets to add context to
|
||||||
*/
|
*/
|
||||||
export function addContext(config: WidgetConfig[], dashboardServer: DashboardServiceInterface, context: string): Array<WidgetConfig> {
|
export function addContext(config: WidgetConfig[], collection: any, context: string): Array<WidgetConfig> {
|
||||||
return config.map((item) => {
|
return config.map((item) => {
|
||||||
if (item.context === undefined) {
|
if (item.context === undefined) {
|
||||||
item.context = context;
|
item.context = context;
|
||||||
@@ -160,12 +162,12 @@ export function addContext(config: WidgetConfig[], dashboardServer: DashboardSer
|
|||||||
* Returns a filtered version of the widgets passed based on edition and provider
|
* Returns a filtered version of the widgets passed based on edition and provider
|
||||||
* @param config widgets to filter
|
* @param config widgets to filter
|
||||||
*/
|
*/
|
||||||
export function filterConfigs<T extends { when?: string }>(config: T[], dashboardService: DashboardServiceInterface): Array<T> {
|
export function filterConfigs<T extends { when?: string }, K extends { contextKeyService: IContextKeyService }>(config: T[], collection: K): Array<T> {
|
||||||
return config.filter((item) => {
|
return config.filter((item) => {
|
||||||
if (!item.when) {
|
if (!item.when) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return dashboardService.contextKeyService.contextMatchesRules(ContextKeyExpr.deserialize(item.when));
|
return collection.contextKeyService.contextMatchesRules(ContextKeyExpr.deserialize(item.when));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,23 +6,25 @@
|
|||||||
-->
|
-->
|
||||||
<panel class="dashboard-panel" (onTabChange)="handleTabChange($event)" (onTabClose)="handleTabClose($event)" [actions]="panelActions">
|
<panel class="dashboard-panel" (onTabChange)="handleTabChange($event)" (onTabClose)="handleTabClose($event)" [actions]="panelActions">
|
||||||
<tab [visibilityType]="'visibility'" *ngFor="let tab of tabs" [title]="tab.title" class="fullsize" [identifier]="tab.id" [canClose]="tab.canClose" [actions]="tab.actions">
|
<tab [visibilityType]="'visibility'" *ngFor="let tab of tabs" [title]="tab.title" class="fullsize" [identifier]="tab.id" [canClose]="tab.canClose" [actions]="tab.actions">
|
||||||
<dashboard-home-container *ngIf="tab.id === 'homeTab'; else not_home" [properties]="propertiesWidget" [tab]="tab">
|
<ng-template>
|
||||||
</dashboard-home-container>
|
<dashboard-home-container *ngIf="tab.id === 'homeTab'; else not_home" [properties]="propertiesWidget" [tab]="tab">
|
||||||
<ng-template #not_home>
|
</dashboard-home-container>
|
||||||
<dashboard-webview-container *ngIf="getContentType(tab) === 'webview-container'" [tab]="tab">
|
<ng-template #not_home>
|
||||||
</dashboard-webview-container>
|
<dashboard-webview-container *ngIf="getContentType(tab) === 'webview-container'" [tab]="tab">
|
||||||
<dashboard-widget-container *ngIf="getContentType(tab) === 'widgets-container'" [tab]="tab">
|
</dashboard-webview-container>
|
||||||
</dashboard-widget-container>
|
<dashboard-widget-container *ngIf="getContentType(tab) === 'widgets-container'" [tab]="tab">
|
||||||
<dashboard-modelview-container *ngIf="getContentType(tab) === 'modelview-container'" [tab]="tab">
|
</dashboard-widget-container>
|
||||||
</dashboard-modelview-container>
|
<dashboard-modelview-container *ngIf="getContentType(tab) === 'modelview-container'" [tab]="tab">
|
||||||
<dashboard-controlhost-container *ngIf="getContentType(tab) === 'controlhost-container'" [tab]="tab">
|
</dashboard-modelview-container>
|
||||||
</dashboard-controlhost-container>
|
<dashboard-controlhost-container *ngIf="getContentType(tab) === 'controlhost-container'" [tab]="tab">
|
||||||
<dashboard-nav-section *ngIf="getContentType(tab) === 'nav-section'" [tab]="tab">
|
</dashboard-controlhost-container>
|
||||||
</dashboard-nav-section>
|
<dashboard-nav-section *ngIf="getContentType(tab) === 'nav-section'" [tab]="tab">
|
||||||
<dashboard-grid-container *ngIf="getContentType(tab) === 'grid-container'" [tab]="tab">
|
</dashboard-nav-section>
|
||||||
</dashboard-grid-container>
|
<dashboard-grid-container *ngIf="getContentType(tab) === 'grid-container'" [tab]="tab">
|
||||||
<dashboard-error-container *ngIf="getContentType(tab) === 'error-container'" [tab]="tab">
|
</dashboard-grid-container>
|
||||||
</dashboard-error-container>
|
<dashboard-error-container *ngIf="getContentType(tab) === 'error-container'" [tab]="tab">
|
||||||
|
</dashboard-error-container>
|
||||||
|
</ng-template>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
</tab>
|
</tab>
|
||||||
</panel>
|
</panel>
|
||||||
|
|||||||
@@ -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 { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
import { CommonServiceInterface, SingleConnectionManagementService } from 'sql/services/common/commonServiceInterface.service';
|
||||||
import { WidgetConfig, TabConfig, TabSettingConfig } 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';
|
||||||
@@ -17,9 +17,8 @@ import { IPropertiesConfig } from 'sql/parts/dashboard/pages/serverDashboardPage
|
|||||||
import { PanelComponent } from 'sql/base/browser/ui/panel/panel.component';
|
import { PanelComponent } from 'sql/base/browser/ui/panel/panel.component';
|
||||||
import { IDashboardRegistry, Extensions as DashboardExtensions, IDashboardTab } from 'sql/platform/dashboard/common/dashboardRegistry';
|
import { IDashboardRegistry, Extensions as DashboardExtensions, IDashboardTab } from 'sql/platform/dashboard/common/dashboardRegistry';
|
||||||
import { PinUnpinTabAction, AddFeatureTabAction } from './actions';
|
import { PinUnpinTabAction, AddFeatureTabAction } from './actions';
|
||||||
import { TabComponent } from 'sql/base/browser/ui/panel/tab.component';
|
import { TabComponent, TabChild } from 'sql/base/browser/ui/panel/tab.component';
|
||||||
import { IBootstrapService, BOOTSTRAP_SERVICE_ID } from 'sql/services/bootstrap/bootstrapService';
|
import { AngularEventType, IAngularEventingService } from 'sql/services/angularEventing/angularEventingService';
|
||||||
import { AngularEventType } from 'sql/services/angularEventing/angularEventingService';
|
|
||||||
import { DashboardTab } from 'sql/parts/dashboard/common/interfaces';
|
import { DashboardTab } from 'sql/parts/dashboard/common/interfaces';
|
||||||
import * as dashboardHelper from 'sql/parts/dashboard/common/dashboardHelper';
|
import * as dashboardHelper from 'sql/parts/dashboard/common/dashboardHelper';
|
||||||
import { WIDGETS_CONTAINER } from 'sql/parts/dashboard/containers/dashboardWidgetContainer.contribution';
|
import { WIDGETS_CONTAINER } from 'sql/parts/dashboard/containers/dashboardWidgetContainer.contribution';
|
||||||
@@ -40,9 +39,16 @@ import Event, { Emitter } from 'vs/base/common/event';
|
|||||||
import { Action } from 'vs/base/common/actions';
|
import { Action } from 'vs/base/common/actions';
|
||||||
import { ConfigurationTarget } from 'vs/platform/configuration/common/configuration';
|
import { ConfigurationTarget } from 'vs/platform/configuration/common/configuration';
|
||||||
import Severity from 'vs/base/common/severity';
|
import Severity from 'vs/base/common/severity';
|
||||||
|
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||||
|
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||||
|
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||||
|
|
||||||
const dashboardRegistry = Registry.as<IDashboardRegistry>(DashboardExtensions.DashboardContributions);
|
const dashboardRegistry = Registry.as<IDashboardRegistry>(DashboardExtensions.DashboardContributions);
|
||||||
|
|
||||||
|
interface IConfigModifierCollection {
|
||||||
|
connectionManagementService: SingleConnectionManagementService;
|
||||||
|
contextKeyService: IContextKeyService;
|
||||||
|
}
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'dashboard-page',
|
selector: 'dashboard-page',
|
||||||
@@ -61,7 +67,7 @@ export abstract class DashboardPage extends AngularDisposable {
|
|||||||
private _tabsDispose: Array<IDisposable> = [];
|
private _tabsDispose: Array<IDisposable> = [];
|
||||||
private _tabSettingConfigs: Array<TabSettingConfig> = [];
|
private _tabSettingConfigs: Array<TabSettingConfig> = [];
|
||||||
|
|
||||||
@ViewChildren(DashboardTab) private _tabs: QueryList<DashboardTab>;
|
@ViewChildren(TabChild) private _tabs: QueryList<DashboardTab>;
|
||||||
@ViewChild(PanelComponent) private _panel: PanelComponent;
|
@ViewChild(PanelComponent) private _panel: PanelComponent;
|
||||||
|
|
||||||
private _editEnabled = new Emitter<boolean>();
|
private _editEnabled = new Emitter<boolean>();
|
||||||
@@ -71,7 +77,7 @@ export abstract class DashboardPage extends AngularDisposable {
|
|||||||
private readonly homeTabTitle: string = nls.localize('home', 'Home');
|
private readonly homeTabTitle: string = nls.localize('home', 'Home');
|
||||||
|
|
||||||
// a set of config modifiers
|
// a set of config modifiers
|
||||||
private readonly _configModifiers: Array<(item: Array<WidgetConfig>, dashboardServer: DashboardServiceInterface, context: string) => Array<WidgetConfig>> = [
|
private readonly _configModifiers: Array<(item: Array<WidgetConfig>, collection: IConfigModifierCollection, context: string) => Array<WidgetConfig>> = [
|
||||||
dashboardHelper.removeEmpty,
|
dashboardHelper.removeEmpty,
|
||||||
dashboardHelper.initExtensionConfigs,
|
dashboardHelper.initExtensionConfigs,
|
||||||
dashboardHelper.addProvider,
|
dashboardHelper.addProvider,
|
||||||
@@ -80,27 +86,36 @@ export abstract class DashboardPage extends AngularDisposable {
|
|||||||
dashboardHelper.filterConfigs
|
dashboardHelper.filterConfigs
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public get connectionManagementService(): SingleConnectionManagementService {
|
||||||
|
return this.dashboardService.connectionManagementService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get contextKeyService(): IContextKeyService {
|
||||||
|
return this.dashboardService.scopedContextKeyService;
|
||||||
|
}
|
||||||
|
|
||||||
private readonly _gridModifiers: Array<(item: Array<WidgetConfig>, originalConfig: Array<WidgetConfig>) => Array<WidgetConfig>> = [
|
private readonly _gridModifiers: Array<(item: Array<WidgetConfig>, originalConfig: Array<WidgetConfig>) => Array<WidgetConfig>> = [
|
||||||
dashboardHelper.validateGridConfig
|
dashboardHelper.validateGridConfig
|
||||||
];
|
];
|
||||||
|
|
||||||
protected abstract propertiesWidget: WidgetConfig;
|
protected abstract propertiesWidget: WidgetConfig;
|
||||||
protected abstract get context(): string;
|
protected abstract get context(): string;
|
||||||
protected dashboardService: DashboardServiceInterface;
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(forwardRef(() => CommonServiceInterface)) protected commonService: CommonServiceInterface,
|
@Inject(forwardRef(() => CommonServiceInterface)) protected dashboardService: DashboardServiceInterface,
|
||||||
@Inject(forwardRef(() => ElementRef)) protected _el: ElementRef,
|
@Inject(forwardRef(() => ElementRef)) protected _el: ElementRef,
|
||||||
@Inject(forwardRef(() => ChangeDetectorRef)) protected _cd: ChangeDetectorRef
|
@Inject(forwardRef(() => ChangeDetectorRef)) protected _cd: ChangeDetectorRef,
|
||||||
|
@Inject(IInstantiationService) private instantiationService: IInstantiationService,
|
||||||
|
@Inject(INotificationService) private notificationService: INotificationService,
|
||||||
|
@Inject(IAngularEventingService) private angularEventingService: IAngularEventingService
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
this.dashboardService = commonService as DashboardServiceInterface;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected init() {
|
protected init() {
|
||||||
this.dashboardService.dashboardContextKey.set(this.context);
|
this.dashboardService.dashboardContextKey.set(this.context);
|
||||||
if (!this.dashboardService.connectionManagementService.connectionInfo) {
|
if (!this.dashboardService.connectionManagementService.connectionInfo) {
|
||||||
this.dashboardService.notificationService.notify({
|
this.notificationService.notify({
|
||||||
severity: Severity.Error,
|
severity: Severity.Error,
|
||||||
message: nls.localize('missingConnectionInfo', 'No connection information could be found for this dashboard')
|
message: nls.localize('missingConnectionInfo', 'No connection information could be found for this dashboard')
|
||||||
});
|
});
|
||||||
@@ -110,8 +125,8 @@ export abstract class DashboardPage extends AngularDisposable {
|
|||||||
this._originalConfig = objects.deepClone(tempWidgets);
|
this._originalConfig = objects.deepClone(tempWidgets);
|
||||||
let properties = this.getProperties();
|
let properties = this.getProperties();
|
||||||
this._configModifiers.forEach((cb) => {
|
this._configModifiers.forEach((cb) => {
|
||||||
tempWidgets = cb.apply(this, [tempWidgets, this.dashboardService, this.context]);
|
tempWidgets = cb.apply(this, [tempWidgets, this, this.context]);
|
||||||
properties = properties ? cb.apply(this, [properties, this.dashboardService, this.context]) : undefined;
|
properties = properties ? cb.apply(this, [properties, this, this.context]) : undefined;
|
||||||
});
|
});
|
||||||
this._gridModifiers.forEach(cb => {
|
this._gridModifiers.forEach(cb => {
|
||||||
tempWidgets = cb.apply(this, [tempWidgets, this._originalConfig]);
|
tempWidgets = cb.apply(this, [tempWidgets, this._originalConfig]);
|
||||||
@@ -142,9 +157,8 @@ export abstract class DashboardPage extends AngularDisposable {
|
|||||||
actions: []
|
actions: []
|
||||||
};
|
};
|
||||||
this.addNewTab(homeTab);
|
this.addNewTab(homeTab);
|
||||||
this._panel.selectTab(homeTab.id);
|
|
||||||
|
|
||||||
let allTabs = dashboardHelper.filterConfigs(dashboardRegistry.tabs, this.dashboardService);
|
let allTabs = dashboardHelper.filterConfigs(dashboardRegistry.tabs, this);
|
||||||
|
|
||||||
// Load tab setting configs
|
// Load tab setting configs
|
||||||
this._tabSettingConfigs = this.dashboardService.getSettings<Array<TabSettingConfig>>([this.context, 'tabs'].join('.'));
|
this._tabSettingConfigs = this.dashboardService.getSettings<Array<TabSettingConfig>>([this.context, 'tabs'].join('.'));
|
||||||
@@ -172,7 +186,7 @@ export abstract class DashboardPage extends AngularDisposable {
|
|||||||
|
|
||||||
// Set panel actions
|
// Set panel actions
|
||||||
let openedTabs = [...pinnedDashboardTabs, ...alwaysShowTabs];
|
let openedTabs = [...pinnedDashboardTabs, ...alwaysShowTabs];
|
||||||
let addNewTabAction = this.dashboardService.instantiationService.createInstance(AddFeatureTabAction, allTabs, openedTabs, this.dashboardService.getUnderlyingUri());
|
let addNewTabAction = this.instantiationService.createInstance(AddFeatureTabAction, allTabs, openedTabs, this.dashboardService.getUnderlyingUri());
|
||||||
this._tabsDispose.push(addNewTabAction);
|
this._tabsDispose.push(addNewTabAction);
|
||||||
this.panelActions = [addNewTabAction];
|
this.panelActions = [addNewTabAction];
|
||||||
this._cd.detectChanges();
|
this._cd.detectChanges();
|
||||||
@@ -233,7 +247,7 @@ export abstract class DashboardPage extends AngularDisposable {
|
|||||||
} else if (v.alwaysShow) {
|
} else if (v.alwaysShow) {
|
||||||
isPinned = true;
|
isPinned = true;
|
||||||
}
|
}
|
||||||
actions.push(this.dashboardService.instantiationService.createInstance(PinUnpinTabAction, v.id, this.dashboardService.getUnderlyingUri(), isPinned));
|
actions.push(this.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;
|
||||||
@@ -254,7 +268,6 @@ export abstract class DashboardPage extends AngularDisposable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private getContentType(tab: TabConfig): string {
|
private getContentType(tab: TabConfig): string {
|
||||||
return tab.container ? Object.keys(tab.container)[0] : '';
|
return tab.container ? Object.keys(tab.container)[0] : '';
|
||||||
}
|
}
|
||||||
@@ -310,16 +323,15 @@ export abstract class DashboardPage extends AngularDisposable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public handleTabChange(tab: TabComponent): void {
|
public handleTabChange(tab: TabComponent): void {
|
||||||
|
this._cd.detectChanges();
|
||||||
let localtab = this._tabs.find(i => i.id === tab.identifier);
|
let localtab = this._tabs.find(i => i.id === tab.identifier);
|
||||||
this._editEnabled.fire(localtab.editable);
|
this._editEnabled.fire(localtab.editable);
|
||||||
this._cd.detectChanges();
|
this._cd.detectChanges();
|
||||||
localtab.layout();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public handleTabClose(tab: TabComponent): void {
|
public handleTabClose(tab: TabComponent): void {
|
||||||
let index = this.tabs.findIndex(i => i.id === tab.identifier);
|
let index = this.tabs.findIndex(i => i.id === tab.identifier);
|
||||||
this.tabs.splice(index, 1);
|
this.tabs.splice(index, 1);
|
||||||
this._cd.detectChanges();
|
this.angularEventingService.sendAngularEvent(this.dashboardService.getUnderlyingUri(), AngularEventType.CLOSE_TAB, { id: tab.identifier });
|
||||||
this.dashboardService.angularEventingService.sendAngularEvent(this.dashboardService.getUnderlyingUri(), AngularEventType.CLOSE_TAB, { id: tab.identifier });
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,22 +15,22 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
|
|||||||
const tabActiveForeground = theme.getColor(TAB_ACTIVE_FOREGROUND);
|
const tabActiveForeground = theme.getColor(TAB_ACTIVE_FOREGROUND);
|
||||||
if (tabActiveBackground || tabActiveForeground) {
|
if (tabActiveBackground || tabActiveForeground) {
|
||||||
collector.addRule(`
|
collector.addRule(`
|
||||||
panel.dashboard-panel > .tabbedPanel > .title > .monaco-scrollable-element > .tabList .tab:hover .tabLabel,
|
panel.dashboard-panel > .tabbedPanel > .title .tabList .tab:hover .tabLabel,
|
||||||
panel.dashboard-panel > .tabbedPanel > .title > .monaco-scrollable-element > .tabList .tab .tabLabel.active {
|
panel.dashboard-panel > .tabbedPanel > .title .tabList .tab .tabLabel.active {
|
||||||
color: ${tabActiveForeground};
|
color: ${tabActiveForeground};
|
||||||
border-bottom: 0px solid;
|
border-bottom: 0px solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
panel.dashboard-panel > .tabbedPanel > .title > .monaco-scrollable-element > .tabList .tab-header.active {
|
panel.dashboard-panel > .tabbedPanel > .title .tabList .tab-header.active {
|
||||||
background-color: ${tabActiveBackground};
|
background-color: ${tabActiveBackground};
|
||||||
outline-color: ${tabActiveBackground};
|
outline-color: ${tabActiveBackground};
|
||||||
}
|
}
|
||||||
|
|
||||||
panel.dashboard-panel > .tabbedPanel.horizontal > .title > .monaco-scrollable-element > .tabList .tab-header.active {
|
panel.dashboard-panel > .tabbedPanel.horizontal > .title .tabList .tab-header.active {
|
||||||
border-bottom-color: transparent;
|
border-bottom-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
panel.dashboard-panel > .tabbedPanel.vertical > .title > .monaco-scrollable-element > .tabList .tab-header.active {
|
panel.dashboard-panel > .tabbedPanel.vertical > .title .tabList .tab-header.active {
|
||||||
border-right-color: transparent;
|
border-right-color: transparent;
|
||||||
}
|
}
|
||||||
`);
|
`);
|
||||||
@@ -39,7 +39,7 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
|
|||||||
const activeTabBorderColor = theme.getColor(TAB_ACTIVE_BORDER);
|
const activeTabBorderColor = theme.getColor(TAB_ACTIVE_BORDER);
|
||||||
if (activeTabBorderColor) {
|
if (activeTabBorderColor) {
|
||||||
collector.addRule(`
|
collector.addRule(`
|
||||||
panel.dashboard-panel > .tabbedPanel > .title > .monaco-scrollable-element > .tabList .tab-header.active {
|
panel.dashboard-panel > .tabbedPanel > .title .tabList .tab-header.active {
|
||||||
box-shadow: ${activeTabBorderColor} 0 -1px inset;
|
box-shadow: ${activeTabBorderColor} 0 -1px inset;
|
||||||
}
|
}
|
||||||
`);
|
`);
|
||||||
@@ -50,11 +50,11 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
|
|||||||
const tabInactiveForeground = theme.getColor(TAB_INACTIVE_FOREGROUND);
|
const tabInactiveForeground = theme.getColor(TAB_INACTIVE_FOREGROUND);
|
||||||
if (tabInactiveBackground || tabInactiveForeground) {
|
if (tabInactiveBackground || tabInactiveForeground) {
|
||||||
collector.addRule(`
|
collector.addRule(`
|
||||||
panel.dashboard-panel > .tabbedPanel > .title > .monaco-scrollable-element > .tabList .tab .tabLabel {
|
panel.dashboard-panel > .tabbedPanel > .title .tabList .tab .tabLabel {
|
||||||
color: ${tabInactiveForeground};
|
color: ${tabInactiveForeground};
|
||||||
}
|
}
|
||||||
|
|
||||||
panel.dashboard-panel > .tabbedPanel > .title > .monaco-scrollable-element > .tabList .tab-header {
|
panel.dashboard-panel > .tabbedPanel > .title .tabList .tab-header {
|
||||||
background-color: ${tabInactiveBackground};
|
background-color: ${tabInactiveBackground};
|
||||||
}
|
}
|
||||||
`);
|
`);
|
||||||
@@ -71,12 +71,12 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Panel title background
|
// Panel title background
|
||||||
const tabBoarder = theme.getColor(TAB_BORDER);
|
const tabBorder = theme.getColor(TAB_BORDER);
|
||||||
if (tabBoarder) {
|
if (tabBorder) {
|
||||||
collector.addRule(`
|
collector.addRule(`
|
||||||
panel.dashboard-panel > .tabbedPanel > .title > .monaco-scrollable-element > .tabList .tab-header {
|
panel.dashboard-panel > .tabbedPanel > .title .tabList .tab-header {
|
||||||
border-right-color: ${tabBoarder};
|
border-right-color: ${tabBorder};
|
||||||
border-bottom-color: ${tabBoarder};
|
border-bottom-color: ${tabBorder};
|
||||||
}
|
}
|
||||||
`);
|
`);
|
||||||
}
|
}
|
||||||
@@ -86,13 +86,13 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
|
|||||||
if (outline) {
|
if (outline) {
|
||||||
collector.addRule(`
|
collector.addRule(`
|
||||||
panel.dashboard-panel > .tabbedPanel > .title {
|
panel.dashboard-panel > .tabbedPanel > .title {
|
||||||
border-bottom-color: ${tabBoarder};
|
border-bottom-color: ${tabBorder};
|
||||||
border-bottom-width: 1px;
|
border-bottom-width: 1px;
|
||||||
border-bottom-style: solid;
|
border-bottom-style: solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
panel.dashboard-panel > .tabbedPanel.vertical > .title {
|
panel.dashboard-panel > .tabbedPanel.vertical > .title {
|
||||||
border-right-color: ${tabBoarder};
|
border-right-color: ${tabBorder};
|
||||||
border-right-width: 1px;
|
border-right-width: 1px;
|
||||||
border-right-style: solid;
|
border-right-style: solid;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,13 @@
|
|||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
import { OnDestroy } from '@angular/core';
|
||||||
|
|
||||||
import Event from 'vs/base/common/event';
|
import Event from 'vs/base/common/event';
|
||||||
|
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
|
||||||
|
|
||||||
import { AngularDisposable } from 'sql/base/common/lifecycle';
|
import { AngularDisposable } from 'sql/base/common/lifecycle';
|
||||||
|
import { TabChild } from 'sql/base/browser/ui/panel/tab.component';
|
||||||
|
|
||||||
export enum Conditional {
|
export enum Conditional {
|
||||||
'equals',
|
'equals',
|
||||||
@@ -17,7 +21,7 @@ export enum Conditional {
|
|||||||
'always'
|
'always'
|
||||||
}
|
}
|
||||||
|
|
||||||
export abstract class DashboardTab extends AngularDisposable {
|
export abstract class DashboardTab extends TabChild implements OnDestroy {
|
||||||
public abstract layout(): void;
|
public abstract layout(): void;
|
||||||
public abstract readonly id: string;
|
public abstract readonly id: string;
|
||||||
public abstract readonly editable: boolean;
|
public abstract readonly editable: boolean;
|
||||||
@@ -26,4 +30,23 @@ export abstract class DashboardTab extends AngularDisposable {
|
|||||||
public enableEdit(): void {
|
public enableEdit(): void {
|
||||||
// no op
|
// no op
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private _toDispose: IDisposable[] = [];
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public dispose(): void {
|
||||||
|
this._toDispose = dispose(this._toDispose);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected _register<T extends IDisposable>(t: T): T {
|
||||||
|
this._toDispose.push(t);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnDestroy() {
|
||||||
|
this.dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,14 +5,17 @@
|
|||||||
import 'vs/css!./dashboardControlHostContainer';
|
import 'vs/css!./dashboardControlHostContainer';
|
||||||
|
|
||||||
import { Component, forwardRef, Input, AfterContentInit, ViewChild, OnChanges } from '@angular/core';
|
import { Component, forwardRef, Input, AfterContentInit, ViewChild, OnChanges } from '@angular/core';
|
||||||
|
|
||||||
import Event, { Emitter } from 'vs/base/common/event';
|
import Event, { Emitter } from 'vs/base/common/event';
|
||||||
|
|
||||||
import { DashboardTab } from 'sql/parts/dashboard/common/interfaces';
|
import { DashboardTab } from 'sql/parts/dashboard/common/interfaces';
|
||||||
import { TabConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
import { TabConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
||||||
import { ControlHostContent } from 'sql/parts/dashboard/contents/controlHostContent.component';
|
import { ControlHostContent } from 'sql/parts/dashboard/contents/controlHostContent.component';
|
||||||
|
import { TabChild } from 'sql/base/browser/ui/panel/tab.component';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'dashboard-controlhost-container',
|
selector: 'dashboard-controlhost-container',
|
||||||
providers: [{ provide: DashboardTab, useExisting: forwardRef(() => DashboardControlHostContainer) }],
|
providers: [{ provide: TabChild, useExisting: forwardRef(() => DashboardControlHostContainer) }],
|
||||||
template: `
|
template: `
|
||||||
<controlhost-content [webviewId]="tab.id">
|
<controlhost-content [webviewId]="tab.id">
|
||||||
</controlhost-content>
|
</controlhost-content>
|
||||||
|
|||||||
@@ -9,13 +9,14 @@ import { Component, Inject, Input, forwardRef, ViewChild, ElementRef, ChangeDete
|
|||||||
|
|
||||||
import { TabConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
import { TabConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
||||||
import { DashboardTab } from 'sql/parts/dashboard/common/interfaces';
|
import { DashboardTab } from 'sql/parts/dashboard/common/interfaces';
|
||||||
|
import { TabChild } from 'sql/base/browser/ui/panel/tab.component';
|
||||||
|
|
||||||
import Event, { Emitter } from 'vs/base/common/event';
|
import Event, { Emitter } from 'vs/base/common/event';
|
||||||
import * as nls from 'vs/nls';
|
import * as nls from 'vs/nls';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'dashboard-error-container',
|
selector: 'dashboard-error-container',
|
||||||
providers: [{ provide: DashboardTab, useExisting: forwardRef(() => DashboardErrorContainer) }],
|
providers: [{ provide: TabChild, useExisting: forwardRef(() => DashboardErrorContainer) }],
|
||||||
template: `
|
template: `
|
||||||
<div class="error-container">
|
<div class="error-container">
|
||||||
<div class="icon globalError">
|
<div class="icon globalError">
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import 'vs/css!./dashboardGridContainer';
|
|||||||
|
|
||||||
import { Component, Inject, Input, forwardRef, ViewChild, ElementRef, ViewChildren, QueryList, OnDestroy, ChangeDetectorRef, EventEmitter } from '@angular/core';
|
import { Component, Inject, Input, forwardRef, ViewChild, ElementRef, ViewChildren, QueryList, OnDestroy, ChangeDetectorRef, EventEmitter } from '@angular/core';
|
||||||
import { NgGridConfig, NgGrid, NgGridItem } from 'angular2-grid';
|
import { NgGridConfig, NgGrid, NgGridItem } from 'angular2-grid';
|
||||||
|
import { concat } from 'rxjs/operator/concat';
|
||||||
|
|
||||||
import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service';
|
import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service';
|
||||||
import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
||||||
@@ -14,13 +15,13 @@ import { TabConfig, WidgetConfig } from 'sql/parts/dashboard/common/dashboardWid
|
|||||||
import { DashboardWidgetWrapper } from 'sql/parts/dashboard/contents/dashboardWidgetWrapper.component';
|
import { DashboardWidgetWrapper } from 'sql/parts/dashboard/contents/dashboardWidgetWrapper.component';
|
||||||
import { subscriptionToDisposable } from 'sql/base/common/lifecycle';
|
import { subscriptionToDisposable } from 'sql/base/common/lifecycle';
|
||||||
import { DashboardTab } from 'sql/parts/dashboard/common/interfaces';
|
import { DashboardTab } from 'sql/parts/dashboard/common/interfaces';
|
||||||
|
import { WebviewContent } from 'sql/parts/dashboard/contents/webviewContent.component';
|
||||||
|
import { TabChild } from 'sql/base/browser/ui/panel/tab.component';
|
||||||
|
|
||||||
import { Disposable, IDisposable } from 'vs/base/common/lifecycle';
|
import { Disposable, IDisposable } from 'vs/base/common/lifecycle';
|
||||||
import { ConfigurationTarget } from 'vs/platform/configuration/common/configuration';
|
import { ConfigurationTarget } from 'vs/platform/configuration/common/configuration';
|
||||||
import * as objects from 'vs/base/common/objects';
|
import * as objects from 'vs/base/common/objects';
|
||||||
import Event, { Emitter } from 'vs/base/common/event';
|
import Event, { Emitter } from 'vs/base/common/event';
|
||||||
import { concat } from 'rxjs/operator/concat';
|
|
||||||
import { WebviewContent } from 'sql/parts/dashboard/contents/webviewContent.component';
|
|
||||||
|
|
||||||
export interface GridCellConfig {
|
export interface GridCellConfig {
|
||||||
id?: string;
|
id?: string;
|
||||||
@@ -42,7 +43,7 @@ export interface GridWebviewConfig extends GridCellConfig {
|
|||||||
@Component({
|
@Component({
|
||||||
selector: 'dashboard-grid-container',
|
selector: 'dashboard-grid-container',
|
||||||
templateUrl: decodeURI(require.toUrl('sql/parts/dashboard/containers/dashboardGridContainer.component.html')),
|
templateUrl: decodeURI(require.toUrl('sql/parts/dashboard/containers/dashboardGridContainer.component.html')),
|
||||||
providers: [{ provide: DashboardTab, useExisting: forwardRef(() => DashboardGridContainer) }]
|
providers: [{ provide: TabChild, useExisting: forwardRef(() => DashboardGridContainer) }]
|
||||||
})
|
})
|
||||||
export class DashboardGridContainer extends DashboardTab implements OnDestroy {
|
export class DashboardGridContainer extends DashboardTab implements OnDestroy {
|
||||||
@Input() private tab: TabConfig;
|
@Input() private tab: TabConfig;
|
||||||
|
|||||||
@@ -12,17 +12,20 @@ import { DashboardTab } from 'sql/parts/dashboard/common/interfaces';
|
|||||||
import { WidgetConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
import { WidgetConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
||||||
import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service';
|
import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service';
|
||||||
import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
||||||
import { AngularEventType } from 'sql/services/angularEventing/angularEventingService';
|
import { AngularEventType, IAngularEventingService } from 'sql/services/angularEventing/angularEventingService';
|
||||||
import { DashboardWidgetWrapper } from 'sql/parts/dashboard/contents/dashboardWidgetWrapper.component';
|
import { DashboardWidgetWrapper } from 'sql/parts/dashboard/contents/dashboardWidgetWrapper.component';
|
||||||
import { ConfigurationTarget } from 'vs/platform/configuration/common/configuration';
|
|
||||||
import { ScrollableDirective } from 'sql/base/browser/ui/scrollable/scrollable.directive';
|
import { ScrollableDirective } from 'sql/base/browser/ui/scrollable/scrollable.directive';
|
||||||
|
import { TabChild } from 'sql/base/browser/ui/panel/tab.component';
|
||||||
|
|
||||||
|
import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||||
|
import { ScrollbarVisibility } from 'vs/base/common/scrollable';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'dashboard-home-container',
|
selector: 'dashboard-home-container',
|
||||||
providers: [{ provide: DashboardTab, useExisting: forwardRef(() => DashboardHomeContainer) }],
|
providers: [{ provide: TabChild, useExisting: forwardRef(() => DashboardHomeContainer) }],
|
||||||
template: `
|
template: `
|
||||||
<div class="fullsize" style="display: flex; flex-direction: column">
|
<div class="fullsize" style="display: flex; flex-direction: column">
|
||||||
<div scrollable>
|
<div scrollable [horizontalScroll]="ScrollbarVisibility.Hidden" [verticalScroll]="ScrollbarVisibility.Auto">
|
||||||
<dashboard-widget-wrapper #propertiesClass *ngIf="properties" [collapsable]="true" [_config]="properties"
|
<dashboard-widget-wrapper #propertiesClass *ngIf="properties" [collapsable]="true" [_config]="properties"
|
||||||
style="padding-left: 10px; padding-right: 10px; display: block; flex: 0" [style.height.px]="_propertiesClass?.collapsed ? '30' : '90'">
|
style="padding-left: 10px; padding-right: 10px; display: block; flex: 0" [style.height.px]="_propertiesClass?.collapsed ? '30' : '90'">
|
||||||
</dashboard-widget-wrapper>
|
</dashboard-widget-wrapper>
|
||||||
@@ -37,9 +40,13 @@ export class DashboardHomeContainer extends DashboardWidgetContainer {
|
|||||||
@ViewChild('propertiesClass') private _propertiesClass: DashboardWidgetWrapper;
|
@ViewChild('propertiesClass') private _propertiesClass: DashboardWidgetWrapper;
|
||||||
@ContentChild(ScrollableDirective) private _scrollable;
|
@ContentChild(ScrollableDirective) private _scrollable;
|
||||||
|
|
||||||
|
private ScrollbarVisibility = ScrollbarVisibility;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(forwardRef(() => ChangeDetectorRef)) _cd: ChangeDetectorRef,
|
@Inject(forwardRef(() => ChangeDetectorRef)) _cd: ChangeDetectorRef,
|
||||||
@Inject(forwardRef(() => CommonServiceInterface)) protected dashboardService: DashboardServiceInterface
|
@Inject(forwardRef(() => CommonServiceInterface)) protected dashboardService: DashboardServiceInterface,
|
||||||
|
@Inject(IConfigurationService) private _configurationService: IConfigurationService,
|
||||||
|
@Inject(IAngularEventingService) private angularEventingService: IAngularEventingService
|
||||||
) {
|
) {
|
||||||
super(_cd);
|
super(_cd);
|
||||||
}
|
}
|
||||||
@@ -49,14 +56,12 @@ export class DashboardHomeContainer extends DashboardWidgetContainer {
|
|||||||
if (collapsedVal === 'collapsed') {
|
if (collapsedVal === 'collapsed') {
|
||||||
this._propertiesClass.collapsed = true;
|
this._propertiesClass.collapsed = true;
|
||||||
}
|
}
|
||||||
this.dashboardService.angularEventingService.onAngularEvent(this.dashboardService.getUnderlyingUri(), event => {
|
this.angularEventingService.onAngularEvent(this.dashboardService.getUnderlyingUri(), event => {
|
||||||
if (event.event === AngularEventType.COLLAPSE_WIDGET && this._propertiesClass && event.payload === this._propertiesClass.guid) {
|
if (event.event === AngularEventType.COLLAPSE_WIDGET && this._propertiesClass && event.payload === this._propertiesClass.guid) {
|
||||||
this._propertiesClass.collapsed = !this._propertiesClass.collapsed;
|
this._propertiesClass.collapsed = !this._propertiesClass.collapsed;
|
||||||
this._cd.detectChanges();
|
this._cd.detectChanges();
|
||||||
this.dashboardService.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, {
|
this._configurationService.updateValue(`dashboard.${this.properties.context}.properties`,
|
||||||
key: `dashboard.${this.properties.context}.properties`,
|
this._propertiesClass.collapsed ? 'collapsed' : true, ConfigurationTarget.USER);
|
||||||
value: this._propertiesClass.collapsed ? 'collapsed' : true
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,10 +11,11 @@ import Event, { Emitter } from 'vs/base/common/event';
|
|||||||
import { DashboardTab } from 'sql/parts/dashboard/common/interfaces';
|
import { DashboardTab } from 'sql/parts/dashboard/common/interfaces';
|
||||||
import { TabConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
import { TabConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
||||||
import { ModelViewContent } from 'sql/parts/modelComponents/modelViewContent.component';
|
import { ModelViewContent } from 'sql/parts/modelComponents/modelViewContent.component';
|
||||||
|
import { TabChild } from 'sql/base/browser/ui/panel/tab.component';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'dashboard-modelview-container',
|
selector: 'dashboard-modelview-container',
|
||||||
providers: [{ provide: DashboardTab, useExisting: forwardRef(() => DashboardModelViewContainer) }],
|
providers: [{ provide: TabChild, useExisting: forwardRef(() => DashboardModelViewContainer) }],
|
||||||
template: `
|
template: `
|
||||||
<modelview-content [modelViewId]="tab.id">
|
<modelview-content [modelViewId]="tab.id">
|
||||||
</modelview-content>
|
</modelview-content>
|
||||||
|
|||||||
@@ -4,18 +4,20 @@
|
|||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
-->
|
-->
|
||||||
<panel [options]="panelOpt" style="flex: 1 1 auto;" class="dashboard-panel" (onTabChange)="handleTabChange($event)">
|
<panel [options]="panelOpt" style="flex: 1 1 auto;" class="dashboard-panel">
|
||||||
<tab [visibilityType]="'visibility'" *ngFor="let tab of tabs" [title]="tab.title" class="fullsize"
|
<tab [visibilityType]="'visibility'" *ngFor="let tab of tabs" [title]="tab.title" class="fullsize"
|
||||||
[identifier]="tab.id" [canClose]="tab.canClose" [actions]="tab.actions" [iconClass]="tab.iconClass">
|
[identifier]="tab.id" [canClose]="tab.canClose" [actions]="tab.actions" [iconClass]="tab.iconClass">
|
||||||
<dashboard-webview-container *ngIf="getContentType(tab) === 'webview-container'" [tab]="tab">
|
<ng-template>
|
||||||
</dashboard-webview-container>
|
<dashboard-webview-container *ngIf="getContentType(tab) === 'webview-container'" [tab]="tab">
|
||||||
<dashboard-widget-container *ngIf="getContentType(tab) === 'widgets-container'" [tab]="tab">
|
</dashboard-webview-container>
|
||||||
</dashboard-widget-container>
|
<dashboard-widget-container *ngIf="getContentType(tab) === 'widgets-container'" [tab]="tab">
|
||||||
<dashboard-modelview-container *ngIf="getContentType(tab) === 'modelview-container'" [tab]="tab">
|
</dashboard-widget-container>
|
||||||
</dashboard-modelview-container>
|
<dashboard-modelview-container *ngIf="getContentType(tab) === 'modelview-container'" [tab]="tab">
|
||||||
<dashboard-grid-container *ngIf="getContentType(tab) === 'grid-container'" [tab]="tab">
|
</dashboard-modelview-container>
|
||||||
</dashboard-grid-container>
|
<dashboard-grid-container *ngIf="getContentType(tab) === 'grid-container'" [tab]="tab">
|
||||||
<dashboard-error-container *ngIf="getContentType(tab) === 'error-container'" [tab]="tab">
|
</dashboard-grid-container>
|
||||||
</dashboard-error-container>
|
<dashboard-error-container *ngIf="getContentType(tab) === 'error-container'" [tab]="tab">
|
||||||
|
</dashboard-error-container>
|
||||||
|
</ng-template>
|
||||||
</tab>
|
</tab>
|
||||||
</panel>
|
</panel>
|
||||||
@@ -11,7 +11,7 @@ import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboar
|
|||||||
import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
||||||
import { WidgetConfig, TabConfig, NavSectionConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
import { WidgetConfig, TabConfig, NavSectionConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
||||||
import { PanelComponent, IPanelOptions, NavigationBarLayout } from 'sql/base/browser/ui/panel/panel.component';
|
import { PanelComponent, IPanelOptions, NavigationBarLayout } from 'sql/base/browser/ui/panel/panel.component';
|
||||||
import { TabComponent } from 'sql/base/browser/ui/panel/tab.component';
|
import { TabComponent, TabChild } from 'sql/base/browser/ui/panel/tab.component';
|
||||||
import { DashboardTab } from 'sql/parts/dashboard/common/interfaces';
|
import { DashboardTab } from 'sql/parts/dashboard/common/interfaces';
|
||||||
import { WIDGETS_CONTAINER } from 'sql/parts/dashboard/containers/dashboardWidgetContainer.contribution';
|
import { WIDGETS_CONTAINER } from 'sql/parts/dashboard/containers/dashboardWidgetContainer.contribution';
|
||||||
import { GRID_CONTAINER } from 'sql/parts/dashboard/containers/dashboardGridContainer.contribution';
|
import { GRID_CONTAINER } from 'sql/parts/dashboard/containers/dashboardGridContainer.contribution';
|
||||||
@@ -23,7 +23,7 @@ import * as nls from 'vs/nls';
|
|||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'dashboard-nav-section',
|
selector: 'dashboard-nav-section',
|
||||||
providers: [{ provide: DashboardTab, useExisting: forwardRef(() => DashboardNavSection) }],
|
providers: [{ provide: TabChild, useExisting: forwardRef(() => DashboardNavSection) }],
|
||||||
templateUrl: decodeURI(require.toUrl('sql/parts/dashboard/containers/dashboardNavSection.component.html'))
|
templateUrl: decodeURI(require.toUrl('sql/parts/dashboard/containers/dashboardNavSection.component.html'))
|
||||||
})
|
})
|
||||||
export class DashboardNavSection extends DashboardTab implements OnDestroy, OnChanges, AfterContentInit {
|
export class DashboardNavSection extends DashboardTab implements OnDestroy, OnChanges, AfterContentInit {
|
||||||
@@ -51,7 +51,7 @@ export class DashboardNavSection extends DashboardTab implements OnDestroy, OnCh
|
|||||||
dashboardHelper.validateGridConfig
|
dashboardHelper.validateGridConfig
|
||||||
];
|
];
|
||||||
|
|
||||||
@ViewChildren(DashboardTab) private _tabs: QueryList<DashboardTab>;
|
@ViewChildren(TabChild) private _tabs: QueryList<DashboardTab>;
|
||||||
@ViewChild(PanelComponent) private _panel: PanelComponent;
|
@ViewChild(PanelComponent) private _panel: PanelComponent;
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(forwardRef(() => CommonServiceInterface)) protected dashboardService: CommonServiceInterface,
|
@Inject(forwardRef(() => CommonServiceInterface)) protected dashboardService: CommonServiceInterface,
|
||||||
@@ -124,11 +124,6 @@ export class DashboardNavSection extends DashboardTab implements OnDestroy, OnCh
|
|||||||
this.addNewTab(config);
|
this.addNewTab(config);
|
||||||
return config;
|
return config;
|
||||||
});
|
});
|
||||||
|
|
||||||
// put this immediately on the stack so that is ran *after* the tab is rendered
|
|
||||||
setTimeout(() => {
|
|
||||||
this._panel.selectTab(selectedTabs[0].id);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -174,10 +169,4 @@ export class DashboardNavSection extends DashboardTab implements OnDestroy, OnCh
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public handleTabChange(tab: TabComponent): void {
|
|
||||||
let localtab = this._tabs.find(i => i.id === tab.identifier);
|
|
||||||
this._cd.detectChanges();
|
|
||||||
localtab.layout();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,10 +11,11 @@ import Event, { Emitter } from 'vs/base/common/event';
|
|||||||
import { DashboardTab } from 'sql/parts/dashboard/common/interfaces';
|
import { DashboardTab } from 'sql/parts/dashboard/common/interfaces';
|
||||||
import { TabConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
import { TabConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
||||||
import { WebviewContent } from 'sql/parts/dashboard/contents/webviewContent.component';
|
import { WebviewContent } from 'sql/parts/dashboard/contents/webviewContent.component';
|
||||||
|
import { TabChild } from 'sql/base/browser/ui/panel/tab.component';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'dashboard-webview-container',
|
selector: 'dashboard-webview-container',
|
||||||
providers: [{ provide: DashboardTab, useExisting: forwardRef(() => DashboardWebviewContainer) }],
|
providers: [{ provide: TabChild, useExisting: forwardRef(() => DashboardWebviewContainer) }],
|
||||||
template: `
|
template: `
|
||||||
<webview-content [webviewId]="tab.id">
|
<webview-content [webviewId]="tab.id">
|
||||||
</webview-content>
|
</webview-content>
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import { DashboardWidgetWrapper } from 'sql/parts/dashboard/contents/dashboardWi
|
|||||||
import { subscriptionToDisposable } from 'sql/base/common/lifecycle';
|
import { subscriptionToDisposable } from 'sql/base/common/lifecycle';
|
||||||
import { DashboardTab } from 'sql/parts/dashboard/common/interfaces';
|
import { DashboardTab } from 'sql/parts/dashboard/common/interfaces';
|
||||||
import { WidgetContent } from 'sql/parts/dashboard/contents/widgetContent.component';
|
import { WidgetContent } from 'sql/parts/dashboard/contents/widgetContent.component';
|
||||||
|
import { TabChild } from 'sql/base/browser/ui/panel/tab.component';
|
||||||
|
|
||||||
import { Disposable, IDisposable } from 'vs/base/common/lifecycle';
|
import { Disposable, IDisposable } from 'vs/base/common/lifecycle';
|
||||||
import { ConfigurationTarget } from 'vs/platform/configuration/common/configuration';
|
import { ConfigurationTarget } from 'vs/platform/configuration/common/configuration';
|
||||||
@@ -22,7 +23,7 @@ import Event, { Emitter } from 'vs/base/common/event';
|
|||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'dashboard-widget-container',
|
selector: 'dashboard-widget-container',
|
||||||
providers: [{ provide: DashboardTab, useExisting: forwardRef(() => DashboardWidgetContainer) }],
|
providers: [{ provide: TabChild, useExisting: forwardRef(() => DashboardWidgetContainer) }],
|
||||||
template: `
|
template: `
|
||||||
<widget-content [widgets]="widgets" [originalConfig]="tab.originalConfig" [context]="tab.context">
|
<widget-content [widgets]="widgets" [originalConfig]="tab.originalConfig" [context]="tab.context">
|
||||||
</widget-content>
|
</widget-content>
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import Event, { Emitter } from 'vs/base/common/event';
|
|||||||
import { Parts } from 'vs/workbench/services/part/common/partService';
|
import { Parts } from 'vs/workbench/services/part/common/partService';
|
||||||
import { IDisposable } from 'vs/base/common/lifecycle';
|
import { IDisposable } from 'vs/base/common/lifecycle';
|
||||||
|
|
||||||
import { DashboardTab } from 'sql/parts/dashboard/common/interfaces';
|
|
||||||
import { TabConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
import { TabConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
||||||
import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service';
|
import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service';
|
||||||
import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboar
|
|||||||
import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
||||||
|
|
||||||
import { IDisposable } from 'vs/base/common/lifecycle';
|
import { IDisposable } from 'vs/base/common/lifecycle';
|
||||||
import { IColorTheme } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
import { IColorTheme, IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
||||||
import * as colors from 'vs/platform/theme/common/colorRegistry';
|
import * as colors from 'vs/platform/theme/common/colorRegistry';
|
||||||
import * as themeColors from 'vs/workbench/common/theme';
|
import * as themeColors from 'vs/workbench/common/theme';
|
||||||
import { Action } from 'vs/base/common/actions';
|
import { Action } from 'vs/base/common/actions';
|
||||||
@@ -37,6 +37,7 @@ import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar';
|
|||||||
import { memoize } from 'vs/base/common/decorators';
|
import { memoize } from 'vs/base/common/decorators';
|
||||||
import { generateUuid } from 'vs/base/common/uuid';
|
import { generateUuid } from 'vs/base/common/uuid';
|
||||||
import { Emitter } from 'vs/base/common/event';
|
import { Emitter } from 'vs/base/common/event';
|
||||||
|
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||||
|
|
||||||
const componentMap: { [x: string]: Type<IDashboardWidget> } = {
|
const componentMap: { [x: string]: Type<IDashboardWidget> } = {
|
||||||
'properties-widget': PropertiesWidgetComponent,
|
'properties-widget': PropertiesWidgetComponent,
|
||||||
@@ -91,20 +92,22 @@ export class DashboardWidgetWrapper extends AngularDisposable implements OnInit
|
|||||||
@Inject(forwardRef(() => ElementRef)) private _ref: ElementRef,
|
@Inject(forwardRef(() => ElementRef)) private _ref: ElementRef,
|
||||||
@Inject(forwardRef(() => CommonServiceInterface)) private _bootstrap: CommonServiceInterface,
|
@Inject(forwardRef(() => CommonServiceInterface)) private _bootstrap: CommonServiceInterface,
|
||||||
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeref: ChangeDetectorRef,
|
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeref: ChangeDetectorRef,
|
||||||
@Inject(forwardRef(() => Injector)) private _injector: Injector
|
@Inject(forwardRef(() => Injector)) private _injector: Injector,
|
||||||
|
@Inject(IWorkbenchThemeService) private themeService: IWorkbenchThemeService,
|
||||||
|
@Inject(IInstantiationService) private instantiationService: IInstantiationService
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
let self = this;
|
let self = this;
|
||||||
this._register(self._bootstrap.themeService.onDidColorThemeChange((event: IColorTheme) => {
|
this._register(self.themeService.onDidColorThemeChange((event: IColorTheme) => {
|
||||||
self.updateTheme(event);
|
self.updateTheme(event);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
ngAfterViewInit() {
|
ngAfterViewInit() {
|
||||||
this.updateTheme(this._bootstrap.themeService.getColorTheme());
|
this.updateTheme(this.themeService.getColorTheme());
|
||||||
if (this.componentHost) {
|
if (this.componentHost) {
|
||||||
this.loadWidget();
|
this.loadWidget();
|
||||||
}
|
}
|
||||||
@@ -112,10 +115,10 @@ export class DashboardWidgetWrapper extends AngularDisposable implements OnInit
|
|||||||
this._actionbar = new ActionBar(this._actionbarRef.nativeElement);
|
this._actionbar = new ActionBar(this._actionbarRef.nativeElement);
|
||||||
if (this._actions) {
|
if (this._actions) {
|
||||||
if (this.collapsable) {
|
if (this.collapsable) {
|
||||||
this._collapseAction = this._bootstrap.instantiationService.createInstance(CollapseWidgetAction, this._bootstrap.getUnderlyingUri(), this.guid, this.collapsed);
|
this._collapseAction = this.instantiationService.createInstance(CollapseWidgetAction, this._bootstrap.getUnderlyingUri(), this.guid, this.collapsed);
|
||||||
this._actionbar.push(this._collapseAction, { icon: true, label: false });
|
this._actionbar.push(this._collapseAction, { icon: true, label: false });
|
||||||
}
|
}
|
||||||
this._actionbar.push(this._bootstrap.instantiationService.createInstance(ToggleMoreWidgetAction, this._actions, this._component.actionsContext), { icon: true, label: false });
|
this._actionbar.push(this.instantiationService.createInstance(ToggleMoreWidgetAction, this._actions, this._component.actionsContext), { icon: true, label: false });
|
||||||
}
|
}
|
||||||
this.layout();
|
this.layout();
|
||||||
}
|
}
|
||||||
@@ -137,7 +140,7 @@ export class DashboardWidgetWrapper extends AngularDisposable implements OnInit
|
|||||||
}
|
}
|
||||||
|
|
||||||
public enableEdit(): void {
|
public enableEdit(): void {
|
||||||
this._actionbar.push(this._bootstrap.instantiationService.createInstance(DeleteWidgetAction, this._config.id, this._bootstrap.getUnderlyingUri()), { icon: true, label: false });
|
this._actionbar.push(this.instantiationService.createInstance(DeleteWidgetAction, this._config.id, this._bootstrap.getUnderlyingUri()), { icon: true, label: false });
|
||||||
}
|
}
|
||||||
|
|
||||||
public disableEdit(): void {
|
public disableEdit(): void {
|
||||||
|
|||||||
@@ -8,16 +8,18 @@ import { Component, forwardRef, Input, OnInit, Inject, ChangeDetectorRef, Elemen
|
|||||||
|
|
||||||
import Event, { Emitter } from 'vs/base/common/event';
|
import Event, { Emitter } from 'vs/base/common/event';
|
||||||
import { Webview } from 'vs/workbench/parts/html/browser/webview';
|
import { Webview } from 'vs/workbench/parts/html/browser/webview';
|
||||||
import { Parts } from 'vs/workbench/services/part/common/partService';
|
import { Parts, IPartService } from 'vs/workbench/services/part/common/partService';
|
||||||
import { IDisposable, Disposable } from 'vs/base/common/lifecycle';
|
import { IDisposable, Disposable } from 'vs/base/common/lifecycle';
|
||||||
import { addDisposableListener, EventType } from 'vs/base/browser/dom';
|
import { addDisposableListener, EventType } from 'vs/base/browser/dom';
|
||||||
import { memoize } from 'vs/base/common/decorators';
|
import { memoize } from 'vs/base/common/decorators';
|
||||||
|
import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
||||||
|
import { IContextViewService } from 'vs/platform/contextview/browser/contextView';
|
||||||
|
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
|
||||||
|
|
||||||
import { DashboardTab } from 'sql/parts/dashboard/common/interfaces';
|
|
||||||
import { TabConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
import { TabConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
||||||
import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service';
|
import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service';
|
||||||
import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
||||||
import { IDashboardWebview } from 'sql/services/dashboard/common/dashboardViewService';
|
import { IDashboardWebview, IDashboardViewService } from 'sql/services/dashboard/common/dashboardViewService';
|
||||||
import { AngularDisposable } from 'sql/base/common/lifecycle';
|
import { AngularDisposable } from 'sql/base/common/lifecycle';
|
||||||
|
|
||||||
import * as sqlops from 'sqlops';
|
import * as sqlops from 'sqlops';
|
||||||
@@ -37,19 +39,22 @@ export class WebviewContent extends AngularDisposable implements OnInit, IDashbo
|
|||||||
private _onMessageDisposable: IDisposable;
|
private _onMessageDisposable: IDisposable;
|
||||||
private _webview: Webview;
|
private _webview: Webview;
|
||||||
private _html: string;
|
private _html: string;
|
||||||
private _dashboardService: DashboardServiceInterface;
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(forwardRef(() => CommonServiceInterface)) private commonService: CommonServiceInterface,
|
@Inject(forwardRef(() => CommonServiceInterface)) private _dashboardService: DashboardServiceInterface,
|
||||||
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeRef: ChangeDetectorRef,
|
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeRef: ChangeDetectorRef,
|
||||||
@Inject(forwardRef(() => ElementRef)) private _el: ElementRef
|
@Inject(forwardRef(() => ElementRef)) private _el: ElementRef,
|
||||||
|
@Inject(IWorkbenchThemeService) private themeService: IWorkbenchThemeService,
|
||||||
|
@Inject(IContextViewService) private contextViewService: IContextViewService,
|
||||||
|
@Inject(IDashboardViewService) private dashboardViewService: IDashboardViewService,
|
||||||
|
@Inject(IPartService) private partService: IPartService,
|
||||||
|
@Inject(IEnvironmentService) private environmentService: IEnvironmentService
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
this._dashboardService = commonService as DashboardServiceInterface;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this._dashboardService.dashboardViewService.registerWebview(this);
|
this.dashboardViewService.registerWebview(this);
|
||||||
this._createWebview();
|
this._createWebview();
|
||||||
this._register(addDisposableListener(window, EventType.RESIZE, e => {
|
this._register(addDisposableListener(window, EventType.RESIZE, e => {
|
||||||
this.layout();
|
this.layout();
|
||||||
@@ -104,10 +109,10 @@ export class WebviewContent extends AngularDisposable implements OnInit, IDashbo
|
|||||||
}
|
}
|
||||||
|
|
||||||
this._webview = new Webview(this._el.nativeElement,
|
this._webview = new Webview(this._el.nativeElement,
|
||||||
this._dashboardService.partService.getContainer(Parts.EDITOR_PART),
|
this.partService.getContainer(Parts.EDITOR_PART),
|
||||||
this._dashboardService.themeService,
|
this.themeService,
|
||||||
this._dashboardService.environmentService,
|
this.environmentService,
|
||||||
this._dashboardService.contextViewService,
|
this.contextViewService,
|
||||||
undefined,
|
undefined,
|
||||||
undefined,
|
undefined,
|
||||||
{
|
{
|
||||||
@@ -120,7 +125,7 @@ export class WebviewContent extends AngularDisposable implements OnInit, IDashbo
|
|||||||
this._onMessageDisposable = this._webview.onMessage(e => {
|
this._onMessageDisposable = this._webview.onMessage(e => {
|
||||||
this._onMessage.fire(e);
|
this._onMessage.fire(e);
|
||||||
});
|
});
|
||||||
this._webview.style(this._dashboardService.themeService.getTheme());
|
this._webview.style(this.themeService.getTheme());
|
||||||
if (this._html) {
|
if (this._html) {
|
||||||
this._webview.contents = this._html;
|
this._webview.contents = this._html;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import { RefreshWidgetAction, EditDashboardAction } from 'sql/parts/dashboard/co
|
|||||||
import { DashboardPage } from 'sql/parts/dashboard/common/dashboardPage.component';
|
import { DashboardPage } from 'sql/parts/dashboard/common/dashboardPage.component';
|
||||||
import { AngularDisposable } from 'sql/base/common/lifecycle';
|
import { AngularDisposable } from 'sql/base/common/lifecycle';
|
||||||
|
|
||||||
import { IColorTheme } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
import { IColorTheme, IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
||||||
import { IDisposable } from 'vs/base/common/lifecycle';
|
import { IDisposable } from 'vs/base/common/lifecycle';
|
||||||
import * as themeColors from 'vs/workbench/common/theme';
|
import * as themeColors from 'vs/workbench/common/theme';
|
||||||
import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar';
|
import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar';
|
||||||
@@ -39,14 +39,15 @@ export class DashboardComponent extends AngularDisposable implements OnInit {
|
|||||||
constructor(
|
constructor(
|
||||||
@Inject(forwardRef(() => CommonServiceInterface)) private _bootstrapService: CommonServiceInterface,
|
@Inject(forwardRef(() => CommonServiceInterface)) private _bootstrapService: CommonServiceInterface,
|
||||||
@Inject(forwardRef(() => Router)) private _router: Router,
|
@Inject(forwardRef(() => Router)) private _router: Router,
|
||||||
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeRef: ChangeDetectorRef
|
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeRef: ChangeDetectorRef,
|
||||||
|
@Inject(IWorkbenchThemeService) private themeService: IWorkbenchThemeService
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this._register(this._bootstrapService.themeService.onDidColorThemeChange(this.updateTheme, this));
|
this._register(this.themeService.onDidColorThemeChange(this.updateTheme, this));
|
||||||
this.updateTheme(this._bootstrapService.themeService.getColorTheme());
|
this.updateTheme(this.themeService.getColorTheme());
|
||||||
let profile: IConnectionProfile = this._bootstrapService.getOriginalConnectionProfile();
|
let profile: IConnectionProfile = this._bootstrapService.getOriginalConnectionProfile();
|
||||||
this.actionbar = new ActionBar(this.actionbarContainer.nativeElement);
|
this.actionbar = new ActionBar(this.actionbarContainer.nativeElement);
|
||||||
this.actionbar.push(new RefreshWidgetAction(this.refresh, this), {
|
this.actionbar.push(new RefreshWidgetAction(this.refresh, this), {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
import { Inject, NgModule, forwardRef, ApplicationRef, ComponentFactoryResolver } from '@angular/core';
|
import { Inject, NgModule, forwardRef, ApplicationRef, ComponentFactoryResolver, NgModuleRef, NgModuleFactory } from '@angular/core';
|
||||||
import { CommonModule, APP_BASE_HREF } from '@angular/common';
|
import { CommonModule, APP_BASE_HREF } from '@angular/common';
|
||||||
import { BrowserModule } from '@angular/platform-browser';
|
import { BrowserModule } from '@angular/platform-browser';
|
||||||
import { RouterModule, Routes, UrlSerializer, Router, NavigationEnd } from '@angular/router';
|
import { RouterModule, Routes, UrlSerializer, Router, NavigationEnd } from '@angular/router';
|
||||||
@@ -12,9 +12,9 @@ import { NgGridModule } from 'angular2-grid';
|
|||||||
import { ChartsModule } from 'ng2-charts/ng2-charts';
|
import { ChartsModule } from 'ng2-charts/ng2-charts';
|
||||||
|
|
||||||
import CustomUrlSerializer from 'sql/common/urlSerializer';
|
import CustomUrlSerializer from 'sql/common/urlSerializer';
|
||||||
import { IBootstrapService, BOOTSTRAP_SERVICE_ID } from 'sql/services/bootstrap/bootstrapService';
|
|
||||||
import { Extensions, IInsightRegistry } from 'sql/platform/dashboard/common/insightRegistry';
|
import { Extensions, IInsightRegistry } from 'sql/platform/dashboard/common/insightRegistry';
|
||||||
import { Extensions as ComponentExtensions, IComponentRegistry } from 'sql/platform/dashboard/common/modelComponentRegistry';
|
import { Extensions as ComponentExtensions, IComponentRegistry } from 'sql/platform/dashboard/common/modelComponentRegistry';
|
||||||
|
import { IBootstrapParams } from 'sql/services/bootstrap/bootstrapService';
|
||||||
|
|
||||||
import { Registry } from 'vs/platform/registry/common/platform';
|
import { Registry } from 'vs/platform/registry/common/platform';
|
||||||
|
|
||||||
@@ -56,12 +56,13 @@ import { JobHistoryComponent } from 'sql/parts/jobManagement/views/jobHistory.co
|
|||||||
let baseComponents = [DashboardHomeContainer, DashboardComponent, DashboardWidgetWrapper, DashboardWebviewContainer,
|
let baseComponents = [DashboardHomeContainer, DashboardComponent, DashboardWidgetWrapper, DashboardWebviewContainer,
|
||||||
DashboardWidgetContainer, DashboardGridContainer, DashboardErrorContainer, DashboardNavSection, ModelViewContent, WebviewContent, WidgetContent,
|
DashboardWidgetContainer, DashboardGridContainer, DashboardErrorContainer, DashboardNavSection, ModelViewContent, WebviewContent, WidgetContent,
|
||||||
ComponentHostDirective, BreadcrumbComponent, ControlHostContent, DashboardControlHostContainer,
|
ComponentHostDirective, BreadcrumbComponent, ControlHostContent, DashboardControlHostContainer,
|
||||||
JobsViewComponent, AgentViewComponent, JobHistoryComponent, JobStepsViewComponent, DashboardModelViewContainer, ModelComponentWrapper,
|
JobsViewComponent, AgentViewComponent, JobHistoryComponent, JobStepsViewComponent, DashboardModelViewContainer, ModelComponentWrapper];
|
||||||
ScrollableDirective];
|
|
||||||
|
|
||||||
/* Panel */
|
/* Panel */
|
||||||
import { PanelModule } from 'sql/base/browser/ui/panel/panel.module';
|
import { PanelModule } from 'sql/base/browser/ui/panel/panel.module';
|
||||||
|
|
||||||
|
import { ScrollableModule } from 'sql/base/browser/ui/scrollable/scrollable.module';
|
||||||
|
|
||||||
/* Pages */
|
/* Pages */
|
||||||
import { ServerDashboardPage } from 'sql/parts/dashboard/pages/serverDashboardPage.component';
|
import { ServerDashboardPage } from 'sql/parts/dashboard/pages/serverDashboardPage.component';
|
||||||
import { DatabaseDashboardPage } from 'sql/parts/dashboard/pages/databaseDashboardPage.component';
|
import { DatabaseDashboardPage } from 'sql/parts/dashboard/pages/databaseDashboardPage.component';
|
||||||
@@ -75,7 +76,6 @@ import { TasksWidget } from 'sql/parts/dashboard/widgets/tasks/tasksWidget.compo
|
|||||||
import { InsightsWidget } from 'sql/parts/dashboard/widgets/insights/insightsWidget.component';
|
import { InsightsWidget } from 'sql/parts/dashboard/widgets/insights/insightsWidget.component';
|
||||||
import { WebviewWidget } from 'sql/parts/dashboard/widgets/webview/webviewWidget.component';
|
import { WebviewWidget } from 'sql/parts/dashboard/widgets/webview/webviewWidget.component';
|
||||||
import { JobStepsViewComponent } from '../jobManagement/views/jobStepsView.component';
|
import { JobStepsViewComponent } from '../jobManagement/views/jobStepsView.component';
|
||||||
import { ScrollableDirective } from 'sql/base/browser/ui/scrollable/scrollable.directive';
|
|
||||||
|
|
||||||
let widgetComponents = [
|
let widgetComponents = [
|
||||||
PropertiesWidgetComponent,
|
PropertiesWidgetComponent,
|
||||||
@@ -104,63 +104,68 @@ const appRoutes: Routes = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
// Connection Dashboard main angular module
|
// Connection Dashboard main angular module
|
||||||
@NgModule({
|
export const DashboardModule = (params, selector: string): any => {
|
||||||
declarations: [
|
@NgModule({
|
||||||
...baseComponents,
|
declarations: [
|
||||||
...pageComponents,
|
...baseComponents,
|
||||||
...widgetComponents,
|
...pageComponents,
|
||||||
...insightComponents,
|
...widgetComponents,
|
||||||
...extensionComponents
|
...insightComponents,
|
||||||
],
|
...extensionComponents
|
||||||
// also for widgets
|
],
|
||||||
entryComponents: [
|
// also for widgets
|
||||||
DashboardComponent,
|
entryComponents: [
|
||||||
...widgetComponents,
|
DashboardComponent,
|
||||||
...insightComponents,
|
...widgetComponents,
|
||||||
...extensionComponents
|
...insightComponents,
|
||||||
],
|
...extensionComponents
|
||||||
imports: [
|
],
|
||||||
CommonModule,
|
imports: [
|
||||||
BrowserModule,
|
CommonModule,
|
||||||
FormsModule,
|
BrowserModule,
|
||||||
NgGridModule,
|
FormsModule,
|
||||||
ChartsModule,
|
NgGridModule,
|
||||||
RouterModule.forRoot(appRoutes),
|
ChartsModule,
|
||||||
PanelModule
|
RouterModule.forRoot(appRoutes),
|
||||||
],
|
PanelModule,
|
||||||
providers: [
|
ScrollableModule
|
||||||
{ provide: APP_BASE_HREF, useValue: '/' },
|
],
|
||||||
{ provide: IBreadcrumbService, useClass: BreadcrumbService },
|
providers: [
|
||||||
{ provide: CommonServiceInterface, useClass: DashboardServiceInterface },
|
{ provide: APP_BASE_HREF, useValue: '/' },
|
||||||
{ provide: UrlSerializer, useClass: CustomUrlSerializer }
|
{ provide: IBreadcrumbService, useClass: BreadcrumbService },
|
||||||
]
|
{ provide: CommonServiceInterface, useClass: DashboardServiceInterface },
|
||||||
})
|
{ provide: UrlSerializer, useClass: CustomUrlSerializer },
|
||||||
export class DashboardModule {
|
{ provide: IBootstrapParams, useValue: params }
|
||||||
private _bootstrap: DashboardServiceInterface;
|
]
|
||||||
constructor(
|
})
|
||||||
@Inject(forwardRef(() => ComponentFactoryResolver)) private _resolver: ComponentFactoryResolver,
|
class ModuleClass {
|
||||||
@Inject(BOOTSTRAP_SERVICE_ID) private _bootstrapService: IBootstrapService,
|
private _bootstrap: DashboardServiceInterface;
|
||||||
@Inject(forwardRef(() => CommonServiceInterface)) bootstrap: CommonServiceInterface,
|
constructor(
|
||||||
@Inject(forwardRef(() => Router)) private _router: Router
|
@Inject(forwardRef(() => ComponentFactoryResolver)) private _resolver: ComponentFactoryResolver,
|
||||||
) {
|
@Inject(forwardRef(() => CommonServiceInterface)) bootstrap: CommonServiceInterface,
|
||||||
this._bootstrap = bootstrap as DashboardServiceInterface;
|
@Inject(forwardRef(() => Router)) private _router: Router,
|
||||||
|
@Inject(ITelemetryService) private telemetryService: ITelemetryService
|
||||||
|
) {
|
||||||
|
this._bootstrap = bootstrap as DashboardServiceInterface;
|
||||||
|
}
|
||||||
|
|
||||||
|
ngDoBootstrap(appRef: ApplicationRef) {
|
||||||
|
const factory = this._resolver.resolveComponentFactory(DashboardComponent);
|
||||||
|
this._bootstrap.selector = selector;
|
||||||
|
(<any>factory).factory.selector = selector;
|
||||||
|
appRef.bootstrap(factory);
|
||||||
|
|
||||||
|
this._router.events.subscribe(e => {
|
||||||
|
if (e instanceof NavigationEnd) {
|
||||||
|
this._bootstrap.handlePageNavigation();
|
||||||
|
TelemetryUtils.addTelemetry(this.telemetryService, TelemetryKeys.DashboardNavigated, {
|
||||||
|
numberOfNavigations: this._bootstrap.getNumberOfPageNavigations(),
|
||||||
|
routeUrl: e.url
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ngDoBootstrap(appRef: ApplicationRef) {
|
return ModuleClass;
|
||||||
const factory = this._resolver.resolveComponentFactory(DashboardComponent);
|
};
|
||||||
const uniqueSelector: string = this._bootstrapService.getUniqueSelector(DASHBOARD_SELECTOR);
|
|
||||||
this._bootstrap.selector = uniqueSelector;
|
|
||||||
(<any>factory).factory.selector = uniqueSelector;
|
|
||||||
appRef.bootstrap(factory);
|
|
||||||
|
|
||||||
this._router.events.subscribe(e => {
|
|
||||||
if (e instanceof NavigationEnd) {
|
|
||||||
this._bootstrap.handlePageNavigation();
|
|
||||||
TelemetryUtils.addTelemetry(this._bootstrapService.telemetryService, TelemetryKeys.DashboardNavigated, {
|
|
||||||
numberOfNavigations: this._bootstrap.getNumberOfPageNavigations(),
|
|
||||||
routeUrl: e.url
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -15,8 +15,8 @@ import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
|||||||
|
|
||||||
import { DashboardInput } from './dashboardInput';
|
import { DashboardInput } from './dashboardInput';
|
||||||
import { DashboardModule } from './dashboard.module';
|
import { DashboardModule } from './dashboard.module';
|
||||||
import { IBootstrapService } from 'sql/services/bootstrap/bootstrapService';
|
import { bootstrapAngular } from 'sql/services/bootstrap/bootstrapService';
|
||||||
import { DashboardComponentParams } from 'sql/services/bootstrap/bootstrapParams';
|
import { IDashboardComponentParams } from 'sql/services/bootstrap/bootstrapParams';
|
||||||
import { DASHBOARD_SELECTOR } from 'sql/parts/dashboard/dashboard.component';
|
import { DASHBOARD_SELECTOR } from 'sql/parts/dashboard/dashboard.component';
|
||||||
import { ConnectionContextkey } from 'sql/parts/connection/common/connectionContextKey';
|
import { ConnectionContextkey } from 'sql/parts/connection/common/connectionContextKey';
|
||||||
import { IDashboardService } from 'sql/services/dashboard/common/dashboardService';
|
import { IDashboardService } from 'sql/services/dashboard/common/dashboardService';
|
||||||
@@ -34,7 +34,6 @@ export class DashboardEditor extends BaseEditor {
|
|||||||
@ITelemetryService telemetryService: ITelemetryService,
|
@ITelemetryService telemetryService: ITelemetryService,
|
||||||
@IWorkbenchThemeService themeService: IWorkbenchThemeService,
|
@IWorkbenchThemeService themeService: IWorkbenchThemeService,
|
||||||
@IInstantiationService private instantiationService: IInstantiationService,
|
@IInstantiationService private instantiationService: IInstantiationService,
|
||||||
@IBootstrapService private _bootstrapService: IBootstrapService,
|
|
||||||
@IContextKeyService private _contextKeyService: IContextKeyService,
|
@IContextKeyService private _contextKeyService: IContextKeyService,
|
||||||
@IDashboardService private _dashboardService: IDashboardService,
|
@IDashboardService private _dashboardService: IDashboardService,
|
||||||
@IConnectionManagementService private _connMan: IConnectionManagementService
|
@IConnectionManagementService private _connMan: IConnectionManagementService
|
||||||
@@ -114,7 +113,7 @@ export class DashboardEditor extends BaseEditor {
|
|||||||
let connectionContextKey = new ConnectionContextkey(scopedContextService);
|
let connectionContextKey = new ConnectionContextkey(scopedContextService);
|
||||||
connectionContextKey.set(input.connectionProfile);
|
connectionContextKey.set(input.connectionProfile);
|
||||||
|
|
||||||
let params: DashboardComponentParams = {
|
let params: IDashboardComponentParams = {
|
||||||
connection: input.connectionProfile,
|
connection: input.connectionProfile,
|
||||||
ownerUri: input.uri,
|
ownerUri: input.uri,
|
||||||
scopedContextService,
|
scopedContextService,
|
||||||
@@ -123,7 +122,7 @@ export class DashboardEditor extends BaseEditor {
|
|||||||
|
|
||||||
input.hasBootstrapped = true;
|
input.hasBootstrapped = true;
|
||||||
|
|
||||||
let uniqueSelector = this._bootstrapService.bootstrap(
|
let uniqueSelector = this.instantiationService.invokeFunction(bootstrapAngular,
|
||||||
DashboardModule,
|
DashboardModule,
|
||||||
this._dashboardContainer,
|
this._dashboardContainer,
|
||||||
DASHBOARD_SELECTOR,
|
DASHBOARD_SELECTOR,
|
||||||
|
|||||||
@@ -10,11 +10,14 @@ import { BreadcrumbClass } from 'sql/parts/dashboard/services/breadcrumb.service
|
|||||||
import { IBreadcrumbService } from 'sql/base/browser/ui/breadcrumb/interfaces';
|
import { IBreadcrumbService } from 'sql/base/browser/ui/breadcrumb/interfaces';
|
||||||
import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service';
|
import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service';
|
||||||
import { WidgetConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
import { WidgetConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
||||||
import { IBootstrapService, BOOTSTRAP_SERVICE_ID } from 'sql/services/bootstrap/bootstrapService';
|
import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
||||||
|
import { IAngularEventingService } from 'sql/services/angularEventing/angularEventingService';
|
||||||
|
|
||||||
import * as colors from 'vs/platform/theme/common/colorRegistry';
|
import * as colors from 'vs/platform/theme/common/colorRegistry';
|
||||||
import * as nls from 'vs/nls';
|
import * as nls from 'vs/nls';
|
||||||
import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||||
|
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||||
|
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||||
|
|
||||||
export class DatabaseDashboardPage extends DashboardPage implements OnInit {
|
export class DatabaseDashboardPage extends DashboardPage implements OnInit {
|
||||||
protected propertiesWidget: WidgetConfig = {
|
protected propertiesWidget: WidgetConfig = {
|
||||||
@@ -38,9 +41,12 @@ export class DatabaseDashboardPage extends DashboardPage implements OnInit {
|
|||||||
@Inject(forwardRef(() => IBreadcrumbService)) private _breadcrumbService: IBreadcrumbService,
|
@Inject(forwardRef(() => IBreadcrumbService)) private _breadcrumbService: IBreadcrumbService,
|
||||||
@Inject(forwardRef(() => CommonServiceInterface)) dashboardService: DashboardServiceInterface,
|
@Inject(forwardRef(() => CommonServiceInterface)) dashboardService: DashboardServiceInterface,
|
||||||
@Inject(forwardRef(() => ChangeDetectorRef)) _cd: ChangeDetectorRef,
|
@Inject(forwardRef(() => ChangeDetectorRef)) _cd: ChangeDetectorRef,
|
||||||
@Inject(forwardRef(() => ElementRef)) el: ElementRef
|
@Inject(forwardRef(() => ElementRef)) el: ElementRef,
|
||||||
|
@Inject(IInstantiationService) instantiationService: IInstantiationService,
|
||||||
|
@Inject(INotificationService) notificationService: INotificationService,
|
||||||
|
@Inject(IAngularEventingService) angularEventingService: IAngularEventingService
|
||||||
) {
|
) {
|
||||||
super(dashboardService, el, _cd);
|
super(dashboardService, el, _cd, instantiationService, notificationService, angularEventingService);
|
||||||
this._register(dashboardService.onUpdatePage(() => {
|
this._register(dashboardService.onUpdatePage(() => {
|
||||||
this.refresh(true);
|
this.refresh(true);
|
||||||
this._cd.detectChanges();
|
this._cd.detectChanges();
|
||||||
|
|||||||
@@ -11,10 +11,13 @@ import { IBreadcrumbService } from 'sql/base/browser/ui/breadcrumb/interfaces';
|
|||||||
import { WidgetConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
import { WidgetConfig } from 'sql/parts/dashboard/common/dashboardWidget';
|
||||||
import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service';
|
import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service';
|
||||||
import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
||||||
import { IBootstrapService, BOOTSTRAP_SERVICE_ID } from 'sql/services/bootstrap/bootstrapService';
|
import { IAngularEventingService } from 'sql/services/angularEventing/angularEventingService';
|
||||||
|
|
||||||
import * as colors from 'vs/platform/theme/common/colorRegistry';
|
import * as colors from 'vs/platform/theme/common/colorRegistry';
|
||||||
import * as nls from 'vs/nls';
|
import * as nls from 'vs/nls';
|
||||||
|
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||||
|
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||||
|
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||||
|
|
||||||
export class ServerDashboardPage extends DashboardPage implements OnInit {
|
export class ServerDashboardPage extends DashboardPage implements OnInit {
|
||||||
protected propertiesWidget: WidgetConfig = {
|
protected propertiesWidget: WidgetConfig = {
|
||||||
@@ -37,11 +40,14 @@ export class ServerDashboardPage extends DashboardPage implements OnInit {
|
|||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(forwardRef(() => IBreadcrumbService)) private breadcrumbService: IBreadcrumbService,
|
@Inject(forwardRef(() => IBreadcrumbService)) private breadcrumbService: IBreadcrumbService,
|
||||||
@Inject(forwardRef(() => CommonServiceInterface)) dashboardService: CommonServiceInterface,
|
@Inject(forwardRef(() => CommonServiceInterface)) dashboardService: DashboardServiceInterface,
|
||||||
@Inject(forwardRef(() => ChangeDetectorRef)) _cd: ChangeDetectorRef,
|
@Inject(forwardRef(() => ChangeDetectorRef)) _cd: ChangeDetectorRef,
|
||||||
@Inject(forwardRef(() => ElementRef)) el: ElementRef
|
@Inject(forwardRef(() => ElementRef)) el: ElementRef,
|
||||||
|
@Inject(IInstantiationService) instantiationService: IInstantiationService,
|
||||||
|
@Inject(INotificationService) notificationService: INotificationService,
|
||||||
|
@Inject(IAngularEventingService) angularEventingService: IAngularEventingService
|
||||||
) {
|
) {
|
||||||
super(dashboardService, el, _cd);
|
super(dashboardService, el, _cd, instantiationService, notificationService, angularEventingService);
|
||||||
// revert back to default database
|
// revert back to default database
|
||||||
this._letDashboardPromise = this.dashboardService.connectionManagementService.changeDatabase('master');
|
this._letDashboardPromise = this.dashboardService.connectionManagementService.changeDatabase('master');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ import { Router } from '@angular/router';
|
|||||||
import { Observable } from 'rxjs/Observable';
|
import { Observable } from 'rxjs/Observable';
|
||||||
|
|
||||||
/* SQL imports */
|
/* SQL imports */
|
||||||
import { DashboardComponentParams } from 'sql/services/bootstrap/bootstrapParams';
|
import { IDashboardComponentParams } from 'sql/services/bootstrap/bootstrapParams';
|
||||||
import { IBootstrapService, BOOTSTRAP_SERVICE_ID } from 'sql/services/bootstrap/bootstrapService';
|
import { IBootstrapParams } from 'sql/services/bootstrap/bootstrapService';
|
||||||
import { IMetadataService } from 'sql/services/metadata/metadataService';
|
import { IMetadataService } from 'sql/services/metadata/metadataService';
|
||||||
import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement';
|
import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement';
|
||||||
import { ConnectionManagementInfo } from 'sql/parts/connection/common/connectionManagementInfo';
|
import { ConnectionManagementInfo } from 'sql/parts/connection/common/connectionManagementInfo';
|
||||||
@@ -64,9 +64,6 @@ export class DashboardServiceInterface extends CommonServiceInterface {
|
|||||||
|
|
||||||
/* Static Services */
|
/* Static Services */
|
||||||
|
|
||||||
private _dashboardViewService = this._bootstrapService.dashboardViewService;
|
|
||||||
|
|
||||||
|
|
||||||
private _updatePage = new Emitter<void>();
|
private _updatePage = new Emitter<void>();
|
||||||
public readonly onUpdatePage: Event<void> = this._updatePage.event;
|
public readonly onUpdatePage: Event<void> = this._updatePage.event;
|
||||||
|
|
||||||
@@ -88,14 +85,21 @@ export class DashboardServiceInterface extends CommonServiceInterface {
|
|||||||
private _numberOfPageNavigations = 0;
|
private _numberOfPageNavigations = 0;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(BOOTSTRAP_SERVICE_ID) bootstrapService: IBootstrapService,
|
|
||||||
@Inject(forwardRef(() => Router)) private _router: Router,
|
@Inject(forwardRef(() => Router)) private _router: Router,
|
||||||
|
@Inject(INotificationService) private _notificationService: INotificationService,
|
||||||
|
@Inject(IMetadataService) metadataService: IMetadataService,
|
||||||
|
@Inject(IConnectionManagementService) connectionManagementService: IConnectionManagementService,
|
||||||
|
@Inject(IAdminService) adminService: IAdminService,
|
||||||
|
@Inject(IQueryManagementService) queryManagementService: IQueryManagementService,
|
||||||
|
@Inject(IAngularEventingService) private angularEventingService: IAngularEventingService,
|
||||||
|
@Inject(IConfigurationService) private _configService: IConfigurationService,
|
||||||
|
@Inject(IBootstrapParams) _params: IDashboardComponentParams
|
||||||
) {
|
) {
|
||||||
super(bootstrapService);
|
super(_params, metadataService, connectionManagementService, adminService, queryManagementService);
|
||||||
}
|
}
|
||||||
|
|
||||||
public get dashboardViewService(): IDashboardViewService {
|
private get params(): IDashboardComponentParams {
|
||||||
return this._dashboardViewService;
|
return this._params;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -107,11 +111,10 @@ export class DashboardServiceInterface extends CommonServiceInterface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected _getbootstrapParams(): void {
|
protected _getbootstrapParams(): void {
|
||||||
this._bootstrapParams = this._bootstrapService.getBootstrapParams<DashboardComponentParams>(this._uniqueSelector);
|
this.scopedContextKeyService = this.params.scopedContextService;
|
||||||
this._contextKeyService = this._bootstrapParams.scopedContextService;
|
this._connectionContextKey = this.params.connectionContextKey;
|
||||||
this._connectionContextKey = this._bootstrapParams.connectionContextKey;
|
this.dashboardContextKey = this._dashboardContextKey.bindTo(this.scopedContextKeyService);
|
||||||
this.dashboardContextKey = this._dashboardContextKey.bindTo(this._contextKeyService);
|
this.uri = this.params.ownerUri;
|
||||||
this.uri = this._bootstrapParams.ownerUri;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -120,7 +123,7 @@ export class DashboardServiceInterface extends CommonServiceInterface {
|
|||||||
*/
|
*/
|
||||||
protected set uri(uri: string) {
|
protected set uri(uri: string) {
|
||||||
super.setUri(uri);
|
super.setUri(uri);
|
||||||
this._register(toDisposableSubscription(this._bootstrapService.angularEventingService.onAngularEvent(this._uri, (event) => this.handleDashboardEvent(event))));
|
this._register(toDisposableSubscription(this.angularEventingService.onAngularEvent(this._uri, (event) => this.handleDashboardEvent(event))));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -147,7 +150,7 @@ export class DashboardServiceInterface extends CommonServiceInterface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public writeSettings(type: string, value: any, target: ConfigurationTarget) {
|
public writeSettings(type: string, value: any, target: ConfigurationTarget) {
|
||||||
this._configurationEditingService.writeConfiguration(target, { key: [DASHBOARD_SETTINGS, type].join('.'), value });
|
this._configService.updateValue([DASHBOARD_SETTINGS, type].join('.'), value, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
private handleDashboardEvent(event: IAngularEvent): void {
|
private handleDashboardEvent(event: IAngularEvent): void {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
import { Router } from '@angular/router';
|
import { Router } from '@angular/router';
|
||||||
|
|
||||||
import { IConnectionProfile } from 'sql/parts/connection/common/interfaces';
|
import { IConnectionProfile } from 'sql/parts/connection/common/interfaces';
|
||||||
import { MetadataType } from 'sql/parts/connection/common/connectionManagement';
|
import { MetadataType, IConnectionManagementService, IErrorMessageService } from 'sql/parts/connection/common/connectionManagement';
|
||||||
import { SingleConnectionManagementService } from 'sql/services/common/commonServiceInterface.service';
|
import { SingleConnectionManagementService } from 'sql/services/common/commonServiceInterface.service';
|
||||||
import {
|
import {
|
||||||
NewQueryAction, ScriptSelectAction, EditDataAction, ScriptCreateAction, ScriptExecuteAction, ScriptAlterAction,
|
NewQueryAction, ScriptSelectAction, EditDataAction, ScriptCreateAction, ScriptExecuteAction, ScriptAlterAction,
|
||||||
@@ -16,6 +16,8 @@ import { ICapabilitiesService } from 'sql/services/capabilities/capabilitiesServ
|
|||||||
import { ConnectionManagementInfo } from 'sql/parts/connection/common/connectionManagementInfo';
|
import { ConnectionManagementInfo } from 'sql/parts/connection/common/connectionManagementInfo';
|
||||||
import * as Constants from 'sql/parts/connection/common/constants';
|
import * as Constants from 'sql/parts/connection/common/constants';
|
||||||
import { OEAction } from 'sql/parts/objectExplorer/viewlet/objectExplorerActions';
|
import { OEAction } from 'sql/parts/objectExplorer/viewlet/objectExplorerActions';
|
||||||
|
import { IQueryEditorService } from 'sql/parts/query/common/queryEditorService';
|
||||||
|
import { IScriptingService } from 'sql/services/scripting/scriptingService';
|
||||||
|
|
||||||
import { ObjectMetadata } from 'sqlops';
|
import { ObjectMetadata } from 'sqlops';
|
||||||
|
|
||||||
@@ -30,6 +32,7 @@ import { generateUuid } from 'vs/base/common/uuid';
|
|||||||
import { $ } from 'vs/base/browser/dom';
|
import { $ } from 'vs/base/browser/dom';
|
||||||
import { ExecuteCommandAction } from 'vs/platform/actions/common/actions';
|
import { ExecuteCommandAction } from 'vs/platform/actions/common/actions';
|
||||||
import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent';
|
import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent';
|
||||||
|
import { IProgressService } from 'vs/platform/progress/common/progress';
|
||||||
|
|
||||||
export class ObjectMetadataWrapper implements ObjectMetadata {
|
export class ObjectMetadataWrapper implements ObjectMetadata {
|
||||||
public metadataType: MetadataType;
|
public metadataType: MetadataType;
|
||||||
@@ -370,7 +373,7 @@ function GetExplorerActions(element: TreeResource, instantiationService: IInstan
|
|||||||
|
|
||||||
if (element instanceof ObjectMetadataWrapper) {
|
if (element instanceof ObjectMetadataWrapper) {
|
||||||
if (element.metadataType === MetadataType.View || element.metadataType === MetadataType.Table) {
|
if (element.metadataType === MetadataType.View || element.metadataType === MetadataType.Table) {
|
||||||
actions.push(instantiationService.createInstance(ScriptSelectAction, ScriptSelectAction.ID, ScriptSelectAction.LABEL));
|
actions.push(instantiationService.createInstance(ExplorerScriptSelectAction, ScriptSelectAction.ID, ScriptSelectAction.LABEL));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (element.metadataType === MetadataType.Table) {
|
if (element.metadataType === MetadataType.Table) {
|
||||||
@@ -378,12 +381,12 @@ function GetExplorerActions(element: TreeResource, instantiationService: IInstan
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (element.metadataType === MetadataType.SProc && info.connectionProfile.providerName === Constants.mssqlProviderName) {
|
if (element.metadataType === MetadataType.SProc && info.connectionProfile.providerName === Constants.mssqlProviderName) {
|
||||||
actions.push(instantiationService.createInstance(ScriptExecuteAction, ScriptExecuteAction.ID, ScriptExecuteAction.LABEL));
|
actions.push(instantiationService.createInstance(ExplorerScriptExecuteAction, ScriptExecuteAction.ID, ScriptExecuteAction.LABEL));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((element.metadataType === MetadataType.SProc || element.metadataType === MetadataType.Function || element.metadataType === MetadataType.View)
|
if ((element.metadataType === MetadataType.SProc || element.metadataType === MetadataType.Function || element.metadataType === MetadataType.View)
|
||||||
&& info.connectionProfile.providerName === Constants.mssqlProviderName) {
|
&& info.connectionProfile.providerName === Constants.mssqlProviderName) {
|
||||||
actions.push(instantiationService.createInstance(ScriptAlterAction, ScriptAlterAction.ID, ScriptAlterAction.LABEL));
|
actions.push(instantiationService.createInstance(ExplorerScriptAlterAction, ScriptAlterAction.ID, ScriptAlterAction.LABEL));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
actions.push(instantiationService.createInstance(CustomExecuteCommandAction, NewQueryAction.ID, NewQueryAction.LABEL));
|
actions.push(instantiationService.createInstance(CustomExecuteCommandAction, NewQueryAction.ID, NewQueryAction.LABEL));
|
||||||
@@ -402,7 +405,7 @@ function GetExplorerActions(element: TreeResource, instantiationService: IInstan
|
|||||||
return TPromise.as(actions);
|
return TPromise.as(actions);
|
||||||
}
|
}
|
||||||
|
|
||||||
actions.push(instantiationService.createInstance(ScriptCreateAction, ScriptCreateAction.ID, ScriptCreateAction.LABEL));
|
actions.push(instantiationService.createInstance(ExplorerScriptCreateAction, ScriptCreateAction.ID, ScriptCreateAction.LABEL));
|
||||||
|
|
||||||
return TPromise.as(actions);
|
return TPromise.as(actions);
|
||||||
}
|
}
|
||||||
@@ -412,3 +415,78 @@ class CustomExecuteCommandAction extends ExecuteCommandAction {
|
|||||||
return super.run(context.profile);
|
return super.run(context.profile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ExplorerScriptSelectAction extends ScriptSelectAction {
|
||||||
|
constructor(
|
||||||
|
id: string, label: string,
|
||||||
|
@IQueryEditorService queryEditorService: IQueryEditorService,
|
||||||
|
@IConnectionManagementService connectionManagementService: IConnectionManagementService,
|
||||||
|
@IScriptingService scriptingService: IScriptingService,
|
||||||
|
@IProgressService private progressService: IProgressService
|
||||||
|
) {
|
||||||
|
super(id, label, queryEditorService, connectionManagementService, scriptingService);
|
||||||
|
}
|
||||||
|
|
||||||
|
public run(actionContext: BaseActionContext): TPromise<boolean> {
|
||||||
|
let promise = super.run(actionContext);
|
||||||
|
this.progressService.showWhile(promise);
|
||||||
|
return promise;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ExplorerScriptCreateAction extends ScriptCreateAction {
|
||||||
|
constructor(
|
||||||
|
id: string, label: string,
|
||||||
|
@IQueryEditorService queryEditorService: IQueryEditorService,
|
||||||
|
@IConnectionManagementService connectionManagementService: IConnectionManagementService,
|
||||||
|
@IScriptingService scriptingService: IScriptingService,
|
||||||
|
@IErrorMessageService errorMessageService: IErrorMessageService,
|
||||||
|
@IProgressService private progressService: IProgressService
|
||||||
|
) {
|
||||||
|
super(id, label, queryEditorService, connectionManagementService, scriptingService, errorMessageService);
|
||||||
|
}
|
||||||
|
|
||||||
|
public run(actionContext: BaseActionContext): TPromise<boolean> {
|
||||||
|
let promise = super.run(actionContext);
|
||||||
|
this.progressService.showWhile(promise);
|
||||||
|
return promise;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ExplorerScriptAlterAction extends ScriptAlterAction {
|
||||||
|
constructor(
|
||||||
|
id: string, label: string,
|
||||||
|
@IQueryEditorService queryEditorService: IQueryEditorService,
|
||||||
|
@IConnectionManagementService connectionManagementService: IConnectionManagementService,
|
||||||
|
@IScriptingService scriptingService: IScriptingService,
|
||||||
|
@IErrorMessageService errorMessageService: IErrorMessageService,
|
||||||
|
@IProgressService private progressService: IProgressService
|
||||||
|
) {
|
||||||
|
super(id, label, queryEditorService, connectionManagementService, scriptingService, errorMessageService);
|
||||||
|
}
|
||||||
|
|
||||||
|
public run(actionContext: BaseActionContext): TPromise<boolean> {
|
||||||
|
let promise = super.run(actionContext);
|
||||||
|
this.progressService.showWhile(promise);
|
||||||
|
return promise;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ExplorerScriptExecuteAction extends ScriptExecuteAction {
|
||||||
|
constructor(
|
||||||
|
id: string, label: string,
|
||||||
|
@IQueryEditorService queryEditorService: IQueryEditorService,
|
||||||
|
@IConnectionManagementService connectionManagementService: IConnectionManagementService,
|
||||||
|
@IScriptingService scriptingService: IScriptingService,
|
||||||
|
@IErrorMessageService errorMessageService: IErrorMessageService,
|
||||||
|
@IProgressService private progressService: IProgressService
|
||||||
|
) {
|
||||||
|
super(id, label, queryEditorService, connectionManagementService, scriptingService, errorMessageService);
|
||||||
|
}
|
||||||
|
|
||||||
|
public run(actionContext: BaseActionContext): TPromise<boolean> {
|
||||||
|
let promise = super.run(actionContext);
|
||||||
|
this.progressService.showWhile(promise);
|
||||||
|
return promise;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import { CommonServiceInterface } from 'sql/services/common/commonServiceInterfa
|
|||||||
import { toDisposableSubscription } from 'sql/parts/common/rxjsUtils';
|
import { toDisposableSubscription } from 'sql/parts/common/rxjsUtils';
|
||||||
import { ExplorerFilter, ExplorerRenderer, ExplorerDataSource, ExplorerController, ObjectMetadataWrapper, ExplorerModel } from './explorerTree';
|
import { ExplorerFilter, ExplorerRenderer, ExplorerDataSource, ExplorerController, ObjectMetadataWrapper, ExplorerModel } from './explorerTree';
|
||||||
import { ConnectionProfile } from 'sql/parts/connection/common/connectionProfile';
|
import { ConnectionProfile } from 'sql/parts/connection/common/connectionProfile';
|
||||||
|
import { ICapabilitiesService } from 'sql/services/capabilities/capabilitiesService';
|
||||||
|
|
||||||
import { InputBox, IInputOptions } from 'vs/base/browser/ui/inputbox/inputBox';
|
import { InputBox, IInputOptions } from 'vs/base/browser/ui/inputbox/inputBox';
|
||||||
import { attachInputBoxStyler, attachListStyler } from 'vs/platform/theme/common/styler';
|
import { attachInputBoxStyler, attachListStyler } from 'vs/platform/theme/common/styler';
|
||||||
@@ -23,6 +24,10 @@ import * as nls from 'vs/nls';
|
|||||||
import { Tree } from 'vs/base/parts/tree/browser/treeImpl';
|
import { Tree } from 'vs/base/parts/tree/browser/treeImpl';
|
||||||
import { getContentHeight } from 'vs/base/browser/dom';
|
import { getContentHeight } from 'vs/base/browser/dom';
|
||||||
import { Delayer } from 'vs/base/common/async';
|
import { Delayer } from 'vs/base/common/async';
|
||||||
|
import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView';
|
||||||
|
import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
||||||
|
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||||
|
import { IProgressService } from 'vs/platform/progress/common/progress';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'explorer-widget',
|
selector: 'explorer-widget',
|
||||||
@@ -36,9 +41,9 @@ export class ExplorerWidget extends DashboardWidget implements IDashboardWidget,
|
|||||||
this._bootstrap.getUnderlyingUri(),
|
this._bootstrap.getUnderlyingUri(),
|
||||||
this._bootstrap.connectionManagementService,
|
this._bootstrap.connectionManagementService,
|
||||||
this._router,
|
this._router,
|
||||||
this._bootstrap.contextMenuService,
|
this.contextMenuService,
|
||||||
this._bootstrap.capabilitiesService,
|
this.capabilitiesService,
|
||||||
this._bootstrap.instantiationService
|
this.instantiationService
|
||||||
);
|
);
|
||||||
private _treeRenderer = new ExplorerRenderer();
|
private _treeRenderer = new ExplorerRenderer();
|
||||||
private _treeDataSource = new ExplorerDataSource();
|
private _treeDataSource = new ExplorerDataSource();
|
||||||
@@ -54,7 +59,13 @@ export class ExplorerWidget extends DashboardWidget implements IDashboardWidget,
|
|||||||
@Inject(forwardRef(() => Router)) private _router: Router,
|
@Inject(forwardRef(() => Router)) private _router: Router,
|
||||||
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeRef: ChangeDetectorRef,
|
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeRef: ChangeDetectorRef,
|
||||||
@Inject(WIDGET_CONFIG) protected _config: WidgetConfig,
|
@Inject(WIDGET_CONFIG) protected _config: WidgetConfig,
|
||||||
@Inject(forwardRef(() => ElementRef)) private _el: ElementRef
|
@Inject(forwardRef(() => ElementRef)) private _el: ElementRef,
|
||||||
|
@Inject(IWorkbenchThemeService) private themeService: IWorkbenchThemeService,
|
||||||
|
@Inject(IContextViewService) private contextViewService: IContextViewService,
|
||||||
|
@Inject(IInstantiationService) private instantiationService: IInstantiationService,
|
||||||
|
@Inject(IContextMenuService) private contextMenuService: IContextMenuService,
|
||||||
|
@Inject(ICapabilitiesService) private capabilitiesService: ICapabilitiesService,
|
||||||
|
@Inject(IProgressService) private progressService: IProgressService
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
this.init();
|
this.init();
|
||||||
@@ -69,7 +80,7 @@ export class ExplorerWidget extends DashboardWidget implements IDashboardWidget,
|
|||||||
placeholder: placeholderLabel,
|
placeholder: placeholderLabel,
|
||||||
ariaLabel: placeholderLabel
|
ariaLabel: placeholderLabel
|
||||||
};
|
};
|
||||||
this._input = new InputBox(this._inputContainer.nativeElement, this._bootstrap.contextViewService, inputOptions);
|
this._input = new InputBox(this._inputContainer.nativeElement, this.contextViewService, inputOptions);
|
||||||
this._register(this._input.onDidChange(e => {
|
this._register(this._input.onDidChange(e => {
|
||||||
this._filterDelayer.trigger(() => {
|
this._filterDelayer.trigger(() => {
|
||||||
this._treeFilter.filterString = e;
|
this._treeFilter.filterString = e;
|
||||||
@@ -84,9 +95,9 @@ export class ExplorerWidget extends DashboardWidget implements IDashboardWidget,
|
|||||||
});
|
});
|
||||||
this._tree.layout(getContentHeight(this._tableContainer.nativeElement));
|
this._tree.layout(getContentHeight(this._tableContainer.nativeElement));
|
||||||
this._register(this._input);
|
this._register(this._input);
|
||||||
this._register(attachInputBoxStyler(this._input, this._bootstrap.themeService));
|
this._register(attachInputBoxStyler(this._input, this.themeService));
|
||||||
this._register(this._tree);
|
this._register(this._tree);
|
||||||
this._register(attachListStyler(this._tree, this._bootstrap.themeService));
|
this._register(attachListStyler(this._tree, this.themeService));
|
||||||
}
|
}
|
||||||
|
|
||||||
private init(): void {
|
private init(): void {
|
||||||
@@ -109,7 +120,7 @@ export class ExplorerWidget extends DashboardWidget implements IDashboardWidget,
|
|||||||
this._register(toDisposableSubscription(this._bootstrap.metadataService.databaseNames.subscribe(
|
this._register(toDisposableSubscription(this._bootstrap.metadataService.databaseNames.subscribe(
|
||||||
data => {
|
data => {
|
||||||
let profileData = data.map(d => {
|
let profileData = data.map(d => {
|
||||||
let profile = new ConnectionProfile(this._bootstrap.capabilitiesService, currentProfile);
|
let profile = new ConnectionProfile(this.capabilitiesService, currentProfile);
|
||||||
profile.databaseName = d;
|
profile.databaseName = d;
|
||||||
return profile;
|
return profile;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -26,8 +26,10 @@ import * as types from 'vs/base/common/types';
|
|||||||
import * as pfs from 'vs/base/node/pfs';
|
import * as pfs from 'vs/base/node/pfs';
|
||||||
import * as nls from 'vs/nls';
|
import * as nls from 'vs/nls';
|
||||||
import { Registry } from 'vs/platform/registry/common/platform';
|
import { Registry } from 'vs/platform/registry/common/platform';
|
||||||
import { WorkbenchState } from 'vs/platform/workspace/common/workspace';
|
import { WorkbenchState, IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
|
||||||
import { IntervalTimer } from 'vs/base/common/async';
|
import { IntervalTimer } from 'vs/base/common/async';
|
||||||
|
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||||
|
import { IStorageService } from 'vs/platform/storage/common/storage';
|
||||||
|
|
||||||
const insightRegistry = Registry.as<IInsightRegistry>(Extensions.InsightContribution);
|
const insightRegistry = Registry.as<IInsightRegistry>(Extensions.InsightContribution);
|
||||||
|
|
||||||
@@ -63,7 +65,11 @@ export class InsightsWidget extends DashboardWidget implements IDashboardWidget,
|
|||||||
@Inject(forwardRef(() => CommonServiceInterface)) private dashboardService: CommonServiceInterface,
|
@Inject(forwardRef(() => CommonServiceInterface)) private dashboardService: CommonServiceInterface,
|
||||||
@Inject(WIDGET_CONFIG) protected _config: WidgetConfig,
|
@Inject(WIDGET_CONFIG) protected _config: WidgetConfig,
|
||||||
@Inject(forwardRef(() => ViewContainerRef)) private viewContainerRef: ViewContainerRef,
|
@Inject(forwardRef(() => ViewContainerRef)) private viewContainerRef: ViewContainerRef,
|
||||||
@Inject(forwardRef(() => ChangeDetectorRef)) private _cd: ChangeDetectorRef
|
@Inject(forwardRef(() => ChangeDetectorRef)) private _cd: ChangeDetectorRef,
|
||||||
|
@Inject(IInstantiationService) private instantiationService: IInstantiationService,
|
||||||
|
@Inject(IStorageService) private storageService: IStorageService,
|
||||||
|
@Inject(IWorkspaceContextService) private workspaceContextService: IWorkspaceContextService,
|
||||||
|
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
this.insightConfig = <IInsightsConfig>this._config.widget['insights-widget'];
|
this.insightConfig = <IInsightsConfig>this._config.widget['insights-widget'];
|
||||||
@@ -128,9 +134,9 @@ export class InsightsWidget extends DashboardWidget implements IDashboardWidget,
|
|||||||
get actions(): Array<Action> {
|
get actions(): Array<Action> {
|
||||||
let actions: Array<Action> = [];
|
let actions: Array<Action> = [];
|
||||||
if (this.insightConfig.details && (this.insightConfig.details.query || this.insightConfig.details.queryFile)) {
|
if (this.insightConfig.details && (this.insightConfig.details.query || this.insightConfig.details.queryFile)) {
|
||||||
actions.push(this.dashboardService.instantiationService.createInstance(InsightAction, InsightAction.ID, InsightAction.LABEL));
|
actions.push(this.instantiationService.createInstance(InsightAction, InsightAction.ID, InsightAction.LABEL));
|
||||||
}
|
}
|
||||||
actions.push(this.dashboardService.instantiationService.createInstance(RunInsightQueryAction, RunInsightQueryAction.ID, RunInsightQueryAction.LABEL));
|
actions.push(this.instantiationService.createInstance(RunInsightQueryAction, RunInsightQueryAction.ID, RunInsightQueryAction.LABEL));
|
||||||
return actions;
|
return actions;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -150,14 +156,14 @@ export class InsightsWidget extends DashboardWidget implements IDashboardWidget,
|
|||||||
};
|
};
|
||||||
this.lastUpdated = nls.localize('insights.lastUpdated', "Last Updated: {0} {1}", currentTime.toLocaleTimeString(), currentTime.toLocaleDateString());
|
this.lastUpdated = nls.localize('insights.lastUpdated', "Last Updated: {0} {1}", currentTime.toLocaleTimeString(), currentTime.toLocaleDateString());
|
||||||
this._cd.detectChanges();
|
this._cd.detectChanges();
|
||||||
this.dashboardService.storageService.store(this._getStorageKey(), JSON.stringify(store));
|
this.storageService.store(this._getStorageKey(), JSON.stringify(store));
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _checkStorage(): boolean {
|
private _checkStorage(): boolean {
|
||||||
if (this.insightConfig.cacheId) {
|
if (this.insightConfig.cacheId) {
|
||||||
let storage = this.dashboardService.storageService.get(this._getStorageKey());
|
let storage = this.storageService.get(this._getStorageKey());
|
||||||
if (storage) {
|
if (storage) {
|
||||||
let storedResult: IStorageResult = JSON.parse(storage);
|
let storedResult: IStorageResult = JSON.parse(storage);
|
||||||
let date = new Date(storedResult.date);
|
let date = new Date(storedResult.date);
|
||||||
@@ -272,15 +278,15 @@ export class InsightsWidget extends DashboardWidget implements IDashboardWidget,
|
|||||||
filePath = filePath.replace(match[0], '');
|
filePath = filePath.replace(match[0], '');
|
||||||
|
|
||||||
//filePath = this.dashboardService.workspaceContextService.toResource(filePath).fsPath;
|
//filePath = this.dashboardService.workspaceContextService.toResource(filePath).fsPath;
|
||||||
switch (this.dashboardService.workspaceContextService.getWorkbenchState()) {
|
switch (this.workspaceContextService.getWorkbenchState()) {
|
||||||
case WorkbenchState.FOLDER:
|
case WorkbenchState.FOLDER:
|
||||||
filePath = this.dashboardService.workspaceContextService.getWorkspace().folders[0].toResource(filePath).fsPath;
|
filePath = this.workspaceContextService.getWorkspace().folders[0].toResource(filePath).fsPath;
|
||||||
break;
|
break;
|
||||||
case WorkbenchState.WORKSPACE:
|
case WorkbenchState.WORKSPACE:
|
||||||
let filePathArray = filePath.split('/');
|
let filePathArray = filePath.split('/');
|
||||||
// filter out empty sections
|
// filter out empty sections
|
||||||
filePathArray = filePathArray.filter(i => !!i);
|
filePathArray = filePathArray.filter(i => !!i);
|
||||||
let folder = this.dashboardService.workspaceContextService.getWorkspace().folders.find(i => i.name === filePathArray[0]);
|
let folder = this.workspaceContextService.getWorkspace().folders.find(i => i.name === filePathArray[0]);
|
||||||
if (!folder) {
|
if (!folder) {
|
||||||
return Promise.reject<void[]>(new Error(`Could not find workspace folder ${filePathArray[0]}`));
|
return Promise.reject<void[]>(new Error(`Could not find workspace folder ${filePathArray[0]}`));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,22 +5,19 @@
|
|||||||
import { Component, Input, Inject, ChangeDetectorRef, forwardRef, ElementRef, ViewChild } from '@angular/core';
|
import { Component, Input, Inject, ChangeDetectorRef, forwardRef, ElementRef, ViewChild } from '@angular/core';
|
||||||
import { BaseChartDirective } from 'ng2-charts/ng2-charts';
|
import { BaseChartDirective } from 'ng2-charts/ng2-charts';
|
||||||
|
|
||||||
/* SQL Imports */
|
|
||||||
import { IBootstrapService, BOOTSTRAP_SERVICE_ID } from 'sql/services/bootstrap/bootstrapService';
|
|
||||||
|
|
||||||
import * as TelemetryKeys from 'sql/common/telemetryKeys';
|
import * as TelemetryKeys from 'sql/common/telemetryKeys';
|
||||||
import * as TelemetryUtils from 'sql/common/telemetryUtilities';
|
import * as TelemetryUtils from 'sql/common/telemetryUtilities';
|
||||||
import { IInsightsView, IInsightData } from 'sql/parts/dashboard/widgets/insights/interfaces';
|
import { IInsightsView, IInsightData } from 'sql/parts/dashboard/widgets/insights/interfaces';
|
||||||
import { memoize, unmemoize } from 'sql/base/common/decorators';
|
import { memoize, unmemoize } from 'sql/base/common/decorators';
|
||||||
|
|
||||||
/* VS Imports */
|
|
||||||
import * as colors from 'vs/platform/theme/common/colorRegistry';
|
|
||||||
import { mixin } from 'sql/base/common/objects';
|
import { mixin } from 'sql/base/common/objects';
|
||||||
|
|
||||||
|
import * as colors from 'vs/platform/theme/common/colorRegistry';
|
||||||
import { Color } from 'vs/base/common/color';
|
import { Color } from 'vs/base/common/color';
|
||||||
import * as types from 'vs/base/common/types';
|
import * as types from 'vs/base/common/types';
|
||||||
import { Disposable } from 'vs/base/common/lifecycle';
|
import { Disposable } from 'vs/base/common/lifecycle';
|
||||||
import { IColorTheme } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
import { IColorTheme, IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
||||||
import * as nls from 'vs/nls';
|
import * as nls from 'vs/nls';
|
||||||
|
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||||
|
|
||||||
export enum ChartType {
|
export enum ChartType {
|
||||||
Bar = 'bar',
|
Bar = 'bar',
|
||||||
@@ -121,14 +118,15 @@ export abstract class ChartInsight extends Disposable implements IInsightsView {
|
|||||||
constructor(
|
constructor(
|
||||||
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeRef: ChangeDetectorRef,
|
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeRef: ChangeDetectorRef,
|
||||||
@Inject(forwardRef(() => ElementRef)) private _el: ElementRef,
|
@Inject(forwardRef(() => ElementRef)) private _el: ElementRef,
|
||||||
@Inject(BOOTSTRAP_SERVICE_ID) protected _bootstrapService: IBootstrapService
|
@Inject(IWorkbenchThemeService) private themeService: IWorkbenchThemeService,
|
||||||
|
@Inject(ITelemetryService) private telemetryService: ITelemetryService
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
this._register(this._bootstrapService.themeService.onDidColorThemeChange(e => this.updateTheme(e)));
|
this._register(this.themeService.onDidColorThemeChange(e => this.updateTheme(e)));
|
||||||
this.updateTheme(this._bootstrapService.themeService.getColorTheme());
|
this.updateTheme(this.themeService.getColorTheme());
|
||||||
// Note: must use a boolean to not render the canvas until all properties such as the labels and chart type are set.
|
// Note: must use a boolean to not render the canvas until all properties such as the labels and chart type are set.
|
||||||
// This is because chart.js doesn't auto-update anything other than dataset when re-rendering so defaults are used
|
// This is because chart.js doesn't auto-update anything other than dataset when re-rendering so defaults are used
|
||||||
// hence it's easier to not render until ready
|
// hence it's easier to not render until ready
|
||||||
@@ -142,7 +140,7 @@ export abstract class ChartInsight extends Disposable implements IInsightsView {
|
|||||||
this._hasError = true;
|
this._hasError = true;
|
||||||
this._changeRef.detectChanges();
|
this._changeRef.detectChanges();
|
||||||
}
|
}
|
||||||
TelemetryUtils.addTelemetry(this._bootstrapService.telemetryService, TelemetryKeys.ChartCreated, { type: this.chartType });
|
TelemetryUtils.addTelemetry(this.telemetryService, TelemetryKeys.ChartCreated, { type: this.chartType });
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -6,24 +6,31 @@ import { Component, Input, Inject, ChangeDetectorRef, forwardRef, ElementRef, On
|
|||||||
|
|
||||||
import { getContentHeight, getContentWidth } from 'vs/base/browser/dom';
|
import { getContentHeight, getContentWidth } from 'vs/base/browser/dom';
|
||||||
import { Dimension } from 'vs/base/browser/builder';
|
import { Dimension } from 'vs/base/browser/builder';
|
||||||
|
import { Disposable } from 'vs/base/common/lifecycle';
|
||||||
|
import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
||||||
|
|
||||||
import { IInsightsView, IInsightData } from 'sql/parts/dashboard/widgets/insights/interfaces';
|
import { IInsightsView, IInsightData } from 'sql/parts/dashboard/widgets/insights/interfaces';
|
||||||
import { Table } from 'sql/base/browser/ui/table/table';
|
import { Table } from 'sql/base/browser/ui/table/table';
|
||||||
import { TableDataView } from 'sql/base/browser/ui/table/tableDataView';
|
import { TableDataView } from 'sql/base/browser/ui/table/tableDataView';
|
||||||
import { DragCellSelectionModel } from '../../../../../base/browser/ui/table/plugins/dragCellSelectionModel.plugin';
|
import { DragCellSelectionModel } from 'sql/base/browser/ui/table/plugins/dragCellSelectionModel.plugin';
|
||||||
|
import { attachTableStyler} from 'sql/common/theme/styler';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
template: '<span></span>'
|
template: ''
|
||||||
})
|
})
|
||||||
export default class TableInsight implements IInsightsView, OnInit {
|
export default class TableInsight extends Disposable implements IInsightsView, OnInit {
|
||||||
private table: Table<any>;
|
private table: Table<any>;
|
||||||
private dataView: TableDataView<any>;
|
private dataView: TableDataView<any>;
|
||||||
private columns: Slick.Column<any>[];
|
private columns: Slick.Column<any>[];
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeRef: ChangeDetectorRef,
|
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeRef: ChangeDetectorRef,
|
||||||
@Inject(forwardRef(() => ElementRef)) private _elementRef: ElementRef
|
@Inject(forwardRef(() => ElementRef)) private _elementRef: ElementRef,
|
||||||
) { }
|
@Inject(IWorkbenchThemeService) private themeService: IWorkbenchThemeService
|
||||||
|
) {
|
||||||
|
super();
|
||||||
|
this._elementRef.nativeElement.className = 'slickgridContainer';
|
||||||
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.createTable();
|
this.createTable();
|
||||||
@@ -58,13 +65,14 @@ export default class TableInsight implements IInsightsView, OnInit {
|
|||||||
if (!this.table) {
|
if (!this.table) {
|
||||||
this.table = new Table(this._elementRef.nativeElement, this.dataView, this.columns, { showRowNumber: true });
|
this.table = new Table(this._elementRef.nativeElement, this.dataView, this.columns, { showRowNumber: true });
|
||||||
this.table.setSelectionModel(new DragCellSelectionModel());
|
this.table.setSelectionModel(new DragCellSelectionModel());
|
||||||
|
this._register(attachTableStyler(this.table, this.themeService));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function transformData(rows: string[][], columns: string[]): {[key: string]: string}[] {
|
function transformData(rows: string[][], columns: string[]): { [key: string]: string }[] {
|
||||||
return rows.map(row => {
|
return rows.map(row => {
|
||||||
let object: {[key: string]: string} = {};
|
let object: { [key: string]: string } = {};
|
||||||
row.forEach((val, index) => {
|
row.forEach((val, index) => {
|
||||||
object[columns[index]] = val;
|
object[columns[index]] = val;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -29,9 +29,9 @@ import { ScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElemen
|
|||||||
import { ScrollbarVisibility } from 'vs/base/common/scrollable';
|
import { ScrollbarVisibility } from 'vs/base/common/scrollable';
|
||||||
import { $, Builder } from 'vs/base/browser/builder';
|
import { $, Builder } from 'vs/base/browser/builder';
|
||||||
import * as DOM from 'vs/base/browser/dom';
|
import * as DOM from 'vs/base/browser/dom';
|
||||||
import { CommandsRegistry, ICommand } from 'vs/platform/commands/common/commands';
|
import { CommandsRegistry, ICommand, ICommandService } from 'vs/platform/commands/common/commands';
|
||||||
import { MenuRegistry, ICommandAction } from 'vs/platform/actions/common/actions';
|
import { MenuRegistry, ICommandAction } from 'vs/platform/actions/common/actions';
|
||||||
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
|
import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||||
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
|
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
|
||||||
import { KeyCode } from 'vs/base/common/keyCodes';
|
import { KeyCode } from 'vs/base/common/keyCodes';
|
||||||
|
|
||||||
@@ -62,7 +62,9 @@ export class TasksWidget extends DashboardWidget implements IDashboardWidget, On
|
|||||||
@Inject(forwardRef(() => CommonServiceInterface)) private _bootstrap: CommonServiceInterface,
|
@Inject(forwardRef(() => CommonServiceInterface)) private _bootstrap: CommonServiceInterface,
|
||||||
@Inject(forwardRef(() => DomSanitizer)) private _sanitizer: DomSanitizer,
|
@Inject(forwardRef(() => DomSanitizer)) private _sanitizer: DomSanitizer,
|
||||||
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeref: ChangeDetectorRef,
|
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeref: ChangeDetectorRef,
|
||||||
@Inject(WIDGET_CONFIG) protected _config: WidgetConfig
|
@Inject(ICommandService) private commandService: ICommandService,
|
||||||
|
@Inject(WIDGET_CONFIG) protected _config: WidgetConfig,
|
||||||
|
@Inject(IContextKeyService) contextKeyService: IContextKeyService
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
this._profile = this._bootstrap.connectionManagementService.connectionInfo.connectionProfile;
|
this._profile = this._bootstrap.connectionManagementService.connectionInfo.connectionProfile;
|
||||||
@@ -76,7 +78,7 @@ export class TasksWidget extends DashboardWidget implements IDashboardWidget, On
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (tasks.includes(i.name) && _bootstrap.contextKeyService.contextMatchesRules(ContextKeyExpr.deserialize(i.when))) {
|
if (tasks.includes(i.name) && contextKeyService.contextMatchesRules(ContextKeyExpr.deserialize(i.when))) {
|
||||||
return i.name;
|
return i.name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -165,7 +167,7 @@ export class TasksWidget extends DashboardWidget implements IDashboardWidget, On
|
|||||||
|
|
||||||
public runTask(task: ICommandAction) {
|
public runTask(task: ICommandAction) {
|
||||||
let serverInfo = this._bootstrap.connectionManagementService.connectionInfo.serverInfo;
|
let serverInfo = this._bootstrap.connectionManagementService.connectionInfo.serverInfo;
|
||||||
this._bootstrap.commandService.executeCommand(task.id, this._profile);
|
this.commandService.executeCommand(task.id, this._profile);
|
||||||
}
|
}
|
||||||
|
|
||||||
public layout(): void {
|
public layout(): void {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
import { Component, Inject, forwardRef, ChangeDetectorRef, OnInit, ViewChild, ElementRef } from '@angular/core';
|
import { Component, Inject, forwardRef, ChangeDetectorRef, OnInit, ViewChild, ElementRef } from '@angular/core';
|
||||||
|
|
||||||
import { Webview } from 'vs/workbench/parts/html/browser/webview';
|
import { Webview } from 'vs/workbench/parts/html/browser/webview';
|
||||||
import { Parts } from 'vs/workbench/services/part/common/partService';
|
import { Parts, IPartService } from 'vs/workbench/services/part/common/partService';
|
||||||
import Event, { Emitter } from 'vs/base/common/event';
|
import Event, { Emitter } from 'vs/base/common/event';
|
||||||
import { IDisposable } from 'vs/base/common/lifecycle';
|
import { IDisposable } from 'vs/base/common/lifecycle';
|
||||||
import { memoize } from 'vs/base/common/decorators';
|
import { memoize } from 'vs/base/common/decorators';
|
||||||
@@ -14,9 +14,12 @@ import { memoize } from 'vs/base/common/decorators';
|
|||||||
import { DashboardWidget, IDashboardWidget, WidgetConfig, WIDGET_CONFIG } from 'sql/parts/dashboard/common/dashboardWidget';
|
import { DashboardWidget, IDashboardWidget, WidgetConfig, WIDGET_CONFIG } from 'sql/parts/dashboard/common/dashboardWidget';
|
||||||
import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service';
|
import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service';
|
||||||
import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service';
|
||||||
import { IDashboardWebview } from 'sql/services/dashboard/common/dashboardViewService';
|
import { IDashboardWebview, IDashboardViewService } from 'sql/services/dashboard/common/dashboardViewService';
|
||||||
|
|
||||||
import * as sqlops from 'sqlops';
|
import * as sqlops from 'sqlops';
|
||||||
|
import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
||||||
|
import { IContextViewService } from 'vs/platform/contextview/browser/contextView';
|
||||||
|
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
|
||||||
|
|
||||||
interface IWebviewWidgetConfig {
|
interface IWebviewWidgetConfig {
|
||||||
id: string;
|
id: string;
|
||||||
@@ -36,21 +39,24 @@ export class WebviewWidget extends DashboardWidget implements IDashboardWidget,
|
|||||||
private _onMessage = new Emitter<string>();
|
private _onMessage = new Emitter<string>();
|
||||||
public readonly onMessage: Event<string> = this._onMessage.event;
|
public readonly onMessage: Event<string> = this._onMessage.event;
|
||||||
private _onMessageDisposable: IDisposable;
|
private _onMessageDisposable: IDisposable;
|
||||||
private _dashboardService: DashboardServiceInterface;
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(forwardRef(() => CommonServiceInterface)) private commonService: CommonServiceInterface,
|
@Inject(forwardRef(() => CommonServiceInterface)) private _dashboardService: DashboardServiceInterface,
|
||||||
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeRef: ChangeDetectorRef,
|
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeRef: ChangeDetectorRef,
|
||||||
@Inject(WIDGET_CONFIG) protected _config: WidgetConfig,
|
@Inject(WIDGET_CONFIG) protected _config: WidgetConfig,
|
||||||
@Inject(forwardRef(() => ElementRef)) private _el: ElementRef
|
@Inject(forwardRef(() => ElementRef)) private _el: ElementRef,
|
||||||
|
@Inject(IWorkbenchThemeService) private themeService: IWorkbenchThemeService,
|
||||||
|
@Inject(IContextViewService) private contextViewService: IContextViewService,
|
||||||
|
@Inject(IDashboardViewService) private dashboardViewService: IDashboardViewService,
|
||||||
|
@Inject(IPartService) private partService: IPartService,
|
||||||
|
@Inject(IEnvironmentService) private environmentService: IEnvironmentService
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
this._id = (_config.widget[selector] as IWebviewWidgetConfig).id;
|
this._id = (_config.widget[selector] as IWebviewWidgetConfig).id;
|
||||||
this._dashboardService = commonService as DashboardServiceInterface;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this._dashboardService.dashboardViewService.registerWebview(this);
|
this.dashboardViewService.registerWebview(this);
|
||||||
this._createWebview();
|
this._createWebview();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,10 +107,10 @@ export class WebviewWidget extends DashboardWidget implements IDashboardWidget,
|
|||||||
}
|
}
|
||||||
this._webview = new Webview(
|
this._webview = new Webview(
|
||||||
this._el.nativeElement,
|
this._el.nativeElement,
|
||||||
this._dashboardService.partService.getContainer(Parts.EDITOR_PART),
|
this.partService.getContainer(Parts.EDITOR_PART),
|
||||||
this._dashboardService.themeService,
|
this.themeService,
|
||||||
this._dashboardService.environmentService,
|
this.environmentService,
|
||||||
this._dashboardService.contextViewService,
|
this.contextViewService,
|
||||||
undefined,
|
undefined,
|
||||||
undefined,
|
undefined,
|
||||||
{
|
{
|
||||||
@@ -115,7 +121,7 @@ export class WebviewWidget extends DashboardWidget implements IDashboardWidget,
|
|||||||
this._onMessageDisposable = this._webview.onMessage(e => {
|
this._onMessageDisposable = this._webview.onMessage(e => {
|
||||||
this._onMessage.fire(e);
|
this._onMessage.fire(e);
|
||||||
});
|
});
|
||||||
this._webview.style(this._dashboardService.themeService.getTheme());
|
this._webview.style(this.themeService.getTheme());
|
||||||
if (this._html) {
|
if (this._html) {
|
||||||
this._webview.contents = this._html;
|
this._webview.contents = this._html;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,8 +19,9 @@ import { IConnectionProfile } from 'sql/parts/connection/common/interfaces';
|
|||||||
import * as BackupConstants from 'sql/parts/disasterRecovery/backup/constants';
|
import * as BackupConstants from 'sql/parts/disasterRecovery/backup/constants';
|
||||||
import { IBackupService, IBackupUiService, TaskExecutionMode } from 'sql/parts/disasterRecovery/backup/common/backupService';
|
import { IBackupService, IBackupUiService, TaskExecutionMode } from 'sql/parts/disasterRecovery/backup/common/backupService';
|
||||||
import FileValidationConstants = require('sql/parts/fileBrowser/common/fileValidationServiceConstants');
|
import FileValidationConstants = require('sql/parts/fileBrowser/common/fileValidationServiceConstants');
|
||||||
import { DashboardComponentParams } from 'sql/services/bootstrap/bootstrapParams';
|
import { IDashboardComponentParams } from 'sql/services/bootstrap/bootstrapParams';
|
||||||
import { IBootstrapService, BOOTSTRAP_SERVICE_ID } from 'sql/services/bootstrap/bootstrapService';
|
import { IFileBrowserDialogController } from 'sql/parts/fileBrowser/common/interfaces';
|
||||||
|
import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement';
|
||||||
|
|
||||||
import { MessageType } from 'vs/base/browser/ui/inputbox/inputBox';
|
import { MessageType } from 'vs/base/browser/ui/inputbox/inputBox';
|
||||||
import * as lifecycle from 'vs/base/common/lifecycle';
|
import * as lifecycle from 'vs/base/common/lifecycle';
|
||||||
@@ -30,6 +31,9 @@ import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
|
|||||||
import { KeyCode } from 'vs/base/common/keyCodes';
|
import { KeyCode } from 'vs/base/common/keyCodes';
|
||||||
import * as types from 'vs/base/common/types';
|
import * as types from 'vs/base/common/types';
|
||||||
import * as strings from 'vs/base/common/strings';
|
import * as strings from 'vs/base/common/strings';
|
||||||
|
import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService';
|
||||||
|
import { IContextViewService } from 'vs/platform/contextview/browser/contextView';
|
||||||
|
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
|
||||||
|
|
||||||
export const BACKUP_SELECTOR: string = 'backup-component';
|
export const BACKUP_SELECTOR: string = 'backup-component';
|
||||||
|
|
||||||
@@ -143,8 +147,6 @@ export class BackupComponent {
|
|||||||
|
|
||||||
private localizedStrings = LocalizedStrings;
|
private localizedStrings = LocalizedStrings;
|
||||||
|
|
||||||
private _backupService: IBackupService;
|
|
||||||
private _backupUiService: IBackupUiService;
|
|
||||||
private _uri: string;
|
private _uri: string;
|
||||||
private _toDispose: lifecycle.IDisposable[] = [];
|
private _toDispose: lifecycle.IDisposable[] = [];
|
||||||
private _advancedHeaderSize = 32;
|
private _advancedHeaderSize = 32;
|
||||||
@@ -199,10 +201,14 @@ export class BackupComponent {
|
|||||||
constructor(
|
constructor(
|
||||||
@Inject(forwardRef(() => ElementRef)) private _el: ElementRef,
|
@Inject(forwardRef(() => ElementRef)) private _el: ElementRef,
|
||||||
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeDetectorRef: ChangeDetectorRef,
|
@Inject(forwardRef(() => ChangeDetectorRef)) private _changeDetectorRef: ChangeDetectorRef,
|
||||||
@Inject(BOOTSTRAP_SERVICE_ID) private _bootstrapService: IBootstrapService,
|
@Inject(IWorkbenchThemeService) private themeService: IWorkbenchThemeService,
|
||||||
|
@Inject(IContextViewService) private contextViewService: IContextViewService,
|
||||||
|
@Inject(IFileBrowserDialogController) private fileBrowserDialogService: IFileBrowserDialogController,
|
||||||
|
@Inject(IBackupUiService) private _backupUiService: IBackupUiService,
|
||||||
|
@Inject(IBackupService) private _backupService: IBackupService,
|
||||||
|
@Inject(IClipboardService) private clipboardService: IClipboardService,
|
||||||
|
@Inject(IConnectionManagementService) private connectionManagementService: IConnectionManagementService
|
||||||
) {
|
) {
|
||||||
this._backupService = _bootstrapService.backupService;
|
|
||||||
this._backupUiService = _bootstrapService.backupUiService;
|
|
||||||
this._backupUiService.onShowBackupEvent((param) => this.onGetBackupConfigInfo(param));
|
this._backupUiService.onShowBackupEvent((param) => this.onGetBackupConfigInfo(param));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,12 +216,12 @@ export class BackupComponent {
|
|||||||
let self = this;
|
let self = this;
|
||||||
this.addFooterButtons();
|
this.addFooterButtons();
|
||||||
|
|
||||||
this.recoveryBox = new InputBox(this.recoveryModelElement.nativeElement, this._bootstrapService.contextViewService, {
|
this.recoveryBox = new InputBox(this.recoveryModelElement.nativeElement, this.contextViewService, {
|
||||||
placeholder: this.recoveryModel,
|
placeholder: this.recoveryModel,
|
||||||
ariaLabel: LocalizedStrings.RECOVERY_MODEL
|
ariaLabel: LocalizedStrings.RECOVERY_MODEL
|
||||||
});
|
});
|
||||||
// Set backup type
|
// Set backup type
|
||||||
this.backupTypeSelectBox = new SelectBox([], '', this._bootstrapService.contextViewService);
|
this.backupTypeSelectBox = new SelectBox([], '', this.contextViewService);
|
||||||
this.backupTypeSelectBox.render(this.backupTypeElement.nativeElement);
|
this.backupTypeSelectBox.render(this.backupTypeElement.nativeElement);
|
||||||
|
|
||||||
// Set copy-only check box
|
// Set copy-only check box
|
||||||
@@ -259,12 +265,12 @@ export class BackupComponent {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Set backup name
|
// Set backup name
|
||||||
this.backupNameBox = new InputBox(this.backupNameElement.nativeElement, this._bootstrapService.contextViewService, {
|
this.backupNameBox = new InputBox(this.backupNameElement.nativeElement, this.contextViewService, {
|
||||||
ariaLabel: LocalizedStrings.BACKUP_NAME
|
ariaLabel: LocalizedStrings.BACKUP_NAME
|
||||||
});
|
});
|
||||||
|
|
||||||
// Set backup path list
|
// Set backup path list
|
||||||
this.pathListBox = new ListBox([], '', this._bootstrapService.contextViewService, this._bootstrapService.clipboardService);
|
this.pathListBox = new ListBox([], '', this.contextViewService, this.clipboardService);
|
||||||
this.pathListBox.render(this.pathElement.nativeElement);
|
this.pathListBox.render(this.pathElement.nativeElement);
|
||||||
|
|
||||||
// Set backup path add/remove buttons
|
// Set backup path add/remove buttons
|
||||||
@@ -277,18 +283,18 @@ export class BackupComponent {
|
|||||||
this.removePathButton.title = localize('removeFile', 'Remove files');
|
this.removePathButton.title = localize('removeFile', 'Remove files');
|
||||||
|
|
||||||
// Set compression
|
// Set compression
|
||||||
this.compressionSelectBox = new SelectBox(this.compressionOptions, this.compressionOptions[0], this._bootstrapService.contextViewService);
|
this.compressionSelectBox = new SelectBox(this.compressionOptions, this.compressionOptions[0], this.contextViewService);
|
||||||
this.compressionSelectBox.render(this.compressionElement.nativeElement);
|
this.compressionSelectBox.render(this.compressionElement.nativeElement);
|
||||||
|
|
||||||
// Set encryption
|
// Set encryption
|
||||||
this.algorithmSelectBox = new SelectBox(this.encryptionAlgorithms, this.encryptionAlgorithms[0], this._bootstrapService.contextViewService);
|
this.algorithmSelectBox = new SelectBox(this.encryptionAlgorithms, this.encryptionAlgorithms[0], this.contextViewService);
|
||||||
this.algorithmSelectBox.render(this.encryptionAlgorithmElement.nativeElement);
|
this.algorithmSelectBox.render(this.encryptionAlgorithmElement.nativeElement);
|
||||||
this.encryptorSelectBox = new SelectBox([], '', this._bootstrapService.contextViewService);
|
this.encryptorSelectBox = new SelectBox([], '', this.contextViewService);
|
||||||
this.encryptorSelectBox.render(this.encryptorElement.nativeElement);
|
this.encryptorSelectBox.render(this.encryptorElement.nativeElement);
|
||||||
|
|
||||||
// Set media
|
// Set media
|
||||||
this.mediaNameBox = new InputBox(this.mediaNameElement.nativeElement,
|
this.mediaNameBox = new InputBox(this.mediaNameElement.nativeElement,
|
||||||
this._bootstrapService.contextViewService,
|
this.contextViewService,
|
||||||
{
|
{
|
||||||
validationOptions: {
|
validationOptions: {
|
||||||
validation: (value: string) => !value ? ({ type: MessageType.ERROR, content: LocalizedStrings.MEDIA_NAME_REQUIRED_ERROR }) : null
|
validation: (value: string) => !value ? ({ type: MessageType.ERROR, content: LocalizedStrings.MEDIA_NAME_REQUIRED_ERROR }) : null
|
||||||
@@ -297,14 +303,14 @@ export class BackupComponent {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
this.mediaDescriptionBox = new InputBox(this.mediaDescriptionElement.nativeElement, this._bootstrapService.contextViewService, {
|
this.mediaDescriptionBox = new InputBox(this.mediaDescriptionElement.nativeElement, this.contextViewService, {
|
||||||
ariaLabel: LocalizedStrings.NEW_MEDIA_SET_DESCRIPTION
|
ariaLabel: LocalizedStrings.NEW_MEDIA_SET_DESCRIPTION
|
||||||
});
|
});
|
||||||
|
|
||||||
// Set backup retain days
|
// Set backup retain days
|
||||||
let invalidInputMessage = localize('backupComponent.invalidInput', 'Invalid input. Value must be greater than or equal 0.');
|
let invalidInputMessage = localize('backupComponent.invalidInput', 'Invalid input. Value must be greater than or equal 0.');
|
||||||
this.backupRetainDaysBox = new InputBox(this.backupDaysElement.nativeElement,
|
this.backupRetainDaysBox = new InputBox(this.backupDaysElement.nativeElement,
|
||||||
this._bootstrapService.contextViewService,
|
this.contextViewService,
|
||||||
{
|
{
|
||||||
placeholder: '0',
|
placeholder: '0',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
@@ -387,21 +393,21 @@ export class BackupComponent {
|
|||||||
this.scriptButton = new Button(this.scriptButtonElement.nativeElement);
|
this.scriptButton = new Button(this.scriptButtonElement.nativeElement);
|
||||||
this.scriptButton.label = localize('backupComponent.script', 'Script');
|
this.scriptButton.label = localize('backupComponent.script', 'Script');
|
||||||
this.addButtonClickHandler(this.scriptButton, () => this.onScript());
|
this.addButtonClickHandler(this.scriptButton, () => this.onScript());
|
||||||
this._toDispose.push(attachButtonStyler(this.scriptButton, this._bootstrapService.themeService));
|
this._toDispose.push(attachButtonStyler(this.scriptButton, this.themeService));
|
||||||
this.scriptButton.enabled = false;
|
this.scriptButton.enabled = false;
|
||||||
|
|
||||||
// Set backup footer button
|
// Set backup footer button
|
||||||
this.backupButton = new Button(this.backupButtonElement.nativeElement);
|
this.backupButton = new Button(this.backupButtonElement.nativeElement);
|
||||||
this.backupButton.label = localize('backupComponent.backup', 'Backup');
|
this.backupButton.label = localize('backupComponent.backup', 'Backup');
|
||||||
this.addButtonClickHandler(this.backupButton, () => this.onOk());
|
this.addButtonClickHandler(this.backupButton, () => this.onOk());
|
||||||
this._toDispose.push(attachButtonStyler(this.backupButton, this._bootstrapService.themeService));
|
this._toDispose.push(attachButtonStyler(this.backupButton, this.themeService));
|
||||||
this.backupEnabled = false;
|
this.backupEnabled = false;
|
||||||
|
|
||||||
// Set cancel footer button
|
// Set cancel footer button
|
||||||
this.cancelButton = new Button(this.cancelButtonElement.nativeElement);
|
this.cancelButton = new Button(this.cancelButtonElement.nativeElement);
|
||||||
this.cancelButton.label = localize('backupComponent.cancel', 'Cancel');
|
this.cancelButton.label = localize('backupComponent.cancel', 'Cancel');
|
||||||
this.addButtonClickHandler(this.cancelButton, () => this.onCancel());
|
this.addButtonClickHandler(this.cancelButton, () => this.onCancel());
|
||||||
this._toDispose.push(attachButtonStyler(this.cancelButton, this._bootstrapService.themeService));
|
this._toDispose.push(attachButtonStyler(this.cancelButton, this.themeService));
|
||||||
}
|
}
|
||||||
|
|
||||||
private initialize(isMetadataPopulated: boolean): void {
|
private initialize(isMetadataPopulated: boolean): void {
|
||||||
@@ -505,18 +511,18 @@ export class BackupComponent {
|
|||||||
|
|
||||||
private registerListeners(): void {
|
private registerListeners(): void {
|
||||||
// Theme styler
|
// Theme styler
|
||||||
this._toDispose.push(attachInputBoxStyler(this.backupNameBox, this._bootstrapService.themeService));
|
this._toDispose.push(attachInputBoxStyler(this.backupNameBox, this.themeService));
|
||||||
this._toDispose.push(attachInputBoxStyler(this.recoveryBox, this._bootstrapService.themeService));
|
this._toDispose.push(attachInputBoxStyler(this.recoveryBox, this.themeService));
|
||||||
this._toDispose.push(attachSelectBoxStyler(this.backupTypeSelectBox, this._bootstrapService.themeService));
|
this._toDispose.push(attachSelectBoxStyler(this.backupTypeSelectBox, this.themeService));
|
||||||
this._toDispose.push(attachListBoxStyler(this.pathListBox, this._bootstrapService.themeService));
|
this._toDispose.push(attachListBoxStyler(this.pathListBox, this.themeService));
|
||||||
this._toDispose.push(attachButtonStyler(this.addPathButton, this._bootstrapService.themeService));
|
this._toDispose.push(attachButtonStyler(this.addPathButton, this.themeService));
|
||||||
this._toDispose.push(attachButtonStyler(this.removePathButton, this._bootstrapService.themeService));
|
this._toDispose.push(attachButtonStyler(this.removePathButton, this.themeService));
|
||||||
this._toDispose.push(attachSelectBoxStyler(this.compressionSelectBox, this._bootstrapService.themeService));
|
this._toDispose.push(attachSelectBoxStyler(this.compressionSelectBox, this.themeService));
|
||||||
this._toDispose.push(attachSelectBoxStyler(this.algorithmSelectBox, this._bootstrapService.themeService));
|
this._toDispose.push(attachSelectBoxStyler(this.algorithmSelectBox, this.themeService));
|
||||||
this._toDispose.push(attachSelectBoxStyler(this.encryptorSelectBox, this._bootstrapService.themeService));
|
this._toDispose.push(attachSelectBoxStyler(this.encryptorSelectBox, this.themeService));
|
||||||
this._toDispose.push(attachInputBoxStyler(this.mediaNameBox, this._bootstrapService.themeService));
|
this._toDispose.push(attachInputBoxStyler(this.mediaNameBox, this.themeService));
|
||||||
this._toDispose.push(attachInputBoxStyler(this.mediaDescriptionBox, this._bootstrapService.themeService));
|
this._toDispose.push(attachInputBoxStyler(this.mediaDescriptionBox, this.themeService));
|
||||||
this._toDispose.push(attachInputBoxStyler(this.backupRetainDaysBox, this._bootstrapService.themeService));
|
this._toDispose.push(attachInputBoxStyler(this.backupRetainDaysBox, this.themeService));
|
||||||
|
|
||||||
this._toDispose.push(this.backupTypeSelectBox.onDidSelect(selected => this.onBackupTypeChanged()));
|
this._toDispose.push(this.backupTypeSelectBox.onDidSelect(selected => this.onBackupTypeChanged()));
|
||||||
this.addButtonClickHandler(this.addPathButton, () => this.onAddClick());
|
this.addButtonClickHandler(this.addPathButton, () => this.onAddClick());
|
||||||
@@ -528,7 +534,7 @@ export class BackupComponent {
|
|||||||
this.backupRetainDaysChanged(days);
|
this.backupRetainDaysChanged(days);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this._toDispose.push(this._bootstrapService.themeService.onDidColorThemeChange(e => this.updateTheme()));
|
this._toDispose.push(this.themeService.onDidColorThemeChange(e => this.updateTheme()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update theming that is specific to backup dialog
|
// Update theming that is specific to backup dialog
|
||||||
@@ -566,7 +572,7 @@ export class BackupComponent {
|
|||||||
|
|
||||||
private onCancel(): void {
|
private onCancel(): void {
|
||||||
this.close();
|
this.close();
|
||||||
this._bootstrapService.connectionManagementService.disconnect(this._uri);
|
this.connectionManagementService.disconnect(this._uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
private close(): void {
|
private close(): void {
|
||||||
@@ -629,7 +635,7 @@ export class BackupComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private onAddClick(): void {
|
private onAddClick(): void {
|
||||||
this._bootstrapService.fileBrowserDialogService.showDialog(this._uri,
|
this.fileBrowserDialogService.showDialog(this._uri,
|
||||||
this.defaultNewBackupFolder,
|
this.defaultNewBackupFolder,
|
||||||
BackupConstants.fileFiltersSet,
|
BackupConstants.fileFiltersSet,
|
||||||
FileValidationConstants.backup,
|
FileValidationConstants.backup,
|
||||||
|
|||||||
@@ -3,43 +3,50 @@
|
|||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
import { ApplicationRef, ComponentFactoryResolver, ModuleWithProviders, NgModule,
|
import {
|
||||||
Inject, forwardRef } from '@angular/core';
|
ApplicationRef, ComponentFactoryResolver, ModuleWithProviders, NgModule,
|
||||||
|
Inject, forwardRef, Type
|
||||||
|
} from '@angular/core';
|
||||||
import { APP_BASE_HREF, CommonModule } from '@angular/common';
|
import { APP_BASE_HREF, CommonModule } from '@angular/common';
|
||||||
import { FormsModule } from '@angular/forms';
|
import { FormsModule } from '@angular/forms';
|
||||||
import { BrowserModule } from '@angular/platform-browser';
|
import { BrowserModule } from '@angular/platform-browser';
|
||||||
import { IBootstrapService, BOOTSTRAP_SERVICE_ID } from 'sql/services/bootstrap/bootstrapService';
|
import { IBootstrapParams } from 'sql/services/bootstrap/bootstrapService';
|
||||||
import { BackupComponent, BACKUP_SELECTOR } from 'sql/parts/disasterRecovery/backup/backup.component';
|
import { BackupComponent, BACKUP_SELECTOR } from 'sql/parts/disasterRecovery/backup/backup.component';
|
||||||
|
|
||||||
// work around
|
// work around
|
||||||
const BrowserAnimationsModule = (<any> require.__$__nodeRequire('@angular/platform-browser/animations')).BrowserAnimationsModule;
|
const BrowserAnimationsModule = (<any>require.__$__nodeRequire('@angular/platform-browser/animations')).BrowserAnimationsModule;
|
||||||
|
|
||||||
// Backup wizard main angular module
|
// Backup wizard main angular module
|
||||||
@NgModule({
|
export const BackupModule = (params: IBootstrapParams, selector: string): Type<any> => {
|
||||||
declarations: [
|
@NgModule({
|
||||||
BackupComponent
|
declarations: [
|
||||||
],
|
BackupComponent
|
||||||
entryComponents: [BackupComponent],
|
],
|
||||||
imports: [
|
entryComponents: [BackupComponent],
|
||||||
FormsModule,
|
imports: [
|
||||||
CommonModule,
|
FormsModule,
|
||||||
BrowserModule,
|
CommonModule,
|
||||||
BrowserAnimationsModule,
|
BrowserModule,
|
||||||
],
|
BrowserAnimationsModule,
|
||||||
providers: [{ provide: APP_BASE_HREF, useValue: '/' }]
|
],
|
||||||
})
|
providers: [
|
||||||
export class BackupModule {
|
{ provide: APP_BASE_HREF, useValue: '/' },
|
||||||
|
{ provide: IBootstrapParams, useValue: params }
|
||||||
|
]
|
||||||
|
})
|
||||||
|
class ModuleClass {
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(forwardRef(() => ComponentFactoryResolver)) private _resolver: ComponentFactoryResolver,
|
@Inject(forwardRef(() => ComponentFactoryResolver)) private _resolver: ComponentFactoryResolver
|
||||||
@Inject(BOOTSTRAP_SERVICE_ID) private _bootstrapService: IBootstrapService
|
) {
|
||||||
) {
|
}
|
||||||
|
|
||||||
|
ngDoBootstrap(appRef: ApplicationRef) {
|
||||||
|
const factory = this._resolver.resolveComponentFactory(BackupComponent);
|
||||||
|
(<any>factory).factory.selector = selector;
|
||||||
|
appRef.bootstrap(factory);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ngDoBootstrap(appRef: ApplicationRef) {
|
return ModuleClass;
|
||||||
const factory = this._resolver.resolveComponentFactory(BackupComponent);
|
};
|
||||||
const uniqueSelector: string = this._bootstrapService.getUniqueSelector(BACKUP_SELECTOR);
|
|
||||||
(<any>factory).factory.selector = uniqueSelector;
|
|
||||||
appRef.bootstrap(factory);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import { Modal } from 'sql/base/browser/ui/modal/modal';
|
|||||||
import { IConnectionProfile } from 'sql/parts/connection/common/interfaces';
|
import { IConnectionProfile } from 'sql/parts/connection/common/interfaces';
|
||||||
import { BackupModule } from 'sql/parts/disasterRecovery/backup/backup.module';
|
import { BackupModule } from 'sql/parts/disasterRecovery/backup/backup.module';
|
||||||
import { BACKUP_SELECTOR } from 'sql/parts/disasterRecovery/backup/backup.component';
|
import { BACKUP_SELECTOR } from 'sql/parts/disasterRecovery/backup/backup.component';
|
||||||
import { IBootstrapService } from 'sql/services/bootstrap/bootstrapService';
|
|
||||||
import { attachModalDialogStyler } from 'sql/common/theme/styler';
|
import { attachModalDialogStyler } from 'sql/common/theme/styler';
|
||||||
import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement';
|
import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement';
|
||||||
import * as TelemetryKeys from 'sql/common/telemetryKeys';
|
import * as TelemetryKeys from 'sql/common/telemetryKeys';
|
||||||
@@ -17,6 +16,8 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
|||||||
import { IPartService } from 'vs/workbench/services/part/common/partService';
|
import { IPartService } from 'vs/workbench/services/part/common/partService';
|
||||||
import { Builder } from 'vs/base/browser/builder';
|
import { Builder } from 'vs/base/browser/builder';
|
||||||
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
||||||
|
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||||
|
import { bootstrapAngular } from 'sql/services/bootstrap/bootstrapService';
|
||||||
|
|
||||||
export class BackupDialog extends Modal {
|
export class BackupDialog extends Modal {
|
||||||
private _bodyBuilder: Builder;
|
private _bodyBuilder: Builder;
|
||||||
@@ -25,12 +26,12 @@ export class BackupDialog extends Modal {
|
|||||||
private _moduleRef: any;
|
private _moduleRef: any;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@IBootstrapService private _bootstrapService: IBootstrapService,
|
|
||||||
@IThemeService private _themeService: IThemeService,
|
@IThemeService private _themeService: IThemeService,
|
||||||
@IPartService partService: IPartService,
|
@IPartService partService: IPartService,
|
||||||
@IConnectionManagementService private _connectionManagementService: IConnectionManagementService,
|
@IConnectionManagementService private _connectionManagementService: IConnectionManagementService,
|
||||||
@ITelemetryService telemetryService: ITelemetryService,
|
@ITelemetryService telemetryService: ITelemetryService,
|
||||||
@IContextKeyService contextKeyService: IContextKeyService
|
@IContextKeyService contextKeyService: IContextKeyService,
|
||||||
|
@IInstantiationService private _instantiationService: IInstantiationService
|
||||||
) {
|
) {
|
||||||
super('', TelemetryKeys.Backup, partService, telemetryService, contextKeyService, { isAngular: true, hasErrors: true });
|
super('', TelemetryKeys.Backup, partService, telemetryService, contextKeyService, { isAngular: true, hasErrors: true });
|
||||||
}
|
}
|
||||||
@@ -53,7 +54,7 @@ export class BackupDialog extends Modal {
|
|||||||
* Get the bootstrap params and perform the bootstrap
|
* Get the bootstrap params and perform the bootstrap
|
||||||
*/
|
*/
|
||||||
private bootstrapAngular(bodyContainer: HTMLElement) {
|
private bootstrapAngular(bodyContainer: HTMLElement) {
|
||||||
this._uniqueSelector = this._bootstrapService.bootstrap(
|
this._uniqueSelector = this._instantiationService.invokeFunction(bootstrapAngular,
|
||||||
BackupModule,
|
BackupModule,
|
||||||
bodyContainer,
|
bodyContainer,
|
||||||
BACKUP_SELECTOR,
|
BACKUP_SELECTOR,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'
|
|||||||
import Event from 'vs/base/common/event';
|
import Event from 'vs/base/common/event';
|
||||||
import * as sqlops from 'sqlops';
|
import * as sqlops from 'sqlops';
|
||||||
|
|
||||||
import { DashboardComponentParams } from 'sql/services/bootstrap/bootstrapParams';
|
import { IDashboardComponentParams } from 'sql/services/bootstrap/bootstrapParams';
|
||||||
import { IConnectionProfile } from 'sql/parts/connection/common/interfaces';
|
import { IConnectionProfile } from 'sql/parts/connection/common/interfaces';
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import { IBackupService, TaskExecutionMode, IBackupUiService } from 'sql/parts/d
|
|||||||
import { BackupDialog } from 'sql/parts/disasterRecovery/backup/backupDialog';
|
import { BackupDialog } from 'sql/parts/disasterRecovery/backup/backupDialog';
|
||||||
import { OptionsDialog } from 'sql/base/browser/ui/modal/optionsDialog';
|
import { OptionsDialog } from 'sql/base/browser/ui/modal/optionsDialog';
|
||||||
import Event, { Emitter } from 'vs/base/common/event';
|
import Event, { Emitter } from 'vs/base/common/event';
|
||||||
import { DashboardComponentParams } from 'sql/services/bootstrap/bootstrapParams';
|
import { IDashboardComponentParams } from 'sql/services/bootstrap/bootstrapParams';
|
||||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||||
import { IPartService } from 'vs/workbench/services/part/common/partService';
|
import { IPartService } from 'vs/workbench/services/part/common/partService';
|
||||||
import { ICapabilitiesService } from 'sql/services/capabilities/capabilitiesService';
|
import { ICapabilitiesService } from 'sql/services/capabilities/capabilitiesService';
|
||||||
@@ -22,7 +22,6 @@ import { IConnectionProfile } from 'sql/parts/connection/common/interfaces';
|
|||||||
import { TPromise } from 'vs/base/common/winjs.base';
|
import { TPromise } from 'vs/base/common/winjs.base';
|
||||||
import * as ConnectionUtils from 'sql/parts/connection/common/utils';
|
import * as ConnectionUtils from 'sql/parts/connection/common/utils';
|
||||||
import { ProviderConnectionInfo } from 'sql/parts/connection/common/providerConnectionInfo';
|
import { ProviderConnectionInfo } from 'sql/parts/connection/common/providerConnectionInfo';
|
||||||
import { ServiceOption } from 'sqlops';
|
|
||||||
|
|
||||||
export class BackupService implements IBackupService {
|
export class BackupService implements IBackupService {
|
||||||
|
|
||||||
@@ -96,11 +95,13 @@ export class BackupUiService implements IBackupUiService {
|
|||||||
private _onShowBackupEvent: Emitter<{ connection: IConnectionProfile, ownerUri: string }>;
|
private _onShowBackupEvent: Emitter<{ connection: IConnectionProfile, ownerUri: string }>;
|
||||||
public get onShowBackupEvent(): Event<{ connection: IConnectionProfile, ownerUri: string }> { return this._onShowBackupEvent.event; }
|
public get onShowBackupEvent(): Event<{ connection: IConnectionProfile, ownerUri: string }> { return this._onShowBackupEvent.event; }
|
||||||
|
|
||||||
constructor( @IInstantiationService private _instantiationService: IInstantiationService,
|
constructor(
|
||||||
|
@IInstantiationService private _instantiationService: IInstantiationService,
|
||||||
@IPartService private _partService: IPartService,
|
@IPartService private _partService: IPartService,
|
||||||
@ICapabilitiesService private _capabilitiesService: ICapabilitiesService,
|
@ICapabilitiesService private _capabilitiesService: ICapabilitiesService,
|
||||||
@IBackupService private _disasterRecoveryService: IBackupService,
|
@IBackupService private _disasterRecoveryService: IBackupService,
|
||||||
@IConnectionManagementService private _connectionManagementService: IConnectionManagementService) {
|
@IConnectionManagementService private _connectionManagementService: IConnectionManagementService
|
||||||
|
) {
|
||||||
this._onShowBackupEvent = new Emitter<{ connection: IConnectionProfile, ownerUri: string }>();
|
this._onShowBackupEvent = new Emitter<{ connection: IConnectionProfile, ownerUri: string }>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,7 +116,7 @@ export class BackupUiService implements IBackupUiService {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private getOptions(provider: string): ServiceOption[] {
|
private getOptions(provider: string): sqlops.ServiceOption[] {
|
||||||
let feature = this._capabilitiesService.getLegacyCapabilities(this._currentProvider).features.find(f => f.featureName === 'backup');
|
let feature = this._capabilitiesService.getLegacyCapabilities(this._currentProvider).features.find(f => f.featureName === 'backup');
|
||||||
if (feature) {
|
if (feature) {
|
||||||
return feature.optionsMetadata;
|
return feature.optionsMetadata;
|
||||||
|
|||||||
@@ -17,6 +17,11 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
|||||||
import { IPartService } from 'vs/workbench/services/part/common/partService';
|
import { IPartService } from 'vs/workbench/services/part/common/partService';
|
||||||
import { localize } from 'vs/nls';
|
import { localize } from 'vs/nls';
|
||||||
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||||
|
import { mixin } from 'vs/base/common/objects';
|
||||||
|
import * as DOM from 'vs/base/browser/dom';
|
||||||
|
import * as strings from 'vs/base/common/strings';
|
||||||
|
|
||||||
|
import * as sqlops from 'sqlops';
|
||||||
|
|
||||||
import { Button } from 'sql/base/browser/ui/button/button';
|
import { Button } from 'sql/base/browser/ui/button/button';
|
||||||
import { Checkbox } from 'sql/base/browser/ui/checkbox/checkbox';
|
import { Checkbox } from 'sql/base/browser/ui/checkbox/checkbox';
|
||||||
@@ -33,14 +38,10 @@ import * as TelemetryKeys from 'sql/common/telemetryKeys';
|
|||||||
import * as BackupConstants from 'sql/parts/disasterRecovery/backup/constants';
|
import * as BackupConstants from 'sql/parts/disasterRecovery/backup/constants';
|
||||||
import { RestoreViewModel, RestoreOptionParam, SouceDatabaseNamesParam } from 'sql/parts/disasterRecovery/restore/restoreViewModel';
|
import { RestoreViewModel, RestoreOptionParam, SouceDatabaseNamesParam } from 'sql/parts/disasterRecovery/restore/restoreViewModel';
|
||||||
import * as FileValidationConstants from 'sql/parts/fileBrowser/common/fileValidationServiceConstants';
|
import * as FileValidationConstants from 'sql/parts/fileBrowser/common/fileValidationServiceConstants';
|
||||||
import { IBootstrapService } from 'sql/services/bootstrap/bootstrapService';
|
|
||||||
import { Dropdown } from 'sql/base/browser/ui/editableDropdown/dropdown';
|
import { Dropdown } from 'sql/base/browser/ui/editableDropdown/dropdown';
|
||||||
import { TabbedPanel, PanelTabIdentifier } from 'sql/base/browser/ui/panel/panel';
|
import { TabbedPanel, PanelTabIdentifier } from 'sql/base/browser/ui/panel/panel';
|
||||||
import * as DOM from 'vs/base/browser/dom';
|
|
||||||
import * as sqlops from 'sqlops';
|
|
||||||
import * as strings from 'vs/base/common/strings';
|
|
||||||
import { ServiceOptionType } from 'sql/workbench/api/common/sqlExtHostTypes';
|
import { ServiceOptionType } from 'sql/workbench/api/common/sqlExtHostTypes';
|
||||||
import { mixin } from 'vs/base/common/objects';
|
import { IFileBrowserDialogController } from 'sql/parts/fileBrowser/common/interfaces';
|
||||||
|
|
||||||
interface FileListElement {
|
interface FileListElement {
|
||||||
logicalFileName: string;
|
logicalFileName: string;
|
||||||
@@ -130,9 +131,9 @@ export class RestoreDialog extends Modal {
|
|||||||
@IPartService partService: IPartService,
|
@IPartService partService: IPartService,
|
||||||
@IThemeService private _themeService: IThemeService,
|
@IThemeService private _themeService: IThemeService,
|
||||||
@IContextViewService private _contextViewService: IContextViewService,
|
@IContextViewService private _contextViewService: IContextViewService,
|
||||||
@IBootstrapService private _bootstrapService: IBootstrapService,
|
|
||||||
@ITelemetryService telemetryService: ITelemetryService,
|
@ITelemetryService telemetryService: ITelemetryService,
|
||||||
@IContextKeyService contextKeyService: IContextKeyService
|
@IContextKeyService contextKeyService: IContextKeyService,
|
||||||
|
@IFileBrowserDialogController private fileBrowserDialogService: IFileBrowserDialogController
|
||||||
) {
|
) {
|
||||||
super(localize('RestoreDialogTitle', 'Restore database'), TelemetryKeys.Restore, partService, telemetryService, contextKeyService, { hasErrors: true, isWide: true, hasSpinner: true });
|
super(localize('RestoreDialogTitle', 'Restore database'), TelemetryKeys.Restore, partService, telemetryService, contextKeyService, { hasErrors: true, isWide: true, hasSpinner: true });
|
||||||
this._restoreTitle = localize('restoreDialog.restoreTitle', 'Restore database');
|
this._restoreTitle = localize('restoreDialog.restoreTitle', 'Restore database');
|
||||||
@@ -656,7 +657,7 @@ export class RestoreDialog extends Modal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private onFileBrowserRequested(): void {
|
private onFileBrowserRequested(): void {
|
||||||
this._bootstrapService.fileBrowserDialogService.showDialog(this._ownerUri,
|
this.fileBrowserDialogService.showDialog(this._ownerUri,
|
||||||
this.viewModel.defaultBackupFolder,
|
this.viewModel.defaultBackupFolder,
|
||||||
BackupConstants.fileFiltersSet,
|
BackupConstants.fileFiltersSet,
|
||||||
FileValidationConstants.restore,
|
FileValidationConstants.restore,
|
||||||
|
|||||||
@@ -4,19 +4,21 @@
|
|||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
import { TPromise } from 'vs/base/common/winjs.base';
|
import { TPromise } from 'vs/base/common/winjs.base';
|
||||||
import { EditorInput, EditorModel } from 'vs/workbench/common/editor';
|
import { EditorInput, EditorModel, ConfirmResult, EncodingMode } from 'vs/workbench/common/editor';
|
||||||
import { IConnectionManagementService, IConnectableInput, INewConnectionParams } from 'sql/parts/connection/common/connectionManagement';
|
import { IConnectionManagementService, IConnectableInput, INewConnectionParams } from 'sql/parts/connection/common/connectionManagement';
|
||||||
import { IQueryModelService } from 'sql/parts/query/execution/queryModel';
|
import { IQueryModelService } from 'sql/parts/query/execution/queryModel';
|
||||||
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
|
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
|
||||||
import Event, { Emitter } from 'vs/base/common/event';
|
import Event, { Emitter } from 'vs/base/common/event';
|
||||||
import { EditSessionReadyParams } from 'sqlops';
|
import { EditSessionReadyParams, ISelectionData } from 'sqlops';
|
||||||
import URI from 'vs/base/common/uri';
|
import URI from 'vs/base/common/uri';
|
||||||
import nls = require('vs/nls');
|
import nls = require('vs/nls');
|
||||||
import { INotificationService } from 'vs/platform/notification/common/notification';
|
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||||
import Severity from 'vs/base/common/severity';
|
import Severity from 'vs/base/common/severity';
|
||||||
|
import { UntitledEditorInput } from 'vs/workbench/common/editor/untitledEditorInput';
|
||||||
|
import { EditDataResultsInput } from 'sql/parts/editData/common/editDataResultsInput';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Input for the EditDataEditor. This input is simply a wrapper around a QueryResultsInput for the QueryResultsEditor
|
* Input for the EditDataEditor.
|
||||||
*/
|
*/
|
||||||
export class EditDataInput extends EditorInput implements IConnectableInput {
|
export class EditDataInput extends EditorInput implements IConnectableInput {
|
||||||
public static ID: string = 'workbench.editorinputs.editDataInput';
|
public static ID: string = 'workbench.editorinputs.editDataInput';
|
||||||
@@ -25,15 +27,23 @@ export class EditDataInput extends EditorInput implements IConnectableInput {
|
|||||||
private _editorContainer: HTMLElement;
|
private _editorContainer: HTMLElement;
|
||||||
private _updateTaskbar: Emitter<EditDataInput>;
|
private _updateTaskbar: Emitter<EditDataInput>;
|
||||||
private _editorInitializing: Emitter<boolean>;
|
private _editorInitializing: Emitter<boolean>;
|
||||||
private _showTableView: Emitter<EditDataInput>;
|
private _showResultsEditor: Emitter<EditDataInput>;
|
||||||
private _refreshButtonEnabled: boolean;
|
private _refreshButtonEnabled: boolean;
|
||||||
private _stopButtonEnabled: boolean;
|
private _stopButtonEnabled: boolean;
|
||||||
private _setup: boolean;
|
private _setup: boolean;
|
||||||
private _toDispose: IDisposable[];
|
private _toDispose: IDisposable[];
|
||||||
private _rowLimit: number;
|
private _rowLimit: number;
|
||||||
private _objectType: string;
|
private _objectType: string;
|
||||||
|
private _css: HTMLStyleElement;
|
||||||
|
private _useQueryFilter: boolean;
|
||||||
|
|
||||||
constructor(private _uri: URI, private _schemaName, private _tableName,
|
constructor(
|
||||||
|
private _uri: URI,
|
||||||
|
private _schemaName,
|
||||||
|
private _tableName,
|
||||||
|
private _sql: UntitledEditorInput,
|
||||||
|
private _queryString: string,
|
||||||
|
private _results: EditDataResultsInput,
|
||||||
@IConnectionManagementService private _connectionManagementService: IConnectionManagementService,
|
@IConnectionManagementService private _connectionManagementService: IConnectionManagementService,
|
||||||
@IQueryModelService private _queryModelService: IQueryModelService,
|
@IQueryModelService private _queryModelService: IQueryModelService,
|
||||||
@INotificationService private notificationService: INotificationService
|
@INotificationService private notificationService: INotificationService
|
||||||
@@ -42,12 +52,20 @@ export class EditDataInput extends EditorInput implements IConnectableInput {
|
|||||||
this._visible = false;
|
this._visible = false;
|
||||||
this._hasBootstrapped = false;
|
this._hasBootstrapped = false;
|
||||||
this._updateTaskbar = new Emitter<EditDataInput>();
|
this._updateTaskbar = new Emitter<EditDataInput>();
|
||||||
this._showTableView = new Emitter<EditDataInput>();
|
this._showResultsEditor = new Emitter<EditDataInput>();
|
||||||
this._editorInitializing = new Emitter<boolean>();
|
this._editorInitializing = new Emitter<boolean>();
|
||||||
this._setup = false;
|
this._setup = false;
|
||||||
this._stopButtonEnabled = false;
|
this._stopButtonEnabled = false;
|
||||||
this._refreshButtonEnabled = false;
|
this._refreshButtonEnabled = false;
|
||||||
this._toDispose = [];
|
this._toDispose = [];
|
||||||
|
this._useQueryFilter = false;
|
||||||
|
|
||||||
|
// re-emit sql editor events through this editor if it exists
|
||||||
|
if (this._sql) {
|
||||||
|
this._toDispose.push(this._sql.onDidChangeDirty(() => this._onDidChangeDirty.fire()));
|
||||||
|
this._sql.disableSaving();
|
||||||
|
}
|
||||||
|
this.disableSaving();
|
||||||
|
|
||||||
//TODO determine is this is a table or a view
|
//TODO determine is this is a table or a view
|
||||||
this._objectType = 'TABLE';
|
this._objectType = 'TABLE';
|
||||||
@@ -79,27 +97,45 @@ export class EditDataInput extends EditorInput implements IConnectableInput {
|
|||||||
public get tableName(): string { return this._tableName; }
|
public get tableName(): string { return this._tableName; }
|
||||||
public get schemaName(): string { return this._schemaName; }
|
public get schemaName(): string { return this._schemaName; }
|
||||||
public get uri(): string { return this._uri.toString(); }
|
public get uri(): string { return this._uri.toString(); }
|
||||||
public get updateTaskbar(): Event<EditDataInput> { return this._updateTaskbar.event; }
|
public get sql(): UntitledEditorInput { return this._sql; }
|
||||||
public get editorInitializing(): Event<boolean> { return this._editorInitializing.event; }
|
public get results(): EditDataResultsInput { return this._results; }
|
||||||
public get showTableView(): Event<EditDataInput> { return this._showTableView.event; }
|
public getResultsInputResource(): string { return this._results.uri; }
|
||||||
|
public get updateTaskbarEvent(): Event<EditDataInput> { return this._updateTaskbar.event; }
|
||||||
|
public get editorInitializingEvent(): Event<boolean> { return this._editorInitializing.event; }
|
||||||
|
public get showResultsEditorEvent(): Event<EditDataInput> { return this._showResultsEditor.event; }
|
||||||
public get stopButtonEnabled(): boolean { return this._stopButtonEnabled; }
|
public get stopButtonEnabled(): boolean { return this._stopButtonEnabled; }
|
||||||
public get refreshButtonEnabled(): boolean { return this._refreshButtonEnabled; }
|
public get refreshButtonEnabled(): boolean { return this._refreshButtonEnabled; }
|
||||||
public get container(): HTMLElement { return this._editorContainer; }
|
public get container(): HTMLElement { return this._editorContainer; }
|
||||||
public get hasBootstrapped(): boolean { return this._hasBootstrapped; }
|
public get hasBootstrapped(): boolean { return this._hasBootstrapped; }
|
||||||
public get visible(): boolean { return this._visible; }
|
|
||||||
public get setup(): boolean { return this._setup; }
|
public get setup(): boolean { return this._setup; }
|
||||||
public get rowLimit(): number { return this._rowLimit; }
|
public get rowLimit(): number { return this._rowLimit; }
|
||||||
public get objectType(): string { return this._objectType; }
|
public get objectType(): string { return this._objectType; }
|
||||||
|
public showResultsEditor(): void { this._showResultsEditor.fire(); }
|
||||||
|
public isDirty(): boolean { return false; }
|
||||||
|
public save(): TPromise<boolean> { return TPromise.as(false); }
|
||||||
|
public confirmSave(): TPromise<ConfirmResult> { return TPromise.wrap(ConfirmResult.DONT_SAVE); }
|
||||||
public getTypeId(): string { return EditDataInput.ID; }
|
public getTypeId(): string { return EditDataInput.ID; }
|
||||||
public setVisibleTrue(): void { this._visible = true; }
|
|
||||||
public setBootstrappedTrue(): void { this._hasBootstrapped = true; }
|
public setBootstrappedTrue(): void { this._hasBootstrapped = true; }
|
||||||
public getResource(): URI { return this._uri; }
|
public getResource(): URI { return this._uri; }
|
||||||
public getName(): string { return this._uri.path; }
|
|
||||||
public supportsSplitEditor(): boolean { return false; }
|
public supportsSplitEditor(): boolean { return false; }
|
||||||
public setupComplete() { this._setup = true; }
|
public setupComplete() { this._setup = true; }
|
||||||
public set container(container: HTMLElement) {
|
public get queryString(): string {
|
||||||
this._disposeContainer();
|
return this._queryString;
|
||||||
this._editorContainer = container;
|
}
|
||||||
|
public set queryString(queryString: string) {
|
||||||
|
this._queryString = queryString;
|
||||||
|
}
|
||||||
|
public get css(): HTMLStyleElement {
|
||||||
|
return this._css;
|
||||||
|
}
|
||||||
|
public set css(css: HTMLStyleElement) {
|
||||||
|
this._css = css;
|
||||||
|
}
|
||||||
|
public get queryPaneEnabled(): boolean {
|
||||||
|
return this._useQueryFilter;
|
||||||
|
}
|
||||||
|
public set queryPaneEnabled(useQueryFilter: boolean) {
|
||||||
|
this._useQueryFilter = useQueryFilter;
|
||||||
}
|
}
|
||||||
|
|
||||||
// State Update Callbacks
|
// State Update Callbacks
|
||||||
@@ -111,13 +147,9 @@ export class EditDataInput extends EditorInput implements IConnectableInput {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public initEditEnd(result: EditSessionReadyParams): void {
|
public initEditEnd(result: EditSessionReadyParams): void {
|
||||||
if (result.success) {
|
this._refreshButtonEnabled = true;
|
||||||
this._refreshButtonEnabled = true;
|
this._stopButtonEnabled = false;
|
||||||
this._stopButtonEnabled = false;
|
if (!result.success) {
|
||||||
} else {
|
|
||||||
this._refreshButtonEnabled = false;
|
|
||||||
this._stopButtonEnabled = false;
|
|
||||||
|
|
||||||
this.notificationService.notify({
|
this.notificationService.notify({
|
||||||
severity: Severity.Error,
|
severity: Severity.Error,
|
||||||
message: result.message
|
message: result.message
|
||||||
@@ -142,8 +174,16 @@ export class EditDataInput extends EditorInput implements IConnectableInput {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public onConnectSuccess(params?: INewConnectionParams): void {
|
public onConnectSuccess(params?: INewConnectionParams): void {
|
||||||
this._queryModelService.initializeEdit(this.uri, this.schemaName, this.tableName, this._objectType, this._rowLimit);
|
let rowLimit: number = undefined;
|
||||||
this._showTableView.fire(this);
|
let queryString: string = undefined;
|
||||||
|
if (this._useQueryFilter) {
|
||||||
|
queryString = this._queryString;
|
||||||
|
} else {
|
||||||
|
rowLimit = this._rowLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._queryModelService.initializeEdit(this.uri, this.schemaName, this.tableName, this._objectType, rowLimit, queryString);
|
||||||
|
this.showResultsEditor();
|
||||||
}
|
}
|
||||||
|
|
||||||
public onDisconnect(): void {
|
public onDisconnect(): void {
|
||||||
@@ -157,27 +197,19 @@ export class EditDataInput extends EditorInput implements IConnectableInput {
|
|||||||
// Boiler Plate Functions
|
// Boiler Plate Functions
|
||||||
public matches(otherInput: any): boolean {
|
public matches(otherInput: any): boolean {
|
||||||
if (otherInput instanceof EditDataInput) {
|
if (otherInput instanceof EditDataInput) {
|
||||||
return (this.uri === otherInput.uri);
|
return this._sql.matches(otherInput.sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return this._sql.matches(otherInput);
|
||||||
}
|
|
||||||
|
|
||||||
public resolve(refresh?: boolean): TPromise<EditorModel> {
|
|
||||||
return TPromise.as(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public dispose(): void {
|
public dispose(): void {
|
||||||
|
this._queryModelService.disposeQuery(this.uri);
|
||||||
|
this._sql.dispose();
|
||||||
|
this._results.dispose();
|
||||||
this._toDispose = dispose(this._toDispose);
|
this._toDispose = dispose(this._toDispose);
|
||||||
this._disposeContainer();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
private _disposeContainer() {
|
super.dispose();
|
||||||
if (this._editorContainer && this._editorContainer.parentElement) {
|
|
||||||
this._editorContainer.parentElement.removeChild(this._editorContainer);
|
|
||||||
this._editorContainer = null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public close(): void {
|
public close(): void {
|
||||||
@@ -186,11 +218,22 @@ export class EditDataInput extends EditorInput implements IConnectableInput {
|
|||||||
return this._connectionManagementService.disconnectEditor(this, true);
|
return this._connectionManagementService.disconnectEditor(this, true);
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
this.dispose();
|
this.dispose();
|
||||||
super.close();
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public get tabColor(): string {
|
public get tabColor(): string {
|
||||||
return this._connectionManagementService.getTabColorForUri(this.uri);
|
return this._connectionManagementService.getTabColorForUri(this.uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public get onDidModelChangeContent(): Event<void> { return this._sql.onDidModelChangeContent; }
|
||||||
|
public get onDidModelChangeEncoding(): Event<void> { return this._sql.onDidModelChangeEncoding; }
|
||||||
|
public resolve(refresh?: boolean): TPromise<EditorModel> { return this._sql.resolve(); }
|
||||||
|
public getEncoding(): string { return this._sql.getEncoding(); }
|
||||||
|
public suggestFileName(): string { return this._sql.suggestFileName(); }
|
||||||
|
public getName(): string { return this._sql.getName(); }
|
||||||
|
public get hasAssociatedFilePath(): boolean { return this._sql.hasAssociatedFilePath; }
|
||||||
|
|
||||||
|
public setEncoding(encoding: string, mode: EncodingMode /* ignored, we only have Encode */): void {
|
||||||
|
this._sql.setEncoding(encoding, mode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
105
src/sql/parts/editData/common/editDataResultsInput.ts
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import { localize } from 'vs/nls';
|
||||||
|
import { TPromise } from 'vs/base/common/winjs.base';
|
||||||
|
import { EditorInput } from 'vs/workbench/common/editor';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Input for the EditDataResultsEditor. This input helps with logic for the viewing and editing of
|
||||||
|
* data in the results grid.
|
||||||
|
*/
|
||||||
|
export class EditDataResultsInput extends EditorInput {
|
||||||
|
|
||||||
|
// Tracks if the editor that holds this input should be visible (i.e. true if a query has been run)
|
||||||
|
private _visible: boolean;
|
||||||
|
|
||||||
|
// Tracks if the editor has holds this input has has bootstrapped angular yet
|
||||||
|
private _hasBootstrapped: boolean;
|
||||||
|
|
||||||
|
// Holds the HTML content for the editor when the editor discards this input and loads another
|
||||||
|
private _editorContainer: HTMLElement;
|
||||||
|
public css: HTMLStyleElement;
|
||||||
|
|
||||||
|
constructor(private _uri: string) {
|
||||||
|
super();
|
||||||
|
this._visible = false;
|
||||||
|
this._hasBootstrapped = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
getTypeId(): string {
|
||||||
|
return EditDataResultsInput.ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
matches(other: any): boolean {
|
||||||
|
if (other instanceof EditDataResultsInput) {
|
||||||
|
return (other._uri === this._uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve(refresh?: boolean): TPromise<any> {
|
||||||
|
return TPromise.as(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
supportsSplitEditor(): boolean {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public setBootstrappedTrue(): void {
|
||||||
|
this._hasBootstrapped = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public dispose(): void {
|
||||||
|
this._disposeContainer();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
private _disposeContainer() {
|
||||||
|
if (!this._editorContainer) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let parentContainer = this._editorContainer.parentNode;
|
||||||
|
if (parentContainer) {
|
||||||
|
parentContainer.removeChild(this._editorContainer);
|
||||||
|
this._editorContainer = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//// Properties
|
||||||
|
|
||||||
|
static get ID() {
|
||||||
|
return 'workbench.editorinputs.editDataResultsInput';
|
||||||
|
}
|
||||||
|
|
||||||
|
set container(container: HTMLElement) {
|
||||||
|
this._disposeContainer();
|
||||||
|
this._editorContainer = container;
|
||||||
|
}
|
||||||
|
|
||||||
|
get container(): HTMLElement {
|
||||||
|
return this._editorContainer;
|
||||||
|
}
|
||||||
|
|
||||||
|
get hasBootstrapped(): boolean {
|
||||||
|
return this._hasBootstrapped;
|
||||||
|
}
|
||||||
|
|
||||||
|
get visible(): boolean {
|
||||||
|
return this._visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
set visible(visible: boolean) {
|
||||||
|
this._visible = visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
get uri(): string {
|
||||||
|
return this._uri;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,13 +6,14 @@
|
|||||||
import 'vs/css!sql/parts/query/editor/media/queryEditor';
|
import 'vs/css!sql/parts/query/editor/media/queryEditor';
|
||||||
|
|
||||||
import { TPromise } from 'vs/base/common/winjs.base';
|
import { TPromise } from 'vs/base/common/winjs.base';
|
||||||
|
import * as strings from 'vs/base/common/strings';
|
||||||
import * as DOM from 'vs/base/browser/dom';
|
import * as DOM from 'vs/base/browser/dom';
|
||||||
import * as nls from 'vs/nls';
|
import * as nls from 'vs/nls';
|
||||||
import { Builder, Dimension } from 'vs/base/browser/builder';
|
import { Builder, Dimension, withElementById } from 'vs/base/browser/builder';
|
||||||
|
|
||||||
import { EditorOptions } from 'vs/workbench/common/editor';
|
import { EditorOptions, EditorInput } from 'vs/workbench/common/editor';
|
||||||
import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor';
|
import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor';
|
||||||
import { Position } from 'vs/platform/editor/common/editor';
|
import { Position, IEditorControl, IEditor } from 'vs/platform/editor/common/editor';
|
||||||
|
|
||||||
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||||
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
||||||
@@ -21,6 +22,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti
|
|||||||
import { EditDataInput } from 'sql/parts/editData/common/editDataInput';
|
import { EditDataInput } from 'sql/parts/editData/common/editDataInput';
|
||||||
|
|
||||||
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
|
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||||
|
import * as queryContext from 'sql/parts/query/common/queryContext';
|
||||||
import { Taskbar, ITaskbarContent } from 'sql/base/browser/ui/taskbar/taskbar';
|
import { Taskbar, ITaskbarContent } from 'sql/base/browser/ui/taskbar/taskbar';
|
||||||
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
|
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
|
||||||
import { IActionItem } from 'vs/base/browser/ui/actionbar/actionbar';
|
import { IActionItem } from 'vs/base/browser/ui/actionbar/actionbar';
|
||||||
@@ -29,13 +31,18 @@ import { IQueryModelService } from 'sql/parts/query/execution/queryModel';
|
|||||||
import { IEditorDescriptorService } from 'sql/parts/query/editor/editorDescriptorService';
|
import { IEditorDescriptorService } from 'sql/parts/query/editor/editorDescriptorService';
|
||||||
import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement';
|
import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement';
|
||||||
import {
|
import {
|
||||||
RefreshTableAction, StopRefreshTableAction,
|
RefreshTableAction, StopRefreshTableAction, ChangeMaxRowsAction, ChangeMaxRowsActionItem, ShowQueryPaneAction
|
||||||
ChangeMaxRowsAction, ChangeMaxRowsActionItem
|
|
||||||
} from 'sql/parts/editData/execution/editDataActions';
|
} from 'sql/parts/editData/execution/editDataActions';
|
||||||
import { EditDataModule } from 'sql/parts/grid/views/editData/editData.module';
|
import { TextResourceEditor } from 'vs/workbench/browser/parts/editor/textResourceEditor';
|
||||||
import { IBootstrapService } from 'sql/services/bootstrap/bootstrapService';
|
import { CodeEditor } from 'vs/editor/browser/codeEditor';
|
||||||
import { EDITDATA_SELECTOR } from 'sql/parts/grid/views/editData/editData.component';
|
import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||||
import { EditDataComponentParams } from 'sql/services/bootstrap/bootstrapParams';
|
import { ISelectionData } from 'sqlops';
|
||||||
|
import { UntitledEditorInput } from 'vs/workbench/common/editor/untitledEditorInput';
|
||||||
|
import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService';
|
||||||
|
import { IFlexibleSash, VerticalFlexibleSash, HorizontalFlexibleSash } from 'sql/parts/query/views/flexibleSash';
|
||||||
|
import { Orientation } from 'vs/base/browser/ui/sash/sash';
|
||||||
|
import { EditDataResultsEditor } from 'sql/parts/editData/editor/editDataResultsEditor';
|
||||||
|
import { EditDataResultsInput } from 'sql/parts/editData/common/editDataResultsInput';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Editor that hosts an action bar and a resultSetInput for an edit data session
|
* Editor that hosts an action bar and a resultSetInput for an edit data session
|
||||||
@@ -44,17 +51,34 @@ export class EditDataEditor extends BaseEditor {
|
|||||||
|
|
||||||
public static ID: string = 'workbench.editor.editDataEditor';
|
public static ID: string = 'workbench.editor.editDataEditor';
|
||||||
|
|
||||||
|
// The height of the tabs above the editor
|
||||||
|
private readonly _tabHeight: number = 35;
|
||||||
|
|
||||||
|
// The minimum width/height of the editors hosted in the QueryEditor
|
||||||
|
private readonly _minEditorSize: number = 220;
|
||||||
|
|
||||||
|
private _sash: IFlexibleSash;
|
||||||
private _dimension: Dimension;
|
private _dimension: Dimension;
|
||||||
private _container: HTMLElement;
|
|
||||||
|
private _resultsEditor: EditDataResultsEditor;
|
||||||
|
private _resultsEditorContainer: HTMLElement;
|
||||||
|
|
||||||
|
private _sqlEditor: TextResourceEditor;
|
||||||
|
private _sqlEditorContainer: HTMLElement;
|
||||||
|
|
||||||
private _taskbar: Taskbar;
|
private _taskbar: Taskbar;
|
||||||
private _taskbarContainer: HTMLElement;
|
private _taskbarContainer: HTMLElement;
|
||||||
private _changeMaxRowsActionItem: ChangeMaxRowsActionItem;
|
private _changeMaxRowsActionItem: ChangeMaxRowsActionItem;
|
||||||
private _stopRefreshTableAction: StopRefreshTableAction;
|
private _stopRefreshTableAction: StopRefreshTableAction;
|
||||||
private _refreshTableAction: RefreshTableAction;
|
private _refreshTableAction: RefreshTableAction;
|
||||||
private _changeMaxRowsAction: ChangeMaxRowsAction;
|
private _changeMaxRowsAction: ChangeMaxRowsAction;
|
||||||
|
private _showQueryPaneAction: ShowQueryPaneAction;
|
||||||
private _spinnerElement: HTMLElement;
|
private _spinnerElement: HTMLElement;
|
||||||
private _initialized: boolean = false;
|
private _initialized: boolean = false;
|
||||||
|
|
||||||
|
private _queryEditorVisible: IContextKey<boolean>;
|
||||||
|
private hideQueryResultsView = false;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@ITelemetryService _telemetryService: ITelemetryService,
|
@ITelemetryService _telemetryService: ITelemetryService,
|
||||||
@IThemeService themeService: IThemeService,
|
@IThemeService themeService: IThemeService,
|
||||||
@@ -62,19 +86,60 @@ export class EditDataEditor extends BaseEditor {
|
|||||||
@IWorkbenchEditorService private _editorService: IWorkbenchEditorService,
|
@IWorkbenchEditorService private _editorService: IWorkbenchEditorService,
|
||||||
@IContextMenuService private _contextMenuService: IContextMenuService,
|
@IContextMenuService private _contextMenuService: IContextMenuService,
|
||||||
@IQueryModelService private _queryModelService: IQueryModelService,
|
@IQueryModelService private _queryModelService: IQueryModelService,
|
||||||
@IConnectionManagementService private _connectionManagementService: IConnectionManagementService,
|
@IEditorDescriptorService private _editorDescriptorService: IEditorDescriptorService,
|
||||||
@IBootstrapService private _bootstrapService: IBootstrapService
|
@IEditorGroupService private _editorGroupService: IEditorGroupService,
|
||||||
|
@IContextKeyService contextKeyService: IContextKeyService,
|
||||||
|
@IConnectionManagementService private _connectionManagementService: IConnectionManagementService
|
||||||
) {
|
) {
|
||||||
super(EditDataEditor.ID, _telemetryService, themeService);
|
super(EditDataEditor.ID, _telemetryService, themeService);
|
||||||
|
|
||||||
|
if (contextKeyService) {
|
||||||
|
this._queryEditorVisible = queryContext.QueryEditorVisibleContext.bindTo(contextKeyService);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// PUBLIC METHODS ////////////////////////////////////////////////////////////
|
// PUBLIC METHODS ////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// Getters and Setters
|
// Getters and Setters
|
||||||
public get editDataInput(): EditDataInput { return <EditDataInput>this.input; }
|
public get editDataInput(): EditDataInput { return <EditDataInput>this.input; }
|
||||||
public get uri(): string { return this.input ? this.editDataInput.uri.toString() : undefined; }
|
|
||||||
public get tableName(): string { return this.editDataInput.tableName; }
|
public get tableName(): string { return this.editDataInput.tableName; }
|
||||||
|
public get uri(): string { return this.input ? this.editDataInput.uri.toString() : undefined; }
|
||||||
|
public set resultsEditorVisibility(isVisible: boolean) {
|
||||||
|
let input: EditDataInput = <EditDataInput>this.input;
|
||||||
|
input.results.visible = isVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Changes the position of the editor.
|
||||||
|
*/
|
||||||
|
public changePosition(position: Position): void {
|
||||||
|
if (this._resultsEditor) {
|
||||||
|
this._resultsEditor.changePosition(position);
|
||||||
|
}
|
||||||
|
if (this._sqlEditor) {
|
||||||
|
this._sqlEditor.changePosition(position);
|
||||||
|
}
|
||||||
|
super.changePosition(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called to indicate to the editor that the input should be cleared and resources associated with the
|
||||||
|
* input should be freed.
|
||||||
|
*/
|
||||||
|
public clearInput(): void {
|
||||||
|
if (this._resultsEditor) {
|
||||||
|
this._resultsEditor.clearInput();
|
||||||
|
}
|
||||||
|
if (this._sqlEditor) {
|
||||||
|
this._sqlEditor.clearInput();
|
||||||
|
}
|
||||||
|
this._disposeEditors();
|
||||||
|
super.clearInput();
|
||||||
|
}
|
||||||
|
|
||||||
|
public close(): void {
|
||||||
|
this.editDataInput.close();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called to create the editor in the parent builder.
|
* Called to create the editor in the parent builder.
|
||||||
@@ -83,9 +148,82 @@ export class EditDataEditor extends BaseEditor {
|
|||||||
const parentElement = parent.getHTMLElement();
|
const parentElement = parent.getHTMLElement();
|
||||||
DOM.addClass(parentElement, 'side-by-side-editor');
|
DOM.addClass(parentElement, 'side-by-side-editor');
|
||||||
this._createTaskbar(parentElement);
|
this._createTaskbar(parentElement);
|
||||||
this._container = document.createElement('div');
|
}
|
||||||
this._container.style.height = 'calc(100% - 28px)';
|
|
||||||
DOM.append(parentElement, this._container);
|
public dispose(): void {
|
||||||
|
this._disposeEditors();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets focus on this editor. Specifically, it sets the focus on the hosted text editor.
|
||||||
|
*/
|
||||||
|
public focus(): void {
|
||||||
|
if (this._sqlEditor) {
|
||||||
|
this._sqlEditor.focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public getControl(): IEditorControl {
|
||||||
|
if (this._sqlEditor) {
|
||||||
|
return this._sqlEditor.getControl();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public getEditorText(): string {
|
||||||
|
if (this._sqlEditor && this._sqlEditor.getControl()) {
|
||||||
|
let control = this._sqlEditor.getControl();
|
||||||
|
let codeEditor: CodeEditor = <CodeEditor>control;
|
||||||
|
|
||||||
|
if (codeEditor) {
|
||||||
|
let value = codeEditor.getModel().getValue();
|
||||||
|
if (value !== undefined && value.length > 0) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hide the spinner element to show that something was happening, hidden by default
|
||||||
|
*/
|
||||||
|
public hideSpinner(): void {
|
||||||
|
this._spinnerElement.style.visibility = 'hidden';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the internal variable keeping track of the editor's size, and re-calculates the sash position.
|
||||||
|
* To be called when the container of this editor changes size.
|
||||||
|
*/
|
||||||
|
public layout(dimension: Dimension): void {
|
||||||
|
this._dimension = dimension;
|
||||||
|
|
||||||
|
if (this._sash) {
|
||||||
|
this._setSashDimension();
|
||||||
|
this._sash.layout();
|
||||||
|
}
|
||||||
|
|
||||||
|
this._doLayout();
|
||||||
|
this._resizeGridContents();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets this editor and the sub-editors to visible.
|
||||||
|
*/
|
||||||
|
public setEditorVisible(visible: boolean, position: Position): void {
|
||||||
|
if (this._resultsEditor) {
|
||||||
|
this._resultsEditor.setVisible(visible, position);
|
||||||
|
}
|
||||||
|
if (this._sqlEditor) {
|
||||||
|
this._sqlEditor.setVisible(visible, position);
|
||||||
|
}
|
||||||
|
|
||||||
|
super.setEditorVisible(visible, position);
|
||||||
|
|
||||||
|
// Note: must update after calling super.setEditorVisible so that the accurate count is handled
|
||||||
|
this._updateQueryEditorVisible(visible);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -95,9 +233,9 @@ export class EditDataEditor extends BaseEditor {
|
|||||||
let oldInput = <EditDataInput>this.input;
|
let oldInput = <EditDataInput>this.input;
|
||||||
if (!newInput.setup) {
|
if (!newInput.setup) {
|
||||||
this._initialized = false;
|
this._initialized = false;
|
||||||
this._register(newInput.updateTaskbar((owner) => this._updateTaskbar(owner)));
|
this._register(newInput.updateTaskbarEvent((owner) => this._updateTaskbar(owner)));
|
||||||
this._register(newInput.editorInitializing((initializing) => this.onEditorInitializingChanged(initializing)));
|
this._register(newInput.editorInitializingEvent((initializing) => this._onEditorInitializingChanged(initializing)));
|
||||||
this._register(newInput.showTableView(() => this._showTableView()));
|
this._register(newInput.showResultsEditorEvent(() => this._showResultsEditor()));
|
||||||
newInput.onRowDropDownSet(this._changeMaxRowsActionItem.defaultRowCount);
|
newInput.onRowDropDownSet(this._changeMaxRowsActionItem.defaultRowCount);
|
||||||
newInput.setupComplete();
|
newInput.setupComplete();
|
||||||
}
|
}
|
||||||
@@ -106,15 +244,6 @@ export class EditDataEditor extends BaseEditor {
|
|||||||
.then(() => this._updateInput(oldInput, newInput, options));
|
.then(() => this._updateInput(oldInput, newInput, options));
|
||||||
}
|
}
|
||||||
|
|
||||||
private onEditorInitializingChanged(initializing: boolean): void {
|
|
||||||
if (initializing) {
|
|
||||||
this.showSpinner();
|
|
||||||
} else {
|
|
||||||
this._initialized = true;
|
|
||||||
this.hideSpinner();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show the spinner element that shows something is happening, hidden by default
|
* Show the spinner element that shows something is happening, hidden by default
|
||||||
*/
|
*/
|
||||||
@@ -126,92 +255,74 @@ export class EditDataEditor extends BaseEditor {
|
|||||||
}, 200);
|
}, 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public toggleResultsEditorVisibility(): void {
|
||||||
* Hide the spinner element to show that something was happening, hidden by default
|
let input = <EditDataInput>this.input;
|
||||||
*/
|
let hideResults = this.hideQueryResultsView;
|
||||||
public hideSpinner(): void {
|
this.hideQueryResultsView = !this.hideQueryResultsView;
|
||||||
this._spinnerElement.style.visibility = 'hidden';
|
if (!input.results) {
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets this editor and the sub-editors to visible.
|
|
||||||
*/
|
|
||||||
public setEditorVisible(visible: boolean, position: Position): void {
|
|
||||||
super.setEditorVisible(visible, position);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Changes the position of the editor.
|
|
||||||
*/
|
|
||||||
public changePosition(position: Position): void {
|
|
||||||
super.changePosition(position);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called to indicate to the editor that the input should be cleared and resources associated with the
|
|
||||||
* input should be freed.
|
|
||||||
*/
|
|
||||||
public clearInput(): void {
|
|
||||||
this._disposeEditors();
|
|
||||||
super.clearInput();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates the internal variable keeping track of the editor's size, and re-calculates the sash position.
|
|
||||||
* To be called when the container of this editor changes size.
|
|
||||||
*/
|
|
||||||
public layout(dimension: Dimension): void {
|
|
||||||
this._dimension = dimension;
|
|
||||||
let input: EditDataInput = <EditDataInput>this.input;
|
|
||||||
if (input) {
|
|
||||||
let uri: string = input.uri;
|
|
||||||
if (uri) {
|
|
||||||
this._queryModelService.resizeResultsets(uri);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public dispose(): void {
|
|
||||||
this._disposeEditors();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
public close(): void {
|
|
||||||
this.input.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if the results table for the current edit data session is visible
|
|
||||||
* Public for testing only.
|
|
||||||
*/
|
|
||||||
public _isResultsEditorVisible(): boolean {
|
|
||||||
if (!this.editDataInput) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return this.editDataInput.visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Makes visible the results table for the current edit data session
|
|
||||||
*/
|
|
||||||
private _showTableView(): void {
|
|
||||||
if (this._isResultsEditorVisible()) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
this.resultsEditorVisibility = hideResults;
|
||||||
this._createTableViewContainer();
|
this._doLayout();
|
||||||
this._setTableViewVisible();
|
|
||||||
this.setInput(this.editDataInput, this.options);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// PRIVATE METHODS ////////////////////////////////////////////////////////////
|
// PRIVATE METHODS ////////////////////////////////////////////////////////////
|
||||||
private _updateTaskbar(owner: EditDataInput): void {
|
private _createEditor(editorInput: EditorInput, container: HTMLElement): TPromise<BaseEditor> {
|
||||||
// Update the taskbar if the owner of this call is being presented
|
const descriptor = this._editorDescriptorService.getEditor(editorInput);
|
||||||
if (owner.matches(this.editDataInput)) {
|
if (!descriptor) {
|
||||||
this._refreshTableAction.enabled = owner.refreshButtonEnabled;
|
return TPromise.wrapError(new Error(strings.format('Can not find a registered editor for the input {0}', editorInput)));
|
||||||
this._stopRefreshTableAction.enabled = owner.stopButtonEnabled;
|
|
||||||
this._changeMaxRowsActionItem.setCurrentOptionIndex = owner.rowLimit;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let editor = descriptor.instantiate(this._instantiationService);
|
||||||
|
editor.create(new Builder(container));
|
||||||
|
editor.setVisible(this.isVisible(), this.position);
|
||||||
|
return TPromise.as(editor);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Appends the HTML for the EditDataResultsEditor to the EditDataEditor. If the HTML has not yet been
|
||||||
|
* created, it creates it and appends it. If it has already been created, it locates it and
|
||||||
|
* appends it.
|
||||||
|
*/
|
||||||
|
private _createResultsEditorContainer() {
|
||||||
|
this._createSash();
|
||||||
|
|
||||||
|
const parentElement = this.getContainer().getHTMLElement();
|
||||||
|
let input = <EditDataInput>this.input;
|
||||||
|
|
||||||
|
if (!input.results.container) {
|
||||||
|
this._resultsEditorContainer = DOM.append(parentElement, DOM.$('.editDataContainer-horizontal'));
|
||||||
|
this._resultsEditorContainer.style.position = 'absolute';
|
||||||
|
|
||||||
|
input.results.container = this._resultsEditorContainer;
|
||||||
|
} else {
|
||||||
|
this._resultsEditorContainer = DOM.append(parentElement, input.results.container);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the sash with the requested orientation and registers sash callbacks
|
||||||
|
*/
|
||||||
|
private _createSash(): void {
|
||||||
|
if (!this._sash) {
|
||||||
|
let parentElement: HTMLElement = this.getContainer().getHTMLElement();
|
||||||
|
|
||||||
|
this._sash = this._register(new HorizontalFlexibleSash(parentElement, this._minEditorSize));
|
||||||
|
this._setSashDimension();
|
||||||
|
|
||||||
|
this._register(this._sash.onPositionChange(position => this._doLayout()));
|
||||||
|
}
|
||||||
|
|
||||||
|
this._sash.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Appends the HTML for the SQL editor. Creates new HTML every time.
|
||||||
|
*/
|
||||||
|
private _createSqlEditorContainer() {
|
||||||
|
const parentElement = this.getContainer().getHTMLElement();
|
||||||
|
this._sqlEditorContainer = DOM.append(parentElement, DOM.$('.details-editor-container'));
|
||||||
|
this._sqlEditorContainer.style.position = 'absolute';
|
||||||
}
|
}
|
||||||
|
|
||||||
private _createTaskbar(parentElement: HTMLElement): void {
|
private _createTaskbar(parentElement: HTMLElement): void {
|
||||||
@@ -222,22 +333,25 @@ export class EditDataEditor extends BaseEditor {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Create Actions for the toolbar
|
// Create Actions for the toolbar
|
||||||
this._stopRefreshTableAction = this._instantiationService.createInstance(StopRefreshTableAction, this);
|
|
||||||
this._refreshTableAction = this._instantiationService.createInstance(RefreshTableAction, this);
|
this._refreshTableAction = this._instantiationService.createInstance(RefreshTableAction, this);
|
||||||
|
this._stopRefreshTableAction = this._instantiationService.createInstance(StopRefreshTableAction, this);
|
||||||
this._changeMaxRowsAction = this._instantiationService.createInstance(ChangeMaxRowsAction, this);
|
this._changeMaxRowsAction = this._instantiationService.createInstance(ChangeMaxRowsAction, this);
|
||||||
|
this._showQueryPaneAction = this._instantiationService.createInstance(ShowQueryPaneAction, this);
|
||||||
|
|
||||||
// Create HTML Elements for the taskbar
|
// Create HTML Elements for the taskbar
|
||||||
let separator = Taskbar.createTaskbarSeparator();
|
let separator = Taskbar.createTaskbarSeparator();
|
||||||
let textSeperator = Taskbar.createTaskbarText(nls.localize('maxRowTaskbar', 'Max Rows:'));
|
let textSeparator = Taskbar.createTaskbarText(nls.localize('maxRowTaskbar', 'Max Rows:'));
|
||||||
|
|
||||||
this._spinnerElement = Taskbar.createTaskbarSpinner();
|
this._spinnerElement = Taskbar.createTaskbarSpinner();
|
||||||
|
|
||||||
// Set the content in the order we desire
|
// Set the content in the order we desire
|
||||||
let content: ITaskbarContent[] = [
|
let content: ITaskbarContent[] = [
|
||||||
{ action: this._stopRefreshTableAction },
|
|
||||||
{ action: this._refreshTableAction },
|
{ action: this._refreshTableAction },
|
||||||
|
{ action: this._stopRefreshTableAction },
|
||||||
{ element: separator },
|
{ element: separator },
|
||||||
{ element: textSeperator },
|
{ element: textSeparator },
|
||||||
{ action: this._changeMaxRowsAction },
|
{ action: this._changeMaxRowsAction },
|
||||||
|
{ action: this._showQueryPaneAction },
|
||||||
{ element: this._spinnerElement }
|
{ element: this._spinnerElement }
|
||||||
];
|
];
|
||||||
this._taskbar.setContent(content);
|
this._taskbar.setContent(content);
|
||||||
@@ -258,32 +372,181 @@ export class EditDataEditor extends BaseEditor {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
private _disposeEditors(): void {
|
||||||
* Handles setting input for this editor. If this new input does not match the old input (e.g. a new file
|
if (this._sqlEditor) {
|
||||||
* has been opened with the same editor, or we are opening the editor for the first time).
|
this._sqlEditor.dispose();
|
||||||
*/
|
this._sqlEditor = null;
|
||||||
private _updateInput(oldInput: EditDataInput, newInput: EditDataInput, options?: EditorOptions): TPromise<void> {
|
}
|
||||||
let returnValue: TPromise<void>;
|
if (this._resultsEditor) {
|
||||||
|
this._resultsEditor.dispose();
|
||||||
if (!newInput.matches(oldInput)) {
|
this._resultsEditor = null;
|
||||||
this._disposeEditors();
|
|
||||||
|
|
||||||
if (this._isResultsEditorVisible()) {
|
|
||||||
this._createTableViewContainer();
|
|
||||||
let uri: string = newInput.uri;
|
|
||||||
if (uri) {
|
|
||||||
this._queryModelService.refreshResultsets(uri);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
returnValue = this._setNewInput(newInput, options);
|
|
||||||
} else {
|
|
||||||
this._setNewInput(newInput, options);
|
|
||||||
returnValue = TPromise.as(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this._updateTaskbar(newInput);
|
let thisEditorParent: HTMLElement = this.getContainer().getHTMLElement();
|
||||||
return returnValue;
|
|
||||||
|
if (this._sqlEditorContainer) {
|
||||||
|
let sqlEditorParent: HTMLElement = this._sqlEditorContainer.parentElement;
|
||||||
|
if (sqlEditorParent && sqlEditorParent === thisEditorParent) {
|
||||||
|
this._sqlEditorContainer.parentElement.removeChild(this._sqlEditorContainer);
|
||||||
|
}
|
||||||
|
this._sqlEditorContainer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._resultsEditorContainer) {
|
||||||
|
let resultsEditorParent: HTMLElement = this._resultsEditorContainer.parentElement;
|
||||||
|
if (resultsEditorParent && resultsEditorParent === thisEditorParent) {
|
||||||
|
this._resultsEditorContainer.parentElement.removeChild(this._resultsEditorContainer);
|
||||||
|
}
|
||||||
|
this._resultsEditorContainer = null;
|
||||||
|
this.hideQueryResultsView = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private _doLayout(skipResizeGridContent: boolean = false): void {
|
||||||
|
if (!this._isResultsEditorVisible() && this._sqlEditor) {
|
||||||
|
this._doLayoutSql();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!this._sqlEditor || !this._resultsEditor || !this._dimension || !this._sash) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._doLayoutHorizontal();
|
||||||
|
|
||||||
|
if (!skipResizeGridContent) {
|
||||||
|
this._resizeGridContents();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private _doLayoutHorizontal(): void {
|
||||||
|
let splitPointTop: number = this._sash.getSplitPoint();
|
||||||
|
let parent: ClientRect = this.getContainer().getHTMLElement().getBoundingClientRect();
|
||||||
|
|
||||||
|
let sqlEditorHeight: number;
|
||||||
|
let sqlEditorTop: number;
|
||||||
|
let resultsEditorHeight: number;
|
||||||
|
let resultsEditorTop: number;
|
||||||
|
|
||||||
|
let editorTopOffset = parent.top + this._getTaskBarHeight();
|
||||||
|
|
||||||
|
this._resultsEditorContainer.hidden = false;
|
||||||
|
|
||||||
|
let titleBar = withElementById('workbench.parts.titlebar');
|
||||||
|
if (this.queryPaneEnabled()) {
|
||||||
|
this._sqlEditorContainer.hidden = false;
|
||||||
|
|
||||||
|
sqlEditorTop = editorTopOffset;
|
||||||
|
sqlEditorHeight = splitPointTop - sqlEditorTop;
|
||||||
|
|
||||||
|
resultsEditorTop = splitPointTop;
|
||||||
|
resultsEditorHeight = parent.bottom - resultsEditorTop;
|
||||||
|
|
||||||
|
if (titleBar) {
|
||||||
|
sqlEditorHeight += DOM.getContentHeight(titleBar.getHTMLElement());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this._sqlEditorContainer.hidden = true;
|
||||||
|
|
||||||
|
sqlEditorTop = editorTopOffset;
|
||||||
|
sqlEditorHeight = 0;
|
||||||
|
|
||||||
|
resultsEditorTop = editorTopOffset;
|
||||||
|
resultsEditorHeight = parent.bottom - resultsEditorTop;
|
||||||
|
|
||||||
|
if (titleBar) {
|
||||||
|
resultsEditorHeight += DOM.getContentHeight(titleBar.getHTMLElement());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this._sqlEditorContainer.style.height = `${sqlEditorHeight}px`;
|
||||||
|
this._sqlEditorContainer.style.width = `${this._dimension.width}px`;
|
||||||
|
this._sqlEditorContainer.style.top = `${sqlEditorTop}px`;
|
||||||
|
|
||||||
|
this._resultsEditorContainer.style.height = `${resultsEditorHeight}px`;
|
||||||
|
this._resultsEditorContainer.style.width = `${this._dimension.width}px`;
|
||||||
|
this._resultsEditorContainer.style.top = `${resultsEditorTop}px`;
|
||||||
|
|
||||||
|
this._sqlEditor.layout(new Dimension(this._dimension.width, sqlEditorHeight));
|
||||||
|
this._resultsEditor.layout(new Dimension(this._dimension.width, resultsEditorHeight));
|
||||||
|
}
|
||||||
|
|
||||||
|
private _doLayoutSql() {
|
||||||
|
if (this._resultsEditorContainer) {
|
||||||
|
this._resultsEditorContainer.style.width = '0px';
|
||||||
|
this._resultsEditorContainer.style.height = '0px';
|
||||||
|
this._resultsEditorContainer.style.left = '0px';
|
||||||
|
this._resultsEditorContainer.hidden = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._dimension) {
|
||||||
|
let sqlEditorHeight: number;
|
||||||
|
|
||||||
|
if (this.queryPaneEnabled()) {
|
||||||
|
this._sqlEditorContainer.hidden = false;
|
||||||
|
sqlEditorHeight = this._dimension.height - this._getTaskBarHeight();
|
||||||
|
} else {
|
||||||
|
this._sqlEditorContainer.hidden = true;
|
||||||
|
sqlEditorHeight = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._sqlEditorContainer.style.height = `${sqlEditorHeight}px`;
|
||||||
|
this._sqlEditorContainer.style.width = `${this._dimension.width}px`;
|
||||||
|
|
||||||
|
this._sqlEditor.layout(new Dimension(this._dimension.width, sqlEditorHeight));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private _getTaskBarHeight(): number {
|
||||||
|
let taskBarElement = this._taskbar.getContainer().getHTMLElement();
|
||||||
|
return DOM.getContentHeight(taskBarElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the results table for the current edit data session is visible
|
||||||
|
* Public for testing only.
|
||||||
|
*/
|
||||||
|
private _isResultsEditorVisible(): boolean {
|
||||||
|
let input: EditDataInput = <EditDataInput>this.input;
|
||||||
|
|
||||||
|
if (!input) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return input.results.visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
private _onEditorInitializingChanged(initializing: boolean): void {
|
||||||
|
if (initializing) {
|
||||||
|
this.showSpinner();
|
||||||
|
} else {
|
||||||
|
this._initialized = true;
|
||||||
|
this.hideSpinner();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets input for the results editor after it has been created.
|
||||||
|
*/
|
||||||
|
private _onResultsEditorCreated(resultsEditor: EditDataResultsEditor, resultsInput: EditDataResultsInput, options: EditorOptions): TPromise<void> {
|
||||||
|
this._resultsEditor = resultsEditor;
|
||||||
|
return this._resultsEditor.setInput(resultsInput, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets input for the SQL editor after it has been created.
|
||||||
|
*/
|
||||||
|
private _onSqlEditorCreated(sqlEditor: TextResourceEditor, sqlInput: UntitledEditorInput, options: EditorOptions): TPromise<void> {
|
||||||
|
this._sqlEditor = sqlEditor;
|
||||||
|
return this._sqlEditor.setInput(sqlInput, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
private _resizeGridContents(): void {
|
||||||
|
if (this._isResultsEditorVisible()) {
|
||||||
|
let queryInput: EditDataInput = <EditDataInput>this.input;
|
||||||
|
let uri: string = queryInput.uri;
|
||||||
|
if (uri) {
|
||||||
|
this._queryModelService.resizeResultsets(uri);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -291,68 +554,177 @@ export class EditDataEditor extends BaseEditor {
|
|||||||
* - Opened for the first time
|
* - Opened for the first time
|
||||||
* - Opened with a new EditDataInput
|
* - Opened with a new EditDataInput
|
||||||
*/
|
*/
|
||||||
private _setNewInput(newInput: EditDataInput, options?: EditorOptions): TPromise<void> {
|
private _setNewInput(newInput: EditDataInput, options?: EditorOptions): TPromise<any> {
|
||||||
|
|
||||||
|
// Promises that will ensure proper ordering of editor creation logic
|
||||||
|
let createEditors: () => TPromise<any>;
|
||||||
|
let onEditorsCreated: (result) => TPromise<any>;
|
||||||
|
|
||||||
|
// If both editors exist, create joined promises - one for each editor
|
||||||
if (this._isResultsEditorVisible()) {
|
if (this._isResultsEditorVisible()) {
|
||||||
// If both editors exist, create a joined promise and wait for both editors to be created
|
createEditors = () => {
|
||||||
return this._bootstrapAngularAndResults(newInput, options);
|
return TPromise.join([
|
||||||
}
|
this._createEditor(<EditDataResultsInput>newInput.results, this._resultsEditorContainer),
|
||||||
|
this._createEditor(<UntitledEditorInput>newInput.sql, this._sqlEditorContainer)
|
||||||
return TPromise.as(undefined);
|
]);
|
||||||
}
|
};
|
||||||
/**
|
onEditorsCreated = (result: IEditor[]) => {
|
||||||
* Appends the HTML for the edit data table view
|
return TPromise.join([
|
||||||
*/
|
this._onResultsEditorCreated(<EditDataResultsEditor>result[0], newInput.results, options),
|
||||||
private _createTableViewContainer() {
|
this._onSqlEditorCreated(<TextResourceEditor>result[1], newInput.sql, options)
|
||||||
if (!this.editDataInput.container) {
|
]);
|
||||||
this.editDataInput.container = DOM.append(this._container, DOM.$('.editDataContainer'));
|
};
|
||||||
this.editDataInput.container.style.height = '100%';
|
|
||||||
} else {
|
// If only the sql editor exists, create a promise and wait for the sql editor to be created
|
||||||
DOM.append(this._container, this.editDataInput.container);
|
} else {
|
||||||
}
|
createEditors = () => {
|
||||||
}
|
return this._createEditor(<UntitledEditorInput>newInput.sql, this._sqlEditorContainer);
|
||||||
|
};
|
||||||
private _disposeEditors(): void {
|
onEditorsCreated = (result: TextResourceEditor) => {
|
||||||
if (this._container) {
|
return this._onSqlEditorCreated(result, newInput.sql, options);
|
||||||
new Builder(this._container).clearChildren();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Load the angular components and record for this input that we have done so
|
|
||||||
*/
|
|
||||||
private _bootstrapAngularAndResults(input: EditDataInput, options: EditorOptions): TPromise<void> {
|
|
||||||
super.setInput(input, options);
|
|
||||||
if (!input.hasBootstrapped) {
|
|
||||||
let uri = this.editDataInput.uri;
|
|
||||||
|
|
||||||
// Pass the correct DataService to the new angular component
|
|
||||||
let dataService = this._queryModelService.getDataService(uri);
|
|
||||||
if (!dataService) {
|
|
||||||
throw new Error('DataService not found for URI: ' + uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mark that we have bootstrapped
|
|
||||||
input.setBootstrappedTrue();
|
|
||||||
|
|
||||||
// Get the bootstrap params and perform the bootstrap
|
|
||||||
// Note: pass in input so on disposal this is cleaned up.
|
|
||||||
// Otherwise many components will be left around and be subscribed
|
|
||||||
// to events from the backing data service
|
|
||||||
const parent = this.editDataInput.container;
|
|
||||||
let params: EditDataComponentParams = {
|
|
||||||
dataService: dataService
|
|
||||||
};
|
};
|
||||||
this._bootstrapService.bootstrap(
|
|
||||||
EditDataModule,
|
|
||||||
parent,
|
|
||||||
EDITDATA_SELECTOR,
|
|
||||||
params,
|
|
||||||
this.editDataInput);
|
|
||||||
}
|
}
|
||||||
return TPromise.wrap<void>(null);
|
|
||||||
|
// Create a promise to re render the layout after the editor creation logic
|
||||||
|
let doLayout: () => TPromise<any> = () => {
|
||||||
|
this._doLayout();
|
||||||
|
return TPromise.as(undefined);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Run all three steps synchronously
|
||||||
|
return createEditors()
|
||||||
|
.then(onEditorsCreated)
|
||||||
|
.then(doLayout);
|
||||||
}
|
}
|
||||||
|
|
||||||
private _setTableViewVisible(): void {
|
private _setSashDimension(): void {
|
||||||
this.editDataInput.setVisibleTrue();
|
if (!this._dimension) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this._sash.setDimenesion(this._dimension);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Makes visible the results table for the current edit data session
|
||||||
|
*/
|
||||||
|
private _showResultsEditor(): void {
|
||||||
|
if (this._isResultsEditorVisible()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._editorGroupService.pinEditor(this.position, this.input);
|
||||||
|
|
||||||
|
let input = <EditDataInput>this.input;
|
||||||
|
this._createResultsEditorContainer();
|
||||||
|
|
||||||
|
this._createEditor(<EditDataResultsInput>input.results, this._resultsEditorContainer)
|
||||||
|
.then(result => {
|
||||||
|
this._onResultsEditorCreated(<EditDataResultsEditor>result, input.results, this.options);
|
||||||
|
this.resultsEditorVisibility = true;
|
||||||
|
this.hideQueryResultsView = false;
|
||||||
|
this._doLayout(true);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles setting input for this editor. If this new input does not match the old input (e.g. a new file
|
||||||
|
* has been opened with the same editor, or we are opening the editor for the first time).
|
||||||
|
*/
|
||||||
|
private _updateInput(oldInput: EditDataInput, newInput: EditDataInput, options?: EditorOptions): TPromise<void> {
|
||||||
|
|
||||||
|
if (this._sqlEditor) {
|
||||||
|
this._sqlEditor.clearInput();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (oldInput) {
|
||||||
|
this._disposeEditors();
|
||||||
|
}
|
||||||
|
|
||||||
|
this._createSqlEditorContainer();
|
||||||
|
if (this._isResultsEditorVisible()) {
|
||||||
|
this._createResultsEditorContainer();
|
||||||
|
|
||||||
|
let uri: string = newInput.uri;
|
||||||
|
if (uri) {
|
||||||
|
this._queryModelService.refreshResultsets(uri);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._sash) {
|
||||||
|
if (this._isResultsEditorVisible()) {
|
||||||
|
this._sash.show();
|
||||||
|
} else {
|
||||||
|
this._sash.hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this._updateTaskbar(newInput);
|
||||||
|
return this._setNewInput(newInput, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
private _updateQueryEditorVisible(currentEditorIsVisible: boolean): void {
|
||||||
|
if (this._queryEditorVisible) {
|
||||||
|
let visible = currentEditorIsVisible;
|
||||||
|
if (!currentEditorIsVisible) {
|
||||||
|
// Current editor is closing but still tracked as visible. Check if any other editor is visible
|
||||||
|
const candidates = [...this._editorService.getVisibleEditors()].filter(e => {
|
||||||
|
if (e && e.getId) {
|
||||||
|
return e.getId() === EditDataEditor.ID;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
// Note: require 2 or more candidates since current is closing but still
|
||||||
|
// counted as visible
|
||||||
|
visible = candidates.length > 1;
|
||||||
|
}
|
||||||
|
this._queryEditorVisible.set(visible);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private _updateTaskbar(owner: EditDataInput): void {
|
||||||
|
// Update the taskbar if the owner of this call is being presented
|
||||||
|
if (owner.matches(this.editDataInput)) {
|
||||||
|
this._refreshTableAction.enabled = owner.refreshButtonEnabled;
|
||||||
|
this._stopRefreshTableAction.enabled = owner.stopButtonEnabled;
|
||||||
|
this._changeMaxRowsActionItem.setCurrentOptionIndex = owner.rowLimit;
|
||||||
|
this._showQueryPaneAction.queryPaneEnabled = owner.queryPaneEnabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls the run method of this editor's RunQueryAction
|
||||||
|
*/
|
||||||
|
public runQuery(): void {
|
||||||
|
this._refreshTableAction.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls the run method of this editor's CancelQueryAction
|
||||||
|
*/
|
||||||
|
public cancelQuery(): void {
|
||||||
|
this._stopRefreshTableAction.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
public toggleQueryPane(): void {
|
||||||
|
this.editDataInput.queryPaneEnabled = !this.queryPaneEnabled();
|
||||||
|
if (this.queryPaneEnabled()) {
|
||||||
|
this._showQueryEditor();
|
||||||
|
} else {
|
||||||
|
this._hideQueryEditor();
|
||||||
|
}
|
||||||
|
this._doLayout(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private _showQueryEditor(): void {
|
||||||
|
this._sqlEditorContainer.hidden = false;
|
||||||
|
this._changeMaxRowsActionItem.disable();
|
||||||
|
}
|
||||||
|
private _hideQueryEditor(): void {
|
||||||
|
this._sqlEditorContainer.hidden = true;
|
||||||
|
this._changeMaxRowsActionItem.enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
public queryPaneEnabled(): boolean {
|
||||||
|
return this.editDataInput.queryPaneEnabled;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
120
src/sql/parts/editData/editor/editDataResultsEditor.ts
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||||
|
import { Dimension, Builder } from 'vs/base/browser/builder';
|
||||||
|
import { EditorOptions } from 'vs/workbench/common/editor';
|
||||||
|
import { TPromise } from 'vs/base/common/winjs.base';
|
||||||
|
import { getZoomLevel } from 'vs/base/browser/browser';
|
||||||
|
import { Configuration } from 'vs/editor/browser/config/configuration';
|
||||||
|
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||||
|
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
||||||
|
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||||
|
import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor';
|
||||||
|
import * as dom from 'vs/base/browser/dom';
|
||||||
|
import * as types from 'vs/base/common/types';
|
||||||
|
|
||||||
|
import { IQueryModelService } from 'sql/parts/query/execution/queryModel';
|
||||||
|
import { bootstrapAngular } from 'sql/services/bootstrap/bootstrapService';
|
||||||
|
import { BareResultsGridInfo } from 'sql/parts/query/editor/queryResultsEditor';
|
||||||
|
import { IEditDataComponentParams } from 'sql/services/bootstrap/bootstrapParams';
|
||||||
|
import { EditDataModule } from 'sql/parts/grid/views/editData/editData.module';
|
||||||
|
import { EDITDATA_SELECTOR } from 'sql/parts/grid/views/editData/editData.component';
|
||||||
|
import { EditDataResultsInput } from 'sql/parts/editData/common/editDataResultsInput';
|
||||||
|
|
||||||
|
export class EditDataResultsEditor extends BaseEditor {
|
||||||
|
|
||||||
|
public static ID: string = 'workbench.editor.editDataResultsEditor';
|
||||||
|
public static AngularSelectorString: string = 'slickgrid-container.slickgridContainer';
|
||||||
|
protected _input: EditDataResultsInput;
|
||||||
|
protected _rawOptions: BareResultsGridInfo;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
@ITelemetryService telemetryService: ITelemetryService,
|
||||||
|
@IThemeService themeService: IThemeService,
|
||||||
|
@IQueryModelService private _queryModelService: IQueryModelService,
|
||||||
|
@IConfigurationService private _configurationService: IConfigurationService,
|
||||||
|
@IInstantiationService private _instantiationService: IInstantiationService
|
||||||
|
) {
|
||||||
|
super(EditDataResultsEditor.ID, telemetryService, themeService);
|
||||||
|
this._rawOptions = BareResultsGridInfo.createFromRawSettings(this._configurationService.getValue('resultsGrid'), getZoomLevel());
|
||||||
|
this._configurationService.onDidChangeConfiguration(e => {
|
||||||
|
if (e.affectsConfiguration('resultsGrid')) {
|
||||||
|
this._rawOptions = BareResultsGridInfo.createFromRawSettings(this._configurationService.getValue('resultsGrid'), getZoomLevel());
|
||||||
|
this._applySettings();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public get input(): EditDataResultsInput {
|
||||||
|
return this._input;
|
||||||
|
}
|
||||||
|
|
||||||
|
public createEditor(parent: Builder): void {
|
||||||
|
}
|
||||||
|
|
||||||
|
public dispose(): void {
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
public layout(dimension: Dimension): void {
|
||||||
|
}
|
||||||
|
|
||||||
|
public setInput(input: EditDataResultsInput, options: EditorOptions): TPromise<void> {
|
||||||
|
super.setInput(input, options);
|
||||||
|
this._applySettings();
|
||||||
|
if (!input.hasBootstrapped) {
|
||||||
|
this._bootstrapAngular();
|
||||||
|
}
|
||||||
|
return TPromise.wrap<void>(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private _applySettings() {
|
||||||
|
if (this.input && this.input.container) {
|
||||||
|
Configuration.applyFontInfoSlow(this.getContainer().getHTMLElement(), this._rawOptions);
|
||||||
|
if (!this.input.css) {
|
||||||
|
this.input.css = dom.createStyleSheet(this.input.container);
|
||||||
|
}
|
||||||
|
let cssRuleText = '';
|
||||||
|
if (types.isNumber(this._rawOptions.cellPadding)) {
|
||||||
|
cssRuleText = this._rawOptions.cellPadding + 'px';
|
||||||
|
} else {
|
||||||
|
cssRuleText = this._rawOptions.cellPadding.join('px ') + 'px;';
|
||||||
|
}
|
||||||
|
let content = `.grid .slick-cell { padding: ${cssRuleText}; }`;
|
||||||
|
this.input.css.innerHTML = content;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the angular components and record for this input that we have done so
|
||||||
|
*/
|
||||||
|
private _bootstrapAngular(): void {
|
||||||
|
let input = <EditDataResultsInput>this.input;
|
||||||
|
let uri = input.uri;
|
||||||
|
|
||||||
|
// Pass the correct DataService to the new angular component
|
||||||
|
let dataService = this._queryModelService.getDataService(uri);
|
||||||
|
if (!dataService) {
|
||||||
|
throw new Error('DataService not found for URI: ' + uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark that we have bootstrapped
|
||||||
|
input.setBootstrappedTrue();
|
||||||
|
|
||||||
|
// Get the bootstrap params and perform the bootstrap
|
||||||
|
// Note: pass in input so on disposal this is cleaned up.
|
||||||
|
// Otherwise many components will be left around and be subscribed
|
||||||
|
// to events from the backing data service
|
||||||
|
const parent = input.container;
|
||||||
|
let params: IEditDataComponentParams = { dataService: dataService };
|
||||||
|
this._instantiationService.invokeFunction(bootstrapAngular,
|
||||||
|
EditDataModule,
|
||||||
|
parent,
|
||||||
|
EDITDATA_SELECTOR,
|
||||||
|
params,
|
||||||
|
input);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,7 +7,7 @@ import { Action, IActionItem, IActionRunner } from 'vs/base/common/actions';
|
|||||||
import { TPromise } from 'vs/base/common/winjs.base';
|
import { TPromise } from 'vs/base/common/winjs.base';
|
||||||
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
|
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
|
||||||
import { IQueryModelService } from 'sql/parts/query/execution/queryModel';
|
import { IQueryModelService } from 'sql/parts/query/execution/queryModel';
|
||||||
import { SelectBox } from 'vs/base/browser/ui/selectBox/selectBox';
|
import { SelectBox } from 'sql/base/browser/ui/selectBox/selectBox';
|
||||||
import { EventEmitter } from 'sql/base/common/eventEmitter';
|
import { EventEmitter } from 'sql/base/common/eventEmitter';
|
||||||
import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement';
|
import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement';
|
||||||
import { EditDataEditor } from 'sql/parts/editData/editor/editDataEditor';
|
import { EditDataEditor } from 'sql/parts/editData/editor/editDataEditor';
|
||||||
@@ -63,7 +63,7 @@ export abstract class EditDataAction extends Action {
|
|||||||
* Action class that refreshes the table for an edit data session
|
* Action class that refreshes the table for an edit data session
|
||||||
*/
|
*/
|
||||||
export class RefreshTableAction extends EditDataAction {
|
export class RefreshTableAction extends EditDataAction {
|
||||||
private static EnabledClass = 'refresh';
|
private static EnabledClass = 'start';
|
||||||
public static ID = 'refreshTableAction';
|
public static ID = 'refreshTableAction';
|
||||||
|
|
||||||
constructor(editor: EditDataEditor,
|
constructor(editor: EditDataEditor,
|
||||||
@@ -72,14 +72,24 @@ export class RefreshTableAction extends EditDataAction {
|
|||||||
@INotificationService private _notificationService: INotificationService,
|
@INotificationService private _notificationService: INotificationService,
|
||||||
) {
|
) {
|
||||||
super(editor, RefreshTableAction.ID, RefreshTableAction.EnabledClass, _connectionManagementService);
|
super(editor, RefreshTableAction.ID, RefreshTableAction.EnabledClass, _connectionManagementService);
|
||||||
this.label = nls.localize('editData.refresh', 'Refresh');
|
this.label = nls.localize('editData.run', 'Run');
|
||||||
}
|
}
|
||||||
|
|
||||||
public run(): TPromise<void> {
|
public run(): TPromise<void> {
|
||||||
if (this.isConnected(this.editor)) {
|
if (this.isConnected(this.editor)) {
|
||||||
let input = this.editor.editDataInput;
|
let input = this.editor.editDataInput;
|
||||||
|
|
||||||
|
let rowLimit: number = undefined;
|
||||||
|
let queryString: string = undefined;
|
||||||
|
if (input.queryPaneEnabled) {
|
||||||
|
queryString = input.queryString = this.editor.getEditorText();
|
||||||
|
} else {
|
||||||
|
rowLimit = input.rowLimit;
|
||||||
|
}
|
||||||
|
|
||||||
this._queryModelService.disposeEdit(input.uri).then((result) => {
|
this._queryModelService.disposeEdit(input.uri).then((result) => {
|
||||||
this._queryModelService.initializeEdit(input.uri, input.schemaName, input.tableName, input.objectType, input.rowLimit);
|
this._queryModelService.initializeEdit(input.uri, input.schemaName, input.tableName, input.objectType, rowLimit, queryString);
|
||||||
|
input.showResultsEditor();
|
||||||
}, error => {
|
}, error => {
|
||||||
this._notificationService.notify({
|
this._notificationService.notify({
|
||||||
severity: Severity.Error,
|
severity: Severity.Error,
|
||||||
@@ -162,10 +172,12 @@ export class ChangeMaxRowsActionItem extends EventEmitter implements IActionItem
|
|||||||
this._options = ['200', '1000', '10000'];
|
this._options = ['200', '1000', '10000'];
|
||||||
this._currentOptionsIndex = 0;
|
this._currentOptionsIndex = 0;
|
||||||
this.toDispose = [];
|
this.toDispose = [];
|
||||||
this.selectBox = new SelectBox([], -1, contextViewService);
|
this.selectBox = new SelectBox(this._options, this._options[this._currentOptionsIndex], contextViewService);
|
||||||
this._registerListeners();
|
this._registerListeners();
|
||||||
this._refreshOptions();
|
this._refreshOptions();
|
||||||
this.defaultRowCount = Number(this._options[this._currentOptionsIndex]);
|
this.defaultRowCount = Number(this._options[this._currentOptionsIndex]);
|
||||||
|
|
||||||
|
this.toDispose.push(attachSelectBoxStyler(this.selectBox, _themeService));
|
||||||
}
|
}
|
||||||
|
|
||||||
public render(container: HTMLElement): void {
|
public render(container: HTMLElement): void {
|
||||||
@@ -181,6 +193,14 @@ export class ChangeMaxRowsActionItem extends EventEmitter implements IActionItem
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enable(): void {
|
||||||
|
this.selectBox.enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
public disable(): void {
|
||||||
|
this.selectBox.disable();
|
||||||
|
}
|
||||||
|
|
||||||
public set setCurrentOptionIndex(selection: number) {
|
public set setCurrentOptionIndex(selection: number) {
|
||||||
this._currentOptionsIndex = this._options.findIndex(x => x === selection.toString());
|
this._currentOptionsIndex = this._options.findIndex(x => x === selection.toString());
|
||||||
this._refreshOptions();
|
this._refreshOptions();
|
||||||
@@ -210,3 +230,40 @@ export class ChangeMaxRowsActionItem extends EventEmitter implements IActionItem
|
|||||||
this.toDispose.push(attachSelectBoxStyler(this.selectBox, this._themeService));
|
this.toDispose.push(attachSelectBoxStyler(this.selectBox, this._themeService));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Action class that is tied with toggling the Query editor
|
||||||
|
*/
|
||||||
|
export class ShowQueryPaneAction extends EditDataAction {
|
||||||
|
|
||||||
|
private static EnabledClass = 'filterLabel';
|
||||||
|
public static ID = 'showQueryPaneAction';
|
||||||
|
private readonly showSqlLabel = nls.localize('editData.showSql', 'Show SQL Pane');
|
||||||
|
private readonly closeSqlLabel = nls.localize('editData.closeSql', 'Close SQL Pane');
|
||||||
|
|
||||||
|
constructor(editor: EditDataEditor,
|
||||||
|
@IQueryModelService private _queryModelService: IQueryModelService,
|
||||||
|
@IConnectionManagementService _connectionManagementService: IConnectionManagementService
|
||||||
|
) {
|
||||||
|
super(editor, ShowQueryPaneAction.ID, ShowQueryPaneAction.EnabledClass, _connectionManagementService);
|
||||||
|
this.label = this.showSqlLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public set queryPaneEnabled(value: boolean) {
|
||||||
|
this.updateLabel(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private updateLabel(queryPaneEnabled: boolean): void {
|
||||||
|
if (queryPaneEnabled) {
|
||||||
|
this.label = this.closeSqlLabel;
|
||||||
|
} else {
|
||||||
|
this.label = this.showSqlLabel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public run(): TPromise<void> {
|
||||||
|
this.editor.toggleQueryPane();
|
||||||
|
this.updateLabel(this.editor.queryPaneEnabled());
|
||||||
|
return TPromise.as(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,4 +17,6 @@ export let SelectAllMessages = 'SelectAllMessages';
|
|||||||
export let SaveAsCsv = 'SaveAsCSV';
|
export let SaveAsCsv = 'SaveAsCSV';
|
||||||
export let SaveAsJSON = 'SaveAsJSON';
|
export let SaveAsJSON = 'SaveAsJSON';
|
||||||
export let SaveAsExcel = 'SaveAsExcel';
|
export let SaveAsExcel = 'SaveAsExcel';
|
||||||
|
export let ViewAsChart = 'ViewAsChart';
|
||||||
export let GoToNextQueryOutputTab = 'GoToNextQueryOutputTab';
|
export let GoToNextQueryOutputTab = 'GoToNextQueryOutputTab';
|
||||||
|
export let GoToNextGrid = 'GoToNextGrid';
|
||||||
|
|||||||
@@ -14,14 +14,27 @@ import 'vs/css!./media/editData';
|
|||||||
|
|
||||||
import { ElementRef, ChangeDetectorRef, OnInit, OnDestroy, Component, Inject, forwardRef, EventEmitter } from '@angular/core';
|
import { ElementRef, ChangeDetectorRef, OnInit, OnDestroy, Component, Inject, forwardRef, EventEmitter } from '@angular/core';
|
||||||
import { IGridDataRow, VirtualizedCollection } from 'angular2-slickgrid';
|
import { IGridDataRow, VirtualizedCollection } from 'angular2-slickgrid';
|
||||||
|
|
||||||
import { IGridDataSet } from 'sql/parts/grid/common/interfaces';
|
import { IGridDataSet } from 'sql/parts/grid/common/interfaces';
|
||||||
import * as Services from 'sql/parts/grid/services/sharedServices';
|
import * as Services from 'sql/parts/grid/services/sharedServices';
|
||||||
import { IBootstrapService, BOOTSTRAP_SERVICE_ID } from 'sql/services/bootstrap/bootstrapService';
|
import { IEditDataComponentParams } from 'sql/services/bootstrap/bootstrapParams';
|
||||||
import { EditDataComponentParams } from 'sql/services/bootstrap/bootstrapParams';
|
|
||||||
import { GridParentComponent } from 'sql/parts/grid/views/gridParentComponent';
|
import { GridParentComponent } from 'sql/parts/grid/views/gridParentComponent';
|
||||||
import { EditDataGridActionProvider } from 'sql/parts/grid/views/editData/editDataGridActions';
|
import { EditDataGridActionProvider } from 'sql/parts/grid/views/editData/editDataGridActions';
|
||||||
import { error } from 'sql/base/common/log';
|
import { error } from 'sql/base/common/log';
|
||||||
import { clone } from 'sql/base/common/objects';
|
import { clone } from 'sql/base/common/objects';
|
||||||
|
import { IQueryEditorService } from 'sql/parts/query/common/queryEditorService';
|
||||||
|
import { IBootstrapParams } from 'sql/services/bootstrap/bootstrapService';
|
||||||
|
|
||||||
|
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||||
|
import Severity from 'vs/base/common/severity';
|
||||||
|
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||||
|
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
|
||||||
|
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
|
||||||
|
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||||
|
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||||
|
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
|
||||||
|
import { KeyCode } from 'vs/base/common/keyCodes';
|
||||||
|
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
|
||||||
|
|
||||||
export const EDITDATA_SELECTOR: string = 'editdata-component';
|
export const EDITDATA_SELECTOR: string = 'editdata-component';
|
||||||
|
|
||||||
@@ -40,7 +53,6 @@ export class EditDataComponent extends GridParentComponent implements OnInit, On
|
|||||||
// All datasets
|
// All datasets
|
||||||
private dataSet: IGridDataSet;
|
private dataSet: IGridDataSet;
|
||||||
private scrollTimeOut: number;
|
private scrollTimeOut: number;
|
||||||
private messagesAdded = false;
|
|
||||||
private scrollEnabled = true;
|
private scrollEnabled = true;
|
||||||
private firstRender = true;
|
private firstRender = true;
|
||||||
private totalElapsedTimeSpan: number;
|
private totalElapsedTimeSpan: number;
|
||||||
@@ -68,13 +80,20 @@ export class EditDataComponent extends GridParentComponent implements OnInit, On
|
|||||||
constructor(
|
constructor(
|
||||||
@Inject(forwardRef(() => ElementRef)) el: ElementRef,
|
@Inject(forwardRef(() => ElementRef)) el: ElementRef,
|
||||||
@Inject(forwardRef(() => ChangeDetectorRef)) cd: ChangeDetectorRef,
|
@Inject(forwardRef(() => ChangeDetectorRef)) cd: ChangeDetectorRef,
|
||||||
@Inject(BOOTSTRAP_SERVICE_ID) bootstrapService: IBootstrapService
|
@Inject(IBootstrapParams) params: IEditDataComponentParams,
|
||||||
|
@Inject(IInstantiationService) private instantiationService: IInstantiationService,
|
||||||
|
@Inject(INotificationService) private notificationService: INotificationService,
|
||||||
|
@Inject(IContextMenuService) contextMenuService: IContextMenuService,
|
||||||
|
@Inject(IKeybindingService) keybindingService: IKeybindingService,
|
||||||
|
@Inject(IContextKeyService) contextKeyService: IContextKeyService,
|
||||||
|
@Inject(IConfigurationService) configurationService: IConfigurationService,
|
||||||
|
@Inject(IClipboardService) clipboardService: IClipboardService,
|
||||||
|
@Inject(IQueryEditorService) queryEditorService: IQueryEditorService
|
||||||
) {
|
) {
|
||||||
super(el, cd, bootstrapService);
|
super(el, cd, contextMenuService, keybindingService, contextKeyService, configurationService, clipboardService, queryEditorService);
|
||||||
this._el.nativeElement.className = 'slickgridContainer';
|
this._el.nativeElement.className = 'slickgridContainer';
|
||||||
let editDataParameters: EditDataComponentParams = this._bootstrapService.getBootstrapParams(this._el.nativeElement.tagName);
|
this.dataService = params.dataService;
|
||||||
this.dataService = editDataParameters.dataService;
|
this.actionProvider = this.instantiationService.createInstance(EditDataGridActionProvider, this.dataService, this.onGridSelectAll(), this.onDeleteRow(), this.onRevertRow());
|
||||||
this.actionProvider = this._bootstrapService.instantiationService.createInstance(EditDataGridActionProvider, this.dataService, this.onGridSelectAll(), this.onDeleteRow(), this.onRevertRow());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -127,7 +146,6 @@ export class EditDataComponent extends GridParentComponent implements OnInit, On
|
|||||||
self.renderedDataSets = self.placeHolderDataSets;
|
self.renderedDataSets = self.placeHolderDataSets;
|
||||||
self.totalElapsedTimeSpan = undefined;
|
self.totalElapsedTimeSpan = undefined;
|
||||||
self.complete = false;
|
self.complete = false;
|
||||||
self.messagesAdded = false;
|
|
||||||
|
|
||||||
// Hooking up edit functions
|
// Hooking up edit functions
|
||||||
this.onIsCellEditValid = (row, column, value): boolean => {
|
this.onIsCellEditValid = (row, column, value): boolean => {
|
||||||
@@ -302,7 +320,6 @@ export class EditDataComponent extends GridParentComponent implements OnInit, On
|
|||||||
handleComplete(self: EditDataComponent, event: any): void {
|
handleComplete(self: EditDataComponent, event: any): void {
|
||||||
self.totalElapsedTimeSpan = event.data;
|
self.totalElapsedTimeSpan = event.data;
|
||||||
self.complete = true;
|
self.complete = true;
|
||||||
self.messagesAdded = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
handleEditSessionReady(self, event): void {
|
handleEditSessionReady(self, event): void {
|
||||||
@@ -310,7 +327,12 @@ export class EditDataComponent extends GridParentComponent implements OnInit, On
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleMessage(self: EditDataComponent, event: any): void {
|
handleMessage(self: EditDataComponent, event: any): void {
|
||||||
// TODO: what do we do with messages?
|
if (event.data && event.data.isError) {
|
||||||
|
self.notificationService.notify({
|
||||||
|
severity: Severity.Error,
|
||||||
|
message: event.data.message
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handleResultSet(self: EditDataComponent, event: any): void {
|
handleResultSet(self: EditDataComponent, event: any): void {
|
||||||
@@ -360,7 +382,6 @@ export class EditDataComponent extends GridParentComponent implements OnInit, On
|
|||||||
undefinedDataSet.dataRows = undefined;
|
undefinedDataSet.dataRows = undefined;
|
||||||
undefinedDataSet.resized = new EventEmitter();
|
undefinedDataSet.resized = new EventEmitter();
|
||||||
self.placeHolderDataSets.push(undefinedDataSet);
|
self.placeHolderDataSets.push(undefinedDataSet);
|
||||||
self.messagesAdded = true;
|
|
||||||
self.onScroll(0);
|
self.onScroll(0);
|
||||||
|
|
||||||
// Setup the state of the selected cell
|
// Setup the state of the selected cell
|
||||||
@@ -402,12 +423,12 @@ export class EditDataComponent extends GridParentComponent implements OnInit, On
|
|||||||
}, self.scrollTimeOutTime);
|
}, self.scrollTimeOutTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected tryHandleKeyEvent(e): boolean {
|
protected tryHandleKeyEvent(e: StandardKeyboardEvent): boolean {
|
||||||
let handled: boolean = false;
|
let handled: boolean = false;
|
||||||
// If the esc key was pressed while in a create session
|
// If the esc key was pressed while in a create session
|
||||||
let currentNewRowIndex = this.dataSet.totalRows - 2;
|
let currentNewRowIndex = this.dataSet.totalRows - 2;
|
||||||
|
|
||||||
if (e.keyCode === jQuery.ui.keyCode.ESCAPE && this.newRowVisible && this.currentCell.row === currentNewRowIndex) {
|
if (e.keyCode === KeyCode.Escape && this.newRowVisible && this.currentCell.row === currentNewRowIndex) {
|
||||||
// revert our last new row
|
// revert our last new row
|
||||||
this.removingNewRow = true;
|
this.removingNewRow = true;
|
||||||
|
|
||||||
@@ -417,7 +438,7 @@ export class EditDataComponent extends GridParentComponent implements OnInit, On
|
|||||||
this.newRowVisible = false;
|
this.newRowVisible = false;
|
||||||
});
|
});
|
||||||
handled = true;
|
handled = true;
|
||||||
} else if (e.keyCode === jQuery.ui.keyCode.ESCAPE) {
|
} else if (e.keyCode === KeyCode.Escape) {
|
||||||
this.currentEditCellValue = null;
|
this.currentEditCellValue = null;
|
||||||
this.onRevertRow()(this.currentCell.row);
|
this.onRevertRow()(this.currentCell.row);
|
||||||
handled = true;
|
handled = true;
|
||||||
|
|||||||
@@ -4,42 +4,48 @@
|
|||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
import { ApplicationRef, ComponentFactoryResolver, NgModule, Inject, forwardRef } from '@angular/core';
|
import { ApplicationRef, ComponentFactoryResolver, NgModule, Inject, forwardRef, Type } from '@angular/core';
|
||||||
import { CommonModule } from '@angular/common';
|
import { CommonModule } from '@angular/common';
|
||||||
import { BrowserModule } from '@angular/platform-browser';
|
import { BrowserModule } from '@angular/platform-browser';
|
||||||
import { IBootstrapService, BOOTSTRAP_SERVICE_ID } from 'sql/services/bootstrap/bootstrapService';
|
|
||||||
|
|
||||||
import { EditDataComponent, EDITDATA_SELECTOR } from 'sql/parts/grid/views/editData/editData.component';
|
import { EditDataComponent, EDITDATA_SELECTOR } from 'sql/parts/grid/views/editData/editData.component';
|
||||||
import { SlickGrid } from 'angular2-slickgrid';
|
import { SlickGrid } from 'angular2-slickgrid';
|
||||||
|
import { IBootstrapParams } from 'sql/services/bootstrap/bootstrapService';
|
||||||
|
|
||||||
@NgModule({
|
export const EditDataModule = (params: IBootstrapParams, selector: string): Type<any> => {
|
||||||
|
|
||||||
imports: [
|
@NgModule({
|
||||||
CommonModule,
|
|
||||||
BrowserModule
|
|
||||||
],
|
|
||||||
|
|
||||||
declarations: [
|
imports: [
|
||||||
EditDataComponent,
|
CommonModule,
|
||||||
SlickGrid
|
BrowserModule
|
||||||
],
|
],
|
||||||
|
|
||||||
entryComponents: [
|
declarations: [
|
||||||
EditDataComponent
|
EditDataComponent,
|
||||||
]
|
SlickGrid
|
||||||
})
|
],
|
||||||
export class EditDataModule {
|
|
||||||
|
|
||||||
constructor(
|
entryComponents: [
|
||||||
@Inject(forwardRef(() => ComponentFactoryResolver)) private _resolver: ComponentFactoryResolver,
|
EditDataComponent
|
||||||
@Inject(BOOTSTRAP_SERVICE_ID) private _bootstrapService: IBootstrapService
|
],
|
||||||
) {
|
providers: [
|
||||||
|
{ provide: IBootstrapParams, useValue: params }
|
||||||
|
]
|
||||||
|
})
|
||||||
|
class ModuleClass {
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
@Inject(forwardRef(() => ComponentFactoryResolver)) private _resolver: ComponentFactoryResolver
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
ngDoBootstrap(appRef: ApplicationRef) {
|
||||||
|
const factory = this._resolver.resolveComponentFactory(EditDataComponent);
|
||||||
|
(<any>factory).factory.selector = selector;
|
||||||
|
appRef.bootstrap(factory);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ngDoBootstrap(appRef: ApplicationRef) {
|
return ModuleClass;
|
||||||
const factory = this._resolver.resolveComponentFactory(EditDataComponent);
|
};
|
||||||
const uniqueSelector: string = this._bootstrapService.getUniqueSelector(EDITDATA_SELECTOR);
|
|
||||||
(<any>factory).factory.selector = uniqueSelector;
|
|
||||||
appRef.bootstrap(factory);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ export const MESSAGES_COPY_ID = 'grid.messages.copy';
|
|||||||
export const TOGGLERESULTS_ID = 'grid.toggleResultPane';
|
export const TOGGLERESULTS_ID = 'grid.toggleResultPane';
|
||||||
export const TOGGLEMESSAGES_ID = 'grid.toggleMessagePane';
|
export const TOGGLEMESSAGES_ID = 'grid.toggleMessagePane';
|
||||||
export const GOTONEXTQUERYOUTPUTTAB_ID = 'query.goToNextQueryOutputTab';
|
export const GOTONEXTQUERYOUTPUTTAB_ID = 'query.goToNextQueryOutputTab';
|
||||||
|
export const GRID_VIEWASCHART_ID = 'grid.viewAsChart';
|
||||||
|
export const GRID_GOTONEXTGRID_ID = 'grid.goToNextGrid';
|
||||||
|
|
||||||
export class GridActionProvider {
|
export class GridActionProvider {
|
||||||
|
|
||||||
|
|||||||