MCPcopy Create free account
hub / github.com/outerbase/studio / SelectableTable

Function SelectableTable

src/components/selectable-table.tsx:22–168  ·  view source on GitHub ↗
({
  items,
  headers,
  extractKey,
  renderRow,
  selectedItems,
  onSelectedItemChanged,
  disabledSelection,
  forceShowSelectedItem,
}: SelectableTableProps<T>)

Source from the content-addressed store, hash-verified

20}
21
22export function SelectableTable<T>({
23 items,
24 headers,
25 extractKey,
26 renderRow,
27 selectedItems,
28 onSelectedItemChanged,
29 disabledSelection,
30 forceShowSelectedItem,
31}: SelectableTableProps<T>) {
32 const allSelected = items.length === selectedItems.length;
33 const [showOnlySelected, setShowOnlySelected] = useState(false);
34
35 const toggleAllChecked = useCallback(() => {
36 if (allSelected) {
37 onSelectedItemChanged([]);
38 } else {
39 onSelectedItemChanged([...items]);
40 }
41 }, [allSelected, items, onSelectedItemChanged]);
42
43 // If we have no selected items, we should not show the
44 // "Show only selected items" option
45 useEffect(() => {
46 if (selectedItems.length === 0) setShowOnlySelected(false);
47 }, [selectedItems.length]);
48
49 const visibilityOptionDom = useMemo(() => {
50 if (selectedItems.length === 0) return null;
51
52 if (showOnlySelected) {
53 return (
54 <span
55 className="cursor-pointer text-blue-600 underline"
56 onClick={() => setShowOnlySelected(false)}
57 >
58 Show all items
59 </span>
60 );
61 }
62
63 return (
64 <span
65 className="cursor-pointer text-blue-600 underline"
66 onClick={() => {
67 setShowOnlySelected(true);
68 }}
69 >
70 Show only the selected items
71 </span>
72 );
73 }, [selectedItems, showOnlySelected]);
74
75 return (
76 <table className="w-full border-separate border-spacing-0 text-sm">
77 <thead className="sticky top-0">
78 <tr className="h-[35px] bg-secondary text-xs">
79 {!disabledSelection && (

Callers

nothing calls this directly

Calls 1

cnFunction · 0.90

Tested by

no test coverage detected