@databiosphere/findable-ui 5.0.0 → 6.0.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 (183) hide show
  1. package/README.md +5 -1
  2. package/lib/components/ComponentCreator/ComponentCreator.d.ts +4 -2
  3. package/lib/components/ComponentCreator/ComponentCreator.js +6 -8
  4. package/lib/components/Detail/components/DetailViewTable/detailViewTable.d.ts +3 -3
  5. package/lib/components/Detail/components/DetailViewTable/detailViewTable.js +1 -1
  6. package/lib/components/Detail/components/Table/common/utils.d.ts +2 -2
  7. package/lib/components/Detail/components/Table/components/TableBody/tableBody.d.ts +3 -3
  8. package/lib/components/Detail/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.d.ts +3 -3
  9. package/lib/components/Detail/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.js +2 -4
  10. package/lib/components/Detail/components/Table/components/TableRows/tableRows.d.ts +2 -2
  11. package/lib/components/Detail/components/Table/components/TableRows/tableRows.js +2 -1
  12. package/lib/components/Detail/components/Table/table.d.ts +3 -4
  13. package/lib/components/Detail/components/Table/table.js +2 -1
  14. package/lib/components/Filter/components/Filters/filters.d.ts +1 -1
  15. package/lib/components/Index/components/Cell/cell.d.ts +3 -0
  16. package/lib/components/Index/components/Cell/cell.js +3 -0
  17. package/lib/components/Index/components/NTag/components/Tooltip/tooltip.d.ts +3 -0
  18. package/lib/components/Index/components/NTag/components/Tooltip/tooltip.js +3 -0
  19. package/lib/components/Index/components/NTag/nTag.d.ts +3 -0
  20. package/lib/components/Index/components/NTag/nTag.js +3 -0
  21. package/lib/components/Index/components/NTagCell/nTagCell.d.ts +6 -1
  22. package/lib/components/Index/components/NTagCell/nTagCell.js +6 -2
  23. package/lib/components/Layout/components/Outline/common/constants.d.ts +1 -1
  24. package/lib/components/Links/components/Link/components/ExploreViewLink/exploreViewLink.d.ts +1 -1
  25. package/lib/components/Links/components/Link/link.d.ts +3 -1
  26. package/lib/components/Links/components/Link/link.js +4 -4
  27. package/lib/components/Table/common/gridTable.styles.js +8 -2
  28. package/lib/components/Table/common/utils.d.ts +19 -14
  29. package/lib/components/Table/common/utils.js +26 -11
  30. package/lib/components/Table/components/DownloadEntityResults/downloadEntityResults.d.ts +3 -3
  31. package/lib/components/Table/components/PaginationSummary/paginationSummary.js +9 -8
  32. package/lib/components/Table/components/TableBody/tableBody.d.ts +3 -3
  33. package/lib/components/Table/components/TableCell/common/utils.d.ts +3 -3
  34. package/lib/components/Table/components/TableCell/components/BasicCell/basicCell.d.ts +7 -0
  35. package/lib/components/Table/components/TableCell/components/BasicCell/basicCell.js +55 -0
  36. package/lib/components/Table/components/TableCell/components/NTagCell/components/NTag/components/Tooltip/tooltip.d.ts +6 -0
  37. package/lib/components/Table/components/TableCell/components/NTagCell/components/NTag/components/Tooltip/tooltip.js +93 -0
  38. package/lib/components/Table/components/TableCell/components/NTagCell/components/NTag/components/Tooltip/tooltip.styles.d.ts +5 -0
  39. package/lib/components/Table/components/TableCell/components/NTagCell/components/NTag/components/Tooltip/tooltip.styles.js +16 -0
  40. package/lib/components/Table/components/TableCell/components/NTagCell/components/NTag/nTag.d.ts +7 -0
  41. package/lib/components/Table/components/TableCell/components/NTagCell/components/NTag/nTag.js +24 -0
  42. package/lib/components/Table/components/TableCell/components/NTagCell/nTagCell.d.ts +9 -0
  43. package/lib/components/Table/components/TableCell/components/NTagCell/nTagCell.js +53 -0
  44. package/lib/components/Table/components/TableCell/components/RowSelectionCell/rowSelectionCell.d.ts +2 -2
  45. package/lib/components/Table/components/TableHead/components/HeadSelectionCell/headSelectionCell.d.ts +2 -2
  46. package/lib/components/Table/components/TableHead/tableHead.d.ts +3 -3
  47. package/lib/components/Table/components/TableRow/tableRow.styles.d.ts +16 -0
  48. package/lib/components/Table/components/TableRow/tableRow.styles.js +22 -0
  49. package/lib/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.d.ts +3 -3
  50. package/lib/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.js +3 -2
  51. package/lib/components/Table/components/TableRows/tableRows.d.ts +3 -3
  52. package/lib/components/Table/components/TableRows/tableRows.js +3 -1
  53. package/lib/components/Table/components/TableToolbar/components/RowPreview/components/RowDrawer/common/constants.d.ts +2 -0
  54. package/lib/components/Table/components/TableToolbar/components/RowPreview/components/RowDrawer/common/constants.js +12 -0
  55. package/lib/components/Table/components/TableToolbar/components/RowPreview/components/RowDrawer/rowDrawer.d.ts +9 -0
  56. package/lib/components/Table/components/TableToolbar/components/RowPreview/components/RowDrawer/rowDrawer.js +32 -0
  57. package/lib/components/Table/components/TableToolbar/components/RowPreview/components/RowDrawer/rowDrawer.styles.d.ts +6 -0
  58. package/lib/components/Table/components/TableToolbar/components/RowPreview/components/RowDrawer/rowDrawer.styles.js +35 -0
  59. package/lib/components/Table/components/TableToolbar/components/RowPreview/components/Section/components/RowDetail/rowDetail.d.ts +12 -0
  60. package/lib/components/Table/components/TableToolbar/components/RowPreview/components/Section/components/RowDetail/rowDetail.js +32 -0
  61. package/lib/components/Table/components/TableToolbar/components/RowPreview/components/Section/components/RowDetail/rowDetail.styles.d.ts +5 -0
  62. package/lib/components/Table/components/TableToolbar/components/RowPreview/components/Section/components/RowDetail/rowDetail.styles.js +50 -0
  63. package/lib/components/Table/components/TableToolbar/components/RowPreview/components/Section/section.d.ts +7 -0
  64. package/lib/components/Table/components/TableToolbar/components/RowPreview/components/Section/section.js +16 -0
  65. package/lib/components/Table/components/TableToolbar/components/RowPreview/components/Section/section.styles.d.ts +5 -0
  66. package/lib/components/Table/components/TableToolbar/components/RowPreview/components/Section/section.styles.js +17 -0
  67. package/lib/components/Table/components/TableToolbar/components/RowPreview/rowPreview.d.ts +8 -0
  68. package/lib/components/Table/components/TableToolbar/components/RowPreview/rowPreview.js +14 -0
  69. package/lib/components/Table/components/TableToolbar/components/RowSelection/rowSelection.d.ts +3 -3
  70. package/lib/components/Table/components/TableToolbar/tableToolbar.d.ts +3 -3
  71. package/lib/components/Table/components/TableToolbar/tableToolbar.js +9 -6
  72. package/lib/components/Table/features/RowPreview/constants.d.ts +2 -0
  73. package/lib/components/Table/features/RowPreview/constants.js +45 -0
  74. package/lib/components/Table/features/RowPreview/entities.d.ts +22 -0
  75. package/lib/components/Table/features/RowPreview/entities.js +2 -0
  76. package/lib/components/Table/features/RowPreview/utils.d.ts +33 -0
  77. package/lib/components/Table/features/RowPreview/utils.js +89 -0
  78. package/lib/components/Table/features/entities.d.ts +7 -0
  79. package/lib/components/Table/features/entities.js +2 -0
  80. package/lib/components/Table/table.d.ts +4 -12
  81. package/lib/components/Table/table.js +26 -38
  82. package/lib/components/TableCreator/common/entities.d.ts +1 -1
  83. package/lib/components/TableCreator/tableCreator.d.ts +2 -9
  84. package/lib/components/TableCreator/tableCreator.js +4 -4
  85. package/lib/components/common/Button/button.d.ts +1 -1
  86. package/lib/components/common/Drawer/components/DrawerTitle/drawerTitle.d.ts +7 -0
  87. package/lib/components/common/Drawer/components/DrawerTitle/drawerTitle.js +17 -0
  88. package/lib/components/common/Drawer/components/DrawerTitle/drawerTitle.styles.d.ts +5 -0
  89. package/lib/components/common/Drawer/components/DrawerTitle/drawerTitle.styles.js +17 -0
  90. package/lib/components/common/Drawer/components/drawer.styles.d.ts +5 -0
  91. package/lib/components/common/Drawer/components/drawer.styles.js +11 -0
  92. package/lib/components/common/Drawer/drawer.d.ts +7 -0
  93. package/lib/components/common/Drawer/drawer.js +24 -0
  94. package/lib/components/common/Grid/grid.d.ts +1 -1
  95. package/lib/components/common/Typography/common/entities.d.ts +2 -0
  96. package/lib/components/common/Typography/common/entities.js +2 -0
  97. package/lib/config/entities.d.ts +7 -25
  98. package/lib/providers/exploreState/entities.d.ts +3 -2
  99. package/lib/providers/exploreState/initializer/constants.js +1 -3
  100. package/lib/providers/exploreState/initializer/utils.js +1 -0
  101. package/lib/providers/exploreState/payloads/entities.d.ts +6 -11
  102. package/lib/providers/exploreState/utils.d.ts +12 -10
  103. package/lib/providers/exploreState/utils.js +20 -24
  104. package/lib/providers/exploreState.d.ts +12 -32
  105. package/lib/providers/exploreState.js +47 -36
  106. package/lib/styles/common/mixins/colors.d.ts +2 -1
  107. package/lib/styles/common/mixins/colors.js +3 -1
  108. package/lib/theme/common/components.js +11 -2
  109. package/lib/theme/common/palette.d.ts +3 -1
  110. package/lib/theme/common/palette.js +4 -1
  111. package/lib/views/ExploreView/exploreView.js +4 -6
  112. package/package.json +2 -2
  113. package/src/components/ComponentCreator/ComponentCreator.tsx +6 -1
  114. package/src/components/Detail/components/DetailViewTable/detailViewTable.tsx +4 -4
  115. package/src/components/Detail/components/Table/common/utils.ts +2 -2
  116. package/src/components/Detail/components/Table/components/TableBody/tableBody.tsx +3 -3
  117. package/src/components/Detail/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.tsx +5 -7
  118. package/src/components/Detail/components/Table/components/TableRows/tableRows.tsx +10 -6
  119. package/src/components/Detail/components/Table/table.tsx +6 -3
  120. package/src/components/Filter/components/Filters/filters.tsx +1 -1
  121. package/src/components/Index/components/Cell/cell.tsx +4 -0
  122. package/src/components/Index/components/NTag/components/Tooltip/tooltip.tsx +4 -0
  123. package/src/components/Index/components/NTag/nTag.tsx +4 -0
  124. package/src/components/Index/components/NTagCell/nTagCell.tsx +22 -3
  125. package/src/components/Layout/components/Outline/common/constants.ts +1 -1
  126. package/src/components/Links/components/Link/components/ExploreViewLink/exploreViewLink.tsx +1 -1
  127. package/src/components/Links/components/Link/link.tsx +15 -2
  128. package/src/components/Table/common/gridTable.styles.ts +8 -2
  129. package/src/components/Table/common/utils.ts +55 -24
  130. package/src/components/Table/components/DownloadEntityResults/downloadEntityResults.tsx +3 -3
  131. package/src/components/Table/components/PaginationSummary/paginationSummary.tsx +11 -9
  132. package/src/components/Table/components/TableBody/tableBody.tsx +3 -3
  133. package/src/components/Table/components/TableCell/common/utils.ts +3 -3
  134. package/src/components/Table/components/TableCell/components/BasicCell/basicCell.tsx +52 -0
  135. package/src/components/Table/components/TableCell/components/NTagCell/components/NTag/components/Tooltip/tooltip.styles.ts +11 -0
  136. package/src/components/Table/components/TableCell/components/NTagCell/components/NTag/components/Tooltip/tooltip.tsx +86 -0
  137. package/src/components/Table/components/TableCell/components/NTagCell/components/NTag/nTag.tsx +21 -0
  138. package/src/components/Table/components/TableCell/components/NTagCell/nTagCell.tsx +70 -0
  139. package/src/components/Table/components/TableCell/components/RowSelectionCell/rowSelectionCell.tsx +2 -3
  140. package/src/components/Table/components/TableHead/components/HeadSelectionCell/headSelectionCell.tsx +2 -3
  141. package/src/components/Table/components/TableHead/tableHead.tsx +3 -3
  142. package/src/components/Table/components/TableRow/tableRow.styles.ts +22 -0
  143. package/src/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.tsx +8 -6
  144. package/src/components/Table/components/TableRows/tableRows.tsx +9 -6
  145. package/src/components/Table/components/TableToolbar/components/RowPreview/components/RowDrawer/common/constants.ts +11 -0
  146. package/src/components/Table/components/TableToolbar/components/RowPreview/components/RowDrawer/rowDrawer.styles.ts +31 -0
  147. package/src/components/Table/components/TableToolbar/components/RowPreview/components/RowDrawer/rowDrawer.tsx +52 -0
  148. package/src/components/Table/components/TableToolbar/components/RowPreview/components/Section/components/RowDetail/rowDetail.styles.ts +48 -0
  149. package/src/components/Table/components/TableToolbar/components/RowPreview/components/Section/components/RowDetail/rowDetail.tsx +53 -0
  150. package/src/components/Table/components/TableToolbar/components/RowPreview/components/Section/section.styles.ts +12 -0
  151. package/src/components/Table/components/TableToolbar/components/RowPreview/components/Section/section.tsx +25 -0
  152. package/src/components/Table/components/TableToolbar/components/RowPreview/rowPreview.tsx +19 -0
  153. package/src/components/Table/components/TableToolbar/components/RowSelection/rowSelection.tsx +3 -3
  154. package/src/components/Table/components/TableToolbar/tableToolbar.tsx +9 -4
  155. package/src/components/Table/features/RowPreview/constants.ts +65 -0
  156. package/src/components/Table/features/RowPreview/entities.ts +25 -0
  157. package/src/components/Table/features/RowPreview/utils.ts +93 -0
  158. package/src/components/Table/features/entities.ts +13 -0
  159. package/src/components/Table/table.tsx +40 -50
  160. package/src/components/TableCreator/common/entities.ts +1 -1
  161. package/src/components/TableCreator/tableCreator.tsx +15 -22
  162. package/src/components/common/Button/button.tsx +1 -2
  163. package/src/components/common/Drawer/components/DrawerTitle/drawerTitle.styles.ts +12 -0
  164. package/src/components/common/Drawer/components/DrawerTitle/drawerTitle.tsx +27 -0
  165. package/src/components/common/Drawer/components/drawer.styles.ts +6 -0
  166. package/src/components/common/Drawer/drawer.tsx +21 -0
  167. package/src/components/common/Grid/grid.tsx +1 -3
  168. package/src/components/common/Section/components/CollapsableSection/collapsableSection.tsx +1 -2
  169. package/src/components/common/Typography/common/entities.ts +5 -0
  170. package/src/config/entities.ts +7 -37
  171. package/src/providers/exploreState/entities.ts +7 -2
  172. package/src/providers/exploreState/initializer/constants.ts +1 -3
  173. package/src/providers/exploreState/initializer/utils.ts +2 -1
  174. package/src/providers/exploreState/payloads/entities.ts +7 -18
  175. package/src/providers/exploreState/utils.ts +25 -36
  176. package/src/providers/exploreState.tsx +93 -73
  177. package/src/styles/common/mixins/colors.ts +4 -1
  178. package/src/theme/common/components.ts +12 -0
  179. package/src/theme/common/palette.ts +4 -5
  180. package/src/theme/theme.ts +1 -2
  181. package/src/views/ExploreView/exploreView.tsx +3 -25
  182. package/types/data-explorer-ui.d.ts +21 -2
  183. package/src/hooks/useEntityListRelatedView.ts +0 -78
