@databiosphere/findable-ui 3.1.0 → 4.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 (83) hide show
  1. package/lib/components/Detail/components/DetailViewTable/detailViewTable.d.ts +3 -2
  2. package/lib/components/Detail/components/DetailViewTable/detailViewTable.js +14 -2
  3. package/lib/components/Detail/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.js +4 -1
  4. package/lib/components/Detail/components/Table/components/TableRows/tableRows.d.ts +1 -1
  5. package/lib/components/Detail/components/Table/components/TableRows/tableRows.js +21 -2
  6. package/lib/components/Detail/components/Table/table.d.ts +3 -1
  7. package/lib/components/Detail/components/Table/table.js +3 -7
  8. package/lib/components/Links/common/constants.d.ts +1 -0
  9. package/lib/components/Links/common/constants.js +4 -0
  10. package/lib/components/Links/common/entities.d.ts +8 -0
  11. package/lib/components/Links/common/utils.d.ts +13 -0
  12. package/lib/components/Links/common/utils.js +21 -1
  13. package/lib/components/Links/components/Link/components/ExploreViewLink/exploreViewLink.d.ts +7 -0
  14. package/lib/components/Links/components/Link/components/ExploreViewLink/exploreViewLink.js +148 -0
  15. package/lib/components/Links/components/Link/link.d.ts +2 -2
  16. package/lib/components/Links/components/Link/link.js +22 -6
  17. package/lib/components/Table/common/gridTable.styles.js +9 -1
  18. package/lib/components/Table/common/utils.d.ts +6 -0
  19. package/lib/components/Table/common/utils.js +10 -1
  20. package/lib/components/Table/components/TableCell/components/CollapsableCell/collapsableCell.d.ts +4 -3
  21. package/lib/components/Table/components/TableCell/components/CollapsableCell/collapsableCell.js +21 -3
  22. package/lib/components/Table/components/TableCell/components/CollapsableCell/collapsableCell.styles.js +4 -0
  23. package/lib/components/Table/components/TableHead/tableHead.js +4 -1
  24. package/lib/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.js +2 -1
  25. package/lib/components/TableCreator/common/utils.js +1 -5
  26. package/lib/components/common/CustomIcon/components/AddLinkIcon/addLinkIcon.d.ts +3 -0
  27. package/lib/components/common/CustomIcon/components/AddLinkIcon/addLinkIcon.js +25 -0
  28. package/lib/components/common/CustomIcon/components/UnLinkIcon/unLinkIcon.d.ts +3 -0
  29. package/lib/components/common/CustomIcon/components/UnLinkIcon/unLinkIcon.js +25 -0
  30. package/lib/components/common/Progress/components/CircularProgress/circularProgress.d.ts +7 -0
  31. package/lib/components/common/Progress/components/CircularProgress/circularProgress.js +28 -0
  32. package/lib/components/common/Progress/components/CircularProgress/circularProgress.styles.d.ts +5 -0
  33. package/lib/components/common/Progress/components/CircularProgress/circularProgress.styles.js +11 -0
  34. package/lib/components/common/Progress/components/CircularProgress/components/CircularProgressTrack/circularProgressTrack.d.ts +7 -0
  35. package/lib/components/common/Progress/components/CircularProgress/components/CircularProgressTrack/circularProgressTrack.js +44 -0
  36. package/lib/components/common/Progress/components/CircularProgress/components/CircularProgressTrack/circularProgressTrack.styles.d.ts +3 -0
  37. package/lib/components/common/Progress/components/CircularProgress/components/CircularProgressTrack/circularProgressTrack.styles.js +32 -0
  38. package/lib/providers/exploreState/initializer/constants.d.ts +2 -0
  39. package/lib/providers/exploreState/initializer/constants.js +7 -1
  40. package/lib/providers/exploreState/initializer/utils.js +1 -8
  41. package/lib/providers/exploreState/payloads/entities.d.ts +8 -1
  42. package/lib/providers/exploreState/utils.d.ts +4 -2
  43. package/lib/providers/exploreState/utils.js +4 -4
  44. package/lib/providers/exploreState.d.ts +10 -2
  45. package/lib/providers/exploreState.js +13 -0
  46. package/lib/styles/common/mixins/colors.d.ts +3 -3
  47. package/lib/styles/common/mixins/colors.js +7 -7
  48. package/lib/theme/common/components.d.ts +6 -0
  49. package/lib/theme/common/components.js +31 -1
  50. package/lib/theme/theme.js +1 -0
  51. package/package.json +1 -1
  52. package/src/components/Detail/components/DetailViewTable/detailViewTable.tsx +4 -2
  53. package/src/components/Detail/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.tsx +6 -1
  54. package/src/components/Detail/components/Table/components/TableRows/tableRows.tsx +29 -6
  55. package/src/components/Detail/components/Table/table.tsx +6 -1
  56. package/src/components/Links/common/constants.ts +1 -0
  57. package/src/components/Links/common/entities.ts +11 -0
  58. package/src/components/Links/common/utils.ts +28 -0
  59. package/src/components/Links/components/Link/components/ExploreViewLink/exploreViewLink.tsx +172 -0
  60. package/src/components/Links/components/Link/link.tsx +36 -14
  61. package/src/components/Table/common/gridTable.styles.ts +9 -1
  62. package/src/components/Table/common/utils.ts +9 -0
  63. package/src/components/Table/components/TableCell/components/CollapsableCell/collapsableCell.styles.ts +4 -0
  64. package/src/components/Table/components/TableCell/components/CollapsableCell/collapsableCell.tsx +26 -4
  65. package/src/components/Table/components/TableHead/tableHead.tsx +32 -21
  66. package/src/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.tsx +5 -1
  67. package/src/components/TableCreator/common/utils.ts +1 -0
  68. package/src/components/common/CustomIcon/components/AddLinkIcon/addLinkIcon.tsx +18 -0
  69. package/src/components/common/CustomIcon/components/UnLinkIcon/unLinkIcon.tsx +18 -0
  70. package/src/components/common/Progress/components/CircularProgress/circularProgress.styles.ts +6 -0
  71. package/src/components/common/Progress/components/CircularProgress/circularProgress.tsx +26 -0
  72. package/src/components/common/Progress/components/CircularProgress/components/CircularProgressTrack/circularProgressTrack.styles.ts +33 -0
  73. package/src/components/common/Progress/components/CircularProgress/components/CircularProgressTrack/circularProgressTrack.tsx +23 -0
  74. package/src/providers/exploreState/initializer/constants.ts +8 -0
  75. package/src/providers/exploreState/initializer/utils.ts +6 -9
  76. package/src/providers/exploreState/payloads/entities.ts +8 -0
  77. package/src/providers/exploreState/utils.ts +11 -7
  78. package/src/providers/exploreState.tsx +33 -0
  79. package/src/styles/common/mixins/colors.ts +6 -6
  80. package/src/theme/common/components.ts +32 -0
  81. package/src/theme/theme.ts +1 -0
  82. package/types/data-explorer-ui.d.ts +12 -0
  83. package/src/components/Detail/components/Table/components/TableHead/tableHead.tsx +0 -34
