Skip to content

Commit daefb81

Browse files
committed
Remote disable action from viewlet and show it verbose in editor
1 parent 1abad0e commit daefb81

5 files changed

Lines changed: 66 additions & 48 deletions

File tree

src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ export class ExtensionEditor extends BaseEditor {
379379
reloadAction.extension = extension;
380380

381381
this.extensionActionBar.clear();
382-
this.extensionActionBar.push([disabledStatusAction, reloadAction, updateAction, enableAction, disableAction, installAction, maliciousStatusAction], { icon: true, label: true });
382+
this.extensionActionBar.push([reloadAction, updateAction, enableAction, disableAction, installAction, maliciousStatusAction, disabledStatusAction], { icon: true, label: true });
383383
this.transientDisposables.push(enableAction, updateAction, reloadAction, disableAction, installAction, maliciousStatusAction, disabledStatusAction);
384384

385385
const ignoreAction = this.instantiationService.createInstance(IgnoreExtensionRecommendationAction);

src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts

Lines changed: 48 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,7 @@ export class EnableForWorkspaceAction extends Action implements IExtensionAction
572572
private update(): void {
573573
this.enabled = false;
574574
if (this.extension) {
575-
this.enabled = (this.extension.enablementState === EnablementState.Disabled || this.extension.enablementState === EnablementState.WorkspaceDisabled) && this.extension.local && this.extensionEnablementService.canChangeEnablement(this.extension.local);
575+
this.enabled = this.extension.state === ExtensionState.Installed && (this.extension.enablementState === EnablementState.Disabled || this.extension.enablementState === EnablementState.WorkspaceDisabled) && this.extension.local && this.extensionEnablementService.canChangeEnablement(this.extension.local);
576576
}
577577
}
578578

@@ -609,7 +609,7 @@ export class EnableGloballyAction extends Action implements IExtensionAction {
609609
private update(): void {
610610
this.enabled = false;
611611
if (this.extension) {
612-
this.enabled = (this.extension.enablementState === EnablementState.Disabled || this.extension.enablementState === EnablementState.WorkspaceDisabled) && this.extension.local && this.extensionEnablementService.canChangeEnablement(this.extension.local);
612+
this.enabled = this.extension.state === ExtensionState.Installed && this.extension.enablementState === EnablementState.Disabled && this.extension.local && this.extensionEnablementService.canChangeEnablement(this.extension.local);
613613
}
614614
}
615615

@@ -626,32 +626,28 @@ export class EnableGloballyAction extends Action implements IExtensionAction {
626626
export class EnableAction extends Action {
627627

628628
static readonly ID = 'extensions.enable';
629-
private static readonly EnabledClass = 'extension-action prominent enable';
629+
private static readonly EnabledClass = 'extension-action enable';
630+
private static readonly EnabledDropDownClass = 'extension-action dropdown enable';
630631
private static readonly DisabledClass = `${EnableAction.EnabledClass} disabled`;
631632

632633
private disposables: IDisposable[] = [];
633-
634-
private _enableActions: IExtensionAction[];
635-
636634
private _actionItem: DropDownMenuActionItem;
637635
get actionItem(): IActionItem { return this._actionItem; }
638636

639637
private _extension: IExtension;
640638
get extension(): IExtension { return this._extension; }
641639
set extension(extension: IExtension) { this._extension = extension; this.update(); }
642640

643-
644641
constructor(
645642
@IInstantiationService private instantiationService: IInstantiationService,
646643
@IExtensionsWorkbenchService private extensionsWorkbenchService: IExtensionsWorkbenchService
647644
) {
648645
super(EnableAction.ID, localize('enableAction', "Enable"), EnableAction.DisabledClass, false);
649646

650-
this._enableActions = [
647+
this._actionItem = this.instantiationService.createInstance(DropDownMenuActionItem, this, [[
651648
instantiationService.createInstance(EnableGloballyAction, EnableGloballyAction.LABEL),
652649
instantiationService.createInstance(EnableForWorkspaceAction, EnableForWorkspaceAction.LABEL)
653-
];
654-
this._actionItem = this.instantiationService.createInstance(DropDownMenuActionItem, this, [this._enableActions], false);
650+
]], false);
655651
this.disposables.push(this._actionItem);
656652

657653
this.disposables.push(this.extensionsWorkbenchService.onChange(extension => {
@@ -673,18 +669,27 @@ export class EnableAction extends Action {
673669
}
674670
}
675671

676-
if (!this.extension) {
677-
this.enabled = false;
672+
const enabledActions = this._actionItem.getActions().filter(a => a.enabled);
673+
this.enabled = enabledActions.length > 0;
674+
if (this.enabled) {
675+
if (enabledActions.length === 1) {
676+
this.label = enabledActions[0].label;
677+
this.class = EnableAction.EnabledClass;
678+
} else {
679+
this.class = EnableAction.EnabledDropDownClass;
680+
}
681+
} else {
678682
this.class = EnableAction.DisabledClass;
679-
return;
680683
}
681-
682-
this.enabled = this.extension.state === ExtensionState.Installed && this._enableActions.some(e => e.enabled);
683-
this.class = this.enabled ? EnableAction.EnabledClass : EnableAction.DisabledClass;
684684
}
685685

686686
public run(): Promise<any> {
687-
this._actionItem.showMenu();
687+
const enabledActions = this._actionItem.getActions().filter(a => a.enabled);
688+
if (enabledActions.length === 1) {
689+
enabledActions[0].run();
690+
} else {
691+
this._actionItem.showMenu();
692+
}
688693
return Promise.resolve(null);
689694
}
690695

@@ -776,28 +781,27 @@ export class DisableAction extends Action {
776781
static readonly ID = 'extensions.disable';
777782

778783
private static readonly EnabledClass = 'extension-action disable';
784+
private static readonly EnabledDropDownClass = 'extension-action dropdown enable';
779785
private static readonly DisabledClass = `${DisableAction.EnabledClass} disabled`;
780786

781787
private disposables: IDisposable[] = [];
782-
private _disableActions: IExtensionAction[];
783788
private _actionItem: DropDownMenuActionItem;
784789
get actionItem(): IActionItem { return this._actionItem; }
785790

786791
private _extension: IExtension;
787792
get extension(): IExtension { return this._extension; }
788793
set extension(extension: IExtension) { this._extension = extension; this.update(); }
789794

790-
791795
constructor(
792796
@IInstantiationService private instantiationService: IInstantiationService,
793797
@IExtensionsWorkbenchService private extensionsWorkbenchService: IExtensionsWorkbenchService,
794798
) {
795799
super(DisableAction.ID, localize('disableAction', "Disable"), DisableAction.DisabledClass, false);
796-
this._disableActions = [
800+
801+
this._actionItem = this.instantiationService.createInstance(DropDownMenuActionItem, this, [[
797802
instantiationService.createInstance(DisableGloballyAction, DisableGloballyAction.LABEL),
798803
instantiationService.createInstance(DisableForWorkspaceAction, DisableForWorkspaceAction.LABEL)
799-
];
800-
this._actionItem = this.instantiationService.createInstance(DropDownMenuActionItem, this, [this._disableActions], false);
804+
]], false);
801805
this.disposables.push(this._actionItem);
802806

803807
this.disposables.push(this.extensionsWorkbenchService.onChange(extension => {
@@ -819,18 +823,27 @@ export class DisableAction extends Action {
819823
}
820824
}
821825

822-
if (!this.extension) {
823-
this.enabled = false;
826+
const enabledActions = this._actionItem.getActions().filter(a => a.enabled);
827+
this.enabled = enabledActions.length > 0;
828+
if (this.enabled) {
829+
if (enabledActions.length === 1) {
830+
this.label = enabledActions[0].label;
831+
this.class = DisableAction.EnabledClass;
832+
} else {
833+
this.class = DisableAction.EnabledDropDownClass;
834+
}
835+
} else {
824836
this.class = DisableAction.DisabledClass;
825-
return;
826837
}
827-
828-
this.enabled = this.extension.state === ExtensionState.Installed && this._disableActions.some(a => a.enabled);
829-
this.class = this.enabled ? DisableAction.EnabledClass : DisableAction.DisabledClass;
830838
}
831839

832840
public run(): Promise<any> {
833-
this._actionItem.showMenu();
841+
const enabledActions = this._actionItem.getActions().filter(a => a.enabled);
842+
if (enabledActions.length === 1) {
843+
enabledActions[0].run();
844+
} else {
845+
this._actionItem.showMenu();
846+
}
834847
return Promise.resolve(null);
835848
}
836849

@@ -2179,10 +2192,13 @@ export class DisabledStatusLabelAction extends Action {
21792192
.then(runningExtensions => {
21802193
this.class = `${DisabledStatusLabelAction.Class} hide`;
21812194
this.tooltip = '';
2182-
if (this.extension && !this.extension.isMalicious && !runningExtensions.some(e => e.id === this.extension.id)) {
2183-
if (this.extension.enablementState === EnablementState.Disabled || this.extension.enablementState === EnablementState.WorkspaceDisabled) {
2195+
if (this.extension && this.extension.local && !this.extension.isMalicious && !runningExtensions.some(e => e.id === this.extension.id)) {
2196+
if (this.extension.enablementState === EnablementState.Disabled) {
2197+
this.class = `${DisabledStatusLabelAction.Class}`;
2198+
this.label = localize('disabled globally', "Disabled for all Windows.");
2199+
} else if (this.extension.enablementState === EnablementState.WorkspaceDisabled) {
21842200
this.class = `${DisabledStatusLabelAction.Class}`;
2185-
this.tooltip = this.extension.enablementState === EnablementState.Disabled ? localize('disabled globally', "Disabled") : localize('disabled workspace', "Disabled for this Workspace");
2201+
this.label = localize('disabled workspace', "Disabled for this Workspace.");
21862202
}
21872203
}
21882204
}));

src/vs/workbench/parts/extensions/electron-browser/extensionsList.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { IPagedRenderer } from 'vs/base/browser/ui/list/listPaging';
1414
import { once, Emitter, Event } from 'vs/base/common/event';
1515
import { domEvent } from 'vs/base/browser/event';
1616
import { IExtension, IExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/common/extensions';
17-
import { InstallAction, UpdateAction, ManageExtensionAction, ReloadAction, extensionButtonProminentBackground, extensionButtonProminentForeground, MaliciousStatusLabelAction, DisabledStatusLabelAction, ExtensionActionItem } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions';
17+
import { InstallAction, UpdateAction, ManageExtensionAction, ReloadAction, extensionButtonProminentBackground, extensionButtonProminentForeground, MaliciousStatusLabelAction, ExtensionActionItem } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions';
1818
import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
1919
import { Label, RatingsWidget, InstallCountWidget } from 'vs/workbench/parts/extensions/browser/extensionsWidgets';
2020
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
@@ -103,14 +103,13 @@ export class Renderer implements IPagedRenderer<IExtension, ITemplateData> {
103103
const ratingsWidget = this.instantiationService.createInstance(RatingsWidget, ratings, { small: true });
104104

105105
const maliciousStatusAction = this.instantiationService.createInstance(MaliciousStatusLabelAction, false);
106-
const disabledStatusAction = this.instantiationService.createInstance(DisabledStatusLabelAction);
107106
const installAction = this.instantiationService.createInstance(InstallAction);
108107
const updateAction = this.instantiationService.createInstance(UpdateAction);
109108
const reloadAction = this.instantiationService.createInstance(ReloadAction, false);
110109
const manageAction = this.instantiationService.createInstance(ManageExtensionAction);
111110

112-
actionbar.push([updateAction, reloadAction, installAction, disabledStatusAction, maliciousStatusAction, manageAction], actionOptions);
113-
const disposables = [versionWidget, installCountWidget, ratingsWidget, maliciousStatusAction, disabledStatusAction, updateAction, installAction, reloadAction, manageAction, actionbar, bookmarkStyler];
111+
actionbar.push([updateAction, reloadAction, installAction, maliciousStatusAction, manageAction], actionOptions);
112+
const disposables = [versionWidget, installCountWidget, ratingsWidget, maliciousStatusAction, updateAction, installAction, reloadAction, manageAction, actionbar, bookmarkStyler];
114113

115114
return {
116115
root, element, icon, name, installCount, ratings, author, description, disposables, actionbar,
@@ -120,7 +119,6 @@ export class Renderer implements IPagedRenderer<IExtension, ITemplateData> {
120119
installCountWidget.extension = extension;
121120
ratingsWidget.extension = extension;
122121
maliciousStatusAction.extension = extension;
123-
disabledStatusAction.extension = extension;
124122
installAction.extension = extension;
125123
updateAction.extension = extension;
126124
reloadAction.extension = extension;

src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { assign } from 'vs/base/common/objects';
99
import { chain, Emitter } from 'vs/base/common/event';
1010
import { isPromiseCanceledError } from 'vs/base/common/errors';
1111
import { PagedModel, IPagedModel, IPager, DelayedPagedModel } from 'vs/base/common/paging';
12-
import { SortBy, SortOrder, IQueryOptions, LocalExtensionType, IExtensionTipsService, EnablementState, IExtensionRecommendation } from 'vs/platform/extensionManagement/common/extensionManagement';
12+
import { SortBy, SortOrder, IQueryOptions, LocalExtensionType, IExtensionTipsService, IExtensionRecommendation } from 'vs/platform/extensionManagement/common/extensionManagement';
1313
import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
1414
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
1515
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
@@ -286,15 +286,14 @@ export class ExtensionsListView extends ViewletPanel {
286286
if (/@enabled/i.test(value)) {
287287
value = value ? value.replace(/@enabled/g, '').replace(/@sort:(\w+)(-\w*)?/g, '').trim().toLowerCase() : '';
288288

289-
const local = await this.extensionsWorkbenchService.queryLocal();
289+
const local = (await this.extensionsWorkbenchService.queryLocal()).filter(e => e.type === LocalExtensionType.User);
290+
const runningExtensions = await this.extensionService.getExtensions();
290291

291-
let result = local
292+
const result = local
292293
.sort((e1, e2) => e1.displayName.localeCompare(e2.displayName))
293-
.filter(e => e.type === LocalExtensionType.User &&
294-
(e.enablementState === EnablementState.Enabled || e.enablementState === EnablementState.WorkspaceEnabled) &&
295-
(e.name.toLowerCase().indexOf(value) > -1 || e.displayName.toLowerCase().indexOf(value) > -1) &&
296-
(!categories.length || categories.some(category => (e.local.manifest.categories || []).some(c => c.toLowerCase() === category)))
297-
);
294+
.filter(e => runningExtensions.some(r => areSameExtensions(r, e))
295+
&& (e.name.toLowerCase().indexOf(value) > -1 || e.displayName.toLowerCase().indexOf(value) > -1)
296+
&& (!categories.length || categories.some(category => (e.local.manifest.categories || []).some(c => c.toLowerCase() === category))));
298297

299298
return this.getPagedModel(this.sortExtensions(result, options));
300299
}

src/vs/workbench/parts/extensions/electron-browser/media/extensionActions.css

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020

2121
.monaco-action-bar .action-item .action-label.extension-action.multiserver.install:after,
2222
.monaco-action-bar .action-item .action-label.extension-action.multiserver.update:after,
23-
.monaco-action-bar .action-item .action-label.extension-action.enable:after,
24-
.monaco-action-bar .action-item .action-label.extension-action.disable:after {
23+
.monaco-action-bar .action-item .action-label.extension-action.enable.dropdown:after,
24+
.monaco-action-bar .action-item .action-label.extension-action.disable.dropdown:after {
2525
content: '▼';
2626
padding-left: 2px;
2727
font-size: 80%;
@@ -54,6 +54,11 @@
5454
font-weight: normal;
5555
}
5656

57+
.extension-editor>.header>.details>.actions>.monaco-action-bar .action-item .action-label.disable-status:hover,
58+
.extension-editor>.header>.details>.actions>.monaco-action-bar .action-item .action-label.malicious-status:hover {
59+
opacity: 0.9;
60+
}
61+
5762
.extensions-viewlet>.extensions .extension>.details>.footer>.monaco-action-bar .action-item .action-label.extension-action.manage.hide {
5863
display: none;
5964
}

0 commit comments

Comments
 (0)