@simpleapps-com/augur-web 2.2.23 → 2.2.24
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-32XB3REY.cjs +34 -0
- package/dist/chunk-32XB3REY.cjs.map +1 -0
- package/dist/chunk-KHIHHL3A.js +52 -0
- package/dist/chunk-KHIHHL3A.js.map +1 -0
- package/dist/chunk-NEY26NNF.cjs +75 -0
- package/dist/chunk-NEY26NNF.cjs.map +1 -0
- package/dist/chunk-RGJT67PN.js +34 -0
- package/dist/chunk-RGJT67PN.js.map +1 -0
- package/dist/chunk-UB7HYAAC.js +34 -0
- package/dist/chunk-UB7HYAAC.js.map +1 -0
- package/dist/chunk-UFL6PVLI.cjs +52 -0
- package/dist/chunk-UFL6PVLI.cjs.map +1 -0
- package/dist/chunk-WFMP6TZN.js +51 -0
- package/dist/chunk-WFMP6TZN.js.map +1 -0
- package/dist/chunk-WJUDOEVB.cjs +51 -0
- package/dist/chunk-WJUDOEVB.cjs.map +1 -0
- package/dist/chunk-XIKSI7NY.js +75 -0
- package/dist/chunk-XIKSI7NY.js.map +1 -0
- package/dist/chunk-Z57QBVUC.cjs +34 -0
- package/dist/chunk-Z57QBVUC.cjs.map +1 -0
- package/dist/confirm-dialog.cjs +49 -0
- package/dist/confirm-dialog.cjs.map +1 -0
- package/dist/confirm-dialog.d.cts +35 -0
- package/dist/confirm-dialog.d.ts +35 -0
- package/dist/confirm-dialog.js +49 -0
- package/dist/confirm-dialog.js.map +1 -0
- package/dist/data-table.cjs +134 -0
- package/dist/data-table.cjs.map +1 -0
- package/dist/data-table.d.cts +58 -0
- package/dist/data-table.d.ts +58 -0
- package/dist/data-table.js +134 -0
- package/dist/data-table.js.map +1 -0
- package/dist/detail-panel.cjs +142 -0
- package/dist/detail-panel.cjs.map +1 -0
- package/dist/detail-panel.d.cts +59 -0
- package/dist/detail-panel.d.ts +59 -0
- package/dist/detail-panel.js +142 -0
- package/dist/detail-panel.js.map +1 -0
- package/dist/form-input.cjs +5 -28
- package/dist/form-input.cjs.map +1 -1
- package/dist/form-input.js +4 -27
- package/dist/form-input.js.map +1 -1
- package/dist/form-select.cjs +5 -45
- package/dist/form-select.cjs.map +1 -1
- package/dist/form-select.js +4 -44
- package/dist/form-select.js.map +1 -1
- package/dist/form-textarea.cjs +5 -28
- package/dist/form-textarea.cjs.map +1 -1
- package/dist/form-textarea.js +4 -27
- package/dist/form-textarea.js.map +1 -1
- package/dist/resource-tabs.cjs +25 -0
- package/dist/resource-tabs.cjs.map +1 -0
- package/dist/resource-tabs.d.cts +33 -0
- package/dist/resource-tabs.d.ts +33 -0
- package/dist/resource-tabs.js +25 -0
- package/dist/resource-tabs.js.map +1 -0
- package/dist/table.cjs +20 -72
- package/dist/table.cjs.map +1 -1
- package/dist/table.js +10 -62
- package/dist/table.js.map +1 -1
- package/dist/tabs.cjs +12 -49
- package/dist/tabs.cjs.map +1 -1
- package/dist/tabs.js +6 -43
- package/dist/tabs.js.map +1 -1
- package/package.json +29 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/confirm-dialog.cjs","../src/confirm-dialog.tsx"],"names":[],"mappings":"AAAA,qFAAY;AACZ,YAAY;AACZ;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACuCQ,+CAAA;AAdR,SAAS,aAAA,CAAc;AAAA,EACrB,IAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA,EAAe,SAAA;AAAA,EACf,YAAA,EAAc,QAAA;AAAA,EACd,QAAA,EAAU,SAAA;AAAA,EACV,SAAA;AAAA,EACA,QAAA,EAAU;AACZ,CAAA,EAAuB;AACrB,EAAA,uBACE,6BAAA,wBAAC,EAAA,EAAO,IAAA,EAAY,YAAA,EAClB,QAAA,kBAAA,8BAAA,+BAAC,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,8BAAA,8BAAC,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,6BAAA,6BAAC,EAAA,EAAa,QAAA,EAAA,MAAA,CAAM,CAAA;AAAA,MACnB,YAAA,mBAAe,6BAAA,mCAAC,EAAA,EAAmB,QAAA,EAAA,YAAA,CAAY;AAAA,IAAA,EAAA,CAClD,CAAA;AAAA,oBACA,8BAAA,8BAAC,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,6BAAA,wBAAC,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,OAAA,EAAS,CAAA,EAAA,GAAM,YAAA,CAAa,KAAK,CAAA,EAAG,QAAA,EAAU,OAAA,EACrE,QAAA,EAAA,YAAA,CACH,CAAA;AAAA,sBACA,8BAAA,wBAAC,EAAA,EAAO,OAAA,EAAkB,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,OAAA,EACrD,QAAA,EAAA;AAAA,QAAA,QAAA,mBAAW,6BAAA,yBAAC,EAAA,EAAQ,IAAA,EAAK,IAAA,EAAK,SAAA,EAAU,OAAA,CAAO,CAAA;AAAA,QAC/C;AAAA,MAAA,EAAA,CACH;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF,CAAA;AAEJ;AACA,aAAA,CAAc,YAAA,EAAc,eAAA;AD5B5B;AACE;AACF,sCAAC","file":"/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/confirm-dialog.cjs","sourcesContent":[null,"/** Reusable confirmation dialog composing Dialog + Button. */\n\"use client\";\n\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n} from \"./dialog\";\nimport { Button } from \"./button\";\nimport { Spinner } from \"./spinner\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: string;\n description?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n variant?: \"default\" | \"destructive\";\n onConfirm: () => void;\n loading?: boolean;\n}\n\n/**\n * Pre-composed confirmation dialog for delete/action confirmations.\n *\n * @example\n * ```tsx\n * <ConfirmDialog\n * open={showDelete}\n * onOpenChange={setShowDelete}\n * title=\"Delete brand?\"\n * description=\"This action cannot be undone.\"\n * variant=\"destructive\"\n * onConfirm={() => deleteBrand.mutate(uid)}\n * loading={deleteBrand.isPending}\n * />\n * ```\n */\nfunction ConfirmDialog({\n open,\n onOpenChange,\n title,\n description,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n variant = \"default\",\n onConfirm,\n loading = false,\n}: ConfirmDialogProps) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n {description && <DialogDescription>{description}</DialogDescription>}\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)} disabled={loading}>\n {cancelLabel}\n </Button>\n <Button variant={variant} onClick={onConfirm} disabled={loading}>\n {loading && <Spinner size=\"sm\" className=\"mr-2\" />}\n {confirmLabel}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\nConfirmDialog.displayName = \"ConfirmDialog\";\n\nexport { ConfirmDialog };\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
interface ConfirmDialogProps {
|
|
4
|
+
open: boolean;
|
|
5
|
+
onOpenChange: (open: boolean) => void;
|
|
6
|
+
title: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
confirmLabel?: string;
|
|
9
|
+
cancelLabel?: string;
|
|
10
|
+
variant?: "default" | "destructive";
|
|
11
|
+
onConfirm: () => void;
|
|
12
|
+
loading?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Pre-composed confirmation dialog for delete/action confirmations.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* <ConfirmDialog
|
|
20
|
+
* open={showDelete}
|
|
21
|
+
* onOpenChange={setShowDelete}
|
|
22
|
+
* title="Delete brand?"
|
|
23
|
+
* description="This action cannot be undone."
|
|
24
|
+
* variant="destructive"
|
|
25
|
+
* onConfirm={() => deleteBrand.mutate(uid)}
|
|
26
|
+
* loading={deleteBrand.isPending}
|
|
27
|
+
* />
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
declare function ConfirmDialog({ open, onOpenChange, title, description, confirmLabel, cancelLabel, variant, onConfirm, loading, }: ConfirmDialogProps): react_jsx_runtime.JSX.Element;
|
|
31
|
+
declare namespace ConfirmDialog {
|
|
32
|
+
var displayName: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export { ConfirmDialog, type ConfirmDialogProps };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
interface ConfirmDialogProps {
|
|
4
|
+
open: boolean;
|
|
5
|
+
onOpenChange: (open: boolean) => void;
|
|
6
|
+
title: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
confirmLabel?: string;
|
|
9
|
+
cancelLabel?: string;
|
|
10
|
+
variant?: "default" | "destructive";
|
|
11
|
+
onConfirm: () => void;
|
|
12
|
+
loading?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Pre-composed confirmation dialog for delete/action confirmations.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* <ConfirmDialog
|
|
20
|
+
* open={showDelete}
|
|
21
|
+
* onOpenChange={setShowDelete}
|
|
22
|
+
* title="Delete brand?"
|
|
23
|
+
* description="This action cannot be undone."
|
|
24
|
+
* variant="destructive"
|
|
25
|
+
* onConfirm={() => deleteBrand.mutate(uid)}
|
|
26
|
+
* loading={deleteBrand.isPending}
|
|
27
|
+
* />
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
declare function ConfirmDialog({ open, onOpenChange, title, description, confirmLabel, cancelLabel, variant, onConfirm, loading, }: ConfirmDialogProps): react_jsx_runtime.JSX.Element;
|
|
31
|
+
declare namespace ConfirmDialog {
|
|
32
|
+
var displayName: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export { ConfirmDialog, type ConfirmDialogProps };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use client";
|
|
3
|
+
import {
|
|
4
|
+
Spinner
|
|
5
|
+
} from "./chunk-UMNTUD2P.js";
|
|
6
|
+
import {
|
|
7
|
+
Button
|
|
8
|
+
} from "./chunk-QICSGVX3.js";
|
|
9
|
+
import {
|
|
10
|
+
Dialog,
|
|
11
|
+
DialogContent,
|
|
12
|
+
DialogDescription,
|
|
13
|
+
DialogFooter,
|
|
14
|
+
DialogHeader,
|
|
15
|
+
DialogTitle
|
|
16
|
+
} from "./chunk-JNYGRU2F.js";
|
|
17
|
+
|
|
18
|
+
// src/confirm-dialog.tsx
|
|
19
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
20
|
+
function ConfirmDialog({
|
|
21
|
+
open,
|
|
22
|
+
onOpenChange,
|
|
23
|
+
title,
|
|
24
|
+
description,
|
|
25
|
+
confirmLabel = "Confirm",
|
|
26
|
+
cancelLabel = "Cancel",
|
|
27
|
+
variant = "default",
|
|
28
|
+
onConfirm,
|
|
29
|
+
loading = false
|
|
30
|
+
}) {
|
|
31
|
+
return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs(DialogContent, { children: [
|
|
32
|
+
/* @__PURE__ */ jsxs(DialogHeader, { children: [
|
|
33
|
+
/* @__PURE__ */ jsx(DialogTitle, { children: title }),
|
|
34
|
+
description && /* @__PURE__ */ jsx(DialogDescription, { children: description })
|
|
35
|
+
] }),
|
|
36
|
+
/* @__PURE__ */ jsxs(DialogFooter, { children: [
|
|
37
|
+
/* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => onOpenChange(false), disabled: loading, children: cancelLabel }),
|
|
38
|
+
/* @__PURE__ */ jsxs(Button, { variant, onClick: onConfirm, disabled: loading, children: [
|
|
39
|
+
loading && /* @__PURE__ */ jsx(Spinner, { size: "sm", className: "mr-2" }),
|
|
40
|
+
confirmLabel
|
|
41
|
+
] })
|
|
42
|
+
] })
|
|
43
|
+
] }) });
|
|
44
|
+
}
|
|
45
|
+
ConfirmDialog.displayName = "ConfirmDialog";
|
|
46
|
+
export {
|
|
47
|
+
ConfirmDialog
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=confirm-dialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/confirm-dialog.tsx"],"sourcesContent":["/** Reusable confirmation dialog composing Dialog + Button. */\n\"use client\";\n\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n} from \"./dialog\";\nimport { Button } from \"./button\";\nimport { Spinner } from \"./spinner\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: string;\n description?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n variant?: \"default\" | \"destructive\";\n onConfirm: () => void;\n loading?: boolean;\n}\n\n/**\n * Pre-composed confirmation dialog for delete/action confirmations.\n *\n * @example\n * ```tsx\n * <ConfirmDialog\n * open={showDelete}\n * onOpenChange={setShowDelete}\n * title=\"Delete brand?\"\n * description=\"This action cannot be undone.\"\n * variant=\"destructive\"\n * onConfirm={() => deleteBrand.mutate(uid)}\n * loading={deleteBrand.isPending}\n * />\n * ```\n */\nfunction ConfirmDialog({\n open,\n onOpenChange,\n title,\n description,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n variant = \"default\",\n onConfirm,\n loading = false,\n}: ConfirmDialogProps) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n {description && <DialogDescription>{description}</DialogDescription>}\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)} disabled={loading}>\n {cancelLabel}\n </Button>\n <Button variant={variant} onClick={onConfirm} disabled={loading}>\n {loading && <Spinner size=\"sm\" className=\"mr-2\" />}\n {confirmLabel}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\nConfirmDialog.displayName = \"ConfirmDialog\";\n\nexport { ConfirmDialog };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAwDQ,SACE,KADF;AAdR,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,cAAc;AAAA,EACd,UAAU;AAAA,EACV;AAAA,EACA,UAAU;AACZ,GAAuB;AACrB,SACE,oBAAC,UAAO,MAAY,cAClB,+BAAC,iBACC;AAAA,yBAAC,gBACC;AAAA,0BAAC,eAAa,iBAAM;AAAA,MACnB,eAAe,oBAAC,qBAAmB,uBAAY;AAAA,OAClD;AAAA,IACA,qBAAC,gBACC;AAAA,0BAAC,UAAO,SAAQ,WAAU,SAAS,MAAM,aAAa,KAAK,GAAG,UAAU,SACrE,uBACH;AAAA,MACA,qBAAC,UAAO,SAAkB,SAAS,WAAW,UAAU,SACrD;AAAA,mBAAW,oBAAC,WAAQ,MAAK,MAAK,WAAU,QAAO;AAAA,QAC/C;AAAA,SACH;AAAA,OACF;AAAA,KACF,GACF;AAEJ;AACA,cAAc,cAAc;","names":[]}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }"use client";
|
|
2
|
+
"use client";
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
var _chunkNEY26NNFcjs = require('./chunk-NEY26NNF.cjs');
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
var _chunk7EXXNELXcjs = require('./chunk-7EXXNELX.cjs');
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
var _chunk5VMEEKZ5cjs = require('./chunk-5VMEEKZ5.cjs');
|
|
17
|
+
|
|
18
|
+
// src/data-table.tsx
|
|
19
|
+
var _react = require('react'); var React = _interopRequireWildcard(_react);
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
var _reacttable = require('@tanstack/react-table');
|
|
27
|
+
var _web = require('@simpleapps-com/augur-utils/web');
|
|
28
|
+
var _lu = require('react-icons/lu');
|
|
29
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
30
|
+
function buildTanstackColumns(columns) {
|
|
31
|
+
return columns.map((col) => ({
|
|
32
|
+
id: col.key,
|
|
33
|
+
accessorKey: col.key,
|
|
34
|
+
header: col.header,
|
|
35
|
+
enableSorting: _nullishCoalesce(col.sortable, () => ( false)),
|
|
36
|
+
cell: col.render ? (info) => col.render(info.row.original) : (info) => String(_nullishCoalesce(info.getValue(), () => ( ""))),
|
|
37
|
+
meta: { align: col.align }
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
40
|
+
var alignClass = {
|
|
41
|
+
left: "text-left",
|
|
42
|
+
center: "text-center",
|
|
43
|
+
right: "text-right"
|
|
44
|
+
};
|
|
45
|
+
function DataTable({
|
|
46
|
+
columns,
|
|
47
|
+
data,
|
|
48
|
+
searchable = false,
|
|
49
|
+
searchPlaceholder = "Search...",
|
|
50
|
+
onRowClick,
|
|
51
|
+
loading = false,
|
|
52
|
+
emptyMessage = "No results.",
|
|
53
|
+
toolbar,
|
|
54
|
+
className,
|
|
55
|
+
getRowId
|
|
56
|
+
}) {
|
|
57
|
+
const [sorting, setSorting] = React.useState([]);
|
|
58
|
+
const [globalFilter, setGlobalFilter] = React.useState("");
|
|
59
|
+
const tanstackColumns = React.useMemo(() => buildTanstackColumns(columns), [columns]);
|
|
60
|
+
const table = _reacttable.useReactTable.call(void 0, {
|
|
61
|
+
data,
|
|
62
|
+
columns: tanstackColumns,
|
|
63
|
+
state: { sorting, globalFilter },
|
|
64
|
+
onSortingChange: setSorting,
|
|
65
|
+
onGlobalFilterChange: setGlobalFilter,
|
|
66
|
+
getCoreRowModel: _reacttable.getCoreRowModel.call(void 0, ),
|
|
67
|
+
getSortedRowModel: _reacttable.getSortedRowModel.call(void 0, ),
|
|
68
|
+
getFilteredRowModel: _reacttable.getFilteredRowModel.call(void 0, ),
|
|
69
|
+
getRowId: getRowId ? (row) => getRowId(row) : void 0
|
|
70
|
+
});
|
|
71
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _web.cn.call(void 0, "space-y-4", className), children: [
|
|
72
|
+
(searchable || toolbar) && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-4", children: [
|
|
73
|
+
searchable && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
74
|
+
_chunk7EXXNELXcjs.Input,
|
|
75
|
+
{
|
|
76
|
+
placeholder: searchPlaceholder,
|
|
77
|
+
value: globalFilter,
|
|
78
|
+
onChange: (e) => setGlobalFilter(e.target.value),
|
|
79
|
+
className: "max-w-sm"
|
|
80
|
+
}
|
|
81
|
+
),
|
|
82
|
+
toolbar
|
|
83
|
+
] }),
|
|
84
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkNEY26NNFcjs.Table, { children: [
|
|
85
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEY26NNFcjs.TableHeader, { children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEY26NNFcjs.TableRow, { children: headerGroup.headers.map((header) => {
|
|
86
|
+
const align = _nullishCoalesce(_optionalChain([header, 'access', _ => _.column, 'access', _2 => _2.columnDef, 'access', _3 => _3.meta, 'optionalAccess', _4 => _4.align]), () => ( "left"));
|
|
87
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
88
|
+
_chunkNEY26NNFcjs.TableHead,
|
|
89
|
+
{
|
|
90
|
+
className: _web.cn.call(void 0,
|
|
91
|
+
alignClass[align],
|
|
92
|
+
header.column.getCanSort() && "cursor-pointer select-none"
|
|
93
|
+
),
|
|
94
|
+
onClick: header.column.getToggleSortingHandler(),
|
|
95
|
+
children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "inline-flex items-center gap-1", children: [
|
|
96
|
+
_reacttable.flexRender.call(void 0, header.column.columnDef.header, header.getContext()),
|
|
97
|
+
header.column.getCanSort() && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, SortIndicator, { direction: header.column.getIsSorted() })
|
|
98
|
+
] })
|
|
99
|
+
},
|
|
100
|
+
header.id
|
|
101
|
+
);
|
|
102
|
+
}) }, headerGroup.id)) }),
|
|
103
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEY26NNFcjs.TableBody, { children: loading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEY26NNFcjs.TableRow, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEY26NNFcjs.TableCell, { colSpan: columns.length, className: "h-24 text-center", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk5VMEEKZ5cjs.Spinner, { size: "lg", className: "mx-auto" }) }) }) : table.getRowModel().rows.length === 0 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEY26NNFcjs.TableRow, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEY26NNFcjs.TableCell, { colSpan: columns.length, className: "h-24 text-center", children: emptyMessage }) }) : table.getRowModel().rows.map((row) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
104
|
+
_chunkNEY26NNFcjs.TableRow,
|
|
105
|
+
{
|
|
106
|
+
className: _web.cn.call(void 0, onRowClick && "cursor-pointer"),
|
|
107
|
+
onClick: onRowClick ? () => onRowClick(row.original) : void 0,
|
|
108
|
+
children: row.getVisibleCells().map((cell) => {
|
|
109
|
+
const align = _nullishCoalesce(_optionalChain([cell, 'access', _5 => _5.column, 'access', _6 => _6.columnDef, 'access', _7 => _7.meta, 'optionalAccess', _8 => _8.align]), () => ( "left"));
|
|
110
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
111
|
+
_chunkNEY26NNFcjs.TableCell,
|
|
112
|
+
{
|
|
113
|
+
className: alignClass[align],
|
|
114
|
+
children: _reacttable.flexRender.call(void 0, cell.column.columnDef.cell, cell.getContext())
|
|
115
|
+
},
|
|
116
|
+
cell.id
|
|
117
|
+
);
|
|
118
|
+
})
|
|
119
|
+
},
|
|
120
|
+
row.id
|
|
121
|
+
)) })
|
|
122
|
+
] })
|
|
123
|
+
] });
|
|
124
|
+
}
|
|
125
|
+
DataTable.displayName = "DataTable";
|
|
126
|
+
function SortIndicator({ direction }) {
|
|
127
|
+
if (direction === "asc") return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lu.LuArrowUp, { className: "h-4 w-4" });
|
|
128
|
+
if (direction === "desc") return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lu.LuArrowDown, { className: "h-4 w-4" });
|
|
129
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lu.LuArrowUpDown, { className: "text-muted-foreground/50 h-4 w-4" });
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
exports.DataTable = DataTable;
|
|
134
|
+
//# sourceMappingURL=data-table.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/data-table.cjs","../src/data-table.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/data-table.cjs","sourcesContent":[null,"/** Sortable, searchable data table built on TanStack Table. */\n\"use client\";\n\nimport * as React from \"react\";\nimport {\n flexRender,\n getCoreRowModel,\n getSortedRowModel,\n getFilteredRowModel,\n useReactTable,\n type ColumnDef as TanstackColumnDef,\n type SortingState,\n} from \"@tanstack/react-table\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\nimport { LuArrowDown, LuArrowUp, LuArrowUpDown } from \"react-icons/lu\";\nimport { Table, TableHeader, TableBody, TableRow, TableHead, TableCell } from \"./table\";\nimport { Input } from \"./input\";\nimport { Spinner } from \"./spinner\";\n\nexport interface ColumnDef<T> {\n /** Property key on the data object. */\n key: keyof T & string;\n /** Column header label. */\n header: string;\n /** Enable sorting on this column. */\n sortable?: boolean;\n /** Custom cell renderer. Receives the row data object. */\n render?: (row: T) => React.ReactNode;\n /** Text alignment. */\n align?: \"left\" | \"center\" | \"right\";\n}\n\nexport interface DataTableProps<T> {\n /** Column definitions describing each table column. */\n columns: ColumnDef<T>[];\n /** Data rows to display. */\n data: T[];\n /** Show a search input above the table. */\n searchable?: boolean;\n /** Placeholder text for the search input. */\n searchPlaceholder?: string;\n /** Callback when a row is clicked. Receives the row data. */\n onRowClick?: (row: T) => void;\n /** Show a loading spinner instead of data. */\n loading?: boolean;\n /** Message shown when data is empty. */\n emptyMessage?: string;\n /** Additional toolbar content rendered between search and table. */\n toolbar?: React.ReactNode;\n /** Additional class name for the root container. */\n className?: string;\n /** Row key extractor. Defaults to the row index. */\n getRowId?: (row: T) => string;\n}\n\nfunction buildTanstackColumns<T>(columns: ColumnDef<T>[]): TanstackColumnDef<T, unknown>[] {\n return columns.map((col) => ({\n id: col.key,\n accessorKey: col.key,\n header: col.header,\n enableSorting: col.sortable ?? false,\n cell: col.render\n ? (info) => col.render!(info.row.original)\n : (info) => String(info.getValue() ?? \"\"),\n meta: { align: col.align },\n }));\n}\n\nconst alignClass = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n} as const;\n\n/**\n * Data-driven table with sorting and search. Wraps TanStack Table with\n * the augur-web Table primitives.\n *\n * @example\n * ```tsx\n * const columns: ColumnDef<Brand>[] = [\n * { key: \"brandsUid\", header: \"UID\", sortable: true },\n * { key: \"brandsName\", header: \"Name\", sortable: true },\n * { key: \"brandsDesc\", header: \"Description\" },\n * ];\n *\n * <DataTable columns={columns} data={brands} searchable onRowClick={selectBrand} />\n * ```\n */\nfunction DataTable<T>({\n columns,\n data,\n searchable = false,\n searchPlaceholder = \"Search...\",\n onRowClick,\n loading = false,\n emptyMessage = \"No results.\",\n toolbar,\n className,\n getRowId,\n}: DataTableProps<T>) {\n const [sorting, setSorting] = React.useState<SortingState>([]);\n const [globalFilter, setGlobalFilter] = React.useState(\"\");\n\n const tanstackColumns = React.useMemo(() => buildTanstackColumns(columns), [columns]);\n\n const table = useReactTable({\n data,\n columns: tanstackColumns,\n state: { sorting, globalFilter },\n onSortingChange: setSorting,\n onGlobalFilterChange: setGlobalFilter,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getRowId: getRowId ? (row) => getRowId(row) : undefined,\n });\n\n return (\n <div className={cn(\"space-y-4\", className)}>\n {(searchable || toolbar) && (\n <div className=\"flex items-center gap-4\">\n {searchable && (\n <Input\n placeholder={searchPlaceholder}\n value={globalFilter}\n onChange={(e) => setGlobalFilter(e.target.value)}\n className=\"max-w-sm\"\n />\n )}\n {toolbar}\n </div>\n )}\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => {\n const align =\n (header.column.columnDef.meta as { align?: string } | undefined)?.align ?? \"left\";\n return (\n <TableHead\n key={header.id}\n className={cn(\n alignClass[align as keyof typeof alignClass],\n header.column.getCanSort() && \"cursor-pointer select-none\",\n )}\n onClick={header.column.getToggleSortingHandler()}\n >\n <span className=\"inline-flex items-center gap-1\">\n {flexRender(header.column.columnDef.header, header.getContext())}\n {header.column.getCanSort() && (\n <SortIndicator direction={header.column.getIsSorted()} />\n )}\n </span>\n </TableHead>\n );\n })}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {loading ? (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center\">\n <Spinner size=\"lg\" className=\"mx-auto\" />\n </TableCell>\n </TableRow>\n ) : table.getRowModel().rows.length === 0 ? (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center\">\n {emptyMessage}\n </TableCell>\n </TableRow>\n ) : (\n table.getRowModel().rows.map((row) => (\n <TableRow\n key={row.id}\n className={cn(onRowClick && \"cursor-pointer\")}\n onClick={onRowClick ? () => onRowClick(row.original) : undefined}\n >\n {row.getVisibleCells().map((cell) => {\n const align =\n (cell.column.columnDef.meta as { align?: string } | undefined)?.align ?? \"left\";\n return (\n <TableCell\n key={cell.id}\n className={alignClass[align as keyof typeof alignClass]}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n );\n })}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n );\n}\nDataTable.displayName = \"DataTable\";\n\nfunction SortIndicator({ direction }: { direction: false | \"asc\" | \"desc\" }) {\n if (direction === \"asc\") return <LuArrowUp className=\"h-4 w-4\" />;\n if (direction === \"desc\") return <LuArrowDown className=\"h-4 w-4\" />;\n return <LuArrowUpDown className=\"text-muted-foreground/50 h-4 w-4\" />;\n}\n\nexport { DataTable };\n"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
|
|
4
|
+
interface ColumnDef<T> {
|
|
5
|
+
/** Property key on the data object. */
|
|
6
|
+
key: keyof T & string;
|
|
7
|
+
/** Column header label. */
|
|
8
|
+
header: string;
|
|
9
|
+
/** Enable sorting on this column. */
|
|
10
|
+
sortable?: boolean;
|
|
11
|
+
/** Custom cell renderer. Receives the row data object. */
|
|
12
|
+
render?: (row: T) => React.ReactNode;
|
|
13
|
+
/** Text alignment. */
|
|
14
|
+
align?: "left" | "center" | "right";
|
|
15
|
+
}
|
|
16
|
+
interface DataTableProps<T> {
|
|
17
|
+
/** Column definitions describing each table column. */
|
|
18
|
+
columns: ColumnDef<T>[];
|
|
19
|
+
/** Data rows to display. */
|
|
20
|
+
data: T[];
|
|
21
|
+
/** Show a search input above the table. */
|
|
22
|
+
searchable?: boolean;
|
|
23
|
+
/** Placeholder text for the search input. */
|
|
24
|
+
searchPlaceholder?: string;
|
|
25
|
+
/** Callback when a row is clicked. Receives the row data. */
|
|
26
|
+
onRowClick?: (row: T) => void;
|
|
27
|
+
/** Show a loading spinner instead of data. */
|
|
28
|
+
loading?: boolean;
|
|
29
|
+
/** Message shown when data is empty. */
|
|
30
|
+
emptyMessage?: string;
|
|
31
|
+
/** Additional toolbar content rendered between search and table. */
|
|
32
|
+
toolbar?: React.ReactNode;
|
|
33
|
+
/** Additional class name for the root container. */
|
|
34
|
+
className?: string;
|
|
35
|
+
/** Row key extractor. Defaults to the row index. */
|
|
36
|
+
getRowId?: (row: T) => string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Data-driven table with sorting and search. Wraps TanStack Table with
|
|
40
|
+
* the augur-web Table primitives.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```tsx
|
|
44
|
+
* const columns: ColumnDef<Brand>[] = [
|
|
45
|
+
* { key: "brandsUid", header: "UID", sortable: true },
|
|
46
|
+
* { key: "brandsName", header: "Name", sortable: true },
|
|
47
|
+
* { key: "brandsDesc", header: "Description" },
|
|
48
|
+
* ];
|
|
49
|
+
*
|
|
50
|
+
* <DataTable columns={columns} data={brands} searchable onRowClick={selectBrand} />
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
declare function DataTable<T>({ columns, data, searchable, searchPlaceholder, onRowClick, loading, emptyMessage, toolbar, className, getRowId, }: DataTableProps<T>): react_jsx_runtime.JSX.Element;
|
|
54
|
+
declare namespace DataTable {
|
|
55
|
+
var displayName: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export { type ColumnDef, DataTable, type DataTableProps };
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
|
|
4
|
+
interface ColumnDef<T> {
|
|
5
|
+
/** Property key on the data object. */
|
|
6
|
+
key: keyof T & string;
|
|
7
|
+
/** Column header label. */
|
|
8
|
+
header: string;
|
|
9
|
+
/** Enable sorting on this column. */
|
|
10
|
+
sortable?: boolean;
|
|
11
|
+
/** Custom cell renderer. Receives the row data object. */
|
|
12
|
+
render?: (row: T) => React.ReactNode;
|
|
13
|
+
/** Text alignment. */
|
|
14
|
+
align?: "left" | "center" | "right";
|
|
15
|
+
}
|
|
16
|
+
interface DataTableProps<T> {
|
|
17
|
+
/** Column definitions describing each table column. */
|
|
18
|
+
columns: ColumnDef<T>[];
|
|
19
|
+
/** Data rows to display. */
|
|
20
|
+
data: T[];
|
|
21
|
+
/** Show a search input above the table. */
|
|
22
|
+
searchable?: boolean;
|
|
23
|
+
/** Placeholder text for the search input. */
|
|
24
|
+
searchPlaceholder?: string;
|
|
25
|
+
/** Callback when a row is clicked. Receives the row data. */
|
|
26
|
+
onRowClick?: (row: T) => void;
|
|
27
|
+
/** Show a loading spinner instead of data. */
|
|
28
|
+
loading?: boolean;
|
|
29
|
+
/** Message shown when data is empty. */
|
|
30
|
+
emptyMessage?: string;
|
|
31
|
+
/** Additional toolbar content rendered between search and table. */
|
|
32
|
+
toolbar?: React.ReactNode;
|
|
33
|
+
/** Additional class name for the root container. */
|
|
34
|
+
className?: string;
|
|
35
|
+
/** Row key extractor. Defaults to the row index. */
|
|
36
|
+
getRowId?: (row: T) => string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Data-driven table with sorting and search. Wraps TanStack Table with
|
|
40
|
+
* the augur-web Table primitives.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```tsx
|
|
44
|
+
* const columns: ColumnDef<Brand>[] = [
|
|
45
|
+
* { key: "brandsUid", header: "UID", sortable: true },
|
|
46
|
+
* { key: "brandsName", header: "Name", sortable: true },
|
|
47
|
+
* { key: "brandsDesc", header: "Description" },
|
|
48
|
+
* ];
|
|
49
|
+
*
|
|
50
|
+
* <DataTable columns={columns} data={brands} searchable onRowClick={selectBrand} />
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
declare function DataTable<T>({ columns, data, searchable, searchPlaceholder, onRowClick, loading, emptyMessage, toolbar, className, getRowId, }: DataTableProps<T>): react_jsx_runtime.JSX.Element;
|
|
54
|
+
declare namespace DataTable {
|
|
55
|
+
var displayName: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export { type ColumnDef, DataTable, type DataTableProps };
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use client";
|
|
3
|
+
import {
|
|
4
|
+
Table,
|
|
5
|
+
TableBody,
|
|
6
|
+
TableCell,
|
|
7
|
+
TableHead,
|
|
8
|
+
TableHeader,
|
|
9
|
+
TableRow
|
|
10
|
+
} from "./chunk-XIKSI7NY.js";
|
|
11
|
+
import {
|
|
12
|
+
Input
|
|
13
|
+
} from "./chunk-HXQF6XTL.js";
|
|
14
|
+
import {
|
|
15
|
+
Spinner
|
|
16
|
+
} from "./chunk-UMNTUD2P.js";
|
|
17
|
+
|
|
18
|
+
// src/data-table.tsx
|
|
19
|
+
import * as React from "react";
|
|
20
|
+
import {
|
|
21
|
+
flexRender,
|
|
22
|
+
getCoreRowModel,
|
|
23
|
+
getSortedRowModel,
|
|
24
|
+
getFilteredRowModel,
|
|
25
|
+
useReactTable
|
|
26
|
+
} from "@tanstack/react-table";
|
|
27
|
+
import { cn } from "@simpleapps-com/augur-utils/web";
|
|
28
|
+
import { LuArrowDown, LuArrowUp, LuArrowUpDown } from "react-icons/lu";
|
|
29
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
30
|
+
function buildTanstackColumns(columns) {
|
|
31
|
+
return columns.map((col) => ({
|
|
32
|
+
id: col.key,
|
|
33
|
+
accessorKey: col.key,
|
|
34
|
+
header: col.header,
|
|
35
|
+
enableSorting: col.sortable ?? false,
|
|
36
|
+
cell: col.render ? (info) => col.render(info.row.original) : (info) => String(info.getValue() ?? ""),
|
|
37
|
+
meta: { align: col.align }
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
40
|
+
var alignClass = {
|
|
41
|
+
left: "text-left",
|
|
42
|
+
center: "text-center",
|
|
43
|
+
right: "text-right"
|
|
44
|
+
};
|
|
45
|
+
function DataTable({
|
|
46
|
+
columns,
|
|
47
|
+
data,
|
|
48
|
+
searchable = false,
|
|
49
|
+
searchPlaceholder = "Search...",
|
|
50
|
+
onRowClick,
|
|
51
|
+
loading = false,
|
|
52
|
+
emptyMessage = "No results.",
|
|
53
|
+
toolbar,
|
|
54
|
+
className,
|
|
55
|
+
getRowId
|
|
56
|
+
}) {
|
|
57
|
+
const [sorting, setSorting] = React.useState([]);
|
|
58
|
+
const [globalFilter, setGlobalFilter] = React.useState("");
|
|
59
|
+
const tanstackColumns = React.useMemo(() => buildTanstackColumns(columns), [columns]);
|
|
60
|
+
const table = useReactTable({
|
|
61
|
+
data,
|
|
62
|
+
columns: tanstackColumns,
|
|
63
|
+
state: { sorting, globalFilter },
|
|
64
|
+
onSortingChange: setSorting,
|
|
65
|
+
onGlobalFilterChange: setGlobalFilter,
|
|
66
|
+
getCoreRowModel: getCoreRowModel(),
|
|
67
|
+
getSortedRowModel: getSortedRowModel(),
|
|
68
|
+
getFilteredRowModel: getFilteredRowModel(),
|
|
69
|
+
getRowId: getRowId ? (row) => getRowId(row) : void 0
|
|
70
|
+
});
|
|
71
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("space-y-4", className), children: [
|
|
72
|
+
(searchable || toolbar) && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
|
|
73
|
+
searchable && /* @__PURE__ */ jsx(
|
|
74
|
+
Input,
|
|
75
|
+
{
|
|
76
|
+
placeholder: searchPlaceholder,
|
|
77
|
+
value: globalFilter,
|
|
78
|
+
onChange: (e) => setGlobalFilter(e.target.value),
|
|
79
|
+
className: "max-w-sm"
|
|
80
|
+
}
|
|
81
|
+
),
|
|
82
|
+
toolbar
|
|
83
|
+
] }),
|
|
84
|
+
/* @__PURE__ */ jsxs(Table, { children: [
|
|
85
|
+
/* @__PURE__ */ jsx(TableHeader, { children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ jsx(TableRow, { children: headerGroup.headers.map((header) => {
|
|
86
|
+
const align = header.column.columnDef.meta?.align ?? "left";
|
|
87
|
+
return /* @__PURE__ */ jsx(
|
|
88
|
+
TableHead,
|
|
89
|
+
{
|
|
90
|
+
className: cn(
|
|
91
|
+
alignClass[align],
|
|
92
|
+
header.column.getCanSort() && "cursor-pointer select-none"
|
|
93
|
+
),
|
|
94
|
+
onClick: header.column.getToggleSortingHandler(),
|
|
95
|
+
children: /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
|
|
96
|
+
flexRender(header.column.columnDef.header, header.getContext()),
|
|
97
|
+
header.column.getCanSort() && /* @__PURE__ */ jsx(SortIndicator, { direction: header.column.getIsSorted() })
|
|
98
|
+
] })
|
|
99
|
+
},
|
|
100
|
+
header.id
|
|
101
|
+
);
|
|
102
|
+
}) }, headerGroup.id)) }),
|
|
103
|
+
/* @__PURE__ */ jsx(TableBody, { children: loading ? /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan: columns.length, className: "h-24 text-center", children: /* @__PURE__ */ jsx(Spinner, { size: "lg", className: "mx-auto" }) }) }) : table.getRowModel().rows.length === 0 ? /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan: columns.length, className: "h-24 text-center", children: emptyMessage }) }) : table.getRowModel().rows.map((row) => /* @__PURE__ */ jsx(
|
|
104
|
+
TableRow,
|
|
105
|
+
{
|
|
106
|
+
className: cn(onRowClick && "cursor-pointer"),
|
|
107
|
+
onClick: onRowClick ? () => onRowClick(row.original) : void 0,
|
|
108
|
+
children: row.getVisibleCells().map((cell) => {
|
|
109
|
+
const align = cell.column.columnDef.meta?.align ?? "left";
|
|
110
|
+
return /* @__PURE__ */ jsx(
|
|
111
|
+
TableCell,
|
|
112
|
+
{
|
|
113
|
+
className: alignClass[align],
|
|
114
|
+
children: flexRender(cell.column.columnDef.cell, cell.getContext())
|
|
115
|
+
},
|
|
116
|
+
cell.id
|
|
117
|
+
);
|
|
118
|
+
})
|
|
119
|
+
},
|
|
120
|
+
row.id
|
|
121
|
+
)) })
|
|
122
|
+
] })
|
|
123
|
+
] });
|
|
124
|
+
}
|
|
125
|
+
DataTable.displayName = "DataTable";
|
|
126
|
+
function SortIndicator({ direction }) {
|
|
127
|
+
if (direction === "asc") return /* @__PURE__ */ jsx(LuArrowUp, { className: "h-4 w-4" });
|
|
128
|
+
if (direction === "desc") return /* @__PURE__ */ jsx(LuArrowDown, { className: "h-4 w-4" });
|
|
129
|
+
return /* @__PURE__ */ jsx(LuArrowUpDown, { className: "text-muted-foreground/50 h-4 w-4" });
|
|
130
|
+
}
|
|
131
|
+
export {
|
|
132
|
+
DataTable
|
|
133
|
+
};
|
|
134
|
+
//# sourceMappingURL=data-table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/data-table.tsx"],"sourcesContent":["/** Sortable, searchable data table built on TanStack Table. */\n\"use client\";\n\nimport * as React from \"react\";\nimport {\n flexRender,\n getCoreRowModel,\n getSortedRowModel,\n getFilteredRowModel,\n useReactTable,\n type ColumnDef as TanstackColumnDef,\n type SortingState,\n} from \"@tanstack/react-table\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\nimport { LuArrowDown, LuArrowUp, LuArrowUpDown } from \"react-icons/lu\";\nimport { Table, TableHeader, TableBody, TableRow, TableHead, TableCell } from \"./table\";\nimport { Input } from \"./input\";\nimport { Spinner } from \"./spinner\";\n\nexport interface ColumnDef<T> {\n /** Property key on the data object. */\n key: keyof T & string;\n /** Column header label. */\n header: string;\n /** Enable sorting on this column. */\n sortable?: boolean;\n /** Custom cell renderer. Receives the row data object. */\n render?: (row: T) => React.ReactNode;\n /** Text alignment. */\n align?: \"left\" | \"center\" | \"right\";\n}\n\nexport interface DataTableProps<T> {\n /** Column definitions describing each table column. */\n columns: ColumnDef<T>[];\n /** Data rows to display. */\n data: T[];\n /** Show a search input above the table. */\n searchable?: boolean;\n /** Placeholder text for the search input. */\n searchPlaceholder?: string;\n /** Callback when a row is clicked. Receives the row data. */\n onRowClick?: (row: T) => void;\n /** Show a loading spinner instead of data. */\n loading?: boolean;\n /** Message shown when data is empty. */\n emptyMessage?: string;\n /** Additional toolbar content rendered between search and table. */\n toolbar?: React.ReactNode;\n /** Additional class name for the root container. */\n className?: string;\n /** Row key extractor. Defaults to the row index. */\n getRowId?: (row: T) => string;\n}\n\nfunction buildTanstackColumns<T>(columns: ColumnDef<T>[]): TanstackColumnDef<T, unknown>[] {\n return columns.map((col) => ({\n id: col.key,\n accessorKey: col.key,\n header: col.header,\n enableSorting: col.sortable ?? false,\n cell: col.render\n ? (info) => col.render!(info.row.original)\n : (info) => String(info.getValue() ?? \"\"),\n meta: { align: col.align },\n }));\n}\n\nconst alignClass = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n} as const;\n\n/**\n * Data-driven table with sorting and search. Wraps TanStack Table with\n * the augur-web Table primitives.\n *\n * @example\n * ```tsx\n * const columns: ColumnDef<Brand>[] = [\n * { key: \"brandsUid\", header: \"UID\", sortable: true },\n * { key: \"brandsName\", header: \"Name\", sortable: true },\n * { key: \"brandsDesc\", header: \"Description\" },\n * ];\n *\n * <DataTable columns={columns} data={brands} searchable onRowClick={selectBrand} />\n * ```\n */\nfunction DataTable<T>({\n columns,\n data,\n searchable = false,\n searchPlaceholder = \"Search...\",\n onRowClick,\n loading = false,\n emptyMessage = \"No results.\",\n toolbar,\n className,\n getRowId,\n}: DataTableProps<T>) {\n const [sorting, setSorting] = React.useState<SortingState>([]);\n const [globalFilter, setGlobalFilter] = React.useState(\"\");\n\n const tanstackColumns = React.useMemo(() => buildTanstackColumns(columns), [columns]);\n\n const table = useReactTable({\n data,\n columns: tanstackColumns,\n state: { sorting, globalFilter },\n onSortingChange: setSorting,\n onGlobalFilterChange: setGlobalFilter,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getRowId: getRowId ? (row) => getRowId(row) : undefined,\n });\n\n return (\n <div className={cn(\"space-y-4\", className)}>\n {(searchable || toolbar) && (\n <div className=\"flex items-center gap-4\">\n {searchable && (\n <Input\n placeholder={searchPlaceholder}\n value={globalFilter}\n onChange={(e) => setGlobalFilter(e.target.value)}\n className=\"max-w-sm\"\n />\n )}\n {toolbar}\n </div>\n )}\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => {\n const align =\n (header.column.columnDef.meta as { align?: string } | undefined)?.align ?? \"left\";\n return (\n <TableHead\n key={header.id}\n className={cn(\n alignClass[align as keyof typeof alignClass],\n header.column.getCanSort() && \"cursor-pointer select-none\",\n )}\n onClick={header.column.getToggleSortingHandler()}\n >\n <span className=\"inline-flex items-center gap-1\">\n {flexRender(header.column.columnDef.header, header.getContext())}\n {header.column.getCanSort() && (\n <SortIndicator direction={header.column.getIsSorted()} />\n )}\n </span>\n </TableHead>\n );\n })}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {loading ? (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center\">\n <Spinner size=\"lg\" className=\"mx-auto\" />\n </TableCell>\n </TableRow>\n ) : table.getRowModel().rows.length === 0 ? (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center\">\n {emptyMessage}\n </TableCell>\n </TableRow>\n ) : (\n table.getRowModel().rows.map((row) => (\n <TableRow\n key={row.id}\n className={cn(onRowClick && \"cursor-pointer\")}\n onClick={onRowClick ? () => onRowClick(row.original) : undefined}\n >\n {row.getVisibleCells().map((cell) => {\n const align =\n (cell.column.columnDef.meta as { align?: string } | undefined)?.align ?? \"left\";\n return (\n <TableCell\n key={cell.id}\n className={alignClass[align as keyof typeof alignClass]}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n );\n })}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n );\n}\nDataTable.displayName = \"DataTable\";\n\nfunction SortIndicator({ direction }: { direction: false | \"asc\" | \"desc\" }) {\n if (direction === \"asc\") return <LuArrowUp className=\"h-4 w-4\" />;\n if (direction === \"desc\") return <LuArrowDown className=\"h-4 w-4\" />;\n return <LuArrowUpDown className=\"text-muted-foreground/50 h-4 w-4\" />;\n}\n\nexport { DataTable };\n"],"mappings":"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","names":[]}
|