feat(shui): add shui table & expose tanStackReact APIs

This commit is contained in:
charlie
2024-06-24 16:59:58 +08:00
parent 9f405a8e83
commit e2b6623ef5
6 changed files with 178 additions and 2 deletions

View File

@@ -0,0 +1,14 @@
(ns logseq.shui.table.core
(:require [rum.core :as rum]
[logseq.shui.util :as util]))
(def table (util/lsui-wrap "Table"))
(def table-header (util/lsui-wrap "TableHeader"))
(def table-body (util/lsui-wrap "TableBody"))
(def table-footer (util/lsui-wrap "TableFooter"))
(def table-head (util/lsui-wrap "TableHead"))
(def table-row (util/lsui-wrap "TableRow"))
(def table-cell (util/lsui-wrap "TableCell"))
(def table-caption (util/lsui-wrap "TableCaption"))
(def ^js tanStackReact (util/lsui-get "tanStackReact"))

View File

@@ -4,6 +4,7 @@
[logseq.shui.shortcut.v1 :as shui.shortcut.v1]
[logseq.shui.toaster.core :as toaster-core]
[logseq.shui.select.core :as select-core]
[logseq.shui.table.core :as table-core]
[logseq.shui.select.multi :as select-multi]
[logseq.shui.dialog.core :as dialog-core]
[logseq.shui.popup.core :as popup-core]
@@ -51,6 +52,16 @@
(def card-content (util/lsui-wrap "CardContent"))
(def card-footer (util/lsui-wrap "CardFooter"))
(def table table-core/table)
(def table-header table-core/table-header)
(def table-body table-core/table-body)
(def table-footer table-core/table-footer)
(def table-head table-core/table-head)
(def table-row table-core/table-row)
(def table-cell table-core/table-cell)
(def table-caption table-core/table-caption)
(def ^js tanStackReact table-core/tanStackReact)
(def form-provider form-core/form-provider)
(def form-item form-core/form-item)
(def form-label form-core/form-label)

View File

@@ -0,0 +1,118 @@
import * as React from 'react'
// @ts-ignore
import { cn } from '@/lib/utils'
const Table = React.forwardRef<
HTMLTableElement,
React.HTMLAttributes<HTMLTableElement>
>(({ className, ...props }, ref) => (
<div className="relative w-full overflow-auto">
<table
ref={ref}
className={cn('w-full caption-bottom text-sm', className)}
{...props}
/>
</div>
))
Table.displayName = 'Table'
const TableHeader = React.forwardRef<
HTMLTableSectionElement,
React.HTMLAttributes<HTMLTableSectionElement>
>(({ className, ...props }, ref) => (
<thead ref={ref} className={cn('[&_tr]:border-b', className)} {...props} />
))
TableHeader.displayName = 'TableHeader'
const TableBody = React.forwardRef<
HTMLTableSectionElement,
React.HTMLAttributes<HTMLTableSectionElement>
>(({ className, ...props }, ref) => (
<tbody
ref={ref}
className={cn('[&_tr:last-child]:border-0', className)}
{...props}
/>
))
TableBody.displayName = 'TableBody'
const TableFooter = React.forwardRef<
HTMLTableSectionElement,
React.HTMLAttributes<HTMLTableSectionElement>
>(({ className, ...props }, ref) => (
<tfoot
ref={ref}
className={cn(
'border-t bg-muted/50 font-medium [&>tr]:last:border-b-0',
className
)}
{...props}
/>
))
TableFooter.displayName = 'TableFooter'
const TableRow = React.forwardRef<
HTMLTableRowElement,
React.HTMLAttributes<HTMLTableRowElement>
>(({ className, ...props }, ref) => (
<tr
ref={ref}
className={cn(
'border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted',
className
)}
{...props}
/>
))
TableRow.displayName = 'TableRow'
const TableHead = React.forwardRef<
HTMLTableCellElement,
React.ThHTMLAttributes<HTMLTableCellElement>
>(({ className, ...props }, ref) => (
<th
ref={ref}
className={cn(
'h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0',
className
)}
{...props}
/>
))
TableHead.displayName = 'TableHead'
const TableCell = React.forwardRef<
HTMLTableCellElement,
React.TdHTMLAttributes<HTMLTableCellElement>
>(({ className, ...props }, ref) => (
<td
ref={ref}
className={cn('p-4 align-middle [&:has([role=checkbox])]:pr-0', className)}
{...props}
/>
))
TableCell.displayName = 'TableCell'
const TableCaption = React.forwardRef<
HTMLTableCaptionElement,
React.HTMLAttributes<HTMLTableCaptionElement>
>(({ className, ...props }, ref) => (
<caption
ref={ref}
className={cn('mt-4 text-sm text-muted-foreground', className)}
{...props}
/>
))
TableCaption.displayName = 'TableCaption'
export {
Table,
TableHeader,
TableBody,
TableFooter,
TableHead,
TableRow,
TableCell,
TableCaption,
}

