Skip to content

Commit 112ca12

Browse files
committed
1 parent 40cb966 commit 112ca12

File tree

5 files changed

+62
-20
lines changed

5 files changed

+62
-20
lines changed

src/vs/workbench/contrib/extensions/browser/extensionEditor.ts

Lines changed: 55 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { KeyMod, KeyCode } from 'vs/base/common/keyCodes';
2323
import { ResolvedKeybinding } from 'vs/base/common/keybindings';
2424
import { ExtensionsInput, IExtensionEditorOptions } from 'vs/workbench/contrib/extensions/common/extensionsInput';
2525
import { IExtensionsWorkbenchService, IExtensionsViewPaneContainer, VIEWLET_ID, IExtension, ExtensionContainers, ExtensionEditorTab, ExtensionState } from 'vs/workbench/contrib/extensions/common/extensions';
26-
import { RatingsWidget, InstallCountWidget, RemoteBadgeWidget, PreReleaseIndicatorWidget, ExtensionHoverWidget } from 'vs/workbench/contrib/extensions/browser/extensionsWidgets';
26+
import { RatingsWidget, InstallCountWidget, RemoteBadgeWidget, ExtensionHoverWidget } from 'vs/workbench/contrib/extensions/browser/extensionsWidgets';
2727
import { IEditorOpenContext } from 'vs/workbench/common/editor';
2828
import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar';
2929
import {
@@ -72,6 +72,7 @@ import { errorIcon, infoIcon, preReleaseIcon, starEmptyIcon, verifiedPublisherIc
7272
import { MarkdownString } from 'vs/base/common/htmlContent';
7373
import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite';
7474
import { ViewContainerLocation } from 'vs/workbench/common/views';
75+
import { IExtensionGalleryService, IGalleryExtension } from 'vs/platform/extensionManagement/common/extensionManagement';
7576

7677
class NavBar extends Disposable {
7778

@@ -164,6 +165,10 @@ const enum WebviewIndex {
164165

165166
const CONTEXT_SHOW_PRE_RELEASE_VERSION = new RawContextKey<boolean>('showPreReleaseVersion', false);
166167

168+
interface IExtensionEditorWidget extends IDisposable {
169+
updateInput(extension: IExtension, gallery: IGalleryExtension | undefined, preserveFocus?: boolean): void;
170+
}
171+
167172
export class ExtensionEditor extends EditorPane {
168173

169174
static readonly ID: string = 'workbench.editor.extension';
@@ -189,12 +194,14 @@ export class ExtensionEditor extends EditorPane {
189194
private dimension: Dimension | undefined;
190195

191196
private showPreReleaseVersionContextKey: IContextKey<boolean> | undefined;
197+
private readonly extensionEditorWidget: IExtensionEditorWidget;
192198

193199
constructor(
194200
@ITelemetryService telemetryService: ITelemetryService,
195201
@IInstantiationService private readonly instantiationService: IInstantiationService,
196202
@IPaneCompositePartService private readonly paneCompositeService: IPaneCompositePartService,
197203
@IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService,
204+
@IExtensionGalleryService private readonly extensionGalleryService: IExtensionGalleryService,
198205
@IThemeService themeService: IThemeService,
199206
@IKeybindingService private readonly keybindingService: IKeybindingService,
200207
@INotificationService private readonly notificationService: INotificationService,
@@ -213,6 +220,29 @@ export class ExtensionEditor extends EditorPane {
213220
this.extensionReadme = null;
214221
this.extensionChangelog = null;
215222
this.extensionManifest = null;
223+
const that = this;
224+
this.extensionEditorWidget = this._register(new class extends Disposable implements IExtensionEditorWidget {
225+
private gallery: IGalleryExtension | undefined = undefined;
226+
private extension: IExtension | undefined = undefined;
227+
constructor() {
228+
super();
229+
this._register(that.extensionsWorkbenchService.onChange(e => {
230+
if (e && this.extension
231+
&& areSameExtensions(this.extension.identifier, e?.identifier)
232+
&& (!this.extension.server || this.extension.server === e.server)
233+
&& this.extension.latestVersion !== e.latestVersion) {
234+
this.updateInput(e, this.gallery);
235+
}
236+
}));
237+
}
238+
updateInput(extension: IExtension, gallery: IGalleryExtension | undefined, preserveFocus?: boolean): void {
239+
this.extension = extension;
240+
this.gallery = gallery;
241+
if (that.template) {
242+
that.updateTemplate(this.extension, this.gallery, that.template, !!preserveFocus);
243+
}
244+
}
245+
}());
216246
}
217247

218248
override get scopedContextKeyService(): IContextKeyService | undefined {
@@ -242,6 +272,7 @@ export class ExtensionEditor extends EditorPane {
242272
preview.textContent = localize('preview', "Preview");
243273

244274
const preRelease = append(title, $('span.pre-release'));
275+
preRelease.textContent = localize('preRelease', "Pre-Release");
245276
const builtin = append(title, $('span.builtin'));
246277
builtin.textContent = localize('builtin', "Built-in");
247278

@@ -329,17 +360,34 @@ export class ExtensionEditor extends EditorPane {
329360
await super.setInput(input, options, context, token);
330361
this.updatePreReleaseVersionContext();
331362
if (this.template) {
332-
await this.updateTemplate(input.extension, this.template, !!options?.preserveFocus);
363+
const gallery = await this.getGallery(input.extension, options?.showPreReleaseVersion);
364+
this.extensionEditorWidget.updateInput(input.extension, gallery, options?.preserveFocus);
333365
}
334366
}
335367

336368
override setOptions(options: IExtensionEditorOptions | undefined): void {
337369
const currentOptions: IExtensionEditorOptions | undefined = this.options;
338370
super.setOptions(options);
339371
this.updatePreReleaseVersionContext();
340-
if (currentOptions?.showPreReleaseVersion !== options?.showPreReleaseVersion) {
341-
this.openTab(ExtensionEditorTab.Readme);
372+
if (this.input && currentOptions?.showPreReleaseVersion !== options?.showPreReleaseVersion) {
373+
this.getGallery((<ExtensionsInput>this.input).extension, !!options?.showPreReleaseVersion).then(gallery => this.extensionEditorWidget.updateInput((<ExtensionsInput>this.input).extension, gallery));
374+
}
375+
}
376+
377+
private async getGallery(extension: IExtension, preRelease?: boolean): Promise<IGalleryExtension | undefined> {
378+
if (isUndefined(preRelease)) {
379+
return undefined;
380+
}
381+
if (preRelease === extension.gallery?.properties.isPreReleaseVersion) {
382+
return undefined;
383+
}
384+
if (preRelease && !extension.hasPreReleaseVersion) {
385+
return undefined;
386+
}
387+
if (!preRelease && !extension.hasReleaseVersion) {
388+
return undefined;
342389
}
390+
return (await this.extensionGalleryService.query({ includePreRelease: preRelease, names: [extension.identifier.id] }, CancellationToken.None)).firstPage[0];
343391
}
344392

345393
private updatePreReleaseVersionContext(): void {
@@ -363,7 +411,7 @@ export class ExtensionEditor extends EditorPane {
363411
}
364412
}
365413

366-
private async updateTemplate(extension: IExtension, template: IExtensionEditorTemplate, preserveFocus: boolean): Promise<void> {
414+
private async updateTemplate(extension: IExtension, gallery: IGalleryExtension | undefined, template: IExtensionEditorTemplate, preserveFocus: boolean): Promise<void> {
367415
this.activeElement = null;
368416
this.editorLoadComplete = false;
369417

@@ -383,8 +431,9 @@ export class ExtensionEditor extends EditorPane {
383431
template.icon.src = extension.iconUrl;
384432

385433
template.name.textContent = extension.displayName;
386-
template.version.textContent = `v${extension.version}`;
434+
template.version.textContent = `v${gallery ? gallery.version : extension.version}`;
387435
template.preview.style.display = extension.preview ? 'inherit' : 'none';
436+
template.preRelease.style.display = (gallery ? gallery.properties.isPreReleaseVersion : (extension.local?.isPreReleaseVersion || extension.gallery?.properties.isPreReleaseVersion)) ? 'inherit' : 'none';
388437
template.builtin.style.display = extension.isBuiltin ? 'inherit' : 'none';
389438

390439
template.description.textContent = extension.description;
@@ -429,7 +478,6 @@ export class ExtensionEditor extends EditorPane {
429478
}
430479

431480
const widgets = [
432-
this.instantiationService.createInstance(PreReleaseIndicatorWidget, template.preRelease, { label: true, icon: false, enableOnlyForInstalled: false }),
433481
remoteBadge,
434482
this.instantiationService.createInstance(InstallCountWidget, template.installCount, false),
435483
this.instantiationService.createInstance(RatingsWidget, template.rating, false)

src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,6 +1208,7 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi
12081208
const extensionWorkbenchService = accessor.get(IExtensionsWorkbenchService);
12091209
const extension = extensionWorkbenchService.local.find(e => areSameExtensions(e.identifier, { id }));
12101210
if (extension) {
1211+
extensionWorkbenchService.open(extension, { showPreReleaseVersion: true });
12111212
await extensionWorkbenchService.install(extension, { installPreReleaseVersion: true });
12121213
}
12131214
}
@@ -1225,6 +1226,7 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi
12251226
const extensionWorkbenchService = accessor.get(IExtensionsWorkbenchService);
12261227
const extension = extensionWorkbenchService.local.find(e => areSameExtensions(e.identifier, { id }));
12271228
if (extension) {
1229+
extensionWorkbenchService.open(extension, { showPreReleaseVersion: false });
12281230
await extensionWorkbenchService.install(extension, { installPreReleaseVersion: false });
12291231
}
12301232
}

src/vs/workbench/contrib/extensions/browser/extensionsList.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ export class Renderer implements IPagedRenderer<IExtension, ITemplateData> {
138138
extensionPackBadgeWidget,
139139
headerRemoteBadgeWidget,
140140
extensionHoverWidget,
141-
this.instantiationService.createInstance(PreReleaseIndicatorWidget, preRelease, { icon: true, label: false, enableOnlyForInstalled: true }),
141+
this.instantiationService.createInstance(PreReleaseIndicatorWidget, preRelease),
142142
this.instantiationService.createInstance(SyncIgnoredWidget, syncIgnore),
143143
this.instantiationService.createInstance(ExtensionActivationStatusWidget, activationStatus, true),
144144
this.instantiationService.createInstance(InstallCountWidget, installCount, true),

src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,6 @@ export class PreReleaseIndicatorWidget extends ExtensionWidget {
162162

163163
constructor(
164164
private readonly container: HTMLElement,
165-
private readonly options: { label: boolean, icon: boolean, enableOnlyForInstalled: boolean },
166165
) {
167166
super();
168167
container.classList.add('extension-pre-release');
@@ -180,16 +179,11 @@ export class PreReleaseIndicatorWidget extends ExtensionWidget {
180179
return;
181180
}
182181

183-
if (this.options.enableOnlyForInstalled && this.extension.state !== ExtensionState.Installed) {
182+
if (this.extension.state !== ExtensionState.Installed) {
184183
return;
185184
}
186185

187-
if (this.options?.icon) {
188-
append(this.container, $('span' + ThemeIcon.asCSSSelector(preReleaseIcon)));
189-
}
190-
if (this.options?.label) {
191-
append(this.container, $('span.pre-releaselabel', undefined, localize('pre-release-label', "Pre-Release")));
192-
}
186+
append(this.container, $('span' + ThemeIcon.asCSSSelector(preReleaseIcon)));
193187
}
194188
}
195189

@@ -593,8 +587,7 @@ export class ExtensionHoverWidget extends ExtensionWidget {
593587
if (extension.local?.isPreReleaseVersion || extension.gallery?.properties.isPreReleaseVersion) {
594588
return undefined;
595589
}
596-
const preReleaseVersionLink = `[${localize('Show prerelease version', "Pre-Release version")}](${URI.parse(`command:workbench.extensions.action.showPreReleaseVersion?${encodeURIComponent(JSON.stringify([extension.identifier.id]))}`)})`;
597-
return localize('has prerelease', "This extension has a {0} available", preReleaseVersionLink);
590+
return localize('has prerelease', "This extension has a Pre-Release version available");
598591
}
599592

600593
}

src/vs/workbench/contrib/extensions/browser/media/extensionEditor.css

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,7 @@
8888
margin-left: 10px;
8989
}
9090

91-
.extension-editor > .header > .details > .title > .pre-release:not(:empty) {
92-
display: flex;
91+
.extension-editor > .header > .details > .title > .pre-release {
9392
font-size: 10px;
9493
margin-left: 10px;
9594
padding: 0px 4px;

0 commit comments

Comments
 (0)