@apipass/design-system 5.8.0 → 5.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/lib/embedded-styles.js +2 -2
  2. package/dist/lib/lib.index.cjs +1 -1
  3. package/dist/lib/lib.index.js +670 -669
  4. package/dist/lib/lib.index.js.map +1 -1
  5. package/dist/lib/style.css +1 -1
  6. package/dist/lib/ui/components/DataTable/DataTable.cjs +1 -1
  7. package/dist/lib/ui/components/DataTable/DataTable.cjs.map +1 -1
  8. package/dist/lib/ui/components/DataTable/DataTable.js +3 -184
  9. package/dist/lib/ui/components/DataTable/DataTable.js.map +1 -1
  10. package/dist/lib/ui/primitives/Accordion/Accordion.cjs +1 -1
  11. package/dist/lib/ui/primitives/Accordion/Accordion.cjs.map +1 -1
  12. package/dist/lib/ui/primitives/Accordion/Accordion.js +26 -20
  13. package/dist/lib/ui/primitives/Accordion/Accordion.js.map +1 -1
  14. package/dist/lib/ui/primitives/Table/DataDrivenTable.cjs +2 -0
  15. package/dist/lib/ui/primitives/Table/DataDrivenTable.cjs.map +1 -0
  16. package/dist/lib/ui/primitives/Table/DataDrivenTable.js +196 -0
  17. package/dist/lib/ui/primitives/Table/DataDrivenTable.js.map +1 -0
  18. package/dist/lib/ui/primitives/Table/Table.cjs +1 -1
  19. package/dist/lib/ui/primitives/Table/Table.cjs.map +1 -1
  20. package/dist/lib/ui/primitives/Table/Table.js +12 -123
  21. package/dist/lib/ui/primitives/Table/Table.js.map +1 -1
  22. package/dist/lib/ui/primitives/Table/TableBase.cjs +2 -0
  23. package/dist/lib/ui/primitives/Table/TableBase.cjs.map +1 -0
  24. package/dist/lib/ui/primitives/Table/TableBase.js +127 -0
  25. package/dist/lib/ui/primitives/Table/TableBase.js.map +1 -0
  26. package/dist/types/ui/components/DataTable/DataTable.d.ts +11 -66
  27. package/dist/types/ui/primitives/Accordion/Accordion.d.ts +4 -1
  28. package/dist/types/ui/primitives/Table/DataDrivenTable.d.ts +68 -0
  29. package/dist/types/ui/primitives/Table/Table.d.ts +22 -32
  30. package/dist/types/ui/primitives/Table/TableBase.d.ts +35 -0
  31. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),h=require("react");;/* empty css */const ee=require("../../primitives/Search/Search.cjs"),t=require("../../primitives/Table/Table.cjs"),ae=require("../../icons/IconChevronDown.cjs"),se=require("../../icons/IconChevronRight.cjs"),te=require("../../primitives/Pagination/Pagination.cjs"),le=require("../../primitives/PermissionGate/PermissionGate.cjs"),ne=require("../../layout/Flex/Flex.cjs");function re({action:n,item:c}){const o=n.isAllowed!==!1,d=e.jsx("button",{className:"data-table-row-action-btn","aria-label":n.label,disabled:!o,onClick:o?()=>n.onPress(c):void 0,children:n.icon});return o?d:e.jsx(le.PermissionGate,{isAllowed:!1,noAccessLabel:n.noAccessLabel??"",children:d})}function k({columns:n,data:c,actions:o,rowActions:d,rowActionsLabel:L="",selectable:S=!1,selectionType:T="checkbox",selectedKeys:D,onSelectionChange:I,searchPlaceholder:E="Search...",searchKeys:g=[],isLoading:B=!1,loadingMessage:v="Loading...",emptyMessage:F="No records found",previousLabel:G="Previous",nextLabel:H="Next",pageSize:b=10,nestedColumns:P,getNestedData:M,nestedLoadingMessage:$="Loading...",nestedEmptyMessage:O="No records found",nestedSearchKeys:Q,nestedSearchPlaceholder:z,nestedActions:j,nestedPageSize:J}){const[p,U]=h.useState(""),[V,q]=h.useState(1),[W,X]=h.useState(new Set),[y,w]=h.useState(new Map),f=!!M&&!!P,m=!!d;function Y(a){const s=a.id;X(r=>{const i=new Set(r);if(i.has(s))i.delete(s);else if(i.add(s),!y.has(s)){const l=M(a);l instanceof Promise?(w(u=>new Map(u).set(s,{status:"loading",data:[]})),l.then(u=>{w(K=>new Map(K).set(s,{status:"loaded",data:u}))})):w(u=>new Map(u).set(s,{status:"loaded",data:l}))}return i})}const x=g.length>0,Z=x||!!o,C=h.useMemo(()=>{if(!p.trim()||!x)return c;const a=p.toLowerCase();return c.filter(s=>g.some(r=>String(s[r]??"").toLowerCase().includes(a)))},[c,p,g,x]),R=Math.max(1,Math.ceil(C.length/b)),N=Math.min(V,R),_=C.slice((N-1)*b,N*b);function A(a,s){return s.render?s.render(a):String(a[s.key]??"")}return e.jsxs(ne.Flex,{direction:"column",gap:"300",className:"data-table",children:[Z&&e.jsxs("div",{className:"data-table-toolbar",children:[x&&e.jsx(ee.Search,{placeholder:E,onSearch:a=>{U(a),q(1)},className:"data-table-search"}),o&&e.jsx("div",{className:"data-table-actions",children:o})]}),B?e.jsx("div",{role:"status","aria-live":"polite","aria-label":v,className:"data-table-status",children:v}):C.length===0?e.jsx("div",{role:"status",className:"data-table-status data-table-empty",children:F}):e.jsxs(t.Table,{selectionMode:S?T==="radio"?"single":"multiple":"none",selectionType:T,selectedKeys:D,onSelectionChange:I,children:[e.jsxs(t.TableHead,{children:[f&&e.jsx(t.TableColumn,{className:"data-table-expand-col"}),n.map((a,s)=>e.jsx(t.TableColumn,{align:a.align,isRowHeader:s===0,children:a.label},String(a.key))),m&&e.jsx(t.TableColumn,{align:"right",className:"data-table-row-actions-col",children:L})]}),e.jsx(t.TableBody,{children:_.flatMap(a=>{const s=W.has(a.id),r=y.get(a.id),i=[e.jsxs(t.TableRow,{id:a.id,children:[f&&e.jsx(t.TableCell,{className:"data-table-expand-cell",children:e.jsx("button",{className:"data-table-expand-btn","aria-label":s?"Collapse row":"Expand row","aria-expanded":s,onClick:()=>Y(a),children:s?e.jsx(ae.IconChevronDown,{size:"16"}):e.jsx(se.IconChevronRight,{size:"16"})})}),n.map(l=>e.jsx(t.TableCell,{align:l.align,children:A(a,l)},String(l.key))),m&&e.jsx(t.TableCell,{align:"right",className:"data-table-row-actions-cell",children:e.jsx("div",{className:"data-table-row-actions",children:(typeof d=="function"?d(a):d).map(l=>e.jsx(re,{action:l,item:a},l.key))})})]},a.id)];return s&&i.push(e.jsx(t.TableRow,{id:`${a.id}-nested`,className:"data-table-nested-row",children:e.jsx(t.TableCell,{colSpan:n.length+(f?1:0)+(S?1:0)+(m?1:0),className:"data-table-nested-cell",children:e.jsx(k,{columns:P,data:(r==null?void 0:r.data)??[],isLoading:!r||r.status==="loading",loadingMessage:$,emptyMessage:O,searchKeys:Q,searchPlaceholder:z,actions:j==null?void 0:j(a),pageSize:J??b})})},`${a.id}-nested`)),i})})]}),e.jsx(te.Pagination,{page:N,totalPages:R,onPageChange:q,previousLabel:G,nextLabel:H})]})}exports.DataTable=k;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});;/* empty css */const e=require("../../primitives/Table/Table.cjs"),a=e.Table;exports.DataTable=a;