@@ -1,7 +1,8 @@
1
1
  import { ColumnDef } from "@tanstack/react-table";
2
2
  import { ReactNode } from "react";
3
3
  import { FlatPaper, FluidPaper, RoundedPaper } from "../../../common/Paper/paper.styles";
4
- interface DetailViewTableProps<T extends object> {
4
+ import { TableProps } from "../Table/table";
5
+ interface DetailViewTableProps<T extends object> extends TableProps<T> {
5
6
  className?: string;
6
7
  columns: ColumnDef<T>[];
7
8
  gridTemplateColumns: string;
@@ -10,5 +11,5 @@ interface DetailViewTableProps<T extends object> {
10
11
  Paper?: typeof FlatPaper | typeof FluidPaper | typeof RoundedPaper;
11
12
  tools?: ReactNode;
12
13
  }
13
- export declare const DetailViewTable: <T extends object>({ className, columns, gridTemplateColumns, items, noResultsTitle, Paper, tools, }: DetailViewTableProps<T>) => JSX.Element;
14
+ export declare const DetailViewTable: <T extends object>({ className, columns, gridTemplateColumns, items, noResultsTitle, Paper, tools, ...tableProps }: DetailViewTableProps<T>) => JSX.Element;
14
15
  export {};
@@ -1,4 +1,15 @@
1
1
  "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
2
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
15
  };
@@ -9,10 +20,11 @@ const paper_styles_1 = require("../../../common/Paper/paper.styles");
9
20
  const noResults_1 = require("../../../NoResults/noResults");
10
21
  const tableToolbar_styles_1 = require("../../../Table/components/TableToolbar/tableToolbar.styles");
11
22
  const table_1 = require("../Table/table");
12
- const DetailViewTable = ({ className, columns, gridTemplateColumns, items, noResultsTitle, Paper = paper_styles_1.RoundedPaper, tools, }) => {
23
+ const DetailViewTable = (_a) => {
24
+ var { className, columns, gridTemplateColumns, items, noResultsTitle, Paper = paper_styles_1.RoundedPaper, tools } = _a, tableProps = __rest(_a, ["className", "columns", "gridTemplateColumns", "items", "noResultsTitle", "Paper", "tools"]);
13
25
  return items.length > 0 ? (react_1.default.createElement(Paper, { className: className },
14
26
  react_1.default.createElement(paper_styles_1.GridPaper, null,
15
27
  tools && react_1.default.createElement(tableToolbar_styles_1.Toolbar, { variant: "table" }, tools),
16
- react_1.default.createElement(table_1.Table, { columns: columns, gridTemplateColumns: gridTemplateColumns, items: items })))) : (react_1.default.createElement(noResults_1.NoResults, { Paper: Paper, title: noResultsTitle }));
28
+ react_1.default.createElement(table_1.Table, Object.assign({ columns: columns, gridTemplateColumns: gridTemplateColumns, items: items }, tableProps))))) : (react_1.default.createElement(noResults_1.NoResults, { Paper: Paper, title: noResultsTitle }));
17
29
  };
18
30
  exports.DetailViewTable = DetailViewTable;
@@ -27,14 +27,17 @@ exports.CollapsableRows = void 0;
27
27
  const material_1 = require("@mui/material");
28
28
  const react_1 = __importStar(require("react"));
29
29
  const uuid_1 = require("uuid");
30
+ const utils_1 = require("../../../../../../../Table/common/utils");
30
31
  const collapsableCell_1 = require("../../../../../../../Table/components/TableCell/components/CollapsableCell/collapsableCell");
