@weng-lab/genomebrowser-ui 0.1.11 → 0.1.12

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.
@@ -1616,8 +1616,8 @@ function j(s) {
1616
1616
  ChromHMM: "#0097a7",
1617
1617
  H3K27ac: "#fdc401",
1618
1618
  CTCF: "#01a6f1",
1619
- cCRE: "#8b5cf6",
1620
- "RNA-seq": "#f97316"
1619
+ cCRE: "#000000",
1620
+ "RNA-seq": "#00aa00"
1621
1621
  }[s];
1622
1622
  return /* @__PURE__ */ d.jsx(
1623
1623
  V,
@@ -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","../../../node_modules/.pnpm/fuse.js@7.1.0/node_modules/fuse.js/dist/fuse.mjs","../src/TrackSelect/DataGrid/dataGridHelpers.tsx","../src/TrackSelect/consts.ts","../src/TrackSelect/TreeView/treeViewHelpers.tsx","../src/TrackSelect/DataGrid/columns.tsx","../src/TrackSelect/DataGrid/GroupingCell.tsx","../src/TrackSelect/DataGrid/DataGridWrapper.tsx","../src/TrackSelect/TreeView/TreeViewWrapper.tsx","../src/TrackSelect/TrackSelect.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"],"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","/**\n * Fuse.js v7.1.0 - Lightweight fuzzy-search (http://fusejs.io)\n *\n * Copyright (c) 2025 Kiro Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction isArray(value) {\n return !Array.isArray\n ? getTag(value) === '[object Array]'\n : Array.isArray(value)\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js\nconst INFINITY = 1 / 0;\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value\n }\n let result = value + '';\n return result == '0' && 1 / value == -INFINITY ? '-0' : result\n}\n\nfunction toString(value) {\n return value == null ? '' : baseToString(value)\n}\n\nfunction isString(value) {\n return typeof value === 'string'\n}\n\nfunction isNumber(value) {\n return typeof value === 'number'\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js\nfunction isBoolean(value) {\n return (\n value === true ||\n value === false ||\n (isObjectLike(value) && getTag(value) == '[object Boolean]')\n )\n}\n\nfunction isObject(value) {\n return typeof value === 'object'\n}\n\n// Checks if `value` is object-like.\nfunction isObjectLike(value) {\n return isObject(value) && value !== null\n}\n\nfunction isDefined(value) {\n return value !== undefined && value !== null\n}\n\nfunction isBlank(value) {\n return !value.trim().length\n}\n\n// Gets the `toStringTag` of `value`.\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js\nfunction getTag(value) {\n return value == null\n ? value === undefined\n ? '[object Undefined]'\n : '[object Null]'\n : Object.prototype.toString.call(value)\n}\n\nconst EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available';\n\nconst INCORRECT_INDEX_TYPE = \"Incorrect 'index' type\";\n\nconst LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) =>\n `Invalid value for key ${key}`;\n\nconst PATTERN_LENGTH_TOO_LARGE = (max) =>\n `Pattern length exceeds max of ${max}.`;\n\nconst MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`;\n\nconst INVALID_KEY_WEIGHT_VALUE = (key) =>\n `Property 'weight' in key '${key}' must be a positive integer`;\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nclass KeyStore {\n constructor(keys) {\n this._keys = [];\n this._keyMap = {};\n\n let totalWeight = 0;\n\n keys.forEach((key) => {\n let obj = createKey(key);\n\n this._keys.push(obj);\n this._keyMap[obj.id] = obj;\n\n totalWeight += obj.weight;\n });\n\n // Normalize weights so that their sum is equal to 1\n this._keys.forEach((key) => {\n key.weight /= totalWeight;\n });\n }\n get(keyId) {\n return this._keyMap[keyId]\n }\n keys() {\n return this._keys\n }\n toJSON() {\n return JSON.stringify(this._keys)\n }\n}\n\nfunction createKey(key) {\n let path = null;\n let id = null;\n let src = null;\n let weight = 1;\n let getFn = null;\n\n if (isString(key) || isArray(key)) {\n src = key;\n path = createKeyPath(key);\n id = createKeyId(key);\n } else {\n if (!hasOwn.call(key, 'name')) {\n throw new Error(MISSING_KEY_PROPERTY('name'))\n }\n\n const name = key.name;\n src = name;\n\n if (hasOwn.call(key, 'weight')) {\n weight = key.weight;\n\n if (weight <= 0) {\n throw new Error(INVALID_KEY_WEIGHT_VALUE(name))\n }\n }\n\n path = createKeyPath(name);\n id = createKeyId(name);\n getFn = key.getFn;\n }\n\n return { path, id, weight, src, getFn }\n}\n\nfunction createKeyPath(key) {\n return isArray(key) ? key : key.split('.')\n}\n\nfunction createKeyId(key) {\n return isArray(key) ? key.join('.') : key\n}\n\nfunction get(obj, path) {\n let list = [];\n let arr = false;\n\n const deepGet = (obj, path, index) => {\n if (!isDefined(obj)) {\n return\n }\n if (!path[index]) {\n // If there's no path left, we've arrived at the object we care about.\n list.push(obj);\n } else {\n let key = path[index];\n\n const value = obj[key];\n\n if (!isDefined(value)) {\n return\n }\n\n // If we're at the last value in the path, and if it's a string/number/bool,\n // add it to the list\n if (\n index === path.length - 1 &&\n (isString(value) || isNumber(value) || isBoolean(value))\n ) {\n list.push(toString(value));\n } else if (isArray(value)) {\n arr = true;\n // Search each item in the array.\n for (let i = 0, len = value.length; i < len; i += 1) {\n deepGet(value[i], path, index + 1);\n }\n } else if (path.length) {\n // An object. Recurse further.\n deepGet(value, path, index + 1);\n }\n }\n };\n\n // Backwards compatibility (since path used to be a string)\n deepGet(obj, isString(path) ? path.split('.') : path, 0);\n\n return arr ? list : list[0]\n}\n\nconst MatchOptions = {\n // Whether the matches should be included in the result set. When `true`, each record in the result\n // set will include the indices of the matched characters.\n // These can consequently be used for highlighting purposes.\n includeMatches: false,\n // When `true`, the matching function will continue to the end of a search pattern even if\n // a perfect match has already been located in the string.\n findAllMatches: false,\n // Minimum number of characters that must be matched before a result is considered a match\n minMatchCharLength: 1\n};\n\nconst BasicOptions = {\n // When `true`, the algorithm continues searching to the end of the input even if a perfect\n // match is found before the end of the same input.\n isCaseSensitive: false,\n // When `true`, the algorithm will ignore diacritics (accents) in comparisons\n ignoreDiacritics: false,\n // When true, the matching function will continue to the end of a search pattern even if\n includeScore: false,\n // List of properties that will be searched. This also supports nested properties.\n keys: [],\n // Whether to sort the result list, by score\n shouldSort: true,\n // Default sort function: sort by ascending score, ascending index\n sortFn: (a, b) =>\n a.score === b.score ? (a.idx < b.idx ? -1 : 1) : a.score < b.score ? -1 : 1\n};\n\nconst FuzzyOptions = {\n // Approximately where in the text is the pattern expected to be found?\n location: 0,\n // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match\n // (of both letters and location), a threshold of '1.0' would match anything.\n threshold: 0.6,\n // Determines how close the match must be to the fuzzy location (specified above).\n // An exact letter match which is 'distance' characters away from the fuzzy location\n // would score as a complete mismatch. A distance of '0' requires the match be at\n // the exact location specified, a threshold of '1000' would require a perfect match\n // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold.\n distance: 100\n};\n\nconst AdvancedOptions = {\n // When `true`, it enables the use of unix-like search commands\n useExtendedSearch: false,\n // The get function to use when fetching an object's properties.\n // The default will search nested paths *ie foo.bar.baz*\n getFn: get,\n // When `true`, search will ignore `location` and `distance`, so it won't matter\n // where in the string the pattern appears.\n // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score\n ignoreLocation: false,\n // When `true`, the calculation for the relevance score (used for sorting) will\n // ignore the field-length norm.\n // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm\n ignoreFieldNorm: false,\n // The weight to determine how much field length norm effects scoring.\n fieldNormWeight: 1\n};\n\nvar Config = {\n ...BasicOptions,\n ...MatchOptions,\n ...FuzzyOptions,\n ...AdvancedOptions\n};\n\nconst SPACE = /[^ ]+/g;\n\n// Field-length norm: the shorter the field, the higher the weight.\n// Set to 3 decimals to reduce index size.\nfunction norm(weight = 1, mantissa = 3) {\n const cache = new Map();\n const m = Math.pow(10, mantissa);\n\n return {\n get(value) {\n const numTokens = value.match(SPACE).length;\n\n if (cache.has(numTokens)) {\n return cache.get(numTokens)\n }\n\n // Default function is 1/sqrt(x), weight makes that variable\n const norm = 1 / Math.pow(numTokens, 0.5 * weight);\n\n // In place of `toFixed(mantissa)`, for faster computation\n const n = parseFloat(Math.round(norm * m) / m);\n\n cache.set(numTokens, n);\n\n return n\n },\n clear() {\n cache.clear();\n }\n }\n}\n\nclass FuseIndex {\n constructor({\n getFn = Config.getFn,\n fieldNormWeight = Config.fieldNormWeight\n } = {}) {\n this.norm = norm(fieldNormWeight, 3);\n this.getFn = getFn;\n this.isCreated = false;\n\n this.setIndexRecords();\n }\n setSources(docs = []) {\n this.docs = docs;\n }\n setIndexRecords(records = []) {\n this.records = records;\n }\n setKeys(keys = []) {\n this.keys = keys;\n this._keysMap = {};\n keys.forEach((key, idx) => {\n this._keysMap[key.id] = idx;\n });\n }\n create() {\n if (this.isCreated || !this.docs.length) {\n return\n }\n\n this.isCreated = true;\n\n // List is Array<String>\n if (isString(this.docs[0])) {\n this.docs.forEach((doc, docIndex) => {\n this._addString(doc, docIndex);\n });\n } else {\n // List is Array<Object>\n this.docs.forEach((doc, docIndex) => {\n this._addObject(doc, docIndex);\n });\n }\n\n this.norm.clear();\n }\n // Adds a doc to the end of the index\n add(doc) {\n const idx = this.size();\n\n if (isString(doc)) {\n this._addString(doc, idx);\n } else {\n this._addObject(doc, idx);\n }\n }\n // Removes the doc at the specified index of the index\n removeAt(idx) {\n this.records.splice(idx, 1);\n\n // Change ref index of every subsquent doc\n for (let i = idx, len = this.size(); i < len; i += 1) {\n this.records[i].i -= 1;\n }\n }\n getValueForItemAtKeyId(item, keyId) {\n return item[this._keysMap[keyId]]\n }\n size() {\n return this.records.length\n }\n _addString(doc, docIndex) {\n if (!isDefined(doc) || isBlank(doc)) {\n return\n }\n\n let record = {\n v: doc,\n i: docIndex,\n n: this.norm.get(doc)\n };\n\n this.records.push(record);\n }\n _addObject(doc, docIndex) {\n let record = { i: docIndex, $: {} };\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n this.keys.forEach((key, keyIndex) => {\n let value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path);\n\n if (!isDefined(value)) {\n return\n }\n\n if (isArray(value)) {\n let subRecords = [];\n const stack = [{ nestedArrIndex: -1, value }];\n\n while (stack.length) {\n const { nestedArrIndex, value } = stack.pop();\n\n if (!isDefined(value)) {\n continue\n }\n\n if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n i: nestedArrIndex,\n n: this.norm.get(value)\n };\n\n subRecords.push(subRecord);\n } else if (isArray(value)) {\n value.forEach((item, k) => {\n stack.push({\n nestedArrIndex: k,\n value: item\n });\n });\n } else ;\n }\n record.$[keyIndex] = subRecords;\n } else if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n n: this.norm.get(value)\n };\n\n record.$[keyIndex] = subRecord;\n }\n });\n\n this.records.push(record);\n }\n toJSON() {\n return {\n keys: this.keys,\n records: this.records\n }\n }\n}\n\nfunction createIndex(\n keys,\n docs,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys.map(createKey));\n myIndex.setSources(docs);\n myIndex.create();\n return myIndex\n}\n\nfunction parseIndex(\n data,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const { keys, records } = data;\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys);\n myIndex.setIndexRecords(records);\n return myIndex\n}\n\nfunction computeScore$1(\n pattern,\n {\n errors = 0,\n currentLocation = 0,\n expectedLocation = 0,\n distance = Config.distance,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n const accuracy = errors / pattern.length;\n\n if (ignoreLocation) {\n return accuracy\n }\n\n const proximity = Math.abs(expectedLocation - currentLocation);\n\n if (!distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy\n }\n\n return accuracy + proximity / distance\n}\n\nfunction convertMaskToIndices(\n matchmask = [],\n minMatchCharLength = Config.minMatchCharLength\n) {\n let indices = [];\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (let len = matchmask.length; i < len; i += 1) {\n let match = matchmask[i];\n if (match && start === -1) {\n start = i;\n } else if (!match && start !== -1) {\n end = i - 1;\n if (end - start + 1 >= minMatchCharLength) {\n indices.push([start, end]);\n }\n start = -1;\n }\n }\n\n // (i-1 - start) + 1 => i - start\n if (matchmask[i - 1] && i - start >= minMatchCharLength) {\n indices.push([start, i - 1]);\n }\n\n return indices\n}\n\n// Machine word size\nconst MAX_BITS = 32;\n\nfunction search(\n text,\n pattern,\n patternAlphabet,\n {\n location = Config.location,\n distance = Config.distance,\n threshold = Config.threshold,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n includeMatches = Config.includeMatches,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n if (pattern.length > MAX_BITS) {\n throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS))\n }\n\n const patternLen = pattern.length;\n // Set starting location at beginning text and initialize the alphabet.\n const textLen = text.length;\n // Handle the case when location > text.length\n const expectedLocation = Math.max(0, Math.min(location, textLen));\n // Highest score beyond which we give up.\n let currentThreshold = threshold;\n // Is there a nearby exact match? (speedup)\n let bestLocation = expectedLocation;\n\n // Performance: only computer matches when the minMatchCharLength > 1\n // OR if `includeMatches` is true.\n const computeMatches = minMatchCharLength > 1 || includeMatches;\n // A mask of the matches, used for building the indices\n const matchMask = computeMatches ? Array(textLen) : [];\n\n let index;\n\n // Get all exact matches, here for speed up\n while ((index = text.indexOf(pattern, bestLocation)) > -1) {\n let score = computeScore$1(pattern, {\n currentLocation: index,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n currentThreshold = Math.min(score, currentThreshold);\n bestLocation = index + patternLen;\n\n if (computeMatches) {\n let i = 0;\n while (i < patternLen) {\n matchMask[index + i] = 1;\n i += 1;\n }\n }\n }\n\n // Reset the best location\n bestLocation = -1;\n\n let lastBitArr = [];\n let finalScore = 1;\n let binMax = patternLen + textLen;\n\n const mask = 1 << (patternLen - 1);\n\n for (let i = 0; i < patternLen; i += 1) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from the match location we can stray\n // at this error level.\n let binMin = 0;\n let binMid = binMax;\n\n while (binMin < binMid) {\n const score = computeScore$1(pattern, {\n errors: i,\n currentLocation: expectedLocation + binMid,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score <= currentThreshold) {\n binMin = binMid;\n } else {\n binMax = binMid;\n }\n\n binMid = Math.floor((binMax - binMin) / 2 + binMin);\n }\n\n // Use the result from this iteration as the maximum for the next.\n binMax = binMid;\n\n let start = Math.max(1, expectedLocation - binMid + 1);\n let finish = findAllMatches\n ? textLen\n : Math.min(expectedLocation + binMid, textLen) + patternLen;\n\n // Initialize the bit array\n let bitArr = Array(finish + 2);\n\n bitArr[finish + 1] = (1 << i) - 1;\n\n for (let j = finish; j >= start; j -= 1) {\n let currentLocation = j - 1;\n let charMatch = patternAlphabet[text.charAt(currentLocation)];\n\n if (computeMatches) {\n // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`)\n matchMask[currentLocation] = +!!charMatch;\n }\n\n // First pass: exact match\n bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch;\n\n // Subsequent passes: fuzzy match\n if (i) {\n bitArr[j] |=\n ((lastBitArr[j + 1] | lastBitArr[j]) << 1) | 1 | lastBitArr[j + 1];\n }\n\n if (bitArr[j] & mask) {\n finalScore = computeScore$1(pattern, {\n errors: i,\n currentLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (finalScore <= currentThreshold) {\n // Indeed it is\n currentThreshold = finalScore;\n bestLocation = currentLocation;\n\n // Already passed `loc`, downhill from here on in.\n if (bestLocation <= expectedLocation) {\n break\n }\n\n // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`.\n start = Math.max(1, 2 * expectedLocation - bestLocation);\n }\n }\n }\n\n // No hope for a (better) match at greater error levels.\n const score = computeScore$1(pattern, {\n errors: i + 1,\n currentLocation: expectedLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score > currentThreshold) {\n break\n }\n\n lastBitArr = bitArr;\n }\n\n const result = {\n isMatch: bestLocation >= 0,\n // Count exact matches (those with a score of 0) to be \"almost\" exact\n score: Math.max(0.001, finalScore)\n };\n\n if (computeMatches) {\n const indices = convertMaskToIndices(matchMask, minMatchCharLength);\n if (!indices.length) {\n result.isMatch = false;\n } else if (includeMatches) {\n result.indices = indices;\n }\n }\n\n return result\n}\n\nfunction createPatternAlphabet(pattern) {\n let mask = {};\n\n for (let i = 0, len = pattern.length; i < len; i += 1) {\n const char = pattern.charAt(i);\n mask[char] = (mask[char] || 0) | (1 << (len - i - 1));\n }\n\n return mask\n}\n\nconst stripDiacritics = String.prototype.normalize\n ? ((str) => str.normalize('NFD').replace(/[\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u07FD\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D3-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u09FE\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0AFA-\\u0AFF\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C04\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D00-\\u0D03\\u0D3B\\u0D3C\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF7-\\u1CF9\\u1DC0-\\u1DF9\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA8FF\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F]/g, ''))\n : ((str) => str);\n\nclass BitapSearch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n this.options = {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreDiacritics,\n ignoreLocation\n };\n\n pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n pattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n this.pattern = pattern;\n\n this.chunks = [];\n\n if (!this.pattern.length) {\n return\n }\n\n const addChunk = (pattern, startIndex) => {\n this.chunks.push({\n pattern,\n alphabet: createPatternAlphabet(pattern),\n startIndex\n });\n };\n\n const len = this.pattern.length;\n\n if (len > MAX_BITS) {\n let i = 0;\n const remainder = len % MAX_BITS;\n const end = len - remainder;\n\n while (i < end) {\n addChunk(this.pattern.substr(i, MAX_BITS), i);\n i += MAX_BITS;\n }\n\n if (remainder) {\n const startIndex = len - MAX_BITS;\n addChunk(this.pattern.substr(startIndex), startIndex);\n }\n } else {\n addChunk(this.pattern, 0);\n }\n }\n\n searchIn(text) {\n const { isCaseSensitive, ignoreDiacritics, includeMatches } = this.options;\n\n text = isCaseSensitive ? text : text.toLowerCase();\n text = ignoreDiacritics ? stripDiacritics(text) : text;\n\n // Exact match\n if (this.pattern === text) {\n let result = {\n isMatch: true,\n score: 0\n };\n\n if (includeMatches) {\n result.indices = [[0, text.length - 1]];\n }\n\n return result\n }\n\n // Otherwise, use Bitap algorithm\n const {\n location,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n ignoreLocation\n } = this.options;\n\n let allIndices = [];\n let totalScore = 0;\n let hasMatches = false;\n\n this.chunks.forEach(({ pattern, alphabet, startIndex }) => {\n const { isMatch, score, indices } = search(text, pattern, alphabet, {\n location: location + startIndex,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n includeMatches,\n ignoreLocation\n });\n\n if (isMatch) {\n hasMatches = true;\n }\n\n totalScore += score;\n\n if (isMatch && indices) {\n allIndices = [...allIndices, ...indices];\n }\n });\n\n let result = {\n isMatch: hasMatches,\n score: hasMatches ? totalScore / this.chunks.length : 1\n };\n\n if (hasMatches && includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n}\n\nclass BaseMatch {\n constructor(pattern) {\n this.pattern = pattern;\n }\n static isMultiMatch(pattern) {\n return getMatch(pattern, this.multiRegex)\n }\n static isSingleMatch(pattern) {\n return getMatch(pattern, this.singleRegex)\n }\n search(/*text*/) {}\n}\n\nfunction getMatch(pattern, exp) {\n const matches = pattern.match(exp);\n return matches ? matches[1] : null\n}\n\n// Token: 'file\n\nclass ExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'exact'\n }\n static get multiRegex() {\n return /^=\"(.*)\"$/\n }\n static get singleRegex() {\n return /^=(.*)$/\n }\n search(text) {\n const isMatch = text === this.pattern;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !fire\n\nclass InverseExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!(.*)$/\n }\n search(text) {\n const index = text.indexOf(this.pattern);\n const isMatch = index === -1;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: ^file\n\nclass PrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'prefix-exact'\n }\n static get multiRegex() {\n return /^\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^\\^(.*)$/\n }\n search(text) {\n const isMatch = text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !^fire\n\nclass InversePrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-prefix-exact'\n }\n static get multiRegex() {\n return /^!\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!\\^(.*)$/\n }\n search(text) {\n const isMatch = !text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: .file$\n\nclass SuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'suffix-exact'\n }\n static get multiRegex() {\n return /^\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^(.*)\\$$/\n }\n search(text) {\n const isMatch = text.endsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [text.length - this.pattern.length, text.length - 1]\n }\n }\n}\n\n// Token: !.file$\n\nclass InverseSuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-suffix-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^!(.*)\\$$/\n }\n search(text) {\n const isMatch = !text.endsWith(this.pattern);\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\nclass FuzzyMatch extends BaseMatch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n super(pattern);\n this._bitapSearch = new BitapSearch(pattern, {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreDiacritics,\n ignoreLocation\n });\n }\n static get type() {\n return 'fuzzy'\n }\n static get multiRegex() {\n return /^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^(.*)$/\n }\n search(text) {\n return this._bitapSearch.searchIn(text)\n }\n}\n\n// Token: 'file\n\nclass IncludeMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'include'\n }\n static get multiRegex() {\n return /^'\"(.*)\"$/\n }\n static get singleRegex() {\n return /^'(.*)$/\n }\n search(text) {\n let location = 0;\n let index;\n\n const indices = [];\n const patternLen = this.pattern.length;\n\n // Get all exact matches\n while ((index = text.indexOf(this.pattern, location)) > -1) {\n location = index + patternLen;\n indices.push([index, location - 1]);\n }\n\n const isMatch = !!indices.length;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices\n }\n }\n}\n\n// ❗Order is important. DO NOT CHANGE.\nconst searchers = [\n ExactMatch,\n IncludeMatch,\n PrefixExactMatch,\n InversePrefixExactMatch,\n InverseSuffixExactMatch,\n SuffixExactMatch,\n InverseExactMatch,\n FuzzyMatch\n];\n\nconst searchersLen = searchers.length;\n\n// Regex to split by spaces, but keep anything in quotes together\nconst SPACE_RE = / +(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)/;\nconst OR_TOKEN = '|';\n\n// Return a 2D array representation of the query, for simpler parsing.\n// Example:\n// \"^core go$ | rb$ | py$ xy$\" => [[\"^core\", \"go$\"], [\"rb$\"], [\"py$\", \"xy$\"]]\nfunction parseQuery(pattern, options = {}) {\n return pattern.split(OR_TOKEN).map((item) => {\n let query = item\n .trim()\n .split(SPACE_RE)\n .filter((item) => item && !!item.trim());\n\n let results = [];\n for (let i = 0, len = query.length; i < len; i += 1) {\n const queryItem = query[i];\n\n // 1. Handle multiple query match (i.e, once that are quoted, like `\"hello world\"`)\n let found = false;\n let idx = -1;\n while (!found && ++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isMultiMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n found = true;\n }\n }\n\n if (found) {\n continue\n }\n\n // 2. Handle single query matches (i.e, once that are *not* quoted)\n idx = -1;\n while (++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isSingleMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n break\n }\n }\n }\n\n return results\n })\n}\n\n// These extended matchers can return an array of matches, as opposed\n// to a singl match\nconst MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]);\n\n/**\n * Command-like searching\n * ======================\n *\n * Given multiple search terms delimited by spaces.e.g. `^jscript .python$ ruby !java`,\n * search in a given text.\n *\n * Search syntax:\n *\n * | Token | Match type | Description |\n * | ----------- | -------------------------- | -------------------------------------- |\n * | `jscript` | fuzzy-match | Items that fuzzy match `jscript` |\n * | `=scheme` | exact-match | Items that are `scheme` |\n * | `'python` | include-match | Items that include `python` |\n * | `!ruby` | inverse-exact-match | Items that do not include `ruby` |\n * | `^java` | prefix-exact-match | Items that start with `java` |\n * | `!^earlang` | inverse-prefix-exact-match | Items that do not start with `earlang` |\n * | `.js$` | suffix-exact-match | Items that end with `.js` |\n * | `!.go$` | inverse-suffix-exact-match | Items that do not end with `.go` |\n *\n * A single pipe character acts as an OR operator. For example, the following\n * query matches entries that start with `core` and end with either`go`, `rb`,\n * or`py`.\n *\n * ```\n * ^core go$ | rb$ | py$\n * ```\n */\nclass ExtendedSearch {\n constructor(\n pattern,\n {\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n includeMatches = Config.includeMatches,\n minMatchCharLength = Config.minMatchCharLength,\n ignoreLocation = Config.ignoreLocation,\n findAllMatches = Config.findAllMatches,\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance\n } = {}\n ) {\n this.query = null;\n this.options = {\n isCaseSensitive,\n ignoreDiacritics,\n includeMatches,\n minMatchCharLength,\n findAllMatches,\n ignoreLocation,\n location,\n threshold,\n distance\n };\n\n pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n pattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n this.pattern = pattern;\n this.query = parseQuery(this.pattern, this.options);\n }\n\n static condition(_, options) {\n return options.useExtendedSearch\n }\n\n searchIn(text) {\n const query = this.query;\n\n if (!query) {\n return {\n isMatch: false,\n score: 1\n }\n }\n\n const { includeMatches, isCaseSensitive, ignoreDiacritics } = this.options;\n\n text = isCaseSensitive ? text : text.toLowerCase();\n text = ignoreDiacritics ? stripDiacritics(text) : text;\n\n let numMatches = 0;\n let allIndices = [];\n let totalScore = 0;\n\n // ORs\n for (let i = 0, qLen = query.length; i < qLen; i += 1) {\n const searchers = query[i];\n\n // Reset indices\n allIndices.length = 0;\n numMatches = 0;\n\n // ANDs\n for (let j = 0, pLen = searchers.length; j < pLen; j += 1) {\n const searcher = searchers[j];\n const { isMatch, indices, score } = searcher.search(text);\n\n if (isMatch) {\n numMatches += 1;\n totalScore += score;\n if (includeMatches) {\n const type = searcher.constructor.type;\n if (MultiMatchSet.has(type)) {\n allIndices = [...allIndices, ...indices];\n } else {\n allIndices.push(indices);\n }\n }\n } else {\n totalScore = 0;\n numMatches = 0;\n allIndices.length = 0;\n break\n }\n }\n\n // OR condition, so if TRUE, return\n if (numMatches) {\n let result = {\n isMatch: true,\n score: totalScore / numMatches\n };\n\n if (includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n }\n\n // Nothing was matched\n return {\n isMatch: false,\n score: 1\n }\n }\n}\n\nconst registeredSearchers = [];\n\nfunction register(...args) {\n registeredSearchers.push(...args);\n}\n\nfunction createSearcher(pattern, options) {\n for (let i = 0, len = registeredSearchers.length; i < len; i += 1) {\n let searcherClass = registeredSearchers[i];\n if (searcherClass.condition(pattern, options)) {\n return new searcherClass(pattern, options)\n }\n }\n\n return new BitapSearch(pattern, options)\n}\n\nconst LogicalOperator = {\n AND: '$and',\n OR: '$or'\n};\n\nconst KeyType = {\n PATH: '$path',\n PATTERN: '$val'\n};\n\nconst isExpression = (query) =>\n !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]);\n\nconst isPath = (query) => !!query[KeyType.PATH];\n\nconst isLeaf = (query) =>\n !isArray(query) && isObject(query) && !isExpression(query);\n\nconst convertToExplicit = (query) => ({\n [LogicalOperator.AND]: Object.keys(query).map((key) => ({\n [key]: query[key]\n }))\n});\n\n// When `auto` is `true`, the parse function will infer and initialize and add\n// the appropriate `Searcher` instance\nfunction parse(query, options, { auto = true } = {}) {\n const next = (query) => {\n let keys = Object.keys(query);\n\n const isQueryPath = isPath(query);\n\n if (!isQueryPath && keys.length > 1 && !isExpression(query)) {\n return next(convertToExplicit(query))\n }\n\n if (isLeaf(query)) {\n const key = isQueryPath ? query[KeyType.PATH] : keys[0];\n\n const pattern = isQueryPath ? query[KeyType.PATTERN] : query[key];\n\n if (!isString(pattern)) {\n throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key))\n }\n\n const obj = {\n keyId: createKeyId(key),\n pattern\n };\n\n if (auto) {\n obj.searcher = createSearcher(pattern, options);\n }\n\n return obj\n }\n\n let node = {\n children: [],\n operator: keys[0]\n };\n\n keys.forEach((key) => {\n const value = query[key];\n\n if (isArray(value)) {\n value.forEach((item) => {\n node.children.push(next(item));\n });\n }\n });\n\n return node\n };\n\n if (!isExpression(query)) {\n query = convertToExplicit(query);\n }\n\n return next(query)\n}\n\n// Practical scoring function\nfunction computeScore(\n results,\n { ignoreFieldNorm = Config.ignoreFieldNorm }\n) {\n results.forEach((result) => {\n let totalScore = 1;\n\n result.matches.forEach(({ key, norm, score }) => {\n const weight = key ? key.weight : null;\n\n totalScore *= Math.pow(\n score === 0 && weight ? Number.EPSILON : score,\n (weight || 1) * (ignoreFieldNorm ? 1 : norm)\n );\n });\n\n result.score = totalScore;\n });\n}\n\nfunction transformMatches(result, data) {\n const matches = result.matches;\n data.matches = [];\n\n if (!isDefined(matches)) {\n return\n }\n\n matches.forEach((match) => {\n if (!isDefined(match.indices) || !match.indices.length) {\n return\n }\n\n const { indices, value } = match;\n\n let obj = {\n indices,\n value\n };\n\n if (match.key) {\n obj.key = match.key.src;\n }\n\n if (match.idx > -1) {\n obj.refIndex = match.idx;\n }\n\n data.matches.push(obj);\n });\n}\n\nfunction transformScore(result, data) {\n data.score = result.score;\n}\n\nfunction format(\n results,\n docs,\n {\n includeMatches = Config.includeMatches,\n includeScore = Config.includeScore\n } = {}\n) {\n const transformers = [];\n\n if (includeMatches) transformers.push(transformMatches);\n if (includeScore) transformers.push(transformScore);\n\n return results.map((result) => {\n const { idx } = result;\n\n const data = {\n item: docs[idx],\n refIndex: idx\n };\n\n if (transformers.length) {\n transformers.forEach((transformer) => {\n transformer(result, data);\n });\n }\n\n return data\n })\n}\n\nclass Fuse {\n constructor(docs, options = {}, index) {\n this.options = { ...Config, ...options };\n\n if (\n this.options.useExtendedSearch &&\n !true\n ) {\n throw new Error(EXTENDED_SEARCH_UNAVAILABLE)\n }\n\n this._keyStore = new KeyStore(this.options.keys);\n\n this.setCollection(docs, index);\n }\n\n setCollection(docs, index) {\n this._docs = docs;\n\n if (index && !(index instanceof FuseIndex)) {\n throw new Error(INCORRECT_INDEX_TYPE)\n }\n\n this._myIndex =\n index ||\n createIndex(this.options.keys, this._docs, {\n getFn: this.options.getFn,\n fieldNormWeight: this.options.fieldNormWeight\n });\n }\n\n add(doc) {\n if (!isDefined(doc)) {\n return\n }\n\n this._docs.push(doc);\n this._myIndex.add(doc);\n }\n\n remove(predicate = (/* doc, idx */) => false) {\n const results = [];\n\n for (let i = 0, len = this._docs.length; i < len; i += 1) {\n const doc = this._docs[i];\n if (predicate(doc, i)) {\n this.removeAt(i);\n i -= 1;\n len -= 1;\n\n results.push(doc);\n }\n }\n\n return results\n }\n\n removeAt(idx) {\n this._docs.splice(idx, 1);\n this._myIndex.removeAt(idx);\n }\n\n getIndex() {\n return this._myIndex\n }\n\n search(query, { limit = -1 } = {}) {\n const {\n includeMatches,\n includeScore,\n shouldSort,\n sortFn,\n ignoreFieldNorm\n } = this.options;\n\n let results = isString(query)\n ? isString(this._docs[0])\n ? this._searchStringList(query)\n : this._searchObjectList(query)\n : this._searchLogical(query);\n\n computeScore(results, { ignoreFieldNorm });\n\n if (shouldSort) {\n results.sort(sortFn);\n }\n\n if (isNumber(limit) && limit > -1) {\n results = results.slice(0, limit);\n }\n\n return format(results, this._docs, {\n includeMatches,\n includeScore\n })\n }\n\n _searchStringList(query) {\n const searcher = createSearcher(query, this.options);\n const { records } = this._myIndex;\n const results = [];\n\n // Iterate over every string in the index\n records.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n results.push({\n item: text,\n idx,\n matches: [{ score, value: text, norm, indices }]\n });\n }\n });\n\n return results\n }\n\n _searchLogical(query) {\n\n const expression = parse(query, this.options);\n\n const evaluate = (node, item, idx) => {\n if (!node.children) {\n const { keyId, searcher } = node;\n\n const matches = this._findMatches({\n key: this._keyStore.get(keyId),\n value: this._myIndex.getValueForItemAtKeyId(item, keyId),\n searcher\n });\n\n if (matches && matches.length) {\n return [\n {\n idx,\n item,\n matches\n }\n ]\n }\n\n return []\n }\n\n const res = [];\n for (let i = 0, len = node.children.length; i < len; i += 1) {\n const child = node.children[i];\n const result = evaluate(child, item, idx);\n if (result.length) {\n res.push(...result);\n } else if (node.operator === LogicalOperator.AND) {\n return []\n }\n }\n return res\n };\n\n const records = this._myIndex.records;\n const resultMap = {};\n const results = [];\n\n records.forEach(({ $: item, i: idx }) => {\n if (isDefined(item)) {\n let expResults = evaluate(expression, item, idx);\n\n if (expResults.length) {\n // Dedupe when adding\n if (!resultMap[idx]) {\n resultMap[idx] = { idx, item, matches: [] };\n results.push(resultMap[idx]);\n }\n expResults.forEach(({ matches }) => {\n resultMap[idx].matches.push(...matches);\n });\n }\n }\n });\n\n return results\n }\n\n _searchObjectList(query) {\n const searcher = createSearcher(query, this.options);\n const { keys, records } = this._myIndex;\n const results = [];\n\n // List is Array<Object>\n records.forEach(({ $: item, i: idx }) => {\n if (!isDefined(item)) {\n return\n }\n\n let matches = [];\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n keys.forEach((key, keyIndex) => {\n matches.push(\n ...this._findMatches({\n key,\n value: item[keyIndex],\n searcher\n })\n );\n });\n\n if (matches.length) {\n results.push({\n idx,\n item,\n matches\n });\n }\n });\n\n return results\n }\n _findMatches({ key, value, searcher }) {\n if (!isDefined(value)) {\n return []\n }\n\n let matches = [];\n\n if (isArray(value)) {\n value.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({\n score,\n key,\n value: text,\n idx,\n norm,\n indices\n });\n }\n });\n } else {\n const { v: text, n: norm } = value;\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({ score, key, value: text, norm, indices });\n }\n }\n\n return matches\n }\n}\n\nFuse.version = '7.1.0';\nFuse.createIndex = createIndex;\nFuse.parseIndex = parseIndex;\nFuse.config = Config;\n\n{\n Fuse.parseQuery = parse;\n}\n\n{\n register(ExtendedSearch);\n}\n\nexport { Fuse as default };\n","import { capitalize } from \"@mui/material\";\nimport Fuse, { FuseResult } from \"fuse.js\";\nimport humanTracksData from \"../Data/humanBiosamples.json\";\nimport mouseTracksData from \"../Data/mouseBiosamples.json\";\nimport { AssayInfo, RowInfo, SearchTracksProps, TrackInfo } from \"../types\";\nimport { Assembly } from \"../consts\";\n\nconst tracksDataByAssembly: Record<Assembly, typeof humanTracksData> = {\n GRCh38: humanTracksData,\n mm10: mouseTracksData,\n};\n\nexport function getTracksData(assembly: Assembly) {\n return tracksDataByAssembly[assembly];\n}\n\nfunction formatAssayType(assay: string): string {\n switch (assay) {\n case \"dnase\":\n return \"DNase\";\n case \"atac\":\n return \"ATAC\";\n case \"h3k4me3\":\n return \"H3K4me3\";\n case \"h3k27ac\":\n return \"H3K27ac\";\n case \"ctcf\":\n return \"CTCF\";\n case \"chromhmm\":\n return \"ChromHMM\";\n case \"ccre\":\n return \"cCRE\";\n case \"rnaseq\":\n return \"RNA-seq\";\n default:\n return assay;\n }\n}\n\n/** Convert display assay name to JSON format */\nfunction toJsonAssayType(displayName: string): string {\n switch (displayName.toLowerCase()) {\n case \"dnase\":\n return \"dnase\";\n case \"atac\":\n return \"atac\";\n case \"h3k4me3\":\n return \"h3k4me3\";\n case \"h3k27ac\":\n return \"h3k27ac\";\n case \"ctcf\":\n return \"ctcf\";\n case \"chromhmm\":\n return \"chromhmm\";\n case \"ccre\":\n return \"ccre\";\n case \"rna-seq\":\n return \"rnaseq\";\n default:\n return displayName.toLowerCase();\n }\n}\n\n// use to get nested data in JSON file\nfunction getNestedValue(obj: any, path: string): any {\n return path.split(\".\").reduce((acc, key) => acc && acc[key], obj);\n}\n\nexport function getTracksByAssayAndOntology(\n assay: string,\n ontology: string,\n tracksData: ReturnType<typeof getTracksData>,\n): TrackInfo[] {\n let res: TrackInfo[] = [];\n const data = getNestedValue(tracksData, \"tracks\");\n const jsonAssay = toJsonAssayType(assay);\n\n data.forEach((track: TrackInfo) => {\n const filteredAssays =\n track.assays?.filter((e: AssayInfo) => e.assay === jsonAssay) || [];\n if (\n filteredAssays.length > 0 &&\n track.ontology === ontology.toLowerCase()\n ) {\n res.push({\n ...track,\n assays: filteredAssays,\n });\n }\n });\n return res;\n}\n\n/** Flatten TrackInfo into RowInfo objects for DataGrid display.\n * @param track TrackInfo object containing information from JSON file\n * @returns Array of flattened RowInfo objects, one per assay\n */\nexport function flattenIntoRows(track: TrackInfo): RowInfo[] {\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 * Fuzzy search in tracks stored in a JSON file.\n *\n * @param jsonStructure - Dot-separated path to the data array in the JSON structure.\n * @param query - The search query string.\n * @param keyWeightMap - Array of keys to search within each track object.\n * Can look like [\"name\", \"author\"] or if weighted, [\n {\n name: 'title',\n weight: 0.3\n },\n {\n name: 'author',\n weight: 0.7\n }\n ].\n * @param threshold - (Optional) Threshold for the fuzzy search (default is 0.5).\n * Smaller = stricter match, larger = fuzzier since 0 is perfect match and 1 is worst match.\n * @param limit - (Optional) Maximum number of results to return (default is 10).\n * @returns FuseResult object containing the search results.\n */\nexport function searchTracks({\n jsonStructure,\n query,\n keyWeightMap,\n threshold = 0.75,\n tracksData,\n}: SearchTracksProps & {\n tracksData: ReturnType<typeof getTracksData>;\n}): FuseResult<TrackInfo>[] {\n const data = getNestedValue(tracksData, jsonStructure ?? \"\");\n\n const fuse = new Fuse(data, {\n includeScore: true,\n shouldSort: true,\n threshold: threshold,\n keys: keyWeightMap,\n });\n return fuse.search(query);\n}\n","import {\n getTracksByAssayAndOntology,\n flattenIntoRows,\n getTracksData,\n} from \"./DataGrid/dataGridHelpers\";\nimport { RowInfo, TrackInfo } from \"./types\";\n\nexport type Assembly = \"GRCh38\" | \"mm10\";\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 \"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/**\n * Build rows and rowById for a specific assembly\n */\nexport function buildRowsForAssembly(assembly: Assembly): {\n rows: RowInfo[];\n rowById: Map<string, RowInfo>;\n} {\n const tracksData = getTracksData(assembly);\n const rows = ontologyTypes.flatMap((ontology) =>\n assayTypes.flatMap((assay) =>\n getTracksByAssayAndOntology(\n assay.toLowerCase(),\n ontology.toLowerCase(),\n tracksData,\n ).flatMap((r: TrackInfo) =>\n flattenIntoRows(r).map((flat) => ({\n ...flat,\n assay,\n ontology,\n })),\n ),\n ),\n );\n const rowById = new Map<string, RowInfo>(rows.map((r) => [r.id, r]));\n return { rows, rowById };\n}\n","import Folder from \"@mui/icons-material/Folder\";\nimport IndeterminateCheckBoxRoundedIcon from \"@mui/icons-material/IndeterminateCheckBoxRounded\";\nimport { Box, Typography, Stack } from \"@mui/material\";\nimport Collapse from \"@mui/material/Collapse\";\nimport { alpha, styled } from \"@mui/material/styles\";\nimport { TreeViewBaseItem } from \"@mui/x-tree-view\";\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 from \"react\";\nimport {\n CustomLabelProps,\n CustomTreeItemProps,\n ExtendedTreeItemProps,\n RowInfo,\n} from \"../types\";\nimport Fuse, { FuseResult } from \"fuse.js\";\nimport { SearchTracksProps } from \"../types\";\nimport { assayTypes, ontologyTypes } from \"../consts\";\n\n/** Format an ID like \"h3k27ac-ENCFF922YMQ\" to \"H3K27ac - ENCFF922YMQ\" */\nfunction formatIdLabel(id: string): string {\n const hyphenIndex = id.indexOf(\"-\");\n if (hyphenIndex === -1) return id;\n\n const assayPart = id.substring(0, hyphenIndex);\n let accessionPart = id.substring(hyphenIndex + 1);\n\n // Truncate accession parts to 15 characters\n if (accessionPart.length > 25)\n accessionPart = accessionPart.substring(0, 15) + \"…\";\n\n const formattedAssay = formatAssayName(assayPart);\n return `${formattedAssay} - ${accessionPart}`;\n}\n\nfunction formatAssayName(assay: string): string {\n switch (assay.toLowerCase()) {\n case \"dnase\":\n return \"DNase\";\n case \"atac\":\n return \"ATAC\";\n case \"h3k4me3\":\n return \"H3K4me3\";\n case \"h3k27ac\":\n return \"H3K27ac\";\n case \"ctcf\":\n return \"CTCF\";\n case \"chromhmm\":\n return \"ChromHMM\";\n case \"ccre\":\n return \"cCRE\";\n case \"rnaseq\":\n return \"RNA-seq\";\n default:\n return assay;\n }\n}\n\n/**\n * Builds tree in the sorted by assay view\n * @param selectedIds: list of ids (from useSelectionStore)\n * @param root: Root TreeViewBaseItem\n * @param rowById: Mapping between an id (experimentAccession) and its RowInfo object\n * @returns all of the items for the RichTreeView in TreeViewWrapper\n */\nexport function buildSortedAssayTreeView(\n selectedIds: string[],\n root: TreeViewBaseItem<ExtendedTreeItemProps>,\n rowById: Map<string, RowInfo>,\n): TreeViewBaseItem<ExtendedTreeItemProps>[] {\n const assayMap = new Map<string, TreeViewBaseItem<ExtendedTreeItemProps>>(); // keep track of top level nodes\n const ontologyMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n const sampleAssayMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n let idx = 1;\n\n const selectedRows = selectedIds.reduce<RowInfo[]>((acc, id) => {\n const row = rowById.get(id);\n if (row) acc.push(row);\n return acc;\n }, []);\n\n selectedRows.forEach((row) => {\n let assayNode = assayMap.get(row.assay);\n if (!assayNode) {\n assayNode = {\n id: row.assay,\n isAssayItem: true,\n label: row.assay,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n assayMap.set(row.assay, assayNode);\n root.children!.push(assayNode);\n }\n\n let ontologyNode = ontologyMap.get(row.ontology + row.assay);\n if (!ontologyNode) {\n ontologyNode = {\n id: row.ontology + \"_\" + idx++,\n isAssayItem: false,\n label: row.ontology,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n assayNode.children!.push(ontologyNode);\n ontologyMap.set(row.ontology + row.assay, ontologyNode);\n }\n\n const displayNameNode: TreeViewBaseItem<ExtendedTreeItemProps> = {\n id: row.displayname + \"_\" + idx++,\n isAssayItem: false,\n label: row.displayname,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n ontologyNode.children!.push(displayNameNode);\n\n let expNode = sampleAssayMap.get(row.displayname + row.id);\n if (!expNode) {\n expNode = {\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 sampleAssayMap.set(row.displayname + row.assay, expNode);\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 root.allRowInfo!.push(row);\n });\n // standardize the order of the assay folders everytime one is added\n root.children!.sort((a, b): number => {\n return assayTypes.indexOf(a.id) - assayTypes.indexOf(b.id);\n });\n return [root];\n}\n\n/**\n * Builds tree in the sorted by assay view\n * @param selectedIds: list of ids (from useSelectionStore)\n * @param root: Root TreeViewBaseItem\n * @param rowById: Mapping between an id (experimentAccession) and its RowInfo object\n * @returns all of the items for the RichTreeView in TreeViewWrapper\n */\nexport function buildTreeView(\n selectedIds: string[],\n root: TreeViewBaseItem<ExtendedTreeItemProps>,\n rowById: Map<string, RowInfo>,\n): TreeViewBaseItem<ExtendedTreeItemProps>[] {\n const ontologyMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >(); // keep track of top level nodes\n const displayNameMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n const sampleAssayMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n\n const selectedRows = selectedIds.reduce<RowInfo[]>((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 let ontologyNode = ontologyMap.get(row.ontology);\n if (!ontologyNode) {\n ontologyNode = {\n id: row.ontology,\n label: row.ontology,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n ontologyMap.set(row.ontology, ontologyNode);\n root.children!.push(ontologyNode);\n }\n\n let displayNameNode = displayNameMap.get(row.displayname);\n if (!displayNameNode) {\n displayNameNode = {\n id: row.displayname,\n label: row.displayname,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n ontologyNode.children!.push(displayNameNode);\n displayNameMap.set(row.displayname, displayNameNode);\n }\n\n let expNode = sampleAssayMap.get(row.displayname + row.assay);\n if (!expNode) {\n expNode = {\n id: row.id,\n label: formatIdLabel(row.id),\n icon: \"removeable\",\n assayName: row.assay,\n children: [],\n allExpAccessions: [row.id],\n };\n sampleAssayMap.set(row.displayname + row.assay, expNode);\n displayNameNode.children!.push(expNode);\n }\n ontologyNode.allExpAccessions!.push(row.id);\n displayNameNode.allExpAccessions!.push(row.id);\n root.allRowInfo!.push(row);\n });\n // standardize the order of the assay folders everytime one is added\n root.children!.sort((a, b): number => {\n return ontologyTypes.indexOf(a.id) - ontologyTypes.indexOf(b.id);\n });\n return [root];\n}\n\n/**\n * Fuzzy search of active tracks.\n *\n * @param treeItems - TreeBaseViewItems from the tree.\n * @param query - The search query string.\n * @param keyWeightMap - Array of keys to search within each track object.\n * Can look like [\"name\", \"author\"] or if weighted, [\n {\n name: 'title',\n weight: 0.3\n },\n {\n name: 'author',\n weight: 0.7\n }\n ].\n * @param threshold - (Optional) Threshold for the fuzzy search (default is 0.5).\n * Smaller = stricter match, larger = fuzzier since 0 is perfect match and 1 is worst match.\n * @param limit - (Optional) Maximum number of results to return (default is 10).\n * @returns FuseResult object containing the search results.\n */\nexport function searchTreeItems({\n treeItems,\n query,\n keyWeightMap,\n threshold,\n limit = 10,\n}: SearchTracksProps): FuseResult<RowInfo>[] {\n const data = treeItems![0].allRowInfo ?? [];\n const fuse = new Fuse(data, {\n includeScore: true,\n shouldSort: true,\n threshold: threshold,\n keys: keyWeightMap,\n });\n return fuse.search(query, { limit: limit });\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 colorMap: { [key: string]: string } = {\n DNase: \"#06da93\",\n ATAC: \"#02c7b9\",\n H3K4me3: \"#ff2020\",\n ChromHMM: \"#0097a7\",\n H3K27ac: \"#fdc401\",\n CTCF: \"#01a6f1\",\n cCRE: \"#8b5cf6\",\n \"RNA-seq\": \"#f97316\",\n };\n const color = colorMap[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// 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});\n\nfunction CustomLabel({\n icon: Icon,\n children,\n isAssayItem,\n assayName,\n ...other\n}: CustomLabelProps) {\n const variant = isAssayItem ? \"subtitle2\" : \"body2\";\n const fontWeight = isAssayItem ? \"bold\" : 500;\n return (\n <TreeItemLabel\n {...other}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {Icon && React.isValidElement(Icon) ? (\n <Box className=\"labelIcon\" sx={{ mr: 1 }}>\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\" }}\n />\n )}\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n {isAssayItem && AssayIcon(other.id)}\n {assayName && AssayIcon(assayName)}\n <TreeItemLabelText fontWeight={fontWeight} variant={variant}>\n {children}\n </TreeItemLabelText>\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 = (itemType: string) => {\n switch (itemType) {\n case \"folder\":\n return Folder;\n case \"removeable\":\n return IndeterminateCheckBoxRoundedIcon;\n default:\n return AssayIcon(itemType);\n }\n};\n\nexport const CustomTreeItem = React.forwardRef(function CustomTreeItem(\n props: CustomTreeItemProps,\n ref: React.Ref<HTMLLIElement>,\n) {\n const { id, itemId, label, disabled, children, onRemove, ...other } = 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);\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 })}\n />\n </TreeItemContent>\n {children && <Collapse {...getGroupTransitionProps()} />}\n </TreeItemRoot>\n </TreeItemProvider>\n );\n});\n","import { GridColDef } from \"@mui/x-data-grid-premium\";\nimport { RowInfo } from \"../types\";\nimport { Stack, capitalize } from \"@mui/material\";\nimport { AssayIcon } from \"../TreeView/treeViewHelpers\";\nimport { ontologyTypes, assayTypes } from \"../consts\";\n\nconst displayNameCol: GridColDef<RowInfo> = {\n field: \"displayname\",\n headerName: \"Name\",\n valueFormatter: (value) => value && capitalize(value),\n maxWidth: 300,\n};\n\nconst sortedByAssayOntologyCol: GridColDef<RowInfo> = {\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<RowInfo> = {\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<RowInfo> = {\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<RowInfo> = {\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<RowInfo> = {\n field: \"sampleType\",\n headerName: \"Sample Type\",\n type: \"singleSelect\",\n valueOptions: [\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<RowInfo> = {\n field: \"lifeStage\",\n headerName: \"Life Stage\",\n type: \"singleSelect\",\n valueOptions: [\"adult\", \"embryonic\"],\n valueFormatter: (value) => value && capitalize(value),\n};\n\nconst experimentCol: GridColDef<RowInfo> = {\n field: \"experimentAccession\",\n headerName: \"Experiment Accession\",\n};\n\nconst fileCol: GridColDef<RowInfo> = {\n field: \"fileAccession\",\n headerName: \"File Accession\",\n};\n\nconst idCol: GridColDef<RowInfo> = {\n field: \"id\",\n headerName: \"ID\",\n};\n\nexport const sortedByAssayColumns: GridColDef<RowInfo>[] = [\n displayNameCol,\n sortedByAssayOntologyCol,\n sampleTypeCol,\n lifeStageCol,\n sortedByAssayAssayCol,\n experimentCol,\n fileCol,\n idCol,\n];\n\nexport const defaultColumns: GridColDef<RowInfo>[] = [\n defaultAssayCol,\n sampleTypeCol,\n lifeStageCol,\n defaultOntologyCol,\n displayNameCol,\n experimentCol,\n fileCol,\n idCol,\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 } from \"../consts\";\nimport { AssayIcon } from \"../TreeView/treeViewHelpers\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\n\n// Custom grouping cell that preserves expand/collapse while adding truncation + tooltip\nexport default function GroupingCell(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 { 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, useState } from \"react\";\nimport { DataGridProps } from \"../types\";\nimport { defaultColumns, sortedByAssayColumns } from \"./columns\";\nimport GroupingCell from \"./GroupingCell\";\n\nconst autosizeOptions: GridAutosizeOptions = {\n expand: true,\n includeHeaders: true,\n outliersFactor: 1.5,\n};\n\nexport function DataGridWrapper(props: DataGridProps) {\n const { sortedAssay, handleSelection, rows, selectedIds } = props;\n\n const apiRef = useGridApiRef();\n\n // Resize columns when toggling between sort modes\n useEffect(() => {\n if (apiRef.current && apiRef.current.autosizeColumns) {\n apiRef.current.autosizeColumns(autosizeOptions);\n }\n }, [sortedAssay]);\n\n const groupingModel = sortedAssay\n ? [\"assay\", \"ontology\"]\n : [\"ontology\", \"displayname\"];\n const columnModel = sortedAssay ? sortedByAssayColumns : defaultColumns;\n const leafField = sortedAssay ? \"displayname\" : \"assay\";\n\n // Hide columns that are used in grouping or as leaf field, plus ID column\n const baseVisibility: GridColumnVisibilityModel = sortedAssay\n ? { assay: false, ontology: false, displayname: false, id: false } // sort by assay: assay & ontology are grouping, displayname is leaf\n : { ontology: false, displayname: false, assay: false, id: false }; // default: ontology & displayname are grouping, assay is leaf\n\n const [columnVisibilityModel, setColumnVisibilityModel] =\n useState<GridColumnVisibilityModel>(baseVisibility);\n\n // Update visibility when sort mode changes\n useEffect(() => {\n setColumnVisibilityModel(baseVisibility);\n }, [sortedAssay]);\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={columnModel}\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={handleSelection}\n rowSelectionPropagation={{ descendants: true, parents: true }}\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 { Box, Paper, Typography } from \"@mui/material\";\nimport { RichTreeView, TreeViewBaseItem } from \"@mui/x-tree-view\";\nimport {\n CustomTreeItemProps,\n ExtendedTreeItemProps,\n TreeViewWrapperProps,\n} from \"../types\";\nimport { CustomTreeItem } from \"./treeViewHelpers\";\nimport { Avatar } from \"@mui/material\";\n\nexport function TreeViewWrapper({\n store,\n items,\n trackIds,\n isSearchResult,\n}: TreeViewWrapperProps) {\n const removeIds = store((s) => s.removeIds);\n const rowById = store((s) => s.rowById);\n\n const handleRemoveTreeItem = (\n item: TreeViewBaseItem<ExtendedTreeItemProps>,\n ) => {\n const removedIds = item.allExpAccessions;\n if (removedIds && removedIds.length) {\n const idsToRemove = new Set(removedIds);\n\n // Also remove any auto-generated group IDs that contain these tracks\n removedIds.forEach((id) => {\n const row = rowById.get(id);\n if (row) {\n // Add the auto-generated group IDs for this track's grouping hierarchy\n // Default view: ontology -> displayname\n idsToRemove.add(`auto-generated-row-ontology/${row.ontology}`);\n idsToRemove.add(\n `auto-generated-row-ontology/${row.ontology}-displayname/${row.displayname}`,\n );\n // Sorted by assay view: assay -> ontology -> displayname\n idsToRemove.add(`auto-generated-row-assay/${row.assay}`);\n idsToRemove.add(\n `auto-generated-row-assay/${row.assay}-ontology/${row.ontology}`,\n );\n }\n });\n removeIds(idsToRemove);\n }\n };\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 {trackIds.size}\n </Avatar>\n <Typography fontWeight=\"bold\">\n Active Tracks\n {isSearchResult && (\n <Typography component=\"span\" color=\"text.secondary\" sx={{ ml: 1 }}>\n ({items[0].allRowInfo!.length} search results)\n </Typography>\n )}\n </Typography>\n </Box>\n <Box\n sx={{\n flex: 1,\n overflow: \"auto\",\n }}\n >\n <RichTreeView\n items={items}\n defaultExpandedItems={[\"1\"]}\n slots={{ item: CustomTreeItem }}\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 {\n Box,\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n FormControlLabel,\n Stack,\n Switch,\n TextField,\n} from \"@mui/material\";\nimport { GridRowSelectionModel } from \"@mui/x-data-grid\";\nimport { TreeViewBaseItem } from \"@mui/x-tree-view\";\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { DataGridWrapper } from \"./DataGrid/DataGridWrapper\";\nimport {\n flattenIntoRows,\n searchTracks,\n getTracksData,\n} from \"./DataGrid/dataGridHelpers\";\nimport { TreeViewWrapper } from \"./TreeView/TreeViewWrapper\";\nimport {\n buildSortedAssayTreeView,\n buildTreeView,\n searchTreeItems,\n} from \"./TreeView/treeViewHelpers\";\nimport { SelectionStoreInstance } from \"./store\";\nimport { ExtendedTreeItemProps, SearchTracksProps } from \"./types\";\n\nexport interface TrackSelectProps {\n store: SelectionStoreInstance;\n onSubmit?: (trackIds: Set<string>) => void;\n onCancel?: () => void;\n onReset?: () => void;\n}\n\nexport default function TrackSelect({\n store,\n onSubmit,\n onCancel,\n onReset,\n}: TrackSelectProps) {\n const [limitDialogOpen, setLimitDialogOpen] = useState(false);\n const [sortedAssay, setSortedAssay] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [isSearchResult, setIsSearchResult] = useState(false);\n const selectedIds = store((s) => s.selectedIds);\n const setSelected = store((s) => s.setSelected);\n const clear = store((s) => s.clear);\n const MAX_ACTIVE = store((s) => s.maxTracks);\n const rows = store((s) => s.rows);\n const rowById = store((s) => s.rowById);\n const assembly = store((s) => s.assembly);\n\n // Local working state - changes here don't affect the store until Submit\n const [workingIds, setWorkingIds] = useState<Set<string>>(\n () => new Set(selectedIds),\n );\n\n // Get tracks data for search functionality\n const tracksData = useMemo(\n () => getTracksData(assembly as \"GRCh38\" | \"mm10\"),\n [assembly],\n );\n\n // Get only real track IDs from working selection (no auto-generated group IDs)\n const workingTrackIds = useMemo(() => {\n return new Set([...workingIds].filter((id) => rowById.has(id)));\n }, [workingIds, rowById]);\n\n // Sync workingIds when store's selectedIds changes externally\n useEffect(() => {\n setWorkingIds(new Set(selectedIds));\n }, [selectedIds]);\n\n const treeItems = useMemo(() => {\n return sortedAssay\n ? buildSortedAssayTreeView(\n Array.from(workingTrackIds),\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n rowById,\n )\n : buildTreeView(\n Array.from(workingTrackIds),\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n rowById,\n );\n }, [workingTrackIds, sortedAssay, rowById]);\n\n const [filteredRows, setFilteredRows] = useState(rows);\n const [filteredTreeItems, setFilteredTreeItems] = useState([\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n ] as TreeViewBaseItem<ExtendedTreeItemProps>[]);\n const searchTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const searchResultIdsRef = useRef<Set<string>>(new Set());\n\n useEffect(() => {\n if (searchQuery === \"\") {\n setFilteredTreeItems(treeItems);\n setFilteredRows(rows);\n setIsSearchResult(false);\n searchResultIdsRef.current = new Set();\n } else if (searchResultIdsRef.current.size > 0) {\n // When selection changes during search, rebuild tree from selected items that match search\n const matchingTrackIds = Array.from(workingTrackIds).filter((id) =>\n searchResultIdsRef.current.has(id),\n );\n\n const newTreeItems = sortedAssay\n ? buildSortedAssayTreeView(\n matchingTrackIds,\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n rowById,\n )\n : buildTreeView(\n matchingTrackIds,\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n rowById,\n );\n\n setFilteredTreeItems(newTreeItems);\n }\n }, [treeItems, searchQuery, workingTrackIds, sortedAssay, rowById, rows]);\n\n const handleToggle = () => {\n setSortedAssay(!sortedAssay);\n };\n\n const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value;\n setSearchQuery(query);\n\n // Clear previous timeout\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n\n // Debounce the search\n searchTimeoutRef.current = setTimeout(() => {\n if (query === \"\") {\n return; // useEffect handles empty query\n }\n\n const dataGridSearchProps = {\n jsonStructure: \"tracks\",\n query: query,\n keyWeightMap: [\n \"displayname\",\n \"ontology\",\n \"lifeStage\",\n \"sampleType\",\n \"type\",\n \"experimentAccession\",\n \"fileAccession\",\n ],\n tracksData,\n };\n\n const treeSearchProps: SearchTracksProps = {\n treeItems: treeItems,\n query: query,\n keyWeightMap: [\n \"displayname\",\n \"ontology\",\n \"lifeStage\",\n \"sampleType\",\n \"type\",\n \"experimentAccession\",\n \"fileAccession\",\n ],\n };\n const newDataGridRows = searchTracks(dataGridSearchProps)\n .map((t) => t.item)\n .flatMap(flattenIntoRows);\n\n // we only want the intersection of filtered tracks displayed on the DataGrid and user-selected tracks to be displayed on the tree\n const newDataGridIds = newDataGridRows.map((r) => r.id);\n const retIds = searchTreeItems(treeSearchProps).map((r) => r.item.id);\n const newTreeIds = retIds.filter((i) => newDataGridIds.includes(i));\n\n // build new tree from the newTreeIds\n const newTreeItems = sortedAssay\n ? buildSortedAssayTreeView(\n newTreeIds,\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n rowById,\n )\n : buildTreeView(\n newTreeIds,\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n rowById,\n );\n\n // Store search result IDs in ref for use in useEffect\n searchResultIdsRef.current = new Set(newDataGridIds);\n\n setFilteredRows(newDataGridRows);\n setIsSearchResult(true);\n setFilteredTreeItems(newTreeItems);\n }, 300);\n };\n\n const handleSelection = (newSelection: GridRowSelectionModel) => {\n const allIds: Set<string> =\n (newSelection && (newSelection as any).ids) ?? new Set<string>();\n\n // Count only real track IDs for the limit check\n let realTrackCount = 0;\n allIds.forEach((id: string) => {\n if (rowById.has(id)) {\n realTrackCount++;\n }\n });\n\n // Block only if the new selection would exceed the limit\n if (realTrackCount > MAX_ACTIVE) {\n setLimitDialogOpen(true);\n return;\n }\n\n // Update working state (not the store yet)\n setWorkingIds(allIds);\n };\n\n const handleSubmit = () => {\n // Commit working selection to store\n setSelected(workingIds);\n // Call callback with real track IDs\n onSubmit?.(workingTrackIds);\n };\n\n const handleCancel = () => {\n // Revert working state to store's committed state\n setWorkingIds(new Set(selectedIds));\n onCancel?.();\n };\n\n return (\n <Box sx={{ flex: 1, pt: 1 }}>\n <Box display=\"flex\" justifyContent=\"space-between\" sx={{ mb: 3 }}>\n <TextField\n id=\"outlined-suffix-shrink\"\n label=\"Search tracks\"\n variant=\"outlined\"\n onChange={handleSearch}\n sx={{ width: \"400px\" }}\n />\n <FormControlLabel\n sx={{ display: \"flex\", justifyContent: \"flex-end\", mb: 1 }}\n value=\"Sort by assay\"\n control={<Switch color=\"primary\" onChange={handleToggle} />}\n label=\"Sort by assay\"\n labelPlacement=\"end\"\n />\n </Box>\n <Stack direction=\"row\" spacing={2} sx={{ width: \"100%\" }}>\n <Box sx={{ flex: 3, minWidth: 0 }}>\n <DataGridWrapper\n rows={filteredRows}\n label={\n isSearchResult\n ? `${filteredRows.length} Search Results`\n : `${rows.length} Available Tracks`\n }\n selectedIds={workingIds}\n handleSelection={handleSelection}\n sortedAssay={sortedAssay}\n />\n </Box>\n <Box sx={{ flex: 2, minWidth: 0 }}>\n <TreeViewWrapper\n store={store}\n items={filteredTreeItems}\n trackIds={workingTrackIds}\n isSearchResult={isSearchResult}\n />\n </Box>\n </Stack>\n <Box\n sx={{ display: \"flex\", justifyContent: \"space-between\", mt: 2, gap: 2 }}\n >\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n onClick={() => {\n if (onReset) {\n onReset();\n } else {\n clear();\n setWorkingIds(new Set());\n }\n }}\n >\n Reset\n </Button>\n <Box sx={{ display: \"flex\", gap: 2 }}>\n <Button variant=\"outlined\" onClick={handleCancel}>\n Cancel\n </Button>\n <Button variant=\"contained\" color=\"primary\" onClick={handleSubmit}>\n Submit\n </Button>\n </Box>\n </Box>\n <Dialog open={limitDialogOpen} onClose={() => setLimitDialogOpen(false)}>\n <DialogTitle>Track Limit Reached</DialogTitle>\n <DialogContent>\n <DialogContentText>\n You can select up to {MAX_ACTIVE} tracks at a time. Please remove a\n 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 </Box>\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 { buildRowsForAssembly, Assembly } from \"./consts\";\nimport { RowInfo, SelectionAction, SelectionState } from \"./types\";\n\nexport type SelectionStoreInstance = UseBoundStore<\n StoreApi<SelectionState & SelectionAction>\n>;\n\n// Helper to check if an ID is auto-generated by DataGrid grouping\n// const isAutoGeneratedId = (id: string) => id.startsWith(\"auto-generated-row-\");\n\nexport function createSelectionStore(\n assembly: Assembly,\n initialIds?: Set<string>,\n) {\n const { rows, rowById } = buildRowsForAssembly(assembly);\n\n return create<SelectionState & SelectionAction>((set, get) => ({\n maxTracks: 30,\n assembly,\n rows,\n rowById,\n // Stores ALL selected IDs, including auto-generated group IDs\n selectedIds: initialIds ? new Set(initialIds) : new Set<string>(),\n // Returns only real track IDs (filters out auto-generated group IDs)\n getTrackIds: () => {\n const all = get().selectedIds;\n const storeRowById = get().rowById;\n return new Set([...all].filter((id) => storeRowById.has(id)));\n },\n // Returns a Map of track IDs to RowInfo (no auto-generated IDs)\n getTrackMap: () => {\n const all = get().selectedIds;\n const storeRowById = get().rowById;\n const map = new Map<string, RowInfo>();\n all.forEach((id) => {\n if (storeRowById.has(id)) {\n const row = storeRowById.get(id);\n if (row) {\n map.set(id, row);\n }\n }\n });\n return map;\n },\n setSelected: (ids: Set<string>) =>\n set(() => ({\n selectedIds: new Set(ids),\n })),\n removeIds: (removedIds: Set<string>) =>\n set((state) => {\n const next = new Set(state.selectedIds);\n removedIds.forEach((id) => {\n next.delete(id);\n });\n return { selectedIds: next };\n }),\n clear: () => set(() => ({ selectedIds: new Set<string>() })),\n }));\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","isArray","getTag","baseToString","result","toString","isString","isNumber","isBoolean","isObjectLike","isObject","isDefined","isBlank","INCORRECT_INDEX_TYPE","LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY","PATTERN_LENGTH_TOO_LARGE","max","MISSING_KEY_PROPERTY","INVALID_KEY_WEIGHT_VALUE","hasOwn","KeyStore","totalWeight","obj","createKey","keyId","path","id","src","weight","getFn","createKeyPath","createKeyId","get","list","arr","deepGet","index","i","len","MatchOptions","BasicOptions","a","b","FuzzyOptions","AdvancedOptions","Config","SPACE","norm","mantissa","cache","m","numTokens","n","FuseIndex","fieldNormWeight","docs","records","idx","doc","docIndex","item","record","keyIndex","subRecords","stack","nestedArrIndex","subRecord","createIndex","myIndex","parseIndex","data","computeScore$1","pattern","errors","currentLocation","expectedLocation","distance","ignoreLocation","accuracy","proximity","convertMaskToIndices","matchmask","minMatchCharLength","indices","start","end","match","MAX_BITS","search","text","patternAlphabet","location","threshold","findAllMatches","includeMatches","patternLen","textLen","currentThreshold","bestLocation","computeMatches","matchMask","score","lastBitArr","finalScore","binMax","mask","binMin","binMid","finish","bitArr","j","charMatch","createPatternAlphabet","char","stripDiacritics","str","BitapSearch","isCaseSensitive","ignoreDiacritics","addChunk","startIndex","remainder","allIndices","totalScore","hasMatches","alphabet","isMatch","BaseMatch","getMatch","exp","matches","ExactMatch","InverseExactMatch","PrefixExactMatch","InversePrefixExactMatch","SuffixExactMatch","InverseSuffixExactMatch","FuzzyMatch","IncludeMatch","searchers","searchersLen","SPACE_RE","OR_TOKEN","parseQuery","options","query","results","queryItem","found","searcher","token","MultiMatchSet","ExtendedSearch","_","numMatches","qLen","pLen","registeredSearchers","register","args","createSearcher","searcherClass","LogicalOperator","KeyType","isExpression","isPath","isLeaf","convertToExplicit","parse","auto","next","isQueryPath","computeScore","ignoreFieldNorm","transformMatches","transformScore","format","includeScore","transformers","transformer","Fuse","predicate","limit","shouldSort","sortFn","expression","evaluate","res","child","resultMap","expResults","tracksDataByAssembly","humanTracksData","mouseTracksData","getTracksData","assembly","formatAssayType","assay","toJsonAssayType","getNestedValue","acc","getTracksByAssayAndOntology","ontology","tracksData","jsonAssay","track","filteredAssays","_a","e","flattenIntoRows","lifeStage","sampleType","displayname","experimentAccession","fileAccession","url","capitalize","searchTracks","jsonStructure","keyWeightMap","assayTypes","ontologyTypes","buildRowsForAssembly","rows","r","flat","rowById","formatIdLabel","hyphenIndex","assayPart","accessionPart","formatAssayName","buildSortedAssayTreeView","selectedIds","root","assayMap","ontologyMap","sampleAssayMap","row","assayNode","ontologyNode","displayNameNode","expNode","buildTreeView","displayNameMap","searchTreeItems","treeItems","AssayIcon","color","jsx","Box","TreeItemRoot","styled","theme","TreeItemLabelText","Typography","CustomLabel","Icon","isAssayItem","assayName","other","variant","fontWeight","jsxs","TreeItemLabel","Stack","TreeItemContent","alpha","getIconFromTreeItemType","itemType","Folder","IndeterminateCheckBoxRoundedIcon","CustomTreeItem","ref","itemId","label","disabled","onRemove","getContextProviderProps","getRootProps","getContentProps","getIconContainerProps","getCheckboxProps","getLabelProps","getGroupTransitionProps","status","useTreeItem","useTreeItemModel","icon","handleRemoveIconClick","TreeItemProvider","TreeItemIconContainer","TreeItemIcon","TreeItemCheckbox","Collapse","displayNameCol","sortedByAssayOntologyCol","params","val","sortedByAssayAssayCol","defaultOntologyCol","defaultAssayCol","sampleTypeCol","lifeStageCol","experimentCol","fileCol","idCol","sortedByAssayColumns","defaultColumns","GroupingCell","apiRef","useGridApiContext","isGroup","groupNode","isExpanded","groupingField","depth","handleExpandClick","renderContent","Tooltip","indentLevel","IconButton","ExpandMoreIcon","ChevronRightIcon","autosizeOptions","DataGridWrapper","sortedAssay","handleSelection","useGridApiRef","useEffect","groupingModel","columnModel","leafField","baseVisibility","columnVisibilityModel","setColumnVisibilityModel","useState","filterColumns","columns","column","getTogglableColumns","Paper","DataGridPremium","TreeViewWrapper","store","items","trackIds","isSearchResult","removeIds","s","handleRemoveTreeItem","removedIds","idsToRemove","Avatar","RichTreeView","TrackSelect","onSubmit","onCancel","onReset","limitDialogOpen","setLimitDialogOpen","setSortedAssay","searchQuery","setSearchQuery","setIsSearchResult","setSelected","clear","MAX_ACTIVE","workingIds","setWorkingIds","useMemo","workingTrackIds","filteredRows","setFilteredRows","filteredTreeItems","setFilteredTreeItems","searchTimeoutRef","useRef","searchResultIdsRef","matchingTrackIds","newTreeItems","handleToggle","handleSearch","dataGridSearchProps","treeSearchProps","newDataGridRows","t","newDataGridIds","newTreeIds","newSelection","allIds","realTrackCount","handleSubmit","handleCancel","TextField","FormControlLabel","Switch","Button","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","createStoreImpl","createState","state","listeners","setState","partial","replace","nextState","previousState","listener","getState","api","initialState","createStore","identity","arg","useStore","selector","slice","createImpl","useBoundStore","create","createSelectionStore","initialIds","set","all","storeRowById","map","ids"],"mappings":"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","x_google_ignoreList":[0,1,2,3,12,13]}
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","../../../node_modules/.pnpm/fuse.js@7.1.0/node_modules/fuse.js/dist/fuse.mjs","../src/TrackSelect/DataGrid/dataGridHelpers.tsx","../src/TrackSelect/consts.ts","../src/TrackSelect/TreeView/treeViewHelpers.tsx","../src/TrackSelect/DataGrid/columns.tsx","../src/TrackSelect/DataGrid/GroupingCell.tsx","../src/TrackSelect/DataGrid/DataGridWrapper.tsx","../src/TrackSelect/TreeView/TreeViewWrapper.tsx","../src/TrackSelect/TrackSelect.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"],"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","/**\n * Fuse.js v7.1.0 - Lightweight fuzzy-search (http://fusejs.io)\n *\n * Copyright (c) 2025 Kiro Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction isArray(value) {\n return !Array.isArray\n ? getTag(value) === '[object Array]'\n : Array.isArray(value)\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js\nconst INFINITY = 1 / 0;\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value\n }\n let result = value + '';\n return result == '0' && 1 / value == -INFINITY ? '-0' : result\n}\n\nfunction toString(value) {\n return value == null ? '' : baseToString(value)\n}\n\nfunction isString(value) {\n return typeof value === 'string'\n}\n\nfunction isNumber(value) {\n return typeof value === 'number'\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js\nfunction isBoolean(value) {\n return (\n value === true ||\n value === false ||\n (isObjectLike(value) && getTag(value) == '[object Boolean]')\n )\n}\n\nfunction isObject(value) {\n return typeof value === 'object'\n}\n\n// Checks if `value` is object-like.\nfunction isObjectLike(value) {\n return isObject(value) && value !== null\n}\n\nfunction isDefined(value) {\n return value !== undefined && value !== null\n}\n\nfunction isBlank(value) {\n return !value.trim().length\n}\n\n// Gets the `toStringTag` of `value`.\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js\nfunction getTag(value) {\n return value == null\n ? value === undefined\n ? '[object Undefined]'\n : '[object Null]'\n : Object.prototype.toString.call(value)\n}\n\nconst EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available';\n\nconst INCORRECT_INDEX_TYPE = \"Incorrect 'index' type\";\n\nconst LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) =>\n `Invalid value for key ${key}`;\n\nconst PATTERN_LENGTH_TOO_LARGE = (max) =>\n `Pattern length exceeds max of ${max}.`;\n\nconst MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`;\n\nconst INVALID_KEY_WEIGHT_VALUE = (key) =>\n `Property 'weight' in key '${key}' must be a positive integer`;\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nclass KeyStore {\n constructor(keys) {\n this._keys = [];\n this._keyMap = {};\n\n let totalWeight = 0;\n\n keys.forEach((key) => {\n let obj = createKey(key);\n\n this._keys.push(obj);\n this._keyMap[obj.id] = obj;\n\n totalWeight += obj.weight;\n });\n\n // Normalize weights so that their sum is equal to 1\n this._keys.forEach((key) => {\n key.weight /= totalWeight;\n });\n }\n get(keyId) {\n return this._keyMap[keyId]\n }\n keys() {\n return this._keys\n }\n toJSON() {\n return JSON.stringify(this._keys)\n }\n}\n\nfunction createKey(key) {\n let path = null;\n let id = null;\n let src = null;\n let weight = 1;\n let getFn = null;\n\n if (isString(key) || isArray(key)) {\n src = key;\n path = createKeyPath(key);\n id = createKeyId(key);\n } else {\n if (!hasOwn.call(key, 'name')) {\n throw new Error(MISSING_KEY_PROPERTY('name'))\n }\n\n const name = key.name;\n src = name;\n\n if (hasOwn.call(key, 'weight')) {\n weight = key.weight;\n\n if (weight <= 0) {\n throw new Error(INVALID_KEY_WEIGHT_VALUE(name))\n }\n }\n\n path = createKeyPath(name);\n id = createKeyId(name);\n getFn = key.getFn;\n }\n\n return { path, id, weight, src, getFn }\n}\n\nfunction createKeyPath(key) {\n return isArray(key) ? key : key.split('.')\n}\n\nfunction createKeyId(key) {\n return isArray(key) ? key.join('.') : key\n}\n\nfunction get(obj, path) {\n let list = [];\n let arr = false;\n\n const deepGet = (obj, path, index) => {\n if (!isDefined(obj)) {\n return\n }\n if (!path[index]) {\n // If there's no path left, we've arrived at the object we care about.\n list.push(obj);\n } else {\n let key = path[index];\n\n const value = obj[key];\n\n if (!isDefined(value)) {\n return\n }\n\n // If we're at the last value in the path, and if it's a string/number/bool,\n // add it to the list\n if (\n index === path.length - 1 &&\n (isString(value) || isNumber(value) || isBoolean(value))\n ) {\n list.push(toString(value));\n } else if (isArray(value)) {\n arr = true;\n // Search each item in the array.\n for (let i = 0, len = value.length; i < len; i += 1) {\n deepGet(value[i], path, index + 1);\n }\n } else if (path.length) {\n // An object. Recurse further.\n deepGet(value, path, index + 1);\n }\n }\n };\n\n // Backwards compatibility (since path used to be a string)\n deepGet(obj, isString(path) ? path.split('.') : path, 0);\n\n return arr ? list : list[0]\n}\n\nconst MatchOptions = {\n // Whether the matches should be included in the result set. When `true`, each record in the result\n // set will include the indices of the matched characters.\n // These can consequently be used for highlighting purposes.\n includeMatches: false,\n // When `true`, the matching function will continue to the end of a search pattern even if\n // a perfect match has already been located in the string.\n findAllMatches: false,\n // Minimum number of characters that must be matched before a result is considered a match\n minMatchCharLength: 1\n};\n\nconst BasicOptions = {\n // When `true`, the algorithm continues searching to the end of the input even if a perfect\n // match is found before the end of the same input.\n isCaseSensitive: false,\n // When `true`, the algorithm will ignore diacritics (accents) in comparisons\n ignoreDiacritics: false,\n // When true, the matching function will continue to the end of a search pattern even if\n includeScore: false,\n // List of properties that will be searched. This also supports nested properties.\n keys: [],\n // Whether to sort the result list, by score\n shouldSort: true,\n // Default sort function: sort by ascending score, ascending index\n sortFn: (a, b) =>\n a.score === b.score ? (a.idx < b.idx ? -1 : 1) : a.score < b.score ? -1 : 1\n};\n\nconst FuzzyOptions = {\n // Approximately where in the text is the pattern expected to be found?\n location: 0,\n // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match\n // (of both letters and location), a threshold of '1.0' would match anything.\n threshold: 0.6,\n // Determines how close the match must be to the fuzzy location (specified above).\n // An exact letter match which is 'distance' characters away from the fuzzy location\n // would score as a complete mismatch. A distance of '0' requires the match be at\n // the exact location specified, a threshold of '1000' would require a perfect match\n // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold.\n distance: 100\n};\n\nconst AdvancedOptions = {\n // When `true`, it enables the use of unix-like search commands\n useExtendedSearch: false,\n // The get function to use when fetching an object's properties.\n // The default will search nested paths *ie foo.bar.baz*\n getFn: get,\n // When `true`, search will ignore `location` and `distance`, so it won't matter\n // where in the string the pattern appears.\n // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score\n ignoreLocation: false,\n // When `true`, the calculation for the relevance score (used for sorting) will\n // ignore the field-length norm.\n // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm\n ignoreFieldNorm: false,\n // The weight to determine how much field length norm effects scoring.\n fieldNormWeight: 1\n};\n\nvar Config = {\n ...BasicOptions,\n ...MatchOptions,\n ...FuzzyOptions,\n ...AdvancedOptions\n};\n\nconst SPACE = /[^ ]+/g;\n\n// Field-length norm: the shorter the field, the higher the weight.\n// Set to 3 decimals to reduce index size.\nfunction norm(weight = 1, mantissa = 3) {\n const cache = new Map();\n const m = Math.pow(10, mantissa);\n\n return {\n get(value) {\n const numTokens = value.match(SPACE).length;\n\n if (cache.has(numTokens)) {\n return cache.get(numTokens)\n }\n\n // Default function is 1/sqrt(x), weight makes that variable\n const norm = 1 / Math.pow(numTokens, 0.5 * weight);\n\n // In place of `toFixed(mantissa)`, for faster computation\n const n = parseFloat(Math.round(norm * m) / m);\n\n cache.set(numTokens, n);\n\n return n\n },\n clear() {\n cache.clear();\n }\n }\n}\n\nclass FuseIndex {\n constructor({\n getFn = Config.getFn,\n fieldNormWeight = Config.fieldNormWeight\n } = {}) {\n this.norm = norm(fieldNormWeight, 3);\n this.getFn = getFn;\n this.isCreated = false;\n\n this.setIndexRecords();\n }\n setSources(docs = []) {\n this.docs = docs;\n }\n setIndexRecords(records = []) {\n this.records = records;\n }\n setKeys(keys = []) {\n this.keys = keys;\n this._keysMap = {};\n keys.forEach((key, idx) => {\n this._keysMap[key.id] = idx;\n });\n }\n create() {\n if (this.isCreated || !this.docs.length) {\n return\n }\n\n this.isCreated = true;\n\n // List is Array<String>\n if (isString(this.docs[0])) {\n this.docs.forEach((doc, docIndex) => {\n this._addString(doc, docIndex);\n });\n } else {\n // List is Array<Object>\n this.docs.forEach((doc, docIndex) => {\n this._addObject(doc, docIndex);\n });\n }\n\n this.norm.clear();\n }\n // Adds a doc to the end of the index\n add(doc) {\n const idx = this.size();\n\n if (isString(doc)) {\n this._addString(doc, idx);\n } else {\n this._addObject(doc, idx);\n }\n }\n // Removes the doc at the specified index of the index\n removeAt(idx) {\n this.records.splice(idx, 1);\n\n // Change ref index of every subsquent doc\n for (let i = idx, len = this.size(); i < len; i += 1) {\n this.records[i].i -= 1;\n }\n }\n getValueForItemAtKeyId(item, keyId) {\n return item[this._keysMap[keyId]]\n }\n size() {\n return this.records.length\n }\n _addString(doc, docIndex) {\n if (!isDefined(doc) || isBlank(doc)) {\n return\n }\n\n let record = {\n v: doc,\n i: docIndex,\n n: this.norm.get(doc)\n };\n\n this.records.push(record);\n }\n _addObject(doc, docIndex) {\n let record = { i: docIndex, $: {} };\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n this.keys.forEach((key, keyIndex) => {\n let value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path);\n\n if (!isDefined(value)) {\n return\n }\n\n if (isArray(value)) {\n let subRecords = [];\n const stack = [{ nestedArrIndex: -1, value }];\n\n while (stack.length) {\n const { nestedArrIndex, value } = stack.pop();\n\n if (!isDefined(value)) {\n continue\n }\n\n if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n i: nestedArrIndex,\n n: this.norm.get(value)\n };\n\n subRecords.push(subRecord);\n } else if (isArray(value)) {\n value.forEach((item, k) => {\n stack.push({\n nestedArrIndex: k,\n value: item\n });\n });\n } else ;\n }\n record.$[keyIndex] = subRecords;\n } else if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n n: this.norm.get(value)\n };\n\n record.$[keyIndex] = subRecord;\n }\n });\n\n this.records.push(record);\n }\n toJSON() {\n return {\n keys: this.keys,\n records: this.records\n }\n }\n}\n\nfunction createIndex(\n keys,\n docs,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys.map(createKey));\n myIndex.setSources(docs);\n myIndex.create();\n return myIndex\n}\n\nfunction parseIndex(\n data,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const { keys, records } = data;\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys);\n myIndex.setIndexRecords(records);\n return myIndex\n}\n\nfunction computeScore$1(\n pattern,\n {\n errors = 0,\n currentLocation = 0,\n expectedLocation = 0,\n distance = Config.distance,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n const accuracy = errors / pattern.length;\n\n if (ignoreLocation) {\n return accuracy\n }\n\n const proximity = Math.abs(expectedLocation - currentLocation);\n\n if (!distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy\n }\n\n return accuracy + proximity / distance\n}\n\nfunction convertMaskToIndices(\n matchmask = [],\n minMatchCharLength = Config.minMatchCharLength\n) {\n let indices = [];\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (let len = matchmask.length; i < len; i += 1) {\n let match = matchmask[i];\n if (match && start === -1) {\n start = i;\n } else if (!match && start !== -1) {\n end = i - 1;\n if (end - start + 1 >= minMatchCharLength) {\n indices.push([start, end]);\n }\n start = -1;\n }\n }\n\n // (i-1 - start) + 1 => i - start\n if (matchmask[i - 1] && i - start >= minMatchCharLength) {\n indices.push([start, i - 1]);\n }\n\n return indices\n}\n\n// Machine word size\nconst MAX_BITS = 32;\n\nfunction search(\n text,\n pattern,\n patternAlphabet,\n {\n location = Config.location,\n distance = Config.distance,\n threshold = Config.threshold,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n includeMatches = Config.includeMatches,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n if (pattern.length > MAX_BITS) {\n throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS))\n }\n\n const patternLen = pattern.length;\n // Set starting location at beginning text and initialize the alphabet.\n const textLen = text.length;\n // Handle the case when location > text.length\n const expectedLocation = Math.max(0, Math.min(location, textLen));\n // Highest score beyond which we give up.\n let currentThreshold = threshold;\n // Is there a nearby exact match? (speedup)\n let bestLocation = expectedLocation;\n\n // Performance: only computer matches when the minMatchCharLength > 1\n // OR if `includeMatches` is true.\n const computeMatches = minMatchCharLength > 1 || includeMatches;\n // A mask of the matches, used for building the indices\n const matchMask = computeMatches ? Array(textLen) : [];\n\n let index;\n\n // Get all exact matches, here for speed up\n while ((index = text.indexOf(pattern, bestLocation)) > -1) {\n let score = computeScore$1(pattern, {\n currentLocation: index,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n currentThreshold = Math.min(score, currentThreshold);\n bestLocation = index + patternLen;\n\n if (computeMatches) {\n let i = 0;\n while (i < patternLen) {\n matchMask[index + i] = 1;\n i += 1;\n }\n }\n }\n\n // Reset the best location\n bestLocation = -1;\n\n let lastBitArr = [];\n let finalScore = 1;\n let binMax = patternLen + textLen;\n\n const mask = 1 << (patternLen - 1);\n\n for (let i = 0; i < patternLen; i += 1) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from the match location we can stray\n // at this error level.\n let binMin = 0;\n let binMid = binMax;\n\n while (binMin < binMid) {\n const score = computeScore$1(pattern, {\n errors: i,\n currentLocation: expectedLocation + binMid,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score <= currentThreshold) {\n binMin = binMid;\n } else {\n binMax = binMid;\n }\n\n binMid = Math.floor((binMax - binMin) / 2 + binMin);\n }\n\n // Use the result from this iteration as the maximum for the next.\n binMax = binMid;\n\n let start = Math.max(1, expectedLocation - binMid + 1);\n let finish = findAllMatches\n ? textLen\n : Math.min(expectedLocation + binMid, textLen) + patternLen;\n\n // Initialize the bit array\n let bitArr = Array(finish + 2);\n\n bitArr[finish + 1] = (1 << i) - 1;\n\n for (let j = finish; j >= start; j -= 1) {\n let currentLocation = j - 1;\n let charMatch = patternAlphabet[text.charAt(currentLocation)];\n\n if (computeMatches) {\n // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`)\n matchMask[currentLocation] = +!!charMatch;\n }\n\n // First pass: exact match\n bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch;\n\n // Subsequent passes: fuzzy match\n if (i) {\n bitArr[j] |=\n ((lastBitArr[j + 1] | lastBitArr[j]) << 1) | 1 | lastBitArr[j + 1];\n }\n\n if (bitArr[j] & mask) {\n finalScore = computeScore$1(pattern, {\n errors: i,\n currentLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (finalScore <= currentThreshold) {\n // Indeed it is\n currentThreshold = finalScore;\n bestLocation = currentLocation;\n\n // Already passed `loc`, downhill from here on in.\n if (bestLocation <= expectedLocation) {\n break\n }\n\n // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`.\n start = Math.max(1, 2 * expectedLocation - bestLocation);\n }\n }\n }\n\n // No hope for a (better) match at greater error levels.\n const score = computeScore$1(pattern, {\n errors: i + 1,\n currentLocation: expectedLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score > currentThreshold) {\n break\n }\n\n lastBitArr = bitArr;\n }\n\n const result = {\n isMatch: bestLocation >= 0,\n // Count exact matches (those with a score of 0) to be \"almost\" exact\n score: Math.max(0.001, finalScore)\n };\n\n if (computeMatches) {\n const indices = convertMaskToIndices(matchMask, minMatchCharLength);\n if (!indices.length) {\n result.isMatch = false;\n } else if (includeMatches) {\n result.indices = indices;\n }\n }\n\n return result\n}\n\nfunction createPatternAlphabet(pattern) {\n let mask = {};\n\n for (let i = 0, len = pattern.length; i < len; i += 1) {\n const char = pattern.charAt(i);\n mask[char] = (mask[char] || 0) | (1 << (len - i - 1));\n }\n\n return mask\n}\n\nconst stripDiacritics = String.prototype.normalize\n ? ((str) => str.normalize('NFD').replace(/[\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u07FD\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D3-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u09FE\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0AFA-\\u0AFF\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C04\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D00-\\u0D03\\u0D3B\\u0D3C\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF7-\\u1CF9\\u1DC0-\\u1DF9\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA8FF\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F]/g, ''))\n : ((str) => str);\n\nclass BitapSearch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n this.options = {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreDiacritics,\n ignoreLocation\n };\n\n pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n pattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n this.pattern = pattern;\n\n this.chunks = [];\n\n if (!this.pattern.length) {\n return\n }\n\n const addChunk = (pattern, startIndex) => {\n this.chunks.push({\n pattern,\n alphabet: createPatternAlphabet(pattern),\n startIndex\n });\n };\n\n const len = this.pattern.length;\n\n if (len > MAX_BITS) {\n let i = 0;\n const remainder = len % MAX_BITS;\n const end = len - remainder;\n\n while (i < end) {\n addChunk(this.pattern.substr(i, MAX_BITS), i);\n i += MAX_BITS;\n }\n\n if (remainder) {\n const startIndex = len - MAX_BITS;\n addChunk(this.pattern.substr(startIndex), startIndex);\n }\n } else {\n addChunk(this.pattern, 0);\n }\n }\n\n searchIn(text) {\n const { isCaseSensitive, ignoreDiacritics, includeMatches } = this.options;\n\n text = isCaseSensitive ? text : text.toLowerCase();\n text = ignoreDiacritics ? stripDiacritics(text) : text;\n\n // Exact match\n if (this.pattern === text) {\n let result = {\n isMatch: true,\n score: 0\n };\n\n if (includeMatches) {\n result.indices = [[0, text.length - 1]];\n }\n\n return result\n }\n\n // Otherwise, use Bitap algorithm\n const {\n location,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n ignoreLocation\n } = this.options;\n\n let allIndices = [];\n let totalScore = 0;\n let hasMatches = false;\n\n this.chunks.forEach(({ pattern, alphabet, startIndex }) => {\n const { isMatch, score, indices } = search(text, pattern, alphabet, {\n location: location + startIndex,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n includeMatches,\n ignoreLocation\n });\n\n if (isMatch) {\n hasMatches = true;\n }\n\n totalScore += score;\n\n if (isMatch && indices) {\n allIndices = [...allIndices, ...indices];\n }\n });\n\n let result = {\n isMatch: hasMatches,\n score: hasMatches ? totalScore / this.chunks.length : 1\n };\n\n if (hasMatches && includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n}\n\nclass BaseMatch {\n constructor(pattern) {\n this.pattern = pattern;\n }\n static isMultiMatch(pattern) {\n return getMatch(pattern, this.multiRegex)\n }\n static isSingleMatch(pattern) {\n return getMatch(pattern, this.singleRegex)\n }\n search(/*text*/) {}\n}\n\nfunction getMatch(pattern, exp) {\n const matches = pattern.match(exp);\n return matches ? matches[1] : null\n}\n\n// Token: 'file\n\nclass ExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'exact'\n }\n static get multiRegex() {\n return /^=\"(.*)\"$/\n }\n static get singleRegex() {\n return /^=(.*)$/\n }\n search(text) {\n const isMatch = text === this.pattern;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !fire\n\nclass InverseExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!(.*)$/\n }\n search(text) {\n const index = text.indexOf(this.pattern);\n const isMatch = index === -1;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: ^file\n\nclass PrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'prefix-exact'\n }\n static get multiRegex() {\n return /^\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^\\^(.*)$/\n }\n search(text) {\n const isMatch = text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !^fire\n\nclass InversePrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-prefix-exact'\n }\n static get multiRegex() {\n return /^!\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!\\^(.*)$/\n }\n search(text) {\n const isMatch = !text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: .file$\n\nclass SuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'suffix-exact'\n }\n static get multiRegex() {\n return /^\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^(.*)\\$$/\n }\n search(text) {\n const isMatch = text.endsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [text.length - this.pattern.length, text.length - 1]\n }\n }\n}\n\n// Token: !.file$\n\nclass InverseSuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-suffix-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^!(.*)\\$$/\n }\n search(text) {\n const isMatch = !text.endsWith(this.pattern);\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\nclass FuzzyMatch extends BaseMatch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n super(pattern);\n this._bitapSearch = new BitapSearch(pattern, {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreDiacritics,\n ignoreLocation\n });\n }\n static get type() {\n return 'fuzzy'\n }\n static get multiRegex() {\n return /^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^(.*)$/\n }\n search(text) {\n return this._bitapSearch.searchIn(text)\n }\n}\n\n// Token: 'file\n\nclass IncludeMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'include'\n }\n static get multiRegex() {\n return /^'\"(.*)\"$/\n }\n static get singleRegex() {\n return /^'(.*)$/\n }\n search(text) {\n let location = 0;\n let index;\n\n const indices = [];\n const patternLen = this.pattern.length;\n\n // Get all exact matches\n while ((index = text.indexOf(this.pattern, location)) > -1) {\n location = index + patternLen;\n indices.push([index, location - 1]);\n }\n\n const isMatch = !!indices.length;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices\n }\n }\n}\n\n// ❗Order is important. DO NOT CHANGE.\nconst searchers = [\n ExactMatch,\n IncludeMatch,\n PrefixExactMatch,\n InversePrefixExactMatch,\n InverseSuffixExactMatch,\n SuffixExactMatch,\n InverseExactMatch,\n FuzzyMatch\n];\n\nconst searchersLen = searchers.length;\n\n// Regex to split by spaces, but keep anything in quotes together\nconst SPACE_RE = / +(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)/;\nconst OR_TOKEN = '|';\n\n// Return a 2D array representation of the query, for simpler parsing.\n// Example:\n// \"^core go$ | rb$ | py$ xy$\" => [[\"^core\", \"go$\"], [\"rb$\"], [\"py$\", \"xy$\"]]\nfunction parseQuery(pattern, options = {}) {\n return pattern.split(OR_TOKEN).map((item) => {\n let query = item\n .trim()\n .split(SPACE_RE)\n .filter((item) => item && !!item.trim());\n\n let results = [];\n for (let i = 0, len = query.length; i < len; i += 1) {\n const queryItem = query[i];\n\n // 1. Handle multiple query match (i.e, once that are quoted, like `\"hello world\"`)\n let found = false;\n let idx = -1;\n while (!found && ++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isMultiMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n found = true;\n }\n }\n\n if (found) {\n continue\n }\n\n // 2. Handle single query matches (i.e, once that are *not* quoted)\n idx = -1;\n while (++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isSingleMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n break\n }\n }\n }\n\n return results\n })\n}\n\n// These extended matchers can return an array of matches, as opposed\n// to a singl match\nconst MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]);\n\n/**\n * Command-like searching\n * ======================\n *\n * Given multiple search terms delimited by spaces.e.g. `^jscript .python$ ruby !java`,\n * search in a given text.\n *\n * Search syntax:\n *\n * | Token | Match type | Description |\n * | ----------- | -------------------------- | -------------------------------------- |\n * | `jscript` | fuzzy-match | Items that fuzzy match `jscript` |\n * | `=scheme` | exact-match | Items that are `scheme` |\n * | `'python` | include-match | Items that include `python` |\n * | `!ruby` | inverse-exact-match | Items that do not include `ruby` |\n * | `^java` | prefix-exact-match | Items that start with `java` |\n * | `!^earlang` | inverse-prefix-exact-match | Items that do not start with `earlang` |\n * | `.js$` | suffix-exact-match | Items that end with `.js` |\n * | `!.go$` | inverse-suffix-exact-match | Items that do not end with `.go` |\n *\n * A single pipe character acts as an OR operator. For example, the following\n * query matches entries that start with `core` and end with either`go`, `rb`,\n * or`py`.\n *\n * ```\n * ^core go$ | rb$ | py$\n * ```\n */\nclass ExtendedSearch {\n constructor(\n pattern,\n {\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n includeMatches = Config.includeMatches,\n minMatchCharLength = Config.minMatchCharLength,\n ignoreLocation = Config.ignoreLocation,\n findAllMatches = Config.findAllMatches,\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance\n } = {}\n ) {\n this.query = null;\n this.options = {\n isCaseSensitive,\n ignoreDiacritics,\n includeMatches,\n minMatchCharLength,\n findAllMatches,\n ignoreLocation,\n location,\n threshold,\n distance\n };\n\n pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n pattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n this.pattern = pattern;\n this.query = parseQuery(this.pattern, this.options);\n }\n\n static condition(_, options) {\n return options.useExtendedSearch\n }\n\n searchIn(text) {\n const query = this.query;\n\n if (!query) {\n return {\n isMatch: false,\n score: 1\n }\n }\n\n const { includeMatches, isCaseSensitive, ignoreDiacritics } = this.options;\n\n text = isCaseSensitive ? text : text.toLowerCase();\n text = ignoreDiacritics ? stripDiacritics(text) : text;\n\n let numMatches = 0;\n let allIndices = [];\n let totalScore = 0;\n\n // ORs\n for (let i = 0, qLen = query.length; i < qLen; i += 1) {\n const searchers = query[i];\n\n // Reset indices\n allIndices.length = 0;\n numMatches = 0;\n\n // ANDs\n for (let j = 0, pLen = searchers.length; j < pLen; j += 1) {\n const searcher = searchers[j];\n const { isMatch, indices, score } = searcher.search(text);\n\n if (isMatch) {\n numMatches += 1;\n totalScore += score;\n if (includeMatches) {\n const type = searcher.constructor.type;\n if (MultiMatchSet.has(type)) {\n allIndices = [...allIndices, ...indices];\n } else {\n allIndices.push(indices);\n }\n }\n } else {\n totalScore = 0;\n numMatches = 0;\n allIndices.length = 0;\n break\n }\n }\n\n // OR condition, so if TRUE, return\n if (numMatches) {\n let result = {\n isMatch: true,\n score: totalScore / numMatches\n };\n\n if (includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n }\n\n // Nothing was matched\n return {\n isMatch: false,\n score: 1\n }\n }\n}\n\nconst registeredSearchers = [];\n\nfunction register(...args) {\n registeredSearchers.push(...args);\n}\n\nfunction createSearcher(pattern, options) {\n for (let i = 0, len = registeredSearchers.length; i < len; i += 1) {\n let searcherClass = registeredSearchers[i];\n if (searcherClass.condition(pattern, options)) {\n return new searcherClass(pattern, options)\n }\n }\n\n return new BitapSearch(pattern, options)\n}\n\nconst LogicalOperator = {\n AND: '$and',\n OR: '$or'\n};\n\nconst KeyType = {\n PATH: '$path',\n PATTERN: '$val'\n};\n\nconst isExpression = (query) =>\n !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]);\n\nconst isPath = (query) => !!query[KeyType.PATH];\n\nconst isLeaf = (query) =>\n !isArray(query) && isObject(query) && !isExpression(query);\n\nconst convertToExplicit = (query) => ({\n [LogicalOperator.AND]: Object.keys(query).map((key) => ({\n [key]: query[key]\n }))\n});\n\n// When `auto` is `true`, the parse function will infer and initialize and add\n// the appropriate `Searcher` instance\nfunction parse(query, options, { auto = true } = {}) {\n const next = (query) => {\n let keys = Object.keys(query);\n\n const isQueryPath = isPath(query);\n\n if (!isQueryPath && keys.length > 1 && !isExpression(query)) {\n return next(convertToExplicit(query))\n }\n\n if (isLeaf(query)) {\n const key = isQueryPath ? query[KeyType.PATH] : keys[0];\n\n const pattern = isQueryPath ? query[KeyType.PATTERN] : query[key];\n\n if (!isString(pattern)) {\n throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key))\n }\n\n const obj = {\n keyId: createKeyId(key),\n pattern\n };\n\n if (auto) {\n obj.searcher = createSearcher(pattern, options);\n }\n\n return obj\n }\n\n let node = {\n children: [],\n operator: keys[0]\n };\n\n keys.forEach((key) => {\n const value = query[key];\n\n if (isArray(value)) {\n value.forEach((item) => {\n node.children.push(next(item));\n });\n }\n });\n\n return node\n };\n\n if (!isExpression(query)) {\n query = convertToExplicit(query);\n }\n\n return next(query)\n}\n\n// Practical scoring function\nfunction computeScore(\n results,\n { ignoreFieldNorm = Config.ignoreFieldNorm }\n) {\n results.forEach((result) => {\n let totalScore = 1;\n\n result.matches.forEach(({ key, norm, score }) => {\n const weight = key ? key.weight : null;\n\n totalScore *= Math.pow(\n score === 0 && weight ? Number.EPSILON : score,\n (weight || 1) * (ignoreFieldNorm ? 1 : norm)\n );\n });\n\n result.score = totalScore;\n });\n}\n\nfunction transformMatches(result, data) {\n const matches = result.matches;\n data.matches = [];\n\n if (!isDefined(matches)) {\n return\n }\n\n matches.forEach((match) => {\n if (!isDefined(match.indices) || !match.indices.length) {\n return\n }\n\n const { indices, value } = match;\n\n let obj = {\n indices,\n value\n };\n\n if (match.key) {\n obj.key = match.key.src;\n }\n\n if (match.idx > -1) {\n obj.refIndex = match.idx;\n }\n\n data.matches.push(obj);\n });\n}\n\nfunction transformScore(result, data) {\n data.score = result.score;\n}\n\nfunction format(\n results,\n docs,\n {\n includeMatches = Config.includeMatches,\n includeScore = Config.includeScore\n } = {}\n) {\n const transformers = [];\n\n if (includeMatches) transformers.push(transformMatches);\n if (includeScore) transformers.push(transformScore);\n\n return results.map((result) => {\n const { idx } = result;\n\n const data = {\n item: docs[idx],\n refIndex: idx\n };\n\n if (transformers.length) {\n transformers.forEach((transformer) => {\n transformer(result, data);\n });\n }\n\n return data\n })\n}\n\nclass Fuse {\n constructor(docs, options = {}, index) {\n this.options = { ...Config, ...options };\n\n if (\n this.options.useExtendedSearch &&\n !true\n ) {\n throw new Error(EXTENDED_SEARCH_UNAVAILABLE)\n }\n\n this._keyStore = new KeyStore(this.options.keys);\n\n this.setCollection(docs, index);\n }\n\n setCollection(docs, index) {\n this._docs = docs;\n\n if (index && !(index instanceof FuseIndex)) {\n throw new Error(INCORRECT_INDEX_TYPE)\n }\n\n this._myIndex =\n index ||\n createIndex(this.options.keys, this._docs, {\n getFn: this.options.getFn,\n fieldNormWeight: this.options.fieldNormWeight\n });\n }\n\n add(doc) {\n if (!isDefined(doc)) {\n return\n }\n\n this._docs.push(doc);\n this._myIndex.add(doc);\n }\n\n remove(predicate = (/* doc, idx */) => false) {\n const results = [];\n\n for (let i = 0, len = this._docs.length; i < len; i += 1) {\n const doc = this._docs[i];\n if (predicate(doc, i)) {\n this.removeAt(i);\n i -= 1;\n len -= 1;\n\n results.push(doc);\n }\n }\n\n return results\n }\n\n removeAt(idx) {\n this._docs.splice(idx, 1);\n this._myIndex.removeAt(idx);\n }\n\n getIndex() {\n return this._myIndex\n }\n\n search(query, { limit = -1 } = {}) {\n const {\n includeMatches,\n includeScore,\n shouldSort,\n sortFn,\n ignoreFieldNorm\n } = this.options;\n\n let results = isString(query)\n ? isString(this._docs[0])\n ? this._searchStringList(query)\n : this._searchObjectList(query)\n : this._searchLogical(query);\n\n computeScore(results, { ignoreFieldNorm });\n\n if (shouldSort) {\n results.sort(sortFn);\n }\n\n if (isNumber(limit) && limit > -1) {\n results = results.slice(0, limit);\n }\n\n return format(results, this._docs, {\n includeMatches,\n includeScore\n })\n }\n\n _searchStringList(query) {\n const searcher = createSearcher(query, this.options);\n const { records } = this._myIndex;\n const results = [];\n\n // Iterate over every string in the index\n records.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n results.push({\n item: text,\n idx,\n matches: [{ score, value: text, norm, indices }]\n });\n }\n });\n\n return results\n }\n\n _searchLogical(query) {\n\n const expression = parse(query, this.options);\n\n const evaluate = (node, item, idx) => {\n if (!node.children) {\n const { keyId, searcher } = node;\n\n const matches = this._findMatches({\n key: this._keyStore.get(keyId),\n value: this._myIndex.getValueForItemAtKeyId(item, keyId),\n searcher\n });\n\n if (matches && matches.length) {\n return [\n {\n idx,\n item,\n matches\n }\n ]\n }\n\n return []\n }\n\n const res = [];\n for (let i = 0, len = node.children.length; i < len; i += 1) {\n const child = node.children[i];\n const result = evaluate(child, item, idx);\n if (result.length) {\n res.push(...result);\n } else if (node.operator === LogicalOperator.AND) {\n return []\n }\n }\n return res\n };\n\n const records = this._myIndex.records;\n const resultMap = {};\n const results = [];\n\n records.forEach(({ $: item, i: idx }) => {\n if (isDefined(item)) {\n let expResults = evaluate(expression, item, idx);\n\n if (expResults.length) {\n // Dedupe when adding\n if (!resultMap[idx]) {\n resultMap[idx] = { idx, item, matches: [] };\n results.push(resultMap[idx]);\n }\n expResults.forEach(({ matches }) => {\n resultMap[idx].matches.push(...matches);\n });\n }\n }\n });\n\n return results\n }\n\n _searchObjectList(query) {\n const searcher = createSearcher(query, this.options);\n const { keys, records } = this._myIndex;\n const results = [];\n\n // List is Array<Object>\n records.forEach(({ $: item, i: idx }) => {\n if (!isDefined(item)) {\n return\n }\n\n let matches = [];\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n keys.forEach((key, keyIndex) => {\n matches.push(\n ...this._findMatches({\n key,\n value: item[keyIndex],\n searcher\n })\n );\n });\n\n if (matches.length) {\n results.push({\n idx,\n item,\n matches\n });\n }\n });\n\n return results\n }\n _findMatches({ key, value, searcher }) {\n if (!isDefined(value)) {\n return []\n }\n\n let matches = [];\n\n if (isArray(value)) {\n value.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({\n score,\n key,\n value: text,\n idx,\n norm,\n indices\n });\n }\n });\n } else {\n const { v: text, n: norm } = value;\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({ score, key, value: text, norm, indices });\n }\n }\n\n return matches\n }\n}\n\nFuse.version = '7.1.0';\nFuse.createIndex = createIndex;\nFuse.parseIndex = parseIndex;\nFuse.config = Config;\n\n{\n Fuse.parseQuery = parse;\n}\n\n{\n register(ExtendedSearch);\n}\n\nexport { Fuse as default };\n","import { capitalize } from \"@mui/material\";\nimport Fuse, { FuseResult } from \"fuse.js\";\nimport humanTracksData from \"../Data/humanBiosamples.json\";\nimport mouseTracksData from \"../Data/mouseBiosamples.json\";\nimport { AssayInfo, RowInfo, SearchTracksProps, TrackInfo } from \"../types\";\nimport { Assembly } from \"../consts\";\n\nconst tracksDataByAssembly: Record<Assembly, typeof humanTracksData> = {\n GRCh38: humanTracksData,\n mm10: mouseTracksData,\n};\n\nexport function getTracksData(assembly: Assembly) {\n return tracksDataByAssembly[assembly];\n}\n\nfunction formatAssayType(assay: string): string {\n switch (assay) {\n case \"dnase\":\n return \"DNase\";\n case \"atac\":\n return \"ATAC\";\n case \"h3k4me3\":\n return \"H3K4me3\";\n case \"h3k27ac\":\n return \"H3K27ac\";\n case \"ctcf\":\n return \"CTCF\";\n case \"chromhmm\":\n return \"ChromHMM\";\n case \"ccre\":\n return \"cCRE\";\n case \"rnaseq\":\n return \"RNA-seq\";\n default:\n return assay;\n }\n}\n\n/** Convert display assay name to JSON format */\nfunction toJsonAssayType(displayName: string): string {\n switch (displayName.toLowerCase()) {\n case \"dnase\":\n return \"dnase\";\n case \"atac\":\n return \"atac\";\n case \"h3k4me3\":\n return \"h3k4me3\";\n case \"h3k27ac\":\n return \"h3k27ac\";\n case \"ctcf\":\n return \"ctcf\";\n case \"chromhmm\":\n return \"chromhmm\";\n case \"ccre\":\n return \"ccre\";\n case \"rna-seq\":\n return \"rnaseq\";\n default:\n return displayName.toLowerCase();\n }\n}\n\n// use to get nested data in JSON file\nfunction getNestedValue(obj: any, path: string): any {\n return path.split(\".\").reduce((acc, key) => acc && acc[key], obj);\n}\n\nexport function getTracksByAssayAndOntology(\n assay: string,\n ontology: string,\n tracksData: ReturnType<typeof getTracksData>,\n): TrackInfo[] {\n let res: TrackInfo[] = [];\n const data = getNestedValue(tracksData, \"tracks\");\n const jsonAssay = toJsonAssayType(assay);\n\n data.forEach((track: TrackInfo) => {\n const filteredAssays =\n track.assays?.filter((e: AssayInfo) => e.assay === jsonAssay) || [];\n if (\n filteredAssays.length > 0 &&\n track.ontology === ontology.toLowerCase()\n ) {\n res.push({\n ...track,\n assays: filteredAssays,\n });\n }\n });\n return res;\n}\n\n/** Flatten TrackInfo into RowInfo objects for DataGrid display.\n * @param track TrackInfo object containing information from JSON file\n * @returns Array of flattened RowInfo objects, one per assay\n */\nexport function flattenIntoRows(track: TrackInfo): RowInfo[] {\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 * Fuzzy search in tracks stored in a JSON file.\n *\n * @param jsonStructure - Dot-separated path to the data array in the JSON structure.\n * @param query - The search query string.\n * @param keyWeightMap - Array of keys to search within each track object.\n * Can look like [\"name\", \"author\"] or if weighted, [\n {\n name: 'title',\n weight: 0.3\n },\n {\n name: 'author',\n weight: 0.7\n }\n ].\n * @param threshold - (Optional) Threshold for the fuzzy search (default is 0.5).\n * Smaller = stricter match, larger = fuzzier since 0 is perfect match and 1 is worst match.\n * @param limit - (Optional) Maximum number of results to return (default is 10).\n * @returns FuseResult object containing the search results.\n */\nexport function searchTracks({\n jsonStructure,\n query,\n keyWeightMap,\n threshold = 0.75,\n tracksData,\n}: SearchTracksProps & {\n tracksData: ReturnType<typeof getTracksData>;\n}): FuseResult<TrackInfo>[] {\n const data = getNestedValue(tracksData, jsonStructure ?? \"\");\n\n const fuse = new Fuse(data, {\n includeScore: true,\n shouldSort: true,\n threshold: threshold,\n keys: keyWeightMap,\n });\n return fuse.search(query);\n}\n","import {\n getTracksByAssayAndOntology,\n flattenIntoRows,\n getTracksData,\n} from \"./DataGrid/dataGridHelpers\";\nimport { RowInfo, TrackInfo } from \"./types\";\n\nexport type Assembly = \"GRCh38\" | \"mm10\";\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 \"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/**\n * Build rows and rowById for a specific assembly\n */\nexport function buildRowsForAssembly(assembly: Assembly): {\n rows: RowInfo[];\n rowById: Map<string, RowInfo>;\n} {\n const tracksData = getTracksData(assembly);\n const rows = ontologyTypes.flatMap((ontology) =>\n assayTypes.flatMap((assay) =>\n getTracksByAssayAndOntology(\n assay.toLowerCase(),\n ontology.toLowerCase(),\n tracksData,\n ).flatMap((r: TrackInfo) =>\n flattenIntoRows(r).map((flat) => ({\n ...flat,\n assay,\n ontology,\n })),\n ),\n ),\n );\n const rowById = new Map<string, RowInfo>(rows.map((r) => [r.id, r]));\n return { rows, rowById };\n}\n","import Folder from \"@mui/icons-material/Folder\";\nimport IndeterminateCheckBoxRoundedIcon from \"@mui/icons-material/IndeterminateCheckBoxRounded\";\nimport { Box, Typography, Stack } from \"@mui/material\";\nimport Collapse from \"@mui/material/Collapse\";\nimport { alpha, styled } from \"@mui/material/styles\";\nimport { TreeViewBaseItem } from \"@mui/x-tree-view\";\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 from \"react\";\nimport {\n CustomLabelProps,\n CustomTreeItemProps,\n ExtendedTreeItemProps,\n RowInfo,\n} from \"../types\";\nimport Fuse, { FuseResult } from \"fuse.js\";\nimport { SearchTracksProps } from \"../types\";\nimport { assayTypes, ontologyTypes } from \"../consts\";\n\n/** Format an ID like \"h3k27ac-ENCFF922YMQ\" to \"H3K27ac - ENCFF922YMQ\" */\nfunction formatIdLabel(id: string): string {\n const hyphenIndex = id.indexOf(\"-\");\n if (hyphenIndex === -1) return id;\n\n const assayPart = id.substring(0, hyphenIndex);\n let accessionPart = id.substring(hyphenIndex + 1);\n\n // Truncate accession parts to 15 characters\n if (accessionPart.length > 25)\n accessionPart = accessionPart.substring(0, 15) + \"…\";\n\n const formattedAssay = formatAssayName(assayPart);\n return `${formattedAssay} - ${accessionPart}`;\n}\n\nfunction formatAssayName(assay: string): string {\n switch (assay.toLowerCase()) {\n case \"dnase\":\n return \"DNase\";\n case \"atac\":\n return \"ATAC\";\n case \"h3k4me3\":\n return \"H3K4me3\";\n case \"h3k27ac\":\n return \"H3K27ac\";\n case \"ctcf\":\n return \"CTCF\";\n case \"chromhmm\":\n return \"ChromHMM\";\n case \"ccre\":\n return \"cCRE\";\n case \"rnaseq\":\n return \"RNA-seq\";\n default:\n return assay;\n }\n}\n\n/**\n * Builds tree in the sorted by assay view\n * @param selectedIds: list of ids (from useSelectionStore)\n * @param root: Root TreeViewBaseItem\n * @param rowById: Mapping between an id (experimentAccession) and its RowInfo object\n * @returns all of the items for the RichTreeView in TreeViewWrapper\n */\nexport function buildSortedAssayTreeView(\n selectedIds: string[],\n root: TreeViewBaseItem<ExtendedTreeItemProps>,\n rowById: Map<string, RowInfo>,\n): TreeViewBaseItem<ExtendedTreeItemProps>[] {\n const assayMap = new Map<string, TreeViewBaseItem<ExtendedTreeItemProps>>(); // keep track of top level nodes\n const ontologyMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n const sampleAssayMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n let idx = 1;\n\n const selectedRows = selectedIds.reduce<RowInfo[]>((acc, id) => {\n const row = rowById.get(id);\n if (row) acc.push(row);\n return acc;\n }, []);\n\n selectedRows.forEach((row) => {\n let assayNode = assayMap.get(row.assay);\n if (!assayNode) {\n assayNode = {\n id: row.assay,\n isAssayItem: true,\n label: row.assay,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n assayMap.set(row.assay, assayNode);\n root.children!.push(assayNode);\n }\n\n let ontologyNode = ontologyMap.get(row.ontology + row.assay);\n if (!ontologyNode) {\n ontologyNode = {\n id: row.ontology + \"_\" + idx++,\n isAssayItem: false,\n label: row.ontology,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n assayNode.children!.push(ontologyNode);\n ontologyMap.set(row.ontology + row.assay, ontologyNode);\n }\n\n const displayNameNode: TreeViewBaseItem<ExtendedTreeItemProps> = {\n id: row.displayname + \"_\" + idx++,\n isAssayItem: false,\n label: row.displayname,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n ontologyNode.children!.push(displayNameNode);\n\n let expNode = sampleAssayMap.get(row.displayname + row.id);\n if (!expNode) {\n expNode = {\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 sampleAssayMap.set(row.displayname + row.assay, expNode);\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 root.allRowInfo!.push(row);\n });\n // standardize the order of the assay folders everytime one is added\n root.children!.sort((a, b): number => {\n return assayTypes.indexOf(a.id) - assayTypes.indexOf(b.id);\n });\n return [root];\n}\n\n/**\n * Builds tree in the sorted by assay view\n * @param selectedIds: list of ids (from useSelectionStore)\n * @param root: Root TreeViewBaseItem\n * @param rowById: Mapping between an id (experimentAccession) and its RowInfo object\n * @returns all of the items for the RichTreeView in TreeViewWrapper\n */\nexport function buildTreeView(\n selectedIds: string[],\n root: TreeViewBaseItem<ExtendedTreeItemProps>,\n rowById: Map<string, RowInfo>,\n): TreeViewBaseItem<ExtendedTreeItemProps>[] {\n const ontologyMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >(); // keep track of top level nodes\n const displayNameMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n const sampleAssayMap = new Map<\n string,\n TreeViewBaseItem<ExtendedTreeItemProps>\n >();\n\n const selectedRows = selectedIds.reduce<RowInfo[]>((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 let ontologyNode = ontologyMap.get(row.ontology);\n if (!ontologyNode) {\n ontologyNode = {\n id: row.ontology,\n label: row.ontology,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n ontologyMap.set(row.ontology, ontologyNode);\n root.children!.push(ontologyNode);\n }\n\n let displayNameNode = displayNameMap.get(row.displayname);\n if (!displayNameNode) {\n displayNameNode = {\n id: row.displayname,\n label: row.displayname,\n icon: \"removeable\",\n children: [],\n allExpAccessions: [],\n };\n ontologyNode.children!.push(displayNameNode);\n displayNameMap.set(row.displayname, displayNameNode);\n }\n\n let expNode = sampleAssayMap.get(row.displayname + row.assay);\n if (!expNode) {\n expNode = {\n id: row.id,\n label: formatIdLabel(row.id),\n icon: \"removeable\",\n assayName: row.assay,\n children: [],\n allExpAccessions: [row.id],\n };\n sampleAssayMap.set(row.displayname + row.assay, expNode);\n displayNameNode.children!.push(expNode);\n }\n ontologyNode.allExpAccessions!.push(row.id);\n displayNameNode.allExpAccessions!.push(row.id);\n root.allRowInfo!.push(row);\n });\n // standardize the order of the assay folders everytime one is added\n root.children!.sort((a, b): number => {\n return ontologyTypes.indexOf(a.id) - ontologyTypes.indexOf(b.id);\n });\n return [root];\n}\n\n/**\n * Fuzzy search of active tracks.\n *\n * @param treeItems - TreeBaseViewItems from the tree.\n * @param query - The search query string.\n * @param keyWeightMap - Array of keys to search within each track object.\n * Can look like [\"name\", \"author\"] or if weighted, [\n {\n name: 'title',\n weight: 0.3\n },\n {\n name: 'author',\n weight: 0.7\n }\n ].\n * @param threshold - (Optional) Threshold for the fuzzy search (default is 0.5).\n * Smaller = stricter match, larger = fuzzier since 0 is perfect match and 1 is worst match.\n * @param limit - (Optional) Maximum number of results to return (default is 10).\n * @returns FuseResult object containing the search results.\n */\nexport function searchTreeItems({\n treeItems,\n query,\n keyWeightMap,\n threshold,\n limit = 10,\n}: SearchTracksProps): FuseResult<RowInfo>[] {\n const data = treeItems![0].allRowInfo ?? [];\n const fuse = new Fuse(data, {\n includeScore: true,\n shouldSort: true,\n threshold: threshold,\n keys: keyWeightMap,\n });\n return fuse.search(query, { limit: limit });\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 colorMap: { [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 const color = colorMap[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// 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});\n\nfunction CustomLabel({\n icon: Icon,\n children,\n isAssayItem,\n assayName,\n ...other\n}: CustomLabelProps) {\n const variant = isAssayItem ? \"subtitle2\" : \"body2\";\n const fontWeight = isAssayItem ? \"bold\" : 500;\n return (\n <TreeItemLabel\n {...other}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {Icon && React.isValidElement(Icon) ? (\n <Box className=\"labelIcon\" sx={{ mr: 1 }}>\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\" }}\n />\n )}\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n {isAssayItem && AssayIcon(other.id)}\n {assayName && AssayIcon(assayName)}\n <TreeItemLabelText fontWeight={fontWeight} variant={variant}>\n {children}\n </TreeItemLabelText>\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 = (itemType: string) => {\n switch (itemType) {\n case \"folder\":\n return Folder;\n case \"removeable\":\n return IndeterminateCheckBoxRoundedIcon;\n default:\n return AssayIcon(itemType);\n }\n};\n\nexport const CustomTreeItem = React.forwardRef(function CustomTreeItem(\n props: CustomTreeItemProps,\n ref: React.Ref<HTMLLIElement>,\n) {\n const { id, itemId, label, disabled, children, onRemove, ...other } = 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);\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 })}\n />\n </TreeItemContent>\n {children && <Collapse {...getGroupTransitionProps()} />}\n </TreeItemRoot>\n </TreeItemProvider>\n );\n});\n","import { GridColDef } from \"@mui/x-data-grid-premium\";\nimport { RowInfo } from \"../types\";\nimport { Stack, capitalize } from \"@mui/material\";\nimport { AssayIcon } from \"../TreeView/treeViewHelpers\";\nimport { ontologyTypes, assayTypes } from \"../consts\";\n\nconst displayNameCol: GridColDef<RowInfo> = {\n field: \"displayname\",\n headerName: \"Name\",\n valueFormatter: (value) => value && capitalize(value),\n maxWidth: 300,\n};\n\nconst sortedByAssayOntologyCol: GridColDef<RowInfo> = {\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<RowInfo> = {\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<RowInfo> = {\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<RowInfo> = {\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<RowInfo> = {\n field: \"sampleType\",\n headerName: \"Sample Type\",\n type: \"singleSelect\",\n valueOptions: [\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<RowInfo> = {\n field: \"lifeStage\",\n headerName: \"Life Stage\",\n type: \"singleSelect\",\n valueOptions: [\"adult\", \"embryonic\"],\n valueFormatter: (value) => value && capitalize(value),\n};\n\nconst experimentCol: GridColDef<RowInfo> = {\n field: \"experimentAccession\",\n headerName: \"Experiment Accession\",\n};\n\nconst fileCol: GridColDef<RowInfo> = {\n field: \"fileAccession\",\n headerName: \"File Accession\",\n};\n\nconst idCol: GridColDef<RowInfo> = {\n field: \"id\",\n headerName: \"ID\",\n};\n\nexport const sortedByAssayColumns: GridColDef<RowInfo>[] = [\n displayNameCol,\n sortedByAssayOntologyCol,\n sampleTypeCol,\n lifeStageCol,\n sortedByAssayAssayCol,\n experimentCol,\n fileCol,\n idCol,\n];\n\nexport const defaultColumns: GridColDef<RowInfo>[] = [\n defaultAssayCol,\n sampleTypeCol,\n lifeStageCol,\n defaultOntologyCol,\n displayNameCol,\n experimentCol,\n fileCol,\n idCol,\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 } from \"../consts\";\nimport { AssayIcon } from \"../TreeView/treeViewHelpers\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\n\n// Custom grouping cell that preserves expand/collapse while adding truncation + tooltip\nexport default function GroupingCell(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 { 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, useState } from \"react\";\nimport { DataGridProps } from \"../types\";\nimport { defaultColumns, sortedByAssayColumns } from \"./columns\";\nimport GroupingCell from \"./GroupingCell\";\n\nconst autosizeOptions: GridAutosizeOptions = {\n expand: true,\n includeHeaders: true,\n outliersFactor: 1.5,\n};\n\nexport function DataGridWrapper(props: DataGridProps) {\n const { sortedAssay, handleSelection, rows, selectedIds } = props;\n\n const apiRef = useGridApiRef();\n\n // Resize columns when toggling between sort modes\n useEffect(() => {\n if (apiRef.current && apiRef.current.autosizeColumns) {\n apiRef.current.autosizeColumns(autosizeOptions);\n }\n }, [sortedAssay]);\n\n const groupingModel = sortedAssay\n ? [\"assay\", \"ontology\"]\n : [\"ontology\", \"displayname\"];\n const columnModel = sortedAssay ? sortedByAssayColumns : defaultColumns;\n const leafField = sortedAssay ? \"displayname\" : \"assay\";\n\n // Hide columns that are used in grouping or as leaf field, plus ID column\n const baseVisibility: GridColumnVisibilityModel = sortedAssay\n ? { assay: false, ontology: false, displayname: false, id: false } // sort by assay: assay & ontology are grouping, displayname is leaf\n : { ontology: false, displayname: false, assay: false, id: false }; // default: ontology & displayname are grouping, assay is leaf\n\n const [columnVisibilityModel, setColumnVisibilityModel] =\n useState<GridColumnVisibilityModel>(baseVisibility);\n\n // Update visibility when sort mode changes\n useEffect(() => {\n setColumnVisibilityModel(baseVisibility);\n }, [sortedAssay]);\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={columnModel}\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={handleSelection}\n rowSelectionPropagation={{ descendants: true, parents: true }}\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 { Box, Paper, Typography } from \"@mui/material\";\nimport { RichTreeView, TreeViewBaseItem } from \"@mui/x-tree-view\";\nimport {\n CustomTreeItemProps,\n ExtendedTreeItemProps,\n TreeViewWrapperProps,\n} from \"../types\";\nimport { CustomTreeItem } from \"./treeViewHelpers\";\nimport { Avatar } from \"@mui/material\";\n\nexport function TreeViewWrapper({\n store,\n items,\n trackIds,\n isSearchResult,\n}: TreeViewWrapperProps) {\n const removeIds = store((s) => s.removeIds);\n const rowById = store((s) => s.rowById);\n\n const handleRemoveTreeItem = (\n item: TreeViewBaseItem<ExtendedTreeItemProps>,\n ) => {\n const removedIds = item.allExpAccessions;\n if (removedIds && removedIds.length) {\n const idsToRemove = new Set(removedIds);\n\n // Also remove any auto-generated group IDs that contain these tracks\n removedIds.forEach((id) => {\n const row = rowById.get(id);\n if (row) {\n // Add the auto-generated group IDs for this track's grouping hierarchy\n // Default view: ontology -> displayname\n idsToRemove.add(`auto-generated-row-ontology/${row.ontology}`);\n idsToRemove.add(\n `auto-generated-row-ontology/${row.ontology}-displayname/${row.displayname}`,\n );\n // Sorted by assay view: assay -> ontology -> displayname\n idsToRemove.add(`auto-generated-row-assay/${row.assay}`);\n idsToRemove.add(\n `auto-generated-row-assay/${row.assay}-ontology/${row.ontology}`,\n );\n }\n });\n removeIds(idsToRemove);\n }\n };\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 {trackIds.size}\n </Avatar>\n <Typography fontWeight=\"bold\">\n Active Tracks\n {isSearchResult && (\n <Typography component=\"span\" color=\"text.secondary\" sx={{ ml: 1 }}>\n ({items[0].allRowInfo!.length} search results)\n </Typography>\n )}\n </Typography>\n </Box>\n <Box\n sx={{\n flex: 1,\n overflow: \"auto\",\n }}\n >\n <RichTreeView\n items={items}\n defaultExpandedItems={[\"1\"]}\n slots={{ item: CustomTreeItem }}\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 {\n Box,\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n FormControlLabel,\n Stack,\n Switch,\n TextField,\n} from \"@mui/material\";\nimport { GridRowSelectionModel } from \"@mui/x-data-grid-premium\";\nimport { TreeViewBaseItem } from \"@mui/x-tree-view\";\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { DataGridWrapper } from \"./DataGrid/DataGridWrapper\";\nimport {\n flattenIntoRows,\n searchTracks,\n getTracksData,\n} from \"./DataGrid/dataGridHelpers\";\nimport { TreeViewWrapper } from \"./TreeView/TreeViewWrapper\";\nimport {\n buildSortedAssayTreeView,\n buildTreeView,\n searchTreeItems,\n} from \"./TreeView/treeViewHelpers\";\nimport { SelectionStoreInstance } from \"./store\";\nimport { ExtendedTreeItemProps, SearchTracksProps } from \"./types\";\n\nexport interface TrackSelectProps {\n store: SelectionStoreInstance;\n onSubmit?: (trackIds: Set<string>) => void;\n onCancel?: () => void;\n onReset?: () => void;\n}\n\nexport default function TrackSelect({\n store,\n onSubmit,\n onCancel,\n onReset,\n}: TrackSelectProps) {\n const [limitDialogOpen, setLimitDialogOpen] = useState(false);\n const [sortedAssay, setSortedAssay] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [isSearchResult, setIsSearchResult] = useState(false);\n const selectedIds = store((s) => s.selectedIds);\n const setSelected = store((s) => s.setSelected);\n const clear = store((s) => s.clear);\n const MAX_ACTIVE = store((s) => s.maxTracks);\n const rows = store((s) => s.rows);\n const rowById = store((s) => s.rowById);\n const assembly = store((s) => s.assembly);\n\n // Local working state - changes here don't affect the store until Submit\n const [workingIds, setWorkingIds] = useState<Set<string>>(\n () => new Set(selectedIds),\n );\n\n // Get tracks data for search functionality\n const tracksData = useMemo(\n () => getTracksData(assembly as \"GRCh38\" | \"mm10\"),\n [assembly],\n );\n\n // Get only real track IDs from working selection (no auto-generated group IDs)\n const workingTrackIds = useMemo(() => {\n return new Set([...workingIds].filter((id) => rowById.has(id)));\n }, [workingIds, rowById]);\n\n // Sync workingIds when store's selectedIds changes externally\n useEffect(() => {\n setWorkingIds(new Set(selectedIds));\n }, [selectedIds]);\n\n const treeItems = useMemo(() => {\n return sortedAssay\n ? buildSortedAssayTreeView(\n Array.from(workingTrackIds),\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n rowById,\n )\n : buildTreeView(\n Array.from(workingTrackIds),\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n rowById,\n );\n }, [workingTrackIds, sortedAssay, rowById]);\n\n const [filteredRows, setFilteredRows] = useState(rows);\n const [filteredTreeItems, setFilteredTreeItems] = useState([\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n ] as TreeViewBaseItem<ExtendedTreeItemProps>[]);\n const searchTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const searchResultIdsRef = useRef<Set<string>>(new Set());\n\n useEffect(() => {\n if (searchQuery === \"\") {\n setFilteredTreeItems(treeItems);\n setFilteredRows(rows);\n setIsSearchResult(false);\n searchResultIdsRef.current = new Set();\n } else if (searchResultIdsRef.current.size > 0) {\n // When selection changes during search, rebuild tree from selected items that match search\n const matchingTrackIds = Array.from(workingTrackIds).filter((id) =>\n searchResultIdsRef.current.has(id),\n );\n\n const newTreeItems = sortedAssay\n ? buildSortedAssayTreeView(\n matchingTrackIds,\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n rowById,\n )\n : buildTreeView(\n matchingTrackIds,\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n rowById,\n );\n\n setFilteredTreeItems(newTreeItems);\n }\n }, [treeItems, searchQuery, workingTrackIds, sortedAssay, rowById, rows]);\n\n const handleToggle = () => {\n setSortedAssay(!sortedAssay);\n };\n\n const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value;\n setSearchQuery(query);\n\n // Clear previous timeout\n if (searchTimeoutRef.current) {\n clearTimeout(searchTimeoutRef.current);\n }\n\n // Debounce the search\n searchTimeoutRef.current = setTimeout(() => {\n if (query === \"\") {\n return; // useEffect handles empty query\n }\n\n const dataGridSearchProps = {\n jsonStructure: \"tracks\",\n query: query,\n keyWeightMap: [\n \"displayname\",\n \"ontology\",\n \"lifeStage\",\n \"sampleType\",\n \"type\",\n \"experimentAccession\",\n \"fileAccession\",\n ],\n tracksData,\n };\n\n const treeSearchProps: SearchTracksProps = {\n treeItems: treeItems,\n query: query,\n keyWeightMap: [\n \"displayname\",\n \"ontology\",\n \"lifeStage\",\n \"sampleType\",\n \"type\",\n \"experimentAccession\",\n \"fileAccession\",\n ],\n };\n const newDataGridRows = searchTracks(dataGridSearchProps)\n .map((t) => t.item)\n .flatMap(flattenIntoRows);\n\n // we only want the intersection of filtered tracks displayed on the DataGrid and user-selected tracks to be displayed on the tree\n const newDataGridIds = newDataGridRows.map((r) => r.id);\n const retIds = searchTreeItems(treeSearchProps).map((r) => r.item.id);\n const newTreeIds = retIds.filter((i) => newDataGridIds.includes(i));\n\n // build new tree from the newTreeIds\n const newTreeItems = sortedAssay\n ? buildSortedAssayTreeView(\n newTreeIds,\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n rowById,\n )\n : buildTreeView(\n newTreeIds,\n {\n id: \"1\",\n isAssayItem: false,\n label: \"Biosamples\",\n icon: \"folder\",\n children: [],\n allRowInfo: [],\n },\n rowById,\n );\n\n // Store search result IDs in ref for use in useEffect\n searchResultIdsRef.current = new Set(newDataGridIds);\n\n setFilteredRows(newDataGridRows);\n setIsSearchResult(true);\n setFilteredTreeItems(newTreeItems);\n }, 300);\n };\n\n const handleSelection = (newSelection: GridRowSelectionModel) => {\n const allIds: Set<string> =\n (newSelection && (newSelection as any).ids) ?? new Set<string>();\n\n // Count only real track IDs for the limit check\n let realTrackCount = 0;\n allIds.forEach((id: string) => {\n if (rowById.has(id)) {\n realTrackCount++;\n }\n });\n\n // Block only if the new selection would exceed the limit\n if (realTrackCount > MAX_ACTIVE) {\n setLimitDialogOpen(true);\n return;\n }\n\n // Update working state (not the store yet)\n setWorkingIds(allIds);\n };\n\n const handleSubmit = () => {\n // Commit working selection to store\n setSelected(workingIds);\n // Call callback with real track IDs\n onSubmit?.(workingTrackIds);\n };\n\n const handleCancel = () => {\n // Revert working state to store's committed state\n setWorkingIds(new Set(selectedIds));\n onCancel?.();\n };\n\n return (\n <Box sx={{ flex: 1, pt: 1 }}>\n <Box display=\"flex\" justifyContent=\"space-between\" sx={{ mb: 3 }}>\n <TextField\n id=\"outlined-suffix-shrink\"\n label=\"Search tracks\"\n variant=\"outlined\"\n onChange={handleSearch}\n sx={{ width: \"400px\" }}\n />\n <FormControlLabel\n sx={{ display: \"flex\", justifyContent: \"flex-end\", mb: 1 }}\n value=\"Sort by assay\"\n control={<Switch color=\"primary\" onChange={handleToggle} />}\n label=\"Sort by assay\"\n labelPlacement=\"end\"\n />\n </Box>\n <Stack direction=\"row\" spacing={2} sx={{ width: \"100%\" }}>\n <Box sx={{ flex: 3, minWidth: 0 }}>\n <DataGridWrapper\n rows={filteredRows}\n label={\n isSearchResult\n ? `${filteredRows.length} Search Results`\n : `${rows.length} Available Tracks`\n }\n selectedIds={workingIds}\n handleSelection={handleSelection}\n sortedAssay={sortedAssay}\n />\n </Box>\n <Box sx={{ flex: 2, minWidth: 0 }}>\n <TreeViewWrapper\n store={store}\n items={filteredTreeItems}\n trackIds={workingTrackIds}\n isSearchResult={isSearchResult}\n />\n </Box>\n </Stack>\n <Box\n sx={{ display: \"flex\", justifyContent: \"space-between\", mt: 2, gap: 2 }}\n >\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n onClick={() => {\n if (onReset) {\n onReset();\n } else {\n clear();\n setWorkingIds(new Set());\n }\n }}\n >\n Reset\n </Button>\n <Box sx={{ display: \"flex\", gap: 2 }}>\n <Button variant=\"outlined\" onClick={handleCancel}>\n Cancel\n </Button>\n <Button variant=\"contained\" color=\"primary\" onClick={handleSubmit}>\n Submit\n </Button>\n </Box>\n </Box>\n <Dialog open={limitDialogOpen} onClose={() => setLimitDialogOpen(false)}>\n <DialogTitle>Track Limit Reached</DialogTitle>\n <DialogContent>\n <DialogContentText>\n You can select up to {MAX_ACTIVE} tracks at a time. Please remove a\n 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 </Box>\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 { buildRowsForAssembly, Assembly } from \"./consts\";\nimport { RowInfo, SelectionAction, SelectionState } from \"./types\";\n\nexport type SelectionStoreInstance = UseBoundStore<\n StoreApi<SelectionState & SelectionAction>\n>;\n\n// Helper to check if an ID is auto-generated by DataGrid grouping\n// const isAutoGeneratedId = (id: string) => id.startsWith(\"auto-generated-row-\");\n\nexport function createSelectionStore(\n assembly: Assembly,\n initialIds?: Set<string>,\n) {\n const { rows, rowById } = buildRowsForAssembly(assembly);\n\n return create<SelectionState & SelectionAction>((set, get) => ({\n maxTracks: 30,\n assembly,\n rows,\n rowById,\n // Stores ALL selected IDs, including auto-generated group IDs\n selectedIds: initialIds ? new Set(initialIds) : new Set<string>(),\n // Returns only real track IDs (filters out auto-generated group IDs)\n getTrackIds: () => {\n const all = get().selectedIds;\n const storeRowById = get().rowById;\n return new Set([...all].filter((id) => storeRowById.has(id)));\n },\n // Returns a Map of track IDs to RowInfo (no auto-generated IDs)\n getTrackMap: () => {\n const all = get().selectedIds;\n const storeRowById = get().rowById;\n const map = new Map<string, RowInfo>();\n all.forEach((id) => {\n if (storeRowById.has(id)) {\n const row = storeRowById.get(id);\n if (row) {\n map.set(id, row);\n }\n }\n });\n return map;\n },\n setSelected: (ids: Set<string>) =>\n set(() => ({\n selectedIds: new Set(ids),\n })),\n removeIds: (removedIds: Set<string>) =>\n set((state) => {\n const next = new Set(state.selectedIds);\n removedIds.forEach((id) => {\n next.delete(id);\n });\n return { selectedIds: next };\n }),\n clear: () => set(() => ({ selectedIds: new Set<string>() })),\n }));\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","isArray","getTag","baseToString","result","toString","isString","isNumber","isBoolean","isObjectLike","isObject","isDefined","isBlank","INCORRECT_INDEX_TYPE","LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY","PATTERN_LENGTH_TOO_LARGE","max","MISSING_KEY_PROPERTY","INVALID_KEY_WEIGHT_VALUE","hasOwn","KeyStore","totalWeight","obj","createKey","keyId","path","id","src","weight","getFn","createKeyPath","createKeyId","get","list","arr","deepGet","index","i","len","MatchOptions","BasicOptions","a","b","FuzzyOptions","AdvancedOptions","Config","SPACE","norm","mantissa","cache","m","numTokens","n","FuseIndex","fieldNormWeight","docs","records","idx","doc","docIndex","item","record","keyIndex","subRecords","stack","nestedArrIndex","subRecord","createIndex","myIndex","parseIndex","data","computeScore$1","pattern","errors","currentLocation","expectedLocation","distance","ignoreLocation","accuracy","proximity","convertMaskToIndices","matchmask","minMatchCharLength","indices","start","end","match","MAX_BITS","search","text","patternAlphabet","location","threshold","findAllMatches","includeMatches","patternLen","textLen","currentThreshold","bestLocation","computeMatches","matchMask","score","lastBitArr","finalScore","binMax","mask","binMin","binMid","finish","bitArr","j","charMatch","createPatternAlphabet","char","stripDiacritics","str","BitapSearch","isCaseSensitive","ignoreDiacritics","addChunk","startIndex","remainder","allIndices","totalScore","hasMatches","alphabet","isMatch","BaseMatch","getMatch","exp","matches","ExactMatch","InverseExactMatch","PrefixExactMatch","InversePrefixExactMatch","SuffixExactMatch","InverseSuffixExactMatch","FuzzyMatch","IncludeMatch","searchers","searchersLen","SPACE_RE","OR_TOKEN","parseQuery","options","query","results","queryItem","found","searcher","token","MultiMatchSet","ExtendedSearch","_","numMatches","qLen","pLen","registeredSearchers","register","args","createSearcher","searcherClass","LogicalOperator","KeyType","isExpression","isPath","isLeaf","convertToExplicit","parse","auto","next","isQueryPath","computeScore","ignoreFieldNorm","transformMatches","transformScore","format","includeScore","transformers","transformer","Fuse","predicate","limit","shouldSort","sortFn","expression","evaluate","res","child","resultMap","expResults","tracksDataByAssembly","humanTracksData","mouseTracksData","getTracksData","assembly","formatAssayType","assay","toJsonAssayType","getNestedValue","acc","getTracksByAssayAndOntology","ontology","tracksData","jsonAssay","track","filteredAssays","_a","e","flattenIntoRows","lifeStage","sampleType","displayname","experimentAccession","fileAccession","url","capitalize","searchTracks","jsonStructure","keyWeightMap","assayTypes","ontologyTypes","buildRowsForAssembly","rows","r","flat","rowById","formatIdLabel","hyphenIndex","assayPart","accessionPart","formatAssayName","buildSortedAssayTreeView","selectedIds","root","assayMap","ontologyMap","sampleAssayMap","row","assayNode","ontologyNode","displayNameNode","expNode","buildTreeView","displayNameMap","searchTreeItems","treeItems","AssayIcon","color","jsx","Box","TreeItemRoot","styled","theme","TreeItemLabelText","Typography","CustomLabel","Icon","isAssayItem","assayName","other","variant","fontWeight","jsxs","TreeItemLabel","Stack","TreeItemContent","alpha","getIconFromTreeItemType","itemType","Folder","IndeterminateCheckBoxRoundedIcon","CustomTreeItem","ref","itemId","label","disabled","onRemove","getContextProviderProps","getRootProps","getContentProps","getIconContainerProps","getCheckboxProps","getLabelProps","getGroupTransitionProps","status","useTreeItem","useTreeItemModel","icon","handleRemoveIconClick","TreeItemProvider","TreeItemIconContainer","TreeItemIcon","TreeItemCheckbox","Collapse","displayNameCol","sortedByAssayOntologyCol","params","val","sortedByAssayAssayCol","defaultOntologyCol","defaultAssayCol","sampleTypeCol","lifeStageCol","experimentCol","fileCol","idCol","sortedByAssayColumns","defaultColumns","GroupingCell","apiRef","useGridApiContext","isGroup","groupNode","isExpanded","groupingField","depth","handleExpandClick","renderContent","Tooltip","indentLevel","IconButton","ExpandMoreIcon","ChevronRightIcon","autosizeOptions","DataGridWrapper","sortedAssay","handleSelection","useGridApiRef","useEffect","groupingModel","columnModel","leafField","baseVisibility","columnVisibilityModel","setColumnVisibilityModel","useState","filterColumns","columns","column","getTogglableColumns","Paper","DataGridPremium","TreeViewWrapper","store","items","trackIds","isSearchResult","removeIds","s","handleRemoveTreeItem","removedIds","idsToRemove","Avatar","RichTreeView","TrackSelect","onSubmit","onCancel","onReset","limitDialogOpen","setLimitDialogOpen","setSortedAssay","searchQuery","setSearchQuery","setIsSearchResult","setSelected","clear","MAX_ACTIVE","workingIds","setWorkingIds","useMemo","workingTrackIds","filteredRows","setFilteredRows","filteredTreeItems","setFilteredTreeItems","searchTimeoutRef","useRef","searchResultIdsRef","matchingTrackIds","newTreeItems","handleToggle","handleSearch","dataGridSearchProps","treeSearchProps","newDataGridRows","t","newDataGridIds","newTreeIds","newSelection","allIds","realTrackCount","handleSubmit","handleCancel","TextField","FormControlLabel","Switch","Button","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions","createStoreImpl","createState","state","listeners","setState","partial","replace","nextState","previousState","listener","getState","api","initialState","createStore","identity","arg","useStore","selector","slice","createImpl","useBoundStore","create","createSelectionStore","initialIds","set","all","storeRowById","map","ids"],"mappings":"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","x_google_ignoreList":[0,1,2,3,12,13]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@weng-lab/genomebrowser-ui",
3
3
  "private": false,
