@jarllyng/nostromo 3.13.0 → 3.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-HCO4XKPM.js +3 -0
- package/dist/chunk-HCO4XKPM.js.map +1 -0
- package/dist/chunk-KASVYULP.cjs +3 -0
- package/dist/chunk-KASVYULP.cjs.map +1 -0
- package/dist/chunk-UC577SR4.cjs +3 -0
- package/dist/chunk-UC577SR4.cjs.map +1 -0
- package/dist/chunk-YC6ALHAZ.js +3 -0
- package/dist/chunk-YC6ALHAZ.js.map +1 -0
- package/dist/components/core/data-table.cjs +1 -1
- package/dist/components/core/data-table.d.cts +22 -1
- package/dist/components/core/data-table.d.ts +22 -1
- package/dist/components/core/data-table.js +1 -1
- package/dist/components/core/table.cjs +1 -1
- package/dist/components/core/table.d.cts +10 -0
- package/dist/components/core/table.d.ts +10 -0
- package/dist/components/core/table.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-AYEM2M4H.cjs +0 -3
- package/dist/chunk-AYEM2M4H.cjs.map +0 -1
- package/dist/chunk-UIEGBT4T.js +0 -3
- package/dist/chunk-UIEGBT4T.js.map +0 -1
- package/dist/chunk-VNDL67OG.cjs +0 -3
- package/dist/chunk-VNDL67OG.cjs.map +0 -1
- package/dist/chunk-XJJJEWSU.js +0 -3
- package/dist/chunk-XJJJEWSU.js.map +0 -1
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {a}from'./chunk-AC2JBXHQ.js';import r,{useState}from'react';import {cva}from'class-variance-authority';var U=cva("w-full border-collapse transition-all duration-200",{variants:{variant:{default:"border border-border shadow-sm hover:shadow-md",striped:"border border-border shadow-sm hover:shadow-md",bordered:"border-2 border-border shadow-md hover:shadow-lg",hover:"border border-border shadow-sm hover:shadow-md",elevated:"border border-border shadow-lg hover:shadow-xl",interactive:"border border-border shadow-sm hover:shadow-md hover:border-primary"},size:{sm:"text-xs sm:text-sm",md:"text-sm sm:text-base",lg:"text-base sm:text-lg"}},defaultVariants:{variant:"default",size:"md"}}),W=cva("font-medium text-left transition-all duration-200",{variants:{variant:{default:"bg-muted text-foreground hover:bg-muted/80",striped:"bg-muted text-foreground hover:bg-muted/80",bordered:"bg-muted text-foreground hover:bg-muted/80",hover:"bg-muted text-foreground hover:bg-muted/80",elevated:"bg-muted text-foreground hover:bg-muted/80",interactive:"bg-muted text-foreground hover:bg-primary/10 hover:text-primary"},size:{sm:"px-2 py-1 sm:px-3 sm:py-2",md:"px-3 py-2 sm:px-4 sm:py-3",lg:"px-4 py-3 sm:px-6 sm:py-4"}},defaultVariants:{variant:"default",size:"md"}}),X=cva("border-b border-border transition-colors",{variants:{variant:{default:"hover:bg-muted/50",striped:"even:bg-muted/50 hover:bg-muted/80",bordered:"hover:bg-muted/50",hover:"hover:bg-muted/50",elevated:"hover:bg-muted/80",interactive:"hover:bg-primary/10 hover:text-primary"}},defaultVariants:{variant:"default"}}),w=cva("border-border transition-all duration-200",{variants:{variant:{default:"border-b border-border hover:bg-muted/50",striped:"border-b border-border hover:bg-muted/80",bordered:"border border-border hover:bg-muted/50",hover:"border-b border-border hover:bg-muted/50",elevated:"border-b border-border hover:bg-muted/80",interactive:"border-b border-border hover:bg-primary/10 hover:text-primary"},size:{sm:"px-2 py-1 sm:px-3 sm:py-2",md:"px-3 py-2 sm:px-4 sm:py-3",lg:"px-4 py-3 sm:px-6 sm:py-4"}},defaultVariants:{variant:"default",size:"md"}});function Y({data:l,columns:n,loading:b=false,emptyText:p="No data",className:u,variant:d,size:i,rowKey:c="id",onRowClick:E,onSort:L,sortColumn:N,sortDirection:B,pagination:t,selection:s,caption:k,...I},D){let[j,A]=useState(null),S=N!==void 0,g=S&&N?{column:N,direction:B||"asc"}:j,F=e=>{if(!e.sortable)return;let o=g?.column===e.key&&g?.direction==="asc"?"desc":"asc";S||A({column:e.key,direction:o}),L?.(e,o);},f=(e,o)=>typeof c=="function"?c(e):e[c]??o,P=e=>s?.getCheckboxProps?.(e).disabled===true,h=s?l.map((e,o)=>({record:e,key:f(e,o)})).filter(({record:e})=>!P(e)).map(({key:e})=>e):[],z=e=>l.filter((o,a)=>e.includes(f(o,a))),H=(e,o)=>{if(!s)return false;let a=f(e,o);return s.selectedRowKeys.includes(a)},G=(e,o,a)=>{if(!s||P(e))return;let x=f(e,o),V=a?s.selectedRowKeys.includes(x)?s.selectedRowKeys:[...s.selectedRowKeys,x]:s.selectedRowKeys.filter(Q=>Q!==x);s.onChange(V,z(V));},$=e=>{if(!s)return;let o=s.selectedRowKeys.filter(x=>!h.includes(x)),a=e?[...o,...h]:o;s.onChange(a,z(a));},C=h.filter(e=>s?.selectedRowKeys.includes(e)),J=s&&h.length>0&&C.length===h.length,O=s&&C.length>0&&C.length<h.length;return r.createElement("div",{className:"w-full overflow-x-auto"},r.createElement("div",{className:"min-w-full"},r.createElement("table",{ref:D,className:a(U({variant:d,size:i}),u),...I},k&&r.createElement("caption",{className:"sr-only"},k),r.createElement(K,null,r.createElement(v,null,s&&r.createElement("th",{className:a(w({variant:d,size:i})),scope:"col",role:"columnheader"},r.createElement("input",{type:"checkbox",checked:J,ref:e=>{e&&(e.indeterminate=O||false);},onChange:e=>$(e.target.checked),className:"rounded border-input text-primary focus:ring-ring","aria-label":"Select all rows"})),n.map(e=>r.createElement("th",{key:e.key,className:a(w({variant:d,size:i}),e.className,e.align==="center"&&"text-center",e.align==="right"&&"text-right"),scope:"col",role:"columnheader",...e.width&&{style:{width:e.width}}},r.createElement("div",{className:"flex items-center gap-2"},r.createElement("span",null,e.title),e.sortable&&r.createElement("button",{type:"button",onClick:()=>F(e),className:"flex flex-col text-muted-foreground hover:text-foreground","aria-label":`Sort by ${e.title}`},r.createElement("svg",{className:a("w-3 h-3",g?.column===e.key&&g?.direction==="asc"?"text-primary":"text-muted-foreground"),fill:"currentColor",viewBox:"0 0 20 20"},r.createElement("path",{d:"M5 8l5-5 5 5H5z"})),r.createElement("svg",{className:a("w-3 h-3 -mt-1",g?.column===e.key&&g?.direction==="desc"?"text-primary":"text-muted-foreground"),fill:"currentColor",viewBox:"0 0 20 20"},r.createElement("path",{d:"M5 12l5 5 5-5H5z"})))))))),r.createElement(M,null,b?r.createElement(v,null,r.createElement(y,{colSpan:n.length+(s?1:0),variant:d,size:i,className:"text-center py-8"},r.createElement("div",{className:"flex items-center justify-center gap-2"},r.createElement("div",{className:"animate-spin rounded-full h-4 w-4 border-b-2 border-primary"}),r.createElement("span",null,"Loading...")))):l.length===0?r.createElement(v,null,r.createElement(y,{colSpan:n.length+(s?1:0),variant:d,size:i,className:"text-center py-8 text-muted-foreground"},p)):l.map((e,o)=>r.createElement(v,{key:f(e,o),variant:d,onClick:()=>E?.(e,o),selected:H(e,o)},s&&r.createElement(y,{variant:d,size:i},r.createElement("input",{type:"checkbox",checked:H(e,o),onChange:a=>G(e,o,a.target.checked),className:"rounded border-input text-primary focus:ring-ring","aria-label":`Select row ${o+1}`,...s.getCheckboxProps?.(e)})),n.map(a$1=>r.createElement(y,{key:a$1.key,variant:d,size:i,className:a(a$1.className,a$1.align==="center"&&"text-center",a$1.align==="right"&&"text-right")},a$1.render?a$1.render(a$1.dataIndex?e[a$1.dataIndex]:e,e,o):a$1.dataIndex?e[a$1.dataIndex]:e[a$1.key]))))))),t&&r.createElement("div",{className:"flex flex-col sm:flex-row items-center justify-between mt-4 px-2 sm:px-4 py-3 bg-card border-t border-border gap-2 sm:gap-0"},r.createElement("div",{className:"flex items-center gap-2"},r.createElement("span",{className:"text-sm text-muted-foreground"},"Showing ",(t.current-1)*t.pageSize+1," to"," ",Math.min(t.current*t.pageSize,t.total)," ","of ",t.total," results")),r.createElement("div",{className:"flex items-center gap-2"},t.showSizeChanger&&r.createElement("select",{value:t.pageSize,onChange:e=>t.onChange(1,Number(e.target.value)),className:"rounded border-input bg-background text-sm","aria-label":"Select page size"},r.createElement("option",{value:10},"10 / page"),r.createElement("option",{value:20},"20 / page"),r.createElement("option",{value:50},"50 / page"),r.createElement("option",{value:100},"100 / page")),r.createElement("div",{className:"flex items-center gap-1"},r.createElement("button",{type:"button",onClick:()=>t.onChange(t.current-1,t.pageSize),disabled:t.current<=1,className:"px-3 py-1 text-sm border border-input rounded hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed","aria-label":"Go to previous page"},"Previous"),r.createElement("span",{className:"px-3 py-1 text-sm"},"Page ",t.current," of"," ",Math.ceil(t.total/t.pageSize)),r.createElement("button",{type:"button",onClick:()=>t.onChange(t.current+1,t.pageSize),disabled:t.current>=Math.ceil(t.total/t.pageSize),className:"px-3 py-1 text-sm border border-input rounded hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed","aria-label":"Go to next page"},"Next")))))}var R=r.forwardRef(Y);R.displayName="Table";var te=R,K=r.forwardRef(({className:l,variant:n,size:b,children:p,...u},d)=>r.createElement("thead",{ref:d,className:a(W({variant:n,size:b}),l),...u},p));K.displayName="TableHeader";var M=r.forwardRef(({className:l,children:n,...b},p)=>r.createElement("tbody",{ref:p,className:a(l),...b},n));M.displayName="TableBody";var v=r.forwardRef(({className:l,children:n,onClick:b,selected:p,variant:u,...d},i)=>r.createElement("tr",{ref:i,className:a(X({variant:u}),p&&"bg-primary/10",b&&"cursor-pointer",l),onClick:b,...d},n));v.displayName="TableRow";var y=r.forwardRef(({className:l,children:n,variant:b,size:p,colSpan:u,rowSpan:d,...i},c)=>r.createElement("td",{ref:c,className:a(w({variant:b,size:p}),l),colSpan:u,rowSpan:d,...i},n));y.displayName="TableCell";var Z=r.forwardRef(({className:l,children:n,variant:b,size:p,colSpan:u,rowSpan:d,...i},c)=>r.createElement("th",{ref:c,className:a(w({variant:b,size:p}),"font-medium",l),colSpan:u,rowSpan:d,...i},n));Z.displayName="TableHead";export{U as a,W as b,w as c,te as d,K as e,M as f,v as g,y as h,Z as i};//# sourceMappingURL=chunk-HCO4XKPM.js.map
|
|
3
|
+
//# sourceMappingURL=chunk-HCO4XKPM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/core/table.tsx"],"names":["tableVariants","cva","tableHeaderVariants","tableRowVariants","tableCellVariants","TableComponent","data","columns","loading","emptyText","className","variant","size","rowKey","onRowClick","onSort","controlledSortColumn","controlledSortDirection","pagination","selection","caption","props","ref","internalSortState","setInternalSortState","useState","isControlled","sortState","handleSort","column","newDirection","getRowKey","record","index","isRowDisabled","selectableKeys","key","recordsForKeys","keys","isRowSelected","handleRowSelection","checked","newSelectedKeys","k","handleSelectAll","others","selectedOnPage","isAllSelected","isIndeterminate","React","cn","TableHeader","TableRow","input","TableBody","TableCell","e","TableForwardRef","Table","children","onClick","selected","colSpan","rowSpan","TableHead"],"mappings":"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","file":"chunk-HCO4XKPM.js","sourcesContent":["import React, { useState } from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\n\n// Table variants\nconst tableVariants = cva(\n \"w-full border-collapse transition-all duration-200\",\n {\n variants: {\n variant: {\n default: \"border border-border shadow-sm hover:shadow-md\",\n striped: \"border border-border shadow-sm hover:shadow-md\",\n bordered: \"border-2 border-border shadow-md hover:shadow-lg\",\n hover: \"border border-border shadow-sm hover:shadow-md\",\n elevated: \"border border-border shadow-lg hover:shadow-xl\",\n interactive:\n \"border border-border shadow-sm hover:shadow-md hover:border-primary\",\n },\n size: {\n sm: \"text-xs sm:text-sm\",\n md: \"text-sm sm:text-base\",\n lg: \"text-base sm:text-lg\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n },\n);\n\nconst tableHeaderVariants = cva(\n \"font-medium text-left transition-all duration-200\",\n {\n variants: {\n variant: {\n default: \"bg-muted text-foreground hover:bg-muted/80\",\n striped: \"bg-muted text-foreground hover:bg-muted/80\",\n bordered: \"bg-muted text-foreground hover:bg-muted/80\",\n hover: \"bg-muted text-foreground hover:bg-muted/80\",\n elevated: \"bg-muted text-foreground hover:bg-muted/80\",\n interactive:\n \"bg-muted text-foreground hover:bg-primary/10 hover:text-primary\",\n },\n size: {\n sm: \"px-2 py-1 sm:px-3 sm:py-2\",\n md: \"px-3 py-2 sm:px-4 sm:py-3\",\n lg: \"px-4 py-3 sm:px-6 sm:py-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n },\n);\n\n/**\n * Row-level variants.\n *\n * `striped` has to live here, not on the cell: `even:` selects the even sibling\n * among *cells within a row*, so applying it there striped columns instead of\n * rows - and TableRow ignored the variant entirely, so nothing showed at all.\n */\nconst tableRowVariants = cva(\"border-b border-border transition-colors\", {\n variants: {\n variant: {\n default: \"hover:bg-muted/50\",\n striped: \"even:bg-muted/50 hover:bg-muted/80\",\n bordered: \"hover:bg-muted/50\",\n hover: \"hover:bg-muted/50\",\n elevated: \"hover:bg-muted/80\",\n interactive: \"hover:bg-primary/10 hover:text-primary\",\n },\n },\n defaultVariants: { variant: \"default\" },\n});\n\nconst tableCellVariants = cva(\"border-border transition-all duration-200\", {\n variants: {\n variant: {\n default: \"border-b border-border hover:bg-muted/50\",\n striped: \"border-b border-border hover:bg-muted/80\",\n bordered: \"border border-border hover:bg-muted/50\",\n hover: \"border-b border-border hover:bg-muted/50\",\n elevated: \"border-b border-border hover:bg-muted/80\",\n interactive:\n \"border-b border-border hover:bg-primary/10 hover:text-primary\",\n },\n size: {\n sm: \"px-2 py-1 sm:px-3 sm:py-2\",\n md: \"px-3 py-2 sm:px-4 sm:py-3\",\n lg: \"px-4 py-3 sm:px-6 sm:py-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n});\n\n// Types\nexport interface TableColumn<T = Record<string, unknown>> {\n key: string;\n title: string;\n dataIndex?: keyof T;\n render?: (value: unknown, record: T, index: number) => React.ReactNode;\n sortable?: boolean;\n width?: string | number;\n align?: \"left\" | \"center\" | \"right\";\n className?: string;\n}\n\nexport interface TableProps<T = Record<string, unknown>> extends VariantProps<\n typeof tableVariants\n> {\n data: T[];\n columns: TableColumn<T>[];\n loading?: boolean;\n emptyText?: string;\n caption?: string;\n className?: string;\n rowKey?: keyof T | ((record: T) => string | number);\n onRowClick?: (record: T, index: number) => void;\n onSort?: (column: TableColumn<T>, direction: \"asc\" | \"desc\") => void;\n sortColumn?: string;\n sortDirection?: \"asc\" | \"desc\";\n pagination?: {\n current: number;\n pageSize: number;\n total: number;\n onChange: (page: number, pageSize: number) => void;\n showSizeChanger?: boolean;\n showQuickJumper?: boolean;\n };\n selection?: {\n selectedRowKeys: (string | number)[];\n /**\n * `selectedRowKeys` is the complete selection, including keys for records on\n * other pages. `selectedRows` is only the subset present in `data`, because\n * the component has never been given the rest. Paginating server-side means\n * keeping your own key-to-record map and treating the keys as authoritative.\n */\n onChange: (selectedRowKeys: (string | number)[], selectedRows: T[]) => void;\n /**\n * A disabled row cannot be selected individually, and select-all skips it\n * rather than selecting it on the consumer's behalf.\n */\n getCheckboxProps?: (record: T) => { disabled?: boolean };\n };\n}\n\nexport interface TableHeaderProps extends VariantProps<\n typeof tableHeaderVariants\n> {\n className?: string;\n children: React.ReactNode;\n}\n\nexport interface TableBodyProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport interface TableRowProps extends VariantProps<typeof tableRowVariants> {\n className?: string;\n children: React.ReactNode;\n onClick?: () => void;\n selected?: boolean;\n}\n\nexport interface TableCellProps extends VariantProps<typeof tableCellVariants> {\n className?: string;\n children: React.ReactNode;\n colSpan?: number;\n rowSpan?: number;\n}\n\n// Table Components\nfunction TableComponent<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(\n {\n data,\n columns,\n loading = false,\n emptyText = \"No data\",\n className,\n variant,\n size,\n rowKey = \"id\",\n onRowClick,\n onSort,\n sortColumn: controlledSortColumn,\n sortDirection: controlledSortDirection,\n pagination,\n selection,\n caption,\n ...props\n }: TableProps<T>,\n ref: React.Ref<HTMLTableElement>,\n) {\n // Use controlled props if provided, otherwise use internal state\n const [internalSortState, setInternalSortState] = useState<{\n column: string;\n direction: \"asc\" | \"desc\";\n } | null>(null);\n\n // Determine current sort state (controlled takes precedence)\n const isControlled = controlledSortColumn !== undefined;\n const sortState =\n isControlled && controlledSortColumn\n ? {\n column: controlledSortColumn,\n direction: controlledSortDirection || \"asc\",\n }\n : internalSortState;\n\n // Sync internal state with controlled props when they change\n // Sync internal state with controlled props when they change\n // Note: unneeded re-render caused by resetting state. We derive sortState above so stale internal state is ignored.\n /* \n useEffect(() => {\n if (isControlled && controlledSortColumn) {\n setInternalSortState(null);\n }\n }, [isControlled, controlledSortColumn]); \n */\n\n const handleSort = (column: TableColumn<T>) => {\n if (!column.sortable) return;\n\n const newDirection =\n sortState?.column === column.key && sortState?.direction === \"asc\"\n ? \"desc\"\n : \"asc\";\n\n // Only update internal state if not controlled\n if (!isControlled) {\n setInternalSortState({ column: column.key, direction: newDirection });\n }\n\n // Always call onSort callback for controlled usage\n onSort?.(column, newDirection);\n };\n\n /**\n * Nullish, not falsy.\n *\n * `record[rowKey] || index` reads a record with `id: 0` as having no key and\n * falls back to its position, so a zero-keyed row at index 1 reported itself as\n * key `1` - which is a different record's id. Empty string is a legitimate key\n * for the same reason.\n */\n const getRowKey = (record: T, index: number): string | number => {\n if (typeof rowKey === \"function\") {\n return rowKey(record);\n }\n return (record[rowKey] as string | number | undefined) ?? index;\n };\n\n const isRowDisabled = (record: T): boolean =>\n selection?.getCheckboxProps?.(record).disabled === true;\n\n /**\n * The rows on this page that a checkbox can actually act on.\n *\n * Everything below is expressed in terms of these rather than in terms of\n * `data.length` or `selectedRowKeys.length`. Selection is a list of keys that\n * may name records on other pages, so comparing its length to the number of\n * visible rows answered a question nobody asked: with two rows on screen and\n * two rows selected elsewhere, \"select all\" showed as checked.\n */\n const selectableKeys = selection\n ? data\n .map((record, index) => ({ record, key: getRowKey(record, index) }))\n .filter(({ record }) => !isRowDisabled(record))\n .map(({ key }) => key)\n : [];\n\n /**\n * The records behind a set of keys, as far as this page can tell.\n *\n * A key belonging to another page cannot be resolved here, because the\n * component has only been given the current page. The keys are the complete\n * answer; the records are the subset that is on screen. Documented on the prop,\n * because a consumer paginating server-side has to keep its own map.\n */\n const recordsForKeys = (keys: (string | number)[]): T[] =>\n data.filter((record, index) => keys.includes(getRowKey(record, index)));\n\n const isRowSelected = (record: T, index: number): boolean => {\n if (!selection) return false;\n const key = getRowKey(record, index);\n return selection.selectedRowKeys.includes(key);\n };\n\n const handleRowSelection = (\n record: T,\n index: number,\n checked: boolean,\n ): void => {\n if (!selection || isRowDisabled(record)) return;\n\n const key = getRowKey(record, index);\n const newSelectedKeys = checked\n ? selection.selectedRowKeys.includes(key)\n ? selection.selectedRowKeys\n : [...selection.selectedRowKeys, key]\n : selection.selectedRowKeys.filter((k) => k !== key);\n\n selection.onChange(newSelectedKeys, recordsForKeys(newSelectedKeys));\n };\n\n /**\n * Adds or removes this page's selectable rows, and leaves every other key\n * alone.\n *\n * It used to replace the whole selection with either every visible key or\n * nothing, so paging through a table and pressing select-all on the second page\n * silently discarded the first page's selection - and it included rows the\n * consumer had disabled.\n */\n const handleSelectAll = (checked: boolean) => {\n if (!selection) return;\n\n const others = selection.selectedRowKeys.filter(\n (key) => !selectableKeys.includes(key),\n );\n const newSelectedKeys = checked ? [...others, ...selectableKeys] : others;\n\n selection.onChange(newSelectedKeys, recordsForKeys(newSelectedKeys));\n };\n\n const selectedOnPage = selectableKeys.filter((key) =>\n selection?.selectedRowKeys.includes(key),\n );\n\n const isAllSelected =\n selection &&\n selectableKeys.length > 0 &&\n selectedOnPage.length === selectableKeys.length;\n\n const isIndeterminate =\n selection &&\n selectedOnPage.length > 0 &&\n selectedOnPage.length < selectableKeys.length;\n\n return (\n <div className=\"w-full overflow-x-auto\">\n <div className=\"min-w-full\">\n <table\n ref={ref}\n className={cn(tableVariants({ variant, size }), className)}\n {...props}\n >\n {caption && <caption className=\"sr-only\">{caption}</caption>}\n <TableHeader>\n <TableRow>\n {selection && (\n <th\n className={cn(tableCellVariants({ variant, size }))}\n scope=\"col\"\n role=\"columnheader\"\n >\n <input\n type=\"checkbox\"\n checked={isAllSelected}\n ref={(input) => {\n if (input) input.indeterminate = isIndeterminate || false;\n }}\n onChange={(e) => handleSelectAll(e.target.checked)}\n className=\"rounded border-input text-primary focus:ring-ring\"\n aria-label=\"Select all rows\"\n />\n </th>\n )}\n {columns.map((column) => (\n <th\n key={column.key}\n className={cn(\n tableCellVariants({ variant, size }),\n column.className,\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n )}\n scope=\"col\"\n role=\"columnheader\"\n {...(column.width && { style: { width: column.width } })}\n >\n <div className=\"flex items-center gap-2\">\n <span>{column.title}</span>\n {column.sortable && (\n <button\n type=\"button\"\n onClick={() => handleSort(column)}\n className=\"flex flex-col text-muted-foreground hover:text-foreground\"\n aria-label={`Sort by ${column.title}`}\n >\n <svg\n className={cn(\n \"w-3 h-3\",\n sortState?.column === column.key &&\n sortState?.direction === \"asc\"\n ? \"text-primary\"\n : \"text-muted-foreground\",\n )}\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path d=\"M5 8l5-5 5 5H5z\" />\n </svg>\n <svg\n className={cn(\n \"w-3 h-3 -mt-1\",\n sortState?.column === column.key &&\n sortState?.direction === \"desc\"\n ? \"text-primary\"\n : \"text-muted-foreground\",\n )}\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path d=\"M5 12l5 5 5-5H5z\" />\n </svg>\n </button>\n )}\n </div>\n </th>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {loading ? (\n <TableRow>\n <TableCell\n colSpan={columns.length + (selection ? 1 : 0)}\n variant={variant}\n size={size}\n className=\"text-center py-8\"\n >\n <div className=\"flex items-center justify-center gap-2\">\n <div className=\"animate-spin rounded-full h-4 w-4 border-b-2 border-primary\"></div>\n <span>Loading...</span>\n </div>\n </TableCell>\n </TableRow>\n ) : data.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={columns.length + (selection ? 1 : 0)}\n variant={variant}\n size={size}\n className=\"text-center py-8 text-muted-foreground\"\n >\n {emptyText}\n </TableCell>\n </TableRow>\n ) : (\n data.map((record, index) => (\n <TableRow\n key={getRowKey(record, index)}\n variant={variant}\n onClick={() => onRowClick?.(record, index)}\n selected={isRowSelected(record, index)}\n >\n {selection && (\n <TableCell variant={variant} size={size}>\n <input\n type=\"checkbox\"\n checked={isRowSelected(record, index)}\n onChange={(e) =>\n handleRowSelection(record, index, e.target.checked)\n }\n className=\"rounded border-input text-primary focus:ring-ring\"\n aria-label={`Select row ${index + 1}`}\n {...selection.getCheckboxProps?.(record)}\n />\n </TableCell>\n )}\n {columns.map((column) => (\n <TableCell\n key={column.key}\n variant={variant}\n size={size}\n className={cn(\n column.className,\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n )}\n >\n {column.render\n ? column.render(\n column.dataIndex\n ? record[column.dataIndex]\n : record,\n record,\n index,\n )\n : column.dataIndex\n ? (record[column.dataIndex] as React.ReactNode)\n : ((record as Record<string, unknown>)[\n column.key\n ] as React.ReactNode)}\n </TableCell>\n ))}\n </TableRow>\n ))\n )}\n </TableBody>\n </table>\n </div>\n\n {pagination && (\n <div className=\"flex flex-col sm:flex-row items-center justify-between mt-4 px-2 sm:px-4 py-3 bg-card border-t border-border gap-2 sm:gap-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-muted-foreground\">\n Showing {(pagination.current - 1) * pagination.pageSize + 1} to{\" \"}\n {Math.min(\n pagination.current * pagination.pageSize,\n pagination.total,\n )}{\" \"}\n of {pagination.total} results\n </span>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {pagination.showSizeChanger && (\n <select\n value={pagination.pageSize}\n onChange={(e) => pagination.onChange(1, Number(e.target.value))}\n className=\"rounded border-input bg-background text-sm\"\n aria-label=\"Select page size\"\n >\n <option value={10}>10 / page</option>\n <option value={20}>20 / page</option>\n <option value={50}>50 / page</option>\n <option value={100}>100 / page</option>\n </select>\n )}\n\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() =>\n pagination.onChange(\n pagination.current - 1,\n pagination.pageSize,\n )\n }\n disabled={pagination.current <= 1}\n className=\"px-3 py-1 text-sm border border-input rounded hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed\"\n aria-label=\"Go to previous page\"\n >\n Previous\n </button>\n\n <span className=\"px-3 py-1 text-sm\">\n Page {pagination.current} of{\" \"}\n {Math.ceil(pagination.total / pagination.pageSize)}\n </span>\n\n <button\n type=\"button\"\n onClick={() =>\n pagination.onChange(\n pagination.current + 1,\n pagination.pageSize,\n )\n }\n disabled={\n pagination.current >=\n Math.ceil(pagination.total / pagination.pageSize)\n }\n className=\"px-3 py-1 text-sm border border-input rounded hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed\"\n aria-label=\"Go to next page\"\n >\n Next\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nconst TableForwardRef = React.forwardRef(TableComponent) as <\n T extends Record<string, unknown> = Record<string, unknown>,\n>(\n props: TableProps<T> & { ref?: React.Ref<HTMLTableElement> },\n) => React.ReactElement;\n\n(\n TableForwardRef as React.ComponentType<TableProps<unknown>> & {\n displayName?: string;\n }\n).displayName = \"Table\";\n\nexport const Table = TableForwardRef;\n\nexport const TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n TableHeaderProps\n>(({ className, variant, size, children, ...props }, ref) => (\n <thead\n ref={ref}\n className={cn(tableHeaderVariants({ variant, size }), className)}\n {...props}\n >\n {children}\n </thead>\n));\n\nTableHeader.displayName = \"TableHeader\";\n\nexport const TableBody = React.forwardRef<\n HTMLTableSectionElement,\n TableBodyProps\n>(({ className, children, ...props }, ref) => (\n <tbody ref={ref} className={cn(className)} {...props}>\n {children}\n </tbody>\n));\n\nTableBody.displayName = \"TableBody\";\n\nexport const TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, children, onClick, selected, variant, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n tableRowVariants({ variant }),\n selected && \"bg-primary/10\",\n onClick && \"cursor-pointer\",\n className,\n )}\n onClick={onClick}\n {...props}\n >\n {children}\n </tr>\n ),\n);\n\nTableRow.displayName = \"TableRow\";\n\nexport const TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, children, variant, size, colSpan, rowSpan, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(tableCellVariants({ variant, size }), className)}\n colSpan={colSpan}\n rowSpan={rowSpan}\n {...props}\n >\n {children}\n </td>\n ),\n);\n\nTableCell.displayName = \"TableCell\";\n\nexport const TableHead = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, children, variant, size, colSpan, rowSpan, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n tableCellVariants({ variant, size }),\n \"font-medium\",\n className,\n )}\n colSpan={colSpan}\n rowSpan={rowSpan}\n {...props}\n >\n {children}\n </th>\n ),\n);\n\nTableHead.displayName = \"TableHead\";\n\n// Export variants for external use\nexport { tableVariants, tableHeaderVariants, tableCellVariants };\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';var chunkUC577SR4_cjs=require('./chunk-UC577SR4.cjs'),chunkFUENXWR7_cjs=require('./chunk-FUENXWR7.cjs'),chunk7SPPGTBT_cjs=require('./chunk-7SPPGTBT.cjs'),chunkITRGJNWL_cjs=require('./chunk-ITRGJNWL.cjs'),t=require('react'),classVarianceAuthority=require('class-variance-authority');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var t__default=/*#__PURE__*/_interopDefault(t);function se(o){return typeof o=="boolean"?o:typeof o=="string"?o!=="false"&&o!=="":!!o}function ie(o){return o==null?"":String(o)}var Ie=classVarianceAuthority.cva("flex flex-wrap items-center gap-2 p-4 bg-muted border-b border-border",{variants:{variant:{default:"bg-muted",compact:"p-2 bg-card",minimal:"p-2 bg-transparent border-0"}},defaultVariants:{variant:"default"}});function ue({data:o,columns:C,searchable:D=true,searchPlaceholder:le="Search...",searchKeys:j,onSearch:P,searchTerm:E,onSearchTermChange:K,filterable:T=false,manualSearch:Y=false,manualFiltering:_=false,manualSorting:q=false,filters:b=[],onFilter:V,columnFilters:G,onColumnFiltersChange:H,defaultSortColumn:de,defaultSortDirection:ce="asc",sortColumn:J,sortDirection:ge,onSortChange:Q,defaultPageSize:me=10,showPagination:y=true,currentPage:U,pageSize:W,onPageChange:X,onPageSizeChange:z,totalItems:i,showSearch:Z=true,showFilters:R=true,filterBarClassName:fe,searchBarClassName:pe,rowKey:be="id",emptyText:ye="No data found",...he}){let B=E!==void 0,$=G!==void 0,w=J!==void 0,a=U!==void 0,[ke,xe]=t.useState(""),m=B?E:ke,ee=t.useMemo(()=>B?e=>K?.(e):xe,[B,K]),[Ce,ve]=t.useState({}),c=$?G:Ce,M=t.useMemo(()=>$?e=>H?.(e):ve,[$,H]),[Se,Te]=t.useState(de),[we,Ne]=t.useState(ce),v=w?J:Se,A=w?ge:we,ne=Te,re=Ne,[Fe,De]=t.useState(1),[Pe,Ve]=t.useState(me),f=a?U:Fe,s=W!==void 0?W:Pe,p=t.useMemo(()=>a?e=>X?.(e):De,[a,X]),te=t.useMemo(()=>z?e=>z(e):Ve,[z]),h=t.useMemo(()=>{if(Y||!D||!m.trim())return o;let e=m.toLowerCase(),r=j||C.map(n=>n.dataIndex||n.key).filter(Boolean);return o.filter(n=>r.some(u=>{let l=n[u];return l==null?false:String(l).toLowerCase().includes(e)}))},[o,m,D,j,C,Y]),k=t.useMemo(()=>_||!T||b.length===0||Object.keys(c).length===0?h:h.filter(e=>b.every(r=>{let n=c[r.key];if(n==null||n==="")return true;if(r.filterFn)return r.filterFn(n,e);let u=e[r.key];switch(r.type){case "text":return String(u).toLowerCase().includes(String(n).toLowerCase());case "number":{let l=Number(n);return Number.isNaN(l)?true:Number(u)===l}case "boolean":return !!u===se(n);case "select":return String(u)===String(n);default:return String(u).includes(String(n))}})),[h,c,T,b,_]),d=t.useMemo(()=>{if(q||!v)return k;let e=[...k],r=C.find(n=>n.key===v);return !r||!r.sortable||e.sort((n,u)=>{let l=r.dataIndex?n[r.dataIndex]:n[r.key],S=r.dataIndex?u[r.dataIndex]:u[r.key];if(l==null)return 1;if(S==null)return -1;let N=0;return typeof l=="number"&&typeof S=="number"?N=l-S:N=String(l).localeCompare(String(S)),A==="asc"?N:-N}),e},[k,v,A,C,q]),ze=t.useMemo(()=>{if(!y||a&&i!==void 0)return d;let e=(f-1)*s,r=e+s;return d.slice(e,r)},[d,f,s,y,a,i]);t.useMemo(()=>y?Math.ceil(a&&i!==void 0?i/s:d.length/s):1,[y,a,i,s,d.length]);let Be=t.useCallback(e=>{ee(e),a||p(1);},[ee,p,a]),I=t.useCallback((e,r)=>{let n={...c,[e]:r};M(n),a||p(1);},[c,M,p,a]),$e=t.useCallback((e,r)=>{if(w){Q?.(e.key,r);return}ne(e.key),re(r);},[w,Q,ne,re]),Me=t.useCallback((e,r)=>{p(e),r!==s&&(te(r),p(1));},[s,p,te]);return t__default.default.useEffect(()=>{P&&P(m,h);},[m,h,P]),t__default.default.useEffect(()=>{V&&V(c,k);},[c,k,V]),t__default.default.createElement("div",{className:"w-full"},(Z||R&&T&&b.length>0)&&t__default.default.createElement("div",{className:chunkITRGJNWL_cjs.a(Ie(),fe)},Z&&D&&t__default.default.createElement("div",{className:chunkITRGJNWL_cjs.a("flex-1 min-w-[200px]",pe)},t__default.default.createElement(chunkFUENXWR7_cjs.b,{type:"text",placeholder:le,value:m,onChange:e=>Be(e.target.value),className:"w-full","aria-label":"Search table"})),R&&T&&b.length>0&&t__default.default.createElement("div",{className:"flex flex-wrap items-center gap-2"},b.map(e=>{let r=c[e.key];return e.type==="boolean"?t__default.default.createElement("select",{key:e.key,value:r==null?"":se(r)?"true":"false",onChange:n=>I(e.key,n.target.value===""?void 0:n.target.value==="true"),className:"rounded-md border border-input px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring focus:border-primary","aria-label":`Filter by ${e.key}`},t__default.default.createElement("option",{value:""},"All ",e.key),t__default.default.createElement("option",{value:"true"},e.placeholder?`${e.placeholder}: yes`:"Yes"),t__default.default.createElement("option",{value:"false"},e.placeholder?`${e.placeholder}: no`:"No")):e.type==="select"&&e.options?t__default.default.createElement("select",{key:e.key,value:ie(r),onChange:n=>I(e.key,n.target.value||void 0),className:"rounded-md border border-input px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring focus:border-primary","aria-label":`Filter by ${e.key}`},t__default.default.createElement("option",{value:""},"All ",e.key),e.options.map(n=>t__default.default.createElement("option",{key:n.value,value:String(n.value)},n.label))):t__default.default.createElement(chunkFUENXWR7_cjs.b,{key:e.key,type:e.type==="number"?"number":"text",placeholder:e.placeholder||`Filter ${e.key}...`,value:ie(r),onChange:n=>I(e.key,n.target.value===""?void 0:e.type==="number"?Number(n.target.value):n.target.value),className:"min-w-[150px]","aria-label":`Filter by ${e.key}`})}),Object.keys(c).length>0&&t__default.default.createElement("button",{type:"button",onClick:()=>M({}),className:"px-3 py-2 text-sm text-muted-foreground hover:text-foreground underline","aria-label":"Clear all filters"},"Clear filters"))),t__default.default.createElement(chunkUC577SR4_cjs.d,{...he,data:ze,columns:C,rowKey:be,emptyText:ye,...v&&{sortColumn:v,sortDirection:A},onSort:$e,...y&&{pagination:{current:f,pageSize:s,total:a&&i!==void 0?i:d.length,onChange:Me,showSizeChanger:true}}}),y&&(a&&i!==void 0?i>0:d.length>0)&&t__default.default.createElement("div",{className:"mt-2 px-4 py-2 text-sm text-muted-foreground"},a&&i!==void 0?t__default.default.createElement(t__default.default.Fragment,null,"Showing ",(f-1)*s+1," to"," ",Math.min(f*s,i)," of ",i," ","results",m&&" (filtered)"):t__default.default.createElement(t__default.default.Fragment,null,"Showing ",(f-1)*s+1," to"," ",Math.min(f*s,d.length)," of"," ",d.length," results",m&&` (filtered from ${o.length} total)`)))}ue.displayName="DataTable";var He=chunk7SPPGTBT_cjs.a(ue);exports.a=ue;exports.b=He;//# sourceMappingURL=chunk-KASVYULP.cjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-KASVYULP.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/core/data-table.tsx"],"names":["asBoolean","value","inputValue","filterBarVariants","cva","DataTable","initialData","columns","searchable","searchPlaceholder","searchKeys","onSearch","controlledSearchTerm","onSearchTermChange","filterable","manualSearch","manualFiltering","manualSorting","filters","onFilter","controlledColumnFilters","onColumnFiltersChange","defaultSortColumn","defaultSortDirection","controlledSortColumn","controlledSortDirection","onSortChange","defaultPageSize","showPagination","controlledCurrentPage","controlledPageSize","onPageChange","onPageSizeChange","totalItems","showSearch","showFilters","filterBarClassName","searchBarClassName","rowKey","emptyText","tableProps","isControlledSearch","isControlledFilters","isControlledSort","isControlledPagination","internalSearchTerm","setInternalSearchTerm","useState","searchTerm","setSearchTerm","useMemo","internalColumnFilters","setInternalColumnFilters","columnFilters","setColumnFilters","internalSortColumn","setInternalSortColumn","internalSortDirection","setInternalSortDirection","sortColumn","sortDirection","setSortColumn","setSortDirection","internalCurrentPage","setInternalCurrentPage","internalPageSize","setInternalPageSize","currentPage","pageSize","setCurrentPage","page","setPageSize","size","searchFilteredData","term","keys","col","record","key","filterFilteredData","filter","filterValue","recordValue","wanted","sortedData","sorted","column","a","b","aValue","bValue","comparison","paginatedData","startIndex","endIndex","handleSearch","useCallback","handleFilterChange","newFilters","handleSort","direction","handlePageChange","newPageSize","React","cn","Input","e","option","Table","DataTableMemoized","memo"],"mappings":"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","file":"chunk-KASVYULP.cjs","sourcesContent":["import React, { useState, useMemo, useCallback } from \"react\";\nimport { cva } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\nimport { memo } from \"../../lib/memo\";\nimport { Table, TableColumn, TableProps } from \"./table\";\nimport { Input } from \"./input\";\n\n// Filter types\nexport type FilterType = \"text\" | \"select\" | \"number\" | \"date\" | \"boolean\";\n\nexport interface ColumnFilter<T = Record<string, unknown>> {\n key: string;\n type: FilterType;\n options?: Array<{ label: string; value: string | number }>;\n placeholder?: string;\n filterFn?: (value: unknown, record: T) => boolean;\n}\n\nexport interface DataTableProps<T = Record<string, unknown>> extends Omit<\n TableProps<T>,\n \"data\" | \"onSort\" | \"sortColumn\" | \"sortDirection\"\n> {\n data: T[];\n columns: TableColumn<T>[];\n\n // Search\n searchable?: boolean;\n searchPlaceholder?: string;\n searchKeys?: Array<keyof T | string>;\n onSearch?: (searchTerm: string, filteredData: T[]) => void;\n\n // Controlled search (for server-side filtering)\n searchTerm?: string;\n onSearchTermChange?: (searchTerm: string) => void;\n\n // Filtering\n filterable?: boolean;\n filters?: ColumnFilter<T>[];\n onFilter?: (filters: Record<string, unknown>, filteredData: T[]) => void;\n\n // Controlled filters (for server-side filtering)\n columnFilters?: Record<string, unknown>;\n onColumnFiltersChange?: (filters: Record<string, unknown>) => void;\n\n // Sorting (enhanced)\n defaultSortColumn?: string;\n defaultSortDirection?: \"asc\" | \"desc\";\n\n // Controlled sorting (for server-side sorting)\n sortColumn?: string;\n sortDirection?: \"asc\" | \"desc\";\n onSortChange?: (column: string, direction: \"asc\" | \"desc\") => void;\n\n // Pagination (enhanced)\n defaultPageSize?: number;\n showPagination?: boolean;\n\n // Controlled pagination (for server-side pagination)\n currentPage?: number;\n pageSize?: number;\n onPageChange?: (page: number) => void;\n onPageSizeChange?: (size: number) => void;\n totalItems?: number; // Required for server-side pagination\n\n /**\n * Who does the work.\n *\n * Passing `searchTerm`, `columnFilters` or `sortColumn` makes DataTable\n * controlled - it stops owning that piece of state - but it kept filtering and\n * sorting the rows you gave it anyway. For a server-backed table that is\n * actively wrong: a server searching without accent distinctions returns\n * `{ name: \"José\" }` for the query `jose`, and the local substring filter then\n * threw the row away while `totalItems` still counted it. Controlled sorting\n * likewise reordered the page the server had already ordered.\n *\n * Controlled state and processing ownership are separate questions now. Set\n * these when the rows arriving in `data` are already searched, filtered or\n * sorted; the callbacks still fire so you know what the user asked for.\n *\n * Pagination has always worked this way, under a different name: it is manual\n * when `currentPage` and `totalItems` are both given.\n */\n manualSearch?: boolean;\n manualFiltering?: boolean;\n manualSorting?: boolean;\n\n // UI\n showSearch?: boolean;\n showFilters?: boolean;\n filterBarClassName?: string;\n searchBarClassName?: string;\n}\n\n/**\n * What a boolean filter value means, from a control or from a consumer.\n *\n * The select below emits real booleans, but a controlled `columnFilters` may hold\n * whatever the consumer put there, and \"false\" arriving as a string used to mean\n * true.\n */\nfunction asBoolean(value: unknown): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") return value !== \"false\" && value !== \"\";\n return Boolean(value);\n}\n\n/** Empty for a value that is absent, and \"0\" or \"false\" when that is the value. */\nfunction inputValue(value: unknown): string {\n return value === undefined || value === null ? \"\" : String(value);\n}\n\n// Filter bar component\nconst filterBarVariants = cva(\n \"flex flex-wrap items-center gap-2 p-4 bg-muted border-b border-border\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n compact: \"p-2 bg-card\",\n minimal: \"p-2 bg-transparent border-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport function DataTable<\n T extends Record<string, unknown> = Record<string, unknown>,\n>({\n data: initialData,\n columns,\n searchable = true,\n searchPlaceholder = \"Search...\",\n searchKeys,\n onSearch,\n searchTerm: controlledSearchTerm,\n onSearchTermChange,\n filterable = false,\n manualSearch = false,\n manualFiltering = false,\n manualSorting = false,\n filters = [],\n onFilter,\n columnFilters: controlledColumnFilters,\n onColumnFiltersChange,\n defaultSortColumn,\n defaultSortDirection = \"asc\",\n sortColumn: controlledSortColumn,\n sortDirection: controlledSortDirection,\n onSortChange,\n defaultPageSize = 10,\n showPagination = true,\n currentPage: controlledCurrentPage,\n pageSize: controlledPageSize,\n onPageChange,\n onPageSizeChange,\n totalItems,\n showSearch = true,\n showFilters = true,\n filterBarClassName,\n searchBarClassName,\n rowKey = \"id\",\n emptyText = \"No data found\",\n ...tableProps\n}: DataTableProps<T>) {\n // Determine if component is in controlled mode\n const isControlledSearch = controlledSearchTerm !== undefined;\n const isControlledFilters = controlledColumnFilters !== undefined;\n const isControlledSort = controlledSortColumn !== undefined;\n const isControlledPagination = controlledCurrentPage !== undefined;\n\n // Search state (controlled or uncontrolled)\n const [internalSearchTerm, setInternalSearchTerm] = useState(\"\");\n const searchTerm = isControlledSearch\n ? controlledSearchTerm\n : internalSearchTerm;\n const setSearchTerm = useMemo(\n () =>\n isControlledSearch\n ? (value: string) => onSearchTermChange?.(value)\n : setInternalSearchTerm,\n [isControlledSearch, onSearchTermChange],\n );\n\n // Filter state (controlled or uncontrolled)\n const [internalColumnFilters, setInternalColumnFilters] = useState<\n Record<string, unknown>\n >({});\n const columnFilters = isControlledFilters\n ? controlledColumnFilters\n : internalColumnFilters;\n const setColumnFilters = useMemo(\n () =>\n isControlledFilters\n ? (filters: Record<string, unknown>) => onColumnFiltersChange?.(filters)\n : setInternalColumnFilters,\n [isControlledFilters, onColumnFiltersChange],\n );\n\n // Sort state (controlled or uncontrolled)\n const [internalSortColumn, setInternalSortColumn] = useState<\n string | undefined\n >(defaultSortColumn);\n const [internalSortDirection, setInternalSortDirection] = useState<\n \"asc\" | \"desc\"\n >(defaultSortDirection);\n const sortColumn = isControlledSort\n ? controlledSortColumn\n : internalSortColumn;\n const sortDirection = isControlledSort\n ? controlledSortDirection\n : internalSortDirection;\n // Only the uncontrolled path uses these. A controlled table goes through\n // `handleSort`, which emits both values at once - see the comment there for\n // what the controlled versions of these used to do.\n const setSortColumn = setInternalSortColumn;\n const setSortDirection = setInternalSortDirection;\n\n // Pagination state (controlled or uncontrolled)\n const [internalCurrentPage, setInternalCurrentPage] = useState(1);\n const [internalPageSize, setInternalPageSize] = useState(defaultPageSize);\n const currentPage = isControlledPagination\n ? controlledCurrentPage\n : internalCurrentPage;\n const pageSize =\n controlledPageSize !== undefined ? controlledPageSize : internalPageSize;\n const setCurrentPage = useMemo(\n () =>\n isControlledPagination\n ? (page: number) => onPageChange?.(page)\n : setInternalCurrentPage,\n [isControlledPagination, onPageChange],\n );\n const setPageSize = useMemo(\n () =>\n onPageSizeChange\n ? (size: number) => onPageSizeChange(size)\n : setInternalPageSize,\n [onPageSizeChange],\n );\n\n // Apply search\n const searchFilteredData = useMemo(() => {\n // The rows already are the search result; searching them again would only\n // remove what the server decided to include.\n if (manualSearch) return initialData;\n if (!searchable || !searchTerm.trim()) {\n return initialData;\n }\n\n const term = searchTerm.toLowerCase();\n const keys =\n searchKeys ||\n columns.map((col) => col.dataIndex || col.key).filter(Boolean);\n\n return initialData.filter((record) => {\n return keys.some((key) => {\n const value =\n typeof key === \"string\"\n ? (record as Record<string, unknown>)[key]\n : record[key as keyof T];\n\n if (value === null || value === undefined) return false;\n\n return String(value).toLowerCase().includes(term);\n });\n });\n }, [initialData, searchTerm, searchable, searchKeys, columns, manualSearch]);\n\n // Apply column filters\n const filterFilteredData = useMemo(() => {\n if (manualFiltering) return searchFilteredData;\n if (\n !filterable ||\n filters.length === 0 ||\n Object.keys(columnFilters).length === 0\n ) {\n return searchFilteredData;\n }\n\n return searchFilteredData.filter((record) => {\n return filters.every((filter) => {\n const filterValue = columnFilters[filter.key];\n\n // Skip if no filter value\n if (\n filterValue === undefined ||\n filterValue === null ||\n filterValue === \"\"\n ) {\n return true;\n }\n\n // Use custom filter function if provided\n if (filter.filterFn) {\n return filter.filterFn(filterValue, record);\n }\n\n // Default filtering logic\n const recordValue = (record as Record<string, unknown>)[filter.key];\n\n switch (filter.type) {\n case \"text\":\n return String(recordValue)\n .toLowerCase()\n .includes(String(filterValue).toLowerCase());\n case \"number\": {\n // A filter value that is not a number matches nothing rather than\n // matching zero. `Number(\"\")` is 0, which is how a cleared input used\n // to leave only the zero-valued rows on screen.\n const wanted = Number(filterValue);\n if (Number.isNaN(wanted)) return true;\n return Number(recordValue) === wanted;\n }\n case \"boolean\":\n // Not `Boolean(filterValue)`. The control used to be a text input, so\n // typing \"false\" gave the string \"false\", and `Boolean(\"false\")` is\n // true - the filter selected exactly the records it was asked to\n // exclude.\n return Boolean(recordValue) === asBoolean(filterValue);\n case \"select\":\n return String(recordValue) === String(filterValue);\n default:\n return String(recordValue).includes(String(filterValue));\n }\n });\n });\n }, [searchFilteredData, columnFilters, filterable, filters, manualFiltering]);\n\n // Apply sorting\n const sortedData = useMemo(() => {\n // Keep the order the server sent. Re-sorting a page it has already ordered\n // produces a different order, not the same one.\n if (manualSorting) return filterFilteredData;\n if (!sortColumn) {\n return filterFilteredData;\n }\n\n const sorted = [...filterFilteredData];\n const column = columns.find((col) => col.key === sortColumn);\n\n if (!column || !column.sortable) {\n return sorted;\n }\n\n sorted.sort((a, b) => {\n const aValue = column.dataIndex\n ? a[column.dataIndex]\n : (a as Record<string, unknown>)[column.key];\n const bValue = column.dataIndex\n ? b[column.dataIndex]\n : (b as Record<string, unknown>)[column.key];\n\n // Handle null/undefined\n if (aValue === null || aValue === undefined) return 1;\n if (bValue === null || bValue === undefined) return -1;\n\n // Compare values\n let comparison = 0;\n if (typeof aValue === \"number\" && typeof bValue === \"number\") {\n comparison = aValue - bValue;\n } else {\n comparison = String(aValue).localeCompare(String(bValue));\n }\n\n return sortDirection === \"asc\" ? comparison : -comparison;\n });\n\n return sorted;\n }, [filterFilteredData, sortColumn, sortDirection, columns, manualSorting]);\n\n // Apply pagination\n // In controlled mode with server-side pagination, use provided data directly\n // In uncontrolled mode, slice the data client-side\n const paginatedData = useMemo(() => {\n if (!showPagination) {\n return sortedData;\n }\n\n // If in controlled pagination mode with totalItems, assume data is already paginated\n if (isControlledPagination && totalItems !== undefined) {\n return sortedData; // Data is already paginated server-side\n }\n\n // Client-side pagination\n const startIndex = (currentPage - 1) * pageSize;\n const endIndex = startIndex + pageSize;\n\n return sortedData.slice(startIndex, endIndex);\n }, [\n sortedData,\n currentPage,\n pageSize,\n showPagination,\n isControlledPagination,\n totalItems,\n ]);\n\n // Calculate total pages for pagination display\n // Note: Currently not used but kept for future pagination UI enhancements\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _totalPages = useMemo(() => {\n if (!showPagination) return 1;\n if (isControlledPagination && totalItems !== undefined) {\n return Math.ceil(totalItems / pageSize);\n }\n return Math.ceil(sortedData.length / pageSize);\n }, [\n showPagination,\n isControlledPagination,\n totalItems,\n pageSize,\n sortedData.length,\n ]);\n\n // Callbacks\n const handleSearch = useCallback(\n (value: string) => {\n setSearchTerm(value);\n if (!isControlledPagination) {\n setCurrentPage(1); // Reset to first page on search (only in uncontrolled mode)\n }\n },\n [setSearchTerm, setCurrentPage, isControlledPagination],\n );\n\n const handleFilterChange = useCallback(\n (key: string, value: unknown) => {\n const newFilters = {\n ...columnFilters,\n [key]: value,\n };\n setColumnFilters(newFilters);\n if (!isControlledPagination) {\n setCurrentPage(1); // Reset to first page on filter (only in uncontrolled mode)\n }\n },\n [columnFilters, setColumnFilters, setCurrentPage, isControlledPagination],\n );\n\n /**\n * One callback per click, carrying both new values.\n *\n * The controlled setters each emitted `onSortChange` on their own, and each one\n * read the *other* value from the render it was created in. Clicking \"Age\" on a\n * table sorted by name descending produced `(\"age\", \"desc\")` immediately\n * followed by `(\"name\", \"asc\")` - two requests, the second of which put the old\n * column back. A consumer writing both values from the callback, which is what\n * the docs show, ended up where it started.\n *\n * It also never fired at all for a controlled table that started unsorted,\n * because the setter guarded on an existing column and direction.\n */\n const handleSort = useCallback(\n (column: TableColumn<T>, direction: \"asc\" | \"desc\") => {\n if (isControlledSort) {\n onSortChange?.(column.key, direction);\n return;\n }\n setSortColumn(column.key);\n setSortDirection(direction);\n },\n [isControlledSort, onSortChange, setSortColumn, setSortDirection],\n );\n\n const handlePageChange = useCallback(\n (page: number, newPageSize: number) => {\n setCurrentPage(page);\n if (newPageSize !== pageSize) {\n setPageSize(newPageSize);\n setCurrentPage(1); // Reset to first page when page size changes\n }\n },\n [pageSize, setCurrentPage, setPageSize],\n );\n\n // Notify callbacks\n React.useEffect(() => {\n if (onSearch) {\n onSearch(searchTerm, searchFilteredData);\n }\n }, [searchTerm, searchFilteredData, onSearch]);\n\n React.useEffect(() => {\n if (onFilter) {\n onFilter(columnFilters, filterFilteredData);\n }\n }, [columnFilters, filterFilteredData, onFilter]);\n\n return (\n <div className=\"w-full\">\n {/* Search and Filter Bar */}\n {(showSearch || (showFilters && filterable && filters.length > 0)) && (\n <div className={cn(filterBarVariants(), filterBarClassName)}>\n {/* Search */}\n {showSearch && searchable && (\n <div className={cn(\"flex-1 min-w-[200px]\", searchBarClassName)}>\n <Input\n type=\"text\"\n placeholder={searchPlaceholder}\n value={searchTerm}\n onChange={(e) => handleSearch(e.target.value)}\n className=\"w-full\"\n aria-label=\"Search table\"\n />\n </div>\n )}\n\n {/* Column Filters */}\n {showFilters && filterable && filters.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {filters.map((filter) => {\n const filterValue = columnFilters[filter.key];\n\n // A boolean needs three states - either value, or no filter -\n // which a text box cannot express. It used to be one, and typing\n // \"false\" selected the records where the value was true.\n if (filter.type === \"boolean\") {\n return (\n <select\n key={filter.key}\n value={\n filterValue === undefined || filterValue === null\n ? \"\"\n : asBoolean(filterValue)\n ? \"true\"\n : \"false\"\n }\n onChange={(e) =>\n handleFilterChange(\n filter.key,\n e.target.value === \"\"\n ? undefined\n : e.target.value === \"true\",\n )\n }\n className=\"rounded-md border border-input px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring focus:border-primary\"\n aria-label={`Filter by ${filter.key}`}\n >\n <option value=\"\">All {filter.key}</option>\n <option value=\"true\">\n {filter.placeholder\n ? `${filter.placeholder}: yes`\n : \"Yes\"}\n </option>\n <option value=\"false\">\n {filter.placeholder\n ? `${filter.placeholder}: no`\n : \"No\"}\n </option>\n </select>\n );\n }\n\n if (filter.type === \"select\" && filter.options) {\n return (\n <select\n key={filter.key}\n value={inputValue(filterValue)}\n onChange={(e) =>\n handleFilterChange(\n filter.key,\n e.target.value || undefined,\n )\n }\n className=\"rounded-md border border-input px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring focus:border-primary\"\n aria-label={`Filter by ${filter.key}`}\n >\n <option value=\"\">All {filter.key}</option>\n {filter.options.map((option) => (\n <option key={option.value} value={String(option.value)}>\n {option.label}\n </option>\n ))}\n </select>\n );\n }\n\n return (\n <Input\n key={filter.key}\n type={filter.type === \"number\" ? \"number\" : \"text\"}\n placeholder={\n filter.placeholder || `Filter ${filter.key}...`\n }\n // `String(filterValue || \"\")` blanked a legitimate 0 and a\n // legitimate false, so the box disagreed with the filter it\n // was showing.\n value={inputValue(filterValue)}\n onChange={(e) =>\n handleFilterChange(\n filter.key,\n // An emptied box is no filter. `Number(\"\")` is 0, which\n // used to leave only the zero-valued rows behind.\n e.target.value === \"\"\n ? undefined\n : filter.type === \"number\"\n ? Number(e.target.value)\n : e.target.value,\n )\n }\n className=\"min-w-[150px]\"\n aria-label={`Filter by ${filter.key}`}\n />\n );\n })}\n\n {/* Clear Filters */}\n {Object.keys(columnFilters).length > 0 && (\n <button\n type=\"button\"\n onClick={() => setColumnFilters({})}\n className=\"px-3 py-2 text-sm text-muted-foreground hover:text-foreground underline\"\n aria-label=\"Clear all filters\"\n >\n Clear filters\n </button>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Table */}\n <Table\n {...tableProps}\n data={paginatedData}\n columns={columns}\n rowKey={rowKey}\n emptyText={emptyText}\n {...(sortColumn && {\n sortColumn,\n sortDirection,\n })}\n onSort={handleSort}\n {...(showPagination && {\n pagination: {\n current: currentPage,\n pageSize: pageSize,\n total:\n isControlledPagination && totalItems !== undefined\n ? totalItems\n : sortedData.length,\n onChange: handlePageChange,\n showSizeChanger: true,\n },\n })}\n />\n\n {/* Results Summary */}\n {showPagination &&\n (isControlledPagination && totalItems !== undefined\n ? totalItems > 0\n : sortedData.length > 0) && (\n <div className=\"mt-2 px-4 py-2 text-sm text-muted-foreground\">\n {isControlledPagination && totalItems !== undefined ? (\n <>\n Showing {(currentPage - 1) * pageSize + 1} to{\" \"}\n {Math.min(currentPage * pageSize, totalItems)} of {totalItems}{\" \"}\n results\n {searchTerm && \" (filtered)\"}\n </>\n ) : (\n <>\n Showing {(currentPage - 1) * pageSize + 1} to{\" \"}\n {Math.min(currentPage * pageSize, sortedData.length)} of{\" \"}\n {sortedData.length} results\n {searchTerm && ` (filtered from ${initialData.length} total)`}\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n\nDataTable.displayName = \"DataTable\";\n\n// Memoize DataTable for performance optimization\n// DataTable is a complex component with filtering, sorting, and pagination\nexport const DataTableMemoized = memo(DataTable) as typeof DataTable;\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';var chunkITRGJNWL_cjs=require('./chunk-ITRGJNWL.cjs'),r=require('react'),classVarianceAuthority=require('class-variance-authority');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var r__default=/*#__PURE__*/_interopDefault(r);var U=classVarianceAuthority.cva("w-full border-collapse transition-all duration-200",{variants:{variant:{default:"border border-border shadow-sm hover:shadow-md",striped:"border border-border shadow-sm hover:shadow-md",bordered:"border-2 border-border shadow-md hover:shadow-lg",hover:"border border-border shadow-sm hover:shadow-md",elevated:"border border-border shadow-lg hover:shadow-xl",interactive:"border border-border shadow-sm hover:shadow-md hover:border-primary"},size:{sm:"text-xs sm:text-sm",md:"text-sm sm:text-base",lg:"text-base sm:text-lg"}},defaultVariants:{variant:"default",size:"md"}}),W=classVarianceAuthority.cva("font-medium text-left transition-all duration-200",{variants:{variant:{default:"bg-muted text-foreground hover:bg-muted/80",striped:"bg-muted text-foreground hover:bg-muted/80",bordered:"bg-muted text-foreground hover:bg-muted/80",hover:"bg-muted text-foreground hover:bg-muted/80",elevated:"bg-muted text-foreground hover:bg-muted/80",interactive:"bg-muted text-foreground hover:bg-primary/10 hover:text-primary"},size:{sm:"px-2 py-1 sm:px-3 sm:py-2",md:"px-3 py-2 sm:px-4 sm:py-3",lg:"px-4 py-3 sm:px-6 sm:py-4"}},defaultVariants:{variant:"default",size:"md"}}),X=classVarianceAuthority.cva("border-b border-border transition-colors",{variants:{variant:{default:"hover:bg-muted/50",striped:"even:bg-muted/50 hover:bg-muted/80",bordered:"hover:bg-muted/50",hover:"hover:bg-muted/50",elevated:"hover:bg-muted/80",interactive:"hover:bg-primary/10 hover:text-primary"}},defaultVariants:{variant:"default"}}),w=classVarianceAuthority.cva("border-border transition-all duration-200",{variants:{variant:{default:"border-b border-border hover:bg-muted/50",striped:"border-b border-border hover:bg-muted/80",bordered:"border border-border hover:bg-muted/50",hover:"border-b border-border hover:bg-muted/50",elevated:"border-b border-border hover:bg-muted/80",interactive:"border-b border-border hover:bg-primary/10 hover:text-primary"},size:{sm:"px-2 py-1 sm:px-3 sm:py-2",md:"px-3 py-2 sm:px-4 sm:py-3",lg:"px-4 py-3 sm:px-6 sm:py-4"}},defaultVariants:{variant:"default",size:"md"}});function Y({data:l,columns:n,loading:b=false,emptyText:p="No data",className:u,variant:d,size:i,rowKey:c="id",onRowClick:E,onSort:L,sortColumn:N,sortDirection:B,pagination:t,selection:s,caption:k,...I},D){let[j,A]=r.useState(null),S=N!==void 0,g=S&&N?{column:N,direction:B||"asc"}:j,F=e=>{if(!e.sortable)return;let o=g?.column===e.key&&g?.direction==="asc"?"desc":"asc";S||A({column:e.key,direction:o}),L?.(e,o);},f=(e,o)=>typeof c=="function"?c(e):e[c]??o,P=e=>s?.getCheckboxProps?.(e).disabled===true,h=s?l.map((e,o)=>({record:e,key:f(e,o)})).filter(({record:e})=>!P(e)).map(({key:e})=>e):[],z=e=>l.filter((o,a)=>e.includes(f(o,a))),H=(e,o)=>{if(!s)return false;let a=f(e,o);return s.selectedRowKeys.includes(a)},G=(e,o,a)=>{if(!s||P(e))return;let x=f(e,o),V=a?s.selectedRowKeys.includes(x)?s.selectedRowKeys:[...s.selectedRowKeys,x]:s.selectedRowKeys.filter(Q=>Q!==x);s.onChange(V,z(V));},$=e=>{if(!s)return;let o=s.selectedRowKeys.filter(x=>!h.includes(x)),a=e?[...o,...h]:o;s.onChange(a,z(a));},C=h.filter(e=>s?.selectedRowKeys.includes(e)),J=s&&h.length>0&&C.length===h.length,O=s&&C.length>0&&C.length<h.length;return r__default.default.createElement("div",{className:"w-full overflow-x-auto"},r__default.default.createElement("div",{className:"min-w-full"},r__default.default.createElement("table",{ref:D,className:chunkITRGJNWL_cjs.a(U({variant:d,size:i}),u),...I},k&&r__default.default.createElement("caption",{className:"sr-only"},k),r__default.default.createElement(K,null,r__default.default.createElement(v,null,s&&r__default.default.createElement("th",{className:chunkITRGJNWL_cjs.a(w({variant:d,size:i})),scope:"col",role:"columnheader"},r__default.default.createElement("input",{type:"checkbox",checked:J,ref:e=>{e&&(e.indeterminate=O||false);},onChange:e=>$(e.target.checked),className:"rounded border-input text-primary focus:ring-ring","aria-label":"Select all rows"})),n.map(e=>r__default.default.createElement("th",{key:e.key,className:chunkITRGJNWL_cjs.a(w({variant:d,size:i}),e.className,e.align==="center"&&"text-center",e.align==="right"&&"text-right"),scope:"col",role:"columnheader",...e.width&&{style:{width:e.width}}},r__default.default.createElement("div",{className:"flex items-center gap-2"},r__default.default.createElement("span",null,e.title),e.sortable&&r__default.default.createElement("button",{type:"button",onClick:()=>F(e),className:"flex flex-col text-muted-foreground hover:text-foreground","aria-label":`Sort by ${e.title}`},r__default.default.createElement("svg",{className:chunkITRGJNWL_cjs.a("w-3 h-3",g?.column===e.key&&g?.direction==="asc"?"text-primary":"text-muted-foreground"),fill:"currentColor",viewBox:"0 0 20 20"},r__default.default.createElement("path",{d:"M5 8l5-5 5 5H5z"})),r__default.default.createElement("svg",{className:chunkITRGJNWL_cjs.a("w-3 h-3 -mt-1",g?.column===e.key&&g?.direction==="desc"?"text-primary":"text-muted-foreground"),fill:"currentColor",viewBox:"0 0 20 20"},r__default.default.createElement("path",{d:"M5 12l5 5 5-5H5z"})))))))),r__default.default.createElement(M,null,b?r__default.default.createElement(v,null,r__default.default.createElement(y,{colSpan:n.length+(s?1:0),variant:d,size:i,className:"text-center py-8"},r__default.default.createElement("div",{className:"flex items-center justify-center gap-2"},r__default.default.createElement("div",{className:"animate-spin rounded-full h-4 w-4 border-b-2 border-primary"}),r__default.default.createElement("span",null,"Loading...")))):l.length===0?r__default.default.createElement(v,null,r__default.default.createElement(y,{colSpan:n.length+(s?1:0),variant:d,size:i,className:"text-center py-8 text-muted-foreground"},p)):l.map((e,o)=>r__default.default.createElement(v,{key:f(e,o),variant:d,onClick:()=>E?.(e,o),selected:H(e,o)},s&&r__default.default.createElement(y,{variant:d,size:i},r__default.default.createElement("input",{type:"checkbox",checked:H(e,o),onChange:a=>G(e,o,a.target.checked),className:"rounded border-input text-primary focus:ring-ring","aria-label":`Select row ${o+1}`,...s.getCheckboxProps?.(e)})),n.map(a=>r__default.default.createElement(y,{key:a.key,variant:d,size:i,className:chunkITRGJNWL_cjs.a(a.className,a.align==="center"&&"text-center",a.align==="right"&&"text-right")},a.render?a.render(a.dataIndex?e[a.dataIndex]:e,e,o):a.dataIndex?e[a.dataIndex]:e[a.key]))))))),t&&r__default.default.createElement("div",{className:"flex flex-col sm:flex-row items-center justify-between mt-4 px-2 sm:px-4 py-3 bg-card border-t border-border gap-2 sm:gap-0"},r__default.default.createElement("div",{className:"flex items-center gap-2"},r__default.default.createElement("span",{className:"text-sm text-muted-foreground"},"Showing ",(t.current-1)*t.pageSize+1," to"," ",Math.min(t.current*t.pageSize,t.total)," ","of ",t.total," results")),r__default.default.createElement("div",{className:"flex items-center gap-2"},t.showSizeChanger&&r__default.default.createElement("select",{value:t.pageSize,onChange:e=>t.onChange(1,Number(e.target.value)),className:"rounded border-input bg-background text-sm","aria-label":"Select page size"},r__default.default.createElement("option",{value:10},"10 / page"),r__default.default.createElement("option",{value:20},"20 / page"),r__default.default.createElement("option",{value:50},"50 / page"),r__default.default.createElement("option",{value:100},"100 / page")),r__default.default.createElement("div",{className:"flex items-center gap-1"},r__default.default.createElement("button",{type:"button",onClick:()=>t.onChange(t.current-1,t.pageSize),disabled:t.current<=1,className:"px-3 py-1 text-sm border border-input rounded hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed","aria-label":"Go to previous page"},"Previous"),r__default.default.createElement("span",{className:"px-3 py-1 text-sm"},"Page ",t.current," of"," ",Math.ceil(t.total/t.pageSize)),r__default.default.createElement("button",{type:"button",onClick:()=>t.onChange(t.current+1,t.pageSize),disabled:t.current>=Math.ceil(t.total/t.pageSize),className:"px-3 py-1 text-sm border border-input rounded hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed","aria-label":"Go to next page"},"Next")))))}var R=r__default.default.forwardRef(Y);R.displayName="Table";var te=R,K=r__default.default.forwardRef(({className:l,variant:n,size:b,children:p,...u},d)=>r__default.default.createElement("thead",{ref:d,className:chunkITRGJNWL_cjs.a(W({variant:n,size:b}),l),...u},p));K.displayName="TableHeader";var M=r__default.default.forwardRef(({className:l,children:n,...b},p)=>r__default.default.createElement("tbody",{ref:p,className:chunkITRGJNWL_cjs.a(l),...b},n));M.displayName="TableBody";var v=r__default.default.forwardRef(({className:l,children:n,onClick:b,selected:p,variant:u,...d},i)=>r__default.default.createElement("tr",{ref:i,className:chunkITRGJNWL_cjs.a(X({variant:u}),p&&"bg-primary/10",b&&"cursor-pointer",l),onClick:b,...d},n));v.displayName="TableRow";var y=r__default.default.forwardRef(({className:l,children:n,variant:b,size:p,colSpan:u,rowSpan:d,...i},c)=>r__default.default.createElement("td",{ref:c,className:chunkITRGJNWL_cjs.a(w({variant:b,size:p}),l),colSpan:u,rowSpan:d,...i},n));y.displayName="TableCell";var Z=r__default.default.forwardRef(({className:l,children:n,variant:b,size:p,colSpan:u,rowSpan:d,...i},c)=>r__default.default.createElement("th",{ref:c,className:chunkITRGJNWL_cjs.a(w({variant:b,size:p}),"font-medium",l),colSpan:u,rowSpan:d,...i},n));Z.displayName="TableHead";exports.a=U;exports.b=W;exports.c=w;exports.d=te;exports.e=K;exports.f=M;exports.g=v;exports.h=y;exports.i=Z;//# sourceMappingURL=chunk-UC577SR4.cjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-UC577SR4.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/core/table.tsx"],"names":["tableVariants","cva","tableHeaderVariants","tableRowVariants","tableCellVariants","TableComponent","data","columns","loading","emptyText","className","variant","size","rowKey","onRowClick","onSort","controlledSortColumn","controlledSortDirection","pagination","selection","caption","props","ref","internalSortState","setInternalSortState","useState","isControlled","sortState","handleSort","column","newDirection","getRowKey","record","index","isRowDisabled","selectableKeys","key","recordsForKeys","keys","isRowSelected","handleRowSelection","checked","newSelectedKeys","k","handleSelectAll","others","selectedOnPage","isAllSelected","isIndeterminate","React","cn","TableHeader","TableRow","input","TableBody","TableCell","e","TableForwardRef","Table","children","onClick","selected","colSpan","rowSpan","TableHead"],"mappings":"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","file":"chunk-UC577SR4.cjs","sourcesContent":["import React, { useState } from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\n\n// Table variants\nconst tableVariants = cva(\n \"w-full border-collapse transition-all duration-200\",\n {\n variants: {\n variant: {\n default: \"border border-border shadow-sm hover:shadow-md\",\n striped: \"border border-border shadow-sm hover:shadow-md\",\n bordered: \"border-2 border-border shadow-md hover:shadow-lg\",\n hover: \"border border-border shadow-sm hover:shadow-md\",\n elevated: \"border border-border shadow-lg hover:shadow-xl\",\n interactive:\n \"border border-border shadow-sm hover:shadow-md hover:border-primary\",\n },\n size: {\n sm: \"text-xs sm:text-sm\",\n md: \"text-sm sm:text-base\",\n lg: \"text-base sm:text-lg\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n },\n);\n\nconst tableHeaderVariants = cva(\n \"font-medium text-left transition-all duration-200\",\n {\n variants: {\n variant: {\n default: \"bg-muted text-foreground hover:bg-muted/80\",\n striped: \"bg-muted text-foreground hover:bg-muted/80\",\n bordered: \"bg-muted text-foreground hover:bg-muted/80\",\n hover: \"bg-muted text-foreground hover:bg-muted/80\",\n elevated: \"bg-muted text-foreground hover:bg-muted/80\",\n interactive:\n \"bg-muted text-foreground hover:bg-primary/10 hover:text-primary\",\n },\n size: {\n sm: \"px-2 py-1 sm:px-3 sm:py-2\",\n md: \"px-3 py-2 sm:px-4 sm:py-3\",\n lg: \"px-4 py-3 sm:px-6 sm:py-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n },\n);\n\n/**\n * Row-level variants.\n *\n * `striped` has to live here, not on the cell: `even:` selects the even sibling\n * among *cells within a row*, so applying it there striped columns instead of\n * rows - and TableRow ignored the variant entirely, so nothing showed at all.\n */\nconst tableRowVariants = cva(\"border-b border-border transition-colors\", {\n variants: {\n variant: {\n default: \"hover:bg-muted/50\",\n striped: \"even:bg-muted/50 hover:bg-muted/80\",\n bordered: \"hover:bg-muted/50\",\n hover: \"hover:bg-muted/50\",\n elevated: \"hover:bg-muted/80\",\n interactive: \"hover:bg-primary/10 hover:text-primary\",\n },\n },\n defaultVariants: { variant: \"default\" },\n});\n\nconst tableCellVariants = cva(\"border-border transition-all duration-200\", {\n variants: {\n variant: {\n default: \"border-b border-border hover:bg-muted/50\",\n striped: \"border-b border-border hover:bg-muted/80\",\n bordered: \"border border-border hover:bg-muted/50\",\n hover: \"border-b border-border hover:bg-muted/50\",\n elevated: \"border-b border-border hover:bg-muted/80\",\n interactive:\n \"border-b border-border hover:bg-primary/10 hover:text-primary\",\n },\n size: {\n sm: \"px-2 py-1 sm:px-3 sm:py-2\",\n md: \"px-3 py-2 sm:px-4 sm:py-3\",\n lg: \"px-4 py-3 sm:px-6 sm:py-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n});\n\n// Types\nexport interface TableColumn<T = Record<string, unknown>> {\n key: string;\n title: string;\n dataIndex?: keyof T;\n render?: (value: unknown, record: T, index: number) => React.ReactNode;\n sortable?: boolean;\n width?: string | number;\n align?: \"left\" | \"center\" | \"right\";\n className?: string;\n}\n\nexport interface TableProps<T = Record<string, unknown>> extends VariantProps<\n typeof tableVariants\n> {\n data: T[];\n columns: TableColumn<T>[];\n loading?: boolean;\n emptyText?: string;\n caption?: string;\n className?: string;\n rowKey?: keyof T | ((record: T) => string | number);\n onRowClick?: (record: T, index: number) => void;\n onSort?: (column: TableColumn<T>, direction: \"asc\" | \"desc\") => void;\n sortColumn?: string;\n sortDirection?: \"asc\" | \"desc\";\n pagination?: {\n current: number;\n pageSize: number;\n total: number;\n onChange: (page: number, pageSize: number) => void;\n showSizeChanger?: boolean;\n showQuickJumper?: boolean;\n };\n selection?: {\n selectedRowKeys: (string | number)[];\n /**\n * `selectedRowKeys` is the complete selection, including keys for records on\n * other pages. `selectedRows` is only the subset present in `data`, because\n * the component has never been given the rest. Paginating server-side means\n * keeping your own key-to-record map and treating the keys as authoritative.\n */\n onChange: (selectedRowKeys: (string | number)[], selectedRows: T[]) => void;\n /**\n * A disabled row cannot be selected individually, and select-all skips it\n * rather than selecting it on the consumer's behalf.\n */\n getCheckboxProps?: (record: T) => { disabled?: boolean };\n };\n}\n\nexport interface TableHeaderProps extends VariantProps<\n typeof tableHeaderVariants\n> {\n className?: string;\n children: React.ReactNode;\n}\n\nexport interface TableBodyProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport interface TableRowProps extends VariantProps<typeof tableRowVariants> {\n className?: string;\n children: React.ReactNode;\n onClick?: () => void;\n selected?: boolean;\n}\n\nexport interface TableCellProps extends VariantProps<typeof tableCellVariants> {\n className?: string;\n children: React.ReactNode;\n colSpan?: number;\n rowSpan?: number;\n}\n\n// Table Components\nfunction TableComponent<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(\n {\n data,\n columns,\n loading = false,\n emptyText = \"No data\",\n className,\n variant,\n size,\n rowKey = \"id\",\n onRowClick,\n onSort,\n sortColumn: controlledSortColumn,\n sortDirection: controlledSortDirection,\n pagination,\n selection,\n caption,\n ...props\n }: TableProps<T>,\n ref: React.Ref<HTMLTableElement>,\n) {\n // Use controlled props if provided, otherwise use internal state\n const [internalSortState, setInternalSortState] = useState<{\n column: string;\n direction: \"asc\" | \"desc\";\n } | null>(null);\n\n // Determine current sort state (controlled takes precedence)\n const isControlled = controlledSortColumn !== undefined;\n const sortState =\n isControlled && controlledSortColumn\n ? {\n column: controlledSortColumn,\n direction: controlledSortDirection || \"asc\",\n }\n : internalSortState;\n\n // Sync internal state with controlled props when they change\n // Sync internal state with controlled props when they change\n // Note: unneeded re-render caused by resetting state. We derive sortState above so stale internal state is ignored.\n /* \n useEffect(() => {\n if (isControlled && controlledSortColumn) {\n setInternalSortState(null);\n }\n }, [isControlled, controlledSortColumn]); \n */\n\n const handleSort = (column: TableColumn<T>) => {\n if (!column.sortable) return;\n\n const newDirection =\n sortState?.column === column.key && sortState?.direction === \"asc\"\n ? \"desc\"\n : \"asc\";\n\n // Only update internal state if not controlled\n if (!isControlled) {\n setInternalSortState({ column: column.key, direction: newDirection });\n }\n\n // Always call onSort callback for controlled usage\n onSort?.(column, newDirection);\n };\n\n /**\n * Nullish, not falsy.\n *\n * `record[rowKey] || index` reads a record with `id: 0` as having no key and\n * falls back to its position, so a zero-keyed row at index 1 reported itself as\n * key `1` - which is a different record's id. Empty string is a legitimate key\n * for the same reason.\n */\n const getRowKey = (record: T, index: number): string | number => {\n if (typeof rowKey === \"function\") {\n return rowKey(record);\n }\n return (record[rowKey] as string | number | undefined) ?? index;\n };\n\n const isRowDisabled = (record: T): boolean =>\n selection?.getCheckboxProps?.(record).disabled === true;\n\n /**\n * The rows on this page that a checkbox can actually act on.\n *\n * Everything below is expressed in terms of these rather than in terms of\n * `data.length` or `selectedRowKeys.length`. Selection is a list of keys that\n * may name records on other pages, so comparing its length to the number of\n * visible rows answered a question nobody asked: with two rows on screen and\n * two rows selected elsewhere, \"select all\" showed as checked.\n */\n const selectableKeys = selection\n ? data\n .map((record, index) => ({ record, key: getRowKey(record, index) }))\n .filter(({ record }) => !isRowDisabled(record))\n .map(({ key }) => key)\n : [];\n\n /**\n * The records behind a set of keys, as far as this page can tell.\n *\n * A key belonging to another page cannot be resolved here, because the\n * component has only been given the current page. The keys are the complete\n * answer; the records are the subset that is on screen. Documented on the prop,\n * because a consumer paginating server-side has to keep its own map.\n */\n const recordsForKeys = (keys: (string | number)[]): T[] =>\n data.filter((record, index) => keys.includes(getRowKey(record, index)));\n\n const isRowSelected = (record: T, index: number): boolean => {\n if (!selection) return false;\n const key = getRowKey(record, index);\n return selection.selectedRowKeys.includes(key);\n };\n\n const handleRowSelection = (\n record: T,\n index: number,\n checked: boolean,\n ): void => {\n if (!selection || isRowDisabled(record)) return;\n\n const key = getRowKey(record, index);\n const newSelectedKeys = checked\n ? selection.selectedRowKeys.includes(key)\n ? selection.selectedRowKeys\n : [...selection.selectedRowKeys, key]\n : selection.selectedRowKeys.filter((k) => k !== key);\n\n selection.onChange(newSelectedKeys, recordsForKeys(newSelectedKeys));\n };\n\n /**\n * Adds or removes this page's selectable rows, and leaves every other key\n * alone.\n *\n * It used to replace the whole selection with either every visible key or\n * nothing, so paging through a table and pressing select-all on the second page\n * silently discarded the first page's selection - and it included rows the\n * consumer had disabled.\n */\n const handleSelectAll = (checked: boolean) => {\n if (!selection) return;\n\n const others = selection.selectedRowKeys.filter(\n (key) => !selectableKeys.includes(key),\n );\n const newSelectedKeys = checked ? [...others, ...selectableKeys] : others;\n\n selection.onChange(newSelectedKeys, recordsForKeys(newSelectedKeys));\n };\n\n const selectedOnPage = selectableKeys.filter((key) =>\n selection?.selectedRowKeys.includes(key),\n );\n\n const isAllSelected =\n selection &&\n selectableKeys.length > 0 &&\n selectedOnPage.length === selectableKeys.length;\n\n const isIndeterminate =\n selection &&\n selectedOnPage.length > 0 &&\n selectedOnPage.length < selectableKeys.length;\n\n return (\n <div className=\"w-full overflow-x-auto\">\n <div className=\"min-w-full\">\n <table\n ref={ref}\n className={cn(tableVariants({ variant, size }), className)}\n {...props}\n >\n {caption && <caption className=\"sr-only\">{caption}</caption>}\n <TableHeader>\n <TableRow>\n {selection && (\n <th\n className={cn(tableCellVariants({ variant, size }))}\n scope=\"col\"\n role=\"columnheader\"\n >\n <input\n type=\"checkbox\"\n checked={isAllSelected}\n ref={(input) => {\n if (input) input.indeterminate = isIndeterminate || false;\n }}\n onChange={(e) => handleSelectAll(e.target.checked)}\n className=\"rounded border-input text-primary focus:ring-ring\"\n aria-label=\"Select all rows\"\n />\n </th>\n )}\n {columns.map((column) => (\n <th\n key={column.key}\n className={cn(\n tableCellVariants({ variant, size }),\n column.className,\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n )}\n scope=\"col\"\n role=\"columnheader\"\n {...(column.width && { style: { width: column.width } })}\n >\n <div className=\"flex items-center gap-2\">\n <span>{column.title}</span>\n {column.sortable && (\n <button\n type=\"button\"\n onClick={() => handleSort(column)}\n className=\"flex flex-col text-muted-foreground hover:text-foreground\"\n aria-label={`Sort by ${column.title}`}\n >\n <svg\n className={cn(\n \"w-3 h-3\",\n sortState?.column === column.key &&\n sortState?.direction === \"asc\"\n ? \"text-primary\"\n : \"text-muted-foreground\",\n )}\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path d=\"M5 8l5-5 5 5H5z\" />\n </svg>\n <svg\n className={cn(\n \"w-3 h-3 -mt-1\",\n sortState?.column === column.key &&\n sortState?.direction === \"desc\"\n ? \"text-primary\"\n : \"text-muted-foreground\",\n )}\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path d=\"M5 12l5 5 5-5H5z\" />\n </svg>\n </button>\n )}\n </div>\n </th>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {loading ? (\n <TableRow>\n <TableCell\n colSpan={columns.length + (selection ? 1 : 0)}\n variant={variant}\n size={size}\n className=\"text-center py-8\"\n >\n <div className=\"flex items-center justify-center gap-2\">\n <div className=\"animate-spin rounded-full h-4 w-4 border-b-2 border-primary\"></div>\n <span>Loading...</span>\n </div>\n </TableCell>\n </TableRow>\n ) : data.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={columns.length + (selection ? 1 : 0)}\n variant={variant}\n size={size}\n className=\"text-center py-8 text-muted-foreground\"\n >\n {emptyText}\n </TableCell>\n </TableRow>\n ) : (\n data.map((record, index) => (\n <TableRow\n key={getRowKey(record, index)}\n variant={variant}\n onClick={() => onRowClick?.(record, index)}\n selected={isRowSelected(record, index)}\n >\n {selection && (\n <TableCell variant={variant} size={size}>\n <input\n type=\"checkbox\"\n checked={isRowSelected(record, index)}\n onChange={(e) =>\n handleRowSelection(record, index, e.target.checked)\n }\n className=\"rounded border-input text-primary focus:ring-ring\"\n aria-label={`Select row ${index + 1}`}\n {...selection.getCheckboxProps?.(record)}\n />\n </TableCell>\n )}\n {columns.map((column) => (\n <TableCell\n key={column.key}\n variant={variant}\n size={size}\n className={cn(\n column.className,\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n )}\n >\n {column.render\n ? column.render(\n column.dataIndex\n ? record[column.dataIndex]\n : record,\n record,\n index,\n )\n : column.dataIndex\n ? (record[column.dataIndex] as React.ReactNode)\n : ((record as Record<string, unknown>)[\n column.key\n ] as React.ReactNode)}\n </TableCell>\n ))}\n </TableRow>\n ))\n )}\n </TableBody>\n </table>\n </div>\n\n {pagination && (\n <div className=\"flex flex-col sm:flex-row items-center justify-between mt-4 px-2 sm:px-4 py-3 bg-card border-t border-border gap-2 sm:gap-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-muted-foreground\">\n Showing {(pagination.current - 1) * pagination.pageSize + 1} to{\" \"}\n {Math.min(\n pagination.current * pagination.pageSize,\n pagination.total,\n )}{\" \"}\n of {pagination.total} results\n </span>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {pagination.showSizeChanger && (\n <select\n value={pagination.pageSize}\n onChange={(e) => pagination.onChange(1, Number(e.target.value))}\n className=\"rounded border-input bg-background text-sm\"\n aria-label=\"Select page size\"\n >\n <option value={10}>10 / page</option>\n <option value={20}>20 / page</option>\n <option value={50}>50 / page</option>\n <option value={100}>100 / page</option>\n </select>\n )}\n\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() =>\n pagination.onChange(\n pagination.current - 1,\n pagination.pageSize,\n )\n }\n disabled={pagination.current <= 1}\n className=\"px-3 py-1 text-sm border border-input rounded hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed\"\n aria-label=\"Go to previous page\"\n >\n Previous\n </button>\n\n <span className=\"px-3 py-1 text-sm\">\n Page {pagination.current} of{\" \"}\n {Math.ceil(pagination.total / pagination.pageSize)}\n </span>\n\n <button\n type=\"button\"\n onClick={() =>\n pagination.onChange(\n pagination.current + 1,\n pagination.pageSize,\n )\n }\n disabled={\n pagination.current >=\n Math.ceil(pagination.total / pagination.pageSize)\n }\n className=\"px-3 py-1 text-sm border border-input rounded hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed\"\n aria-label=\"Go to next page\"\n >\n Next\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nconst TableForwardRef = React.forwardRef(TableComponent) as <\n T extends Record<string, unknown> = Record<string, unknown>,\n>(\n props: TableProps<T> & { ref?: React.Ref<HTMLTableElement> },\n) => React.ReactElement;\n\n(\n TableForwardRef as React.ComponentType<TableProps<unknown>> & {\n displayName?: string;\n }\n).displayName = \"Table\";\n\nexport const Table = TableForwardRef;\n\nexport const TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n TableHeaderProps\n>(({ className, variant, size, children, ...props }, ref) => (\n <thead\n ref={ref}\n className={cn(tableHeaderVariants({ variant, size }), className)}\n {...props}\n >\n {children}\n </thead>\n));\n\nTableHeader.displayName = \"TableHeader\";\n\nexport const TableBody = React.forwardRef<\n HTMLTableSectionElement,\n TableBodyProps\n>(({ className, children, ...props }, ref) => (\n <tbody ref={ref} className={cn(className)} {...props}>\n {children}\n </tbody>\n));\n\nTableBody.displayName = \"TableBody\";\n\nexport const TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, children, onClick, selected, variant, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n tableRowVariants({ variant }),\n selected && \"bg-primary/10\",\n onClick && \"cursor-pointer\",\n className,\n )}\n onClick={onClick}\n {...props}\n >\n {children}\n </tr>\n ),\n);\n\nTableRow.displayName = \"TableRow\";\n\nexport const TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, children, variant, size, colSpan, rowSpan, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(tableCellVariants({ variant, size }), className)}\n colSpan={colSpan}\n rowSpan={rowSpan}\n {...props}\n >\n {children}\n </td>\n ),\n);\n\nTableCell.displayName = \"TableCell\";\n\nexport const TableHead = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, children, variant, size, colSpan, rowSpan, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n tableCellVariants({ variant, size }),\n \"font-medium\",\n className,\n )}\n colSpan={colSpan}\n rowSpan={rowSpan}\n {...props}\n >\n {children}\n </th>\n ),\n);\n\nTableHead.displayName = \"TableHead\";\n\n// Export variants for external use\nexport { tableVariants, tableHeaderVariants, tableCellVariants };\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {d}from'./chunk-HCO4XKPM.js';import {b}from'./chunk-HD3TMQPR.js';import {a}from'./chunk-COXN6XBA.js';import {a as a$1}from'./chunk-AC2JBXHQ.js';import t,{useState,useMemo,useCallback}from'react';import {cva}from'class-variance-authority';function se(o){return typeof o=="boolean"?o:typeof o=="string"?o!=="false"&&o!=="":!!o}function ie(o){return o==null?"":String(o)}var Ie=cva("flex flex-wrap items-center gap-2 p-4 bg-muted border-b border-border",{variants:{variant:{default:"bg-muted",compact:"p-2 bg-card",minimal:"p-2 bg-transparent border-0"}},defaultVariants:{variant:"default"}});function ue({data:o,columns:C,searchable:D=true,searchPlaceholder:le="Search...",searchKeys:j,onSearch:P,searchTerm:E,onSearchTermChange:K,filterable:T=false,manualSearch:Y=false,manualFiltering:_=false,manualSorting:q=false,filters:b$1=[],onFilter:V,columnFilters:G,onColumnFiltersChange:H,defaultSortColumn:de,defaultSortDirection:ce="asc",sortColumn:J,sortDirection:ge,onSortChange:Q,defaultPageSize:me=10,showPagination:y=true,currentPage:U,pageSize:W,onPageChange:X,onPageSizeChange:z,totalItems:i,showSearch:Z=true,showFilters:R=true,filterBarClassName:fe,searchBarClassName:pe,rowKey:be="id",emptyText:ye="No data found",...he}){let B=E!==void 0,$=G!==void 0,w=J!==void 0,a=U!==void 0,[ke,xe]=useState(""),m=B?E:ke,ee=useMemo(()=>B?e=>K?.(e):xe,[B,K]),[Ce,ve]=useState({}),c=$?G:Ce,M=useMemo(()=>$?e=>H?.(e):ve,[$,H]),[Se,Te]=useState(de),[we,Ne]=useState(ce),v=w?J:Se,A=w?ge:we,ne=Te,re=Ne,[Fe,De]=useState(1),[Pe,Ve]=useState(me),f=a?U:Fe,s=W!==void 0?W:Pe,p=useMemo(()=>a?e=>X?.(e):De,[a,X]),te=useMemo(()=>z?e=>z(e):Ve,[z]),h=useMemo(()=>{if(Y||!D||!m.trim())return o;let e=m.toLowerCase(),r=j||C.map(n=>n.dataIndex||n.key).filter(Boolean);return o.filter(n=>r.some(u=>{let l=n[u];return l==null?false:String(l).toLowerCase().includes(e)}))},[o,m,D,j,C,Y]),k=useMemo(()=>_||!T||b$1.length===0||Object.keys(c).length===0?h:h.filter(e=>b$1.every(r=>{let n=c[r.key];if(n==null||n==="")return true;if(r.filterFn)return r.filterFn(n,e);let u=e[r.key];switch(r.type){case "text":return String(u).toLowerCase().includes(String(n).toLowerCase());case "number":{let l=Number(n);return Number.isNaN(l)?true:Number(u)===l}case "boolean":return !!u===se(n);case "select":return String(u)===String(n);default:return String(u).includes(String(n))}})),[h,c,T,b$1,_]),d$1=useMemo(()=>{if(q||!v)return k;let e=[...k],r=C.find(n=>n.key===v);return !r||!r.sortable||e.sort((n,u)=>{let l=r.dataIndex?n[r.dataIndex]:n[r.key],S=r.dataIndex?u[r.dataIndex]:u[r.key];if(l==null)return 1;if(S==null)return -1;let N=0;return typeof l=="number"&&typeof S=="number"?N=l-S:N=String(l).localeCompare(String(S)),A==="asc"?N:-N}),e},[k,v,A,C,q]),ze=useMemo(()=>{if(!y||a&&i!==void 0)return d$1;let e=(f-1)*s,r=e+s;return d$1.slice(e,r)},[d$1,f,s,y,a,i]);useMemo(()=>y?Math.ceil(a&&i!==void 0?i/s:d$1.length/s):1,[y,a,i,s,d$1.length]);let Be=useCallback(e=>{ee(e),a||p(1);},[ee,p,a]),I=useCallback((e,r)=>{let n={...c,[e]:r};M(n),a||p(1);},[c,M,p,a]),$e=useCallback((e,r)=>{if(w){Q?.(e.key,r);return}ne(e.key),re(r);},[w,Q,ne,re]),Me=useCallback((e,r)=>{p(e),r!==s&&(te(r),p(1));},[s,p,te]);return t.useEffect(()=>{P&&P(m,h);},[m,h,P]),t.useEffect(()=>{V&&V(c,k);},[c,k,V]),t.createElement("div",{className:"w-full"},(Z||R&&T&&b$1.length>0)&&t.createElement("div",{className:a$1(Ie(),fe)},Z&&D&&t.createElement("div",{className:a$1("flex-1 min-w-[200px]",pe)},t.createElement(b,{type:"text",placeholder:le,value:m,onChange:e=>Be(e.target.value),className:"w-full","aria-label":"Search table"})),R&&T&&b$1.length>0&&t.createElement("div",{className:"flex flex-wrap items-center gap-2"},b$1.map(e=>{let r=c[e.key];return e.type==="boolean"?t.createElement("select",{key:e.key,value:r==null?"":se(r)?"true":"false",onChange:n=>I(e.key,n.target.value===""?void 0:n.target.value==="true"),className:"rounded-md border border-input px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring focus:border-primary","aria-label":`Filter by ${e.key}`},t.createElement("option",{value:""},"All ",e.key),t.createElement("option",{value:"true"},e.placeholder?`${e.placeholder}: yes`:"Yes"),t.createElement("option",{value:"false"},e.placeholder?`${e.placeholder}: no`:"No")):e.type==="select"&&e.options?t.createElement("select",{key:e.key,value:ie(r),onChange:n=>I(e.key,n.target.value||void 0),className:"rounded-md border border-input px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring focus:border-primary","aria-label":`Filter by ${e.key}`},t.createElement("option",{value:""},"All ",e.key),e.options.map(n=>t.createElement("option",{key:n.value,value:String(n.value)},n.label))):t.createElement(b,{key:e.key,type:e.type==="number"?"number":"text",placeholder:e.placeholder||`Filter ${e.key}...`,value:ie(r),onChange:n=>I(e.key,n.target.value===""?void 0:e.type==="number"?Number(n.target.value):n.target.value),className:"min-w-[150px]","aria-label":`Filter by ${e.key}`})}),Object.keys(c).length>0&&t.createElement("button",{type:"button",onClick:()=>M({}),className:"px-3 py-2 text-sm text-muted-foreground hover:text-foreground underline","aria-label":"Clear all filters"},"Clear filters"))),t.createElement(d,{...he,data:ze,columns:C,rowKey:be,emptyText:ye,...v&&{sortColumn:v,sortDirection:A},onSort:$e,...y&&{pagination:{current:f,pageSize:s,total:a&&i!==void 0?i:d$1.length,onChange:Me,showSizeChanger:true}}}),y&&(a&&i!==void 0?i>0:d$1.length>0)&&t.createElement("div",{className:"mt-2 px-4 py-2 text-sm text-muted-foreground"},a&&i!==void 0?t.createElement(t.Fragment,null,"Showing ",(f-1)*s+1," to"," ",Math.min(f*s,i)," of ",i," ","results",m&&" (filtered)"):t.createElement(t.Fragment,null,"Showing ",(f-1)*s+1," to"," ",Math.min(f*s,d$1.length)," of"," ",d$1.length," results",m&&` (filtered from ${o.length} total)`)))}ue.displayName="DataTable";var He=a(ue);export{ue as a,He as b};//# sourceMappingURL=chunk-YC6ALHAZ.js.map
|
|
3
|
+
//# sourceMappingURL=chunk-YC6ALHAZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/core/data-table.tsx"],"names":["asBoolean","value","inputValue","filterBarVariants","cva","DataTable","initialData","columns","searchable","searchPlaceholder","searchKeys","onSearch","controlledSearchTerm","onSearchTermChange","filterable","manualSearch","manualFiltering","manualSorting","filters","onFilter","controlledColumnFilters","onColumnFiltersChange","defaultSortColumn","defaultSortDirection","controlledSortColumn","controlledSortDirection","onSortChange","defaultPageSize","showPagination","controlledCurrentPage","controlledPageSize","onPageChange","onPageSizeChange","totalItems","showSearch","showFilters","filterBarClassName","searchBarClassName","rowKey","emptyText","tableProps","isControlledSearch","isControlledFilters","isControlledSort","isControlledPagination","internalSearchTerm","setInternalSearchTerm","useState","searchTerm","setSearchTerm","useMemo","internalColumnFilters","setInternalColumnFilters","columnFilters","setColumnFilters","internalSortColumn","setInternalSortColumn","internalSortDirection","setInternalSortDirection","sortColumn","sortDirection","setSortColumn","setSortDirection","internalCurrentPage","setInternalCurrentPage","internalPageSize","setInternalPageSize","currentPage","pageSize","setCurrentPage","page","setPageSize","size","searchFilteredData","term","keys","col","record","key","filterFilteredData","filter","filterValue","recordValue","wanted","sortedData","sorted","column","a","b","aValue","bValue","comparison","paginatedData","startIndex","endIndex","handleSearch","useCallback","handleFilterChange","newFilters","handleSort","direction","handlePageChange","newPageSize","React","cn","Input","e","option","Table","DataTableMemoized","memo"],"mappings":"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","file":"chunk-YC6ALHAZ.js","sourcesContent":["import React, { useState, useMemo, useCallback } from \"react\";\nimport { cva } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\nimport { memo } from \"../../lib/memo\";\nimport { Table, TableColumn, TableProps } from \"./table\";\nimport { Input } from \"./input\";\n\n// Filter types\nexport type FilterType = \"text\" | \"select\" | \"number\" | \"date\" | \"boolean\";\n\nexport interface ColumnFilter<T = Record<string, unknown>> {\n key: string;\n type: FilterType;\n options?: Array<{ label: string; value: string | number }>;\n placeholder?: string;\n filterFn?: (value: unknown, record: T) => boolean;\n}\n\nexport interface DataTableProps<T = Record<string, unknown>> extends Omit<\n TableProps<T>,\n \"data\" | \"onSort\" | \"sortColumn\" | \"sortDirection\"\n> {\n data: T[];\n columns: TableColumn<T>[];\n\n // Search\n searchable?: boolean;\n searchPlaceholder?: string;\n searchKeys?: Array<keyof T | string>;\n onSearch?: (searchTerm: string, filteredData: T[]) => void;\n\n // Controlled search (for server-side filtering)\n searchTerm?: string;\n onSearchTermChange?: (searchTerm: string) => void;\n\n // Filtering\n filterable?: boolean;\n filters?: ColumnFilter<T>[];\n onFilter?: (filters: Record<string, unknown>, filteredData: T[]) => void;\n\n // Controlled filters (for server-side filtering)\n columnFilters?: Record<string, unknown>;\n onColumnFiltersChange?: (filters: Record<string, unknown>) => void;\n\n // Sorting (enhanced)\n defaultSortColumn?: string;\n defaultSortDirection?: \"asc\" | \"desc\";\n\n // Controlled sorting (for server-side sorting)\n sortColumn?: string;\n sortDirection?: \"asc\" | \"desc\";\n onSortChange?: (column: string, direction: \"asc\" | \"desc\") => void;\n\n // Pagination (enhanced)\n defaultPageSize?: number;\n showPagination?: boolean;\n\n // Controlled pagination (for server-side pagination)\n currentPage?: number;\n pageSize?: number;\n onPageChange?: (page: number) => void;\n onPageSizeChange?: (size: number) => void;\n totalItems?: number; // Required for server-side pagination\n\n /**\n * Who does the work.\n *\n * Passing `searchTerm`, `columnFilters` or `sortColumn` makes DataTable\n * controlled - it stops owning that piece of state - but it kept filtering and\n * sorting the rows you gave it anyway. For a server-backed table that is\n * actively wrong: a server searching without accent distinctions returns\n * `{ name: \"José\" }` for the query `jose`, and the local substring filter then\n * threw the row away while `totalItems` still counted it. Controlled sorting\n * likewise reordered the page the server had already ordered.\n *\n * Controlled state and processing ownership are separate questions now. Set\n * these when the rows arriving in `data` are already searched, filtered or\n * sorted; the callbacks still fire so you know what the user asked for.\n *\n * Pagination has always worked this way, under a different name: it is manual\n * when `currentPage` and `totalItems` are both given.\n */\n manualSearch?: boolean;\n manualFiltering?: boolean;\n manualSorting?: boolean;\n\n // UI\n showSearch?: boolean;\n showFilters?: boolean;\n filterBarClassName?: string;\n searchBarClassName?: string;\n}\n\n/**\n * What a boolean filter value means, from a control or from a consumer.\n *\n * The select below emits real booleans, but a controlled `columnFilters` may hold\n * whatever the consumer put there, and \"false\" arriving as a string used to mean\n * true.\n */\nfunction asBoolean(value: unknown): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") return value !== \"false\" && value !== \"\";\n return Boolean(value);\n}\n\n/** Empty for a value that is absent, and \"0\" or \"false\" when that is the value. */\nfunction inputValue(value: unknown): string {\n return value === undefined || value === null ? \"\" : String(value);\n}\n\n// Filter bar component\nconst filterBarVariants = cva(\n \"flex flex-wrap items-center gap-2 p-4 bg-muted border-b border-border\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n compact: \"p-2 bg-card\",\n minimal: \"p-2 bg-transparent border-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport function DataTable<\n T extends Record<string, unknown> = Record<string, unknown>,\n>({\n data: initialData,\n columns,\n searchable = true,\n searchPlaceholder = \"Search...\",\n searchKeys,\n onSearch,\n searchTerm: controlledSearchTerm,\n onSearchTermChange,\n filterable = false,\n manualSearch = false,\n manualFiltering = false,\n manualSorting = false,\n filters = [],\n onFilter,\n columnFilters: controlledColumnFilters,\n onColumnFiltersChange,\n defaultSortColumn,\n defaultSortDirection = \"asc\",\n sortColumn: controlledSortColumn,\n sortDirection: controlledSortDirection,\n onSortChange,\n defaultPageSize = 10,\n showPagination = true,\n currentPage: controlledCurrentPage,\n pageSize: controlledPageSize,\n onPageChange,\n onPageSizeChange,\n totalItems,\n showSearch = true,\n showFilters = true,\n filterBarClassName,\n searchBarClassName,\n rowKey = \"id\",\n emptyText = \"No data found\",\n ...tableProps\n}: DataTableProps<T>) {\n // Determine if component is in controlled mode\n const isControlledSearch = controlledSearchTerm !== undefined;\n const isControlledFilters = controlledColumnFilters !== undefined;\n const isControlledSort = controlledSortColumn !== undefined;\n const isControlledPagination = controlledCurrentPage !== undefined;\n\n // Search state (controlled or uncontrolled)\n const [internalSearchTerm, setInternalSearchTerm] = useState(\"\");\n const searchTerm = isControlledSearch\n ? controlledSearchTerm\n : internalSearchTerm;\n const setSearchTerm = useMemo(\n () =>\n isControlledSearch\n ? (value: string) => onSearchTermChange?.(value)\n : setInternalSearchTerm,\n [isControlledSearch, onSearchTermChange],\n );\n\n // Filter state (controlled or uncontrolled)\n const [internalColumnFilters, setInternalColumnFilters] = useState<\n Record<string, unknown>\n >({});\n const columnFilters = isControlledFilters\n ? controlledColumnFilters\n : internalColumnFilters;\n const setColumnFilters = useMemo(\n () =>\n isControlledFilters\n ? (filters: Record<string, unknown>) => onColumnFiltersChange?.(filters)\n : setInternalColumnFilters,\n [isControlledFilters, onColumnFiltersChange],\n );\n\n // Sort state (controlled or uncontrolled)\n const [internalSortColumn, setInternalSortColumn] = useState<\n string | undefined\n >(defaultSortColumn);\n const [internalSortDirection, setInternalSortDirection] = useState<\n \"asc\" | \"desc\"\n >(defaultSortDirection);\n const sortColumn = isControlledSort\n ? controlledSortColumn\n : internalSortColumn;\n const sortDirection = isControlledSort\n ? controlledSortDirection\n : internalSortDirection;\n // Only the uncontrolled path uses these. A controlled table goes through\n // `handleSort`, which emits both values at once - see the comment there for\n // what the controlled versions of these used to do.\n const setSortColumn = setInternalSortColumn;\n const setSortDirection = setInternalSortDirection;\n\n // Pagination state (controlled or uncontrolled)\n const [internalCurrentPage, setInternalCurrentPage] = useState(1);\n const [internalPageSize, setInternalPageSize] = useState(defaultPageSize);\n const currentPage = isControlledPagination\n ? controlledCurrentPage\n : internalCurrentPage;\n const pageSize =\n controlledPageSize !== undefined ? controlledPageSize : internalPageSize;\n const setCurrentPage = useMemo(\n () =>\n isControlledPagination\n ? (page: number) => onPageChange?.(page)\n : setInternalCurrentPage,\n [isControlledPagination, onPageChange],\n );\n const setPageSize = useMemo(\n () =>\n onPageSizeChange\n ? (size: number) => onPageSizeChange(size)\n : setInternalPageSize,\n [onPageSizeChange],\n );\n\n // Apply search\n const searchFilteredData = useMemo(() => {\n // The rows already are the search result; searching them again would only\n // remove what the server decided to include.\n if (manualSearch) return initialData;\n if (!searchable || !searchTerm.trim()) {\n return initialData;\n }\n\n const term = searchTerm.toLowerCase();\n const keys =\n searchKeys ||\n columns.map((col) => col.dataIndex || col.key).filter(Boolean);\n\n return initialData.filter((record) => {\n return keys.some((key) => {\n const value =\n typeof key === \"string\"\n ? (record as Record<string, unknown>)[key]\n : record[key as keyof T];\n\n if (value === null || value === undefined) return false;\n\n return String(value).toLowerCase().includes(term);\n });\n });\n }, [initialData, searchTerm, searchable, searchKeys, columns, manualSearch]);\n\n // Apply column filters\n const filterFilteredData = useMemo(() => {\n if (manualFiltering) return searchFilteredData;\n if (\n !filterable ||\n filters.length === 0 ||\n Object.keys(columnFilters).length === 0\n ) {\n return searchFilteredData;\n }\n\n return searchFilteredData.filter((record) => {\n return filters.every((filter) => {\n const filterValue = columnFilters[filter.key];\n\n // Skip if no filter value\n if (\n filterValue === undefined ||\n filterValue === null ||\n filterValue === \"\"\n ) {\n return true;\n }\n\n // Use custom filter function if provided\n if (filter.filterFn) {\n return filter.filterFn(filterValue, record);\n }\n\n // Default filtering logic\n const recordValue = (record as Record<string, unknown>)[filter.key];\n\n switch (filter.type) {\n case \"text\":\n return String(recordValue)\n .toLowerCase()\n .includes(String(filterValue).toLowerCase());\n case \"number\": {\n // A filter value that is not a number matches nothing rather than\n // matching zero. `Number(\"\")` is 0, which is how a cleared input used\n // to leave only the zero-valued rows on screen.\n const wanted = Number(filterValue);\n if (Number.isNaN(wanted)) return true;\n return Number(recordValue) === wanted;\n }\n case \"boolean\":\n // Not `Boolean(filterValue)`. The control used to be a text input, so\n // typing \"false\" gave the string \"false\", and `Boolean(\"false\")` is\n // true - the filter selected exactly the records it was asked to\n // exclude.\n return Boolean(recordValue) === asBoolean(filterValue);\n case \"select\":\n return String(recordValue) === String(filterValue);\n default:\n return String(recordValue).includes(String(filterValue));\n }\n });\n });\n }, [searchFilteredData, columnFilters, filterable, filters, manualFiltering]);\n\n // Apply sorting\n const sortedData = useMemo(() => {\n // Keep the order the server sent. Re-sorting a page it has already ordered\n // produces a different order, not the same one.\n if (manualSorting) return filterFilteredData;\n if (!sortColumn) {\n return filterFilteredData;\n }\n\n const sorted = [...filterFilteredData];\n const column = columns.find((col) => col.key === sortColumn);\n\n if (!column || !column.sortable) {\n return sorted;\n }\n\n sorted.sort((a, b) => {\n const aValue = column.dataIndex\n ? a[column.dataIndex]\n : (a as Record<string, unknown>)[column.key];\n const bValue = column.dataIndex\n ? b[column.dataIndex]\n : (b as Record<string, unknown>)[column.key];\n\n // Handle null/undefined\n if (aValue === null || aValue === undefined) return 1;\n if (bValue === null || bValue === undefined) return -1;\n\n // Compare values\n let comparison = 0;\n if (typeof aValue === \"number\" && typeof bValue === \"number\") {\n comparison = aValue - bValue;\n } else {\n comparison = String(aValue).localeCompare(String(bValue));\n }\n\n return sortDirection === \"asc\" ? comparison : -comparison;\n });\n\n return sorted;\n }, [filterFilteredData, sortColumn, sortDirection, columns, manualSorting]);\n\n // Apply pagination\n // In controlled mode with server-side pagination, use provided data directly\n // In uncontrolled mode, slice the data client-side\n const paginatedData = useMemo(() => {\n if (!showPagination) {\n return sortedData;\n }\n\n // If in controlled pagination mode with totalItems, assume data is already paginated\n if (isControlledPagination && totalItems !== undefined) {\n return sortedData; // Data is already paginated server-side\n }\n\n // Client-side pagination\n const startIndex = (currentPage - 1) * pageSize;\n const endIndex = startIndex + pageSize;\n\n return sortedData.slice(startIndex, endIndex);\n }, [\n sortedData,\n currentPage,\n pageSize,\n showPagination,\n isControlledPagination,\n totalItems,\n ]);\n\n // Calculate total pages for pagination display\n // Note: Currently not used but kept for future pagination UI enhancements\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _totalPages = useMemo(() => {\n if (!showPagination) return 1;\n if (isControlledPagination && totalItems !== undefined) {\n return Math.ceil(totalItems / pageSize);\n }\n return Math.ceil(sortedData.length / pageSize);\n }, [\n showPagination,\n isControlledPagination,\n totalItems,\n pageSize,\n sortedData.length,\n ]);\n\n // Callbacks\n const handleSearch = useCallback(\n (value: string) => {\n setSearchTerm(value);\n if (!isControlledPagination) {\n setCurrentPage(1); // Reset to first page on search (only in uncontrolled mode)\n }\n },\n [setSearchTerm, setCurrentPage, isControlledPagination],\n );\n\n const handleFilterChange = useCallback(\n (key: string, value: unknown) => {\n const newFilters = {\n ...columnFilters,\n [key]: value,\n };\n setColumnFilters(newFilters);\n if (!isControlledPagination) {\n setCurrentPage(1); // Reset to first page on filter (only in uncontrolled mode)\n }\n },\n [columnFilters, setColumnFilters, setCurrentPage, isControlledPagination],\n );\n\n /**\n * One callback per click, carrying both new values.\n *\n * The controlled setters each emitted `onSortChange` on their own, and each one\n * read the *other* value from the render it was created in. Clicking \"Age\" on a\n * table sorted by name descending produced `(\"age\", \"desc\")` immediately\n * followed by `(\"name\", \"asc\")` - two requests, the second of which put the old\n * column back. A consumer writing both values from the callback, which is what\n * the docs show, ended up where it started.\n *\n * It also never fired at all for a controlled table that started unsorted,\n * because the setter guarded on an existing column and direction.\n */\n const handleSort = useCallback(\n (column: TableColumn<T>, direction: \"asc\" | \"desc\") => {\n if (isControlledSort) {\n onSortChange?.(column.key, direction);\n return;\n }\n setSortColumn(column.key);\n setSortDirection(direction);\n },\n [isControlledSort, onSortChange, setSortColumn, setSortDirection],\n );\n\n const handlePageChange = useCallback(\n (page: number, newPageSize: number) => {\n setCurrentPage(page);\n if (newPageSize !== pageSize) {\n setPageSize(newPageSize);\n setCurrentPage(1); // Reset to first page when page size changes\n }\n },\n [pageSize, setCurrentPage, setPageSize],\n );\n\n // Notify callbacks\n React.useEffect(() => {\n if (onSearch) {\n onSearch(searchTerm, searchFilteredData);\n }\n }, [searchTerm, searchFilteredData, onSearch]);\n\n React.useEffect(() => {\n if (onFilter) {\n onFilter(columnFilters, filterFilteredData);\n }\n }, [columnFilters, filterFilteredData, onFilter]);\n\n return (\n <div className=\"w-full\">\n {/* Search and Filter Bar */}\n {(showSearch || (showFilters && filterable && filters.length > 0)) && (\n <div className={cn(filterBarVariants(), filterBarClassName)}>\n {/* Search */}\n {showSearch && searchable && (\n <div className={cn(\"flex-1 min-w-[200px]\", searchBarClassName)}>\n <Input\n type=\"text\"\n placeholder={searchPlaceholder}\n value={searchTerm}\n onChange={(e) => handleSearch(e.target.value)}\n className=\"w-full\"\n aria-label=\"Search table\"\n />\n </div>\n )}\n\n {/* Column Filters */}\n {showFilters && filterable && filters.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {filters.map((filter) => {\n const filterValue = columnFilters[filter.key];\n\n // A boolean needs three states - either value, or no filter -\n // which a text box cannot express. It used to be one, and typing\n // \"false\" selected the records where the value was true.\n if (filter.type === \"boolean\") {\n return (\n <select\n key={filter.key}\n value={\n filterValue === undefined || filterValue === null\n ? \"\"\n : asBoolean(filterValue)\n ? \"true\"\n : \"false\"\n }\n onChange={(e) =>\n handleFilterChange(\n filter.key,\n e.target.value === \"\"\n ? undefined\n : e.target.value === \"true\",\n )\n }\n className=\"rounded-md border border-input px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring focus:border-primary\"\n aria-label={`Filter by ${filter.key}`}\n >\n <option value=\"\">All {filter.key}</option>\n <option value=\"true\">\n {filter.placeholder\n ? `${filter.placeholder}: yes`\n : \"Yes\"}\n </option>\n <option value=\"false\">\n {filter.placeholder\n ? `${filter.placeholder}: no`\n : \"No\"}\n </option>\n </select>\n );\n }\n\n if (filter.type === \"select\" && filter.options) {\n return (\n <select\n key={filter.key}\n value={inputValue(filterValue)}\n onChange={(e) =>\n handleFilterChange(\n filter.key,\n e.target.value || undefined,\n )\n }\n className=\"rounded-md border border-input px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring focus:border-primary\"\n aria-label={`Filter by ${filter.key}`}\n >\n <option value=\"\">All {filter.key}</option>\n {filter.options.map((option) => (\n <option key={option.value} value={String(option.value)}>\n {option.label}\n </option>\n ))}\n </select>\n );\n }\n\n return (\n <Input\n key={filter.key}\n type={filter.type === \"number\" ? \"number\" : \"text\"}\n placeholder={\n filter.placeholder || `Filter ${filter.key}...`\n }\n // `String(filterValue || \"\")` blanked a legitimate 0 and a\n // legitimate false, so the box disagreed with the filter it\n // was showing.\n value={inputValue(filterValue)}\n onChange={(e) =>\n handleFilterChange(\n filter.key,\n // An emptied box is no filter. `Number(\"\")` is 0, which\n // used to leave only the zero-valued rows behind.\n e.target.value === \"\"\n ? undefined\n : filter.type === \"number\"\n ? Number(e.target.value)\n : e.target.value,\n )\n }\n className=\"min-w-[150px]\"\n aria-label={`Filter by ${filter.key}`}\n />\n );\n })}\n\n {/* Clear Filters */}\n {Object.keys(columnFilters).length > 0 && (\n <button\n type=\"button\"\n onClick={() => setColumnFilters({})}\n className=\"px-3 py-2 text-sm text-muted-foreground hover:text-foreground underline\"\n aria-label=\"Clear all filters\"\n >\n Clear filters\n </button>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Table */}\n <Table\n {...tableProps}\n data={paginatedData}\n columns={columns}\n rowKey={rowKey}\n emptyText={emptyText}\n {...(sortColumn && {\n sortColumn,\n sortDirection,\n })}\n onSort={handleSort}\n {...(showPagination && {\n pagination: {\n current: currentPage,\n pageSize: pageSize,\n total:\n isControlledPagination && totalItems !== undefined\n ? totalItems\n : sortedData.length,\n onChange: handlePageChange,\n showSizeChanger: true,\n },\n })}\n />\n\n {/* Results Summary */}\n {showPagination &&\n (isControlledPagination && totalItems !== undefined\n ? totalItems > 0\n : sortedData.length > 0) && (\n <div className=\"mt-2 px-4 py-2 text-sm text-muted-foreground\">\n {isControlledPagination && totalItems !== undefined ? (\n <>\n Showing {(currentPage - 1) * pageSize + 1} to{\" \"}\n {Math.min(currentPage * pageSize, totalItems)} of {totalItems}{\" \"}\n results\n {searchTerm && \" (filtered)\"}\n </>\n ) : (\n <>\n Showing {(currentPage - 1) * pageSize + 1} to{\" \"}\n {Math.min(currentPage * pageSize, sortedData.length)} of{\" \"}\n {sortedData.length} results\n {searchTerm && ` (filtered from ${initialData.length} total)`}\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n\nDataTable.displayName = \"DataTable\";\n\n// Memoize DataTable for performance optimization\n// DataTable is a complex component with filtering, sorting, and pagination\nexport const DataTableMemoized = memo(DataTable) as typeof DataTable;\n"]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
'use strict';var
|
|
2
|
+
'use strict';var chunkKASVYULP_cjs=require('../../chunk-KASVYULP.cjs');require('../../chunk-UC577SR4.cjs'),require('../../chunk-FUENXWR7.cjs'),require('../../chunk-7SPPGTBT.cjs'),require('../../chunk-ITRGJNWL.cjs');Object.defineProperty(exports,"DataTable",{enumerable:true,get:function(){return chunkKASVYULP_cjs.a}});Object.defineProperty(exports,"DataTableMemoized",{enumerable:true,get:function(){return chunkKASVYULP_cjs.b}});//# sourceMappingURL=data-table.cjs.map
|
|
3
3
|
//# sourceMappingURL=data-table.cjs.map
|
|
@@ -40,12 +40,33 @@ interface DataTableProps<T = Record<string, unknown>> extends Omit<TableProps<T>
|
|
|
40
40
|
onPageChange?: (page: number) => void;
|
|
41
41
|
onPageSizeChange?: (size: number) => void;
|
|
42
42
|
totalItems?: number;
|
|
43
|
+
/**
|
|
44
|
+
* Who does the work.
|
|
45
|
+
*
|
|
46
|
+
* Passing `searchTerm`, `columnFilters` or `sortColumn` makes DataTable
|
|
47
|
+
* controlled - it stops owning that piece of state - but it kept filtering and
|
|
48
|
+
* sorting the rows you gave it anyway. For a server-backed table that is
|
|
49
|
+
* actively wrong: a server searching without accent distinctions returns
|
|
50
|
+
* `{ name: "José" }` for the query `jose`, and the local substring filter then
|
|
51
|
+
* threw the row away while `totalItems` still counted it. Controlled sorting
|
|
52
|
+
* likewise reordered the page the server had already ordered.
|
|
53
|
+
*
|
|
54
|
+
* Controlled state and processing ownership are separate questions now. Set
|
|
55
|
+
* these when the rows arriving in `data` are already searched, filtered or
|
|
56
|
+
* sorted; the callbacks still fire so you know what the user asked for.
|
|
57
|
+
*
|
|
58
|
+
* Pagination has always worked this way, under a different name: it is manual
|
|
59
|
+
* when `currentPage` and `totalItems` are both given.
|
|
60
|
+
*/
|
|
61
|
+
manualSearch?: boolean;
|
|
62
|
+
manualFiltering?: boolean;
|
|
63
|
+
manualSorting?: boolean;
|
|
43
64
|
showSearch?: boolean;
|
|
44
65
|
showFilters?: boolean;
|
|
45
66
|
filterBarClassName?: string;
|
|
46
67
|
searchBarClassName?: string;
|
|
47
68
|
}
|
|
48
|
-
declare function DataTable<T extends Record<string, unknown> = Record<string, unknown>>({ data: initialData, columns, searchable, searchPlaceholder, searchKeys, onSearch, searchTerm: controlledSearchTerm, onSearchTermChange, filterable, filters, onFilter, columnFilters: controlledColumnFilters, onColumnFiltersChange, defaultSortColumn, defaultSortDirection, sortColumn: controlledSortColumn, sortDirection: controlledSortDirection, onSortChange, defaultPageSize, showPagination, currentPage: controlledCurrentPage, pageSize: controlledPageSize, onPageChange, onPageSizeChange, totalItems, showSearch, showFilters, filterBarClassName, searchBarClassName, rowKey, emptyText, ...tableProps }: DataTableProps<T>): React__default.JSX.Element;
|
|
69
|
+
declare function DataTable<T extends Record<string, unknown> = Record<string, unknown>>({ data: initialData, columns, searchable, searchPlaceholder, searchKeys, onSearch, searchTerm: controlledSearchTerm, onSearchTermChange, filterable, manualSearch, manualFiltering, manualSorting, filters, onFilter, columnFilters: controlledColumnFilters, onColumnFiltersChange, defaultSortColumn, defaultSortDirection, sortColumn: controlledSortColumn, sortDirection: controlledSortDirection, onSortChange, defaultPageSize, showPagination, currentPage: controlledCurrentPage, pageSize: controlledPageSize, onPageChange, onPageSizeChange, totalItems, showSearch, showFilters, filterBarClassName, searchBarClassName, rowKey, emptyText, ...tableProps }: DataTableProps<T>): React__default.JSX.Element;
|
|
49
70
|
declare namespace DataTable {
|
|
50
71
|
var displayName: string;
|
|
51
72
|
}
|
|
@@ -40,12 +40,33 @@ interface DataTableProps<T = Record<string, unknown>> extends Omit<TableProps<T>
|
|
|
40
40
|
onPageChange?: (page: number) => void;
|
|
41
41
|
onPageSizeChange?: (size: number) => void;
|
|
42
42
|
totalItems?: number;
|
|
43
|
+
/**
|
|
44
|
+
* Who does the work.
|
|
45
|
+
*
|
|
46
|
+
* Passing `searchTerm`, `columnFilters` or `sortColumn` makes DataTable
|
|
47
|
+
* controlled - it stops owning that piece of state - but it kept filtering and
|
|
48
|
+
* sorting the rows you gave it anyway. For a server-backed table that is
|
|
49
|
+
* actively wrong: a server searching without accent distinctions returns
|
|
50
|
+
* `{ name: "José" }` for the query `jose`, and the local substring filter then
|
|
51
|
+
* threw the row away while `totalItems` still counted it. Controlled sorting
|
|
52
|
+
* likewise reordered the page the server had already ordered.
|
|
53
|
+
*
|
|
54
|
+
* Controlled state and processing ownership are separate questions now. Set
|
|
55
|
+
* these when the rows arriving in `data` are already searched, filtered or
|
|
56
|
+
* sorted; the callbacks still fire so you know what the user asked for.
|
|
57
|
+
*
|
|
58
|
+
* Pagination has always worked this way, under a different name: it is manual
|
|
59
|
+
* when `currentPage` and `totalItems` are both given.
|
|
60
|
+
*/
|
|
61
|
+
manualSearch?: boolean;
|
|
62
|
+
manualFiltering?: boolean;
|
|
63
|
+
manualSorting?: boolean;
|
|
43
64
|
showSearch?: boolean;
|
|
44
65
|
showFilters?: boolean;
|
|
45
66
|
filterBarClassName?: string;
|
|
46
67
|
searchBarClassName?: string;
|
|
47
68
|
}
|
|
48
|
-
declare function DataTable<T extends Record<string, unknown> = Record<string, unknown>>({ data: initialData, columns, searchable, searchPlaceholder, searchKeys, onSearch, searchTerm: controlledSearchTerm, onSearchTermChange, filterable, filters, onFilter, columnFilters: controlledColumnFilters, onColumnFiltersChange, defaultSortColumn, defaultSortDirection, sortColumn: controlledSortColumn, sortDirection: controlledSortDirection, onSortChange, defaultPageSize, showPagination, currentPage: controlledCurrentPage, pageSize: controlledPageSize, onPageChange, onPageSizeChange, totalItems, showSearch, showFilters, filterBarClassName, searchBarClassName, rowKey, emptyText, ...tableProps }: DataTableProps<T>): React__default.JSX.Element;
|
|
69
|
+
declare function DataTable<T extends Record<string, unknown> = Record<string, unknown>>({ data: initialData, columns, searchable, searchPlaceholder, searchKeys, onSearch, searchTerm: controlledSearchTerm, onSearchTermChange, filterable, manualSearch, manualFiltering, manualSorting, filters, onFilter, columnFilters: controlledColumnFilters, onColumnFiltersChange, defaultSortColumn, defaultSortDirection, sortColumn: controlledSortColumn, sortDirection: controlledSortDirection, onSortChange, defaultPageSize, showPagination, currentPage: controlledCurrentPage, pageSize: controlledPageSize, onPageChange, onPageSizeChange, totalItems, showSearch, showFilters, filterBarClassName, searchBarClassName, rowKey, emptyText, ...tableProps }: DataTableProps<T>): React__default.JSX.Element;
|
|
49
70
|
declare namespace DataTable {
|
|
50
71
|
var displayName: string;
|
|
51
72
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
export{a as DataTable,b as DataTableMemoized}from'../../chunk-
|
|
2
|
+
export{a as DataTable,b as DataTableMemoized}from'../../chunk-YC6ALHAZ.js';import'../../chunk-HCO4XKPM.js';import'../../chunk-HD3TMQPR.js';import'../../chunk-COXN6XBA.js';import'../../chunk-AC2JBXHQ.js';//# sourceMappingURL=data-table.js.map
|
|
3
3
|
//# sourceMappingURL=data-table.js.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
'use strict';var
|
|
2
|
+
'use strict';var chunkUC577SR4_cjs=require('../../chunk-UC577SR4.cjs');require('../../chunk-ITRGJNWL.cjs');Object.defineProperty(exports,"Table",{enumerable:true,get:function(){return chunkUC577SR4_cjs.d}});Object.defineProperty(exports,"TableBody",{enumerable:true,get:function(){return chunkUC577SR4_cjs.f}});Object.defineProperty(exports,"TableCell",{enumerable:true,get:function(){return chunkUC577SR4_cjs.h}});Object.defineProperty(exports,"TableHead",{enumerable:true,get:function(){return chunkUC577SR4_cjs.i}});Object.defineProperty(exports,"TableHeader",{enumerable:true,get:function(){return chunkUC577SR4_cjs.e}});Object.defineProperty(exports,"TableRow",{enumerable:true,get:function(){return chunkUC577SR4_cjs.g}});Object.defineProperty(exports,"tableCellVariants",{enumerable:true,get:function(){return chunkUC577SR4_cjs.c}});Object.defineProperty(exports,"tableHeaderVariants",{enumerable:true,get:function(){return chunkUC577SR4_cjs.b}});Object.defineProperty(exports,"tableVariants",{enumerable:true,get:function(){return chunkUC577SR4_cjs.a}});//# sourceMappingURL=table.cjs.map
|
|
3
3
|
//# sourceMappingURL=table.cjs.map
|