31
32
  const CollapsableRows = ({ tableInstance, }) => {
32
33
  const { getRowModel } = tableInstance;
33
34
  const { rows } = getRowModel();
34
35
  const uuid = (0, uuid_1.v4)(); // Generate a unique ID for the collapsable rows.
35
36
  return (react_1.default.createElement(react_1.Fragment, null, rows.map((row) => {
37
+ if (row.depth > 0)
38
+ return null; // Hide sub rows.
36
39
  return (react_1.default.createElement(material_1.TableRow, { key: `${uuid}${row.id}` },
37
- react_1.default.createElement(collapsableCell_1.CollapsableCell, { row: row })));
40
+ react_1.default.createElement(collapsableCell_1.CollapsableCell, { isDisabled: (0, utils_1.isCollapsableRowDisabled)(tableInstance), row: row })));
38
41
  })));
39
42
  };
40
43
  exports.CollapsableRows = CollapsableRows;
@@ -5,4 +5,4 @@ export interface TableRowsProps<T> {
5
5
  tableInstance: Table<T>;
6
6
  tableView?: TableView;
7
7
  }
8
- export declare const TableRows: <T extends object>({ tableInstance, tableView, }: TableRowsProps<T>) => JSX.Element;
8
+ export declare const TableRows: <T extends unknown>({ tableInstance, tableView, }: TableRowsProps<T>) => JSX.Element;
@@ -27,15 +27,34 @@ exports.TableRows = void 0;
27
27
  const material_1 = require("@mui/material");
28
28
  const react_table_1 = require("@tanstack/react-table");
29
29
  const react_1 = __importStar(require("react"));
