fix(plugin-chart-table): sort alphanumeric columns case insensitive (#17765)

This commit is contained in:
Kamil Gabryjelski 2021-12-15 19:48:25 +01:00 committed by GitHub
parent 274fb37a91
commit 82b47cacba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 178 additions and 0 deletions

View File

@ -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;
@ -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,
@ -174,6 +179,7 @@ export default function DataTable<D extends object>({
initialState,
getTableSize: defaultGetTableSize,
globalFilter: defaultGlobalFilter,
sortTypes,
...moreUseTableOptions,
},
...tableHooks,

View File

@ -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;
};

View File

@ -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',
},
},
]);
});
});