extensionsList.ts 5.8 KB
Newer Older
J
Joao Moreno 已提交
1 2 3 4 5 6 7
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

'use strict';

8
import { append, $, addClass, removeClass } from 'vs/base/browser/dom';
J
Joao Moreno 已提交
9 10
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar';
J
Joao Moreno 已提交
11
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
12
import { IMessageService, Severity } from 'vs/platform/message/common/message';
J
Joao Moreno 已提交
13 14
import { IDelegate } from 'vs/base/browser/ui/list/list';
import { IPagedRenderer } from 'vs/base/browser/ui/list/listPaging';
15 16
import { once } from 'vs/base/common/event';
import { domEvent } from 'vs/base/browser/event';
17
import { IExtension } from './extensions';
18
import { CombinedInstallAction, UpdateAction, EnableAction, DisableAction, BuiltinStatusLabelAction } from './extensionsActions';
19
import { Label, RatingsWidget, InstallWidget, StatusWidget } from './extensionsWidgets';
20
import { EventType } from 'vs/base/common/events';
J
Joao Moreno 已提交
21 22 23

export interface ITemplateData {
	element: HTMLElement;
24
	icon: HTMLImageElement;
J
Joao Moreno 已提交
25
	name: HTMLElement;
26 27
	installCount: HTMLElement;
	ratings: HTMLElement;
28
	status: HTMLElement;
J
Joao Moreno 已提交
29 30
	author: HTMLElement;
	description: HTMLElement;
J
Joao Moreno 已提交
31
	extension: IExtension;
J
Joao Moreno 已提交
32
	disposables: IDisposable[];
33
	extensionDisposables: IDisposable[];
J
Joao Moreno 已提交
34 35
}

J
Joao Moreno 已提交
36
export class Delegate implements IDelegate<IExtension> {
J
Joao Moreno 已提交
37
	getHeight() { return 62; }
J
Joao Moreno 已提交
38 39 40
	getTemplateId() { return 'extension'; }
}

J
Joao Moreno 已提交
41
const actionOptions = { icon: true, label: true };
J
Joao Moreno 已提交
42

J
Joao Moreno 已提交
43
export class Renderer implements IPagedRenderer<IExtension, ITemplateData> {
J
Joao Moreno 已提交
44

45 46 47
	constructor(
		@IInstantiationService private instantiationService: IInstantiationService,
		@IMessageService private messageService: IMessageService
J
Johannes Rieken 已提交
48
	) { }
J
Joao Moreno 已提交
49 50 51 52

	get templateId() { return 'extension'; }