4
- "version": "0.1.11",
4
+ "version": "0.1.12",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "publishConfig": {
@@ -18,11 +18,10 @@
18
18
  "@emotion/styled": "^11.0.0",
19
19
  "@mui/icons-material": "^7.3.6",
20
20
  "@mui/material": "^7.0.0",
21
- "@mui/x-data-grid": "^8.19.0",
22
21
  "@mui/x-data-grid-premium": "^8.19.0",
23
22
  "react": "^19.0.0",
24
23
  "react-dom": "^19.0.0",
25
- "@weng-lab/genomebrowser": "1.7.3"
24
+ "@weng-lab/genomebrowser": "1.7.5"
26
25
  },
27
26
  "devDependencies": {
28
27
  "@eslint/js": "^9.34.0",
@@ -11,7 +11,7 @@ import {
11
11
  Switch,
12
12
  TextField,
13
13
  } from "@mui/material";
14
- import { GridRowSelectionModel } from "@mui/x-data-grid";
14
+ import { GridRowSelectionModel } from "@mui/x-data-grid-premium";
15
15
  import { TreeViewBaseItem } from "@mui/x-tree-view";
16
16
  import React, { useEffect, useMemo, useRef, useState } from "react";
17
17
  import { DataGridWrapper } from "./DataGrid/DataGridWrapper";
@@ -293,8 +293,8 @@ export function AssayIcon(type: string) {
293
293
  ChromHMM: "#0097a7",
294
294
  H3K27ac: "#fdc401",
295
295
  CTCF: "#01a6f1",
296
- cCRE: "#8b5cf6",
297
- "RNA-seq": "#f97316",
296
+ cCRE: "#000000",
297
+ "RNA-seq": "#00aa00",
298
298
  };
299
299
  const color = colorMap[type];
300
300
  return (
package/test/main.tsx CHANGED
@@ -271,7 +271,7 @@ const ASSAY_COLORS: Record<string, string> = {
271
271
  atac: "#02c7b9",
272
272
  rnaseq: "#00aa00",
273
273
  chromhmm: "#00ff00",
274
- ccre: "#0c184a",
274
+ ccre: "#000000",
275
275
  };
276
276
 
277
277
  function generateTrack(sel: RowInfo, callbacks?: TrackCallbacks): Track {