From 54a2e697bf988803cc24d4a6ed5dae9b57469f20 Mon Sep 17 00:00:00 2001 From: Likhitha Nimma Date: Wed, 13 Sep 2023 16:20:55 +0530 Subject: [PATCH 1/4] Sort-Jobs Implemented Signed-off-by: Likhitha Nimma --- packages/zowe-explorer/CHANGELOG.md | 1 + .../__tests__/__unit__/extension.unit.test.ts | 3 + .../__unit__/job/actions.unit.test.ts | 125 ++++++++++++++++++ packages/zowe-explorer/package.json | 30 +++++ packages/zowe-explorer/src/globals.ts | 2 +- packages/zowe-explorer/src/job/actions.ts | 35 ++++- packages/zowe-explorer/src/job/init.ts | 6 +- 7 files changed, 199 insertions(+), 3 deletions(-) diff --git a/packages/zowe-explorer/CHANGELOG.md b/packages/zowe-explorer/CHANGELOG.md index 9fdb0fc6ae..fd4b0c1258 100644 --- a/packages/zowe-explorer/CHANGELOG.md +++ b/packages/zowe-explorer/CHANGELOG.md @@ -54,6 +54,7 @@ All notable changes to the "vscode-extension-for-zowe" extension will be documen - Added option to save unique data set attributes as a template after allocation for future use. [#1425](https://github.com/zowe/vscode-extension-for-zowe/issues/1425) - Added "Cancel Job" feature for job nodes in Jobs tree view. [#2251](https://github.com/zowe/vscode-extension-for-zowe/issues/2251) +- Added "Sort Jobs" feature for job nodes in Jobs tree view. [#2257](https://github.com/zowe/vscode-extension-for-zowe/issues/2251) - Enhanced ID generation for parent tree nodes to ensure uniqueness. - Added support for custom credential manager extensions in Zowe Explorer [#2212](https://github.com/zowe/vscode-extension-for-zowe/issues/2212) diff --git a/packages/zowe-explorer/__tests__/__unit__/extension.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/extension.unit.test.ts index 1b8e377e58..0f637993a6 100644 --- a/packages/zowe-explorer/__tests__/__unit__/extension.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/extension.unit.test.ts @@ -238,6 +238,9 @@ async function createGlobalMocks() { "zowe.jobs.startPolling", "zowe.jobs.stopPolling", "zowe.jobs.cancelJob", + "zowe.jobs.sortbyname", + "zowe.jobs.sortbyid", + "zowe.jobs.sortbyreturncode", "zowe.manualPoll", "zowe.updateSecureCredentials", "zowe.promptCredentials", diff --git a/packages/zowe-explorer/__tests__/__unit__/job/actions.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/job/actions.unit.test.ts index 0c6847479e..bbcb33b0c4 100644 --- a/packages/zowe-explorer/__tests__/__unit__/job/actions.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/job/actions.unit.test.ts @@ -41,6 +41,7 @@ import * as refreshActions from "../../../src/shared/refresh"; import * as sharedUtils from "../../../src/shared/utils"; import { ZoweLogger } from "../../../src/utils/LoggerUtils"; import { SpoolFile } from "../../../src/SpoolProvider"; +import { ZosJobsProvider } from "../../../src/job/ZosJobsProvider"; const activeTextEditorDocument = jest.fn(); @@ -85,6 +86,49 @@ function createGlobalMocks() { Object.defineProperty(ZoweLogger, "error", { value: jest.fn(), configurable: true }); Object.defineProperty(ZoweLogger, "debug", { value: jest.fn(), configurable: true }); Object.defineProperty(ZoweLogger, "trace", { value: jest.fn(), configurable: true }); + Object.defineProperty(vscode.window, "showInformationMessage", { value: jest.fn(), configurable: true }); + function settingJobObjects(job: zowe.IJob, setjobname: string, setjobid: string, setjobreturncode: string): zowe.IJob { + job.jobname = setjobname; + job.jobid = setjobid; + job.retcode = setjobreturncode; + return job; + } + const newMocks = jest.fn().mockReturnValue([ + (() => { + const JobNode1 = new Job( + "testProfile", + vscode.TreeItemCollapsibleState.None, + null, + createISession(), + settingJobObjects(createIJobObject(), "ZOWEUSR1", "JOB045123", "ABEND S222"), + createIProfile() + ); + return JobNode1; + })(), + (() => { + const JobNode2 = new Job( + "testProfile", + vscode.TreeItemCollapsibleState.None, + null, + createISession(), + settingJobObjects(createIJobObject(), "ZOWEUSR1", "JOB045120", "CC 0000"), + createIProfile() + ); + return JobNode2; + })(), + (() => { + const JobNode3 = new Job( + "testProfile", + vscode.TreeItemCollapsibleState.None, + null, + createISession(), + settingJobObjects(createIJobObject(), "ZOWEUSR2", "JOB045125", "CC 0000"), + createIProfile() + ); + return JobNode3; + })(), + ]); + return newMocks; } // Idea is borrowed from: https://github.com/kulshekhar/ts-jest/blob/master/src/util/testing.ts @@ -1300,3 +1344,84 @@ describe("Job Actions Unit Tests - Misc. functions", () => { expect(statusMsgSpy).toHaveBeenCalledWith(`$(sync~spin) Polling: ${testDoc.fileName}...`); }); }); +describe("sortbyname function", () => { + afterEach(() => { + jest.restoreAllMocks(); + }); + it("if there are no jobs in the zosmf level yet", async () => { + createGlobalMocks(); + const testtree = new ZosJobsProvider(); + //act + await jobActions.sortByName(testtree.mSessionNodes[0], testtree); + //assert + expect(mocked(vscode.window.showInformationMessage)).toBeCalled(); + }); + it("sort by name if same sort by increasing id", async () => { + const globalMocks = createGlobalMocks(); + const testtree = new ZosJobsProvider(); + const expected = new ZosJobsProvider(); + testtree.mSessionNodes[0].children = [...[globalMocks()[2], globalMocks()[1], globalMocks()[0]]]; + expected.mSessionNodes[0].children = [...[globalMocks()[1], globalMocks()[0], globalMocks()[2]]]; + const sortbynamespy = jest.spyOn(jobActions, "sortByName"); + //act + await jobActions.sortByName(testtree.mSessionNodes[0], testtree); + //asert + expect(sortbynamespy).toBeCalledWith(testtree.mSessionNodes[0], testtree); + expect(sortbynamespy).toHaveBeenCalled(); + expect(sortbynamespy.mock.calls[0][0].children).toStrictEqual(expected.mSessionNodes[0].children); + }); +}); +describe("sortbyid function", () => { + afterEach(() => { + jest.restoreAllMocks(); + }); + it("if there are no jobs in the zosmf level yet", async () => { + createGlobalMocks(); + const testtree = new ZosJobsProvider(); + //act + await jobActions.sortById(testtree.mSessionNodes[0], testtree); + //assert + expect(mocked(vscode.window.showInformationMessage)).toBeCalled(); + }); + it("sorts by increasing order of id", async () => { + const globalMocks = createGlobalMocks(); + const testtree = new ZosJobsProvider(); + const expected = new ZosJobsProvider(); + testtree.mSessionNodes[0].children = [...[globalMocks()[2], globalMocks()[1], globalMocks()[0]]]; + expected.mSessionNodes[0].children = [...[globalMocks()[1], globalMocks()[0], globalMocks()[2]]]; + const sortbyidspy = jest.spyOn(jobActions, "sortById"); + //act + await jobActions.sortById(testtree.mSessionNodes[0], testtree); + //asert + expect(sortbyidspy).toBeCalledWith(testtree.mSessionNodes[0], testtree); + expect(sortbyidspy).toHaveBeenCalled(); + expect(sortbyidspy.mock.calls[0][0].children).toStrictEqual(expected.mSessionNodes[0].children); + }); +}); +describe("sortbyretcode function", () => { + afterEach(() => { + jest.restoreAllMocks(); + }); + it("if there are no jobs in the zosmf level yet", async () => { + createGlobalMocks(); + const testtree = new ZosJobsProvider(); + //act + await jobActions.sortByReturnCode(testtree.mSessionNodes[0], testtree); + //assert + expect(mocked(vscode.window.showInformationMessage)).toBeCalled(); + }); + it("sort by retcode if same sort by increasing id", async () => { + const globalMocks = createGlobalMocks(); + const testtree = new ZosJobsProvider(); + const expected = new ZosJobsProvider(); + testtree.mSessionNodes[0].children = [...[globalMocks()[2], globalMocks()[1], globalMocks()[0]]]; + expected.mSessionNodes[0].children = [...[globalMocks()[0], globalMocks()[1], globalMocks()[2]]]; + const sortbyretcodespy = jest.spyOn(jobActions, "sortByReturnCode"); + //act + await jobActions.sortByReturnCode(testtree.mSessionNodes[0], testtree); + //asert + expect(sortbyretcodespy).toBeCalledWith(testtree.mSessionNodes[0], testtree); + expect(sortbyretcodespy).toHaveBeenCalled(); + expect(sortbyretcodespy.mock.calls[0][0].children).toStrictEqual(expected.mSessionNodes[0].children); + }); +}); diff --git a/packages/zowe-explorer/package.json b/packages/zowe-explorer/package.json index 0de5da53c0..5e02a87893 100644 --- a/packages/zowe-explorer/package.json +++ b/packages/zowe-explorer/package.json @@ -121,6 +121,21 @@ } ], "commands": [ + { + "command": "zowe.jobs.sortbyreturncode", + "title": "Sort by returncode", + "category": "Zowe Explorer" + }, + { + "command": "zowe.jobs.sortbyname", + "title": "Sort by name", + "category": "Zowe Explorer" + }, + { + "command": "zowe.jobs.sortbyid", + "title": "Sort by id", + "category": "Zowe Explorer" + }, { "command": "zowe.promptCredentials", "title": "%zowe.promptCredentials%", @@ -1357,6 +1372,21 @@ "when": "view == zowe.jobs.explorer && viewItem =~ /^(?!.*_fav.*)server.*/ && !listMultiSelection", "command": "zowe.jobs.deleteProfile", "group": "099_zowe_jobsProfileModification@99" + }, + { + "when": "view == zowe.jobs.explorer && viewItem =~ /^(?!.*_fav.*)server.*/ && !listMultiSelection", + "command": "zowe.jobs.sortbyid", + "group": "000_zowe_jobsProfileModification@1" + }, + { + "when": "view == zowe.jobs.explorer && viewItem =~ /^(?!.*_fav.*)server.*/ && !listMultiSelection", + "command": "zowe.jobs.sortbyname", + "group": "000_zowe_jobsProfileModification@2" + }, + { + "when": "view == zowe.jobs.explorer && viewItem =~ /^(?!.*_fav.*)server.*/ && !listMultiSelection", + "command": "zowe.jobs.sortbyreturncode", + "group": "000_zowe_jobsProfileModification@2" } ], "commandPalette": [ diff --git a/packages/zowe-explorer/src/globals.ts b/packages/zowe-explorer/src/globals.ts index 7bbba932b2..a503fe7332 100644 --- a/packages/zowe-explorer/src/globals.ts +++ b/packages/zowe-explorer/src/globals.ts @@ -35,7 +35,7 @@ export let DS_DIR: string; export let CONFIG_PATH; // set during activate export let ISTHEIA = false; // set during activate export let LOG: imperative.Logger; -export const COMMAND_COUNT = 110; +export const COMMAND_COUNT = 113; export const MAX_SEARCH_HISTORY = 5; export const MAX_FILE_HISTORY = 10; export const MS_PER_SEC = 1000; diff --git a/packages/zowe-explorer/src/job/actions.ts b/packages/zowe-explorer/src/job/actions.ts index 06fecac4c5..3322266096 100644 --- a/packages/zowe-explorer/src/job/actions.ts +++ b/packages/zowe-explorer/src/job/actions.ts @@ -14,7 +14,7 @@ import * as zowe from "@zowe/cli"; import { errorHandling } from "../utils/ProfilesUtils"; import { Profiles } from "../Profiles"; import { ZoweExplorerApiRegister } from "../ZoweExplorerApiRegister"; -import { Gui, ValidProfileEnum, IZoweTree, IZoweJobTreeNode } from "@zowe/zowe-explorer-api"; +import { Gui, IZoweTree, IZoweJobTreeNode } from "@zowe/zowe-explorer-api"; import { Job, Spool } from "./ZoweJobNode"; import * as nls from "vscode-nls"; import SpoolProvider, { encodeJobFile, getSpoolFiles, matchSpool } from "../SpoolProvider"; @@ -528,3 +528,36 @@ export async function cancelJobs(jobsProvider: IZoweTree, node await Gui.showMessage(localize("cancelJobs.succeeded", "Cancelled selected jobs successfully.")); } } +export async function sortByName(jobs: IZoweJobTreeNode, jobsProvider: IZoweTree): Promise { + if (jobs["children"].length == 0) { + await vscode.window.showInformationMessage("No jobs are present in the profile."); + } + jobs["children"].sort((x, y) => { + if (x["job"]["jobname"] === y["job"]["jobname"]) { + return x["job"]["jobid"] > y["job"]["jobid"] ? 1 : -1; + } else { + return x["job"]["jobname"] > y["job"]["jobname"] ? 1 : -1; + } + }); + jobsProvider.refresh(); +} +export async function sortById(jobs: IZoweJobTreeNode, jobsProvider: IZoweTree): Promise { + if (jobs["children"].length == 0) { + await vscode.window.showInformationMessage("No jobs are present in the profile."); + } + jobs["children"].sort((x, y) => (x["job"]["jobid"] > y["job"]["jobid"] ? 1 : -1)); + jobsProvider.refresh(); +} +export async function sortByReturnCode(jobs: IZoweJobTreeNode, jobsProvider: IZoweTree): Promise { + if (jobs["children"].length == 0) { + await vscode.window.showInformationMessage("No jobs are present in the profile."); + } + jobs["children"].sort((x, y) => { + if (x["job"]["retcode"] === y["job"]["retcode"]) { + return x["job"]["jobid"] > y["job"]["jobid"] ? 1 : -1; + } else { + return x["job"]["retcode"] > y["job"]["retcode"] ? 1 : -1; + } + }); + jobsProvider.refresh(); +} diff --git a/packages/zowe-explorer/src/job/init.ts b/packages/zowe-explorer/src/job/init.ts index 73b3f0ebb8..4571e7e7e9 100644 --- a/packages/zowe-explorer/src/job/init.ts +++ b/packages/zowe-explorer/src/job/init.ts @@ -169,7 +169,11 @@ export async function initJobsProvider(context: vscode.ExtensionContext): Promis await jobActions.cancelJobs(jobsProvider, getSelectedNodeList(node, nodeList)); }) ); - + context.subscriptions.push(vscode.commands.registerCommand("zowe.jobs.sortbyname", (job) => jobActions.sortByName(job, jobsProvider))); + context.subscriptions.push(vscode.commands.registerCommand("zowe.jobs.sortbyid", (job) => jobActions.sortById(job, jobsProvider))); + context.subscriptions.push( + vscode.commands.registerCommand("zowe.jobs.sortbyreturncode", (job) => jobActions.sortByReturnCode(job, jobsProvider)) + ); initSubscribers(context, jobsProvider); return jobsProvider; } From f18487a938136416daa6a630369b8f74a0acb207 Mon Sep 17 00:00:00 2001 From: Likhitha Nimma Date: Sat, 16 Sep 2023 11:47:44 +0530 Subject: [PATCH 2/4] Modified Changelog and package.json Signed-off-by: Likhitha Nimma --- packages/zowe-explorer/CHANGELOG.md | 3 ++- packages/zowe-explorer/package.json | 6 +++--- packages/zowe-explorer/package.nls.json | 5 ++++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/zowe-explorer/CHANGELOG.md b/packages/zowe-explorer/CHANGELOG.md index 03974e6c1e..494c94a0c9 100644 --- a/packages/zowe-explorer/CHANGELOG.md +++ b/packages/zowe-explorer/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to the "vscode-extension-for-zowe" extension will be documen ## TBD Release +- Added "Sort Jobs" feature for job nodes in Jobs tree view. [#2257](https://github.com/zowe/vscode-extension-for-zowe/issues/2251) + ### New features and enhancements ### Bug fixes @@ -61,7 +63,6 @@ All notable changes to the "vscode-extension-for-zowe" extension will be documen - Added option to save unique data set attributes as a template after allocation for future use. [#1425](https://github.com/zowe/vscode-extension-for-zowe/issues/1425) - Added "Cancel Job" feature for job nodes in Jobs tree view. [#2251](https://github.com/zowe/vscode-extension-for-zowe/issues/2251) -- Added "Sort Jobs" feature for job nodes in Jobs tree view. [#2257](https://github.com/zowe/vscode-extension-for-zowe/issues/2251) - Enhanced ID generation for parent tree nodes to ensure uniqueness. - Added support for custom credential manager extensions in Zowe Explorer [#2212](https://github.com/zowe/vscode-extension-for-zowe/issues/2212) diff --git a/packages/zowe-explorer/package.json b/packages/zowe-explorer/package.json index fb6bd6c2f2..527726260b 100644 --- a/packages/zowe-explorer/package.json +++ b/packages/zowe-explorer/package.json @@ -123,17 +123,17 @@ "commands": [ { "command": "zowe.jobs.sortbyreturncode", - "title": "Sort by returncode", + "title": "%jobs.sortbyreturncode%", "category": "Zowe Explorer" }, { "command": "zowe.jobs.sortbyname", - "title": "Sort by name", + "title": "%jobs.sortbyname%", "category": "Zowe Explorer" }, { "command": "zowe.jobs.sortbyid", - "title": "Sort by id", + "title": "%jobs.sortbyid%", "category": "Zowe Explorer" }, { diff --git a/packages/zowe-explorer/package.nls.json b/packages/zowe-explorer/package.nls.json index 5930969b05..8bc5d8bf6c 100644 --- a/packages/zowe-explorer/package.nls.json +++ b/packages/zowe-explorer/package.nls.json @@ -146,5 +146,8 @@ "createZoweSchema.reload.button": "Reload Window", "createZoweSchema.reload.infoMessage": "Team Configuration file created. Location: {0}. \n Please reload your window.", "copyFile": "Copy", - "pasteFile": "Paste" + "pasteFile": "Paste", + "jobs.sortbyreturncode": "Sort by ReturnCode", + "jobs.sortbyname": "Sort by Name", + "jobs.sortbyid": "Sort by ID" } From ef8333e43b221dc9acd58549bbc0fbefed194669 Mon Sep 17 00:00:00 2001 From: Likhitha Nimma Date: Mon, 18 Sep 2023 20:55:54 +0530 Subject: [PATCH 3/4] Modified CHANGELOG file Signed-off-by: Likhitha Nimma --- packages/zowe-explorer/CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/zowe-explorer/CHANGELOG.md b/packages/zowe-explorer/CHANGELOG.md index 494c94a0c9..99e818bad5 100644 --- a/packages/zowe-explorer/CHANGELOG.md +++ b/packages/zowe-explorer/CHANGELOG.md @@ -4,10 +4,10 @@ All notable changes to the "vscode-extension-for-zowe" extension will be documen ## TBD Release -- Added "Sort Jobs" feature for job nodes in Jobs tree view. [#2257](https://github.com/zowe/vscode-extension-for-zowe/issues/2251) - ### New features and enhancements +- Added "Sort Jobs" feature for job nodes in Jobs tree view. [#2257](https://github.com/zowe/vscode-extension-for-zowe/issues/2251) + ### Bug fixes ## `2.11.0` From 5623883ba5f0e4c63ae91c94c2958519cd2e3ee3 Mon Sep 17 00:00:00 2001 From: Likhitha Nimma Date: Mon, 18 Sep 2023 21:49:16 +0530 Subject: [PATCH 4/4] Modified the functionality to 1 function-Updated actions.ts file Signed-off-by: Likhitha Nimma --- .../__unit__/job/actions.unit.test.ts | 50 +++++-------------- packages/zowe-explorer/src/job/actions.ts | 26 ++-------- packages/zowe-explorer/src/job/init.ts | 6 +-- 3 files changed, 19 insertions(+), 63 deletions(-) diff --git a/packages/zowe-explorer/__tests__/__unit__/job/actions.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/job/actions.unit.test.ts index bbcb33b0c4..e541a0650f 100644 --- a/packages/zowe-explorer/__tests__/__unit__/job/actions.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/job/actions.unit.test.ts @@ -1344,7 +1344,7 @@ describe("Job Actions Unit Tests - Misc. functions", () => { expect(statusMsgSpy).toHaveBeenCalledWith(`$(sync~spin) Polling: ${testDoc.fileName}...`); }); }); -describe("sortbyname function", () => { +describe("sortjobsby function", () => { afterEach(() => { jest.restoreAllMocks(); }); @@ -1352,7 +1352,9 @@ describe("sortbyname function", () => { createGlobalMocks(); const testtree = new ZosJobsProvider(); //act - await jobActions.sortByName(testtree.mSessionNodes[0], testtree); + await jobActions.sortJobsBy(testtree.mSessionNodes[0], testtree, "jobname"); + await jobActions.sortJobsBy(testtree.mSessionNodes[0], testtree, "jobid"); + await jobActions.sortJobsBy(testtree.mSessionNodes[0], testtree, "retcode"); //assert expect(mocked(vscode.window.showInformationMessage)).toBeCalled(); }); @@ -1362,65 +1364,39 @@ describe("sortbyname function", () => { const expected = new ZosJobsProvider(); testtree.mSessionNodes[0].children = [...[globalMocks()[2], globalMocks()[1], globalMocks()[0]]]; expected.mSessionNodes[0].children = [...[globalMocks()[1], globalMocks()[0], globalMocks()[2]]]; - const sortbynamespy = jest.spyOn(jobActions, "sortByName"); + const sortbynamespy = jest.spyOn(jobActions, "sortJobsBy"); //act - await jobActions.sortByName(testtree.mSessionNodes[0], testtree); + await jobActions.sortJobsBy(testtree.mSessionNodes[0], testtree, "jobname"); //asert - expect(sortbynamespy).toBeCalledWith(testtree.mSessionNodes[0], testtree); + expect(sortbynamespy).toBeCalledWith(testtree.mSessionNodes[0], testtree, "jobname"); expect(sortbynamespy).toHaveBeenCalled(); expect(sortbynamespy.mock.calls[0][0].children).toStrictEqual(expected.mSessionNodes[0].children); }); -}); -describe("sortbyid function", () => { - afterEach(() => { - jest.restoreAllMocks(); - }); - it("if there are no jobs in the zosmf level yet", async () => { - createGlobalMocks(); - const testtree = new ZosJobsProvider(); - //act - await jobActions.sortById(testtree.mSessionNodes[0], testtree); - //assert - expect(mocked(vscode.window.showInformationMessage)).toBeCalled(); - }); it("sorts by increasing order of id", async () => { const globalMocks = createGlobalMocks(); const testtree = new ZosJobsProvider(); const expected = new ZosJobsProvider(); testtree.mSessionNodes[0].children = [...[globalMocks()[2], globalMocks()[1], globalMocks()[0]]]; expected.mSessionNodes[0].children = [...[globalMocks()[1], globalMocks()[0], globalMocks()[2]]]; - const sortbyidspy = jest.spyOn(jobActions, "sortById"); + const sortbyidspy = jest.spyOn(jobActions, "sortJobsBy"); //act - await jobActions.sortById(testtree.mSessionNodes[0], testtree); + await jobActions.sortJobsBy(testtree.mSessionNodes[0], testtree, "jobid"); //asert - expect(sortbyidspy).toBeCalledWith(testtree.mSessionNodes[0], testtree); + expect(sortbyidspy).toBeCalledWith(testtree.mSessionNodes[0], testtree, "jobid"); expect(sortbyidspy).toHaveBeenCalled(); expect(sortbyidspy.mock.calls[0][0].children).toStrictEqual(expected.mSessionNodes[0].children); }); -}); -describe("sortbyretcode function", () => { - afterEach(() => { - jest.restoreAllMocks(); - }); - it("if there are no jobs in the zosmf level yet", async () => { - createGlobalMocks(); - const testtree = new ZosJobsProvider(); - //act - await jobActions.sortByReturnCode(testtree.mSessionNodes[0], testtree); - //assert - expect(mocked(vscode.window.showInformationMessage)).toBeCalled(); - }); it("sort by retcode if same sort by increasing id", async () => { const globalMocks = createGlobalMocks(); const testtree = new ZosJobsProvider(); const expected = new ZosJobsProvider(); testtree.mSessionNodes[0].children = [...[globalMocks()[2], globalMocks()[1], globalMocks()[0]]]; expected.mSessionNodes[0].children = [...[globalMocks()[0], globalMocks()[1], globalMocks()[2]]]; - const sortbyretcodespy = jest.spyOn(jobActions, "sortByReturnCode"); + const sortbyretcodespy = jest.spyOn(jobActions, "sortJobsBy"); //act - await jobActions.sortByReturnCode(testtree.mSessionNodes[0], testtree); + await jobActions.sortJobsBy(testtree.mSessionNodes[0], testtree, "retcode"); //asert - expect(sortbyretcodespy).toBeCalledWith(testtree.mSessionNodes[0], testtree); + expect(sortbyretcodespy).toBeCalledWith(testtree.mSessionNodes[0], testtree, "retcode"); expect(sortbyretcodespy).toHaveBeenCalled(); expect(sortbyretcodespy.mock.calls[0][0].children).toStrictEqual(expected.mSessionNodes[0].children); }); diff --git a/packages/zowe-explorer/src/job/actions.ts b/packages/zowe-explorer/src/job/actions.ts index 3322266096..b7dd81ef9e 100644 --- a/packages/zowe-explorer/src/job/actions.ts +++ b/packages/zowe-explorer/src/job/actions.ts @@ -528,35 +528,15 @@ export async function cancelJobs(jobsProvider: IZoweTree, node await Gui.showMessage(localize("cancelJobs.succeeded", "Cancelled selected jobs successfully.")); } } -export async function sortByName(jobs: IZoweJobTreeNode, jobsProvider: IZoweTree): Promise { +export async function sortJobsBy(jobs: IZoweJobTreeNode, jobsProvider: IZoweTree, key: keyof zowe.IJob): Promise { if (jobs["children"].length == 0) { await vscode.window.showInformationMessage("No jobs are present in the profile."); } jobs["children"].sort((x, y) => { - if (x["job"]["jobname"] === y["job"]["jobname"]) { + if (key !== "jobid" && x["job"][key] == y["job"][key]) { return x["job"]["jobid"] > y["job"]["jobid"] ? 1 : -1; } else { - return x["job"]["jobname"] > y["job"]["jobname"] ? 1 : -1; - } - }); - jobsProvider.refresh(); -} -export async function sortById(jobs: IZoweJobTreeNode, jobsProvider: IZoweTree): Promise { - if (jobs["children"].length == 0) { - await vscode.window.showInformationMessage("No jobs are present in the profile."); - } - jobs["children"].sort((x, y) => (x["job"]["jobid"] > y["job"]["jobid"] ? 1 : -1)); - jobsProvider.refresh(); -} -export async function sortByReturnCode(jobs: IZoweJobTreeNode, jobsProvider: IZoweTree): Promise { - if (jobs["children"].length == 0) { - await vscode.window.showInformationMessage("No jobs are present in the profile."); - } - jobs["children"].sort((x, y) => { - if (x["job"]["retcode"] === y["job"]["retcode"]) { - return x["job"]["jobid"] > y["job"]["jobid"] ? 1 : -1; - } else { - return x["job"]["retcode"] > y["job"]["retcode"] ? 1 : -1; + return x["job"][key] > y["job"][key] ? 1 : -1; } }); jobsProvider.refresh(); diff --git a/packages/zowe-explorer/src/job/init.ts b/packages/zowe-explorer/src/job/init.ts index 4571e7e7e9..55cb416fa2 100644 --- a/packages/zowe-explorer/src/job/init.ts +++ b/packages/zowe-explorer/src/job/init.ts @@ -169,10 +169,10 @@ export async function initJobsProvider(context: vscode.ExtensionContext): Promis await jobActions.cancelJobs(jobsProvider, getSelectedNodeList(node, nodeList)); }) ); - context.subscriptions.push(vscode.commands.registerCommand("zowe.jobs.sortbyname", (job) => jobActions.sortByName(job, jobsProvider))); - context.subscriptions.push(vscode.commands.registerCommand("zowe.jobs.sortbyid", (job) => jobActions.sortById(job, jobsProvider))); + context.subscriptions.push(vscode.commands.registerCommand("zowe.jobs.sortbyname", (job) => jobActions.sortJobsBy(job, jobsProvider, "jobname"))); + context.subscriptions.push(vscode.commands.registerCommand("zowe.jobs.sortbyid", (job) => jobActions.sortJobsBy(job, jobsProvider, "jobid"))); context.subscriptions.push( - vscode.commands.registerCommand("zowe.jobs.sortbyreturncode", (job) => jobActions.sortByReturnCode(job, jobsProvider)) + vscode.commands.registerCommand("zowe.jobs.sortbyreturncode", (job) => jobActions.sortJobsBy(job, jobsProvider, "retcode")) ); initSubscribers(context, jobsProvider); return jobsProvider;