synapse-react-client 4.0.9 → 4.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SWC.index.d.ts +1 -0
- package/dist/SWC.index.d.ts.map +1 -1
- package/dist/SWC.index.js +2 -1
- package/dist/SWC.index.js.map +1 -1
- package/dist/aridhia-queries/aridhiaTokenExchange.js.map +1 -1
- package/dist/aridhia-queries/useGetAridhiaRequests.js.map +1 -1
- package/dist/assets/icons/CloudWarning.d.ts +5 -0
- package/dist/assets/icons/CloudWarning.d.ts.map +1 -0
- package/dist/assets/icons/CloudWarning.js +47 -0
- package/dist/assets/icons/CloudWarning.js.map +1 -0
- package/dist/assets/icons/TasksIcon.d.ts.map +1 -1
- package/dist/assets/icons/TasksIcon.js +6 -10
- package/dist/assets/icons/TasksIcon.js.map +1 -1
- package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.d.ts.map +1 -1
- package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.js +69 -63
- package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.js.map +1 -1
- package/dist/components/AccessRequirementList/AccessApprovalCheckMark.js.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementListUtils.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.js.map +1 -1
- package/dist/components/AccessRequirementList/RequirementItem/SelfSignAccessRequirementItem.js.map +1 -1
- package/dist/components/AccessRequirementRelatedProjectsList/AccessRequirementRelatedProjectsList.js.map +1 -1
- package/dist/components/AccessTokenPage/AccessTokenCard/AccessTokenCard.js.map +1 -1
- package/dist/components/AcknowledgementsPage/StudyAcknowledgements.js.map +1 -1
- package/dist/components/AclEditor/PermissionLevelMenu.js.map +1 -1
- package/dist/components/AclEditor/ResourceAccessAndUserGroupHeader.js.map +1 -1
- package/dist/components/AclEditor/useSortResourceAccessList.js.map +1 -1
- package/dist/components/AclEditor/useUpdateAcl.js.map +1 -1
- package/dist/components/Aridhia/AridhiaAccessStatus.js.map +1 -1
- package/dist/components/Authentication/AuthenticationMethodSelection.d.ts.map +1 -1
- package/dist/components/Authentication/AuthenticationMethodSelection.js +38 -37
- package/dist/components/Authentication/AuthenticationMethodSelection.js.map +1 -1
- package/dist/components/Authentication/Constants.d.ts +1 -0
- package/dist/components/Authentication/Constants.d.ts.map +1 -1
- package/dist/components/Authentication/Constants.js +2 -2
- package/dist/components/Authentication/Constants.js.map +1 -1
- package/dist/components/Authentication/LastLoginInfo.js.map +1 -1
- package/dist/components/Authentication/RecoveryCodeForm.js.map +1 -1
- package/dist/components/Authentication/RecoveryCodeGrid.js.map +1 -1
- package/dist/components/Authentication/RegenerateBackupCodesWarning.js.map +1 -1
- package/dist/components/Authentication/Reset2FAWarning.js.map +1 -1
- package/dist/components/Authentication/StandaloneLoginForm.js +1 -1
- package/dist/components/Authentication/TwoFactorBackupCodes.js.map +1 -1
- package/dist/components/Authentication/TwoFactorEnrollmentForm.d.ts.map +1 -1
- package/dist/components/Authentication/TwoFactorEnrollmentForm.js +2 -1
- package/dist/components/Authentication/TwoFactorEnrollmentForm.js.map +1 -1
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.js.map +1 -1
- package/dist/components/CardContainer/CardContainer.js.map +1 -1
- package/dist/components/CardDeck/CardDeck.Mobile.js.map +1 -1
- package/dist/components/CardDeck/TableQueryCardDeck.js.map +1 -1
- package/dist/components/CertificationQuiz/CertificationQuiz.js.map +1 -1
- package/dist/components/ChallengeDataDownload/ChallengeDataDownload.js.map +1 -1
- package/dist/components/ChallengeSubmission/ChallengeSubmission.js.map +1 -1
- package/dist/components/ChallengeSubmission/ChallengeSubmissionStepper.js.map +1 -1
- package/dist/components/ChallengeSubmission/EvaluationQueueCurrentRoundInfo.js.map +1 -1
- package/dist/components/ChallengeSubmission/EvaluationQueueList.js.map +1 -1
- package/dist/components/ChallengeSubmission/SubmissionDirectoryList.d.ts.map +1 -1
- package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js +143 -140
- package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/ChallengeTeamWizard.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js.map +1 -1
- package/dist/components/ChangePassword/ChangePassword.js.map +1 -1
- package/dist/components/ChangePassword/ChangePasswordWithToken.js.map +1 -1
- package/dist/components/ChangePassword/useChangePasswordFormState.js +1 -1
- package/dist/components/ChangePassword/useChangePasswordFormState.js.map +1 -1
- package/dist/components/CitationPopover/CitationPopoverContent.js.map +1 -1
- package/dist/components/ColumnFilter/ColumnFilter.js.map +1 -1
- package/dist/components/ComponentCollapse.js.map +1 -1
- package/dist/components/CookiesNotification/CookiesNotification.js.map +1 -1
- package/dist/components/CreateProjectModal/CreateProjectModal.js.map +1 -1
- package/dist/components/CreateTableViewWizard/CreateTableViewWizardUtils.js.map +1 -1
- package/dist/components/DataGrid/DataGrid.d.ts +0 -1
- package/dist/components/DataGrid/DataGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/DataGrid.js +72 -72
- package/dist/components/DataGrid/DataGrid.js.map +1 -1
- package/dist/components/DataGrid/DataGridWebSocket.d.ts +4 -0
- package/dist/components/DataGrid/DataGridWebSocket.d.ts.map +1 -1
- package/dist/components/DataGrid/DataGridWebSocket.js +9 -8
- package/dist/components/DataGrid/DataGridWebSocket.js.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.js +326 -268
- package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts +2 -0
- package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteColumn.js +124 -67
- package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts +2 -1
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js +126 -122
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js.map +1 -1
- package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts +58 -0
- package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts.map +1 -0
- package/dist/components/DataGrid/columns/useGridAutocompleteState.js +52 -0
- package/dist/components/DataGrid/columns/useGridAutocompleteState.js.map +1 -0
- package/dist/components/DataGrid/components/ValidationAlert.d.ts +5 -2
- package/dist/components/DataGrid/components/ValidationAlert.d.ts.map +1 -1
- package/dist/components/DataGrid/components/ValidationAlert.js +429 -24
- package/dist/components/DataGrid/components/ValidationAlert.js.map +1 -1
- package/dist/components/DataGrid/hooks/useColumnResizeHandles.js.map +1 -1
- package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js.map +1 -1
- package/dist/components/DataGrid/hooks/useGridUndoRedo.js.map +1 -1
- package/dist/components/DataGrid/hooks/useStack.js.map +1 -1
- package/dist/components/DataGrid/useCRDTModelView.js.map +1 -1
- package/dist/components/DataGrid/useDataGridWebsocket.d.ts +7 -0
- package/dist/components/DataGrid/useDataGridWebsocket.d.ts.map +1 -1
- package/dist/components/DataGrid/useDataGridWebsocket.js +16 -2
- package/dist/components/DataGrid/useDataGridWebsocket.js.map +1 -1
- package/dist/components/DataGrid/useInitializeGridConnection.js.map +1 -1
- package/dist/components/DataGrid/useMergeGridWithRecordSet.js.map +1 -1
- package/dist/components/DataGrid/useMergeGridWithSource.js.map +1 -1
- package/dist/components/DataGrid/useMergeGridWithTable.js.map +1 -1
- package/dist/components/DataGrid/utils/DataGridUtils.js.map +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.d.ts +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.js +27 -24
- package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.d.ts +8 -0
- package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.js +47 -44
- package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
- package/dist/components/DataGrid/utils/computeReplicaSelectionModel.js.map +1 -1
- package/dist/components/DataGrid/utils/extractColumnValidationMessages.js.map +1 -1
- package/dist/components/DataGrid/utils/getCellClassName.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/getCellClassName.js +8 -8
- package/dist/components/DataGrid/utils/getCellClassName.js.map +1 -1
- package/dist/components/DataGrid/utils/getEmptyValue.d.ts +2 -0
- package/dist/components/DataGrid/utils/getEmptyValue.d.ts.map +1 -0
- package/dist/components/DataGrid/utils/getEmptyValue.js +8 -0
- package/dist/components/DataGrid/utils/getEmptyValue.js.map +1 -0
- package/dist/components/DataGrid/utils/json-rx/JsonRx.js.map +1 -1
- package/dist/components/DataGrid/utils/modelColsToGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/modelColsToGrid.js +2 -1
- package/dist/components/DataGrid/utils/modelColsToGrid.js.map +1 -1
- package/dist/components/DataGrid/utils/modelRowsToGrid.js.map +1 -1
- package/dist/components/DataGrid/utils/parseFreeTextUsingJsonSchemaType.js.map +1 -1
- package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts +32 -0
- package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts.map +1 -0
- package/dist/components/DataGrid/utils/schemaAwarePasteValue.js +22 -0
- package/dist/components/DataGrid/utils/schemaAwarePasteValue.js.map +1 -0
- package/dist/components/DataGrid/utils/splitPatch.js.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
- package/dist/components/DirectDownload/DirectDownload.js.map +1 -1
- package/dist/components/DirectDownloadButton.js.map +1 -1
- package/dist/components/DownloadCart/CreatePackageV2.js.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.css +1 -0
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.d.ts.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +199 -132
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js +22 -0
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js.map +1 -0
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.scss +170 -0
- package/dist/components/DownloadCart/DownloadListActionsRequired.js.map +1 -1
- package/dist/components/DownloadCart/DownloadListTable.js.map +1 -1
- package/dist/components/DownloadCart/fileNameUtils.js.map +1 -1
- package/dist/components/DraggableDialog/DraggableDialog.js.map +1 -1
- package/dist/components/DynamicForm/DynamicFormModal.js.map +1 -1
- package/dist/components/Ecosystem/TableQueryEcosystem.js.map +1 -1
- package/dist/components/EntityAclEditor/EntityAclEditor.d.ts.map +1 -1
- package/dist/components/EntityAclEditor/EntityAclEditor.js +103 -103
- package/dist/components/EntityAclEditor/EntityAclEditor.js.map +1 -1
- package/dist/components/EntityAclEditor/useNotifyNewACLUsers.js.map +1 -1
- package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js.map +1 -1
- package/dist/components/EntityCitation/EntityCitation.js.map +1 -1
- package/dist/components/EntityDownloadButton/EntityDownloadButton.d.ts.map +1 -1
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js +1 -0
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
- package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.d.ts.map +1 -1
- package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js +36 -30
- package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js.map +1 -1
- package/dist/components/EntityFinder/EntityFinder.js.map +1 -1
- package/dist/components/EntityFinder/VersionSelectionType.js.map +1 -1
- package/dist/components/EntityFinder/details/configurations/EntityChildrenDetails.js.map +1 -1
- package/dist/components/EntityFinder/details/configurations/FavoritesDetails.js.map +1 -1
- package/dist/components/EntityFinder/details/configurations/ProjectListDetails.js.map +1 -1
- package/dist/components/EntityFinder/details/view/DetailsView.js.map +1 -1
- package/dist/components/EntityFinder/tree/EntityTree.js.map +1 -1
- package/dist/components/EntityFinder/tree/VirtualizedTree.js.map +1 -1
- package/dist/components/EntityFinder/useEntitySelection.js.map +1 -1
- package/dist/components/EntityForm/EntityForm.js.map +1 -1
- package/dist/components/EntityHeaderTable/EntityHeaderTable.js.map +1 -1
- package/dist/components/EntityHeaderTable/Filter.js.map +1 -1
- package/dist/components/EntityHeaderTable/useEntityHeaderTableState.js.map +1 -1
- package/dist/components/EntitySubjectsSelector/EntitySubjectsSelector.js.map +1 -1
- package/dist/components/EntityTreeTable/components/IdColumnHeader.js.map +1 -1
- package/dist/components/EntityTreeTable/hooks/useEntityTreeState.js.map +1 -1
- package/dist/components/EntityTreeTable/hooks/useTableColumns.js.map +1 -1
- package/dist/components/EntityTreeTable/hooks/useTableData.js.map +1 -1
- package/dist/components/EntityTreeTable/hooks/useTreeOperationsWithDirectFetch.js.map +1 -1
- package/dist/components/EntityUpload/EntityUpload.js.map +1 -1
- package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.d.ts.map +1 -1
- package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js +15 -14
- package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js.map +1 -1
- package/dist/components/ExperimentalMode/ExperimentalMode.js.map +1 -1
- package/dist/components/ExternalFileHandleLink/ExternalFileHandleLink.js.map +1 -1
- package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
- package/dist/components/FeaturedDataTabs/QueryPerFacetPlotsCard.js.map +1 -1
- package/dist/components/FeaturedDataTabs/SingleQueryFacetPlotsCards.js.map +1 -1
- package/dist/components/FeaturedResearch/FeaturedResearch.js.map +1 -1
- package/dist/components/FeaturedToolsList/FeaturedToolsList.js.map +1 -1
- package/dist/components/FilePreview/FileHandleContentRenderer.js.map +1 -1
- package/dist/components/FilePreview/HtmlPreview/HtmlPreview.js.map +1 -1
- package/dist/components/FilePreview/PreviewRendererType.js.map +1 -1
- package/dist/components/Forum/DiscussionReply.d.ts +1 -0
- package/dist/components/Forum/DiscussionReply.d.ts.map +1 -1
- package/dist/components/Forum/DiscussionReply.js +19 -19
- package/dist/components/Forum/DiscussionReply.js.map +1 -1
- package/dist/components/Forum/DiscussionSearchResult.js.map +1 -1
- package/dist/components/Forum/DiscussionThread.d.ts +1 -0
- package/dist/components/Forum/DiscussionThread.d.ts.map +1 -1
- package/dist/components/Forum/DiscussionThread.js +73 -72
- package/dist/components/Forum/DiscussionThread.js.map +1 -1
- package/dist/components/Forum/ForumTable.js.map +1 -1
- package/dist/components/Forum/ForumThreadEditor.js.map +1 -1
- package/dist/components/FullTextSearch/FullTextSearchUtils.js.map +1 -1
- package/dist/components/GenericCard/BioregistryRules.d.ts.map +1 -1
- package/dist/components/GenericCard/BioregistryRules.js +7 -3
- package/dist/components/GenericCard/BioregistryRules.js.map +1 -1
- package/dist/components/GenericCard/GenericCard.d.ts.map +1 -1
- package/dist/components/GenericCard/GenericCard.js +12 -7
- package/dist/components/GenericCard/GenericCard.js.map +1 -1
- package/dist/components/GenericCard/Linkify.js.map +1 -1
- package/dist/components/GenericCard/SynapseCardLabel.js.map +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.js +105 -105
- package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
- package/dist/components/Goals/Goals.Mobile.js.map +1 -1
- package/dist/components/Goals/Goals.js.map +1 -1
- package/dist/components/GoalsV2/GoalsV2.Mobile.js.map +1 -1
- package/dist/components/GoalsV2/GoalsV2.js.map +1 -1
- package/dist/components/GoalsV3/GoalsV3.Mobile.js.map +1 -1
- package/dist/components/GoalsV3/GoalsV3.js.map +1 -1
- package/dist/components/GoogleMap/SynapseUserMarker.js.map +1 -1
- package/dist/components/HasAccess/AccessIcon.js.map +1 -1
- package/dist/components/HasAccess/useHasAccess.js.map +1 -1
- package/dist/components/HeaderCard/HeaderCardV2.js.map +1 -1
- package/dist/components/HeaderCard.d.ts +6 -1
- package/dist/components/HeaderCard.d.ts.map +1 -1
- package/dist/components/HeaderCard.js +107 -76
- package/dist/components/HeaderCard.js.map +1 -1
- package/dist/components/HexGrid/HexGrid.js.map +1 -1
- package/dist/components/IconList.js.map +1 -1
- package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
- package/dist/components/IconSvg/IconSvg.js +2 -1
- package/dist/components/IconSvg/IconSvg.js.map +1 -1
- package/dist/components/ImageCardGridWithLinks/ImageCardGridWithLinks.js.map +1 -1
- package/dist/components/ImageFromSynapseTable.js.map +1 -1
- package/dist/components/JSONArrayEditor/useParseCsv.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/ArrayFieldDescriptionTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/ArrayFieldItemTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/FieldTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/RJSFInputLabel.js.map +1 -1
- package/dist/components/Markdown/MarkdownGithub.js.map +1 -1
- package/dist/components/Markdown/MarkdownSynapse.js.map +1 -1
- package/dist/components/Markdown/MarkdownUtils.js.map +1 -1
- package/dist/components/Markdown/SynapseWikiContext.js.map +1 -1
- package/dist/components/Markdown/UserMentionModal.js.map +1 -1
- package/dist/components/Markdown/widget/MarkdownProvenanceGraph.js.map +1 -1
- package/dist/components/MissingQueryResultsWarning/MissingQueryResultsWarning.js.map +1 -1
- package/dist/components/ModalDownload/ModalDownload.js.map +1 -1
- package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.d.ts.map +1 -1
- package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.js +45 -39
- package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.js.map +1 -1
- package/dist/components/OAuthClientManagement/OAuthManagement.js.map +1 -1
- package/dist/components/PageProgress/PageProgress.js.map +1 -1
- package/dist/components/Plot/DotPlot.js.map +1 -1
- package/dist/components/Plot/Plot.js.map +1 -1
- package/dist/components/Plot/SynapsePlot.js.map +1 -1
- package/dist/components/Plot/ThemesPlot.js.map +1 -1
- package/dist/components/Plot/UpsetPlot.js.map +1 -1
- package/dist/components/PortalAclEditor/PortalAclEditor.d.ts.map +1 -1
- package/dist/components/PortalAclEditor/PortalAclEditor.js +43 -41
- package/dist/components/PortalAclEditor/PortalAclEditor.js.map +1 -1
- package/dist/components/PortalFeaturedPartners/PortalFeaturedPartners.js.map +1 -1
- package/dist/components/PortalList/CreatePortalModal.js.map +1 -1
- package/dist/components/ProgrammaticInstructionsModal/ProgrammaticInstructionsModal.js.map +1 -1
- package/dist/components/ProgrammaticTableDownload/ProgrammaticTableDownload.js.map +1 -1
- package/dist/components/Programs/Programs.Mobile.js.map +1 -1
- package/dist/components/Programs/Programs.js.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceExternalIcon.js.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceGraph.js.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceGraphUtils.js.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceUtils.js.map +1 -1
- package/dist/components/QueryCount/QueryCount.js.map +1 -1
- package/dist/components/QueryCountButton/QueryCountButton.js.map +1 -1
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
- package/dist/components/QueryWrapper/QueryWrapper.js.map +1 -1
- package/dist/components/QueryWrapper/TableQueryUseQueryOptions.js.map +1 -1
- package/dist/components/QueryWrapper/TableRowSelectionState.js.map +1 -1
- package/dist/components/QueryWrapper/generateEncodedPathAndQueryForSelectedFacetURL.js.map +1 -1
- package/dist/components/QueryWrapper/useGetQueryMetadata.js.map +1 -1
- package/dist/components/QueryWrapperErrorBoundary.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/UseRowSet.js.map +1 -1
- package/dist/components/RecentPublicationsGrid/RecentPublicationsGrid.js.map +1 -1
- package/dist/components/ReleaseCard/ReleaseCardUtils.js.map +1 -1
- package/dist/components/ResizableContainer/hooks/useResizable.js.map +1 -1
- package/dist/components/Resources/Resources.Mobile.js.map +1 -1
- package/dist/components/Resources/Resources.js.map +1 -1
- package/dist/components/RowDataTable/RowDataTableWithQuery.js.map +1 -1
- package/dist/components/SageResourcesPopover/SageResourcesPopover.js.map +1 -1
- package/dist/components/SchemaDrivenAnnotationEditor/AnnotationEditorUtils.js.map +1 -1
- package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js.map +1 -1
- package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js.map +1 -1
- package/dist/components/SmartLink/SmartButton.js.map +1 -1
- package/dist/components/SmartLink/SmartLink.js.map +1 -1
- package/dist/components/SourceAppImage.js.map +1 -1
- package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.js.map +1 -1
- package/dist/components/StatisticsPlot.js.map +1 -1
- package/dist/components/StorybookComponentWrapper.js.map +1 -1
- package/dist/components/SubsectionRowRenderer/SubsectionRowRenderer.js.map +1 -1
- package/dist/components/SustainabilityScorecard/SustainabilityScorecard.js.map +1 -1
- package/dist/components/SynapseChat/GridAgentChat.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChatInteraction.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChatMessage.js.map +1 -1
- package/dist/components/SynapseChat/extractMessageFromTraceEvent.js.map +1 -1
- package/dist/components/SynapseForm/StepsSideNav.js.map +1 -1
- package/dist/components/SynapseForm/SummaryTable.js.map +1 -1
- package/dist/components/SynapseForm/SynapseForm.js +4 -2
- package/dist/components/SynapseForm/SynapseForm.js.map +1 -1
- package/dist/components/SynapseForm/SynapseFormWrapper.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseByTheNumbersItem.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseFeatureItem.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageSearch.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseInActionItem.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapsePlans.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseTrendingProjects.js.map +1 -1
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.d.ts +8 -7
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.d.ts.map +1 -1
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js +173 -164
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js.map +1 -1
- package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanel.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SynapseSearchPageResults.js.map +1 -1
- package/dist/components/SynapseTable/EntityIDColumnCopyIcon.js.map +1 -1
- package/dist/components/SynapseTable/NoContentPlaceholderType.js.map +1 -1
- package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableCell/SynapseTableCell.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableRenderers.js.map +1 -1
- package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js.map +1 -1
- package/dist/components/SynapseTable/table-top/ColumnSelection.js.map +1 -1
- package/dist/components/SynapseTable/table-top/DownloadOptions.js.map +1 -1
- package/dist/components/SynapseTable/usePrefetchTableData.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelFormFields/DefaultValueField.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ImportTableColumnsButton.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.d.ts +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.d.ts.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaFormReducer.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/ColumnModelValidator.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/DatetimeSchema.js.map +1 -1
- package/dist/components/TanStackTable/ColumnHeader.d.ts +1 -0
- package/dist/components/TanStackTable/ColumnHeader.d.ts.map +1 -1
- package/dist/components/TanStackTable/ColumnHeader.js +8 -8
- package/dist/components/TanStackTable/ColumnHeader.js.map +1 -1
- package/dist/components/TanStackTable/ColumnHeaderEnumFilter.js.map +1 -1
- package/dist/components/TanStackTable/TableBody.js.map +1 -1
- package/dist/components/TeamSubjectsSelector/TeamSubjectsSelector.js.map +1 -1
- package/dist/components/TextField/TextField.js.map +1 -1
- package/dist/components/TimelinePlot/TimelinePhase.js.map +1 -1
- package/dist/components/TimelinePlot/TimelinePlot.js.map +1 -1
- package/dist/components/TimelinePlot/TimelinePlotSpeciesSelector.js.map +1 -1
- package/dist/components/UserCard/Avatar.js.map +1 -1
- package/dist/components/UserCardList/UserCardList.js.map +1 -1
- package/dist/components/UserCardList/UserCardListGroups/UserCardListGroups.Mobile.js.map +1 -1
- package/dist/components/UserCardList/UserCardListRotate.js.map +1 -1
- package/dist/components/UserOrTeamBadge/useUserOrTeam.js.map +1 -1
- package/dist/components/UserProfileLinks/UserProjects.js.map +1 -1
- package/dist/components/UserSearchBox/UserSearchBox.js.map +1 -1
- package/dist/components/Webhook/WebhookDashboard.js.map +1 -1
- package/dist/components/WikiMarkdownEditor/WikiMarkdownEditor.js.map +1 -1
- package/dist/components/WikiMarkdownEditorButton/WikiMarkdownEditorButton.js.map +1 -1
- package/dist/components/dataaccess/AccessApprovalsTable.js.map +1 -1
- package/dist/components/dataaccess/AccessRequestSubmissionTable.js.map +1 -1
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.d.ts.map +1 -1
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js +157 -148
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
- package/dist/components/dataaccess/UseAccessRequirementTable.js.map +1 -1
- package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryTable.js.map +1 -1
- package/dist/components/doi/CreateOrUpdateDoiModal.d.ts.map +1 -1
- package/dist/components/doi/CreateOrUpdateDoiModal.js +20 -19
- package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
- package/dist/components/entity/page/CreatedByModifiedBy.js.map +1 -1
- package/dist/components/entity/page/action_menu/EntityActionMenu.js.map +1 -1
- package/dist/components/entity/page/title_bar/useDataCiteUsage.js.map +1 -1
- package/dist/components/entity/page/title_bar/useGetMentions.js.map +1 -1
- package/dist/components/error/ErrorPage.js.map +1 -1
- package/dist/components/favorites/FavoritesPage.js.map +1 -1
- package/dist/components/file/upload/BasicFileHandleUpload.js.map +1 -1
- package/dist/components/layout/SWCHeader.d.ts +9 -0
- package/dist/components/layout/SWCHeader.d.ts.map +1 -0
- package/dist/components/layout/SWCHeader.js +19 -0
- package/dist/components/layout/SWCHeader.js.map +1 -0
- package/dist/components/layout/SWCPageLayout.d.ts +9 -0
- package/dist/components/layout/SWCPageLayout.d.ts.map +1 -0
- package/dist/components/layout/SWCPageLayout.js +14 -0
- package/dist/components/layout/SWCPageLayout.js.map +1 -0
- package/dist/components/menu/ComplexMenu.js.map +1 -1
- package/dist/components/row_renderers/utils/ChipContainer.js.map +1 -1
- package/dist/components/styled/StyledPopover.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreview.js +2 -1
- package/dist/components/table/CsvPreview/CsvPreview.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
- package/dist/components/trash/TrashCanList.js.map +1 -1
- package/dist/components/widgets/FileHandleLink.js.map +1 -1
- package/dist/components/widgets/RangeSlider/RangeSlider.js.map +1 -1
- package/dist/components/widgets/SynapseVideo.js.map +1 -1
- package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
- package/dist/components/widgets/facet-nav/PlotsContainer.js.map +1 -1
- package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js.map +1 -1
- package/dist/components/widgets/facet-nav/useFacetPlots.js.map +1 -1
- package/dist/components/widgets/query-filter/CombinedRangeFacetFilter.js.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js.map +1 -1
- package/dist/components/widgets/query-filter/FacetFilterControls.js.map +1 -1
- package/dist/components/widgets/query-filter/RangeFacetFilter.js.map +1 -1
- package/dist/components/widgets/query-filter/RangeFacetFilterUI.js.map +1 -1
- package/dist/features/curator/GridPage/components/GridPageTitle.d.ts.map +1 -1
- package/dist/features/curator/GridPage/components/GridPageTitle.js +23 -30
- package/dist/features/curator/GridPage/components/GridPageTitle.js.map +1 -1
- package/dist/features/curator/dashboard/CuratorDashboard.d.ts +2 -0
- package/dist/features/curator/dashboard/CuratorDashboard.d.ts.map +1 -0
- package/dist/features/curator/dashboard/CuratorDashboard.js +45 -0
- package/dist/features/curator/dashboard/CuratorDashboard.js.map +1 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.css +1 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts +9 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts.map +1 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.js +106 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.js.map +1 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.module.js +12 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.module.js.map +1 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.module.scss +52 -0
- package/dist/features/curator/dashboard/components/NextStepButton.css +1 -0
- package/dist/features/curator/dashboard/components/NextStepButton.d.ts +14 -0
- package/dist/features/curator/dashboard/components/NextStepButton.d.ts.map +1 -0
- package/dist/features/curator/dashboard/components/NextStepButton.js +35 -0
- package/dist/features/curator/dashboard/components/NextStepButton.js.map +1 -0
- package/dist/features/curator/dashboard/components/NextStepButton.module.js +11 -0
- package/dist/features/curator/dashboard/components/NextStepButton.module.js.map +1 -0
- package/dist/features/curator/dashboard/components/NextStepButton.module.scss +57 -0
- package/dist/features/curator/dashboard/components/UserOrTeamChip.css +1 -1
- package/dist/features/curator/dashboard/components/UserOrTeamChip.module.js +1 -1
- package/dist/features/curator/dashboard/components/UserOrTeamChip.module.js.map +1 -1
- package/dist/features/curator/dashboard/components/UserOrTeamChip.module.scss +5 -5
- package/dist/features/curator/dashboard/components/shared.css +1 -0
- package/dist/features/curator/dashboard/components/shared.module.js +5 -0
- package/dist/features/curator/dashboard/components/shared.module.js.map +1 -0
- package/dist/features/curator/dashboard/components/shared.module.scss +8 -0
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts +0 -2
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js +16 -34
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useGetOrCreateGridSessionForSource.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask_legacy.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js +1 -1
- package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts +10 -0
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts.map +1 -0
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js +37 -0
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js.map +1 -0
- package/dist/features/entity/metadata-task/utils/constants.d.ts +5 -0
- package/dist/features/entity/metadata-task/utils/constants.d.ts.map +1 -0
- package/dist/features/entity/metadata-task/utils/constants.js +6 -0
- package/dist/features/entity/metadata-task/utils/constants.js.map +1 -0
- package/dist/mocks/challenge/mockChallenge.js.map +1 -1
- package/dist/mocks/entity/mockDataset.js.map +1 -1
- package/dist/mocks/entity/mockDatasetCollection.js.map +1 -1
- package/dist/mocks/entity/mockFileEntity.js.map +1 -1
- package/dist/mocks/entity/mockFileView.js.map +1 -1
- package/dist/mocks/entity/mockGeneratedEntityData.js.map +1 -1
- package/dist/mocks/entity/mockProject.js.map +1 -1
- package/dist/mocks/entity/mockProjectView.js.map +1 -1
- package/dist/mocks/entity/mockRootEntity.js.map +1 -1
- package/dist/mocks/entity/mockTableEntity.js.map +1 -1
- package/dist/mocks/mockWiki.js.map +1 -1
- package/dist/mocks/msw/handlers/asyncJobHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/challengeHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/changePasswordHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/discussionHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/entityHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/fileHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/gridHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/personalAccessTokenHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/subscriptionHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/teamHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/userProfileHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/wikiHandlers.js.map +1 -1
- package/dist/mocks/provenance/mockActivity.js.map +1 -1
- package/dist/mocks/query/mockReleaseCardsTableQueryResultBundle.js.map +1 -1
- package/dist/ror-client/index.js.map +1 -1
- package/dist/style/components/_cards.scss +4 -0
- package/dist/style/components/_data-grid-extra.css +1 -1
- package/dist/style/components/_data-grid-extra.scss +2 -0
- package/dist/style/main.css +1 -1
- package/dist/synapse-client/HttpClient.js.map +1 -1
- package/dist/synapse-client/SynapseClient.js.map +1 -1
- package/dist/synapse-queries/KeyFactory.d.ts +1 -0
- package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
- package/dist/synapse-queries/KeyFactory.js +3 -0
- package/dist/synapse-queries/KeyFactory.js.map +1 -1
- package/dist/synapse-queries/QueryMatching.test-utils.js.map +1 -1
- package/dist/synapse-queries/auth/useTwoFactorEnrollment.js.map +1 -1
- package/dist/synapse-queries/curation/task/useCurationTask.d.ts +1 -1
- package/dist/synapse-queries/curation/task/useCurationTask.d.ts.map +1 -1
- package/dist/synapse-queries/curation/task/useCurationTask.js +1 -1
- package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useRestrictionInformation.js.map +1 -1
- package/dist/synapse-queries/doi/useDOI.js.map +1 -1
- package/dist/synapse-queries/download/useDownloadList.js.map +1 -1
- package/dist/synapse-queries/entity/useEntity.js.map +1 -1
- package/dist/synapse-queries/entity/useEntityBundle.js.map +1 -1
- package/dist/synapse-queries/entity/useExportTableQueryToAnalysisPlatform.js.map +1 -1
- package/dist/synapse-queries/entity/useExportToTerra.js.map +1 -1
- package/dist/synapse-queries/entity/useGetQueryResultBundle.js.map +1 -1
- package/dist/synapse-queries/entity/useSchema.js.map +1 -1
- package/dist/synapse-queries/file/UploadToS3.js.map +1 -1
- package/dist/synapse-queries/file/useDirectUploadToS3.js.map +1 -1
- package/dist/synapse-queries/file/useFiles.js.map +1 -1
- package/dist/synapse-queries/forum/useReply.js.map +1 -1
- package/dist/synapse-queries/forum/useThread.d.ts +1 -0
- package/dist/synapse-queries/forum/useThread.d.ts.map +1 -1
- package/dist/synapse-queries/forum/useThread.js +19 -12
- package/dist/synapse-queries/forum/useThread.js.map +1 -1
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.d.ts +2 -0
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.d.ts.map +1 -1
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js.map +1 -1
- package/dist/synapse-queries/grid/useExportGrid.js.map +1 -1
- package/dist/synapse-queries/grid/useGridSession.js.map +1 -1
- package/dist/synapse-queries/grid/useImportCsvIntoGrid.js.map +1 -1
- package/dist/synapse-queries/subscription/useSubscription.js.map +1 -1
- package/dist/synapse-queries/table/useGetCsvPreview.js.map +1 -1
- package/dist/synapse-queries/table/useTableUpdateTransaction.js.map +1 -1
- package/dist/synapse-queries/team/useTeamMembers.js.map +1 -1
- package/dist/synapse-queries/user/useGetUserChallenges.js.map +1 -1
- package/dist/synapse-queries/user/useUserBundle.js.map +1 -1
- package/dist/synapse-queries/user/useUserGroupHeader.js.map +1 -1
- package/dist/testutils/ReactQueryMockUtils.js.map +1 -1
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/APIConstants.d.ts +1 -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/AppUtils/session/ApplicationSessionManager.d.ts.map +1 -1
- package/dist/utils/AppUtils/session/ApplicationSessionManager.js +7 -4
- package/dist/utils/AppUtils/session/ApplicationSessionManager.js.map +1 -1
- package/dist/utils/AppUtils/session/SynapseSessionManager.js.map +1 -1
- package/dist/utils/AppUtils/session/useSessionManager.js.map +1 -1
- package/dist/utils/PermissionLevelToAccessType.js.map +1 -1
- package/dist/utils/challenge/evaluation/EvaluationUtils.js.map +1 -1
- package/dist/utils/context/SynapseContext.js.map +1 -1
- package/dist/utils/functions/AccessControlListUtils.d.ts +4 -0
- package/dist/utils/functions/AccessControlListUtils.d.ts.map +1 -1
- package/dist/utils/functions/AccessControlListUtils.js +12 -1
- package/dist/utils/functions/AccessControlListUtils.js.map +1 -1
- package/dist/utils/functions/EntityTypeUtils.d.ts.map +1 -1
- package/dist/utils/functions/EntityTypeUtils.js +15 -4
- package/dist/utils/functions/EntityTypeUtils.js.map +1 -1
- package/dist/utils/functions/GridApiUtils.js.map +1 -1
- package/dist/utils/functions/QueryFilterUtils.js.map +1 -1
- package/dist/utils/functions/RealmUtils.d.ts +4 -0
- package/dist/utils/functions/RealmUtils.d.ts.map +1 -1
- package/dist/utils/functions/RealmUtils.js +9 -3
- package/dist/utils/functions/RealmUtils.js.map +1 -1
- package/dist/utils/functions/SanitizeHtmlUtils.js.map +1 -1
- package/dist/utils/functions/SanitizeHtmlUtils.test-utils.js.map +1 -1
- package/dist/utils/functions/SqlFunctions.js.map +1 -1
- package/dist/utils/functions/StringUtils.js.map +1 -1
- package/dist/utils/functions/deepLinkingUtils.js.map +1 -1
- package/dist/utils/functions/getDataFromFromStorage.js.map +1 -1
- package/dist/utils/functions/getEndpoint.js.map +1 -1
- package/dist/utils/functions/getUserData.js.map +1 -1
- package/dist/utils/functions/queryUtils.js.map +1 -1
- package/dist/utils/functions/testDownloadSpeed.js.map +1 -1
- package/dist/utils/hooks/useConfirmItems.js.map +1 -1
- package/dist/utils/hooks/useCookiePreferences.js.map +1 -1
- package/dist/utils/hooks/useCreateShortUrl.js.map +1 -1
- package/dist/utils/hooks/useDetectSSOCode.js.map +1 -1
- package/dist/utils/hooks/useDirectDownloadHandler.js.map +1 -1
- package/dist/utils/hooks/useGetGoalData.js.map +1 -1
- package/dist/utils/hooks/useGetInfoFromIds.js.map +1 -1
- package/dist/utils/hooks/useImageUrlUtils.js.map +1 -1
- package/dist/utils/hooks/useImmutableTableQuery/useImmutableTableQuery.js.map +1 -1
- package/dist/utils/hooks/useImmutableTableQuery/useTableQueryReducer.js.map +1 -1
- package/dist/utils/hooks/useIsBot.js.map +1 -1
- package/dist/utils/hooks/useListState.js.map +1 -1
- package/dist/utils/hooks/useLogin.d.ts.map +1 -1
- package/dist/utils/hooks/useLogin.js +53 -52
- package/dist/utils/hooks/useLogin.js.map +1 -1
- package/dist/utils/hooks/useMutuallyExclusiveState.js.map +1 -1
- package/dist/utils/hooks/useOverlay.js.map +1 -1
- package/dist/utils/hooks/usePreFetchResource.js.map +1 -1
- package/dist/utils/hooks/useQuerySearchParam.js.map +1 -1
- package/dist/utils/hooks/useScrollFadeTransition.js.map +1 -1
- package/dist/utils/hooks/useSet.js.map +1 -1
- package/dist/utils/hooks/useSourceAppConfigs.js.map +1 -1
- package/dist/utils/hooks/useTableImageUrl.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/useCreatePathsAndGetParentId.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/useLinkFileEntityToURL.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/usePrepareFileEntityUpload.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/useTrackFileUploads.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/useUploadFileEntities.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/useUploadFiles.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/willUploadsExceedStorageLimit.js.map +1 -1
- package/dist/utils/html/TargetEnum.js.map +1 -1
- package/dist/utils/jsonschema/SchemaAnnotationUtils.js.map +1 -1
- package/package.json +5 -5
|
@@ -22,25 +22,25 @@ var C = (n) => {
|
|
|
22
22
|
t(`${`${window.location.origin}${window.location.pathname}`}?${p}=${n}`).then(() => e("Reply link copied to clipboard", "info"));
|
|
23
23
|
};
|
|
24
24
|
function w(t) {
|
|
25
|
-
let { reply: w, isReplyAuthorModerator: T = !1 } = t, [
|
|
26
|
-
|
|
27
|
-
} }),
|
|
25
|
+
let { reply: w, isReplyAuthorModerator: T = !1, isForumModerator: E } = t, [D, O] = g(!1), [k, A] = g(!1), { data: j } = r(), { data: M } = n(w.projectId), { data: N, isLoading: P } = d(w), F = h(null), { mutate: I } = u({ onSuccess: () => {
|
|
26
|
+
A(!1), e("A reply has been deleted.", "info");
|
|
27
|
+
} }), L = w.createdBy == j?.ownerId;
|
|
28
28
|
return m(() => {
|
|
29
29
|
let e = new URLSearchParams(window.location.search).get(p), t;
|
|
30
|
-
return e === w.id &&
|
|
31
|
-
|
|
30
|
+
return e === w.id && F.current && (F.current.style.transition = "background-color 1s ease", F.current.style.backgroundColor = "#fbf4e0", F.current.style.borderColor = "#f4dda3", t = setTimeout(() => {
|
|
31
|
+
F.current && (F.current.style.backgroundColor = "#f9f9f9", F.current.style.borderColor = "#ccc");
|
|
32
32
|
}, 2e3)), () => {
|
|
33
33
|
t && clearTimeout(t);
|
|
34
34
|
};
|
|
35
35
|
}, [w.id]), /* @__PURE__ */ y("div", {
|
|
36
36
|
className: "reply-container",
|
|
37
37
|
id: `reply._${w.id}`,
|
|
38
|
-
ref:
|
|
38
|
+
ref: F,
|
|
39
39
|
role: "article",
|
|
40
|
-
children:
|
|
40
|
+
children: P ? /* @__PURE__ */ y(i, {
|
|
41
41
|
numCols: 1,
|
|
42
42
|
numRows: 4
|
|
43
|
-
}) : /* @__PURE__ */ y(v, { children:
|
|
43
|
+
}) : /* @__PURE__ */ y(v, { children: N && /* @__PURE__ */ b(v, { children: [
|
|
44
44
|
/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y(l, {
|
|
45
45
|
userId: w.createdBy,
|
|
46
46
|
withAvatar: !0,
|
|
@@ -51,7 +51,7 @@ function w(t) {
|
|
|
51
51
|
className: "message-body",
|
|
52
52
|
children: [
|
|
53
53
|
/* @__PURE__ */ y(a, {
|
|
54
|
-
markdown:
|
|
54
|
+
markdown: N,
|
|
55
55
|
objectType: x.REPLY
|
|
56
56
|
}),
|
|
57
57
|
/* @__PURE__ */ b("span", { children: [
|
|
@@ -77,15 +77,15 @@ function w(t) {
|
|
|
77
77
|
label: "Copy link to this reply"
|
|
78
78
|
})
|
|
79
79
|
}),
|
|
80
|
-
|
|
81
|
-
onClick: () =>
|
|
80
|
+
L && /* @__PURE__ */ y("button", {
|
|
81
|
+
onClick: () => O(!0),
|
|
82
82
|
children: /* @__PURE__ */ y(o, {
|
|
83
83
|
icon: "edit",
|
|
84
84
|
label: "Edit reply"
|
|
85
85
|
})
|
|
86
86
|
}),
|
|
87
|
-
|
|
88
|
-
onClick: () =>
|
|
87
|
+
(M?.permissions.canModerate || E) && /* @__PURE__ */ y("button", {
|
|
88
|
+
onClick: () => A(!0),
|
|
89
89
|
children: /* @__PURE__ */ y(o, {
|
|
90
90
|
icon: "delete",
|
|
91
91
|
label: "Delete reply"
|
|
@@ -97,20 +97,20 @@ function w(t) {
|
|
|
97
97
|
})] }),
|
|
98
98
|
/* @__PURE__ */ y(f, {
|
|
99
99
|
isReply: !0,
|
|
100
|
-
initialText:
|
|
101
|
-
onClose: () =>
|
|
100
|
+
initialText: N,
|
|
101
|
+
onClose: () => O(!1),
|
|
102
102
|
id: w.id,
|
|
103
103
|
isDialog: !0,
|
|
104
|
-
openDialog:
|
|
104
|
+
openDialog: D
|
|
105
105
|
}),
|
|
106
106
|
/* @__PURE__ */ y(s, {
|
|
107
|
-
open:
|
|
107
|
+
open: k,
|
|
108
108
|
title: "Confirm Deletion",
|
|
109
109
|
content: "Are you sure you want to delete this reply?",
|
|
110
110
|
onCancel: () => {
|
|
111
|
-
|
|
111
|
+
A(!1);
|
|
112
112
|
},
|
|
113
|
-
onConfirm: () =>
|
|
113
|
+
onConfirm: () => I({
|
|
114
114
|
forumId: w.forumId,
|
|
115
115
|
threadId: w.threadId,
|
|
116
116
|
replyId: w.id
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiscussionReply.js","names":[],"sources":["../../../src/components/Forum/DiscussionReply.tsx"],"sourcesContent":["import { useGetCurrentUserProfile, useGetEntityBundle } from '@/synapse-queries'\nimport { useDeleteReply, useGetReply } from '@/synapse-queries/forum/useReply'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport {\n DiscussionReplyBundle,\n ObjectType,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useState, useRef, useEffect } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\nimport MarkdownSynapse from '../Markdown/MarkdownSynapse'\nimport { SkeletonTable } from '../Skeleton/SkeletonTable'\nimport WarningDialog from '../SynapseForm/WarningDialog'\nimport { displayToast } from '../ToastMessage/ToastMessage'\nimport { UserBadge } from '../UserCard/UserBadge'\nimport { ForumThreadEditor } from './ForumThreadEditor'\nimport { Box } from '@mui/material'\nimport { copyStringToClipboard } from '@/utils/functions/StringUtils'\nimport { REPLY_ID_PARAM_KEY } from './DiscussionConstants'\n\nexport type DiscussionReplyProps = {\n reply: DiscussionReplyBundle\n isReplyAuthorModerator?: boolean\n onClickLink?: () => void\n}\n\nconst handleCopyLink = (id: string) => {\n const baseUrl = `${window.location.origin}${window.location.pathname}`\n const url = `${baseUrl}?${REPLY_ID_PARAM_KEY}=${id}`\n copyStringToClipboard(url).then(() =>\n displayToast('Reply link copied to clipboard', 'info'),\n )\n}\n\nexport function DiscussionReply(props: DiscussionReplyProps) {\n const { reply, isReplyAuthorModerator = false } = props\n const [showReplyModal, setShowReplyModal] = useState(false)\n const [showDeleteModal, setShowDeleteModal] = useState(false)\n const { data: currentUserProfile } = useGetCurrentUserProfile()\n const { data: entityBundle } = useGetEntityBundle(reply.projectId)\n const { data: message, isLoading } = useGetReply(reply)\n const replyRef = useRef<HTMLDivElement>(null)\n\n const { mutate: deleteReply } = useDeleteReply({\n onSuccess: () => {\n setShowDeleteModal(false)\n displayToast('A reply has been deleted.', 'info')\n },\n })\n\n const isCurrentUserAuthor = reply.createdBy == currentUserProfile?.ownerId\n\n useEffect(() => {\n const params = new URLSearchParams(window.location.search)\n const replyId = params.get(REPLY_ID_PARAM_KEY)\n let timerId: ReturnType<typeof setTimeout>\n if (replyId === reply.id && replyRef.current) {\n replyRef.current.style.transition = 'background-color 1s ease'\n replyRef.current.style.backgroundColor = '#fbf4e0'\n replyRef.current.style.borderColor = '#f4dda3'\n timerId = setTimeout(() => {\n if (replyRef.current) {\n replyRef.current.style.backgroundColor = '#f9f9f9'\n replyRef.current.style.borderColor = '#ccc'\n }\n }, 2000)\n }\n return () => {\n if (timerId) {\n clearTimeout(timerId)\n }\n }\n }, [reply.id])\n\n return (\n <div\n className=\"reply-container\"\n id={`reply._${reply.id}`}\n ref={replyRef}\n role={'article'}\n >\n {isLoading ? (\n <SkeletonTable numCols={1} numRows={4} />\n ) : (\n <>\n {message && (\n <>\n <div>\n <UserBadge\n userId={reply.createdBy}\n withAvatar={true}\n avatarSize=\"MEDIUM\"\n showCardOnHover={true}\n showModeratorBadge={isReplyAuthorModerator}\n />\n <div className=\"message-body\">\n <MarkdownSynapse\n markdown={message}\n objectType={ObjectType.REPLY}\n />\n <span>\n posted {formatDate(dayjs(reply.createdOn), 'M/D/YYYY')}\n {reply.isEdited ? <i>{' (Edited)'}</i> : null}\n </span>\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'flex-end',\n marginTop: { xs: '8px', sm: 0 },\n float: { sm: 'right' },\n }}\n >\n <button onClick={() => handleCopyLink(reply.id)}>\n <IconSvg icon=\"link\" label={'Copy link to this reply'} />\n </button>\n {isCurrentUserAuthor && (\n <button onClick={() => setShowReplyModal(true)}>\n <IconSvg icon=\"edit\" label={'Edit reply'} />\n </button>\n )}\n {entityBundle?.permissions.canModerate && (\n <button onClick={() => setShowDeleteModal(true)}>\n <IconSvg icon=\"delete\" label={'Delete reply'} />\n </button>\n )}\n </Box>\n </div>\n </div>\n <ForumThreadEditor\n isReply={true}\n initialText={message}\n onClose={() => setShowReplyModal(false)}\n id={reply.id}\n isDialog={true}\n openDialog={showReplyModal}\n />\n <WarningDialog\n open={showDeleteModal}\n title=\"Confirm Deletion\"\n content=\"Are you sure you want to delete this reply?\"\n onCancel={() => {\n setShowDeleteModal(false)\n }}\n onConfirm={() =>\n deleteReply({\n forumId: reply.forumId,\n threadId: reply.threadId,\n replyId: reply.id,\n })\n }\n confirmButtonColor=\"error\"\n confirmButtonText=\"Delete\"\n />\n </>\n )}\n </>\n )}\n </div>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"DiscussionReply.js","names":[],"sources":["../../../src/components/Forum/DiscussionReply.tsx"],"sourcesContent":["import { useGetCurrentUserProfile, useGetEntityBundle } from '@/synapse-queries'\nimport { useDeleteReply, useGetReply } from '@/synapse-queries/forum/useReply'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport {\n DiscussionReplyBundle,\n ObjectType,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useState, useRef, useEffect } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\nimport MarkdownSynapse from '../Markdown/MarkdownSynapse'\nimport { SkeletonTable } from '../Skeleton/SkeletonTable'\nimport WarningDialog from '../SynapseForm/WarningDialog'\nimport { displayToast } from '../ToastMessage/ToastMessage'\nimport { UserBadge } from '../UserCard/UserBadge'\nimport { ForumThreadEditor } from './ForumThreadEditor'\nimport { Box } from '@mui/material'\nimport { copyStringToClipboard } from '@/utils/functions/StringUtils'\nimport { REPLY_ID_PARAM_KEY } from './DiscussionConstants'\n\nexport type DiscussionReplyProps = {\n reply: DiscussionReplyBundle\n isReplyAuthorModerator?: boolean\n isForumModerator?: boolean\n onClickLink?: () => void\n}\n\nconst handleCopyLink = (id: string) => {\n const baseUrl = `${window.location.origin}${window.location.pathname}`\n const url = `${baseUrl}?${REPLY_ID_PARAM_KEY}=${id}`\n copyStringToClipboard(url).then(() =>\n displayToast('Reply link copied to clipboard', 'info'),\n )\n}\n\nexport function DiscussionReply(props: DiscussionReplyProps) {\n const { reply, isReplyAuthorModerator = false, isForumModerator } = props\n const [showReplyModal, setShowReplyModal] = useState(false)\n const [showDeleteModal, setShowDeleteModal] = useState(false)\n const { data: currentUserProfile } = useGetCurrentUserProfile()\n const { data: entityBundle } = useGetEntityBundle(reply.projectId)\n const { data: message, isLoading } = useGetReply(reply)\n const replyRef = useRef<HTMLDivElement>(null)\n\n const { mutate: deleteReply } = useDeleteReply({\n onSuccess: () => {\n setShowDeleteModal(false)\n displayToast('A reply has been deleted.', 'info')\n },\n })\n\n const isCurrentUserAuthor = reply.createdBy == currentUserProfile?.ownerId\n\n useEffect(() => {\n const params = new URLSearchParams(window.location.search)\n const replyId = params.get(REPLY_ID_PARAM_KEY)\n let timerId: ReturnType<typeof setTimeout>\n if (replyId === reply.id && replyRef.current) {\n replyRef.current.style.transition = 'background-color 1s ease'\n replyRef.current.style.backgroundColor = '#fbf4e0'\n replyRef.current.style.borderColor = '#f4dda3'\n timerId = setTimeout(() => {\n if (replyRef.current) {\n replyRef.current.style.backgroundColor = '#f9f9f9'\n replyRef.current.style.borderColor = '#ccc'\n }\n }, 2000)\n }\n return () => {\n if (timerId) {\n clearTimeout(timerId)\n }\n }\n }, [reply.id])\n\n return (\n <div\n className=\"reply-container\"\n id={`reply._${reply.id}`}\n ref={replyRef}\n role={'article'}\n >\n {isLoading ? (\n <SkeletonTable numCols={1} numRows={4} />\n ) : (\n <>\n {message && (\n <>\n <div>\n <UserBadge\n userId={reply.createdBy}\n withAvatar={true}\n avatarSize=\"MEDIUM\"\n showCardOnHover={true}\n showModeratorBadge={isReplyAuthorModerator}\n />\n <div className=\"message-body\">\n <MarkdownSynapse\n markdown={message}\n objectType={ObjectType.REPLY}\n />\n <span>\n posted {formatDate(dayjs(reply.createdOn), 'M/D/YYYY')}\n {reply.isEdited ? <i>{' (Edited)'}</i> : null}\n </span>\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'flex-end',\n marginTop: { xs: '8px', sm: 0 },\n float: { sm: 'right' },\n }}\n >\n <button onClick={() => handleCopyLink(reply.id)}>\n <IconSvg icon=\"link\" label={'Copy link to this reply'} />\n </button>\n {isCurrentUserAuthor && (\n <button onClick={() => setShowReplyModal(true)}>\n <IconSvg icon=\"edit\" label={'Edit reply'} />\n </button>\n )}\n {(entityBundle?.permissions.canModerate ||\n isForumModerator) && (\n <button onClick={() => setShowDeleteModal(true)}>\n <IconSvg icon=\"delete\" label={'Delete reply'} />\n </button>\n )}\n </Box>\n </div>\n </div>\n <ForumThreadEditor\n isReply={true}\n initialText={message}\n onClose={() => setShowReplyModal(false)}\n id={reply.id}\n isDialog={true}\n openDialog={showReplyModal}\n />\n <WarningDialog\n open={showDeleteModal}\n title=\"Confirm Deletion\"\n content=\"Are you sure you want to delete this reply?\"\n onCancel={() => {\n setShowDeleteModal(false)\n }}\n onConfirm={() =>\n deleteReply({\n forumId: reply.forumId,\n threadId: reply.threadId,\n replyId: reply.id,\n })\n }\n confirmButtonColor=\"error\"\n confirmButtonText=\"Delete\"\n />\n </>\n )}\n </>\n )}\n </div>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA2BA,IAAM,KAAkB,MAAe;AAGrC,GAAsB,GADP,GADI,OAAO,SAAS,SAAS,OAAO,SAAS,WACrC,GAAG,EAAmB,GAAG,IACtB,CAAC,WACzB,EAAa,kCAAkC,OAAO,CACvD;;AAGH,SAAgB,EAAgB,GAA6B;CAC3D,IAAM,EAAE,UAAO,4BAAyB,IAAO,wBAAqB,GAC9D,CAAC,GAAgB,KAAqB,EAAS,GAAM,EACrD,CAAC,GAAiB,KAAsB,EAAS,GAAM,EACvD,EAAE,MAAM,MAAuB,GAA0B,EACzD,EAAE,MAAM,MAAiB,EAAmB,EAAM,UAAU,EAC5D,EAAE,MAAM,GAAS,iBAAc,EAAY,EAAM,EACjD,IAAW,EAAuB,KAAK,EAEvC,EAAE,QAAQ,MAAgB,EAAe,EAC7C,iBAAiB;AAEf,EADA,EAAmB,GAAM,EACzB,EAAa,6BAA6B,OAAO;IAEpD,CAAC,EAEI,IAAsB,EAAM,aAAa,GAAoB;AAwBnE,QAtBA,QAAgB;EAEd,IAAM,IAAU,IADG,gBAAgB,OAAO,SAAS,OACnC,CAAO,IAAI,EAAmB,EAC1C;AAYJ,SAXI,MAAY,EAAM,MAAM,EAAS,YACnC,EAAS,QAAQ,MAAM,aAAa,4BACpC,EAAS,QAAQ,MAAM,kBAAkB,WACzC,EAAS,QAAQ,MAAM,cAAc,WACrC,IAAU,iBAAiB;AACzB,GAAI,EAAS,YACX,EAAS,QAAQ,MAAM,kBAAkB,WACzC,EAAS,QAAQ,MAAM,cAAc;KAEtC,IAAK,SAEG;AACX,GAAI,KACF,aAAa,EAAQ;;IAGxB,CAAC,EAAM,GAAG,CAAC,EAGZ,kBAAC,OAAD;EACE,WAAU;EACV,IAAI,UAAU,EAAM;EACpB,KAAK;EACL,MAAM;YAEL,IACC,kBAAC,GAAD;GAAe,SAAS;GAAG,SAAS;GAAK,CAAA,GAEzC,kBAAA,GAAA,EAAA,UACG,KACC,kBAAA,GAAA,EAAA,UAAA;GACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;IACE,QAAQ,EAAM;IACd,YAAY;IACZ,YAAW;IACX,iBAAiB;IACjB,oBAAoB;IACpB,CAAA,EACF,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MACE,UAAU;MACV,YAAY,EAAW;MACvB,CAAA;KACF,kBAAC,QAAD,EAAA,UAAA;MAAM;MACI,EAAW,EAAM,EAAM,UAAU,EAAE,WAAW;MACrD,EAAM,WAAW,kBAAC,KAAD,EAAA,UAAI,aAAgB,CAAA,GAAG;MACpC,EAAA,CAAA;KACP,kBAAC,GAAD;MACE,IAAI;OACF,SAAS;OACT,gBAAgB;OAChB,WAAW;QAAE,IAAI;QAAO,IAAI;QAAG;OAC/B,OAAO,EAAE,IAAI,SAAS;OACvB;gBANH;OAQE,kBAAC,UAAD;QAAQ,eAAe,EAAe,EAAM,GAAG;kBAC7C,kBAAC,GAAD;SAAS,MAAK;SAAO,OAAO;SAA6B,CAAA;QAClD,CAAA;OACR,KACC,kBAAC,UAAD;QAAQ,eAAe,EAAkB,GAAK;kBAC5C,kBAAC,GAAD;SAAS,MAAK;SAAO,OAAO;SAAgB,CAAA;QACrC,CAAA;QAET,GAAc,YAAY,eAC1B,MACA,kBAAC,UAAD;QAAQ,eAAe,EAAmB,GAAK;kBAC7C,kBAAC,GAAD;SAAS,MAAK;SAAS,OAAO;SAAkB,CAAA;QACzC,CAAA;OAEP;;KACF;MACF,EAAA,CAAA;GACN,kBAAC,GAAD;IACE,SAAS;IACT,aAAa;IACb,eAAe,EAAkB,GAAM;IACvC,IAAI,EAAM;IACV,UAAU;IACV,YAAY;IACZ,CAAA;GACF,kBAAC,GAAD;IACE,MAAM;IACN,OAAM;IACN,SAAQ;IACR,gBAAgB;AACd,OAAmB,GAAM;;IAE3B,iBACE,EAAY;KACV,SAAS,EAAM;KACf,UAAU,EAAM;KAChB,SAAS,EAAM;KAChB,CAAC;IAEJ,oBAAmB;IACnB,mBAAkB;IAClB,CAAA;GACD,EAAA,CAAA,EAEJ,CAAA;EAED,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiscussionSearchResult.js","names":[],"sources":["../../../src/components/Forum/DiscussionSearchResult.tsx"],"sourcesContent":["import {\n getReply,\n getReplyMessageUrl,\n getThread,\n getThreadMessageUrl,\n getUserProfileById,\n} from '@/synapse-client/SynapseClient'\nimport React from 'react'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { PRODUCTION_ENDPOINT_CONFIG } from '@/utils/functions/getEndpoint'\nimport { Box, Skeleton, Typography } from '@mui/material'\nimport {\n DiscussionReplyBundle,\n DiscussionThreadBundle,\n UserProfile,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useEffect, useState } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { SkeletonParagraph } from '../Skeleton/SkeletonParagraph'\nimport { UserBadge } from '../UserCard/UserBadge'\n\nexport const getMessage = async (url: string): Promise<string> => {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Accept: '*/*',\n 'Access-Control-Request-Headers': 'authorization',\n 'Content-Type': 'text/plain; charset=utf-8',\n },\n })\n return response.text()\n}\n\nexport type DiscussionSearchResultProps = {\n threadId: string\n replyId?: string\n}\n\nconst DiscussionSearchResult = (\n props: DiscussionSearchResultProps,\n): React.ReactNode => {\n const { threadId, replyId } = props\n const { accessToken } = useSynapseContext()\n const [threadBundle, setThreadBundle] = useState<DiscussionThreadBundle>()\n const [messageUrl, setMessageUrl] = useState<string>('')\n const [replyBundle, setReplyBundle] = useState<DiscussionReplyBundle>()\n const [replyAuthor, setReplyAuthor] = useState<UserProfile>()\n const [isLoading, setIsLoading] = useState(false)\n\n useEffect(() => {\n const getThreadOrReply = async () => {\n let newMessageUrl\n setIsLoading(true)\n const thread = await getThread(threadId, accessToken)\n if (replyId) {\n const reply = await getReply(replyId, accessToken)\n newMessageUrl = await getReplyMessageUrl(reply.messageKey, accessToken)\n setReplyAuthor(await getUserProfileById(reply.createdBy))\n setReplyBundle(reply)\n } else {\n setReplyAuthor(await getUserProfileById(thread.createdBy))\n newMessageUrl = await getThreadMessageUrl(\n thread.messageKey,\n accessToken,\n )\n }\n setMessageUrl(await getMessage(newMessageUrl.messageUrl))\n setThreadBundle(thread)\n setIsLoading(false)\n }\n getThreadOrReply()\n }, [accessToken, replyId, threadId])\n\n const getUrl = (threadId: string, projectId: string, replyId?: string) => {\n let url = `${PRODUCTION_ENDPOINT_CONFIG.PORTAL}Synapse:${projectId}/discussion/threadId=${threadId}`\n if (replyId) {\n url += `&replyId=${replyId}`\n }\n return url\n }\n\n return (\n <div className=\"search-result-container\">\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: '40px auto',\n }}\n >\n <div>\n {isLoading ? (\n <Skeleton variant=\"circular\" width=\"30px\" height={'30px'} />\n ) : replyId ? (\n <IconSvg icon=\"replyTwoTone\" />\n ) : (\n <IconSvg icon=\"chatTwoTone\" />\n )}\n </div>\n <div>\n {isLoading ? (\n <SkeletonParagraph numRows={4} />\n ) : (\n <>\n <Typography variant=\"headline3\" gutterBottom>\n <a\n className=\"link\"\n href={getUrl(\n threadBundle?.id!,\n threadBundle?.projectId!,\n replyBundle?.id,\n )}\n >\n {threadBundle?.title}\n </a>\n </Typography>\n <div className=\"truncated\">\n <Typography variant=\"body1\" gutterBottom>\n {messageUrl}\n </Typography>\n </div>\n <div className=\"search-result-footer\">\n {replyId ? 'Reply' : 'Thread'} by{' '}\n {<UserBadge userId={replyAuthor?.ownerId} />}{' '}\n {formatDate(dayjs(replyBundle?.createdOn))}\n </div>\n </>\n )}\n </div>\n </Box>\n </div>\n )\n}\n\nexport default DiscussionSearchResult\n"],"mappings":";;;;;;;;;;;;AAuBA,IAAa,IAAa,OAAO,
|
|
1
|
+
{"version":3,"file":"DiscussionSearchResult.js","names":[],"sources":["../../../src/components/Forum/DiscussionSearchResult.tsx"],"sourcesContent":["import {\n getReply,\n getReplyMessageUrl,\n getThread,\n getThreadMessageUrl,\n getUserProfileById,\n} from '@/synapse-client/SynapseClient'\nimport React from 'react'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { PRODUCTION_ENDPOINT_CONFIG } from '@/utils/functions/getEndpoint'\nimport { Box, Skeleton, Typography } from '@mui/material'\nimport {\n DiscussionReplyBundle,\n DiscussionThreadBundle,\n UserProfile,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useEffect, useState } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { SkeletonParagraph } from '../Skeleton/SkeletonParagraph'\nimport { UserBadge } from '../UserCard/UserBadge'\n\nexport const getMessage = async (url: string): Promise<string> => {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Accept: '*/*',\n 'Access-Control-Request-Headers': 'authorization',\n 'Content-Type': 'text/plain; charset=utf-8',\n },\n })\n return response.text()\n}\n\nexport type DiscussionSearchResultProps = {\n threadId: string\n replyId?: string\n}\n\nconst DiscussionSearchResult = (\n props: DiscussionSearchResultProps,\n): React.ReactNode => {\n const { threadId, replyId } = props\n const { accessToken } = useSynapseContext()\n const [threadBundle, setThreadBundle] = useState<DiscussionThreadBundle>()\n const [messageUrl, setMessageUrl] = useState<string>('')\n const [replyBundle, setReplyBundle] = useState<DiscussionReplyBundle>()\n const [replyAuthor, setReplyAuthor] = useState<UserProfile>()\n const [isLoading, setIsLoading] = useState(false)\n\n useEffect(() => {\n const getThreadOrReply = async () => {\n let newMessageUrl\n setIsLoading(true)\n const thread = await getThread(threadId, accessToken)\n if (replyId) {\n const reply = await getReply(replyId, accessToken)\n newMessageUrl = await getReplyMessageUrl(reply.messageKey, accessToken)\n setReplyAuthor(await getUserProfileById(reply.createdBy))\n setReplyBundle(reply)\n } else {\n setReplyAuthor(await getUserProfileById(thread.createdBy))\n newMessageUrl = await getThreadMessageUrl(\n thread.messageKey,\n accessToken,\n )\n }\n setMessageUrl(await getMessage(newMessageUrl.messageUrl))\n setThreadBundle(thread)\n setIsLoading(false)\n }\n getThreadOrReply()\n }, [accessToken, replyId, threadId])\n\n const getUrl = (threadId: string, projectId: string, replyId?: string) => {\n let url = `${PRODUCTION_ENDPOINT_CONFIG.PORTAL}Synapse:${projectId}/discussion/threadId=${threadId}`\n if (replyId) {\n url += `&replyId=${replyId}`\n }\n return url\n }\n\n return (\n <div className=\"search-result-container\">\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: '40px auto',\n }}\n >\n <div>\n {isLoading ? (\n <Skeleton variant=\"circular\" width=\"30px\" height={'30px'} />\n ) : replyId ? (\n <IconSvg icon=\"replyTwoTone\" />\n ) : (\n <IconSvg icon=\"chatTwoTone\" />\n )}\n </div>\n <div>\n {isLoading ? (\n <SkeletonParagraph numRows={4} />\n ) : (\n <>\n <Typography variant=\"headline3\" gutterBottom>\n <a\n className=\"link\"\n href={getUrl(\n threadBundle?.id!,\n threadBundle?.projectId!,\n replyBundle?.id,\n )}\n >\n {threadBundle?.title}\n </a>\n </Typography>\n <div className=\"truncated\">\n <Typography variant=\"body1\" gutterBottom>\n {messageUrl}\n </Typography>\n </div>\n <div className=\"search-result-footer\">\n {replyId ? 'Reply' : 'Thread'} by{' '}\n {<UserBadge userId={replyAuthor?.ownerId} />}{' '}\n {formatDate(dayjs(replyBundle?.createdOn))}\n </div>\n </>\n )}\n </div>\n </Box>\n </div>\n )\n}\n\nexport default DiscussionSearchResult\n"],"mappings":";;;;;;;;;;;;AAuBA,IAAa,IAAa,OAAO,OASxB,MARgB,MAAM,GAAK;CAChC,QAAQ;CACR,SAAS;EACP,QAAQ;EACR,kCAAkC;EAClC,gBAAgB;EACjB;CACF,CAAC,EACc,MAAM,EAQlB,KACJ,MACoB;CACpB,IAAM,EAAE,aAAU,eAAY,GACxB,EAAE,mBAAgB,GAAmB,EACrC,CAAC,GAAc,KAAmB,GAAkC,EACpE,CAAC,GAAY,KAAiB,EAAiB,GAAG,EAClD,CAAC,GAAa,KAAkB,GAAiC,EACjE,CAAC,GAAa,KAAkB,GAAuB,EACvD,CAAC,GAAW,KAAgB,EAAS,GAAM;AAkCjD,QAhCA,QAAgB;AAqBd,eApBqC;GACnC,IAAI;AACJ,KAAa,GAAK;GAClB,IAAM,IAAS,MAAM,EAAU,GAAU,EAAY;AACrD,OAAI,GAAS;IACX,IAAM,IAAQ,MAAM,EAAS,GAAS,EAAY;AAGlD,IAFA,IAAgB,MAAM,EAAmB,EAAM,YAAY,EAAY,EACvE,EAAe,MAAM,EAAmB,EAAM,UAAU,CAAC,EACzD,EAAe,EAAM;SAGrB,CADA,EAAe,MAAM,EAAmB,EAAO,UAAU,CAAC,EAC1D,IAAgB,MAAM,EACpB,EAAO,YACP,EACD;AAIH,GAFA,EAAc,MAAM,EAAW,EAAc,WAAW,CAAC,EACzD,EAAgB,EAAO,EACvB,EAAa,GAAM;MAEH;IACjB;EAAC;EAAa;EAAS;EAAS,CAAC,EAWlC,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD;GACE,IAAI;IACF,SAAS;IACT,qBAAqB;IACtB;aAJH,CAME,kBAAC,OAAD,EAAA,UACG,IACC,kBAAC,GAAD;IAAU,SAAQ;IAAW,OAAM;IAAO,QAAQ;IAAU,CAAA,GAC1D,IACF,kBAAC,GAAD,EAAS,MAAK,gBAAiB,CAAA,GAE/B,kBAAC,GAAD,EAAS,MAAK,eAAgB,CAAA,EAE5B,CAAA,EACN,kBAAC,OAAD,EAAA,UACG,IACC,kBAAC,GAAD,EAAmB,SAAS,GAAK,CAAA,GAEjC,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,GAAD;KAAY,SAAQ;KAAY,cAAA;eAC9B,kBAAC,KAAD;MACE,WAAU;MACV,QAjCA,GAAkB,GAAmB,MAAqB;OACxE,IAAI,IAAM,GAAG,EAA2B,OAAO,UAAU,EAAU,uBAAuB;AAI1F,cAHI,MACF,KAAO,YAAY,MAEd;SA6BS,GAAc,IACd,GAAc,WACd,GAAa,GACd;gBAEA,GAAc;MACb,CAAA;KACO,CAAA;IACb,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD;MAAY,SAAQ;MAAQ,cAAA;gBACzB;MACU,CAAA;KACT,CAAA;IACN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACG,IAAU,UAAU;MAAS;MAAI;MACjC,kBAAC,GAAD,EAAW,QAAQ,GAAa,SAAW,CAAA;MAAE;MAC7C,EAAW,EAAM,GAAa,UAAU,CAAC;MACtC;;IACL,EAAA,CAAA,EAED,CAAA,CACF;;EACF,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiscussionThread.d.ts","sourceRoot":"","sources":["../../../src/components/Forum/DiscussionThread.tsx"],"names":[],"mappings":"AAqCA,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"DiscussionThread.d.ts","sourceRoot":"","sources":["../../../src/components/Forum/DiscussionThread.tsx"],"names":[],"mappings":"AAqCA,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,CAAA;AAMD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,2CA4V5D;AAED,eAAe,gBAAgB,CAAA"}
|
|
@@ -9,10 +9,10 @@ import { WarningDialog as a } from "../SynapseForm/WarningDialog.js";
|
|
|
9
9
|
import { formatDate as o } from "../../utils/functions/DateFormatter.js";
|
|
10
10
|
import { UserBadge as s } from "../UserCard/UserBadge.js";
|
|
11
11
|
import { useGetRepliesInfinite as c } from "../../synapse-queries/forum/useReply.js";
|
|
12
|
-
import { useDeleteThread as
|
|
13
|
-
import { useSubscription as
|
|
14
|
-
import { ForumThreadEditor as
|
|
15
|
-
import { REPLY_ID_PARAM_KEY as
|
|
12
|
+
import { useDeleteThread as l, useGetThread as te, useRestoreThread as ne } from "../../synapse-queries/forum/useThread.js";
|
|
13
|
+
import { useSubscription as re } from "../../synapse-queries/subscription/useSubscription.js";
|
|
14
|
+
import { ForumThreadEditor as u } from "./ForumThreadEditor.js";
|
|
15
|
+
import { REPLY_ID_PARAM_KEY as ie } from "./DiscussionConstants.js";
|
|
16
16
|
import { DiscussionReply as d } from "./DiscussionReply.js";
|
|
17
17
|
import { SubscribersModal as f } from "./SubscribersModal.js";
|
|
18
18
|
import { useGetModerators as p } from "../../synapse-queries/forum/useForum.js";
|
|
@@ -25,68 +25,70 @@ import se from "dayjs";
|
|
|
25
25
|
//#region src/components/Forum/DiscussionThread.tsx
|
|
26
26
|
var ce = "You are following this topic. Click to stop following.", le = "You are not following this topic. Click to follow.", D = "Write a reply...";
|
|
27
27
|
function O(O) {
|
|
28
|
-
let { threadId: k, limit: A } = O,
|
|
29
|
-
|
|
30
|
-
} }), { mutate:
|
|
28
|
+
let { threadId: k, limit: A, emptyBodyContent: j } = O, M = "16px", [N, P] = g(!0), [F, I] = g(!1), [L, R] = g(!1), [z, B] = g(!1), [V, H] = g(!1), [U, W] = g(!1), [ue, G] = g(!1), [de, fe] = g(!1), { threadData: K, threadBody: q, togglePin: pe } = te(k), { data: J } = r(), { data: me } = n(K?.projectId ?? "", void 0, ae, { enabled: !!K }), { subscription: Y, toggleSubscribed: he, isLoading: ge } = re(k, E.THREAD), { mutate: _e } = l({ onSuccess: () => {
|
|
29
|
+
H(!1), e("A thread has been deleted.", "info");
|
|
30
|
+
} }), { mutate: ve } = ne({ onSuccess: () => {
|
|
31
31
|
G(!1), e("A thread has been restored.", "info");
|
|
32
|
-
} }),
|
|
33
|
-
function
|
|
34
|
-
if (J?.userName == "anonymous")
|
|
32
|
+
} }), ye = K?.createdBy == J?.ownerId;
|
|
33
|
+
function be() {
|
|
34
|
+
if (J?.userName == "anonymous") W(!0);
|
|
35
35
|
else try {
|
|
36
|
-
|
|
36
|
+
he();
|
|
37
37
|
} catch (t) {
|
|
38
38
|
e(t.reason, "danger");
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
|
-
let { data: X, hasNextPage:
|
|
41
|
+
let { data: X, hasNextPage: xe, fetchNextPage: Se } = c(k, N, A), { data: Z } = p(K?.forumId ?? "", { enabled: !!K?.forumId }), Ce = Z?.includes(K?.createdBy ?? ""), [Q, we] = t(ie), $ = h(() => {
|
|
42
42
|
let e = X?.pages.flatMap((e) => e.results) ?? [];
|
|
43
43
|
return Q ? e.filter((e) => e.id === Q) : e;
|
|
44
|
-
}, [X, Q])
|
|
44
|
+
}, [X, Q]), Te = () => {
|
|
45
|
+
we(null);
|
|
46
|
+
}, Ee = Z?.includes(J?.ownerId ?? "");
|
|
45
47
|
return /* @__PURE__ */ T("div", {
|
|
46
48
|
className: "DiscussionThread",
|
|
47
49
|
role: "article",
|
|
48
50
|
children: [
|
|
49
|
-
K &&
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
children: "Most Recent"
|
|
71
|
-
})]
|
|
51
|
+
K && /* @__PURE__ */ T(_, {
|
|
52
|
+
sx: {
|
|
53
|
+
mb: 2,
|
|
54
|
+
textAlign: "right"
|
|
55
|
+
},
|
|
56
|
+
children: [/* @__PURE__ */ w(S, {
|
|
57
|
+
component: "span",
|
|
58
|
+
sx: { mr: 1 },
|
|
59
|
+
children: "Sort:"
|
|
60
|
+
}), /* @__PURE__ */ T(x, {
|
|
61
|
+
color: "primary",
|
|
62
|
+
exclusive: !0,
|
|
63
|
+
value: N ? "datePosted" : "mostRecent",
|
|
64
|
+
children: [/* @__PURE__ */ w(b, {
|
|
65
|
+
value: "datePosted",
|
|
66
|
+
onClick: () => P(!0),
|
|
67
|
+
children: "Date Posted"
|
|
68
|
+
}), /* @__PURE__ */ w(b, {
|
|
69
|
+
value: "mostRecent",
|
|
70
|
+
onClick: () => P(!1),
|
|
71
|
+
children: "Most Recent"
|
|
72
72
|
})]
|
|
73
|
-
})
|
|
73
|
+
})]
|
|
74
|
+
}),
|
|
75
|
+
K && (q !== void 0 || j) ? /* @__PURE__ */ T(C, { children: [
|
|
74
76
|
/* @__PURE__ */ w(s, {
|
|
75
77
|
userId: K.createdBy,
|
|
76
78
|
withAvatar: !0,
|
|
77
79
|
avatarSize: "MEDIUM",
|
|
78
80
|
showCardOnHover: !0,
|
|
79
|
-
showModeratorBadge:
|
|
81
|
+
showModeratorBadge: Ce
|
|
80
82
|
}),
|
|
81
83
|
/* @__PURE__ */ T(_, {
|
|
82
84
|
sx: (e) => ({ [e.breakpoints.down("sm")]: {
|
|
83
85
|
display: "flex",
|
|
84
86
|
flexDirection: "column-reverse",
|
|
85
|
-
marginBottom:
|
|
86
|
-
marginTop:
|
|
87
|
+
marginBottom: M,
|
|
88
|
+
marginTop: M,
|
|
87
89
|
".SubscribersModal": {
|
|
88
90
|
justifyContent: "flex-start",
|
|
89
|
-
marginBottom:
|
|
91
|
+
marginBottom: M
|
|
90
92
|
}
|
|
91
93
|
} }),
|
|
92
94
|
children: [/* @__PURE__ */ w(S, {
|
|
@@ -96,12 +98,12 @@ function O(O) {
|
|
|
96
98
|
}), /* @__PURE__ */ w(f, {
|
|
97
99
|
id: k,
|
|
98
100
|
objectType: E.THREAD,
|
|
99
|
-
showModal:
|
|
100
|
-
handleModal:
|
|
101
|
+
showModal: de,
|
|
102
|
+
handleModal: fe
|
|
101
103
|
})]
|
|
102
104
|
}),
|
|
103
105
|
/* @__PURE__ */ w("div", { children: /* @__PURE__ */ w(ee, {
|
|
104
|
-
markdown: q,
|
|
106
|
+
markdown: q || j,
|
|
105
107
|
objectType: oe.THREAD
|
|
106
108
|
}) }),
|
|
107
109
|
/* @__PURE__ */ T("span", { children: [
|
|
@@ -109,14 +111,14 @@ function O(O) {
|
|
|
109
111
|
o(se(K.createdOn), "M/D/YYYY"),
|
|
110
112
|
K.isEdited ? /* @__PURE__ */ w("i", { children: " (Edited)" }) : null
|
|
111
113
|
] }),
|
|
112
|
-
/* @__PURE__ */ w(
|
|
114
|
+
/* @__PURE__ */ w(u, {
|
|
113
115
|
isReply: !1,
|
|
114
116
|
initialText: q,
|
|
115
|
-
onClose: () =>
|
|
117
|
+
onClose: () => I(!1),
|
|
116
118
|
initialTitle: K?.title,
|
|
117
119
|
id: k,
|
|
118
120
|
isDialog: !0,
|
|
119
|
-
openDialog:
|
|
121
|
+
openDialog: F
|
|
120
122
|
})
|
|
121
123
|
] }) : /* @__PURE__ */ w(C, {}),
|
|
122
124
|
/* @__PURE__ */ w(_, {
|
|
@@ -137,8 +139,8 @@ function O(O) {
|
|
|
137
139
|
/* @__PURE__ */ w("span", { children: /* @__PURE__ */ w("button", {
|
|
138
140
|
className: "follow-button",
|
|
139
141
|
"aria-label": Y ? "Unfollow thread" : "Follow thread",
|
|
140
|
-
disabled:
|
|
141
|
-
onClick: () =>
|
|
142
|
+
disabled: ge,
|
|
143
|
+
onClick: () => be(),
|
|
142
144
|
children: Y ? /* @__PURE__ */ w(i, {
|
|
143
145
|
icon: "visibility",
|
|
144
146
|
label: ce
|
|
@@ -147,21 +149,21 @@ function O(O) {
|
|
|
147
149
|
label: le
|
|
148
150
|
})
|
|
149
151
|
}) }),
|
|
150
|
-
|
|
151
|
-
onClick: () =>
|
|
152
|
+
ye && /* @__PURE__ */ w("button", {
|
|
153
|
+
onClick: () => I(!0),
|
|
152
154
|
children: /* @__PURE__ */ w(i, {
|
|
153
155
|
icon: "edit",
|
|
154
156
|
label: "Edit thread"
|
|
155
157
|
})
|
|
156
158
|
}),
|
|
157
|
-
|
|
158
|
-
onClick: () =>
|
|
159
|
+
me?.permissions.canModerate ? /* @__PURE__ */ T(C, { children: [/* @__PURE__ */ w("button", {
|
|
160
|
+
onClick: () => H(!0),
|
|
159
161
|
children: /* @__PURE__ */ w(i, {
|
|
160
162
|
icon: "delete",
|
|
161
163
|
label: "Delete thread"
|
|
162
164
|
})
|
|
163
165
|
}), /* @__PURE__ */ w("button", {
|
|
164
|
-
onClick: () =>
|
|
166
|
+
onClick: () => pe(),
|
|
165
167
|
children: K?.isPinned ? /* @__PURE__ */ w(i, {
|
|
166
168
|
icon: "pushpin",
|
|
167
169
|
sx: { color: "error.main" },
|
|
@@ -178,24 +180,22 @@ function O(O) {
|
|
|
178
180
|
mt: 2,
|
|
179
181
|
mb: 3
|
|
180
182
|
},
|
|
181
|
-
children:
|
|
183
|
+
children: L ? /* @__PURE__ */ w(u, {
|
|
182
184
|
id: k,
|
|
183
185
|
isReply: !0,
|
|
184
|
-
onClose: () =>
|
|
186
|
+
onClose: () => R(!1),
|
|
185
187
|
isDialog: !1
|
|
186
188
|
}) : /* @__PURE__ */ w(y, {
|
|
187
189
|
fullWidth: !0,
|
|
188
190
|
placeholder: D,
|
|
189
191
|
onClick: () => {
|
|
190
|
-
J?.userName == "anonymous" ?
|
|
192
|
+
J?.userName == "anonymous" ? W(!0) : R(!0);
|
|
191
193
|
}
|
|
192
194
|
})
|
|
193
195
|
}),
|
|
194
196
|
Q && /* @__PURE__ */ T(v, {
|
|
195
197
|
variant: "outlined",
|
|
196
|
-
onClick:
|
|
197
|
-
Ce(null);
|
|
198
|
-
},
|
|
198
|
+
onClick: Te,
|
|
199
199
|
sx: {
|
|
200
200
|
display: "flex",
|
|
201
201
|
alignItems: "center",
|
|
@@ -215,6 +215,7 @@ function O(O) {
|
|
|
215
215
|
let t = Z?.includes(e.createdBy);
|
|
216
216
|
return /* @__PURE__ */ w(d, {
|
|
217
217
|
reply: e,
|
|
218
|
+
isForumModerator: Ee,
|
|
218
219
|
isReplyAuthorModerator: t
|
|
219
220
|
}, e.id);
|
|
220
221
|
}) }),
|
|
@@ -224,47 +225,47 @@ function O(O) {
|
|
|
224
225
|
mb: 3,
|
|
225
226
|
[e.breakpoints.down("sm")]: { MarkdownEditor: { display: "block" } }
|
|
226
227
|
}),
|
|
227
|
-
children:
|
|
228
|
+
children: z ? /* @__PURE__ */ w(u, {
|
|
228
229
|
id: k,
|
|
229
230
|
isReply: !0,
|
|
230
|
-
onClose: () =>
|
|
231
|
+
onClose: () => B(!1),
|
|
231
232
|
isDialog: !1
|
|
232
233
|
}) : /* @__PURE__ */ w(y, {
|
|
233
234
|
fullWidth: !0,
|
|
234
235
|
placeholder: D,
|
|
235
236
|
onClick: () => {
|
|
236
|
-
J?.userName == "anonymous" ?
|
|
237
|
+
J?.userName == "anonymous" ? W(!0) : B(!0);
|
|
237
238
|
}
|
|
238
239
|
})
|
|
239
240
|
}),
|
|
240
|
-
|
|
241
|
+
xe ? /* @__PURE__ */ w(v, {
|
|
241
242
|
variant: "outlined",
|
|
242
243
|
onClick: () => {
|
|
243
|
-
|
|
244
|
+
Se();
|
|
244
245
|
},
|
|
245
246
|
children: "Show more results"
|
|
246
247
|
}) : /* @__PURE__ */ w(C, {}),
|
|
247
248
|
/* @__PURE__ */ w(a, {
|
|
248
|
-
open:
|
|
249
|
+
open: V,
|
|
249
250
|
title: "Confirm Deletion",
|
|
250
251
|
content: "Are you sure you want to delete this thread?",
|
|
251
|
-
onCancel: () =>
|
|
252
|
-
onConfirm: () => K &&
|
|
252
|
+
onCancel: () => H(!1),
|
|
253
|
+
onConfirm: () => K && _e(K),
|
|
253
254
|
confirmButtonColor: "error",
|
|
254
255
|
confirmButtonText: "Delete"
|
|
255
256
|
}),
|
|
256
257
|
/* @__PURE__ */ w(a, {
|
|
257
|
-
open:
|
|
258
|
+
open: ue,
|
|
258
259
|
title: "Confirm Restoration",
|
|
259
260
|
content: "Are you sure you want to restore this thread?",
|
|
260
261
|
onCancel: () => G(!1),
|
|
261
|
-
onConfirm: () => K &&
|
|
262
|
+
onConfirm: () => K && ve(K),
|
|
262
263
|
confirmButtonColor: "info",
|
|
263
264
|
confirmButtonText: "Restore"
|
|
264
265
|
}),
|
|
265
266
|
/* @__PURE__ */ w(m, {
|
|
266
|
-
open:
|
|
267
|
-
onHide: () =>
|
|
267
|
+
open: U,
|
|
268
|
+
onHide: () => W(!1),
|
|
268
269
|
hasCancelButton: !1
|
|
269
270
|
})
|
|
270
271
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiscussionThread.js","names":[],"sources":["../../../src/components/Forum/DiscussionThread.tsx"],"sourcesContent":["import { useGetCurrentUserProfile, useGetEntityBundle } from '@/synapse-queries'\nimport { useGetRepliesInfinite } from '@/synapse-queries/forum/useReply'\nimport {\n useDeleteThread,\n useGetThread,\n useRestoreThread,\n} from '@/synapse-queries/forum/useThread'\nimport { useSubscription } from '@/synapse-queries/subscription/useSubscription'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport {\n Box,\n Button,\n TextField,\n ToggleButton,\n ToggleButtonGroup,\n Typography,\n} from '@mui/material'\nimport {\n ALL_ENTITY_BUNDLE_FIELDS,\n ObjectType,\n SubscriptionObjectType,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useMemo, useState } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\nimport MarkdownSynapse from '../Markdown/MarkdownSynapse'\nimport WarningDialog from '../SynapseForm/WarningDialog'\nimport { displayToast } from '../ToastMessage/ToastMessage'\nimport { UserBadge } from '../UserCard/UserBadge'\nimport { DiscussionReply } from './DiscussionReply'\nimport { ForumThreadEditor } from './ForumThreadEditor'\nimport { SubscribersModal } from './SubscribersModal'\nimport { useGetModerators } from '@/synapse-queries/forum/useForum'\nimport { useNativeSearchParams } from '@/utils/hooks/useNativeSearchParams'\nimport { REPLY_ID_PARAM_KEY } from './DiscussionConstants'\nimport { SignInRequiredModal } from '../SignInRequiredModal/SignInRequiredModal'\n\nexport type DiscussionThreadProps = {\n threadId: string\n limit: number\n}\n\nconst FOLLOWING_TEXT = 'You are following this topic. Click to stop following.'\nconst UNFOLLOWING_TEXT = 'You are not following this topic. Click to follow.'\nconst INPUT_PLACEHOLDER = 'Write a reply...'\n\nexport function DiscussionThread(props: DiscussionThreadProps) {\n const { threadId, limit } = props\n const defaultMargin = '16px'\n\n const [orderByDatePosted, setOrderByDatePosted] = useState(true)\n const [showThreadModal, setShowThreadModal] = useState(false)\n const [showReplyEditor1, setShowReplyEditor1] = useState(false)\n const [showReplyEditor2, setShowReplyEditor2] = useState(false)\n const [showDeleteModal, setShowDeleteModal] = useState(false)\n const [showSignInModal, setShowSignInModal] = useState(false)\n const [showRestoreModal, setShowRestoreModal] = useState(false)\n const [showSubscriberModal, setShowSubscriberModal] = useState(false)\n\n const { threadData, threadBody, togglePin } = useGetThread(threadId)\n const { data: currentUserProfile } = useGetCurrentUserProfile()\n const { data: entityBundle } = useGetEntityBundle(\n threadData?.projectId ?? '',\n undefined,\n ALL_ENTITY_BUNDLE_FIELDS,\n {\n enabled: !!threadData,\n },\n )\n\n const { subscription, toggleSubscribed, isLoading } = useSubscription(\n threadId,\n SubscriptionObjectType.THREAD,\n )\n const { mutate: deleteThread } = useDeleteThread({\n onSuccess: () => {\n setShowDeleteModal(false)\n displayToast('A thread has been deleted.', 'info')\n },\n })\n const { mutate: restoreThread } = useRestoreThread({\n onSuccess: () => {\n setShowRestoreModal(false)\n displayToast('A thread has been restored.', 'info')\n },\n })\n\n const isCurrentUserAuthor =\n threadData?.createdBy == currentUserProfile?.ownerId\n\n function handleFollowBtn() {\n if (currentUserProfile?.userName == 'anonymous') {\n setShowSignInModal(true)\n } else {\n try {\n toggleSubscribed()\n } catch (err: any) {\n displayToast(err.reason as string, 'danger')\n }\n }\n }\n\n const {\n data: replyData,\n hasNextPage,\n fetchNextPage,\n } = useGetRepliesInfinite(threadId, orderByDatePosted, limit)\n\n const { data: moderatorList } = useGetModerators(threadData?.forumId ?? '', {\n enabled: Boolean(threadData?.forumId),\n })\n\n const isAuthorModerator = moderatorList?.includes(threadData?.createdBy ?? '')\n\n const [replyId, setReplyIdParam] = useNativeSearchParams(REPLY_ID_PARAM_KEY)\n\n const replies = useMemo(() => {\n const allReplies = replyData?.pages.flatMap(page => page.results) ?? []\n if (replyId) {\n return allReplies.filter(reply => reply.id === replyId)\n } else {\n return allReplies\n }\n }, [replyData, replyId])\n\n const handleShowAllRepliesButton = () => {\n setReplyIdParam(null)\n }\n\n return (\n <div className=\"DiscussionThread\" role={'article'}>\n {threadData && threadBody ? (\n <>\n <Box sx={{ mb: 2, textAlign: 'right' }}>\n <Typography component={'span'} sx={{ mr: 1 }}>\n Sort:\n </Typography>\n <ToggleButtonGroup\n color={'primary'}\n exclusive\n value={orderByDatePosted ? 'datePosted' : 'mostRecent'}\n >\n <ToggleButton\n value={'datePosted'}\n onClick={() => setOrderByDatePosted(true)}\n >\n Date Posted\n </ToggleButton>\n <ToggleButton\n value={'mostRecent'}\n onClick={() => setOrderByDatePosted(false)}\n >\n Most Recent\n </ToggleButton>\n </ToggleButtonGroup>\n </Box>\n <UserBadge\n userId={threadData.createdBy}\n withAvatar={true}\n avatarSize=\"MEDIUM\"\n showCardOnHover={true}\n showModeratorBadge={isAuthorModerator}\n />\n <Box\n sx={theme => ({\n [theme.breakpoints.down('sm')]: {\n display: 'flex',\n flexDirection: 'column-reverse',\n marginBottom: defaultMargin,\n marginTop: defaultMargin,\n '.SubscribersModal': {\n justifyContent: 'flex-start',\n marginBottom: defaultMargin,\n },\n },\n })}\n >\n <Typography sx={{ marginTop: '4px' }} variant=\"headline2\">\n {threadData.title}\n </Typography>\n <SubscribersModal\n id={threadId}\n objectType={SubscriptionObjectType.THREAD}\n showModal={showSubscriberModal}\n handleModal={setShowSubscriberModal}\n />\n </Box>\n <div>\n <MarkdownSynapse\n markdown={threadBody}\n objectType={ObjectType.THREAD}\n />\n </div>\n <span>\n posted {formatDate(dayjs(threadData.createdOn), 'M/D/YYYY')}\n {threadData.isEdited ? <i>{' (Edited)'}</i> : null}\n </span>\n <ForumThreadEditor\n isReply={false}\n initialText={threadBody}\n onClose={() => setShowThreadModal(false)}\n initialTitle={threadData?.title}\n id={threadId}\n isDialog={true}\n openDialog={showThreadModal}\n />\n </>\n ) : (\n <></>\n )}\n <Box\n sx={{\n float: 'right',\n margin: { xs: '8px 0', sm: '0 24px 0 0' },\n }}\n >\n {threadData?.isDeleted ? (\n <button onClick={() => setShowRestoreModal(true)}>\n <IconSvg icon=\"restore\" label=\"Restore deleted thread\" />\n </button>\n ) : (\n <>\n <span>\n <button\n className=\"follow-button\"\n aria-label={subscription ? 'Unfollow thread' : 'Follow thread'}\n disabled={isLoading}\n onClick={() => handleFollowBtn()}\n >\n {subscription ? (\n <IconSvg icon=\"visibility\" label={FOLLOWING_TEXT} />\n ) : (\n <IconSvg icon=\"visibilityOff\" label={UNFOLLOWING_TEXT} />\n )}\n </button>\n </span>\n {isCurrentUserAuthor && (\n <button onClick={() => setShowThreadModal(true)}>\n <IconSvg icon=\"edit\" label=\"Edit thread\" />\n </button>\n )}\n\n {entityBundle?.permissions.canModerate ? (\n <>\n <button onClick={() => setShowDeleteModal(true)}>\n <IconSvg icon=\"delete\" label=\"Delete thread\" />\n </button>\n <button onClick={() => togglePin()}>\n {threadData?.isPinned ? (\n <IconSvg\n icon=\"pushpin\"\n sx={{ color: 'error.main' }}\n label=\"Unpin thread\"\n />\n ) : (\n <IconSvg icon=\"pushpin\" label=\"Pin thread\" />\n )}\n </button>\n </>\n ) : null}\n </>\n )}\n </Box>\n <Box sx={{ mt: 2, mb: 3 }}>\n {!showReplyEditor1 ? (\n <TextField\n fullWidth\n placeholder={INPUT_PLACEHOLDER}\n onClick={() => {\n if (currentUserProfile?.userName == 'anonymous') {\n setShowSignInModal(true)\n } else {\n setShowReplyEditor1(true)\n }\n }}\n />\n ) : (\n <ForumThreadEditor\n id={threadId}\n isReply={true}\n onClose={() => setShowReplyEditor1(false)}\n isDialog={false}\n />\n )}\n </Box>\n {replyId && (\n <Button\n variant=\"outlined\"\n onClick={handleShowAllRepliesButton}\n sx={{\n display: 'flex',\n alignItems: 'center',\n padding: '2px 8px',\n marginBottom: '12px',\n gap: '4px',\n }}\n >\n <IconSvg icon=\"arrowBack\" sx={{ width: '16px' }} />\n <Typography variant=\"smallText2\">Show all replies</Typography>\n </Button>\n )}\n <div>\n {replies.map(reply => {\n const isReplyAuthorModerator = moderatorList?.includes(\n reply.createdBy,\n )\n return (\n <DiscussionReply\n key={reply.id}\n reply={reply}\n isReplyAuthorModerator={isReplyAuthorModerator}\n />\n )\n })}\n </div>\n {replies.length > 0 && (\n <Box\n sx={theme => ({\n mt: 2,\n mb: 3,\n [theme.breakpoints.down('sm')]: {\n MarkdownEditor: {\n display: 'block',\n },\n },\n })}\n >\n {!showReplyEditor2 ? (\n <TextField\n fullWidth\n placeholder={INPUT_PLACEHOLDER}\n onClick={() => {\n if (currentUserProfile?.userName == 'anonymous') {\n setShowSignInModal(true)\n } else {\n setShowReplyEditor2(true)\n }\n }}\n />\n ) : (\n <ForumThreadEditor\n id={threadId}\n isReply={true}\n onClose={() => setShowReplyEditor2(false)}\n isDialog={false}\n />\n )}\n </Box>\n )}\n\n {hasNextPage ? (\n <Button\n variant=\"outlined\"\n onClick={() => {\n fetchNextPage()\n }}\n >\n Show more results\n </Button>\n ) : (\n <></>\n )}\n <WarningDialog\n open={showDeleteModal}\n title=\"Confirm Deletion\"\n content=\"Are you sure you want to delete this thread?\"\n onCancel={() => setShowDeleteModal(false)}\n onConfirm={() => threadData && deleteThread(threadData)}\n confirmButtonColor=\"error\"\n confirmButtonText=\"Delete\"\n />\n <WarningDialog\n open={showRestoreModal}\n title=\"Confirm Restoration\"\n content=\"Are you sure you want to restore this thread?\"\n onCancel={() => setShowRestoreModal(false)}\n onConfirm={() => threadData && restoreThread(threadData)}\n confirmButtonColor=\"info\"\n confirmButtonText=\"Restore\"\n />\n <SignInRequiredModal\n open={showSignInModal}\n onHide={() => setShowSignInModal(false)}\n hasCancelButton={false}\n />\n </div>\n )\n}\n\nexport default DiscussionThread\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DiscussionThread.js","names":[],"sources":["../../../src/components/Forum/DiscussionThread.tsx"],"sourcesContent":["import { useGetCurrentUserProfile, useGetEntityBundle } from '@/synapse-queries'\nimport { useGetRepliesInfinite } from '@/synapse-queries/forum/useReply'\nimport {\n useDeleteThread,\n useGetThread,\n useRestoreThread,\n} from '@/synapse-queries/forum/useThread'\nimport { useSubscription } from '@/synapse-queries/subscription/useSubscription'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport {\n Box,\n Button,\n TextField,\n ToggleButton,\n ToggleButtonGroup,\n Typography,\n} from '@mui/material'\nimport {\n ALL_ENTITY_BUNDLE_FIELDS,\n ObjectType,\n SubscriptionObjectType,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useMemo, useState } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\nimport MarkdownSynapse from '../Markdown/MarkdownSynapse'\nimport WarningDialog from '../SynapseForm/WarningDialog'\nimport { displayToast } from '../ToastMessage/ToastMessage'\nimport { UserBadge } from '../UserCard/UserBadge'\nimport { DiscussionReply } from './DiscussionReply'\nimport { ForumThreadEditor } from './ForumThreadEditor'\nimport { SubscribersModal } from './SubscribersModal'\nimport { useGetModerators } from '@/synapse-queries/forum/useForum'\nimport { useNativeSearchParams } from '@/utils/hooks/useNativeSearchParams'\nimport { REPLY_ID_PARAM_KEY } from './DiscussionConstants'\nimport { SignInRequiredModal } from '../SignInRequiredModal/SignInRequiredModal'\n\nexport type DiscussionThreadProps = {\n threadId: string\n limit: number\n emptyBodyContent?: string\n}\n\nconst FOLLOWING_TEXT = 'You are following this topic. Click to stop following.'\nconst UNFOLLOWING_TEXT = 'You are not following this topic. Click to follow.'\nconst INPUT_PLACEHOLDER = 'Write a reply...'\n\nexport function DiscussionThread(props: DiscussionThreadProps) {\n const { threadId, limit, emptyBodyContent } = props\n const defaultMargin = '16px'\n\n const [orderByDatePosted, setOrderByDatePosted] = useState(true)\n const [showThreadModal, setShowThreadModal] = useState(false)\n const [showReplyEditor1, setShowReplyEditor1] = useState(false)\n const [showReplyEditor2, setShowReplyEditor2] = useState(false)\n const [showDeleteModal, setShowDeleteModal] = useState(false)\n const [showSignInModal, setShowSignInModal] = useState(false)\n const [showRestoreModal, setShowRestoreModal] = useState(false)\n const [showSubscriberModal, setShowSubscriberModal] = useState(false)\n\n const { threadData, threadBody, togglePin } = useGetThread(threadId)\n const { data: currentUserProfile } = useGetCurrentUserProfile()\n const { data: entityBundle } = useGetEntityBundle(\n threadData?.projectId ?? '',\n undefined,\n ALL_ENTITY_BUNDLE_FIELDS,\n {\n enabled: !!threadData,\n },\n )\n\n const { subscription, toggleSubscribed, isLoading } = useSubscription(\n threadId,\n SubscriptionObjectType.THREAD,\n )\n const { mutate: deleteThread } = useDeleteThread({\n onSuccess: () => {\n setShowDeleteModal(false)\n displayToast('A thread has been deleted.', 'info')\n },\n })\n const { mutate: restoreThread } = useRestoreThread({\n onSuccess: () => {\n setShowRestoreModal(false)\n displayToast('A thread has been restored.', 'info')\n },\n })\n\n const isCurrentUserAuthor =\n threadData?.createdBy == currentUserProfile?.ownerId\n\n function handleFollowBtn() {\n if (currentUserProfile?.userName == 'anonymous') {\n setShowSignInModal(true)\n } else {\n try {\n toggleSubscribed()\n } catch (err: any) {\n displayToast(err.reason as string, 'danger')\n }\n }\n }\n\n const {\n data: replyData,\n hasNextPage,\n fetchNextPage,\n } = useGetRepliesInfinite(threadId, orderByDatePosted, limit)\n\n const { data: moderatorList } = useGetModerators(threadData?.forumId ?? '', {\n enabled: Boolean(threadData?.forumId),\n })\n\n const isAuthorModerator = moderatorList?.includes(threadData?.createdBy ?? '')\n\n const [replyId, setReplyIdParam] = useNativeSearchParams(REPLY_ID_PARAM_KEY)\n\n const replies = useMemo(() => {\n const allReplies = replyData?.pages.flatMap(page => page.results) ?? []\n if (replyId) {\n return allReplies.filter(reply => reply.id === replyId)\n } else {\n return allReplies\n }\n }, [replyData, replyId])\n\n const handleShowAllRepliesButton = () => {\n setReplyIdParam(null)\n }\n\n const isForumModerator = moderatorList?.includes(\n currentUserProfile?.ownerId ?? '',\n )\n\n return (\n <div className=\"DiscussionThread\" role={'article'}>\n {threadData && (\n <Box sx={{ mb: 2, textAlign: 'right' }}>\n <Typography component={'span'} sx={{ mr: 1 }}>\n Sort:\n </Typography>\n <ToggleButtonGroup\n color={'primary'}\n exclusive\n value={orderByDatePosted ? 'datePosted' : 'mostRecent'}\n >\n <ToggleButton\n value={'datePosted'}\n onClick={() => setOrderByDatePosted(true)}\n >\n Date Posted\n </ToggleButton>\n <ToggleButton\n value={'mostRecent'}\n onClick={() => setOrderByDatePosted(false)}\n >\n Most Recent\n </ToggleButton>\n </ToggleButtonGroup>\n </Box>\n )}\n {threadData && (threadBody !== undefined || emptyBodyContent) ? (\n <>\n <UserBadge\n userId={threadData.createdBy}\n withAvatar={true}\n avatarSize=\"MEDIUM\"\n showCardOnHover={true}\n showModeratorBadge={isAuthorModerator}\n />\n <Box\n sx={theme => ({\n [theme.breakpoints.down('sm')]: {\n display: 'flex',\n flexDirection: 'column-reverse',\n marginBottom: defaultMargin,\n marginTop: defaultMargin,\n '.SubscribersModal': {\n justifyContent: 'flex-start',\n marginBottom: defaultMargin,\n },\n },\n })}\n >\n <Typography sx={{ marginTop: '4px' }} variant=\"headline2\">\n {threadData.title}\n </Typography>\n <SubscribersModal\n id={threadId}\n objectType={SubscriptionObjectType.THREAD}\n showModal={showSubscriberModal}\n handleModal={setShowSubscriberModal}\n />\n </Box>\n <div>\n <MarkdownSynapse\n markdown={threadBody || emptyBodyContent}\n objectType={ObjectType.THREAD}\n />\n </div>\n <span>\n posted {formatDate(dayjs(threadData.createdOn), 'M/D/YYYY')}\n {threadData.isEdited ? <i>{' (Edited)'}</i> : null}\n </span>\n <ForumThreadEditor\n isReply={false}\n initialText={threadBody}\n onClose={() => setShowThreadModal(false)}\n initialTitle={threadData?.title}\n id={threadId}\n isDialog={true}\n openDialog={showThreadModal}\n />\n </>\n ) : (\n <></>\n )}\n <Box\n sx={{\n float: 'right',\n margin: { xs: '8px 0', sm: '0 24px 0 0' },\n }}\n >\n {threadData?.isDeleted ? (\n <button onClick={() => setShowRestoreModal(true)}>\n <IconSvg icon=\"restore\" label=\"Restore deleted thread\" />\n </button>\n ) : (\n <>\n <span>\n <button\n className=\"follow-button\"\n aria-label={subscription ? 'Unfollow thread' : 'Follow thread'}\n disabled={isLoading}\n onClick={() => handleFollowBtn()}\n >\n {subscription ? (\n <IconSvg icon=\"visibility\" label={FOLLOWING_TEXT} />\n ) : (\n <IconSvg icon=\"visibilityOff\" label={UNFOLLOWING_TEXT} />\n )}\n </button>\n </span>\n {isCurrentUserAuthor && (\n <button onClick={() => setShowThreadModal(true)}>\n <IconSvg icon=\"edit\" label=\"Edit thread\" />\n </button>\n )}\n\n {entityBundle?.permissions.canModerate ? (\n <>\n <button onClick={() => setShowDeleteModal(true)}>\n <IconSvg icon=\"delete\" label=\"Delete thread\" />\n </button>\n <button onClick={() => togglePin()}>\n {threadData?.isPinned ? (\n <IconSvg\n icon=\"pushpin\"\n sx={{ color: 'error.main' }}\n label=\"Unpin thread\"\n />\n ) : (\n <IconSvg icon=\"pushpin\" label=\"Pin thread\" />\n )}\n </button>\n </>\n ) : null}\n </>\n )}\n </Box>\n <Box sx={{ mt: 2, mb: 3 }}>\n {!showReplyEditor1 ? (\n <TextField\n fullWidth\n placeholder={INPUT_PLACEHOLDER}\n onClick={() => {\n if (currentUserProfile?.userName == 'anonymous') {\n setShowSignInModal(true)\n } else {\n setShowReplyEditor1(true)\n }\n }}\n />\n ) : (\n <ForumThreadEditor\n id={threadId}\n isReply={true}\n onClose={() => setShowReplyEditor1(false)}\n isDialog={false}\n />\n )}\n </Box>\n {replyId && (\n <Button\n variant=\"outlined\"\n onClick={handleShowAllRepliesButton}\n sx={{\n display: 'flex',\n alignItems: 'center',\n padding: '2px 8px',\n marginBottom: '12px',\n gap: '4px',\n }}\n >\n <IconSvg icon=\"arrowBack\" sx={{ width: '16px' }} />\n <Typography variant=\"smallText2\">Show all replies</Typography>\n </Button>\n )}\n <div>\n {replies.map(reply => {\n const isReplyAuthorModerator = moderatorList?.includes(\n reply.createdBy,\n )\n return (\n <DiscussionReply\n key={reply.id}\n reply={reply}\n isForumModerator={isForumModerator}\n isReplyAuthorModerator={isReplyAuthorModerator}\n />\n )\n })}\n </div>\n {replies.length > 0 && (\n <Box\n sx={theme => ({\n mt: 2,\n mb: 3,\n [theme.breakpoints.down('sm')]: {\n MarkdownEditor: {\n display: 'block',\n },\n },\n })}\n >\n {!showReplyEditor2 ? (\n <TextField\n fullWidth\n placeholder={INPUT_PLACEHOLDER}\n onClick={() => {\n if (currentUserProfile?.userName == 'anonymous') {\n setShowSignInModal(true)\n } else {\n setShowReplyEditor2(true)\n }\n }}\n />\n ) : (\n <ForumThreadEditor\n id={threadId}\n isReply={true}\n onClose={() => setShowReplyEditor2(false)}\n isDialog={false}\n />\n )}\n </Box>\n )}\n\n {hasNextPage ? (\n <Button\n variant=\"outlined\"\n onClick={() => {\n fetchNextPage()\n }}\n >\n Show more results\n </Button>\n ) : (\n <></>\n )}\n <WarningDialog\n open={showDeleteModal}\n title=\"Confirm Deletion\"\n content=\"Are you sure you want to delete this thread?\"\n onCancel={() => setShowDeleteModal(false)}\n onConfirm={() => threadData && deleteThread(threadData)}\n confirmButtonColor=\"error\"\n confirmButtonText=\"Delete\"\n />\n <WarningDialog\n open={showRestoreModal}\n title=\"Confirm Restoration\"\n content=\"Are you sure you want to restore this thread?\"\n onCancel={() => setShowRestoreModal(false)}\n onConfirm={() => threadData && restoreThread(threadData)}\n confirmButtonColor=\"info\"\n confirmButtonText=\"Restore\"\n />\n <SignInRequiredModal\n open={showSignInModal}\n onHide={() => setShowSignInModal(false)}\n hasCancelButton={false}\n />\n </div>\n )\n}\n\nexport default DiscussionThread\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,IAAM,KAAiB,0DACjB,KAAmB,sDACnB,IAAoB;AAE1B,SAAgB,EAAiB,GAA8B;CAC7D,IAAM,EAAE,aAAU,UAAO,wBAAqB,GACxC,IAAgB,QAEhB,CAAC,GAAmB,KAAwB,EAAS,GAAK,EAC1D,CAAC,GAAiB,KAAsB,EAAS,GAAM,EACvD,CAAC,GAAkB,KAAuB,EAAS,GAAM,EACzD,CAAC,GAAkB,KAAuB,EAAS,GAAM,EACzD,CAAC,GAAiB,KAAsB,EAAS,GAAM,EACvD,CAAC,GAAiB,KAAsB,EAAS,GAAM,EACvD,CAAC,IAAkB,KAAuB,EAAS,GAAM,EACzD,CAAC,IAAqB,MAA0B,EAAS,GAAM,EAE/D,EAAE,eAAY,eAAY,kBAAc,GAAa,EAAS,EAC9D,EAAE,MAAM,MAAuB,GAA0B,EACzD,EAAE,MAAM,OAAiB,EAC7B,GAAY,aAAa,IACzB,KAAA,GACA,IACA,EACE,SAAS,CAAC,CAAC,GACZ,CACF,EAEK,EAAE,iBAAc,sBAAkB,kBAAc,GACpD,GACA,EAAuB,OACxB,EACK,EAAE,QAAQ,OAAiB,EAAgB,EAC/C,iBAAiB;AAEf,EADA,EAAmB,GAAM,EACzB,EAAa,8BAA8B,OAAO;IAErD,CAAC,EACI,EAAE,QAAQ,OAAkB,GAAiB,EACjD,iBAAiB;AAEf,EADA,EAAoB,GAAM,EAC1B,EAAa,+BAA+B,OAAO;IAEtD,CAAC,EAEI,KACJ,GAAY,aAAa,GAAoB;CAE/C,SAAS,KAAkB;AACzB,MAAI,GAAoB,YAAY,YAClC,GAAmB,GAAK;MAExB,KAAI;AACF,OAAkB;WACX,GAAU;AACjB,KAAa,EAAI,QAAkB,SAAS;;;CAKlD,IAAM,EACJ,MAAM,GACN,iBACA,sBACE,EAAsB,GAAU,GAAmB,EAAM,EAEvD,EAAE,MAAM,MAAkB,EAAiB,GAAY,WAAW,IAAI,EAC1E,SAAS,EAAQ,GAAY,SAC9B,CAAC,EAEI,KAAoB,GAAe,SAAS,GAAY,aAAa,GAAG,EAExE,CAAC,GAAS,MAAmB,EAAsB,GAAmB,EAEtE,IAAU,QAAc;EAC5B,IAAM,IAAa,GAAW,MAAM,SAAQ,MAAQ,EAAK,QAAQ,IAAI,EAAE;AAIrE,SAHE,IACK,EAAW,QAAO,MAAS,EAAM,OAAO,EAAQ,GAEhD;IAER,CAAC,GAAW,EAAQ,CAAC,EAElB,WAAmC;AACvC,KAAgB,KAAK;IAGjB,KAAmB,GAAe,SACtC,GAAoB,WAAW,GAChC;AAED,QACE,kBAAC,OAAD;EAAK,WAAU;EAAmB,MAAM;YAAxC;GACG,KACC,kBAAC,GAAD;IAAK,IAAI;KAAE,IAAI;KAAG,WAAW;KAAS;cAAtC,CACE,kBAAC,GAAD;KAAY,WAAW;KAAQ,IAAI,EAAE,IAAI,GAAG;eAAE;KAEjC,CAAA,EACb,kBAAC,GAAD;KACE,OAAO;KACP,WAAA;KACA,OAAO,IAAoB,eAAe;eAH5C,CAKE,kBAAC,GAAD;MACE,OAAO;MACP,eAAe,EAAqB,GAAK;gBAC1C;MAEc,CAAA,EACf,kBAAC,GAAD;MACE,OAAO;MACP,eAAe,EAAqB,GAAM;gBAC3C;MAEc,CAAA,CACG;OAChB;;GAEP,MAAe,MAAe,KAAA,KAAa,KAC1C,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,GAAD;KACE,QAAQ,EAAW;KACnB,YAAY;KACZ,YAAW;KACX,iBAAiB;KACjB,oBAAoB;KACpB,CAAA;IACF,kBAAC,GAAD;KACE,KAAI,OAAU,GACX,EAAM,YAAY,KAAK,KAAK,GAAG;MAC9B,SAAS;MACT,eAAe;MACf,cAAc;MACd,WAAW;MACX,qBAAqB;OACnB,gBAAgB;OAChB,cAAc;OACf;MACF,EACF;eAZH,CAcE,kBAAC,GAAD;MAAY,IAAI,EAAE,WAAW,OAAO;MAAE,SAAQ;gBAC3C,EAAW;MACD,CAAA,EACb,kBAAC,GAAD;MACE,IAAI;MACJ,YAAY,EAAuB;MACnC,WAAW;MACX,aAAa;MACb,CAAA,CACE;;IACN,kBAAC,OAAD,EAAA,UACE,kBAAC,IAAD;KACE,UAAU,KAAc;KACxB,YAAY,GAAW;KACvB,CAAA,EACE,CAAA;IACN,kBAAC,QAAD,EAAA,UAAA;KAAM;KACI,EAAW,GAAM,EAAW,UAAU,EAAE,WAAW;KAC1D,EAAW,WAAW,kBAAC,KAAD,EAAA,UAAI,aAAgB,CAAA,GAAG;KACzC,EAAA,CAAA;IACP,kBAAC,GAAD;KACE,SAAS;KACT,aAAa;KACb,eAAe,EAAmB,GAAM;KACxC,cAAc,GAAY;KAC1B,IAAI;KACJ,UAAU;KACV,YAAY;KACZ,CAAA;IACD,EAAA,CAAA,GAEH,kBAAA,GAAA,EAAK,CAAA;GAEP,kBAAC,GAAD;IACE,IAAI;KACF,OAAO;KACP,QAAQ;MAAE,IAAI;MAAS,IAAI;MAAc;KAC1C;cAEA,GAAY,YACX,kBAAC,UAAD;KAAQ,eAAe,EAAoB,GAAK;eAC9C,kBAAC,GAAD;MAAS,MAAK;MAAU,OAAM;MAA2B,CAAA;KAClD,CAAA,GAET,kBAAA,GAAA,EAAA,UAAA;KACE,kBAAC,QAAD,EAAA,UACE,kBAAC,UAAD;MACE,WAAU;MACV,cAAY,IAAe,oBAAoB;MAC/C,UAAU;MACV,eAAe,IAAiB;gBAE/B,IACC,kBAAC,GAAD;OAAS,MAAK;OAAa,OAAO;OAAkB,CAAA,GAEpD,kBAAC,GAAD;OAAS,MAAK;OAAgB,OAAO;OAAoB,CAAA;MAEpD,CAAA,EACJ,CAAA;KACN,MACC,kBAAC,UAAD;MAAQ,eAAe,EAAmB,GAAK;gBAC7C,kBAAC,GAAD;OAAS,MAAK;OAAO,OAAM;OAAgB,CAAA;MACpC,CAAA;KAGV,IAAc,YAAY,cACzB,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,UAAD;MAAQ,eAAe,EAAmB,GAAK;gBAC7C,kBAAC,GAAD;OAAS,MAAK;OAAS,OAAM;OAAkB,CAAA;MACxC,CAAA,EACT,kBAAC,UAAD;MAAQ,eAAe,IAAW;gBAC/B,GAAY,WACX,kBAAC,GAAD;OACE,MAAK;OACL,IAAI,EAAE,OAAO,cAAc;OAC3B,OAAM;OACN,CAAA,GAEF,kBAAC,GAAD;OAAS,MAAK;OAAU,OAAM;OAAe,CAAA;MAExC,CAAA,CACR,EAAA,CAAA,GACD;KACH,EAAA,CAAA;IAED,CAAA;GACN,kBAAC,GAAD;IAAK,IAAI;KAAE,IAAI;KAAG,IAAI;KAAG;cACrB,IAaA,kBAAC,GAAD;KACE,IAAI;KACJ,SAAS;KACT,eAAe,EAAoB,GAAM;KACzC,UAAU;KACV,CAAA,GAjBF,kBAAC,GAAD;KACE,WAAA;KACA,aAAa;KACb,eAAe;AACb,MAAI,GAAoB,YAAY,cAClC,EAAmB,GAAK,GAExB,EAAoB,GAAK;;KAG7B,CAAA;IASA,CAAA;GACL,KACC,kBAAC,GAAD;IACE,SAAQ;IACR,SAAS;IACT,IAAI;KACF,SAAS;KACT,YAAY;KACZ,SAAS;KACT,cAAc;KACd,KAAK;KACN;cATH,CAWE,kBAAC,GAAD;KAAS,MAAK;KAAY,IAAI,EAAE,OAAO,QAAQ;KAAI,CAAA,EACnD,kBAAC,GAAD;KAAY,SAAQ;eAAa;KAA6B,CAAA,CACvD;;GAEX,kBAAC,OAAD,EAAA,UACG,EAAQ,KAAI,MAAS;IACpB,IAAM,IAAyB,GAAe,SAC5C,EAAM,UACP;AACD,WACE,kBAAC,GAAD;KAES;KACW;KACM;KACxB,EAJK,EAAM,GAIX;KAEJ,EACE,CAAA;GACL,EAAQ,SAAS,KAChB,kBAAC,GAAD;IACE,KAAI,OAAU;KACZ,IAAI;KACJ,IAAI;MACH,EAAM,YAAY,KAAK,KAAK,GAAG,EAC9B,gBAAgB,EACd,SAAS,SACV,EACF;KACF;cAEC,IAaA,kBAAC,GAAD;KACE,IAAI;KACJ,SAAS;KACT,eAAe,EAAoB,GAAM;KACzC,UAAU;KACV,CAAA,GAjBF,kBAAC,GAAD;KACE,WAAA;KACA,aAAa;KACb,eAAe;AACb,MAAI,GAAoB,YAAY,cAClC,EAAmB,GAAK,GAExB,EAAoB,GAAK;;KAG7B,CAAA;IASA,CAAA;GAGP,KACC,kBAAC,GAAD;IACE,SAAQ;IACR,eAAe;AACb,SAAe;;cAElB;IAEQ,CAAA,GAET,kBAAA,GAAA,EAAK,CAAA;GAEP,kBAAC,GAAD;IACE,MAAM;IACN,OAAM;IACN,SAAQ;IACR,gBAAgB,EAAmB,GAAM;IACzC,iBAAiB,KAAc,GAAa,EAAW;IACvD,oBAAmB;IACnB,mBAAkB;IAClB,CAAA;GACF,kBAAC,GAAD;IACE,MAAM;IACN,OAAM;IACN,SAAQ;IACR,gBAAgB,EAAoB,GAAM;IAC1C,iBAAiB,KAAc,GAAc,EAAW;IACxD,oBAAmB;IACnB,mBAAkB;IAClB,CAAA;GACF,kBAAC,GAAD;IACE,MAAM;IACN,cAAc,EAAmB,GAAM;IACvC,iBAAiB;IACjB,CAAA;GACE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ForumTable.js","names":[],"sources":["../../../src/components/Forum/ForumTable.tsx"],"sourcesContent":["import InfiniteTableLayout from '@/components/layout/InfiniteTableLayout'\nimport { useGetForumThreadsInfinite } from '@/synapse-queries/forum/useForum'\nimport { AVATAR } from '@/utils/SynapseConstants'\nimport { Link } from '@mui/material'\nimport {\n DiscussionFilter,\n DiscussionThreadBundle,\n DiscussionThreadOrder,\n} from '@sage-bionetworks/synapse-types'\nimport {\n ColumnDef,\n createColumnHelper,\n getCoreRowModel,\n SortingState,\n Table,\n useReactTable,\n} from '@tanstack/react-table'\nimport dayjs from 'dayjs'\nimport isEmpty from 'lodash-es/isEmpty'\nimport { useMemo, useState } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\nimport ColumnHeader from '../TanStackTable/ColumnHeader'\nimport StyledTanStackTable from '../TanStackTable/StyledTanStackTable'\nimport { UserBadge } from '../UserCard/UserBadge'\nimport UserCard from '../UserCard/UserCard'\n\nexport type ForumTableProps = {\n forumId: string\n limit: number\n onClickLink: (threadId: string) => void\n filter: DiscussionFilter\n}\n\nconst columnHelper = createColumnHelper<DiscussionThreadBundle>()\n\nfunction getColumns(\n onClickLink: (threadId: string) => void,\n): ColumnDef<DiscussionThreadBundle, any>[] {\n return [\n columnHelper.accessor('title', {\n header: props => <ColumnHeader {...props} title={'Topic'} />,\n cell: ({ row }) => (\n <Link onClick={() => onClickLink(row.original.id)}>\n {row.original.isPinned ? <IconSvg icon=\"pushpin\" /> : <></>}\n {row.original.title}\n </Link>\n ),\n enableSorting: true,\n size: 250,\n }),\n columnHelper.accessor('createdBy', {\n header: props => <ColumnHeader {...props} title={'Author'} />,\n cell: ({ getValue }) => <UserBadge userId={getValue()} />,\n enableSorting: false,\n size: 60,\n }),\n columnHelper.accessor('activeAuthors', {\n header: props => <ColumnHeader {...props} title={'Active Users'} />,\n cell: ({ getValue }) =>\n getValue().map((userId: string) => (\n <div key={userId} className=\"avatarContainer\">\n <UserCard\n showCardOnHover={true}\n className=\"ActiveUsers\"\n size={AVATAR}\n avatarSize={'MEDIUM'}\n ownerId={userId}\n />\n </div>\n )),\n enableSorting: false,\n }),\n columnHelper.accessor('numberOfReplies', {\n header: props => <ColumnHeader {...props} title={'Replies'} />,\n cell: ({ getValue }) => getValue().toLocaleString(),\n enableSorting: true,\n minSize: 10,\n size: 20,\n }),\n columnHelper.accessor('numberOfViews', {\n header: props => <ColumnHeader {...props} title={'Views'} />,\n cell: ({ getValue }) => getValue().toLocaleString(),\n enableSorting: true,\n minSize: 10,\n size: 20,\n }),\n columnHelper.accessor('lastActivity', {\n header: props => <ColumnHeader {...props} title={'Activity'} />,\n cell: ({ getValue }) => dayjs(getValue()).format('L'),\n enableSorting: true,\n size: 30,\n }),\n ]\n}\n\nexport function ForumTable({\n forumId,\n limit,\n filter,\n onClickLink,\n}: ForumTableProps) {\n const [tableSortState, setTableSortState] = useState<SortingState>([\n {\n desc: true,\n id: 'lastActivity',\n },\n ])\n\n const discussionThreadOrder = useMemo(() => {\n if (!isEmpty(tableSortState)) {\n if (tableSortState[0].id == 'lastActivity') {\n return DiscussionThreadOrder.PINNED_AND_LAST_ACTIVITY\n } else if (tableSortState[0].id == 'numberOfReplies') {\n return DiscussionThreadOrder.NUMBER_OF_REPLIES\n } else if (tableSortState[0].id == 'title') {\n return DiscussionThreadOrder.THREAD_TITLE\n } else if (tableSortState[0].id == 'numberOfViews') {\n return DiscussionThreadOrder.NUMBER_OF_VIEWS\n }\n }\n return DiscussionThreadOrder.PINNED_AND_LAST_ACTIVITY\n }, [tableSortState])\n\n const { data, isLoading, hasNextPage, fetchNextPage, isFetchingNextPage } =\n useGetForumThreadsInfinite(\n forumId,\n limit,\n discussionThreadOrder,\n !tableSortState[0]?.desc,\n filter,\n )\n\n const threads = useMemo(\n () => data?.pages.flatMap(page => page.results) ?? [],\n [data],\n )\n\n const columns = useMemo(() => getColumns(onClickLink), [onClickLink])\n\n const table: Table<DiscussionThreadBundle> =\n useReactTable<DiscussionThreadBundle>({\n data: threads,\n columns: columns,\n state: {\n sorting: tableSortState,\n },\n onSortingChange: setTableSortState,\n getRowId: row => row.id,\n getCoreRowModel: getCoreRowModel(),\n columnResizeMode: 'onChange',\n manualSorting: true,\n enableMultiSort: false,\n enableFilters: false,\n })\n\n const hasNoResults = !isLoading && table.getRowModel().rows.length === 0\n\n return (\n <div className=\"ForumTable\">\n <InfiniteTableLayout\n table={\n <StyledTanStackTable\n table={table}\n styledTableContainerProps={{ sx: { my: 2, maxHeight: '250px' } }}\n />\n }\n isLoading={isLoading}\n isEmpty={hasNoResults}\n hasNextPage={hasNextPage}\n onFetchNextPageClicked={() => {\n void fetchNextPage()\n }}\n isFetchingNextPage={isFetchingNextPage}\n />\n </div>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAiCA,IAAM,IAAe,GAA4C;AAEjE,SAAS,EACP,GAC0C;AAC1C,QAAO;EACL,EAAa,SAAS,SAAS;GAC7B,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAW,CAAA;GAC5D,OAAO,EAAE,aACP,kBAAC,GAAD;IAAM,eAAe,EAAY,EAAI,SAAS,GAAG;cAAjD,CACG,EAAI,SAAS,WAAW,kBAAC,GAAD,EAAS,MAAK,WAAY,CAAA,GAAG,kBAAA,GAAA,EAAK,CAAA,EAC1D,EAAI,SAAS,MACT;;GAET,eAAe;GACf,MAAM;GACP,CAAC;EACF,EAAa,SAAS,aAAa;GACjC,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAY,CAAA;GAC7D,OAAO,EAAE,kBAAe,kBAAC,GAAD,EAAW,QAAQ,GAAU,EAAI,CAAA;GACzD,eAAe;GACf,MAAM;GACP,CAAC;EACF,EAAa,SAAS,iBAAiB;GACrC,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAkB,CAAA;GACnE,OAAO,EAAE,kBACP,GAAU,CAAC,KAAK,MACd,kBAAC,OAAD;IAAkB,WAAU;cAC1B,kBAAC,GAAD;KACE,iBAAiB;KACjB,WAAU;KACV,MAAM;KACN,YAAY;KACZ,SAAS;KACT,CAAA;IACE,EARI,EAQJ,CACN;GACJ,eAAe;GAChB,CAAC;EACF,EAAa,SAAS,mBAAmB;GACvC,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAa,CAAA;GAC9D,OAAO,EAAE,kBAAe,GAAU,CAAC,gBAAgB;GACnD,eAAe;GACf,SAAS;GACT,MAAM;GACP,CAAC;EACF,EAAa,SAAS,iBAAiB;GACrC,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAW,CAAA;GAC5D,OAAO,EAAE,kBAAe,GAAU,CAAC,gBAAgB;GACnD,eAAe;GACf,SAAS;GACT,MAAM;GACP,CAAC;EACF,EAAa,SAAS,gBAAgB;GACpC,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAc,CAAA;GAC/D,OAAO,EAAE,kBAAe,EAAM,GAAU,CAAC,CAAC,OAAO,IAAI;GACrD,eAAe;GACf,MAAM;GACP,CAAC;EACH;;AAGH,SAAgB,EAAW,EACzB,YACA,UACA,WACA,kBACkB;CAClB,IAAM,CAAC,GAAgB,KAAqB,EAAuB,CACjE;EACE,MAAM;EACN,IAAI;EACL,CACF,CAAC,EAiBI,EAAE,SAAM,cAAW,gBAAa,kBAAe,0BACnD,EACE,GACA,GAlB0B,QAAc;AAC1C,MAAI,CAAC,EAAQ,EAAe,EAC1B;OAAI,EAAe,GAAG,MAAM,eAC1B,QAAO,EAAsB;OACpB,EAAe,GAAG,MAAM,kBACjC,QAAO,EAAsB;OACpB,EAAe,GAAG,MAAM,QACjC,QAAO,EAAsB;OACpB,EAAe,GAAG,MAAM,gBACjC,QAAO,EAAsB;;AAGjC,SAAO,EAAsB;IAC5B,CAAC,EAAe,
|
|
1
|
+
{"version":3,"file":"ForumTable.js","names":[],"sources":["../../../src/components/Forum/ForumTable.tsx"],"sourcesContent":["import InfiniteTableLayout from '@/components/layout/InfiniteTableLayout'\nimport { useGetForumThreadsInfinite } from '@/synapse-queries/forum/useForum'\nimport { AVATAR } from '@/utils/SynapseConstants'\nimport { Link } from '@mui/material'\nimport {\n DiscussionFilter,\n DiscussionThreadBundle,\n DiscussionThreadOrder,\n} from '@sage-bionetworks/synapse-types'\nimport {\n ColumnDef,\n createColumnHelper,\n getCoreRowModel,\n SortingState,\n Table,\n useReactTable,\n} from '@tanstack/react-table'\nimport dayjs from 'dayjs'\nimport isEmpty from 'lodash-es/isEmpty'\nimport { useMemo, useState } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\nimport ColumnHeader from '../TanStackTable/ColumnHeader'\nimport StyledTanStackTable from '../TanStackTable/StyledTanStackTable'\nimport { UserBadge } from '../UserCard/UserBadge'\nimport UserCard from '../UserCard/UserCard'\n\nexport type ForumTableProps = {\n forumId: string\n limit: number\n onClickLink: (threadId: string) => void\n filter: DiscussionFilter\n}\n\nconst columnHelper = createColumnHelper<DiscussionThreadBundle>()\n\nfunction getColumns(\n onClickLink: (threadId: string) => void,\n): ColumnDef<DiscussionThreadBundle, any>[] {\n return [\n columnHelper.accessor('title', {\n header: props => <ColumnHeader {...props} title={'Topic'} />,\n cell: ({ row }) => (\n <Link onClick={() => onClickLink(row.original.id)}>\n {row.original.isPinned ? <IconSvg icon=\"pushpin\" /> : <></>}\n {row.original.title}\n </Link>\n ),\n enableSorting: true,\n size: 250,\n }),\n columnHelper.accessor('createdBy', {\n header: props => <ColumnHeader {...props} title={'Author'} />,\n cell: ({ getValue }) => <UserBadge userId={getValue()} />,\n enableSorting: false,\n size: 60,\n }),\n columnHelper.accessor('activeAuthors', {\n header: props => <ColumnHeader {...props} title={'Active Users'} />,\n cell: ({ getValue }) =>\n getValue().map((userId: string) => (\n <div key={userId} className=\"avatarContainer\">\n <UserCard\n showCardOnHover={true}\n className=\"ActiveUsers\"\n size={AVATAR}\n avatarSize={'MEDIUM'}\n ownerId={userId}\n />\n </div>\n )),\n enableSorting: false,\n }),\n columnHelper.accessor('numberOfReplies', {\n header: props => <ColumnHeader {...props} title={'Replies'} />,\n cell: ({ getValue }) => getValue().toLocaleString(),\n enableSorting: true,\n minSize: 10,\n size: 20,\n }),\n columnHelper.accessor('numberOfViews', {\n header: props => <ColumnHeader {...props} title={'Views'} />,\n cell: ({ getValue }) => getValue().toLocaleString(),\n enableSorting: true,\n minSize: 10,\n size: 20,\n }),\n columnHelper.accessor('lastActivity', {\n header: props => <ColumnHeader {...props} title={'Activity'} />,\n cell: ({ getValue }) => dayjs(getValue()).format('L'),\n enableSorting: true,\n size: 30,\n }),\n ]\n}\n\nexport function ForumTable({\n forumId,\n limit,\n filter,\n onClickLink,\n}: ForumTableProps) {\n const [tableSortState, setTableSortState] = useState<SortingState>([\n {\n desc: true,\n id: 'lastActivity',\n },\n ])\n\n const discussionThreadOrder = useMemo(() => {\n if (!isEmpty(tableSortState)) {\n if (tableSortState[0].id == 'lastActivity') {\n return DiscussionThreadOrder.PINNED_AND_LAST_ACTIVITY\n } else if (tableSortState[0].id == 'numberOfReplies') {\n return DiscussionThreadOrder.NUMBER_OF_REPLIES\n } else if (tableSortState[0].id == 'title') {\n return DiscussionThreadOrder.THREAD_TITLE\n } else if (tableSortState[0].id == 'numberOfViews') {\n return DiscussionThreadOrder.NUMBER_OF_VIEWS\n }\n }\n return DiscussionThreadOrder.PINNED_AND_LAST_ACTIVITY\n }, [tableSortState])\n\n const { data, isLoading, hasNextPage, fetchNextPage, isFetchingNextPage } =\n useGetForumThreadsInfinite(\n forumId,\n limit,\n discussionThreadOrder,\n !tableSortState[0]?.desc,\n filter,\n )\n\n const threads = useMemo(\n () => data?.pages.flatMap(page => page.results) ?? [],\n [data],\n )\n\n const columns = useMemo(() => getColumns(onClickLink), [onClickLink])\n\n const table: Table<DiscussionThreadBundle> =\n useReactTable<DiscussionThreadBundle>({\n data: threads,\n columns: columns,\n state: {\n sorting: tableSortState,\n },\n onSortingChange: setTableSortState,\n getRowId: row => row.id,\n getCoreRowModel: getCoreRowModel(),\n columnResizeMode: 'onChange',\n manualSorting: true,\n enableMultiSort: false,\n enableFilters: false,\n })\n\n const hasNoResults = !isLoading && table.getRowModel().rows.length === 0\n\n return (\n <div className=\"ForumTable\">\n <InfiniteTableLayout\n table={\n <StyledTanStackTable\n table={table}\n styledTableContainerProps={{ sx: { my: 2, maxHeight: '250px' } }}\n />\n }\n isLoading={isLoading}\n isEmpty={hasNoResults}\n hasNextPage={hasNextPage}\n onFetchNextPageClicked={() => {\n void fetchNextPage()\n }}\n isFetchingNextPage={isFetchingNextPage}\n />\n </div>\n )\n}\n"],"mappings":"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"}
|