From fff4fd5b0413622608c948d13ee172ba156aef32 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Thu, 14 Jan 2021 21:17:23 +0100 Subject: [PATCH] Maintain expanded state of JobStep during polling The InvocationStepProvider updates the invocation state in 3 second intervals, and with it the jobs array. The new jobs in the array don't have the _showDetails attribute, so all expanded view will be reset. This fixes that by keeping a component local state for the _showDetails attribute. --- .../WorkflowInvocationState/JobStep.test.js | 71 +++++++++++++++++++ .../WorkflowInvocationState/JobStep.vue | 35 ++++++--- .../test/json/jobs.json | 24 +++++++ 3 files changed, 122 insertions(+), 8 deletions(-) create mode 100644 client/src/components/WorkflowInvocationState/JobStep.test.js create mode 100644 client/src/components/WorkflowInvocationState/test/json/jobs.json diff --git a/client/src/components/WorkflowInvocationState/JobStep.test.js b/client/src/components/WorkflowInvocationState/JobStep.test.js new file mode 100644 index 00000000000..ed21349cb4c --- /dev/null +++ b/client/src/components/WorkflowInvocationState/JobStep.test.js @@ -0,0 +1,71 @@ +import BootstrapVue from "bootstrap-vue"; +import JobStep from "./JobStep"; +import { mount } from "@vue/test-utils"; +import jobs from "./test/json/jobs.json"; + +jest.mock("../History/caching"); + +import { createLocalVue } from "@vue/test-utils"; + +// create an extended `Vue` constructor +const localVue = createLocalVue(); + +// install plugins as normal +localVue.use(BootstrapVue); + +describe("DatasetUIWrapper.vue with Dataset", () => { + let wrapper; + let propsData; + + beforeEach(async () => { + propsData = { + jobs: jobs, + }; + wrapper = mount(JobStep, { + localVue, + propsData, + stubs: { + JobProvider: { template: "
I am expanded
" }, + }, + }); + }); + test("it renders a table with 2 jobs", async () => { + expect(wrapper.find("tbody").findAll("tr").length).toBe(2); + }); + test("it expands on row click", async () => { + // verify no item is expanded + expect(wrapper.vm.toggledItems["1"]).toBe(undefined); + expect(wrapper.find(".expanded").exists()).toBeFalsy(); + // expand + wrapper.find("tbody").find("tbody").find("tr").trigger("click"); + await localVue.nextTick(); + expect(wrapper.vm.toggledItems["1"]).toBeTruthy(); + expect(wrapper.find(".expanded").exists()).toBeTruthy(); + wrapper.find("tbody").find("tbody").find("tr").trigger("click"); + // close again + await localVue.nextTick(); + expect(wrapper.vm.toggledItems["1"]).toBeFalsy(); + expect(wrapper.find(".expanded").exists()).toBeFalsy(); + }); + test("it sustains expanded on prop update", async () => { + // verify no item is expanded + expect(wrapper.vm.toggledItems["1"]).toBe(undefined); + expect(wrapper.find(".expanded").exists()).toBeFalsy(); + // expand + wrapper.find("tbody").find("tbody").find("tr").trigger("click"); + await localVue.nextTick(); + expect(wrapper.vm.toggledItems["1"]).toBeTruthy(); + expect(wrapper.find(".expanded").exists()).toBeTruthy(); + // 2 collapsed rows, plus 1 expanded row + expect(wrapper.find("tbody").findAll("tr").length).toBe(3); + // update data + const additionalJob = { ...jobs[0], id: 3 }; + wrapper.setProps({ jobs: [...jobs, additionalJob] }); + await localVue.nextTick(); + // verify new data is displayed + expect(wrapper.find("tbody").findAll("tr").length).toBe(4); + // verify first row is still expanded + expect(wrapper.vm.toggledItems["1"]).toBeTruthy(); + expect(wrapper.find(".expanded").exists()).toBeTruthy(); + }); +}); diff --git a/client/src/components/WorkflowInvocationState/JobStep.vue b/client/src/components/WorkflowInvocationState/JobStep.vue index 459d3d2108c..f01ef24f404 100644 --- a/client/src/components/WorkflowInvocationState/JobStep.vue +++ b/client/src/components/WorkflowInvocationState/JobStep.vue @@ -1,13 +1,6 @@