@plumile/ui 0.1.164 → 0.1.165
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/lib/esm/admin/organisms/admin_topbar/adminTopbar.css.js +1 -1
- package/lib/esm/admin/organisms/admin_topbar/adminTopbar.css.js.map +1 -1
- package/lib/esm/atomic/molecules/highlight/HighlightCode.css.js +2 -2
- package/lib/esm/atomic/molecules/highlight/HighlightCode.css.js.map +1 -1
- package/lib/esm/atomic/molecules/highlight/HighlightCode.js +33 -29
- package/lib/esm/atomic/molecules/highlight/HighlightCode.js.map +1 -1
- package/lib/esm/atomic/molecules/markdown/components/MarkdownArticleContainer.css.js +0 -1
- package/lib/esm/atomic/molecules/markdown/components/MarkdownEmphasis.css.js +1 -0
- package/lib/esm/atomic/molecules/tabs/tabs.css.js +2 -2
- package/lib/esm/atomic/molecules/tabs/tabs.css.js.map +1 -1
- package/lib/esm/backoffice/molecules/backoffice_json_viewer/BackofficeJsonViewer.js +46 -37
- package/lib/esm/backoffice/molecules/backoffice_json_viewer/BackofficeJsonViewer.js.map +1 -1
- package/lib/esm/backoffice/molecules/backoffice_json_viewer/backofficeJsonViewer.css.js +2 -2
- package/lib/esm/backoffice/molecules/backoffice_json_viewer/backofficeJsonViewer.css.js.map +1 -1
- package/lib/esm/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js +3 -3
- package/lib/esm/backoffice/molecules/backoffice_page_header/backofficePageHeader.css.js +1 -1
- package/lib/esm/backoffice/molecules/backoffice_page_header/backofficePageHeader.css.js.map +1 -1
- package/lib/esm/backoffice/molecules/backoffice_payload_viewer/BackofficePayloadViewer.js +2 -1
- package/lib/esm/backoffice/molecules/backoffice_payload_viewer/BackofficePayloadViewer.js.map +1 -1
- package/lib/esm/components/data-table/ResponsiveRecordList.css.js +2 -2
- package/lib/esm/components/data-table/ResponsiveRecordList.css.js.map +1 -1
- package/lib/esm/components/data-table/ResponsiveRecordList.js +74 -74
- package/lib/esm/components/data-table/ResponsiveRecordList.js.map +1 -1
- package/lib/esm/style.css +1 -1
- package/lib/types/admin/organisms/admin_topbar/adminTopbar.css.d.ts.map +1 -1
- package/lib/types/atomic/molecules/highlight/HighlightCode.css.d.ts +2 -0
- package/lib/types/atomic/molecules/highlight/HighlightCode.css.d.ts.map +1 -1
- package/lib/types/atomic/molecules/highlight/HighlightCode.d.ts +2 -1
- package/lib/types/atomic/molecules/highlight/HighlightCode.d.ts.map +1 -1
- package/lib/types/atomic/molecules/tabs/tabs.css.d.ts.map +1 -1
- package/lib/types/backoffice/molecules/backoffice_json_viewer/BackofficeJsonViewer.d.ts.map +1 -1
- package/lib/types/backoffice/molecules/backoffice_json_viewer/backofficeJsonViewer.css.d.ts +1 -1
- package/lib/types/backoffice/molecules/backoffice_json_viewer/backofficeJsonViewer.css.d.ts.map +1 -1
- package/lib/types/backoffice/molecules/backoffice_page_header/backofficePageHeader.css.d.ts.map +1 -1
- package/lib/types/backoffice/molecules/backoffice_payload_viewer/BackofficePayloadViewer.d.ts.map +1 -1
- package/lib/types/components/data-table/ResponsiveRecordList.css.d.ts +1 -0
- package/lib/types/components/data-table/ResponsiveRecordList.css.d.ts.map +1 -1
- package/lib/types/components/data-table/ResponsiveRecordList.d.ts.map +1 -1
- package/package.json +4 -4
|
@@ -1,112 +1,112 @@
|
|
|
1
1
|
import { cx as e } from "../../theme/tools.js";
|
|
2
2
|
import { DataTable as t } from "./DataTable.js";
|
|
3
|
-
import { card as n, cardActionContent as r, cardActions as i, cardBadges as a, cardHeader as o, cardMetaGrid as s, cardMetaItem as c, cardMetaLabel as l, cardMetaValue as u, cardSubtitle as d, cardTitle as f, cardTitleGroup as p,
|
|
4
|
-
import { useEffect as
|
|
5
|
-
import { Fragment as
|
|
3
|
+
import { card as n, cardActionContent as r, cardActions as i, cardBadges as a, cardHeader as o, cardMetaGrid as s, cardMetaItem as c, cardMetaLabel as l, cardMetaValue as u, cardSubtitle as d, cardTitle as f, cardTitleGroup as p, cardTitleText as m, cards as h, cardsOnly as g, cardsViewport as _, containedRoot as v, tableOnly as y } from "./ResponsiveRecordList.css.js";
|
|
4
|
+
import { useEffect as b, useState as x } from "react";
|
|
5
|
+
import { Fragment as S, jsx as C, jsxs as w } from "react/jsx-runtime";
|
|
6
6
|
//#region src/components/data-table/ResponsiveRecordList.tsx
|
|
7
|
-
var
|
|
8
|
-
let [e, t] =
|
|
9
|
-
return
|
|
7
|
+
var T = "(max-width: 767px)", E = (e, t) => e == null ? null : e.cell(t), D = (e, t) => e.find((e) => e.mobileRole === t) ?? null, O = (e) => e.mobileRole === "hidden" ? !1 : e.mobileRole === "meta" ? !0 : e.mobileRole == null ? e.priority === "important" || e.priority === "secondary" : !1, k = () => {
|
|
8
|
+
let [e, t] = x(() => typeof window > "u" ? !1 : window.matchMedia(T).matches);
|
|
9
|
+
return b(() => {
|
|
10
10
|
if (typeof window > "u") return () => {};
|
|
11
|
-
let e = window.matchMedia(
|
|
11
|
+
let e = window.matchMedia(T), n = () => {
|
|
12
12
|
t(e.matches);
|
|
13
13
|
};
|
|
14
14
|
return n(), e.addEventListener("change", n), () => {
|
|
15
15
|
e.removeEventListener("change", n);
|
|
16
16
|
};
|
|
17
17
|
}, []), e;
|
|
18
|
-
},
|
|
19
|
-
let
|
|
20
|
-
|
|
21
|
-
let
|
|
22
|
-
if (
|
|
23
|
-
className:
|
|
24
|
-
children:
|
|
25
|
-
let
|
|
26
|
-
|
|
18
|
+
}, A = ({ columns: b, rows: x, getRowId: T, mode: A = "auto", density: j = "compact", renderAction: M, className: N, bodyScrollMode: P, ...F }) => {
|
|
19
|
+
let I = P === "contained", L = k(), R = null, z, B = null;
|
|
20
|
+
I && (R = v, z = _, B = _);
|
|
21
|
+
let V = D(b, "title") ?? b.find((e) => e.isPrimary === !0 || e.priority === "primary") ?? b[0] ?? null, H = D(b, "subtitle"), U = b.filter((e) => e.mobileRole === "badge" || e.mobileRole === "status"), W = b.filter((e) => e !== V && e !== H && O(e)), G = /* @__PURE__ */ C(S, { children: F.emptyState ?? null });
|
|
22
|
+
if (x.length > 0 && (G = /* @__PURE__ */ C("div", {
|
|
23
|
+
className: h,
|
|
24
|
+
children: x.map((t, h) => {
|
|
25
|
+
let g = T(t, h), _ = E(V, t), v = E(H, t), y = M?.(t), b = null;
|
|
26
|
+
v != null && v !== "" && (b = /* @__PURE__ */ C("div", {
|
|
27
27
|
className: d,
|
|
28
|
-
children:
|
|
28
|
+
children: v
|
|
29
29
|
}));
|
|
30
|
-
let
|
|
31
|
-
|
|
30
|
+
let x = null;
|
|
31
|
+
y != null && (x = /* @__PURE__ */ C("div", {
|
|
32
32
|
className: i,
|
|
33
|
-
children: /* @__PURE__ */
|
|
33
|
+
children: /* @__PURE__ */ C("div", {
|
|
34
34
|
className: r,
|
|
35
|
-
children:
|
|
35
|
+
children: y
|
|
36
36
|
})
|
|
37
37
|
}));
|
|
38
|
-
let
|
|
39
|
-
|
|
38
|
+
let S = null;
|
|
39
|
+
U.length > 0 && (S = /* @__PURE__ */ C("div", {
|
|
40
40
|
className: a,
|
|
41
|
-
children:
|
|
41
|
+
children: U.map((e) => /* @__PURE__ */ C("span", { children: e.cell(t) }, e.id))
|
|
42
42
|
}));
|
|
43
|
-
let
|
|
44
|
-
return
|
|
43
|
+
let D = null;
|
|
44
|
+
return W.length > 0 && (D = /* @__PURE__ */ C("dl", {
|
|
45
45
|
className: s,
|
|
46
|
-
children:
|
|
46
|
+
children: W.map((e) => /* @__PURE__ */ w("div", {
|
|
47
47
|
className: c,
|
|
48
|
-
children: [/* @__PURE__ */
|
|
48
|
+
children: [/* @__PURE__ */ C("dt", {
|
|
49
49
|
className: l,
|
|
50
|
-
children:
|
|
51
|
-
}), /* @__PURE__ */
|
|
50
|
+
children: e.header
|
|
51
|
+
}), /* @__PURE__ */ C("dd", {
|
|
52
52
|
className: u,
|
|
53
|
-
children:
|
|
53
|
+
children: e.cell(t)
|
|
54
54
|
})]
|
|
55
|
-
},
|
|
56
|
-
})), /* @__PURE__ */
|
|
57
|
-
className: n({ density:
|
|
55
|
+
}, e.id))
|
|
56
|
+
})), /* @__PURE__ */ w("article", {
|
|
57
|
+
className: n({ density: j }),
|
|
58
58
|
children: [
|
|
59
|
-
/* @__PURE__ */
|
|
59
|
+
/* @__PURE__ */ w("div", {
|
|
60
60
|
className: o,
|
|
61
|
-
children: [/* @__PURE__ */
|
|
61
|
+
children: [/* @__PURE__ */ w("div", {
|
|
62
62
|
className: p,
|
|
63
|
-
children: [/* @__PURE__ */
|
|
64
|
-
className: f,
|
|
65
|
-
children:
|
|
66
|
-
}),
|
|
67
|
-
}),
|
|
63
|
+
children: [/* @__PURE__ */ C("div", {
|
|
64
|
+
className: e(f, m),
|
|
65
|
+
children: _
|
|
66
|
+
}), b]
|
|
67
|
+
}), x]
|
|
68
68
|
}),
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
S,
|
|
70
|
+
D
|
|
71
71
|
]
|
|
72
|
-
},
|
|
72
|
+
}, g);
|
|
73
73
|
})
|
|
74
|
-
})),
|
|
75
|
-
className: e(
|
|
76
|
-
children: /* @__PURE__ */
|
|
77
|
-
className:
|
|
78
|
-
children: [
|
|
74
|
+
})), A === "cards") return /* @__PURE__ */ C("div", {
|
|
75
|
+
className: e(N, R),
|
|
76
|
+
children: /* @__PURE__ */ w("div", {
|
|
77
|
+
className: z,
|
|
78
|
+
children: [G, F.bodyFooterNode]
|
|
79
79
|
})
|
|
80
80
|
});
|
|
81
|
-
if (
|
|
82
|
-
...
|
|
83
|
-
rows:
|
|
84
|
-
columns:
|
|
85
|
-
getRowId:
|
|
86
|
-
className:
|
|
87
|
-
density:
|
|
88
|
-
bodyScrollMode:
|
|
89
|
-
bodyFooterNode:
|
|
81
|
+
if (A === "table") return /* @__PURE__ */ C(t, {
|
|
82
|
+
...F,
|
|
83
|
+
rows: x,
|
|
84
|
+
columns: b,
|
|
85
|
+
getRowId: T,
|
|
86
|
+
className: N,
|
|
87
|
+
density: j,
|
|
88
|
+
bodyScrollMode: P,
|
|
89
|
+
bodyFooterNode: F.bodyFooterNode
|
|
90
90
|
});
|
|
91
|
-
let
|
|
92
|
-
return
|
|
93
|
-
className: e(
|
|
94
|
-
children: [/* @__PURE__ */
|
|
95
|
-
...
|
|
96
|
-
rows:
|
|
97
|
-
columns:
|
|
98
|
-
getRowId:
|
|
99
|
-
density:
|
|
100
|
-
className:
|
|
101
|
-
bodyScrollMode:
|
|
102
|
-
bodyFooterNode:
|
|
103
|
-
}), /* @__PURE__ */
|
|
104
|
-
className: e(
|
|
105
|
-
children: [
|
|
91
|
+
let K = F.bodyFooterNode, q = null;
|
|
92
|
+
return L && (K = null, q = F.bodyFooterNode), /* @__PURE__ */ w("div", {
|
|
93
|
+
className: e(N, R),
|
|
94
|
+
children: [/* @__PURE__ */ C(t, {
|
|
95
|
+
...F,
|
|
96
|
+
rows: x,
|
|
97
|
+
columns: b,
|
|
98
|
+
getRowId: T,
|
|
99
|
+
density: j,
|
|
100
|
+
className: y,
|
|
101
|
+
bodyScrollMode: P,
|
|
102
|
+
bodyFooterNode: K
|
|
103
|
+
}), /* @__PURE__ */ w("div", {
|
|
104
|
+
className: e(g, B),
|
|
105
|
+
children: [G, q]
|
|
106
106
|
})]
|
|
107
107
|
});
|
|
108
108
|
};
|
|
109
109
|
//#endregion
|
|
110
|
-
export {
|
|
110
|
+
export { A as ResponsiveRecordList, A as default };
|
|
111
111
|
|
|
112
112
|
//# sourceMappingURL=ResponsiveRecordList.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResponsiveRecordList.js","names":[],"sources":["../../../../src/components/data-table/ResponsiveRecordList.tsx"],"sourcesContent":["import { useEffect, useState, type JSX, type ReactNode } from 'react';\n\nimport {\n DataTable,\n type DataTableColumn,\n type DataTableDensity,\n type DataTableProps,\n} from './DataTable.js';\nimport * as styles from './ResponsiveRecordList.css.js';\nimport { cx } from '../../theme/tools.js';\n\nconst CARDS_MEDIA_QUERY = '(max-width: 767px)';\n\nexport type ResponsiveRecordListMode = 'table' | 'cards' | 'auto';\nexport type ResponsiveRecordListDensity = DataTableDensity;\nexport type ResponsiveRecordListColumn<Row> = DataTableColumn<Row>;\n\nexport type ResponsiveRecordListProps<Row> = Omit<\n DataTableProps<Row>,\n 'columns'\n> & {\n columns: readonly ResponsiveRecordListColumn<Row>[];\n mode?: ResponsiveRecordListMode;\n density?: ResponsiveRecordListDensity;\n renderAction?: (row: Row) => ReactNode;\n};\n\nconst renderCellText = <Row,>(\n column: ResponsiveRecordListColumn<Row> | null,\n row: Row,\n): ReactNode => {\n if (column == null) {\n return null;\n }\n return column.cell(row);\n};\n\nconst findColumn = <Row,>(\n columns: readonly ResponsiveRecordListColumn<Row>[],\n role: ResponsiveRecordListColumn<Row>['mobileRole'],\n): ResponsiveRecordListColumn<Row> | null => {\n return (\n columns.find((column) => {\n return column.mobileRole === role;\n }) ?? null\n );\n};\n\nconst isMetaColumn = <Row,>(\n column: ResponsiveRecordListColumn<Row>,\n): boolean => {\n if (column.mobileRole === 'hidden') {\n return false;\n }\n if (column.mobileRole === 'meta') {\n return true;\n }\n if (column.mobileRole != null) {\n return false;\n }\n return column.priority === 'important' || column.priority === 'secondary';\n};\n\nconst useIsCardsViewport = (): boolean => {\n const [matches, setMatches] = useState(() => {\n if (typeof window === 'undefined') {\n return false;\n }\n return window.matchMedia(CARDS_MEDIA_QUERY).matches;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return () => {};\n }\n const mediaQuery = window.matchMedia(CARDS_MEDIA_QUERY);\n const handleChange = () => {\n setMatches(mediaQuery.matches);\n };\n\n handleChange();\n mediaQuery.addEventListener('change', handleChange);\n\n return () => {\n mediaQuery.removeEventListener('change', handleChange);\n };\n }, []);\n\n return matches;\n};\n\nexport const ResponsiveRecordList = <Row,>({\n columns,\n rows,\n getRowId,\n mode = 'auto',\n density = 'compact',\n renderAction,\n className,\n bodyScrollMode,\n ...tableProps\n}: ResponsiveRecordListProps<Row>): JSX.Element => {\n const hasContainedBodyScroll = bodyScrollMode === 'contained';\n const isCardsViewport = useIsCardsViewport();\n let containedRootClassName: string | null = null;\n let cardsViewportClassName: string | undefined;\n let containedCardsOnlyClassName: string | null = null;\n if (hasContainedBodyScroll) {\n containedRootClassName = styles.containedRoot;\n cardsViewportClassName = styles.cardsViewport;\n containedCardsOnlyClassName = styles.cardsViewport;\n }\n const titleColumn =\n findColumn(columns, 'title') ??\n columns.find((column) => {\n return column.isPrimary === true || column.priority === 'primary';\n }) ??\n columns[0] ??\n null;\n const subtitleColumn = findColumn(columns, 'subtitle');\n const badgeColumns = columns.filter((column) => {\n return column.mobileRole === 'badge' || column.mobileRole === 'status';\n });\n const metaColumns = columns.filter((column) => {\n return (\n column !== titleColumn &&\n column !== subtitleColumn &&\n isMetaColumn(column)\n );\n });\n\n let cards: JSX.Element = <>{tableProps.emptyState ?? null}</>;\n if (rows.length > 0) {\n cards = (\n <div className={styles.cards}>\n {rows.map((row, index) => {\n const rowId = getRowId(row, index);\n const title = renderCellText(titleColumn, row);\n const subtitle = renderCellText(subtitleColumn, row);\n const action = renderAction?.(row);\n let subtitleNode: JSX.Element | null = null;\n if (subtitle != null && subtitle !== '') {\n subtitleNode = (\n <div className={styles.cardSubtitle}>{subtitle}</div>\n );\n }\n let actionNode: JSX.Element | null = null;\n if (action != null) {\n actionNode = (\n <div className={styles.cardActions}>\n <div className={styles.cardActionContent}>{action}</div>\n </div>\n );\n }\n let badgeNode: JSX.Element | null = null;\n if (badgeColumns.length > 0) {\n badgeNode = (\n <div className={styles.cardBadges}>\n {badgeColumns.map((column) => {\n return <span key={column.id}>{column.cell(row)}</span>;\n })}\n </div>\n );\n }\n let metaNode: JSX.Element | null = null;\n if (metaColumns.length > 0) {\n metaNode = (\n <dl className={styles.cardMetaGrid}>\n {metaColumns.map((column) => {\n return (\n <div key={column.id} className={styles.cardMetaItem}>\n <dt className={styles.cardMetaLabel}>{column.header}</dt>\n <dd className={styles.cardMetaValue}>\n {column.cell(row)}\n </dd>\n </div>\n );\n })}\n </dl>\n );\n }\n\n return (\n <article key={rowId} className={styles.card({ density })}>\n <div className={styles.cardHeader}>\n <div className={styles.cardTitleGroup}>\n <div className={styles.cardTitle}>{title}</div>\n {subtitleNode}\n </div>\n {actionNode}\n </div>\n {badgeNode}\n {metaNode}\n </article>\n );\n })}\n </div>\n );\n }\n\n if (mode === 'cards') {\n return (\n <div className={cx(className, containedRootClassName)}>\n <div className={cardsViewportClassName}>\n {cards}\n {tableProps.bodyFooterNode}\n </div>\n </div>\n );\n }\n\n if (mode === 'table') {\n return (\n <DataTable\n {...tableProps}\n rows={rows}\n columns={columns}\n getRowId={getRowId}\n className={className}\n density={density}\n bodyScrollMode={bodyScrollMode}\n bodyFooterNode={tableProps.bodyFooterNode}\n />\n );\n }\n\n let tableBodyFooterNode = tableProps.bodyFooterNode;\n let cardsBodyFooterNode: ReactNode = null;\n if (isCardsViewport) {\n tableBodyFooterNode = null;\n cardsBodyFooterNode = tableProps.bodyFooterNode;\n }\n\n return (\n <div className={cx(className, containedRootClassName)}>\n <DataTable\n {...tableProps}\n rows={rows}\n columns={columns}\n getRowId={getRowId}\n density={density}\n className={styles.tableOnly}\n bodyScrollMode={bodyScrollMode}\n bodyFooterNode={tableBodyFooterNode}\n />\n <div className={cx(styles.cardsOnly, containedCardsOnlyClassName)}>\n {cards}\n {cardsBodyFooterNode}\n </div>\n </div>\n );\n};\n\nexport default ResponsiveRecordList;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ResponsiveRecordList.js","names":[],"sources":["../../../../src/components/data-table/ResponsiveRecordList.tsx"],"sourcesContent":["import { useEffect, useState, type JSX, type ReactNode } from 'react';\n\nimport {\n DataTable,\n type DataTableColumn,\n type DataTableDensity,\n type DataTableProps,\n} from './DataTable.js';\nimport * as styles from './ResponsiveRecordList.css.js';\nimport { cx } from '../../theme/tools.js';\n\nconst CARDS_MEDIA_QUERY = '(max-width: 767px)';\n\nexport type ResponsiveRecordListMode = 'table' | 'cards' | 'auto';\nexport type ResponsiveRecordListDensity = DataTableDensity;\nexport type ResponsiveRecordListColumn<Row> = DataTableColumn<Row>;\n\nexport type ResponsiveRecordListProps<Row> = Omit<\n DataTableProps<Row>,\n 'columns'\n> & {\n columns: readonly ResponsiveRecordListColumn<Row>[];\n mode?: ResponsiveRecordListMode;\n density?: ResponsiveRecordListDensity;\n renderAction?: (row: Row) => ReactNode;\n};\n\nconst renderCellText = <Row,>(\n column: ResponsiveRecordListColumn<Row> | null,\n row: Row,\n): ReactNode => {\n if (column == null) {\n return null;\n }\n return column.cell(row);\n};\n\nconst findColumn = <Row,>(\n columns: readonly ResponsiveRecordListColumn<Row>[],\n role: ResponsiveRecordListColumn<Row>['mobileRole'],\n): ResponsiveRecordListColumn<Row> | null => {\n return (\n columns.find((column) => {\n return column.mobileRole === role;\n }) ?? null\n );\n};\n\nconst isMetaColumn = <Row,>(\n column: ResponsiveRecordListColumn<Row>,\n): boolean => {\n if (column.mobileRole === 'hidden') {\n return false;\n }\n if (column.mobileRole === 'meta') {\n return true;\n }\n if (column.mobileRole != null) {\n return false;\n }\n return column.priority === 'important' || column.priority === 'secondary';\n};\n\nconst useIsCardsViewport = (): boolean => {\n const [matches, setMatches] = useState(() => {\n if (typeof window === 'undefined') {\n return false;\n }\n return window.matchMedia(CARDS_MEDIA_QUERY).matches;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return () => {};\n }\n const mediaQuery = window.matchMedia(CARDS_MEDIA_QUERY);\n const handleChange = () => {\n setMatches(mediaQuery.matches);\n };\n\n handleChange();\n mediaQuery.addEventListener('change', handleChange);\n\n return () => {\n mediaQuery.removeEventListener('change', handleChange);\n };\n }, []);\n\n return matches;\n};\n\nexport const ResponsiveRecordList = <Row,>({\n columns,\n rows,\n getRowId,\n mode = 'auto',\n density = 'compact',\n renderAction,\n className,\n bodyScrollMode,\n ...tableProps\n}: ResponsiveRecordListProps<Row>): JSX.Element => {\n const hasContainedBodyScroll = bodyScrollMode === 'contained';\n const isCardsViewport = useIsCardsViewport();\n let containedRootClassName: string | null = null;\n let cardsViewportClassName: string | undefined;\n let containedCardsOnlyClassName: string | null = null;\n if (hasContainedBodyScroll) {\n containedRootClassName = styles.containedRoot;\n cardsViewportClassName = styles.cardsViewport;\n containedCardsOnlyClassName = styles.cardsViewport;\n }\n const titleColumn =\n findColumn(columns, 'title') ??\n columns.find((column) => {\n return column.isPrimary === true || column.priority === 'primary';\n }) ??\n columns[0] ??\n null;\n const subtitleColumn = findColumn(columns, 'subtitle');\n const badgeColumns = columns.filter((column) => {\n return column.mobileRole === 'badge' || column.mobileRole === 'status';\n });\n const metaColumns = columns.filter((column) => {\n return (\n column !== titleColumn &&\n column !== subtitleColumn &&\n isMetaColumn(column)\n );\n });\n\n let cards: JSX.Element = <>{tableProps.emptyState ?? null}</>;\n if (rows.length > 0) {\n cards = (\n <div className={styles.cards}>\n {rows.map((row, index) => {\n const rowId = getRowId(row, index);\n const title = renderCellText(titleColumn, row);\n const subtitle = renderCellText(subtitleColumn, row);\n const action = renderAction?.(row);\n let subtitleNode: JSX.Element | null = null;\n if (subtitle != null && subtitle !== '') {\n subtitleNode = (\n <div className={styles.cardSubtitle}>{subtitle}</div>\n );\n }\n let actionNode: JSX.Element | null = null;\n if (action != null) {\n actionNode = (\n <div className={styles.cardActions}>\n <div className={styles.cardActionContent}>{action}</div>\n </div>\n );\n }\n let badgeNode: JSX.Element | null = null;\n if (badgeColumns.length > 0) {\n badgeNode = (\n <div className={styles.cardBadges}>\n {badgeColumns.map((column) => {\n return <span key={column.id}>{column.cell(row)}</span>;\n })}\n </div>\n );\n }\n let metaNode: JSX.Element | null = null;\n if (metaColumns.length > 0) {\n metaNode = (\n <dl className={styles.cardMetaGrid}>\n {metaColumns.map((column) => {\n return (\n <div key={column.id} className={styles.cardMetaItem}>\n <dt className={styles.cardMetaLabel}>{column.header}</dt>\n <dd className={styles.cardMetaValue}>\n {column.cell(row)}\n </dd>\n </div>\n );\n })}\n </dl>\n );\n }\n\n return (\n <article key={rowId} className={styles.card({ density })}>\n <div className={styles.cardHeader}>\n <div className={styles.cardTitleGroup}>\n <div className={cx(styles.cardTitle, styles.cardTitleText)}>\n {title}\n </div>\n {subtitleNode}\n </div>\n {actionNode}\n </div>\n {badgeNode}\n {metaNode}\n </article>\n );\n })}\n </div>\n );\n }\n\n if (mode === 'cards') {\n return (\n <div className={cx(className, containedRootClassName)}>\n <div className={cardsViewportClassName}>\n {cards}\n {tableProps.bodyFooterNode}\n </div>\n </div>\n );\n }\n\n if (mode === 'table') {\n return (\n <DataTable\n {...tableProps}\n rows={rows}\n columns={columns}\n getRowId={getRowId}\n className={className}\n density={density}\n bodyScrollMode={bodyScrollMode}\n bodyFooterNode={tableProps.bodyFooterNode}\n />\n );\n }\n\n let tableBodyFooterNode = tableProps.bodyFooterNode;\n let cardsBodyFooterNode: ReactNode = null;\n if (isCardsViewport) {\n tableBodyFooterNode = null;\n cardsBodyFooterNode = tableProps.bodyFooterNode;\n }\n\n return (\n <div className={cx(className, containedRootClassName)}>\n <DataTable\n {...tableProps}\n rows={rows}\n columns={columns}\n getRowId={getRowId}\n density={density}\n className={styles.tableOnly}\n bodyScrollMode={bodyScrollMode}\n bodyFooterNode={tableBodyFooterNode}\n />\n <div className={cx(styles.cardsOnly, containedCardsOnlyClassName)}>\n {cards}\n {cardsBodyFooterNode}\n </div>\n </div>\n );\n};\n\nexport default ResponsiveRecordList;\n"],"mappings":"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"}
|