@@ -0,0 +1,70 @@
1
+ import {
2
+ Chip as MChip,
3
+ ChipProps as MChipProps,
4
+ Typography,
5
+ } from "@mui/material";
6
+ import React, { forwardRef } from "react";
7
+ import { TEXT_BODY_SMALL_400 } from "../../../../../../theme/common/typography";
8
+ import { TypographyProps } from "../../../../../common/Typography/common/entities";
9
+ import { NTag } from "./components/NTag/nTag";
10
+
11
+ // Template constants
12
+ const MAX_DISPLAYABLE_VALUES = 1;
13
+
14
+ export type MetadataValue = string;
15
+
16
+ export interface NTagCellProps {
17
+ label: string;
18
+ TypographyProps?: TypographyProps;
19
+ values: MetadataValue[];
20
+ }
21
+
22
+ /**
23
+ * String-concatenates the specified list of metadata values to a string value, joined by a comma ",".
24
+ * @param metadataValues - List of metadata values.
25
+ * @returns the metadata values in a string, each value joined by a comma.
26
+ */
27
+ function stringifyMetadataValues(metadataValues: MetadataValue[]): string {
28
+ return metadataValues.join(", ");
29
+ }
30
+
31
+ /**
32
+ * Renders tag for NTag component.
33
+ * Tooltip children require forward ref.
34
+ */
35
+ const Tag = forwardRef<HTMLDivElement, MChipProps>(function Tag(props, ref) {
36
+ return <MChip ref={ref} {...props} />;
37
+ });
38
+
39
+ export const NTagCell = ({
40
+ label,
41
+ TypographyProps,
42
+ values,
43
+ }: NTagCellProps): JSX.Element => {
44
+ const metadataCount = values.length;
45
+ const showNTag = metadataCount > MAX_DISPLAYABLE_VALUES;
46
+ return (
47
+ <>
48
+ {showNTag ? (
49
+ <NTag
50
+ Tag={<Tag label={`${metadataCount} ${label}`} variant="ntag" />}
51
+ TooltipTitle={
52
+ <Typography display="block" variant={TEXT_BODY_SMALL_400}>
53
+ {stringifyMetadataValues(values)}
54
+ </Typography>
55
+ }
56
+ />
57
+ ) : (
58
+ values.map((value, v) => (
59
+ <Typography
60
+ key={`${value}${v}`}
61
+ variant="inherit"
62
+ {...TypographyProps}
63
+ >
64
+ {value}
65
+ </Typography>
66
+ ))
67
+ )}
68
+ </>
69
+ );
70
+ };
@@ -1,11 +1,10 @@
1
1
  import { Checkbox as MCheckbox } from "@mui/material";