2
2
  //# sourceMappingURL=DataTable.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.cjs","sources":["../../../../../src/ui/components/DataTable/DataTable.tsx"],"sourcesContent":["import {\n Pagination,\n PermissionGate,\n Search,\n Table,\n TableBody,\n TableCell,\n TableColumn,\n TableHead,\n TableRow,\n} from \"primitives\";\nimport { Flex } from \"layout\";\nimport { IconChevronDown, IconChevronRight } from \"icons\";\nimport type { ReactNode } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport type { Selection } from \"react-aria-components\";\nimport \"./datatable.css\";\n\nexport interface Column<T> {\n key: keyof T | string;\n label: string;\n align?: \"start\" | \"center\" | \"right\";\n render?: (item: T) => ReactNode;\n}\n\nexport interface RowActionDef<T> {\n /** Unique key for this action. */\n key: string;\n /** aria-label for the button. */\n label: string;\n /** Icon element rendered inside the button. */\n icon: ReactNode;\n /** When false, button is disabled and a tooltip with `noAccessLabel` is shown. Default: true. */\n isAllowed?: boolean;\n /** Tooltip text shown when `isAllowed` is false. */\n noAccessLabel?: string;\n /** Called with the row item when the button is pressed. */\n onPress: (item: T) => void;\n}\n\nfunction RowActionButton<T>({\n action,\n item,\n}: {\n action: RowActionDef<T>;\n item: T;\n}) {\n const allowed = action.isAllowed !== false;\n const btn = (\n <button\n className=\"data-table-row-action-btn\"\n aria-label={action.label}\n disabled={!allowed}\n onClick={allowed ? () => action.onPress(item) : undefined}\n >\n {action.icon}\n </button>\n );\n if (allowed) return btn;\n return (\n <PermissionGate isAllowed={false} noAccessLabel={action.noAccessLabel ?? \"\"}>\n {btn}\n </PermissionGate>\n );\n}\n\n// O tipo da linha aninhada é independente de T (não há relação genérica entre linha pai e linhas\n// filhas), então \"any\" é usado deliberadamente como fronteira de erasure de tipo.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype NestedStatus = { status: \"loading\"; data: never[] } | { status: \"loaded\"; data: any[] };\n\nexport interface DataTableProps<T extends { id: string }> {\n columns: Column<T>[];\n data: T[];\n actions?: ReactNode;\n /** Per-row action buttons rendered in a dedicated last column. */\n rowActions?: RowActionDef<T>[] | ((item: T) => RowActionDef<T>[]);\n /** Label for the row actions column header. Defaults to empty string. */\n rowActionsLabel?: string;\n /**\n * When true, renders a selection column before the first data column — a per-row control on\n * every row (see `selectionType`), plus a \"select all\" checkbox in the header when\n * `selectionType` is \"checkbox\". Off by default.\n */\n selectable?: boolean;\n /**\n * Visual style of the built-in selection control. \"checkbox\" (default) allows selecting\n * multiple rows and shows a \"select all\" in the header. \"radio\" restricts selection to a\n * single row (no \"select all\" — there is nothing to select all *to* with one choice) and\n * renders a round control instead of a checkbox.\n */\n selectionType?: \"checkbox\" | \"radio\";\n /** Controlled selection state. Omit to let the table manage its own selection internally. */\n selectedKeys?: Selection;\n onSelectionChange?: (keys: Selection) => void;\n searchPlaceholder?: string;\n searchKeys?: (keyof T)[];\n isLoading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n previousLabel?: string;\n nextLabel?: string;\n pageSize?: number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n nestedColumns?: Column<any>[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n getNestedData?: (item: T) => any[] | Promise<any[]>;\n nestedLoadingMessage?: string;\n nestedEmptyMessage?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n nestedSearchKeys?: (keyof any)[];\n nestedSearchPlaceholder?: string;\n nestedActions?: (item: T) => ReactNode;\n nestedPageSize?: number;\n}\n\nexport function DataTable<T extends { id: string }>({\n columns,\n data,\n actions,\n rowActions,\n rowActionsLabel = \"\",\n selectable = false,\n selectionType = \"checkbox\",\n selectedKeys,\n onSelectionChange,\n searchPlaceholder = \"Search...\",\n searchKeys = [],\n isLoading = false,\n loadingMessage = \"Loading...\",\n emptyMessage = \"No records found\",\n previousLabel = \"Previous\",\n nextLabel = \"Next\",\n pageSize = 10,\n nestedColumns,\n getNestedData,\n nestedLoadingMessage = \"Loading...\",\n nestedEmptyMessage = \"No records found\",\n nestedSearchKeys,\n nestedSearchPlaceholder,\n nestedActions,\n nestedPageSize,\n}: DataTableProps<T>) {\n const [query, setQuery] = useState(\"\");\n const [page, setPage] = useState(1);\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n const [nestedCache, setNestedCache] = useState<Map<string, NestedStatus>>(new Map());\n\n const hasNested = !!getNestedData && !!nestedColumns;\n const hasRowActions = !!rowActions;\n\n function toggleRow(item: T) {\n const id = item.id;\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n if (!nestedCache.has(id)) {\n const result = getNestedData!(item);\n if (result instanceof Promise) {\n setNestedCache((c) => new Map(c).set(id, { status: \"loading\", data: [] }));\n result.then((rows) => {\n setNestedCache((c) => new Map(c).set(id, { status: \"loaded\", data: rows }));\n });\n } else {\n setNestedCache((c) => new Map(c).set(id, { status: \"loaded\", data: result }));\n }\n }\n }\n return next;\n });\n }\n\n const hasSearch = searchKeys.length > 0;\n const hasToolbar = hasSearch || !!actions;\n\n const filtered = useMemo(() => {\n if (!query.trim() || !hasSearch) return data;\n const lower = query.toLowerCase();\n return data.filter((item) =>\n searchKeys.some((k) =>\n String(item[k] ?? \"\")\n .toLowerCase()\n .includes(lower),\n ),\n );\n }, [data, query, searchKeys, hasSearch]);\n\n const totalPages = Math.max(1, Math.ceil(filtered.length / pageSize));\n const currentPage = Math.min(page, totalPages);\n const pageData = filtered.slice(\n (currentPage - 1) * pageSize,\n currentPage * pageSize,\n );\n\n function getCell(item: T, col: Column<T>): ReactNode {\n if (col.render) return col.render(item);\n return String((item as Record<string, unknown>)[col.key as string] ?? \"\");\n }\n\n return (\n <Flex direction=\"column\" gap=\"300\" className=\"data-table\">\n {hasToolbar && (\n <div className=\"data-table-toolbar\">\n {hasSearch && (\n <Search\n placeholder={searchPlaceholder}\n onSearch={(v) => {\n setQuery(v);\n setPage(1);\n }}\n className=\"data-table-search\"\n />\n )}\n {actions && <div className=\"data-table-actions\">{actions}</div>}\n </div>\n )}\n\n {isLoading ? (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={loadingMessage}\n className=\"data-table-status\"\n >\n {loadingMessage}\n </div>\n ) : filtered.length === 0 ? (\n <div role=\"status\" className=\"data-table-status data-table-empty\">\n {emptyMessage}\n </div>\n ) : (\n <Table\n selectionMode={selectable ? (selectionType === \"radio\" ? \"single\" : \"multiple\") : \"none\"}\n selectionType={selectionType}\n selectedKeys={selectedKeys}\n onSelectionChange={onSelectionChange}\n >\n <TableHead>\n {hasNested && <TableColumn className=\"data-table-expand-col\" />}\n {columns.map((col, idx) => (\n <TableColumn\n key={String(col.key)}\n align={col.align}\n isRowHeader={idx === 0}\n >\n {col.label}\n </TableColumn>\n ))}\n {hasRowActions && (\n <TableColumn align=\"right\" className=\"data-table-row-actions-col\">\n {rowActionsLabel}\n </TableColumn>\n )}\n </TableHead>\n <TableBody>\n {pageData.flatMap((item) => {\n const isExpanded = expanded.has(item.id);\n const cached = nestedCache.get(item.id);\n const rows: ReactNode[] = [\n <TableRow key={item.id} id={item.id}>\n {hasNested && (\n <TableCell className=\"data-table-expand-cell\">\n <button\n className=\"data-table-expand-btn\"\n aria-label={isExpanded ? \"Collapse row\" : \"Expand row\"}\n aria-expanded={isExpanded}\n onClick={() => toggleRow(item)}\n >\n {isExpanded ? (\n <IconChevronDown size=\"16\" />\n ) : (\n <IconChevronRight size=\"16\" />\n )}\n </button>\n </TableCell>\n )}\n {columns.map((col) => (\n <TableCell key={String(col.key)} align={col.align}>\n {getCell(item, col)}\n </TableCell>\n ))}\n {hasRowActions && (\n <TableCell align=\"right\" className=\"data-table-row-actions-cell\">\n <div className=\"data-table-row-actions\">\n {(typeof rowActions === \"function\"\n ? rowActions(item)\n : rowActions!\n ).map((action) => (\n <RowActionButton key={action.key} action={action} item={item} />\n ))}\n </div>\n </TableCell>\n )}\n </TableRow>,\n ];\n if (isExpanded) {\n rows.push(\n <TableRow key={`${item.id}-nested`} id={`${item.id}-nested`} className=\"data-table-nested-row\">\n <TableCell\n colSpan={\n columns.length +\n (hasNested ? 1 : 0) +\n (selectable ? 1 : 0) +\n (hasRowActions ? 1 : 0)\n }\n className=\"data-table-nested-cell\"\n >\n <DataTable\n columns={nestedColumns!}\n data={cached?.data ?? []}\n isLoading={!cached || cached.status === \"loading\"}\n loadingMessage={nestedLoadingMessage}\n emptyMessage={nestedEmptyMessage}\n searchKeys={nestedSearchKeys}\n searchPlaceholder={nestedSearchPlaceholder}\n actions={nestedActions?.(item)}\n pageSize={nestedPageSize ?? pageSize}\n />\n </TableCell>\n </TableRow>,\n );\n }\n return rows;\n })}\n </TableBody>\n </Table>\n )}\n\n <Pagination\n page={currentPage}\n totalPages={totalPages}\n onPageChange={setPage}\n previousLabel={previousLabel}\n nextLabel={nextLabel}\n />\n </Flex>\n );\n}\n"],"names":["RowActionButton","action","item","allowed","btn","jsx","PermissionGate","DataTable","columns","data","actions","rowActions","rowActionsLabel","selectable","selectionType","selectedKeys","onSelectionChange","searchPlaceholder","searchKeys","isLoading","loadingMessage","emptyMessage","previousLabel","nextLabel","pageSize","nestedColumns","getNestedData","nestedLoadingMessage","nestedEmptyMessage","nestedSearchKeys","nestedSearchPlaceholder","nestedActions","nestedPageSize","query","setQuery","useState","page","setPage","expanded","setExpanded","nestedCache","setNestedCache","hasNested","hasRowActions","toggleRow","id","prev","next","result","c","rows","hasSearch","hasToolbar","filtered","useMemo","lower","k","totalPages","currentPage","pageData","getCell","col","Flex","jsxs","Search","v","Table","TableHead","TableColumn","idx","TableBody","isExpanded","cached","TableRow","TableCell","IconChevronDown","IconChevronRight","Pagination"],"mappings":"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"}
1
+ {"version":3,"file":"DataTable.cjs","sources":["../../../../../src/ui/components/DataTable/DataTable.tsx"],"sourcesContent":["import { Table, type DataDrivenTableProps } from \"primitives\";\n// Estilos do modo data-driven do Table. Ficam importados aqui, e não no primitivo, para\n// manter a posição do bloco no style.css — mover o import muda a ordem da cascata. Ao\n// remover o DataTable, mover este import para o fim de primitives/index.ts.\nimport \"./datatable.css\";\n\n/**\n * @deprecated Use `Table` com `columns` e `data` — as props são idênticas. Mantido só\n * para a migração gradual dos consumidores; será removido quando nenhum repositório\n * importar mais o `DataTable`.\n */\nexport const DataTable = Table as <T extends { id: string }>(\n props: DataDrivenTableProps<T>,\n) => ReturnType<typeof Table>;\n\n/** @deprecated Use `DataDrivenTableProps`. */\nexport type DataTableProps<T extends { id: string }> = DataDrivenTableProps<T>;\n"],"names":["DataTable","Table"],"mappings":"mKAWaA,EAAYC,EAAAA"}
@@ -1,188 +1,7 @@
1
- import { jsxs as h, jsx as e } from "react/jsx-runtime";
2
- import { useState as u, useMemo as ta } from "react";
3
1
  /* empty css */
