mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-18 18:46:47 -05:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
765c7064d4 | ||
|
|
dfeb80ed3e | ||
|
|
e2ce6bebac | ||
|
|
3368af9371 | ||
|
|
26156b4e61 | ||
|
|
cbbfdb98db | ||
|
|
9ae254c91e | ||
|
|
4772be5dcc | ||
|
|
41e756b906 | ||
|
|
e2bd65cdb0 |
@@ -76,7 +76,7 @@ export class AccountFeature implements StaticFeature {
|
|||||||
window.showErrorMessage(unauthorizedMessage);
|
window.showErrorMessage(unauthorizedMessage);
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
const securityToken = await azdata.accounts.getAccountSecurityToken(account, tenant, azdata.AzureResource.AzureKeyVault);
|
const securityToken = await azdata.accounts.getAccountSecurityToken(account, tenant.id, azdata.AzureResource.AzureKeyVault);
|
||||||
|
|
||||||
if (!securityToken?.token) {
|
if (!securityToken?.token) {
|
||||||
window.showErrorMessage(unauthorizedMessage);
|
window.showErrorMessage(unauthorizedMessage);
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import * as loc from '../common/localizedConstants';
|
|||||||
import { IJupyterBookToc, JupyterBookSection } from '../contracts/content';
|
import { IJupyterBookToc, JupyterBookSection } from '../contracts/content';
|
||||||
import { convertFrom, getContentPath, BookVersion } from './bookVersionHandler';
|
import { convertFrom, getContentPath, BookVersion } from './bookVersionHandler';
|
||||||
import { debounce } from '../common/utils';
|
import { debounce } from '../common/utils';
|
||||||
|
import { Deferred } from '../common/promise';
|
||||||
const fsPromises = fileServices.promises;
|
const fsPromises = fileServices.promises;
|
||||||
const content = 'content';
|
const content = 'content';
|
||||||
|
|
||||||
@@ -26,6 +27,8 @@ export class BookModel {
|
|||||||
private _bookVersion: BookVersion;
|
private _bookVersion: BookVersion;
|
||||||
private _rootPath: string;
|
private _rootPath: string;
|
||||||
private _errorMessage: string;
|
private _errorMessage: string;
|
||||||
|
private _activePromise: Deferred<void> | undefined = undefined;
|
||||||
|
private _queuedPromises: Deferred<void>[] = [];
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
public readonly bookPath: string,
|
public readonly bookPath: string,
|
||||||
@@ -56,14 +59,31 @@ export class BookModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async initializeContents(): Promise<void> {
|
public async initializeContents(): Promise<void> {
|
||||||
this._bookItems = [];
|
const deferred = new Deferred<void>();
|
||||||
this._allNotebooks = new Map<string, BookTreeItem>();
|
if (!this._activePromise && this._queuedPromises.length === 0) {
|
||||||
if (this.isNotebook) {
|
this._activePromise = deferred;
|
||||||
this.readNotebook();
|
}
|
||||||
} else {
|
else {
|
||||||
await this.readBookStructure();
|
// If there's an active promise, then we need to add the new promise to the queue.
|
||||||
await this.loadTableOfContentFiles();
|
this._queuedPromises.push(deferred);
|
||||||
await this.readBooks();
|
await deferred.promise;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
this._bookItems = [];
|
||||||
|
this._allNotebooks = new Map<string, BookTreeItem>();
|
||||||
|
if (this.isNotebook) {
|
||||||
|
this.readNotebook();
|
||||||
|
} else {
|
||||||
|
await this.readBookStructure();
|
||||||
|
await this.loadTableOfContentFiles();
|
||||||
|
await this.readBooks();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
// Resolve next promise in queue
|
||||||
|
const queuedPromise = this._queuedPromises.shift();
|
||||||
|
queuedPromise?.resolve();
|
||||||
|
this._activePromise = queuedPromise;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import { DeployAzureSQLDBWizardModel } from './deployAzureSQLDBWizard/deployAzur
|
|||||||
import { ToolsAndEulaPage } from './toolsAndEulaSettingsPage';
|
import { ToolsAndEulaPage } from './toolsAndEulaSettingsPage';
|
||||||
import { OptionValuesFilter, ResourceTypeService } from '../services/resourceTypeService';
|
import { OptionValuesFilter, ResourceTypeService } from '../services/resourceTypeService';
|
||||||
import { PageLessDeploymentModel } from './pageLessDeploymentModel';
|
import { PageLessDeploymentModel } from './pageLessDeploymentModel';
|
||||||
|
import { deepClone } from '../common/utils';
|
||||||
|
|
||||||
export class ResourceTypeWizard {
|
export class ResourceTypeWizard {
|
||||||
private customButtons: azdata.window.Button[] = [];
|
private customButtons: azdata.window.Button[] = [];
|
||||||
@@ -65,7 +66,7 @@ export class ResourceTypeWizard {
|
|||||||
* Setting the first provider from the first value of the dropdowns.
|
* Setting the first provider from the first value of the dropdowns.
|
||||||
* If there are no options (dropdowns) then the resource type has only one provider which is set as default here.
|
* If there are no options (dropdowns) then the resource type has only one provider which is set as default here.
|
||||||
*/
|
*/
|
||||||
let filteredOptions = resourceType.options;
|
let filteredOptions = deepClone(resourceType.options);
|
||||||
const optionsFilter = this._optionValuesFilter?.[this.resourceType.name];
|
const optionsFilter = this._optionValuesFilter?.[this.resourceType.name];
|
||||||
if (optionsFilter) {
|
if (optionsFilter) {
|
||||||
filteredOptions.forEach(option => {
|
filteredOptions.forEach(option => {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import { AgreementInfo, DeploymentProvider, HelpText, ITool, ResourceType, Resou
|
|||||||
import { createFlexContainer } from './modelViewUtils';
|
import { createFlexContainer } from './modelViewUtils';
|
||||||
import * as loc from '../localizedConstants';
|
import * as loc from '../localizedConstants';
|
||||||
import { IToolsService } from '../services/toolsService';
|
import { IToolsService } from '../services/toolsService';
|
||||||
import { getErrorMessage } from '../common/utils';
|
import { deepClone, getErrorMessage } from '../common/utils';
|
||||||
import { ResourceTypePage } from './resourceTypePage';
|
import { ResourceTypePage } from './resourceTypePage';
|
||||||
import { ResourceTypeWizard } from './resourceTypeWizard';
|
import { ResourceTypeWizard } from './resourceTypeWizard';
|
||||||
import { OptionValuesFilter as OptionValuesFilter } from '../services/resourceTypeService';
|
import { OptionValuesFilter as OptionValuesFilter } from '../services/resourceTypeService';
|
||||||
@@ -200,7 +200,7 @@ export class ToolsAndEulaPage extends ResourceTypePage {
|
|||||||
}).component();
|
}).component();
|
||||||
this._optionsContainer.addItem(optionsTitle);
|
this._optionsContainer.addItem(optionsTitle);
|
||||||
this._resourceType.options.forEach((option, index) => {
|
this._resourceType.options.forEach((option, index) => {
|
||||||
let optionValues = option.values;
|
let optionValues = deepClone(option.values);
|
||||||
const optionValueFilter = this.optionValuesFilter?.[this._resourceType.name]?.[option.name];
|
const optionValueFilter = this.optionValuesFilter?.[this._resourceType.name]?.[option.name];
|
||||||
if (optionValueFilter) {
|
if (optionValueFilter) {
|
||||||
optionValues = optionValues.filter(optionValue => optionValueFilter.includes(optionValue.name));
|
optionValues = optionValues.filter(optionValue => optionValueFilter.includes(optionValue.name));
|
||||||
|
|||||||
43
src/bootstrap-window.js
vendored
43
src/bootstrap-window.js
vendored
@@ -21,6 +21,7 @@
|
|||||||
globalThis.MonacoBootstrapWindow = factory();
|
globalThis.MonacoBootstrapWindow = factory();
|
||||||
}
|
}
|
||||||
}(this, function () {
|
}(this, function () {
|
||||||
|
const bootstrapLib = bootstrap();
|
||||||
const preloadGlobals = globals();
|
const preloadGlobals = globals();
|
||||||
const sandbox = preloadGlobals.context.sandbox;
|
const sandbox = preloadGlobals.context.sandbox;
|
||||||
const webFrame = preloadGlobals.webFrame;
|
const webFrame = preloadGlobals.webFrame;
|
||||||
@@ -56,15 +57,22 @@
|
|||||||
developerToolsUnbind = registerDeveloperKeybindings(options && options.disallowReloadKeybinding);
|
developerToolsUnbind = registerDeveloperKeybindings(options && options.disallowReloadKeybinding);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enable ASAR support
|
// Correctly inherit the parent's environment (TODO@sandbox non-sandboxed only)
|
||||||
globalThis.MonacoBootstrap.enableASARSupport(configuration.appRoot);
|
if (!sandbox) {
|
||||||
|
Object.assign(safeProcess.env, configuration.userEnv);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable ASAR support (TODO@sandbox non-sandboxed only)
|
||||||
|
if (!sandbox) {
|
||||||
|
globalThis.MonacoBootstrap.enableASARSupport(configuration.appRoot);
|
||||||
|
}
|
||||||
|
|
||||||
if (options && typeof options.canModifyDOM === 'function') {
|
if (options && typeof options.canModifyDOM === 'function') {
|
||||||
options.canModifyDOM(configuration);
|
options.canModifyDOM(configuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the nls configuration into the process.env as early as possible
|
// Get the nls configuration into the process.env as early as possible (TODO@sandbox non-sandboxed only)
|
||||||
const nlsConfig = globalThis.MonacoBootstrap.setupNLS();
|
const nlsConfig = sandbox ? { availableLanguages: {} } : globalThis.MonacoBootstrap.setupNLS();
|
||||||
|
|
||||||
let locale = nlsConfig.availableLanguages['*'] || 'en';
|
let locale = nlsConfig.availableLanguages['*'] || 'en';
|
||||||
if (locale === 'zh-tw') {
|
if (locale === 'zh-tw') {
|
||||||
@@ -87,16 +95,27 @@
|
|||||||
|
|
||||||
window['MonacoEnvironment'] = {};
|
window['MonacoEnvironment'] = {};
|
||||||
|
|
||||||
// const baseUrl = sandbox ? // {{SQL CARBON EDIT}} Pending changes?
|
const baseUrl = sandbox ?
|
||||||
// `${bootstrapLib.fileUriFromPath(configuration.appRoot, { isWindows: safeProcess.platform === 'win32', scheme: 'vscode-file', fallbackAuthority: 'vscode-app' })}/out` :
|
`${bootstrapLib.fileUriFromPath(configuration.appRoot, { isWindows: safeProcess.platform === 'win32', scheme: 'vscode-file', fallbackAuthority: 'vscode-app' })}/out` :
|
||||||
// `${bootstrapLib.fileUriFromPath(configuration.appRoot, { isWindows: safeProcess.platform === 'win32' })}/out`;
|
`${bootstrapLib.fileUriFromPath(configuration.appRoot, { isWindows: safeProcess.platform === 'win32' })}/out`;
|
||||||
|
|
||||||
const loaderConfig = {
|
const loaderConfig = {
|
||||||
baseUrl: `${uriFromPath(configuration.appRoot)}/out`,
|
baseUrl: baseUrl,
|
||||||
'vs/nls': nlsConfig,
|
'vs/nls': nlsConfig,
|
||||||
amdModulesPattern: /^(vs|sql)\//, // {{SQL CARBON EDIT}} include sql in regex
|
amdModulesPattern: /^(vs|sql)\//, // {{SQL CARBON EDIT}} include sql in regex
|
||||||
preferScriptTags: sandbox
|
preferScriptTags: sandbox
|
||||||
};
|
};
|
||||||
|
// use a trusted types policy when loading via script tags
|
||||||
|
if (loaderConfig.preferScriptTags && window && window.trustedTypes) { // {{SQL CARBON EDIT}} fix uglify error
|
||||||
|
loaderConfig.trustedTypesPolicy = window.trustedTypes.createPolicy('amdLoader', {
|
||||||
|
createScriptURL(value) {
|
||||||
|
if (value.startsWith(window.location.origin)) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
throw new Error(`Invalid script url: ${value}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// cached data config
|
// cached data config
|
||||||
if (configuration.nodeCachedDataDir) {
|
if (configuration.nodeCachedDataDir) {
|
||||||
@@ -228,6 +247,14 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {{ fileUriFromPath: (path: string, config: { isWindows?: boolean, scheme?: string, fallbackAuthority?: string }) => string; }}
|
||||||
|
*/
|
||||||
|
function bootstrap() {
|
||||||
|
// @ts-ignore (defined in bootstrap.js)
|
||||||
|
return globalThis.MonacoBootstrap;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return {typeof import('./vs/base/parts/sandbox/electron-sandbox/globals')}
|
* @return {typeof import('./vs/base/parts/sandbox/electron-sandbox/globals')}
|
||||||
*/
|
*/
|
||||||
|
|||||||
39
src/bootstrap.js
vendored
39
src/bootstrap.js
vendored
@@ -23,9 +23,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}(this, function () {
|
}(this, function () {
|
||||||
const Module = require('module');
|
const Module = typeof require === 'function' ? require('module') : undefined;
|
||||||
const path = require('path');
|
const path = typeof require === 'function' ? require('path') : undefined;
|
||||||
const fs = require('fs');
|
const fs = typeof require === 'function' ? require('fs') : undefined;
|
||||||
|
|
||||||
//#region global bootstrapping
|
//#region global bootstrapping
|
||||||
|
|
||||||
@@ -34,9 +34,11 @@
|
|||||||
|
|
||||||
// Workaround for Electron not installing a handler to ignore SIGPIPE
|
// Workaround for Electron not installing a handler to ignore SIGPIPE
|
||||||
// (https://github.com/electron/electron/issues/13254)
|
// (https://github.com/electron/electron/issues/13254)
|
||||||
process.on('SIGPIPE', () => {
|
if (typeof process !== 'undefined') {
|
||||||
console.error(new Error('Unexpected SIGPIPE'));
|
process.on('SIGPIPE', () => {
|
||||||
});
|
console.error(new Error('Unexpected SIGPIPE'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
@@ -89,21 +91,32 @@
|
|||||||
//#region URI helpers
|
//#region URI helpers
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} _path
|
* @param {string} path
|
||||||
|
* @param {{ isWindows?: boolean, scheme?: string, fallbackAuthority?: string }} config
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
function fileUriFromPath(_path) {
|
function fileUriFromPath(path, config) {
|
||||||
let pathName = path.resolve(_path).replace(/\\/g, '/');
|
|
||||||
|
// Since we are building a URI, we normalize any backlsash
|
||||||
|
// to slashes and we ensure that the path begins with a '/'.
|
||||||
|
let pathName = path.replace(/\\/g, '/');
|
||||||
if (pathName.length > 0 && pathName.charAt(0) !== '/') {
|
if (pathName.length > 0 && pathName.charAt(0) !== '/') {
|
||||||
pathName = `/${pathName}`;
|
pathName = `/${pathName}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @type {string} */
|
/** @type {string} */
|
||||||
let uri;
|
let uri;
|
||||||
if (process.platform === 'win32' && pathName.startsWith('//')) { // specially handle Windows UNC paths
|
|
||||||
uri = encodeURI(`file:${pathName}`);
|
// Windows: in order to support UNC paths (which start with '//')
|
||||||
} else {
|
// that have their own authority, we do not use the provided authority
|
||||||
uri = encodeURI(`file://${pathName}`);
|
// but rather preserve it.
|
||||||
|
if (config.isWindows && pathName.startsWith('//')) {
|
||||||
|
uri = encodeURI(`${config.scheme || 'file'}:${pathName}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise we optionally add the provided authority if specified
|
||||||
|
else {
|
||||||
|
uri = encodeURI(`${config.scheme || 'file'}://${config.fallbackAuthority || ''}${pathName}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return uri.replace(/#/g, '%23');
|
return uri.replace(/#/g, '%23');
|
||||||
|
|||||||
@@ -148,6 +148,8 @@ export class DataExplorerViewPaneContainer extends ViewPaneContainer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const dataExplorerIconId = 'dataExplorer';
|
||||||
|
|
||||||
export const VIEW_CONTAINER = Registry.as<IViewContainersRegistry>(ViewContainerExtensions.ViewContainersRegistry).registerViewContainer({
|
export const VIEW_CONTAINER = Registry.as<IViewContainersRegistry>(ViewContainerExtensions.ViewContainersRegistry).registerViewContainer({
|
||||||
id: VIEWLET_ID,
|
id: VIEWLET_ID,
|
||||||
name: localize('dataexplorer.name', "Connections"),
|
name: localize('dataexplorer.name', "Connections"),
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ import { createErrorWithActions } from 'vs/base/common/errorsWithActions';
|
|||||||
import { toErrorMessage } from 'vs/base/common/errorMessage';
|
import { toErrorMessage } from 'vs/base/common/errorMessage';
|
||||||
import { ILogService } from 'vs/platform/log/common/log';
|
import { ILogService } from 'vs/platform/log/common/log';
|
||||||
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
|
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
|
||||||
import { LabeledMenuItemActionItem, fillInActions } from 'vs/platform/actions/browser/menuEntryActionViewItem';
|
import { MaskedLabeledMenuItemActionItem, fillInActions } from 'vs/platform/actions/browser/menuEntryActionViewItem';
|
||||||
import { Button } from 'sql/base/browser/ui/button/button';
|
import { Button } from 'sql/base/browser/ui/button/button';
|
||||||
import { isUndefinedOrNull } from 'vs/base/common/types';
|
import { isUndefinedOrNull } from 'vs/base/common/types';
|
||||||
import { IBootstrapParams } from 'sql/workbench/services/bootstrap/common/bootstrapParams';
|
import { IBootstrapParams } from 'sql/workbench/services/bootstrap/common/bootstrapParams';
|
||||||
@@ -509,7 +509,7 @@ export class NotebookComponent extends AngularDisposable implements OnInit, OnDe
|
|||||||
action.tooltip = action.label;
|
action.tooltip = action.label;
|
||||||
action.label = '';
|
action.label = '';
|
||||||
}
|
}
|
||||||
return new LabeledMenuItemActionItem(action, this.keybindingService, this.notificationService);
|
return new MaskedLabeledMenuItemActionItem(action, this.keybindingService, this.notificationService);
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -440,11 +440,13 @@ export class NotebookExplorerViewPaneContainer extends ViewPaneContainer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const notebookIconId = 'book';
|
||||||
|
|
||||||
export const NOTEBOOK_VIEW_CONTAINER = Registry.as<IViewContainersRegistry>(ViewContainerExtensions.ViewContainersRegistry).registerViewContainer({
|
export const NOTEBOOK_VIEW_CONTAINER = Registry.as<IViewContainersRegistry>(ViewContainerExtensions.ViewContainersRegistry).registerViewContainer({
|
||||||
id: VIEWLET_ID,
|
id: VIEWLET_ID,
|
||||||
name: localize('notebookExplorer.name', "Notebooks"),
|
name: localize('notebookExplorer.name', "Notebooks"),
|
||||||
ctorDescriptor: new SyncDescriptor(NotebookExplorerViewPaneContainer),
|
ctorDescriptor: new SyncDescriptor(NotebookExplorerViewPaneContainer),
|
||||||
icon: { id: 'book' },
|
icon: { id: notebookIconId },
|
||||||
order: 6,
|
order: 6,
|
||||||
storageId: `${VIEWLET_ID}.state`
|
storageId: `${VIEWLET_ID}.state`
|
||||||
}, ViewContainerLocation.Sidebar);
|
}, ViewContainerLocation.Sidebar);
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ export default () => `
|
|||||||
<div class="content-container">
|
<div class="content-container">
|
||||||
<div class="ads-homepage-section tool-tip">
|
<div class="ads-homepage-section tool-tip">
|
||||||
<div class="tool-tip-container" id="tool-tip-container-wide">
|
<div class="tool-tip-container" id="tool-tip-container-wide">
|
||||||
<a role="img" tabindex=0 class="ads-welcome-page-link" aria-label="${previewImgDescription}" title="${previewImgDescription}" id="preview-link-wide" class="preview-link" tabindex="0" name="preview"><p>${escape(localize('welcomePage.preview', "Preview"))}</p><i class="icon-info themed-icon"></i></a>
|
<a role="img" tabindex=0 class="ads-welcome-page-link preview-link" aria-label="${previewImgDescription}" title="${previewImgDescription}" id="preview-link-wide" tabindex="0" name="preview"><p>${escape(localize('welcomePage.preview', "Preview"))}</p><i class="icon-info themed-icon"></i></a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="ads-homepage-section section header hero">
|
<div class="ads-homepage-section section header hero">
|
||||||
@@ -111,37 +111,42 @@ export default () => `
|
|||||||
<div class="links">
|
<div class="links">
|
||||||
<h2>${escape(localize('welcomePage.usefuLinks', "Useful Links"))}</h2>
|
<h2>${escape(localize('welcomePage.usefuLinks', "Useful Links"))}</h2>
|
||||||
<div class="link-header">
|
<div class="link-header">
|
||||||
<a class="link ads-welcome-page-link"
|
<a class="link ads-welcome-page-link" href="https://aka.ms/get-started-azdata">
|
||||||
href="https://aka.ms/get-started-azdata">${escape(localize('welcomePage.gettingStarted',
|
${escape(localize('welcomePage.gettingStarted', "Getting Started"))}<span class="icon-link themed-icon-alt"></span>
|
||||||
"Getting Started"))}<span class="icon-link themed-icon-alt"></a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
${escape(localize('welcomePage.gettingStartedBody',
|
${escape(localize('welcomePage.gettingStartedBody', "Discover the capabilities offered by Azure Data Studio and learn how to make the most of them."))}
|
||||||
"Discover the capabilities offered by Azure Data Studio and learn how to make the most of them."))}
|
|
||||||
</p>
|
</p>
|
||||||
<div class="link-header">
|
<div class="link-header">
|
||||||
<a class="link ads-welcome-page-link"
|
<a class="link ads-welcome-page-link" href="command:workbench.action.openDocumentationUrl">
|
||||||
href="command:workbench.action.openDocumentationUrl">${escape(localize('welcomePage.documentation',
|
${escape(localize('welcomePage.documentation', "Documentation"))}<span class="icon-link themed-icon-alt"></span>
|
||||||
"Documentation"))}<span class="icon-link themed-icon-alt"</a></a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<p>${escape(localize('welcomePage.documentationBody',
|
<p>
|
||||||
"Visit the documentation center for quickstarts, how-to guides, and references for PowerShell, APIs, etc."))}
|
${escape(localize('welcomePage.documentationBody', "Visit the documentation center for quickstarts, how-to guides, and references for PowerShell, APIs, etc."))}
|
||||||
|
</p>
|
||||||
|
<div class="link-header">
|
||||||
|
<a class="link ads-welcome-page-link" href="https://aka.ms/AzureSQLSurvey">
|
||||||
|
${escape(localize('welcomePage.productFeedback', "Product Feedback"))}<span class="icon-link themed-icon-alt"></span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
${escape(localize('welcomePage.productFeedbackBody', "Shape the future of the Azure SQL products you're using by completing the feedback survey!"))}
|
||||||
</p>
|
</p>
|
||||||
<div class="videos-container row">
|
<div class="videos-container row">
|
||||||
<h2>Videos</h2>
|
<h2>${escape(localize('welcomePage.videos', "Videos"))}</h2>
|
||||||
<div class="flex flex-container-video">
|
<div class="flex flex-container-video">
|
||||||
<div class="videos-container-video">
|
<div class="videos-container-video">
|
||||||
<a href="https://www.youtube.com/watch?v=Orv7fptVoUA" class="video overview ads-welcome-page-link">
|
<a href="https://www.youtube.com/watch?v=Orv7fptVoUA" class="video overview ads-welcome-page-link">
|
||||||
<img src="${require.toUrl('./../../media/video_overview.png')}" class="video-overview" id="video-overview" />
|
<img src="${require.toUrl('./../../media/video_overview.png')}" class="video-overview" id="video-overview" />
|
||||||
<h4>${escape(localize('welcomePage.videoDescriptionOverview',
|
<h4>${escape(localize('welcomePage.videoDescriptionOverview', "Overview of Azure Data Studio"))}</h4>
|
||||||
"Overview of Azure Data Studio"))}</h4>
|
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="videos-container-video">
|
<div class="videos-container-video">
|
||||||
<a href="https://www.youtube.com/watch?v=Nt4kIHQ0IOc" class="video overview ads-welcome-page-link">
|
<a href="https://www.youtube.com/watch?v=Nt4kIHQ0IOc" class="video overview ads-welcome-page-link">
|
||||||
<img src="${require.toUrl('./../../media/video_introduction.png')}" class="video-introduction" id="video-introduction" />
|
<img src="${require.toUrl('./../../media/video_introduction.png')}" class="video-introduction" id="video-introduction" />
|
||||||
<h4>${escape(localize('welcomePage.videoDescriptionIntroduction',
|
<h4>${escape(localize('welcomePage.videoDescriptionIntroduction', "Introduction to Azure Data Studio Notebooks | Data Exposed"))}</h4>
|
||||||
"Introduction to Azure Data Studio Notebooks | Data Exposed"))}</h4>
|
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -152,26 +157,29 @@ export default () => `
|
|||||||
<div class="ads-homepage-section content extensions content-container">
|
<div class="ads-homepage-section content extensions content-container">
|
||||||
<div class="flex flex-j-between">
|
<div class="flex flex-j-between">
|
||||||
<h2>${escape(localize('welcomePage.extensions', "Extensions"))}</h2>
|
<h2>${escape(localize('welcomePage.extensions', "Extensions"))}</h2>
|
||||||
<a role="button" class="link-show-all flex ads-welcome-page-link" href="command:workbench.view.extensions">${escape(localize('welcomePage.showAll', "Show All"))} <span class="icon-arrow-right"></span></a>
|
<a role="button" class="link-show-all flex ads-welcome-page-link" href="command:workbench.view.extensions">
|
||||||
|
${escape(localize('welcomePage.showAll', "Show All"))}<span class="icon-arrow-right"></span>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="row ads-grid grip-gap-50">
|
<div class="row ads-grid grip-gap-50">
|
||||||
<div
|
<div class="ads-grid tile no-hover extension-pack">
|
||||||
class="ads-grid tile no-hover extension-pack">
|
|
||||||
<div class="extension-pack-description">
|
<div class="extension-pack-description">
|
||||||
<h3 class="extension-pack-header"></h3>
|
<h3 class="extension-pack-header"></h3>
|
||||||
<p class="extension-pack-body"></p>
|
<p class="extension-pack-body"></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="extension-pack-extensions flex flex-d-column flex-j-evenly flex-a-start">
|
<div class="extension-pack-extensions flex flex-d-column flex-j-evenly flex-a-start">
|
||||||
<div class="extension-pack-extension-list flex flex-d-column flex-j-evenly flex-a-start"></div>
|
<div class="extension-pack-extension-list flex flex-d-column flex-j-evenly flex-a-start"></div>
|
||||||
<div class="flex flex-j-end extension-pack-btn-container flex flex-j-between flex-a-center"">
|
<div class="flex flex-j-end extension-pack-btn-container flex flex-j-between flex-a-center">
|
||||||
<div class="extensionPack" href="#"></div>
|
<div class="extensionPack"></div>
|
||||||
<a role="button" class="a-self-end link-learn-more flex flex-a-center ads-welcome-page-link" href="command:azdata.extension.open?%7B%22id%22%3A%22microsoft.admin-pack%22%7D">${escape(localize('welcomePage.learnMore',
|
<a role="button" class="a-self-end link-learn-more flex flex-a-center ads-welcome-page-link" href="command:azdata.extension.open?%7B%22id%22%3A%22microsoft.admin-pack%22%7D">
|
||||||
"Learn more "))}<span class="icon-arrow-right"></span></a>
|
${escape(localize('welcomePage.learnMore', "Learn more "))}<span class="icon-arrow-right"></span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="extension-list flex flex-d-column">
|
||||||
<div class="extension-list flex flex-d-column">
|
<!-- Dynamically populated -->
|
||||||
<!-- Dynamically populated -->
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<br /><br /><br />
|
<br /><br /><br />
|
||||||
</div>
|
</div>
|
||||||
@@ -179,3 +187,4 @@ export default () => `
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import { Action } from 'vs/base/common/actions';
|
|||||||
import { Disposable } from 'vs/base/common/lifecycle';
|
import { Disposable } from 'vs/base/common/lifecycle';
|
||||||
import { RawContextKey, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
import { RawContextKey, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
|
||||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||||
import { registerThemingParticipant } from 'vs/platform/theme/common/themeService';
|
import { registerThemingParticipant, ThemeIcon } from 'vs/platform/theme/common/themeService';
|
||||||
import { buttonBackground, buttonForeground } from 'vs/platform/theme/common/colorRegistry';
|
import { buttonBackground, buttonForeground } from 'vs/platform/theme/common/colorRegistry';
|
||||||
import { Color } from 'vs/base/common/color';
|
import { Color } from 'vs/base/common/color';
|
||||||
import { Registry } from 'vs/platform/registry/common/platform';
|
import { Registry } from 'vs/platform/registry/common/platform';
|
||||||
@@ -20,6 +20,10 @@ import { SyncActionDescriptor } from 'vs/platform/actions/common/actions';
|
|||||||
import { KeyCode } from 'vs/base/common/keyCodes';
|
import { KeyCode } from 'vs/base/common/keyCodes';
|
||||||
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
|
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
|
||||||
import { Button } from 'sql/base/browser/ui/button/button';
|
import { Button } from 'sql/base/browser/ui/button/button';
|
||||||
|
import { extensionsViewIcon } from 'vs/workbench/contrib/extensions/browser/extensionsIcons';
|
||||||
|
import { settingsViewBarIcon } from 'vs/workbench/browser/parts/activitybar/activitybarPart';
|
||||||
|
import { dataExplorerIconId } from 'sql/workbench/contrib/dataExplorer/browser/dataExplorerViewlet';
|
||||||
|
import { notebookIconId } from 'sql/workbench/contrib/notebook/browser/notebookExplorer/notebookExplorerViewlet';
|
||||||
|
|
||||||
const $ = dom.$;
|
const $ = dom.$;
|
||||||
interface TourData {
|
interface TourData {
|
||||||
@@ -40,11 +44,16 @@ interface TourData {
|
|||||||
popupImage: string;
|
popupImage: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const dataExplorerIconCssSelector = `.action-label.${dataExplorerIconId}`;
|
||||||
|
const notebookIconCssSelector = `.action-label.${notebookIconId}`;
|
||||||
|
const extensionsIconCssSelector = ThemeIcon.asCSSSelector(extensionsViewIcon);
|
||||||
|
const settingsGearIconCssSelector = ThemeIcon.asCSSSelector(settingsViewBarIcon);
|
||||||
|
|
||||||
const tourData: TourData[] = [
|
const tourData: TourData[] = [
|
||||||
{ key: 'connections', order: '1', header: localize('GuidedTour.connections', "Connections"), body: localize('GuidedTour.makeConnections', "Connect, query, and manage your connections from SQL Server, Azure, and more."), step: localize('GuidedTour.one', "1"), elmClass: 'overview-tour-connections', id: 'overview-tour-connections', btnId: 'overview-tour-connections-btn', btnText: localize('GuidedTour.next', "Next"), docs: 'https://aka.ms/ads-connections-quickstart', elementToAppendTo: '.action-label.dataExplorer', arrow: 'arrow-left', popupImage: './../../gettingStarted/media/connections.png' },
|
{ key: 'connections', order: '1', header: localize('GuidedTour.connections', "Connections"), body: localize('GuidedTour.makeConnections', "Connect, query, and manage your connections from SQL Server, Azure, and more."), step: localize('GuidedTour.one', "1"), elmClass: 'overview-tour-connections', id: 'overview-tour-connections', btnId: 'overview-tour-connections-btn', btnText: localize('GuidedTour.next', "Next"), docs: 'https://aka.ms/ads-connections-quickstart', elementToAppendTo: dataExplorerIconCssSelector, arrow: 'arrow-left', popupImage: './../../gettingStarted/media/connections.png' },
|
||||||
{ key: 'jupyer_books', order: '2', header: localize('GuidedTour.notebooks', "Notebooks"), body: localize('GuidedTour.gettingStartedNotebooks', "Get started creating your own notebook or collection of notebooks in a single place."), step: localize('GuidedTour.two', "2"), elmClass: 'overview-tour-jupyterBooks', id: 'overview-tour-jupyterBooks', btnId: 'overview-tour-jupyter-btn', btnText: localize('GuidedTour.next', "Next"), docs: 'https://aka.ms/ads-notebooks', elementToAppendTo: '.action-label.book', arrow: 'arrow-left', popupImage: './../../gettingStarted/media/notebooks.png' },
|
{ key: 'jupyer_books', order: '2', header: localize('GuidedTour.notebooks', "Notebooks"), body: localize('GuidedTour.gettingStartedNotebooks', "Get started creating your own notebook or collection of notebooks in a single place."), step: localize('GuidedTour.two', "2"), elmClass: 'overview-tour-jupyterBooks', id: 'overview-tour-jupyterBooks', btnId: 'overview-tour-jupyter-btn', btnText: localize('GuidedTour.next', "Next"), docs: 'https://aka.ms/ads-notebooks', elementToAppendTo: notebookIconCssSelector, arrow: 'arrow-left', popupImage: './../../gettingStarted/media/notebooks.png' },
|
||||||
{ key: 'extensions', order: '3', header: localize('GuidedTour.extensions', "Extensions"), body: localize('GuidedTour.addExtensions', "Extend the functionality of Azure Data Studio by installing extensions developed by us/Microsoft as well as the third-party community (you!)."), step: localize('GuidedTour.three', "3"), elmClass: 'overview-tour-extensions', id: 'overview-tour-extensions', btnId: 'overview-tour-extensions-btn', btnText: localize('GuidedTour.next', "Next"), docs: 'https://aka.ms/ads-extensions', elementToAppendTo: '.action-label.codicon-extensions', arrow: 'arrow-left', popupImage: './../../gettingStarted/media/extensions.png' },
|
{ key: 'extensions', order: '3', header: localize('GuidedTour.extensions', "Extensions"), body: localize('GuidedTour.addExtensions', "Extend the functionality of Azure Data Studio by installing extensions developed by us/Microsoft as well as the third-party community (you!)."), step: localize('GuidedTour.three', "3"), elmClass: 'overview-tour-extensions', id: 'overview-tour-extensions', btnId: 'overview-tour-extensions-btn', btnText: localize('GuidedTour.next', "Next"), docs: 'https://aka.ms/ads-extensions', elementToAppendTo: extensionsIconCssSelector, arrow: 'arrow-left', popupImage: './../../gettingStarted/media/extensions.png' },
|
||||||
{ key: 'settings', order: '4', header: localize('GuidedTour.settings', "Settings"), body: localize('GuidedTour.makeConnesetSettings', "Customize Azure Data Studio based on your preferences. You can configure Settings like autosave and tab size, personalize your Keyboard Shortcuts, and switch to a Color Theme of your liking."), step: localize('GuidedTour.four', "4"), elmClass: 'overview-tour-settings', id: 'overview-tour-settings', btnId: 'overview-tour-settings-btn', btnText: localize('GuidedTour.next', "Next"), elementToAppendTo: '.codicon-settings-gear', arrow: 'arrow-bottom-left', popupImage: '../../gettingStarted/media/settings.png' },
|
{ key: 'settings', order: '4', header: localize('GuidedTour.settings', "Settings"), body: localize('GuidedTour.makeConnesetSettings', "Customize Azure Data Studio based on your preferences. You can configure Settings like autosave and tab size, personalize your Keyboard Shortcuts, and switch to a Color Theme of your liking."), step: localize('GuidedTour.four', "4"), elmClass: 'overview-tour-settings', id: 'overview-tour-settings', btnId: 'overview-tour-settings-btn', btnText: localize('GuidedTour.next', "Next"), elementToAppendTo: settingsGearIconCssSelector, arrow: 'arrow-bottom-left', popupImage: '../../gettingStarted/media/settings.png' },
|
||||||
{ key: 'welcome_page', order: '5', header: localize('GuidedTour.welcomePage', "Welcome Page"), body: localize('GuidedTour.discoverWelcomePage', "Discover top features, recently opened files, and recommended extensions on the Welcome page. For more information on how to get started in Azure Data Studio, check out our videos and documentation."), step: localize('GuidedTour.five', "5"), elmClass: 'overview-tour-home', id: 'overview-tour-home', btnId: 'overview-tour-home-btn', btnText: localize('GuidedTour.finish', "Finish"), elementToAppendTo: 'center', arrow: 'none', popupImage: '../../gettingStarted/media/welcome.png' },
|
{ key: 'welcome_page', order: '5', header: localize('GuidedTour.welcomePage', "Welcome Page"), body: localize('GuidedTour.discoverWelcomePage', "Discover top features, recently opened files, and recommended extensions on the Welcome page. For more information on how to get started in Azure Data Studio, check out our videos and documentation."), step: localize('GuidedTour.five', "5"), elmClass: 'overview-tour-home', id: 'overview-tour-home', btnId: 'overview-tour-home-btn', btnText: localize('GuidedTour.finish', "Finish"), elementToAppendTo: 'center', arrow: 'none', popupImage: '../../gettingStarted/media/welcome.png' },
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -232,7 +241,7 @@ export class GuidedTour extends Disposable {
|
|||||||
positionVertical = Math.round((subjectElementPosition.top - 22));
|
positionVertical = Math.round((subjectElementPosition.top - 22));
|
||||||
subjectElement.style.pointerEvents = 'none';
|
subjectElement.style.pointerEvents = 'none';
|
||||||
}
|
}
|
||||||
if (elementClassToAppendTo === '.codicon-settings-gear') {
|
if (elementClassToAppendTo === settingsGearIconCssSelector) {
|
||||||
tourItem.style.top = (positionVertical - 330) + 'px';
|
tourItem.style.top = (positionVertical - 330) + 'px';
|
||||||
tourItem.style.left = positionHorizontal + 'px';
|
tourItem.style.left = positionHorizontal + 'px';
|
||||||
}
|
}
|
||||||
@@ -325,7 +334,7 @@ registerThemingParticipant((theme, collector) => {
|
|||||||
collector.addRule(`.monaco-workbench > .ads-tour .ads-tour-popup p, .monaco-workbench > .ads-tour .ads-tour-popup h1 { color: ${bodyTag}; }`);
|
collector.addRule(`.monaco-workbench > .ads-tour .ads-tour-popup p, .monaco-workbench > .ads-tour .ads-tour-popup h1 { color: ${bodyTag}; }`);
|
||||||
collector.addRule(`.monaco-workbench > .ads-tour .ads-tour-popup .ads-tour-btn-container .ads-tour-docs-link { color: ${bodyTag}; }`);
|
collector.addRule(`.monaco-workbench > .ads-tour .ads-tour-popup .ads-tour-btn-container .ads-tour-docs-link { color: ${bodyTag}; }`);
|
||||||
collector.addRule(`.monaco-workbench > .ads-tour .ads-tour-popup .ads-tour-btn-container .ads-tour-btn-primary-inverse { background: ${bodyTag}; }`);
|
collector.addRule(`.monaco-workbench > .ads-tour .ads-tour-popup .ads-tour-btn-container .ads-tour-btn-primary-inverse { background: ${bodyTag}; }`);
|
||||||
collector.addRule(`.monaco-workbench .activitybar>.content :not(.monaco-menu)>.monaco-action-bar .action-label.activity-workbench-view-extension-books-explorer.subject-element-focused, .monaco-workbench .activitybar>.content :not(.monaco-menu)>.monaco-action-bar .action-label.codicon.dataExplorer.subject-element-focused { background: ${bodyTag}; }`);
|
collector.addRule(`.monaco-workbench .activitybar>.content :not(.monaco-menu)>.monaco-action-bar .action-label.activity-workbench-view-extension-books-explorer.subject-element-focused, .monaco-workbench .activitybar>.content :not(.monaco-menu)>.monaco-action-bar ${dataExplorerIconCssSelector}.subject-element-focused { background: ${bodyTag}; }`);
|
||||||
collector.addRule(`.monaco-workbench .activitybar>.content :not(.monaco-menu)>.monaco-action-bar .action-label.codicon.subject-element-focused { color: ${bodyTag} !important; }`);
|
collector.addRule(`.monaco-workbench .activitybar>.content :not(.monaco-menu)>.monaco-action-bar .action-label.codicon.subject-element-focused { color: ${bodyTag} !important; }`);
|
||||||
collector.addRule(`.monaco-workbench .welcomePage .btn-remove-tour { color: ${bodyTag} !important; }`);
|
collector.addRule(`.monaco-workbench .welcomePage .btn-remove-tour { color: ${bodyTag} !important; }`);
|
||||||
collector.addRule(`.monaco-workbench .welcomePage .guided-tour-banner p { color: ${bodyTag}; }`);
|
collector.addRule(`.monaco-workbench .welcomePage .guided-tour-banner p { color: ${bodyTag}; }`);
|
||||||
|
|||||||
@@ -291,12 +291,8 @@
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ads-homepage #tool-tip-container-wide .ads-welcome-page-link{
|
.ads-homepage #tool-tip-container-wide .ads-welcome-page-link,
|
||||||
display: flex;
|
.ads-homepage #tool-tip-container-narrow .ads-welcome-page-link {
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ads-homepage #tool-tip-container-narrow .ads-welcome-page-link{
|
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
@@ -885,18 +881,24 @@
|
|||||||
border-top: 1px solid;
|
border-top: 1px solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ads-homepage .ads-homepage-section .history .list, .ads-homepage .ads-homepage-section .pinned .list {
|
.ads-homepage .ads-homepage-section .history .list,
|
||||||
|
.ads-homepage .ads-homepage-section .pinned .list {
|
||||||
|
min-height: 170px; /* 5 (max # of items displayed in list) x list item height */
|
||||||
list-style-type: none;
|
list-style-type: none;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin-top: 0
|
margin-top: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
.ads-homepage .ads-homepage-section .history .list-header, .ads-homepage .ads-homepage-section .pinned .list-header {
|
.ads-homepage .ads-homepage-section .history .list-header,
|
||||||
|
.ads-homepage .ads-homepage-section .pinned .list-header {
|
||||||
padding: 0 0 2px 11px
|
padding: 0 0 2px 11px
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.ads-homepage .ads-homepage-section .history .list li:not(.moreRecent), .ads-homepage .ads-homepage-section .history .list-header-container, .ads-homepage .ads-homepage-section .pinned .list li:not(.moreRecent), .ads-homepage .ads-homepage-section .pinned .list-header-container {
|
.ads-homepage .ads-homepage-section .history .list li:not(.moreRecent),
|
||||||
|
.ads-homepage .ads-homepage-section .history .list-header-container,
|
||||||
|
.ads-homepage .ads-homepage-section .pinned .list li:not(.moreRecent),
|
||||||
|
.ads-homepage .ads-homepage-section .pinned .list-header-container {
|
||||||
height: 33px;
|
height: 33px;
|
||||||
list-style: none;
|
list-style: none;
|
||||||
border-bottom: 1px solid;
|
border-bottom: 1px solid;
|
||||||
|
|||||||
@@ -186,10 +186,10 @@ const extensionPacks: ExtensionSuggestion[] = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
const extensionPackExtensions: ExtensionPackExtensions[] = [
|
const extensionPackExtensions: ExtensionPackExtensions[] = [
|
||||||
{ name: 'SQL Server Agent', icon: require.toUrl('./../../media/defaultExtensionIcon.svg'), link: `command:azdata.extension.open?{"id":"microsoft.agent"}` },
|
{ name: localize('welcomePage.sqlServerAgent', "SQL Server Agent"), icon: require.toUrl('./../../media/defaultExtensionIcon.svg'), link: `command:azdata.extension.open?{"id":"microsoft.agent"}` },
|
||||||
{ name: 'SQL Server Profiler', icon: require.toUrl('./../../media/defaultExtensionIcon.svg'), link: `command:azdata.extension.open?{"id":"microsoft.profiler"}` },
|
{ name: localize('welcomePage.sqlServerProfiler', "SQL Server Profiler"), icon: require.toUrl('./../../media/defaultExtensionIcon.svg'), link: `command:azdata.extension.open?{"id":"microsoft.profiler"}` },
|
||||||
{ name: 'SQL Server Import', icon: require.toUrl('./../../media/defaultExtensionIcon.svg'), link: `command:azdata.extension.open?{"id":"microsoft.import"}` },
|
{ name: localize('welcomePage.sqlServerImport', "SQL Server Import"), icon: require.toUrl('./../../media/defaultExtensionIcon.svg'), link: `command:azdata.extension.open?{"id":"microsoft.import"}` },
|
||||||
{ name: 'SQL Server Dacpac', icon: require.toUrl('./../../media/defaultExtensionIcon.svg'), link: `command:azdata.extension.open?{"id":"microsoft.dacpac"}` }
|
{ name: localize('welcomePage.sqlServerDacpac', "SQL Server Dacpac"), icon: require.toUrl('./../../media/defaultExtensionIcon.svg'), link: `command:azdata.extension.open?{"id":"microsoft.dacpac"}` }
|
||||||
];
|
];
|
||||||
|
|
||||||
const extensions: ExtensionSuggestion[] = [
|
const extensions: ExtensionSuggestion[] = [
|
||||||
@@ -343,7 +343,7 @@ class WelcomePage extends Disposable {
|
|||||||
|
|
||||||
const workspacesToShow = workspaces.slice(0, 5);
|
const workspacesToShow = workspaces.slice(0, 5);
|
||||||
clearNode(ul);
|
clearNode(ul);
|
||||||
await this.mapListEntries(workspacesToShow, container, ul);
|
await this.mapListEntries(workspacesToShow, container);
|
||||||
}).then(undefined, onUnexpectedError);
|
}).then(undefined, onUnexpectedError);
|
||||||
this.addExtensionList(container, '.extension-list');
|
this.addExtensionList(container, '.extension-list');
|
||||||
this.addExtensionPack(container, '.extensionPack');
|
this.addExtensionPack(container, '.extensionPack');
|
||||||
@@ -514,7 +514,7 @@ class WelcomePage extends Disposable {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async mapListEntries(recents: (IRecentWorkspace | IRecentFolder)[], container: HTMLElement, ul: HTMLElement): Promise<HTMLElement[]> {
|
private async mapListEntries(recents: (IRecentWorkspace | IRecentFolder)[], container: HTMLElement): Promise<HTMLElement[]> {
|
||||||
const result: HTMLElement[] = [];
|
const result: HTMLElement[] = [];
|
||||||
for (let i = 0; i < recents.length; i++) {
|
for (let i = 0; i < recents.length; i++) {
|
||||||
const recent = recents[i];
|
const recent = recents[i];
|
||||||
|
|||||||
@@ -1441,17 +1441,18 @@ const _ttpSafeInnerHtml = window.trustedTypes?.createPolicy('safeInnerHtml', {
|
|||||||
export function safeInnerHtml(node: HTMLElement, value: string): void {
|
export function safeInnerHtml(node: HTMLElement, value: string): void {
|
||||||
|
|
||||||
const options = _extInsaneOptions({
|
const options = _extInsaneOptions({
|
||||||
allowedTags: ['a', 'button', 'blockquote', 'code', 'div', 'h1', 'h2', 'h3', 'input', 'label', 'li', 'p', 'pre', 'select', 'small', 'span', 'strong', 'textarea', 'ul', 'ol'],
|
allowedTags: ['a', 'button', 'blockquote', 'code', 'div', 'h1', 'h2', 'h3', 'h4', 'i', 'img', 'input', 'label', 'li', 'p', 'pre', 'select', 'small', 'span', 'strong', 'textarea', 'ul', 'ol'], // {{SQL CARBON EDIT}} Add tags for welcome page support
|
||||||
allowedAttributes: {
|
allowedAttributes: {
|
||||||
'a': ['href', 'x-dispatch'],
|
'a': ['href', 'x-dispatch'],
|
||||||
'button': ['data-href', 'x-dispatch'],
|
'button': ['data-href', 'x-dispatch'],
|
||||||
'input': ['type', 'placeholder', 'checked', 'required'],
|
'input': ['type', 'placeholder', 'checked', 'required'],
|
||||||
|
'img': ['src', 'alt', 'title', 'aria-label'], // {{SQL CARBON EDIT}} Add img for welcome page support
|
||||||
'label': ['for'],
|
'label': ['for'],
|
||||||
'select': ['required'],
|
'select': ['required'],
|
||||||
'span': ['data-command', 'role'],
|
'span': ['data-command', 'role'],
|
||||||
'textarea': ['name', 'placeholder', 'required'],
|
'textarea': ['name', 'placeholder', 'required'],
|
||||||
},
|
},
|
||||||
allowedSchemes: ['http', 'https', 'command']
|
allowedSchemes: ['http', 'https', 'command', 'file'] // {{SQL CARBON EDIT}} Add allowed schema for welcome page support
|
||||||
}, ['class', 'id', 'role', 'tabindex']);
|
}, ['class', 'id', 'role', 'tabindex']);
|
||||||
|
|
||||||
const html = _ttpSafeInnerHtml?.createHTML(value, options) ?? insane(value, options);
|
const html = _ttpSafeInnerHtml?.createHTML(value, options) ?? insane(value, options);
|
||||||
|
|||||||
@@ -313,4 +313,78 @@ export class LabeledMenuItemActionItem extends MenuEntryActionViewItem {
|
|||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a duplicate of LabeledMenuItemActionItem with the following exceptions:
|
||||||
|
* - Adds CSS class: `masked-icon` to contributed actions label element.
|
||||||
|
* - Adds style rule for masked-icon.
|
||||||
|
*/
|
||||||
|
export class MaskedLabeledMenuItemActionItem extends MenuEntryActionViewItem {
|
||||||
|
private _labeledItemClassDispose?: IDisposable;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
public _action: MenuItemAction,
|
||||||
|
@IKeybindingService labeledkeybindingService: IKeybindingService,
|
||||||
|
@INotificationService protected _notificationService: INotificationService,
|
||||||
|
private readonly _defaultCSSClassToAdd: string = ''
|
||||||
|
) {
|
||||||
|
super(_action, labeledkeybindingService, _notificationService);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateLabel(): void {
|
||||||
|
if (this.label) {
|
||||||
|
this.label.innerText = this._commandAction.label;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Overwrite item class to ensure that we can pass in a CSS class that other items use
|
||||||
|
// Leverages the _defaultCSSClassToAdd property that's passed into the constructor
|
||||||
|
protected _updateItemClass(item: ICommandAction): void {
|
||||||
|
dispose(this._labeledItemClassDispose);
|
||||||
|
this._labeledItemClassDispose = undefined;
|
||||||
|
|
||||||
|
if (ThemeIcon.isThemeIcon(item.icon)) {
|
||||||
|
// TODO
|
||||||
|
} else if (item.icon) {
|
||||||
|
let iconClass: string;
|
||||||
|
|
||||||
|
|
||||||
|
if (item.icon?.dark?.scheme) {
|
||||||
|
const iconPathMapKey = item.icon.dark.toString();
|
||||||
|
|
||||||
|
if (ICON_PATH_TO_CSS_RULES.has(iconPathMapKey)) {
|
||||||
|
iconClass = ICON_PATH_TO_CSS_RULES.get(iconPathMapKey)!;
|
||||||
|
} else {
|
||||||
|
iconClass = ids.nextId();
|
||||||
|
createCSSRule(`.codicon.masked-icon.${iconClass}::before`, `-webkit-mask-image: ${asCSSUrl(item.icon.light || item.icon.dark)}`);
|
||||||
|
createCSSRule(`.codicon.masked-icon.${iconClass}::before`, `mask-image: ${asCSSUrl(item.icon.light || item.icon.dark)}`);
|
||||||
|
ICON_PATH_TO_CSS_RULES.set(iconPathMapKey, iconClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.label) {
|
||||||
|
const iconClasses = iconClass.split(' ');
|
||||||
|
if (this._defaultCSSClassToAdd) {
|
||||||
|
iconClasses.push(this._defaultCSSClassToAdd);
|
||||||
|
}
|
||||||
|
this.label.classList.add('codicon', ...iconClasses);
|
||||||
|
this.label.classList.add('masked-icon', ...iconClasses);
|
||||||
|
this._labeledItemClassDispose = toDisposable(() => {
|
||||||
|
if (this.label) {
|
||||||
|
this.label.classList.remove('codicon', ...iconClasses);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose(): void {
|
||||||
|
if (this._labeledItemClassDispose) {
|
||||||
|
dispose(this._labeledItemClassDispose);
|
||||||
|
this._labeledItemClassDispose = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
// {{SQL CARBON EDIT}} - End
|
// {{SQL CARBON EDIT}} - End
|
||||||
|
|||||||
@@ -608,6 +608,11 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// ADS doesn't support extension tags, we need to return empty array to avoid breaking some scenarios. e.g. file extension based recommendations.
|
||||||
|
const tagFilters = query.criteria.filter(x => x.filterType === FilterType.Tag);
|
||||||
|
if (tagFilters?.length > 0) {
|
||||||
|
filteredExtensions = [];
|
||||||
|
}
|
||||||
const searchTexts = query.criteria.filter(x => x.filterType === FilterType.SearchText).map(v => v.value ? v.value.toLocaleLowerCase() : undefined);
|
const searchTexts = query.criteria.filter(x => x.filterType === FilterType.SearchText).map(v => v.value ? v.value.toLocaleLowerCase() : undefined);
|
||||||
if (searchTexts && searchTexts.length > 0) {
|
if (searchTexts && searchTexts.length > 0) {
|
||||||
searchTexts.forEach(searchText => {
|
searchTexts.forEach(searchText => {
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ export class UserDataAutoSyncEnablementService extends Disposable implements _IU
|
|||||||
}
|
}
|
||||||
|
|
||||||
isEnabled(defaultEnablement?: boolean): boolean {
|
isEnabled(defaultEnablement?: boolean): boolean {
|
||||||
|
/* {{SQL CARBON EDIT}} Disable unused sync service
|
||||||
switch (this.environmentService.sync) {
|
switch (this.environmentService.sync) {
|
||||||
case 'on':
|
case 'on':
|
||||||
return true;
|
return true;
|
||||||
@@ -66,6 +67,8 @@ export class UserDataAutoSyncEnablementService extends Disposable implements _IU
|
|||||||
return false;
|
return false;
|
||||||
default: return this.storageService.getBoolean(enablementKey, StorageScope.GLOBAL, !!defaultEnablement); // {{SQL CARBON EDIT}} strict-null-checks move this to a default case
|
default: return this.storageService.getBoolean(enablementKey, StorageScope.GLOBAL, !!defaultEnablement); // {{SQL CARBON EDIT}} strict-null-checks move this to a default case
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
canToggleEnablement(): boolean {
|
canToggleEnablement(): boolean {
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class TestUserDataAutoSyncService extends UserDataAutoSyncService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
suite('UserDataAutoSyncService', () => {
|
suite.skip('UserDataAutoSyncService', () => { // {{SQL CARBON EDIT}} Service is disabled so turn off tests
|
||||||
|
|
||||||
const disposableStore = new DisposableStore();
|
const disposableStore = new DisposableStore();
|
||||||
|
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ interface ICachedViewContainer {
|
|||||||
views?: { when?: string }[];
|
views?: { when?: string }[];
|
||||||
}
|
}
|
||||||
|
|
||||||
const settingsViewBarIcon = registerIcon('settings-view-bar-icon', Codicon.settingsGear, nls.localize('settingsViewBarIcon', 'Settings icon in the view bar.'));
|
export const settingsViewBarIcon = registerIcon('settings-view-bar-icon', Codicon.settingsGear, nls.localize('settingsViewBarIcon', 'Settings icon in the view bar.')); // {{SQL CARBON EDIT}} exporting to use it in getting started tour
|
||||||
const accountsViewBarIcon = registerIcon('accounts-view-bar-icon', Codicon.account, nls.localize('accountsViewBarIcon', 'Accounts icon in the view bar.'));
|
const accountsViewBarIcon = registerIcon('accounts-view-bar-icon', Codicon.account, nls.localize('accountsViewBarIcon', 'Accounts icon in the view bar.'));
|
||||||
|
|
||||||
export class ActivitybarPart extends Part implements IActivityBarService {
|
export class ActivitybarPart extends Part implements IActivityBarService {
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ export class WebUserDataAutoSyncEnablementService extends UserDataAutoSyncEnable
|
|||||||
private enabled: boolean | undefined = undefined;
|
private enabled: boolean | undefined = undefined;
|
||||||
|
|
||||||
isEnabled(): boolean {
|
isEnabled(): boolean {
|
||||||
|
/* {{SQL CARBON EDIT}} Disable unused sync service
|
||||||
if (this.enabled === undefined) {
|
if (this.enabled === undefined) {
|
||||||
this.enabled = this.workbenchEnvironmentService.options?.settingsSyncOptions?.enabled;
|
this.enabled = this.workbenchEnvironmentService.options?.settingsSyncOptions?.enabled;
|
||||||
}
|
}
|
||||||
@@ -19,6 +20,8 @@ export class WebUserDataAutoSyncEnablementService extends UserDataAutoSyncEnable
|
|||||||
this.enabled = super.isEnabled(this.workbenchEnvironmentService.options?.enableSyncByDefault);
|
this.enabled = super.isEnabled(this.workbenchEnvironmentService.options?.enableSyncByDefault);
|
||||||
}
|
}
|
||||||
return this.enabled;
|
return this.enabled;
|
||||||
|
*/
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
setEnablement(enabled: boolean) {
|
setEnablement(enabled: boolean) {
|
||||||
|
|||||||
Reference in New Issue
Block a user