diff --git a/packages/zowe-explorer-api/src/tree/IZoweTree.ts b/packages/zowe-explorer-api/src/tree/IZoweTree.ts index 9b5799d9e9..55ec8d8b0a 100644 --- a/packages/zowe-explorer-api/src/tree/IZoweTree.ts +++ b/packages/zowe-explorer-api/src/tree/IZoweTree.ts @@ -206,8 +206,9 @@ export interface IZoweTree extends vscode.TreeDataProvider { /** * Deletes a root node from the tree. * @param node: A root node representing a session + * @param hideFromAllTrees: whether to hide from all trees or just the single tree */ - deleteSession(node: IZoweTreeNode); + deleteSession(node: IZoweTreeNode, hideFromAllTrees?: boolean); /** * Lets the user open a dataset by filtering the currently-loaded list */ @@ -268,6 +269,11 @@ export interface IZoweTree extends vscode.TreeDataProvider { * @param {string} name the member to remove */ removeFileHistory?(name: string); + /** + * Removes session from the session array + * @param {string} name the sessions to remove + */ + removeSession?(name: string): void; /** * Returns a new dataset filter string, from an old filter and a new string * diff --git a/packages/zowe-explorer/__mocks__/mockCreators/shared.ts b/packages/zowe-explorer/__mocks__/mockCreators/shared.ts index 07d17faaf5..9a3ffa5a90 100644 --- a/packages/zowe-explorer/__mocks__/mockCreators/shared.ts +++ b/packages/zowe-explorer/__mocks__/mockCreators/shared.ts @@ -13,7 +13,7 @@ import { ZoweTreeProvider } from "../../src/abstract/ZoweTreeProvider"; import { ZoweDatasetNode } from "../../src/dataset/ZoweDatasetNode"; import { ZoweUSSNode } from "../../src/uss/ZoweUSSNode"; import * as vscode from "vscode"; -import { ValidProfileEnum } from "@zowe/zowe-explorer-api"; +import { ValidProfileEnum, IZoweTreeNode } from "@zowe/zowe-explorer-api"; import { FilterDescriptor } from "../../src/utils/ProfilesUtils"; import { imperative, ZosmfSession } from "@zowe/cli"; import { SettingsConfig } from "../../src/utils/SettingsConfig"; @@ -548,3 +548,42 @@ export function createOutputChannel() { replace: jest.fn(), } as vscode.OutputChannel; } + +export function createMockNode(name: string): IZoweTreeNode { + return { + dirty: false, + getLabel: jest.fn(() => name), + getChildren: jest.fn(), + getParent: jest.fn(), + getProfile: jest.fn(), + getProfileName: jest.fn(), + getSession: jest.fn(), + getSessionNode: jest.fn(), + setProfileToChoice: jest.fn(), + setSessionToChoice: jest.fn(), + label: name, + }; +} + +export function createTreeProviders() { + return { + ds: { + mSessionNodes: [createMockNode("zosmf"), createMockNode("zosmf2")], + deleteSession: jest.fn(), + removeSession: jest.fn(), + refresh: jest.fn(), + } as any, + uss: { + mSessionNodes: [createMockNode("zosmf"), createMockNode("zosmf2")], + deleteSession: jest.fn(), + removeSession: jest.fn(), + refresh: jest.fn(), + } as any, + job: { + mSessionNodes: [createMockNode("zosmf"), createMockNode("zosmf2")], + removeSession: jest.fn(), + deleteSession: jest.fn(), + refresh: jest.fn(), + } as any, + }; +} diff --git a/packages/zowe-explorer/__tests__/__unit__/dataset/DatasetTree.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/dataset/DatasetTree.unit.test.ts index d4f853238b..da0d4a9b24 100644 --- a/packages/zowe-explorer/__tests__/__unit__/dataset/DatasetTree.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/dataset/DatasetTree.unit.test.ts @@ -40,6 +40,7 @@ import { createValidIProfile, createInstanceOfProfileInfo, createGetConfigMock, + createTreeProviders, } from "../../../__mocks__/mockCreators/shared"; import { createDatasetSessionNode, createDatasetTree, createDatasetFavoritesNode } from "../../../__mocks__/mockCreators/datasets"; import { bindMvsApi, createMvsApi } from "../../../__mocks__/mockCreators/api"; @@ -49,6 +50,7 @@ import * as dsUtils from "../../../src/dataset/utils"; import { SettingsConfig } from "../../../src/utils/SettingsConfig"; import * as sharedActions from "../../../src/shared/actions"; import { ZoweLogger } from "../../../src/utils/LoggerUtils"; +import { TreeProviders } from "../../../src/shared/TreeProviders"; jest.mock("fs"); jest.mock("util"); @@ -63,6 +65,7 @@ function createGlobalMocks() { mockShowWarningMessage: jest.fn(), mockProfileInfo: createInstanceOfProfileInfo(), mockProfilesCache: new ProfilesCache(zowe.imperative.Logger.getAppLogger()), + mockTreeProviders: createTreeProviders(), }; globalMocks.mockProfileInstance = createInstanceOfProfile(globalMocks.testProfileLoaded); @@ -1327,7 +1330,7 @@ describe("Dataset Tree Unit Tests - Function deleteSession", () => { }; } - it("Checking common run of function", async () => { + it("Checking common run of function", () => { createGlobalMocks(); const blockMocks = createBlockMocks(); @@ -1339,6 +1342,20 @@ describe("Dataset Tree Unit Tests - Function deleteSession", () => { expect(testTree.mSessionNodes.map((node) => node.label)).toEqual(["Favorites"]); }); + + it("Checking case profile needs to be hidden for all trees", async () => { + const globalMocks = createGlobalMocks(); + const blockMocks = createBlockMocks(); + + jest.spyOn(TreeProviders, "providers", "get").mockReturnValue(globalMocks.mockTreeProviders); + mocked(vscode.window.createTreeView).mockReturnValueOnce(blockMocks.treeView); + const testTree = new DatasetTree(); + testTree.mSessionNodes.push(blockMocks.datasetSessionNode); + + testTree.deleteSession(testTree.mSessionNodes[1], true); + + expect(testTree.mSessionNodes.map((node) => node.label)).toEqual(["Favorites"]); + }); }); describe("Dataset Tree Unit Tests - Function flipState", () => { function createBlockMocks() { diff --git a/packages/zowe-explorer/__tests__/__unit__/dataset/init.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/dataset/init.unit.test.ts index 443446b047..86d1595754 100644 --- a/packages/zowe-explorer/__tests__/__unit__/dataset/init.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/dataset/init.unit.test.ts @@ -137,7 +137,7 @@ describe("Test src/dataset/extension", () => { name: "zowe.ds.removeSession", mock: [ { spy: jest.spyOn(contextuals, "isDsSession"), arg: [test.value], ret: true }, - { spy: jest.spyOn(dsProvider, "deleteSession"), arg: [test.value] }, + { spy: jest.spyOn(dsProvider, "deleteSession"), arg: [test.value, undefined] }, ], }, { diff --git a/packages/zowe-explorer/__tests__/__unit__/extension.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/extension.unit.test.ts index 5c9bc961a8..14aee629ab 100644 --- a/packages/zowe-explorer/__tests__/__unit__/extension.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/extension.unit.test.ts @@ -546,10 +546,12 @@ describe("Extension Unit Tests", () => { getProfile: jest.fn(), getParent: jest.fn().mockReturnValue({ getLabel: jest.fn() }), label: "TestNode", + getLabel: jest.fn(() => "TestNode"), }; + const deleteSessionSpy = jest.spyOn(providerObject.prototype, "deleteSession"); const commandFunction = allCommands.find((cmd) => command === cmd.cmd); - await (commandFunction as any).fun(testNode, [testNode]); + await (commandFunction as any).fun(testNode, [testNode], true); expect(deleteSessionSpy).toHaveBeenCalled(); } diff --git a/packages/zowe-explorer/__tests__/__unit__/job/ZoweJobNode.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/job/ZoweJobNode.unit.test.ts index 2d5351b450..34097a5e0b 100644 --- a/packages/zowe-explorer/__tests__/__unit__/job/ZoweJobNode.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/job/ZoweJobNode.unit.test.ts @@ -26,10 +26,12 @@ import { createInstanceOfProfile, createISessionWithoutCredentials, createInstanceOfProfileInfo, + createTreeProviders, } from "../../../__mocks__/mockCreators/shared"; import * as contextually from "../../../src/shared/context"; import { ZoweLogger } from "../../../src/utils/LoggerUtils"; import { bindJesApi, createJesApi } from "../../../__mocks__/mockCreators/api"; +import { TreeProviders } from "../../../src/shared/TreeProviders"; async function createGlobalMocks() { const globalMocks = { @@ -86,6 +88,7 @@ async function createGlobalMocks() { }), mockProfileInfo: createInstanceOfProfileInfo(), mockProfilesCache: new ProfilesCache(zowe.imperative.Logger.getAppLogger()), + mockTreeProviders: createTreeProviders(), }; Object.defineProperty(globals, "LOG", { value: jest.fn(), configurable: true }); @@ -237,10 +240,12 @@ describe("ZoweJobNode unit tests - Function addSession", () => { describe("ZoweJobNode unit tests - Function deleteSession", () => { it("Tests that deleteSession removes the session from the tree", async () => { const globalMocks = await createGlobalMocks(); - + jest.spyOn(TreeProviders, "providers", "get").mockReturnValue(globalMocks.mockTreeProviders); + globalMocks.testJobsProvider.mSessionNodes = globalMocks.mockTreeProviders.ds.mSessionNodes; await globalMocks.testJobsProvider.deleteSession(globalMocks.testJobsProvider.mSessionNodes[1]); - - expect(globalMocks.testJobsProvider.mSessionNodes.length).toBe(1); + expect(globalMocks.mockTreeProviders.ds.mSessionNodes.length).toEqual(2); + expect(globalMocks.mockTreeProviders.uss.mSessionNodes.length).toEqual(2); + expect(globalMocks.mockTreeProviders.job.mSessionNodes.length).toEqual(2); }); }); diff --git a/packages/zowe-explorer/__tests__/__unit__/job/init.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/job/init.unit.test.ts index 9a9f9fdd85..c510fe0d36 100644 --- a/packages/zowe-explorer/__tests__/__unit__/job/init.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/job/init.unit.test.ts @@ -122,7 +122,7 @@ describe("Test src/jobs/extension", () => { name: "zowe.jobs.removeJobsSession", mock: [ { spy: jest.spyOn(contextuals, "isJobsSession"), arg: [test.value], ret: true }, - { spy: jest.spyOn(jobsProvider, "deleteSession"), arg: [test.value] }, + { spy: jest.spyOn(jobsProvider, "deleteSession"), arg: [test.value, undefined] }, ], }, { diff --git a/packages/zowe-explorer/__tests__/__unit__/uss/USSTree.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/uss/USSTree.unit.test.ts index 88a9389e34..80be9d8640 100644 --- a/packages/zowe-explorer/__tests__/__unit__/uss/USSTree.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/uss/USSTree.unit.test.ts @@ -23,6 +23,7 @@ import { createInstanceOfProfile, createValidIProfile, createTreeView, + createTreeProviders, } from "../../../__mocks__/mockCreators/shared"; import * as globals from "../../../src/globals"; import * as vscode from "vscode"; @@ -32,6 +33,7 @@ import { getIconByNode } from "../../../src/generators/icons"; import * as workspaceUtils from "../../../src/utils/workspace"; import { createUssApi, bindUssApi } from "../../../__mocks__/mockCreators/api"; import { ZoweLogger } from "../../../src/utils/LoggerUtils"; +import { TreeProviders } from "../../../src/shared/TreeProviders"; async function createGlobalMocks() { const globalMocks = { @@ -76,6 +78,7 @@ async function createGlobalMocks() { testTree: null, profilesForValidation: { status: "active", name: "fake" }, mockProfilesCache: new ProfilesCache(zowe.imperative.Logger.getAppLogger()), + mockTreeProviders: createTreeProviders(), }; globalMocks.mockTextDocuments.push(globalMocks.mockTextDocumentDirty); @@ -503,7 +506,7 @@ describe("USSTree Unit Tests - Function USSTree.deleteSession()", () => { const newMocks = { testTree2: new USSTree(), testSessionNode: new ZoweUSSNode("testSessionNode", vscode.TreeItemCollapsibleState.Collapsed, null, globalMocks.testSession, null), - startLength: null, + startLength: 0, }; const ussSessionTestNode = createUSSSessionNode(globalMocks.testSession, globalMocks.testProfile); newMocks.testTree2.mSessionNodes.push(ussSessionTestNode); @@ -517,8 +520,13 @@ describe("USSTree Unit Tests - Function USSTree.deleteSession()", () => { const globalMocks = await createGlobalMocks(); const blockMocks = await createBlockMocks(globalMocks); - blockMocks.testTree2.deleteSession(blockMocks.testTree2.mSessionNodes[blockMocks.startLength - 1]); - expect(blockMocks.testTree2.mSessionNodes.length).toEqual(blockMocks.startLength - 1); + jest.spyOn(TreeProviders, "providers", "get").mockReturnValue(globalMocks.mockTreeProviders); + + blockMocks.testTree2.mSessionNodes = globalMocks.mockTreeProviders.ds.mSessionNodes; + blockMocks.testTree2.deleteSession(globalMocks.mockTreeProviders.ds.mSessionNodes[1]); + expect(globalMocks.mockTreeProviders.ds.mSessionNodes.length).toEqual(2); + expect(globalMocks.mockTreeProviders.uss.mSessionNodes.length).toEqual(2); + expect(globalMocks.mockTreeProviders.job.mSessionNodes.length).toEqual(2); }); }); diff --git a/packages/zowe-explorer/__tests__/__unit__/uss/init.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/uss/init.unit.test.ts index b06e8c6882..99d10a9001 100644 --- a/packages/zowe-explorer/__tests__/__unit__/uss/init.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/uss/init.unit.test.ts @@ -99,7 +99,7 @@ describe("Test src/dataset/extension", () => { name: "zowe.uss.removeSession", mock: [ { spy: jest.spyOn(contextuals, "isUssSession"), arg: [test.value], ret: true }, - { spy: jest.spyOn(ussFileProvider, "deleteSession"), arg: [test.value] }, + { spy: jest.spyOn(ussFileProvider, "deleteSession"), arg: [test.value, undefined] }, ], }, { diff --git a/packages/zowe-explorer/__tests__/__unit__/utils/ProfileManagement.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/utils/ProfileManagement.unit.test.ts index 2cd395f690..6144d55419 100644 --- a/packages/zowe-explorer/__tests__/__unit__/utils/ProfileManagement.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/utils/ProfileManagement.unit.test.ts @@ -140,9 +140,10 @@ describe("ProfileManagement unit tests", () => { configurable: true, }); mocks.mockResolveQp.mockResolvedValueOnce(mocks.mockHideProfChosen); + mocks.mockResolveQp.mockResolvedValueOnce(ProfileManagement["getPromptHideFromAllTreesQpItems"]()[0]); await ProfileManagement.manageProfile(mocks.mockDsSessionNode); expect(mocks.debugLogSpy).toBeCalledWith(mocks.logMsg); - expect(mocks.commandSpy).toHaveBeenLastCalledWith("zowe.ds.removeSession", mocks.mockDsSessionNode); + expect(mocks.commandSpy).toHaveBeenLastCalledWith("zowe.ds.removeSession", mocks.mockDsSessionNode, null, true); }); it("profile using basic authentication should see delete commands called when Delete Profile chosen with v1 profile", async () => { const mocks = createBlockMocks(createGlobalMocks()); @@ -187,9 +188,10 @@ describe("ProfileManagement unit tests", () => { it("profile using token authentication should see correct command called for hiding a unix tree session node", async () => { const mocks = createBlockMocks(createGlobalMocks()); mocks.mockResolveQp.mockResolvedValueOnce(mocks.mockHideProfChosen); + mocks.mockResolveQp.mockResolvedValueOnce(ProfileManagement["getPromptHideFromAllTreesQpItems"]()[1]); await ProfileManagement.manageProfile(mocks.mockUnixSessionNode); expect(mocks.debugLogSpy).toBeCalledWith(mocks.logMsg); - expect(mocks.commandSpy).toHaveBeenLastCalledWith("zowe.uss.removeSession", mocks.mockUnixSessionNode); + expect(mocks.commandSpy).toHaveBeenLastCalledWith("zowe.uss.removeSession", mocks.mockUnixSessionNode, null, false); }); it("profile using token authentication should see correct command called for enabling validation a unix tree session node", async () => { const mocks = createBlockMocks(createGlobalMocks()); diff --git a/packages/zowe-explorer/i18n/sample/src/utils/ProfileManagement.i18n.json b/packages/zowe-explorer/i18n/sample/src/utils/ProfileManagement.i18n.json index f487573b50..d5673c600a 100644 --- a/packages/zowe-explorer/i18n/sample/src/utils/ProfileManagement.i18n.json +++ b/packages/zowe-explorer/i18n/sample/src/utils/ProfileManagement.i18n.json @@ -3,6 +3,12 @@ "qpPlaceholders.qp.basic": "Profile {0} is using basic authentication. Choose a profile action.", "qpPlaceholders.qp.token": "Profile {0} is using token authentication. Choose a profile action.", "qpPlaceholders.qp.choose": "Profile {0} doesn't specify an authentication method. Choose a profile action.", + "ProfileManagement.promptHideFromAllTrees.allLbl": "Yes", + "ProfileManagement.promptHideFromAllTrees.allDesc": "Hide for all trees", + "ProfileManagement.promptHideFromAllTrees.currentLbl": "No", + "ProfileManagement.promptHideFromAllTrees.currentDesc": "Hide for current tree selected", + "ProfileManagement.promptHideFromAllTrees.howToHide": "Do you wish to hide this profile from all trees?", + "ProfileManagement.handleHideProfiles.cancelled": "Operation Cancelled", "addBasicAuthQpItem.addCredentials.qpLabel": "$(plus) Add Credentials", "addBasicAuthQpItem.addCredentials.qpDetail": "Add username and password for basic authentication", "updateBasicAuthQpItem.updateCredentials.qpLabel": "$(refresh) Update Credentials", diff --git a/packages/zowe-explorer/src/abstract/ZoweTreeProvider.ts b/packages/zowe-explorer/src/abstract/ZoweTreeProvider.ts index eddd2868d5..c1ba543d03 100644 --- a/packages/zowe-explorer/src/abstract/ZoweTreeProvider.ts +++ b/packages/zowe-explorer/src/abstract/ZoweTreeProvider.ts @@ -22,6 +22,8 @@ import { setProfile, setSession, errorHandling } from "../utils/ProfilesUtils"; import * as nls from "vscode-nls"; import { SettingsConfig } from "../utils/SettingsConfig"; import { ZoweLogger } from "../utils/LoggerUtils"; +import { TreeProviders } from "../shared/TreeProviders"; +import { IZoweProviders } from "../shared/init"; // Set up localization nls.config({ @@ -182,6 +184,18 @@ export class ZoweTreeProvider { return undefined; } + public deleteSession(node: IZoweTreeNode): void { + ZoweLogger.trace("ZoweTreeProvider.deleteSession called."); + for (const key of Object.keys(TreeProviders.providers) as Array) { + const provider = TreeProviders.providers[key]; + provider.mSessionNodes = (provider.mSessionNodes as IZoweTreeNode[]).filter( + (mSessionNode: IZoweTreeNode) => mSessionNode.getLabel() !== node.getLabel() + ); + provider.removeSession(node.getLabel() as string); + provider.refresh(); + } + } + public async editSession(node: IZoweTreeNode, zoweFileProvider: IZoweTree): Promise { ZoweLogger.trace("ZoweTreeProvider.editSession called."); const profile = node.getProfile(); @@ -289,10 +303,4 @@ export class ZoweTreeProvider { ZoweLogger.trace("ZoweTreeProvider.createZoweSession called."); await Profiles.getInstance().createZoweSession(zoweFileProvider); } - - protected deleteSessionByLabel(revisedLabel: string): void { - ZoweLogger.trace("ZoweTreeProvider.deleteSessionByLabel called."); - this.mHistory.removeSession(revisedLabel); - this.refresh(); - } } diff --git a/packages/zowe-explorer/src/dataset/DatasetTree.ts b/packages/zowe-explorer/src/dataset/DatasetTree.ts index a9903ac8e0..39447a61f3 100644 --- a/packages/zowe-explorer/src/dataset/DatasetTree.ts +++ b/packages/zowe-explorer/src/dataset/DatasetTree.ts @@ -482,10 +482,13 @@ export class DatasetTree extends ZoweTreeProvider implements IZoweTree tempNode.label.toString() !== node.label.toString()); - this.mHistory.removeSession(node.label as string); + if (hideFromAllTrees) { + super.deleteSession(node); + } + this.mSessionNodes = this.mSessionNodes.filter((mSessionNode: IZoweDatasetTreeNode) => mSessionNode.getLabel() !== node.getLabel()); + this.removeSession(node.getLabel() as string); this.refresh(); } @@ -769,6 +772,11 @@ export class DatasetTree extends ZoweTreeProvider implements IZoweTree> { +export async function initDatasetProvider(context: vscode.ExtensionContext): Promise { ZoweLogger.trace("dataset.init.initDatasetProvider called."); const datasetProvider = await createDatasetTree(globals.LOG); if (datasetProvider == null) { @@ -109,14 +109,17 @@ export async function initDatasetProvider(context: vscode.ExtensionContext): Pro }) ); context.subscriptions.push( - vscode.commands.registerCommand("zowe.ds.removeSession", async (node: IZoweDatasetTreeNode, nodeList: IZoweDatasetTreeNode[]) => { - let selectedNodes = getSelectedNodeList(node, nodeList); - selectedNodes = selectedNodes.filter((sNode) => contextuals.isDsSession(sNode)); - for (const select of selectedNodes) { - datasetProvider.deleteSession(select); + vscode.commands.registerCommand( + "zowe.ds.removeSession", + async (node: IZoweDatasetTreeNode, nodeList: IZoweDatasetTreeNode[], hideFromAllTrees: boolean) => { + let selectedNodes = getSelectedNodeList(node, nodeList); + selectedNodes = selectedNodes.filter((sNode) => contextuals.isDsSession(sNode)); + for (const select of selectedNodes) { + datasetProvider.deleteSession(select, hideFromAllTrees); + } + await TreeViewUtils.fixVsCodeMultiSelect(datasetProvider); } - await TreeViewUtils.fixVsCodeMultiSelect(datasetProvider); - }) + ) ); context.subscriptions.push( vscode.commands.registerCommand("zowe.ds.removeFavorite", async (node, nodeList) => { diff --git a/packages/zowe-explorer/src/job/ZosJobsProvider.ts b/packages/zowe-explorer/src/job/ZosJobsProvider.ts index cd61cc7717..67337f4ee9 100644 --- a/packages/zowe-explorer/src/job/ZosJobsProvider.ts +++ b/packages/zowe-explorer/src/job/ZosJobsProvider.ts @@ -633,6 +633,11 @@ export class ZosJobsProvider extends ZoweTreeProvider implements IZoweTree tempNode.label !== node.label); - this.deleteSessionByLabel(node.getLabel() as string); + if (hideFromAllTrees) { + super.deleteSession(node); + } + this.mSessionNodes = this.mSessionNodes.filter((mSessionNode: IZoweJobTreeNode) => mSessionNode.getLabel() !== node.getLabel()); + this.removeSession(node.getLabel() as string); + this.refresh(); } /** diff --git a/packages/zowe-explorer/src/job/init.ts b/packages/zowe-explorer/src/job/init.ts index 81527474a2..01c92cdc80 100644 --- a/packages/zowe-explorer/src/job/init.ts +++ b/packages/zowe-explorer/src/job/init.ts @@ -13,16 +13,16 @@ import * as globals from "../globals"; import * as vscode from "vscode"; import * as jobActions from "./actions"; import * as refreshActions from "../shared/refresh"; -import { IZoweJobTreeNode, IZoweTreeNode, IZoweTree } from "@zowe/zowe-explorer-api"; +import { IZoweJobTreeNode, IZoweTreeNode } from "@zowe/zowe-explorer-api"; import { Profiles } from "../Profiles"; -import { createJobsTree } from "./ZosJobsProvider"; +import { ZosJobsProvider, createJobsTree } from "./ZosJobsProvider"; import * as contextuals from "../shared/context"; import { Job } from "./ZoweJobNode"; import { getSelectedNodeList } from "../shared/utils"; import { initSubscribers } from "../shared/init"; import { ZoweLogger } from "../utils/LoggerUtils"; -export async function initJobsProvider(context: vscode.ExtensionContext): Promise> { +export async function initJobsProvider(context: vscode.ExtensionContext): Promise { ZoweLogger.trace("job.init.initJobsProvider called."); const jobsProvider = await createJobsTree(globals.LOG); if (jobsProvider == null) { @@ -75,11 +75,11 @@ export async function initJobsProvider(context: vscode.ExtensionContext): Promis context.subscriptions.push(vscode.commands.registerCommand("zowe.jobs.setOwner", (job) => jobActions.setOwner(job, jobsProvider))); context.subscriptions.push(vscode.commands.registerCommand("zowe.jobs.setPrefix", (job) => jobActions.setPrefix(job, jobsProvider))); context.subscriptions.push( - vscode.commands.registerCommand("zowe.jobs.removeJobsSession", (job, jobList) => { + vscode.commands.registerCommand("zowe.jobs.removeJobsSession", (job, jobList, hideFromAllTrees) => { let selectedNodes = getSelectedNodeList(job, jobList); selectedNodes = selectedNodes.filter((element) => contextuals.isJobsSession(element)); for (const item of selectedNodes) { - jobsProvider.deleteSession(item); + jobsProvider.deleteSession(item, hideFromAllTrees); } }) ); diff --git a/packages/zowe-explorer/src/shared/TreeProviders.ts b/packages/zowe-explorer/src/shared/TreeProviders.ts index 703f60c990..cf9bc4b93e 100644 --- a/packages/zowe-explorer/src/shared/TreeProviders.ts +++ b/packages/zowe-explorer/src/shared/TreeProviders.ts @@ -10,34 +10,38 @@ */ import * as vscode from "vscode"; -import { IZoweTree, IZoweTreeNode } from "@zowe/zowe-explorer-api"; import { IZoweProviders } from "./init"; +import { DatasetTree } from "../dataset/DatasetTree"; +import { USSTree } from "../uss/USSTree"; +import { ZosJobsProvider } from "../job/ZosJobsProvider"; + +type ProviderFunctions = { + ds: (context: vscode.ExtensionContext) => Promise; + uss: (context: vscode.ExtensionContext) => Promise; + job: (context: vscode.ExtensionContext) => Promise; +}; -type ProviderFunction = (context: vscode.ExtensionContext) => Promise>; export class TreeProviders { - static #ds: IZoweTree; - static #uss: IZoweTree; - static #job: IZoweTree; - - public static async initializeProviders( - context: vscode.ExtensionContext, - initializers: { ds: ProviderFunction; uss: ProviderFunction; job: ProviderFunction } - ): Promise { + static #ds: DatasetTree; + static #uss: USSTree; + static #job: ZosJobsProvider; + + public static async initializeProviders(context: vscode.ExtensionContext, initializers: ProviderFunctions): Promise { TreeProviders.#ds = await initializers.ds(context); TreeProviders.#uss = await initializers.uss(context); TreeProviders.#job = await initializers.job(context); return TreeProviders.providers; } - public static get ds(): IZoweTree { + public static get ds(): DatasetTree { return TreeProviders.#ds; } - public static get uss(): IZoweTree { + public static get uss(): USSTree { return TreeProviders.#uss; } - public static get job(): IZoweTree { + public static get job(): ZosJobsProvider { return TreeProviders.#job; } diff --git a/packages/zowe-explorer/src/shared/init.ts b/packages/zowe-explorer/src/shared/init.ts index 8c0dcec39d..e519df9d0a 100644 --- a/packages/zowe-explorer/src/shared/init.ts +++ b/packages/zowe-explorer/src/shared/init.ts @@ -29,6 +29,9 @@ import { SettingsConfig } from "../utils/SettingsConfig"; import { spoolFilePollEvent } from "../job/actions"; import { HistoryView } from "./HistoryView"; import { ProfileManagement } from "../utils/ProfileManagement"; +import { DatasetTree } from "../dataset/DatasetTree"; +import { USSTree } from "../uss/USSTree"; +import { ZosJobsProvider } from "../job/ZosJobsProvider"; // Set up localization nls.config({ @@ -38,10 +41,9 @@ nls.config({ const localize: nls.LocalizeFunc = nls.loadMessageBundle(); export interface IZoweProviders { - ds: IZoweTree; - uss: IZoweTree; - job: IZoweTree; - // [key: string]: IZoweTree; + ds: DatasetTree; + uss: USSTree; + job: ZosJobsProvider; } export function registerRefreshCommand( diff --git a/packages/zowe-explorer/src/uss/USSTree.ts b/packages/zowe-explorer/src/uss/USSTree.ts index 58cde526ab..01bc371c75 100644 --- a/packages/zowe-explorer/src/uss/USSTree.ts +++ b/packages/zowe-explorer/src/uss/USSTree.ts @@ -363,10 +363,13 @@ export class USSTree extends ZoweTreeProvider implements IZoweTree tempNode.label.toString() !== node.label.toString()); - this.mHistory.removeSession(node.label as string); + if (hideFromAllTrees) { + super.deleteSession(node); + } + this.mSessionNodes = this.mSessionNodes.filter((mSessionNode: IZoweUSSTreeNode) => mSessionNode.getLabel() !== node.getLabel()); + this.removeSession(node.getLabel() as string); this.refresh(); } @@ -856,6 +859,11 @@ export class USSTree extends ZoweTreeProvider implements IZoweTree> { +export async function initUSSProvider(context: vscode.ExtensionContext): Promise { ZoweLogger.trace("init.initUSSProvider called."); const ussFileProvider: IZoweTree = await createUSSTree(globals.LOG); if (ussFileProvider == null) { @@ -84,11 +84,11 @@ export async function initUSSProvider(context: vscode.ExtensionContext): Promise vscode.commands.registerCommand("zowe.uss.ZoweUSSNode.open", (node: IZoweUSSTreeNode): void => node.openUSS(false, true, ussFileProvider)) ); context.subscriptions.push( - vscode.commands.registerCommand("zowe.uss.removeSession", async (node: IZoweUSSTreeNode, nodeList) => { + vscode.commands.registerCommand("zowe.uss.removeSession", async (node: IZoweUSSTreeNode, nodeList, hideFromAllTrees: boolean) => { let selectedNodes = getSelectedNodeList(node, nodeList); selectedNodes = selectedNodes.filter((element) => contextuals.isUssSession(element)); for (const item of selectedNodes) { - ussFileProvider.deleteSession(item); + ussFileProvider.deleteSession(item, hideFromAllTrees); } await TreeViewUtils.fixVsCodeMultiSelect(ussFileProvider); }) @@ -191,5 +191,5 @@ export async function initUSSProvider(context: vscode.ExtensionContext): Promise ); initSubscribers(context, ussFileProvider); - return ussFileProvider; + return ussFileProvider as USSTree; } diff --git a/packages/zowe-explorer/src/utils/ProfileManagement.ts b/packages/zowe-explorer/src/utils/ProfileManagement.ts index 5825a8fdac..bfb617062f 100644 --- a/packages/zowe-explorer/src/utils/ProfileManagement.ts +++ b/packages/zowe-explorer/src/utils/ProfileManagement.ts @@ -245,14 +245,45 @@ export class ProfileManagement { await vscode.commands.executeCommand("zowe.ds.deleteProfile", node); } + private static getPromptHideFromAllTreesQpItems(): vscode.QuickPickItem[] { + const qpItemAll: vscode.QuickPickItem = { + label: localize("ProfileManagement.promptHideFromAllTrees.allLbl", "Yes"), + description: localize("ProfileManagement.promptHideFromAllTrees.allDesc", "Hide for all trees"), + }; + const qpItemCurrent: vscode.QuickPickItem = { + label: localize("ProfileManagement.promptHideFromAllTrees.currentLbl", "No"), + description: localize("ProfileManagement.promptHideFromAllTrees.currentDesc", "Hide for current tree selected"), + }; + return [qpItemAll, qpItemCurrent]; + } + + private static async promptHideFromAllTrees(): Promise { + const qp = Gui.createQuickPick(); + qp.placeholder = localize("ProfileManagement.promptHideFromAllTrees.howToHide", "Do you wish to hide this profile from all trees?"); + qp.items = this.getPromptHideFromAllTreesQpItems(); + qp.activeItems = [qp.items[0]]; + qp.show(); + const selection = await Gui.resolveQuickPick(qp); + qp.hide(); + return selection; + } + private static async handleHideProfiles(node: IZoweTreeNode): Promise { + const selection = await this.promptHideFromAllTrees(); + if (!selection) { + Gui.infoMessage(localize("ProfileManagement.handleHideProfiles.cancelled", "Operation Cancelled")); + return; + } + const [all] = this.getPromptHideFromAllTreesQpItems(); + const shouldHideFromAllTrees = selection.label === all.label ? true : false; + if (isZoweDatasetTreeNode(node)) { - return vscode.commands.executeCommand("zowe.ds.removeSession", node); + return vscode.commands.executeCommand("zowe.ds.removeSession", node, null, shouldHideFromAllTrees); } if (isZoweUSSTreeNode(node)) { - return vscode.commands.executeCommand("zowe.uss.removeSession", node); + return vscode.commands.executeCommand("zowe.uss.removeSession", node, null, shouldHideFromAllTrees); } - return vscode.commands.executeCommand("zowe.jobs.removeJobsSession", node); + return vscode.commands.executeCommand("zowe.jobs.removeJobsSession", node, null, shouldHideFromAllTrees); } private static async handleEnableProfileValidation(node: IZoweTreeNode): Promise {