2
- import { Row } from "@tanstack/react-table";
3
- import { RowData } from "@tanstack/table-core";
2
+ import { Row, RowData } from "@tanstack/react-table";
4
3
  import React from "react";
5
4
  import { CheckedIcon } from "../../../../../common/CustomIcon/components/CheckedIcon/checkedIcon";
6
5
  import { UncheckedIcon } from "../../../../../common/CustomIcon/components/UncheckedIcon/uncheckedIcon";
7
6
 
8
- export interface RowSelectionCellProps<T> {
7
+ export interface RowSelectionCellProps<T extends RowData> {
9
8
  row: Row<T>;
10
9
  }
11
10
 
@@ -1,12 +1,11 @@
1
1
  import { Checkbox } from "@mui/material";
2
- import { Table } from "@tanstack/react-table";
3
- import { RowData } from "@tanstack/table-core";
2
+ import { RowData, Table } from "@tanstack/react-table";
4
3
  import React from "react";
5
4
  import { CheckedIcon } from "../../../../../common/CustomIcon/components/CheckedIcon/checkedIcon";
6
5
  import { IndeterminateIcon } from "../../../../../common/CustomIcon/components/IndeterminateIcon/indeterminateIcon";
7
6
  import { UncheckedIcon } from "../../../../../common/CustomIcon/components/UncheckedIcon/uncheckedIcon";
8
7
 
9
- export interface HeadSelectionCellProps<T> {
8
+ export interface HeadSelectionCellProps<T extends RowData> {
10
9
  tableInstance: Table<T>;
11
10
  }
12
11
 
@@ -4,18 +4,18 @@ import {
4
4
  TableRow as MTableRow,
5
5
  TableSortLabel,
6
6
  } from "@mui/material";
7
- import { flexRender, Table } from "@tanstack/react-table";
7
+ import { flexRender, RowData, Table } from "@tanstack/react-table";
8
8
  import React, { Fragment } from "react";
9
9
  import { ROW_DIRECTION } from "../../common/entities";
10
10
  import { getTableSortLabelProps } from "../../common/utils";
11
11
  import { getTableCellPadding } from "../TableCell/common/utils";
12
12
 
13
- export interface TableHeadProps<T> {
13
+ export interface TableHeadProps<T extends RowData> {
14
14
  rowDirection: ROW_DIRECTION;
15
15
  tableInstance: Table<T>;
16
16
  }
17
17
 
18
- export const TableHead = <T extends object>({
18
+ export const TableHead = <T extends RowData>({
19
19
  rowDirection,
20
20
  tableInstance,
21
21
  }: TableHeadProps<T>): JSX.Element => {
@@ -0,0 +1,22 @@
1
+ import { css } from "@emotion/react";
2
+ import styled from "@emotion/styled";
3
+ import { TableRow as MTableRow } from "@mui/material";
4
+ import { primaryLightest } from "../../../../styles/common/mixins/colors";
5
+
6
+ interface Props {
7
+ isPreview?: boolean;
8
+ }
9
+
10
+ export const TableRow = styled(MTableRow, {
11
+ shouldForwardProp: (prop) => prop !== "isPreview",
12
+ })<Props>`
13
+ && {
14
+ transition: background-color 300ms ease-in;
15
+
16
+ ${(props) =>
17
+ props.isPreview &&
18
+ css`
19
+ background-color: ${primaryLightest(props)};
20
+ `}
21
+ }
22
+ `;
@@ -1,16 +1,16 @@
1
- import { TableRow as MTableRow } from "@mui/material";
2
- import { Row, Table } from "@tanstack/react-table";
1
+ import { Row, RowData, Table } from "@tanstack/react-table";
3
2
  import { Virtualizer } from "@tanstack/react-virtual";
4
3
  import React, { Fragment } from "react";
5
4
  import { isCollapsableRowDisabled } from "../../../../common/utils";
6
5
  import { CollapsableCell } from "../../../TableCell/components/CollapsableCell/collapsableCell";
6
+ import { TableRow } from "../../../TableRow/tableRow.styles";
7
7
 
8
- export interface CollapsableRowsProps<T> {
8
+ export interface CollapsableRowsProps<T extends RowData> {
9
9
  tableInstance: Table<T>;
10
10
  virtualizer: Virtualizer<Window, Element>;
11
11
  }
12
12
 
13
- export const CollapsableRows = <T extends object>({
13
+ export const CollapsableRows = <T extends RowData>({
14
14
  tableInstance,
15
15
  virtualizer,
16
16
  }: CollapsableRowsProps<T>): JSX.Element => {
@@ -21,17 +21,19 @@ export const CollapsableRows = <T extends object>({
21
21
  <Fragment>
22
22
  {virtualItems.map((virtualRow) => {
23
23
  const row = rows[virtualRow.index] as Row<T>;
24
+ const { getIsPreview } = row;
24
25
  return (
25
- <MTableRow
26
+ <TableRow
26
27
  key={row.id}
27
28
  data-index={virtualRow.index}
29
+ isPreview={getIsPreview()}
28
30
  ref={virtualizer.measureElement}
29
31
  >
30
32
  <CollapsableCell
31
33
  isDisabled={isCollapsableRowDisabled(tableInstance)}
32
34
  row={row}
33
35
  />
34
- </MTableRow>
36
+ </TableRow>
35
37
  );
36
38
  })}
37
39
  </Fragment>
@@ -1,15 +1,16 @@
1
- import { TableCell as MTableCell, TableRow as MTableRow } from "@mui/material";
2
- import { flexRender, Row, Table } from "@tanstack/react-table";
1
+ import { TableCell as MTableCell } from "@mui/material";
2
+ import { flexRender, Row, RowData, Table } from "@tanstack/react-table";
3
3
  import { Virtualizer } from "@tanstack/react-virtual";
4
4
  import React, { Fragment } from "react";
5
5
  import { getTableCellPadding } from "../TableCell/common/utils";
6
+ import { TableRow } from "../TableRow/tableRow.styles";
6
7
 
7
- export interface TableRowsProps<T> {
8
+ export interface TableRowsProps<T extends RowData> {
8
9
  tableInstance: Table<T>;
9
10
  virtualizer: Virtualizer<Window, Element>;
10
11
  }
11
12
 
12
- export const TableRows = <T extends object>({
13
+ export const TableRows = <T extends RowData>({
13
14
  tableInstance,
14
15
  virtualizer,
15
16
  }: TableRowsProps<T>): JSX.Element => {
@@ -20,10 +21,12 @@ export const TableRows = <T extends object>({
20
21
  <Fragment>
21
22
  {virtualItems.map((virtualRow) => {
22
23
  const row = rows[virtualRow.index] as Row<T>;
24
+ const { getIsPreview } = row;
23
25
  return (
24
- <MTableRow
26
+ <TableRow
25
27
  key={row.id}
26
28
  data-index={virtualRow.index}
29
+ isPreview={getIsPreview()}
27
30
  ref={virtualizer.measureElement}
28
31
  >
29
32
  {row.getVisibleCells().map((cell) => (
@@ -34,7 +37,7 @@ export const TableRows = <T extends object>({
34
37
  {flexRender(cell.column.columnDef.cell, cell.getContext())}
35
38
  </MTableCell>
36
39
  ))}
37
- </MTableRow>
40
+ </TableRow>
38
41
  );
39
42
  })}
40
43
  </Fragment>
@@ -0,0 +1,11 @@
1
+ import { DrawerProps as MDrawerProps } from "@mui/material";
2
+
3
+ export const DEFAULT_DRAWER_PROPS: Partial<MDrawerProps> = {
4
+ PaperProps: {
5
+ elevation: 2,
6
+ },
7
+ anchor: "right",
8
+ disableEnforceFocus: true,
9
+ disableScrollLock: true,
10
+ hideBackdrop: true,
11
+ };
@@ -0,0 +1,31 @@
1
+ import styled from "@emotion/styled";
2
+ import { mediaTabletUp } from "../../../../../../../../styles/common/mixins/breakpoints";
3
+ import { smokeMain } from "../../../../../../../../styles/common/mixins/colors";
4
+ import { DrawerTitle as DXDrawerTitle } from "../../../../../../../common/Drawer/components/DrawerTitle/drawerTitle";
5
+ import { Drawer as DXDrawer } from "../../../../../../../common/Drawer/drawer";
6
+
7
+ export const Drawer = styled(DXDrawer)`
8
+ &.MuiDrawer-modal {
9
+ pointer-events: none;
10
+
11
+ .MuiDrawer-paper {
12
+ border-left: 1px solid ${smokeMain};
13
+ box-shadow: -8px 0 8px -4px #10182808, 0 20px 24px -4px #10182814;
14
+ pointer-events: all;
15
+ max-width: min(506px, 84vw);
16
+ width: 100%;
17
+ }
18
+
19
+ ${mediaTabletUp} {
20
+ .MuiDrawer-paper {
21
+ max-width: min(506px, 50vw);
22
+ }
23
+ }
24
+ }
25
+ `;
26
+
27
+ export const DrawerTitle = styled(DXDrawerTitle)`
28
+ .MuiTypography-text-heading-small {
29
+ font-size: 20px;
30
+ }
31
+ `;
@@ -0,0 +1,52 @@
1
+ import {
2
+ Divider,
3
+ DrawerProps as MDrawerProps,
4
+ Typography as MTypography,
5
+ } from "@mui/material";
6
+ import { RowData, Table } from "@tanstack/react-table";
7
+ import React, { ReactNode } from "react";
8
+ import { TEXT_HEADING_SMALL } from "../../../../../../../../theme/common/typography";
9
+ import { DrawerContent } from "../../../../../../../common/Drawer/components/drawer.styles";
10
+ import { DEFAULT_DRAWER_PROPS } from "./common/constants";
11
+ import { Drawer, DrawerTitle } from "./rowDrawer.styles";
12
+
13
+ export interface RowDrawerProps<T extends RowData>
14
+ extends Omit<MDrawerProps, "content" | "title"> {
15
+ className?: string;
16
+ tableInstance: Table<T>;
17
+ title: ReactNode;
18
+ }
19
+
20
+ export const RowDrawer = <T extends RowData>({
21
+ children,
22
+ className,
23
+ tableInstance,
24
+ title,
25
+ ...props /* Spread props to allow for Mui Drawer specific prop overrides. */
26
+ }: RowDrawerProps<T>): JSX.Element => {
27
+ const { getIsRowPreview, resetRowPreview, toggleRowPreview } = tableInstance;
28
+ return (
29
+ <Drawer
30
+ {...DEFAULT_DRAWER_PROPS}
31
+ className={className}
32
+ onTransitionExited={resetRowPreview}
33
+ open={getIsRowPreview()}
34
+ {...props}
35
+ >
36
+ <DrawerTitle
37
+ onClose={(): void => toggleRowPreview?.()}
38
+ title={
39
+ typeof title === "string" ? (
40
+ <MTypography component="div" noWrap variant={TEXT_HEADING_SMALL}>
41
+ {title}
42
+ </MTypography>
43
+ ) : (
44
+ title
45
+ )
46
+ }
47
+ />
48
+ <Divider />
49
+ <DrawerContent>{children}</DrawerContent>
50
+ </Drawer>
51
+ );
52
+ };
@@ -0,0 +1,48 @@
1
+ import styled from "@emotion/styled";
2
+ import {
3
+ mediaDesktopSmallUp,
4
+ mediaTabletUp,
5
+ } from "../../../../../../../../../../styles/common/mixins/breakpoints";
6
+ import { textBody400 } from "../../../../../../../../../../styles/common/mixins/fonts";
7
+
8
+ export const Section = styled.div`
9
+ ${textBody400};
10
+ display: grid;
11
+ gap: 16px;
12
+ grid-auto-rows: minmax(40px, auto);
13
+ grid-template-columns: minmax(0, 1fr);
14
+ overflow-wrap: break-word;
15
+ padding: 16px 24px;
16
+
17
+ > .MuiGrid-root {
18
+ display: grid;
19
+ gap: 4px;
20
+ grid-column: 1 / -1;
21
+ grid-template-columns: inherit;
22
+ }
23
+
24
+ > .MuiButton-textPrimary {
25
+ grid-column: 1 / -1;
26
+ justify-self: flex-start;
27
+ text-align: left;
28
+ text-transform: none;
29
+ }
30
+
31
+ ${mediaTabletUp} {
32
+ gap: 0 8px;
33
+ grid-template-columns: repeat(2, minmax(0, 1fr));
34
+ padding: 8px 24px;
35
+
36
+ > .MuiGrid-root {
37
+ display: contents;
38
+
39
+ > * {
40
+ margin: 10px 0;
41
+ }
42
+ }
43
+ }
44
+
45
+ ${mediaDesktopSmallUp} {
46
+ grid-template-columns: 194px minmax(0, 1fr);
47
+ }
48
+ `;
@@ -0,0 +1,53 @@
1
+ import { Grid, Typography } from "@mui/material";
2
+ import { RowData, Table } from "@tanstack/react-table";
3
+ import React from "react";
4
+ import { ListConfig } from "../../../../../../../../../../config/entities";
5
+ import { TEXT_BODY_400 } from "../../../../../../../../../../theme/common/typography";
6
+ import { ButtonTextPrimary } from "../../../../../../../../../common/Button/components/ButtonTextPrimary/buttonTextPrimary";
7
+ import { ComponentCreator } from "../../../../../../../../../ComponentCreator/ComponentCreator";
8
+ import { Section } from "./rowDetail.styles";
9
+
10
+ const MIN_COLUMNS = 6;
11
+
12
+ interface RowDetailProps<T extends RowData> {
13
+ className?: string;
14
+ columns: ListConfig<T>["columns"];
15
+ expanded?: boolean;
16
+ minColumns?: number;
17
+ tableInstance: Table<T>;
18
+ }
19
+
20
+ export const RowDetail = <T extends RowData>({
21
+ className,
22
+ columns,
23
+ expanded = true,
24
+ minColumns = MIN_COLUMNS,
25
+ tableInstance,
26
+ }: RowDetailProps<T>): JSX.Element | null => {
27
+ const [showMore, setShowMore] = React.useState<boolean>(expanded);
28
+ const { getRowPreviewRow } = tableInstance;
29
+ const { original: rowData } = getRowPreviewRow() || {};
30
+ const visibleColumns = showMore ? columns : columns.slice(0, minColumns);
31
+ const buttonText = showMore ? "Show less" : "Show more";
32
+ const onToggleShowMore = (): void => setShowMore(!showMore);
33
+ if (!rowData) return null;
34
+ return (
35
+ <Section className={className}>
36
+ {visibleColumns.map(({ componentConfig, header }, i) => (
37
+ <Grid key={i}>
38
+ <Typography
39
+ color="ink.light"
40
+ variant={TEXT_BODY_400}
41
+ {...componentConfig.props?.TypographyProps}
42
+ >
43
+ {header}
44
+ </Typography>
45
+ <ComponentCreator components={[componentConfig]} response={rowData} />
46
+ </Grid>
47
+ ))}
48
+ <ButtonTextPrimary onClick={onToggleShowMore}>
49
+ {buttonText}
50
+ </ButtonTextPrimary>
51
+ </Section>
52
+ );
53
+ };
@@ -0,0 +1,12 @@
1
+ import styled from "@emotion/styled";
2
+
3
+ export const Section = styled.div`
4
+ display: grid;
5
+ gap: 16px;
6
+ padding: 16px 24px 24px;
7
+
8
+ .MuiTypography-text-heading-small {
9
+ font-size: 18px;
10
+ line-height: 26px;
11
+ }
12
+ `;
@@ -0,0 +1,25 @@
1
+ import { Typography } from "@mui/material";
2
+ import React, { ReactNode } from "react";
3
+ import { TEXT_HEADING_SMALL } from "../../../../../../../../theme/common/typography";
4
+ import { Section as PreviewSection } from "./section.styles";
5
+
6
+ export interface SectionProps {
7
+ children?: ReactNode | ReactNode[];
8
+ className?: string;
9
+ title?: ReactNode;
10
+ }
11
+
12
+ export const Section = ({
13
+ children,
14
+ className,
15
+ title,
16
+ }: SectionProps): JSX.Element => {
17
+ return (
18
+ <PreviewSection className={className}>
19
+ <Typography component="div" variant={TEXT_HEADING_SMALL}>
20
+ {title}
21
+ </Typography>
22
+ {children}
23
+ </PreviewSection>
24
+ );
25
+ };
@@ -0,0 +1,19 @@
1
+ import { RowData, Table } from "@tanstack/react-table";
2
+ import React from "react";
3
+ import { ComponentsConfig } from "../../../../../../config/entities";
4
+ import { ComponentCreator } from "../../../../../ComponentCreator/ComponentCreator";
5
+
6
+ export interface RowPreviewProps<T extends RowData> {
7
+ rowPreviewView?: ComponentsConfig;
8
+ tableInstance: Table<T>;
9
+ }
10
+
11
+ export const RowPreview = <T extends RowData>({
12
+ rowPreviewView,
13
+ tableInstance,
14
+ }: RowPreviewProps<T>): JSX.Element | null => {
15
+ if (!rowPreviewView) return null;
16
+ return (
17
+ <ComponentCreator components={rowPreviewView} response={tableInstance} />
18
+ );
19
+ };
@@ -1,18 +1,18 @@
1
1
  import { Typography } from "@mui/material";
2
- import { Row } from "@tanstack/react-table";
2
+ import { Row, RowData } from "@tanstack/react-table";
3
3
  import React from "react";
4
4
  import { ComponentsConfig } from "../../../../../../config/entities";
5
5
  import { TEXT_BODY_400 } from "../../../../../../theme/common/typography";
6
6
  import { ComponentCreator } from "../../../../../ComponentCreator/ComponentCreator";
7
7
  import { RowSelection as RowSelectionActions } from "./rowSelection.styles";
8
8
 
9
- export interface RowSelectionProps<T> {
9
+ export interface RowSelectionProps<T extends RowData> {
10
10
  className?: string;
11
11
  rows: Row<T>[];
12
12
  rowSelectionView?: ComponentsConfig;
13
13
  }
14
14
 
15
- export const RowSelection = <T extends object>({
15
+ export const RowSelection = <T extends RowData>({
16
16
  className,
17
17
  rows,
18
18
  rowSelectionView,
@@ -1,4 +1,4 @@
1
- import { Table } from "@tanstack/react-table";
1
+ import { RowData, Table } from "@tanstack/react-table";
2
2
  import React, { Fragment } from "react";
3
3
  import { ListViewConfig } from "../../../../config/entities";
4
4
  import { useExploreState } from "../../../../hooks/useExploreState";
@@ -7,16 +7,17 @@ import { getEditColumnOptions, isAnyRowSelected } from "../../common/utils";
7
7
  import { CheckboxMenu } from "../CheckboxMenu/checkboxMenu";
8
8
  import { DownloadEntityResults } from "../DownloadEntityResults/downloadEntityResults";
9
9
  import { PaginationSummary } from "../PaginationSummary/paginationSummary";
10
+ import { RowPreview } from "./components/RowPreview/rowPreview";
10
11
  import { RowSelection } from "./components/RowSelection/rowSelection";
11
12
  import { Toolbar, ToolbarActions } from "./tableToolbar.styles";
12
13
 
13
- export interface TableToolbarProps<T> {
14
+ export interface TableToolbarProps<T extends RowData> {
14
15
  listView?: ListViewConfig;
15
16
  rowDirection: ROW_DIRECTION;
16
17
  tableInstance: Table<T>;
17
18
  }
18
19
 
19
- export const TableToolbar = <T extends object>({
20
+ export const TableToolbar = <T extends RowData>({
20
21
  listView,
21
22
  rowDirection,
22
23
  tableInstance,
@@ -25,7 +26,7 @@ export const TableToolbar = <T extends object>({
25
26
  const { paginationState } = exploreState;
26
27
  const { currentPage, pages, pageSize, rows } = paginationState;
27
28
  const { getSelectedRowModel, resetColumnVisibility } = tableInstance;
28
- const { enableDownload } = listView || {};
29
+ const { enableDownload, rowPreviewView } = listView || {};
29
30
  const isLastPage = currentPage === pages;
30
31
  const editColumnOptions = getEditColumnOptions(tableInstance);
31
32
  const showToolbar =
@@ -70,6 +71,10 @@ export const TableToolbar = <T extends object>({
70
71
  </ToolbarActions>
71
72
  </Toolbar>
72
73
  )}
74
+ <RowPreview
75
+ rowPreviewView={rowPreviewView}
76
+ tableInstance={tableInstance}
77
+ />
73
78
  </Fragment>
74
79
  );
75
80
  };
@@ -0,0 +1,65 @@
1
+ import {
2
+ functionalUpdate,
3
+ InitialTableState,
4
+ makeStateUpdater,
5
+ Row,
6
+ RowData,
7
+ Table,
8
+ TableFeature,
9
+ TableOptionsResolved,
10
+ TableState,
11
+ Updater,
12
+ } from "@tanstack/react-table";
13
+ import { RowPreviewState } from "./entities";
14
+ import {
15
+ getIsPreview,
16
+ getIsRowPreview,
17
+ getRowPreviewRow,
18
+ togglePreview,
19
+ toggleRowPreview,
20
+ } from "./utils";
21
+
22
+ export const ROW_PREVIEW: TableFeature = {
23
+ createRow: <T extends RowData>(row: Row<T>, table: Table<T>): void => {
24
+ row.getIsPreview = (): boolean => {
25
+ return getIsPreview(row, table);
26
+ };
27
+ row.togglePreview = (): void => {
28
+ togglePreview(row, table);
29
+ };
30
+ },
31
+ createTable: <T extends RowData>(table: Table<T>): void => {
32
+ table.getIsRowPreview = (): boolean => {
33
+ return getIsRowPreview(table);
34
+ };
35
+ table.getRowPreviewRow = (): Row<T> | undefined => {
36
+ return getRowPreviewRow(table);
37
+ };
38
+ table.resetRowPreview = (): void => {
39
+ table.setRowPreview(undefined);
40
+ };
41
+ table.setRowPreview = (updater: Updater<RowPreviewState>): void => {
42
+ const safeUpdater: Updater<RowPreviewState> = (old: RowPreviewState) => {
43
+ return functionalUpdate(updater, old);
44
+ };
45
+ return table.options.onRowPreviewChange?.(safeUpdater);
46
+ };
47
+ table.toggleRowPreview = (): void => {
48
+ toggleRowPreview(table);
49
+ };
50
+ },
51
+ getDefaultOptions: <T extends RowData>(
52
+ table: Table<T>
53
+ ): Partial<TableOptionsResolved<T>> => {
54
+ return {
55
+ enableRowPreview: true,
56
+ onRowPreviewChange: makeStateUpdater("rowPreview", table),
57
+ };
58
+ },
59
+ getInitialState: (initialState?: InitialTableState): Partial<TableState> => {
60
+ return {
61
+ ...initialState,
62
+ rowPreview: undefined,
63
+ } as Partial<TableState>;
64
+ },
65
+ };
@@ -0,0 +1,25 @@
1
+ import { OnChangeFn, Row, RowData, Updater } from "@tanstack/react-table";
2
+
3
+ export interface RowPreviewInstance<T extends RowData> {
4
+ getIsRowPreview: () => boolean /* Is row preview open */;
5
+ getRowPreviewRow: () => Row<T> | undefined;
6
+ resetRowPreview: () => void;
7
+ setRowPreview: (updater: Updater<RowPreviewState>) => void;
8
+ toggleRowPreview: () => void;
9
+ }
10
+
11
+ export interface RowPreviewOptions {
12
+ enableRowPreview?: boolean;
13
+ onRowPreviewChange?: OnChangeFn<RowPreviewState>;
14
+ }
15
+
16
+ export interface RowPreviewRow {
17
+ getIsPreview: () => boolean /* Is row previewed */;
18
+ togglePreview: () => void;
19
+ }
20
+
21
+ export type RowPreviewState = { [id: string]: boolean } | undefined;
22
+
23
+ export interface RowPreviewTableState {
24
+ rowPreview: RowPreviewState;
25
+ }