diff --git a/airbyte-webapp/src/components/EntityTable/ImplementationTable.tsx b/airbyte-webapp/src/components/EntityTable/ImplementationTable.tsx index bc4ff6c8afd8..ef8a65191bd8 100644 --- a/airbyte-webapp/src/components/EntityTable/ImplementationTable.tsx +++ b/airbyte-webapp/src/components/EntityTable/ImplementationTable.tsx @@ -1,7 +1,8 @@ -import React from "react"; +import React, { useCallback } from "react"; import styled from "styled-components"; import { FormattedMessage } from "react-intl"; import { CellProps } from "react-table"; +import queryString from "query-string"; import Table from "components/Table"; @@ -9,8 +10,10 @@ import LastSyncCell from "./components/LastSyncCell"; import ConnectorCell from "./components/ConnectorCell"; import NameCell from "./components/NameCell"; import ConnectEntitiesCell from "./components/ConnectEntitiesCell"; -import { EntityTableDataItem } from "./types"; +import { EntityTableDataItem, SortOrderEnum } from "./types"; import AllConnectionsStatusCell from "./components/AllConnectionsStatusCell"; +import useRouter from "hooks/useRouter"; +import SortButton from "./components/SortButton"; const Content = styled.div` margin: 0 32px 0 27px; @@ -27,10 +30,64 @@ const ImplementationTable: React.FC = ({ entity, onClickRow, }) => { + const { query, push } = useRouter(); + const sortBy = query.sortBy || "entity"; + const sortOrder = query.order || SortOrderEnum.ASC; + + const onSortClick = useCallback( + (field: string) => { + const order = + sortBy !== field + ? SortOrderEnum.ASC + : sortOrder === SortOrderEnum.ASC + ? SortOrderEnum.DESC + : SortOrderEnum.ASC; + push({ + search: queryString.stringify( + { + sortBy: field, + order: order, + }, + { skipNull: true } + ), + }); + }, + [push, sortBy, sortOrder] + ); + + const sortData = useCallback( + (a, b) => { + const result = a[`${sortBy}Name`] + .toLowerCase() + .localeCompare(b[`${sortBy}Name`].toLowerCase()); + + if (sortOrder === SortOrderEnum.DESC) { + return -1 * result; + } + + return result; + }, + [sortBy, sortOrder] + ); + + const sortingData = React.useMemo(() => data.sort(sortData), [ + sortData, + data, + ]); + const columns = React.useMemo( () => [ { - Header: , + Header: ( + <> + + onSortClick("entity")} + /> + + ), headerHighlighted: true, accessor: "entityName", customWidth: 40, @@ -39,7 +96,16 @@ const ImplementationTable: React.FC = ({ ), }, { - Header: , + Header: ( + <> + + onSortClick("connector")} + /> + + ), accessor: "connectorName", Cell: ({ cell, row }: CellProps) => ( = ({ ), }, { - Header: , + Header: ( + <> + + onSortClick("destination")} + /> + + ), accessor: "connectEntities", Cell: ({ cell, row }: CellProps) => ( = ({ ), }, ], - [entity] + [entity, onSortClick, sortBy, sortOrder] ); return ( diff --git a/airbyte-webapp/src/components/Table/Table.tsx b/airbyte-webapp/src/components/Table/Table.tsx index cc1d36d7ee0a..36dbd3e70ea1 100644 --- a/airbyte-webapp/src/components/Table/Table.tsx +++ b/airbyte-webapp/src/components/Table/Table.tsx @@ -142,6 +142,7 @@ const Table: React.FC = ({ } return [pl, plConfig]; }, [sortBy]); + const { getTableProps, getTableBodyProps,