4
- import { Search as la } from "../../primitives/Search/Search.js";
5
- import { Table as na, TableHead as sa, TableColumn as P, TableBody as ra, TableRow as B, TableCell as g } from "../../primitives/Table/Table.js";
6
- import { IconChevronDown as oa } from "../../icons/IconChevronDown.js";
7
- import { IconChevronRight as da } from "../../icons/IconChevronRight.js";
8
- import { Pagination as ia } from "../../primitives/Pagination/Pagination.js";
9
- import { PermissionGate as ca } from "../../primitives/PermissionGate/PermissionGate.js";
10
- import { Flex as ha } from "../../layout/Flex/Flex.js";
11
- function ba({
12
- action: n,
13
- item: i
14
- }) {
15
- const r = n.isAllowed !== !1, o = /* @__PURE__ */ e(
16
- "button",
17
- {
18
- className: "data-table-row-action-btn",
19
- "aria-label": n.label,
20
- disabled: !r,
21
- onClick: r ? () => n.onPress(i) : void 0,
22
- children: n.icon
23
- }
24
- );
25
- return r ? o : /* @__PURE__ */ e(ca, { isAllowed: !1, noAccessLabel: n.noAccessLabel ?? "", children: o });
26
- }
27
- function pa({
28
- columns: n,
29
- data: i,
30
- actions: r,
31
- rowActions: o,
32
- rowActionsLabel: D = "",
33
- selectable: S = !1,
34
- selectionType: y = "checkbox",
35
- selectedKeys: H,
36
- onSelectionChange: I,
37
- searchPlaceholder: $ = "Search...",
38
- searchKeys: m = [],
39
- isLoading: q = !1,
40
- loadingMessage: k = "Loading...",
41
- emptyMessage: F = "No records found",
42
- previousLabel: G = "Previous",
43
- nextLabel: Q = "Next",
44
- pageSize: b = 10,
45
- nestedColumns: L,
46
- getNestedData: T,
47
- nestedLoadingMessage: z = "Loading...",
48
- nestedEmptyMessage: J = "No records found",
49
- nestedSearchKeys: O,
50
- nestedSearchPlaceholder: U,
51
- nestedActions: f,
52
- nestedPageSize: V
53
- }) {
54
- const [w, W] = u(""), [X, R] = u(1), [Y, Z] = u(/* @__PURE__ */ new Set()), [E, N] = u(/* @__PURE__ */ new Map()), x = !!T && !!L, C = !!o;
55
- function _(a) {
56
- const t = a.id;
57
- Z((s) => {
58
- const d = new Set(s);
59
- if (d.has(t))
60
- d.delete(t);
61
- else if (d.add(t), !E.has(t)) {
62
- const l = T(a);
63
- l instanceof Promise ? (N((c) => new Map(c).set(t, { status: "loading", data: [] })), l.then((c) => {
64
- N((ea) => new Map(ea).set(t, { status: "loaded", data: c }));
65
- })) : N((c) => new Map(c).set(t, { status: "loaded", data: l }));
66
- }
67
- return d;
68
- });
69
- }
70
- const p = m.length > 0, A = p || !!r, M = ta(() => {
71
- if (!w.trim() || !p) return i;
72
- const a = w.toLowerCase();
73
- return i.filter(
74
- (t) => m.some(
75
- (s) => String(t[s] ?? "").toLowerCase().includes(a)
76
- )
77
- );
78
- }, [i, w, m, p]), j = Math.max(1, Math.ceil(M.length / b)), v = Math.min(X, j), K = M.slice(
79
- (v - 1) * b,
80
- v * b
81
- );
82
- function aa(a, t) {
83
- return t.render ? t.render(a) : String(a[t.key] ?? "");
84
- }
85
- return /* @__PURE__ */ h(ha, { direction: "column", gap: "300", className: "data-table", children: [
86
- A && /* @__PURE__ */ h("div", { className: "data-table-toolbar", children: [
87
- p && /* @__PURE__ */ e(
88
- la,
89
- {
90
- placeholder: $,
91
- onSearch: (a) => {
92
- W(a), R(1);
93
- },
94
- className: "data-table-search"
95
- }
96
- ),
97
- r && /* @__PURE__ */ e("div", { className: "data-table-actions", children: r })
98
- ] }),
99
- q ? /* @__PURE__ */ e(
100
- "div",
101
- {
102
- role: "status",
103
- "aria-live": "polite",
104
- "aria-label": k,
105
- className: "data-table-status",
106
- children: k
107
- }
108
- ) : M.length === 0 ? /* @__PURE__ */ e("div", { role: "status", className: "data-table-status data-table-empty", children: F }) : /* @__PURE__ */ h(
109
- na,
110
- {
111
- selectionMode: S ? y === "radio" ? "single" : "multiple" : "none",
112
- selectionType: y,
113
- selectedKeys: H,
114
- onSelectionChange: I,
115
- children: [
116
- /* @__PURE__ */ h(sa, { children: [
117
- x && /* @__PURE__ */ e(P, { className: "data-table-expand-col" }),
118
- n.map((a, t) => /* @__PURE__ */ e(
119
- P,
120
- {
121
- align: a.align,
122
- isRowHeader: t === 0,
123
- children: a.label
124
- },
125
- String(a.key)
126
- )),
127
- C && /* @__PURE__ */ e(P, { align: "right", className: "data-table-row-actions-col", children: D })
128
- ] }),
129
- /* @__PURE__ */ e(ra, { children: K.flatMap((a) => {
130
- const t = Y.has(a.id), s = E.get(a.id), d = [
131
- /* @__PURE__ */ h(B, { id: a.id, children: [
132
- x && /* @__PURE__ */ e(g, { className: "data-table-expand-cell", children: /* @__PURE__ */ e(
133
- "button",
134
- {
135
- className: "data-table-expand-btn",
136
- "aria-label": t ? "Collapse row" : "Expand row",
137
- "aria-expanded": t,
138
- onClick: () => _(a),
139
- children: t ? /* @__PURE__ */ e(oa, { size: "16" }) : /* @__PURE__ */ e(da, { size: "16" })
140
- }
141
- ) }),
142
- n.map((l) => /* @__PURE__ */ e(g, { align: l.align, children: aa(a, l) }, String(l.key))),
143
- C && /* @__PURE__ */ e(g, { align: "right", className: "data-table-row-actions-cell", children: /* @__PURE__ */ e("div", { className: "data-table-row-actions", children: (typeof o == "function" ? o(a) : o).map((l) => /* @__PURE__ */ e(ba, { action: l, item: a }, l.key)) }) })
144
- ] }, a.id)
145
- ];
146
- return t && d.push(
147
- /* @__PURE__ */ e(B, { id: `${a.id}-nested`, className: "data-table-nested-row", children: /* @__PURE__ */ e(
148
- g,
149
- {
150
- colSpan: n.length + (x ? 1 : 0) + (S ? 1 : 0) + (C ? 1 : 0),
151
- className: "data-table-nested-cell",
152
- children: /* @__PURE__ */ e(
153
- pa,
154
- {
155
- columns: L,
156
- data: (s == null ? void 0 : s.data) ?? [],
157
- isLoading: !s || s.status === "loading",
158
- loadingMessage: z,
159
- emptyMessage: J,
160
- searchKeys: O,
161
- searchPlaceholder: U,
162
- actions: f == null ? void 0 : f(a),
163
- pageSize: V ?? b
164
- }
165
- )
166
- }
167
- ) }, `${a.id}-nested`)
168
- ), d;
169
- }) })
170
- ]
171
- }
172
- ),
173
- /* @__PURE__ */ e(
174
- ia,
175
- {
176
- page: v,
177
- totalPages: j,
178
- onPageChange: R,
179
- previousLabel: G,
180
- nextLabel: Q
181
- }
182
- )
183
- ] });
184
- }
2
+ import { Table as o } from "../../primitives/Table/Table.js";
3
+ const r = o;
185
4
  export {
186
- pa as DataTable
5
+ r as DataTable
187
6
  };
