import { useCollection } from "@awsui/collection-hooks"; import { Box, Button, Pagination, SpaceBetween, Table, TableProps, TextFilter } from "@awsui/components-react"; import React, { useMemo, useState } from "react"; import { useHistory, useLocation } from "react-router"; import { usePortingAssistantSelector } from "../../createReduxStore"; import { HistoryState } from "../../models/locationState"; import { selectFileTableData } from "../../store/selectors/tableSelectors"; import { filteringCountText } from "../../utils/FilteringCountText"; import { InfoLink } from "../InfoLink"; import { LinkComponent } from "../LinkComponent"; import { TableHeader } from "../TableHeader"; export interface SourceFile { solutionPath: string; projectPath: string; sourceFilePath: string; incompatibleApis: number; totalApis: number; portability: string; portabilityNumber: number; isProjectPage: boolean; } const FileTableInternal: React.FC = () => { const location = useLocation(); const history = useHistory(); const [selected, setSelected] = useState([]); const tableItems = usePortingAssistantSelector(state => selectFileTableData(state, location.pathname)); const isLoading = useMemo(() => tableItems == null, [tableItems]); const loadedItems = useMemo(() => tableItems || [], [tableItems]); const { items, filteredItemsCount, collectionProps, filterProps, paginationProps } = useCollection(loadedItems, { filtering: { filteringFunction: (item, filterText) => { var exactMatch = false; if (filterText === "") return true; else { const filterItems = filterText.toLowerCase().split(";"); return filterItems.some(fitem => { if (fitem.charAt(0) === '"' && fitem.charAt(fitem.length - 1) === '"') exactMatch = true; return exactMatch ? item.sourceFilePath.toLowerCase() === fitem.slice(1, -1) : item.sourceFilePath.toLowerCase().includes(fitem); }); } }, defaultFilteringText: location.state?.activeFilter || "", empty: empty, noMatch: noMatch }, pagination: {}, sorting: {} }); return ( {...collectionProps} loadingText="Loading source files" columnDefinitions={columnDefinitions} loading={isLoading} items={items} selectionType="single" trackBy="sourceFilePath" selectedItems={selected} onSelectionChange={event => setSelected(event.detail.selectedItems)} filter={ } pagination={} header={ Select a source file to view the incompatible API calls and replacement suggestions in the source code. Columns Source file name - Name of the source file. Incompatible API calls - The number of incompatible API calls in the source file. } learnMoreLinks={[]} /> } totalItems={loadedItems} actionButtons={ } /> } empty={empty} > ); }; const PAGE_SIZE = 10; const empty = ( No source files No source files to display. ); const noMatch = ( No matches We can’t find a match. ); const columnDefinitions: TableProps.ColumnDefinition[] = [ { id: "source-file", header: "Source file name", cell: item => ( {window.electron.getRelativePath( item.isProjectPage ? item.projectPath : item.solutionPath, item.sourceFilePath )} ), sortingField: "sourceFilePath", sortingComparator: (a: SourceFile, b: SourceFile) => { const aPath = window.electron.getRelativePath(a.isProjectPage ? a.projectPath : a.solutionPath, a.sourceFilePath); const bPath = window.electron.getRelativePath(b.isProjectPage ? b.projectPath : b.solutionPath, b.sourceFilePath); return aPath.localeCompare(bPath); } }, { id: "incompatible-api-calls", header: "Incompatible API calls", cell: item => `${item.incompatibleApis} of ${item.totalApis}`, sortingField: "incompatibleApis", sortingComparator: (a: SourceFile, b: SourceFile) => a.incompatibleApis - b.incompatibleApis } ]; export const FileTable = React.memo(FileTableInternal);