1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Make items selectable

Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com>
This commit is contained in:
Alex Andreev 2022-08-24 13:17:02 +03:00
parent b9f3083281
commit c6c6fdea15
5 changed files with 21 additions and 5 deletions

View File

@ -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 type { SubscribableStore, SubscribeStores } from "../../kube-watch-api/kube-watch-api";
import subscribeToStoresDisposersInjectable from "../../kube-watch-api/subscribe-to-stores-disposers.injectable"; import subscribeToStoresDisposersInjectable from "../../kube-watch-api/subscribe-to-stores-disposers.injectable";
import { KubeObjectMenu } from "../kube-object-menu"; import { KubeObjectMenu } from "../kube-object-menu";
import toggleKubeDetailsPaneInjectable, { ToggleKubeDetailsPane } from "../kube-detail-params/toggle-details.injectable";
enum columnId { enum columnId {
name = "name", name = "name",
@ -54,6 +55,7 @@ interface Dependencies {
podStore: PodStore; podStore: PodStore;
nodeApi: NodeApi; nodeApi: NodeApi;
subscribeToWatchStores: SubscribeStores; subscribeToWatchStores: SubscribeStores;
toggleDetails: ToggleKubeDetailsPane;
} }
const columnHelper = createColumnHelper<Pod>() const columnHelper = createColumnHelper<Pod>()
@ -254,6 +256,7 @@ class NonInjectedPods extends React.Component<Dependencies> {
pod => pod.status?.podIP || "", pod => pod.status?.podIP || "",
pod => pod.getNodeName() || "", pod => pod.getNodeName() || "",
]} ]}
onRowClick={(item) => this.props.toggleDetails(item.selfLink)}
getCoreRowModel={getCoreRowModel()} getCoreRowModel={getCoreRowModel()}
/> />
</SiblingsInTabLayout> </SiblingsInTabLayout>
@ -362,6 +365,7 @@ export const Pods = withInjectables<Dependencies>(NonInjectedPods, {
nodeApi: di.inject(nodeApiInjectable), nodeApi: di.inject(nodeApiInjectable),
eventStore: di.inject(eventStoreInjectable), eventStore: di.inject(eventStoreInjectable),
podStore: di.inject(podStoreInjectable), podStore: di.inject(podStoreInjectable),
subscribeToWatchStores: di.inject(subscribeToStoresDisposersInjectable) subscribeToWatchStores: di.inject(subscribeToStoresDisposersInjectable),
toggleDetails: di.inject(toggleKubeDetailsPaneInjectable),
}), }),
}); });

View File

@ -22,13 +22,14 @@ export type SearchFilter<T> = (item: T) => string;
export interface ListProps<T> extends TableOptions<T> { export interface ListProps<T> extends TableOptions<T> {
filters: SearchFilter<T>[]; filters: SearchFilter<T>[];
title?: React.ReactNode; title?: React.ReactNode;
onRowClick?: (item: T) => void;
} }
interface Dependencies { interface Dependencies {
pageFiltersStore: PageFiltersStore; pageFiltersStore: PageFiltersStore;
} }
export function NonInjectedList<T>({ columns, data, title, filters, pageFiltersStore }: ListProps<T> & Dependencies) { export function NonInjectedList<T>({ columns, data, title, filters, pageFiltersStore, onRowClick }: ListProps<T> & Dependencies) {
const [search, setSearch] = useState<string>(""); const [search, setSearch] = useState<string>("");
useEffect(() => { useEffect(() => {
@ -60,6 +61,7 @@ export function NonInjectedList<T>({ columns, data, title, filters, pageFiltersS
columns={columns} columns={columns}
data={filteredData} data={filteredData}
className={themeStyles.tableTheme} className={themeStyles.tableTheme}
onRowClick={onRowClick}
/> />
{filteredData.length == 0 && ( {filteredData.length == 0 && (
<div className={styles.notFound}>No data found</div> <div className={styles.notFound}>No data found</div>

View File

@ -35,6 +35,10 @@
font-weight: 500; font-weight: 500;
} }
tbody tr:hover {
background-color: var(--tableBgcSelected);
}
.headIcon { .headIcon {
font-weight: normal; font-weight: normal;
color: var(--textColorAccent); color: var(--textColorAccent);

View File

@ -15,6 +15,7 @@ interface TableProps<T> {
selectable?: boolean; selectable?: boolean;
configurable?: boolean; configurable?: boolean;
columnsResizable?: boolean; columnsResizable?: boolean;
onRowClick?: (item: T) => void;
} }
export function TableList<Data>({ export function TableList<Data>({
@ -24,6 +25,7 @@ export function TableList<Data>({
selectable = true, selectable = true,
configurable = true, configurable = true,
columnsResizable = true, columnsResizable = true,
onRowClick,
}: TableProps<Data>) { }: TableProps<Data>) {
const [sorting, setSorting] = React.useState<SortingState>([]) const [sorting, setSorting] = React.useState<SortingState>([])
const tableColumns = useMemo(() => { const tableColumns = useMemo(() => {
@ -82,7 +84,7 @@ export function TableList<Data>({
}); });
return ( return (
<VirtualTable table={table} className={className} /> <VirtualTable table={table} className={className} onRowClick={onRowClick} />
) )
} }

View File

@ -8,13 +8,15 @@ import { flexRender, Row } from "@tanstack/react-table"
import type { Table, Cell, Header } from "@tanstack/react-table"; import type { Table, Cell, Header } from "@tanstack/react-table";
import { useVirtualizer } from "@tanstack/react-virtual"; import { useVirtualizer } from "@tanstack/react-virtual";
import { VirtualTableHeader } from "./virtual-table-header"; import { VirtualTableHeader } from "./virtual-table-header";
import { prevDefault } from "../../utils";
interface TableProps<T> { interface TableProps<T> {
table: Table<T>; table: Table<T>;
className?: string; className?: string;
onRowClick?: (item: T) => void;
} }
export function VirtualTable<Data>({ className, table }: TableProps<Data>) { export function VirtualTable<Data>({ className, table, onRowClick }: TableProps<Data>) {
const tableContainerRef = React.useRef<HTMLDivElement>(null) const tableContainerRef = React.useRef<HTMLDivElement>(null)
const { rows } = table.getRowModel() const { rows } = table.getRowModel()
@ -50,7 +52,9 @@ import { VirtualTableHeader } from "./virtual-table-header";
width: '100%', width: '100%',
transform: `translateY(${virtualRow.start}px)`, transform: `translateY(${virtualRow.start}px)`,
display: 'flex', display: 'flex',
cursor: onRowClick ? 'pointer' : 'default',
}} }}
onClick={prevDefault(() => onRowClick?.(row.original))}
> >
{row.getVisibleCells().map(cell => { {row.getVisibleCells().map(cell => {
return ( return (