30
+ const utils_1 = require("../../../../../Table/components/TableCell/common/utils");
30
31
  const TableRows = ({ tableInstance, tableView, }) => {
31
32
  const { getRowModel } = tableInstance;
32
33
  const { rows } = getRowModel();
33
34
  const { tableCell } = tableView || {};
34
35
  const { size: tableCellSize = "medium" } = tableCell || {};
35
36
  return (react_1.default.createElement(react_1.Fragment, null, rows.map((row) => {
36
- return (react_1.default.createElement(material_1.TableRow, { key: row.id }, row.getVisibleCells().map((cell) => {
37
- return (react_1.default.createElement(material_1.TableCell, { key: cell.id, size: tableCellSize }, (0, react_table_1.flexRender)(cell.column.columnDef.cell, cell.getContext())));
37
+ return (react_1.default.createElement(material_1.TableRow, { id: getRowId(row), key: row.id }, row.getVisibleCells().map((cell) => {
38
+ if (cell.getIsAggregated())
39
+ return null; // Display of aggregated cells is currently not supported.
40
+ if (cell.getIsPlaceholder())
41
+ return null; // Display of placeholder cells is currently not supported.
42
+ return (react_1.default.createElement(material_1.TableCell, { key: cell.id, padding: (0, utils_1.getTableCellPadding)(cell.column.id), size: tableCellSize }, (0, react_table_1.flexRender)(cell.column.columnDef.cell, cell.getContext())));
38
43
  })));
39
44
  })));
40
45
  };
41
46
  exports.TableRows = TableRows;
47
+ /**
48
+ * Returns identifier for a row.
49
+ * @param row - Row.
50
+ * @returns row identifier.
51
+ */
52
+ function getRowId(row) {
53
+ const { depth, getIsGrouped, id } = row;
54
+ if (getIsGrouped()) {
55
+ return `grouped-row-${id}`;
56
+ }
57
+ if (depth > 0) {
58
+ return `sub-row-${id}`;
59
+ }
60
+ }
@@ -1,6 +1,7 @@
1
1
  /// <reference types="react" />
2
2
  import { TableCellProps as MTableCellProps, TableContainerProps as MTableContainerProps, TableProps as MTableProps } from "@mui/material";
3
3
  import { ColumnDef } from "@tanstack/react-table";
4
+ import { TableOptions } from "@tanstack/table-core";
4
5
  export interface TableView {
5
6
  table?: Partial<MTableProps>;
6
7
  tableCell?: Partial<MTableCellProps>;
@@ -12,6 +13,7 @@ export interface TableProps<T extends object> {
12
13
  columns: ColumnDef<T>[];
13
14
  gridTemplateColumns: string;
14
15
  items: T[];
16
+ tableOptions?: Partial<TableOptions<T>>;
15
17
  tableView?: TableView;
16
18
  }
17
- export declare const Table: <T extends object>({ className, collapsable, columns, gridTemplateColumns, items, tableView, }: TableProps<T>) => JSX.Element;
19
+ export declare const Table: <T extends object>({ className, collapsable, columns, gridTemplateColumns, items, tableOptions, tableView, }: TableProps<T>) => JSX.Element;
@@ -10,21 +10,17 @@ const react_1 = __importDefault(require("react"));
10
10
  const useBreakpointHelper_1 = require("../../../../hooks/useBreakpointHelper");
11
11
  const breakpoints_1 = require("../../../../theme/common/breakpoints");
12
12
  const entities_1 = require("../../../Table/common/entities");
13
+ const tableHead_1 = require("../../../Table/components/TableHead/tableHead");
13
14
  const table_styles_1 = require("../../../Table/table.styles");
14
15
  const utils_1 = require("./common/utils");
15
16
  const tableBody_1 = require("./components/TableBody/tableBody");
16
- const tableHead_1 = require("./components/TableHead/tableHead");
17
- const Table = ({ className, collapsable = true, columns, gridTemplateColumns, items, tableView, }) => {
17
+ const Table = ({ className, collapsable = true, columns, gridTemplateColumns, items, tableOptions, tableView, }) => {
18
18
  const tabletDown = (0, useBreakpointHelper_1.useBreakpointHelper)(useBreakpointHelper_1.BREAKPOINT_FN_NAME.DOWN, breakpoints_1.TABLET);
19
19
  const rowDirection = collapsable && tabletDown ? entities_1.ROW_DIRECTION.VERTICAL : entities_1.ROW_DIRECTION.DEFAULT;
20
20
  const { table, tableContainer } = tableView || {};
21
21
  const { stickyHeader = false } = table || {};
22
22
  const { sx: tableContainerSx } = tableContainer || {};
23
- const tableInstance = (0, react_table_1.useReactTable)({
24
- columns: (0, utils_1.generateColumnDefinitions)(columns),
25
- data: items,
26
- getCoreRowModel: (0, react_table_1.getCoreRowModel)(),
27
- });
23
+ const tableInstance = (0, react_table_1.useReactTable)(Object.assign({ columns: (0, utils_1.generateColumnDefinitions)(columns), data: items, enableSorting: false, getCoreRowModel: (0, react_table_1.getCoreRowModel)() }, tableOptions));
28
24
  return (react_1.default.createElement(material_1.TableContainer, { className: className, sx: tableContainerSx },
29
25
  react_1.default.createElement(table_styles_1.GridTable, { collapsable: collapsable, gridTemplateColumns: gridTemplateColumns, stickyHeader: rowDirection === entities_1.ROW_DIRECTION.DEFAULT && stickyHeader },
30
26
  react_1.default.createElement(tableHead_1.TableHead, { rowDirection: rowDirection, tableInstance: tableInstance }),
@@ -0,0 +1 @@
1
+ export declare const URL_OBJECT_KEYS: string[];
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.URL_OBJECT_KEYS = void 0;
4
+ exports.URL_OBJECT_KEYS = ["href", "query"];
@@ -1,4 +1,12 @@
1
+ /// <reference types="node" />
2
+ import { UrlObject } from "url";
1
3
  export declare enum ANCHOR_TARGET {
2
4
  BLANK = "_blank",
3
5
  SELF = "_self"
4
6
  }
7
+ export declare type StrictUrlObject = Omit<UrlObject, "href" | "query"> & {
8
+ href: string;
9
+ query: string;
10
+ };
11
+ export declare type Url = string | UrlObjectWithHrefAndQuery;
12
+ export declare type UrlObjectWithHrefAndQuery = Pick<StrictUrlObject, "href" | "query">;
@@ -1,6 +1,19 @@
1
+ import { Url, UrlObjectWithHrefAndQuery } from "./entities";
1
2
  /**
2
3
  * Returns true if the given link is an internal link.
3
4
  * @param link - Link.
4
5
  * @returns true if the given link is an internal link.
5
6
  */
6
7
  export declare function isClientSideNavigation(link: string): boolean;
8
+ /**
9
+ * Returns true if the given url is a URL object with href and query.
10
+ * @param value - URL.
11
+ * @returns true if the given url is a URL object with href and query.
12
+ */
13
+ export declare function isURLObjectWithHrefAndQuery(value: Url): value is UrlObjectWithHrefAndQuery;
14
+ /**
15
+ * Returns true if the given url is a string.
16
+ * @param value - URL.
17
+ * @returns true if the given url is a string.
18
+ */
19
+ export declare function isURLString(value: Url): value is string;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isClientSideNavigation = void 0;
3
+ exports.isURLString = exports.isURLObjectWithHrefAndQuery = exports.isClientSideNavigation = void 0;
4
+ const constants_1 = require("./constants");
4
5
  /**
5
6
  * Returns true if the given link is an internal link.
6
7
  * @param link - Link.
@@ -10,3 +11,22 @@ function isClientSideNavigation(link) {
10
11
  return /^\/(?!\/)/.test(link);
11
12
  }
12
13
  exports.isClientSideNavigation = isClientSideNavigation;
14
+ /**
15
+ * Returns true if the given url is a URL object with href and query.
16
+ * @param value - URL.
17
+ * @returns true if the given url is a URL object with href and query.
18
+ */
19
+ function isURLObjectWithHrefAndQuery(value) {
20
+ return (typeof value !== "string" &&
21
+ Object.entries(value).every(([key, value]) => constants_1.URL_OBJECT_KEYS.includes(key) && !!value));
22
+ }
23
+ exports.isURLObjectWithHrefAndQuery = isURLObjectWithHrefAndQuery;
24
+ /**
25
+ * Returns true if the given url is a string.
26
+ * @param value - URL.
27
+ * @returns true if the given url is a string.
28
+ */
29
+ function isURLString(value) {
30
+ return typeof value === "string";
31
+ }
32
+ exports.isURLString = isURLString;
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import { UrlObjectWithHrefAndQuery } from "../../../../common/entities";
3
+ import { LinkProps } from "../../link";
4
+ export interface ExploreViewLinkProps extends Omit<LinkProps, "copyable" | "noWrap" | "url"> {
5
+ url: UrlObjectWithHrefAndQuery;
6
+ }
7
+ export declare const ExploreViewLink: ({ className, label, onClick, target, url, }: ExploreViewLinkProps) => JSX.Element;
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.ExploreViewLink = void 0;
30
+ const link_1 = __importDefault(require("next/link"));
31
+ const react_1 = __importStar(require("react"));
32
+ const useExploreState_1 = require("../../../../../../hooks/useExploreState");
33
+ const exploreState_1 = require("../../../../../../providers/exploreState");
34
+ const entities_1 = require("../../../../common/entities");
35
+ const PARAM_FILTER = "filter";
36
+ const ExploreViewLink = ({ className, label, onClick, target = entities_1.ANCHOR_TARGET.SELF, url, }) => {
37
+ const { exploreDispatch, exploreState } = (0, useExploreState_1.useExploreState)();
38
+ if (!isValidExploreURL(url, exploreState)) {
39
+ throwError(url);
40
+ }
41
+ const onNavigate = (0, react_1.useCallback)(() => {
42
+ const entityListType = getEntityListType(url.href);
43
+ const filters = getSelectedFilters(url.query);
44
+ exploreDispatch({
45
+ payload: { entityListType, filters },
46
+ type: exploreState_1.ExploreActionKind.UpdateEntityFilters,
47
+ });
48
+ onClick === null || onClick === void 0 ? void 0 : onClick();
49
+ }, [exploreDispatch, onClick, url]);
50
+ return (react_1.default.createElement(link_1.default, { className: className, href: url.href, onClick: onNavigate, rel: "noopener", target: target }, label));
51
+ };
52
+ exports.ExploreViewLink = ExploreViewLink;
53
+ /**
54
+ * Returns the entity list type "entityListType" inferred from the given href.
55
+ * @param href - Href.
56
+ * @returns entity list type.
57
+ */
58
+ function getEntityListType(href) {
59
+ return href.substring(1);
60
+ }
61
+ /**
62
+ * Returns the selected filters from the given query.
63
+ * @param query - Query.
64
+ * @returns selected filters.
65
+ */
66
+ function getSelectedFilters(query) {
67
+ const decodedQuery = decodeURIComponent(query);
68
+ const parsedQuery = JSON.parse(decodedQuery);
69
+ return parsedQuery[PARAM_FILTER];
70
+ }
71
+ /**
72
+ * Returns true if the given value is a SelectedFilter.
73
+ * @param value - Value.
74
+ * @returns true if the given value is a SelectedFilter.
75
+ */
76
+ function isSelectedFilter(value) {
77
+ return (typeof value === "object" &&
78
+ value !== null &&
79
+ "categoryKey" in value &&
80
+ "value" in value);
81
+ }
82
+ /**
83
+ * Returns true if the given query string is a valid JSON string.
84
+ * @param query - Query string.
85
+ * @returns true if the given query string is a valid JSON string.
86
+ */
87
+ function isValidJsonString(query) {
88
+ try {
89
+ JSON.parse(query);
90
+ return true;
91
+ }
92
+ catch (e) {
93
+ return false;
94
+ }
95
+ }
96
+ /**
97
+ * Returns true if the given explore link is valid.
98
+ * @param url - Explore link URL.
99
+ * @param exploreState - Explore state.
100
+ * @returns true if the given explore link is valid.
101
+ */
102
+ function isValidExploreURL(url, exploreState) {
103
+ const validHref = isValidHref(url, exploreState);
104
+ const validQuery = isValidQuery(url);
105
+ return validHref && validQuery;
106
+ }
107
+ /**
108
+ * Returns true if the given href is a configured key in the explore state's entityPageState.
109
+ * @param url - Explore link URL.
110
+ * @param exploreState - Explore state.
111
+ * @returns true if the given href is configured in the explore state.
112
+ */
113
+ function isValidHref(url, exploreState) {
114
+ const { entityPageState } = exploreState;
115
+ const { href } = url;
116
+ return href.startsWith("/") && href.substring(1) in entityPageState;
117
+ }
118
+ /**
119
+ * Returns true if the given explore query is valid.
120
+ * @param url - Explore link URL.
121
+ * @returns true if the given explore query is valid.
122
+ */
123
+ function isValidQuery(url) {
124
+ const { query } = url;
125
+ // Decode and parse the query.
126
+ const decodedQuery = decodeURIComponent(query);
127
+ // Query should be a valid JSON string.
128
+ if (isValidJsonString(decodedQuery)) {
129
+ const parsedQuery = JSON.parse(decodedQuery);
130
+ // Query should contain "filter" key.
131
+ if (PARAM_FILTER in parsedQuery) {
132
+ const filters = parsedQuery[PARAM_FILTER];
133
+ // Filter should be an array.
134
+ if (Array.isArray(filters)) {
135
+ // Filter should contain only SelectedFilter objects.
136
+ return filters.every(isSelectedFilter);
137
+ }
138
+ }
139
+ }
140
+ return false;
141
+ }
142
+ /**
143
+ * Throws an error with the given URL object.
144
+ * @param url - URL object.
145
+ */
146
+ function throwError(url) {
147
+ throw new Error(`Invalid explore URL href or query: ${url.href}, ${url.query}`);
148
+ }
@@ -1,6 +1,6 @@
1
1
  import { LinkProps as MLinkProps } from "@mui/material";
2
2
  import { ReactNode } from "react";
3
- import { ANCHOR_TARGET } from "../../common/entities";
3
+ import { ANCHOR_TARGET, Url } from "../../common/entities";
4
4
  export interface LinkProps {
5
5
  className?: string;
6
6
  copyable?: boolean;
@@ -8,6 +8,6 @@ export interface LinkProps {
8
8
  noWrap?: MLinkProps["noWrap"];
9
9
  onClick?: () => void;
10
10
  target?: ANCHOR_TARGET;
11
- url: string;
11
+ url: Url;
12
12
  }
13
13
  export declare const Link: ({ className, copyable, label, noWrap, onClick, target, url, }: LinkProps) => JSX.Element;
@@ -11,12 +11,28 @@ const utils_1 = require("../../../../common/utils");
11
11
  const copyToClipboard_1 = require("../../../common/CopyToClipboard/copyToClipboard");
12
12
  const entities_1 = require("../../common/entities");
13
13
  const utils_2 = require("../../common/utils");
14
+ const exploreViewLink_1 = require("./components/ExploreViewLink/exploreViewLink");
14
15
  const Link = ({ className, copyable = false, label, noWrap = false, onClick, target, url, }) => {
15
- return (react_1.default.createElement(react_1.default.Fragment, null, (0, utils_2.isClientSideNavigation)(url) ? (react_1.default.createElement(react_1.default.Fragment, null,
16
- react_1.default.createElement(link_1.default, { href: url, legacyBehavior: true, passHref: true },
17
- react_1.default.createElement(material_1.Link, { className: className, rel: "noopener", noWrap: noWrap, target: target || entities_1.ANCHOR_TARGET.SELF, onClick: onClick }, label)),
18
- copyable && react_1.default.createElement(copyToClipboard_1.CopyToClipboard, { copyStr: url }))) : (0, utils_1.isValidUrl)(url) ? (react_1.default.createElement(react_1.default.Fragment, null,
19
- react_1.default.createElement(material_1.Link, { className: className, href: url, rel: "noopener noreferrer", noWrap: noWrap, target: target || entities_1.ANCHOR_TARGET.BLANK, onClick: onClick }, label),
20
- copyable && react_1.default.createElement(copyToClipboard_1.CopyToClipboard, { copyStr: url }))) : (label)));
16
+ if ((0, utils_2.isURLObjectWithHrefAndQuery)(url)) {
17
+ /* Internal navigation - explore link */
18
+ return (react_1.default.createElement(exploreViewLink_1.ExploreViewLink, { className: className, label: label, onClick: onClick, target: target, url: url }));
19
+ }
20
+ if ((0, utils_2.isURLString)(url)) {
21
+ if ((0, utils_2.isClientSideNavigation)(url)) {
22
+ /* Client-side navigation */
23
+ return (react_1.default.createElement(react_1.default.Fragment, null,
24
+ react_1.default.createElement(link_1.default, { href: url, legacyBehavior: true, passHref: true },
25
+ react_1.default.createElement(material_1.Link, { className: className, rel: "noopener", noWrap: noWrap, target: target || entities_1.ANCHOR_TARGET.SELF, onClick: onClick }, label)),
26
+ copyable && react_1.default.createElement(copyToClipboard_1.CopyToClipboard, { copyStr: url })));
27
+ }
28
+ if ((0, utils_1.isValidUrl)(url)) {
29
+ /* External navigation */
30
+ return (react_1.default.createElement(react_1.default.Fragment, null,
31
+ react_1.default.createElement(material_1.Link, { className: className, href: url, noWrap: noWrap, onClick: onClick, rel: "noopener noreferrer", target: target || entities_1.ANCHOR_TARGET.BLANK }, label),
32
+ copyable && react_1.default.createElement(copyToClipboard_1.CopyToClipboard, { copyStr: url })));
33
+ }
34
+ }
35
+ /* Invalid URL */
36
+ return react_1.default.createElement(react_1.default.Fragment, null, label);
21
37
  };
22
38
  exports.Link = Link;
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.GridTable = void 0;
7
7
  const styled_1 = __importDefault(require("@emotion/styled"));
8
8
  const material_1 = require("@mui/material");
9
+ const colors_1 = require("../../../styles/common/mixins/colors");
9
10
  exports.GridTable = (0, styled_1.default)(material_1.Table, {
10
11
  shouldForwardProp: (prop) => prop !== "gridTemplateColumns",
11
12
  }) `
@@ -22,7 +23,7 @@ exports.GridTable = (0, styled_1.default)(material_1.Table, {
22
23
 
23
24
  td,
24
25
  th {
25
- background-color: ${({ theme }) => theme.palette.common.white};
26
+ background-color: ${colors_1.white};
26
27
  }
27
28
 
28
29
  td,
@@ -36,4 +37,11 @@ exports.GridTable = (0, styled_1.default)(material_1.Table, {
36
37
  min-width: 0; /* required; flexbox child min-width property is "auto" by default making overflow-wrap ineffectual */
37
38
  }
38
39
  }
40
+
41
+ [id^="grouped-row"] {
42
+ td {
43
+ background-color: ${colors_1.smokeLightest};
44
+ grid-column: 1 / -1;
45
+ }
46
+ }
39
47
  `;
@@ -103,6 +103,12 @@ export declare function isAnyRowSelected<T>(table: Table<T>): boolean;
103
103
  * @returns true if client-side filtering is enabled.
104
104
  */
105
105
  export declare function isClientFilteringEnabled(exploreMode: ExploreMode): boolean;
106
+ /**
107
+ * Returns true if the collapsable row is disabled; i.e. only one column is visible.
108
+ * @param tableInstance - Table instance.
109
+ * @returns true if the collapsable row is disabled.
110
+ */
111
+ export declare function isCollapsableRowDisabled<T>(tableInstance: Table<T>): boolean;
106
112
  /**
107
113
  * Returns true if column has a sort direction.
108
114
  * @param sortDirection - Column sort direction.
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getInitialTableColumnVisibility = exports.sortingFn = exports.isColumnSortActive = exports.isClientFilteringEnabled = exports.isAnyRowSelected = exports.getTableSortLabelProps = exports.getPinnedCellIndex = exports.getInitialTableStateSorting = exports.getInitialState = exports.getGridTemplateColumns = exports.getFacetedUniqueValuesWithArrayValues = exports.getEditColumnOptions = exports.generateDownloadBlob = exports.getColumnSortDirection = exports.buildCategoryViews = exports.arrIncludesSome = void 0;
6
+ exports.getInitialTableColumnVisibility = exports.sortingFn = exports.isColumnSortActive = exports.isCollapsableRowDisabled = exports.isClientFilteringEnabled = exports.isAnyRowSelected = exports.getTableSortLabelProps = exports.getPinnedCellIndex = exports.getInitialTableStateSorting = exports.getInitialState = exports.getGridTemplateColumns = exports.getFacetedUniqueValuesWithArrayValues = exports.getEditColumnOptions = exports.generateDownloadBlob = exports.getColumnSortDirection = exports.buildCategoryViews = exports.arrIncludesSome = void 0;
7
7
  const SouthRounded_1 = __importDefault(require("@mui/icons-material/SouthRounded"));
8
8
  const react_table_1 = require("@tanstack/react-table");
9
9
  const useExploreMode_1 = require("../../../hooks/useExploreMode");
@@ -283,6 +283,15 @@ function isClientFilteringEnabled(exploreMode) {
283
283
  exploreMode === useExploreMode_1.EXPLORE_MODE.SS_FETCH_CS_FILTERING);
284
284
  }
285
285
  exports.isClientFilteringEnabled = isClientFilteringEnabled;
286
+ /**
287
+ * Returns true if the collapsable row is disabled; i.e. only one column is visible.
288
+ * @param tableInstance - Table instance.
289
+ * @returns true if the collapsable row is disabled.
290
+ */
291
+ function isCollapsableRowDisabled(tableInstance) {
292
+ return tableInstance.getVisibleLeafColumns().length === 1;
293
+ }
294
+ exports.isCollapsableRowDisabled = isCollapsableRowDisabled;
286
295
  /**
287
296
  * Returns true if column has a sort direction.
288
297
  * @param sortDirection - Column sort direction.
@@ -1,6 +1,7 @@
1
1
  /// <reference types="react" />
2
- import { Row } from "@tanstack/react-table";
3
- export interface CollapsableCellProps<T> {
2
+ import { Row, RowData } from "@tanstack/react-table";
3
+ export interface CollapsableCellProps<T extends RowData> {
4
+ isDisabled?: boolean;
4
5
  row: Row<T>;
5
6
  }
6
- export declare const CollapsableCell: <T extends object>({ row, }: CollapsableCellProps<T>) => JSX.Element;
7
+ export declare const CollapsableCell: <T extends unknown>({ isDisabled, row, }: CollapsableCellProps<T>) => JSX.Element;
@@ -31,7 +31,7 @@ const typography_1 = require("../../../../../../theme/common/typography");
31
31
  const unfoldMoreIcon_1 = require("../../../../../common/CustomIcon/components/UnfoldMoreIcon/unfoldMoreIcon");
32
32
  const utils_1 = require("../../../../common/utils");
33
33
  const collapsableCell_styles_1 = require("./collapsableCell.styles");
34
- const CollapsableCell = ({ row, }) => {
34
+ const CollapsableCell = ({ isDisabled = false, row, }) => {
35
35
  const [isExpanded, setIsExpanded] = (0, react_1.useState)(false);
36
36
  const [pinnedCell, pinnedIndex] = (0, utils_1.getPinnedCellIndex)(row);
37
37
  // Toggles open/close table cell.
@@ -41,11 +41,15 @@ const CollapsableCell = ({ row, }) => {
41
41
  return (react_1.default.createElement(collapsableCell_styles_1.TableCell, { isExpanded: isExpanded },
42
42
  react_1.default.createElement(collapsableCell_styles_1.PinnedCell, null,
43
43
  (0, react_table_1.flexRender)(pinnedCell.column.columnDef.cell, pinnedCell.getContext()),
44
- react_1.default.createElement(material_1.IconButton, { color: "ink", edge: "end", onClick: onToggleExpanded, size: "large" },
44
+ react_1.default.createElement(material_1.IconButton, { color: "ink", disabled: isDisabled, edge: "end", onClick: onToggleExpanded, size: "large" },
45
45
  react_1.default.createElement(unfoldMoreIcon_1.UnfoldMoreIcon, { fontSize: "small" }))),
46
46
  react_1.default.createElement(material_1.Collapse, { in: isExpanded },
47
- react_1.default.createElement(collapsableCell_styles_1.CollapsedContents, null, row.getVisibleCells().map((cell, i) => {
47
+ react_1.default.createElement(collapsableCell_styles_1.CollapsedContents, null, getRowVisibleCells(row).map((cell, i) => {
48
48
  var _a;
49
+ if (cell.getIsAggregated())
50
+ return null; // Display of aggregated cells is currently not supported.
51
+ if (cell.getIsPlaceholder())
52
+ return null; // Display of placeholder cells is currently not supported.
49
53
  const header = (_a = cell.column.columnDef.meta) === null || _a === void 0 ? void 0 : _a.header;
50
54
  return (i !== pinnedIndex && (react_1.default.createElement(collapsableCell_styles_1.Content, { key: cell.id },
51
55
  header && (react_1.default.createElement(material_1.Typography, { component: "div", color: "ink.light", variant: typography_1.TEXT_BODY_400_2_LINES }, header)),
@@ -53,3 +57,17 @@ const CollapsableCell = ({ row, }) => {
53
57
  })))));
54
58
  };
55
59
  exports.CollapsableCell = CollapsableCell;
60
+ /**
61
+ * Returns row or sub row visible cells.
62
+ * @param row - Row.
63
+ * @returns row or sub row visible cells.
64
+ */
65
+ function getRowVisibleCells(row) {
66
+ if (row.getIsGrouped()) {
67
+ return row
68
+ .getLeafRows()
69
+ .map((leafRow) => leafRow.getVisibleCells())
70
+ .flat();
71
+ }
72
+ return row.getVisibleCells();
73
+ }
@@ -48,6 +48,10 @@ exports.PinnedCell = styled_1.default.div `
48
48
  justify-content: space-between;
49
49
  padding: 12px 16px;
50
50
  word-break: break-word;
51
+
52
+ .MuiIconButton-root.Mui-disabled {
53
+ opacity: 0.5;
54
+ }
51
55
  `;
52
56
  exports.CollapsedContents = styled_1.default.div `
53
57
  ${fonts_1.textBody4002Lines};
@@ -33,6 +33,9 @@ const utils_2 = require("../TableCell/common/utils");
33
33
  const TableHead = ({ rowDirection, tableInstance, }) => {
34
34
  return (react_1.default.createElement(react_1.Fragment, null, rowDirection === entities_1.ROW_DIRECTION.DEFAULT &&
35
35
  tableInstance.getHeaderGroups().map((headerGroup) => (react_1.default.createElement(material_1.TableHead, { key: headerGroup.id },
36
- react_1.default.createElement(material_1.TableRow, null, headerGroup.headers.map((header) => (react_1.default.createElement(material_1.TableCell, { key: header.id, padding: (0, utils_2.getTableCellPadding)(header.id) }, header.column.getCanSort() ? (react_1.default.createElement(material_1.TableSortLabel, Object.assign({}, (0, utils_1.getTableSortLabelProps)(header.column)), (0, react_table_1.flexRender)(header.column.columnDef.header, header.getContext()))) : ((0, react_table_1.flexRender)(header.column.columnDef.header, header.getContext())))))))))));
36
+ react_1.default.createElement(material_1.TableRow, null, headerGroup.headers.map((header) => {
37
+ const { column: { columnDef: { meta: { enableSortingInteraction = true } = {}, }, }, } = header;
38
+ return header.column.getIsGrouped() ? null : (react_1.default.createElement(material_1.TableCell, { key: header.id, padding: (0, utils_2.getTableCellPadding)(header.id) }, header.column.getCanSort() && enableSortingInteraction ? (react_1.default.createElement(material_1.TableSortLabel, Object.assign({}, (0, utils_1.getTableSortLabelProps)(header.column)), (0, react_table_1.flexRender)(header.column.columnDef.header, header.getContext()))) : ((0, react_table_1.flexRender)(header.column.columnDef.header, header.getContext()))));
39
+ })))))));
37
40
  };
38
41
  exports.TableHead = TableHead;
@@ -26,6 +26,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.CollapsableRows = void 0;
27
27
  const material_1 = require("@mui/material");
28
28
  const react_1 = __importStar(require("react"));
29
+ const utils_1 = require("../../../../common/utils");
29
30
  const collapsableCell_1 = require("../../../TableCell/components/CollapsableCell/collapsableCell");
30
31
  const CollapsableRows = ({ tableInstance, virtualizer, }) => {
31
32
  const { getRowModel } = tableInstance;
@@ -34,7 +35,7 @@ const CollapsableRows = ({ tableInstance, virtualizer, }) => {
34
35
  return (react_1.default.createElement(react_1.Fragment, null, virtualItems.map((virtualRow) => {
35
36
  const row = rows[virtualRow.index];
36
37
  return (react_1.default.createElement(material_1.TableRow, { key: row.id, "data-index": virtualRow.index, ref: virtualizer.measureElement },
37
- react_1.default.createElement(collapsableCell_1.CollapsableCell, { row: row })));
38
+ react_1.default.createElement(collapsableCell_1.CollapsableCell, { isDisabled: (0, utils_1.isCollapsableRowDisabled)(tableInstance), row: row })));
38
39
  })));
39
40
  };
40
41
  exports.CollapsableRows = CollapsableRows;
@@ -14,11 +14,7 @@ function buildBaseColumnDef(baseColumnConfig) {
14
14
  enableSorting: !disableSorting,
15
15
  header,
16
16
  id,
17
- meta: {
18
- columnPinned,
19
- header: meta ? meta.header : header,
20
- width,
21
- },
17
+ meta: Object.assign(Object.assign({}, meta), { columnPinned, header: meta ? meta.header : header, width }),
22
18
  };
23
19
  }
24
20
  exports.buildBaseColumnDef = buildBaseColumnDef;
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ import { CustomSVGIconProps } from "../../common/entities";
3
+ export declare const AddLinkIcon: ({ fontSize, viewBox, ...props }: CustomSVGIconProps) => JSX.Element;