synapse-react-client 4.0.5 → 4.0.7
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.
- package/dist/SWC.index.d.ts +2 -0
- package/dist/SWC.index.d.ts.map +1 -1
- package/dist/SWC.index.js +47 -41
- package/dist/SWC.index.js.map +1 -1
- package/dist/assets/DefaultColorfulPortalCardBackground.svg +50 -12
- package/dist/assets/DefaultColorfulPortalCardBackground.svg.js +4 -4
- package/dist/assets/DefaultColorfulPortalCardBackground.svg.js.map +1 -1
- package/dist/components/CardDeck/TableQueryCardDeck.js +3 -4
- package/dist/components/CardDeck/TableQueryCardDeck.js.map +1 -1
- package/dist/components/ChangePassword/useChangePasswordFormState.js +2 -3
- package/dist/components/ChangePassword/useChangePasswordFormState.js.map +1 -1
- package/dist/components/ColoredBulletListItem/ColoredBulletListItem.css +1 -0
- package/dist/components/ColoredBulletListItem/ColoredBulletListItem.d.ts +8 -0
- package/dist/components/ColoredBulletListItem/ColoredBulletListItem.d.ts.map +1 -0
- package/dist/components/ColoredBulletListItem/ColoredBulletListItem.js +21 -0
- package/dist/components/ColoredBulletListItem/ColoredBulletListItem.js.map +1 -0
- package/dist/components/ColoredBulletListItem/ColoredBulletListItem.module.scss +32 -0
- package/dist/components/ColoredBulletListItem/ColoredBulletListItem.module.scss.js +14 -0
- package/dist/components/ColoredBulletListItem/ColoredBulletListItem.module.scss.js.map +1 -0
- package/dist/components/ColoredBulletListItem/index.d.ts +5 -0
- package/dist/components/ColoredBulletListItem/index.d.ts.map +1 -0
- package/dist/components/ColoredBulletListItem/index.js +6 -0
- package/dist/components/ColoredBulletListItem/index.js.map +1 -0
- package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js +3 -4
- package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js.map +1 -1
- package/dist/components/CreateProjectModal/CreateProjectModal.d.ts +2 -1
- package/dist/components/CreateProjectModal/CreateProjectModal.d.ts.map +1 -1
- package/dist/components/CreateProjectModal/CreateProjectModal.js +122 -43
- package/dist/components/CreateProjectModal/CreateProjectModal.js.map +1 -1
- package/dist/components/CreateProjectModal/ProjectVisibilityRadioGroup.d.ts +7 -0
- package/dist/components/CreateProjectModal/ProjectVisibilityRadioGroup.d.ts.map +1 -0
- package/dist/components/CreateProjectModal/ProjectVisibilityRadioGroup.js +132 -0
- package/dist/components/CreateProjectModal/ProjectVisibilityRadioGroup.js.map +1 -0
- package/dist/components/DataGrid/DataGrid.d.ts +2 -0
- package/dist/components/DataGrid/DataGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/DataGrid.js +69 -67
- package/dist/components/DataGrid/DataGrid.js.map +1 -1
- package/dist/components/DataGrid/DataGridWebSocket.d.ts +4 -0
- package/dist/components/DataGrid/DataGridWebSocket.d.ts.map +1 -1
- package/dist/components/DataGrid/DataGridWebSocket.js +47 -37
- package/dist/components/DataGrid/DataGridWebSocket.js.map +1 -1
- package/dist/components/DataGrid/MergeGridWithSourceTableButton.js +2 -3
- package/dist/components/DataGrid/MergeGridWithSourceTableButton.js.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.js +209 -162
- package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
- package/dist/components/DataGrid/components/UploadCsvToGridDialog.js +2 -3
- package/dist/components/DataGrid/components/UploadCsvToGridDialog.js.map +1 -1
- package/dist/components/DataGrid/hooks/useRemoteSelections.d.ts +16 -0
- package/dist/components/DataGrid/hooks/useRemoteSelections.d.ts.map +1 -0
- package/dist/components/DataGrid/hooks/useRemoteSelections.js +30 -0
- package/dist/components/DataGrid/hooks/useRemoteSelections.js.map +1 -0
- package/dist/components/DataGrid/useDataGridWebsocket.d.ts +6 -1
- package/dist/components/DataGrid/useDataGridWebsocket.d.ts.map +1 -1
- package/dist/components/DataGrid/useDataGridWebsocket.js +78 -69
- package/dist/components/DataGrid/useDataGridWebsocket.js.map +1 -1
- package/dist/components/DataGrid/utils/getCellClassName.d.ts +3 -0
- package/dist/components/DataGrid/utils/getCellClassName.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/getCellClassName.js +21 -12
- package/dist/components/DataGrid/utils/getCellClassName.js.map +1 -1
- package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.d.ts +15 -0
- package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.d.ts.map +1 -0
- package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.js +43 -0
- package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.js.map +1 -0
- package/dist/components/DialogBase.d.ts +3 -1
- package/dist/components/DialogBase.d.ts.map +1 -1
- package/dist/components/DialogBase.js +75 -56
- package/dist/components/DialogBase.js.map +1 -1
- package/dist/components/Ecosystem/EcosystemSkeleton.js +2 -3
- package/dist/components/Ecosystem/EcosystemSkeleton.js.map +1 -1
- package/dist/components/FeaturedDataTabs/FacetPlotsCard.js +2 -3
- package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
- package/dist/components/FeaturedDataTabs/FeaturedDataTabs.js +2 -3
- package/dist/components/FeaturedDataTabs/FeaturedDataTabs.js.map +1 -1
- package/dist/components/GenericCard/GenericCard.js +3 -4
- package/dist/components/GenericCard/GenericCard.js.map +1 -1
- package/dist/components/HeaderCard.js +2 -3
- package/dist/components/HeaderCard.js.map +1 -1
- package/dist/components/IconSvg/IconSvg.d.ts +1 -1
- package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
- package/dist/components/IconSvg/IconSvg.js +168 -165
- package/dist/components/IconSvg/IconSvg.js.map +1 -1
- package/dist/components/StorybookComponentWrapper.js +3 -4
- package/dist/components/StorybookComponentWrapper.js.map +1 -1
- package/dist/components/SynapseForm/SynapseFormSubmissionGrid.d.ts +1 -0
- package/dist/components/SynapseForm/SynapseFormSubmissionGrid.d.ts.map +1 -1
- package/dist/components/SynapseForm/SynapseFormSubmissionGrid.js +23 -16
- package/dist/components/SynapseForm/SynapseFormSubmissionGrid.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTable.d.ts +6 -1
- package/dist/components/SynapseTable/SynapseTable.d.ts.map +1 -1
- package/dist/components/SynapseTable/SynapseTable.js +123 -93
- package/dist/components/SynapseTable/SynapseTable.js.map +1 -1
- package/dist/components/TextField/TextField.css +1 -0
- package/dist/components/TextField/TextField.d.ts +2 -1
- package/dist/components/TextField/TextField.d.ts.map +1 -1
- package/dist/components/TextField/TextField.js +42 -28
- package/dist/components/TextField/TextField.js.map +1 -1
- package/dist/components/TextField/TextField.module.scss +25 -0
- package/dist/components/TextField/TextField.module.scss.js +14 -0
- package/dist/components/TextField/TextField.module.scss.js.map +1 -0
- package/dist/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js +2 -3
- package/dist/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +242 -240
- package/dist/components/index.js.map +1 -1
- package/dist/components/styled/HoverPopover.css +1 -1
- package/dist/components/styled/HoverPopover.d.ts.map +1 -1
- package/dist/components/styled/HoverPopover.js +6 -5
- package/dist/components/styled/HoverPopover.js.map +1 -1
- package/dist/components/styled/HoverPopover.module.scss +2 -1
- package/dist/components/styled/HoverPopover.module.scss.js +1 -1
- package/dist/components/styled/StyledFormControl.js +1 -1
- package/dist/components/styled/StyledFormControl.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreview.js +2 -3
- package/dist/components/table/CsvPreview/CsvPreview.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreviewDialog.js +2 -3
- package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
- package/dist/features/curator/GridPage/GridPage.js +2 -3
- package/dist/features/curator/GridPage/GridPage.js.map +1 -1
- package/dist/features/curator/GridPage/components/GridPageTitle.js +2 -3
- package/dist/features/curator/GridPage/components/GridPageTitle.js.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts +5 -2
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js +46 -33
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksPage.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksPage.js +52 -27
- package/dist/features/entity/metadata-task/components/MetadataTasksPage.js.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.d.ts +7 -0
- package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.d.ts.map +1 -0
- package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js +322 -0
- package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -0
- package/dist/features/entity/metadata-task/hooks/useGetOrCreateGridSessionForSource.d.ts +7 -1
- package/dist/features/entity/metadata-task/hooks/useGetOrCreateGridSessionForSource.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useGetOrCreateGridSessionForSource.js +7 -7
- package/dist/features/entity/metadata-task/hooks/useGetOrCreateGridSessionForSource.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.d.ts +9 -5
- package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.js +79 -16
- package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask_legacy.d.ts +12 -0
- package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask_legacy.d.ts.map +1 -0
- package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask_legacy.js +20 -0
- package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask_legacy.js.map +1 -0
- package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.d.ts +3 -3
- package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js +54 -41
- package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js.map +1 -1
- package/dist/features/entity/metadata-task/utils/getCreateGridRequestForMetadataTask.d.ts +2 -2
- package/dist/features/entity/metadata-task/utils/getCreateGridRequestForMetadataTask.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/utils/getCreateGridRequestForMetadataTask.js +11 -4
- package/dist/features/entity/metadata-task/utils/getCreateGridRequestForMetadataTask.js.map +1 -1
- package/dist/features/entity/metadata-task/utils/taskHasAssignee.d.ts +3 -0
- package/dist/features/entity/metadata-task/utils/taskHasAssignee.d.ts.map +1 -0
- package/dist/features/entity/metadata-task/utils/taskHasAssignee.js +7 -0
- package/dist/features/entity/metadata-task/utils/taskHasAssignee.js.map +1 -0
- package/dist/index.js +306 -304
- package/dist/index.js.map +1 -1
- package/dist/mocks/curation/mockCurationTask.d.ts +10 -0
- package/dist/mocks/curation/mockCurationTask.d.ts.map +1 -0
- package/dist/mocks/curation/mockCurationTask.js +24 -0
- package/dist/mocks/curation/mockCurationTask.js.map +1 -0
- package/dist/style/components/_data-grid-extra.css +1 -1
- package/dist/style/components/_data-grid-extra.scss +16 -0
- package/dist/synapse-client/SynapseClient.d.ts +1 -1
- package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
- package/dist/synapse-client/SynapseClient.js +3 -2
- package/dist/synapse-client/SynapseClient.js.map +1 -1
- package/dist/synapse-queries/KeyFactory.d.ts +8 -3
- package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
- package/dist/synapse-queries/KeyFactory.js +22 -7
- package/dist/synapse-queries/KeyFactory.js.map +1 -1
- package/dist/synapse-queries/curation/task/useCurationTask.d.ts +6 -3
- package/dist/synapse-queries/curation/task/useCurationTask.d.ts.map +1 -1
- package/dist/synapse-queries/curation/task/useCurationTask.js +62 -18
- package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.d.ts +2 -0
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.d.ts.map +1 -1
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js.map +1 -1
- package/dist/synapse-queries/grid/useGridSession.d.ts +17 -2
- package/dist/synapse-queries/grid/useGridSession.d.ts.map +1 -1
- package/dist/synapse-queries/grid/useGridSession.js +63 -30
- package/dist/synapse-queries/grid/useGridSession.js.map +1 -1
- package/dist/synapse-queries/index.js +103 -99
- package/dist/synapse-queries/team/index.js +18 -15
- package/dist/synapse-queries/team/useTeamMembers.d.ts +34 -0
- package/dist/synapse-queries/team/useTeamMembers.d.ts.map +1 -1
- package/dist/synapse-queries/team/useTeamMembers.js +110 -69
- package/dist/synapse-queries/team/useTeamMembers.js.map +1 -1
- package/dist/synapse-queries/types.d.ts +13 -0
- package/dist/synapse-queries/types.d.ts.map +1 -0
- package/dist/synapse-queries/types.js +2 -0
- package/dist/synapse-queries/types.js.map +1 -0
- package/dist/synapse-queries/user/index.js +12 -11
- package/dist/synapse-queries/user/useUserGroupHeader.d.ts +5 -0
- package/dist/synapse-queries/user/useUserGroupHeader.d.ts.map +1 -1
- package/dist/synapse-queries/user/useUserGroupHeader.js +28 -21
- package/dist/synapse-queries/user/useUserGroupHeader.js.map +1 -1
- package/dist/theme/palette/Palettes.d.ts +2 -0
- package/dist/theme/palette/Palettes.d.ts.map +1 -1
- package/dist/theme/palette/Palettes.js +46 -40
- package/dist/theme/palette/Palettes.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/hooks/useOverlay.d.ts +2 -2
- package/dist/utils/hooks/useOverlay.d.ts.map +1 -1
- package/dist/utils/hooks/useOverlay.js +41 -41
- package/dist/utils/hooks/useOverlay.js.map +1 -1
- package/package.json +4 -4
- package/dist/assets/ArcusBioIcon.svg +0 -1
- package/dist/assets/ArcusBioIcon.svg.js +0 -7
- package/dist/assets/ArcusBioIcon.svg.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HoverPopover.js","sources":["../../../src/components/styled/HoverPopover.tsx"],"sourcesContent":["import {\n Box,\n Button,\n ButtonProps,\n DialogActions,\n DialogContent,\n DialogTitle,\n Popover,\n PopoverOrigin,\n} from '@mui/material'\nimport { PropsWithChildren, ReactNode, useRef, useState } from 'react'\nimport styles from './HoverPopover.module.scss'\n\nexport type HoverPopoverPlacement = 'top' | 'bottom' | 'left' | 'right'\n\nfunction getOrigins(placement: HoverPopoverPlacement): {\n anchorOrigin: PopoverOrigin\n transformOrigin: PopoverOrigin\n} {\n switch (placement) {\n case 'top':\n return {\n anchorOrigin: { vertical: 'top', horizontal: 'center' },\n transformOrigin: { vertical: 'bottom', horizontal: 'center' },\n }\n case 'bottom':\n return {\n anchorOrigin: { vertical: 'bottom', horizontal: 'center' },\n transformOrigin: { vertical: 'top', horizontal: 'center' },\n }\n case 'left':\n return {\n anchorOrigin: { vertical: 'center', horizontal: 'left' },\n transformOrigin: { vertical: 'center', horizontal: 'right' },\n }\n case 'right':\n return {\n anchorOrigin: { vertical: 'center', horizontal: 'right' },\n transformOrigin: { vertical: 'center', horizontal: 'left' },\n }\n }\n}\n\n/** Delay in ms before the popover closes after the mouse leaves the trigger or popover */\nconst CLOSE_DELAY_MS = 150\n\nexport type HoverPopoverProps = PropsWithChildren<{\n popoverContent: ReactNode\n /** Optional title rendered as a sticky header above the scrollable content */\n title?: string\n placement?: HoverPopoverPlacement\n\n maxWidth?: string | number\n minWidth?: string | number\n /** Max height of the scrollable content area. Default 400px. */\n maxHeight?: string | number\n actionButton?: {\n content: ReactNode\n color?: ButtonProps['color']\n variant?: ButtonProps['variant']\n onClick: () => void\n /** If true, closes the popover after the button is clicked */\n closeOnClick?: boolean\n }\n}>\n\n/**\n * A popover that opens when the user hovers over the trigger child and remains\n * open as long as the mouse is over either the trigger or the popover itself.\n * The content area is scrollable, avoiding any interaction with browser scroll.\n */\nexport function HoverPopover({\n children,\n popoverContent,\n title,\n placement = 'right',\n maxWidth = 500,\n minWidth = 300,\n maxHeight = 400,\n actionButton,\n}: HoverPopoverProps) {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\n const closeTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const cancelClose = () => {\n if (closeTimeoutRef.current !== null) {\n clearTimeout(closeTimeoutRef.current)\n closeTimeoutRef.current = null\n }\n }\n\n const scheduleClose = () => {\n cancelClose()\n closeTimeoutRef.current = setTimeout(() => {\n setAnchorEl(null)\n }, CLOSE_DELAY_MS)\n }\n\n const { anchorOrigin, transformOrigin } = getOrigins(placement)\n\n return (\n <>\n <Box\n component=\"span\"\n onMouseEnter={e => {\n cancelClose()\n setAnchorEl(e.currentTarget)\n }}\n onMouseLeave={scheduleClose}\n className={styles.triggerWrapper}\n >\n {children}\n </Box>\n <Popover\n open={anchorEl !== null}\n anchorEl={anchorEl}\n anchorOrigin={anchorOrigin}\n transformOrigin={transformOrigin}\n onClose={() => setAnchorEl(null)}\n disableAutoFocus\n disableEnforceFocus\n disableScrollLock\n slotProps={{\n backdrop: { sx: { pointerEvents: 'none' } },\n paper: {\n onMouseEnter: cancelClose,\n onMouseLeave: scheduleClose,\n className: styles.paper,\n sx: { maxWidth, minWidth },\n },\n }}\n >\n {title && (\n <DialogTitle sx={{ fontSize: '18px', padding: '16px 10px' }}>\n {title}\n </DialogTitle>\n )}\n <DialogContent sx={{ maxHeight, padding: '10px' }}>\n {popoverContent}\n </DialogContent>\n {actionButton && (\n <DialogActions sx={{ paddingX: '10px' }}>\n <Button\n color={actionButton.color ?? 'primary'}\n variant={actionButton.variant ?? 'contained'}\n fullWidth\n onClick={() => {\n actionButton.onClick()\n if (actionButton.closeOnClick) {\n setAnchorEl(null)\n }\n }}\n >\n {actionButton.content}\n </Button>\n </DialogActions>\n )}\n </Popover>\n </>\n )\n}\n"],"names":["getOrigins","placement","CLOSE_DELAY_MS","HoverPopover","children","popoverContent","title","maxWidth","minWidth","maxHeight","actionButton","anchorEl","setAnchorEl","useState","closeTimeoutRef","useRef","cancelClose","scheduleClose","anchorOrigin","transformOrigin","jsxs","Fragment","jsx","Box","e","styles","Popover","DialogTitle","DialogContent","DialogActions","Button"],"mappings":";;;;AAeA,SAASA,EAAWC,GAGlB;AACA,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,QACL,cAAc,EAAE,UAAU,OAAO,YAAY,SAAA;AAAA,QAC7C,iBAAiB,EAAE,UAAU,UAAU,YAAY,SAAA;AAAA,MAAS;AAAA,IAEhE,KAAK;AACH,aAAO;AAAA,QACL,cAAc,EAAE,UAAU,UAAU,YAAY,SAAA;AAAA,QAChD,iBAAiB,EAAE,UAAU,OAAO,YAAY,SAAA;AAAA,MAAS;AAAA,IAE7D,KAAK;AACH,aAAO;AAAA,QACL,cAAc,EAAE,UAAU,UAAU,YAAY,OAAA;AAAA,QAChD,iBAAiB,EAAE,UAAU,UAAU,YAAY,QAAA;AAAA,MAAQ;AAAA,IAE/D,KAAK;AACH,aAAO;AAAA,QACL,cAAc,EAAE,UAAU,UAAU,YAAY,QAAA;AAAA,QAChD,iBAAiB,EAAE,UAAU,UAAU,YAAY,OAAA;AAAA,MAAO;AAAA,EAC5D;AAEN;AAGA,MAAMC,IAAiB;AA2BhB,SAASC,EAAa;AAAA,EAC3B,UAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAL,IAAY;AAAA,EACZ,UAAAM,IAAW;AAAA,EACX,UAAAC,IAAW;AAAA,EACX,WAAAC,IAAY;AAAA,EACZ,cAAAC;AACF,GAAsB;AACpB,QAAM,CAACC,GAAUC,CAAW,IAAIC,EAA6B,IAAI,GAC3DC,IAAkBC,EAA6C,IAAI,GAEnEC,IAAc,MAAM;AACxB,IAAIF,EAAgB,YAAY,SAC9B,aAAaA,EAAgB,OAAO,GACpCA,EAAgB,UAAU;AAAA,EAE9B,GAEMG,IAAgB,MAAM;AAC1B,IAAAD,EAAA,GACAF,EAAgB,UAAU,WAAW,MAAM;AACzC,MAAAF,EAAY,IAAI;AAAA,IAClB,GAAGV,CAAc;AAAA,EACnB,GAEM,EAAE,cAAAgB,GAAc,iBAAAC,MAAoBnB,EAAWC,CAAS;AAE9D,SACE,gBAAAmB,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,cAAc,CAAAC,MAAK;AACjB,UAAAR,EAAA,GACAJ,EAAYY,EAAE,aAAa;AAAA,QAC7B;AAAA,QACA,cAAcP;AAAA,QACd,WAAWQ,EAAO;AAAA,QAEjB,UAAArB;AAAA,MAAA;AAAA,IAAA;AAAA,IAEH,gBAAAgB;AAAA,MAACM;AAAA,MAAA;AAAA,QACC,MAAMf,MAAa;AAAA,QACnB,UAAAA;AAAA,QACA,cAAAO;AAAA,QACA,iBAAAC;AAAA,QACA,SAAS,MAAMP,EAAY,IAAI;AAAA,QAC/B,kBAAgB;AAAA,QAChB,qBAAmB;AAAA,QACnB,mBAAiB;AAAA,QACjB,WAAW;AAAA,UACT,UAAU,EAAE,IAAI,EAAE,eAAe,SAAO;AAAA,UACxC,OAAO;AAAA,YACL,cAAcI;AAAA,YACd,cAAcC;AAAA,YACd,WAAWQ,EAAO;AAAA,YAClB,IAAI,EAAE,UAAAlB,GAAU,UAAAC,
|
|
1
|
+
{"version":3,"file":"HoverPopover.js","sources":["../../../src/components/styled/HoverPopover.tsx"],"sourcesContent":["import {\n Box,\n Button,\n ButtonProps,\n DialogActions,\n DialogContent,\n DialogTitle,\n Popover,\n PopoverOrigin,\n} from '@mui/material'\nimport { PropsWithChildren, ReactNode, useRef, useState } from 'react'\nimport styles from './HoverPopover.module.scss'\n\nexport type HoverPopoverPlacement = 'top' | 'bottom' | 'left' | 'right'\n\nfunction getOrigins(placement: HoverPopoverPlacement): {\n anchorOrigin: PopoverOrigin\n transformOrigin: PopoverOrigin\n} {\n switch (placement) {\n case 'top':\n return {\n anchorOrigin: { vertical: 'top', horizontal: 'center' },\n transformOrigin: { vertical: 'bottom', horizontal: 'center' },\n }\n case 'bottom':\n return {\n anchorOrigin: { vertical: 'bottom', horizontal: 'center' },\n transformOrigin: { vertical: 'top', horizontal: 'center' },\n }\n case 'left':\n return {\n anchorOrigin: { vertical: 'center', horizontal: 'left' },\n transformOrigin: { vertical: 'center', horizontal: 'right' },\n }\n case 'right':\n return {\n anchorOrigin: { vertical: 'center', horizontal: 'right' },\n transformOrigin: { vertical: 'center', horizontal: 'left' },\n }\n }\n}\n\n/** Delay in ms before the popover closes after the mouse leaves the trigger or popover */\nconst CLOSE_DELAY_MS = 150\n\nexport type HoverPopoverProps = PropsWithChildren<{\n popoverContent: ReactNode\n /** Optional title rendered as a sticky header above the scrollable content */\n title?: string\n placement?: HoverPopoverPlacement\n\n maxWidth?: string | number\n minWidth?: string | number\n /** Max height of the scrollable content area. Default 400px. */\n maxHeight?: string | number\n actionButton?: {\n content: ReactNode\n color?: ButtonProps['color']\n variant?: ButtonProps['variant']\n onClick: () => void\n /** If true, closes the popover after the button is clicked */\n closeOnClick?: boolean\n }\n}>\n\n/**\n * A popover that opens when the user hovers over the trigger child and remains\n * open as long as the mouse is over either the trigger or the popover itself.\n * The content area is scrollable, avoiding any interaction with browser scroll.\n */\nexport function HoverPopover({\n children,\n popoverContent,\n title,\n placement = 'right',\n maxWidth = 500,\n minWidth = 300,\n maxHeight = 400,\n actionButton,\n}: HoverPopoverProps) {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\n const closeTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const cancelClose = () => {\n if (closeTimeoutRef.current !== null) {\n clearTimeout(closeTimeoutRef.current)\n closeTimeoutRef.current = null\n }\n }\n\n const scheduleClose = () => {\n cancelClose()\n closeTimeoutRef.current = setTimeout(() => {\n setAnchorEl(null)\n }, CLOSE_DELAY_MS)\n }\n\n const { anchorOrigin, transformOrigin } = getOrigins(placement)\n\n return (\n <>\n <Box\n component=\"span\"\n onMouseEnter={e => {\n cancelClose()\n setAnchorEl(e.currentTarget)\n }}\n onMouseLeave={scheduleClose}\n className={styles.triggerWrapper}\n >\n {children}\n </Box>\n <Popover\n open={anchorEl !== null}\n anchorEl={anchorEl}\n anchorOrigin={anchorOrigin}\n transformOrigin={transformOrigin}\n onClose={() => setAnchorEl(null)}\n disableAutoFocus\n disableEnforceFocus\n disableScrollLock\n sx={{ pointerEvents: 'none' }}\n slotProps={{\n backdrop: { sx: { pointerEvents: 'none' } },\n paper: {\n onMouseEnter: cancelClose,\n onMouseLeave: scheduleClose,\n className: styles.paper,\n sx: { maxWidth, minWidth, pointerEvents: 'auto' },\n },\n }}\n >\n {title && (\n <DialogTitle sx={{ fontSize: '18px', padding: '16px 10px' }}>\n {title}\n </DialogTitle>\n )}\n <DialogContent sx={{ maxHeight, padding: '10px' }}>\n {popoverContent}\n </DialogContent>\n {actionButton && (\n <DialogActions sx={{ paddingX: '10px' }}>\n <Button\n color={actionButton.color ?? 'primary'}\n variant={actionButton.variant ?? 'contained'}\n fullWidth\n onClick={() => {\n actionButton.onClick()\n if (actionButton.closeOnClick) {\n setAnchorEl(null)\n }\n }}\n >\n {actionButton.content}\n </Button>\n </DialogActions>\n )}\n </Popover>\n </>\n )\n}\n"],"names":["getOrigins","placement","CLOSE_DELAY_MS","HoverPopover","children","popoverContent","title","maxWidth","minWidth","maxHeight","actionButton","anchorEl","setAnchorEl","useState","closeTimeoutRef","useRef","cancelClose","scheduleClose","anchorOrigin","transformOrigin","jsxs","Fragment","jsx","Box","e","styles","Popover","DialogTitle","DialogContent","DialogActions","Button"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StyledFormControl.js","sources":["../../../src/components/styled/StyledFormControl.tsx"],"sourcesContent":["import {\n FormControl,\n FormControlProps,\n formHelperTextClasses,\n inputBaseClasses,\n styled,\n} from '@mui/material'\nimport { StyledComponent } from '@emotion/styled'\n\n/* bootstrap-like label/text inputs\n usage:\n <StyledFormControl fullWidth variant=\"standard\" margin=\"normal\">\n <InputLabel shrink htmlFor=\"someinput\">\n labelText\n </InputLabel>\n <InputBase id=\"someinput\"/>\n </StyledFormControl>\n*/\nexport const StyledFormControl: StyledComponent<FormControlProps> = styled(\n FormControl,\n {\n label: 'StyledFormControl',\n },\n)(({ theme }) => ({\n '& label': {\n fontSize: '14px',\n transform: 'none',\n },\n [`& .${formHelperTextClasses.root}`]: {\n marginLeft: '0',\n [`&.Mui-error`]: {\n color: '#c13415',\n },\n },\n\n [`& .${inputBaseClasses.root}`]: {\n marginTop: theme.spacing(
|
|
1
|
+
{"version":3,"file":"StyledFormControl.js","sources":["../../../src/components/styled/StyledFormControl.tsx"],"sourcesContent":["import {\n FormControl,\n FormControlProps,\n formHelperTextClasses,\n inputBaseClasses,\n styled,\n} from '@mui/material'\nimport { StyledComponent } from '@emotion/styled'\n\n/* bootstrap-like label/text inputs\n usage:\n <StyledFormControl fullWidth variant=\"standard\" margin=\"normal\">\n <InputLabel shrink htmlFor=\"someinput\">\n labelText\n </InputLabel>\n <InputBase id=\"someinput\"/>\n </StyledFormControl>\n*/\nexport const StyledFormControl: StyledComponent<FormControlProps> = styled(\n FormControl,\n {\n label: 'StyledFormControl',\n },\n)(({ theme }) => ({\n '& label': {\n fontSize: '14px',\n transform: 'none',\n },\n [`& .${formHelperTextClasses.root}`]: {\n marginLeft: '0',\n [`&.Mui-error`]: {\n color: '#c13415',\n },\n },\n\n [`& .${inputBaseClasses.root}`]: {\n marginTop: theme.spacing(0.5),\n },\n '& .MuiInputBase-multiline': {\n padding: '0px',\n },\n '& fieldset': {\n border: 'none',\n },\n}))\n\nexport default StyledFormControl\n"],"names":["StyledFormControl","styled","FormControl","theme","formHelperTextClasses","inputBaseClasses"],"mappings":";AAkBO,MAAMA,IAAuDC;AAAA,EAClEC;AAAA,EACA;AAAA,IACE,OAAO;AAAA,EAAA;AAEX,EAAE,CAAC,EAAE,OAAAC,SAAa;AAAA,EAChB,WAAW;AAAA,IACT,UAAU;AAAA,IACV,WAAW;AAAA,EAAA;AAAA,EAEb,CAAC,MAAMC,EAAsB,IAAI,EAAE,GAAG;AAAA,IACpC,YAAY;AAAA,IACX,eAAgB;AAAA,MACf,OAAO;AAAA,IAAA;AAAA,EACT;AAAA,EAGF,CAAC,MAAMC,EAAiB,IAAI,EAAE,GAAG;AAAA,IAC/B,WAAWF,EAAM,QAAQ,GAAG;AAAA,EAAA;AAAA,EAE9B,6BAA6B;AAAA,IAC3B,SAAS;AAAA,EAAA;AAAA,EAEX,cAAc;AAAA,IACZ,QAAQ;AAAA,EAAA;AAEZ,EAAE;"}
|
|
@@ -49,7 +49,6 @@ import "../../../assets/icons/account-validated.svg.js";
|
|
|
49
49
|
import "../../../utils/functions/DateFormatter.js";
|
|
50
50
|
import "@react-hookz/web";
|
|
51
51
|
import "dayjs";
|
|
52
|
-
import "../../../assets/ArcusBioIcon.svg.js";
|
|
53
52
|
import "@mui/material/SvgIcon";
|
|
54
53
|
import "../../../assets/icons/AccessPending.svg.js";
|
|
55
54
|
import "../../../assets/icons/AccessPendingCloud.svg.js";
|
|
@@ -218,7 +217,7 @@ import b from "../../TanStackTable/ColumnHeader.js";
|
|
|
218
217
|
import T from "../../TanStackTable/StyledTanStackTable.js";
|
|
219
218
|
import { useGetCsvPreview as h } from "../../../synapse-queries/table/useGetCsvPreview.js";
|
|
220
219
|
import { useReactTable as y, getCoreRowModel as P, createColumnHelper as R } from "@tanstack/react-table";
|
|
221
|
-
function
|
|
220
|
+
function Ii(e) {
|
|
222
221
|
const {
|
|
223
222
|
fileHandleId: a,
|
|
224
223
|
csvTableDescriptor: i,
|
|
@@ -277,6 +276,6 @@ function S(e) {
|
|
|
277
276
|
}));
|
|
278
277
|
}
|
|
279
278
|
export {
|
|
280
|
-
|
|
279
|
+
Ii as default
|
|
281
280
|
};
|
|
282
281
|
//# sourceMappingURL=CsvPreview.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CsvPreview.js","sources":["../../../../src/components/table/CsvPreview/CsvPreview.tsx"],"sourcesContent":["import { ErrorBanner } from '@/components/index'\nimport ColumnHeader from '@/components/TanStackTable/ColumnHeader'\nimport StyledTanStackTable from '@/components/TanStackTable/StyledTanStackTable'\nimport { useGetCsvPreview } from '@/synapse-queries/table/useGetCsvPreview'\nimport Typography from '@mui/material/Typography'\nimport {\n ColumnModel,\n CsvTableDescriptor,\n TableRow,\n UploadToTablePreviewResult,\n} from '@sage-bionetworks/synapse-client'\nimport {\n createColumnHelper,\n getCoreRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport noop from 'lodash-es/noop'\nimport { useEffect, useMemo } from 'react'\n\nexport type CsvPreviewProps = {\n fileHandleId: string\n csvTableDescriptor: CsvTableDescriptor\n onCsvPreviewDataChange?: (data: UploadToTablePreviewResult) => void\n onIsLoadingChange?: (isLoading: boolean) => void\n}\n\n/**\n * Given a file handle ID and CSV Table Descriptor, fetches and displays a preview of the CSV file as it would be parsed into a table.\n */\nexport default function CsvPreview(props: CsvPreviewProps) {\n const {\n fileHandleId,\n csvTableDescriptor,\n onCsvPreviewDataChange = noop,\n onIsLoadingChange = noop,\n } = props\n\n const {\n data: csvPreviewData,\n isLoading,\n error,\n } = useGetCsvPreview({\n concreteType:\n 'org.sagebionetworks.repo.model.table.UploadToTablePreviewRequest',\n uploadFileHandleId: fileHandleId,\n csvTableDescriptor,\n })\n\n useEffect(() => {\n if (csvPreviewData) {\n onCsvPreviewDataChange(csvPreviewData)\n }\n }, [csvPreviewData, onCsvPreviewDataChange])\n\n useEffect(() => {\n onIsLoadingChange(isLoading)\n }, [isLoading, onIsLoadingChange])\n\n const tableData = useMemo(\n () => csvPreviewData?.sampleRows ?? [],\n [csvPreviewData?.sampleRows],\n )\n\n const columns = useMemo(\n () => getPreviewColumns(csvPreviewData?.suggestedColumns ?? []),\n [csvPreviewData?.suggestedColumns],\n )\n\n const table = useReactTable({\n getCoreRowModel: getCoreRowModel(),\n data: tableData,\n columns: columns,\n })\n\n if (error) {\n return <ErrorBanner error={error} />\n }\n\n return (\n <>\n {isLoading && <div>Loading preview...</div>}\n {!isLoading && csvPreviewData && table && (\n <>\n <Typography variant={'body1'}>\n Scanned {csvPreviewData?.rowsScanned?.toLocaleString()} rows to\n generate preview:\n </Typography>\n <StyledTanStackTable table={table} />\n </>\n )}\n </>\n )\n}\n\nfunction getPreviewColumns(columnModels: ColumnModel[]) {\n const columnHelper = createColumnHelper<TableRow>()\n return columnModels.map((columnModel, index) => {\n return columnHelper.accessor(tr => tr.values![index], {\n id: `column-${index}`,\n header: props => (\n <ColumnHeader\n {...props}\n title={`${columnModel.name} (${columnModel.columnType})`}\n />\n ),\n enableColumnFilter: false,\n enableSorting: false,\n })\n })\n}\n"],"names":["CsvPreview","props","fileHandleId","csvTableDescriptor","onCsvPreviewDataChange","noop","onIsLoadingChange","csvPreviewData","isLoading","error","useGetCsvPreview","useEffect","tableData","useMemo","columns","getPreviewColumns","table","useReactTable","getCoreRowModel","jsx","ErrorBanner","jsxs","Fragment","Typography","StyledTanStackTable","columnModels","columnHelper","createColumnHelper","columnModel","index","tr","ColumnHeader"],"mappings":"
|
|
1
|
+
{"version":3,"file":"CsvPreview.js","sources":["../../../../src/components/table/CsvPreview/CsvPreview.tsx"],"sourcesContent":["import { ErrorBanner } from '@/components/index'\nimport ColumnHeader from '@/components/TanStackTable/ColumnHeader'\nimport StyledTanStackTable from '@/components/TanStackTable/StyledTanStackTable'\nimport { useGetCsvPreview } from '@/synapse-queries/table/useGetCsvPreview'\nimport Typography from '@mui/material/Typography'\nimport {\n ColumnModel,\n CsvTableDescriptor,\n TableRow,\n UploadToTablePreviewResult,\n} from '@sage-bionetworks/synapse-client'\nimport {\n createColumnHelper,\n getCoreRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport noop from 'lodash-es/noop'\nimport { useEffect, useMemo } from 'react'\n\nexport type CsvPreviewProps = {\n fileHandleId: string\n csvTableDescriptor: CsvTableDescriptor\n onCsvPreviewDataChange?: (data: UploadToTablePreviewResult) => void\n onIsLoadingChange?: (isLoading: boolean) => void\n}\n\n/**\n * Given a file handle ID and CSV Table Descriptor, fetches and displays a preview of the CSV file as it would be parsed into a table.\n */\nexport default function CsvPreview(props: CsvPreviewProps) {\n const {\n fileHandleId,\n csvTableDescriptor,\n onCsvPreviewDataChange = noop,\n onIsLoadingChange = noop,\n } = props\n\n const {\n data: csvPreviewData,\n isLoading,\n error,\n } = useGetCsvPreview({\n concreteType:\n 'org.sagebionetworks.repo.model.table.UploadToTablePreviewRequest',\n uploadFileHandleId: fileHandleId,\n csvTableDescriptor,\n })\n\n useEffect(() => {\n if (csvPreviewData) {\n onCsvPreviewDataChange(csvPreviewData)\n }\n }, [csvPreviewData, onCsvPreviewDataChange])\n\n useEffect(() => {\n onIsLoadingChange(isLoading)\n }, [isLoading, onIsLoadingChange])\n\n const tableData = useMemo(\n () => csvPreviewData?.sampleRows ?? [],\n [csvPreviewData?.sampleRows],\n )\n\n const columns = useMemo(\n () => getPreviewColumns(csvPreviewData?.suggestedColumns ?? []),\n [csvPreviewData?.suggestedColumns],\n )\n\n const table = useReactTable({\n getCoreRowModel: getCoreRowModel(),\n data: tableData,\n columns: columns,\n })\n\n if (error) {\n return <ErrorBanner error={error} />\n }\n\n return (\n <>\n {isLoading && <div>Loading preview...</div>}\n {!isLoading && csvPreviewData && table && (\n <>\n <Typography variant={'body1'}>\n Scanned {csvPreviewData?.rowsScanned?.toLocaleString()} rows to\n generate preview:\n </Typography>\n <StyledTanStackTable table={table} />\n </>\n )}\n </>\n )\n}\n\nfunction getPreviewColumns(columnModels: ColumnModel[]) {\n const columnHelper = createColumnHelper<TableRow>()\n return columnModels.map((columnModel, index) => {\n return columnHelper.accessor(tr => tr.values![index], {\n id: `column-${index}`,\n header: props => (\n <ColumnHeader\n {...props}\n title={`${columnModel.name} (${columnModel.columnType})`}\n />\n ),\n enableColumnFilter: false,\n enableSorting: false,\n })\n })\n}\n"],"names":["CsvPreview","props","fileHandleId","csvTableDescriptor","onCsvPreviewDataChange","noop","onIsLoadingChange","csvPreviewData","isLoading","error","useGetCsvPreview","useEffect","tableData","useMemo","columns","getPreviewColumns","table","useReactTable","getCoreRowModel","jsx","ErrorBanner","jsxs","Fragment","Typography","StyledTanStackTable","columnModels","columnHelper","createColumnHelper","columnModel","index","tr","ColumnHeader"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,SAAwBA,GAAWC,GAAwB;AACzD,QAAM;AAAA,IACJ,cAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,wBAAAC,IAAyBC;AAAA,IACzB,mBAAAC,IAAoBD;AAAA,EAAA,IAClBJ,GAEE;AAAA,IACJ,MAAMM;AAAA,IACN,WAAAC;AAAA,IACA,OAAAC;AAAA,EAAA,IACEC,EAAiB;AAAA,IACnB,cACE;AAAA,IACF,oBAAoBR;AAAA,IACpB,oBAAAC;AAAA,EAAA,CACD;AAED,EAAAQ,EAAU,MAAM;AACd,IAAIJ,KACFH,EAAuBG,CAAc;AAAA,EAEzC,GAAG,CAACA,GAAgBH,CAAsB,CAAC,GAE3CO,EAAU,MAAM;AACd,IAAAL,EAAkBE,CAAS;AAAA,EAC7B,GAAG,CAACA,GAAWF,CAAiB,CAAC;AAEjC,QAAMM,IAAYC;AAAA,IAChB,MAAMN,GAAgB,cAAc,CAAA;AAAA,IACpC,CAACA,GAAgB,UAAU;AAAA,EAAA,GAGvBO,IAAUD;AAAA,IACd,MAAME,EAAkBR,GAAgB,oBAAoB,EAAE;AAAA,IAC9D,CAACA,GAAgB,gBAAgB;AAAA,EAAA,GAG7BS,IAAQC,EAAc;AAAA,IAC1B,iBAAiBC,EAAA;AAAA,IACjB,MAAMN;AAAA,IACN,SAAAE;AAAA,EAAA,CACD;AAED,SAAIL,IACK,gBAAAU,EAACC,KAAY,OAAAX,GAAc,IAIlC,gBAAAY,EAAAC,GAAA,EACG,UAAA;AAAA,IAAAd,KAAa,gBAAAW,EAAC,SAAI,UAAA,qBAAA,CAAkB;AAAA,IACpC,CAACX,KAAaD,KAAkBS,KAC/B,gBAAAK,EAAAC,GAAA,EACE,UAAA;AAAA,MAAA,gBAAAD,EAACE,GAAA,EAAW,SAAS,SAAS,UAAA;AAAA,QAAA;AAAA,QACnBhB,GAAgB,aAAa,eAAA;AAAA,QAAiB;AAAA,MAAA,GAEzD;AAAA,MACA,gBAAAY,EAACK,KAAoB,OAAAR,EAAA,CAAc;AAAA,IAAA,EAAA,CACrC;AAAA,EAAA,GAEJ;AAEJ;AAEA,SAASD,EAAkBU,GAA6B;AACtD,QAAMC,IAAeC,EAAA;AACrB,SAAOF,EAAa,IAAI,CAACG,GAAaC,MAC7BH,EAAa,SAAS,CAAAI,MAAMA,EAAG,OAAQD,CAAK,GAAG;AAAA,IACpD,IAAI,UAAUA,CAAK;AAAA,IACnB,QAAQ,CAAA5B,MACN,gBAAAkB;AAAA,MAACY;AAAA,MAAA;AAAA,QACE,GAAG9B;AAAA,QACJ,OAAO,GAAG2B,EAAY,IAAI,KAAKA,EAAY,UAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAGzD,oBAAoB;AAAA,IACpB,eAAe;AAAA,EAAA,CAChB,CACF;AACH;"}
|
|
@@ -48,7 +48,6 @@ import "../../../assets/icons/account-validated.svg.js";
|
|
|
48
48
|
import "../../../utils/functions/DateFormatter.js";
|
|
49
49
|
import "@react-hookz/web";
|
|
50
50
|
import "dayjs";
|
|
51
|
-
import "../../../assets/ArcusBioIcon.svg.js";
|
|
52
51
|
import "@mui/material/SvgIcon";
|
|
53
52
|
import "../../../assets/icons/AccessPending.svg.js";
|
|
54
53
|
import "../../../assets/icons/AccessPendingCloud.svg.js";
|
|
@@ -224,7 +223,7 @@ import E from "@mui/material/AccordionDetails";
|
|
|
224
223
|
import M from "@mui/material/AccordionSummary";
|
|
225
224
|
import a from "@mui/material/Button";
|
|
226
225
|
import j from "@mui/material/Stack";
|
|
227
|
-
function
|
|
226
|
+
function Zi(u) {
|
|
228
227
|
const { open: C, onClose: l, onConfirm: v, confirmIsPending: h, errorMessage: s } = u, [i, g] = t(
|
|
229
228
|
0
|
|
230
229
|
/* UPLOAD_CSV */
|
|
@@ -332,6 +331,6 @@ function _i(u) {
|
|
|
332
331
|
);
|
|
333
332
|
}
|
|
334
333
|
export {
|
|
335
|
-
|
|
334
|
+
Zi as default
|
|
336
335
|
};
|
|
337
336
|
//# sourceMappingURL=CsvPreviewDialog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CsvPreviewDialog.js","sources":["../../../../src/components/table/CsvPreview/CsvPreviewDialog.tsx"],"sourcesContent":["import { DialogBase } from '@/components/DialogBase'\nimport {\n BasicFileHandleUpload,\n FileUploadHandle,\n} from '@/components/file/upload/BasicFileHandleUpload'\nimport { ErrorBanner } from '@/components/index'\nimport CsvPreview from '@/components/table/CsvPreview/CsvPreview'\nimport CsvTableDescriptorForm, {\n CsvTableDescriptorFormHandle,\n} from '@/components/table/CsvTableDescriptorForm/CsvTableDescriptorForm'\nimport { RefreshTwoTone } from '@mui/icons-material'\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore'\nimport Accordion from '@mui/material/Accordion'\nimport AccordionDetails from '@mui/material/AccordionDetails'\nimport AccordionSummary from '@mui/material/AccordionSummary'\nimport Button from '@mui/material/Button'\nimport Stack from '@mui/material/Stack'\nimport Typography from '@mui/material/Typography'\nimport {\n ColumnModel,\n CsvTableDescriptor,\n UploadToTablePreviewResult,\n} from '@sage-bionetworks/synapse-client'\nimport { useCallback, useRef, useState } from 'react'\n\nenum CsvPreviewDialogStep {\n UPLOAD_CSV = 0,\n COLUMN_PREVIEW = 1,\n}\n\nexport type CsvPreviewDialogProps = {\n /** Whether the dialog is open */\n open: boolean\n /** Callback when the dialog is closed */\n onClose: () => void\n /** Callback when the user confirms the column models\n * @param dataFileHandleId - The file handle ID of the uploaded CSV\n * @param columnModels - The confirmed column models\n * */\n onConfirm: (\n dataFileHandleId: string,\n columnModels: ColumnModel[],\n csvTableDescriptor: CsvTableDescriptor,\n ) => void\n /** Whether the confirm action is pending */\n confirmIsPending?: boolean\n /** An optional error message to display */\n errorMessage?: string\n}\n\nexport default function CsvPreviewDialog(props: CsvPreviewDialogProps) {\n const { open, onClose, onConfirm, confirmIsPending, errorMessage } = props\n const [step, setStep] = useState(CsvPreviewDialogStep.UPLOAD_CSV)\n const [csvTableDescriptor, setCsvTableDescriptor] =\n useState<CsvTableDescriptor>({\n separator: ',',\n quoteCharacter: '\"',\n escapeCharacter: '\\\\',\n lineEnd: '\\n',\n isFirstLineHeader: true,\n })\n const [csvPreviewData, setCsvPreviewData] =\n useState<UploadToTablePreviewResult | null>(null)\n const [isLoadingPreview, setIsLoadingPreview] = useState(false)\n\n const [uploadedFileHandleId, setUploadedFileHandleId] = useState<\n string | null\n >(null)\n\n const onFileUploaded = useCallback((fileHandleId: string) => {\n setUploadedFileHandleId(fileHandleId)\n setStep(CsvPreviewDialogStep.COLUMN_PREVIEW)\n }, [])\n\n const uploadRef = useRef<FileUploadHandle | null>(null)\n const csvDescriptorFormRef = useRef<CsvTableDescriptorFormHandle | null>(null)\n\n const uploadStepContent = (\n <BasicFileHandleUpload\n ref={uploadRef}\n allowMultipleUpload={false}\n onFileUploadComplete={fileHandleId => {\n onFileUploaded(fileHandleId)\n }}\n disableDragAndDrop={true}\n />\n )\n\n const previewStepContent = (\n <Stack spacing={2}>\n {uploadedFileHandleId && (\n <CsvPreview\n fileHandleId={uploadedFileHandleId}\n csvTableDescriptor={csvTableDescriptor}\n onCsvPreviewDataChange={setCsvPreviewData}\n onIsLoadingChange={setIsLoadingPreview}\n />\n )}\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant={'headline3'}>Show Options</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <CsvTableDescriptorForm\n defaultValue={csvTableDescriptor}\n ref={csvDescriptorFormRef}\n />\n <Button\n variant={'outlined'}\n startIcon={<RefreshTwoTone />}\n sx={{ mt: 2 }}\n onClick={() => {\n // Get the state from the form and update local state, which will re-render the preview\n if (csvDescriptorFormRef.current) {\n setCsvTableDescriptor(\n csvDescriptorFormRef.current.getFormData(),\n )\n }\n }}\n >\n Refresh Preview\n </Button>\n </AccordionDetails>\n </Accordion>\n </Stack>\n )\n\n return (\n <DialogBase\n maxWidth={'lg'}\n title={'Upload CSV'}\n onCancel={onClose}\n open={open}\n content={\n <>\n {step === CsvPreviewDialogStep.UPLOAD_CSV && uploadStepContent}\n {step === CsvPreviewDialogStep.COLUMN_PREVIEW && previewStepContent}\n {errorMessage && <ErrorBanner error={errorMessage} />}\n </>\n }\n actions={\n <>\n <Button\n variant={'outlined'}\n disabled={isLoadingPreview}\n onClick={() => {\n onClose()\n }}\n >\n Cancel\n </Button>\n {step === CsvPreviewDialogStep.COLUMN_PREVIEW && (\n <Button\n disabled={isLoadingPreview}\n variant={'contained'}\n onClick={() => {\n onConfirm(\n uploadedFileHandleId!,\n csvPreviewData!.suggestedColumns!,\n csvTableDescriptor,\n )\n }}\n loading={confirmIsPending}\n >\n Confirm\n </Button>\n )}\n </>\n }\n />\n )\n}\n"],"names":["CsvPreviewDialog","props","open","onClose","onConfirm","confirmIsPending","errorMessage","step","setStep","useState","csvTableDescriptor","setCsvTableDescriptor","csvPreviewData","setCsvPreviewData","isLoadingPreview","setIsLoadingPreview","uploadedFileHandleId","setUploadedFileHandleId","onFileUploaded","useCallback","fileHandleId","uploadRef","useRef","csvDescriptorFormRef","jsx","DialogBase","jsxs","Fragment","BasicFileHandleUpload","Stack","CsvPreview","Accordion","AccordionSummary","ExpandMoreIcon","Typography","AccordionDetails","CsvTableDescriptorForm","Button","RefreshTwoTone","ErrorBanner"],"mappings":"
|
|
1
|
+
{"version":3,"file":"CsvPreviewDialog.js","sources":["../../../../src/components/table/CsvPreview/CsvPreviewDialog.tsx"],"sourcesContent":["import { DialogBase } from '@/components/DialogBase'\nimport {\n BasicFileHandleUpload,\n FileUploadHandle,\n} from '@/components/file/upload/BasicFileHandleUpload'\nimport { ErrorBanner } from '@/components/index'\nimport CsvPreview from '@/components/table/CsvPreview/CsvPreview'\nimport CsvTableDescriptorForm, {\n CsvTableDescriptorFormHandle,\n} from '@/components/table/CsvTableDescriptorForm/CsvTableDescriptorForm'\nimport { RefreshTwoTone } from '@mui/icons-material'\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore'\nimport Accordion from '@mui/material/Accordion'\nimport AccordionDetails from '@mui/material/AccordionDetails'\nimport AccordionSummary from '@mui/material/AccordionSummary'\nimport Button from '@mui/material/Button'\nimport Stack from '@mui/material/Stack'\nimport Typography from '@mui/material/Typography'\nimport {\n ColumnModel,\n CsvTableDescriptor,\n UploadToTablePreviewResult,\n} from '@sage-bionetworks/synapse-client'\nimport { useCallback, useRef, useState } from 'react'\n\nenum CsvPreviewDialogStep {\n UPLOAD_CSV = 0,\n COLUMN_PREVIEW = 1,\n}\n\nexport type CsvPreviewDialogProps = {\n /** Whether the dialog is open */\n open: boolean\n /** Callback when the dialog is closed */\n onClose: () => void\n /** Callback when the user confirms the column models\n * @param dataFileHandleId - The file handle ID of the uploaded CSV\n * @param columnModels - The confirmed column models\n * */\n onConfirm: (\n dataFileHandleId: string,\n columnModels: ColumnModel[],\n csvTableDescriptor: CsvTableDescriptor,\n ) => void\n /** Whether the confirm action is pending */\n confirmIsPending?: boolean\n /** An optional error message to display */\n errorMessage?: string\n}\n\nexport default function CsvPreviewDialog(props: CsvPreviewDialogProps) {\n const { open, onClose, onConfirm, confirmIsPending, errorMessage } = props\n const [step, setStep] = useState(CsvPreviewDialogStep.UPLOAD_CSV)\n const [csvTableDescriptor, setCsvTableDescriptor] =\n useState<CsvTableDescriptor>({\n separator: ',',\n quoteCharacter: '\"',\n escapeCharacter: '\\\\',\n lineEnd: '\\n',\n isFirstLineHeader: true,\n })\n const [csvPreviewData, setCsvPreviewData] =\n useState<UploadToTablePreviewResult | null>(null)\n const [isLoadingPreview, setIsLoadingPreview] = useState(false)\n\n const [uploadedFileHandleId, setUploadedFileHandleId] = useState<\n string | null\n >(null)\n\n const onFileUploaded = useCallback((fileHandleId: string) => {\n setUploadedFileHandleId(fileHandleId)\n setStep(CsvPreviewDialogStep.COLUMN_PREVIEW)\n }, [])\n\n const uploadRef = useRef<FileUploadHandle | null>(null)\n const csvDescriptorFormRef = useRef<CsvTableDescriptorFormHandle | null>(null)\n\n const uploadStepContent = (\n <BasicFileHandleUpload\n ref={uploadRef}\n allowMultipleUpload={false}\n onFileUploadComplete={fileHandleId => {\n onFileUploaded(fileHandleId)\n }}\n disableDragAndDrop={true}\n />\n )\n\n const previewStepContent = (\n <Stack spacing={2}>\n {uploadedFileHandleId && (\n <CsvPreview\n fileHandleId={uploadedFileHandleId}\n csvTableDescriptor={csvTableDescriptor}\n onCsvPreviewDataChange={setCsvPreviewData}\n onIsLoadingChange={setIsLoadingPreview}\n />\n )}\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant={'headline3'}>Show Options</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <CsvTableDescriptorForm\n defaultValue={csvTableDescriptor}\n ref={csvDescriptorFormRef}\n />\n <Button\n variant={'outlined'}\n startIcon={<RefreshTwoTone />}\n sx={{ mt: 2 }}\n onClick={() => {\n // Get the state from the form and update local state, which will re-render the preview\n if (csvDescriptorFormRef.current) {\n setCsvTableDescriptor(\n csvDescriptorFormRef.current.getFormData(),\n )\n }\n }}\n >\n Refresh Preview\n </Button>\n </AccordionDetails>\n </Accordion>\n </Stack>\n )\n\n return (\n <DialogBase\n maxWidth={'lg'}\n title={'Upload CSV'}\n onCancel={onClose}\n open={open}\n content={\n <>\n {step === CsvPreviewDialogStep.UPLOAD_CSV && uploadStepContent}\n {step === CsvPreviewDialogStep.COLUMN_PREVIEW && previewStepContent}\n {errorMessage && <ErrorBanner error={errorMessage} />}\n </>\n }\n actions={\n <>\n <Button\n variant={'outlined'}\n disabled={isLoadingPreview}\n onClick={() => {\n onClose()\n }}\n >\n Cancel\n </Button>\n {step === CsvPreviewDialogStep.COLUMN_PREVIEW && (\n <Button\n disabled={isLoadingPreview}\n variant={'contained'}\n onClick={() => {\n onConfirm(\n uploadedFileHandleId!,\n csvPreviewData!.suggestedColumns!,\n csvTableDescriptor,\n )\n }}\n loading={confirmIsPending}\n >\n Confirm\n </Button>\n )}\n </>\n }\n />\n )\n}\n"],"names":["CsvPreviewDialog","props","open","onClose","onConfirm","confirmIsPending","errorMessage","step","setStep","useState","csvTableDescriptor","setCsvTableDescriptor","csvPreviewData","setCsvPreviewData","isLoadingPreview","setIsLoadingPreview","uploadedFileHandleId","setUploadedFileHandleId","onFileUploaded","useCallback","fileHandleId","uploadRef","useRef","csvDescriptorFormRef","jsx","DialogBase","jsxs","Fragment","BasicFileHandleUpload","Stack","CsvPreview","Accordion","AccordionSummary","ExpandMoreIcon","Typography","AccordionDetails","CsvTableDescriptorForm","Button","RefreshTwoTone","ErrorBanner"],"mappings":"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"}
|
|
@@ -50,7 +50,6 @@ import "../../../assets/icons/account-validated.svg.js";
|
|
|
50
50
|
import "../../../utils/functions/DateFormatter.js";
|
|
51
51
|
import "@react-hookz/web";
|
|
52
52
|
import "dayjs";
|
|
53
|
-
import "../../../assets/ArcusBioIcon.svg.js";
|
|
54
53
|
import "@mui/material/SvgIcon";
|
|
55
54
|
import "../../../assets/icons/AccessPending.svg.js";
|
|
56
55
|
import "../../../assets/icons/AccessPendingCloud.svg.js";
|
|
@@ -236,10 +235,10 @@ function G() {
|
|
|
236
235
|
) })
|
|
237
236
|
] }) : /* @__PURE__ */ r(R, { error: "Missing sessionId" });
|
|
238
237
|
}
|
|
239
|
-
function
|
|
238
|
+
function ui(t) {
|
|
240
239
|
return /* @__PURE__ */ r(c, { ...t, children: /* @__PURE__ */ r(G, {}) });
|
|
241
240
|
}
|
|
242
241
|
export {
|
|
243
|
-
|
|
242
|
+
ui as default
|
|
244
243
|
};
|
|
245
244
|
//# sourceMappingURL=GridPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GridPage.js","sources":["../../../../src/features/curator/GridPage/GridPage.tsx"],"sourcesContent":["import SynapseGrid from '@/components/DataGrid/index'\nimport { ErrorBanner } from '@/components/index'\nimport GridPageRouter, {\n GridPageRouterProps,\n} from '@/features/curator/GridPage/components/GridPageRouter'\nimport GridPageTitle from '@/features/curator/GridPage/components/GridPageTitle'\nimport {\n GRID_PAGE_SESSION_ID_QUERY_PARAM,\n GRID_PAGE_AGENT_REGISTRATION_ID_QUERY_PARAM,\n GRID_PAGE_TASK_ID_QUERY_PARAM,\n} from '@/utils/SynapseConstants'\nimport { useSearchParams } from 'react-router'\n\nfunction GridPageInternal() {\n const [searchParams] = useSearchParams()\n\n const sessionId = decodeURIComponent(\n searchParams.get(GRID_PAGE_SESSION_ID_QUERY_PARAM) ?? '',\n )\n const rawTaskId = searchParams.get(GRID_PAGE_TASK_ID_QUERY_PARAM)\n const taskId = rawTaskId ? parseInt(rawTaskId) : undefined\n const agentRegistrationId = searchParams.get(\n GRID_PAGE_AGENT_REGISTRATION_ID_QUERY_PARAM,\n )\n\n // If no session id, error\n if (!sessionId) {\n return <ErrorBanner error={'Missing sessionId'} />\n }\n\n return (\n <>\n <GridPageTitle sessionId={sessionId} taskId={taskId} />\n <div className={'pageContent'}>\n <SynapseGrid\n agentRegistrationId={agentRegistrationId ?? undefined}\n ref={handle => {\n if (handle) {\n handle.loadExistingSession(sessionId)\n }\n }}\n />\n </div>\n </>\n )\n}\n\nexport type GridPageProps = Omit<GridPageRouterProps, 'children'>\n\n/**\n * A page that displays the Curator grid, with included routing logic\n */\nexport default function GridPage(props: GridPageProps) {\n return (\n <GridPageRouter {...props}>\n <GridPageInternal />\n </GridPageRouter>\n )\n}\n"],"names":["GridPageInternal","searchParams","useSearchParams","sessionId","GRID_PAGE_SESSION_ID_QUERY_PARAM","rawTaskId","GRID_PAGE_TASK_ID_QUERY_PARAM","taskId","agentRegistrationId","GRID_PAGE_AGENT_REGISTRATION_ID_QUERY_PARAM","jsxs","Fragment","jsx","GridPageTitle","SynapseGrid","handle","ErrorBanner","GridPage","props","GridPageRouter"],"mappings":"
|
|
1
|
+
{"version":3,"file":"GridPage.js","sources":["../../../../src/features/curator/GridPage/GridPage.tsx"],"sourcesContent":["import SynapseGrid from '@/components/DataGrid/index'\nimport { ErrorBanner } from '@/components/index'\nimport GridPageRouter, {\n GridPageRouterProps,\n} from '@/features/curator/GridPage/components/GridPageRouter'\nimport GridPageTitle from '@/features/curator/GridPage/components/GridPageTitle'\nimport {\n GRID_PAGE_SESSION_ID_QUERY_PARAM,\n GRID_PAGE_AGENT_REGISTRATION_ID_QUERY_PARAM,\n GRID_PAGE_TASK_ID_QUERY_PARAM,\n} from '@/utils/SynapseConstants'\nimport { useSearchParams } from 'react-router'\n\nfunction GridPageInternal() {\n const [searchParams] = useSearchParams()\n\n const sessionId = decodeURIComponent(\n searchParams.get(GRID_PAGE_SESSION_ID_QUERY_PARAM) ?? '',\n )\n const rawTaskId = searchParams.get(GRID_PAGE_TASK_ID_QUERY_PARAM)\n const taskId = rawTaskId ? parseInt(rawTaskId) : undefined\n const agentRegistrationId = searchParams.get(\n GRID_PAGE_AGENT_REGISTRATION_ID_QUERY_PARAM,\n )\n\n // If no session id, error\n if (!sessionId) {\n return <ErrorBanner error={'Missing sessionId'} />\n }\n\n return (\n <>\n <GridPageTitle sessionId={sessionId} taskId={taskId} />\n <div className={'pageContent'}>\n <SynapseGrid\n agentRegistrationId={agentRegistrationId ?? undefined}\n ref={handle => {\n if (handle) {\n handle.loadExistingSession(sessionId)\n }\n }}\n />\n </div>\n </>\n )\n}\n\nexport type GridPageProps = Omit<GridPageRouterProps, 'children'>\n\n/**\n * A page that displays the Curator grid, with included routing logic\n */\nexport default function GridPage(props: GridPageProps) {\n return (\n <GridPageRouter {...props}>\n <GridPageInternal />\n </GridPageRouter>\n )\n}\n"],"names":["GridPageInternal","searchParams","useSearchParams","sessionId","GRID_PAGE_SESSION_ID_QUERY_PARAM","rawTaskId","GRID_PAGE_TASK_ID_QUERY_PARAM","taskId","agentRegistrationId","GRID_PAGE_AGENT_REGISTRATION_ID_QUERY_PARAM","jsxs","Fragment","jsx","GridPageTitle","SynapseGrid","handle","ErrorBanner","GridPage","props","GridPageRouter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,SAASA,IAAmB;AAC1B,QAAM,CAACC,CAAY,IAAIC,EAAA,GAEjBC,IAAY;AAAA,IAChBF,EAAa,IAAIG,CAAgC,KAAK;AAAA,EAAA,GAElDC,IAAYJ,EAAa,IAAIK,CAA6B,GAC1DC,IAASF,IAAY,SAASA,CAAS,IAAI,QAC3CG,IAAsBP,EAAa;AAAA,IACvCQ;AAAA,EAAA;AAIF,SAAKN,IAKH,gBAAAO,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAC,EAACC,GAAA,EAAc,WAAAV,GAAsB,QAAAI,EAAA,CAAgB;AAAA,IACrD,gBAAAK,EAAC,OAAA,EAAI,WAAW,eACd,UAAA,gBAAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,qBAAqBN,KAAuB;AAAA,QAC5C,KAAK,CAAAO,MAAU;AACb,UAAIA,KACFA,EAAO,oBAAoBZ,CAAS;AAAA,QAExC;AAAA,MAAA;AAAA,IAAA,EACF,CACF;AAAA,EAAA,GACF,IAhBO,gBAAAS,EAACI,GAAA,EAAY,OAAO,oBAAA,CAAqB;AAkBpD;AAOA,SAAwBC,GAASC,GAAsB;AACrD,2BACGC,GAAA,EAAgB,GAAGD,GAClB,UAAA,gBAAAN,EAACZ,KAAiB,GACpB;AAEJ;"}
|
|
@@ -51,7 +51,6 @@ import "../../../../assets/icons/account-validated.svg.js";
|
|
|
51
51
|
import "../../../../utils/functions/DateFormatter.js";
|
|
52
52
|
import "@react-hookz/web";
|
|
53
53
|
import "dayjs";
|
|
54
|
-
import "../../../../assets/ArcusBioIcon.svg.js";
|
|
55
54
|
import "@mui/material/SvgIcon";
|
|
56
55
|
import "../../../../assets/icons/AccessPending.svg.js";
|
|
57
56
|
import "../../../../assets/icons/AccessPendingCloud.svg.js";
|
|
@@ -218,7 +217,7 @@ import "../../../../components/PortalAclEditor/PortalAclEditor.js";
|
|
|
218
217
|
import "../../../../components/SynapseHomepageV2/HomepageStyles.js";
|
|
219
218
|
import { useGetCurationTask as y } from "../../../../synapse-queries/curation/task/useCurationTask.js";
|
|
220
219
|
import { useGetGridSession as I } from "../../../../synapse-queries/grid/useGridSession.js";
|
|
221
|
-
function
|
|
220
|
+
function No(c) {
|
|
222
221
|
const { sessionId: m, taskId: p } = c, { data: t, error: e } = I(m), { data: n } = u(
|
|
223
222
|
t?.sourceEntityId
|
|
224
223
|
), { data: o } = y(p || 0, {
|
|
@@ -258,6 +257,6 @@ function $o(c) {
|
|
|
258
257
|
] });
|
|
259
258
|
}
|
|
260
259
|
export {
|
|
261
|
-
|
|
260
|
+
No as default
|
|
262
261
|
};
|
|
263
262
|
//# sourceMappingURL=GridPageTitle.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GridPageTitle.js","sources":["../../../../../src/features/curator/GridPage/components/GridPageTitle.tsx"],"sourcesContent":["import { ErrorBanner } from '@/components/index'\nimport { StyledPopover } from '@/components/styled/StyledPopover'\nimport { useGetCurationTask } from '@/synapse-queries/curation/task/useCurationTask'\nimport { useGetGridSession } from '@/synapse-queries/grid/useGridSession'\nimport { useGetEntityHeader } from '@/synapse-queries/index'\nimport { BackendDestinationEnum, getEndpoint } from '@/utils/functions/index'\nimport { Link, Stack, Tooltip, Typography } from '@mui/material'\n\ntype GridPageTitleProps = {\n sessionId: string\n taskId?: number\n}\n\nexport default function GridPageTitle(props: GridPageTitleProps) {\n const { sessionId, taskId } = props\n const { data: gridSession, error: gridSessionError } =\n useGetGridSession(sessionId)\n const { data: gridSourceEntity } = useGetEntityHeader(\n gridSession?.sourceEntityId,\n )\n const { data: curationTask } = useGetCurationTask(taskId || 0, {\n enabled: taskId != null,\n })\n\n if (gridSessionError) {\n return <ErrorBanner error={gridSessionError} />\n }\n\n return (\n <div className={'pageHeader'}>\n <h3 className={'pageHeaderTitle'}>\n Working Copy{' '}\n {gridSourceEntity?.name ? `of ${gridSourceEntity.name}` : ''}\n </h3>\n <Stack className={'description'} spacing={1}>\n <Typography variant={'headline2'}>ID: {sessionId}</Typography>\n {curationTask && (\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <Typography variant={'body1'}>\n <strong>Task Name:</strong> {curationTask.dataType}{' '}\n </Typography>\n <StyledPopover popoverContent={curationTask.instructions}>\n <Link underline=\"hover\">View Instructions</Link>\n </StyledPopover>\n </Stack>\n )}\n {gridSession?.gridJsonSchema$Id && (\n <div>\n <Tooltip title={gridSession?.gridJsonSchema$Id} placement={'right'}>\n <Link\n target={'_blank'}\n href={`${getEndpoint(\n BackendDestinationEnum.REPO_ENDPOINT,\n )}/repo/v1/schema/type/registered/${\n gridSession?.gridJsonSchema$Id\n }`}\n >\n View Validation Schema (JSON)\n </Link>\n </Tooltip>\n </div>\n )}\n </Stack>\n </div>\n )\n}\n"],"names":["GridPageTitle","props","sessionId","taskId","gridSession","gridSessionError","useGetGridSession","gridSourceEntity","useGetEntityHeader","curationTask","useGetCurationTask","jsx","ErrorBanner","jsxs","Stack","Typography","StyledPopover","Link","Tooltip","getEndpoint","BackendDestinationEnum"],"mappings":"
|
|
1
|
+
{"version":3,"file":"GridPageTitle.js","sources":["../../../../../src/features/curator/GridPage/components/GridPageTitle.tsx"],"sourcesContent":["import { ErrorBanner } from '@/components/index'\nimport { StyledPopover } from '@/components/styled/StyledPopover'\nimport { useGetCurationTask } from '@/synapse-queries/curation/task/useCurationTask'\nimport { useGetGridSession } from '@/synapse-queries/grid/useGridSession'\nimport { useGetEntityHeader } from '@/synapse-queries/index'\nimport { BackendDestinationEnum, getEndpoint } from '@/utils/functions/index'\nimport { Link, Stack, Tooltip, Typography } from '@mui/material'\n\ntype GridPageTitleProps = {\n sessionId: string\n taskId?: number\n}\n\nexport default function GridPageTitle(props: GridPageTitleProps) {\n const { sessionId, taskId } = props\n const { data: gridSession, error: gridSessionError } =\n useGetGridSession(sessionId)\n const { data: gridSourceEntity } = useGetEntityHeader(\n gridSession?.sourceEntityId,\n )\n const { data: curationTask } = useGetCurationTask(taskId || 0, {\n enabled: taskId != null,\n })\n\n if (gridSessionError) {\n return <ErrorBanner error={gridSessionError} />\n }\n\n return (\n <div className={'pageHeader'}>\n <h3 className={'pageHeaderTitle'}>\n Working Copy{' '}\n {gridSourceEntity?.name ? `of ${gridSourceEntity.name}` : ''}\n </h3>\n <Stack className={'description'} spacing={1}>\n <Typography variant={'headline2'}>ID: {sessionId}</Typography>\n {curationTask && (\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <Typography variant={'body1'}>\n <strong>Task Name:</strong> {curationTask.dataType}{' '}\n </Typography>\n <StyledPopover popoverContent={curationTask.instructions}>\n <Link underline=\"hover\">View Instructions</Link>\n </StyledPopover>\n </Stack>\n )}\n {gridSession?.gridJsonSchema$Id && (\n <div>\n <Tooltip title={gridSession?.gridJsonSchema$Id} placement={'right'}>\n <Link\n target={'_blank'}\n href={`${getEndpoint(\n BackendDestinationEnum.REPO_ENDPOINT,\n )}/repo/v1/schema/type/registered/${\n gridSession?.gridJsonSchema$Id\n }`}\n >\n View Validation Schema (JSON)\n </Link>\n </Tooltip>\n </div>\n )}\n </Stack>\n </div>\n )\n}\n"],"names":["GridPageTitle","props","sessionId","taskId","gridSession","gridSessionError","useGetGridSession","gridSourceEntity","useGetEntityHeader","curationTask","useGetCurationTask","jsx","ErrorBanner","jsxs","Stack","Typography","StyledPopover","Link","Tooltip","getEndpoint","BackendDestinationEnum"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,SAAwBA,GAAcC,GAA2B;AAC/D,QAAM,EAAE,WAAAC,GAAW,QAAAC,EAAA,IAAWF,GACxB,EAAE,MAAMG,GAAa,OAAOC,EAAA,IAChCC,EAAkBJ,CAAS,GACvB,EAAE,MAAMK,EAAA,IAAqBC;AAAA,IACjCJ,GAAa;AAAA,EAAA,GAET,EAAE,MAAMK,EAAA,IAAiBC,EAAmBP,KAAU,GAAG;AAAA,IAC7D,SAASA,KAAU;AAAA,EAAA,CACpB;AAED,SAAIE,IACK,gBAAAM,EAACC,GAAA,EAAY,OAAOP,EAAA,CAAkB,IAI7C,gBAAAQ,EAAC,OAAA,EAAI,WAAW,cACd,UAAA;AAAA,IAAA,gBAAAA,EAAC,MAAA,EAAG,WAAW,mBAAmB,UAAA;AAAA,MAAA;AAAA,MACnB;AAAA,MACZN,GAAkB,OAAO,MAAMA,EAAiB,IAAI,KAAK;AAAA,IAAA,GAC5D;AAAA,IACA,gBAAAM,EAACC,GAAA,EAAM,WAAW,eAAe,SAAS,GACxC,UAAA;AAAA,MAAA,gBAAAD,EAACE,GAAA,EAAW,SAAS,aAAa,UAAA;AAAA,QAAA;AAAA,QAAKb;AAAA,MAAA,GAAU;AAAA,MAChDO,uBACEK,GAAA,EAAM,WAAU,OAAM,SAAS,GAAG,YAAW,UAC5C,UAAA;AAAA,QAAA,gBAAAD,EAACE,GAAA,EAAW,SAAS,SACnB,UAAA;AAAA,UAAA,gBAAAJ,EAAC,YAAO,UAAA,aAAA,CAAU;AAAA,UAAS;AAAA,UAAEF,EAAa;AAAA,UAAU;AAAA,QAAA,GACtD;AAAA,QACA,gBAAAE,EAACK,GAAA,EAAc,gBAAgBP,EAAa,cAC1C,4BAACQ,GAAA,EAAK,WAAU,SAAQ,UAAA,oBAAA,CAAiB,EAAA,CAC3C;AAAA,MAAA,GACF;AAAA,MAEDb,GAAa,qBACZ,gBAAAO,EAAC,OAAA,EACC,UAAA,gBAAAA,EAACO,KAAQ,OAAOd,GAAa,mBAAmB,WAAW,SACzD,UAAA,gBAAAO;AAAA,QAACM;AAAA,QAAA;AAAA,UACC,QAAQ;AAAA,UACR,MAAM,GAAGE;AAAA,YACPC,EAAuB;AAAA,UAAA,CACxB,mCACChB,GAAa,iBACf;AAAA,UACD,UAAA;AAAA,QAAA;AAAA,MAAA,GAGH,EAAA,CACF;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TaskBundle } from '@sage-bionetworks/synapse-client';
|
|
2
|
+
export declare const OPEN_CURATOR_ERROR_TITLE = "An error occurred while trying to open Curator";
|
|
3
|
+
export declare const OPEN_CURATOR_UNAUTHORIZED_ERROR_MESSAGE = "You don't have permission to view the existing Curator session for this task. It was likely created by another data contributor. A data manager should create a new task and assign it to you or your team.";
|
|
4
|
+
export declare const NO_TASK_ASSIGNEE_WARNING_DIALOG_TITLE = "Task is Unassigned";
|
|
2
5
|
/**
|
|
3
6
|
* Handles rendering the 'Actions' cell in the Metadata Task table, which provides buttons for the user
|
|
4
7
|
* to accomplish the actions they can take on a Metadata Task, such as opening a data grid for the entity referenced
|
|
5
8
|
* by the task.
|
|
6
9
|
*/
|
|
7
10
|
export default function MetadataTaskTableActionCell(props: {
|
|
8
|
-
|
|
11
|
+
taskBundle: TaskBundle;
|
|
9
12
|
canEdit: boolean;
|
|
10
13
|
}): import("react/jsx-runtime").JSX.Element;
|
|
11
14
|
//# sourceMappingURL=MetadataTaskTableActionCell.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetadataTaskTableActionCell.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/components/MetadataTaskTableActionCell.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MetadataTaskTableActionCell.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/components/MetadataTaskTableActionCell.tsx"],"names":[],"mappings":"AAMA,OAAO,EAGL,UAAU,EACX,MAAM,kCAAkC,CAAA;AAIzC,eAAO,MAAM,wBAAwB,mDACa,CAAA;AAClD,eAAO,MAAM,uCAAuC,gNAC2J,CAAA;AAE/M,eAAO,MAAM,qCAAqC,uBAAuB,CAAA;AAOzE;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,2BAA2B,CAAC,KAAK,EAAE;IACzD,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;CACjB,2CAwEA"}
|
|
@@ -1,44 +1,57 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
import { jsx as e, Fragment as f } from "react/jsx-runtime";
|
|
2
|
+
import { displayToast as p } from "../../../../components/ToastMessage/ToastMessage.js";
|
|
3
|
+
import h from "../hooks/useGridSessionForCurationTask_legacy.js";
|
|
4
|
+
import { useGetEntityPermissions as O } from "../../../../synapse-queries/entity/useEntity.js";
|
|
5
|
+
import { getLinkToGridSession as S } from "../../../../utils/functions/getSynapseWebClientLink.js";
|
|
6
|
+
import { StickyNote2Outlined as w } from "@mui/icons-material";
|
|
7
|
+
import { Tooltip as I, Button as _ } from "@mui/material";
|
|
8
|
+
import { SynapseClientError as A } from "@sage-bionetworks/synapse-client";
|
|
9
|
+
import { useCallback as g } from "react";
|
|
10
|
+
import { getGridSourceIdForTask as R } from "../utils/getGridSourceIdForTask.js";
|
|
11
|
+
const k = "An error occurred while trying to open Curator", G = "You don't have permission to view the existing Curator session for this task. It was likely created by another data contributor. A data manager should create a new task and assign it to you or your team.", B = "Task is Unassigned";
|
|
12
|
+
function N(i, n) {
|
|
13
|
+
const o = S(i, n);
|
|
14
|
+
window.open(o, "_blank", "noopener");
|
|
15
|
+
}
|
|
16
|
+
function M(i) {
|
|
17
|
+
const { taskBundle: n } = i, o = n.task, {
|
|
18
|
+
mutateAsync: r,
|
|
19
|
+
isPending: s
|
|
20
|
+
} = h(), a = R(o), {
|
|
21
|
+
data: d,
|
|
22
|
+
isLoading: T
|
|
23
|
+
} = O(a), c = T, l = d?.canView, y = s || c || !l, E = l ? "Open Curator to edit metadata" : d?.canView ? "You must have READ access to " + a + " to view the Working Copy" : "You do not have permission to view the Working Copy", m = g(async () => {
|
|
24
|
+
let u;
|
|
15
25
|
try {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
console.error("Error opening Curator for curation task",
|
|
23
|
-
title:
|
|
24
|
-
});
|
|
26
|
+
u = await r({
|
|
27
|
+
curationTask: o
|
|
28
|
+
}), N(u.sessionId, o.taskId);
|
|
29
|
+
} catch (t) {
|
|
30
|
+
t instanceof A && t.status === 403 ? (console.error(t), p(G, "danger", {
|
|
31
|
+
title: k
|
|
32
|
+
})) : (console.error("Error opening Curator for curation task", t), p(t.message, "danger", {
|
|
33
|
+
title: k
|
|
34
|
+
}));
|
|
25
35
|
}
|
|
26
|
-
}, [
|
|
27
|
-
|
|
28
|
-
|
|
36
|
+
}, [o, r]), C = g(() => {
|
|
37
|
+
m();
|
|
38
|
+
}, [m]);
|
|
39
|
+
return /* @__PURE__ */ e(f, { children: /* @__PURE__ */ e(I, { title: E, children: /* @__PURE__ */ e("span", { children: /* @__PURE__ */ e(
|
|
40
|
+
_,
|
|
29
41
|
{
|
|
30
42
|
size: "small",
|
|
31
|
-
startIcon: /* @__PURE__ */
|
|
32
|
-
loading:
|
|
33
|
-
disabled:
|
|
34
|
-
onClick:
|
|
35
|
-
p();
|
|
36
|
-
},
|
|
43
|
+
startIcon: /* @__PURE__ */ e(w, {}),
|
|
44
|
+
loading: s || c,
|
|
45
|
+
disabled: y,
|
|
46
|
+
onClick: C,
|
|
37
47
|
children: "Open Curator"
|
|
38
48
|
}
|
|
39
49
|
) }) }) });
|
|
40
50
|
}
|
|
41
51
|
export {
|
|
42
|
-
|
|
52
|
+
B as NO_TASK_ASSIGNEE_WARNING_DIALOG_TITLE,
|
|
53
|
+
k as OPEN_CURATOR_ERROR_TITLE,
|
|
54
|
+
G as OPEN_CURATOR_UNAUTHORIZED_ERROR_MESSAGE,
|
|
55
|
+
M as default
|
|
43
56
|
};
|
|
44
57
|
//# sourceMappingURL=MetadataTaskTableActionCell.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetadataTaskTableActionCell.js","sources":["../../../../../src/features/entity/metadata-task/components/MetadataTaskTableActionCell.tsx"],"sourcesContent":["import { getLinkToGridSession } from '@/utils/functions/getSynapseWebClientLink'\nimport { StickyNote2Outlined } from '@mui/icons-material'\nimport { Button, Tooltip } from '@mui/material'\nimport {
|
|
1
|
+
{"version":3,"file":"MetadataTaskTableActionCell.js","sources":["../../../../../src/features/entity/metadata-task/components/MetadataTaskTableActionCell.tsx"],"sourcesContent":["import { displayToast } from '@/components/ToastMessage/ToastMessage'\nimport useGridSessionForCurationTask_legacy from '@/features/entity/metadata-task/hooks/useGridSessionForCurationTask_legacy'\nimport { useGetEntityPermissions } from '@/synapse-queries/entity/useEntity'\nimport { getLinkToGridSession } from '@/utils/functions/getSynapseWebClientLink'\nimport { StickyNote2Outlined } from '@mui/icons-material'\nimport { Button, Tooltip } from '@mui/material'\nimport {\n GridSession,\n SynapseClientError,\n TaskBundle,\n} from '@sage-bionetworks/synapse-client'\nimport { useCallback } from 'react'\nimport { getGridSourceIdForTask } from '../utils/getGridSourceIdForTask'\n\nexport const OPEN_CURATOR_ERROR_TITLE =\n 'An error occurred while trying to open Curator'\nexport const OPEN_CURATOR_UNAUTHORIZED_ERROR_MESSAGE =\n \"You don't have permission to view the existing Curator session for this task. It was likely created by another data contributor. A data manager should create a new task and assign it to you or your team.\"\n\nexport const NO_TASK_ASSIGNEE_WARNING_DIALOG_TITLE = 'Task is Unassigned'\n\nfunction openGridSessionInNewWindow(gridSessionId: string, taskId: number) {\n const gridUrl = getLinkToGridSession(gridSessionId, taskId)\n window.open(gridUrl, '_blank', 'noopener')\n}\n\n/**\n * Handles rendering the 'Actions' cell in the Metadata Task table, which provides buttons for the user\n * to accomplish the actions they can take on a Metadata Task, such as opening a data grid for the entity referenced\n * by the task.\n */\nexport default function MetadataTaskTableActionCell(props: {\n taskBundle: TaskBundle\n canEdit: boolean\n}) {\n const { taskBundle } = props\n const curationTask = taskBundle.task!\n\n const {\n mutateAsync: getOrCreateLegacyGridSessionForUnassignedTask,\n isPending: openGridIsPending,\n } = useGridSessionForCurationTask_legacy()\n\n const gridSourceEntityId = getGridSourceIdForTask(curationTask)\n const {\n data: sourceEntityPermissions,\n isLoading: isLoadingEntityPermissions,\n } = useGetEntityPermissions(gridSourceEntityId)\n\n const isLoading = isLoadingEntityPermissions\n\n const hasPermission = sourceEntityPermissions?.canView\n\n const isOpenDataGridDisabled =\n openGridIsPending || isLoading || !hasPermission\n const toolTipTitle = hasPermission\n ? 'Open Curator to edit metadata'\n : sourceEntityPermissions?.canView\n ? 'You must have READ access to ' +\n gridSourceEntityId +\n ' to view the Working Copy'\n : 'You do not have permission to view the Working Copy'\n\n const openNewOrExistingCuratorSession = useCallback(async () => {\n let gridSession: GridSession\n try {\n gridSession = await getOrCreateLegacyGridSessionForUnassignedTask({\n curationTask,\n })\n openGridSessionInNewWindow(gridSession.sessionId!, curationTask.taskId!)\n } catch (error) {\n if (error instanceof SynapseClientError && error.status === 403) {\n console.error(error)\n displayToast(OPEN_CURATOR_UNAUTHORIZED_ERROR_MESSAGE, 'danger', {\n title: OPEN_CURATOR_ERROR_TITLE,\n })\n } else {\n console.error('Error opening Curator for curation task', error)\n displayToast(error.message, 'danger', {\n title: OPEN_CURATOR_ERROR_TITLE,\n })\n }\n }\n }, [curationTask, getOrCreateLegacyGridSessionForUnassignedTask])\n\n const handleClickOpenCurator = useCallback(() => {\n void openNewOrExistingCuratorSession()\n }, [openNewOrExistingCuratorSession])\n\n return (\n <>\n <Tooltip title={toolTipTitle}>\n <span>\n <Button\n size={'small'}\n startIcon={<StickyNote2Outlined />}\n loading={openGridIsPending || isLoading}\n disabled={isOpenDataGridDisabled}\n onClick={handleClickOpenCurator}\n >\n Open Curator\n </Button>\n </span>\n </Tooltip>\n </>\n )\n}\n"],"names":["OPEN_CURATOR_ERROR_TITLE","OPEN_CURATOR_UNAUTHORIZED_ERROR_MESSAGE","NO_TASK_ASSIGNEE_WARNING_DIALOG_TITLE","openGridSessionInNewWindow","gridSessionId","taskId","gridUrl","getLinkToGridSession","MetadataTaskTableActionCell","props","taskBundle","curationTask","getOrCreateLegacyGridSessionForUnassignedTask","openGridIsPending","useGridSessionForCurationTask_legacy","gridSourceEntityId","getGridSourceIdForTask","sourceEntityPermissions","isLoadingEntityPermissions","useGetEntityPermissions","isLoading","hasPermission","isOpenDataGridDisabled","toolTipTitle","openNewOrExistingCuratorSession","useCallback","gridSession","error","SynapseClientError","displayToast","handleClickOpenCurator","jsx","Tooltip","Button","StickyNote2Outlined"],"mappings":";;;;;;;;;;AAcO,MAAMA,IACX,kDACWC,IACX,+MAEWC,IAAwC;AAErD,SAASC,EAA2BC,GAAuBC,GAAgB;AACzE,QAAMC,IAAUC,EAAqBH,GAAeC,CAAM;AAC1D,SAAO,KAAKC,GAAS,UAAU,UAAU;AAC3C;AAOA,SAAwBE,EAA4BC,GAGjD;AACD,QAAM,EAAE,YAAAC,MAAeD,GACjBE,IAAeD,EAAW,MAE1B;AAAA,IACJ,aAAaE;AAAA,IACb,WAAWC;AAAA,EAAA,IACTC,EAAA,GAEEC,IAAqBC,EAAuBL,CAAY,GACxD;AAAA,IACJ,MAAMM;AAAA,IACN,WAAWC;AAAA,EAAA,IACTC,EAAwBJ,CAAkB,GAExCK,IAAYF,GAEZG,IAAgBJ,GAAyB,SAEzCK,IACJT,KAAqBO,KAAa,CAACC,GAC/BE,IAAeF,IACjB,kCACAJ,GAAyB,UACzB,kCACAF,IACA,8BACA,uDAEES,IAAkCC,EAAY,YAAY;AAC9D,QAAIC;AACJ,QAAI;AACF,MAAAA,IAAc,MAAMd,EAA8C;AAAA,QAChE,cAAAD;AAAA,MAAA,CACD,GACDR,EAA2BuB,EAAY,WAAYf,EAAa,MAAO;AAAA,IACzE,SAASgB,GAAO;AACd,MAAIA,aAAiBC,KAAsBD,EAAM,WAAW,OAC1D,QAAQ,MAAMA,CAAK,GACnBE,EAAa5B,GAAyC,UAAU;AAAA,QAC9D,OAAOD;AAAA,MAAA,CACR,MAED,QAAQ,MAAM,2CAA2C2B,CAAK,GAC9DE,EAAaF,EAAM,SAAS,UAAU;AAAA,QACpC,OAAO3B;AAAA,MAAA,CACR;AAAA,IAEL;AAAA,EACF,GAAG,CAACW,GAAcC,CAA6C,CAAC,GAE1DkB,IAAyBL,EAAY,MAAM;AAC/C,IAAKD,EAAA;AAAA,EACP,GAAG,CAACA,CAA+B,CAAC;AAEpC,gCAEI,UAAA,gBAAAO,EAACC,GAAA,EAAQ,OAAOT,GACd,4BAAC,QAAA,EACC,UAAA,gBAAAQ;AAAA,IAACE;AAAA,IAAA;AAAA,MACC,MAAM;AAAA,MACN,6BAAYC,GAAA,EAAoB;AAAA,MAChC,SAASrB,KAAqBO;AAAA,MAC9B,UAAUE;AAAA,MACV,SAASQ;AAAA,MACV,UAAA;AAAA,IAAA;AAAA,EAAA,EAED,CACF,GACF,GACF;AAEJ;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetadataTasksPage.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/components/MetadataTasksPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MetadataTasksPage.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/components/MetadataTasksPage.tsx"],"names":[],"mappings":"AAOA,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,2CAgDtE"}
|
|
@@ -1,32 +1,57 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import { useMetadataTaskTable as
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { jsxs as f, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import T from "../../../../components/layout/InfiniteTableLayout.js";
|
|
3
|
+
import u from "../../../../components/TanStackTable/StyledTanStackTable.js";
|
|
4
|
+
import { useMetadataTaskTable as h } from "../hooks/useMetadataTaskTable.js";
|
|
5
|
+
import { Stack as s, FormControlLabel as p, Switch as k } from "@mui/material";
|
|
6
|
+
import { useState as x } from "react";
|
|
7
|
+
function j(n) {
|
|
8
|
+
const { projectId: i } = n, [t, r] = x({
|
|
9
|
+
projectId: i,
|
|
10
|
+
assignedToMe: !1
|
|
11
|
+
}), { table: a, isLoading: o, hasNextPage: l, fetchNextPage: c, isFetchingNextPage: d } = h({
|
|
12
|
+
listCurationTaskRequest: t
|
|
8
13
|
});
|
|
9
|
-
return /* @__PURE__ */
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
14
|
+
return /* @__PURE__ */ f(s, { children: [
|
|
15
|
+
/* @__PURE__ */ e(s, { direction: "row", justifyContent: "flex-end", children: /* @__PURE__ */ e(
|
|
16
|
+
p,
|
|
17
|
+
{
|
|
18
|
+
control: /* @__PURE__ */ e(
|
|
19
|
+
k,
|
|
20
|
+
{
|
|
21
|
+
checked: !!t.assignedToMe,
|
|
22
|
+
onChange: (b, m) => {
|
|
23
|
+
r((g) => ({
|
|
24
|
+
...g,
|
|
25
|
+
assignedToMe: m
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
),
|
|
30
|
+
label: "View only tasks assigned to me"
|
|
31
|
+
}
|
|
32
|
+
) }),
|
|
33
|
+
/* @__PURE__ */ e(
|
|
34
|
+
T,
|
|
35
|
+
{
|
|
36
|
+
table: /* @__PURE__ */ e(
|
|
37
|
+
u,
|
|
38
|
+
{
|
|
39
|
+
table: a,
|
|
40
|
+
styledTableContainerProps: { sx: { my: 2 } }
|
|
41
|
+
}
|
|
42
|
+
),
|
|
43
|
+
isLoading: o,
|
|
44
|
+
isEmpty: !o && a.getRowModel().rows.length === 0,
|
|
45
|
+
hasNextPage: l,
|
|
46
|
+
onFetchNextPageClicked: () => {
|
|
47
|
+
c();
|
|
48
|
+
},
|
|
49
|
+
isFetchingNextPage: d
|
|
50
|
+
}
|
|
51
|
+
)
|
|
52
|
+
] });
|
|
28
53
|
}
|
|
29
54
|
export {
|
|
30
|
-
|
|
55
|
+
j as default
|
|
31
56
|
};
|
|
32
57
|
//# sourceMappingURL=MetadataTasksPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetadataTasksPage.js","sources":["../../../../../src/features/entity/metadata-task/components/MetadataTasksPage.tsx"],"sourcesContent":["import InfiniteTableLayout from '@/components/layout/InfiniteTableLayout'\nimport StyledTanStackTable from '@/components/TanStackTable/StyledTanStackTable'\nimport { useMetadataTaskTable } from '@/features/entity/metadata-task/hooks/useMetadataTaskTable'\n\nexport type MetadataTaskTableProps = {\n projectId: string\n}\n\n/**\n * Displays a list of metadata curation tasks for a particular project, with actions that can be performed on each task.\n * @param props\n * @constructor\n */\nexport default function MetadataTasksPage(props: MetadataTaskTableProps) {\n const { projectId } = props\n\n const { table, isLoading, hasNextPage, fetchNextPage, isFetchingNextPage } =\n useMetadataTaskTable({\n
|
|
1
|
+
{"version":3,"file":"MetadataTasksPage.js","sources":["../../../../../src/features/entity/metadata-task/components/MetadataTasksPage.tsx"],"sourcesContent":["import InfiniteTableLayout from '@/components/layout/InfiniteTableLayout'\nimport StyledTanStackTable from '@/components/TanStackTable/StyledTanStackTable'\nimport { useMetadataTaskTable } from '@/features/entity/metadata-task/hooks/useMetadataTaskTable'\nimport { FormControlLabel, Stack, Switch } from '@mui/material'\nimport { useState } from 'react'\nimport { ListCurationTaskRequest } from '@sage-bionetworks/synapse-client'\n\nexport type MetadataTaskTableProps = {\n projectId: string\n}\n\n/**\n * Displays a list of metadata curation tasks for a particular project, with actions that can be performed on each task.\n * @param props\n * @constructor\n */\nexport default function MetadataTasksPage(props: MetadataTaskTableProps) {\n const { projectId } = props\n const [listCurationTaskRequest, setListCurationTaskRequest] =\n useState<ListCurationTaskRequest>({\n projectId,\n assignedToMe: false,\n })\n\n const { table, isLoading, hasNextPage, fetchNextPage, isFetchingNextPage } =\n useMetadataTaskTable({\n listCurationTaskRequest,\n })\n\n return (\n <Stack>\n <Stack direction=\"row\" justifyContent=\"flex-end\">\n <FormControlLabel\n control={\n <Switch\n checked={!!listCurationTaskRequest.assignedToMe}\n onChange={(_e, checked) => {\n setListCurationTaskRequest(prev => ({\n ...prev,\n assignedToMe: checked,\n }))\n }}\n />\n }\n label=\"View only tasks assigned to me\"\n />\n </Stack>\n <InfiniteTableLayout\n table={\n <StyledTanStackTable\n table={table}\n styledTableContainerProps={{ sx: { my: 2 } }}\n />\n }\n isLoading={isLoading}\n isEmpty={!isLoading && table.getRowModel().rows.length === 0}\n hasNextPage={hasNextPage}\n onFetchNextPageClicked={() => {\n fetchNextPage()\n }}\n isFetchingNextPage={isFetchingNextPage}\n />\n </Stack>\n )\n}\n"],"names":["MetadataTasksPage","props","projectId","listCurationTaskRequest","setListCurationTaskRequest","useState","table","isLoading","hasNextPage","fetchNextPage","isFetchingNextPage","useMetadataTaskTable","Stack","jsx","FormControlLabel","Switch","_e","checked","prev","InfiniteTableLayout","StyledTanStackTable"],"mappings":";;;;;;AAgBA,SAAwBA,EAAkBC,GAA+B;AACvE,QAAM,EAAE,WAAAC,MAAcD,GAChB,CAACE,GAAyBC,CAA0B,IACxDC,EAAkC;AAAA,IAChC,WAAAH;AAAA,IACA,cAAc;AAAA,EAAA,CACf,GAEG,EAAE,OAAAI,GAAO,WAAAC,GAAW,aAAAC,GAAa,eAAAC,GAAe,oBAAAC,EAAA,IACpDC,EAAqB;AAAA,IACnB,yBAAAR;AAAA,EAAA,CACD;AAEH,2BACGS,GAAA,EACC,UAAA;AAAA,IAAA,gBAAAC,EAACD,GAAA,EAAM,WAAU,OAAM,gBAAe,YACpC,UAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,SACE,gBAAAD;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,SAAS,CAAC,CAACZ,EAAwB;AAAA,YACnC,UAAU,CAACa,GAAIC,MAAY;AACzB,cAAAb,EAA2B,CAAAc,OAAS;AAAA,gBAClC,GAAGA;AAAA,gBACH,cAAcD;AAAA,cAAA,EACd;AAAA,YACJ;AAAA,UAAA;AAAA,QAAA;AAAA,QAGJ,OAAM;AAAA,MAAA;AAAA,IAAA,GAEV;AAAA,IACA,gBAAAJ;AAAA,MAACM;AAAA,MAAA;AAAA,QACC,OACE,gBAAAN;AAAA,UAACO;AAAA,UAAA;AAAA,YACC,OAAAd;AAAA,YACA,2BAA2B,EAAE,IAAI,EAAE,IAAI,IAAE;AAAA,UAAE;AAAA,QAAA;AAAA,QAG/C,WAAAC;AAAA,QACA,SAAS,CAACA,KAAaD,EAAM,YAAA,EAAc,KAAK,WAAW;AAAA,QAC3D,aAAAE;AAAA,QACA,wBAAwB,MAAM;AAC5B,UAAAC,EAAA;AAAA,QACF;AAAA,QACA,oBAAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TaskBundle } from '@sage-bionetworks/synapse-client';
|
|
2
|
+
export type MetadataTasksTableAssigneeCellProps = {
|
|
3
|
+
taskBundle: TaskBundle;
|
|
4
|
+
canEdit: boolean;
|
|
5
|
+
};
|
|
6
|
+
export default function MetadataTasksTableAssigneeCell(props: MetadataTasksTableAssigneeCellProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=MetadataTasksTableAssigneeCell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetadataTasksTableAssigneeCell.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAK7D,MAAM,MAAM,mCAAmC,GAAG;IAChD,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,MAAM,CAAC,OAAO,UAAU,8BAA8B,CACpD,KAAK,EAAE,mCAAmC,2CAwH3C"}
|