View File

@@ -34,6 +34,7 @@
"@radix-ui/react-toggle": "^1.0.3",
"@radix-ui/react-toggle-group": "^1.0.4",
"@radix-ui/react-tooltip": "^1.0.7",
"@tanstack/react-table": "^8.17.3",
"class-variance-authority": "^0.7.0",
"clsx": "^2.0.0",
"cmdk": "^0.2.0",

View File

@@ -90,7 +90,18 @@ import { Separator } from '@/components/ui/separator'
import { Toggle } from '@/components/ui/toggle'
import { ToggleGroup, ToggleGroupItem } from '@/components/ui/toggle-group'
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'
import {
Table,
TableHeader,
TableBody,
TableFooter,
TableHead,
TableRow,
TableCell,
TableCaption
} from '@/components/ui/table'
import * as uniqolor from 'uniqolor'
import * as tanStackReact from '@tanstack/react-table'
declare global {
var LSUI: any
@@ -98,7 +109,7 @@ declare global {
}
const shadui = {
Link, Button,
Link, Button,
Slider, SliderTrack, SliderRange, SliderThumb,
DropdownMenu,
DropdownMenuContent,
@@ -184,7 +195,16 @@ const shadui = {
Tooltip, TooltipTrigger, TooltipArrow,
TooltipContent, TooltipProvider, TooltipPortal,
Toggle, ToggleGroup, ToggleGroupItem,
Avatar, AvatarImage, AvatarFallback
Avatar, AvatarImage, AvatarFallback,
Table,
TableHeader,
TableBody,
TableFooter,
TableHead,
TableRow,
TableCell,
TableCaption,
tanStackReact
}
function setupGlobals() {

View File

@@ -3782,6 +3782,18 @@
resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.5.tgz#043b731d4f56a79b4897a3de1af35e75d56bc63a"
integrity sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==
"@tanstack/react-table@^8.17.3":
version "8.17.3"
resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.17.3.tgz#4e10b4cf5355a40d6d72a83d3f4b3ecd32f56bf4"
integrity sha512-5gwg5SvPD3lNAXPuJJz1fOCEZYk9/GeBFH3w/hCgnfyszOIzwkwgp5I7Q4MJtn0WECp84b5STQUDdmvGi8m3nA==
dependencies:
"@tanstack/table-core" "8.17.3"
"@tanstack/table-core@8.17.3":
version "8.17.3"
resolved "https://registry.yarnpkg.com/@tanstack/table-core/-/table-core-8.17.3.tgz#d7a9830abb29cd369b52b2a7159dc0360af646fd"
integrity sha512-mPBodDGVL+fl6d90wUREepHa/7lhsghg2A3vFpakEhrhtbIlgNAZiMr7ccTgak5qbHqF14Fwy+W1yFWQt+WmYQ==
"@testing-library/dom@^9.0.0":
version "9.3.3"
resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.3.3.tgz#108c23a5b0ef51121c26ae92eb3179416b0434f5"