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:
parent
b9f3083281
commit
c6c6fdea15
@ -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),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -34,7 +34,11 @@
|
|||||||
// padding: 0 var(--padding);
|
// padding: 0 var(--padding);
|
||||||
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);
|
||||||
|
|||||||
@ -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} />
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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 (
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user