Skip to content

Commit ff31c60

Browse files
authored
Merge pull request #2082 from dxc-technology/Mil4n0r/fix_resultset_table_sort
Fixed problem in ResultsetTable when sortValue is missing
2 parents 8c34099 + 027d4cd commit ff31c60

File tree

3 files changed

+169
-3
lines changed

3 files changed

+169
-3
lines changed

packages/lib/src/resultset-table/ResultsetTable.stories.tsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,21 @@ const rowsSortable = [
161161
],
162162
];
163163

164+
const rowsSortableMissingSortValues = [
165+
[{ displayValue: "001" }, { displayValue: "Peter" }, { displayValue: "Miami" }],
166+
[{ displayValue: "002" }, { displayValue: "Louis" }, { displayValue: "London" }],
167+
[
168+
{ displayValue: "003", sortValue: "003" },
169+
{ displayValue: "Aida", sortValue: "Aida" },
170+
{ displayValue: "Wroclaw", sortValue: "Wroclaw" },
171+
],
172+
[
173+
{ displayValue: "004", sortValue: "004" },
174+
{ displayValue: "Lana", sortValue: "Lana" },
175+
{ displayValue: "Amsterdam", sortValue: "Amsterdam" },
176+
],
177+
];
178+
164179
const longColumns = [
165180
{ displayValue: "Column1" },
166181
{ displayValue: "Column2" },
@@ -259,6 +274,10 @@ export const Chromatic = () => (
259274
<Title title="Sortable table" theme="light" level={4} />
260275
<DxcResultsetTable columns={columnsSortable} rows={rowsSortable} />
261276
</ExampleContainer>
277+
<ExampleContainer>
278+
<Title title="Sortable table with missing sortValues" theme="light" level={4} />
279+
<DxcResultsetTable columns={columnsSortable} rows={rowsSortableMissingSortValues} />
280+
</ExampleContainer>
262281
<ExampleContainer>
263282
<Title title="With action" theme="light" level={4} />
264283
<DxcResultsetTable columns={columns} rows={rowsIcon} />
@@ -340,29 +359,36 @@ const ResultsetTableAsc = () => (
340359
<ExampleContainer>
341360
<Title title="Ascendant sorting" theme="light" level={4} />
342361
<DxcResultsetTable columns={columnsSortable} rows={rowsSortable} />
362+
<DxcResultsetTable columns={columnsSortable} rows={rowsSortableMissingSortValues} />
343363
</ExampleContainer>
344364
);
345365

346366
export const AscendentSorting = ResultsetTableAsc.bind({});
347367
AscendentSorting.play = async ({ canvasElement }) => {
348368
const canvas = within(canvasElement);
349369
const idHeader = canvas.getAllByRole("button")[0];
370+
const idHeader2 = canvas.getAllByRole("button")[6];
350371
await userEvent.click(idHeader);
372+
await userEvent.click(idHeader2);
351373
};
352374

353375
const ResultsetTableDesc = () => (
354376
<ExampleContainer>
355377
<Title title="Descendant sorting" theme="light" level={4} />
356378
<DxcResultsetTable columns={columnsSortable} rows={rowsSortable} />
379+
<DxcResultsetTable columns={columnsSortable} rows={rowsSortableMissingSortValues} />
357380
</ExampleContainer>
358381
);
359382

360383
export const DescendantSorting = ResultsetTableDesc.bind({});
361384
DescendantSorting.play = async ({ canvasElement }) => {
362385
const canvas = within(canvasElement);
363386
const nameHeader = canvas.getAllByRole("button")[1];
387+
const nameHeader2 = canvas.getAllByRole("button")[7];
364388
await userEvent.click(nameHeader);
365389
await userEvent.click(nameHeader);
390+
await userEvent.click(nameHeader2);
391+
await userEvent.click(nameHeader2);
366392
};
367393

368394
const ResultsetTableMiddle = () => (

packages/lib/src/resultset-table/ResultsetTable.test.tsx

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,134 @@ const rows = [
179179
],
180180
];
181181

182+
const rowsMissingSortValues = [
183+
[
184+
{
185+
displayValue: "001",
186+
},
187+
{
188+
displayValue: "Peter",
189+
},
190+
{
191+
displayValue: "Oviedo",
192+
},
193+
],
194+
[
195+
{
196+
displayValue: "002",
197+
sortValue: "002",
198+
},
199+
{
200+
displayValue: "Louis",
201+
sortValue: "Louis",
202+
},
203+
{
204+
displayValue: "Oviedo",
205+
sortValue: "Oviedo",
206+
},
207+
],
208+
[
209+
{
210+
displayValue: "003",
211+
},
212+
{
213+
displayValue: "Lana",
214+
},
215+
{
216+
displayValue: "Albacete",
217+
},
218+
],
219+
[
220+
{
221+
displayValue: "004",
222+
sortValue: "004",
223+
},
224+
{
225+
displayValue: "Rick",
226+
sortValue: "Rick",
227+
},
228+
{
229+
displayValue: "Albacete",
230+
sortValue: "Albacete",
231+
},
232+
],
233+
[
234+
{
235+
displayValue: "005",
236+
},
237+
{
238+
displayValue: "Mark",
239+
},
240+
{
241+
displayValue: "Madrid",
242+
},
243+
],
244+
[
245+
{
246+
displayValue: "006",
247+
sortValue: "006",
248+
},
249+
{
250+
displayValue: "Cris",
251+
sortValue: "Cris",
252+
},
253+
{
254+
displayValue: "Barcelona",
255+
sortValue: "Barcelona",
256+
},
257+
],
258+
[
259+
{
260+
displayValue: "007",
261+
},
262+
{
263+
displayValue: "Susan",
264+
},
265+
{
266+
displayValue: "Madrid",
267+
},
268+
],
269+
[
270+
{
271+
displayValue: "008",
272+
sortValue: "008",
273+
},
274+
{
275+
displayValue: "Tina",
276+
sortValue: "Tina",
277+
},
278+
{
279+
displayValue: "Barcelona",
280+
sortValue: "Barcelona",
281+
},
282+
],
283+
[
284+
{
285+
displayValue: "009",
286+
},
287+
{
288+
displayValue: "Kevin",
289+
},
290+
{
291+
displayValue: "Oviedo",
292+
},
293+
],
294+
[
295+
{
296+
displayValue: "010",
297+
sortValue: "010",
298+
},
299+
{
300+
displayValue: "Cosmin",
301+
sortValue: "Cosmin",
302+
},
303+
{
304+
displayValue: "Barcelona",
305+
sortValue: "Barcelona",
306+
},
307+
],
308+
];
309+
182310
const columnsWithCheckbox = [
183311
{ displayValue: "Id", isSortable: true },
184312
{ displayValue: "Checkbox", isSortable: false },
@@ -283,6 +411,18 @@ describe("Resultset table component tests", () => {
283411
expect(component.queryByText("Cosmin")).not.toBeTruthy();
284412
});
285413

414+
test("Resultset table sort rows by column even if they are missing sortValues", () => {
415+
const component = render(<DxcResultsetTable columns={columns} rows={rowsMissingSortValues} itemsPerPage={3} />);
416+
expect(component.queryByText("Peter")).toBeTruthy();
417+
fireEvent.click(component.queryByText("Name"));
418+
expect(component.queryByText("Tina")).not.toBeTruthy();
419+
expect(component.queryByText("Cosmin")).toBeTruthy();
420+
421+
fireEvent.click(component.queryByText("Name"));
422+
expect(component.queryByText("Tina")).toBeTruthy();
423+
expect(component.queryByText("Cosmin")).not.toBeTruthy();
424+
});
425+
286426
test("Resultset table should go one page back when removing the last page data", () => {
287427
const { getAllByRole, queryByText, rerender } = render(
288428
<DxcResultsetTable columns={columns} rows={rows} itemsPerPage={3} />

packages/lib/src/resultset-table/ResultsetTable.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import useTheme from "../useTheme";
99
import icons from "./Icons";
1010
import ResultsetTablePropsType, { Column, Row } from "./types";
1111

12-
const normalizeSortValue = (sortValue: string | React.ReactNode) =>
12+
const normalizeSortValue = (sortValue: string | Date | React.ReactNode) =>
1313
typeof sortValue === "string" ? sortValue.toUpperCase() : sortValue;
1414

1515
const isDateType = (value: React.ReactNode | Date): boolean => {
@@ -18,8 +18,8 @@ const isDateType = (value: React.ReactNode | Date): boolean => {
1818

1919
const sortArray = (index: number, order: "ascending" | "descending", resultset: { id: string; cells: Row }[]) =>
2020
resultset.slice().sort((element1, element2) => {
21-
const sortValueA = normalizeSortValue(element1.cells[index].sortValue || element1[index].displayValue);
22-
const sortValueB = normalizeSortValue(element2.cells[index].sortValue || element2[index].displayValue);
21+
const sortValueA = normalizeSortValue(element1?.cells[index]?.sortValue || element1?.cells[index]?.displayValue);
22+
const sortValueB = normalizeSortValue(element2?.cells[index]?.sortValue || element2?.cells[index]?.displayValue);
2323
let comparison = 0;
2424
if (typeof sortValueA === "object" && !isDateType(sortValueA)) {
2525
comparison = -1;

0 commit comments

Comments
 (0)