Skip to content

Commit

Permalink
fix(plugin-chart-table): sort alphanumeric columns case insensitive (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
kgabryje committed Dec 15, 2021
1 parent 274fb37 commit 82b47ca
Show file tree
Hide file tree
Showing 3 changed files with 178 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import SelectPageSize, {
import SimplePagination from './components/Pagination';
import useSticky from './hooks/useSticky';
import { PAGE_SIZE_OPTIONS } from '../consts';
import { sortAlphanumericCaseInsensitive } from './utils/sortAlphanumericCaseInsensitive';

export interface DataTableProps<D extends object> extends TableOptions<D> {
tableClassName?: string;
Expand All @@ -68,6 +69,10 @@ export interface RenderHTMLCellProps extends HTMLProps<HTMLTableCellElement> {
cellContent: ReactNode;
}

const sortTypes = {
alphanumeric: sortAlphanumericCaseInsensitive,
};

// Be sure to pass our updateMyData and the skipReset option
export default function DataTable<D extends object>({
tableClassName,
Expand Down Expand Up @@ -174,6 +179,7 @@ export default function DataTable<D extends object>({
initialState,
getTableSize: defaultGetTableSize,
globalFilter: defaultGlobalFilter,
sortTypes,
...moreUseTableOptions,
},
...tableHooks,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/

import { Row } from 'react-table';

export const sortAlphanumericCaseInsensitive = <D extends {}>(
rowA: Row<D>,
rowB: Row<D>,
columnId: string,
) => {
const valueA = rowA.values[columnId];
const valueB = rowB.values[columnId];

if (!valueA || typeof valueA !== 'string') {
return -1;
}
if (!valueB || typeof valueB !== 'string') {
return 1;
}
return valueA.localeCompare(valueB) > 0 ? 1 : -1;
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/

import { sortAlphanumericCaseInsensitive } from '../src/DataTable/utils/sortAlphanumericCaseInsensitive';

const testData = [
{
values: {
col: 'test value',
},
},
{
values: {
col: 'a lowercase test value',
},
},
{
values: {
col: '5',
},
},
{
values: {
col: NaN,
},
},
{
values: {
col: '1234',
},
},
{
values: {
col: Infinity,
},
},
{
values: {
col: '.!# value starting with non-letter characters',
},
},
{
values: {
col: 'An uppercase test value',
},
},
{
values: {
col: undefined,
},
},
{
values: {
col: null,
},
},
];

describe('sortAlphanumericCaseInsensitive', () => {
it('Sort rows', () => {
const sorted = [...testData].sort((a, b) =>
// @ts-ignore
sortAlphanumericCaseInsensitive(a, b, 'col'),
);

expect(sorted).toEqual([
{
values: {
col: null,
},
},
{
values: {
col: undefined,
},
},
{
values: {
col: Infinity,
},
},
{
values: {
col: NaN,
},
},
{
values: {
col: '.!# value starting with non-letter characters',
},
},
{
values: {
col: '1234',
},
},
{
values: {
col: '5',
},
},
{
values: {
col: 'a lowercase test value',
},
},
{
values: {
col: 'An uppercase test value',
},
},
{
values: {
col: 'test value',
},
},
]);
});
});

0 comments on commit 82b47ca

Please sign in to comment.