/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as azdata from 'azdata'; import * as vscode from 'vscode'; import * as constants from '../../common/constants'; import { ApiWrapper } from '../../common/apiWrapper'; import * as mssql from '../../../../mssql/src/mssql'; import * as path from 'path'; export interface LanguageUpdateModel { language: mssql.ExternalLanguage, content: mssql.ExternalLanguageContent, newLang: boolean } export interface FileBrowseEventArgs { filePath: string, target: string } export abstract class LanguageViewBase { protected _dialog: azdata.window.Dialog | undefined; public connection: azdata.connection.ConnectionProfile | undefined; public connectionUrl: string = ''; // Events // protected _onEdit: vscode.EventEmitter = new vscode.EventEmitter(); public readonly onEdit: vscode.Event = this._onEdit.event; protected _onUpdate: vscode.EventEmitter = new vscode.EventEmitter(); public readonly onUpdate: vscode.Event = this._onUpdate.event; protected _onDelete: vscode.EventEmitter = new vscode.EventEmitter(); public readonly onDelete: vscode.Event = this._onDelete.event; protected _fileBrowser: vscode.EventEmitter = new vscode.EventEmitter(); public readonly fileBrowser: vscode.Event = this._fileBrowser.event; protected _filePathSelected: vscode.EventEmitter = new vscode.EventEmitter(); public readonly filePathSelected: vscode.Event = this._filePathSelected.event; protected _onUpdated: vscode.EventEmitter = new vscode.EventEmitter(); public readonly onUpdated: vscode.Event = this._onUpdated.event; protected _onList: vscode.EventEmitter = new vscode.EventEmitter(); public readonly onList: vscode.Event = this._onList.event; protected _onListLoaded: vscode.EventEmitter = new vscode.EventEmitter(); public readonly onListLoaded: vscode.Event = this._onListLoaded.event; protected _onFailed: vscode.EventEmitter = new vscode.EventEmitter(); public readonly onFailed: vscode.Event = this._onFailed.event; public componentMaxLength = 350; public browseButtonMaxLength = 20; public spaceBetweenComponentsLength = 10; constructor(protected _apiWrapper: ApiWrapper, protected _root?: string, protected _parent?: LanguageViewBase, ) { if (this._parent) { if (!this._root) { this._root = this._parent.root; } this.connection = this._parent.connection; this.connectionUrl = this._parent.connectionUrl; } this.registerEvents(); } private registerEvents() { if (this._parent) { this._dialog = this._parent.dialog; this.fileBrowser(url => { this._parent?.onOpenFileBrowser(url); }); this.onUpdate(model => { this._parent?.onUpdateLanguage(model); }); this.onEdit(model => { this._parent?.onEditLanguage(model); }); this.onDelete(model => { this._parent?.onDeleteLanguage(model); }); this.onList(() => { this._parent?.onListLanguages(); }); this._parent.filePathSelected(x => { this.onFilePathSelected(x); }); this._parent.onUpdated(x => { this.onUpdatedLanguage(x); }); this._parent.onFailed(x => { this.onActionFailed(x); }); this._parent.onListLoaded(x => { this.onListLanguageLoaded(x); }); } } public async getLocationTitle(): Promise { let connection = await this.getCurrentConnection(); if (connection) { return `${connection.serverName} ${connection.databaseName ? connection.databaseName : constants.extLangLocal}`; } return constants.packageManagerNoConnection; } public getServerTitle(): string { if (this.connection) { return this.connection.serverName; } return constants.packageManagerNoConnection; } private async getCurrentConnectionUrl(): Promise { let connection = await this.getCurrentConnection(); if (connection) { return await this._apiWrapper.getUriForConnection(connection.connectionId); } return ''; } private async getCurrentConnection(): Promise { return await this._apiWrapper.getCurrentConnection(); } public async loadConnection(): Promise { this.connection = await this.getCurrentConnection(); this.connectionUrl = await this.getCurrentConnectionUrl(); } public updateLanguage(updateModel: LanguageUpdateModel): Promise { return new Promise((resolve, reject) => { this.onUpdateLanguage(updateModel); this.onUpdated(() => { resolve(); }); this.onFailed(err => { reject(err); }); }); } public deleteLanguage(model: LanguageUpdateModel): Promise { return new Promise((resolve, reject) => { this.onDeleteLanguage(model); this.onUpdated(() => { resolve(); }); this.onFailed(err => { reject(err); }); }); } public listLanguages(): Promise { return new Promise((resolve, reject) => { this.onListLanguages(); this.onListLoaded(list => { resolve(list); }); this.onFailed(err => { reject(err); }); }); } /** * Dialog model instance */ public get dialog(): azdata.window.Dialog | undefined { return this._dialog; } public set dialog(value: azdata.window.Dialog | undefined) { this._dialog = value; } public showInfoMessage(message: string): void { this.showMessage(message, azdata.window.MessageLevel.Information); } public showErrorMessage(message: string, error?: any): void { this.showMessage(`${message} ${constants.getErrorMessage(error)}`, azdata.window.MessageLevel.Error); } public onUpdateLanguage(model: LanguageUpdateModel): void { this._onUpdate.fire(model); } public onUpdatedLanguage(model: LanguageUpdateModel): void { this._onUpdated.fire(model); } public onActionFailed(error: any): void { this._onFailed.fire(error); } public onListLanguageLoaded(list: mssql.ExternalLanguage[]): void { this._onListLoaded.fire(list); } public onEditLanguage(model: LanguageUpdateModel): void { this._onEdit.fire(model); } public onDeleteLanguage(model: LanguageUpdateModel): void { this._onDelete.fire(model); } public onListLanguages(): void { this._onList.fire(); } public onOpenFileBrowser(fileBrowseArgs: FileBrowseEventArgs): void { this._fileBrowser.fire(fileBrowseArgs); } public onFilePathSelected(fileBrowseArgs: FileBrowseEventArgs): void { this._filePathSelected.fire(fileBrowseArgs); } private showMessage(message: string, level: azdata.window.MessageLevel): void { if (this._dialog) { this._dialog.message = { text: message, level: level }; } } public get root(): string { return this._root || ''; } public asAbsolutePath(filePath: string): string { return path.join(this._root || '', filePath); } public abstract reset(): Promise; public createNewContent(): mssql.ExternalLanguageContent { return { extensionFileName: '', isLocalFile: true, pathToExtension: '', }; } public createNewLanguage(): mssql.ExternalLanguage { return { name: '', contents: [] }; } }