@simpleapps-com/augur-web 2.2.22 → 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/button.d.cts +1 -1
- package/dist/button.d.ts +1 -1
- 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/command.d.cts +7 -7
- package/dist/command.d.ts +7 -7
- 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,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":[]}
|
|
@@ -0,0 +1,142 @@
|
|
|
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
|
+
var _chunkWJUDOEVBcjs = require('./chunk-WJUDOEVB.cjs');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
var _chunkZ57QBVUCcjs = require('./chunk-Z57QBVUC.cjs');
|
|
9
|
+
require('./chunk-5ZITWMV4.cjs');
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var _chunk32XB3REYcjs = require('./chunk-32XB3REY.cjs');
|
|
13
|
+
require('./chunk-BXMTQGKV.cjs');
|
|
14
|
+
require('./chunk-76RSVRGB.cjs');
|
|
15
|
+
require('./chunk-7EXXNELX.cjs');
|
|
16
|
+
require('./chunk-MAENILZP.cjs');
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
var _chunk5VMEEKZ5cjs = require('./chunk-5VMEEKZ5.cjs');
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
var _chunkVL6L4GDAcjs = require('./chunk-VL6L4GDA.cjs');
|
|
23
|
+
|
|
24
|
+
// src/detail-panel.tsx
|
|
25
|
+
var _react = require('react'); var React = _interopRequireWildcard(_react);
|
|
26
|
+
var _web = require('@simpleapps-com/augur-utils/web');
|
|
27
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
28
|
+
function DetailPanel({
|
|
29
|
+
fields,
|
|
30
|
+
data,
|
|
31
|
+
onSave,
|
|
32
|
+
onCancel,
|
|
33
|
+
loading = false,
|
|
34
|
+
title,
|
|
35
|
+
className,
|
|
36
|
+
defaultEditing = false
|
|
37
|
+
}) {
|
|
38
|
+
const [editing, setEditing] = React.useState(defaultEditing);
|
|
39
|
+
const [draft, setDraft] = React.useState(data);
|
|
40
|
+
React.useEffect(() => {
|
|
41
|
+
setDraft(data);
|
|
42
|
+
}, [data]);
|
|
43
|
+
const handleEdit = () => {
|
|
44
|
+
setDraft(data);
|
|
45
|
+
setEditing(true);
|
|
46
|
+
};
|
|
47
|
+
const handleCancel = () => {
|
|
48
|
+
setDraft(data);
|
|
49
|
+
setEditing(false);
|
|
50
|
+
_optionalChain([onCancel, 'optionalCall', _ => _()]);
|
|
51
|
+
};
|
|
52
|
+
const handleSave = () => {
|
|
53
|
+
onSave(draft);
|
|
54
|
+
};
|
|
55
|
+
const updateField = (key, value) => {
|
|
56
|
+
setDraft((prev) => ({ ...prev, [key]: value }));
|
|
57
|
+
};
|
|
58
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _web.cn.call(void 0, "space-y-6", className), children: [
|
|
59
|
+
(title || !editing) && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center justify-between", children: [
|
|
60
|
+
title && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h3", { className: "text-lg font-semibold", children: title }),
|
|
61
|
+
!editing && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVL6L4GDAcjs.Button, { variant: "outline", size: "sm", onClick: handleEdit, children: "Edit" })
|
|
62
|
+
] }),
|
|
63
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "grid gap-4 sm:grid-cols-2", children: fields.map(
|
|
64
|
+
(field) => editing ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
65
|
+
EditField,
|
|
66
|
+
{
|
|
67
|
+
field,
|
|
68
|
+
value: draft[field.key],
|
|
69
|
+
onChange: updateField
|
|
70
|
+
},
|
|
71
|
+
field.key
|
|
72
|
+
) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ReadField, { field, value: data[field.key] }, field.key)
|
|
73
|
+
) }),
|
|
74
|
+
editing && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex gap-2", children: [
|
|
75
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkVL6L4GDAcjs.Button, { onClick: handleSave, disabled: loading, children: [
|
|
76
|
+
loading && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk5VMEEKZ5cjs.Spinner, { size: "sm", className: "mr-2" }),
|
|
77
|
+
"Save"
|
|
78
|
+
] }),
|
|
79
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVL6L4GDAcjs.Button, { variant: "outline", onClick: handleCancel, disabled: loading, children: "Cancel" })
|
|
80
|
+
] })
|
|
81
|
+
] });
|
|
82
|
+
}
|
|
83
|
+
DetailPanel.displayName = "DetailPanel";
|
|
84
|
+
function ReadField({ field, value }) {
|
|
85
|
+
const display = field.render ? field.render(value) : String(_nullishCoalesce(value, () => ( "")));
|
|
86
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "space-y-1", children: [
|
|
87
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-muted-foreground text-sm font-medium", children: field.label }),
|
|
88
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-sm", children: display })
|
|
89
|
+
] });
|
|
90
|
+
}
|
|
91
|
+
function EditField({
|
|
92
|
+
field,
|
|
93
|
+
value,
|
|
94
|
+
onChange
|
|
95
|
+
}) {
|
|
96
|
+
const strValue = String(_nullishCoalesce(value, () => ( "")));
|
|
97
|
+
if (field.type === "readonly") {
|
|
98
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "space-y-1", children: [
|
|
99
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-muted-foreground text-sm font-medium", children: field.label }),
|
|
100
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-sm", children: field.render ? field.render(value) : strValue })
|
|
101
|
+
] });
|
|
102
|
+
}
|
|
103
|
+
if (field.type === "select") {
|
|
104
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
105
|
+
_chunkWJUDOEVBcjs.FormSelect,
|
|
106
|
+
{
|
|
107
|
+
label: field.label,
|
|
108
|
+
name: field.key,
|
|
109
|
+
required: field.required,
|
|
110
|
+
options: _nullishCoalesce(field.options, () => ( [])),
|
|
111
|
+
value: strValue,
|
|
112
|
+
onValueChange: (v) => onChange(field.key, v)
|
|
113
|
+
}
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
if (field.type === "textarea") {
|
|
117
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
118
|
+
_chunkZ57QBVUCcjs.FormTextarea,
|
|
119
|
+
{
|
|
120
|
+
label: field.label,
|
|
121
|
+
name: field.key,
|
|
122
|
+
required: field.required,
|
|
123
|
+
value: strValue,
|
|
124
|
+
onChange: (e) => onChange(field.key, e.target.value)
|
|
125
|
+
}
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
129
|
+
_chunk32XB3REYcjs.FormInput,
|
|
130
|
+
{
|
|
131
|
+
label: field.label,
|
|
132
|
+
name: field.key,
|
|
133
|
+
required: field.required,
|
|
134
|
+
value: strValue,
|
|
135
|
+
onChange: (e) => onChange(field.key, e.target.value)
|
|
136
|
+
}
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
exports.DetailPanel = DetailPanel;
|
|
142
|
+
//# sourceMappingURL=detail-panel.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/detail-panel.cjs","../src/detail-panel.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/detail-panel.cjs","sourcesContent":[null,"/** Read/edit toggle panel for a single record. */\n\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\nimport { Button } from \"./button\";\nimport { FormInput } from \"./form-input\";\nimport { FormSelect } from \"./form-select\";\nimport { FormTextarea } from \"./form-textarea\";\nimport { Spinner } from \"./spinner\";\n\nexport interface FieldDef<T> {\n /** Property key on the data object. */\n key: keyof T & string;\n /** Display label. */\n label: string;\n /** Field type determines the input component used in edit mode. */\n type: \"text\" | \"textarea\" | \"select\" | \"readonly\";\n /** Options for select fields. */\n options?: { label: string; value: string }[];\n /** Mark the field as required in edit mode. */\n required?: boolean;\n /** Custom read-mode renderer. Receives the field value. */\n render?: (value: T[keyof T]) => React.ReactNode;\n}\n\nexport interface DetailPanelProps<T extends object> {\n /** Field definitions describing each field. */\n fields: FieldDef<T>[];\n /** The record to display/edit. */\n data: T;\n /** Called with the updated record when the user saves. */\n onSave: (data: T) => void;\n /** Called when the user cancels editing. */\n onCancel?: () => void;\n /** Whether a save operation is in progress. */\n loading?: boolean;\n /** Optional title displayed above the fields. */\n title?: string;\n /** Additional class name for the root container. */\n className?: string;\n /** Start in edit mode. */\n defaultEditing?: boolean;\n}\n\n/**\n * Read/edit toggle panel for a single record. Renders field values in read\n * mode, and form inputs in edit mode based on field definitions.\n *\n * @example\n * ```tsx\n * const fields: FieldDef<Brand>[] = [\n * { key: \"brandsName\", label: \"Name\", type: \"text\", required: true },\n * { key: \"brandsDesc\", label: \"Description\", type: \"textarea\" },\n * { key: \"brandsUid\", label: \"UID\", type: \"readonly\" },\n * ];\n *\n * <DetailPanel fields={fields} data={brand} onSave={handleSave} />\n * ```\n */\nfunction DetailPanel<T extends object>({\n fields,\n data,\n onSave,\n onCancel,\n loading = false,\n title,\n className,\n defaultEditing = false,\n}: DetailPanelProps<T>) {\n const [editing, setEditing] = React.useState(defaultEditing);\n const [draft, setDraft] = React.useState<T>(data);\n\n React.useEffect(() => {\n setDraft(data);\n }, [data]);\n\n const handleEdit = () => {\n setDraft(data);\n setEditing(true);\n };\n\n const handleCancel = () => {\n setDraft(data);\n setEditing(false);\n onCancel?.();\n };\n\n const handleSave = () => {\n onSave(draft);\n };\n\n const updateField = (key: keyof T & string, value: unknown) => {\n setDraft((prev) => ({ ...prev, [key]: value }));\n };\n\n return (\n <div className={cn(\"space-y-6\", className)}>\n {(title || !editing) && (\n <div className=\"flex items-center justify-between\">\n {title && <h3 className=\"text-lg font-semibold\">{title}</h3>}\n {!editing && (\n <Button variant=\"outline\" size=\"sm\" onClick={handleEdit}>\n Edit\n </Button>\n )}\n </div>\n )}\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {fields.map((field) =>\n editing ? (\n <EditField\n key={field.key}\n field={field}\n value={draft[field.key]}\n onChange={updateField}\n />\n ) : (\n <ReadField key={field.key} field={field} value={data[field.key]} />\n ),\n )}\n </div>\n {editing && (\n <div className=\"flex gap-2\">\n <Button onClick={handleSave} disabled={loading}>\n {loading && <Spinner size=\"sm\" className=\"mr-2\" />}\n Save\n </Button>\n <Button variant=\"outline\" onClick={handleCancel} disabled={loading}>\n Cancel\n </Button>\n </div>\n )}\n </div>\n );\n}\nDetailPanel.displayName = \"DetailPanel\";\n\nfunction ReadField<T>({ field, value }: { field: FieldDef<T>; value: T[keyof T] }) {\n const display = field.render ? field.render(value) : String(value ?? \"\");\n return (\n <div className=\"space-y-1\">\n <p className=\"text-muted-foreground text-sm font-medium\">{field.label}</p>\n <p className=\"text-sm\">{display}</p>\n </div>\n );\n}\n\nfunction EditField<T>({\n field,\n value,\n onChange,\n}: {\n field: FieldDef<T>;\n value: unknown;\n onChange: (key: keyof T & string, value: unknown) => void;\n}) {\n const strValue = String(value ?? \"\");\n\n if (field.type === \"readonly\") {\n return (\n <div className=\"space-y-1\">\n <p className=\"text-muted-foreground text-sm font-medium\">{field.label}</p>\n <p className=\"text-sm\">{field.render ? field.render(value as T[keyof T]) : strValue}</p>\n </div>\n );\n }\n\n if (field.type === \"select\") {\n return (\n <FormSelect\n label={field.label}\n name={field.key}\n required={field.required}\n options={field.options ?? []}\n value={strValue}\n onValueChange={(v) => onChange(field.key, v)}\n />\n );\n }\n\n if (field.type === \"textarea\") {\n return (\n <FormTextarea\n label={field.label}\n name={field.key}\n required={field.required}\n value={strValue}\n onChange={(e) => onChange(field.key, e.target.value)}\n />\n );\n }\n\n return (\n <FormInput\n label={field.label}\n name={field.key}\n required={field.required}\n value={strValue}\n onChange={(e) => onChange(field.key, e.target.value)}\n />\n );\n}\n\nexport { DetailPanel };\n"]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
|
|
4
|
+
interface FieldDef<T> {
|
|
5
|
+
/** Property key on the data object. */
|
|
6
|
+
key: keyof T & string;
|
|
7
|
+
/** Display label. */
|
|
8
|
+
label: string;
|
|
9
|
+
/** Field type determines the input component used in edit mode. */
|
|
10
|
+
type: "text" | "textarea" | "select" | "readonly";
|
|
11
|
+
/** Options for select fields. */
|
|
12
|
+
options?: {
|
|
13
|
+
label: string;
|
|
14
|
+
value: string;
|
|
15
|
+
}[];
|
|
16
|
+
/** Mark the field as required in edit mode. */
|
|
17
|
+
required?: boolean;
|
|
18
|
+
/** Custom read-mode renderer. Receives the field value. */
|
|
19
|
+
render?: (value: T[keyof T]) => React.ReactNode;
|
|
20
|
+
}
|
|
21
|
+
interface DetailPanelProps<T extends object> {
|
|
22
|
+
/** Field definitions describing each field. */
|
|
23
|
+
fields: FieldDef<T>[];
|
|
24
|
+
/** The record to display/edit. */
|
|
25
|
+
data: T;
|
|
26
|
+
/** Called with the updated record when the user saves. */
|
|
27
|
+
onSave: (data: T) => void;
|
|
28
|
+
/** Called when the user cancels editing. */
|
|
29
|
+
onCancel?: () => void;
|
|
30
|
+
/** Whether a save operation is in progress. */
|
|
31
|
+
loading?: boolean;
|
|
32
|
+
/** Optional title displayed above the fields. */
|
|
33
|
+
title?: string;
|
|
34
|
+
/** Additional class name for the root container. */
|
|
35
|
+
className?: string;
|
|
36
|
+
/** Start in edit mode. */
|
|
37
|
+
defaultEditing?: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Read/edit toggle panel for a single record. Renders field values in read
|
|
41
|
+
* mode, and form inputs in edit mode based on field definitions.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```tsx
|
|
45
|
+
* const fields: FieldDef<Brand>[] = [
|
|
46
|
+
* { key: "brandsName", label: "Name", type: "text", required: true },
|
|
47
|
+
* { key: "brandsDesc", label: "Description", type: "textarea" },
|
|
48
|
+
* { key: "brandsUid", label: "UID", type: "readonly" },
|
|
49
|
+
* ];
|
|
50
|
+
*
|
|
51
|
+
* <DetailPanel fields={fields} data={brand} onSave={handleSave} />
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
declare function DetailPanel<T extends object>({ fields, data, onSave, onCancel, loading, title, className, defaultEditing, }: DetailPanelProps<T>): react_jsx_runtime.JSX.Element;
|
|
55
|
+
declare namespace DetailPanel {
|
|
56
|
+
var displayName: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { DetailPanel, type DetailPanelProps, type FieldDef };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
|
|
4
|
+
interface FieldDef<T> {
|
|
5
|
+
/** Property key on the data object. */
|
|
6
|
+
key: keyof T & string;
|
|
7
|
+
/** Display label. */
|
|
8
|
+
label: string;
|
|
9
|
+
/** Field type determines the input component used in edit mode. */
|
|
10
|
+
type: "text" | "textarea" | "select" | "readonly";
|
|
11
|
+
/** Options for select fields. */
|
|
12
|
+
options?: {
|
|
13
|
+
label: string;
|
|
14
|
+
value: string;
|
|
15
|
+
}[];
|
|
16
|
+
/** Mark the field as required in edit mode. */
|
|
17
|
+
required?: boolean;
|
|
18
|
+
/** Custom read-mode renderer. Receives the field value. */
|
|
19
|
+
render?: (value: T[keyof T]) => React.ReactNode;
|
|
20
|
+
}
|
|
21
|
+
interface DetailPanelProps<T extends object> {
|
|
22
|
+
/** Field definitions describing each field. */
|
|
23
|
+
fields: FieldDef<T>[];
|
|
24
|
+
/** The record to display/edit. */
|
|
25
|
+
data: T;
|
|
26
|
+
/** Called with the updated record when the user saves. */
|
|
27
|
+
onSave: (data: T) => void;
|
|
28
|
+
/** Called when the user cancels editing. */
|
|
29
|
+
onCancel?: () => void;
|
|
30
|
+
/** Whether a save operation is in progress. */
|
|
31
|
+
loading?: boolean;
|
|
32
|
+
/** Optional title displayed above the fields. */
|
|
33
|
+
title?: string;
|
|
34
|
+
/** Additional class name for the root container. */
|
|
35
|
+
className?: string;
|
|
36
|
+
/** Start in edit mode. */
|
|
37
|
+
defaultEditing?: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Read/edit toggle panel for a single record. Renders field values in read
|
|
41
|
+
* mode, and form inputs in edit mode based on field definitions.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```tsx
|
|
45
|
+
* const fields: FieldDef<Brand>[] = [
|
|
46
|
+
* { key: "brandsName", label: "Name", type: "text", required: true },
|
|
47
|
+
* { key: "brandsDesc", label: "Description", type: "textarea" },
|
|
48
|
+
* { key: "brandsUid", label: "UID", type: "readonly" },
|
|
49
|
+
* ];
|
|
50
|
+
*
|
|
51
|
+
* <DetailPanel fields={fields} data={brand} onSave={handleSave} />
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
declare function DetailPanel<T extends object>({ fields, data, onSave, onCancel, loading, title, className, defaultEditing, }: DetailPanelProps<T>): react_jsx_runtime.JSX.Element;
|
|
55
|
+
declare namespace DetailPanel {
|
|
56
|
+
var displayName: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { DetailPanel, type DetailPanelProps, type FieldDef };
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use client";
|
|
3
|
+
import {
|
|
4
|
+
FormSelect
|
|
5
|
+
} from "./chunk-WFMP6TZN.js";
|
|
6
|
+
import {
|
|
7
|
+
FormTextarea
|
|
8
|
+
} from "./chunk-RGJT67PN.js";
|
|
9
|
+
import "./chunk-L3BT67EO.js";
|
|
10
|
+
import {
|
|
11
|
+
FormInput
|
|
12
|
+
} from "./chunk-UB7HYAAC.js";
|
|
13
|
+
import "./chunk-MXSQYVCK.js";
|
|
14
|
+
import "./chunk-RCUKSVMF.js";
|
|
15
|
+
import "./chunk-HXQF6XTL.js";
|
|
16
|
+
import "./chunk-VD3H4QZM.js";
|
|
17
|
+
import {
|
|
18
|
+
Spinner
|
|
19
|
+
} from "./chunk-UMNTUD2P.js";
|
|
20
|
+
import {
|
|
21
|
+
Button
|
|
22
|
+
} from "./chunk-QICSGVX3.js";
|
|
23
|
+
|
|
24
|
+
// src/detail-panel.tsx
|
|
25
|
+
import * as React from "react";
|
|
26
|
+
import { cn } from "@simpleapps-com/augur-utils/web";
|
|
27
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
28
|
+
function DetailPanel({
|
|
29
|
+
fields,
|
|
30
|
+
data,
|
|
31
|
+
onSave,
|
|
32
|
+
onCancel,
|
|
33
|
+
loading = false,
|
|
34
|
+
title,
|
|
35
|
+
className,
|
|
36
|
+
defaultEditing = false
|
|
37
|
+
}) {
|
|
38
|
+
const [editing, setEditing] = React.useState(defaultEditing);
|
|
39
|
+
const [draft, setDraft] = React.useState(data);
|
|
40
|
+
React.useEffect(() => {
|
|
41
|
+
setDraft(data);
|
|
42
|
+
}, [data]);
|
|
43
|
+
const handleEdit = () => {
|
|
44
|
+
setDraft(data);
|
|
45
|
+
setEditing(true);
|
|
46
|
+
};
|
|
47
|
+
const handleCancel = () => {
|
|
48
|
+
setDraft(data);
|
|
49
|
+
setEditing(false);
|
|
50
|
+
onCancel?.();
|
|
51
|
+
};
|
|
52
|
+
const handleSave = () => {
|
|
53
|
+
onSave(draft);
|
|
54
|
+
};
|
|
55
|
+
const updateField = (key, value) => {
|
|
56
|
+
setDraft((prev) => ({ ...prev, [key]: value }));
|
|
57
|
+
};
|
|
58
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("space-y-6", className), children: [
|
|
59
|
+
(title || !editing) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
60
|
+
title && /* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold", children: title }),
|
|
61
|
+
!editing && /* @__PURE__ */ jsx(Button, { variant: "outline", size: "sm", onClick: handleEdit, children: "Edit" })
|
|
62
|
+
] }),
|
|
63
|
+
/* @__PURE__ */ jsx("div", { className: "grid gap-4 sm:grid-cols-2", children: fields.map(
|
|
64
|
+
(field) => editing ? /* @__PURE__ */ jsx(
|
|
65
|
+
EditField,
|
|
66
|
+
{
|
|
67
|
+
field,
|
|
68
|
+
value: draft[field.key],
|
|
69
|
+
onChange: updateField
|
|
70
|
+
},
|
|
71
|
+
field.key
|
|
72
|
+
) : /* @__PURE__ */ jsx(ReadField, { field, value: data[field.key] }, field.key)
|
|
73
|
+
) }),
|
|
74
|
+
editing && /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
|
|
75
|
+
/* @__PURE__ */ jsxs(Button, { onClick: handleSave, disabled: loading, children: [
|
|
76
|
+
loading && /* @__PURE__ */ jsx(Spinner, { size: "sm", className: "mr-2" }),
|
|
77
|
+
"Save"
|
|
78
|
+
] }),
|
|
79
|
+
/* @__PURE__ */ jsx(Button, { variant: "outline", onClick: handleCancel, disabled: loading, children: "Cancel" })
|
|
80
|
+
] })
|
|
81
|
+
] });
|
|
82
|
+
}
|
|
83
|
+
DetailPanel.displayName = "DetailPanel";
|
|
84
|
+
function ReadField({ field, value }) {
|
|
85
|
+
const display = field.render ? field.render(value) : String(value ?? "");
|
|
86
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
87
|
+
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm font-medium", children: field.label }),
|
|
88
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm", children: display })
|
|
89
|
+
] });
|
|
90
|
+
}
|
|
91
|
+
function EditField({
|
|
92
|
+
field,
|
|
93
|
+
value,
|
|
94
|
+
onChange
|
|
95
|
+
}) {
|
|
96
|
+
const strValue = String(value ?? "");
|
|
97
|
+
if (field.type === "readonly") {
|
|
98
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
99
|
+
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm font-medium", children: field.label }),
|
|
100
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm", children: field.render ? field.render(value) : strValue })
|
|
101
|
+
] });
|
|
102
|
+
}
|
|
103
|
+
if (field.type === "select") {
|
|
104
|
+
return /* @__PURE__ */ jsx(
|
|
105
|
+
FormSelect,
|
|
106
|
+
{
|
|
107
|
+
label: field.label,
|
|
108
|
+
name: field.key,
|
|
109
|
+
required: field.required,
|
|
110
|
+
options: field.options ?? [],
|
|
111
|
+
value: strValue,
|
|
112
|
+
onValueChange: (v) => onChange(field.key, v)
|
|
113
|
+
}
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
if (field.type === "textarea") {
|
|
117
|
+
return /* @__PURE__ */ jsx(
|
|
118
|
+
FormTextarea,
|
|
119
|
+
{
|
|
120
|
+
label: field.label,
|
|
121
|
+
name: field.key,
|
|
122
|
+
required: field.required,
|
|
123
|
+
value: strValue,
|
|
124
|
+
onChange: (e) => onChange(field.key, e.target.value)
|
|
125
|
+
}
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
return /* @__PURE__ */ jsx(
|
|
129
|
+
FormInput,
|
|
130
|
+
{
|
|
131
|
+
label: field.label,
|
|
132
|
+
name: field.key,
|
|
133
|
+
required: field.required,
|
|
134
|
+
value: strValue,
|
|
135
|
+
onChange: (e) => onChange(field.key, e.target.value)
|
|
136
|
+
}
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
export {
|
|
140
|
+
DetailPanel
|
|
141
|
+
};
|
|
142
|
+
//# sourceMappingURL=detail-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/detail-panel.tsx"],"sourcesContent":["/** Read/edit toggle panel for a single record. */\n\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\nimport { Button } from \"./button\";\nimport { FormInput } from \"./form-input\";\nimport { FormSelect } from \"./form-select\";\nimport { FormTextarea } from \"./form-textarea\";\nimport { Spinner } from \"./spinner\";\n\nexport interface FieldDef<T> {\n /** Property key on the data object. */\n key: keyof T & string;\n /** Display label. */\n label: string;\n /** Field type determines the input component used in edit mode. */\n type: \"text\" | \"textarea\" | \"select\" | \"readonly\";\n /** Options for select fields. */\n options?: { label: string; value: string }[];\n /** Mark the field as required in edit mode. */\n required?: boolean;\n /** Custom read-mode renderer. Receives the field value. */\n render?: (value: T[keyof T]) => React.ReactNode;\n}\n\nexport interface DetailPanelProps<T extends object> {\n /** Field definitions describing each field. */\n fields: FieldDef<T>[];\n /** The record to display/edit. */\n data: T;\n /** Called with the updated record when the user saves. */\n onSave: (data: T) => void;\n /** Called when the user cancels editing. */\n onCancel?: () => void;\n /** Whether a save operation is in progress. */\n loading?: boolean;\n /** Optional title displayed above the fields. */\n title?: string;\n /** Additional class name for the root container. */\n className?: string;\n /** Start in edit mode. */\n defaultEditing?: boolean;\n}\n\n/**\n * Read/edit toggle panel for a single record. Renders field values in read\n * mode, and form inputs in edit mode based on field definitions.\n *\n * @example\n * ```tsx\n * const fields: FieldDef<Brand>[] = [\n * { key: \"brandsName\", label: \"Name\", type: \"text\", required: true },\n * { key: \"brandsDesc\", label: \"Description\", type: \"textarea\" },\n * { key: \"brandsUid\", label: \"UID\", type: \"readonly\" },\n * ];\n *\n * <DetailPanel fields={fields} data={brand} onSave={handleSave} />\n * ```\n */\nfunction DetailPanel<T extends object>({\n fields,\n data,\n onSave,\n onCancel,\n loading = false,\n title,\n className,\n defaultEditing = false,\n}: DetailPanelProps<T>) {\n const [editing, setEditing] = React.useState(defaultEditing);\n const [draft, setDraft] = React.useState<T>(data);\n\n React.useEffect(() => {\n setDraft(data);\n }, [data]);\n\n const handleEdit = () => {\n setDraft(data);\n setEditing(true);\n };\n\n const handleCancel = () => {\n setDraft(data);\n setEditing(false);\n onCancel?.();\n };\n\n const handleSave = () => {\n onSave(draft);\n };\n\n const updateField = (key: keyof T & string, value: unknown) => {\n setDraft((prev) => ({ ...prev, [key]: value }));\n };\n\n return (\n <div className={cn(\"space-y-6\", className)}>\n {(title || !editing) && (\n <div className=\"flex items-center justify-between\">\n {title && <h3 className=\"text-lg font-semibold\">{title}</h3>}\n {!editing && (\n <Button variant=\"outline\" size=\"sm\" onClick={handleEdit}>\n Edit\n </Button>\n )}\n </div>\n )}\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {fields.map((field) =>\n editing ? (\n <EditField\n key={field.key}\n field={field}\n value={draft[field.key]}\n onChange={updateField}\n />\n ) : (\n <ReadField key={field.key} field={field} value={data[field.key]} />\n ),\n )}\n </div>\n {editing && (\n <div className=\"flex gap-2\">\n <Button onClick={handleSave} disabled={loading}>\n {loading && <Spinner size=\"sm\" className=\"mr-2\" />}\n Save\n </Button>\n <Button variant=\"outline\" onClick={handleCancel} disabled={loading}>\n Cancel\n </Button>\n </div>\n )}\n </div>\n );\n}\nDetailPanel.displayName = \"DetailPanel\";\n\nfunction ReadField<T>({ field, value }: { field: FieldDef<T>; value: T[keyof T] }) {\n const display = field.render ? field.render(value) : String(value ?? \"\");\n return (\n <div className=\"space-y-1\">\n <p className=\"text-muted-foreground text-sm font-medium\">{field.label}</p>\n <p className=\"text-sm\">{display}</p>\n </div>\n );\n}\n\nfunction EditField<T>({\n field,\n value,\n onChange,\n}: {\n field: FieldDef<T>;\n value: unknown;\n onChange: (key: keyof T & string, value: unknown) => void;\n}) {\n const strValue = String(value ?? \"\");\n\n if (field.type === \"readonly\") {\n return (\n <div className=\"space-y-1\">\n <p className=\"text-muted-foreground text-sm font-medium\">{field.label}</p>\n <p className=\"text-sm\">{field.render ? field.render(value as T[keyof T]) : strValue}</p>\n </div>\n );\n }\n\n if (field.type === \"select\") {\n return (\n <FormSelect\n label={field.label}\n name={field.key}\n required={field.required}\n options={field.options ?? []}\n value={strValue}\n onValueChange={(v) => onChange(field.key, v)}\n />\n );\n }\n\n if (field.type === \"textarea\") {\n return (\n <FormTextarea\n label={field.label}\n name={field.key}\n required={field.required}\n value={strValue}\n onChange={(e) => onChange(field.key, e.target.value)}\n />\n );\n }\n\n return (\n <FormInput\n label={field.label}\n name={field.key}\n required={field.required}\n value={strValue}\n onChange={(e) => onChange(field.key, e.target.value)}\n />\n );\n}\n\nexport { DetailPanel };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAGA,YAAY,WAAW;AACvB,SAAS,UAAU;AA+FX,SACY,KADZ;AAvCR,SAAS,YAA8B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,GAAwB;AACtB,QAAM,CAAC,SAAS,UAAU,IAAU,eAAS,cAAc;AAC3D,QAAM,CAAC,OAAO,QAAQ,IAAU,eAAY,IAAI;AAEhD,EAAM,gBAAU,MAAM;AACpB,aAAS,IAAI;AAAA,EACf,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,aAAa,MAAM;AACvB,aAAS,IAAI;AACb,eAAW,IAAI;AAAA,EACjB;AAEA,QAAM,eAAe,MAAM;AACzB,aAAS,IAAI;AACb,eAAW,KAAK;AAChB,eAAW;AAAA,EACb;AAEA,QAAM,aAAa,MAAM;AACvB,WAAO,KAAK;AAAA,EACd;AAEA,QAAM,cAAc,CAAC,KAAuB,UAAmB;AAC7D,aAAS,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,EAAE;AAAA,EAChD;AAEA,SACE,qBAAC,SAAI,WAAW,GAAG,aAAa,SAAS,GACrC;AAAA,cAAS,CAAC,YACV,qBAAC,SAAI,WAAU,qCACZ;AAAA,eAAS,oBAAC,QAAG,WAAU,yBAAyB,iBAAM;AAAA,MACtD,CAAC,WACA,oBAAC,UAAO,SAAQ,WAAU,MAAK,MAAK,SAAS,YAAY,kBAEzD;AAAA,OAEJ;AAAA,IAEF,oBAAC,SAAI,WAAU,6BACZ,iBAAO;AAAA,MAAI,CAAC,UACX,UACE;AAAA,QAAC;AAAA;AAAA,UAEC;AAAA,UACA,OAAO,MAAM,MAAM,GAAG;AAAA,UACtB,UAAU;AAAA;AAAA,QAHL,MAAM;AAAA,MAIb,IAEA,oBAAC,aAA0B,OAAc,OAAO,KAAK,MAAM,GAAG,KAA9C,MAAM,GAA2C;AAAA,IAErE,GACF;AAAA,IACC,WACC,qBAAC,SAAI,WAAU,cACb;AAAA,2BAAC,UAAO,SAAS,YAAY,UAAU,SACpC;AAAA,mBAAW,oBAAC,WAAQ,MAAK,MAAK,WAAU,QAAO;AAAA,QAAG;AAAA,SAErD;AAAA,MACA,oBAAC,UAAO,SAAQ,WAAU,SAAS,cAAc,UAAU,SAAS,oBAEpE;AAAA,OACF;AAAA,KAEJ;AAEJ;AACA,YAAY,cAAc;AAE1B,SAAS,UAAa,EAAE,OAAO,MAAM,GAA8C;AACjF,QAAM,UAAU,MAAM,SAAS,MAAM,OAAO,KAAK,IAAI,OAAO,SAAS,EAAE;AACvE,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,wBAAC,OAAE,WAAU,6CAA6C,gBAAM,OAAM;AAAA,IACtE,oBAAC,OAAE,WAAU,WAAW,mBAAQ;AAAA,KAClC;AAEJ;AAEA,SAAS,UAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,WAAW,OAAO,SAAS,EAAE;AAEnC,MAAI,MAAM,SAAS,YAAY;AAC7B,WACE,qBAAC,SAAI,WAAU,aACb;AAAA,0BAAC,OAAE,WAAU,6CAA6C,gBAAM,OAAM;AAAA,MACtE,oBAAC,OAAE,WAAU,WAAW,gBAAM,SAAS,MAAM,OAAO,KAAmB,IAAI,UAAS;AAAA,OACtF;AAAA,EAEJ;AAEA,MAAI,MAAM,SAAS,UAAU;AAC3B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,MAAM;AAAA,QACb,MAAM,MAAM;AAAA,QACZ,UAAU,MAAM;AAAA,QAChB,SAAS,MAAM,WAAW,CAAC;AAAA,QAC3B,OAAO;AAAA,QACP,eAAe,CAAC,MAAM,SAAS,MAAM,KAAK,CAAC;AAAA;AAAA,IAC7C;AAAA,EAEJ;AAEA,MAAI,MAAM,SAAS,YAAY;AAC7B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,MAAM;AAAA,QACb,MAAM,MAAM;AAAA,QACZ,UAAU,MAAM;AAAA,QAChB,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,SAAS,MAAM,KAAK,EAAE,OAAO,KAAK;AAAA;AAAA,IACrD;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,MAAM;AAAA,MACb,MAAM,MAAM;AAAA,MACZ,UAAU,MAAM;AAAA,MAChB,OAAO;AAAA,MACP,UAAU,CAAC,MAAM,SAAS,MAAM,KAAK,EAAE,OAAO,KAAK;AAAA;AAAA,EACrD;AAEJ;","names":[]}
|
package/dist/form-input.cjs
CHANGED
|
@@ -1,35 +1,12 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
2
|
"use client";
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
var _chunk7EXXNELXcjs = require('./chunk-7EXXNELX.cjs');
|
|
5
|
+
var _chunk32XB3REYcjs = require('./chunk-32XB3REY.cjs');
|
|
6
|
+
require('./chunk-BXMTQGKV.cjs');
|
|
7
|
+
require('./chunk-7EXXNELX.cjs');
|
|
9
8
|
require('./chunk-MAENILZP.cjs');
|
|
10
9
|
|
|
11
|
-
// src/form-input.tsx
|
|
12
|
-
var _react = require('react'); var React = _interopRequireWildcard(_react);
|
|
13
|
-
var _web = require('@simpleapps-com/augur-utils/web');
|
|
14
|
-
var _jsxruntime = require('react/jsx-runtime');
|
|
15
|
-
var FormInput = React.forwardRef(
|
|
16
|
-
({ label, error, required, gridSpan, className, id, name, ...props }, ref) => {
|
|
17
|
-
const htmlFor = _nullishCoalesce(_nullishCoalesce(id, () => ( name)), () => ( ""));
|
|
18
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
19
|
-
_chunkBXMTQGKVcjs.FormField,
|
|
20
|
-
{
|
|
21
|
-
label,
|
|
22
|
-
htmlFor,
|
|
23
|
-
required,
|
|
24
|
-
error,
|
|
25
|
-
className: _web.cn.call(void 0, gridSpan, className),
|
|
26
|
-
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk7EXXNELXcjs.Input, { ref, id: htmlFor, name, ...props })
|
|
27
|
-
}
|
|
28
|
-
);
|
|
29
|
-
}
|
|
30
|
-
);
|
|
31
|
-
FormInput.displayName = "FormInput";
|
|
32
|
-
|
|
33
10
|
|
|
34
|
-
exports.FormInput = FormInput;
|
|
11
|
+
exports.FormInput = _chunk32XB3REYcjs.FormInput;
|
|
35
12
|
//# sourceMappingURL=form-input.cjs.map
|