From 8c4e7d331efc528ea73ec0a24baa37cd1fefdaf6 Mon Sep 17 00:00:00 2001 From: Vicky Bansal <67091118+vicky-primathon@users.noreply.github.com> Date: Wed, 27 Oct 2021 11:43:48 +0530 Subject: [PATCH] feat: Set selectedRow for multiple row selection in table widget (#7935) --- .../src/widgets/TableWidget/widget/derived.js | 26 +- .../TableWidget/widget/derived.test.js | 224 ++++++++++++++++++ 2 files changed, 245 insertions(+), 5 deletions(-) diff --git a/app/client/src/widgets/TableWidget/widget/derived.js b/app/client/src/widgets/TableWidget/widget/derived.js index 7b174442e1..1ef056c424 100644 --- a/app/client/src/widgets/TableWidget/widget/derived.js +++ b/app/client/src/widgets/TableWidget/widget/derived.js @@ -1,11 +1,27 @@ /* eslint-disable @typescript-eslint/no-unused-vars*/ export default { getSelectedRow: (props, moment, _) => { - const selectedRowIndex = - props.selectedRowIndex === undefined || - Number.isNaN(parseInt(props.selectedRowIndex)) - ? -1 - : parseInt(props.selectedRowIndex); + let selectedRowIndices = []; + if ( + Array.isArray(props.selectedRowIndices) && + props.selectedRowIndices.every((el) => typeof el === "number") + ) { + selectedRowIndices = props.selectedRowIndices; + } else if (typeof props.selectedRowIndices === "number") { + selectedRowIndices = [props.selectedRowIndices]; + } + let selectedRowIndex; + if (props.multiRowSelection) { + selectedRowIndex = selectedRowIndices.length + ? selectedRowIndices[selectedRowIndices.length - 1] + : -1; + } else { + selectedRowIndex = + props.selectedRowIndex === undefined || + Number.isNaN(parseInt(props.selectedRowIndex)) + ? -1 + : parseInt(props.selectedRowIndex); + } const filteredTableData = props.filteredTableData || props.sanitizedTableData || []; if (selectedRowIndex === -1) { diff --git a/app/client/src/widgets/TableWidget/widget/derived.test.js b/app/client/src/widgets/TableWidget/widget/derived.test.js index 25416f13cc..cdb1088e3a 100644 --- a/app/client/src/widgets/TableWidget/widget/derived.test.js +++ b/app/client/src/widgets/TableWidget/widget/derived.test.js @@ -824,3 +824,227 @@ describe("Validates Derived Properties", () => { expect(result).toStrictEqual(expected); }); }); + +describe("Validate getSelectedRow function", () => { + it("Multple row selection, with selected rows", () => { + const { getSelectedRow } = derivedProperty; + const input = { + multiRowSelection: true, + selectedRowIndices: [0, 1], + selectedRowIndex: 1, + sanitizedTableData: [ + { id: 1234, name: "Jim Doe", extra: "", __originalIndex__: 0 }, + { id: 234, name: "Jane Doe", extra: "Extra2", __originalIndex__: 2 }, + { id: 123, name: "John Doe", extra: "Extra1", __originalIndex__: 1 }, + ], + }; + expect(getSelectedRow(input, moment, _)).toStrictEqual({ + id: 234, + name: "Jane Doe", + extra: "Extra2", + __originalIndex__: 2, + }); + }); + + it("Multple row selection, with no selected rows", () => { + const { getSelectedRow } = derivedProperty; + const input = { + multiRowSelection: true, + selectedRowIndices: [], + selectedRowIndex: 1, + sanitizedTableData: [ + { id: 1234, name: "Jim Doe", extra: "", __originalIndex__: 0 }, + { id: 234, name: "Jane Doe", extra: "Extra2", __originalIndex__: 2 }, + { id: 123, name: "John Doe", extra: "Extra1", __originalIndex__: 1 }, + ], + }; + expect(getSelectedRow(input, moment, _)).toStrictEqual({ + id: "", + name: "", + extra: "", + __originalIndex__: "", + }); + }); + + it("Single row selection, with selected row", () => { + const { getSelectedRow } = derivedProperty; + const input = { + multiRowSelection: false, + selectedRowIndices: [], + selectedRowIndex: 1, + sanitizedTableData: [ + { id: 1234, name: "Jim Doe", extra: "", __originalIndex__: 0 }, + { id: 234, name: "Jane Doe", extra: "Extra2", __originalIndex__: 2 }, + { id: 123, name: "John Doe", extra: "Extra1", __originalIndex__: 1 }, + ], + }; + expect(getSelectedRow(input, moment, _)).toStrictEqual({ + id: 234, + name: "Jane Doe", + extra: "Extra2", + __originalIndex__: 2, + }); + }); + + it("Single row selection, without selected row", () => { + const { getSelectedRow } = derivedProperty; + const input = { + multiRowSelection: true, + selectedRowIndices: [], + selectedRowIndex: -1, + sanitizedTableData: [ + { id: 1234, name: "Jim Doe", extra: "", __originalIndex__: 0 }, + { id: 234, name: "Jane Doe", extra: "Extra2", __originalIndex__: 2 }, + { id: 123, name: "John Doe", extra: "Extra1", __originalIndex__: 1 }, + ], + }; + + expect(getSelectedRow(input, moment, _)).toStrictEqual({ + id: "", + name: "", + extra: "", + __originalIndex__: "", + }); + }); + + it("Single row selection, with invalid indices", () => { + const { getSelectedRow } = derivedProperty; + const input = { + multiRowSelection: true, + selectedRowIndices: ["test"], + selectedRowIndex: -1, + sanitizedTableData: [ + { id: 1234, name: "Jim Doe", extra: "", __originalIndex__: 0 }, + { id: 234, name: "Jane Doe", extra: "Extra2", __originalIndex__: 2 }, + { id: 123, name: "John Doe", extra: "Extra1", __originalIndex__: 1 }, + ], + }; + + expect(getSelectedRow(input, moment, _)).toStrictEqual({ + id: "", + name: "", + extra: "", + __originalIndex__: "", + }); + }); + it("Single row selection, with indices undefined", () => { + const { getSelectedRow } = derivedProperty; + const input = { + multiRowSelection: true, + selectedRowIndices: undefined, + selectedRowIndex: -1, + sanitizedTableData: [ + { id: 1234, name: "Jim Doe", extra: "", __originalIndex__: 0 }, + { id: 234, name: "Jane Doe", extra: "Extra2", __originalIndex__: 2 }, + { id: 123, name: "John Doe", extra: "Extra1", __originalIndex__: 1 }, + ], + }; + + expect(getSelectedRow(input, moment, _)).toStrictEqual({ + id: "", + name: "", + extra: "", + __originalIndex__: "", + }); + }); + it("Single row selection, with invalid indices", () => { + const { getSelectedRow } = derivedProperty; + const input = { + multiRowSelection: true, + selectedRowIndices: [undefined], + selectedRowIndex: -1, + sanitizedTableData: [ + { id: 1234, name: "Jim Doe", extra: "", __originalIndex__: 0 }, + { id: 234, name: "Jane Doe", extra: "Extra2", __originalIndex__: 2 }, + { id: 123, name: "John Doe", extra: "Extra1", __originalIndex__: 1 }, + ], + }; + + expect(getSelectedRow(input, moment, _)).toStrictEqual({ + id: "", + name: "", + extra: "", + __originalIndex__: "", + }); + }); + it("Single row selection, with invalid indices", () => { + const { getSelectedRow } = derivedProperty; + const input = { + multiRowSelection: true, + selectedRowIndices: [null], + selectedRowIndex: -1, + sanitizedTableData: [ + { id: 1234, name: "Jim Doe", extra: "", __originalIndex__: 0 }, + { id: 234, name: "Jane Doe", extra: "Extra2", __originalIndex__: 2 }, + { id: 123, name: "John Doe", extra: "Extra1", __originalIndex__: 1 }, + ], + }; + + expect(getSelectedRow(input, moment, _)).toStrictEqual({ + id: "", + name: "", + extra: "", + __originalIndex__: "", + }); + }); + it("Single row selection, with invalid indices", () => { + const { getSelectedRow } = derivedProperty; + const input = { + multiRowSelection: true, + selectedRowIndices: ["1", "2"], + selectedRowIndex: -1, + sanitizedTableData: [ + { id: 1234, name: "Jim Doe", extra: "", __originalIndex__: 0 }, + { id: 234, name: "Jane Doe", extra: "Extra2", __originalIndex__: 2 }, + { id: 123, name: "John Doe", extra: "Extra1", __originalIndex__: 1 }, + ], + }; + + expect(getSelectedRow(input, moment, _)).toStrictEqual({ + id: "", + name: "", + extra: "", + __originalIndex__: "", + }); + }); + it("Single row selection, with invalid indices", () => { + const { getSelectedRow } = derivedProperty; + const input = { + multiRowSelection: true, + selectedRowIndices: "1", + selectedRowIndex: -1, + sanitizedTableData: [ + { id: 1234, name: "Jim Doe", extra: "", __originalIndex__: 0 }, + { id: 234, name: "Jane Doe", extra: "Extra2", __originalIndex__: 2 }, + { id: 123, name: "John Doe", extra: "Extra1", __originalIndex__: 1 }, + ], + }; + + expect(getSelectedRow(input, moment, _)).toStrictEqual({ + id: "", + name: "", + extra: "", + __originalIndex__: "", + }); + }); + it("Single row selection, with invalid indices", () => { + const { getSelectedRow } = derivedProperty; + const input = { + multiRowSelection: true, + selectedRowIndices: "test", + selectedRowIndex: -1, + sanitizedTableData: [ + { id: 1234, name: "Jim Doe", extra: "", __originalIndex__: 0 }, + { id: 234, name: "Jane Doe", extra: "Extra2", __originalIndex__: 2 }, + { id: 123, name: "John Doe", extra: "Extra1", __originalIndex__: 1 }, + ], + }; + + expect(getSelectedRow(input, moment, _)).toStrictEqual({ + id: "", + name: "", + extra: "", + __originalIndex__: "", + }); + }); +});