@weng-lab/genomebrowser-ui 0.2.0-beta.0 → 0.2.0-beta.2

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.
@@ -4,4 +4,4 @@
4
4
  * Contains epigenomic data (DNase, ATAC, H3K4me3, H3K27ac, CTCF, cCRE, RNA-seq, ChromHMM)
5
5
  * from human tissue samples, primary cells, cell lines, and organoids.
6
6
  */
7
- export declare const humanBiosamplesFolder: import('..').FolderDefinition<import('./shared/types').BiosampleRowInfo>;
7
+ export declare const humanBiosamplesFolder: import('..').FolderDefinition<import('..').BiosampleRowInfo>;
@@ -4,4 +4,4 @@
4
4
  * Contains epigenomic data (DNase, ATAC, H3K4me3, H3K27ac, CTCF, cCRE, RNA-seq, ChromHMM)
5
5
  * from mouse tissue samples, primary cells, cell lines, and organoids.
6
6
  */
7
- export declare const mouseBiosamplesFolder: import('..').FolderDefinition<import('./shared/types').BiosampleRowInfo>;
7
+ export declare const mouseBiosamplesFolder: import('..').FolderDefinition<import('..').BiosampleRowInfo>;
@@ -1,6 +1,6 @@
1
1
  declare const _default: [
2
2
  {
3
- "id": "genocode-basic",
3
+ "id": "gencode-basic",
4
4
  "displayName": "GENCODE Basic Genes",
5
5
  "versions": [29, 40]
6
6
  }
@@ -1,6 +1,6 @@
1
1
  declare const _default: [
2
2
  {
3
- "id": "genocode-basic",
3
+ "id": "gencode-basic",
4
4
  "displayName": "GENCODE Basic Genes",
5
5
  "versions": [21, 25]
6
6
  }
@@ -4,4 +4,4 @@
4
4
  * Contains gene annotation tracks like GENCODE that users can
5
5
  * select to display in the genome browser.
6
6
  */
7
- export declare const humanGenesFolder: import('..').FolderDefinition<import('./shared/types').GeneRowInfo>;
7
+ export declare const humanGenesFolder: import('..').FolderDefinition<import('..').GeneRowInfo>;
@@ -4,4 +4,4 @@
4
4
  * Contains gene annotation tracks like GENCODE that users can
5
5
  * select to display in the genome browser.
6
6
  */
7
- export declare const mouseGenesFolder: import('..').FolderDefinition<import('./shared/types').GeneRowInfo>;
7
+ export declare const mouseGenesFolder: import('..').FolderDefinition<import('..').GeneRowInfo>;
@@ -1,5 +1,7 @@
1
1
  import { Assembly, FolderDefinition } from './types';
2
2
  export { type Assembly, type FolderDefinition, type FolderRuntimeConfig, } from './types';
3
+ export type { BiosampleRowInfo } from './biosamples/shared/types';
4
+ export type { GeneRowInfo } from './genes/shared/types';
3
5
  /**
4
6
  * Registry of folders available for each assembly.
5
7
  *
@@ -1650,7 +1650,7 @@ function Qe(e) {
1650
1650
  }
1651
1651
  const ua = [
1652
1652
  {
1653
- id: "genocode-basic",
1653
+ id: "gencode-basic",
1654
1654
  displayName: "GENCODE Basic Genes",
1655
1655
  versions: [
1656
1656
  29,
@@ -1664,7 +1664,7 @@ const ua = [
1664
1664
  data: ua
1665
1665
  }), ha = [
1666
1666
  {
1667
- id: "genocode-basic",
1667
+ id: "gencode-basic",
1668
1668
  displayName: "GENCODE Basic Genes",
1669
1669
  versions: [
1670
1670
  21,
@@ -1 +1 @@
1
- {"version":3,"file":"genomebrowser-ui.es.js","sources":["../../../node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-runtime.production.js","../../../node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-runtime.development.js","../../../node_modules/.pnpm/react@19.2.3/node_modules/react/jsx-runtime.js","../src/TrackSelect/FolderList/Breadcrumb.tsx","../src/TrackSelect/DataGrid/DefaultGroupingCell.tsx","../src/TrackSelect/DataGrid/DataGridWrapper.tsx","../src/TrackSelect/FolderList/FolderCard.tsx","../src/TrackSelect/FolderList/FolderList.tsx","../../../node_modules/.pnpm/zustand@5.0.9_@types+react@19.2.7_react@19.2.3_use-sync-external-store@1.6.0_react@19.2.3_/node_modules/zustand/esm/vanilla.mjs","../../../node_modules/.pnpm/zustand@5.0.9_@types+react@19.2.7_react@19.2.3_use-sync-external-store@1.6.0_react@19.2.3_/node_modules/zustand/esm/react.mjs","../src/TrackSelect/store.ts","../src/TrackSelect/TreeView/CustomTreeItem.tsx","../src/TrackSelect/TreeView/TreeViewWrapper.tsx","../src/TrackSelect/TrackSelect.tsx","../src/TrackSelect/Folders/biosamples/shared/constants.tsx","../src/TrackSelect/Folders/biosamples/shared/columns.tsx","../src/TrackSelect/Folders/biosamples/shared/treeBuilder.ts","../src/TrackSelect/Folders/biosamples/shared/AssayToggle.tsx","../src/TrackSelect/Folders/biosamples/shared/BiosampleGroupingCell.tsx","../src/TrackSelect/Folders/biosamples/shared/BiosampleTreeItem.tsx","../src/TrackSelect/Folders/biosamples/shared/createFolder.ts","../src/TrackSelect/Folders/biosamples/human.ts","../src/TrackSelect/Folders/biosamples/mouse.ts","../src/TrackSelect/Folders/genes/shared/columns.tsx","../src/TrackSelect/Folders/genes/shared/treeBuilder.ts","../src/TrackSelect/Folders/genes/shared/createFolder.ts","../src/TrackSelect/Folders/genes/human.ts","../src/TrackSelect/Folders/genes/mouse.ts","../src/TrackSelect/Folders/index.ts"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import { Breadcrumbs, Link, Typography } from \"@mui/material\";\nimport NavigateNextIcon from \"@mui/icons-material/NavigateNext\";\nimport { FolderDefinition } from \"../Folders/types\";\n\nexport interface BreadcrumbProps {\n currentFolder: FolderDefinition | null;\n onNavigateToRoot: () => void;\n}\n\nexport function Breadcrumb({\n currentFolder,\n onNavigateToRoot,\n}: BreadcrumbProps) {\n return (\n <Breadcrumbs separator={<NavigateNextIcon fontSize=\"small\" />}>\n {currentFolder ? (\n <Link\n component=\"button\"\n variant=\"body1\"\n onClick={onNavigateToRoot}\n underline=\"hover\"\n sx={{ cursor: \"pointer\" }}\n >\n All Folders\n </Link>\n ) : (\n <Typography variant=\"body1\" color=\"text.primary\">\n All Folders\n </Typography>\n )}\n {currentFolder && (\n <Typography variant=\"body1\" color=\"text.primary\">\n {currentFolder.label}\n </Typography>\n )}\n </Breadcrumbs>\n );\n}\n","import { Tooltip, Box, IconButton } from \"@mui/material\";\nimport {\n GridRenderCellParams,\n useGridApiContext,\n GridGroupNode,\n} from \"@mui/x-data-grid-premium\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\n\n/**\n * Default grouping cell that handles expand/collapse, truncation, and tooltips.\n * This is a generic implementation without any folder-specific logic.\n */\nexport function DefaultGroupingCell(params: GridRenderCellParams) {\n const apiRef = useGridApiContext();\n const isGroup = params.rowNode.type === \"group\";\n const groupNode = params.rowNode as GridGroupNode;\n const isExpanded = isGroup ? groupNode.childrenExpanded : false;\n const depth = params.rowNode.depth ?? 0;\n\n const handleExpandClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n apiRef.current.setRowChildrenExpansion(params.id, !isExpanded);\n };\n\n const value = String(params.value ?? \"\");\n\n // Indent based on depth (2 units per level)\n const indentLevel = depth * 2;\n\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n ml: indentLevel,\n }}\n >\n {isGroup && (\n <IconButton size=\"small\" onClick={handleExpandClick} sx={{ mr: 0.5 }}>\n {isExpanded ? (\n <ExpandMoreIcon fontSize=\"small\" />\n ) : (\n <ChevronRightIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n <Tooltip title={value} placement=\"top-start\" enterDelay={500}>\n <Box\n sx={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n flex: 1,\n fontWeight: isGroup ? \"bold\" : undefined,\n }}\n >\n {params.formattedValue}\n </Box>\n </Tooltip>\n </Box>\n );\n}\n","import { Box, Paper } from \"@mui/material\";\nimport {\n DataGridPremium,\n FilterColumnsArgs,\n GridAutosizeOptions,\n GridColDef,\n GridColumnVisibilityModel,\n useGridApiRef,\n} from \"@mui/x-data-grid-premium\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { DataGridProps } from \"../types\";\nimport { DefaultGroupingCell } from \"./DefaultGroupingCell\";\n\nconst autosizeOptions: GridAutosizeOptions = {\n expand: true,\n includeHeaders: true,\n outliersFactor: 1.5,\n};\n\nexport function DataGridWrapper(props: DataGridProps) {\n const {\n columns,\n groupingModel,\n leafField,\n onSelectionChange,\n rows,\n selectedIds,\n GroupingCellComponent,\n } = props;\n\n const GroupingCell = GroupingCellComponent ?? DefaultGroupingCell;\n\n const apiRef = useGridApiRef();\n\n useEffect(() => {\n if (apiRef.current && apiRef.current.autosizeColumns) {\n apiRef.current.autosizeColumns(autosizeOptions);\n }\n }, [columns, groupingModel, leafField]);\n\n const baseVisibility = useMemo(() => {\n const visibility: GridColumnVisibilityModel = {\n id: false,\n };\n\n // Only hide leafField if we have grouping (it shows in grouping column)\n if (groupingModel.length > 0) {\n visibility[leafField] = false;\n }\n\n groupingModel.forEach((field) => {\n visibility[field] = false;\n });\n\n return visibility;\n }, [groupingModel, leafField]);\n\n const [columnVisibilityModel, setColumnVisibilityModel] =\n useState<GridColumnVisibilityModel>(baseVisibility);\n\n useEffect(() => {\n setColumnVisibilityModel(baseVisibility);\n }, [baseVisibility]);\n\n // functions to customize the column and filter panel in the toolbar\n const filterColumns = ({ columns }: FilterColumnsArgs) => {\n return columns\n .filter((column) => column.type !== \"custom\")\n .map((column) => column.field);\n };\n\n const getTogglableColumns = (columns: GridColDef[]) => {\n return columns\n .filter((column) => column.type !== \"custom\")\n .map((column) => column.field);\n };\n\n return (\n <Paper sx={{ width: \"100%\" }}>\n <Box\n sx={{\n height: 500,\n width: \"100%\",\n overflow: \"auto\",\n }}\n >\n <DataGridPremium\n apiRef={apiRef}\n rows={rows}\n columns={columns}\n getRowId={(row) => row.id}\n autosizeOptions={autosizeOptions}\n rowGroupingModel={groupingModel}\n groupingColDef={{\n leafField,\n display: \"flex\",\n minWidth: 300,\n maxWidth: 500,\n flex: 2,\n renderCell: (params) => <GroupingCell {...params} />,\n }}\n columnVisibilityModel={columnVisibilityModel}\n onColumnVisibilityModelChange={setColumnVisibilityModel}\n onRowSelectionModelChange={(selection) => {\n const ids = (selection as any)?.ids ?? new Set<string>();\n onSelectionChange(new Set(ids));\n }}\n rowSelectionPropagation={{ descendants: true, parents: false }}\n disableRowGrouping={false}\n rowSelectionModel={{\n type: \"include\",\n ids: selectedIds,\n }}\n slotProps={{\n filterPanel: {\n filterFormProps: {\n filterColumns,\n },\n },\n columnsManagement: {\n getTogglableColumns,\n },\n }}\n keepNonExistentRowsSelected\n showToolbar\n disableAggregation\n disableRowSelectionExcludeModel\n disablePivoting\n checkboxSelection\n autosizeOnMount\n pagination\n hideFooterSelectedRowCount\n />\n </Box>\n </Paper>\n );\n}\n","import { Paper, Typography } from \"@mui/material\";\nimport { FolderDefinition } from \"../Folders/types\";\n\nexport interface FolderCardProps {\n folder: FolderDefinition;\n onClick: () => void;\n}\n\nexport function FolderCard({ folder, onClick }: FolderCardProps) {\n return (\n <Paper\n elevation={1}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick();\n }\n }}\n role=\"button\"\n tabIndex={0}\n sx={{\n p: 3,\n cursor: \"pointer\",\n transition: \"all 0.2s ease-in-out\",\n \"&:hover\": {\n elevation: 3,\n boxShadow: 3,\n bgcolor: \"action.hover\",\n },\n \"&:focus\": {\n outline: \"2px solid\",\n outlineColor: \"primary.main\",\n outlineOffset: 2,\n },\n }}\n >\n <Typography variant=\"h6\" gutterBottom>\n {folder.label}\n </Typography>\n {folder.description && (\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n {folder.description}\n </Typography>\n )}\n <Typography variant=\"caption\" color=\"text.secondary\">\n {folder.rowById.size.toLocaleString()} tracks available\n </Typography>\n </Paper>\n );\n}\n","import { Paper, Stack, Typography } from \"@mui/material\";\nimport { FolderDefinition } from \"../Folders/types\";\nimport { FolderCard } from \"./FolderCard\";\n\nexport interface FolderListProps {\n folders: FolderDefinition[];\n onFolderSelect: (folderId: string) => void;\n}\n\nexport function FolderList({ folders, onFolderSelect }: FolderListProps) {\n if (folders.length === 0) {\n return (\n <Paper\n variant=\"outlined\"\n sx={{\n height: 500,\n borderWidth: 2,\n }}\n >\n <Typography color=\"text.secondary\" sx={{ p: 3 }}>\n No folders available\n </Typography>\n </Paper>\n );\n }\n\n return (\n <Paper\n variant=\"outlined\"\n sx={{\n height: 500,\n overflow: \"auto\",\n borderWidth: 2,\n }}\n >\n <Stack spacing={2} sx={{ p: 2 }}>\n {folders.map((folder) => (\n <FolderCard\n key={folder.id}\n folder={folder}\n onClick={() => onFolderSelect(folder.id)}\n />\n ))}\n </Stack>\n </Paper>\n );\n}\n","const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = ((createState) => createState ? createStoreImpl(createState) : createStoreImpl);\n\nexport { createStore };\n","import React from 'react';\nimport { createStore } from 'zustand/vanilla';\n\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity) {\n const slice = React.useSyncExternalStore(\n api.subscribe,\n React.useCallback(() => selector(api.getState()), [api, selector]),\n React.useCallback(() => selector(api.getInitialState()), [api, selector])\n );\n React.useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n const api = createStore(createState);\n const useBoundStore = (selector) => useStore(api, selector);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = ((createState) => createState ? createImpl(createState) : createImpl);\n\nexport { create, useStore };\n","import { create, StoreApi, UseBoundStore } from \"zustand\";\nimport { SelectionAction, SelectionState } from \"./types\";\n\nexport type SelectionStoreInstance = UseBoundStore<\n StoreApi<SelectionState & SelectionAction>\n>;\n\nconst DEFAULT_STORAGE_KEY = \"trackSelect_selection\";\n\ntype SerializedSelection = Record<string, string[]>;\n\nconst serializeSelection = (\n selection: Map<string, Set<string>>,\n): SerializedSelection => {\n const obj: SerializedSelection = {};\n selection.forEach((ids, folderId) => {\n obj[folderId] = Array.from(ids);\n });\n return obj;\n};\n\nconst deserializeSelection = (\n data: SerializedSelection,\n): Map<string, Set<string>> => {\n const map = new Map<string, Set<string>>();\n Object.entries(data).forEach(([folderId, ids]) => {\n map.set(folderId, new Set(ids));\n });\n return map;\n};\n\nconst loadFromStorage = (\n storageKey: string,\n): Map<string, Set<string>> | undefined => {\n try {\n const stored = sessionStorage.getItem(storageKey);\n if (stored) {\n const parsed = JSON.parse(stored) as SerializedSelection;\n return deserializeSelection(parsed);\n }\n } catch {\n // Ignore storage errors\n }\n return undefined;\n};\n\nconst saveToStorage = (\n selection: Map<string, Set<string>>,\n storageKey: string,\n) => {\n try {\n const serialized = serializeSelection(selection);\n sessionStorage.setItem(storageKey, JSON.stringify(serialized));\n } catch {\n // Ignore storage errors\n }\n};\n\nconst buildSelectionMap = (\n folderIds: string[],\n initialSelection?: Map<string, Set<string>>,\n) => {\n const map = new Map<string, Set<string>>();\n folderIds.forEach((folderId) => {\n const initial = initialSelection?.get(folderId);\n map.set(folderId, initial ? new Set(initial) : new Set<string>());\n });\n return map;\n};\n\nexport function createSelectionStore(\n folderIds: string[],\n storageKey: string = DEFAULT_STORAGE_KEY,\n initialSelection?: Map<string, Set<string>>,\n) {\n const storedSelection = loadFromStorage(storageKey);\n // Storage wins: use stored if exists, else fall back to initialSelection\n const selectedByFolder = buildSelectionMap(\n folderIds,\n storedSelection ?? initialSelection,\n );\n const activeFolderId = folderIds[0] ?? \"\";\n\n const store = create<SelectionState & SelectionAction>((set) => ({\n selectedByFolder,\n activeFolderId,\n clear: (folderId?: string) =>\n set((state) => {\n if (folderId) {\n const next = new Map(state.selectedByFolder);\n next.set(folderId, new Set<string>());\n return { selectedByFolder: next };\n }\n\n const next = new Map<string, Set<string>>();\n state.selectedByFolder.forEach((_value, id) => {\n next.set(id, new Set<string>());\n });\n return { selectedByFolder: next };\n }),\n setActiveFolder: (folderId: string) =>\n set(() => ({ activeFolderId: folderId })),\n setSelection: (folderId: string, ids: Set<string>) =>\n set((state) => {\n const next = new Map(state.selectedByFolder);\n next.set(folderId, new Set(ids));\n return { selectedByFolder: next };\n }),\n }));\n\n // Subscribe to changes and persist to storage\n store.subscribe((state) => {\n saveToStorage(state.selectedByFolder, storageKey);\n });\n\n return store;\n}\n","import Folder from \"@mui/icons-material/Folder\";\nimport IndeterminateCheckBoxRoundedIcon from \"@mui/icons-material/IndeterminateCheckBoxRounded\";\nimport { Box, Stack, Tooltip, Typography } from \"@mui/material\";\nimport Collapse from \"@mui/material/Collapse\";\nimport { alpha, styled } from \"@mui/material/styles\";\nimport {\n TreeItemCheckbox,\n TreeItemIconContainer,\n TreeItemLabel,\n} from \"@mui/x-tree-view/TreeItem\";\nimport { TreeItemIcon } from \"@mui/x-tree-view/TreeItemIcon\";\nimport { TreeItemProvider } from \"@mui/x-tree-view/TreeItemProvider\";\nimport { useTreeItemModel } from \"@mui/x-tree-view/hooks\";\nimport { useTreeItem } from \"@mui/x-tree-view/useTreeItem\";\nimport React, { ReactNode } from \"react\";\nimport {\n CustomLabelProps,\n CustomTreeItemProps,\n ExtendedTreeItemProps,\n} from \"../types\";\n\n// Everything below is styling for the custom directory look of the tree view\nconst TreeItemRoot = styled(\"li\")(({ theme }) => ({\n listStyle: \"none\",\n margin: 0,\n padding: 0,\n outline: 4,\n color: theme.palette.grey[400],\n ...theme.applyStyles(\"light\", {\n color: theme.palette.grey[600], // controls colors of the MUI icons\n }),\n}));\n\nconst TreeItemLabelText = styled(Typography)({\n color: \"black\",\n fontFamily: \"inherit\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n});\n\nfunction CustomLabel({\n icon: Icon,\n children,\n isAssayItem,\n assayName,\n renderIcon,\n ...other\n}: CustomLabelProps) {\n const variant = isAssayItem ? \"subtitle2\" : \"body2\";\n const fontWeight = isAssayItem ? \"bold\" : 500;\n const labelText = typeof children === \"string\" ? children : \"\";\n return (\n <TreeItemLabel\n {...other}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n minWidth: 0,\n overflow: \"hidden\",\n flex: 1,\n }}\n >\n {Icon && React.isValidElement(Icon) ? (\n <Box className=\"labelIcon\" sx={{ mr: 1, flexShrink: 0 }}>\n {Icon}\n </Box>\n ) : (\n <Box\n component={Icon as React.ElementType}\n className=\"labelIcon\"\n color=\"inherit\"\n sx={{ mr: 1, fontSize: \"1.2rem\", flexShrink: 0 }}\n />\n )}\n <Stack\n direction=\"row\"\n spacing={1}\n alignItems=\"center\"\n sx={{ minWidth: 0, overflow: \"hidden\", flex: 1 }}\n >\n {isAssayItem && renderIcon && (\n <Box sx={{ flexShrink: 0 }}>{renderIcon(other.id)}</Box>\n )}\n {assayName && renderIcon && (\n <Box sx={{ flexShrink: 0 }}>{renderIcon(assayName)}</Box>\n )}\n <Tooltip title={labelText} enterDelay={500} placement=\"top\">\n <TreeItemLabelText fontWeight={fontWeight} variant={variant}>\n {labelText}\n </TreeItemLabelText>\n </Tooltip>\n </Stack>\n </TreeItemLabel>\n );\n}\n\nconst TreeItemContent = styled(\"div\")(({ theme }) => ({\n padding: theme.spacing(0.5),\n paddingRight: theme.spacing(2),\n paddingLeft: `calc(${theme.spacing(1)} + var(--TreeView-itemChildrenIndentation) * var(--TreeView-itemDepth))`,\n width: \"100%\",\n boxSizing: \"border-box\", // prevent width + padding to overflow\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n gap: theme.spacing(1),\n cursor: \"pointer\",\n WebkitTapHighlightColor: \"transparent\",\n flexDirection: \"row-reverse\",\n borderRadius: theme.spacing(0.7),\n marginBottom: theme.spacing(0.5),\n marginTop: theme.spacing(0.5),\n fontWeight: 500,\n \"&:hover\": {\n backgroundColor: alpha(theme.palette.primary.main, 0.1),\n color: \"white\",\n ...theme.applyStyles(\"light\", {\n color: theme.palette.primary.main,\n }),\n },\n}));\n\nconst getIconFromTreeItemType = (\n itemType: string,\n renderIcon?: (name: string) => ReactNode,\n) => {\n switch (itemType) {\n case \"folder\":\n return Folder;\n case \"removeable\":\n return IndeterminateCheckBoxRoundedIcon;\n default:\n return renderIcon ? renderIcon(itemType) : Folder;\n }\n};\n\nexport const CustomTreeItem = React.forwardRef(function CustomTreeItem(\n props: CustomTreeItemProps,\n ref: React.Ref<HTMLLIElement>,\n) {\n const {\n id,\n itemId,\n label,\n disabled,\n children,\n onRemove,\n renderIcon,\n ...other\n } = props;\n\n const {\n getContextProviderProps,\n getRootProps,\n getContentProps,\n getIconContainerProps,\n getCheckboxProps,\n getLabelProps,\n getGroupTransitionProps,\n status,\n } = useTreeItem({ id, itemId, children, label, disabled, rootRef: ref });\n\n const item = useTreeItemModel<ExtendedTreeItemProps>(itemId)!;\n const icon = getIconFromTreeItemType(item.icon, renderIcon);\n\n const handleRemoveIconClick = (e: React.MouseEvent) => {\n e.stopPropagation(); // prevent item expand/select\n onRemove?.(item);\n };\n\n return (\n <TreeItemProvider {...getContextProviderProps()}>\n <TreeItemRoot {...getRootProps(other)}>\n <TreeItemContent {...getContentProps()}>\n <TreeItemIconContainer {...getIconContainerProps()}>\n <TreeItemIcon status={status} />\n </TreeItemIconContainer>\n <TreeItemCheckbox {...getCheckboxProps()} />\n <CustomLabel\n {...getLabelProps({\n icon:\n item.icon === \"removeable\" ? (\n <Box\n onClick={handleRemoveIconClick}\n sx={{\n width: 20,\n height: 20,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n mr: 1,\n \"&:hover\": {\n backgroundColor: \"rgba(0,0,0,0.1)\",\n },\n }}\n >\n <IndeterminateCheckBoxRoundedIcon fontSize=\"small\" />\n </Box>\n ) : (\n icon\n ),\n expandable: (status.expandable && status.expanded).toString(),\n isAssayItem: item.isAssayItem,\n assayName: item.assayName,\n id: item.id,\n renderIcon,\n })}\n />\n </TreeItemContent>\n {children && <Collapse {...getGroupTransitionProps()} />}\n </TreeItemRoot>\n </TreeItemProvider>\n );\n});\n","import { Avatar, Box, Paper, Typography } from \"@mui/material\";\nimport { RichTreeView, TreeViewBaseItem } from \"@mui/x-tree-view\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport {\n CustomTreeItemProps,\n ExtendedTreeItemProps,\n TreeViewWrapperProps,\n} from \"../types\";\nimport { CustomTreeItem } from \"./CustomTreeItem\";\n\n/**\n * Recursively collects all item IDs that have children (expandable items)\n */\nfunction getAllExpandableItemIds(\n items: TreeViewBaseItem<ExtendedTreeItemProps>[],\n): string[] {\n const ids: string[] = [];\n for (const item of items) {\n if (item.children && item.children.length > 0) {\n ids.push(item.id);\n ids.push(...getAllExpandableItemIds(item.children));\n }\n }\n return ids;\n}\n\nexport function TreeViewWrapper({\n items,\n selectedCount,\n onRemove,\n TreeItemComponent,\n}: TreeViewWrapperProps) {\n const allExpandableIds = useMemo(\n () => getAllExpandableItemIds(items),\n [items],\n );\n const [expandedItems, setExpandedItems] =\n useState<string[]>(allExpandableIds);\n\n // Auto-expand new items when they're added\n useEffect(() => {\n setExpandedItems((prev) => {\n const newIds = allExpandableIds.filter((id) => !prev.includes(id));\n if (newIds.length > 0) {\n return [...prev, ...newIds];\n }\n return prev;\n });\n }, [allExpandableIds]);\n\n const handleRemoveTreeItem = (\n item: TreeViewBaseItem<ExtendedTreeItemProps>,\n ) => {\n onRemove(item);\n };\n\n const TreeItem = TreeItemComponent ?? CustomTreeItem;\n\n return (\n <Paper\n sx={{\n height: 500,\n width: \"100%\",\n border: \"10px solid\",\n borderColor: \"grey.200\",\n boxSizing: \"border-box\",\n borderRadius: 2,\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 1,\n py: 1,\n backgroundColor: \"grey.200\",\n flexShrink: 0,\n }}\n >\n <Avatar\n sx={{\n width: 30,\n height: 30,\n fontSize: 14,\n fontWeight: \"bold\",\n bgcolor: \"white\",\n color: \"text.primary\",\n }}\n >\n {selectedCount}\n </Avatar>\n <Typography fontWeight=\"bold\">Active Tracks</Typography>\n </Box>\n <Box\n sx={{\n flex: 1,\n overflow: \"auto\",\n }}\n >\n <RichTreeView\n items={items}\n expandedItems={expandedItems}\n onExpandedItemsChange={(_event, ids) => setExpandedItems(ids)}\n slots={{ item: TreeItem }}\n slotProps={{\n item: {\n onRemove: handleRemoveTreeItem,\n } as Partial<CustomTreeItemProps>,\n }}\n sx={{\n ml: 1,\n mr: 1,\n height: \"100%\",\n }}\n itemChildrenIndentation={0}\n />\n </Box>\n </Paper>\n );\n}\n","import CloseIcon from \"@mui/icons-material/Close\";\nimport {\n Box,\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n IconButton,\n Stack,\n} from \"@mui/material\";\nimport { TreeViewBaseItem } from \"@mui/x-tree-view\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Breadcrumb } from \"./FolderList/Breadcrumb\";\nimport { DataGridWrapper } from \"./DataGrid/DataGridWrapper\";\nimport { FolderList } from \"./FolderList/FolderList\";\nimport { FolderDefinition, FolderRuntimeConfig } from \"./Folders/types\";\nimport { createSelectionStore, SelectionStoreInstance } from \"./store\";\nimport { TreeViewWrapper } from \"./TreeView/TreeViewWrapper\";\nimport { ExtendedTreeItemProps } from \"./types\";\n\nexport interface TrackSelectProps {\n folders: FolderDefinition[];\n onSubmit: (selectedByFolder: Map<string, Set<string>>) => void;\n onCancel?: () => void;\n onClear?: () => void;\n maxTracks?: number;\n storageKey?: string;\n /** Initial selection to use when no stored selection exists */\n initialSelection?: Map<string, Set<string>>;\n open: boolean;\n onClose: () => void;\n title?: string;\n}\n\nconst DEFAULT_MAX_TRACKS = 30;\n\ntype ViewState = \"folder-list\" | \"folder-detail\";\n\nconst cloneSelectionMap = (selection: Map<string, Set<string>>) => {\n const map = new Map<string, Set<string>>();\n selection.forEach((ids, folderId) => {\n map.set(folderId, new Set(ids));\n });\n return map;\n};\n\nconst buildRuntimeConfigMap = (folders: FolderDefinition[]) => {\n const map = new Map<string, FolderRuntimeConfig>();\n folders.forEach((folder) => {\n map.set(folder.id, {\n columns: folder.columns,\n groupingModel: folder.groupingModel,\n leafField: folder.leafField,\n });\n });\n return map;\n};\n\nconst attachFolderId = (\n items: TreeViewBaseItem<ExtendedTreeItemProps>[],\n folderId: string,\n): TreeViewBaseItem<ExtendedTreeItemProps>[] => {\n return items.map((item) => ({\n ...item,\n folderId,\n children: item.children\n ? attachFolderId(item.children, folderId)\n : undefined,\n }));\n};\n\nconst DEFAULT_TITLE = \"Track Select\";\n\nexport default function TrackSelect({\n folders,\n onSubmit,\n onCancel,\n onClear,\n maxTracks,\n storageKey,\n initialSelection,\n open,\n onClose,\n title = DEFAULT_TITLE,\n}: TrackSelectProps) {\n const [limitDialogOpen, setLimitDialogOpen] = useState(false);\n const [clearDialogOpen, setClearDialogOpen] = useState(false);\n const [runtimeConfigByFolder, setRuntimeConfigByFolder] = useState(() =>\n buildRuntimeConfigMap(folders),\n );\n\n // View state: folder list or folder detail\n const [currentView, setCurrentView] = useState<ViewState>(() =>\n folders.length > 1 ? \"folder-list\" : \"folder-detail\",\n );\n\n // Create and memoize the selection store\n const folderIds = useMemo(() => folders.map((f) => f.id), [folders]);\n const storeRef = useRef<SelectionStoreInstance | null>(null);\n if (!storeRef.current) {\n storeRef.current = createSelectionStore(\n folderIds,\n storageKey,\n initialSelection,\n );\n }\n const store = storeRef.current;\n\n // Subscribe to store changes\n const selectedByFolder = store((state) => state.selectedByFolder);\n const activeFolderId = store((state) => state.activeFolderId);\n const setActiveFolder = store((state) => state.setActiveFolder);\n const setSelection = store((state) => state.setSelection);\n const clear = store((state) => state.clear);\n\n // Keep a committed snapshot for cancel functionality\n const [committedSnapshot, setCommittedSnapshot] = useState(() =>\n cloneSelectionMap(selectedByFolder),\n );\n\n useEffect(() => {\n setRuntimeConfigByFolder(buildRuntimeConfigMap(folders));\n // Ensure active folder is valid\n if (!folders.some((folder) => folder.id === activeFolderId)) {\n setActiveFolder(folders[0]?.id ?? \"\");\n }\n // Update view state if folder count changes\n if (folders.length <= 1) {\n setCurrentView(\"folder-detail\");\n }\n }, [folders, activeFolderId, setActiveFolder]);\n\n const activeFolder = useMemo(() => {\n return folders.find((folder) => folder.id === activeFolderId) ?? folders[0];\n }, [folders, activeFolderId]);\n\n const activeConfig = useMemo(() => {\n if (!activeFolder) return undefined;\n return (\n runtimeConfigByFolder.get(activeFolder.id) ?? {\n columns: activeFolder.columns,\n groupingModel: activeFolder.groupingModel,\n leafField: activeFolder.leafField,\n }\n );\n }, [runtimeConfigByFolder, activeFolder]);\n\n const selectedIds = useMemo(() => {\n if (!activeFolder) return new Set<string>();\n return new Set(selectedByFolder.get(activeFolder.id) ?? []);\n }, [selectedByFolder, activeFolder]);\n\n const selectedCount = useMemo(() => {\n let total = 0;\n selectedByFolder.forEach((ids) => {\n total += ids.size;\n });\n return total;\n }, [selectedByFolder]);\n\n const maxTracksLimit = maxTracks ?? DEFAULT_MAX_TRACKS;\n\n const rows = useMemo(() => {\n if (!activeFolder) return [];\n return Array.from(activeFolder.rowById.values());\n }, [activeFolder]);\n\n const treeItems = useMemo(() => {\n if (!activeFolder) return [];\n return folders\n .filter((folder) => {\n const selected = selectedByFolder.get(folder.id);\n return selected && selected.size > 0;\n })\n .flatMap((folder) =>\n attachFolderId(\n folder.buildTree(\n Array.from(selectedByFolder.get(folder.id) ?? []),\n folder.rowById,\n ),\n folder.id,\n ),\n );\n }, [folders, selectedByFolder, activeFolder]);\n\n const updateActiveFolderConfig = useCallback(\n (partial: Partial<FolderRuntimeConfig>) => {\n if (!activeFolder) return;\n setRuntimeConfigByFolder((prev) => {\n const current = prev.get(activeFolder.id);\n if (!current) return prev;\n const next = new Map(prev);\n next.set(activeFolder.id, { ...current, ...partial });\n return next;\n });\n },\n [activeFolder],\n );\n\n // Navigation handlers\n const handleFolderSelect = (folderId: string) => {\n setActiveFolder(folderId);\n setCurrentView(\"folder-detail\");\n };\n\n const handleNavigateToRoot = () => {\n setCurrentView(\"folder-list\");\n };\n\n const handleSelectionChange = (ids: Set<string>) => {\n if (!activeFolder) return;\n\n // Filter to only include IDs that exist in rowById (exclude auto-generated group IDs)\n const filteredIds = new Set(\n Array.from(ids).filter((id) => activeFolder.rowById.has(id)),\n );\n\n // Calculate what the total would be with this change\n let nextTotal = filteredIds.size;\n selectedByFolder.forEach((folderIds, folderId) => {\n if (folderId !== activeFolder.id) {\n nextTotal += folderIds.size;\n }\n });\n\n if (nextTotal > maxTracksLimit) {\n setLimitDialogOpen(true);\n return;\n }\n\n setSelection(activeFolder.id, filteredIds);\n };\n\n const handleRemoveTreeItem = (\n item: TreeViewBaseItem<ExtendedTreeItemProps>,\n ) => {\n const folderId = item.folderId;\n if (!folderId || !item.allExpAccessions?.length) {\n return;\n }\n\n const current = selectedByFolder.get(folderId) ?? new Set<string>();\n const nextSet = new Set(current);\n item.allExpAccessions.forEach((id) => nextSet.delete(id));\n setSelection(folderId, nextSet);\n };\n\n const handleSubmit = () => {\n const committed = cloneSelectionMap(selectedByFolder);\n setCommittedSnapshot(committed);\n onSubmit(committed);\n onClose();\n };\n\n const handleCancel = () => {\n // Restore from committed snapshot\n committedSnapshot.forEach((ids, folderId) => {\n setSelection(folderId, ids);\n });\n onCancel?.();\n onClose();\n };\n\n const handleClear = () => {\n setClearDialogOpen(true);\n };\n\n const confirmClear = () => {\n setClearDialogOpen(false);\n let newSnapshot: Map<string, Set<string>>;\n\n if (currentView === \"folder-detail\") {\n // Clear only the current folder\n clear(activeFolderId);\n newSnapshot = cloneSelectionMap(selectedByFolder);\n newSnapshot.set(activeFolderId, new Set<string>());\n } else {\n // Clear all folders\n clear();\n newSnapshot = new Map<string, Set<string>>();\n folderIds.forEach((id) => newSnapshot.set(id, new Set<string>()));\n onClear?.();\n }\n\n setCommittedSnapshot(newSnapshot);\n onSubmit(newSnapshot);\n };\n\n const ToolbarExtras = activeFolder?.ToolbarExtras;\n\n return (\n <Dialog open={open} onClose={handleCancel} maxWidth=\"lg\" fullWidth>\n <DialogTitle\n sx={{\n bgcolor: \"#0c184a\",\n color: \"white\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n fontWeight: \"bold\",\n }}\n >\n {title}\n <IconButton\n size=\"large\"\n onClick={handleCancel}\n sx={{ color: \"white\", padding: 0 }}\n >\n <CloseIcon fontSize=\"large\" />\n </IconButton>\n </DialogTitle>\n <DialogContent sx={{ marginTop: \"5px\" }}>\n {!activeFolder || !activeConfig ? (\n <Box sx={{ p: 2 }}>No folders available.</Box>\n ) : (\n <Box sx={{ flex: 1, pt: 1 }}>\n {/* Toolbar row - breadcrumb on left, extras on right */}\n {(folders.length > 1 ||\n (currentView === \"folder-detail\" && ToolbarExtras)) && (\n <Box\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n sx={{ mb: 2 }}\n >\n {folders.length > 1 ? (\n <Breadcrumb\n currentFolder={\n currentView === \"folder-detail\" ? activeFolder : null\n }\n onNavigateToRoot={handleNavigateToRoot}\n />\n ) : (\n <Box />\n )}\n {currentView === \"folder-detail\" && ToolbarExtras && (\n <ToolbarExtras updateConfig={updateActiveFolderConfig} />\n )}\n </Box>\n )}\n\n <Stack direction=\"row\" spacing={2} sx={{ width: \"100%\" }}>\n {/* Left panel - swaps between FolderList and DataGrid */}\n <Box sx={{ flex: 3, minWidth: 0 }}>\n {currentView === \"folder-list\" ? (\n <FolderList\n folders={folders}\n onFolderSelect={handleFolderSelect}\n />\n ) : (\n <DataGridWrapper\n rows={rows}\n columns={activeConfig.columns}\n groupingModel={activeConfig.groupingModel}\n leafField={activeConfig.leafField}\n label={`${rows.length} Available ${activeFolder.label}`}\n selectedIds={selectedIds}\n onSelectionChange={handleSelectionChange}\n GroupingCellComponent={activeFolder.GroupingCellComponent}\n />\n )}\n </Box>\n {/* Right panel - always visible */}\n <Box sx={{ flex: 2, minWidth: 0 }}>\n <TreeViewWrapper\n items={treeItems}\n selectedCount={selectedCount}\n onRemove={handleRemoveTreeItem}\n TreeItemComponent={activeFolder.TreeItemComponent}\n />\n </Box>\n </Stack>\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"space-between\",\n mt: 2,\n gap: 2,\n }}\n >\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n onClick={handleClear}\n >\n Clear\n </Button>\n <Box sx={{ display: \"flex\", gap: 2 }}>\n <Button variant=\"outlined\" onClick={handleCancel}>\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={handleSubmit}\n >\n Submit\n </Button>\n </Box>\n </Box>\n <Dialog\n open={limitDialogOpen}\n onClose={() => setLimitDialogOpen(false)}\n >\n <DialogTitle>Track Limit Reached</DialogTitle>\n <DialogContent>\n <DialogContentText>\n You can select up to {maxTracksLimit} tracks at a time. Please\n remove a track before adding another.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setLimitDialogOpen(false)} autoFocus>\n OK\n </Button>\n </DialogActions>\n </Dialog>\n <Dialog\n open={clearDialogOpen}\n onClose={() => setClearDialogOpen(false)}\n >\n <DialogTitle\n sx={{\n bgcolor: \"#0c184a\",\n color: \"white\",\n fontWeight: \"bold\",\n }}\n >\n {currentView === \"folder-detail\"\n ? `Clear ${activeFolder.label}`\n : \"Clear All Folders\"}\n </DialogTitle>\n <DialogContent sx={{ mt: 2 }}>\n <DialogContentText>\n {currentView === \"folder-detail\" ? (\n <>\n Are you sure you want to clear the selection for{\" \"}\n <strong>{activeFolder.label}</strong>?\n </>\n ) : (\n \"Are you sure you want to clear all selections?\"\n )}\n </DialogContentText>\n </DialogContent>\n <DialogActions sx={{ justifyContent: \"center\", gap: 2, pb: 2 }}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => setClearDialogOpen(false)}\n autoFocus\n >\n Cancel\n </Button>\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n onClick={confirmClear}\n >\n Clear\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n )}\n </DialogContent>\n </Dialog>\n );\n}\n","import { Box } from \"@mui/material\";\nimport type { Assembly } from \"../../types\";\n\nexport type { Assembly };\n\nexport const assayTypes = [\n \"cCRE\",\n \"DNase\",\n \"H3K4me3\",\n \"H3K27ac\",\n \"ATAC\",\n \"CTCF\",\n \"RNA-seq\",\n \"ChromHMM\",\n];\n\nexport const ontologyTypes = [\n \"Aggregate\",\n \"Adipose\",\n \"Adrenal gland\",\n \"Blood\",\n \"Blood vessel\",\n \"Bone\",\n \"Bone marrow\",\n \"Brain\",\n \"Breast\",\n \"Connective tissue\",\n \"Embryo\",\n \"Epithelium\",\n \"Esophagus\",\n \"Eye\",\n \"Fallopian Tube\",\n \"Gallbladder\",\n \"Heart\",\n \"Kidney\",\n \"Large Intestine\",\n \"Limb\",\n \"Liver\",\n \"Lung\",\n \"Lymphoid Tissue\",\n \"Muscle\",\n \"Mouth\",\n \"Nerve\",\n \"Nose\",\n \"Pancreas\",\n \"Parathyroid Gland\",\n \"Ovary\",\n \"Penis\",\n \"Placenta\",\n \"Prostate\",\n \"Skin\",\n \"Small Intestine\",\n \"Spinal Cord\",\n \"Spleen\",\n \"Stomach\",\n \"Testis\",\n \"Thymus\",\n \"Thyroid\",\n \"Urinary Bladder\",\n \"Uterus\",\n \"Vagina\",\n];\n\n/** Color mapping for assay types */\nexport const assayColorMap: { [key: string]: string } = {\n DNase: \"#06da93\",\n ATAC: \"#02c7b9\",\n H3K4me3: \"#ff2020\",\n ChromHMM: \"#0097a7\",\n H3K27ac: \"#fdc401\",\n CTCF: \"#01a6f1\",\n cCRE: \"#000000\",\n \"RNA-seq\": \"#00aa00\",\n};\n\n/**\n * Creates the assay icon for DataGrid and RichTreeView\n * @param type - assay type\n * @returns an icon of the assay's respective color\n */\nexport function AssayIcon(type: string) {\n const color = assayColorMap[type];\n return (\n <Box\n sx={{\n width: 12,\n height: 12,\n borderRadius: \"20%\",\n bgcolor: color,\n }}\n />\n );\n}\n\n/**\n * Mapping from JSON assay keys to display names.\n * This is the single source of truth for assay name formatting.\n */\nconst assayJsonToDisplay: Record<string, string> = {\n dnase: \"DNase\",\n atac: \"ATAC\",\n h3k4me3: \"H3K4me3\",\n h3k27ac: \"H3K27ac\",\n ctcf: \"CTCF\",\n chromhmm: \"ChromHMM\",\n ccre: \"cCRE\",\n rnaseq: \"RNA-seq\",\n};\n\n/**\n * Convert JSON assay key to display name.\n * Used only during data loading to normalize assay names.\n */\nexport function formatAssayType(jsonKey: string): string {\n return assayJsonToDisplay[jsonKey.toLowerCase()] ?? jsonKey;\n}\n","import { GridColDef } from \"@mui/x-data-grid-premium\";\nimport { Stack, capitalize } from \"@mui/material\";\nimport { AssayIcon, ontologyTypes, assayTypes } from \"./constants\";\nimport { BiosampleRowInfo } from \"./types\";\n\nconst displayNameCol: GridColDef<BiosampleRowInfo> = {\n field: \"displayName\",\n headerName: \"Name\",\n valueFormatter: (value) => value && capitalize(value),\n maxWidth: 300,\n};\n\nconst sortedByAssayOntologyCol: GridColDef<BiosampleRowInfo> = {\n field: \"ontology\",\n headerName: \"Ontology\",\n type: \"singleSelect\",\n valueOptions: ontologyTypes,\n renderCell: (params) => {\n if (params.rowNode.type === \"group\") {\n if (params.value === undefined) {\n return null;\n }\n const val = params.value;\n return (\n <div>\n <b>{val}</b>\n </div>\n );\n }\n },\n};\n\nconst sortedByAssayAssayCol: GridColDef<BiosampleRowInfo> = {\n field: \"assay\",\n headerName: \"Assay\",\n valueOptions: assayTypes,\n renderCell: (params) => {\n if (params.rowNode.type === \"group\") {\n if (params.value === undefined) {\n return null;\n }\n const val = params.value;\n return (\n <Stack direction=\"row\" spacing={2} alignItems=\"center\">\n {AssayIcon(val)}\n <div>\n <b>{val}</b>\n </div>\n </Stack>\n );\n }\n },\n};\n\nconst defaultOntologyCol: GridColDef<BiosampleRowInfo> = {\n field: \"ontology\",\n headerName: \"Ontology\",\n type: \"singleSelect\",\n valueOptions: ontologyTypes,\n renderCell: (params) => {\n if (params.rowNode.type === \"group\") {\n if (params.value === undefined) {\n return null;\n }\n const val = params.value;\n return (\n <div>\n <b>{val}</b>\n </div>\n );\n }\n },\n};\n\nconst defaultAssayCol: GridColDef<BiosampleRowInfo> = {\n field: \"assay\",\n headerName: \"Assay\",\n valueOptions: assayTypes,\n renderCell: (params) => {\n if (params.value === undefined) {\n return null;\n }\n const val = params.value;\n return (\n <Stack direction=\"row\" spacing={2} alignItems=\"center\" sx={{ ml: 6 }}>\n {AssayIcon(val)}\n <div>{val}</div>\n </Stack>\n );\n },\n};\n\nconst sampleTypeCol: GridColDef<BiosampleRowInfo> = {\n field: \"sampleType\",\n headerName: \"Sample Type\",\n type: \"singleSelect\",\n valueOptions: [\n \"aggregate\",\n \"tissue\",\n \"primary cell\",\n \"cell line\",\n \"in vitro differentiated cells\",\n \"organoid\",\n ],\n valueFormatter: (value) => value && capitalize(value),\n};\n\nconst lifeStageCol: GridColDef<BiosampleRowInfo> = {\n field: \"lifeStage\",\n headerName: \"Life Stage\",\n type: \"singleSelect\",\n valueOptions: [\"adult\", \"embryonic\", \"N/A\"],\n valueFormatter: (value) => value && capitalize(value),\n};\n\nconst experimentCol: GridColDef<BiosampleRowInfo> = {\n field: \"experimentAccession\",\n headerName: \"Experiment Accession\",\n};\n\nconst fileCol: GridColDef<BiosampleRowInfo> = {\n field: \"fileAccession\",\n headerName: \"File Accession\",\n};\n\nconst idCol: GridColDef<BiosampleRowInfo> = {\n field: \"id\",\n headerName: \"ID\",\n};\n\n/** Columns for sorted-by-assay view (assay as top-level grouping) */\nexport const sortedByAssayColumns: GridColDef<BiosampleRowInfo>[] = [\n displayNameCol,\n sortedByAssayOntologyCol,\n sampleTypeCol,\n lifeStageCol,\n sortedByAssayAssayCol,\n experimentCol,\n fileCol,\n idCol,\n];\n\n/** Default columns (ontology as top-level grouping) */\nexport const defaultColumns: GridColDef<BiosampleRowInfo>[] = [\n defaultAssayCol,\n sampleTypeCol,\n lifeStageCol,\n defaultOntologyCol,\n displayNameCol,\n experimentCol,\n fileCol,\n idCol,\n];\n\n/** Grouping model for sorted-by-assay view */\nexport const sortedByAssayGroupingModel = [\"assay\", \"ontology\", \"displayName\"];\n\n/** Default grouping model (ontology-based) */\nexport const defaultGroupingModel = [\"ontology\", \"displayName\"];\n\n/** Leaf field for sorted-by-assay view */\nexport const sortedByAssayLeafField = \"id\";\n\n/** Default leaf field */\nexport const defaultLeafField = \"assay\";\n","import { TreeViewBaseItem } from \"@mui/x-tree-view\";\nimport { ExtendedTreeItemProps } from \"../../../types\";\nimport { BiosampleRowInfo } from \"./types\";\nimport { assayTypes, ontologyTypes, formatAssayType } from \"./constants\";\n\n/** Format an ID like \"h3k27ac-ENCFF922YMQ\" or \"folder::h3k27ac-ENCFF922YMQ\" to \"H3K27ac - ENCFF922YMQ\" */\nfunction formatIdLabel(id: string): string {\n // Remove folder prefix if present (e.g., \"FolderName::h3k27ac-ENCFF922YMQ\" -> \"h3k27ac-ENCFF922YMQ\")\n const rawId = id.includes(\"::\") ? id.split(\"::\").pop()! : id;\n\n const hyphenIndex = rawId.indexOf(\"-\");\n if (hyphenIndex === -1) return rawId;\n\n const assayPart = rawId.substring(0, hyphenIndex);\n const accessionPart = rawId.substring(hyphenIndex + 1);\n\n return `${formatAssayType(assayPart)} - ${accessionPart}`;\n}\n\n/**\n * Creates the root node for the tree view\n */\nfunction createRootNode(\n label: string,\n folderId: string,\n): TreeViewBaseItem<ExtendedTreeItemProps> {\n return {\n id: `${folderId}::root`,\n label,\n icon: \"folder\",\n children: [],\n allExpAccessions: [],\n };\n}\n\n/**\n * Builds tree in the sorted by assay view\n * Hierarchy: Assay -> Ontology -> DisplayName -> Experiment\n *\n * @param selectedIds - list of selected row IDs\n * @param rowById - Mapping between an id and its BiosampleRowInfo object\n * @param rootLabel - Label for the root node\n * @param folderId - Folder ID to prefix tree item IDs with\n * @returns tree items for the RichTreeView\n */\nexport function buildSortedAssayTreeView(\n selectedIds: string[],\n rowById: Map<string, BiosampleRowInfo>,\n rootLabel: string = \"Biosamples\",\n folderId: string = \"\",\n): TreeViewBaseItem<ExtendedTreeItemProps>[] {\n const root = createRootNode(rootLabel, folderId);\n const assayMap = new Map<string, TreeViewBaseItem<ExtendedTreeItemProps>>();\n const ontologyMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n const displayNameMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n\n const selectedRows = selectedIds.reduce<BiosampleRowInfo[]>((acc, id) => {\n const row = rowById.get(id);\n if (row) acc.push(row);\n return acc;\n }, []);\n\n selectedRows.forEach((row) => {\n const assayKey = `${folderId}::${row.assay}`;\n let assayNode = assayMap.get(assayKey);\n if (!assayNode) {\n assayNode = {\n id: assayKey,\n isAssayItem: true,\n label: row.assay,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n assayMap.set(assayKey, assayNode);\n root.children!.push(assayNode);\n }\n\n const ontologyKey = `${folderId}::${row.assay}-${row.ontology}`;\n let ontologyNode = ontologyMap.get(ontologyKey);\n if (!ontologyNode) {\n ontologyNode = {\n id: ontologyKey,\n isAssayItem: false,\n label: row.ontology,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n assayNode.children!.push(ontologyNode);\n ontologyMap.set(ontologyKey, ontologyNode);\n }\n\n const displayNameKey = `${folderId}::${row.assay}-${row.ontology}-${row.displayName}`;\n let displayNameNode = displayNameMap.get(displayNameKey);\n if (!displayNameNode) {\n displayNameNode = {\n id: displayNameKey,\n isAssayItem: false,\n label: row.displayName,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n ontologyNode.children!.push(displayNameNode);\n displayNameMap.set(displayNameKey, displayNameNode);\n }\n\n const expNode: TreeViewBaseItem<ExtendedTreeItemProps> = {\n id: row.id,\n isAssayItem: false,\n label: formatIdLabel(row.id),\n icon: \"removeable\",\n assayName: row.assay,\n children: [],\n allExpAccessions: [row.id],\n };\n displayNameNode.children!.push(expNode);\n\n assayNode.allExpAccessions!.push(row.id);\n ontologyNode.allExpAccessions!.push(row.id);\n displayNameNode.allExpAccessions!.push(row.id);\n });\n\n // standardize the order of the assay folders\n root.children!.sort((a, b): number => {\n const aAssay = a.id.split(\"::\")[1] ?? a.id;\n const bAssay = b.id.split(\"::\")[1] ?? b.id;\n return assayTypes.indexOf(aAssay) - assayTypes.indexOf(bAssay);\n });\n\n return [root];\n}\n\n/**\n * Builds tree in the default view (sorted by ontology)\n * Hierarchy: Ontology -> DisplayName -> Experiment\n *\n * @param selectedIds - list of selected row IDs\n * @param rowById - Mapping between an id and its BiosampleRowInfo object\n * @param rootLabel - Label for the root node\n * @param folderId - Folder ID to prefix tree item IDs with\n * @returns tree items for the RichTreeView\n */\nexport function buildTreeView(\n selectedIds: string[],\n rowById: Map<string, BiosampleRowInfo>,\n rootLabel: string = \"Biosamples\",\n folderId: string = \"\",\n): TreeViewBaseItem<ExtendedTreeItemProps>[] {\n const root = createRootNode(rootLabel, folderId);\n const ontologyMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n const displayNameMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n\n const selectedRows = selectedIds.reduce<BiosampleRowInfo[]>((acc, id) => {\n const row = rowById.get(id);\n if (row) acc.push(row);\n return acc;\n }, []);\n\n selectedRows.forEach((row) => {\n if (!row) {\n return;\n }\n const ontologyKey = `${folderId}::${row.ontology}`;\n let ontologyNode = ontologyMap.get(ontologyKey);\n if (!ontologyNode) {\n ontologyNode = {\n id: ontologyKey,\n label: row.ontology,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n ontologyMap.set(ontologyKey, ontologyNode);\n root.children!.push(ontologyNode);\n }\n\n const displayNameKey = `${folderId}::${row.ontology}-${row.displayName}`;\n let displayNameNode = displayNameMap.get(displayNameKey);\n if (!displayNameNode) {\n displayNameNode = {\n id: displayNameKey,\n label: row.displayName,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n ontologyNode.children!.push(displayNameNode);\n displayNameMap.set(displayNameKey, displayNameNode);\n }\n\n const expNode: TreeViewBaseItem<ExtendedTreeItemProps> = {\n id: row.id,\n label: formatIdLabel(row.id),\n icon: \"removeable\",\n assayName: row.assay,\n children: [],\n allExpAccessions: [row.id],\n };\n displayNameNode.children!.push(expNode);\n\n ontologyNode.allExpAccessions!.push(row.id);\n displayNameNode.allExpAccessions!.push(row.id);\n });\n\n // standardize the order of the ontology folders\n root.children!.sort((a, b): number => {\n const aOntology = a.id.split(\"::\")[1] ?? a.id;\n const bOntology = b.id.split(\"::\")[1] ?? b.id;\n return ontologyTypes.indexOf(aOntology) - ontologyTypes.indexOf(bOntology);\n });\n\n return [root];\n}\n","import { FormControlLabel, Switch } from \"@mui/material\";\nimport { useState } from \"react\";\nimport { FolderRuntimeConfig } from \"../../types\";\nimport {\n defaultColumns,\n defaultGroupingModel,\n defaultLeafField,\n sortedByAssayColumns,\n sortedByAssayGroupingModel,\n sortedByAssayLeafField,\n} from \"./columns\";\n\nexport interface AssayToggleProps {\n updateConfig: (partial: Partial<FolderRuntimeConfig>) => void;\n}\n\n/**\n * Biosample-specific toolbar component that toggles between\n * sample-grouped and assay-grouped views.\n *\n * When toggled, it updates the folder's runtime config to switch:\n * - columns: Different column definitions for each view\n * - groupingModel: [\"ontology\", \"displayName\"] vs [\"assay\", \"ontology\", \"displayName\"]\n * - leafField: \"assay\" vs \"id\"\n */\nexport function AssayToggle({ updateConfig }: AssayToggleProps) {\n const [sortedByAssay, setSortedByAssay] = useState(false);\n\n const handleToggle = () => {\n const newValue = !sortedByAssay;\n setSortedByAssay(newValue);\n\n if (newValue) {\n // Switch to assay-grouped view\n updateConfig({\n columns: sortedByAssayColumns,\n groupingModel: sortedByAssayGroupingModel,\n leafField: sortedByAssayLeafField,\n });\n } else {\n // Switch back to default (sample-grouped) view\n updateConfig({\n columns: defaultColumns,\n groupingModel: defaultGroupingModel,\n leafField: defaultLeafField,\n });\n }\n };\n\n return (\n <FormControlLabel\n sx={{ display: \"flex\", justifyContent: \"flex-end\" }}\n value=\"Sort by assay\"\n control={\n <Switch\n color=\"primary\"\n checked={sortedByAssay}\n onChange={handleToggle}\n />\n }\n label=\"Sort by assay\"\n labelPlacement=\"end\"\n />\n );\n}\n","import { Stack, Tooltip, Box, IconButton } from \"@mui/material\";\nimport {\n GridRenderCellParams,\n useGridApiContext,\n GridGroupNode,\n} from \"@mui/x-data-grid-premium\";\nimport { assayTypes, AssayIcon } from \"./constants\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\n\n/**\n * Biosample-specific grouping cell that renders AssayIcon for assay groups/values.\n * Handles expand/collapse, truncation, and tooltips.\n */\nexport default function BiosampleGroupingCell(params: GridRenderCellParams) {\n const apiRef = useGridApiContext();\n const isGroup = params.rowNode.type === \"group\";\n const groupNode = params.rowNode as GridGroupNode;\n const isExpanded = isGroup ? groupNode.childrenExpanded : false;\n const groupingField = isGroup ? groupNode.groupingField : null;\n const depth = params.rowNode.depth ?? 0;\n\n const handleExpandClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n apiRef.current.setRowChildrenExpansion(params.id, !isExpanded);\n };\n\n // Render content based on grouping field\n const renderContent = () => {\n const value = String(params.value ?? \"\");\n\n // For assay groups, show the colored icon\n if (isGroup && groupingField === \"assay\") {\n return (\n <Stack\n direction=\"row\"\n spacing={1}\n alignItems=\"center\"\n sx={{ flex: 1, overflow: \"hidden\" }}\n >\n {AssayIcon(value)}\n <Tooltip title={value} placement=\"top-start\" enterDelay={500}>\n <Box\n sx={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n fontWeight: \"bold\",\n }}\n >\n {params.formattedValue}\n </Box>\n </Tooltip>\n </Stack>\n );\n }\n\n // For other groups (ontology, displayName), show bold text\n if (isGroup) {\n return (\n <Tooltip title={value} placement=\"top-start\" enterDelay={500}>\n <Box\n sx={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n flex: 1,\n fontWeight: \"bold\",\n }}\n >\n {params.formattedValue}\n </Box>\n </Tooltip>\n );\n }\n\n // For leaf rows - check if it's an assay value\n const isAssayValue = assayTypes\n .map((a) => a.toLowerCase())\n .includes(value.toLowerCase());\n\n if (isAssayValue) {\n return (\n <Stack\n direction=\"row\"\n spacing={1}\n alignItems=\"center\"\n sx={{ flex: 1, overflow: \"hidden\" }}\n >\n {AssayIcon(value)}\n <Tooltip title={value} placement=\"top-start\" enterDelay={500}>\n <Box\n sx={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {params.formattedValue}\n </Box>\n </Tooltip>\n </Stack>\n );\n }\n\n return (\n <Tooltip title={value} placement=\"top-start\" enterDelay={500}>\n <Box\n sx={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n flex: 1,\n }}\n >\n {params.formattedValue}\n </Box>\n </Tooltip>\n );\n };\n\n // Indent based on depth (2 units per level)\n const indentLevel = depth * 2;\n\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n ml: indentLevel,\n }}\n >\n {isGroup && (\n <IconButton size=\"small\" onClick={handleExpandClick} sx={{ mr: 0.5 }}>\n {isExpanded ? (\n <ExpandMoreIcon fontSize=\"small\" />\n ) : (\n <ChevronRightIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n {renderContent()}\n </Box>\n );\n}\n","import React from \"react\";\nimport { CustomTreeItem } from \"../../../TreeView/CustomTreeItem\";\nimport { CustomTreeItemProps } from \"../../../types\";\nimport { AssayIcon } from \"./constants\";\n\n/**\n * Biosample-specific TreeItem that renders AssayIcon for assay items.\n * Wraps the generic CustomTreeItem with the AssayIcon renderer.\n */\nexport const BiosampleTreeItem = React.forwardRef<\n HTMLLIElement,\n CustomTreeItemProps\n>(function BiosampleTreeItem(props, ref) {\n return <CustomTreeItem {...props} ref={ref} renderIcon={AssayIcon} />;\n});\n","import { capitalize } from \"@mui/material\";\nimport { FolderDefinition } from \"../../types\";\nimport {\n BiosampleDataFile,\n BiosampleRowInfo,\n BiosampleTrackInfo,\n} from \"./types\";\nimport {\n defaultColumns,\n defaultGroupingModel,\n defaultLeafField,\n} from \"./columns\";\nimport { buildTreeView } from \"./treeBuilder\";\nimport { formatAssayType } from \"./constants\";\nimport { AssayToggle } from \"./AssayToggle\";\nimport BiosampleGroupingCell from \"./BiosampleGroupingCell\";\nimport { BiosampleTreeItem } from \"./BiosampleTreeItem\";\n\n/**\n * Flattens TrackInfo into RowInfo objects for DataGrid display.\n * Each track can have multiple assays, so this creates one row per assay.\n *\n * @param track - TrackInfo object from JSON data\n * @returns Array of flattened BiosampleRowInfo objects, one per assay\n */\nfunction flattenTrackIntoRows(track: BiosampleTrackInfo): BiosampleRowInfo[] {\n const { ontology, lifeStage, sampleType, displayName } = track;\n\n return track.assays.map(\n ({ id, assay, experimentAccession, fileAccession, url }) => ({\n id,\n ontology: capitalize(ontology),\n lifeStage: capitalize(lifeStage),\n sampleType: capitalize(sampleType),\n displayName: capitalize(displayName),\n assay: formatAssayType(assay),\n experimentAccession,\n fileAccession,\n url,\n }),\n );\n}\n\n/**\n * Transforms raw JSON data into flattened rows and a lookup map.\n * Prefixes each row ID with the folder ID to ensure uniqueness across folders.\n *\n * @param data - Raw biosample data from JSON file\n * @param folderId - Folder ID to prefix row IDs with\n * @returns Object containing rows array and rowById map\n */\nfunction transformData(data: BiosampleDataFile): {\n rowById: Map<string, BiosampleRowInfo>;\n} {\n const rows = data.tracks.flatMap(flattenTrackIntoRows).map((row) => ({\n ...row,\n id: row.id,\n }));\n const rowById = new Map<string, BiosampleRowInfo>(\n rows.map((row) => [row.id, row]),\n );\n return { rowById };\n}\n\nexport interface CreateBiosampleFolderOptions {\n /** Unique identifier for this folder */\n id: string;\n /** Display label shown in the UI */\n label: string;\n /** Optional description shown in folder cards */\n description?: string;\n /** Raw biosample data from JSON file */\n data: BiosampleDataFile;\n}\n\n/**\n * Factory function that creates a FolderDefinition for biosample data.\n *\n * This handles all the common setup for biosample folders:\n * - Transforms JSON data into flattened rows\n * - Creates the rowById lookup map\n * - Configures columns, grouping, and tree building\n *\n * @param options - Configuration options for the folder\n * @returns A complete FolderDefinition for the biosample data\n */\nexport function createBiosampleFolder(\n options: CreateBiosampleFolderOptions,\n): FolderDefinition<BiosampleRowInfo> {\n const { id, label, description, data } = options;\n const { rowById } = transformData(data);\n\n return {\n id,\n label,\n description,\n rowById,\n getRowId: (row) => row.id,\n\n // Default view: ontology-based grouping\n columns: defaultColumns,\n groupingModel: defaultGroupingModel,\n leafField: defaultLeafField,\n\n // Build tree for selected items panel\n buildTree: (selectedIds, rowById) =>\n buildTreeView(selectedIds, rowById, label, id),\n\n // Biosample-specific toolbar: toggle between sample-grouped and assay-grouped views\n ToolbarExtras: AssayToggle,\n\n // Biosample-specific custom components\n GroupingCellComponent: BiosampleGroupingCell,\n TreeItemComponent: BiosampleTreeItem,\n };\n}\n","import { createBiosampleFolder } from \"./shared/createFolder\";\nimport humanData from \"./data/human.json\";\nimport { BiosampleDataFile } from \"./shared/types\";\n\n/**\n * Human biosamples folder configuration for GRCh38 assembly.\n *\n * Contains epigenomic data (DNase, ATAC, H3K4me3, H3K27ac, CTCF, cCRE, RNA-seq, ChromHMM)\n * from human tissue samples, primary cells, cell lines, and organoids.\n */\nexport const humanBiosamplesFolder = createBiosampleFolder({\n id: \"human-biosamples\",\n label: \"Human Biosamples\",\n description:\n \"Epigenomic data from human tissue samples, primary cells, cell lines, and organoids.\",\n data: humanData as BiosampleDataFile,\n});\n","import { createBiosampleFolder } from \"./shared/createFolder\";\nimport mouseData from \"./data/mouse.json\";\nimport { BiosampleDataFile } from \"./shared/types\";\n\n/**\n * Mouse biosamples folder configuration for mm10 assembly.\n *\n * Contains epigenomic data (DNase, ATAC, H3K4me3, H3K27ac, CTCF, cCRE, RNA-seq, ChromHMM)\n * from mouse tissue samples, primary cells, cell lines, and organoids.\n */\nexport const mouseBiosamplesFolder = createBiosampleFolder({\n id: \"mouse-biosamples\",\n label: \"Mouse Biosamples\",\n description:\n \"Epigenomic data from mouse tissue samples, primary cells, cell lines, and organoids.\",\n data: mouseData as BiosampleDataFile,\n});\n","import { GridColDef } from \"@mui/x-data-grid-premium\";\nimport { GeneRowInfo } from \"./types\";\n\n/**\n * Format versions array as comma-separated string with \"v\" prefix\n * e.g., [29, 40] -> \"v29, v40\"\n */\nfunction formatVersions(versions: number[]): string {\n return versions.map((v) => `v${v}`).join(\", \");\n}\n\nconst displayNameCol: GridColDef<GeneRowInfo> = {\n field: \"displayName\",\n headerName: \"Name\",\n flex: 1,\n minWidth: 200,\n};\n\nconst versionsCol: GridColDef<GeneRowInfo> = {\n field: \"versions\",\n headerName: \"Versions\",\n width: 150,\n valueFormatter: (value: number[]) => value && formatVersions(value),\n};\n\n/**\n * Default columns for genes DataGrid (flat list, no grouping)\n */\nexport const defaultColumns: GridColDef<GeneRowInfo>[] = [\n displayNameCol,\n versionsCol,\n];\n\n/**\n * No grouping for genes - flat list\n */\nexport const defaultGroupingModel: string[] = [];\n\n/**\n * Leaf field - the unique identifier\n */\nexport const defaultLeafField = \"id\";\n","import { TreeViewBaseItem } from \"@mui/x-tree-view\";\nimport { ExtendedTreeItemProps } from \"../../../types\";\nimport { GeneRowInfo } from \"./types\";\n\n/**\n * Builds a flat tree structure for the TreeView panel (selected items)\n * Since genes have no grouping, this is a simple root -> leaf structure\n *\n * @param selectedIds - Array of selected row IDs\n * @param rowById - Map of row ID to row data\n * @param rootLabel - Label for the root node\n * @returns Tree structure for RichTreeView\n */\nexport function buildTreeView(\n selectedIds: string[],\n rowById: Map<string, GeneRowInfo>,\n rootLabel: string = \"Genes\",\n): TreeViewBaseItem<ExtendedTreeItemProps>[] {\n // Root node\n const root: TreeViewBaseItem<ExtendedTreeItemProps> = {\n id: \"root\",\n label: rootLabel,\n icon: \"folder\",\n children: [],\n allExpAccessions: [],\n };\n\n // Get selected rows and add as direct children of root\n selectedIds.forEach((id) => {\n const row = rowById.get(id);\n if (row) {\n const leafNode: TreeViewBaseItem<ExtendedTreeItemProps> = {\n id: row.id,\n label: row.displayName,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [row.id],\n };\n root.children!.push(leafNode);\n root.allExpAccessions!.push(row.id);\n }\n });\n\n return [root];\n}\n","import { FolderDefinition } from \"../../types\";\nimport { GeneDataFile, GeneRowInfo, GeneTrackInfo } from \"./types\";\nimport {\n defaultColumns,\n defaultGroupingModel,\n defaultLeafField,\n} from \"./columns\";\nimport { buildTreeView } from \"./treeBuilder\";\n\n/**\n * Transforms a single track from JSON into a row for DataGrid\n * For genes, this is a 1:1 mapping (no flattening needed)\n */\nfunction trackToRow(track: GeneTrackInfo): GeneRowInfo {\n return {\n id: track.id,\n displayName: track.displayName,\n versions: track.versions,\n };\n}\n\n/**\n * Transforms raw JSON data into rows and lookup map\n */\nfunction transformData(data: GeneDataFile): {\n rows: GeneRowInfo[];\n rowById: Map<string, GeneRowInfo>;\n} {\n const rows = data.map(trackToRow);\n const rowById = new Map<string, GeneRowInfo>(\n rows.map((row) => [row.id, row]),\n );\n return { rows, rowById };\n}\n\nexport interface CreateGeneFolderOptions {\n id: string;\n label: string;\n description?: string;\n data: GeneDataFile;\n}\n\n/**\n * Factory function that creates a FolderDefinition for genes\n */\nexport function createGeneFolder(\n options: CreateGeneFolderOptions,\n): FolderDefinition<GeneRowInfo> {\n const { id, label, description, data } = options;\n const { rowById } = transformData(data);\n\n return {\n id,\n label,\n description,\n rowById,\n getRowId: (row) => row.id,\n\n // Default view configuration\n columns: defaultColumns,\n groupingModel: defaultGroupingModel,\n leafField: defaultLeafField,\n\n // Tree builder for selected items panel\n buildTree: (selectedIds, rowById) =>\n buildTreeView(selectedIds, rowById, label),\n };\n}\n","import { createGeneFolder } from \"./shared/createFolder\";\nimport humanData from \"./data/human.json\";\nimport { GeneDataFile } from \"./shared/types\";\n\n/**\n * Gene annotations folder for human (GRCh38 assembly)\n *\n * Contains gene annotation tracks like GENCODE that users can\n * select to display in the genome browser.\n */\nexport const humanGenesFolder = createGeneFolder({\n id: \"human-genes\",\n label: \"Genes\",\n description: \"Gene annotation tracks\",\n data: humanData as GeneDataFile,\n});\n","import { createGeneFolder } from \"./shared/createFolder\";\nimport mouseData from \"./data/mouse.json\";\nimport { GeneDataFile } from \"./shared/types\";\n\n/**\n * Gene annotations folder for human (GRCh38 assembly)\n *\n * Contains gene annotation tracks like GENCODE that users can\n * select to display in the genome browser.\n */\nexport const mouseGenesFolder = createGeneFolder({\n id: \"mouse-genes\",\n label: \"Genes\",\n description: \"Gene annotation tracks\",\n data: mouseData as GeneDataFile,\n});\n","import { Assembly, FolderDefinition } from \"./types\";\nimport { humanBiosamplesFolder } from \"./biosamples/human\";\nimport { mouseBiosamplesFolder } from \"./biosamples/mouse\";\nimport { humanGenesFolder } from \"./genes/human\";\nimport { mouseGenesFolder } from \"./genes/mouse\";\n\nexport {\n type Assembly,\n type FolderDefinition,\n type FolderRuntimeConfig,\n} from \"./types\";\n\n/**\n * Registry of folders available for each assembly.\n *\n * Each assembly can have multiple folders (e.g., biosamples, genes, etc.).\n * TrackSelect receives the folders for the current assembly and renders\n * them as tabs or a folder selector.\n *\n * To add a new folder:\n * 1. Create a folder config file (e.g., folders/genes/human.ts)\n * 2. Import and add it to the appropriate assembly array below\n */\nexport const foldersByAssembly: Record<Assembly, FolderDefinition[]> = {\n GRCh38: [humanGenesFolder, humanBiosamplesFolder],\n mm10: [mouseGenesFolder, mouseBiosamplesFolder],\n};\n"],"names":["REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","owner","debugStack","debugTask","refProp","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","node","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","Breadcrumb","currentFolder","onNavigateToRoot","Breadcrumbs","NavigateNextIcon","jsx","Link","Typography","DefaultGroupingCell","params","apiRef","useGridApiContext","isGroup","groupNode","isExpanded","depth","handleExpandClick","e","indentLevel","jsxs","Box","IconButton","ExpandMoreIcon","ChevronRightIcon","Tooltip","autosizeOptions","DataGridWrapper","columns","groupingModel","leafField","onSelectionChange","rows","selectedIds","GroupingCellComponent","GroupingCell","useGridApiRef","useEffect","baseVisibility","useMemo","visibility","field","columnVisibilityModel","setColumnVisibilityModel","useState","filterColumns","column","getTogglableColumns","Paper","DataGridPremium","row","selection","ids","FolderCard","folder","onClick","FolderList","folders","onFolderSelect","Stack","createStoreImpl","createState","state","listeners","setState","partial","replace","nextState","previousState","listener","getState","api","initialState","createStore","identity","arg","useStore","selector","slice","createImpl","useBoundStore","create","DEFAULT_STORAGE_KEY","serializeSelection","obj","folderId","deserializeSelection","data","map","loadFromStorage","storageKey","stored","parsed","saveToStorage","serialized","buildSelectionMap","folderIds","initialSelection","initial","createSelectionStore","storedSelection","selectedByFolder","activeFolderId","store","set","next","_value","id","TreeItemRoot","styled","theme","TreeItemLabelText","CustomLabel","Icon","isAssayItem","assayName","renderIcon","other","variant","fontWeight","labelText","TreeItemLabel","TreeItemContent","alpha","getIconFromTreeItemType","itemType","Folder","IndeterminateCheckBoxRoundedIcon","CustomTreeItem","ref","itemId","label","disabled","onRemove","getContextProviderProps","getRootProps","getContentProps","getIconContainerProps","getCheckboxProps","getLabelProps","getGroupTransitionProps","status","useTreeItem","item","useTreeItemModel","icon","handleRemoveIconClick","TreeItemProvider","TreeItemIconContainer","TreeItemIcon","TreeItemCheckbox","Collapse","getAllExpandableItemIds","items","TreeViewWrapper","selectedCount","TreeItemComponent","allExpandableIds","expandedItems","setExpandedItems","prev","newIds","handleRemoveTreeItem","TreeItem","Avatar","RichTreeView","_event","DEFAULT_MAX_TRACKS","cloneSelectionMap","buildRuntimeConfigMap","attachFolderId","DEFAULT_TITLE","TrackSelect","onSubmit","onCancel","onClear","maxTracks","open","onClose","title","limitDialogOpen","setLimitDialogOpen","clearDialogOpen","setClearDialogOpen","runtimeConfigByFolder","setRuntimeConfigByFolder","currentView","setCurrentView","f","storeRef","useRef","setActiveFolder","setSelection","clear","committedSnapshot","setCommittedSnapshot","_a","activeFolder","activeConfig","total","maxTracksLimit","treeItems","selected","updateActiveFolderConfig","useCallback","current","handleFolderSelect","handleNavigateToRoot","handleSelectionChange","filteredIds","nextTotal","nextSet","handleSubmit","committed","handleCancel","handleClear","confirmClear","newSnapshot","ToolbarExtras","Dialog","DialogTitle","CloseIcon","DialogContent","Button","DialogContentText","DialogActions","Fragment","assayTypes","ontologyTypes","assayColorMap","AssayIcon","color","assayJsonToDisplay","formatAssayType","jsonKey","displayNameCol","capitalize","sortedByAssayOntologyCol","val","sortedByAssayAssayCol","defaultOntologyCol","defaultAssayCol","sampleTypeCol","lifeStageCol","experimentCol","fileCol","idCol","sortedByAssayColumns","defaultColumns","sortedByAssayGroupingModel","defaultGroupingModel","sortedByAssayLeafField","defaultLeafField","formatIdLabel","rawId","hyphenIndex","assayPart","accessionPart","createRootNode","buildTreeView","rowById","rootLabel","root","ontologyMap","displayNameMap","acc","ontologyKey","ontologyNode","displayNameKey","displayNameNode","expNode","a","b","aOntology","bOntology","AssayToggle","updateConfig","sortedByAssay","setSortedByAssay","handleToggle","newValue","FormControlLabel","Switch","BiosampleGroupingCell","groupingField","renderContent","BiosampleTreeItem","flattenTrackIntoRows","track","ontology","lifeStage","sampleType","assay","experimentAccession","fileAccession","url","transformData","createBiosampleFolder","options","description","humanBiosamplesFolder","humanData","mouseBiosamplesFolder","mouseData","formatVersions","versions","v","versionsCol","leafNode","trackToRow","createGeneFolder","humanGenesFolder","mouseGenesFolder","foldersByAssembly"],"mappings":"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","x_google_ignoreList":[0,1,2,8,9]}
1
+ {"version":3,"file":"genomebrowser-ui.es.js","sources":["../../../node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-runtime.production.js","../../../node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-runtime.development.js","../../../node_modules/.pnpm/react@19.2.3/node_modules/react/jsx-runtime.js","../src/TrackSelect/FolderList/Breadcrumb.tsx","../src/TrackSelect/DataGrid/DefaultGroupingCell.tsx","../src/TrackSelect/DataGrid/DataGridWrapper.tsx","../src/TrackSelect/FolderList/FolderCard.tsx","../src/TrackSelect/FolderList/FolderList.tsx","../../../node_modules/.pnpm/zustand@5.0.9_@types+react@19.2.7_react@19.2.3_use-sync-external-store@1.6.0_react@19.2.3_/node_modules/zustand/esm/vanilla.mjs","../../../node_modules/.pnpm/zustand@5.0.9_@types+react@19.2.7_react@19.2.3_use-sync-external-store@1.6.0_react@19.2.3_/node_modules/zustand/esm/react.mjs","../src/TrackSelect/store.ts","../src/TrackSelect/TreeView/CustomTreeItem.tsx","../src/TrackSelect/TreeView/TreeViewWrapper.tsx","../src/TrackSelect/TrackSelect.tsx","../src/TrackSelect/Folders/biosamples/shared/constants.tsx","../src/TrackSelect/Folders/biosamples/shared/columns.tsx","../src/TrackSelect/Folders/biosamples/shared/treeBuilder.ts","../src/TrackSelect/Folders/biosamples/shared/AssayToggle.tsx","../src/TrackSelect/Folders/biosamples/shared/BiosampleGroupingCell.tsx","../src/TrackSelect/Folders/biosamples/shared/BiosampleTreeItem.tsx","../src/TrackSelect/Folders/biosamples/shared/createFolder.ts","../src/TrackSelect/Folders/biosamples/human.ts","../src/TrackSelect/Folders/biosamples/mouse.ts","../src/TrackSelect/Folders/genes/shared/columns.tsx","../src/TrackSelect/Folders/genes/shared/treeBuilder.ts","../src/TrackSelect/Folders/genes/shared/createFolder.ts","../src/TrackSelect/Folders/genes/human.ts","../src/TrackSelect/Folders/genes/mouse.ts","../src/TrackSelect/Folders/index.ts"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import { Breadcrumbs, Link, Typography } from \"@mui/material\";\nimport NavigateNextIcon from \"@mui/icons-material/NavigateNext\";\nimport { FolderDefinition } from \"../Folders/types\";\n\nexport interface BreadcrumbProps {\n currentFolder: FolderDefinition | null;\n onNavigateToRoot: () => void;\n}\n\nexport function Breadcrumb({\n currentFolder,\n onNavigateToRoot,\n}: BreadcrumbProps) {\n return (\n <Breadcrumbs separator={<NavigateNextIcon fontSize=\"small\" />}>\n {currentFolder ? (\n <Link\n component=\"button\"\n variant=\"body1\"\n onClick={onNavigateToRoot}\n underline=\"hover\"\n sx={{ cursor: \"pointer\" }}\n >\n All Folders\n </Link>\n ) : (\n <Typography variant=\"body1\" color=\"text.primary\">\n All Folders\n </Typography>\n )}\n {currentFolder && (\n <Typography variant=\"body1\" color=\"text.primary\">\n {currentFolder.label}\n </Typography>\n )}\n </Breadcrumbs>\n );\n}\n","import { Tooltip, Box, IconButton } from \"@mui/material\";\nimport {\n GridRenderCellParams,\n useGridApiContext,\n GridGroupNode,\n} from \"@mui/x-data-grid-premium\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\n\n/**\n * Default grouping cell that handles expand/collapse, truncation, and tooltips.\n * This is a generic implementation without any folder-specific logic.\n */\nexport function DefaultGroupingCell(params: GridRenderCellParams) {\n const apiRef = useGridApiContext();\n const isGroup = params.rowNode.type === \"group\";\n const groupNode = params.rowNode as GridGroupNode;\n const isExpanded = isGroup ? groupNode.childrenExpanded : false;\n const depth = params.rowNode.depth ?? 0;\n\n const handleExpandClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n apiRef.current.setRowChildrenExpansion(params.id, !isExpanded);\n };\n\n const value = String(params.value ?? \"\");\n\n // Indent based on depth (2 units per level)\n const indentLevel = depth * 2;\n\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n ml: indentLevel,\n }}\n >\n {isGroup && (\n <IconButton size=\"small\" onClick={handleExpandClick} sx={{ mr: 0.5 }}>\n {isExpanded ? (\n <ExpandMoreIcon fontSize=\"small\" />\n ) : (\n <ChevronRightIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n <Tooltip title={value} placement=\"top-start\" enterDelay={500}>\n <Box\n sx={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n flex: 1,\n fontWeight: isGroup ? \"bold\" : undefined,\n }}\n >\n {params.formattedValue}\n </Box>\n </Tooltip>\n </Box>\n );\n}\n","import { Box, Paper } from \"@mui/material\";\nimport {\n DataGridPremium,\n FilterColumnsArgs,\n GridAutosizeOptions,\n GridColDef,\n GridColumnVisibilityModel,\n useGridApiRef,\n} from \"@mui/x-data-grid-premium\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { DataGridProps } from \"../types\";\nimport { DefaultGroupingCell } from \"./DefaultGroupingCell\";\n\nconst autosizeOptions: GridAutosizeOptions = {\n expand: true,\n includeHeaders: true,\n outliersFactor: 1.5,\n};\n\nexport function DataGridWrapper(props: DataGridProps) {\n const {\n columns,\n groupingModel,\n leafField,\n onSelectionChange,\n rows,\n selectedIds,\n GroupingCellComponent,\n } = props;\n\n const GroupingCell = GroupingCellComponent ?? DefaultGroupingCell;\n\n const apiRef = useGridApiRef();\n\n useEffect(() => {\n if (apiRef.current && apiRef.current.autosizeColumns) {\n apiRef.current.autosizeColumns(autosizeOptions);\n }\n }, [columns, groupingModel, leafField]);\n\n const baseVisibility = useMemo(() => {\n const visibility: GridColumnVisibilityModel = {\n id: false,\n };\n\n // Only hide leafField if we have grouping (it shows in grouping column)\n if (groupingModel.length > 0) {\n visibility[leafField] = false;\n }\n\n groupingModel.forEach((field) => {\n visibility[field] = false;\n });\n\n return visibility;\n }, [groupingModel, leafField]);\n\n const [columnVisibilityModel, setColumnVisibilityModel] =\n useState<GridColumnVisibilityModel>(baseVisibility);\n\n useEffect(() => {\n setColumnVisibilityModel(baseVisibility);\n }, [baseVisibility]);\n\n // functions to customize the column and filter panel in the toolbar\n const filterColumns = ({ columns }: FilterColumnsArgs) => {\n return columns\n .filter((column) => column.type !== \"custom\")\n .map((column) => column.field);\n };\n\n const getTogglableColumns = (columns: GridColDef[]) => {\n return columns\n .filter((column) => column.type !== \"custom\")\n .map((column) => column.field);\n };\n\n return (\n <Paper sx={{ width: \"100%\" }}>\n <Box\n sx={{\n height: 500,\n width: \"100%\",\n overflow: \"auto\",\n }}\n >\n <DataGridPremium\n apiRef={apiRef}\n rows={rows}\n columns={columns}\n getRowId={(row) => row.id}\n autosizeOptions={autosizeOptions}\n rowGroupingModel={groupingModel}\n groupingColDef={{\n leafField,\n display: \"flex\",\n minWidth: 300,\n maxWidth: 500,\n flex: 2,\n renderCell: (params) => <GroupingCell {...params} />,\n }}\n columnVisibilityModel={columnVisibilityModel}\n onColumnVisibilityModelChange={setColumnVisibilityModel}\n onRowSelectionModelChange={(selection) => {\n const ids = (selection as any)?.ids ?? new Set<string>();\n onSelectionChange(new Set(ids));\n }}\n rowSelectionPropagation={{ descendants: true, parents: false }}\n disableRowGrouping={false}\n rowSelectionModel={{\n type: \"include\",\n ids: selectedIds,\n }}\n slotProps={{\n filterPanel: {\n filterFormProps: {\n filterColumns,\n },\n },\n columnsManagement: {\n getTogglableColumns,\n },\n }}\n keepNonExistentRowsSelected\n showToolbar\n disableAggregation\n disableRowSelectionExcludeModel\n disablePivoting\n checkboxSelection\n autosizeOnMount\n pagination\n hideFooterSelectedRowCount\n />\n </Box>\n </Paper>\n );\n}\n","import { Paper, Typography } from \"@mui/material\";\nimport { FolderDefinition } from \"../Folders/types\";\n\nexport interface FolderCardProps {\n folder: FolderDefinition;\n onClick: () => void;\n}\n\nexport function FolderCard({ folder, onClick }: FolderCardProps) {\n return (\n <Paper\n elevation={1}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick();\n }\n }}\n role=\"button\"\n tabIndex={0}\n sx={{\n p: 3,\n cursor: \"pointer\",\n transition: \"all 0.2s ease-in-out\",\n \"&:hover\": {\n elevation: 3,\n boxShadow: 3,\n bgcolor: \"action.hover\",\n },\n \"&:focus\": {\n outline: \"2px solid\",\n outlineColor: \"primary.main\",\n outlineOffset: 2,\n },\n }}\n >\n <Typography variant=\"h6\" gutterBottom>\n {folder.label}\n </Typography>\n {folder.description && (\n <Typography variant=\"body2\" color=\"text.secondary\" gutterBottom>\n {folder.description}\n </Typography>\n )}\n <Typography variant=\"caption\" color=\"text.secondary\">\n {folder.rowById.size.toLocaleString()} tracks available\n </Typography>\n </Paper>\n );\n}\n","import { Paper, Stack, Typography } from \"@mui/material\";\nimport { FolderDefinition } from \"../Folders/types\";\nimport { FolderCard } from \"./FolderCard\";\n\nexport interface FolderListProps {\n folders: FolderDefinition[];\n onFolderSelect: (folderId: string) => void;\n}\n\nexport function FolderList({ folders, onFolderSelect }: FolderListProps) {\n if (folders.length === 0) {\n return (\n <Paper\n variant=\"outlined\"\n sx={{\n height: 500,\n borderWidth: 2,\n }}\n >\n <Typography color=\"text.secondary\" sx={{ p: 3 }}>\n No folders available\n </Typography>\n </Paper>\n );\n }\n\n return (\n <Paper\n variant=\"outlined\"\n sx={{\n height: 500,\n overflow: \"auto\",\n borderWidth: 2,\n }}\n >\n <Stack spacing={2} sx={{ p: 2 }}>\n {folders.map((folder) => (\n <FolderCard\n key={folder.id}\n folder={folder}\n onClick={() => onFolderSelect(folder.id)}\n />\n ))}\n </Stack>\n </Paper>\n );\n}\n","const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = ((createState) => createState ? createStoreImpl(createState) : createStoreImpl);\n\nexport { createStore };\n","import React from 'react';\nimport { createStore } from 'zustand/vanilla';\n\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity) {\n const slice = React.useSyncExternalStore(\n api.subscribe,\n React.useCallback(() => selector(api.getState()), [api, selector]),\n React.useCallback(() => selector(api.getInitialState()), [api, selector])\n );\n React.useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n const api = createStore(createState);\n const useBoundStore = (selector) => useStore(api, selector);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = ((createState) => createState ? createImpl(createState) : createImpl);\n\nexport { create, useStore };\n","import { create, StoreApi, UseBoundStore } from \"zustand\";\nimport { SelectionAction, SelectionState } from \"./types\";\n\nexport type SelectionStoreInstance = UseBoundStore<\n StoreApi<SelectionState & SelectionAction>\n>;\n\nconst DEFAULT_STORAGE_KEY = \"trackSelect_selection\";\n\ntype SerializedSelection = Record<string, string[]>;\n\nconst serializeSelection = (\n selection: Map<string, Set<string>>,\n): SerializedSelection => {\n const obj: SerializedSelection = {};\n selection.forEach((ids, folderId) => {\n obj[folderId] = Array.from(ids);\n });\n return obj;\n};\n\nconst deserializeSelection = (\n data: SerializedSelection,\n): Map<string, Set<string>> => {\n const map = new Map<string, Set<string>>();\n Object.entries(data).forEach(([folderId, ids]) => {\n map.set(folderId, new Set(ids));\n });\n return map;\n};\n\nconst loadFromStorage = (\n storageKey: string,\n): Map<string, Set<string>> | undefined => {\n try {\n const stored = sessionStorage.getItem(storageKey);\n if (stored) {\n const parsed = JSON.parse(stored) as SerializedSelection;\n return deserializeSelection(parsed);\n }\n } catch {\n // Ignore storage errors\n }\n return undefined;\n};\n\nconst saveToStorage = (\n selection: Map<string, Set<string>>,\n storageKey: string,\n) => {\n try {\n const serialized = serializeSelection(selection);\n sessionStorage.setItem(storageKey, JSON.stringify(serialized));\n } catch {\n // Ignore storage errors\n }\n};\n\nconst buildSelectionMap = (\n folderIds: string[],\n initialSelection?: Map<string, Set<string>>,\n) => {\n const map = new Map<string, Set<string>>();\n folderIds.forEach((folderId) => {\n const initial = initialSelection?.get(folderId);\n map.set(folderId, initial ? new Set(initial) : new Set<string>());\n });\n return map;\n};\n\nexport function createSelectionStore(\n folderIds: string[],\n storageKey: string = DEFAULT_STORAGE_KEY,\n initialSelection?: Map<string, Set<string>>,\n) {\n const storedSelection = loadFromStorage(storageKey);\n // Storage wins: use stored if exists, else fall back to initialSelection\n const selectedByFolder = buildSelectionMap(\n folderIds,\n storedSelection ?? initialSelection,\n );\n const activeFolderId = folderIds[0] ?? \"\";\n\n const store = create<SelectionState & SelectionAction>((set) => ({\n selectedByFolder,\n activeFolderId,\n clear: (folderId?: string) =>\n set((state) => {\n if (folderId) {\n const next = new Map(state.selectedByFolder);\n next.set(folderId, new Set<string>());\n return { selectedByFolder: next };\n }\n\n const next = new Map<string, Set<string>>();\n state.selectedByFolder.forEach((_value, id) => {\n next.set(id, new Set<string>());\n });\n return { selectedByFolder: next };\n }),\n setActiveFolder: (folderId: string) =>\n set(() => ({ activeFolderId: folderId })),\n setSelection: (folderId: string, ids: Set<string>) =>\n set((state) => {\n const next = new Map(state.selectedByFolder);\n next.set(folderId, new Set(ids));\n return { selectedByFolder: next };\n }),\n }));\n\n // Subscribe to changes and persist to storage\n store.subscribe((state) => {\n saveToStorage(state.selectedByFolder, storageKey);\n });\n\n return store;\n}\n","import Folder from \"@mui/icons-material/Folder\";\nimport IndeterminateCheckBoxRoundedIcon from \"@mui/icons-material/IndeterminateCheckBoxRounded\";\nimport { Box, Stack, Tooltip, Typography } from \"@mui/material\";\nimport Collapse from \"@mui/material/Collapse\";\nimport { alpha, styled } from \"@mui/material/styles\";\nimport {\n TreeItemCheckbox,\n TreeItemIconContainer,\n TreeItemLabel,\n} from \"@mui/x-tree-view/TreeItem\";\nimport { TreeItemIcon } from \"@mui/x-tree-view/TreeItemIcon\";\nimport { TreeItemProvider } from \"@mui/x-tree-view/TreeItemProvider\";\nimport { useTreeItemModel } from \"@mui/x-tree-view/hooks\";\nimport { useTreeItem } from \"@mui/x-tree-view/useTreeItem\";\nimport React, { ReactNode } from \"react\";\nimport {\n CustomLabelProps,\n CustomTreeItemProps,\n ExtendedTreeItemProps,\n} from \"../types\";\n\n// Everything below is styling for the custom directory look of the tree view\nconst TreeItemRoot = styled(\"li\")(({ theme }) => ({\n listStyle: \"none\",\n margin: 0,\n padding: 0,\n outline: 4,\n color: theme.palette.grey[400],\n ...theme.applyStyles(\"light\", {\n color: theme.palette.grey[600], // controls colors of the MUI icons\n }),\n}));\n\nconst TreeItemLabelText = styled(Typography)({\n color: \"black\",\n fontFamily: \"inherit\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n});\n\nfunction CustomLabel({\n icon: Icon,\n children,\n isAssayItem,\n assayName,\n renderIcon,\n ...other\n}: CustomLabelProps) {\n const variant = isAssayItem ? \"subtitle2\" : \"body2\";\n const fontWeight = isAssayItem ? \"bold\" : 500;\n const labelText = typeof children === \"string\" ? children : \"\";\n return (\n <TreeItemLabel\n {...other}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n minWidth: 0,\n overflow: \"hidden\",\n flex: 1,\n }}\n >\n {Icon && React.isValidElement(Icon) ? (\n <Box className=\"labelIcon\" sx={{ mr: 1, flexShrink: 0 }}>\n {Icon}\n </Box>\n ) : (\n <Box\n component={Icon as React.ElementType}\n className=\"labelIcon\"\n color=\"inherit\"\n sx={{ mr: 1, fontSize: \"1.2rem\", flexShrink: 0 }}\n />\n )}\n <Stack\n direction=\"row\"\n spacing={1}\n alignItems=\"center\"\n sx={{ minWidth: 0, overflow: \"hidden\", flex: 1 }}\n >\n {isAssayItem && renderIcon && (\n <Box sx={{ flexShrink: 0 }}>{renderIcon(other.id)}</Box>\n )}\n {assayName && renderIcon && (\n <Box sx={{ flexShrink: 0 }}>{renderIcon(assayName)}</Box>\n )}\n <Tooltip title={labelText} enterDelay={500} placement=\"top\">\n <TreeItemLabelText fontWeight={fontWeight} variant={variant}>\n {labelText}\n </TreeItemLabelText>\n </Tooltip>\n </Stack>\n </TreeItemLabel>\n );\n}\n\nconst TreeItemContent = styled(\"div\")(({ theme }) => ({\n padding: theme.spacing(0.5),\n paddingRight: theme.spacing(2),\n paddingLeft: `calc(${theme.spacing(1)} + var(--TreeView-itemChildrenIndentation) * var(--TreeView-itemDepth))`,\n width: \"100%\",\n boxSizing: \"border-box\", // prevent width + padding to overflow\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n gap: theme.spacing(1),\n cursor: \"pointer\",\n WebkitTapHighlightColor: \"transparent\",\n flexDirection: \"row-reverse\",\n borderRadius: theme.spacing(0.7),\n marginBottom: theme.spacing(0.5),\n marginTop: theme.spacing(0.5),\n fontWeight: 500,\n \"&:hover\": {\n backgroundColor: alpha(theme.palette.primary.main, 0.1),\n color: \"white\",\n ...theme.applyStyles(\"light\", {\n color: theme.palette.primary.main,\n }),\n },\n}));\n\nconst getIconFromTreeItemType = (\n itemType: string,\n renderIcon?: (name: string) => ReactNode,\n) => {\n switch (itemType) {\n case \"folder\":\n return Folder;\n case \"removeable\":\n return IndeterminateCheckBoxRoundedIcon;\n default:\n return renderIcon ? renderIcon(itemType) : Folder;\n }\n};\n\nexport const CustomTreeItem = React.forwardRef(function CustomTreeItem(\n props: CustomTreeItemProps,\n ref: React.Ref<HTMLLIElement>,\n) {\n const {\n id,\n itemId,\n label,\n disabled,\n children,\n onRemove,\n renderIcon,\n ...other\n } = props;\n\n const {\n getContextProviderProps,\n getRootProps,\n getContentProps,\n getIconContainerProps,\n getCheckboxProps,\n getLabelProps,\n getGroupTransitionProps,\n status,\n } = useTreeItem({ id, itemId, children, label, disabled, rootRef: ref });\n\n const item = useTreeItemModel<ExtendedTreeItemProps>(itemId)!;\n const icon = getIconFromTreeItemType(item.icon, renderIcon);\n\n const handleRemoveIconClick = (e: React.MouseEvent) => {\n e.stopPropagation(); // prevent item expand/select\n onRemove?.(item);\n };\n\n return (\n <TreeItemProvider {...getContextProviderProps()}>\n <TreeItemRoot {...getRootProps(other)}>\n <TreeItemContent {...getContentProps()}>\n <TreeItemIconContainer {...getIconContainerProps()}>\n <TreeItemIcon status={status} />\n </TreeItemIconContainer>\n <TreeItemCheckbox {...getCheckboxProps()} />\n <CustomLabel\n {...getLabelProps({\n icon:\n item.icon === \"removeable\" ? (\n <Box\n onClick={handleRemoveIconClick}\n sx={{\n width: 20,\n height: 20,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n mr: 1,\n \"&:hover\": {\n backgroundColor: \"rgba(0,0,0,0.1)\",\n },\n }}\n >\n <IndeterminateCheckBoxRoundedIcon fontSize=\"small\" />\n </Box>\n ) : (\n icon\n ),\n expandable: (status.expandable && status.expanded).toString(),\n isAssayItem: item.isAssayItem,\n assayName: item.assayName,\n id: item.id,\n renderIcon,\n })}\n />\n </TreeItemContent>\n {children && <Collapse {...getGroupTransitionProps()} />}\n </TreeItemRoot>\n </TreeItemProvider>\n );\n});\n","import { Avatar, Box, Paper, Typography } from \"@mui/material\";\nimport { RichTreeView, TreeViewBaseItem } from \"@mui/x-tree-view\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport {\n CustomTreeItemProps,\n ExtendedTreeItemProps,\n TreeViewWrapperProps,\n} from \"../types\";\nimport { CustomTreeItem } from \"./CustomTreeItem\";\n\n/**\n * Recursively collects all item IDs that have children (expandable items)\n */\nfunction getAllExpandableItemIds(\n items: TreeViewBaseItem<ExtendedTreeItemProps>[],\n): string[] {\n const ids: string[] = [];\n for (const item of items) {\n if (item.children && item.children.length > 0) {\n ids.push(item.id);\n ids.push(...getAllExpandableItemIds(item.children));\n }\n }\n return ids;\n}\n\nexport function TreeViewWrapper({\n items,\n selectedCount,\n onRemove,\n TreeItemComponent,\n}: TreeViewWrapperProps) {\n const allExpandableIds = useMemo(\n () => getAllExpandableItemIds(items),\n [items],\n );\n const [expandedItems, setExpandedItems] =\n useState<string[]>(allExpandableIds);\n\n // Auto-expand new items when they're added\n useEffect(() => {\n setExpandedItems((prev) => {\n const newIds = allExpandableIds.filter((id) => !prev.includes(id));\n if (newIds.length > 0) {\n return [...prev, ...newIds];\n }\n return prev;\n });\n }, [allExpandableIds]);\n\n const handleRemoveTreeItem = (\n item: TreeViewBaseItem<ExtendedTreeItemProps>,\n ) => {\n onRemove(item);\n };\n\n const TreeItem = TreeItemComponent ?? CustomTreeItem;\n\n return (\n <Paper\n sx={{\n height: 500,\n width: \"100%\",\n border: \"10px solid\",\n borderColor: \"grey.200\",\n boxSizing: \"border-box\",\n borderRadius: 2,\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 1,\n py: 1,\n backgroundColor: \"grey.200\",\n flexShrink: 0,\n }}\n >\n <Avatar\n sx={{\n width: 30,\n height: 30,\n fontSize: 14,\n fontWeight: \"bold\",\n bgcolor: \"white\",\n color: \"text.primary\",\n }}\n >\n {selectedCount}\n </Avatar>\n <Typography fontWeight=\"bold\">Active Tracks</Typography>\n </Box>\n <Box\n sx={{\n flex: 1,\n overflow: \"auto\",\n }}\n >\n <RichTreeView\n items={items}\n expandedItems={expandedItems}\n onExpandedItemsChange={(_event, ids) => setExpandedItems(ids)}\n slots={{ item: TreeItem }}\n slotProps={{\n item: {\n onRemove: handleRemoveTreeItem,\n } as Partial<CustomTreeItemProps>,\n }}\n sx={{\n ml: 1,\n mr: 1,\n height: \"100%\",\n }}\n itemChildrenIndentation={0}\n />\n </Box>\n </Paper>\n );\n}\n","import CloseIcon from \"@mui/icons-material/Close\";\nimport {\n Box,\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n IconButton,\n Stack,\n} from \"@mui/material\";\nimport { TreeViewBaseItem } from \"@mui/x-tree-view\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Breadcrumb } from \"./FolderList/Breadcrumb\";\nimport { DataGridWrapper } from \"./DataGrid/DataGridWrapper\";\nimport { FolderList } from \"./FolderList/FolderList\";\nimport { FolderDefinition, FolderRuntimeConfig } from \"./Folders/types\";\nimport { createSelectionStore, SelectionStoreInstance } from \"./store\";\nimport { TreeViewWrapper } from \"./TreeView/TreeViewWrapper\";\nimport { ExtendedTreeItemProps } from \"./types\";\n\nexport interface TrackSelectProps {\n folders: FolderDefinition[];\n onSubmit: (selectedByFolder: Map<string, Set<string>>) => void;\n onCancel?: () => void;\n onClear?: () => void;\n maxTracks?: number;\n storageKey?: string;\n /** Initial selection to use when no stored selection exists */\n initialSelection?: Map<string, Set<string>>;\n open: boolean;\n onClose: () => void;\n title?: string;\n}\n\nconst DEFAULT_MAX_TRACKS = 30;\n\ntype ViewState = \"folder-list\" | \"folder-detail\";\n\nconst cloneSelectionMap = (selection: Map<string, Set<string>>) => {\n const map = new Map<string, Set<string>>();\n selection.forEach((ids, folderId) => {\n map.set(folderId, new Set(ids));\n });\n return map;\n};\n\nconst buildRuntimeConfigMap = (folders: FolderDefinition[]) => {\n const map = new Map<string, FolderRuntimeConfig>();\n folders.forEach((folder) => {\n map.set(folder.id, {\n columns: folder.columns,\n groupingModel: folder.groupingModel,\n leafField: folder.leafField,\n });\n });\n return map;\n};\n\nconst attachFolderId = (\n items: TreeViewBaseItem<ExtendedTreeItemProps>[],\n folderId: string,\n): TreeViewBaseItem<ExtendedTreeItemProps>[] => {\n return items.map((item) => ({\n ...item,\n folderId,\n children: item.children\n ? attachFolderId(item.children, folderId)\n : undefined,\n }));\n};\n\nconst DEFAULT_TITLE = \"Track Select\";\n\nexport default function TrackSelect({\n folders,\n onSubmit,\n onCancel,\n onClear,\n maxTracks,\n storageKey,\n initialSelection,\n open,\n onClose,\n title = DEFAULT_TITLE,\n}: TrackSelectProps) {\n const [limitDialogOpen, setLimitDialogOpen] = useState(false);\n const [clearDialogOpen, setClearDialogOpen] = useState(false);\n const [runtimeConfigByFolder, setRuntimeConfigByFolder] = useState(() =>\n buildRuntimeConfigMap(folders),\n );\n\n // View state: folder list or folder detail\n const [currentView, setCurrentView] = useState<ViewState>(() =>\n folders.length > 1 ? \"folder-list\" : \"folder-detail\",\n );\n\n // Create and memoize the selection store\n const folderIds = useMemo(() => folders.map((f) => f.id), [folders]);\n const storeRef = useRef<SelectionStoreInstance | null>(null);\n if (!storeRef.current) {\n storeRef.current = createSelectionStore(\n folderIds,\n storageKey,\n initialSelection,\n );\n }\n const store = storeRef.current;\n\n // Subscribe to store changes\n const selectedByFolder = store((state) => state.selectedByFolder);\n const activeFolderId = store((state) => state.activeFolderId);\n const setActiveFolder = store((state) => state.setActiveFolder);\n const setSelection = store((state) => state.setSelection);\n const clear = store((state) => state.clear);\n\n // Keep a committed snapshot for cancel functionality\n const [committedSnapshot, setCommittedSnapshot] = useState(() =>\n cloneSelectionMap(selectedByFolder),\n );\n\n useEffect(() => {\n setRuntimeConfigByFolder(buildRuntimeConfigMap(folders));\n // Ensure active folder is valid\n if (!folders.some((folder) => folder.id === activeFolderId)) {\n setActiveFolder(folders[0]?.id ?? \"\");\n }\n // Update view state if folder count changes\n if (folders.length <= 1) {\n setCurrentView(\"folder-detail\");\n }\n }, [folders, activeFolderId, setActiveFolder]);\n\n const activeFolder = useMemo(() => {\n return folders.find((folder) => folder.id === activeFolderId) ?? folders[0];\n }, [folders, activeFolderId]);\n\n const activeConfig = useMemo(() => {\n if (!activeFolder) return undefined;\n return (\n runtimeConfigByFolder.get(activeFolder.id) ?? {\n columns: activeFolder.columns,\n groupingModel: activeFolder.groupingModel,\n leafField: activeFolder.leafField,\n }\n );\n }, [runtimeConfigByFolder, activeFolder]);\n\n const selectedIds = useMemo(() => {\n if (!activeFolder) return new Set<string>();\n return new Set(selectedByFolder.get(activeFolder.id) ?? []);\n }, [selectedByFolder, activeFolder]);\n\n const selectedCount = useMemo(() => {\n let total = 0;\n selectedByFolder.forEach((ids) => {\n total += ids.size;\n });\n return total;\n }, [selectedByFolder]);\n\n const maxTracksLimit = maxTracks ?? DEFAULT_MAX_TRACKS;\n\n const rows = useMemo(() => {\n if (!activeFolder) return [];\n return Array.from(activeFolder.rowById.values());\n }, [activeFolder]);\n\n const treeItems = useMemo(() => {\n if (!activeFolder) return [];\n return folders\n .filter((folder) => {\n const selected = selectedByFolder.get(folder.id);\n return selected && selected.size > 0;\n })\n .flatMap((folder) =>\n attachFolderId(\n folder.buildTree(\n Array.from(selectedByFolder.get(folder.id) ?? []),\n folder.rowById,\n ),\n folder.id,\n ),\n );\n }, [folders, selectedByFolder, activeFolder]);\n\n const updateActiveFolderConfig = useCallback(\n (partial: Partial<FolderRuntimeConfig>) => {\n if (!activeFolder) return;\n setRuntimeConfigByFolder((prev) => {\n const current = prev.get(activeFolder.id);\n if (!current) return prev;\n const next = new Map(prev);\n next.set(activeFolder.id, { ...current, ...partial });\n return next;\n });\n },\n [activeFolder],\n );\n\n // Navigation handlers\n const handleFolderSelect = (folderId: string) => {\n setActiveFolder(folderId);\n setCurrentView(\"folder-detail\");\n };\n\n const handleNavigateToRoot = () => {\n setCurrentView(\"folder-list\");\n };\n\n const handleSelectionChange = (ids: Set<string>) => {\n if (!activeFolder) return;\n\n // Filter to only include IDs that exist in rowById (exclude auto-generated group IDs)\n const filteredIds = new Set(\n Array.from(ids).filter((id) => activeFolder.rowById.has(id)),\n );\n\n // Calculate what the total would be with this change\n let nextTotal = filteredIds.size;\n selectedByFolder.forEach((folderIds, folderId) => {\n if (folderId !== activeFolder.id) {\n nextTotal += folderIds.size;\n }\n });\n\n if (nextTotal > maxTracksLimit) {\n setLimitDialogOpen(true);\n return;\n }\n\n setSelection(activeFolder.id, filteredIds);\n };\n\n const handleRemoveTreeItem = (\n item: TreeViewBaseItem<ExtendedTreeItemProps>,\n ) => {\n const folderId = item.folderId;\n if (!folderId || !item.allExpAccessions?.length) {\n return;\n }\n\n const current = selectedByFolder.get(folderId) ?? new Set<string>();\n const nextSet = new Set(current);\n item.allExpAccessions.forEach((id) => nextSet.delete(id));\n setSelection(folderId, nextSet);\n };\n\n const handleSubmit = () => {\n const committed = cloneSelectionMap(selectedByFolder);\n setCommittedSnapshot(committed);\n onSubmit(committed);\n onClose();\n };\n\n const handleCancel = () => {\n // Restore from committed snapshot\n committedSnapshot.forEach((ids, folderId) => {\n setSelection(folderId, ids);\n });\n onCancel?.();\n onClose();\n };\n\n const handleClear = () => {\n setClearDialogOpen(true);\n };\n\n const confirmClear = () => {\n setClearDialogOpen(false);\n let newSnapshot: Map<string, Set<string>>;\n\n if (currentView === \"folder-detail\") {\n // Clear only the current folder\n clear(activeFolderId);\n newSnapshot = cloneSelectionMap(selectedByFolder);\n newSnapshot.set(activeFolderId, new Set<string>());\n } else {\n // Clear all folders\n clear();\n newSnapshot = new Map<string, Set<string>>();\n folderIds.forEach((id) => newSnapshot.set(id, new Set<string>()));\n onClear?.();\n }\n\n setCommittedSnapshot(newSnapshot);\n onSubmit(newSnapshot);\n };\n\n const ToolbarExtras = activeFolder?.ToolbarExtras;\n\n return (\n <Dialog open={open} onClose={handleCancel} maxWidth=\"lg\" fullWidth>\n <DialogTitle\n sx={{\n bgcolor: \"#0c184a\",\n color: \"white\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n fontWeight: \"bold\",\n }}\n >\n {title}\n <IconButton\n size=\"large\"\n onClick={handleCancel}\n sx={{ color: \"white\", padding: 0 }}\n >\n <CloseIcon fontSize=\"large\" />\n </IconButton>\n </DialogTitle>\n <DialogContent sx={{ marginTop: \"5px\" }}>\n {!activeFolder || !activeConfig ? (\n <Box sx={{ p: 2 }}>No folders available.</Box>\n ) : (\n <Box sx={{ flex: 1, pt: 1 }}>\n {/* Toolbar row - breadcrumb on left, extras on right */}\n {(folders.length > 1 ||\n (currentView === \"folder-detail\" && ToolbarExtras)) && (\n <Box\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n sx={{ mb: 2 }}\n >\n {folders.length > 1 ? (\n <Breadcrumb\n currentFolder={\n currentView === \"folder-detail\" ? activeFolder : null\n }\n onNavigateToRoot={handleNavigateToRoot}\n />\n ) : (\n <Box />\n )}\n {currentView === \"folder-detail\" && ToolbarExtras && (\n <ToolbarExtras updateConfig={updateActiveFolderConfig} />\n )}\n </Box>\n )}\n\n <Stack direction=\"row\" spacing={2} sx={{ width: \"100%\" }}>\n {/* Left panel - swaps between FolderList and DataGrid */}\n <Box sx={{ flex: 3, minWidth: 0 }}>\n {currentView === \"folder-list\" ? (\n <FolderList\n folders={folders}\n onFolderSelect={handleFolderSelect}\n />\n ) : (\n <DataGridWrapper\n rows={rows}\n columns={activeConfig.columns}\n groupingModel={activeConfig.groupingModel}\n leafField={activeConfig.leafField}\n label={`${rows.length} Available ${activeFolder.label}`}\n selectedIds={selectedIds}\n onSelectionChange={handleSelectionChange}\n GroupingCellComponent={activeFolder.GroupingCellComponent}\n />\n )}\n </Box>\n {/* Right panel - always visible */}\n <Box sx={{ flex: 2, minWidth: 0 }}>\n <TreeViewWrapper\n items={treeItems}\n selectedCount={selectedCount}\n onRemove={handleRemoveTreeItem}\n TreeItemComponent={activeFolder.TreeItemComponent}\n />\n </Box>\n </Stack>\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"space-between\",\n mt: 2,\n gap: 2,\n }}\n >\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n onClick={handleClear}\n >\n Clear\n </Button>\n <Box sx={{ display: \"flex\", gap: 2 }}>\n <Button variant=\"outlined\" onClick={handleCancel}>\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={handleSubmit}\n >\n Submit\n </Button>\n </Box>\n </Box>\n <Dialog\n open={limitDialogOpen}\n onClose={() => setLimitDialogOpen(false)}\n >\n <DialogTitle>Track Limit Reached</DialogTitle>\n <DialogContent>\n <DialogContentText>\n You can select up to {maxTracksLimit} tracks at a time. Please\n remove a track before adding another.\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setLimitDialogOpen(false)} autoFocus>\n OK\n </Button>\n </DialogActions>\n </Dialog>\n <Dialog\n open={clearDialogOpen}\n onClose={() => setClearDialogOpen(false)}\n >\n <DialogTitle\n sx={{\n bgcolor: \"#0c184a\",\n color: \"white\",\n fontWeight: \"bold\",\n }}\n >\n {currentView === \"folder-detail\"\n ? `Clear ${activeFolder.label}`\n : \"Clear All Folders\"}\n </DialogTitle>\n <DialogContent sx={{ mt: 2 }}>\n <DialogContentText>\n {currentView === \"folder-detail\" ? (\n <>\n Are you sure you want to clear the selection for{\" \"}\n <strong>{activeFolder.label}</strong>?\n </>\n ) : (\n \"Are you sure you want to clear all selections?\"\n )}\n </DialogContentText>\n </DialogContent>\n <DialogActions sx={{ justifyContent: \"center\", gap: 2, pb: 2 }}>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => setClearDialogOpen(false)}\n autoFocus\n >\n Cancel\n </Button>\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n onClick={confirmClear}\n >\n Clear\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n )}\n </DialogContent>\n </Dialog>\n );\n}\n","import { Box } from \"@mui/material\";\nimport type { Assembly } from \"../../types\";\n\nexport type { Assembly };\n\nexport const assayTypes = [\n \"cCRE\",\n \"DNase\",\n \"H3K4me3\",\n \"H3K27ac\",\n \"ATAC\",\n \"CTCF\",\n \"RNA-seq\",\n \"ChromHMM\",\n];\n\nexport const ontologyTypes = [\n \"Aggregate\",\n \"Adipose\",\n \"Adrenal gland\",\n \"Blood\",\n \"Blood vessel\",\n \"Bone\",\n \"Bone marrow\",\n \"Brain\",\n \"Breast\",\n \"Connective tissue\",\n \"Embryo\",\n \"Epithelium\",\n \"Esophagus\",\n \"Eye\",\n \"Fallopian Tube\",\n \"Gallbladder\",\n \"Heart\",\n \"Kidney\",\n \"Large Intestine\",\n \"Limb\",\n \"Liver\",\n \"Lung\",\n \"Lymphoid Tissue\",\n \"Muscle\",\n \"Mouth\",\n \"Nerve\",\n \"Nose\",\n \"Pancreas\",\n \"Parathyroid Gland\",\n \"Ovary\",\n \"Penis\",\n \"Placenta\",\n \"Prostate\",\n \"Skin\",\n \"Small Intestine\",\n \"Spinal Cord\",\n \"Spleen\",\n \"Stomach\",\n \"Testis\",\n \"Thymus\",\n \"Thyroid\",\n \"Urinary Bladder\",\n \"Uterus\",\n \"Vagina\",\n];\n\n/** Color mapping for assay types */\nexport const assayColorMap: { [key: string]: string } = {\n DNase: \"#06da93\",\n ATAC: \"#02c7b9\",\n H3K4me3: \"#ff2020\",\n ChromHMM: \"#0097a7\",\n H3K27ac: \"#fdc401\",\n CTCF: \"#01a6f1\",\n cCRE: \"#000000\",\n \"RNA-seq\": \"#00aa00\",\n};\n\n/**\n * Creates the assay icon for DataGrid and RichTreeView\n * @param type - assay type\n * @returns an icon of the assay's respective color\n */\nexport function AssayIcon(type: string) {\n const color = assayColorMap[type];\n return (\n <Box\n sx={{\n width: 12,\n height: 12,\n borderRadius: \"20%\",\n bgcolor: color,\n }}\n />\n );\n}\n\n/**\n * Mapping from JSON assay keys to display names.\n * This is the single source of truth for assay name formatting.\n */\nconst assayJsonToDisplay: Record<string, string> = {\n dnase: \"DNase\",\n atac: \"ATAC\",\n h3k4me3: \"H3K4me3\",\n h3k27ac: \"H3K27ac\",\n ctcf: \"CTCF\",\n chromhmm: \"ChromHMM\",\n ccre: \"cCRE\",\n rnaseq: \"RNA-seq\",\n};\n\n/**\n * Convert JSON assay key to display name.\n * Used only during data loading to normalize assay names.\n */\nexport function formatAssayType(jsonKey: string): string {\n return assayJsonToDisplay[jsonKey.toLowerCase()] ?? jsonKey;\n}\n","import { GridColDef } from \"@mui/x-data-grid-premium\";\nimport { Stack, capitalize } from \"@mui/material\";\nimport { AssayIcon, ontologyTypes, assayTypes } from \"./constants\";\nimport { BiosampleRowInfo } from \"./types\";\n\nconst displayNameCol: GridColDef<BiosampleRowInfo> = {\n field: \"displayName\",\n headerName: \"Name\",\n valueFormatter: (value) => value && capitalize(value),\n maxWidth: 300,\n};\n\nconst sortedByAssayOntologyCol: GridColDef<BiosampleRowInfo> = {\n field: \"ontology\",\n headerName: \"Ontology\",\n type: \"singleSelect\",\n valueOptions: ontologyTypes,\n renderCell: (params) => {\n if (params.rowNode.type === \"group\") {\n if (params.value === undefined) {\n return null;\n }\n const val = params.value;\n return (\n <div>\n <b>{val}</b>\n </div>\n );\n }\n },\n};\n\nconst sortedByAssayAssayCol: GridColDef<BiosampleRowInfo> = {\n field: \"assay\",\n headerName: \"Assay\",\n valueOptions: assayTypes,\n renderCell: (params) => {\n if (params.rowNode.type === \"group\") {\n if (params.value === undefined) {\n return null;\n }\n const val = params.value;\n return (\n <Stack direction=\"row\" spacing={2} alignItems=\"center\">\n {AssayIcon(val)}\n <div>\n <b>{val}</b>\n </div>\n </Stack>\n );\n }\n },\n};\n\nconst defaultOntologyCol: GridColDef<BiosampleRowInfo> = {\n field: \"ontology\",\n headerName: \"Ontology\",\n type: \"singleSelect\",\n valueOptions: ontologyTypes,\n renderCell: (params) => {\n if (params.rowNode.type === \"group\") {\n if (params.value === undefined) {\n return null;\n }\n const val = params.value;\n return (\n <div>\n <b>{val}</b>\n </div>\n );\n }\n },\n};\n\nconst defaultAssayCol: GridColDef<BiosampleRowInfo> = {\n field: \"assay\",\n headerName: \"Assay\",\n valueOptions: assayTypes,\n renderCell: (params) => {\n if (params.value === undefined) {\n return null;\n }\n const val = params.value;\n return (\n <Stack direction=\"row\" spacing={2} alignItems=\"center\" sx={{ ml: 6 }}>\n {AssayIcon(val)}\n <div>{val}</div>\n </Stack>\n );\n },\n};\n\nconst sampleTypeCol: GridColDef<BiosampleRowInfo> = {\n field: \"sampleType\",\n headerName: \"Sample Type\",\n type: \"singleSelect\",\n valueOptions: [\n \"aggregate\",\n \"tissue\",\n \"primary cell\",\n \"cell line\",\n \"in vitro differentiated cells\",\n \"organoid\",\n ],\n valueFormatter: (value) => value && capitalize(value),\n};\n\nconst lifeStageCol: GridColDef<BiosampleRowInfo> = {\n field: \"lifeStage\",\n headerName: \"Life Stage\",\n type: \"singleSelect\",\n valueOptions: [\"adult\", \"embryonic\", \"N/A\"],\n valueFormatter: (value) => value && capitalize(value),\n};\n\nconst experimentCol: GridColDef<BiosampleRowInfo> = {\n field: \"experimentAccession\",\n headerName: \"Experiment Accession\",\n};\n\nconst fileCol: GridColDef<BiosampleRowInfo> = {\n field: \"fileAccession\",\n headerName: \"File Accession\",\n};\n\nconst idCol: GridColDef<BiosampleRowInfo> = {\n field: \"id\",\n headerName: \"ID\",\n};\n\n/** Columns for sorted-by-assay view (assay as top-level grouping) */\nexport const sortedByAssayColumns: GridColDef<BiosampleRowInfo>[] = [\n displayNameCol,\n sortedByAssayOntologyCol,\n sampleTypeCol,\n lifeStageCol,\n sortedByAssayAssayCol,\n experimentCol,\n fileCol,\n idCol,\n];\n\n/** Default columns (ontology as top-level grouping) */\nexport const defaultColumns: GridColDef<BiosampleRowInfo>[] = [\n defaultAssayCol,\n sampleTypeCol,\n lifeStageCol,\n defaultOntologyCol,\n displayNameCol,\n experimentCol,\n fileCol,\n idCol,\n];\n\n/** Grouping model for sorted-by-assay view */\nexport const sortedByAssayGroupingModel = [\"assay\", \"ontology\", \"displayName\"];\n\n/** Default grouping model (ontology-based) */\nexport const defaultGroupingModel = [\"ontology\", \"displayName\"];\n\n/** Leaf field for sorted-by-assay view */\nexport const sortedByAssayLeafField = \"id\";\n\n/** Default leaf field */\nexport const defaultLeafField = \"assay\";\n","import { TreeViewBaseItem } from \"@mui/x-tree-view\";\nimport { ExtendedTreeItemProps } from \"../../../types\";\nimport { BiosampleRowInfo } from \"./types\";\nimport { assayTypes, ontologyTypes, formatAssayType } from \"./constants\";\n\n/** Format an ID like \"h3k27ac-ENCFF922YMQ\" or \"folder::h3k27ac-ENCFF922YMQ\" to \"H3K27ac - ENCFF922YMQ\" */\nfunction formatIdLabel(id: string): string {\n // Remove folder prefix if present (e.g., \"FolderName::h3k27ac-ENCFF922YMQ\" -> \"h3k27ac-ENCFF922YMQ\")\n const rawId = id.includes(\"::\") ? id.split(\"::\").pop()! : id;\n\n const hyphenIndex = rawId.indexOf(\"-\");\n if (hyphenIndex === -1) return rawId;\n\n const assayPart = rawId.substring(0, hyphenIndex);\n const accessionPart = rawId.substring(hyphenIndex + 1);\n\n return `${formatAssayType(assayPart)} - ${accessionPart}`;\n}\n\n/**\n * Creates the root node for the tree view\n */\nfunction createRootNode(\n label: string,\n folderId: string,\n): TreeViewBaseItem<ExtendedTreeItemProps> {\n return {\n id: `${folderId}::root`,\n label,\n icon: \"folder\",\n children: [],\n allExpAccessions: [],\n };\n}\n\n/**\n * Builds tree in the sorted by assay view\n * Hierarchy: Assay -> Ontology -> DisplayName -> Experiment\n *\n * @param selectedIds - list of selected row IDs\n * @param rowById - Mapping between an id and its BiosampleRowInfo object\n * @param rootLabel - Label for the root node\n * @param folderId - Folder ID to prefix tree item IDs with\n * @returns tree items for the RichTreeView\n */\nexport function buildSortedAssayTreeView(\n selectedIds: string[],\n rowById: Map<string, BiosampleRowInfo>,\n rootLabel: string = \"Biosamples\",\n folderId: string = \"\",\n): TreeViewBaseItem<ExtendedTreeItemProps>[] {\n const root = createRootNode(rootLabel, folderId);\n const assayMap = new Map<string, TreeViewBaseItem<ExtendedTreeItemProps>>();\n const ontologyMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n const displayNameMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n\n const selectedRows = selectedIds.reduce<BiosampleRowInfo[]>((acc, id) => {\n const row = rowById.get(id);\n if (row) acc.push(row);\n return acc;\n }, []);\n\n selectedRows.forEach((row) => {\n const assayKey = `${folderId}::${row.assay}`;\n let assayNode = assayMap.get(assayKey);\n if (!assayNode) {\n assayNode = {\n id: assayKey,\n isAssayItem: true,\n label: row.assay,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n assayMap.set(assayKey, assayNode);\n root.children!.push(assayNode);\n }\n\n const ontologyKey = `${folderId}::${row.assay}-${row.ontology}`;\n let ontologyNode = ontologyMap.get(ontologyKey);\n if (!ontologyNode) {\n ontologyNode = {\n id: ontologyKey,\n isAssayItem: false,\n label: row.ontology,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n assayNode.children!.push(ontologyNode);\n ontologyMap.set(ontologyKey, ontologyNode);\n }\n\n const displayNameKey = `${folderId}::${row.assay}-${row.ontology}-${row.displayName}`;\n let displayNameNode = displayNameMap.get(displayNameKey);\n if (!displayNameNode) {\n displayNameNode = {\n id: displayNameKey,\n isAssayItem: false,\n label: row.displayName,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n ontologyNode.children!.push(displayNameNode);\n displayNameMap.set(displayNameKey, displayNameNode);\n }\n\n const expNode: TreeViewBaseItem<ExtendedTreeItemProps> = {\n id: row.id,\n isAssayItem: false,\n label: formatIdLabel(row.id),\n icon: \"removeable\",\n assayName: row.assay,\n children: [],\n allExpAccessions: [row.id],\n };\n displayNameNode.children!.push(expNode);\n\n assayNode.allExpAccessions!.push(row.id);\n ontologyNode.allExpAccessions!.push(row.id);\n displayNameNode.allExpAccessions!.push(row.id);\n });\n\n // standardize the order of the assay folders\n root.children!.sort((a, b): number => {\n const aAssay = a.id.split(\"::\")[1] ?? a.id;\n const bAssay = b.id.split(\"::\")[1] ?? b.id;\n return assayTypes.indexOf(aAssay) - assayTypes.indexOf(bAssay);\n });\n\n return [root];\n}\n\n/**\n * Builds tree in the default view (sorted by ontology)\n * Hierarchy: Ontology -> DisplayName -> Experiment\n *\n * @param selectedIds - list of selected row IDs\n * @param rowById - Mapping between an id and its BiosampleRowInfo object\n * @param rootLabel - Label for the root node\n * @param folderId - Folder ID to prefix tree item IDs with\n * @returns tree items for the RichTreeView\n */\nexport function buildTreeView(\n selectedIds: string[],\n rowById: Map<string, BiosampleRowInfo>,\n rootLabel: string = \"Biosamples\",\n folderId: string = \"\",\n): TreeViewBaseItem<ExtendedTreeItemProps>[] {\n const root = createRootNode(rootLabel, folderId);\n const ontologyMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n const displayNameMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n\n const selectedRows = selectedIds.reduce<BiosampleRowInfo[]>((acc, id) => {\n const row = rowById.get(id);\n if (row) acc.push(row);\n return acc;\n }, []);\n\n selectedRows.forEach((row) => {\n if (!row) {\n return;\n }\n const ontologyKey = `${folderId}::${row.ontology}`;\n let ontologyNode = ontologyMap.get(ontologyKey);\n if (!ontologyNode) {\n ontologyNode = {\n id: ontologyKey,\n label: row.ontology,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n ontologyMap.set(ontologyKey, ontologyNode);\n root.children!.push(ontologyNode);\n }\n\n const displayNameKey = `${folderId}::${row.ontology}-${row.displayName}`;\n let displayNameNode = displayNameMap.get(displayNameKey);\n if (!displayNameNode) {\n displayNameNode = {\n id: displayNameKey,\n label: row.displayName,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n ontologyNode.children!.push(displayNameNode);\n displayNameMap.set(displayNameKey, displayNameNode);\n }\n\n const expNode: TreeViewBaseItem<ExtendedTreeItemProps> = {\n id: row.id,\n label: formatIdLabel(row.id),\n icon: \"removeable\",\n assayName: row.assay,\n children: [],\n allExpAccessions: [row.id],\n };\n displayNameNode.children!.push(expNode);\n\n ontologyNode.allExpAccessions!.push(row.id);\n displayNameNode.allExpAccessions!.push(row.id);\n });\n\n // standardize the order of the ontology folders\n root.children!.sort((a, b): number => {\n const aOntology = a.id.split(\"::\")[1] ?? a.id;\n const bOntology = b.id.split(\"::\")[1] ?? b.id;\n return ontologyTypes.indexOf(aOntology) - ontologyTypes.indexOf(bOntology);\n });\n\n return [root];\n}\n","import { FormControlLabel, Switch } from \"@mui/material\";\nimport { useState } from \"react\";\nimport { FolderRuntimeConfig } from \"../../types\";\nimport {\n defaultColumns,\n defaultGroupingModel,\n defaultLeafField,\n sortedByAssayColumns,\n sortedByAssayGroupingModel,\n sortedByAssayLeafField,\n} from \"./columns\";\n\nexport interface AssayToggleProps {\n updateConfig: (partial: Partial<FolderRuntimeConfig>) => void;\n}\n\n/**\n * Biosample-specific toolbar component that toggles between\n * sample-grouped and assay-grouped views.\n *\n * When toggled, it updates the folder's runtime config to switch:\n * - columns: Different column definitions for each view\n * - groupingModel: [\"ontology\", \"displayName\"] vs [\"assay\", \"ontology\", \"displayName\"]\n * - leafField: \"assay\" vs \"id\"\n */\nexport function AssayToggle({ updateConfig }: AssayToggleProps) {\n const [sortedByAssay, setSortedByAssay] = useState(false);\n\n const handleToggle = () => {\n const newValue = !sortedByAssay;\n setSortedByAssay(newValue);\n\n if (newValue) {\n // Switch to assay-grouped view\n updateConfig({\n columns: sortedByAssayColumns,\n groupingModel: sortedByAssayGroupingModel,\n leafField: sortedByAssayLeafField,\n });\n } else {\n // Switch back to default (sample-grouped) view\n updateConfig({\n columns: defaultColumns,\n groupingModel: defaultGroupingModel,\n leafField: defaultLeafField,\n });\n }\n };\n\n return (\n <FormControlLabel\n sx={{ display: \"flex\", justifyContent: \"flex-end\" }}\n value=\"Sort by assay\"\n control={\n <Switch\n color=\"primary\"\n checked={sortedByAssay}\n onChange={handleToggle}\n />\n }\n label=\"Sort by assay\"\n labelPlacement=\"end\"\n />\n );\n}\n","import { Stack, Tooltip, Box, IconButton } from \"@mui/material\";\nimport {\n GridRenderCellParams,\n useGridApiContext,\n GridGroupNode,\n} from \"@mui/x-data-grid-premium\";\nimport { assayTypes, AssayIcon } from \"./constants\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\n\n/**\n * Biosample-specific grouping cell that renders AssayIcon for assay groups/values.\n * Handles expand/collapse, truncation, and tooltips.\n */\nexport default function BiosampleGroupingCell(params: GridRenderCellParams) {\n const apiRef = useGridApiContext();\n const isGroup = params.rowNode.type === \"group\";\n const groupNode = params.rowNode as GridGroupNode;\n const isExpanded = isGroup ? groupNode.childrenExpanded : false;\n const groupingField = isGroup ? groupNode.groupingField : null;\n const depth = params.rowNode.depth ?? 0;\n\n const handleExpandClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n apiRef.current.setRowChildrenExpansion(params.id, !isExpanded);\n };\n\n // Render content based on grouping field\n const renderContent = () => {\n const value = String(params.value ?? \"\");\n\n // For assay groups, show the colored icon\n if (isGroup && groupingField === \"assay\") {\n return (\n <Stack\n direction=\"row\"\n spacing={1}\n alignItems=\"center\"\n sx={{ flex: 1, overflow: \"hidden\" }}\n >\n {AssayIcon(value)}\n <Tooltip title={value} placement=\"top-start\" enterDelay={500}>\n <Box\n sx={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n fontWeight: \"bold\",\n }}\n >\n {params.formattedValue}\n </Box>\n </Tooltip>\n </Stack>\n );\n }\n\n // For other groups (ontology, displayName), show bold text\n if (isGroup) {\n return (\n <Tooltip title={value} placement=\"top-start\" enterDelay={500}>\n <Box\n sx={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n flex: 1,\n fontWeight: \"bold\",\n }}\n >\n {params.formattedValue}\n </Box>\n </Tooltip>\n );\n }\n\n // For leaf rows - check if it's an assay value\n const isAssayValue = assayTypes\n .map((a) => a.toLowerCase())\n .includes(value.toLowerCase());\n\n if (isAssayValue) {\n return (\n <Stack\n direction=\"row\"\n spacing={1}\n alignItems=\"center\"\n sx={{ flex: 1, overflow: \"hidden\" }}\n >\n {AssayIcon(value)}\n <Tooltip title={value} placement=\"top-start\" enterDelay={500}>\n <Box\n sx={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {params.formattedValue}\n </Box>\n </Tooltip>\n </Stack>\n );\n }\n\n return (\n <Tooltip title={value} placement=\"top-start\" enterDelay={500}>\n <Box\n sx={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n flex: 1,\n }}\n >\n {params.formattedValue}\n </Box>\n </Tooltip>\n );\n };\n\n // Indent based on depth (2 units per level)\n const indentLevel = depth * 2;\n\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n ml: indentLevel,\n }}\n >\n {isGroup && (\n <IconButton size=\"small\" onClick={handleExpandClick} sx={{ mr: 0.5 }}>\n {isExpanded ? (\n <ExpandMoreIcon fontSize=\"small\" />\n ) : (\n <ChevronRightIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n {renderContent()}\n </Box>\n );\n}\n","import React from \"react\";\nimport { CustomTreeItem } from \"../../../TreeView/CustomTreeItem\";\nimport { CustomTreeItemProps } from \"../../../types\";\nimport { AssayIcon } from \"./constants\";\n\n/**\n * Biosample-specific TreeItem that renders AssayIcon for assay items.\n * Wraps the generic CustomTreeItem with the AssayIcon renderer.\n */\nexport const BiosampleTreeItem = React.forwardRef<\n HTMLLIElement,\n CustomTreeItemProps\n>(function BiosampleTreeItem(props, ref) {\n return <CustomTreeItem {...props} ref={ref} renderIcon={AssayIcon} />;\n});\n","import { capitalize } from \"@mui/material\";\nimport { FolderDefinition } from \"../../types\";\nimport {\n BiosampleDataFile,\n BiosampleRowInfo,\n BiosampleTrackInfo,\n} from \"./types\";\nimport {\n defaultColumns,\n defaultGroupingModel,\n defaultLeafField,\n} from \"./columns\";\nimport { buildTreeView } from \"./treeBuilder\";\nimport { formatAssayType } from \"./constants\";\nimport { AssayToggle } from \"./AssayToggle\";\nimport BiosampleGroupingCell from \"./BiosampleGroupingCell\";\nimport { BiosampleTreeItem } from \"./BiosampleTreeItem\";\n\n/**\n * Flattens TrackInfo into RowInfo objects for DataGrid display.\n * Each track can have multiple assays, so this creates one row per assay.\n *\n * @param track - TrackInfo object from JSON data\n * @returns Array of flattened BiosampleRowInfo objects, one per assay\n */\nfunction flattenTrackIntoRows(track: BiosampleTrackInfo): BiosampleRowInfo[] {\n const { ontology, lifeStage, sampleType, displayName } = track;\n\n return track.assays.map(\n ({ id, assay, experimentAccession, fileAccession, url }) => ({\n id,\n ontology: capitalize(ontology),\n lifeStage: capitalize(lifeStage),\n sampleType: capitalize(sampleType),\n displayName: capitalize(displayName),\n assay: formatAssayType(assay),\n experimentAccession,\n fileAccession,\n url,\n }),\n );\n}\n\n/**\n * Transforms raw JSON data into flattened rows and a lookup map.\n * Prefixes each row ID with the folder ID to ensure uniqueness across folders.\n *\n * @param data - Raw biosample data from JSON file\n * @param folderId - Folder ID to prefix row IDs with\n * @returns Object containing rows array and rowById map\n */\nfunction transformData(data: BiosampleDataFile): {\n rowById: Map<string, BiosampleRowInfo>;\n} {\n const rows = data.tracks.flatMap(flattenTrackIntoRows).map((row) => ({\n ...row,\n id: row.id,\n }));\n const rowById = new Map<string, BiosampleRowInfo>(\n rows.map((row) => [row.id, row]),\n );\n return { rowById };\n}\n\nexport interface CreateBiosampleFolderOptions {\n /** Unique identifier for this folder */\n id: string;\n /** Display label shown in the UI */\n label: string;\n /** Optional description shown in folder cards */\n description?: string;\n /** Raw biosample data from JSON file */\n data: BiosampleDataFile;\n}\n\n/**\n * Factory function that creates a FolderDefinition for biosample data.\n *\n * This handles all the common setup for biosample folders:\n * - Transforms JSON data into flattened rows\n * - Creates the rowById lookup map\n * - Configures columns, grouping, and tree building\n *\n * @param options - Configuration options for the folder\n * @returns A complete FolderDefinition for the biosample data\n */\nexport function createBiosampleFolder(\n options: CreateBiosampleFolderOptions,\n): FolderDefinition<BiosampleRowInfo> {\n const { id, label, description, data } = options;\n const { rowById } = transformData(data);\n\n return {\n id,\n label,\n description,\n rowById,\n getRowId: (row) => row.id,\n\n // Default view: ontology-based grouping\n columns: defaultColumns,\n groupingModel: defaultGroupingModel,\n leafField: defaultLeafField,\n\n // Build tree for selected items panel\n buildTree: (selectedIds, rowById) =>\n buildTreeView(selectedIds, rowById, label, id),\n\n // Biosample-specific toolbar: toggle between sample-grouped and assay-grouped views\n ToolbarExtras: AssayToggle,\n\n // Biosample-specific custom components\n GroupingCellComponent: BiosampleGroupingCell,\n TreeItemComponent: BiosampleTreeItem,\n };\n}\n","import { createBiosampleFolder } from \"./shared/createFolder\";\nimport humanData from \"./data/human.json\";\nimport { BiosampleDataFile } from \"./shared/types\";\n\n/**\n * Human biosamples folder configuration for GRCh38 assembly.\n *\n * Contains epigenomic data (DNase, ATAC, H3K4me3, H3K27ac, CTCF, cCRE, RNA-seq, ChromHMM)\n * from human tissue samples, primary cells, cell lines, and organoids.\n */\nexport const humanBiosamplesFolder = createBiosampleFolder({\n id: \"human-biosamples\",\n label: \"Human Biosamples\",\n description:\n \"Epigenomic data from human tissue samples, primary cells, cell lines, and organoids.\",\n data: humanData as BiosampleDataFile,\n});\n","import { createBiosampleFolder } from \"./shared/createFolder\";\nimport mouseData from \"./data/mouse.json\";\nimport { BiosampleDataFile } from \"./shared/types\";\n\n/**\n * Mouse biosamples folder configuration for mm10 assembly.\n *\n * Contains epigenomic data (DNase, ATAC, H3K4me3, H3K27ac, CTCF, cCRE, RNA-seq, ChromHMM)\n * from mouse tissue samples, primary cells, cell lines, and organoids.\n */\nexport const mouseBiosamplesFolder = createBiosampleFolder({\n id: \"mouse-biosamples\",\n label: \"Mouse Biosamples\",\n description:\n \"Epigenomic data from mouse tissue samples, primary cells, cell lines, and organoids.\",\n data: mouseData as BiosampleDataFile,\n});\n","import { GridColDef } from \"@mui/x-data-grid-premium\";\nimport { GeneRowInfo } from \"./types\";\n\n/**\n * Format versions array as comma-separated string with \"v\" prefix\n * e.g., [29, 40] -> \"v29, v40\"\n */\nfunction formatVersions(versions: number[]): string {\n return versions.map((v) => `v${v}`).join(\", \");\n}\n\nconst displayNameCol: GridColDef<GeneRowInfo> = {\n field: \"displayName\",\n headerName: \"Name\",\n flex: 1,\n minWidth: 200,\n};\n\nconst versionsCol: GridColDef<GeneRowInfo> = {\n field: \"versions\",\n headerName: \"Versions\",\n width: 150,\n valueFormatter: (value: number[]) => value && formatVersions(value),\n};\n\n/**\n * Default columns for genes DataGrid (flat list, no grouping)\n */\nexport const defaultColumns: GridColDef<GeneRowInfo>[] = [\n displayNameCol,\n versionsCol,\n];\n\n/**\n * No grouping for genes - flat list\n */\nexport const defaultGroupingModel: string[] = [];\n\n/**\n * Leaf field - the unique identifier\n */\nexport const defaultLeafField = \"id\";\n","import { TreeViewBaseItem } from \"@mui/x-tree-view\";\nimport { ExtendedTreeItemProps } from \"../../../types\";\nimport { GeneRowInfo } from \"./types\";\n\n/**\n * Builds a flat tree structure for the TreeView panel (selected items)\n * Since genes have no grouping, this is a simple root -> leaf structure\n *\n * @param selectedIds - Array of selected row IDs\n * @param rowById - Map of row ID to row data\n * @param rootLabel - Label for the root node\n * @returns Tree structure for RichTreeView\n */\nexport function buildTreeView(\n selectedIds: string[],\n rowById: Map<string, GeneRowInfo>,\n rootLabel: string = \"Genes\",\n): TreeViewBaseItem<ExtendedTreeItemProps>[] {\n // Root node\n const root: TreeViewBaseItem<ExtendedTreeItemProps> = {\n id: \"root\",\n label: rootLabel,\n icon: \"folder\",\n children: [],\n allExpAccessions: [],\n };\n\n // Get selected rows and add as direct children of root\n selectedIds.forEach((id) => {\n const row = rowById.get(id);\n if (row) {\n const leafNode: TreeViewBaseItem<ExtendedTreeItemProps> = {\n id: row.id,\n label: row.displayName,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [row.id],\n };\n root.children!.push(leafNode);\n root.allExpAccessions!.push(row.id);\n }\n });\n\n return [root];\n}\n","import { FolderDefinition } from \"../../types\";\nimport { GeneDataFile, GeneRowInfo, GeneTrackInfo } from \"./types\";\nimport {\n defaultColumns,\n defaultGroupingModel,\n defaultLeafField,\n} from \"./columns\";\nimport { buildTreeView } from \"./treeBuilder\";\n\n/**\n * Transforms a single track from JSON into a row for DataGrid\n * For genes, this is a 1:1 mapping (no flattening needed)\n */\nfunction trackToRow(track: GeneTrackInfo): GeneRowInfo {\n return {\n id: track.id,\n displayName: track.displayName,\n versions: track.versions,\n };\n}\n\n/**\n * Transforms raw JSON data into rows and lookup map\n */\nfunction transformData(data: GeneDataFile): {\n rows: GeneRowInfo[];\n rowById: Map<string, GeneRowInfo>;\n} {\n const rows = data.map(trackToRow);\n const rowById = new Map<string, GeneRowInfo>(\n rows.map((row) => [row.id, row]),\n );\n return { rows, rowById };\n}\n\nexport interface CreateGeneFolderOptions {\n id: string;\n label: string;\n description?: string;\n data: GeneDataFile;\n}\n\n/**\n * Factory function that creates a FolderDefinition for genes\n */\nexport function createGeneFolder(\n options: CreateGeneFolderOptions,\n): FolderDefinition<GeneRowInfo> {\n const { id, label, description, data } = options;\n const { rowById } = transformData(data);\n\n return {\n id,\n label,\n description,\n rowById,\n getRowId: (row) => row.id,\n\n // Default view configuration\n columns: defaultColumns,\n groupingModel: defaultGroupingModel,\n leafField: defaultLeafField,\n\n // Tree builder for selected items panel\n buildTree: (selectedIds, rowById) =>\n buildTreeView(selectedIds, rowById, label),\n };\n}\n","import { createGeneFolder } from \"./shared/createFolder\";\nimport humanData from \"./data/human.json\";\nimport { GeneDataFile } from \"./shared/types\";\n\n/**\n * Gene annotations folder for human (GRCh38 assembly)\n *\n * Contains gene annotation tracks like GENCODE that users can\n * select to display in the genome browser.\n */\nexport const humanGenesFolder = createGeneFolder({\n id: \"human-genes\",\n label: \"Genes\",\n description: \"Gene annotation tracks\",\n data: humanData as GeneDataFile,\n});\n","import { createGeneFolder } from \"./shared/createFolder\";\nimport mouseData from \"./data/mouse.json\";\nimport { GeneDataFile } from \"./shared/types\";\n\n/**\n * Gene annotations folder for human (GRCh38 assembly)\n *\n * Contains gene annotation tracks like GENCODE that users can\n * select to display in the genome browser.\n */\nexport const mouseGenesFolder = createGeneFolder({\n id: \"mouse-genes\",\n label: \"Genes\",\n description: \"Gene annotation tracks\",\n data: mouseData as GeneDataFile,\n});\n","import { Assembly, FolderDefinition } from \"./types\";\nimport { humanBiosamplesFolder } from \"./biosamples/human\";\nimport { mouseBiosamplesFolder } from \"./biosamples/mouse\";\nimport { humanGenesFolder } from \"./genes/human\";\nimport { mouseGenesFolder } from \"./genes/mouse\";\n\nexport {\n type Assembly,\n type FolderDefinition,\n type FolderRuntimeConfig,\n} from \"./types\";\n\nexport type { BiosampleRowInfo } from \"./biosamples/shared/types\";\nexport type { GeneRowInfo } from \"./genes/shared/types\";\n\n/**\n * Registry of folders available for each assembly.\n *\n * Each assembly can have multiple folders (e.g., biosamples, genes, etc.).\n * TrackSelect receives the folders for the current assembly and renders\n * them as tabs or a folder selector.\n *\n * To add a new folder:\n * 1. Create a folder config file (e.g., folders/genes/human.ts)\n * 2. Import and add it to the appropriate assembly array below\n */\nexport const foldersByAssembly: Record<Assembly, FolderDefinition[]> = {\n GRCh38: [humanGenesFolder, humanBiosamplesFolder],\n mm10: [mouseGenesFolder, mouseBiosamplesFolder],\n};\n"],"names":["REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","owner","debugStack","debugTask","refProp","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","node","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","Breadcrumb","currentFolder","onNavigateToRoot","Breadcrumbs","NavigateNextIcon","jsx","Link","Typography","DefaultGroupingCell","params","apiRef","useGridApiContext","isGroup","groupNode","isExpanded","depth","handleExpandClick","e","indentLevel","jsxs","Box","IconButton","ExpandMoreIcon","ChevronRightIcon","Tooltip","autosizeOptions","DataGridWrapper","columns","groupingModel","leafField","onSelectionChange","rows","selectedIds","GroupingCellComponent","GroupingCell","useGridApiRef","useEffect","baseVisibility","useMemo","visibility","field","columnVisibilityModel","setColumnVisibilityModel","useState","filterColumns","column","getTogglableColumns","Paper","DataGridPremium","row","selection","ids","FolderCard","folder","onClick","FolderList","folders","onFolderSelect","Stack","createStoreImpl","createState","state","listeners","setState","partial","replace","nextState","previousState","listener","getState","api","initialState","createStore","identity","arg","useStore","selector","slice","createImpl","useBoundStore","create","DEFAULT_STORAGE_KEY","serializeSelection","obj","folderId","deserializeSelection","data","map","loadFromStorage","storageKey","stored","parsed","saveToStorage","serialized","buildSelectionMap","folderIds","initialSelection","initial","createSelectionStore","storedSelection","selectedByFolder","activeFolderId","store","set","next","_value","id","TreeItemRoot","styled","theme","TreeItemLabelText","CustomLabel","Icon","isAssayItem","assayName","renderIcon","other","variant","fontWeight","labelText","TreeItemLabel","TreeItemContent","alpha","getIconFromTreeItemType","itemType","Folder","IndeterminateCheckBoxRoundedIcon","CustomTreeItem","ref","itemId","label","disabled","onRemove","getContextProviderProps","getRootProps","getContentProps","getIconContainerProps","getCheckboxProps","getLabelProps","getGroupTransitionProps","status","useTreeItem","item","useTreeItemModel","icon","handleRemoveIconClick","TreeItemProvider","TreeItemIconContainer","TreeItemIcon","TreeItemCheckbox","Collapse","getAllExpandableItemIds","items","TreeViewWrapper","selectedCount","TreeItemComponent","allExpandableIds","expandedItems","setExpandedItems","prev","newIds","handleRemoveTreeItem","TreeItem","Avatar","RichTreeView","_event","DEFAULT_MAX_TRACKS","cloneSelectionMap","buildRuntimeConfigMap","attachFolderId","DEFAULT_TITLE","TrackSelect","onSubmit","onCancel","onClear","maxTracks","open","onClose","title","limitDialogOpen","setLimitDialogOpen","clearDialogOpen","setClearDialogOpen","runtimeConfigByFolder","setRuntimeConfigByFolder","currentView","setCurrentView","f","storeRef","useRef","setActiveFolder","setSelection","clear","committedSnapshot","setCommittedSnapshot","_a","activeFolder","activeConfig","total","maxTracksLimit","treeItems","selected","updateActiveFolderConfig","useCallback","current","handleFolderSelect","handleNavigateToRoot","handleSelectionChange","filteredIds","nextTotal","nextSet","handleSubmit","committed","handleCancel","handleClear","confirmClear","newSnapshot","ToolbarExtras","Dialog","DialogTitle","CloseIcon","DialogContent","Button","DialogContentText","DialogActions","Fragment","assayTypes","ontologyTypes","assayColorMap","AssayIcon","color","assayJsonToDisplay","formatAssayType","jsonKey","displayNameCol","capitalize","sortedByAssayOntologyCol","val","sortedByAssayAssayCol","defaultOntologyCol","defaultAssayCol","sampleTypeCol","lifeStageCol","experimentCol","fileCol","idCol","sortedByAssayColumns","defaultColumns","sortedByAssayGroupingModel","defaultGroupingModel","sortedByAssayLeafField","defaultLeafField","formatIdLabel","rawId","hyphenIndex","assayPart","accessionPart","createRootNode","buildTreeView","rowById","rootLabel","root","ontologyMap","displayNameMap","acc","ontologyKey","ontologyNode","displayNameKey","displayNameNode","expNode","a","b","aOntology","bOntology","AssayToggle","updateConfig","sortedByAssay","setSortedByAssay","handleToggle","newValue","FormControlLabel","Switch","BiosampleGroupingCell","groupingField","renderContent","BiosampleTreeItem","flattenTrackIntoRows","track","ontology","lifeStage","sampleType","assay","experimentAccession","fileAccession","url","transformData","createBiosampleFolder","options","description","humanBiosamplesFolder","humanData","mouseBiosamplesFolder","mouseData","formatVersions","versions","v","versionsCol","leafNode","trackToRow","createGeneFolder","humanGenesFolder","mouseGenesFolder","foldersByAssembly"],"mappings":"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","x_google_ignoreList":[0,1,2,8,9]}
package/dist/lib.d.ts CHANGED
@@ -4,3 +4,4 @@ import { foldersByAssembly } from './TrackSelect/Folders/index.ts';
4
4
  export { TrackSelect, TrackSelectProps };
5
5
  export { createSelectionStore, SelectionStoreInstance };
6
6
  export { foldersByAssembly };
7
+ export type { BiosampleRowInfo, GeneRowInfo } from './TrackSelect/Folders';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@weng-lab/genomebrowser-ui",
3
3
  "private": false,
4
- "version": "0.2.0-beta.0",
4
+ "version": "0.2.0-beta.2",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "publishConfig": {
@@ -1,6 +1,6 @@
1
1
  [
2
2
  {
3
- "id": "genocode-basic",
3
+ "id": "gencode-basic",
4
4
  "displayName": "GENCODE Basic Genes",
5
5
  "versions": [29, 40]
6
6
  }
@@ -1,6 +1,6 @@
1
1
  [
2
2
  {
3
- "id": "genocode-basic",
3
+ "id": "gencode-basic",
4
4
  "displayName": "GENCODE Basic Genes",
5
5
  "versions": [21, 25]
6
6
  }
@@ -10,6 +10,9 @@ export {
10
10
  type FolderRuntimeConfig,
11
11
  } from "./types";
12
12
 
13
+ export type { BiosampleRowInfo } from "./biosamples/shared/types";
14
+ export type { GeneRowInfo } from "./genes/shared/types";
15
+
13
16
  /**
14
17
  * Registry of folders available for each assembly.
15
18
  *
package/src/lib.ts CHANGED
@@ -9,3 +9,5 @@ export { createSelectionStore, SelectionStoreInstance };
9
9
 
10
10
  import { foldersByAssembly } from "./TrackSelect/Folders/index.ts";
11
11
  export { foldersByAssembly };
12
+
13
+ export type { BiosampleRowInfo, GeneRowInfo } from "./TrackSelect/Folders";
package/test/main.tsx CHANGED
@@ -359,11 +359,11 @@ export function setLocalTracks(tracks: Track[], assembly: string) {
359
359
 
360
360
  // Default selections for TrackSelect UI (uses folder row IDs)
361
361
  const defaultHumanSelections = new Map<string, Set<string>>([
362
- ["human-genes", new Set(["genocode-basic"])],
362
+ ["human-genes", new Set(["gencode-basic"])],
363
363
  ["human-biosamples", new Set(["ccre-aggregate", "dnase-aggregate"])],
364
364
  ]);
365
365
 
366
366
  const defaultMouseSelections = new Map<string, Set<string>>([
367
- ["mouse-genes", new Set(["genocode-basic"])],
367
+ ["mouse-genes", new Set(["gencode-basic"])],
368
368
  ["mouse-biosamples", new Set(["ccre-aggregate", "dnase-aggregate"])],
369
369
  ]);