	renderTemplate(root: HTMLElement): ITemplateData {
J
Joao Moreno 已提交
53
		const element = append(root, $('.extension'));
54
		const icon = append(element, $<HTMLImageElement>('img.icon'));
J
Joao Moreno 已提交
55 56
		const details = append(element, $('.details'));
		const header = append(details, $('.header'));
57
		const name = append(header, $('span.name'));
J
Joao Moreno 已提交
58
		const version = append(header, $('span.version'));
59
		const installCount = append(header, $('span.install-count'));
J
Joao Moreno 已提交
60
		const ratings = append(header, $('span.ratings'));
61
		const status = append(header, $(''));
J
Joao Moreno 已提交
62
		const description = append(details, $('.description.ellipsis'));
J
Joao Moreno 已提交
63
		const footer = append(details, $('.footer'));
64
		const author = append(footer, $('.author.ellipsis'));
J
Joao Moreno 已提交
65
		const actionbar = new ActionBar(footer, { animated: false });
J
Joao Moreno 已提交
66

67 68
		actionbar.addListener2(EventType.RUN, ({ error }) => error && this.messageService.show(Severity.Error, error));

J
Joao Moreno 已提交
69 70 71
		const versionWidget = this.instantiationService.createInstance(Label, version, e => e.version);
		const installCountWidget = this.instantiationService.createInstance(InstallWidget, installCount, { small: true });
		const ratingsWidget = this.instantiationService.createInstance(RatingsWidget, ratings, { small: true });
72
		const statusWidget = this.instantiationService.createInstance(StatusWidget, status, null);
J
Joao Moreno 已提交
73

J
Joao Moreno 已提交
74
		const builtinStatusAction = this.instantiationService.createInstance(BuiltinStatusLabelAction);
J
Joao Moreno 已提交
75 76 77
		const installAction = this.instantiationService.createInstance(CombinedInstallAction);
		const updateAction = this.instantiationService.createInstance(UpdateAction);
		const restartAction = this.instantiationService.createInstance(EnableAction);
78
		const disableAction = this.instantiationService.createInstance(DisableAction);
J
Joao Moreno 已提交
79

80 81
		actionbar.push([restartAction, updateAction, disableAction, installAction, builtinStatusAction], actionOptions);
		const disposables = [versionWidget, installCountWidget, ratingsWidget, installAction, builtinStatusAction, updateAction, restartAction, disableAction, actionbar];
J
Joao Moreno 已提交
82

J
Joao Moreno 已提交
83
		return {
84
			element, icon, name, installCount, ratings, status, author, description, disposables,
85
			extensionDisposables: [],
J
Joao Moreno 已提交
86 87 88 89
			set extension(extension: IExtension) {
				versionWidget.extension = extension;
				installCountWidget.extension = extension;
				ratingsWidget.extension = extension;
J
Joao Moreno 已提交
90
				builtinStatusAction.extension = extension;
J
Joao Moreno 已提交
91 92 93
				installAction.extension = extension;
				updateAction.extension = extension;
				restartAction.extension = extension;
94
				disableAction.extension = extension;
95
				statusWidget.extension = extension;
J
Joao Moreno 已提交
96
			}
J
Joao Moreno 已提交
97
		};
J
Joao Moreno 已提交
98 99 100 101
	}

	renderPlaceholder(index: number, data: ITemplateData): void {
		addClass(data.element, 'loading');
102 103

		data.extensionDisposables = dispose(data.extensionDisposables);
104
		data.icon.src = '';
J
Joao Moreno 已提交
105 106 107
		data.name.textContent = '';
		data.author.textContent = '';
		data.description.textContent = '';
J
Joao Moreno 已提交
108 109 110
		data.installCount.style.display = 'none';
		data.ratings.style.display = 'none';
		data.extension = null;
J
Joao Moreno 已提交
111 112
	}

J
Joao Moreno 已提交
113
	renderElement(extension: IExtension, index: number, data: ITemplateData): void {
J
Joao Moreno 已提交
114
		removeClass(data.element, 'loading');
115 116 117 118 119

		data.extensionDisposables = dispose(data.extensionDisposables);

		const onError = once(domEvent(data.icon, 'error'));
		onError(() => data.icon.src = extension.iconUrlFallback, null, data.extensionDisposables);
120 121 122 123 124 125 126 127 128
		data.icon.src = extension.iconUrl;

		if (!data.icon.complete) {
			data.icon.style.visibility = 'hidden';
			data.icon.onload = () => data.icon.style.visibility = 'inherit';
		} else {
			data.icon.style.visibility = 'inherit';
		}

J
Joao Moreno 已提交
129 130
		data.name.textContent = extension.displayName;
		data.author.textContent = extension.publisherDisplayName;
J
Joao Moreno 已提交
131
		data.description.textContent = extension.description;
J
Joao Moreno 已提交
132 133
		data.installCount.style.display = '';
		data.ratings.style.display = '';
J
Joao Moreno 已提交
134
		data.extension = extension;
J
Joao Moreno 已提交
135 136 137
	}

	disposeTemplate(data: ITemplateData): void {
J
Joao Moreno 已提交
138
		data.disposables = dispose(data.disposables);
J
Joao Moreno 已提交
139 140
	}
}