synapse-react-client 4.0.10 → 4.0.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.
Files changed (210) hide show
  1. package/dist/SWC.index.d.ts +1 -1
  2. package/dist/SWC.index.js +1 -1
  3. package/dist/assets/icons/CloudWarning.d.ts +5 -0
  4. package/dist/assets/icons/CloudWarning.d.ts.map +1 -0
  5. package/dist/assets/icons/CloudWarning.js +47 -0
  6. package/dist/assets/icons/CloudWarning.js.map +1 -0
  7. package/dist/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.d.ts +44 -0
  8. package/dist/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.d.ts.map +1 -0
  9. package/dist/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.js +46 -0
  10. package/dist/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.js.map +1 -0
  11. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.d.ts.map +1 -1
  12. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js +143 -140
  13. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
  14. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
  15. package/dist/components/DataGrid/columns/AutocompleteColumn.js +66 -55
  16. package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
  17. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts.map +1 -1
  18. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js +1 -1
  19. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js.map +1 -1
  20. package/dist/components/DataGrid/utils/applyModelChange.d.ts +1 -1
  21. package/dist/components/DataGrid/utils/applyModelChange.d.ts.map +1 -1
  22. package/dist/components/DataGrid/utils/applyModelChange.js +27 -24
  23. package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
  24. package/dist/components/DataGrid/utils/columnFactory.d.ts +8 -0
  25. package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
  26. package/dist/components/DataGrid/utils/columnFactory.js +47 -44
  27. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  28. package/dist/components/DataGrid/utils/getEmptyValue.d.ts +2 -0
  29. package/dist/components/DataGrid/utils/getEmptyValue.d.ts.map +1 -0
  30. package/dist/components/DataGrid/utils/getEmptyValue.js +8 -0
  31. package/dist/components/DataGrid/utils/getEmptyValue.js.map +1 -0
  32. package/dist/components/DataGrid/utils/modelColsToGrid.d.ts.map +1 -1
  33. package/dist/components/DataGrid/utils/modelColsToGrid.js +2 -1
  34. package/dist/components/DataGrid/utils/modelColsToGrid.js.map +1 -1
  35. package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts +32 -0
  36. package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts.map +1 -0
  37. package/dist/components/DataGrid/utils/schemaAwarePasteValue.js +22 -0
  38. package/dist/components/DataGrid/utils/schemaAwarePasteValue.js.map +1 -0
  39. package/dist/components/DownloadCart/DownloadCartPage.d.ts.map +1 -1
  40. package/dist/components/DownloadCart/DownloadCartPage.js +183 -185
  41. package/dist/components/DownloadCart/DownloadCartPage.js.map +1 -1
  42. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.css +1 -0
  43. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.d.ts.map +1 -1
  44. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +199 -132
  45. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
  46. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js +22 -0
  47. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js.map +1 -0
  48. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.scss +170 -0
  49. package/dist/components/EntityAclEditor/EntityAclEditor.js +8 -8
  50. package/dist/components/EntityAclEditor/EntityAclEditor.js.map +1 -1
  51. package/dist/components/EntityAclEditor/InheritanceMessage.d.ts.map +1 -1
  52. package/dist/components/EntityAclEditor/InheritanceMessage.js +1 -2
  53. package/dist/components/EntityAclEditor/InheritanceMessage.js.map +1 -1
  54. package/dist/components/EntityDownloadButton/EntityDownloadButton.d.ts.map +1 -1
  55. package/dist/components/EntityDownloadButton/EntityDownloadButton.js +1 -0
  56. package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
  57. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.d.ts.map +1 -1
  58. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js +15 -14
  59. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js.map +1 -1
  60. package/dist/components/Forum/DiscussionReply.d.ts +1 -0
  61. package/dist/components/Forum/DiscussionReply.d.ts.map +1 -1
  62. package/dist/components/Forum/DiscussionReply.js +19 -19
  63. package/dist/components/Forum/DiscussionReply.js.map +1 -1
  64. package/dist/components/Forum/DiscussionThread.d.ts +1 -0
  65. package/dist/components/Forum/DiscussionThread.d.ts.map +1 -1
  66. package/dist/components/Forum/DiscussionThread.js +73 -72
  67. package/dist/components/Forum/DiscussionThread.js.map +1 -1
  68. package/dist/components/FullTextSearch/FullTextSearch.d.ts.map +1 -1
  69. package/dist/components/FullTextSearch/FullTextSearch.js +86 -47
  70. package/dist/components/FullTextSearch/FullTextSearch.js.map +1 -1
  71. package/dist/components/GenericCard/BioregistryRules.d.ts.map +1 -1
  72. package/dist/components/GenericCard/BioregistryRules.js +7 -3
  73. package/dist/components/GenericCard/BioregistryRules.js.map +1 -1
  74. package/dist/components/GenericCard/TableRowGenericCard.d.ts.map +1 -1
  75. package/dist/components/GenericCard/TableRowGenericCard.js +157 -157
  76. package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
  77. package/dist/components/HeaderCard.d.ts.map +1 -1
  78. package/dist/components/HeaderCard.js +131 -130
  79. package/dist/components/HeaderCard.js.map +1 -1
  80. package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
  81. package/dist/components/IconSvg/IconSvg.js +2 -1
  82. package/dist/components/IconSvg/IconSvg.js.map +1 -1
  83. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.d.ts +4 -1
  84. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.d.ts.map +1 -1
  85. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.js +3 -2
  86. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.js.map +1 -1
  87. package/dist/components/QueryContext/QueryContext.d.ts +6 -0
  88. package/dist/components/QueryContext/QueryContext.d.ts.map +1 -1
  89. package/dist/components/QueryContext/QueryContext.js.map +1 -1
  90. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts.map +1 -1
  91. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +12 -11
  92. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
  93. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +5 -0
  94. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
  95. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +32 -29
  96. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  97. package/dist/components/QueryWrapperPlotNav/UseRowSet.d.ts.map +1 -1
  98. package/dist/components/QueryWrapperPlotNav/UseRowSet.js +4 -1
  99. package/dist/components/QueryWrapperPlotNav/UseRowSet.js.map +1 -1
  100. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts +59 -0
  101. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts.map +1 -0
  102. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js +174 -0
  103. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -0
  104. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.d.ts +40 -0
  105. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.d.ts.map +1 -0
  106. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.js +100 -0
  107. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.js.map +1 -0
  108. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts +56 -0
  109. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts.map +1 -0
  110. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js +73 -0
  111. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js.map +1 -0
  112. package/dist/components/ShareThisPage/ShareThisPage.js +1 -1
  113. package/dist/components/ShareThisPage/ShareThisPage.js.map +1 -1
  114. package/dist/components/SynapseChat/GridAgentChat.d.ts.map +1 -1
  115. package/dist/components/SynapseChat/GridAgentChat.js +20 -14
  116. package/dist/components/SynapseChat/GridAgentChat.js.map +1 -1
  117. package/dist/components/SynapseChat/SynapseChat.d.ts +3 -1
  118. package/dist/components/SynapseChat/SynapseChat.d.ts.map +1 -1
  119. package/dist/components/SynapseChat/SynapseChat.js +51 -36
  120. package/dist/components/SynapseChat/SynapseChat.js.map +1 -1
  121. package/dist/components/SynapseHomepageV2/HotdropsAndNews.css +1 -1
  122. package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.js +8 -7
  123. package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.js.map +1 -1
  124. package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.scss +16 -0
  125. package/dist/components/SynapseHomepageV2/WordPressNews.d.ts +3 -1
  126. package/dist/components/SynapseHomepageV2/WordPressNews.d.ts.map +1 -1
  127. package/dist/components/SynapseHomepageV2/WordPressNews.js +9 -8
  128. package/dist/components/SynapseHomepageV2/WordPressNews.js.map +1 -1
  129. package/dist/components/SynapseHomepageV2/WordPressNewsItem.d.ts +2 -1
  130. package/dist/components/SynapseHomepageV2/WordPressNewsItem.d.ts.map +1 -1
  131. package/dist/components/SynapseHomepageV2/WordPressNewsItem.js +2 -2
  132. package/dist/components/SynapseHomepageV2/WordPressNewsItem.js.map +1 -1
  133. package/dist/components/SynapseTable/SearchV2.d.ts +7 -0
  134. package/dist/components/SynapseTable/SearchV2.d.ts.map +1 -1
  135. package/dist/components/SynapseTable/SearchV2.js.map +1 -1
  136. package/dist/components/SynapseTable/SynapseTableRenderers.d.ts.map +1 -1
  137. package/dist/components/SynapseTable/SynapseTableRenderers.js +1 -1
  138. package/dist/components/SynapseTable/SynapseTableRenderers.js.map +1 -1
  139. package/dist/components/SynapseTable/usePrefetchTableData.d.ts.map +1 -1
  140. package/dist/components/SynapseTable/usePrefetchTableData.js +6 -5
  141. package/dist/components/SynapseTable/usePrefetchTableData.js.map +1 -1
  142. package/dist/components/ToastMessage/ToastMessage.d.ts +1 -1
  143. package/dist/components/ToastMessage/ToastMessage.d.ts.map +1 -1
  144. package/dist/components/ToastMessage/ToastMessage.js +2 -2
  145. package/dist/components/ToastMessage/ToastMessage.js.map +1 -1
  146. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.d.ts.map +1 -1
  147. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js +157 -148
  148. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
  149. package/dist/components/doi/CreateOrUpdateDoiModal.d.ts.map +1 -1
  150. package/dist/components/doi/CreateOrUpdateDoiModal.js +20 -19
  151. package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
  152. package/dist/components/error/ErrorPage.d.ts +0 -4
  153. package/dist/components/error/ErrorPage.d.ts.map +1 -1
  154. package/dist/components/error/ErrorPage.js +25 -30
  155. package/dist/components/error/ErrorPage.js.map +1 -1
  156. package/dist/components/index.d.ts +4 -0
  157. package/dist/components/index.d.ts.map +1 -1
  158. package/dist/components/index.js +41 -39
  159. package/dist/components/widgets/query-filter/FacetFilterControls.d.ts.map +1 -1
  160. package/dist/components/widgets/query-filter/FacetFilterControls.js +2 -2
  161. package/dist/components/widgets/query-filter/FacetFilterControls.js.map +1 -1
  162. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.d.ts.map +1 -1
  163. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js +1 -1
  164. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
  165. package/dist/index.js +52 -50
  166. package/dist/index.js.map +1 -1
  167. package/dist/mocks/entity/index.d.ts.map +1 -1
  168. package/dist/mocks/entity/index.js +18 -16
  169. package/dist/mocks/entity/index.js.map +1 -1
  170. package/dist/mocks/mockSearchQueryData.d.ts +14 -0
  171. package/dist/mocks/mockSearchQueryData.d.ts.map +1 -0
  172. package/dist/mocks/mockSearchQueryData.js +564 -0
  173. package/dist/mocks/mockSearchQueryData.js.map +1 -0
  174. package/dist/mocks/msw/handlers/searchQueryHandlers.d.ts +22 -0
  175. package/dist/mocks/msw/handlers/searchQueryHandlers.d.ts.map +1 -0
  176. package/dist/mocks/msw/handlers/searchQueryHandlers.js +63 -0
  177. package/dist/mocks/msw/handlers/searchQueryHandlers.js.map +1 -0
  178. package/dist/mocks/msw/handlers.d.ts.map +1 -1
  179. package/dist/mocks/msw/handlers.js +9 -7
  180. package/dist/mocks/msw/handlers.js.map +1 -1
  181. package/dist/style/components/_cards.scss +15 -0
  182. package/dist/style/main.css +1 -1
  183. package/dist/synapse-client/SynapseClient.d.ts +7 -1
  184. package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
  185. package/dist/synapse-client/SynapseClient.js +422 -417
  186. package/dist/synapse-client/SynapseClient.js.map +1 -1
  187. package/dist/synapse-client/index.js +3 -3
  188. package/dist/synapse-queries/KeyFactory.d.ts +3 -0
  189. package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
  190. package/dist/synapse-queries/KeyFactory.js +6 -0
  191. package/dist/synapse-queries/KeyFactory.js.map +1 -1
  192. package/dist/synapse-queries/forum/useThread.d.ts +1 -0
  193. package/dist/synapse-queries/forum/useThread.d.ts.map +1 -1
  194. package/dist/synapse-queries/forum/useThread.js +19 -12
  195. package/dist/synapse-queries/forum/useThread.js.map +1 -1
  196. package/dist/tsconfig.build.tsbuildinfo +1 -1
  197. package/dist/utils/APIConstants.d.ts +3 -0
  198. package/dist/utils/APIConstants.d.ts.map +1 -1
  199. package/dist/utils/APIConstants.js +2 -2
  200. package/dist/utils/APIConstants.js.map +1 -1
  201. package/dist/utils/AppUtils/session/ApplicationSessionManager.d.ts.map +1 -1
  202. package/dist/utils/AppUtils/session/ApplicationSessionManager.js +7 -4
  203. package/dist/utils/AppUtils/session/ApplicationSessionManager.js.map +1 -1
  204. package/dist/utils/functions/EntityTypeUtils.d.ts.map +1 -1
  205. package/dist/utils/functions/EntityTypeUtils.js +15 -4
  206. package/dist/utils/functions/EntityTypeUtils.js.map +1 -1
  207. package/dist/utils/functions/calculateFriendlyFileSize.d.ts.map +1 -1
  208. package/dist/utils/functions/calculateFriendlyFileSize.js +3 -3
  209. package/dist/utils/functions/calculateFriendlyFileSize.js.map +1 -1
  210. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"SubmissionDirectoryList.js","names":[],"sources":["../../../src/components/ChallengeSubmission/SubmissionDirectoryList.tsx"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport {\n invalidateAllQueriesForEntity,\n useGetEntities,\n useGetEntityChildren,\n} from '@/synapse-queries'\nimport { useSynapseContext } from '@/utils'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport {\n BackendDestinationEnum,\n getEndpoint,\n} from '@/utils/functions/getEndpoint'\nimport { InfoTwoTone } from '@mui/icons-material'\nimport { Box, Button, Radio, Typography } from '@mui/material'\nimport { DataGrid, GridCellParams, GridColDef } from '@mui/x-data-grid'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport {\n Direction,\n Entity,\n EntityChildrenRequest,\n EntityHeader,\n EntityLookupRequest,\n FILE_ENTITY_CONCRETE_TYPE_VALUE,\n FileEntity,\n FileUploadComplete,\n SortBy,\n UploadCallbackResp,\n} from '@sage-bionetworks/synapse-types'\nimport { useQueryClient } from '@tanstack/react-query'\nimport dayjs from 'dayjs'\nimport { useEffect, useMemo, useState } from 'react'\nimport { Link } from 'react-router'\nimport ConfirmationDialog from '../ConfirmationDialog'\nimport CopyToClipboardIcon from '../CopyToClipboardIcon'\nimport { ErrorBanner } from '../error/ErrorBanner'\nimport FileUpload from '../FileUpload'\nimport IconSvg from '../IconSvg'\nimport { EntityItem } from './ChallengeSubmission'\n\ntype SubmissionDirectoryRow = {\n id: string\n name: string\n modifiedOn: string\n}\n\ntype SubmissionDirectoryListProps = {\n pageSize: number\n challengeProjectId: string\n entityType: typeof EntityType.dockerrepo | typeof EntityType.file\n onItemSelected: (selected: EntityItem) => void\n}\n\ntype FileUploadAttempt = FileUploadComplete & {\n entityId?: string\n}\n\nfunction SubmissionDirectoryList({\n pageSize,\n challengeProjectId,\n entityType,\n onItemSelected,\n}: SubmissionDirectoryListProps) {\n const queryClient = useQueryClient()\n const { accessToken, keyFactory } = useSynapseContext()\n const [page, setPage] = useState<number>(0)\n const [selectedItem, setSelectedItem] = useState<EntityItem | undefined>()\n const [errorMessage, setErrorMessage] = useState<string>()\n const [canSubmit, setCanSubmit] = useState<boolean>()\n const [fetchedHeaders, setFetchedHeaders] = useState<EntityHeader[]>([])\n const [nextPageToken, setNextPageToken] = useState<string | undefined>()\n const [fetchNextPage, setFetchNextPage] = useState<boolean>(false)\n const [confirmOpen, setConfirmOpen] = useState<boolean>(false)\n const [uploadAttempt, setUploadAttempt] = useState<FileUploadAttempt>()\n\n const PER_PAGE = pageSize\n const HEADERS_PER_PAGE = 50\n const PROJECT_URL = `${getEndpoint(\n BackendDestinationEnum.PORTAL_ENDPOINT,\n )}Synapse:${challengeProjectId}`\n\n const request: EntityChildrenRequest = {\n parentId: challengeProjectId,\n nextPageToken: fetchNextPage ? nextPageToken : null,\n includeTypes: [entityType],\n includeTotalChildCount: true,\n sortBy: SortBy.MODIFIED_ON,\n sortDirection: Direction.DESC,\n }\n\n const { data: headerResults, refetch } = useGetEntityChildren(request, {\n enabled: !!challengeProjectId,\n throwOnError: true,\n })\n\n useEffect(() => {\n if (headerResults) {\n const newHeaders = [...fetchedHeaders]\n const headerPage = Math.floor(((page + 1) * PER_PAGE) / HEADERS_PER_PAGE)\n const start = headerPage * HEADERS_PER_PAGE\n newHeaders.splice(start, start + HEADERS_PER_PAGE, ...headerResults.page)\n setFetchedHeaders(newHeaders)\n setFetchNextPage(false)\n setNextPageToken(headerResults.nextPageToken)\n }\n // TODO: Temporary useEffect hook to remove onSuccess QueryOption for @tanstack/react-query v5\n // Refactor this component to remove this effect.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [headerResults])\n\n function getPageHeaders() {\n const pageStart = page * PER_PAGE\n const pageHeaders = fetchedHeaders.slice(pageStart, pageStart + PER_PAGE)\n return pageHeaders\n }\n\n function reset() {\n setErrorMessage(undefined)\n setCanSubmit(undefined)\n setFetchedHeaders([])\n setNextPageToken(undefined)\n setFetchNextPage(false)\n refetch()\n }\n\n useEffect(() => {\n reset()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [entityType, pageSize])\n\n const queries = useGetEntities(getPageHeaders())\n const entities = useMemo(\n () =>\n queries\n .filter(q => q.status === 'success')\n .map(q => q.data) as EntityItem[],\n [queries],\n )\n const areEntitiesLoading = queries.some(q => q.isLoading)\n\n const entityChangeHandler = async (value: string) => {\n setCanSubmit(false)\n const entity = entities.find(entity => entity?.id === value)\n if (entity) {\n setSelectedItem(entity)\n if (entityType === EntityType.dockerrepo) {\n let commits\n try {\n commits = await SynapseClient.getDockerTag(\n entity.id!,\n accessToken,\n 0,\n 1,\n )\n } catch (e) {\n return setErrorMessage(e.message)\n }\n if (commits.totalNumberOfResults === 0) {\n return setErrorMessage(\n 'No commits have been made to this repository. Please select a repository with at least one commit.',\n )\n }\n }\n setCanSubmit(true)\n setErrorMessage(undefined)\n }\n }\n\n const columns: GridColDef[] = [\n {\n field: 'radiobutton',\n headerName: '',\n width: 25,\n sortable: false,\n filterable: false,\n hideable: false,\n disableColumnMenu: true,\n renderCell: params => {\n return (\n <Radio\n value={params.id}\n checked={params.id === selectedItem?.id}\n onChange={event => {\n entityChangeHandler(event.target.value)\n }}\n />\n )\n },\n },\n {\n field: 'name',\n headerName:\n entityType === EntityType.dockerrepo\n ? 'Docker Repository'\n : 'File Name',\n flex: 1,\n filterable: false,\n hideable: false,\n disableColumnMenu: true,\n renderCell: (params: GridCellParams<Entity, SubmissionDirectoryRow>) => (\n <Link\n to={{\n pathname: `${getEndpoint(\n BackendDestinationEnum.PORTAL_ENDPOINT,\n )}Synapse:${params.row.id}`,\n }}\n target=\"_blank\"\n >\n {params.row.name}\n </Link>\n ),\n },\n {\n field: 'modifiedOn',\n headerName: 'Updated On',\n width: 100,\n filterable: false,\n hideable: false,\n disableColumnMenu: true,\n },\n {\n field: 'id',\n headerName: 'ID',\n width: 200,\n filterable: false,\n hideable: false,\n disableColumnMenu: true,\n },\n ]\n\n const getRows = (entities: EntityItem[]) => {\n const newRows: SubmissionDirectoryRow[] = []\n entities.forEach(entity => {\n newRows.push({\n id: entity.id!,\n name:\n entityType === EntityType.dockerrepo\n ? entity.repositoryName ?? entity.name\n : entity.name,\n modifiedOn: formatDate(dayjs(entity.modifiedOn), 'MM/DD/YY'),\n })\n })\n return newRows\n }\n\n const handlePageChange = (newPageNum: number) => {\n const lastIndexNeeded = Math.min(\n headerResults?.totalChildCount ?? 0,\n (newPageNum + 1) * PER_PAGE,\n )\n if (lastIndexNeeded > fetchedHeaders.length) {\n setFetchNextPage(true)\n }\n setPage(newPageNum)\n }\n\n const itemSelectedHandler = () => {\n onItemSelected(selectedItem!)\n }\n\n function createEntity(file: FileUploadAttempt) {\n // Create Entity\n if (!file) return\n const { fileHandleId, fileName } = file\n const newFileEntity: FileEntity = {\n parentId: challengeProjectId,\n name: fileName,\n concreteType: FILE_ENTITY_CONCRETE_TYPE_VALUE,\n dataFileHandleId: fileHandleId,\n }\n SynapseClient.createEntity(newFileEntity, accessToken)\n .then(() => {\n reset()\n })\n .catch((err: SynapseClientError) => {\n setErrorMessage(err.reason)\n })\n }\n\n async function updateEntity() {\n if (!uploadAttempt) return\n const { fileHandleId, entityId } = uploadAttempt\n if (!entityId)\n return setErrorMessage('Error: missing entityId. Please try again.')\n // Get the entity\n let entity: FileEntity\n try {\n entity = await SynapseClient.getEntity(accessToken, entityId)\n } catch (err) {\n return setErrorMessage(`The entity ${entityId} could not be retrieved.`)\n }\n\n const updateRequest: FileEntity = {\n id: entity.id,\n name: entity.name,\n dataFileHandleId: fileHandleId,\n concreteType: FILE_ENTITY_CONCRETE_TYPE_VALUE,\n parentId: entity.parentId,\n etag: entity.etag,\n modifiedOn: entity.modifiedOn,\n }\n\n try {\n const updatedEntity = await SynapseClient.updateEntity(\n updateRequest,\n accessToken,\n true,\n )\n await invalidateAllQueriesForEntity(\n queryClient,\n keyFactory,\n updatedEntity.id!,\n )\n queryClient.setQueryData(\n keyFactory.getEntityQueryKey(updatedEntity.id!),\n updatedEntity,\n )\n reset()\n } catch (err) {\n setErrorMessage(err.reason)\n }\n }\n\n const handleUpload = async (response: UploadCallbackResp) => {\n if (response.success && response.resp) {\n const { fileName } = response.resp\n\n // Lookup entity\n const entityLookupRequest: EntityLookupRequest = {\n entityName: fileName,\n parentId: challengeProjectId,\n }\n try {\n const entityId = await SynapseClient.lookupChildEntity(\n entityLookupRequest,\n accessToken,\n )\n // Entity exists, prompt user to update it\n if (entityId) {\n setUploadAttempt({ ...response.resp, entityId: entityId.id })\n setConfirmOpen(true)\n }\n } catch (err) {\n // An existing entity was not found for this file, create it\n setUploadAttempt(undefined)\n createEntity(response.resp)\n }\n } else if (!response.success && response.error) {\n setErrorMessage(response.error.reason as string)\n } else {\n setErrorMessage('An unknown error occurred. Please try again.')\n }\n }\n\n return (\n <Box>\n <Box\n sx={{\n display: 'flex',\n backgroundColor: '#FBFBFC',\n padding: '10px',\n justifyContent: 'space-between',\n }}\n >\n <Typography\n variant=\"h6\"\n sx={{ fontSize: '18px', lineHeight: '20px', fontWeight: 700 }}\n >\n Your Submission Directory\n </Typography>\n <Box sx={{ display: 'flex' }}>\n <Typography\n variant=\"body1\"\n sx={{ fontSize: '14px', color: '#71767F' }}\n >\n Project SynID:{' '}\n <Link to={{ pathname: PROJECT_URL }} target=\"_blank\">\n {challengeProjectId}\n </Link>\n </Typography>\n <CopyToClipboardIcon value={PROJECT_URL} sx={{ marginTop: '-4px' }} />\n </Box>\n </Box>\n <Box>\n <DataGrid\n loading={areEntitiesLoading}\n columns={columns}\n rows={getRows(entities)}\n rowCount={headerResults?.totalChildCount ?? 0}\n pagination\n paginationMode=\"server\"\n paginationModel={{ page, pageSize: PER_PAGE }}\n pageSizeOptions={[PER_PAGE]}\n onPaginationModelChange={({ page }) => {\n handlePageChange(page)\n }}\n density=\"compact\"\n autoHeight\n sx={{\n fontSize: '14px',\n border: 'none',\n height: '100%',\n '& .MuiDataGrid-columnHeader': {\n backgroundColor: '#F1F3F5',\n },\n '& .Mui-odd': {\n backgroundColor: '#FBFBFC',\n },\n '.MuiDataGrid-columnHeaderTitleContainer': {\n justifyContent: 'space-between',\n },\n '.radio': {\n display: 'flex',\n alignItems: 'center',\n height: '100%',\n },\n }}\n getRowClassName={params =>\n params.indexRelativeToCurrentPage % 2 === 0 ? 'Mui-even' : 'Mui-odd'\n }\n />\n </Box>\n {errorMessage && <ErrorBanner error={errorMessage}></ErrorBanner>}\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n {entityType === EntityType.file && (\n <FileUpload\n label=\"Upload File\"\n buttonProps={{\n variant: 'outlined',\n endIcon: <IconSvg icon=\"upload\" />,\n sx: { lineHeight: 1 },\n }}\n onComplete={resp => {\n handleUpload(resp)\n }}\n />\n )}\n <Button\n color=\"primary\"\n variant=\"contained\"\n onClick={itemSelectedHandler}\n disabled={!canSubmit}\n >\n Submit Selection\n </Button>\n </Box>\n {entityType === EntityType.dockerrepo && (\n <Box\n sx={{\n mt: 4,\n display: 'flex',\n }}\n >\n <InfoTwoTone\n sx={{\n width: '16px',\n height: '16px',\n verticalAlign: 'text-bottom',\n }}\n />\n\n <Box\n sx={{\n ml: 2,\n }}\n >\n To learn more about how to create and submit the Docker containers\n using command line, see our{' '}\n <Link\n to=\"https://github.com/Sage-Bionetworks-Challenges/sample-model-templates#build-your-model\"\n target=\"_blank\"\n >\n Docker model submission guide\n </Link>\n .\n </Box>\n </Box>\n )}\n <ConfirmationDialog\n open={confirmOpen}\n title=\"File exists\"\n content={\n <Typography variant=\"body1\" sx={{ fontSize: '16px' }}>\n A file named &quot;{uploadAttempt?.fileName}&quot; (\n {uploadAttempt?.entityId}) already exists in this location. Do you\n want to update the existing file and create a new version?\n </Typography>\n }\n onCancel={() => setConfirmOpen(false)}\n onConfirm={() => {\n updateEntity()\n setConfirmOpen(false)\n }}\n />\n </Box>\n )\n}\n\nexport default SubmissionDirectoryList\n"],"mappings":"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"}
1
+ {"version":3,"file":"SubmissionDirectoryList.js","names":[],"sources":["../../../src/components/ChallengeSubmission/SubmissionDirectoryList.tsx"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport {\n invalidateAllQueriesForEntity,\n useGetEntities,\n useGetEntityChildren,\n} from '@/synapse-queries'\nimport { useSynapseContext } from '@/utils'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport {\n BackendDestinationEnum,\n getEndpoint,\n} from '@/utils/functions/getEndpoint'\nimport { NotesTwoTone } from '@mui/icons-material'\nimport { Box, Button, Radio, Typography } from '@mui/material'\nimport { DataGrid, GridCellParams, GridColDef } from '@mui/x-data-grid'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport {\n Direction,\n Entity,\n EntityChildrenRequest,\n EntityHeader,\n EntityLookupRequest,\n FILE_ENTITY_CONCRETE_TYPE_VALUE,\n FileEntity,\n FileUploadComplete,\n SortBy,\n UploadCallbackResp,\n} from '@sage-bionetworks/synapse-types'\nimport { useQueryClient } from '@tanstack/react-query'\nimport dayjs from 'dayjs'\nimport { useEffect, useMemo, useState } from 'react'\nimport { Link } from 'react-router'\nimport ConfirmationDialog from '../ConfirmationDialog'\nimport CopyToClipboardIcon from '../CopyToClipboardIcon'\nimport { ErrorBanner } from '../error/ErrorBanner'\nimport FileUpload from '../FileUpload'\nimport IconSvg from '../IconSvg'\nimport { EntityItem } from './ChallengeSubmission'\n\ntype SubmissionDirectoryRow = {\n id: string\n name: string\n modifiedOn: string\n}\n\ntype SubmissionDirectoryListProps = {\n pageSize: number\n challengeProjectId: string\n entityType: typeof EntityType.dockerrepo | typeof EntityType.file\n onItemSelected: (selected: EntityItem) => void\n}\n\ntype FileUploadAttempt = FileUploadComplete & {\n entityId?: string\n}\n\nfunction SubmissionDirectoryList({\n pageSize,\n challengeProjectId,\n entityType,\n onItemSelected,\n}: SubmissionDirectoryListProps) {\n const queryClient = useQueryClient()\n const { accessToken, keyFactory } = useSynapseContext()\n const [page, setPage] = useState<number>(0)\n const [selectedItem, setSelectedItem] = useState<EntityItem | undefined>()\n const [errorMessage, setErrorMessage] = useState<string>()\n const [canSubmit, setCanSubmit] = useState<boolean>()\n const [fetchedHeaders, setFetchedHeaders] = useState<EntityHeader[]>([])\n const [nextPageToken, setNextPageToken] = useState<string | undefined>()\n const [fetchNextPage, setFetchNextPage] = useState<boolean>(false)\n const [confirmOpen, setConfirmOpen] = useState<boolean>(false)\n const [uploadAttempt, setUploadAttempt] = useState<FileUploadAttempt>()\n\n const PER_PAGE = pageSize\n const HEADERS_PER_PAGE = 50\n const PROJECT_URL = `${getEndpoint(\n BackendDestinationEnum.PORTAL_ENDPOINT,\n )}Synapse:${challengeProjectId}`\n\n const request: EntityChildrenRequest = {\n parentId: challengeProjectId,\n nextPageToken: fetchNextPage ? nextPageToken : null,\n includeTypes: [entityType],\n includeTotalChildCount: true,\n sortBy: SortBy.MODIFIED_ON,\n sortDirection: Direction.DESC,\n }\n\n const { data: headerResults, refetch } = useGetEntityChildren(request, {\n enabled: !!challengeProjectId,\n throwOnError: true,\n })\n\n useEffect(() => {\n if (headerResults) {\n const newHeaders = [...fetchedHeaders]\n const headerPage = Math.floor(((page + 1) * PER_PAGE) / HEADERS_PER_PAGE)\n const start = headerPage * HEADERS_PER_PAGE\n newHeaders.splice(start, start + HEADERS_PER_PAGE, ...headerResults.page)\n setFetchedHeaders(newHeaders)\n setFetchNextPage(false)\n setNextPageToken(headerResults.nextPageToken)\n }\n // TODO: Temporary useEffect hook to remove onSuccess QueryOption for @tanstack/react-query v5\n // Refactor this component to remove this effect.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [headerResults])\n\n function getPageHeaders() {\n const pageStart = page * PER_PAGE\n const pageHeaders = fetchedHeaders.slice(pageStart, pageStart + PER_PAGE)\n return pageHeaders\n }\n\n function reset() {\n setErrorMessage(undefined)\n setCanSubmit(undefined)\n setFetchedHeaders([])\n setNextPageToken(undefined)\n setFetchNextPage(false)\n refetch()\n }\n\n useEffect(() => {\n reset()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [entityType, pageSize])\n\n const queries = useGetEntities(getPageHeaders())\n const entities = useMemo(\n () =>\n queries\n .filter(q => q.status === 'success')\n .map(q => q.data) as EntityItem[],\n [queries],\n )\n const areEntitiesLoading = queries.some(q => q.isLoading)\n\n const entityChangeHandler = async (value: string) => {\n setCanSubmit(false)\n const entity = entities.find(entity => entity?.id === value)\n if (entity) {\n setSelectedItem(entity)\n if (entityType === EntityType.dockerrepo) {\n let commits\n try {\n commits = await SynapseClient.getDockerTag(\n entity.id!,\n accessToken,\n 0,\n 1,\n )\n } catch (e) {\n return setErrorMessage(e.message)\n }\n if (commits.totalNumberOfResults === 0) {\n return setErrorMessage(\n 'No commits have been made to this repository. Please select a repository with at least one commit.',\n )\n }\n }\n setCanSubmit(true)\n setErrorMessage(undefined)\n }\n }\n\n const columns: GridColDef[] = [\n {\n field: 'radiobutton',\n headerName: '',\n width: 25,\n sortable: false,\n filterable: false,\n hideable: false,\n disableColumnMenu: true,\n renderCell: params => {\n return (\n <Radio\n value={params.id}\n checked={params.id === selectedItem?.id}\n onChange={event => {\n entityChangeHandler(event.target.value)\n }}\n />\n )\n },\n },\n {\n field: 'name',\n headerName:\n entityType === EntityType.dockerrepo\n ? 'Docker Repository'\n : 'File Name',\n flex: 1,\n filterable: false,\n hideable: false,\n disableColumnMenu: true,\n renderCell: (params: GridCellParams<Entity, SubmissionDirectoryRow>) => (\n <Link\n to={{\n pathname: `${getEndpoint(\n BackendDestinationEnum.PORTAL_ENDPOINT,\n )}Synapse:${params.row.id}`,\n }}\n target=\"_blank\"\n >\n {params.row.name}\n </Link>\n ),\n },\n {\n field: 'modifiedOn',\n headerName: 'Updated On',\n width: 100,\n filterable: false,\n hideable: false,\n disableColumnMenu: true,\n },\n {\n field: 'id',\n headerName: 'ID',\n width: 200,\n filterable: false,\n hideable: false,\n disableColumnMenu: true,\n },\n ]\n\n const getRows = (entities: EntityItem[]) => {\n const newRows: SubmissionDirectoryRow[] = []\n entities.forEach(entity => {\n newRows.push({\n id: entity.id!,\n name:\n entityType === EntityType.dockerrepo\n ? entity.repositoryName ?? entity.name\n : entity.name,\n modifiedOn: formatDate(dayjs(entity.modifiedOn), 'MM/DD/YY'),\n })\n })\n return newRows\n }\n\n const handlePageChange = (newPageNum: number) => {\n const lastIndexNeeded = Math.min(\n headerResults?.totalChildCount ?? 0,\n (newPageNum + 1) * PER_PAGE,\n )\n if (lastIndexNeeded > fetchedHeaders.length) {\n setFetchNextPage(true)\n }\n setPage(newPageNum)\n }\n\n const itemSelectedHandler = () => {\n onItemSelected(selectedItem!)\n }\n\n function createEntity(file: FileUploadAttempt) {\n // Create Entity\n if (!file) return\n const { fileHandleId, fileName } = file\n const newFileEntity: FileEntity = {\n parentId: challengeProjectId,\n name: fileName,\n concreteType: FILE_ENTITY_CONCRETE_TYPE_VALUE,\n dataFileHandleId: fileHandleId,\n }\n SynapseClient.createEntity(newFileEntity, accessToken)\n .then(() => {\n reset()\n })\n .catch((err: SynapseClientError) => {\n setErrorMessage(err.reason)\n })\n }\n\n async function updateEntity() {\n if (!uploadAttempt) return\n const { fileHandleId, entityId } = uploadAttempt\n if (!entityId)\n return setErrorMessage('Error: missing entityId. Please try again.')\n // Get the entity\n let entity: FileEntity\n try {\n entity = await SynapseClient.getEntity(accessToken, entityId)\n } catch (err) {\n return setErrorMessage(`The entity ${entityId} could not be retrieved.`)\n }\n\n const updateRequest: FileEntity = {\n id: entity.id,\n name: entity.name,\n dataFileHandleId: fileHandleId,\n concreteType: FILE_ENTITY_CONCRETE_TYPE_VALUE,\n parentId: entity.parentId,\n etag: entity.etag,\n modifiedOn: entity.modifiedOn,\n }\n\n try {\n const updatedEntity = await SynapseClient.updateEntity(\n updateRequest,\n accessToken,\n true,\n )\n await invalidateAllQueriesForEntity(\n queryClient,\n keyFactory,\n updatedEntity.id!,\n )\n queryClient.setQueryData(\n keyFactory.getEntityQueryKey(updatedEntity.id!),\n updatedEntity,\n )\n reset()\n } catch (err) {\n setErrorMessage(err.reason)\n }\n }\n\n const handleUpload = async (response: UploadCallbackResp) => {\n if (response.success && response.resp) {\n const { fileName } = response.resp\n\n // Lookup entity\n const entityLookupRequest: EntityLookupRequest = {\n entityName: fileName,\n parentId: challengeProjectId,\n }\n try {\n const entityId = await SynapseClient.lookupChildEntity(\n entityLookupRequest,\n accessToken,\n )\n // Entity exists, prompt user to update it\n if (entityId) {\n setUploadAttempt({ ...response.resp, entityId: entityId.id })\n setConfirmOpen(true)\n }\n } catch (err) {\n // An existing entity was not found for this file, create it\n setUploadAttempt(undefined)\n createEntity(response.resp)\n }\n } else if (!response.success && response.error) {\n setErrorMessage(response.error.reason as string)\n } else {\n setErrorMessage('An unknown error occurred. Please try again.')\n }\n }\n\n return (\n <Box>\n <Box\n sx={{\n display: 'flex',\n backgroundColor: '#FBFBFC',\n padding: '10px',\n justifyContent: 'space-between',\n }}\n >\n <Typography\n variant=\"h6\"\n sx={{ fontSize: '18px', lineHeight: '20px', fontWeight: 700 }}\n >\n {entityType === EntityType.file\n ? 'Submit File'\n : 'Submit Docker Image'}\n </Typography>\n <Box sx={{ display: 'flex' }}>\n <Typography\n variant=\"body1\"\n sx={{ fontSize: '14px', color: '#71767F' }}\n >\n Your Project SynID:{' '}\n <Link to={{ pathname: PROJECT_URL }} target=\"_blank\">\n {challengeProjectId}\n </Link>\n </Typography>\n <CopyToClipboardIcon value={PROJECT_URL} sx={{ marginTop: '-4px' }} />\n </Box>\n </Box>\n <Box\n sx={{\n my: 3,\n display: 'flex',\n }}\n >\n <NotesTwoTone\n sx={{\n width: '16px',\n height: '16px',\n verticalAlign: 'text-bottom',\n }}\n />\n <Box\n sx={{\n ml: 1,\n }}\n >\n {entityType === EntityType.file && (\n <>\n Choose a prediction file from your submission directory below and\n click \"Submit Selection\" to pick an evaluation queue. If you need\n to add a new file, click \"Upload File\" first.\n </>\n )}\n {entityType === EntityType.dockerrepo && (\n <>\n Choose a Docker image from your submission directory below and\n click \"Submit Selection\" to pick an image version and evaluation\n queue. If you need to upload a new image to your project (\n <code>{challengeProjectId}</code>), see our{' '}\n <Link\n to=\"https://github.com/Sage-Bionetworks-Challenges/sample-model-templates#build-your-model\"\n target=\"_blank\"\n >\n Docker model submission guide\n </Link>{' '}\n for command-line instructions on how to build and upload.\n </>\n )}\n </Box>\n </Box>\n <Box>\n <DataGrid\n loading={areEntitiesLoading}\n columns={columns}\n rows={getRows(entities)}\n rowCount={headerResults?.totalChildCount ?? 0}\n pagination\n paginationMode=\"server\"\n paginationModel={{ page, pageSize: PER_PAGE }}\n pageSizeOptions={[PER_PAGE]}\n onPaginationModelChange={({ page }) => {\n handlePageChange(page)\n }}\n density=\"compact\"\n autoHeight\n sx={{\n fontSize: '14px',\n border: 'none',\n height: '100%',\n '& .MuiDataGrid-columnHeader': {\n backgroundColor: '#F1F3F5',\n },\n '& .Mui-odd': {\n backgroundColor: '#FBFBFC',\n },\n '.MuiDataGrid-columnHeaderTitleContainer': {\n justifyContent: 'space-between',\n },\n '.radio': {\n display: 'flex',\n alignItems: 'center',\n height: '100%',\n },\n }}\n getRowClassName={params =>\n params.indexRelativeToCurrentPage % 2 === 0 ? 'Mui-even' : 'Mui-odd'\n }\n />\n </Box>\n {errorMessage && <ErrorBanner error={errorMessage}></ErrorBanner>}\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n {entityType === EntityType.file && (\n <FileUpload\n label=\"Upload File\"\n buttonProps={{\n variant: 'outlined',\n endIcon: <IconSvg icon=\"upload\" />,\n sx: { lineHeight: 1 },\n }}\n onComplete={resp => {\n handleUpload(resp)\n }}\n />\n )}\n <Button\n color=\"primary\"\n variant=\"contained\"\n onClick={itemSelectedHandler}\n disabled={!canSubmit}\n >\n Submit Selection\n </Button>\n </Box>\n <ConfirmationDialog\n open={confirmOpen}\n title=\"File exists\"\n content={\n <Typography variant=\"body1\" sx={{ fontSize: '16px' }}>\n A file named &quot;{uploadAttempt?.fileName}&quot; (\n {uploadAttempt?.entityId}) already exists in this location. Do you\n want to update the existing file and create a new version?\n </Typography>\n }\n onCancel={() => setConfirmOpen(false)}\n onConfirm={() => {\n updateEntity()\n setConfirmOpen(false)\n }}\n />\n </Box>\n )\n}\n\nexport default SubmissionDirectoryList\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteColumn.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/columns/AutocompleteColumn.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAW7C,OAAO,EAEL,SAAS,EACT,MAAM,EACP,MAAM,wCAAwC,CAAA;AAoB/C,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,KAAK,CAAC,OAAO,CAAC,CAAA;AAElB,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG;IAC9C,OAAO,EAAE,kBAAkB,CAAA;IAC3B,UAAU,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAA;IAC/C,OAAO,EAAE,kBAAkB,EAAE,CAAA;IAC7B,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,UAAU,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;CAC9B,CAAA;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAQzD;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,UAAU,EACV,OAAO,EACP,OAAO,EACP,KAAK,EACL,WAAW,EACX,MAAM,EACN,UAAsB,GACvB,EAAE,qBAAqB,2CAsIvB;AAMD,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,qBAAqB,EAChC,SAAS,EAAE,qBAAqB,WAUjC;AAED,eAAO,MAAM,wBAAwB,6DAGpC,CAAA;AACD,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,kBAAkB,EAAE,CAAA;IAC7B,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,UAAU,EAAE,SAAS,GAAG,IAAI,CAAA;CAC7B,CAAA;AAED,wBAAgB,kBAAkB,CAAC,EACjC,OAAO,EACP,OAAO,EACP,UAAU,GACX,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB3C"}
1
+ {"version":3,"file":"AutocompleteColumn.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/columns/AutocompleteColumn.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAW7C,OAAO,EAEL,SAAS,EACT,MAAM,EACP,MAAM,wCAAwC,CAAA;AAoB/C,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,KAAK,CAAC,OAAO,CAAC,CAAA;AAElB,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG;IAC9C,OAAO,EAAE,kBAAkB,CAAA;IAC3B,UAAU,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAA;IAC/C,OAAO,EAAE,kBAAkB,EAAE,CAAA;IAC7B,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,UAAU,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;CAC9B,CAAA;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAQzD;AAqBD,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,UAAU,EACV,OAAO,EACP,OAAO,EACP,KAAK,EACL,WAAW,EACX,MAAM,EACN,UAAsB,GACvB,EAAE,qBAAqB,2CA8IvB;AAMD,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,qBAAqB,EAChC,SAAS,EAAE,qBAAqB,WAUjC;AAED,eAAO,MAAM,wBAAwB,6DAGpC,CAAA;AACD,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,kBAAkB,EAAE,CAAA;IAC7B,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,UAAU,EAAE,SAAS,GAAG,IAAI,CAAA;CAC7B,CAAA;AAED,wBAAgB,kBAAkB,CAAC,EACjC,OAAO,EACP,OAAO,EACP,UAAU,GACX,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB3C"}
@@ -1,12 +1,12 @@
1
1
  import e from "../utils/parseFreeTextUsingJsonSchemaType.js";
2
2
  import { useGridAutocompleteState as t } from "./useGridAutocompleteState.js";
3
- import { memo as n, useEffect as r, useLayoutEffect as i, useRef as ee, useState as te } from "react";
4
- import { isNil as ne } from "lodash-es";
5
- import { Autocomplete as re, TextField as ie } from "@mui/material";
6
- import { jsx as a } from "react/jsx-runtime";
7
- import { c as ae } from "react/compiler-runtime";
3
+ import { memo as n, useEffect as r, useLayoutEffect as ee, useRef as te, useState as ne } from "react";
4
+ import { isNil as re } from "lodash-es";
5
+ import { Autocomplete as ie, TextField as ae } from "@mui/material";
6
+ import { jsx as i } from "react/jsx-runtime";
7
+ import { c as oe } from "react/compiler-runtime";
8
8
  //#region src/components/DataGrid/columns/AutocompleteColumn.tsx
9
- var oe = {
9
+ var se = {
10
10
  width: "100%",
11
11
  height: "100%",
12
12
  "& .MuiTextField-root .MuiInputBase-root": {
@@ -21,90 +21,101 @@ var oe = {
21
21
  },
22
22
  "& .MuiFormControl-root": { height: "100%" }
23
23
  };
24
- function o(e) {
25
- return ne(e) ? "" : typeof e == "object" ? JSON.stringify(e) : String(e);
24
+ function a(e) {
25
+ return re(e) ? "" : typeof e == "object" ? JSON.stringify(e) : String(e);
26
+ }
27
+ function o(e, t) {
28
+ return e == null || typeof e == "string" && e.trim() === "" ? t : e;
26
29
  }
27
30
  function s(n) {
28
- let s = ae(55), { rowData: c, setRowData: l, choices: u, colType: d, focus: f, stopEditing: p, active: m, clearValue: h } = n, g = h === void 0 ? void 0 : h, _ = ee(l), v;
31
+ let s = oe(56), { rowData: c, setRowData: l, choices: u, colType: d, focus: f, stopEditing: p, active: m, clearValue: h } = n, g = h === void 0 ? void 0 : h, _ = te(l), v;
29
32
  s[0] === l ? v = s[1] : (v = () => {
30
33
  _.current = l;
31
- }, s[0] = l, s[1] = v), i(v);
32
- let y = ee(p), b;
34
+ }, s[0] = l, s[1] = v), ee(v);
35
+ let y = te(p), b;
33
36
  s[2] === p ? b = s[3] : (b = () => {
34
37
  y.current = p;
35
- }, s[2] = p, s[3] = b), i(b);
38
+ }, s[2] = p, s[3] = b), ee(b);
36
39
  let x;
37
- s[4] === c ? x = s[5] : (x = o(c), s[4] = c, s[5] = x);
38
- let S = x, [C, ce] = te(S), w;
39
- s[6] !== d || s[7] !== C || s[8] !== S ? (w = () => {
40
- C !== S && _.current(e(C, d));
41
- }, s[6] = d, s[7] = C, s[8] = S, s[9] = w) : w = s[9];
40
+ s[4] === c ? x = s[5] : (x = a(c), s[4] = c, s[5] = x);
41
+ let S = x, [C, le] = ne(S), w;
42
+ s[6] !== g || s[7] !== d || s[8] !== C || s[9] !== S ? (w = () => {
43
+ if (C !== S) {
44
+ let t = e(C, d);
45
+ _.current(o(t, g));
46
+ }
47
+ }, s[6] = g, s[7] = d, s[8] = C, s[9] = S, s[10] = w) : w = s[10];
42
48
  let T;
43
- s[10] !== m || s[11] !== p || s[12] !== w ? (T = {
49
+ s[11] !== m || s[12] !== p || s[13] !== w ? (T = {
44
50
  active: m,
45
51
  stopEditing: p,
46
52
  onDeactivate: w
47
- }, s[10] = m, s[11] = p, s[12] = w, s[13] = T) : T = s[13];
53
+ }, s[11] = m, s[12] = p, s[13] = w, s[14] = T) : T = s[14];
48
54
  let { menuIsOpen: E, inputRef: D, handleListboxMouseDown: O, notifyOptionCommitted: k, handleMenuOpen: A, handleClose: j } = t(T), M, N;
49
- s[14] !== m || s[15] !== f || s[16] !== S ? (M = () => {
50
- !f && !m && ce(S);
55
+ s[15] !== m || s[16] !== f || s[17] !== S ? (M = () => {
56
+ !f && !m && le(S);
51
57
  }, N = [
52
58
  f,
53
59
  m,
54
60
  S
55
- ], s[14] = m, s[15] = f, s[16] = S, s[17] = M, s[18] = N) : (M = s[17], N = s[18]), r(M, N);
61
+ ], s[15] = m, s[16] = f, s[17] = S, s[18] = M, s[19] = N) : (M = s[18], N = s[19]), r(M, N);
56
62
  let P;
57
- s[19] === c ? P = s[20] : (P = !ne(c) && c !== "", s[19] = c, s[20] = P);
58
- let le = P, F = f ? void 0 : "none", I;
59
- s[21] === F ? I = s[22] : (I = {
63
+ s[20] === c ? P = s[21] : (P = !re(c) && c !== "", s[20] = c, s[21] = P);
64
+ let ue = P, F = f ? void 0 : "none", I;
65
+ s[22] === F ? I = s[23] : (I = {
60
66
  padding: "0 10px",
61
67
  backgroundColor: "inherit",
62
68
  pointerEvents: F
63
- }, s[21] = F, s[22] = I);
69
+ }, s[22] = F, s[23] = I);
64
70
  let L = m ? "visible" : "hidden", R;
65
- s[23] === L ? R = s[24] : (R = {
71
+ s[24] === L ? R = s[25] : (R = {
66
72
  visibility: L,
67
73
  pointerEvents: "auto"
68
- }, s[23] = L, s[24] = R);
74
+ }, s[24] = L, s[25] = R);
69
75
  let z = m ? "visible" : "hidden", B;
70
- s[25] === z ? B = s[26] : (B = {
76
+ s[26] === z ? B = s[27] : (B = {
71
77
  visibility: z,
72
78
  pointerEvents: "auto"
73
- }, s[25] = z, s[26] = B);
79
+ }, s[26] = z, s[27] = B);
74
80
  let V, H;
75
- s[27] === Symbol.for("react.memo_cache_sentinel") ? (V = { visibility: "visible" }, H = { visibility: "visible" }, s[27] = V, s[28] = H) : (V = s[27], H = s[28]);
81
+ s[28] === Symbol.for("react.memo_cache_sentinel") ? (V = { visibility: "visible" }, H = { visibility: "visible" }, s[28] = V, s[29] = H) : (V = s[28], H = s[29]);
76
82
  let U;
77
- s[29] !== I || s[30] !== R || s[31] !== B ? (U = {
78
- ...oe,
83
+ s[30] !== I || s[31] !== R || s[32] !== B ? (U = {
84
+ ...se,
79
85
  "& .MuiAutocomplete-inputRoot": I,
80
86
  "& .MuiAutocomplete-clearIndicator": R,
81
87
  "& .MuiAutocomplete-popupIndicator": B,
82
88
  "&:hover .MuiAutocomplete-clearIndicator": V,
83
89
  "&:hover .MuiAutocomplete-popupIndicator": H
84
- }, s[29] = I, s[30] = R, s[31] = B, s[32] = U) : U = s[32];
90
+ }, s[30] = I, s[31] = R, s[32] = B, s[33] = U) : U = s[33];
85
91
  let W = U, G;
86
- s[33] === Symbol.for("react.memo_cache_sentinel") ? (G = (e) => {
92
+ s[34] === Symbol.for("react.memo_cache_sentinel") ? (G = (e) => {
87
93
  e.key === "Tab" ? (e.preventDefault(), y.current({ nextRow: !1 })) : e.key === "Enter" && (e.preventDefault(), y.current({ nextRow: !0 }));
88
- }, s[33] = G) : G = s[33];
89
- let ue = G, K;
90
- s[34] !== g || s[35] !== d || s[36] !== k ? (K = (t, n, r) => {
91
- k(), r === "clear" ? _.current(g) : r === "createOption" ? _.current(e(n, d)) : _.current(n), setTimeout(() => {
94
+ }, s[34] = G) : G = s[34];
95
+ let de = G, K;
96
+ s[35] !== g || s[36] !== d || s[37] !== k ? (K = (t, n, r) => {
97
+ if (k(), r === "clear") _.current(g);
98
+ else if (r === "createOption") {
99
+ let t = e(n, d);
100
+ _.current(o(t, g));
101
+ } else _.current(n);
102
+ setTimeout(() => {
92
103
  y.current({ nextRow: !1 });
93
104
  }, 0);
94
- }, s[34] = g, s[35] = d, s[36] = k, s[37] = K) : K = s[37];
95
- let q = K, J = !le, Y = c, X;
96
- s[38] === Symbol.for("react.memo_cache_sentinel") ? (X = (e, t) => {
97
- ce(t);
98
- }, s[38] = X) : X = s[38];
105
+ }, s[35] = g, s[36] = d, s[37] = k, s[38] = K) : K = s[38];
106
+ let q = K, J = !ue, Y = c, X;
107
+ s[39] === Symbol.for("react.memo_cache_sentinel") ? (X = (e, t) => {
108
+ le(t);
109
+ }, s[39] = X) : X = s[39];
99
110
  let Z;
100
- s[39] === O ? Z = s[40] : (Z = { listbox: { onMouseDown: O } }, s[39] = O, s[40] = Z);
111
+ s[40] === O ? Z = s[41] : (Z = { listbox: { onMouseDown: O } }, s[40] = O, s[41] = Z);
101
112
  let Q;
102
- s[41] === D ? Q = s[42] : (Q = (e) => /* @__PURE__ */ a(ie, {
113
+ s[42] === D ? Q = s[43] : (Q = (e) => /* @__PURE__ */ i(ae, {
103
114
  ...e,
104
115
  inputRef: D
105
- }), s[41] = D, s[42] = Q);
116
+ }), s[42] = D, s[43] = Q);
106
117
  let $;
107
- return s[43] !== W || s[44] !== u || s[45] !== q || s[46] !== j || s[47] !== A || s[48] !== C || s[49] !== E || s[50] !== J || s[51] !== Y || s[52] !== Z || s[53] !== Q ? ($ = /* @__PURE__ */ a(re, {
118
+ return s[44] !== W || s[45] !== u || s[46] !== q || s[47] !== j || s[48] !== A || s[49] !== C || s[50] !== E || s[51] !== J || s[52] !== Y || s[53] !== Z || s[54] !== Q ? ($ = /* @__PURE__ */ i(ie, {
108
119
  open: E,
109
120
  onOpen: A,
110
121
  forcePopupIcon: !0,
@@ -113,21 +124,21 @@ function s(n) {
113
124
  disablePortal: !1,
114
125
  options: u,
115
126
  selectOnFocus: !0,
116
- getOptionLabel: se,
127
+ getOptionLabel: ce,
117
128
  value: Y,
118
129
  inputValue: C,
119
130
  onInputChange: X,
120
- onKeyDown: ue,
131
+ onKeyDown: de,
121
132
  onClose: j,
122
133
  onChange: q,
123
134
  blurOnSelect: !0,
124
135
  slotProps: Z,
125
136
  renderInput: Q,
126
137
  sx: W
127
- }), s[43] = W, s[44] = u, s[45] = q, s[46] = j, s[47] = A, s[48] = C, s[49] = E, s[50] = J, s[51] = Y, s[52] = Z, s[53] = Q, s[54] = $) : $ = s[54], $;
138
+ }), s[44] = W, s[45] = u, s[46] = q, s[47] = j, s[48] = A, s[49] = C, s[50] = E, s[51] = J, s[52] = Y, s[53] = Z, s[54] = Q, s[55] = $) : $ = s[55], $;
128
139
  }
129
- function se(e) {
130
- return o(e);
140
+ function ce(e) {
141
+ return a(e);
131
142
  }
132
143
  function c(e, t) {
133
144
  return e.rowData === t.rowData && e.choices === t.choices && e.colType === t.colType && e.focus === t.focus && e.active === t.active && e.clearValue === t.clearValue;
@@ -135,7 +146,7 @@ function c(e, t) {
135
146
  var l = n(s, c);
136
147
  function u({ choices: e, colType: t, clearValue: n }) {
137
148
  return {
138
- component: ((r) => /* @__PURE__ */ a(l, {
149
+ component: ((r) => /* @__PURE__ */ i(l, {
139
150
  ...r,
140
151
  choices: e,
141
152
  colType: t,
@@ -148,6 +159,6 @@ function u({ choices: e, colType: t, clearValue: n }) {
148
159
  };
149
160
  }
150
161
  //#endregion
151
- export { s as AutocompleteCell, l as MemoizedAutocompleteCell, c as areAutocompleteCellPropsEqual, u as autocompleteColumn, o as castCellValueToString };
162
+ export { s as AutocompleteCell, l as MemoizedAutocompleteCell, c as areAutocompleteCellPropsEqual, u as autocompleteColumn, a as castCellValueToString };
152
163
 
153
164
  //# sourceMappingURL=AutocompleteColumn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteColumn.js","names":["parseFreeTextGivenJsonSchemaType","Autocomplete","AutocompleteChangeReason","SxProps","TextField","Theme","JSONSchema7Type","isNil","memo","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","CellComponent","CellProps","Column","useGridAutocompleteState","AUTOCOMPLETE_BASE_SX","width","height","padding","backgroundColor","borderRadius","AutocompleteOption","Record","Array","AutocompleteCellProps","rowData","setRowData","value","choices","colType","clearValue","castCellValueToString","toCast","JSON","stringify","String","AutocompleteCell","t0","$","_c","focus","stopEditing","active","t1","undefined","setRowDataRef","t2","current","stopEditingRef","t3","t4","rowDataAsString","localInputState","setLocalInputState","t5","t6","onDeactivate","menuIsOpen","inputRef","handleListboxMouseDown","notifyOptionCommitted","handleMenuOpen","handleClose","t7","t8","t9","hasValue","t10","t11","pointerEvents","t12","t13","visibility","t14","t15","t16","t17","Symbol","for","t18","autocompleteSx","t19","e","key","preventDefault","nextRow","handleKeyDown","t20","_e","newVal","reason","setTimeout","handleChange","t21","t22","t23","_","newInputValue","t24","listbox","onMouseDown","t25","params","t26","_temp","option","areAutocompleteCellPropsEqual","prevProps","nextProps","MemoizedAutocompleteCell","AutocompleteColumnProps","autocompleteColumn","Partial","component","props","Omit","copyValue","pasteValue","disableKeys","keepFocus"],"sources":["../../../../src/components/DataGrid/columns/AutocompleteColumn.tsx"],"sourcesContent":["import parseFreeTextGivenJsonSchemaType from '@/components/DataGrid/utils/parseFreeTextUsingJsonSchemaType'\nimport {\n Autocomplete,\n AutocompleteChangeReason,\n SxProps,\n TextField,\n Theme,\n} from '@mui/material'\nimport { JSONSchema7Type } from 'json-schema'\nimport { isNil } from 'lodash-es'\nimport {\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport {\n CellComponent,\n CellProps,\n Column,\n} from '@sage-bionetworks/react-datasheet-grid'\nimport { useGridAutocompleteState } from './useGridAutocompleteState'\n\n// Static styles extracted to avoid recreation on every render\nconst AUTOCOMPLETE_BASE_SX: SxProps<Theme> = {\n width: '100%',\n height: '100%',\n '& .MuiTextField-root .MuiInputBase-root': {\n height: '100%',\n padding: '0 10px',\n backgroundColor: 'inherit',\n borderRadius: 0,\n },\n '& .MuiAutocomplete-inputRoot': {\n padding: '0 10px',\n backgroundColor: 'inherit',\n },\n '& .MuiFormControl-root': { height: '100%' },\n}\n\nexport type AutocompleteOption =\n | string\n | number\n | boolean\n | null\n | Record<string, unknown>\n | Array<unknown>\n\nexport type AutocompleteCellProps = CellProps & {\n rowData: AutocompleteOption\n setRowData: (value: AutocompleteOption) => void\n choices: AutocompleteOption[]\n colType?: JSONSchema7Type\n clearValue?: undefined | null\n}\n\nexport function castCellValueToString(toCast: any): string {\n if (isNil(toCast)) {\n return ''\n }\n if (typeof toCast === 'object') {\n return JSON.stringify(toCast)\n }\n return String(toCast)\n}\n\nexport function AutocompleteCell({\n rowData,\n setRowData,\n choices,\n colType,\n focus,\n stopEditing,\n active,\n clearValue = undefined,\n}: AutocompleteCellProps) {\n // Stable refs so memo(AutocompleteCell) can use default shallow comparison —\n // react-datasheet-grid recreates these functions on every render, but their\n // behavior is stable for a given cell position.\n const setRowDataRef = useRef(setRowData)\n useLayoutEffect(() => {\n setRowDataRef.current = setRowData\n })\n const stopEditingRef = useRef(stopEditing)\n useLayoutEffect(() => {\n stopEditingRef.current = stopEditing\n })\n\n const rowDataAsString = castCellValueToString(rowData)\n const [localInputState, setLocalInputState] =\n useState<string>(rowDataAsString)\n\n const {\n menuIsOpen,\n inputRef,\n handleListboxMouseDown,\n notifyOptionCommitted,\n handleMenuOpen,\n handleClose,\n } = useGridAutocompleteState({\n active,\n stopEditing,\n onDeactivate: () => {\n if (localInputState !== rowDataAsString) {\n // Commit any free-typed text that hasn't been saved yet\n setRowDataRef.current(\n parseFreeTextGivenJsonSchemaType(localInputState, colType),\n )\n }\n },\n })\n\n // When not actively being edited, sync localInputState with rowData (e.g. after cut)\n useEffect(() => {\n if (!focus && !active) {\n setLocalInputState(rowDataAsString)\n }\n }, [focus, active, rowDataAsString])\n\n const hasValue = !isNil(rowData) && rowData !== ''\n\n // Memoize sx to avoid recreation — dynamic styles change based on active/focus state\n const autocompleteSx = useMemo<SxProps<Theme>>(\n () => ({\n ...AUTOCOMPLETE_BASE_SX,\n '& .MuiAutocomplete-inputRoot': {\n padding: '0 10px',\n backgroundColor: 'inherit',\n pointerEvents: focus ? undefined : 'none',\n },\n '& .MuiAutocomplete-clearIndicator': {\n visibility: active ? 'visible' : 'hidden',\n pointerEvents: 'auto',\n },\n '& .MuiAutocomplete-popupIndicator': {\n visibility: active ? 'visible' : 'hidden',\n pointerEvents: 'auto',\n },\n '&:hover .MuiAutocomplete-clearIndicator': {\n visibility: 'visible',\n },\n '&:hover .MuiAutocomplete-popupIndicator': {\n visibility: 'visible',\n },\n }),\n [active, focus],\n )\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Tab') {\n e.preventDefault()\n stopEditingRef.current({ nextRow: false })\n } else if (e.key === 'Enter') {\n e.preventDefault()\n stopEditingRef.current({ nextRow: true })\n }\n }, [])\n\n const handleChange = useCallback(\n (\n _e: React.SyntheticEvent,\n newVal: unknown,\n reason: AutocompleteChangeReason,\n ) => {\n notifyOptionCommitted()\n if (reason === 'clear') {\n setRowDataRef.current(clearValue)\n } else if (reason === 'createOption') {\n // The user typed an option that wasn't a defined enum — cast to correct type\n setRowDataRef.current(\n parseFreeTextGivenJsonSchemaType(newVal as string, colType),\n )\n } else {\n setRowDataRef.current(newVal as AutocompleteOption)\n }\n setTimeout(() => {\n stopEditingRef.current({ nextRow: false })\n }, 0)\n },\n [clearValue, colType, notifyOptionCommitted],\n )\n\n return (\n <Autocomplete\n open={menuIsOpen}\n onOpen={handleMenuOpen}\n forcePopupIcon={true}\n disableClearable={!hasValue}\n freeSolo={true}\n disablePortal={false}\n options={choices}\n selectOnFocus\n getOptionLabel={option => castCellValueToString(option)}\n value={rowData as AutocompleteOption}\n inputValue={localInputState}\n onInputChange={(_, newInputValue) => {\n setLocalInputState(newInputValue)\n }}\n onKeyDown={handleKeyDown}\n onClose={handleClose}\n onChange={handleChange}\n blurOnSelect={true}\n slotProps={{\n listbox: { onMouseDown: handleListboxMouseDown },\n }}\n renderInput={params => <TextField {...params} inputRef={inputRef} />}\n sx={autocompleteSx}\n />\n )\n}\n\n// Memoize the cell component to prevent unnecessary re-renders.\n// react-datasheet-grid provides new setRowData/stopEditing function instances\n// on each render, so we must ignore those callback identities here and only\n// compare the props that affect rendering.\nexport function areAutocompleteCellPropsEqual(\n prevProps: AutocompleteCellProps,\n nextProps: AutocompleteCellProps,\n) {\n return (\n prevProps.rowData === nextProps.rowData &&\n prevProps.choices === nextProps.choices &&\n prevProps.colType === nextProps.colType &&\n prevProps.focus === nextProps.focus &&\n prevProps.active === nextProps.active &&\n prevProps.clearValue === nextProps.clearValue\n )\n}\n\nexport const MemoizedAutocompleteCell = memo(\n AutocompleteCell,\n areAutocompleteCellPropsEqual,\n)\nexport type AutocompleteColumnProps = {\n choices: AutocompleteOption[]\n colType?: JSONSchema7Type\n clearValue: undefined | null\n}\n\nexport function autocompleteColumn({\n choices,\n colType,\n clearValue,\n}: AutocompleteColumnProps): Partial<Column> {\n return {\n component: ((props: Omit<AutocompleteCellProps, 'choices'>) => (\n <MemoizedAutocompleteCell\n {...props}\n choices={choices}\n colType={colType}\n clearValue={clearValue}\n />\n )) as CellComponent,\n // If we update our enums to support labels, then we can update copy to copy the label and paste to lookup the mapping from label -> value\n copyValue: ({ rowData }) => rowData,\n pasteValue: ({ value }) => value,\n disableKeys: true,\n keepFocus: true,\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AutocompleteColumn.js","names":["parseFreeTextGivenJsonSchemaType","Autocomplete","AutocompleteChangeReason","SxProps","TextField","Theme","JSONSchema7Type","isNil","memo","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","CellComponent","CellProps","Column","useGridAutocompleteState","AUTOCOMPLETE_BASE_SX","width","height","padding","backgroundColor","borderRadius","AutocompleteOption","Record","Array","AutocompleteCellProps","rowData","setRowData","value","choices","colType","clearValue","castCellValueToString","toCast","JSON","stringify","String","commitParsedValue","parsed","undefined","trim","AutocompleteCell","t0","$","_c","focus","stopEditing","active","t1","setRowDataRef","t2","current","stopEditingRef","t3","t4","rowDataAsString","localInputState","setLocalInputState","t5","t6","onDeactivate","menuIsOpen","inputRef","handleListboxMouseDown","notifyOptionCommitted","handleMenuOpen","handleClose","t7","t8","t9","hasValue","t10","t11","pointerEvents","t12","t13","visibility","t14","t15","t16","t17","Symbol","for","t18","autocompleteSx","t19","e","key","preventDefault","nextRow","handleKeyDown","t20","_e","newVal","reason","parsed_0","setTimeout","handleChange","t21","t22","t23","_","newInputValue","t24","listbox","onMouseDown","t25","params","t26","_temp","option","areAutocompleteCellPropsEqual","prevProps","nextProps","MemoizedAutocompleteCell","AutocompleteColumnProps","autocompleteColumn","Partial","component","props","Omit","copyValue","pasteValue","disableKeys","keepFocus"],"sources":["../../../../src/components/DataGrid/columns/AutocompleteColumn.tsx"],"sourcesContent":["import parseFreeTextGivenJsonSchemaType from '@/components/DataGrid/utils/parseFreeTextUsingJsonSchemaType'\nimport {\n Autocomplete,\n AutocompleteChangeReason,\n SxProps,\n TextField,\n Theme,\n} from '@mui/material'\nimport { JSONSchema7Type } from 'json-schema'\nimport { isNil } from 'lodash-es'\nimport {\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport {\n CellComponent,\n CellProps,\n Column,\n} from '@sage-bionetworks/react-datasheet-grid'\nimport { useGridAutocompleteState } from './useGridAutocompleteState'\n\n// Static styles extracted to avoid recreation on every render\nconst AUTOCOMPLETE_BASE_SX: SxProps<Theme> = {\n width: '100%',\n height: '100%',\n '& .MuiTextField-root .MuiInputBase-root': {\n height: '100%',\n padding: '0 10px',\n backgroundColor: 'inherit',\n borderRadius: 0,\n },\n '& .MuiAutocomplete-inputRoot': {\n padding: '0 10px',\n backgroundColor: 'inherit',\n },\n '& .MuiFormControl-root': { height: '100%' },\n}\n\nexport type AutocompleteOption =\n | string\n | number\n | boolean\n | null\n | Record<string, unknown>\n | Array<unknown>\n\nexport type AutocompleteCellProps = CellProps & {\n rowData: AutocompleteOption\n setRowData: (value: AutocompleteOption) => void\n choices: AutocompleteOption[]\n colType?: JSONSchema7Type\n clearValue?: undefined | null\n}\n\nexport function castCellValueToString(toCast: any): string {\n if (isNil(toCast)) {\n return ''\n }\n if (typeof toCast === 'object') {\n return JSON.stringify(toCast)\n }\n return String(toCast)\n}\n\n// Free-text typed/pasted into the cell parses to \"\" for empty input. Committing\n// \"\" leaves the cell as an empty string, which fails enum validation with a\n// terse \"is not a valid enum value\" message. Substitute the column's clearValue\n// (null for required, undefined for optional) so the commit path matches the\n// X-button clear path and the validator surfaces the substantive message.\nfunction commitParsedValue(\n parsed: unknown,\n clearValue: undefined | null,\n): unknown {\n if (\n parsed === null ||\n parsed === undefined ||\n (typeof parsed === 'string' && parsed.trim() === '')\n ) {\n return clearValue\n }\n return parsed\n}\n\nexport function AutocompleteCell({\n rowData,\n setRowData,\n choices,\n colType,\n focus,\n stopEditing,\n active,\n clearValue = undefined,\n}: AutocompleteCellProps) {\n // Stable refs so memo(AutocompleteCell) can use default shallow comparison —\n // react-datasheet-grid recreates these functions on every render, but their\n // behavior is stable for a given cell position.\n const setRowDataRef = useRef(setRowData)\n useLayoutEffect(() => {\n setRowDataRef.current = setRowData\n })\n const stopEditingRef = useRef(stopEditing)\n useLayoutEffect(() => {\n stopEditingRef.current = stopEditing\n })\n\n const rowDataAsString = castCellValueToString(rowData)\n const [localInputState, setLocalInputState] =\n useState<string>(rowDataAsString)\n\n const {\n menuIsOpen,\n inputRef,\n handleListboxMouseDown,\n notifyOptionCommitted,\n handleMenuOpen,\n handleClose,\n } = useGridAutocompleteState({\n active,\n stopEditing,\n onDeactivate: () => {\n if (localInputState !== rowDataAsString) {\n // Commit any free-typed text that hasn't been saved yet\n const parsed = parseFreeTextGivenJsonSchemaType(\n localInputState,\n colType,\n )\n setRowDataRef.current(\n commitParsedValue(parsed, clearValue) as AutocompleteOption,\n )\n }\n },\n })\n\n // When not actively being edited, sync localInputState with rowData (e.g. after cut)\n useEffect(() => {\n if (!focus && !active) {\n setLocalInputState(rowDataAsString)\n }\n }, [focus, active, rowDataAsString])\n\n const hasValue = !isNil(rowData) && rowData !== ''\n\n // Memoize sx to avoid recreation — dynamic styles change based on active/focus state\n const autocompleteSx = useMemo<SxProps<Theme>>(\n () => ({\n ...AUTOCOMPLETE_BASE_SX,\n '& .MuiAutocomplete-inputRoot': {\n padding: '0 10px',\n backgroundColor: 'inherit',\n pointerEvents: focus ? undefined : 'none',\n },\n '& .MuiAutocomplete-clearIndicator': {\n visibility: active ? 'visible' : 'hidden',\n pointerEvents: 'auto',\n },\n '& .MuiAutocomplete-popupIndicator': {\n visibility: active ? 'visible' : 'hidden',\n pointerEvents: 'auto',\n },\n '&:hover .MuiAutocomplete-clearIndicator': {\n visibility: 'visible',\n },\n '&:hover .MuiAutocomplete-popupIndicator': {\n visibility: 'visible',\n },\n }),\n [active, focus],\n )\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Tab') {\n e.preventDefault()\n stopEditingRef.current({ nextRow: false })\n } else if (e.key === 'Enter') {\n e.preventDefault()\n stopEditingRef.current({ nextRow: true })\n }\n }, [])\n\n const handleChange = useCallback(\n (\n _e: React.SyntheticEvent,\n newVal: unknown,\n reason: AutocompleteChangeReason,\n ) => {\n notifyOptionCommitted()\n if (reason === 'clear') {\n setRowDataRef.current(clearValue)\n } else if (reason === 'createOption') {\n // The user typed an option that wasn't a defined enum — cast to correct type\n const parsed = parseFreeTextGivenJsonSchemaType(\n newVal as string,\n colType,\n )\n setRowDataRef.current(\n commitParsedValue(parsed, clearValue) as AutocompleteOption,\n )\n } else {\n setRowDataRef.current(newVal as AutocompleteOption)\n }\n setTimeout(() => {\n stopEditingRef.current({ nextRow: false })\n }, 0)\n },\n [clearValue, colType, notifyOptionCommitted],\n )\n\n return (\n <Autocomplete\n open={menuIsOpen}\n onOpen={handleMenuOpen}\n forcePopupIcon={true}\n disableClearable={!hasValue}\n freeSolo={true}\n disablePortal={false}\n options={choices}\n selectOnFocus\n getOptionLabel={option => castCellValueToString(option)}\n value={rowData as AutocompleteOption}\n inputValue={localInputState}\n onInputChange={(_, newInputValue) => {\n setLocalInputState(newInputValue)\n }}\n onKeyDown={handleKeyDown}\n onClose={handleClose}\n onChange={handleChange}\n blurOnSelect={true}\n slotProps={{\n listbox: { onMouseDown: handleListboxMouseDown },\n }}\n renderInput={params => <TextField {...params} inputRef={inputRef} />}\n sx={autocompleteSx}\n />\n )\n}\n\n// Memoize the cell component to prevent unnecessary re-renders.\n// react-datasheet-grid provides new setRowData/stopEditing function instances\n// on each render, so we must ignore those callback identities here and only\n// compare the props that affect rendering.\nexport function areAutocompleteCellPropsEqual(\n prevProps: AutocompleteCellProps,\n nextProps: AutocompleteCellProps,\n) {\n return (\n prevProps.rowData === nextProps.rowData &&\n prevProps.choices === nextProps.choices &&\n prevProps.colType === nextProps.colType &&\n prevProps.focus === nextProps.focus &&\n prevProps.active === nextProps.active &&\n prevProps.clearValue === nextProps.clearValue\n )\n}\n\nexport const MemoizedAutocompleteCell = memo(\n AutocompleteCell,\n areAutocompleteCellPropsEqual,\n)\nexport type AutocompleteColumnProps = {\n choices: AutocompleteOption[]\n colType?: JSONSchema7Type\n clearValue: undefined | null\n}\n\nexport function autocompleteColumn({\n choices,\n colType,\n clearValue,\n}: AutocompleteColumnProps): Partial<Column> {\n return {\n component: ((props: Omit<AutocompleteCellProps, 'choices'>) => (\n <MemoizedAutocompleteCell\n {...props}\n choices={choices}\n colType={colType}\n clearValue={clearValue}\n />\n )) as CellComponent,\n // If we update our enums to support labels, then we can update copy to copy the label and paste to lookup the mapping from label -> value\n copyValue: ({ rowData }) => rowData,\n pasteValue: ({ value }) => value,\n disableKeys: true,\n keepFocus: true,\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteMultipleEnumColumn.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/columns/AutocompleteMultipleEnumColumn.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAS7C,OAAO,EAAiB,MAAM,EAAE,MAAM,wCAAwC,CAAA;AAC9E,OAAO,EAEL,qBAAqB,EAErB,kBAAkB,EACnB,MAAM,sBAAsB,CAAA;AA+B7B,MAAM,MAAM,8BAA8B,GAAG,kBAAkB,CAAA;AAE/D,MAAM,MAAM,iCAAiC,GAAG,IAAI,CAClD,qBAAqB,EACrB,SAAS,CACV,GAAG;IACF,OAAO,EAAE,8BAA8B,EAAE,CAAA;IACzC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;CAC9B,CAAA;AA4OD,wBAAgB,yCAAyC,CACvD,SAAS,EAAE,iCAAiC,EAC5C,SAAS,EAAE,iCAAiC,WAM7C;AAOD,MAAM,MAAM,mCAAmC,GAAG;IAChD,OAAO,EAAE,8BAA8B,EAAE,CAAA;IACzC,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,UAAU,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;CAC9B,CAAA;AAED,wBAAgB,8BAA8B,CAAC,EAC7C,OAAO,EACP,OAAO,EACP,SAAa,EACb,aAAqB,EACrB,UAAsB,GACvB,EAAE,mCAAmC,GAAG,OAAO,CAAC,MAAM,CAAC,CA6CvD"}
1
+ {"version":3,"file":"AutocompleteMultipleEnumColumn.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/columns/AutocompleteMultipleEnumColumn.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAS7C,OAAO,EAAiB,MAAM,EAAE,MAAM,wCAAwC,CAAA;AAC9E,OAAO,EAEL,qBAAqB,EAErB,kBAAkB,EACnB,MAAM,sBAAsB,CAAA;AA+B7B,MAAM,MAAM,8BAA8B,GAAG,kBAAkB,CAAA;AAE/D,MAAM,MAAM,iCAAiC,GAAG,IAAI,CAClD,qBAAqB,EACrB,SAAS,CACV,GAAG;IACF,OAAO,EAAE,8BAA8B,EAAE,CAAA;IACzC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;CAC9B,CAAA;AA4OD,wBAAgB,yCAAyC,CACvD,SAAS,EAAE,iCAAiC,EAC5C,SAAS,EAAE,iCAAiC,WAM7C;AAOD,MAAM,MAAM,mCAAmC,GAAG;IAChD,OAAO,EAAE,8BAA8B,EAAE,CAAA;IACzC,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,UAAU,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;CAC9B,CAAA;AAED,wBAAgB,8BAA8B,CAAC,EAC7C,OAAO,EACP,OAAO,EACP,SAAa,EACb,aAAqB,EACrB,UAAsB,GACvB,EAAE,mCAAmC,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDvD"}
@@ -197,7 +197,7 @@ function f({ choices: t, colType: n, limitTags: i = 2, dynamicHeight: a = !1, cl
197
197
  pasteValue: ({ value: t }) => {
198
198
  if (typeof t != "string") return t;
199
199
  let r = t.split(/[,\t]/).map((e) => e.trim()).filter((e) => e.length > 0).map((t) => e(t, n)).filter((e) => e != null);
200
- return r.length > 0 ? r : [];
200
+ return r.length > 0 ? r : ee;
201
201
  },
202
202
  disableKeys: !0,
203
203
  keepFocus: !0,
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteMultipleEnumColumn.js","names":["parseFreeTextGivenJsonSchemaType","Autocomplete","AutocompleteChangeReason","SxProps","TextField","Theme","Tooltip","JSONSchema7Type","memo","useCallback","useLayoutEffect","useMemo","useRef","useState","CellComponent","Column","areAutocompleteCellPropsEqual","AutocompleteCellProps","castCellValueToString","AutocompleteOption","GridAutocompleteChip","isNil","isEqual","useGridAutocompleteState","AUTOCOMPLETE_MULTIPLE_BASE_SX","width","height","margin","visibility","TEXT_FIELD_SX","padding","backgroundColor","borderRadius","AutocompleteMultipleEnumOption","AutocompleteMultipleEnumCellProps","Omit","choices","limitTags","clearValue","EnumOption","label","value","createOptionFromValue","createSafeRowData","rowData","Array","isArray","AutocompleteMultipleEnumCell","t0","$","_c","setRowData","colType","t1","active","focus","stopEditing","t2","undefined","setRowDataRef","t3","current","localInputState","setLocalInputState","t4","menuIsOpen","setMenuIsOpen","inputRef","activeRef","handleListboxMouseDown","notifyOptionCommitted","handleMenuOpen","handleClose","effectiveLimitTags","optionsWithLabels","safeRowData","selectedOptions","t5","t6","map","length","_temp","join","tooltipContent","hasValue","t7","t8","t9","t10","t11","t12","t13","Symbol","for","background","t14","pointerEvents","flexWrap","minHeight","maxHeight","overflowY","overflowX","t15","t16","t17","t18","t19","autocompleteSx","t20","_e","newVal","_reason","values","item_0","item","handleChange","t21","trim","parsedValue","handleBlur","t22","t23","overflow","t24","t25","t26","_","newInputValue","t27","t28","listbox","onMouseDown","t29","tagValue","getTagProps","option_1","index","key","tagProps","optionValue_0","option","optionValue","t30","params","input","InputProps","disableUnderline","sx","t31","_temp2","_temp3","t32","option_0","valueValue","areAutocompleteMultipleEnumCellPropsEqual","prevProps","nextProps","MemoizedAutocompleteMultipleEnumCell","AutocompleteMultipleEnumColumnProps","dynamicHeight","autocompleteMultipleEnumColumn","Partial","component","props","copyValue","pasteValue","delimiters","parsedValues","split","filter","disableKeys","keepFocus","cellClassName"],"sources":["../../../../src/components/DataGrid/columns/AutocompleteMultipleEnumColumn.tsx"],"sourcesContent":["import parseFreeTextGivenJsonSchemaType from '@/components/DataGrid/utils/parseFreeTextUsingJsonSchemaType'\nimport {\n Autocomplete,\n AutocompleteChangeReason,\n SxProps,\n TextField,\n Theme,\n Tooltip,\n} from '@mui/material'\nimport { JSONSchema7Type } from 'json-schema'\nimport {\n memo,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { CellComponent, Column } from '@sage-bionetworks/react-datasheet-grid'\nimport {\n areAutocompleteCellPropsEqual,\n AutocompleteCellProps,\n castCellValueToString,\n AutocompleteOption,\n} from './AutocompleteColumn'\nimport { GridAutocompleteChip } from './GridAutocompleteChip'\nimport isNil from 'lodash-es/isNil'\nimport isEqual from 'lodash-es/isEqual'\nimport { useGridAutocompleteState } from './useGridAutocompleteState'\n\n// Static styles extracted to avoid recreation on every render\nconst AUTOCOMPLETE_MULTIPLE_BASE_SX: SxProps<Theme> = {\n width: '100%',\n height: '100%',\n '& .MuiFormControl-root': {\n height: '100%',\n },\n '& .MuiAutocomplete-tag': {\n margin: '1px',\n },\n '&:hover .MuiAutocomplete-clearIndicator': {\n visibility: 'visible',\n },\n '&:hover .MuiAutocomplete-popupIndicator': {\n visibility: 'visible',\n },\n}\n\nconst TEXT_FIELD_SX: SxProps<Theme> = {\n height: '100%',\n padding: '0 10px',\n backgroundColor: 'inherit',\n borderRadius: 0,\n}\n\nexport type AutocompleteMultipleEnumOption = AutocompleteOption\n\nexport type AutocompleteMultipleEnumCellProps = Omit<\n AutocompleteCellProps,\n 'choices'\n> & {\n choices: AutocompleteMultipleEnumOption[]\n limitTags?: number\n clearValue?: undefined | null\n}\n\ntype EnumOption = {\n label: string\n value: AutocompleteMultipleEnumOption\n}\n\nfunction createOptionFromValue(\n value: AutocompleteMultipleEnumOption,\n): EnumOption {\n return {\n label: castCellValueToString(value),\n value: value,\n }\n}\n\nfunction createSafeRowData(\n rowData: AutocompleteMultipleEnumOption,\n): AutocompleteMultipleEnumOption[] {\n if (Array.isArray(rowData)) {\n return rowData as AutocompleteMultipleEnumOption[]\n } else if (isNil(rowData)) {\n return []\n } else {\n return [rowData]\n }\n}\n\nfunction AutocompleteMultipleEnumCell({\n rowData,\n setRowData,\n choices,\n colType,\n limitTags = 2,\n active,\n focus,\n stopEditing,\n clearValue = undefined,\n}: AutocompleteMultipleEnumCellProps) {\n // Stable refs so memo(AutocompleteMultipleEnumCell) can use default shallow\n // comparison — react-datasheet-grid recreates these functions on every render,\n // but their behavior is stable for a given cell position.\n const setRowDataRef = useRef(setRowData)\n useLayoutEffect(() => {\n setRowDataRef.current = setRowData\n })\n const [localInputState, setLocalInputState] = useState<string>('')\n\n const {\n menuIsOpen,\n setMenuIsOpen,\n inputRef,\n activeRef,\n handleListboxMouseDown,\n notifyOptionCommitted,\n handleMenuOpen,\n handleClose,\n } = useGridAutocompleteState({ active, stopEditing })\n\n const safeRowData = createSafeRowData(rowData)\n const optionsWithLabels = choices.map(createOptionFromValue)\n const selectedOptions = safeRowData.map(createOptionFromValue)\n const effectiveLimitTags = active ? -1 : limitTags\n\n // Create tooltip content showing all values\n const tooltipContent =\n safeRowData.length > 0\n ? safeRowData.map(item => castCellValueToString(item)).join(',')\n : ''\n\n const hasValue = !isNil(rowData) && rowData !== ''\n\n // Memoize sx to avoid recreation — dynamic styles change based on active/focus state\n const autocompleteSx = useMemo<SxProps<Theme>>(\n () => ({\n ...AUTOCOMPLETE_MULTIPLE_BASE_SX,\n '& .MuiAutocomplete-inputRoot': {\n pointerEvents: focus ? undefined : 'none',\n padding: '0 10px',\n backgroundColor: 'inherit',\n // Allow tags to wrap and enable scrolling\n flexWrap: active ? 'wrap' : 'nowrap',\n minHeight: '100%',\n maxHeight: '100%',\n overflowY: active ? 'auto' : 'hidden',\n overflowX: 'hidden',\n '&::-webkit-scrollbar': {\n width: '6px',\n height: '6px',\n },\n '&::-webkit-scrollbar-track': {\n background: 'transparent',\n },\n '&::-webkit-scrollbar-thumb': {\n background: '#888',\n borderRadius: '3px',\n },\n '&::-webkit-scrollbar-thumb:hover': {\n background: '#555',\n },\n },\n '& .MuiAutocomplete-clearIndicator': {\n visibility: active ? 'visible' : 'hidden',\n pointerEvents: 'auto',\n },\n '& .MuiAutocomplete-popupIndicator': {\n visibility: active ? 'visible' : 'hidden',\n pointerEvents: 'auto',\n },\n }),\n [active, focus],\n )\n\n const handleChange = useCallback(\n (\n _e: React.SyntheticEvent,\n newVal: (EnumOption | string)[],\n _reason: AutocompleteChangeReason,\n ) => {\n notifyOptionCommitted()\n const values = newVal.map(item => {\n return typeof item === 'string'\n ? parseFreeTextGivenJsonSchemaType(item, colType)\n : item.value\n })\n // Use clearValue when all items are removed\n setRowDataRef.current(values.length === 0 ? clearValue : values)\n setLocalInputState('')\n if (!activeRef.current) {\n // The cell was deactivated while the option click was in progress (portal\n // click was seen as an outside click by the grid). Now that the value is\n // committed, close the menu.\n setMenuIsOpen(false)\n }\n },\n [activeRef, clearValue, colType, notifyOptionCommitted, setMenuIsOpen],\n )\n\n const handleBlur = useCallback(() => {\n if (localInputState.trim()) {\n const parsedValue = parseFreeTextGivenJsonSchemaType(\n localInputState,\n colType,\n )\n setRowDataRef.current([...safeRowData, parsedValue])\n setLocalInputState('')\n }\n }, [localInputState, colType, safeRowData])\n\n return (\n <Tooltip\n title={tooltipContent}\n placement=\"top-start\"\n arrow\n enterDelay={500}\n disableHoverListener={active || safeRowData.length <= limitTags}\n >\n <div\n style={{\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n <Autocomplete\n forcePopupIcon={choices.length > 0}\n disableClearable={!hasValue}\n multiple\n freeSolo\n open={menuIsOpen}\n onOpen={handleMenuOpen}\n disablePortal={false}\n limitTags={effectiveLimitTags}\n options={optionsWithLabels}\n getOptionLabel={option => {\n // Handle both string (for freeSolo) and object options\n return typeof option === 'string' ? option : option.label\n }}\n isOptionEqualToValue={(option, value) => {\n // Compare the actual values, not labels\n const optionValue =\n typeof option === 'string' ? option : option.value\n const valueValue = typeof value === 'string' ? value : value.value\n return isEqual(optionValue, valueValue)\n }}\n value={selectedOptions}\n inputValue={localInputState}\n onInputChange={(_, newInputValue) => {\n setLocalInputState(newInputValue)\n }}\n onClose={handleClose}\n onChange={handleChange}\n disableCloseOnSelect={choices.length > 1}\n slotProps={{\n listbox: { onMouseDown: handleListboxMouseDown },\n }}\n onBlur={handleBlur}\n renderValue={(tagValue, getTagProps) =>\n tagValue.map((option, index) => {\n const { key, ...tagProps } = getTagProps({ index })\n const optionValue =\n typeof option === 'string' ? option : option.value\n return (\n <GridAutocompleteChip\n key={key}\n option={optionValue}\n active={active}\n {...tagProps}\n />\n )\n })\n }\n renderInput={params => (\n <TextField\n {...params}\n inputRef={inputRef}\n slotProps={{\n input: {\n ...params.InputProps,\n disableUnderline: true,\n sx: TEXT_FIELD_SX,\n },\n }}\n />\n )}\n sx={autocompleteSx}\n />\n </div>\n </Tooltip>\n )\n}\n\n// Memoize the cell component to prevent unnecessary re-renders.\n// react-datasheet-grid provides new setRowData/stopEditing function instances\n// on each render, so we must ignore those callback identities here and only\n// compare the props that affect rendering.\nexport function areAutocompleteMultipleEnumCellPropsEqual(\n prevProps: AutocompleteMultipleEnumCellProps,\n nextProps: AutocompleteMultipleEnumCellProps,\n) {\n return (\n areAutocompleteCellPropsEqual(prevProps, nextProps) &&\n prevProps.limitTags === nextProps.limitTags\n )\n}\n\nconst MemoizedAutocompleteMultipleEnumCell = memo(\n AutocompleteMultipleEnumCell,\n areAutocompleteMultipleEnumCellPropsEqual,\n)\n\nexport type AutocompleteMultipleEnumColumnProps = {\n choices: AutocompleteMultipleEnumOption[]\n colType?: JSONSchema7Type\n limitTags?: number\n dynamicHeight?: boolean\n clearValue?: undefined | null\n}\n\nexport function autocompleteMultipleEnumColumn({\n choices,\n colType,\n limitTags = 2,\n dynamicHeight = false,\n clearValue = undefined,\n}: AutocompleteMultipleEnumColumnProps): Partial<Column> {\n return {\n component: ((\n props: Omit<AutocompleteMultipleEnumCellProps, 'choices' | 'limitTags'>,\n ) => (\n <MemoizedAutocompleteMultipleEnumCell\n {...props}\n choices={choices}\n colType={colType}\n limitTags={limitTags}\n clearValue={clearValue}\n />\n )) as CellComponent,\n copyValue: ({ rowData }) => {\n // Convert array to comma-separated string\n const safeRowData = createSafeRowData(rowData)\n return safeRowData.map(item => castCellValueToString(item)).join(',')\n },\n pasteValue: ({ value }) => {\n if (typeof value !== 'string') {\n return value\n }\n\n // Split by comma or tab and clean up values\n const delimiters = /[,\\t]/\n const parsedValues = value\n .split(delimiters)\n .map(item => item.trim())\n .filter(item => item.length > 0)\n .map(item => parseFreeTextGivenJsonSchemaType(item, colType))\n .filter(item => item !== null && item !== undefined)\n\n return parsedValues.length > 0 ? parsedValues : []\n },\n disableKeys: true,\n keepFocus: true,\n ...(dynamicHeight && {\n cellClassName: ({ rowData }) => {\n const safeRowData = createSafeRowData(rowData)\n return safeRowData.length > 3\n ? 'multi-value-cell-large'\n : 'multi-value-cell'\n },\n }),\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AutocompleteMultipleEnumColumn.js","names":["parseFreeTextGivenJsonSchemaType","Autocomplete","AutocompleteChangeReason","SxProps","TextField","Theme","Tooltip","JSONSchema7Type","memo","useCallback","useLayoutEffect","useMemo","useRef","useState","CellComponent","Column","areAutocompleteCellPropsEqual","AutocompleteCellProps","castCellValueToString","AutocompleteOption","GridAutocompleteChip","isNil","isEqual","useGridAutocompleteState","AUTOCOMPLETE_MULTIPLE_BASE_SX","width","height","margin","visibility","TEXT_FIELD_SX","padding","backgroundColor","borderRadius","AutocompleteMultipleEnumOption","AutocompleteMultipleEnumCellProps","Omit","choices","limitTags","clearValue","EnumOption","label","value","createOptionFromValue","createSafeRowData","rowData","Array","isArray","AutocompleteMultipleEnumCell","t0","$","_c","setRowData","colType","t1","active","focus","stopEditing","t2","undefined","setRowDataRef","t3","current","localInputState","setLocalInputState","t4","menuIsOpen","setMenuIsOpen","inputRef","activeRef","handleListboxMouseDown","notifyOptionCommitted","handleMenuOpen","handleClose","effectiveLimitTags","optionsWithLabels","safeRowData","selectedOptions","t5","t6","map","length","_temp","join","tooltipContent","hasValue","t7","t8","t9","t10","t11","t12","t13","Symbol","for","background","t14","pointerEvents","flexWrap","minHeight","maxHeight","overflowY","overflowX","t15","t16","t17","t18","t19","autocompleteSx","t20","_e","newVal","_reason","values","item_0","item","handleChange","t21","trim","parsedValue","handleBlur","t22","t23","overflow","t24","t25","t26","_","newInputValue","t27","t28","listbox","onMouseDown","t29","tagValue","getTagProps","option_1","index","key","tagProps","optionValue_0","option","optionValue","t30","params","input","InputProps","disableUnderline","sx","t31","_temp2","_temp3","t32","option_0","valueValue","areAutocompleteMultipleEnumCellPropsEqual","prevProps","nextProps","MemoizedAutocompleteMultipleEnumCell","AutocompleteMultipleEnumColumnProps","dynamicHeight","autocompleteMultipleEnumColumn","Partial","component","props","copyValue","pasteValue","delimiters","parsedValues","split","filter","disableKeys","keepFocus","cellClassName"],"sources":["../../../../src/components/DataGrid/columns/AutocompleteMultipleEnumColumn.tsx"],"sourcesContent":["import parseFreeTextGivenJsonSchemaType from '@/components/DataGrid/utils/parseFreeTextUsingJsonSchemaType'\nimport {\n Autocomplete,\n AutocompleteChangeReason,\n SxProps,\n TextField,\n Theme,\n Tooltip,\n} from '@mui/material'\nimport { JSONSchema7Type } from 'json-schema'\nimport {\n memo,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { CellComponent, Column } from '@sage-bionetworks/react-datasheet-grid'\nimport {\n areAutocompleteCellPropsEqual,\n AutocompleteCellProps,\n castCellValueToString,\n AutocompleteOption,\n} from './AutocompleteColumn'\nimport { GridAutocompleteChip } from './GridAutocompleteChip'\nimport isNil from 'lodash-es/isNil'\nimport isEqual from 'lodash-es/isEqual'\nimport { useGridAutocompleteState } from './useGridAutocompleteState'\n\n// Static styles extracted to avoid recreation on every render\nconst AUTOCOMPLETE_MULTIPLE_BASE_SX: SxProps<Theme> = {\n width: '100%',\n height: '100%',\n '& .MuiFormControl-root': {\n height: '100%',\n },\n '& .MuiAutocomplete-tag': {\n margin: '1px',\n },\n '&:hover .MuiAutocomplete-clearIndicator': {\n visibility: 'visible',\n },\n '&:hover .MuiAutocomplete-popupIndicator': {\n visibility: 'visible',\n },\n}\n\nconst TEXT_FIELD_SX: SxProps<Theme> = {\n height: '100%',\n padding: '0 10px',\n backgroundColor: 'inherit',\n borderRadius: 0,\n}\n\nexport type AutocompleteMultipleEnumOption = AutocompleteOption\n\nexport type AutocompleteMultipleEnumCellProps = Omit<\n AutocompleteCellProps,\n 'choices'\n> & {\n choices: AutocompleteMultipleEnumOption[]\n limitTags?: number\n clearValue?: undefined | null\n}\n\ntype EnumOption = {\n label: string\n value: AutocompleteMultipleEnumOption\n}\n\nfunction createOptionFromValue(\n value: AutocompleteMultipleEnumOption,\n): EnumOption {\n return {\n label: castCellValueToString(value),\n value: value,\n }\n}\n\nfunction createSafeRowData(\n rowData: AutocompleteMultipleEnumOption,\n): AutocompleteMultipleEnumOption[] {\n if (Array.isArray(rowData)) {\n return rowData as AutocompleteMultipleEnumOption[]\n } else if (isNil(rowData)) {\n return []\n } else {\n return [rowData]\n }\n}\n\nfunction AutocompleteMultipleEnumCell({\n rowData,\n setRowData,\n choices,\n colType,\n limitTags = 2,\n active,\n focus,\n stopEditing,\n clearValue = undefined,\n}: AutocompleteMultipleEnumCellProps) {\n // Stable refs so memo(AutocompleteMultipleEnumCell) can use default shallow\n // comparison — react-datasheet-grid recreates these functions on every render,\n // but their behavior is stable for a given cell position.\n const setRowDataRef = useRef(setRowData)\n useLayoutEffect(() => {\n setRowDataRef.current = setRowData\n })\n const [localInputState, setLocalInputState] = useState<string>('')\n\n const {\n menuIsOpen,\n setMenuIsOpen,\n inputRef,\n activeRef,\n handleListboxMouseDown,\n notifyOptionCommitted,\n handleMenuOpen,\n handleClose,\n } = useGridAutocompleteState({ active, stopEditing })\n\n const safeRowData = createSafeRowData(rowData)\n const optionsWithLabels = choices.map(createOptionFromValue)\n const selectedOptions = safeRowData.map(createOptionFromValue)\n const effectiveLimitTags = active ? -1 : limitTags\n\n // Create tooltip content showing all values\n const tooltipContent =\n safeRowData.length > 0\n ? safeRowData.map(item => castCellValueToString(item)).join(',')\n : ''\n\n const hasValue = !isNil(rowData) && rowData !== ''\n\n // Memoize sx to avoid recreation — dynamic styles change based on active/focus state\n const autocompleteSx = useMemo<SxProps<Theme>>(\n () => ({\n ...AUTOCOMPLETE_MULTIPLE_BASE_SX,\n '& .MuiAutocomplete-inputRoot': {\n pointerEvents: focus ? undefined : 'none',\n padding: '0 10px',\n backgroundColor: 'inherit',\n // Allow tags to wrap and enable scrolling\n flexWrap: active ? 'wrap' : 'nowrap',\n minHeight: '100%',\n maxHeight: '100%',\n overflowY: active ? 'auto' : 'hidden',\n overflowX: 'hidden',\n '&::-webkit-scrollbar': {\n width: '6px',\n height: '6px',\n },\n '&::-webkit-scrollbar-track': {\n background: 'transparent',\n },\n '&::-webkit-scrollbar-thumb': {\n background: '#888',\n borderRadius: '3px',\n },\n '&::-webkit-scrollbar-thumb:hover': {\n background: '#555',\n },\n },\n '& .MuiAutocomplete-clearIndicator': {\n visibility: active ? 'visible' : 'hidden',\n pointerEvents: 'auto',\n },\n '& .MuiAutocomplete-popupIndicator': {\n visibility: active ? 'visible' : 'hidden',\n pointerEvents: 'auto',\n },\n }),\n [active, focus],\n )\n\n const handleChange = useCallback(\n (\n _e: React.SyntheticEvent,\n newVal: (EnumOption | string)[],\n _reason: AutocompleteChangeReason,\n ) => {\n notifyOptionCommitted()\n const values = newVal.map(item => {\n return typeof item === 'string'\n ? parseFreeTextGivenJsonSchemaType(item, colType)\n : item.value\n })\n // Use clearValue when all items are removed\n setRowDataRef.current(values.length === 0 ? clearValue : values)\n setLocalInputState('')\n if (!activeRef.current) {\n // The cell was deactivated while the option click was in progress (portal\n // click was seen as an outside click by the grid). Now that the value is\n // committed, close the menu.\n setMenuIsOpen(false)\n }\n },\n [activeRef, clearValue, colType, notifyOptionCommitted, setMenuIsOpen],\n )\n\n const handleBlur = useCallback(() => {\n if (localInputState.trim()) {\n const parsedValue = parseFreeTextGivenJsonSchemaType(\n localInputState,\n colType,\n )\n setRowDataRef.current([...safeRowData, parsedValue])\n setLocalInputState('')\n }\n }, [localInputState, colType, safeRowData])\n\n return (\n <Tooltip\n title={tooltipContent}\n placement=\"top-start\"\n arrow\n enterDelay={500}\n disableHoverListener={active || safeRowData.length <= limitTags}\n >\n <div\n style={{\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n <Autocomplete\n forcePopupIcon={choices.length > 0}\n disableClearable={!hasValue}\n multiple\n freeSolo\n open={menuIsOpen}\n onOpen={handleMenuOpen}\n disablePortal={false}\n limitTags={effectiveLimitTags}\n options={optionsWithLabels}\n getOptionLabel={option => {\n // Handle both string (for freeSolo) and object options\n return typeof option === 'string' ? option : option.label\n }}\n isOptionEqualToValue={(option, value) => {\n // Compare the actual values, not labels\n const optionValue =\n typeof option === 'string' ? option : option.value\n const valueValue = typeof value === 'string' ? value : value.value\n return isEqual(optionValue, valueValue)\n }}\n value={selectedOptions}\n inputValue={localInputState}\n onInputChange={(_, newInputValue) => {\n setLocalInputState(newInputValue)\n }}\n onClose={handleClose}\n onChange={handleChange}\n disableCloseOnSelect={choices.length > 1}\n slotProps={{\n listbox: { onMouseDown: handleListboxMouseDown },\n }}\n onBlur={handleBlur}\n renderValue={(tagValue, getTagProps) =>\n tagValue.map((option, index) => {\n const { key, ...tagProps } = getTagProps({ index })\n const optionValue =\n typeof option === 'string' ? option : option.value\n return (\n <GridAutocompleteChip\n key={key}\n option={optionValue}\n active={active}\n {...tagProps}\n />\n )\n })\n }\n renderInput={params => (\n <TextField\n {...params}\n inputRef={inputRef}\n slotProps={{\n input: {\n ...params.InputProps,\n disableUnderline: true,\n sx: TEXT_FIELD_SX,\n },\n }}\n />\n )}\n sx={autocompleteSx}\n />\n </div>\n </Tooltip>\n )\n}\n\n// Memoize the cell component to prevent unnecessary re-renders.\n// react-datasheet-grid provides new setRowData/stopEditing function instances\n// on each render, so we must ignore those callback identities here and only\n// compare the props that affect rendering.\nexport function areAutocompleteMultipleEnumCellPropsEqual(\n prevProps: AutocompleteMultipleEnumCellProps,\n nextProps: AutocompleteMultipleEnumCellProps,\n) {\n return (\n areAutocompleteCellPropsEqual(prevProps, nextProps) &&\n prevProps.limitTags === nextProps.limitTags\n )\n}\n\nconst MemoizedAutocompleteMultipleEnumCell = memo(\n AutocompleteMultipleEnumCell,\n areAutocompleteMultipleEnumCellPropsEqual,\n)\n\nexport type AutocompleteMultipleEnumColumnProps = {\n choices: AutocompleteMultipleEnumOption[]\n colType?: JSONSchema7Type\n limitTags?: number\n dynamicHeight?: boolean\n clearValue?: undefined | null\n}\n\nexport function autocompleteMultipleEnumColumn({\n choices,\n colType,\n limitTags = 2,\n dynamicHeight = false,\n clearValue = undefined,\n}: AutocompleteMultipleEnumColumnProps): Partial<Column> {\n return {\n component: ((\n props: Omit<AutocompleteMultipleEnumCellProps, 'choices' | 'limitTags'>,\n ) => (\n <MemoizedAutocompleteMultipleEnumCell\n {...props}\n choices={choices}\n colType={colType}\n limitTags={limitTags}\n clearValue={clearValue}\n />\n )) as CellComponent,\n copyValue: ({ rowData }) => {\n // Convert array to comma-separated string\n const safeRowData = createSafeRowData(rowData)\n return safeRowData.map(item => castCellValueToString(item)).join(',')\n },\n pasteValue: ({ value }) => {\n if (typeof value !== 'string') {\n return value\n }\n\n // Split by comma or tab and clean up values\n const delimiters = /[,\\t]/\n const parsedValues = value\n .split(delimiters)\n .map(item => item.trim())\n .filter(item => item.length > 0)\n .map(item => parseFreeTextGivenJsonSchemaType(item, colType))\n .filter(item => item !== null && item !== undefined)\n\n // When no values remain, use clearValue (null for required, undefined for\n // optional) so paste and the X-clear button converge on the same\n // in-model representation instead of [].\n // Note: columnFactory also wraps this pasteValue with\n // wrapPasteValueWithSchemaCoercion, which is a no-op here because\n // coerceModelCellValue does not coerce empty arrays — this layer is the\n // one responsible for the [] → clearValue conversion.\n return parsedValues.length > 0 ? parsedValues : clearValue\n },\n disableKeys: true,\n keepFocus: true,\n ...(dynamicHeight && {\n cellClassName: ({ rowData }) => {\n const safeRowData = createSafeRowData(rowData)\n return safeRowData.length > 3\n ? 'multi-value-cell-large'\n : 'multi-value-cell'\n },\n }),\n }\n}\n"],"mappings":"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"}
@@ -20,7 +20,7 @@ export type ModelChange = {
20
20
  replicaId: string;
21
21
  selection: ReplicaSelectionModel;
22
22
  };
23
- export declare function getDefaultValueForProperty(row: DataGridRow, property: string, schemaPropertyInfo: SchemaPropertiesMap): string | number | boolean | import("@sage-bionetworks/synapse-types").ValidationResults | Map<string, string[]> | Record<string, import("@/components/DataGrid/DataGridTypes").CellChangeInfo> | null | undefined;
23
+ export declare function getDefaultValueForProperty(row: DataGridRow, property: string, schemaPropertyInfo: SchemaPropertiesMap): unknown;
24
24
  /**
25
25
  * Applies a single change operation (create, delete, or update) to the GridModel.
26
26
  *
@@ -1 +1 @@
1
- {"version":3,"file":"applyModelChange.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/applyModelChange.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,SAAS,EACT,qBAAqB,EACtB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAA;AAI9E;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,GAC9D;IACE,IAAI,EAAE,eAAe,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,qBAAqB,CAAA;CACjC,CAAA;AAEL,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,mBAAmB,qNAexC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,WAAW,EACnB,kBAAkB,EAAE,mBAAmB,QAyDxC"}
1
+ {"version":3,"file":"applyModelChange.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/applyModelChange.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,SAAS,EACT,qBAAqB,EACtB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAA;AAM9E;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,GAC9D;IACE,IAAI,EAAE,eAAe,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,qBAAqB,CAAA;CACjC,CAAA;AAEL,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,mBAAmB,WAQxC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,WAAW,EACnB,kBAAkB,EAAE,mBAAmB,QAiExC"}