From 404b0ea5a97b62f45b9a99340c576c791f584e21 Mon Sep 17 00:00:00 2001 From: cmp5987 <32434695+cmp5987@users.noreply.github.com> Date: Sat, 24 Feb 2024 05:12:02 +0000 Subject: [PATCH 1/2] feat(repo): Represent repos in UI --- tavern/internal/www/src/App.tsx | 5 + tavern/internal/www/src/assets/tome_write.png | Bin 0 -> 6148 bytes .../www/src/components/TomeAccordion.tsx | 15 +- .../components/page-wrapper/PageWrapper.tsx | 2 + .../src/components/tavern-base-ui/Table.tsx | 196 ++++++++++-------- tavern/internal/www/src/pages/tomes/Tomes.tsx | 38 ++++ .../tomes/components/RepositoryTable.tsx | 136 ++++++++++++ .../pages/tomes/hooks/useRepositoryView.ts | 44 ++++ tavern/internal/www/src/pages/tomes/index.tsx | 1 + tavern/internal/www/src/utils/consts.ts | 14 +- tavern/internal/www/src/utils/enums.ts | 3 +- tavern/internal/www/src/utils/queries.ts | 43 ++++ tavern/internal/www/src/utils/utils.ts | 4 +- 13 files changed, 400 insertions(+), 101 deletions(-) create mode 100644 tavern/internal/www/src/assets/tome_write.png create mode 100644 tavern/internal/www/src/pages/tomes/Tomes.tsx create mode 100644 tavern/internal/www/src/pages/tomes/components/RepositoryTable.tsx create mode 100644 tavern/internal/www/src/pages/tomes/hooks/useRepositoryView.ts create mode 100644 tavern/internal/www/src/pages/tomes/index.tsx diff --git a/tavern/internal/www/src/App.tsx b/tavern/internal/www/src/App.tsx index a8c47c4c1..0eb7d891e 100644 --- a/tavern/internal/www/src/App.tsx +++ b/tavern/internal/www/src/App.tsx @@ -15,6 +15,7 @@ import Tasks from "./pages/tasks/Tasks"; import HostList from "./pages/host-list/HostList"; import HostDetails from "./pages/host-details/HostDetails"; import { Dashboard } from "./pages/dashboard"; +import { Tomes } from "./pages/tomes"; const router = createBrowserRouter([ @@ -50,6 +51,10 @@ const router = createBrowserRouter([ path: "/tasks", element: , }, + { + path: "/tomes", + element: , + }, ]); export const App = () => { diff --git a/tavern/internal/www/src/assets/tome_write.png b/tavern/internal/www/src/assets/tome_write.png new file mode 100644 index 0000000000000000000000000000000000000000..36992dd9958ff91de29d180df8804cd474e170f7 GIT binary patch literal 6148 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 MYZ_|QsX0Xb57fJV!2kdN literal 0 HcmV?d00001 diff --git a/tavern/internal/www/src/components/TomeAccordion.tsx b/tavern/internal/www/src/components/TomeAccordion.tsx index b6918a809..7ade18885 100644 --- a/tavern/internal/www/src/components/TomeAccordion.tsx +++ b/tavern/internal/www/src/components/TomeAccordion.tsx @@ -5,6 +5,7 @@ import { Tome, TomeParams } from "../utils/consts"; type Props = { tome: Tome, params: Array, + noParamValues?: boolean } const TomeAccordion = (props: Props) => { const { tome, params } = props; @@ -46,12 +47,14 @@ const TomeAccordion = (props: Props) => { {params && params.length > 0 && (
{params.map((paramDef: TomeParams) => { - return ( -
-
{paramDef.name}
-
{paramDef.value}
-
- ) + if (paramDef.value) { + return ( +
+
{paramDef.name}
+
{paramDef.value}
+
+ ) + } })}
)} diff --git a/tavern/internal/www/src/components/page-wrapper/PageWrapper.tsx b/tavern/internal/www/src/components/page-wrapper/PageWrapper.tsx index ffdfdd017..0659b463e 100644 --- a/tavern/internal/www/src/components/page-wrapper/PageWrapper.tsx +++ b/tavern/internal/www/src/components/page-wrapper/PageWrapper.tsx @@ -10,6 +10,7 @@ import { WrenchScrewdriverIcon, BugAntIcon, PresentationChartBarIcon, + BookOpenIcon, } from '@heroicons/react/24/outline' import logo from '../../assets/eldrich.png'; @@ -23,6 +24,7 @@ const navigation = [ { name: PageNavItem.hosts, href: '/hosts', icon: BugAntIcon, internal: true }, { name: PageNavItem.quests, href: '/quests', icon: ClockIcon, internal: true }, { name: PageNavItem.tasks, href: '/tasks', icon: ClipboardDocumentCheckIcon, internal: true }, + { name: PageNavItem.tomes, href: '/tomes', icon: BookOpenIcon, internal: true }, { name: PageNavItem.documentation, href: 'https://docs.realm.pub/', icon: DocumentDuplicateIcon, target: "__blank", internal: false }, { name: PageNavItem.playground, href: '/playground', icon: WrenchScrewdriverIcon, target: "__blank", internal: false }, ] diff --git a/tavern/internal/www/src/components/tavern-base-ui/Table.tsx b/tavern/internal/www/src/components/tavern-base-ui/Table.tsx index 1d4966ebd..2414ec901 100644 --- a/tavern/internal/www/src/components/tavern-base-ui/Table.tsx +++ b/tavern/internal/www/src/components/tavern-base-ui/Table.tsx @@ -5,7 +5,9 @@ import { getCoreRowModel, ColumnDef, flexRender, - getSortedRowModel + getSortedRowModel, + Row, + getExpandedRowModel } from '@tanstack/react-table' import { TriangleDownIcon, TriangleUpIcon } from '@chakra-ui/icons' @@ -15,101 +17,115 @@ export type TableSorting = { } type TableProps = { - data: TData[], - columns: ColumnDef[], - onRowClick?: (e: any) => void, + data: TData[], + columns: ColumnDef[], + onRowClick?: (e: any) => void, + renderSubComponent?: (props: { row: Row }) => React.ReactElement, + getRowCanExpand?: (row: Row) => boolean } export const Table = ({ + data, + columns, + renderSubComponent, + getRowCanExpand, + onRowClick, +}: TableProps): JSX.Element => { + const table = useReactTable({ data, columns, - onRowClick, - }: TableProps): JSX.Element => { - const table = useReactTable({ - data, - columns, - getCoreRowModel: getCoreRowModel(), - getSortedRowModel: getSortedRowModel(), - }) + getRowCanExpand, + getCoreRowModel: getCoreRowModel(), + getSortedRowModel: getSortedRowModel(), + getExpandedRowModel: getExpandedRowModel(), + }) - const tbodyRef = React.useRef(null); - // Function to handle key press on a row - const handleKeyDown = ( event:any, row:any ) => { - event.stopPropagation(); - if(onRowClick && event.key === "Enter"){ - onRowClick(row); - } - }; + const tbodyRef = React.useRef(null); + // Function to handle key press on a row + const handleKeyDown = (event: any, row: any) => { + event.stopPropagation(); + if (onRowClick && event.key === "Enter") { + onRowClick(row); + } + }; - return ( -
-
- - - {table.getHeaderGroups().map(headerGroup => ( - - {headerGroup.headers.map(header => { - return ( - - ) - })} - - ))} - - - {table.getRowModel().rows.map(row => { - return ( - - onRowClick && onRowClick(row)} tabIndex={0} onKeyDown={(e) => handleKeyDown(e, row)} className={onRowClick && `hover:cursor-pointer hover:bg-gray-100`}> - {/* first row is a normal row */} - {row.getVisibleCells().map(cell => { - return ( - - ) - })} + return ( +
+
+
- {header.isPlaceholder ? null : ( -
- {flexRender( - header.column.columnDef.header, - header.getContext() - )} - {{ - asc: , - desc: - }[header.column.getIsSorted() as string] ?? null} -
- )} -
- {flexRender( - cell.column.columnDef.cell, - cell.getContext() - )} -
+ + {table.getHeaderGroups().map(headerGroup => ( + + {headerGroup.headers.map(header => { + return ( + + ) + })} + + ))} + + + {table.getRowModel().rows.map(row => { + return ( + + onRowClick && onRowClick(row)} tabIndex={0} onKeyDown={(e) => handleKeyDown(e, row)} className={onRowClick && `hover:cursor-pointer hover:bg-gray-100`}> + {/* first row is a normal row */} + {row.getVisibleCells().map(cell => { + return ( + + ) + })} + + {row.getIsExpanded() && ( + + {/* 2nd row is a custom 1 cell row */} + - - ) - })} - -
+ {header.isPlaceholder ? null : ( +
+ {flexRender( + header.column.columnDef.header, + header.getContext() + )} + {{ + asc: , + desc: + }[header.column.getIsSorted() as string] ?? null} +
+ )} +
+ {flexRender( + cell.column.columnDef.cell, + cell.getContext() + )} +
+ {renderSubComponent && renderSubComponent({ row })} +
-
- ) + )} + + ) + })} + + +
+ ) } -export default Table; \ No newline at end of file +export default Table; diff --git a/tavern/internal/www/src/pages/tomes/Tomes.tsx b/tavern/internal/www/src/pages/tomes/Tomes.tsx new file mode 100644 index 000000000..c012d59fd --- /dev/null +++ b/tavern/internal/www/src/pages/tomes/Tomes.tsx @@ -0,0 +1,38 @@ +import React from "react" +import { PageWrapper } from "../../components/page-wrapper" +import { PageNavItem } from "../../utils/enums" + +import { Button } from "@chakra-ui/react"; +import { ArrowUpTrayIcon } from "@heroicons/react/24/outline"; +import RepositoryTable from "./components/RepositoryTable"; +import { useRepositoryView } from "./hooks/useRepositoryView"; + +export const Tomes = () => { + const { loading, repositories, error } = useRepositoryView(); + console.log(repositories); + + return ( + +
+
+

Tomes

+
+ A tome is a prebuilt bundle, which includes execution instructions and files. Tomes are how beacon actions are defined. + Learn more + about how to write, test, and import tome repositories. +
+ +
+
+ +
+
+
+ + {(repositories && repositories.length > 0) && } +
+
+ ) +} diff --git a/tavern/internal/www/src/pages/tomes/components/RepositoryTable.tsx b/tavern/internal/www/src/pages/tomes/components/RepositoryTable.tsx new file mode 100644 index 000000000..bf596ab0e --- /dev/null +++ b/tavern/internal/www/src/pages/tomes/components/RepositoryTable.tsx @@ -0,0 +1,136 @@ +import { Badge, Button, Image } from "@chakra-ui/react"; +import { ArrowPathIcon, ChevronDownIcon, ChevronRightIcon } from "@heroicons/react/24/outline"; +import { ColumnDef, Row } from "@tanstack/react-table"; +import { formatDistance } from "date-fns"; +import Table from "../../../components/tavern-base-ui/Table"; +import TomeAccordion from "../../../components/TomeAccordion"; +import { RepositoryRow, Tome } from "../../../utils/consts"; +import { constructTomeParams } from "../../../utils/utils"; + +const RepositoryTable = ({ repositories }: { + repositories: Array +}) => { + const currentDate = new Date(); + + const renderSubComponent = ({ row }: { row: Row }) => { + return ( + //
+            //     {JSON.stringify(row.original, null, 2)}
+            // 
+
+ {row?.original?.node?.tomes.map((tome: Tome) => { + const params = constructTomeParams("[]", tome.paramDefs); + return ( + + ) + })} +
+ ) + } + + const columns: ColumnDef[] = [ + { + id: 'expander', + header: 'Repository', + accessorFn: row => row.node.url, + footer: props => props.column.id, + enableSorting: false, + cell: ({ row }) => { + const url = row?.original?.node?.url; + const link = url.replace("ssh://", "https://"); + + return row.getCanExpand() ? ( +
+ {row.getIsExpanded() ?
:
} +
+ {url} + {row?.original?.node?.repoType === "FIRST_PARTY" && + ( +
First Party
+ )} +
+
+ ) : ( +
+ {url} + {row?.original?.node?.repoType === "FIRST_PARTY" && + ( +
First Party
+ )} +
+ ) + }, + }, + { + id: "owner", + header: 'imported by', + accessorFn: row => row?.node?.owner, + footer: props => props.column.id, + enableSorting: false, + maxSize: 80, + cell: (cellData: any) => { + const creatorData = cellData.getValue(); + + if (creatorData) { +
+ {`Profile +
+ {creatorData?.name} +
+
+ } + else { + return
-
+ } + } + }, + { + id: "lastModifiedAt", + header: 'Last modified', + accessorFn: row => row?.node?.lastModifiedAt ? formatDistance(new Date(row.lastModifiedAt), currentDate) : "-", + footer: props => props.column.id, + enableSorting: false, + maxSize: 80, + }, + { + id: "tomes", + header: 'Tomes', + accessorFn: row => row?.node?.tomes ? row?.node?.tomes.length : "-", + footer: props => props.column.id, + enableSorting: false, + maxSize: 40, + }, + { + id: "id", + header: 'Refetch', + accessorFn: row => row, + footer: props => props.column.id, + enableSorting: false, + maxSize: 40, + cell: ({ row }) => { + if (row?.original?.node?.repoType === "FIRST_PARTY") { + return
+ } + return