mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-25 17:23:10 -05:00
* add more folders to strictire compile, add more strict compile options * update ci * wip * add more layering and fix issues * add more strictness * remove unnecessary assertion * add missing checks * fix indentation * remove jsdoc
81 lines
2.6 KiB
TypeScript
81 lines
2.6 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
import { IInsight } from './interfaces';
|
|
import { INotificationService } from 'vs/platform/notification/common/notification';
|
|
import { $ } from 'vs/base/browser/dom';
|
|
import { mixin } from 'vs/base/common/objects';
|
|
import { IInsightOptions, InsightType } from 'sql/workbench/contrib/charts/common/interfaces';
|
|
import * as nls from 'vs/nls';
|
|
import { startsWith } from 'vs/base/common/strings';
|
|
import { IInsightData } from 'sql/platform/dashboard/browser/insightRegistry';
|
|
|
|
export interface IConfig extends IInsightOptions {
|
|
encoding?: string;
|
|
imageFormat?: string;
|
|
}
|
|
|
|
const defaultConfig: IConfig = {
|
|
type: InsightType.Image,
|
|
encoding: 'hex',
|
|
imageFormat: 'jpeg'
|
|
};
|
|
|
|
export class ImageInsight implements IInsight {
|
|
|
|
public static readonly types = [InsightType.Image];
|
|
public readonly types = ImageInsight.types;
|
|
|
|
private _options: IConfig;
|
|
|
|
private imageEle: HTMLImageElement;
|
|
|
|
constructor(container: HTMLElement, options: IConfig, @INotificationService private _notificationService: INotificationService) {
|
|
this._options = mixin(options, defaultConfig, false);
|
|
this.imageEle = $('img');
|
|
container.appendChild(this.imageEle);
|
|
}
|
|
|
|
public layout() {
|
|
|
|
}
|
|
|
|
public dispose() {
|
|
|
|
}
|
|
|
|
set options(config: IConfig) {
|
|
this._options = mixin(config, defaultConfig, false);
|
|
}
|
|
|
|
get options(): IConfig {
|
|
return this._options;
|
|
}
|
|
|
|
set data(data: IInsightData) {
|
|
const that = this;
|
|
if (data.rows && data.rows.length > 0 && data.rows[0].length > 0) {
|
|
let img = data.rows[0][0];
|
|
if (this._options.encoding === 'hex') {
|
|
img = ImageInsight._hexToBase64(img);
|
|
}
|
|
this.imageEle.onerror = function () {
|
|
this.src = require.toUrl(`./media/images/invalidImage.png`);
|
|
that._notificationService.error(nls.localize('invalidImage', "Table does not contain a valid image"));
|
|
};
|
|
this.imageEle.src = `data:image/${this._options.imageFormat};base64,${img}`;
|
|
}
|
|
}
|
|
|
|
private static _hexToBase64(hexVal: string) {
|
|
|
|
if (startsWith(hexVal, '0x')) {
|
|
hexVal = hexVal.slice(2);
|
|
}
|
|
// should be able to be replaced with new Buffer(hexVal, 'hex').toString('base64')
|
|
return btoa(String.fromCharCode.apply(null, hexVal.replace(/\r|\n/g, '').replace(/([\da-fA-F]{2}) ?/g, '0x$1 ').replace(/ +$/, '').split(' ').map(v => Number(v))));
|
|
}
|
|
}
|