@@ -23,7 +23,7 @@ import { KeyMod, KeyCode } from 'vs/base/common/keyCodes';
23
23
import { ResolvedKeybinding } from 'vs/base/common/keybindings' ;
24
24
import { ExtensionsInput , IExtensionEditorOptions } from 'vs/workbench/contrib/extensions/common/extensionsInput' ;
25
25
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' ;
27
27
import { IEditorOpenContext } from 'vs/workbench/common/editor' ;
28
28
import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar' ;
29
29
import {
@@ -72,6 +72,7 @@ import { errorIcon, infoIcon, preReleaseIcon, starEmptyIcon, verifiedPublisherIc
72
72
import { MarkdownString } from 'vs/base/common/htmlContent' ;
73
73
import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite' ;
74
74
import { ViewContainerLocation } from 'vs/workbench/common/views' ;
75
+ import { IExtensionGalleryService , IGalleryExtension } from 'vs/platform/extensionManagement/common/extensionManagement' ;
75
76
76
77
class NavBar extends Disposable {
77
78
@@ -164,6 +165,10 @@ const enum WebviewIndex {
164
165
165
166
const CONTEXT_SHOW_PRE_RELEASE_VERSION = new RawContextKey < boolean > ( 'showPreReleaseVersion' , false ) ;
166
167
168
+ interface IExtensionEditorWidget extends IDisposable {
169
+ updateInput ( extension : IExtension , gallery : IGalleryExtension | undefined , preserveFocus ?: boolean ) : void ;
170
+ }
171
+
167
172
export class ExtensionEditor extends EditorPane {
168
173
169
174
static readonly ID : string = 'workbench.editor.extension' ;
@@ -189,12 +194,14 @@ export class ExtensionEditor extends EditorPane {
189
194
private dimension : Dimension | undefined ;
190
195
191
196
private showPreReleaseVersionContextKey : IContextKey < boolean > | undefined ;
197
+ private readonly extensionEditorWidget : IExtensionEditorWidget ;
192
198
193
199
constructor (
194
200
@ITelemetryService telemetryService : ITelemetryService ,
195
201
@IInstantiationService private readonly instantiationService : IInstantiationService ,
196
202
@IPaneCompositePartService private readonly paneCompositeService : IPaneCompositePartService ,
197
203
@IExtensionsWorkbenchService private readonly extensionsWorkbenchService : IExtensionsWorkbenchService ,
204
+ @IExtensionGalleryService private readonly extensionGalleryService : IExtensionGalleryService ,
198
205
@IThemeService themeService : IThemeService ,
199
206
@IKeybindingService private readonly keybindingService : IKeybindingService ,
200
207
@INotificationService private readonly notificationService : INotificationService ,
@@ -213,6 +220,29 @@ export class ExtensionEditor extends EditorPane {
213
220
this . extensionReadme = null ;
214
221
this . extensionChangelog = null ;
215
222
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
+ } ( ) ) ;
216
246
}
217
247
218
248
override get scopedContextKeyService ( ) : IContextKeyService | undefined {
@@ -242,6 +272,7 @@ export class ExtensionEditor extends EditorPane {
242
272
preview . textContent = localize ( 'preview' , "Preview" ) ;
243
273
244
274
const preRelease = append ( title , $ ( 'span.pre-release' ) ) ;
275
+ preRelease . textContent = localize ( 'preRelease' , "Pre-Release" ) ;
245
276
const builtin = append ( title , $ ( 'span.builtin' ) ) ;
246
277
builtin . textContent = localize ( 'builtin' , "Built-in" ) ;
247
278
@@ -329,17 +360,34 @@ export class ExtensionEditor extends EditorPane {
329
360
await super . setInput ( input , options , context , token ) ;
330
361
this . updatePreReleaseVersionContext ( ) ;
331
362
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 ) ;
333
365
}
334
366
}
335
367
336
368
override setOptions ( options : IExtensionEditorOptions | undefined ) : void {
337
369
const currentOptions : IExtensionEditorOptions | undefined = this . options ;
338
370
super . setOptions ( options ) ;
339
371
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 ;
342
389
}
390
+ return ( await this . extensionGalleryService . query ( { includePreRelease : preRelease , names : [ extension . identifier . id ] } , CancellationToken . None ) ) . firstPage [ 0 ] ;
343
391
}
344
392
345
393
private updatePreReleaseVersionContext ( ) : void {
@@ -363,7 +411,7 @@ export class ExtensionEditor extends EditorPane {
363
411
}
364
412
}
365
413
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 > {
367
415
this . activeElement = null ;
368
416
this . editorLoadComplete = false ;
369
417
@@ -383,8 +431,9 @@ export class ExtensionEditor extends EditorPane {
383
431
template . icon . src = extension . iconUrl ;
384
432
385
433
template . name . textContent = extension . displayName ;
386
- template . version . textContent = `v${ extension . version } ` ;
434
+ template . version . textContent = `v${ gallery ? gallery . version : extension . version } ` ;
387
435
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' ;
388
437
template . builtin . style . display = extension . isBuiltin ? 'inherit' : 'none' ;
389
438
390
439
template . description . textContent = extension . description ;
@@ -429,7 +478,6 @@ export class ExtensionEditor extends EditorPane {
429
478
}
430
479
431
480
const widgets = [
432
- this . instantiationService . createInstance ( PreReleaseIndicatorWidget , template . preRelease , { label : true , icon : false , enableOnlyForInstalled : false } ) ,
433
481
remoteBadge ,
434
482
this . instantiationService . createInstance ( InstallCountWidget , template . installCount , false ) ,
435
483
this . instantiationService . createInstance ( RatingsWidget , template . rating , false )
0 commit comments