synapse-react-client 4.0.32 → 4.0.34
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.js +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementList.d.ts +5 -1
- package/dist/components/AccessRequirementList/AccessRequirementList.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementList.js +152 -85
- package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/CancelRequestDataAccess.js +1 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/CancelRequestDataAccess.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.d.ts +1 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.js +62 -43
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.d.ts +6 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.js +227 -147
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DocumentTemplate.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DocumentTemplate.js +28 -24
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DocumentTemplate.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.d.ts +21 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.d.ts.map +1 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.js +163 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.js.map +1 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.d.ts +22 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.d.ts.map +1 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.js +264 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.js.map +1 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/RequestDataAccessSuccess.js +1 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/RequestDataAccessSuccess.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.js +166 -71
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewCollaboratorsAndSigningOfficialAccordion.d.ts +13 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewCollaboratorsAndSigningOfficialAccordion.d.ts.map +1 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewCollaboratorsAndSigningOfficialAccordion.js +122 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewCollaboratorsAndSigningOfficialAccordion.js.map +1 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.d.ts +17 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.d.ts.map +1 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.js +112 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.js.map +1 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.d.ts +22 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.d.ts.map +1 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.js +193 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.js.map +1 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/UploadDocumentField.d.ts +1 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/UploadDocumentField.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/UploadDocumentField.js +7 -7
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/UploadDocumentField.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/styles.d.ts +3 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/styles.d.ts.map +1 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/styles.js +9 -0
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/styles.js.map +1 -0
- package/dist/components/CopyToClipboardIcon.d.ts +2 -1
- package/dist/components/CopyToClipboardIcon.d.ts.map +1 -1
- package/dist/components/CopyToClipboardIcon.js +6 -6
- package/dist/components/CopyToClipboardIcon.js.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.js +230 -215
- package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
- package/dist/components/DataGrid/SyncGridWithSourceButton.js +3 -3
- package/dist/components/DataGrid/SyncGridWithSourceButton.js.map +1 -1
- package/dist/components/DataGrid/columns/DateTimeColumn.js +1 -1
- package/dist/components/DataGrid/columns/DateTimeColumn.js.map +1 -1
- package/dist/components/DataGrid/components/ReorderColumnsButton.d.ts +10 -0
- package/dist/components/DataGrid/components/ReorderColumnsButton.d.ts.map +1 -0
- package/dist/components/DataGrid/components/ReorderColumnsButton.js +37 -0
- package/dist/components/DataGrid/components/ReorderColumnsButton.js.map +1 -0
- package/dist/components/DataGrid/components/ReorderColumnsDialog.d.ts +12 -0
- package/dist/components/DataGrid/components/ReorderColumnsDialog.d.ts.map +1 -0
- package/dist/components/DataGrid/components/ReorderColumnsDialog.js +93 -0
- package/dist/components/DataGrid/components/ReorderColumnsDialog.js.map +1 -0
- package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.d.ts +3 -0
- package/dist/components/DataGrid/utils/applyModelChange.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.js +5 -0
- package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
- package/dist/components/DataGrid/utils/computeDefaultColumnOrder.d.ts +8 -0
- package/dist/components/DataGrid/utils/computeDefaultColumnOrder.d.ts.map +1 -0
- package/dist/components/DataGrid/utils/computeDefaultColumnOrder.js +14 -0
- package/dist/components/DataGrid/utils/computeDefaultColumnOrder.js.map +1 -0
- package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js +1 -1
- package/dist/components/EntityFinder/details/view/DetailsView.d.ts.map +1 -1
- package/dist/components/EntityFinder/details/view/DetailsView.js +119 -122
- package/dist/components/EntityFinder/details/view/DetailsView.js.map +1 -1
- package/dist/components/EntityFinder/details/view/table/AddToDownloadListCell.d.ts +5 -1
- package/dist/components/EntityFinder/details/view/table/AddToDownloadListCell.d.ts.map +1 -1
- package/dist/components/EntityFinder/details/view/table/AddToDownloadListCell.js +7 -7
- package/dist/components/EntityFinder/details/view/table/AddToDownloadListCell.js.map +1 -1
- package/dist/components/EntityLink.d.ts +2 -0
- package/dist/components/EntityLink.d.ts.map +1 -1
- package/dist/components/EntityLink.js +15 -11
- package/dist/components/EntityLink.js.map +1 -1
- package/dist/components/EntitySidebar/AccessAndPermissions.css +1 -0
- package/dist/components/EntitySidebar/AccessAndPermissions.d.ts +7 -0
- package/dist/components/EntitySidebar/AccessAndPermissions.d.ts.map +1 -0
- package/dist/components/EntitySidebar/AccessAndPermissions.js +75 -0
- package/dist/components/EntitySidebar/AccessAndPermissions.js.map +1 -0
- package/dist/components/EntitySidebar/AccessAndPermissions.module.js +15 -0
- package/dist/components/EntitySidebar/AccessAndPermissions.module.js.map +1 -0
- package/dist/components/EntitySidebar/AccessAndPermissions.module.scss +58 -0
- package/dist/components/EntitySidebar/EntitySidebar.css +1 -1
- package/dist/components/EntitySidebar/EntitySidebar.d.ts.map +1 -1
- package/dist/components/EntitySidebar/EntitySidebar.js +54 -42
- package/dist/components/EntitySidebar/EntitySidebar.js.map +1 -1
- package/dist/components/EntitySidebar/EntitySidebar.module.js +10 -11
- package/dist/components/EntitySidebar/EntitySidebar.module.js.map +1 -1
- package/dist/components/EntitySidebar/EntitySidebar.module.scss +6 -13
- package/dist/components/EntityTreeTable/EntityTreeTable.css +1 -1
- package/dist/components/EntityTreeTable/EntityTreeTable.module.js +1 -1
- package/dist/components/EntityTreeTable/EntityTreeTable.module.js.map +1 -1
- package/dist/components/EntityTreeTable/EntityTreeTable.module.scss +18 -0
- package/dist/components/EntityTreeTable/components/ColumnHeaders.d.ts.map +1 -1
- package/dist/components/EntityTreeTable/components/ColumnHeaders.js +20 -7
- package/dist/components/EntityTreeTable/components/ColumnHeaders.js.map +1 -1
- package/dist/components/EntityTreeTable/components/EntityNameCell.d.ts.map +1 -1
- package/dist/components/EntityTreeTable/components/EntityNameCell.js +3 -1
- package/dist/components/EntityTreeTable/components/EntityNameCell.js.map +1 -1
- package/dist/components/EntityTreeTable/components/EntityTreeTableView.d.ts.map +1 -1
- package/dist/components/EntityTreeTable/components/EntityTreeTableView.js +4 -1
- package/dist/components/EntityTreeTable/components/EntityTreeTableView.js.map +1 -1
- package/dist/components/EntityTreeTable/components/IdColumnHeader.d.ts.map +1 -1
- package/dist/components/EntityTreeTable/components/IdColumnHeader.js +3 -1
- package/dist/components/EntityTreeTable/components/IdColumnHeader.js.map +1 -1
- package/dist/components/EntityTreeTable/hooks/useTableColumns.d.ts.map +1 -1
- package/dist/components/EntityTreeTable/hooks/useTableColumns.js +24 -19
- package/dist/components/EntityTreeTable/hooks/useTableColumns.js.map +1 -1
- package/dist/components/FilePreview/PdfPreview.d.ts.map +1 -1
- package/dist/components/FilePreview/PdfPreview.js +23 -20
- package/dist/components/FilePreview/PdfPreview.js.map +1 -1
- package/dist/components/Forum/DiscussionEmpty.css +1 -1
- package/dist/components/Forum/DiscussionEmpty.module.js +4 -4
- package/dist/components/Forum/DiscussionEmpty.module.js.map +1 -1
- package/dist/components/Forum/DiscussionEmpty.module.scss +3 -6
- package/dist/components/GenericCard/SynapseCardLabel.d.ts.map +1 -1
- package/dist/components/GenericCard/SynapseCardLabel.js +100 -99
- package/dist/components/GenericCard/SynapseCardLabel.js.map +1 -1
- package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPicker.css +1 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPicker.d.ts +29 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPicker.d.ts.map +1 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPicker.js +229 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPicker.js.map +1 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPicker.module.js +9 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPicker.module.js.map +1 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPicker.module.scss +19 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPickerModal.d.ts +23 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPickerModal.d.ts.map +1 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPickerModal.js +39 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaPickerModal.js.map +1 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaVersionSelectionContext.d.ts +14 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaVersionSelectionContext.d.ts.map +1 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaVersionSelectionContext.js +12 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/JsonSchemaVersionSelectionContext.js.map +1 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/VersionSelectionType.d.ts +17 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/VersionSelectionType.d.ts.map +1 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/VersionSelectionType.js +8 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/VersionSelectionType.js.map +1 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/index.d.ts +6 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/index.d.ts.map +1 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/index.js +4 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/useJsonSchemaOrganizations.d.ts +20 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/useJsonSchemaOrganizations.d.ts.map +1 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/useJsonSchemaOrganizations.js +25 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/useJsonSchemaOrganizations.js.map +1 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/useJsonSchemaSelection.d.ts +35 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/useJsonSchemaSelection.d.ts.map +1 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/useJsonSchemaSelection.js +60 -0
- package/dist/components/JsonSchema/JsonSchemaPicker/useJsonSchemaSelection.js.map +1 -0
- package/dist/components/ProjectInfo/ProjectInfo.css +1 -1
- package/dist/components/ProjectInfo/ProjectInfo.module.js +5 -5
- package/dist/components/ProjectInfo/ProjectInfo.module.js.map +1 -1
- package/dist/components/ProjectInfo/ProjectInfo.module.scss +2 -4
- package/dist/components/ProjectInfo/ProjectInfoPopover.d.ts.map +1 -1
- package/dist/components/ProjectInfo/ProjectInfoPopover.js +17 -16
- package/dist/components/ProjectInfo/ProjectInfoPopover.js.map +1 -1
- package/dist/components/ProjectStorage/ProjectDataAvailability.d.ts.map +1 -1
- package/dist/components/ProjectStorage/ProjectDataAvailability.js +16 -16
- package/dist/components/ProjectStorage/ProjectDataAvailability.js.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceGraph.d.ts.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceGraph.js +95 -95
- package/dist/components/ProvenanceGraph/ProvenanceGraph.js.map +1 -1
- package/dist/components/SchemaDrivenAnnotationEditor/SchemaDrivenAnnotationEditor.js +2 -2
- package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.d.ts.map +1 -1
- package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js +120 -92
- package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js.map +1 -1
- package/dist/components/StorybookComponentWrapper.d.ts.map +1 -1
- package/dist/components/StorybookComponentWrapper.js +1 -3
- package/dist/components/StorybookComponentWrapper.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChat.d.ts.map +1 -1
- package/dist/components/SynapseChat/SynapseChat.js +40 -40
- package/dist/components/SynapseChat/SynapseChat.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChatInteraction.d.ts +3 -2
- package/dist/components/SynapseChat/SynapseChatInteraction.d.ts.map +1 -1
- package/dist/components/SynapseChat/SynapseChatInteraction.js.map +1 -1
- package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.css +1 -1
- package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.d.ts.map +1 -1
- package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.js +0 -7
- package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.js.map +1 -1
- package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.module.js +2 -2
- package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.module.js.map +1 -1
- package/dist/components/SynapseChat/components/AttachmentChip/AttachmentChip.module.scss +12 -2
- package/dist/components/SynapseChat/components/ChatAttachmentStrip/ChatAttachmentStrip.css +1 -1
- package/dist/components/SynapseChat/components/ChatAttachmentStrip/ChatAttachmentStrip.module.js +3 -3
- package/dist/components/SynapseChat/components/ChatAttachmentStrip/ChatAttachmentStrip.module.js.map +1 -1
- package/dist/components/SynapseChat/components/ChatAttachmentStrip/ChatAttachmentStrip.module.scss +5 -1
- package/dist/components/TanStackTable/ColumnHeader.d.ts +7 -0
- package/dist/components/TanStackTable/ColumnHeader.d.ts.map +1 -1
- package/dist/components/TanStackTable/ColumnHeader.js +10 -9
- package/dist/components/TanStackTable/ColumnHeader.js.map +1 -1
- package/dist/components/TanStackTable/StyledVirtualTanStackTable.d.ts +8 -0
- package/dist/components/TanStackTable/StyledVirtualTanStackTable.d.ts.map +1 -1
- package/dist/components/TanStackTable/StyledVirtualTanStackTable.js +31 -22
- package/dist/components/TanStackTable/StyledVirtualTanStackTable.js.map +1 -1
- package/dist/components/TanStackTable/useFetchNextPageOnScrollToBottom.d.ts +21 -0
- package/dist/components/TanStackTable/useFetchNextPageOnScrollToBottom.d.ts.map +1 -0
- package/dist/components/TanStackTable/useFetchNextPageOnScrollToBottom.js +22 -0
- package/dist/components/TanStackTable/useFetchNextPageOnScrollToBottom.js.map +1 -0
- package/dist/components/dataaccess/AccessRequirementDashboard.d.ts.map +1 -1
- package/dist/components/dataaccess/AccessRequirementDashboard.js +55 -55
- package/dist/components/dataaccess/AccessRequirementDashboard.js.map +1 -1
- package/dist/components/dataaccess/EDucTemplateTable.d.ts +3 -0
- package/dist/components/dataaccess/EDucTemplateTable.d.ts.map +1 -0
- package/dist/components/dataaccess/EDucTemplateTable.js +213 -0
- package/dist/components/dataaccess/EDucTemplateTable.js.map +1 -0
- package/dist/components/dataaccess/ReviewerDashboard.d.ts.map +1 -1
- package/dist/components/dataaccess/ReviewerDashboard.js +44 -34
- package/dist/components/dataaccess/ReviewerDashboard.js.map +1 -1
- package/dist/components/entity/metadata/AnnotationsTable.js +2 -2
- package/dist/components/entity/metadata/AnnotationsTable.js.map +1 -1
- package/dist/components/entity/page/breadcrumbs/EntityPageBreadcrumbs.d.ts.map +1 -1
- package/dist/components/entity/page/breadcrumbs/EntityPageBreadcrumbs.js +8 -8
- package/dist/components/entity/page/breadcrumbs/EntityPageBreadcrumbs.js.map +1 -1
- package/dist/components/entity/page/title_bar/EntityPageTitleBar.d.ts +0 -1
- package/dist/components/entity/page/title_bar/EntityPageTitleBar.d.ts.map +1 -1
- package/dist/components/entity/page/title_bar/EntityPageTitleBar.js +22 -22
- package/dist/components/entity/page/title_bar/EntityPageTitleBar.js.map +1 -1
- package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.d.ts.map +1 -1
- package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.js +62 -68
- package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.js.map +1 -1
- package/dist/components/styled/StyledTableContainer.d.ts +1 -0
- package/dist/components/styled/StyledTableContainer.d.ts.map +1 -1
- package/dist/components/styled/StyledTableContainer.js +3 -3
- package/dist/components/styled/StyledTableContainer.js.map +1 -1
- package/dist/components/widgets/facet-nav/FacetNavPanel.d.ts +2 -0
- package/dist/components/widgets/facet-nav/FacetNavPanel.d.ts.map +1 -1
- package/dist/components/widgets/facet-nav/FacetNavPanel.js +35 -40
- package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
- package/dist/mocks/eDuc/mockEDucTemplates.d.ts +7 -0
- package/dist/mocks/eDuc/mockEDucTemplates.d.ts.map +1 -0
- package/dist/mocks/eDuc/mockEDucTemplates.js +18 -0
- package/dist/mocks/eDuc/mockEDucTemplates.js.map +1 -0
- package/dist/mocks/jsonschema/mockJsonSchemaListing.d.ts +31 -0
- package/dist/mocks/jsonschema/mockJsonSchemaListing.d.ts.map +1 -0
- package/dist/mocks/jsonschema/mockJsonSchemaListing.js +101 -0
- package/dist/mocks/jsonschema/mockJsonSchemaListing.js.map +1 -0
- package/dist/mocks/msw/handlers/dataAccessRequestHandlers.d.ts.map +1 -1
- package/dist/mocks/msw/handlers/dataAccessRequestHandlers.js +48 -23
- package/dist/mocks/msw/handlers/dataAccessRequestHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/eDucTemplateHandlers.d.ts +2 -0
- package/dist/mocks/msw/handlers/eDucTemplateHandlers.d.ts.map +1 -0
- package/dist/mocks/msw/handlers/eDucTemplateHandlers.js +14 -0
- package/dist/mocks/msw/handlers/eDucTemplateHandlers.js.map +1 -0
- package/dist/mocks/msw/handlers/jsonSchemaListingHandlers.d.ts +8 -0
- package/dist/mocks/msw/handlers/jsonSchemaListingHandlers.d.ts.map +1 -0
- package/dist/mocks/msw/handlers/jsonSchemaListingHandlers.js +30 -0
- package/dist/mocks/msw/handlers/jsonSchemaListingHandlers.js.map +1 -0
- package/dist/mocks/msw/handlers.d.ts.map +1 -1
- package/dist/mocks/msw/handlers.js +55 -51
- package/dist/mocks/msw/handlers.js.map +1 -1
- package/dist/style/abstracts/_cssVariables.scss +13 -0
- package/dist/style/components/entity_finder/_details-view.scss +0 -10
- package/dist/style/components/facet_nav/_facet-nav-panel.scss +0 -6
- package/dist/style/main.css +1 -1
- package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
- package/dist/synapse-client/SynapseClient.js +2 -6
- package/dist/synapse-client/SynapseClient.js.map +1 -1
- package/dist/synapse-queries/KeyFactory.d.ts +3 -0
- package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
- package/dist/synapse-queries/KeyFactory.js +9 -0
- package/dist/synapse-queries/KeyFactory.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useEDuc.d.ts +3 -3
- package/dist/synapse-queries/dataaccess/useEDuc.d.ts.map +1 -1
- package/dist/synapse-queries/dataaccess/useEDuc.js +40 -35
- package/dist/synapse-queries/dataaccess/useEDuc.js.map +1 -1
- package/dist/synapse-queries/entity/index.d.ts +0 -2
- package/dist/synapse-queries/entity/index.d.ts.map +1 -1
- package/dist/synapse-queries/entity/index.js +8 -10
- package/dist/synapse-queries/index.d.ts +1 -0
- package/dist/synapse-queries/index.d.ts.map +1 -1
- package/dist/synapse-queries/index.js +136 -128
- package/dist/synapse-queries/index.js.map +1 -1
- package/dist/synapse-queries/jsonschema/index.d.ts +6 -0
- package/dist/synapse-queries/jsonschema/index.d.ts.map +1 -0
- package/dist/synapse-queries/jsonschema/index.js +6 -0
- package/dist/synapse-queries/jsonschema/useEntityBoundSchema.d.ts.map +1 -0
- package/dist/synapse-queries/{entity → jsonschema}/useEntityBoundSchema.js +1 -1
- package/dist/synapse-queries/jsonschema/useEntityBoundSchema.js.map +1 -0
- package/dist/synapse-queries/jsonschema/useListJsonSchemaVersions.d.ts +26 -0
- package/dist/synapse-queries/jsonschema/useListJsonSchemaVersions.d.ts.map +1 -0
- package/dist/synapse-queries/jsonschema/useListJsonSchemaVersions.js +36 -0
- package/dist/synapse-queries/jsonschema/useListJsonSchemaVersions.js.map +1 -0
- package/dist/synapse-queries/jsonschema/useListJsonSchemasInfinite.d.ts +8 -0
- package/dist/synapse-queries/jsonschema/useListJsonSchemasInfinite.d.ts.map +1 -0
- package/dist/synapse-queries/jsonschema/useListJsonSchemasInfinite.js +21 -0
- package/dist/synapse-queries/jsonschema/useListJsonSchemasInfinite.js.map +1 -0
- package/dist/synapse-queries/jsonschema/useListOrganizations.d.ts +8 -0
- package/dist/synapse-queries/jsonschema/useListOrganizations.d.ts.map +1 -0
- package/dist/synapse-queries/jsonschema/useListOrganizations.js +22 -0
- package/dist/synapse-queries/jsonschema/useListOrganizations.js.map +1 -0
- package/dist/synapse-queries/jsonschema/useSchema.d.ts.map +1 -0
- package/dist/synapse-queries/{entity → jsonschema}/useSchema.js +1 -1
- package/dist/synapse-queries/jsonschema/useSchema.js.map +1 -0
- package/dist/testutils/VirtualizedTableTestUtils.js +17 -0
- package/dist/testutils/VirtualizedTableTestUtils.js.map +1 -0
- package/dist/theme/palette/Palettes.d.ts.map +1 -1
- package/dist/theme/palette/Palettes.js +13 -0
- package/dist/theme/palette/Palettes.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/APIConstants.d.ts +6 -0
- package/dist/utils/APIConstants.d.ts.map +1 -1
- package/dist/utils/APIConstants.js +2 -2
- package/dist/utils/APIConstants.js.map +1 -1
- package/dist/utils/hooks/useFetchBlobUrl.d.ts +9 -0
- package/dist/utils/hooks/useFetchBlobUrl.d.ts.map +1 -0
- package/dist/utils/hooks/useFetchBlobUrl.js +19 -0
- package/dist/utils/hooks/useFetchBlobUrl.js.map +1 -0
- package/package.json +3 -3
- package/dist/synapse-queries/entity/useEntityBoundSchema.d.ts.map +0 -1
- package/dist/synapse-queries/entity/useEntityBoundSchema.js.map +0 -1
- package/dist/synapse-queries/entity/useSchema.d.ts.map +0 -1
- package/dist/synapse-queries/entity/useSchema.js.map +0 -1
- /package/dist/synapse-queries/{entity → jsonschema}/useEntityBoundSchema.d.ts +0 -0
- /package/dist/synapse-queries/{entity → jsonschema}/useSchema.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DetailsView.js","names":[],"sources":["../../../../../src/components/EntityFinder/details/view/DetailsView.tsx"],"sourcesContent":["import { getEntityVersions } from '@/synapse-client/SynapseClient'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n getEntityTypeFromHeader,\n isContainerType,\n isTableType,\n isVersionableEntityType,\n} from '@/utils/functions/EntityTypeUtils'\nimport { TABLE_VERSION_IN_PROGRESS } from '@/utils/SynapseConstants'\nimport { Checkbox, Tooltip } from '@mui/material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport {\n EntityChildrenRequest,\n EntityHeader,\n Reference,\n} from '@sage-bionetworks/synapse-types'\nimport { useQueryClient } from '@tanstack/react-query'\nimport {\n CellContext,\n createColumnHelper,\n getCoreRowModel,\n OnChangeFn,\n SortingState,\n Table,\n useReactTable,\n} from '@tanstack/react-table'\nimport { useVirtualizer } from '@tanstack/react-virtual'\nimport {\n ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport {\n BlockingLoader,\n SynapseSpinner,\n} from '../../../LoadingScreen/LoadingScreen'\nimport ColumnHeader from '../../../TanStackTable/ColumnHeader'\nimport StyledVirtualTanStackTable from '../../../TanStackTable/StyledVirtualTanStackTable'\nimport { EntityFinderHeader } from '../../EntityFinderHeader'\nimport { EntitySelectionMapType } from '../../useEntitySelection'\nimport { VersionSelectionType } from '../../VersionSelectionType'\nimport { EntityDetailsListSharedProps } from '../EntityDetailsList'\nimport { AddFileToDownloadListCell } from './table/AddToDownloadListCell'\nimport { CreatedOnCell } from './table/CreatedOnCell'\nimport { EntityBadgeIconsCell } from './table/EntityBadgeIconsCell'\nimport { EntityFinderCheckboxCell } from './table/EntityFinderCheckboxCell'\nimport { EntityFinderVersionCell } from './table/EntityFinderVersionCell'\nimport { EntityTypeCell } from './table/EntityTypeCell'\nimport { FileEntityDirectDownloadCell } from './table/FileEntityDirectDownloadCell'\nimport { FileEntityMD5Cell } from './table/FileEntityMD5Cell'\nimport { FileEntitySizeCell } from './table/FileEntitySizeCell'\nimport { ModifiedByCell } from './table/ModifiedByCell'\nimport { ModifiedOnCell } from './table/ModifiedOnCell'\nimport { VersionColumnHeader } from './VersionColumnHeader'\n\n/**\n * Check if a table type entity has the \"in progress\" version label.\n */\nfunction hasInProgressTableVersion(\n entityType: EntityType,\n header: EntityFinderHeader | EntityFinderTableViewRowData,\n): boolean {\n return (\n isTableType(entityType) &&\n 'versionLabel' in header &&\n header.versionLabel === TABLE_VERSION_IN_PROGRESS\n )\n}\n\n/**\n * Set of all columns that can be shown in the DetailsView\n * Note: Some of these values are used as accessors, so ensure that those columns match the accessor key in the row data\n */\nexport enum DetailsViewColumn {\n NAME = 'name',\n ENTITY_TYPE = 'entityType',\n ID = 'id',\n CREATED_ON = 'createdOn',\n MODIFIED_ON = 'modifiedOn',\n MODIFIED_BY = 'modifiedBy',\n ADD_TO_DOWNLOAD_CART = 'addToDownloadCart',\n DIRECT_DOWNLOAD = 'directDownload',\n SELECTED = 'selected',\n VERSION = 'version',\n SIZE = 'size',\n MD5 = 'md5',\n BADGES = 'badges',\n}\n\nexport type DetailsViewProps = EntityDetailsListSharedProps & {\n entities: EntityFinderHeader[]\n isLoading: boolean\n hasNextPage?: boolean\n fetchNextPage?: () => Promise<unknown>\n isFetchingNextPage?: boolean\n enableSorting?: boolean\n enableMultiSort?: boolean\n sortableColumns?: DetailsViewColumn[]\n /** The current sort of the view. */\n sorting?: SortingState\n /** If enableSorting is true, `setSort` will be invoked when the user tries to change the sort */\n onSortingChange?: OnChangeFn<SortingState>\n noResultsPlaceholder?: ReactNode\n /** We defer to the configuration component to determine this */\n selectAllIsChecked?: boolean\n /** This request object is only used to tell react-query to cancel fetching all children at once. */\n getChildrenInfiniteRequestObject?: EntityChildrenRequest\n /** The total number of entities that can be retrieved */\n totalEntities?: number\n}\n\n/**\n * Describes the shape of the data passed to the BaseTable\n */\nexport type EntityFinderTableViewRowData = EntityFinderHeader & {\n entityId: string\n versionNumber?: number\n entityType: EntityType\n isSelected: boolean\n isDisabled: boolean\n isVersionableEntity: boolean\n currentSelectedVersion?: number\n}\n\nconst columnHelper = createColumnHelper<EntityFinderTableViewRowData>()\n\nfunction NameRenderer(props: {\n context: CellContext<EntityFinderTableViewRowData, string>\n setCurrentContainer?: (containerId: string) => void\n}) {\n const { context, setCurrentContainer } = props\n const { row, getValue } = context\n const rowName = getValue()\n if (setCurrentContainer && isContainerType(row.original.entityType)) {\n return (\n <span\n role=\"link\"\n className=\"EntityFinderTableCellContainerLink\"\n onClick={e => {\n e.stopPropagation()\n setCurrentContainer(row.original.id)\n }}\n >\n <Tooltip title={rowName}>\n <span className=\"nameColumnCell\">{rowName}</span>\n </Tooltip>\n </span>\n )\n } else {\n return (\n <Tooltip title={rowName}>\n <span className=\"nameColumnCell\">{rowName}</span>\n </Tooltip>\n )\n }\n}\n\nfunction SelectAllCheckboxRenderer(props: {\n isVisible: boolean\n disabled: boolean\n checked: boolean\n onSelectAll: () => void\n}) {\n const { isVisible, disabled, checked, onSelectAll } = props\n if (!isVisible) {\n return null\n }\n\n return (\n <Checkbox\n inputProps={{ 'aria-label': 'Select All' }}\n checked={checked}\n disabled={disabled}\n onChange={() => {\n onSelectAll()\n }}\n />\n )\n}\n\nfunction getColumns(opts: {\n setCurrentContainer?: (containerId: string) => void\n isSelectAllVisible: boolean\n isSelectAllDisabled: boolean\n isSelectAllChecked: boolean\n onSelectAll: () => void\n versionSelection: VersionSelectionType\n toggleSelection: (entity: Reference | Reference[]) => void\n setInitialVersion: (entityId: string, version: number) => void\n sortableColumns?: DetailsViewColumn[]\n}) {\n const {\n setCurrentContainer,\n isSelectAllVisible,\n isSelectAllDisabled,\n isSelectAllChecked,\n onSelectAll,\n versionSelection,\n toggleSelection,\n setInitialVersion,\n sortableColumns = [],\n } = opts\n return [\n columnHelper.display({\n id: DetailsViewColumn.SELECTED,\n minSize: 50,\n maxSize: 50,\n size: 50,\n header: () => (\n <SelectAllCheckboxRenderer\n isVisible={isSelectAllVisible}\n disabled={isSelectAllDisabled}\n checked={isSelectAllChecked}\n onSelectAll={onSelectAll}\n />\n ),\n cell: EntityFinderCheckboxCell,\n }),\n\n columnHelper.accessor(DetailsViewColumn.ENTITY_TYPE, {\n minSize: 45,\n maxSize: 45,\n size: 45,\n header: () => null,\n enableResizing: false,\n cell: EntityTypeCell,\n meta: {\n textAlign: 'center',\n },\n }),\n columnHelper.accessor(DetailsViewColumn.NAME, {\n size: 300,\n enableSorting: sortableColumns.includes(DetailsViewColumn.NAME),\n // sortable: sort != null,\n // resizable: true,\n header: props => <ColumnHeader {...props} title={'Name'} />,\n cell: context => (\n <NameRenderer\n context={context}\n setCurrentContainer={setCurrentContainer}\n />\n ),\n enableColumnFilter: false,\n }),\n columnHelper.display({\n id: DetailsViewColumn.BADGES,\n minSize: 75,\n maxSize: 75,\n size: 75,\n header: () => null,\n cell: EntityBadgeIconsCell,\n }),\n columnHelper.accessor(DetailsViewColumn.ID, {\n size: 130,\n header: props => <ColumnHeader {...props} title={'ID'} />,\n minSize: 130,\n enableColumnFilter: false,\n enableSorting: sortableColumns.includes(DetailsViewColumn.ID),\n }),\n columnHelper.display({\n id: DetailsViewColumn.VERSION,\n minSize: 150,\n size: 200,\n header: () => <VersionColumnHeader versionSelection={versionSelection} />,\n cell: context => (\n <EntityFinderVersionCell\n versionSelection={versionSelection}\n toggleSelection={toggleSelection}\n setInitialVersion={setInitialVersion}\n context={context}\n />\n ),\n }),\n columnHelper.accessor(DetailsViewColumn.CREATED_ON, {\n header: props => <ColumnHeader {...props} title={'Created On'} />,\n size: 220,\n minSize: 170,\n cell: CreatedOnCell,\n enableColumnFilter: false,\n enableSorting: sortableColumns.includes(DetailsViewColumn.CREATED_ON),\n }),\n columnHelper.accessor(DetailsViewColumn.MODIFIED_ON, {\n header: props => <ColumnHeader {...props} title={'Modified On'} />,\n size: 220,\n minSize: 170,\n enableColumnFilter: false,\n cell: ModifiedOnCell,\n enableSorting: sortableColumns.includes(DetailsViewColumn.MODIFIED_ON),\n }),\n columnHelper.accessor(DetailsViewColumn.MODIFIED_BY, {\n header: props => <ColumnHeader {...props} title={'Modified By'} />,\n size: 250,\n enableResizing: true,\n cell: ModifiedByCell,\n enableColumnFilter: false,\n enableSorting: sortableColumns.includes(DetailsViewColumn.MODIFIED_BY),\n }),\n columnHelper.display({\n id: DetailsViewColumn.SIZE,\n header: props => <ColumnHeader {...props} title={'Size'} />,\n size: 120,\n minSize: 85,\n enableSorting: false,\n enableResizing: true,\n cell: FileEntitySizeCell,\n }),\n columnHelper.display({\n id: DetailsViewColumn.MD5,\n header: props => <ColumnHeader {...props} title={'MD5'} />,\n size: 200,\n enableSorting: false,\n enableResizing: true,\n cell: FileEntityMD5Cell,\n }),\n columnHelper.display({\n id: DetailsViewColumn.ADD_TO_DOWNLOAD_CART,\n header: () => null,\n size: 45,\n minSize: 45,\n enableSorting: false,\n enableResizing: false,\n cell: AddFileToDownloadListCell,\n }),\n columnHelper.display({\n id: DetailsViewColumn.DIRECT_DOWNLOAD,\n header: props => <ColumnHeader {...props} title={'Actions'} />,\n size: 75,\n minSize: 75,\n enableSorting: false,\n enableResizing: false,\n cell: FileEntityDirectDownloadCell,\n }),\n ]\n}\n\ntype DetailsViewRowAppearance = 'hidden' | 'disabled' | 'selected' | 'default'\n\nconst determineRowAppearance = (args: {\n visibleTypes: EntityType[]\n selectableTypes: EntityType[]\n selected: EntitySelectionMapType\n entity: EntityFinderHeader\n}): DetailsViewRowAppearance => {\n const { visibleTypes, selectableTypes, selected, entity } = args\n if (!visibleTypes.includes(getEntityTypeFromHeader(entity))) {\n return 'hidden'\n } else if (!selectableTypes.includes(getEntityTypeFromHeader(entity))) {\n return 'disabled'\n } else if (selected.has(entity.id)) {\n return 'selected'\n } else {\n return 'default'\n }\n}\n\nconst DEFAULT_HIDDEN_COLUMNS = [DetailsViewColumn.DIRECT_DOWNLOAD]\n\n/**\n * Displays a list of entities in a table.\n *\n * If the list of entities is paginated, the `hasNextPage` prop can be set to indicate that there is more data to load.\n * When the view is ready to load more data, the `fetchNextPage` callback will be invoked. The view is designed to handle\n * an \"infinite scroll\" pattern, so entities should not be removed from the list when loading the next page.\n */\nexport function DetailsView(props: DetailsViewProps) {\n const {\n entities,\n isLoading,\n hasNextPage,\n fetchNextPage,\n isFetchingNextPage,\n versionSelection,\n selectColumnType,\n selected,\n visibleTypes,\n selectableTypes,\n toggleSelection,\n setInitialVersion,\n enableSorting,\n enableMultiSort,\n sortableColumns,\n sorting,\n onSortingChange,\n noResultsPlaceholder,\n enableSelectAll,\n selectAllIsChecked = false,\n getChildrenInfiniteRequestObject,\n totalEntities,\n setCurrentContainer,\n hiddenColumns = DEFAULT_HIDDEN_COLUMNS,\n } = props\n const queryClient = useQueryClient()\n\n const { accessToken, keyFactory: queryClientKeyFactory } = useSynapseContext()\n\n const showSelectColumn = selectColumnType !== 'none'\n\n const [shouldSelectAll, setShouldSelectAll] = useState(false)\n const [showLoadingScreen, setShowLoadingScreen] = useState(false)\n\n const cancelQuery = () => {\n // It's likely that the user will be throttled by the Synapse backend and may be waiting a\n // noticeable amount of time for the current request, so cancel it (in addition to cancelling future requests)\n void queryClient.cancelQueries({\n queryKey: queryClientKeyFactory.getEntityChildrenQueryKey(\n getChildrenInfiniteRequestObject!,\n true,\n ),\n })\n setShowLoadingScreen(false)\n setShouldSelectAll(false)\n }\n\n useEffect(() => {\n async function handleSelectAll() {\n if (shouldSelectAll) {\n if (hasNextPage && fetchNextPage) {\n // Show the loading screen since we must fetch data (potentially a lot) to finish the task\n setShowLoadingScreen(true)\n if (!isFetchingNextPage) {\n void fetchNextPage()\n // The effect will re-run after fetch completes, and the next page (if it exists) will be fetched.\n }\n } else {\n if (selectAllIsChecked) {\n // All the items are selected, so we will deselect all\n toggleSelection(\n entities\n .filter(e => {\n // Collect just entities that are selected\n // An entity may be in the list and unselected because it isn't of a selectable type\n return selected.has(e.id)\n })\n .map(e => selected.get(e.id)!),\n )\n } else {\n // Not all the items are selected, so we will select all\n toggleSelection(\n await Promise.all(\n entities\n .filter(e => {\n // must filter just selectable types or else any entities of unselectable types will get selected\n const type = getEntityTypeFromHeader(e)\n // also exclude already-selected entities, since we don't want to toggle those\n return (\n !selected.has(e.id) &&\n selectableTypes.includes(type) &&\n visibleTypes.includes(type)\n )\n })\n .map(async e => {\n let latestVersion: number | undefined\n const entityType = getEntityTypeFromHeader(e)\n if (\n versionSelection === VersionSelectionType.REQUIRED &&\n isVersionableEntityType(entityType)\n ) {\n // If VersionSelectionType.REQUIRED, then we need to supply a version with the entity.\n // We may already have the version from the header, but only use it if it's a valid snapshot\n // (table types with \"in progress\" are not valid)\n if (\n Object.prototype.hasOwnProperty.call(\n e,\n 'versionNumber',\n ) &&\n !hasInProgressTableVersion(\n entityType,\n e as EntityHeader,\n )\n ) {\n latestVersion = (e as EntityHeader).versionNumber\n }\n if (!latestVersion) {\n // Failsafe if we didn't get the version in the header. This is rare/unlikely, since the only cases we're sure we don't get versions are:\n // - ProjectHeaders (which are versionless)\n // - Search Results (for which we don't support Select All)\n // - Table types, whose entity headers report the \"in progress\" version rather than the latest stable snapshot\n // For large lists, there's a good chance for this to trigger throttling.\n\n // Show the loading screen since we must fetch data (potentially a lot) to finish the task\n setShowLoadingScreen(true)\n\n const versionsQueryOffset = 0\n const versionsQueryLimit = 1\n const versions = await queryClient.fetchQuery({\n queryKey:\n queryClientKeyFactory.getPaginatedEntityVersionsQueryKey(\n e.id,\n versionsQueryLimit,\n versionsQueryOffset,\n ),\n queryFn: () =>\n getEntityVersions(\n e.id,\n accessToken,\n versionsQueryOffset,\n versionsQueryLimit,\n ),\n })\n // we pick the first version in the list because it is the most recent\n latestVersion = versions.results[0]?.versionNumber\n }\n }\n return {\n targetId: e.id,\n targetVersionNumber: latestVersion,\n }\n }),\n ),\n )\n }\n setShouldSelectAll(false)\n setShowLoadingScreen(false)\n }\n }\n }\n handleSelectAll()\n }, [\n accessToken,\n entities,\n fetchNextPage,\n hasNextPage,\n versionSelection,\n queryClient,\n isFetchingNextPage,\n selectAllIsChecked,\n selectableTypes,\n selected,\n shouldSelectAll,\n toggleSelection,\n visibleTypes,\n queryClientKeyFactory,\n ])\n\n const tableData = useMemo(\n () =>\n entities.reduce((entities: EntityFinderTableViewRowData[], entity) => {\n const appearance = determineRowAppearance({\n visibleTypes,\n selectableTypes,\n selected,\n entity,\n })\n if (appearance !== 'hidden') {\n // only include entities that should not be hidden\n const entityType = getEntityTypeFromHeader(entity)\n\n const currentSelectedVersion = selected.get(\n entity.id,\n )?.targetVersionNumber\n let versionNumber: number | undefined = undefined\n if ('versionNumber' in entity) {\n if (currentSelectedVersion != null) {\n // if a version is selected, the row should show that version's data\n versionNumber = currentSelectedVersion\n } else if (versionSelection === VersionSelectionType.REQUIRED) {\n // if a version is not selected, but version selection is required, the row should show the latest version's data\n // Only use EntityHeader's version if it's a valid snapshot (table types with \"in progress\" are not valid)\n if (!hasInProgressTableVersion(entityType, entity)) {\n versionNumber = entity.versionNumber\n }\n }\n // otherwise, show the current version's data (versionNumber is undefined)\n }\n\n entities.push({\n ...entity,\n entityId: entity.id,\n versionNumber: versionNumber,\n entityType: entityType,\n isSelected: appearance === 'selected',\n isDisabled: appearance === 'disabled',\n isVersionableEntity: isVersionableEntityType(entityType),\n currentSelectedVersion: currentSelectedVersion,\n })\n }\n return entities\n }, []),\n [entities, selectableTypes, selected, versionSelection, visibleTypes],\n )\n\n const isSelectAllVisible = enableSelectAll\n\n // Enabled if there's at least one visible & selectable entity, OR there's a page we haven't fetched\n const isSelectAllDisabled = !(\n hasNextPage ||\n entities.filter(\n e =>\n selectableTypes.includes(getEntityTypeFromHeader(e)) &&\n visibleTypes.includes(getEntityTypeFromHeader(e)),\n ).length > 0\n )\n\n const columns = useMemo(\n () =>\n getColumns({\n setCurrentContainer,\n isSelectAllVisible: isSelectAllVisible,\n isSelectAllDisabled: isSelectAllDisabled,\n isSelectAllChecked: selectAllIsChecked,\n onSelectAll: () => {\n setShouldSelectAll(true)\n },\n versionSelection,\n toggleSelection,\n setInitialVersion,\n sortableColumns,\n }),\n [\n isSelectAllDisabled,\n isSelectAllVisible,\n selectAllIsChecked,\n setCurrentContainer,\n setInitialVersion,\n sortableColumns,\n toggleSelection,\n versionSelection,\n ],\n )\n\n const hideColumnOverrides = useMemo(() => {\n return hiddenColumns.reduce(\n (acc: Partial<Record<DetailsViewColumn, boolean>>, column) => {\n acc[column] = false\n return acc\n },\n {},\n )\n }, [hiddenColumns])\n\n const table: Table<EntityFinderTableViewRowData> =\n useReactTable<EntityFinderTableViewRowData>({\n data: tableData,\n columns,\n getCoreRowModel: getCoreRowModel(),\n columnResizeMode: 'onChange',\n manualSorting: true,\n enableSorting,\n enableMultiSort,\n onSortingChange,\n state: {\n sorting,\n columnVisibility: {\n [DetailsViewColumn.SELECTED]: showSelectColumn,\n [DetailsViewColumn.VERSION]:\n versionSelection !== VersionSelectionType.DISALLOWED,\n [DetailsViewColumn.SIZE]: visibleTypes.includes(EntityType.file),\n [DetailsViewColumn.MD5]: visibleTypes.includes(EntityType.file),\n [DetailsViewColumn.ADD_TO_DOWNLOAD_CART]: visibleTypes.includes(\n EntityType.file,\n ),\n [DetailsViewColumn.DIRECT_DOWNLOAD]: visibleTypes.includes(\n EntityType.file,\n ),\n ...hideColumnOverrides,\n },\n },\n })\n\n const tableContainerRef = useRef<HTMLDivElement>(null)\n\n const rowVirtualizer = useVirtualizer({\n count: totalEntities ?? table.getRowModel().rows.length,\n estimateSize: () => 40, // estimate row height for accurate scrollbar dragging\n getScrollElement: () => tableContainerRef.current,\n // measure dynamic row height, except in firefox because it measures table border height incorrectly\n measureElement:\n typeof window !== 'undefined' &&\n navigator.userAgent.indexOf('Firefox') === -1\n ? element => element?.getBoundingClientRect().height\n : undefined,\n overscan: 5,\n })\n\n function onRowClick(rowData: EntityFinderTableViewRowData) {\n const { id, isDisabled, isVersionableEntity, entityType } = rowData\n let { currentSelectedVersion } = rowData\n if (!isDisabled) {\n if (\n isVersionableEntity &&\n versionSelection === VersionSelectionType.REQUIRED &&\n currentSelectedVersion == null &&\n Object.prototype.hasOwnProperty.call(rowData, 'versionNumber')\n ) {\n // Only use EntityHeader's version if it's a valid snapshot (table types with \"in progress\" are not valid)\n if (!hasInProgressTableVersion(entityType, rowData)) {\n currentSelectedVersion = rowData.versionNumber\n }\n // Note that here we aren't handling the case where the header doesn't have a version, e.g. a search result\n // That case is actually handled by the VersionRenderer, which has an effect that will toggle the selection after data is fetched.\n }\n\n toggleSelection({\n targetId: id,\n targetVersionNumber: currentSelectedVersion,\n })\n }\n }\n\n //called on scroll and possibly on mount to fetch more data as the user scrolls and reaches bottom of table\n const fetchMoreOnBottomReached = useCallback(\n (containerRefElement?: HTMLDivElement | null) => {\n if (containerRefElement) {\n const { scrollHeight, scrollTop, clientHeight } = containerRefElement\n\n //once the user has scrolled within 500px of the bottom of the table, fetch more data if we can\n if (\n scrollHeight - scrollTop - clientHeight < 500 &&\n !isFetchingNextPage &&\n hasNextPage &&\n fetchNextPage\n ) {\n void fetchNextPage()\n }\n }\n },\n [fetchNextPage, isFetchingNextPage, hasNextPage],\n )\n\n //a check on mount and after a fetch to see if the table is already scrolled to the bottom and immediately needs to fetch more data\n useEffect(() => {\n fetchMoreOnBottomReached(tableContainerRef.current)\n }, [entities, fetchMoreOnBottomReached])\n\n return (\n <div className=\"EntityFinderDetailsView\">\n <BlockingLoader\n show={showLoadingScreen}\n currentProgress={entities.length}\n totalProgress={totalEntities}\n hintText={\n totalEntities\n ? `${entities.length.toLocaleString()} of ${totalEntities?.toLocaleString()}`\n : `Fetching ${entities.length.toLocaleString()}`\n }\n headlineText={'Fetching selected items'}\n onCancel={cancelQuery}\n />\n {!isLoading && entities.length > 0 && (\n <StyledVirtualTanStackTable<EntityFinderTableViewRowData>\n styledTableContainerProps={{\n className: 'DetailsViewTable',\n ref: tableContainerRef,\n height: '100%',\n }}\n onTableContainerScroll={target =>\n fetchMoreOnBottomReached(target as HTMLDivElement)\n }\n table={table}\n rowVirtualizer={rowVirtualizer}\n slotProps={{\n Tr: ownerState => {\n const { tableRow } = ownerState\n\n return {\n className: `EntityFinderDetailsViewRow`,\n ['aria-selected']: tableRow?.original.isSelected,\n ['aria-disabled']: tableRow?.original.isDisabled,\n onClick: () => {\n if (tableRow) {\n onRowClick(tableRow.original)\n }\n },\n }\n },\n }}\n />\n )}\n {isLoading && (\n <div className=\"EntityFinderDetailsViewPlaceholder\">\n <SynapseSpinner size={30} />\n </div>\n )}\n {!isLoading && entities.length === 0 && (\n <div className=\"EntityFinderDetailsViewPlaceholder\">\n {noResultsPlaceholder || <div>Empty</div>}\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DetailsView.js","names":[],"sources":["../../../../../src/components/EntityFinder/details/view/DetailsView.tsx"],"sourcesContent":["import { getEntityVersions } from '@/synapse-client/SynapseClient'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n getEntityTypeFromHeader,\n isContainerType,\n isTableType,\n isVersionableEntityType,\n} from '@/utils/functions/EntityTypeUtils'\nimport { TABLE_VERSION_IN_PROGRESS } from '@/utils/SynapseConstants'\nimport { Checkbox, Tooltip } from '@mui/material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport {\n EntityChildrenRequest,\n EntityHeader,\n Reference,\n} from '@sage-bionetworks/synapse-types'\nimport { useQueryClient } from '@tanstack/react-query'\nimport {\n CellContext,\n createColumnHelper,\n getCoreRowModel,\n OnChangeFn,\n SortingState,\n Table,\n useReactTable,\n} from '@tanstack/react-table'\nimport { useVirtualizer } from '@tanstack/react-virtual'\nimport { ReactNode, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n BlockingLoader,\n SynapseSpinner,\n} from '../../../LoadingScreen/LoadingScreen'\nimport ColumnHeader from '../../../TanStackTable/ColumnHeader'\nimport StyledVirtualTanStackTable from '../../../TanStackTable/StyledVirtualTanStackTable'\nimport { useFetchNextPageOnScrollToBottom } from '../../../TanStackTable/useFetchNextPageOnScrollToBottom'\nimport { EntityFinderHeader } from '../../EntityFinderHeader'\nimport { EntitySelectionMapType } from '../../useEntitySelection'\nimport { VersionSelectionType } from '../../VersionSelectionType'\nimport { EntityDetailsListSharedProps } from '../EntityDetailsList'\nimport { AddFileToDownloadListCell } from './table/AddToDownloadListCell'\nimport { CreatedOnCell } from './table/CreatedOnCell'\nimport { EntityBadgeIconsCell } from './table/EntityBadgeIconsCell'\nimport { EntityFinderCheckboxCell } from './table/EntityFinderCheckboxCell'\nimport { EntityFinderVersionCell } from './table/EntityFinderVersionCell'\nimport { EntityTypeCell } from './table/EntityTypeCell'\nimport { FileEntityDirectDownloadCell } from './table/FileEntityDirectDownloadCell'\nimport { FileEntityMD5Cell } from './table/FileEntityMD5Cell'\nimport { FileEntitySizeCell } from './table/FileEntitySizeCell'\nimport { ModifiedByCell } from './table/ModifiedByCell'\nimport { ModifiedOnCell } from './table/ModifiedOnCell'\nimport { VersionColumnHeader } from './VersionColumnHeader'\n\n/**\n * Check if a table type entity has the \"in progress\" version label.\n */\nfunction hasInProgressTableVersion(\n entityType: EntityType,\n header: EntityFinderHeader | EntityFinderTableViewRowData,\n): boolean {\n return (\n isTableType(entityType) &&\n 'versionLabel' in header &&\n header.versionLabel === TABLE_VERSION_IN_PROGRESS\n )\n}\n\n/**\n * Set of all columns that can be shown in the DetailsView\n * Note: Some of these values are used as accessors, so ensure that those columns match the accessor key in the row data\n */\nexport enum DetailsViewColumn {\n NAME = 'name',\n ENTITY_TYPE = 'entityType',\n ID = 'id',\n CREATED_ON = 'createdOn',\n MODIFIED_ON = 'modifiedOn',\n MODIFIED_BY = 'modifiedBy',\n ADD_TO_DOWNLOAD_CART = 'addToDownloadCart',\n DIRECT_DOWNLOAD = 'directDownload',\n SELECTED = 'selected',\n VERSION = 'version',\n SIZE = 'size',\n MD5 = 'md5',\n BADGES = 'badges',\n}\n\nexport type DetailsViewProps = EntityDetailsListSharedProps & {\n entities: EntityFinderHeader[]\n isLoading: boolean\n hasNextPage?: boolean\n fetchNextPage?: () => Promise<unknown>\n isFetchingNextPage?: boolean\n enableSorting?: boolean\n enableMultiSort?: boolean\n sortableColumns?: DetailsViewColumn[]\n /** The current sort of the view. */\n sorting?: SortingState\n /** If enableSorting is true, `setSort` will be invoked when the user tries to change the sort */\n onSortingChange?: OnChangeFn<SortingState>\n noResultsPlaceholder?: ReactNode\n /** We defer to the configuration component to determine this */\n selectAllIsChecked?: boolean\n /** This request object is only used to tell react-query to cancel fetching all children at once. */\n getChildrenInfiniteRequestObject?: EntityChildrenRequest\n /** The total number of entities that can be retrieved */\n totalEntities?: number\n}\n\n/**\n * Describes the shape of the data passed to the BaseTable\n */\nexport type EntityFinderTableViewRowData = EntityFinderHeader & {\n entityId: string\n versionNumber?: number\n entityType: EntityType\n isSelected: boolean\n isDisabled: boolean\n isVersionableEntity: boolean\n currentSelectedVersion?: number\n}\n\nconst columnHelper = createColumnHelper<EntityFinderTableViewRowData>()\n\nfunction NameRenderer(props: {\n context: CellContext<EntityFinderTableViewRowData, string>\n setCurrentContainer?: (containerId: string) => void\n}) {\n const { context, setCurrentContainer } = props\n const { row, getValue } = context\n const rowName = getValue()\n if (setCurrentContainer && isContainerType(row.original.entityType)) {\n return (\n <span\n role=\"link\"\n className=\"EntityFinderTableCellContainerLink\"\n onClick={e => {\n e.stopPropagation()\n setCurrentContainer(row.original.id)\n }}\n >\n <Tooltip title={rowName}>\n <span className=\"nameColumnCell\">{rowName}</span>\n </Tooltip>\n </span>\n )\n } else {\n return (\n <Tooltip title={rowName}>\n <span className=\"nameColumnCell\">{rowName}</span>\n </Tooltip>\n )\n }\n}\n\nfunction SelectAllCheckboxRenderer(props: {\n isVisible: boolean\n disabled: boolean\n checked: boolean\n onSelectAll: () => void\n}) {\n const { isVisible, disabled, checked, onSelectAll } = props\n if (!isVisible) {\n return null\n }\n\n return (\n <Checkbox\n inputProps={{ 'aria-label': 'Select All' }}\n checked={checked}\n disabled={disabled}\n onChange={() => {\n onSelectAll()\n }}\n />\n )\n}\n\nfunction getColumns(opts: {\n setCurrentContainer?: (containerId: string) => void\n isSelectAllVisible: boolean\n isSelectAllDisabled: boolean\n isSelectAllChecked: boolean\n onSelectAll: () => void\n versionSelection: VersionSelectionType\n toggleSelection: (entity: Reference | Reference[]) => void\n setInitialVersion: (entityId: string, version: number) => void\n sortableColumns?: DetailsViewColumn[]\n}) {\n const {\n setCurrentContainer,\n isSelectAllVisible,\n isSelectAllDisabled,\n isSelectAllChecked,\n onSelectAll,\n versionSelection,\n toggleSelection,\n setInitialVersion,\n sortableColumns = [],\n } = opts\n return [\n columnHelper.display({\n id: DetailsViewColumn.SELECTED,\n minSize: 50,\n maxSize: 50,\n size: 50,\n header: () => (\n <SelectAllCheckboxRenderer\n isVisible={isSelectAllVisible}\n disabled={isSelectAllDisabled}\n checked={isSelectAllChecked}\n onSelectAll={onSelectAll}\n />\n ),\n cell: EntityFinderCheckboxCell,\n }),\n\n columnHelper.accessor(DetailsViewColumn.ENTITY_TYPE, {\n minSize: 45,\n maxSize: 45,\n size: 45,\n header: () => null,\n enableResizing: false,\n cell: EntityTypeCell,\n meta: {\n textAlign: 'center',\n },\n }),\n columnHelper.accessor(DetailsViewColumn.NAME, {\n size: 300,\n enableSorting: sortableColumns.includes(DetailsViewColumn.NAME),\n // sortable: sort != null,\n // resizable: true,\n header: props => <ColumnHeader {...props} title={'Name'} />,\n cell: context => (\n <NameRenderer\n context={context}\n setCurrentContainer={setCurrentContainer}\n />\n ),\n enableColumnFilter: false,\n }),\n columnHelper.display({\n id: DetailsViewColumn.BADGES,\n minSize: 75,\n maxSize: 75,\n size: 75,\n header: () => null,\n cell: EntityBadgeIconsCell,\n }),\n columnHelper.accessor(DetailsViewColumn.ID, {\n size: 130,\n header: props => <ColumnHeader {...props} title={'ID'} />,\n minSize: 130,\n enableColumnFilter: false,\n enableSorting: sortableColumns.includes(DetailsViewColumn.ID),\n }),\n columnHelper.display({\n id: DetailsViewColumn.VERSION,\n minSize: 150,\n size: 200,\n header: () => <VersionColumnHeader versionSelection={versionSelection} />,\n cell: context => (\n <EntityFinderVersionCell\n versionSelection={versionSelection}\n toggleSelection={toggleSelection}\n setInitialVersion={setInitialVersion}\n context={context}\n />\n ),\n }),\n columnHelper.accessor(DetailsViewColumn.CREATED_ON, {\n header: props => <ColumnHeader {...props} title={'Created On'} />,\n size: 220,\n minSize: 170,\n cell: CreatedOnCell,\n enableColumnFilter: false,\n enableSorting: sortableColumns.includes(DetailsViewColumn.CREATED_ON),\n }),\n columnHelper.accessor(DetailsViewColumn.MODIFIED_ON, {\n header: props => <ColumnHeader {...props} title={'Modified On'} />,\n size: 220,\n minSize: 170,\n enableColumnFilter: false,\n cell: ModifiedOnCell,\n enableSorting: sortableColumns.includes(DetailsViewColumn.MODIFIED_ON),\n }),\n columnHelper.accessor(DetailsViewColumn.MODIFIED_BY, {\n header: props => <ColumnHeader {...props} title={'Modified By'} />,\n size: 250,\n enableResizing: true,\n cell: ModifiedByCell,\n enableColumnFilter: false,\n enableSorting: sortableColumns.includes(DetailsViewColumn.MODIFIED_BY),\n }),\n columnHelper.display({\n id: DetailsViewColumn.SIZE,\n header: props => <ColumnHeader {...props} title={'Size'} />,\n size: 120,\n minSize: 85,\n enableSorting: false,\n enableResizing: true,\n cell: FileEntitySizeCell,\n }),\n columnHelper.display({\n id: DetailsViewColumn.MD5,\n header: props => <ColumnHeader {...props} title={'MD5'} />,\n size: 200,\n enableSorting: false,\n enableResizing: true,\n cell: FileEntityMD5Cell,\n }),\n columnHelper.display({\n id: DetailsViewColumn.ADD_TO_DOWNLOAD_CART,\n header: () => null,\n size: 45,\n minSize: 45,\n enableSorting: false,\n enableResizing: false,\n cell: AddFileToDownloadListCell,\n }),\n columnHelper.display({\n id: DetailsViewColumn.DIRECT_DOWNLOAD,\n header: props => <ColumnHeader {...props} title={'Actions'} />,\n size: 75,\n minSize: 75,\n enableSorting: false,\n enableResizing: false,\n cell: FileEntityDirectDownloadCell,\n }),\n ]\n}\n\ntype DetailsViewRowAppearance = 'hidden' | 'disabled' | 'selected' | 'default'\n\nconst determineRowAppearance = (args: {\n visibleTypes: EntityType[]\n selectableTypes: EntityType[]\n selected: EntitySelectionMapType\n entity: EntityFinderHeader\n}): DetailsViewRowAppearance => {\n const { visibleTypes, selectableTypes, selected, entity } = args\n if (!visibleTypes.includes(getEntityTypeFromHeader(entity))) {\n return 'hidden'\n } else if (!selectableTypes.includes(getEntityTypeFromHeader(entity))) {\n return 'disabled'\n } else if (selected.has(entity.id)) {\n return 'selected'\n } else {\n return 'default'\n }\n}\n\nconst DEFAULT_HIDDEN_COLUMNS = [DetailsViewColumn.DIRECT_DOWNLOAD]\n\n/**\n * Displays a list of entities in a table.\n *\n * If the list of entities is paginated, the `hasNextPage` prop can be set to indicate that there is more data to load.\n * When the view is ready to load more data, the `fetchNextPage` callback will be invoked. The view is designed to handle\n * an \"infinite scroll\" pattern, so entities should not be removed from the list when loading the next page.\n */\nexport function DetailsView(props: DetailsViewProps) {\n const {\n entities,\n isLoading,\n hasNextPage,\n fetchNextPage,\n isFetchingNextPage,\n versionSelection,\n selectColumnType,\n selected,\n visibleTypes,\n selectableTypes,\n toggleSelection,\n setInitialVersion,\n enableSorting,\n enableMultiSort,\n sortableColumns,\n sorting,\n onSortingChange,\n noResultsPlaceholder,\n enableSelectAll,\n selectAllIsChecked = false,\n getChildrenInfiniteRequestObject,\n totalEntities,\n setCurrentContainer,\n hiddenColumns = DEFAULT_HIDDEN_COLUMNS,\n } = props\n const queryClient = useQueryClient()\n\n const { accessToken, keyFactory: queryClientKeyFactory } = useSynapseContext()\n\n const showSelectColumn = selectColumnType !== 'none'\n\n const [shouldSelectAll, setShouldSelectAll] = useState(false)\n const [showLoadingScreen, setShowLoadingScreen] = useState(false)\n\n const cancelQuery = () => {\n // It's likely that the user will be throttled by the Synapse backend and may be waiting a\n // noticeable amount of time for the current request, so cancel it (in addition to cancelling future requests)\n void queryClient.cancelQueries({\n queryKey: queryClientKeyFactory.getEntityChildrenQueryKey(\n getChildrenInfiniteRequestObject!,\n true,\n ),\n })\n setShowLoadingScreen(false)\n setShouldSelectAll(false)\n }\n\n useEffect(() => {\n async function handleSelectAll() {\n if (shouldSelectAll) {\n if (hasNextPage && fetchNextPage) {\n // Show the loading screen since we must fetch data (potentially a lot) to finish the task\n setShowLoadingScreen(true)\n if (!isFetchingNextPage) {\n void fetchNextPage()\n // The effect will re-run after fetch completes, and the next page (if it exists) will be fetched.\n }\n } else {\n if (selectAllIsChecked) {\n // All the items are selected, so we will deselect all\n toggleSelection(\n entities\n .filter(e => {\n // Collect just entities that are selected\n // An entity may be in the list and unselected because it isn't of a selectable type\n return selected.has(e.id)\n })\n .map(e => selected.get(e.id)!),\n )\n } else {\n // Not all the items are selected, so we will select all\n toggleSelection(\n await Promise.all(\n entities\n .filter(e => {\n // must filter just selectable types or else any entities of unselectable types will get selected\n const type = getEntityTypeFromHeader(e)\n // also exclude already-selected entities, since we don't want to toggle those\n return (\n !selected.has(e.id) &&\n selectableTypes.includes(type) &&\n visibleTypes.includes(type)\n )\n })\n .map(async e => {\n let latestVersion: number | undefined\n const entityType = getEntityTypeFromHeader(e)\n if (\n versionSelection === VersionSelectionType.REQUIRED &&\n isVersionableEntityType(entityType)\n ) {\n // If VersionSelectionType.REQUIRED, then we need to supply a version with the entity.\n // We may already have the version from the header, but only use it if it's a valid snapshot\n // (table types with \"in progress\" are not valid)\n if (\n Object.prototype.hasOwnProperty.call(\n e,\n 'versionNumber',\n ) &&\n !hasInProgressTableVersion(\n entityType,\n e as EntityHeader,\n )\n ) {\n latestVersion = (e as EntityHeader).versionNumber\n }\n if (!latestVersion) {\n // Failsafe if we didn't get the version in the header. This is rare/unlikely, since the only cases we're sure we don't get versions are:\n // - ProjectHeaders (which are versionless)\n // - Search Results (for which we don't support Select All)\n // - Table types, whose entity headers report the \"in progress\" version rather than the latest stable snapshot\n // For large lists, there's a good chance for this to trigger throttling.\n\n // Show the loading screen since we must fetch data (potentially a lot) to finish the task\n setShowLoadingScreen(true)\n\n const versionsQueryOffset = 0\n const versionsQueryLimit = 1\n const versions = await queryClient.fetchQuery({\n queryKey:\n queryClientKeyFactory.getPaginatedEntityVersionsQueryKey(\n e.id,\n versionsQueryLimit,\n versionsQueryOffset,\n ),\n queryFn: () =>\n getEntityVersions(\n e.id,\n accessToken,\n versionsQueryOffset,\n versionsQueryLimit,\n ),\n })\n // we pick the first version in the list because it is the most recent\n latestVersion = versions.results[0]?.versionNumber\n }\n }\n return {\n targetId: e.id,\n targetVersionNumber: latestVersion,\n }\n }),\n ),\n )\n }\n setShouldSelectAll(false)\n setShowLoadingScreen(false)\n }\n }\n }\n handleSelectAll()\n }, [\n accessToken,\n entities,\n fetchNextPage,\n hasNextPage,\n versionSelection,\n queryClient,\n isFetchingNextPage,\n selectAllIsChecked,\n selectableTypes,\n selected,\n shouldSelectAll,\n toggleSelection,\n visibleTypes,\n queryClientKeyFactory,\n ])\n\n const tableData = useMemo(\n () =>\n entities.reduce((entities: EntityFinderTableViewRowData[], entity) => {\n const appearance = determineRowAppearance({\n visibleTypes,\n selectableTypes,\n selected,\n entity,\n })\n if (appearance !== 'hidden') {\n // only include entities that should not be hidden\n const entityType = getEntityTypeFromHeader(entity)\n\n const currentSelectedVersion = selected.get(\n entity.id,\n )?.targetVersionNumber\n let versionNumber: number | undefined = undefined\n if ('versionNumber' in entity) {\n if (currentSelectedVersion != null) {\n // if a version is selected, the row should show that version's data\n versionNumber = currentSelectedVersion\n } else if (versionSelection === VersionSelectionType.REQUIRED) {\n // if a version is not selected, but version selection is required, the row should show the latest version's data\n // Only use EntityHeader's version if it's a valid snapshot (table types with \"in progress\" are not valid)\n if (!hasInProgressTableVersion(entityType, entity)) {\n versionNumber = entity.versionNumber\n }\n }\n // otherwise, show the current version's data (versionNumber is undefined)\n }\n\n entities.push({\n ...entity,\n entityId: entity.id,\n versionNumber: versionNumber,\n entityType: entityType,\n isSelected: appearance === 'selected',\n isDisabled: appearance === 'disabled',\n isVersionableEntity: isVersionableEntityType(entityType),\n currentSelectedVersion: currentSelectedVersion,\n })\n }\n return entities\n }, []),\n [entities, selectableTypes, selected, versionSelection, visibleTypes],\n )\n\n const isSelectAllVisible = enableSelectAll\n\n // Enabled if there's at least one visible & selectable entity, OR there's a page we haven't fetched\n const isSelectAllDisabled = !(\n hasNextPage ||\n entities.filter(\n e =>\n selectableTypes.includes(getEntityTypeFromHeader(e)) &&\n visibleTypes.includes(getEntityTypeFromHeader(e)),\n ).length > 0\n )\n\n const columns = useMemo(\n () =>\n getColumns({\n setCurrentContainer,\n isSelectAllVisible: isSelectAllVisible,\n isSelectAllDisabled: isSelectAllDisabled,\n isSelectAllChecked: selectAllIsChecked,\n onSelectAll: () => {\n setShouldSelectAll(true)\n },\n versionSelection,\n toggleSelection,\n setInitialVersion,\n sortableColumns,\n }),\n [\n isSelectAllDisabled,\n isSelectAllVisible,\n selectAllIsChecked,\n setCurrentContainer,\n setInitialVersion,\n sortableColumns,\n toggleSelection,\n versionSelection,\n ],\n )\n\n const hideColumnOverrides = useMemo(() => {\n return hiddenColumns.reduce(\n (acc: Partial<Record<DetailsViewColumn, boolean>>, column) => {\n acc[column] = false\n return acc\n },\n {},\n )\n }, [hiddenColumns])\n\n const table: Table<EntityFinderTableViewRowData> =\n useReactTable<EntityFinderTableViewRowData>({\n data: tableData,\n columns,\n getCoreRowModel: getCoreRowModel(),\n columnResizeMode: 'onChange',\n manualSorting: true,\n enableSorting,\n enableMultiSort,\n onSortingChange,\n state: {\n sorting,\n columnVisibility: {\n [DetailsViewColumn.SELECTED]: showSelectColumn,\n [DetailsViewColumn.VERSION]:\n versionSelection !== VersionSelectionType.DISALLOWED,\n [DetailsViewColumn.SIZE]: visibleTypes.includes(EntityType.file),\n [DetailsViewColumn.MD5]: visibleTypes.includes(EntityType.file),\n [DetailsViewColumn.ADD_TO_DOWNLOAD_CART]: visibleTypes.includes(\n EntityType.file,\n ),\n [DetailsViewColumn.DIRECT_DOWNLOAD]: visibleTypes.includes(\n EntityType.file,\n ),\n ...hideColumnOverrides,\n },\n },\n })\n\n const tableContainerRef = useRef<HTMLDivElement>(null)\n\n const rowVirtualizer = useVirtualizer({\n count: totalEntities ?? table.getRowModel().rows.length,\n estimateSize: () => 40, // estimate row height for accurate scrollbar dragging\n getScrollElement: () => tableContainerRef.current,\n // measure dynamic row height, except in firefox because it measures table border height incorrectly\n measureElement:\n typeof window !== 'undefined' &&\n navigator.userAgent.indexOf('Firefox') === -1\n ? element => element?.getBoundingClientRect().height\n : undefined,\n overscan: 5,\n })\n\n function onRowClick(rowData: EntityFinderTableViewRowData) {\n const { id, isDisabled, isVersionableEntity, entityType } = rowData\n let { currentSelectedVersion } = rowData\n if (!isDisabled) {\n if (\n isVersionableEntity &&\n versionSelection === VersionSelectionType.REQUIRED &&\n currentSelectedVersion == null &&\n Object.prototype.hasOwnProperty.call(rowData, 'versionNumber')\n ) {\n // Only use EntityHeader's version if it's a valid snapshot (table types with \"in progress\" are not valid)\n if (!hasInProgressTableVersion(entityType, rowData)) {\n currentSelectedVersion = rowData.versionNumber\n }\n // Note that here we aren't handling the case where the header doesn't have a version, e.g. a search result\n // That case is actually handled by the VersionRenderer, which has an effect that will toggle the selection after data is fetched.\n }\n\n toggleSelection({\n targetId: id,\n targetVersionNumber: currentSelectedVersion,\n })\n }\n }\n\n //called on scroll and possibly on mount to fetch more data as the user scrolls and reaches bottom of table\n const fetchMoreOnBottomReached = useFetchNextPageOnScrollToBottom({\n containerRef: tableContainerRef,\n hasNextPage,\n isFetchingNextPage,\n fetchNextPage,\n data: entities,\n })\n\n return (\n <div className=\"EntityFinderDetailsView\">\n <BlockingLoader\n show={showLoadingScreen}\n currentProgress={entities.length}\n totalProgress={totalEntities}\n hintText={\n totalEntities\n ? `${entities.length.toLocaleString()} of ${totalEntities?.toLocaleString()}`\n : `Fetching ${entities.length.toLocaleString()}`\n }\n headlineText={'Fetching selected items'}\n onCancel={cancelQuery}\n />\n {!isLoading && entities.length > 0 && (\n <StyledVirtualTanStackTable<EntityFinderTableViewRowData>\n styledTableContainerProps={{\n className: 'DetailsViewTable',\n ref: tableContainerRef,\n height: '100%',\n }}\n onTableContainerScroll={target =>\n fetchMoreOnBottomReached(target as HTMLDivElement)\n }\n table={table}\n rowVirtualizer={rowVirtualizer}\n slotProps={{\n Tr: ownerState => {\n const { tableRow } = ownerState\n\n return {\n className: `EntityFinderDetailsViewRow`,\n ['aria-selected']: tableRow?.original.isSelected,\n ['aria-disabled']: tableRow?.original.isDisabled,\n onClick: () => {\n if (tableRow) {\n onRowClick(tableRow.original)\n }\n },\n }\n },\n }}\n striped\n />\n )}\n {isLoading && (\n <div className=\"EntityFinderDetailsViewPlaceholder\">\n <SynapseSpinner size={30} />\n </div>\n )}\n {!isLoading && entities.length === 0 && (\n <div className=\"EntityFinderDetailsViewPlaceholder\">\n {noResultsPlaceholder || <div>Empty</div>}\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { CellContext } from '@tanstack/react-table';
|
|
2
2
|
import { EntityIdAndVersionNumber } from './TableCellTypes';
|
|
3
|
-
|
|
3
|
+
type AddToDownloadListCellProps = {
|
|
4
|
+
downloadIcon?: React.ReactNode;
|
|
5
|
+
};
|
|
6
|
+
export declare function AddFileToDownloadListCell<T extends EntityIdAndVersionNumber>(props: CellContext<T, unknown> & AddToDownloadListCellProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export {};
|
|
4
8
|
//# sourceMappingURL=AddToDownloadListCell.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddToDownloadListCell.d.ts","sourceRoot":"","sources":["../../../../../../src/components/EntityFinder/details/view/table/AddToDownloadListCell.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAK3D,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,wBAAwB,EAC1E,KAAK,EAAE,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"AddToDownloadListCell.d.ts","sourceRoot":"","sources":["../../../../../../src/components/EntityFinder/details/view/table/AddToDownloadListCell.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAK3D,KAAK,0BAA0B,GAAG;IAChC,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC/B,CAAA;AACD,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,wBAAwB,EAC1E,KAAK,EAAE,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,0BAA0B,2CA8C5D"}
|
|
@@ -12,15 +12,15 @@ import { Fragment as l, jsx as u } from "react/jsx-runtime";
|
|
|
12
12
|
import { EntityType as d } from "@sage-bionetworks/synapse-client";
|
|
13
13
|
//#region src/components/EntityFinder/details/view/table/AddToDownloadListCell.tsx
|
|
14
14
|
function f(f) {
|
|
15
|
-
let { row: p } = f, { entityId:
|
|
15
|
+
let { row: p, downloadIcon: m } = f, { entityId: h, versionNumber: g } = p.original, { data: _ } = r(h, g), { downloadCartPageUrl: v } = t(), { mutate: y } = n({
|
|
16
16
|
onSuccess: () => {
|
|
17
|
-
a(
|
|
17
|
+
a(v);
|
|
18
18
|
},
|
|
19
19
|
onError: (t) => {
|
|
20
20
|
e(t.reason, "danger");
|
|
21
21
|
}
|
|
22
22
|
});
|
|
23
|
-
return
|
|
23
|
+
return _?.entityType == d.file || _?.entityType == d.recordset ? /* @__PURE__ */ u(o, {
|
|
24
24
|
sx: {
|
|
25
25
|
display: "flex",
|
|
26
26
|
justifyContent: "center",
|
|
@@ -36,12 +36,12 @@ function f(f) {
|
|
|
36
36
|
width: "35px"
|
|
37
37
|
},
|
|
38
38
|
onClick: (e) => {
|
|
39
|
-
|
|
40
|
-
entityId:
|
|
41
|
-
entityVersionNumber:
|
|
39
|
+
y({
|
|
40
|
+
entityId: h,
|
|
41
|
+
entityVersionNumber: g
|
|
42
42
|
}), e.stopPropagation();
|
|
43
43
|
},
|
|
44
|
-
children: /* @__PURE__ */ u(i, { icon: "download" })
|
|
44
|
+
children: m ?? /* @__PURE__ */ u(i, { icon: "download" })
|
|
45
45
|
})
|
|
46
46
|
})
|
|
47
47
|
}) : /* @__PURE__ */ u(l, {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddToDownloadListCell.js","names":[],"sources":["../../../../../../src/components/EntityFinder/details/view/table/AddToDownloadListCell.tsx"],"sourcesContent":["import useGetEntityBundle from '@/synapse-queries/entity/useEntityBundle'\nimport { useAddFileToDownloadList } from '@/synapse-queries/index'\nimport { useSynapseContext } from '@/utils/index'\nimport { Box, IconButton, Tooltip } from '@mui/material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport { CellContext } from '@tanstack/react-table'\nimport { EntityIdAndVersionNumber } from './TableCellTypes'\nimport { displayFilesWereAddedToDownloadListSuccess } from '../../../../download_list/DownloadConfirmationUtils'\nimport IconSvg from '../../../../IconSvg/IconSvg'\nimport { displayToast } from '../../../../ToastMessage/index'\n\nexport function AddFileToDownloadListCell<T extends EntityIdAndVersionNumber>(\n props: CellContext<T, unknown
|
|
1
|
+
{"version":3,"file":"AddToDownloadListCell.js","names":[],"sources":["../../../../../../src/components/EntityFinder/details/view/table/AddToDownloadListCell.tsx"],"sourcesContent":["import useGetEntityBundle from '@/synapse-queries/entity/useEntityBundle'\nimport { useAddFileToDownloadList } from '@/synapse-queries/index'\nimport { useSynapseContext } from '@/utils/index'\nimport { Box, IconButton, Tooltip } from '@mui/material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport { CellContext } from '@tanstack/react-table'\nimport { EntityIdAndVersionNumber } from './TableCellTypes'\nimport { displayFilesWereAddedToDownloadListSuccess } from '../../../../download_list/DownloadConfirmationUtils'\nimport IconSvg from '../../../../IconSvg/IconSvg'\nimport { displayToast } from '../../../../ToastMessage/index'\n\ntype AddToDownloadListCellProps = {\n downloadIcon?: React.ReactNode\n}\nexport function AddFileToDownloadListCell<T extends EntityIdAndVersionNumber>(\n props: CellContext<T, unknown> & AddToDownloadListCellProps,\n) {\n const { row, downloadIcon } = props\n const { entityId, versionNumber } = row.original\n const { data: bundle } = useGetEntityBundle(entityId, versionNumber)\n\n const { downloadCartPageUrl } = useSynapseContext()\n\n const { mutate: addToDownloadList } = useAddFileToDownloadList({\n onSuccess: () => {\n displayFilesWereAddedToDownloadListSuccess(downloadCartPageUrl)\n },\n onError: error => {\n displayToast(error.reason, 'danger')\n },\n })\n if (\n !(\n bundle?.entityType == EntityType.file ||\n bundle?.entityType == EntityType.recordset\n )\n ) {\n return <></>\n }\n return (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '100%',\n }}\n >\n <Tooltip title=\"Add to Download List\" placement=\"right\">\n <IconButton\n sx={{ height: '35px', width: '35px' }}\n onClick={event => {\n addToDownloadList({ entityId, entityVersionNumber: versionNumber })\n event.stopPropagation()\n }}\n >\n {downloadIcon ?? <IconSvg icon=\"download\" />}\n </IconButton>\n </Tooltip>\n </Box>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,SAAgB,EACd,GACA;CACA,IAAM,EAAE,QAAK,oBAAiB,GACxB,EAAE,aAAU,qBAAkB,EAAI,UAClC,EAAE,MAAM,MAAW,EAAmB,GAAU,CAAa,GAE7D,EAAE,2BAAwB,EAAkB,GAE5C,EAAE,QAAQ,MAAsB,EAAyB;EAC7D,iBAAiB;GACf,EAA2C,CAAmB;EAChE;EACA,UAAS,MAAS;GAChB,EAAa,EAAM,QAAQ,QAAQ;EACrC;CACF,CAAC;CASD,OANI,GAAQ,cAAc,EAAW,QACjC,GAAQ,cAAc,EAAW,YAMnC,kBAAC,GAAD;EACE,IAAI;GACF,SAAS;GACT,gBAAgB;GAChB,YAAY;GACZ,QAAQ;EACV;YAEA,kBAAC,GAAD;GAAS,OAAM;GAAuB,WAAU;aAC9C,kBAAC,GAAD;IACE,IAAI;KAAE,QAAQ;KAAQ,OAAO;IAAO;IACpC,UAAS,MAAS;KAEhB,AADA,EAAkB;MAAE;MAAU,qBAAqB;KAAc,CAAC,GAClE,EAAM,gBAAgB;IACxB;cAEC,KAAgB,kBAAC,GAAD,EAAS,MAAK,WAAY,CAAA;GACjC,CAAA;EACL,CAAA;CACN,CAAA,IAtBE,kBAAA,GAAA,CAAI,CAAA;AAwBf"}
|
|
@@ -11,6 +11,8 @@ export type EntityLinkProps = {
|
|
|
11
11
|
/** The field of the entity to display. Default is 'name' */
|
|
12
12
|
displayTextField?: keyof Entity | keyof EntityHeader;
|
|
13
13
|
onEntityIdClicked?: (entityId: string) => void;
|
|
14
|
+
iconVariant?: 'twoTone' | 'outlined';
|
|
15
|
+
iconColor?: string;
|
|
14
16
|
};
|
|
15
17
|
export declare const EntityLink: (props: EntityLinkProps) => React.ReactNode;
|
|
16
18
|
//# sourceMappingURL=EntityLink.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityLink.d.ts","sourceRoot":"","sources":["../../src/components/EntityLink.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAWzB,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAKtE,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM,CAAA;IACtC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,+HAA+H;IAC/H,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAA;IACpD,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"EntityLink.d.ts","sourceRoot":"","sources":["../../src/components/EntityLink.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAWzB,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAKtE,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM,CAAA;IACtC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,+HAA+H;IAC/H,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAA;IACpD,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9C,WAAW,CAAC,EAAE,SAAS,GAAG,UAAU,CAAA;IACpC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,OAAO,eAAe,KAAG,KAAK,CAAC,SAoGzD,CAAA"}
|
|
@@ -11,11 +11,11 @@ import { Link as l, Skeleton as u } from "@mui/material";
|
|
|
11
11
|
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
12
12
|
//#region src/components/EntityLink.tsx
|
|
13
13
|
var p = (p) => {
|
|
14
|
-
let { entity: m, className: h, versionNumber: g, displayTextField: _ = "name", link: v = !0, showIcon: y = !0, onEntityIdClicked: b } = p,
|
|
15
|
-
typeof m == "string" && (
|
|
16
|
-
let
|
|
17
|
-
if (
|
|
18
|
-
let i =
|
|
14
|
+
let { entity: m, className: h, versionNumber: g, displayTextField: _ = "name", link: v = !0, showIcon: y = !0, onEntityIdClicked: b, iconVariant: x = "twoTone", iconColor: S } = p, C = "";
|
|
15
|
+
typeof m == "string" && (C = m);
|
|
16
|
+
let w = !!C && typeof m == "string", { data: T, isLoading: E } = o(C, g, { enabled: w }), { error: D } = a(C, g, { enabled: w && T == null && !E });
|
|
17
|
+
if (T || typeof m != "string") {
|
|
18
|
+
let i = T ?? m, a;
|
|
19
19
|
a = "concreteType" in i ? n(i.concreteType) : r(i);
|
|
20
20
|
let o = typeof v == "string" ? v : `${t(e.PORTAL_ENDPOINT)}Synapse:${i.id}${g ? `.${g}` : ""}`;
|
|
21
21
|
return v ? /* @__PURE__ */ f(l, {
|
|
@@ -27,20 +27,24 @@ var p = (p) => {
|
|
|
27
27
|
} : void 0,
|
|
28
28
|
href: o,
|
|
29
29
|
children: [y && /* @__PURE__ */ d(s, {
|
|
30
|
+
sx: S ? { color: S } : void 0,
|
|
30
31
|
type: a,
|
|
31
|
-
style: { marginRight: "6px" }
|
|
32
|
+
style: { marginRight: "6px" },
|
|
33
|
+
variant: x
|
|
32
34
|
}), i[_]]
|
|
33
35
|
}) : /* @__PURE__ */ f("p", {
|
|
34
36
|
className: h,
|
|
35
37
|
children: [y && /* @__PURE__ */ d(s, {
|
|
38
|
+
sx: { ...S && { color: S } },
|
|
36
39
|
type: a,
|
|
37
|
-
style: { marginRight: "6px" }
|
|
40
|
+
style: { marginRight: "6px" },
|
|
41
|
+
variant: x
|
|
38
42
|
}), i[_]]
|
|
39
43
|
});
|
|
40
|
-
} else if (
|
|
41
|
-
chipText:
|
|
42
|
-
error:
|
|
43
|
-
}) : /* @__PURE__ */ d(i, { error:
|
|
44
|
+
} else if (D) return C ? /* @__PURE__ */ d(c, {
|
|
45
|
+
chipText: C,
|
|
46
|
+
error: D
|
|
47
|
+
}) : /* @__PURE__ */ d(i, { error: D });
|
|
44
48
|
else return /* @__PURE__ */ d(u, {
|
|
45
49
|
variant: "rectangular",
|
|
46
50
|
width: "100"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityLink.js","names":[],"sources":["../../src/components/EntityLink.tsx"],"sourcesContent":["import React from 'react'\nimport { useGetEntity, useGetEntityHeader } from '@/synapse-queries'\nimport {\n convertToEntityType,\n getEntityTypeFromHeader,\n} from '@/utils/functions/EntityTypeUtils'\nimport {\n BackendDestinationEnum,\n getEndpoint,\n} from '@/utils/functions/getEndpoint'\nimport { Link, Skeleton } from '@mui/material'\nimport { Entity, EntityHeader } from '@sage-bionetworks/synapse-types'\nimport { EntityTypeIcon } from './EntityIcon'\nimport { ErrorBanner } from './error/ErrorBanner'\nimport ErrorChip from './error/ErrorChip'\n\nexport type EntityLinkProps = {\n entity: string | EntityHeader | Entity\n versionNumber?: number\n /** Whether the component should link to the entity page in Synapse. Link can be overriden by passing a string. Default true */\n link?: boolean | string\n className?: string\n /** Whether to display an icon identifying the entity type. Default true */\n showIcon?: boolean\n /** The field of the entity to display. Default is 'name' */\n displayTextField?: keyof Entity | keyof EntityHeader\n onEntityIdClicked?: (entityId: string) => void\n}\n\nexport const EntityLink = (props: EntityLinkProps): React.ReactNode => {\n const {\n entity: entityOrId,\n className,\n versionNumber,\n displayTextField = 'name',\n link = true,\n showIcon = true,\n onEntityIdClicked,\n } = props\n\n let entityId = ''\n if (typeof entityOrId === 'string') {\n entityId = entityOrId\n }\n\n const fetchHeader = !!entityId && typeof entityOrId === 'string'\n\n const { data: fetchedEntity, isLoading } = useGetEntityHeader(\n entityId,\n versionNumber,\n {\n enabled: fetchHeader,\n },\n )\n\n // We don't get 4XX errors from useGetEntityHeader, so fetch the entity object to get an error response\n // See PLFM-7989\n const fetchFullEntity =\n fetchHeader && fetchedEntity == undefined && !isLoading\n const { error } = useGetEntity(entityId, versionNumber, {\n enabled: fetchFullEntity,\n })\n\n if (fetchedEntity || typeof entityOrId !== 'string') {\n const entity = fetchedEntity ?? (entityOrId as Entity | EntityHeader)\n let type\n if ('concreteType' in entity) {\n type = convertToEntityType(entity.concreteType)\n } else {\n type = getEntityTypeFromHeader(entity)\n }\n const href =\n typeof link === 'string'\n ? link\n : `${getEndpoint(\n BackendDestinationEnum.PORTAL_ENDPOINT,\n )}Synapse:${entity.id!}${versionNumber ? `.${versionNumber}` : ''}`\n if (link) {\n return (\n <Link\n className={className}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={\n onEntityIdClicked\n ? e => {\n e.preventDefault()\n onEntityIdClicked(entity.id!)\n }\n : undefined\n }\n href={href}\n >\n {showIcon && (\n <EntityTypeIcon type={type}
|
|
1
|
+
{"version":3,"file":"EntityLink.js","names":[],"sources":["../../src/components/EntityLink.tsx"],"sourcesContent":["import React from 'react'\nimport { useGetEntity, useGetEntityHeader } from '@/synapse-queries'\nimport {\n convertToEntityType,\n getEntityTypeFromHeader,\n} from '@/utils/functions/EntityTypeUtils'\nimport {\n BackendDestinationEnum,\n getEndpoint,\n} from '@/utils/functions/getEndpoint'\nimport { Link, Skeleton } from '@mui/material'\nimport { Entity, EntityHeader } from '@sage-bionetworks/synapse-types'\nimport { EntityTypeIcon } from './EntityIcon'\nimport { ErrorBanner } from './error/ErrorBanner'\nimport ErrorChip from './error/ErrorChip'\n\nexport type EntityLinkProps = {\n entity: string | EntityHeader | Entity\n versionNumber?: number\n /** Whether the component should link to the entity page in Synapse. Link can be overriden by passing a string. Default true */\n link?: boolean | string\n className?: string\n /** Whether to display an icon identifying the entity type. Default true */\n showIcon?: boolean\n /** The field of the entity to display. Default is 'name' */\n displayTextField?: keyof Entity | keyof EntityHeader\n onEntityIdClicked?: (entityId: string) => void\n iconVariant?: 'twoTone' | 'outlined'\n iconColor?: string\n}\n\nexport const EntityLink = (props: EntityLinkProps): React.ReactNode => {\n const {\n entity: entityOrId,\n className,\n versionNumber,\n displayTextField = 'name',\n link = true,\n showIcon = true,\n onEntityIdClicked,\n iconVariant = 'twoTone',\n iconColor,\n } = props\n\n let entityId = ''\n if (typeof entityOrId === 'string') {\n entityId = entityOrId\n }\n\n const fetchHeader = !!entityId && typeof entityOrId === 'string'\n\n const { data: fetchedEntity, isLoading } = useGetEntityHeader(\n entityId,\n versionNumber,\n {\n enabled: fetchHeader,\n },\n )\n\n // We don't get 4XX errors from useGetEntityHeader, so fetch the entity object to get an error response\n // See PLFM-7989\n const fetchFullEntity =\n fetchHeader && fetchedEntity == undefined && !isLoading\n const { error } = useGetEntity(entityId, versionNumber, {\n enabled: fetchFullEntity,\n })\n\n if (fetchedEntity || typeof entityOrId !== 'string') {\n const entity = fetchedEntity ?? (entityOrId as Entity | EntityHeader)\n let type\n if ('concreteType' in entity) {\n type = convertToEntityType(entity.concreteType)\n } else {\n type = getEntityTypeFromHeader(entity)\n }\n const href =\n typeof link === 'string'\n ? link\n : `${getEndpoint(\n BackendDestinationEnum.PORTAL_ENDPOINT,\n )}Synapse:${entity.id!}${versionNumber ? `.${versionNumber}` : ''}`\n if (link) {\n return (\n <Link\n className={className}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={\n onEntityIdClicked\n ? e => {\n e.preventDefault()\n onEntityIdClicked(entity.id!)\n }\n : undefined\n }\n href={href}\n >\n {showIcon && (\n <EntityTypeIcon\n sx={iconColor ? { color: iconColor } : undefined}\n type={type}\n style={{ marginRight: '6px' }}\n variant={iconVariant}\n />\n )}\n {entity[displayTextField as keyof typeof entity]}\n </Link>\n )\n } else {\n return (\n <p className={className}>\n {showIcon && (\n <EntityTypeIcon\n sx={{ ...(iconColor && { color: iconColor }) }}\n type={type}\n style={{ marginRight: '6px' }}\n variant={iconVariant}\n />\n )}\n {entity[displayTextField as keyof typeof entity]}\n </p>\n )\n }\n } else if (error) {\n if (entityId) {\n return <ErrorChip chipText={entityId} error={error} />\n }\n return <ErrorBanner error={error} />\n } else {\n return <Skeleton variant=\"rectangular\" width=\"100\" />\n }\n}\n"],"mappings":";;;;;;;;;;;;AA+BA,IAAa,KAAc,MAA4C;CACrE,IAAM,EACJ,QAAQ,GACR,cACA,kBACA,sBAAmB,QACnB,UAAO,IACP,cAAW,IACX,sBACA,iBAAc,WACd,iBACE,GAEA,IAAW;CACf,AAAI,OAAO,KAAe,aACxB,IAAW;CAGb,IAAM,IAAc,CAAC,CAAC,KAAY,OAAO,KAAe,UAElD,EAAE,MAAM,GAAe,iBAAc,EACzC,GACA,GACA,EACE,SAAS,EACX,CACF,GAMM,EAAE,aAAU,EAAa,GAAU,GAAe,EACtD,SAFA,KAAe,KAAiB,QAAa,CAAC,EAGhD,CAAC;CAED,IAAI,KAAiB,OAAO,KAAe,UAAU;EACnD,IAAM,IAAS,KAAkB,GAC7B;EACJ,AAGE,IAHE,kBAAkB,IACb,EAAoB,EAAO,YAAY,IAEvC,EAAwB,CAAM;EAEvC,IAAM,IACJ,OAAO,KAAS,WACZ,IACA,GAAG,EACD,EAAuB,eACzB,EAAE,UAAU,EAAO,KAAM,IAAgB,IAAI,MAAkB;EA6BnE,OA5BE,IAEA,kBAAC,GAAD;GACa;GACX,QAAO;GACP,KAAI;GACJ,SACE,KACI,MAAK;IAEH,AADA,EAAE,eAAe,GACjB,EAAkB,EAAO,EAAG;GAC9B,IACA,KAAA;GAEA;aAZR,CAcG,KACC,kBAAC,GAAD;IACE,IAAI,IAAY,EAAE,OAAO,EAAU,IAAI,KAAA;IACjC;IACN,OAAO,EAAE,aAAa,MAAM;IAC5B,SAAS;GACV,CAAA,GAEF,EAAO,EACJ;OAIN,kBAAC,KAAD;GAAc;aAAd,CACG,KACC,kBAAC,GAAD;IACE,IAAI,EAAE,GAAI,KAAa,EAAE,OAAO,EAAU,EAAG;IACvC;IACN,OAAO,EAAE,aAAa,MAAM;IAC5B,SAAS;GACV,CAAA,GAEF,EAAO,EACP;;CAGT,OAAO,IAAI,GAIT,OAHI,IACK,kBAAC,GAAD;EAAW,UAAU;EAAiB;CAAQ,CAAA,IAEhD,kBAAC,GAAD,EAAoB,SAAQ,CAAA;MAEnC,OAAO,kBAAC,GAAD;EAAU,SAAQ;EAAc,OAAM;CAAO,CAAA;AAExD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._accessAndPermissionsContainer_8cepp_1{gap:8px;padding:12px 0;display:flex}._checkCircleIcon_8cepp_7{color:#3e8379}._blockIcon_8cepp_11{color:#d42322}._accessAndPermissionsRow_8cepp_15{align-items:center;gap:8px;display:flex}._buttonContainer_8cepp_21{gap:8px;display:flex}._accessAndPermissionsText_8cepp_26._accessAndPermissionsBlockedTextColor_8cepp_26.MuiTypography-root{color:var(--synapse-v2-gray-500)}._accessAndPermissionsText_8cepp_26.MuiTypography-root{color:var(--synapse-v2-gray-800);letter-spacing:-.07px;font-size:14px;font-weight:440;line-height:20px}._button_8cepp_21.MuiButton-root{letter-spacing:-.24px;border-radius:6px;height:28px;padding:8px;font-size:12px;font-weight:540;line-height:12px}._outlinedButton_8cepp_48.MuiButton-root{color:var(--synapse-v2-gray-800);border:1px solid var(--synapse-v2-gray-400);background:#fff9}._outlinedButton_8cepp_48.MuiButton-root:hover{box-shadow:0 4px 8px #0000001a}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
type AccessAndPermissionsProps = {
|
|
2
|
+
entityId: string;
|
|
3
|
+
versionNumber?: number;
|
|
4
|
+
};
|
|
5
|
+
declare function AccessAndPermissions({ entityId, versionNumber, }: AccessAndPermissionsProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export default AccessAndPermissions;
|
|
7
|
+
//# sourceMappingURL=AccessAndPermissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccessAndPermissions.d.ts","sourceRoot":"","sources":["../../../src/components/EntitySidebar/AccessAndPermissions.tsx"],"names":[],"mappings":"AAqBA,KAAK,yBAAyB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,iBAAS,oBAAoB,CAAC,EAC5B,QAAQ,EACR,aAAa,GACd,EAAE,yBAAyB,2CAsH3B;AAED,eAAe,oBAAoB,CAAA"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { storeRedirectURLForOneSageLoginAndGotoURL as e } from "../../utils/AppUtils/AppUtils.js";
|
|
2
|
+
import { useSynapseContext as t } from "../../utils/context/SynapseContext.js";
|
|
3
|
+
import { useOneSageURL as n } from "../../utils/hooks/useOneSageURL.js";
|
|
4
|
+
import "../../utils/hooks/index.js";
|
|
5
|
+
import "../../utils/index.js";
|
|
6
|
+
import { useGetRestrictionInformation as r } from "../../synapse-queries/dataaccess/useRestrictionInformation.js";
|
|
7
|
+
import i from "../../synapse-queries/entity/useEntityBundle.js";
|
|
8
|
+
import "../../synapse-queries/index.js";
|
|
9
|
+
import a from "../EntityAclEditor/EntityAclEditorModal.js";
|
|
10
|
+
import o from "../HasAccess/useHasAccess.js";
|
|
11
|
+
import s from "./AccessAndPermissions.module.js";
|
|
12
|
+
import { useState as c } from "react";
|
|
13
|
+
import { Box as l, Button as u, Stack as d, Typography as f } from "@mui/material";
|
|
14
|
+
import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
15
|
+
import { RestrictableObjectType as g, RestrictionLevel as _ } from "@sage-bionetworks/synapse-types";
|
|
16
|
+
import v from "@mui/icons-material/CheckCircleRounded";
|
|
17
|
+
import y from "@mui/icons-material/BlockFlipped";
|
|
18
|
+
//#region src/components/EntitySidebar/AccessAndPermissions.tsx
|
|
19
|
+
function b({ entityId: b, versionNumber: x }) {
|
|
20
|
+
let S = t().isAuthenticated, [C, w] = c(!1), T = n(), { handleGetAccess: E, accessRequirementDialog: D } = o(b, !0), { data: O, isLoading: k } = r({
|
|
21
|
+
restrictableObjectType: g.ENTITY,
|
|
22
|
+
objectId: b
|
|
23
|
+
}), { data: A, isLoading: j } = i(b, x), M = k || j, N = A?.permissions.canView, P = A?.permissions.canDownload, F = O?.hasUnmetAccessRequirement, I = O?.restrictionLevel, L = !k && I !== void 0 && I !== _.OPEN, R = F ? "Request to download" : "View Terms", z = F ? "contained" : "outlined", B = /* @__PURE__ */ m(v, { className: s.checkCircleIcon }), V = /* @__PURE__ */ m(y, { className: s.blockIcon }), H = P && !F ? B : V, U;
|
|
24
|
+
U = P ? F ? "You must request access to download" : "You can download" : "You don't have permission to download";
|
|
25
|
+
let W = N ? "You can view metadata" : "You can't view metadata";
|
|
26
|
+
return /* @__PURE__ */ h(d, {
|
|
27
|
+
className: s.accessAndPermissionsContainer,
|
|
28
|
+
children: [
|
|
29
|
+
S && !M && /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ h(l, {
|
|
30
|
+
className: s.accessAndPermissionsRow,
|
|
31
|
+
children: [N ? B : V, /* @__PURE__ */ m(f, {
|
|
32
|
+
className: `${s.accessAndPermissionsText}${N ? "" : ` ${s.accessAndPermissionsBlockedTextColor}`}`,
|
|
33
|
+
children: W
|
|
34
|
+
})]
|
|
35
|
+
}), /* @__PURE__ */ h(l, {
|
|
36
|
+
className: s.accessAndPermissionsRow,
|
|
37
|
+
children: [H, /* @__PURE__ */ m(f, {
|
|
38
|
+
className: `${s.accessAndPermissionsText}${H === V ? ` ${s.accessAndPermissionsBlockedTextColor}` : ""}`,
|
|
39
|
+
children: U
|
|
40
|
+
})]
|
|
41
|
+
})] }),
|
|
42
|
+
/* @__PURE__ */ h(l, {
|
|
43
|
+
className: s.buttonContainer,
|
|
44
|
+
children: [L && /* @__PURE__ */ m(u, {
|
|
45
|
+
className: `${s.button} ${z === "outlined" ? s.outlinedButton : ""}`,
|
|
46
|
+
variant: z,
|
|
47
|
+
onClick: E,
|
|
48
|
+
children: R
|
|
49
|
+
}), S ? /* @__PURE__ */ m(u, {
|
|
50
|
+
className: `${s.button} ${s.outlinedButton}`,
|
|
51
|
+
variant: "outlined",
|
|
52
|
+
onClick: () => w(!0),
|
|
53
|
+
children: "Sharing Settings"
|
|
54
|
+
}) : /* @__PURE__ */ m(u, {
|
|
55
|
+
className: s.button,
|
|
56
|
+
variant: "contained",
|
|
57
|
+
onClick: () => {
|
|
58
|
+
e(T.toString());
|
|
59
|
+
},
|
|
60
|
+
children: "Sign in to your account"
|
|
61
|
+
})]
|
|
62
|
+
}),
|
|
63
|
+
D,
|
|
64
|
+
/* @__PURE__ */ m(a, {
|
|
65
|
+
entityId: b,
|
|
66
|
+
open: C,
|
|
67
|
+
onClose: () => w(!1)
|
|
68
|
+
})
|
|
69
|
+
]
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//#endregion
|
|
73
|
+
export { b as default };
|
|
74
|
+
|
|
75
|
+
//# sourceMappingURL=AccessAndPermissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccessAndPermissions.js","names":[],"sources":["../../../src/components/EntitySidebar/AccessAndPermissions.tsx"],"sourcesContent":["import {\n useGetEntityBundle,\n useGetRestrictionInformation,\n} from '@/synapse-queries'\nimport {\n storeRedirectURLForOneSageLoginAndGotoURL,\n useSynapseContext,\n} from '@/utils'\nimport { Box, Button, Stack, Typography } from '@mui/material'\nimport {\n RestrictableObjectType,\n RestrictionLevel,\n} from '@sage-bionetworks/synapse-types'\nimport CheckCircleRoundedIcon from '@mui/icons-material/CheckCircleRounded'\nimport BlockFlippedIcon from '@mui/icons-material/BlockFlipped'\nimport styles from './AccessAndPermissions.module.scss'\nimport useHasAccess from '../HasAccess/useHasAccess'\nimport { useState } from 'react'\nimport { useOneSageURL } from '@/utils/hooks'\nimport EntityAclEditorModal from '../EntityAclEditor/EntityAclEditorModal'\n\ntype AccessAndPermissionsProps = {\n entityId: string\n versionNumber?: number\n}\n\nfunction AccessAndPermissions({\n entityId,\n versionNumber,\n}: AccessAndPermissionsProps) {\n const isAuthenticated = useSynapseContext().isAuthenticated\n const [showSharingSettings, setShowSharingSettings] = useState(false)\n const oneSageUrl = useOneSageURL()\n\n const { handleGetAccess, accessRequirementDialog } = useHasAccess(\n entityId,\n true,\n )\n\n const { data: restrictionInformation, isLoading: isLoadingRestrictionInfo } =\n useGetRestrictionInformation({\n restrictableObjectType: RestrictableObjectType.ENTITY,\n objectId: entityId,\n })\n const { data: entityBundle, isLoading: isLoadingEntityBundle } =\n useGetEntityBundle(entityId, versionNumber)\n\n const isLoading = isLoadingRestrictionInfo || isLoadingEntityBundle\n\n const canView = entityBundle?.permissions.canView\n const canDownload = entityBundle?.permissions.canDownload\n\n const hasUnmetAccessRequirement =\n restrictionInformation?.hasUnmetAccessRequirement\n const restrictionLevel = restrictionInformation?.restrictionLevel\n\n const showAccessButton =\n !isLoadingRestrictionInfo &&\n restrictionLevel !== undefined &&\n restrictionLevel !== RestrictionLevel.OPEN\n const accessButtonText = hasUnmetAccessRequirement\n ? 'Request to download'\n : 'View Terms'\n const accessButtonVariant = hasUnmetAccessRequirement\n ? 'contained'\n : 'outlined'\n\n const checkIcon = (\n <CheckCircleRoundedIcon className={styles.checkCircleIcon} />\n )\n const blockIcon = <BlockFlippedIcon className={styles.blockIcon} />\n\n const downloadIcon =\n canDownload && !hasUnmetAccessRequirement ? checkIcon : blockIcon\n\n let downloadText: string\n\n if (!canDownload) {\n downloadText = \"You don't have permission to download\"\n } else if (hasUnmetAccessRequirement) {\n downloadText = 'You must request access to download'\n } else {\n downloadText = 'You can download'\n }\n\n const viewText = canView ? 'You can view metadata' : \"You can't view metadata\"\n\n return (\n <Stack className={styles.accessAndPermissionsContainer}>\n {isAuthenticated && !isLoading && (\n <>\n <Box className={styles.accessAndPermissionsRow}>\n {canView ? checkIcon : blockIcon}\n <Typography\n className={`${styles.accessAndPermissionsText}${!canView ? ` ${styles.accessAndPermissionsBlockedTextColor}` : ''}`}\n >\n {viewText}\n </Typography>\n </Box>\n <Box className={styles.accessAndPermissionsRow}>\n {downloadIcon}\n <Typography\n className={`${styles.accessAndPermissionsText}${downloadIcon === blockIcon ? ` ${styles.accessAndPermissionsBlockedTextColor}` : ''}`}\n >\n {downloadText}\n </Typography>\n </Box>\n </>\n )}\n <Box className={styles.buttonContainer}>\n {showAccessButton && (\n <Button\n className={`${styles.button} ${accessButtonVariant === 'outlined' ? styles.outlinedButton : ''}`}\n variant={accessButtonVariant}\n onClick={handleGetAccess}\n >\n {accessButtonText}\n </Button>\n )}\n {isAuthenticated ? (\n <Button\n className={`${styles.button} ${styles.outlinedButton}`}\n variant=\"outlined\"\n onClick={() => setShowSharingSettings(true)}\n >\n Sharing Settings\n </Button>\n ) : (\n <Button\n className={styles.button}\n variant=\"contained\"\n onClick={() => {\n storeRedirectURLForOneSageLoginAndGotoURL(oneSageUrl.toString())\n }}\n >\n Sign in to your account\n </Button>\n )}\n </Box>\n {accessRequirementDialog}\n <EntityAclEditorModal\n entityId={entityId}\n open={showSharingSettings}\n onClose={() => setShowSharingSettings(false)}\n />\n </Stack>\n )\n}\n\nexport default AccessAndPermissions\n"],"mappings":";;;;;;;;;;;;;;;;;;AA0BA,SAAS,EAAqB,EAC5B,aACA,oBAC4B;CAC5B,IAAM,IAAkB,EAAkB,EAAE,iBACtC,CAAC,GAAqB,KAA0B,EAAS,EAAK,GAC9D,IAAa,EAAc,GAE3B,EAAE,oBAAiB,+BAA4B,EACnD,GACA,EACF,GAEM,EAAE,MAAM,GAAwB,WAAW,MAC/C,EAA6B;EAC3B,wBAAwB,EAAuB;EAC/C,UAAU;CACZ,CAAC,GACG,EAAE,MAAM,GAAc,WAAW,MACrC,EAAmB,GAAU,CAAa,GAEtC,IAAY,KAA4B,GAExC,IAAU,GAAc,YAAY,SACpC,IAAc,GAAc,YAAY,aAExC,IACJ,GAAwB,2BACpB,IAAmB,GAAwB,kBAE3C,IACJ,CAAC,KACD,MAAqB,KAAA,KACrB,MAAqB,EAAiB,MAClC,IAAmB,IACrB,wBACA,cACE,IAAsB,IACxB,cACA,YAEE,IACJ,kBAAC,GAAD,EAAwB,WAAW,EAAO,gBAAkB,CAAA,GAExD,IAAY,kBAAC,GAAD,EAAkB,WAAW,EAAO,UAAY,CAAA,GAE5D,IACJ,KAAe,CAAC,IAA4B,IAAY,GAEtD;CAEJ,AACE,IADG,IAEM,IACM,wCAEA,qBAJA;CAOjB,IAAM,IAAW,IAAU,0BAA0B;CAErD,OACE,kBAAC,GAAD;EAAO,WAAW,EAAO;YAAzB;GACG,KAAmB,CAAC,KACnB,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;IAAK,WAAW,EAAO;cAAvB,CACG,IAAU,IAAY,GACvB,kBAAC,GAAD;KACE,WAAW,GAAG,EAAO,2BAA4B,IAA8D,KAApD,IAAI,EAAO;eAErE;IACS,CAAA,CACT;OACL,kBAAC,GAAD;IAAK,WAAW,EAAO;cAAvB,CACG,GACD,kBAAC,GAAD;KACE,WAAW,GAAG,EAAO,2BAA2B,MAAiB,IAAY,IAAI,EAAO,yCAAyC;eAEhI;IACS,CAAA,CACT;KACL,EAAA,CAAA;GAEJ,kBAAC,GAAD;IAAK,WAAW,EAAO;cAAvB,CACG,KACC,kBAAC,GAAD;KACE,WAAW,GAAG,EAAO,OAAO,GAAG,MAAwB,aAAa,EAAO,iBAAiB;KAC5F,SAAS;KACT,SAAS;eAER;IACK,CAAA,GAET,IACC,kBAAC,GAAD;KACE,WAAW,GAAG,EAAO,OAAO,GAAG,EAAO;KACtC,SAAQ;KACR,eAAe,EAAuB,EAAI;eAC3C;IAEO,CAAA,IAER,kBAAC,GAAD;KACE,WAAW,EAAO;KAClB,SAAQ;KACR,eAAe;MACb,EAA0C,EAAW,SAAS,CAAC;KACjE;eACD;IAEO,CAAA,CAEP;;GACJ;GACD,kBAAC,GAAD;IACY;IACV,MAAM;IACN,eAAe,EAAuB,EAAK;GAC5C,CAAA;EACI;;AAEX"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import './AccessAndPermissions.css';var e = {
|
|
2
|
+
accessAndPermissionsContainer: "_accessAndPermissionsContainer_8cepp_1",
|
|
3
|
+
checkCircleIcon: "_checkCircleIcon_8cepp_7",
|
|
4
|
+
blockIcon: "_blockIcon_8cepp_11",
|
|
5
|
+
accessAndPermissionsRow: "_accessAndPermissionsRow_8cepp_15",
|
|
6
|
+
buttonContainer: "_buttonContainer_8cepp_21",
|
|
7
|
+
accessAndPermissionsText: "_accessAndPermissionsText_8cepp_26",
|
|
8
|
+
accessAndPermissionsBlockedTextColor: "_accessAndPermissionsBlockedTextColor_8cepp_26",
|
|
9
|
+
button: "_button_8cepp_21",
|
|
10
|
+
outlinedButton: "_outlinedButton_8cepp_48"
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
13
|
+
export { e as default };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=AccessAndPermissions.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccessAndPermissions.module.js","names":[],"sources":["../../../src/components/EntitySidebar/AccessAndPermissions.module.scss"],"sourcesContent":[".accessAndPermissionsContainer {\n padding: 12px 0;\n display: flex;\n gap: 8px;\n}\n\n.checkCircleIcon {\n color: #3e8379;\n}\n\n.blockIcon {\n color: #d42322;\n}\n\n.accessAndPermissionsRow {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.buttonContainer {\n display: flex;\n gap: 8px;\n}\n\n.accessAndPermissionsText.accessAndPermissionsBlockedTextColor:global(\n .MuiTypography-root\n ) {\n color: var(--synapse-v2-gray-500);\n}\n\n.accessAndPermissionsText:global(.MuiTypography-root) {\n color: var(--synapse-v2-gray-800);\n font-size: 14px;\n font-weight: 440;\n line-height: 20px; /* 142.857% */\n letter-spacing: -0.07px;\n}\n\n.button:global(.MuiButton-root) {\n font-size: 12px;\n font-weight: 540;\n line-height: 12px; /* 100% */\n letter-spacing: -0.24px;\n height: 28px;\n padding: 8px;\n border-radius: 6px;\n}\n\n.outlinedButton:global(.MuiButton-root) {\n color: var(--synapse-v2-gray-800);\n border: 1px solid var(--synapse-v2-gray-400);\n background: rgba(255, 255, 255, 0.6);\n\n &:hover {\n box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.1);\n }\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
.accessAndPermissionsContainer {
|
|
2
|
+
padding: 12px 0;
|
|
3
|
+
display: flex;
|
|
4
|
+
gap: 8px;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.checkCircleIcon {
|
|
8
|
+
color: #3e8379;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.blockIcon {
|
|
12
|
+
color: #d42322;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.accessAndPermissionsRow {
|
|
16
|
+
display: flex;
|
|
17
|
+
align-items: center;
|
|
18
|
+
gap: 8px;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.buttonContainer {
|
|
22
|
+
display: flex;
|
|
23
|
+
gap: 8px;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.accessAndPermissionsText.accessAndPermissionsBlockedTextColor:global(
|
|
27
|
+
.MuiTypography-root
|
|
28
|
+
) {
|
|
29
|
+
color: var(--synapse-v2-gray-500);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.accessAndPermissionsText:global(.MuiTypography-root) {
|
|
33
|
+
color: var(--synapse-v2-gray-800);
|
|
34
|
+
font-size: 14px;
|
|
35
|
+
font-weight: 440;
|
|
36
|
+
line-height: 20px; /* 142.857% */
|
|
37
|
+
letter-spacing: -0.07px;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.button:global(.MuiButton-root) {
|
|
41
|
+
font-size: 12px;
|
|
42
|
+
font-weight: 540;
|
|
43
|
+
line-height: 12px; /* 100% */
|
|
44
|
+
letter-spacing: -0.24px;
|
|
45
|
+
height: 28px;
|
|
46
|
+
padding: 8px;
|
|
47
|
+
border-radius: 6px;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.outlinedButton:global(.MuiButton-root) {
|
|
51
|
+
color: var(--synapse-v2-gray-800);
|
|
52
|
+
border: 1px solid var(--synapse-v2-gray-400);
|
|
53
|
+
background: rgba(255, 255, 255, 0.6);
|
|
54
|
+
|
|
55
|
+
&:hover {
|
|
56
|
+
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.1);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.
|
|
1
|
+
._panel_1kyj8_1{flex-direction:column;display:flex;position:relative}._content_1kyj8_7{gap:12px;width:320px;margin-top:64px;padding:0 32px 0 0}@media (width<=1200px){._content_1kyj8_7{width:100%;margin-top:10px;padding:10px 32px 0}}._sidebarHeader_1kyj8_21.MuiTypography-root{color:var(--synapse-v2-gray-700);font-size:14px;font-weight:540;line-height:20px}._propertyValue_1kyj8_28.MuiTypography-root{color:var(--synapse-v2-gray-800);font-style:normal;font-weight:440;line-height:20px}._propertyTitle_1kyj8_35.MuiTypography-root{color:var(--synapse-v2-gray-600);font-size:12px;line-height:12px}._propertiesContainer_1kyj8_41{gap:12px;padding:12px 0}._propertyRow_1kyj8_46{gap:4px}._toggleButton_1kyj8_50.MuiButtonBase-root{white-space:nowrap;flex-direction:row;align-self:flex-start;gap:8px;display:flex;position:absolute;top:14px;right:32px}@media (width<=1200px){._toggleButton_1kyj8_50.MuiButtonBase-root{margin:10px 0 0 32px;position:static}}._toggleButton_1kyj8_50.MuiButtonBase-root:hover{text-decoration:none}._toggleButtonText_1kyj8_70.MuiTypography-root{color:var(--synapse-v2-gray-700);font-weight:440;line-height:20px}._icon_1kyj8_76{color:var(--synapse-v2-gray-700)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntitySidebar.d.ts","sourceRoot":"","sources":["../../../src/components/EntitySidebar/EntitySidebar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EntitySidebar.d.ts","sourceRoot":"","sources":["../../../src/components/EntitySidebar/EntitySidebar.tsx"],"names":[],"mappings":"AAoBA,KAAK,kBAAkB,GAAG;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,KAAK,EAAE,kBAAkB,2CAuF9D"}
|