From c6c6fdea15401cfe9a53b5615ceb149330fc970c Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Wed, 24 Aug 2022 13:17:02 +0300 Subject: [PATCH] Make items selectable Signed-off-by: Alex Andreev --- src/renderer/components/+workloads-pods/pods.tsx | 6 +++++- src/renderer/components/list/list.tsx | 4 +++- src/renderer/components/list/table-theme.module.scss | 6 +++++- src/renderer/components/table-list/table-list.tsx | 4 +++- src/renderer/components/table/virtual-table.tsx | 6 +++++- 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/renderer/components/+workloads-pods/pods.tsx b/src/renderer/components/+workloads-pods/pods.tsx index 0575a25f06..f7c3dfb785 100644 --- a/src/renderer/components/+workloads-pods/pods.tsx +++ b/src/renderer/components/+workloads-pods/pods.tsx @@ -34,6 +34,7 @@ import subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.inj import type { SubscribableStore, SubscribeStores } from "../../kube-watch-api/kube-watch-api"; import subscribeToStoresDisposersInjectable from "../../kube-watch-api/subscribe-to-stores-disposers.injectable"; import { KubeObjectMenu } from "../kube-object-menu"; +import toggleKubeDetailsPaneInjectable, { ToggleKubeDetailsPane } from "../kube-detail-params/toggle-details.injectable"; enum columnId { name = "name", @@ -54,6 +55,7 @@ interface Dependencies { podStore: PodStore; nodeApi: NodeApi; subscribeToWatchStores: SubscribeStores; + toggleDetails: ToggleKubeDetailsPane; } const columnHelper = createColumnHelper() @@ -254,6 +256,7 @@ class NonInjectedPods extends React.Component { pod => pod.status?.podIP || "", pod => pod.getNodeName() || "", ]} + onRowClick={(item) => this.props.toggleDetails(item.selfLink)} getCoreRowModel={getCoreRowModel()} /> @@ -362,6 +365,7 @@ export const Pods = withInjectables(NonInjectedPods, { nodeApi: di.inject(nodeApiInjectable), eventStore: di.inject(eventStoreInjectable), podStore: di.inject(podStoreInjectable), - subscribeToWatchStores: di.inject(subscribeToStoresDisposersInjectable) + subscribeToWatchStores: di.inject(subscribeToStoresDisposersInjectable), + toggleDetails: di.inject(toggleKubeDetailsPaneInjectable), }), }); diff --git a/src/renderer/components/list/list.tsx b/src/renderer/components/list/list.tsx index 7132004366..41d94525c6 100644 --- a/src/renderer/components/list/list.tsx +++ b/src/renderer/components/list/list.tsx @@ -22,13 +22,14 @@ export type SearchFilter = (item: T) => string; export interface ListProps extends TableOptions { filters: SearchFilter[]; title?: React.ReactNode; + onRowClick?: (item: T) => void; } interface Dependencies { pageFiltersStore: PageFiltersStore; } -export function NonInjectedList({ columns, data, title, filters, pageFiltersStore }: ListProps & Dependencies) { +export function NonInjectedList({ columns, data, title, filters, pageFiltersStore, onRowClick }: ListProps & Dependencies) { const [search, setSearch] = useState(""); useEffect(() => { @@ -60,6 +61,7 @@ export function NonInjectedList({ columns, data, title, filters, pageFiltersS columns={columns} data={filteredData} className={themeStyles.tableTheme} + onRowClick={onRowClick} /> {filteredData.length == 0 && (
No data found
diff --git a/src/renderer/components/list/table-theme.module.scss b/src/renderer/components/list/table-theme.module.scss index b59bd691d5..87c7b439d2 100644 --- a/src/renderer/components/list/table-theme.module.scss +++ b/src/renderer/components/list/table-theme.module.scss @@ -34,7 +34,11 @@ // padding: 0 var(--padding); font-weight: 500; } - + + tbody tr:hover { + background-color: var(--tableBgcSelected); + } + .headIcon { font-weight: normal; color: var(--textColorAccent); diff --git a/src/renderer/components/table-list/table-list.tsx b/src/renderer/components/table-list/table-list.tsx index f7f57dfe80..a4f4b97f7b 100644 --- a/src/renderer/components/table-list/table-list.tsx +++ b/src/renderer/components/table-list/table-list.tsx @@ -15,6 +15,7 @@ interface TableProps { selectable?: boolean; configurable?: boolean; columnsResizable?: boolean; + onRowClick?: (item: T) => void; } export function TableList({ @@ -24,6 +25,7 @@ export function TableList({ selectable = true, configurable = true, columnsResizable = true, + onRowClick, }: TableProps) { const [sorting, setSorting] = React.useState([]) const tableColumns = useMemo(() => { @@ -82,7 +84,7 @@ export function TableList({ }); return ( - + ) } diff --git a/src/renderer/components/table/virtual-table.tsx b/src/renderer/components/table/virtual-table.tsx index 9e91dfa34f..74fa75b088 100644 --- a/src/renderer/components/table/virtual-table.tsx +++ b/src/renderer/components/table/virtual-table.tsx @@ -8,13 +8,15 @@ import { flexRender, Row } from "@tanstack/react-table" import type { Table, Cell, Header } from "@tanstack/react-table"; import { useVirtualizer } from "@tanstack/react-virtual"; import { VirtualTableHeader } from "./virtual-table-header"; +import { prevDefault } from "../../utils"; interface TableProps { table: Table; className?: string; + onRowClick?: (item: T) => void; } - export function VirtualTable({ className, table }: TableProps) { + export function VirtualTable({ className, table, onRowClick }: TableProps) { const tableContainerRef = React.useRef(null) const { rows } = table.getRowModel() @@ -50,7 +52,9 @@ import { VirtualTableHeader } from "./virtual-table-header"; width: '100%', transform: `translateY(${virtualRow.start}px)`, display: 'flex', + cursor: onRowClick ? 'pointer' : 'default', }} + onClick={prevDefault(() => onRowClick?.(row.original))} > {row.getVisibleCells().map(cell => { return (