188
7
  //# sourceMappingURL=DataTable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.js","sources":["../../../../../src/ui/components/DataTable/DataTable.tsx"],"sourcesContent":["import {\n Pagination,\n PermissionGate,\n Search,\n Table,\n TableBody,\n TableCell,\n TableColumn,\n TableHead,\n TableRow,\n} from \"primitives\";\nimport { Flex } from \"layout\";\nimport { IconChevronDown, IconChevronRight } from \"icons\";\nimport type { ReactNode } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport type { Selection } from \"react-aria-components\";\nimport \"./datatable.css\";\n\nexport interface Column<T> {\n key: keyof T | string;\n label: string;\n align?: \"start\" | \"center\" | \"right\";\n render?: (item: T) => ReactNode;\n}\n\nexport interface RowActionDef<T> {\n /** Unique key for this action. */\n key: string;\n /** aria-label for the button. */\n label: string;\n /** Icon element rendered inside the button. */\n icon: ReactNode;\n /** When false, button is disabled and a tooltip with `noAccessLabel` is shown. Default: true. */\n isAllowed?: boolean;\n /** Tooltip text shown when `isAllowed` is false. */\n noAccessLabel?: string;\n /** Called with the row item when the button is pressed. */\n onPress: (item: T) => void;\n}\n\nfunction RowActionButton<T>({\n action,\n item,\n}: {\n action: RowActionDef<T>;\n item: T;\n}) {\n const allowed = action.isAllowed !== false;\n const btn = (\n <button\n className=\"data-table-row-action-btn\"\n aria-label={action.label}\n disabled={!allowed}\n onClick={allowed ? () => action.onPress(item) : undefined}\n >\n {action.icon}\n </button>\n );\n if (allowed) return btn;\n return (\n <PermissionGate isAllowed={false} noAccessLabel={action.noAccessLabel ?? \"\"}>\n {btn}\n </PermissionGate>\n );\n}\n\n// O tipo da linha aninhada é independente de T (não há relação genérica entre linha pai e linhas\n// filhas), então \"any\" é usado deliberadamente como fronteira de erasure de tipo.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype NestedStatus = { status: \"loading\"; data: never[] } | { status: \"loaded\"; data: any[] };\n\nexport interface DataTableProps<T extends { id: string }> {\n columns: Column<T>[];\n data: T[];\n actions?: ReactNode;\n /** Per-row action buttons rendered in a dedicated last column. */\n rowActions?: RowActionDef<T>[] | ((item: T) => RowActionDef<T>[]);\n /** Label for the row actions column header. Defaults to empty string. */\n rowActionsLabel?: string;\n /**\n * When true, renders a selection column before the first data column — a per-row control on\n * every row (see `selectionType`), plus a \"select all\" checkbox in the header when\n * `selectionType` is \"checkbox\". Off by default.\n */\n selectable?: boolean;\n /**\n * Visual style of the built-in selection control. \"checkbox\" (default) allows selecting\n * multiple rows and shows a \"select all\" in the header. \"radio\" restricts selection to a\n * single row (no \"select all\" — there is nothing to select all *to* with one choice) and\n * renders a round control instead of a checkbox.\n */\n selectionType?: \"checkbox\" | \"radio\";\n /** Controlled selection state. Omit to let the table manage its own selection internally. */\n selectedKeys?: Selection;\n onSelectionChange?: (keys: Selection) => void;\n searchPlaceholder?: string;\n searchKeys?: (keyof T)[];\n isLoading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n previousLabel?: string;\n nextLabel?: string;\n pageSize?: number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n nestedColumns?: Column<any>[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n getNestedData?: (item: T) => any[] | Promise<any[]>;\n nestedLoadingMessage?: string;\n nestedEmptyMessage?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n nestedSearchKeys?: (keyof any)[];\n nestedSearchPlaceholder?: string;\n nestedActions?: (item: T) => ReactNode;\n nestedPageSize?: number;\n}\n\nexport function DataTable<T extends { id: string }>({\n columns,\n data,\n actions,\n rowActions,\n rowActionsLabel = \"\",\n selectable = false,\n selectionType = \"checkbox\",\n selectedKeys,\n onSelectionChange,\n searchPlaceholder = \"Search...\",\n searchKeys = [],\n isLoading = false,\n loadingMessage = \"Loading...\",\n emptyMessage = \"No records found\",\n previousLabel = \"Previous\",\n nextLabel = \"Next\",\n pageSize = 10,\n nestedColumns,\n getNestedData,\n nestedLoadingMessage = \"Loading...\",\n nestedEmptyMessage = \"No records found\",\n nestedSearchKeys,\n nestedSearchPlaceholder,\n nestedActions,\n nestedPageSize,\n}: DataTableProps<T>) {\n const [query, setQuery] = useState(\"\");\n const [page, setPage] = useState(1);\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n const [nestedCache, setNestedCache] = useState<Map<string, NestedStatus>>(new Map());\n\n const hasNested = !!getNestedData && !!nestedColumns;\n const hasRowActions = !!rowActions;\n\n function toggleRow(item: T) {\n const id = item.id;\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n if (!nestedCache.has(id)) {\n const result = getNestedData!(item);\n if (result instanceof Promise) {\n setNestedCache((c) => new Map(c).set(id, { status: \"loading\", data: [] }));\n result.then((rows) => {\n setNestedCache((c) => new Map(c).set(id, { status: \"loaded\", data: rows }));\n });\n } else {\n setNestedCache((c) => new Map(c).set(id, { status: \"loaded\", data: result }));\n }\n }\n }\n return next;\n });\n }\n\n const hasSearch = searchKeys.length > 0;\n const hasToolbar = hasSearch || !!actions;\n\n const filtered = useMemo(() => {\n if (!query.trim() || !hasSearch) return data;\n const lower = query.toLowerCase();\n return data.filter((item) =>\n searchKeys.some((k) =>\n String(item[k] ?? \"\")\n .toLowerCase()\n .includes(lower),\n ),\n );\n }, [data, query, searchKeys, hasSearch]);\n\n const totalPages = Math.max(1, Math.ceil(filtered.length / pageSize));\n const currentPage = Math.min(page, totalPages);\n const pageData = filtered.slice(\n (currentPage - 1) * pageSize,\n currentPage * pageSize,\n );\n\n function getCell(item: T, col: Column<T>): ReactNode {\n if (col.render) return col.render(item);\n return String((item as Record<string, unknown>)[col.key as string] ?? \"\");\n }\n\n return (\n <Flex direction=\"column\" gap=\"300\" className=\"data-table\">\n {hasToolbar && (\n <div className=\"data-table-toolbar\">\n {hasSearch && (\n <Search\n placeholder={searchPlaceholder}\n onSearch={(v) => {\n setQuery(v);\n setPage(1);\n }}\n className=\"data-table-search\"\n />\n )}\n {actions && <div className=\"data-table-actions\">{actions}</div>}\n </div>\n )}\n\n {isLoading ? (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={loadingMessage}\n className=\"data-table-status\"\n >\n {loadingMessage}\n </div>\n ) : filtered.length === 0 ? (\n <div role=\"status\" className=\"data-table-status data-table-empty\">\n {emptyMessage}\n </div>\n ) : (\n <Table\n selectionMode={selectable ? (selectionType === \"radio\" ? \"single\" : \"multiple\") : \"none\"}\n selectionType={selectionType}\n selectedKeys={selectedKeys}\n onSelectionChange={onSelectionChange}\n >\n <TableHead>\n {hasNested && <TableColumn className=\"data-table-expand-col\" />}\n {columns.map((col, idx) => (\n <TableColumn\n key={String(col.key)}\n align={col.align}\n isRowHeader={idx === 0}\n >\n {col.label}\n </TableColumn>\n ))}\n {hasRowActions && (\n <TableColumn align=\"right\" className=\"data-table-row-actions-col\">\n {rowActionsLabel}\n </TableColumn>\n )}\n </TableHead>\n <TableBody>\n {pageData.flatMap((item) => {\n const isExpanded = expanded.has(item.id);\n const cached = nestedCache.get(item.id);\n const rows: ReactNode[] = [\n <TableRow key={item.id} id={item.id}>\n {hasNested && (\n <TableCell className=\"data-table-expand-cell\">\n <button\n className=\"data-table-expand-btn\"\n aria-label={isExpanded ? \"Collapse row\" : \"Expand row\"}\n aria-expanded={isExpanded}\n onClick={() => toggleRow(item)}\n >\n {isExpanded ? (\n <IconChevronDown size=\"16\" />\n ) : (\n <IconChevronRight size=\"16\" />\n )}\n </button>\n </TableCell>\n )}\n {columns.map((col) => (\n <TableCell key={String(col.key)} align={col.align}>\n {getCell(item, col)}\n </TableCell>\n ))}\n {hasRowActions && (\n <TableCell align=\"right\" className=\"data-table-row-actions-cell\">\n <div className=\"data-table-row-actions\">\n {(typeof rowActions === \"function\"\n ? rowActions(item)\n : rowActions!\n ).map((action) => (\n <RowActionButton key={action.key} action={action} item={item} />\n ))}\n </div>\n </TableCell>\n )}\n </TableRow>,\n ];\n if (isExpanded) {\n rows.push(\n <TableRow key={`${item.id}-nested`} id={`${item.id}-nested`} className=\"data-table-nested-row\">\n <TableCell\n colSpan={\n columns.length +\n (hasNested ? 1 : 0) +\n (selectable ? 1 : 0) +\n (hasRowActions ? 1 : 0)\n }\n className=\"data-table-nested-cell\"\n >\n <DataTable\n columns={nestedColumns!}\n data={cached?.data ?? []}\n isLoading={!cached || cached.status === \"loading\"}\n loadingMessage={nestedLoadingMessage}\n emptyMessage={nestedEmptyMessage}\n searchKeys={nestedSearchKeys}\n searchPlaceholder={nestedSearchPlaceholder}\n actions={nestedActions?.(item)}\n pageSize={nestedPageSize ?? pageSize}\n />\n </TableCell>\n </TableRow>,\n );\n }\n return rows;\n })}\n </TableBody>\n </Table>\n )}\n\n <Pagination\n page={currentPage}\n totalPages={totalPages}\n onPageChange={setPage}\n previousLabel={previousLabel}\n nextLabel={nextLabel}\n />\n </Flex>\n );\n}\n"],"names":["RowActionButton","action","item","allowed","btn","jsx","PermissionGate","DataTable","columns","data","actions","rowActions","rowActionsLabel","selectable","selectionType","selectedKeys","onSelectionChange","searchPlaceholder","searchKeys","isLoading","loadingMessage","emptyMessage","previousLabel","nextLabel","pageSize","nestedColumns","getNestedData","nestedLoadingMessage","nestedEmptyMessage","nestedSearchKeys","nestedSearchPlaceholder","nestedActions","nestedPageSize","query","setQuery","useState","page","setPage","expanded","setExpanded","nestedCache","setNestedCache","hasNested","hasRowActions","toggleRow","id","prev","next","result","rows","c","hasSearch","hasToolbar","filtered","useMemo","lower","k","totalPages","currentPage","pageData","getCell","col","Flex","jsxs","Search","v","Table","TableHead","TableColumn","idx","TableBody","isExpanded","cached","TableRow","TableCell","IconChevronDown","IconChevronRight","Pagination"],"mappings":"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"}
1
+ {"version":3,"file":"DataTable.js","sources":["../../../../../src/ui/components/DataTable/DataTable.tsx"],"sourcesContent":["import { Table, type DataDrivenTableProps } from \"primitives\";\n// Estilos do modo data-driven do Table. Ficam importados aqui, e não no primitivo, para\n// manter a posição do bloco no style.css — mover o import muda a ordem da cascata. Ao\n// remover o DataTable, mover este import para o fim de primitives/index.ts.\nimport \"./datatable.css\";\n\n/**\n * @deprecated Use `Table` com `columns` e `data` — as props são idênticas. Mantido só\n * para a migração gradual dos consumidores; será removido quando nenhum repositório\n * importar mais o `DataTable`.\n */\nexport const DataTable = Table as <T extends { id: string }>(\n props: DataDrivenTableProps<T>,\n) => ReturnType<typeof Table>;\n\n/** @deprecated Use `DataDrivenTableProps`. */\nexport type DataTableProps<T extends { id: string }> = DataDrivenTableProps<T>;\n"],"names":["DataTable","Table"],"mappings":";;AAWO,MAAMA,IAAYC;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),r=require("../../../vendor/clsx/dist/clsx.cjs"),c=require("react-aria-components");;/* empty css */const l=require("../../icons/IconChevronDown.cjs");function d({className:s,...i}){const o=r.clsx(s,"sds-accordion");return e.jsx(c.DisclosureGroup,{className:o,...i})}function m({className:s,title:i,isExpanded:o,isDisabled:u,children:n,...t}){const a=r.clsx(s,"accordion-item");return e.jsxs(c.Disclosure,{className:a,...t,children:[e.jsx(c.Heading,{className:"accordion-item-title",children:e.jsxs(c.Button,{slot:"trigger",children:[i,e.jsx("span",{role:"img","aria-hidden":"true","aria-label":"accordion item indicator",className:"accordion-item-indicator",children:e.jsx(l.IconChevronDown,{size:"20"})})]})}),e.jsx(c.DisclosurePanel,{className:"accordion-item-content",children:e.jsx(e.Fragment,{children:n})})]})}exports.Accordion=d;exports.AccordionItem=m;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),r=require("../../../vendor/clsx/dist/clsx.cjs"),s=require("react-aria-components");;/* empty css */const d=require("../../icons/IconChevronDown.cjs");function m({className:i,...n}){const c=r.clsx(i,"sds-accordion");return e.jsx(s.DisclosureGroup,{className:c,...n})}function u({className:i,title:n,subtitle:c,badge:o,isExpanded:x,isDisabled:j,children:a,...t}){const l=r.clsx(i,"accordion-item");return e.jsxs(s.Disclosure,{className:l,...t,children:[e.jsx(s.Heading,{className:"accordion-item-title",children:e.jsxs(s.Button,{slot:"trigger",children:[e.jsxs("span",{className:"accordion-item-titles",children:[e.jsx("span",{className:"accordion-item-title-text",children:n}),c&&e.jsx("span",{className:"accordion-item-subtitle",children:c})]}),o&&e.jsx("span",{className:"accordion-item-badge",children:o}),e.jsx("span",{role:"img","aria-hidden":"true","aria-label":"accordion item indicator",className:"accordion-item-indicator",children:e.jsx(d.IconChevronDown,{size:"20"})})]})}),e.jsx(s.DisclosurePanel,{className:"accordion-item-content",children:e.jsx(e.Fragment,{children:a})})]})}exports.Accordion=m;exports.AccordionItem=u;
2
2
  //# sourceMappingURL=Accordion.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Accordion.cjs","sources":["../../../../../src/ui/primitives/Accordion/Accordion.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { IconChevronDown } from \"icons\";\nimport {\n Button,\n Disclosure,\n DisclosureGroup,\n DisclosurePanel,\n Heading,\n type DisclosureGroupProps,\n type DisclosureProps,\n} from \"react-aria-components\";\nimport \"./accordion.css\";\n\nexport type AccordionProps = DisclosureGroupProps;\nexport function Accordion({ className, ...props }: AccordionProps) {\n const classNames = clsx(className, \"sds-accordion\");\n return <DisclosureGroup className={classNames} {...props} />;\n}\n\nexport type AccordionItemProps = DisclosureProps & { title: string };\nexport function AccordionItem({\n className,\n title,\n isExpanded,\n isDisabled,\n children,\n ...props\n}: AccordionItemProps) {\n const classNames = clsx(className, \"accordion-item\");\n return (\n <Disclosure className={classNames} {...props}>\n <Heading className=\"accordion-item-title\">\n <Button slot=\"trigger\">\n {title}\n <span\n role=\"img\"\n aria-hidden=\"true\"\n aria-label=\"accordion item indicator\"\n className=\"accordion-item-indicator\"\n >\n <IconChevronDown size=\"20\" />\n </span>\n </Button>\n </Heading>\n <DisclosurePanel className=\"accordion-item-content\">\n <>{children}</>\n </DisclosurePanel>\n </Disclosure>\n );\n}\n"],"names":["Accordion","className","props","classNames","clsx","jsx","DisclosureGroup","AccordionItem","title","isExpanded","isDisabled","children","jsxs","Disclosure","Heading","Button","IconChevronDown","DisclosurePanel","Fragment"],"mappings":"0RAcO,SAASA,EAAU,CAAE,UAAAC,EAAW,GAAGC,GAAyB,CACjE,MAAMC,EAAaC,EAAAA,KAAKH,EAAW,eAAe,EAClD,OAAOI,EAAAA,IAACC,EAAAA,gBAAA,CAAgB,UAAWH,EAAa,GAAGD,EAAO,CAC5D,CAGO,SAASK,EAAc,CAC5B,UAAAN,EACA,MAAAO,EACA,WAAAC,EACA,WAAAC,EACA,SAAAC,EACA,GAAGT,CACL,EAAuB,CACrB,MAAMC,EAAaC,EAAAA,KAAKH,EAAW,gBAAgB,EACnD,OACEW,EAAAA,KAACC,EAAAA,WAAA,CAAW,UAAWV,EAAa,GAAGD,EACrC,SAAA,CAAAG,EAAAA,IAACS,EAAAA,SAAQ,UAAU,uBACjB,SAAAF,EAAAA,KAACG,SAAA,CAAO,KAAK,UACV,SAAA,CAAAP,EACDH,EAAAA,IAAC,OAAA,CACC,KAAK,MACL,cAAY,OACZ,aAAW,2BACX,UAAU,2BAEV,SAAAA,EAAAA,IAACW,EAAAA,gBAAA,CAAgB,KAAK,IAAA,CAAK,CAAA,CAAA,CAC7B,CAAA,CACF,CAAA,CACF,QACCC,EAAAA,gBAAA,CAAgB,UAAU,yBACzB,SAAAZ,EAAAA,IAAAa,EAAAA,SAAA,CAAG,SAAAP,EAAS,CAAA,CACd,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"Accordion.cjs","sources":["../../../../../src/ui/primitives/Accordion/Accordion.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { IconChevronDown } from \"icons\";\nimport type { ReactNode } from \"react\";\nimport {\n Button,\n Disclosure,\n DisclosureGroup,\n DisclosurePanel,\n Heading,\n type DisclosureGroupProps,\n type DisclosureProps,\n} from \"react-aria-components\";\nimport \"./accordion.css\";\n\nexport type AccordionProps = DisclosureGroupProps;\nexport function Accordion({ className, ...props }: AccordionProps) {\n const classNames = clsx(className, \"sds-accordion\");\n return <DisclosureGroup className={classNames} {...props} />;\n}\n\nexport type AccordionItemProps = DisclosureProps & {\n title: string;\n subtitle?: ReactNode;\n badge?: ReactNode;\n};\nexport function AccordionItem({\n className,\n title,\n subtitle,\n badge,\n isExpanded,\n isDisabled,\n children,\n ...props\n}: AccordionItemProps) {\n const classNames = clsx(className, \"accordion-item\");\n return (\n <Disclosure className={classNames} {...props}>\n <Heading className=\"accordion-item-title\">\n <Button slot=\"trigger\">\n <span className=\"accordion-item-titles\">\n <span className=\"accordion-item-title-text\">{title}</span>\n {subtitle && (\n <span className=\"accordion-item-subtitle\">{subtitle}</span>\n )}\n </span>\n {badge && <span className=\"accordion-item-badge\">{badge}</span>}\n <span\n role=\"img\"\n aria-hidden=\"true\"\n aria-label=\"accordion item indicator\"\n className=\"accordion-item-indicator\"\n >\n <IconChevronDown size=\"20\" />\n </span>\n </Button>\n </Heading>\n <DisclosurePanel className=\"accordion-item-content\">\n <>{children}</>\n </DisclosurePanel>\n </Disclosure>\n );\n}\n"],"names":["Accordion","className","props","classNames","clsx","jsx","DisclosureGroup","AccordionItem","title","subtitle","badge","isExpanded","isDisabled","children","jsxs","Disclosure","Heading","Button","IconChevronDown","DisclosurePanel","Fragment"],"mappings":"0RAeO,SAASA,EAAU,CAAE,UAAAC,EAAW,GAAGC,GAAyB,CACjE,MAAMC,EAAaC,EAAAA,KAAKH,EAAW,eAAe,EAClD,OAAOI,EAAAA,IAACC,EAAAA,gBAAA,CAAgB,UAAWH,EAAa,GAAGD,EAAO,CAC5D,CAOO,SAASK,EAAc,CAC5B,UAAAN,EACA,MAAAO,EACA,SAAAC,EACA,MAAAC,EACA,WAAAC,EACA,WAAAC,EACA,SAAAC,EACA,GAAGX,CACL,EAAuB,CACrB,MAAMC,EAAaC,EAAAA,KAAKH,EAAW,gBAAgB,EACnD,OACEa,EAAAA,KAACC,EAAAA,WAAA,CAAW,UAAWZ,EAAa,GAAGD,EACrC,SAAA,CAAAG,EAAAA,IAACW,EAAAA,SAAQ,UAAU,uBACjB,SAAAF,EAAAA,KAACG,SAAA,CAAO,KAAK,UACX,SAAA,CAAAH,EAAAA,KAAC,OAAA,CAAK,UAAU,wBACd,SAAA,CAAAT,EAAAA,IAAC,OAAA,CAAK,UAAU,4BAA6B,SAAAG,EAAM,EAClDC,GACCJ,EAAAA,IAAC,OAAA,CAAK,UAAU,0BAA2B,SAAAI,CAAA,CAAS,CAAA,EAExD,EACCC,GAASL,EAAAA,IAAC,OAAA,CAAK,UAAU,uBAAwB,SAAAK,EAAM,EACxDL,EAAAA,IAAC,OAAA,CACC,KAAK,MACL,cAAY,OACZ,aAAW,2BACX,UAAU,2BAEV,SAAAA,EAAAA,IAACa,EAAAA,gBAAA,CAAgB,KAAK,IAAA,CAAK,CAAA,CAAA,CAC7B,CAAA,CACF,CAAA,CACF,QACCC,EAAAA,gBAAA,CAAgB,UAAU,yBACzB,SAAAd,EAAAA,IAAAe,EAAAA,SAAA,CAAG,SAAAP,EAAS,CAAA,CACd,CAAA,EACF,CAEJ"}
@@ -1,24 +1,30 @@
1
- import { jsx as i, jsxs as e, Fragment as m } from "react/jsx-runtime";
1
+ import { jsx as i, jsxs as a, Fragment as m } from "react/jsx-runtime";
2
2
  import { clsx as s } from "../../../vendor/clsx/dist/clsx.js";
3
- import { DisclosureGroup as l, Disclosure as d, Heading as u, Button as p, DisclosurePanel as h } from "react-aria-components";
3
+ import { DisclosureGroup as d, Disclosure as p, Heading as h, Button as N, DisclosurePanel as u } from "react-aria-components";
4
4
  /* empty css */
5
- import { IconChevronDown as N } from "../../icons/IconChevronDown.js";
6
- function A({ className: o, ...r }) {
7
- const c = s(o, "sds-accordion");
8
- return /* @__PURE__ */ i(l, { className: c, ...r });
5
+ import { IconChevronDown as f } from "../../icons/IconChevronDown.js";
6
+ function v({ className: e, ...o }) {
7
+ const c = s(e, "sds-accordion");
8
+ return /* @__PURE__ */ i(d, { className: c, ...o });
9
9
  }
10
- function I({
11
- className: o,
12
- title: r,
13
- isExpanded: c,
14
- isDisabled: f,
10
+ function w({
11
+ className: e,
12
+ title: o,
13
+ subtitle: c,
14
+ badge: r,
15
+ isExpanded: x,
16
+ isDisabled: g,
15
17
  children: n,
16
- ...a
18
+ ...t
17
19
  }) {
18
- const t = s(o, "accordion-item");
19
- return /* @__PURE__ */ e(d, { className: t, ...a, children: [
20
- /* @__PURE__ */ i(u, { className: "accordion-item-title", children: /* @__PURE__ */ e(p, { slot: "trigger", children: [
21
- r,
20
+ const l = s(e, "accordion-item");
21
+ return /* @__PURE__ */ a(p, { className: l, ...t, children: [
22
+ /* @__PURE__ */ i(h, { className: "accordion-item-title", children: /* @__PURE__ */ a(N, { slot: "trigger", children: [
23
+ /* @__PURE__ */ a("span", { className: "accordion-item-titles", children: [
24
+ /* @__PURE__ */ i("span", { className: "accordion-item-title-text", children: o }),
25
+ c && /* @__PURE__ */ i("span", { className: "accordion-item-subtitle", children: c })
26
+ ] }),
27
+ r && /* @__PURE__ */ i("span", { className: "accordion-item-badge", children: r }),
22
28
  /* @__PURE__ */ i(
23
29
  "span",
24
30
  {
@@ -26,15 +32,15 @@ function I({
26
32
  "aria-hidden": "true",
27
33
  "aria-label": "accordion item indicator",
28
34
  className: "accordion-item-indicator",
29
- children: /* @__PURE__ */ i(N, { size: "20" })
35
+ children: /* @__PURE__ */ i(f, { size: "20" })
30
36
  }
31
37
  )
32
38
  ] }) }),
33
- /* @__PURE__ */ i(h, { className: "accordion-item-content", children: /* @__PURE__ */ i(m, { children: n }) })
39
+ /* @__PURE__ */ i(u, { className: "accordion-item-content", children: /* @__PURE__ */ i(m, { children: n }) })
34
40
  ] });
35
41
  }
36
42
  export {
37
- A as Accordion,
38
- I as AccordionItem
43
+ v as Accordion,
44
+ w as AccordionItem
39
45
  };
40
46
  //# sourceMappingURL=Accordion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Accordion.js","sources":["../../../../../src/ui/primitives/Accordion/Accordion.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { IconChevronDown } from \"icons\";\nimport {\n Button,\n Disclosure,\n DisclosureGroup,\n DisclosurePanel,\n Heading,\n type DisclosureGroupProps,\n type DisclosureProps,\n} from \"react-aria-components\";\nimport \"./accordion.css\";\n\nexport type AccordionProps = DisclosureGroupProps;\nexport function Accordion({ className, ...props }: AccordionProps) {\n const classNames = clsx(className, \"sds-accordion\");\n return <DisclosureGroup className={classNames} {...props} />;\n}\n\nexport type AccordionItemProps = DisclosureProps & { title: string };\nexport function AccordionItem({\n className,\n title,\n isExpanded,\n isDisabled,\n children,\n ...props\n}: AccordionItemProps) {\n const classNames = clsx(className, \"accordion-item\");\n return (\n <Disclosure className={classNames} {...props}>\n <Heading className=\"accordion-item-title\">\n <Button slot=\"trigger\">\n {title}\n <span\n role=\"img\"\n aria-hidden=\"true\"\n aria-label=\"accordion item indicator\"\n className=\"accordion-item-indicator\"\n >\n <IconChevronDown size=\"20\" />\n </span>\n </Button>\n </Heading>\n <DisclosurePanel className=\"accordion-item-content\">\n <>{children}</>\n </DisclosurePanel>\n </Disclosure>\n );\n}\n"],"names":["Accordion","className","props","classNames","clsx","jsx","DisclosureGroup","AccordionItem","title","isExpanded","isDisabled","children","jsxs","Disclosure","Heading","Button","IconChevronDown","DisclosurePanel","Fragment"],"mappings":";;;;;AAcO,SAASA,EAAU,EAAE,WAAAC,GAAW,GAAGC,KAAyB;AACjE,QAAMC,IAAaC,EAAKH,GAAW,eAAe;AAClD,SAAO,gBAAAI,EAACC,GAAA,EAAgB,WAAWH,GAAa,GAAGD,GAAO;AAC5D;AAGO,SAASK,EAAc;AAAA,EAC5B,WAAAN;AAAA,EACA,OAAAO;AAAA,EACA,YAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA,GAAGT;AACL,GAAuB;AACrB,QAAMC,IAAaC,EAAKH,GAAW,gBAAgB;AACnD,SACE,gBAAAW,EAACC,GAAA,EAAW,WAAWV,GAAa,GAAGD,GACrC,UAAA;AAAA,IAAA,gBAAAG,EAACS,KAAQ,WAAU,wBACjB,UAAA,gBAAAF,EAACG,GAAA,EAAO,MAAK,WACV,UAAA;AAAA,MAAAP;AAAA,MACD,gBAAAH;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,eAAY;AAAA,UACZ,cAAW;AAAA,UACX,WAAU;AAAA,UAEV,UAAA,gBAAAA,EAACW,GAAA,EAAgB,MAAK,KAAA,CAAK;AAAA,QAAA;AAAA,MAAA;AAAA,IAC7B,EAAA,CACF,EAAA,CACF;AAAA,sBACCC,GAAA,EAAgB,WAAU,0BACzB,UAAA,gBAAAZ,EAAAa,GAAA,EAAG,UAAAP,GAAS,EAAA,CACd;AAAA,EAAA,GACF;AAEJ;"}
1
+ {"version":3,"file":"Accordion.js","sources":["../../../../../src/ui/primitives/Accordion/Accordion.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { IconChevronDown } from \"icons\";\nimport type { ReactNode } from \"react\";\nimport {\n Button,\n Disclosure,\n DisclosureGroup,\n DisclosurePanel,\n Heading,\n type DisclosureGroupProps,\n type DisclosureProps,\n} from \"react-aria-components\";\nimport \"./accordion.css\";\n\nexport type AccordionProps = DisclosureGroupProps;\nexport function Accordion({ className, ...props }: AccordionProps) {\n const classNames = clsx(className, \"sds-accordion\");\n return <DisclosureGroup className={classNames} {...props} />;\n}\n\nexport type AccordionItemProps = DisclosureProps & {\n title: string;\n subtitle?: ReactNode;\n badge?: ReactNode;\n};\nexport function AccordionItem({\n className,\n title,\n subtitle,\n badge,\n isExpanded,\n isDisabled,\n children,\n ...props\n}: AccordionItemProps) {\n const classNames = clsx(className, \"accordion-item\");\n return (\n <Disclosure className={classNames} {...props}>\n <Heading className=\"accordion-item-title\">\n <Button slot=\"trigger\">\n <span className=\"accordion-item-titles\">\n <span className=\"accordion-item-title-text\">{title}</span>\n {subtitle && (\n <span className=\"accordion-item-subtitle\">{subtitle}</span>\n )}\n </span>\n {badge && <span className=\"accordion-item-badge\">{badge}</span>}\n <span\n role=\"img\"\n aria-hidden=\"true\"\n aria-label=\"accordion item indicator\"\n className=\"accordion-item-indicator\"\n >\n <IconChevronDown size=\"20\" />\n </span>\n </Button>\n </Heading>\n <DisclosurePanel className=\"accordion-item-content\">\n <>{children}</>\n </DisclosurePanel>\n </Disclosure>\n );\n}\n"],"names":["Accordion","className","props","classNames","clsx","jsx","DisclosureGroup","AccordionItem","title","subtitle","badge","isExpanded","isDisabled","children","jsxs","Disclosure","Heading","Button","IconChevronDown","DisclosurePanel","Fragment"],"mappings":";;;;;AAeO,SAASA,EAAU,EAAE,WAAAC,GAAW,GAAGC,KAAyB;AACjE,QAAMC,IAAaC,EAAKH,GAAW,eAAe;AAClD,SAAO,gBAAAI,EAACC,GAAA,EAAgB,WAAWH,GAAa,GAAGD,GAAO;AAC5D;AAOO,SAASK,EAAc;AAAA,EAC5B,WAAAN;AAAA,EACA,OAAAO;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,YAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA,GAAGX;AACL,GAAuB;AACrB,QAAMC,IAAaC,EAAKH,GAAW,gBAAgB;AACnD,SACE,gBAAAa,EAACC,GAAA,EAAW,WAAWZ,GAAa,GAAGD,GACrC,UAAA;AAAA,IAAA,gBAAAG,EAACW,KAAQ,WAAU,wBACjB,UAAA,gBAAAF,EAACG,GAAA,EAAO,MAAK,WACX,UAAA;AAAA,MAAA,gBAAAH,EAAC,QAAA,EAAK,WAAU,yBACd,UAAA;AAAA,QAAA,gBAAAT,EAAC,QAAA,EAAK,WAAU,6BAA6B,UAAAG,GAAM;AAAA,QAClDC,KACC,gBAAAJ,EAAC,QAAA,EAAK,WAAU,2BAA2B,UAAAI,EAAA,CAAS;AAAA,MAAA,GAExD;AAAA,MACCC,KAAS,gBAAAL,EAAC,QAAA,EAAK,WAAU,wBAAwB,UAAAK,GAAM;AAAA,MACxD,gBAAAL;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,eAAY;AAAA,UACZ,cAAW;AAAA,UACX,WAAU;AAAA,UAEV,UAAA,gBAAAA,EAACa,GAAA,EAAgB,MAAK,KAAA,CAAK;AAAA,QAAA;AAAA,MAAA;AAAA,IAC7B,EAAA,CACF,EAAA,CACF;AAAA,sBACCC,GAAA,EAAgB,WAAU,0BACzB,UAAA,gBAAAd,EAAAe,GAAA,EAAG,UAAAP,GAAS,EAAA,CACd;AAAA,EAAA,GACF;AAEJ;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),u=require("react"),l=require("./TableBase.cjs"),ee=require("../../layout/Flex/Flex.cjs"),ae=require("../Search/Search.cjs"),se=require("../../icons/IconChevronDown.cjs"),te=require("../../icons/IconChevronRight.cjs"),ne=require("../Pagination/Pagination.cjs"),le=require("../PermissionGate/PermissionGate.cjs");function re({action:o,item:c}){const d=o.isAllowed!==!1,i=a.jsx("button",{type:"button",className:"data-table-row-action-btn","aria-label":o.label,disabled:!d,onClick:d?()=>o.onPress(c):void 0,children:o.icon});return d?i:a.jsx(le.PermissionGate,{isAllowed:!1,noAccessLabel:o.noAccessLabel??"",children:i})}function D({columns:o,data:c,actions:d,rowActions:i,rowActionsLabel:E="",selectable:S=!1,selectionType:T="checkbox",selectedKeys:B,onSelectionChange:I,searchPlaceholder:F="Search...",searchKeys:p=[],isLoading:G=!1,loadingMessage:v="Loading...",emptyMessage:H="No records found",previousLabel:$="Previous",nextLabel:O="Next",pageSize:h=10,nestedColumns:M,getNestedData:P,nestedLoadingMessage:Q="Loading...",nestedEmptyMessage:z="No records found",nestedSearchKeys:J,nestedSearchPlaceholder:U,nestedActions:j,nestedPageSize:V}){const[w,W]=u.useState(""),[X,y]=u.useState(1),[R,Y]=u.useState(new Set),[q,b]=u.useState(new Map),f=!!P&&!!M,m=!!i;function k(e,s){Y(n=>{const r=new Set(n);return s?r.add(e):r.delete(e),r})}function Z(e){const s=e.id,n=!R.has(s);if(k(s,n),!n||q.has(s))return;const r=P(e);r instanceof Promise?(b(t=>new Map(t).set(s,{status:"loading",data:[]})),r.then(t=>{b(g=>new Map(g).set(s,{status:"loaded",data:t}))},()=>{b(t=>{const g=new Map(t);return g.delete(s),g}),k(s,!1)})):b(t=>new Map(t).set(s,{status:"loaded",data:r}))}const x=p.length>0,_=x||!!d,C=u.useMemo(()=>{if(!w.trim()||!x)return c;const e=w.toLowerCase();return c.filter(s=>p.some(n=>String(s[n]??"").toLowerCase().includes(e)))},[c,w,p,x]),L=Math.max(1,Math.ceil(C.length/h)),N=Math.min(X,L),A=C.slice((N-1)*h,N*h);function K(e,s){return s.render?s.render(e):String(e[s.key]??"")}return a.jsxs(ee.Flex,{direction:"column",gap:"300",className:"data-table",children:[_&&a.jsxs("div",{className:"data-table-toolbar",children:[x&&a.jsx(ae.Search,{placeholder:F,onSearch:e=>{W(e),y(1)},className:"data-table-search"}),d&&a.jsx("div",{className:"data-table-actions",children:d})]}),G?a.jsx("div",{role:"status","aria-live":"polite","aria-label":v,className:"data-table-status",children:v}):C.length===0?a.jsx("div",{role:"status",className:"data-table-status data-table-empty",children:H}):a.jsxs(l.TableBase,{selectionMode:S?T==="radio"?"single":"multiple":"none",selectionType:T,selectedKeys:B,onSelectionChange:I,children:[a.jsxs(l.TableHead,{children:[f&&a.jsx(l.TableColumn,{className:"data-table-expand-col"}),o.map((e,s)=>a.jsx(l.TableColumn,{align:e.align,isRowHeader:s===0,children:e.label},String(e.key))),m&&a.jsx(l.TableColumn,{align:"right",className:"data-table-row-actions-col",children:E})]}),a.jsx(l.TableBody,{children:A.flatMap(e=>{const s=R.has(e.id),n=q.get(e.id),r=[a.jsxs(l.TableRow,{id:e.id,children:[f&&a.jsx(l.TableCell,{className:"data-table-expand-cell",children:a.jsx("button",{type:"button",className:"data-table-expand-btn","aria-label":s?"Collapse row":"Expand row","aria-expanded":s,onClick:()=>Z(e),children:s?a.jsx(se.IconChevronDown,{size:"16"}):a.jsx(te.IconChevronRight,{size:"16"})})}),o.map(t=>a.jsx(l.TableCell,{align:t.align,children:K(e,t)},String(t.key))),m&&a.jsx(l.TableCell,{align:"right",className:"data-table-row-actions-cell",children:a.jsx("div",{className:"data-table-row-actions",children:(typeof i=="function"?i(e):i).map(t=>a.jsx(re,{action:t,item:e},t.key))})})]},e.id)];return s&&r.push(a.jsx(l.TableRow,{id:`${e.id}-nested`,className:"data-table-nested-row",children:a.jsx(l.TableCell,{colSpan:o.length+(f?1:0)+(S?1:0)+(m?1:0),className:"data-table-nested-cell",children:a.jsx(D,{columns:M,data:(n==null?void 0:n.data)??[],isLoading:!n||n.status==="loading",loadingMessage:Q,emptyMessage:z,searchKeys:J,searchPlaceholder:U,actions:j==null?void 0:j(e),pageSize:V??h})})},`${e.id}-nested`)),r})})]}),a.jsx(ne.Pagination,{page:N,totalPages:L,onPageChange:y,previousLabel:$,nextLabel:O})]})}exports.DataDrivenTable=D;
2
+ //# sourceMappingURL=DataDrivenTable.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataDrivenTable.cjs","sources":["../../../../../src/ui/primitives/Table/DataDrivenTable.tsx"],"sourcesContent":["import { Pagination, PermissionGate, Search } from \"primitives\";\nimport { Flex } from \"layout\";\nimport { IconChevronDown, IconChevronRight } from \"icons\";\nimport type { ReactNode } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport type { Selection } from \"react-aria-components\";\nimport {\n TableBase,\n TableBody,\n TableCell,\n TableColumn,\n TableHead,\n TableRow,\n} from \"./TableBase\";\n\nexport interface Column<T> {\n key: keyof T | string;\n label: string;\n align?: \"start\" | \"center\" | \"right\";\n render?: (item: T) => ReactNode;\n}\n\nexport interface RowActionDef<T> {\n /** Unique key for this action. */\n key: string;\n /** aria-label for the button. */\n label: string;\n /** Icon element rendered inside the button. */\n icon: ReactNode;\n /** When false, button is disabled and a tooltip with `noAccessLabel` is shown. Default: true. */\n isAllowed?: boolean;\n /** Tooltip text shown when `isAllowed` is false. */\n noAccessLabel?: string;\n /** Called with the row item when the button is pressed. */\n onPress: (item: T) => void;\n}\n\nfunction RowActionButton<T>({\n action,\n item,\n}: {\n action: RowActionDef<T>;\n item: T;\n}) {\n const allowed = action.isAllowed !== false;\n const btn = (\n <button\n type=\"button\"\n className=\"data-table-row-action-btn\"\n aria-label={action.label}\n disabled={!allowed}\n onClick={allowed ? () => action.onPress(item) : undefined}\n >\n {action.icon}\n </button>\n );\n if (allowed) return btn;\n return (\n <PermissionGate isAllowed={false} noAccessLabel={action.noAccessLabel ?? \"\"}>\n {btn}\n </PermissionGate>\n );\n}\n\n// O tipo da linha aninhada é independente de T (não há relação genérica entre linha pai e linhas\n// filhas), então \"any\" é usado deliberadamente como fronteira de erasure de tipo.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype NestedStatus = { status: \"loading\"; data: never[] } | { status: \"loaded\"; data: any[] };\n\nexport interface DataDrivenTableProps<T extends { id: string }> {\n columns: Column<T>[];\n data: T[];\n actions?: ReactNode;\n /** Per-row action buttons rendered in a dedicated last column. */\n rowActions?: RowActionDef<T>[] | ((item: T) => RowActionDef<T>[]);\n /** Label for the row actions column header. Defaults to empty string. */\n rowActionsLabel?: string;\n /**\n * When true, renders a selection column before the first data column — a per-row control on\n * every row (see `selectionType`), plus a \"select all\" checkbox in the header when\n * `selectionType` is \"checkbox\". Off by default.\n */\n selectable?: boolean;\n /**\n * Visual style of the built-in selection control. \"checkbox\" (default) allows selecting\n * multiple rows and shows a \"select all\" in the header. \"radio\" restricts selection to a\n * single row (no \"select all\" — there is nothing to select all *to* with one choice) and\n * renders a round control instead of a checkbox.\n */\n selectionType?: \"checkbox\" | \"radio\";\n /** Controlled selection state. Omit to let the table manage its own selection internally. */\n selectedKeys?: Selection;\n onSelectionChange?: (keys: Selection) => void;\n searchPlaceholder?: string;\n searchKeys?: (keyof T)[];\n isLoading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n previousLabel?: string;\n nextLabel?: string;\n pageSize?: number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n nestedColumns?: Column<any>[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n getNestedData?: (item: T) => any[] | Promise<any[]>;\n nestedLoadingMessage?: string;\n nestedEmptyMessage?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linha aninhada é de tipo independente de T\n nestedSearchKeys?: (keyof any)[];\n nestedSearchPlaceholder?: string;\n nestedActions?: (item: T) => ReactNode;\n nestedPageSize?: number;\n}\n\nexport function DataDrivenTable<T extends { id: string }>({\n columns,\n data,\n actions,\n rowActions,\n rowActionsLabel = \"\",\n selectable = false,\n selectionType = \"checkbox\",\n selectedKeys,\n onSelectionChange,\n searchPlaceholder = \"Search...\",\n searchKeys = [],\n isLoading = false,\n loadingMessage = \"Loading...\",\n emptyMessage = \"No records found\",\n previousLabel = \"Previous\",\n nextLabel = \"Next\",\n pageSize = 10,\n nestedColumns,\n getNestedData,\n nestedLoadingMessage = \"Loading...\",\n nestedEmptyMessage = \"No records found\",\n nestedSearchKeys,\n nestedSearchPlaceholder,\n nestedActions,\n nestedPageSize,\n}: DataDrivenTableProps<T>) {\n const [query, setQuery] = useState(\"\");\n const [page, setPage] = useState(1);\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n const [nestedCache, setNestedCache] = useState<Map<string, NestedStatus>>(new Map());\n\n const hasNested = !!getNestedData && !!nestedColumns;\n const hasRowActions = !!rowActions;\n\n function setRowExpanded(id: string, isExpanded: boolean) {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (isExpanded) next.add(id);\n else next.delete(id);\n return next;\n });\n }\n\n // A carga fica fora do updater do setExpanded: o React pode chamar updaters mais de uma\n // vez (StrictMode), o que dispararia getNestedData em dobro.\n function toggleRow(item: T) {\n const id = item.id;\n const willExpand = !expanded.has(id);\n setRowExpanded(id, willExpand);\n if (!willExpand || nestedCache.has(id)) return;\n\n const result = getNestedData!(item);\n if (result instanceof Promise) {\n setNestedCache((c) => new Map(c).set(id, { status: \"loading\", data: [] }));\n result.then(\n (rows) => {\n setNestedCache((c) => new Map(c).set(id, { status: \"loaded\", data: rows }));\n },\n () => {\n // Na falha, descarta a entrada e recolhe a linha: expandir de novo refaz a carga,\n // em vez de a linha ficar presa em \"loading\".\n setNestedCache((c) => {\n const next = new Map(c);\n next.delete(id);\n return next;\n });\n setRowExpanded(id, false);\n },\n );\n } else {\n setNestedCache((c) => new Map(c).set(id, { status: \"loaded\", data: result }));\n }\n }\n\n const hasSearch = searchKeys.length > 0;\n const hasToolbar = hasSearch || !!actions;\n\n const filtered = useMemo(() => {\n if (!query.trim() || !hasSearch) return data;\n const lower = query.toLowerCase();\n return data.filter((item) =>\n searchKeys.some((k) =>\n String(item[k] ?? \"\")\n .toLowerCase()\n .includes(lower),\n ),\n );\n }, [data, query, searchKeys, hasSearch]);\n\n const totalPages = Math.max(1, Math.ceil(filtered.length / pageSize));\n const currentPage = Math.min(page, totalPages);\n const pageData = filtered.slice(\n (currentPage - 1) * pageSize,\n currentPage * pageSize,\n );\n\n function getCell(item: T, col: Column<T>): ReactNode {\n if (col.render) return col.render(item);\n return String((item as Record<string, unknown>)[col.key as string] ?? \"\");\n }\n\n return (\n <Flex direction=\"column\" gap=\"300\" className=\"data-table\">\n {hasToolbar && (\n <div className=\"data-table-toolbar\">\n {hasSearch && (\n <Search\n placeholder={searchPlaceholder}\n onSearch={(v) => {\n setQuery(v);\n setPage(1);\n }}\n className=\"data-table-search\"\n />\n )}\n {actions && <div className=\"data-table-actions\">{actions}</div>}\n </div>\n )}\n\n {isLoading ? (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={loadingMessage}\n className=\"data-table-status\"\n >\n {loadingMessage}\n </div>\n ) : filtered.length === 0 ? (\n <div role=\"status\" className=\"data-table-status data-table-empty\">\n {emptyMessage}\n </div>\n ) : (\n <TableBase\n selectionMode={selectable ? (selectionType === \"radio\" ? \"single\" : \"multiple\") : \"none\"}\n selectionType={selectionType}\n selectedKeys={selectedKeys}\n onSelectionChange={onSelectionChange}\n >\n <TableHead>\n {hasNested && <TableColumn className=\"data-table-expand-col\" />}\n {columns.map((col, idx) => (\n <TableColumn\n key={String(col.key)}\n align={col.align}\n isRowHeader={idx === 0}\n >\n {col.label}\n </TableColumn>\n ))}\n {hasRowActions && (\n <TableColumn align=\"right\" className=\"data-table-row-actions-col\">\n {rowActionsLabel}\n </TableColumn>\n )}\n </TableHead>\n <TableBody>\n {pageData.flatMap((item) => {\n const isExpanded = expanded.has(item.id);\n const cached = nestedCache.get(item.id);\n const rows: ReactNode[] = [\n <TableRow key={item.id} id={item.id}>\n {hasNested && (\n <TableCell className=\"data-table-expand-cell\">\n <button\n type=\"button\"\n className=\"data-table-expand-btn\"\n aria-label={isExpanded ? \"Collapse row\" : \"Expand row\"}\n aria-expanded={isExpanded}\n onClick={() => toggleRow(item)}\n >\n {isExpanded ? (\n <IconChevronDown size=\"16\" />\n ) : (\n <IconChevronRight size=\"16\" />\n )}\n </button>\n </TableCell>\n )}\n {columns.map((col) => (\n <TableCell key={String(col.key)} align={col.align}>\n {getCell(item, col)}\n </TableCell>\n ))}\n {hasRowActions && (\n <TableCell align=\"right\" className=\"data-table-row-actions-cell\">\n <div className=\"data-table-row-actions\">\n {(typeof rowActions === \"function\"\n ? rowActions(item)\n : rowActions!\n ).map((action) => (\n <RowActionButton key={action.key} action={action} item={item} />\n ))}\n </div>\n </TableCell>\n )}\n </TableRow>,\n ];\n if (isExpanded) {\n rows.push(\n <TableRow key={`${item.id}-nested`} id={`${item.id}-nested`} className=\"data-table-nested-row\">\n <TableCell\n colSpan={\n columns.length +\n (hasNested ? 1 : 0) +\n (selectable ? 1 : 0) +\n (hasRowActions ? 1 : 0)\n }\n className=\"data-table-nested-cell\"\n >\n <DataDrivenTable\n columns={nestedColumns!}\n data={cached?.data ?? []}\n isLoading={!cached || cached.status === \"loading\"}\n loadingMessage={nestedLoadingMessage}\n emptyMessage={nestedEmptyMessage}\n searchKeys={nestedSearchKeys}\n searchPlaceholder={nestedSearchPlaceholder}\n actions={nestedActions?.(item)}\n pageSize={nestedPageSize ?? pageSize}\n />\n </TableCell>\n </TableRow>,\n );\n }\n return rows;\n })}\n </TableBody>\n </TableBase>\n )}\n\n <Pagination\n page={currentPage}\n totalPages={totalPages}\n onPageChange={setPage}\n previousLabel={previousLabel}\n nextLabel={nextLabel}\n />\n </Flex>\n );\n}\n"],"names":["RowActionButton","action","item","allowed","btn","jsx","PermissionGate","DataDrivenTable","columns","data","actions","rowActions","rowActionsLabel","selectable","selectionType","selectedKeys","onSelectionChange","searchPlaceholder","searchKeys","isLoading","loadingMessage","emptyMessage","previousLabel","nextLabel","pageSize","nestedColumns","getNestedData","nestedLoadingMessage","nestedEmptyMessage","nestedSearchKeys","nestedSearchPlaceholder","nestedActions","nestedPageSize","query","setQuery","useState","page","setPage","expanded","setExpanded","nestedCache","setNestedCache","hasNested","hasRowActions","setRowExpanded","id","isExpanded","prev","next","toggleRow","willExpand","result","c","rows","hasSearch","hasToolbar","filtered","useMemo","lower","k","totalPages","currentPage","pageData","getCell","col","Flex","jsxs","Search","v","TableBase","TableHead","TableColumn","idx","TableBody","cached","TableRow","TableCell","IconChevronDown","IconChevronRight","Pagination"],"mappings":"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"}