synapse-react-client 4.0.18 → 4.0.20
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 +3 -1
- package/dist/SWC.index.d.ts.map +1 -1
- package/dist/SWC.index.js +3 -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/DefaultColorfulPortalCardBackground.js.map +1 -1
- package/dist/assets/GoogleIcon.js.map +1 -1
- package/dist/assets/GoogleIcon24.js.map +1 -1
- package/dist/assets/homepage/BlinkingLiveIcon.d.ts +1 -1
- package/dist/assets/homepage/BlinkingLiveIcon.js.map +1 -1
- package/dist/assets/homepage/aacr.js.map +1 -1
- package/dist/assets/homepage/cri.js.map +1 -1
- package/dist/assets/homepage/ctf.js.map +1 -1
- package/dist/assets/homepage/egress.js.map +1 -1
- package/dist/assets/homepage/facebook.js.map +1 -1
- package/dist/assets/homepage/fisma.js.map +1 -1
- package/dist/assets/homepage/gff.js.map +1 -1
- package/dist/assets/homepage/github.js.map +1 -1
- package/dist/assets/homepage/gray.js.map +1 -1
- package/dist/assets/homepage/hipaa-compliant.js.map +1 -1
- package/dist/assets/homepage/instagram.js.map +1 -1
- package/dist/assets/homepage/linkedin.js.map +1 -1
- package/dist/assets/homepage/ml-commons.js.map +1 -1
- package/dist/assets/homepage/nih-aging.js.map +1 -1
- package/dist/assets/homepage/nih-heart.js.map +1 -1
- package/dist/assets/homepage/nih-nci.js.map +1 -1
- package/dist/assets/homepage/nih-nimh.js.map +1 -1
- package/dist/assets/homepage/ntap.js.map +1 -1
- package/dist/assets/homepage/plan-item.js.map +1 -1
- package/dist/assets/homepage/powered-by-synapse-feature.js.map +1 -1
- package/dist/assets/homepage/precision-governance-feature.js.map +1 -1
- package/dist/assets/homepage/python.js.map +1 -1
- package/dist/assets/homepage/r.js.map +1 -1
- package/dist/assets/homepage/research-credit-feature.js.map +1 -1
- package/dist/assets/homepage/seamless-integration-feature.js.map +1 -1
- package/dist/assets/homepage/sloan.js.map +1 -1
- package/dist/assets/homepage/twitter.js.map +1 -1
- package/dist/assets/homepage/users.js.map +1 -1
- package/dist/assets/homepage/youtube.js.map +1 -1
- package/dist/assets/icons/AccessDataAnywhere.js.map +1 -1
- package/dist/assets/icons/AccessPending.js.map +1 -1
- package/dist/assets/icons/AccessPendingCloud.js.map +1 -1
- package/dist/assets/icons/AddAd.js.map +1 -1
- package/dist/assets/icons/AddToList.js.map +1 -1
- package/dist/assets/icons/Alert.js.map +1 -1
- package/dist/assets/icons/Arrow.js.map +1 -1
- package/dist/assets/icons/AwardScroll.js.map +1 -1
- package/dist/assets/icons/Baseline.js.map +1 -1
- package/dist/assets/icons/Cavatica.js.map +1 -1
- package/dist/assets/icons/CertifiedUser.js.map +1 -1
- package/dist/assets/icons/Challenge.js.map +1 -1
- package/dist/assets/icons/Checkbox/Checked.js.map +1 -1
- package/dist/assets/icons/Checkbox/Checked2.js.map +1 -1
- package/dist/assets/icons/Checkbox/Indeterminate.js.map +1 -1
- package/dist/assets/icons/Checkbox/Indeterminate2.js.map +1 -1
- package/dist/assets/icons/Checkbox/Unchecked.js.map +1 -1
- package/dist/assets/icons/Checkbox/Unchecked2.js.map +1 -1
- package/dist/assets/icons/ClappingHands.js.map +1 -1
- package/dist/assets/icons/CloudWarning.js.map +1 -1
- package/dist/assets/icons/CommunicateFindings.js.map +1 -1
- package/dist/assets/icons/CreateVersion.js.map +1 -1
- package/dist/assets/icons/DNA_Two.js.map +1 -1
- package/dist/assets/icons/Data2.js.map +1 -1
- package/dist/assets/icons/DoubleQuotes.js.map +1 -1
- package/dist/assets/icons/EmailAddressAdornment.js.map +1 -1
- package/dist/assets/icons/FileWithShield.js.map +1 -1
- package/dist/assets/icons/FileWithShield2.js.map +1 -1
- package/dist/assets/icons/FrontHand.js.map +1 -1
- package/dist/assets/icons/HandWithMoney.js.map +1 -1
- package/dist/assets/icons/IconCopy.js.map +1 -1
- package/dist/assets/icons/IconMinus.js.map +1 -1
- package/dist/assets/icons/IconPlus.js.map +1 -1
- package/dist/assets/icons/Java.js.map +1 -1
- package/dist/assets/icons/MintDoi.js.map +1 -1
- package/dist/assets/icons/MultiFile.js.map +1 -1
- package/dist/assets/icons/MultiFile2.js.map +1 -1
- package/dist/assets/icons/NoData.js.map +1 -1
- package/dist/assets/icons/NoSearchResults.js.map +1 -1
- package/dist/assets/icons/ORCIDIcon.js.map +1 -1
- package/dist/assets/icons/OpenBook.js.map +1 -1
- package/dist/assets/icons/Podium.js.map +1 -1
- package/dist/assets/icons/Python.js.map +1 -1
- package/dist/assets/icons/QueryStructuredData.js.map +1 -1
- package/dist/assets/icons/RLogo.js.map +1 -1
- package/dist/assets/icons/RecordProvenance.js.map +1 -1
- package/dist/assets/icons/RosetteRibbon.js.map +1 -1
- package/dist/assets/icons/SageFullLogo.js.map +1 -1
- package/dist/assets/icons/SearchImage.js.map +1 -1
- package/dist/assets/icons/ShareYourResearch.js.map +1 -1
- package/dist/assets/icons/Sort.js.map +1 -1
- package/dist/assets/icons/StarTrophy.js.map +1 -1
- package/dist/assets/icons/SynapseFullLogo.js.map +1 -1
- package/dist/assets/icons/SynapseIconWhite.js.map +1 -1
- package/dist/assets/icons/SynapseLogoName.js.map +1 -1
- package/dist/assets/icons/TasksIcon.js.map +1 -1
- package/dist/assets/icons/Terminal.js.map +1 -1
- package/dist/assets/icons/ThreeStars.js.map +1 -1
- package/dist/assets/icons/UnpackagableFile.js.map +1 -1
- package/dist/assets/icons/UnpackagableFile2.js.map +1 -1
- package/dist/assets/icons/ValidatedProfile.js.map +1 -1
- package/dist/assets/icons/account-certified.js.map +1 -1
- package/dist/assets/icons/account-enabled-mfa.js.map +1 -1
- package/dist/assets/icons/account-validated.js.map +1 -1
- package/dist/assets/icons/bioChemicalPhysical.js.map +1 -1
- package/dist/assets/icons/chart2.js.map +1 -1
- package/dist/assets/icons/columns.js.map +1 -1
- package/dist/assets/icons/columnsDarkTheme.js.map +1 -1
- package/dist/assets/icons/computationalTool.js.map +1 -1
- package/dist/assets/icons/dataReuse.js.map +1 -1
- package/dist/assets/icons/emailAddressAdornment2.js.map +1 -1
- package/dist/assets/icons/emailWithNotification.js.map +1 -1
- package/dist/assets/icons/error_page/maintenance.js.map +1 -1
- package/dist/assets/icons/error_page/no-access.js.map +1 -1
- package/dist/assets/icons/error_page/unavailable.js.map +1 -1
- package/dist/assets/icons/file.js.map +1 -1
- package/dist/assets/icons/inSilicoModel.js.map +1 -1
- package/dist/assets/icons/institution.js.map +1 -1
- package/dist/assets/icons/json-form-tool-no-submissions.js.map +1 -1
- package/dist/assets/icons/modelSystem.js.map +1 -1
- package/dist/assets/icons/mouse.js.map +1 -1
- package/dist/assets/icons/organizations.js.map +1 -1
- package/dist/assets/icons/person.js.map +1 -1
- package/dist/assets/icons/spatialProfiling.js.map +1 -1
- package/dist/assets/icons/standardDataModel.js.map +1 -1
- package/dist/assets/icons/study-active.js.map +1 -1
- package/dist/assets/icons/study-complete.js.map +1 -1
- package/dist/assets/icons/subscribe_plus.js.map +1 -1
- package/dist/assets/icons/synapse-logo.js.map +1 -1
- package/dist/assets/icons/terms/CheckIcon.js.map +1 -1
- package/dist/assets/icons/translational.js.map +1 -1
- package/dist/assets/icons/tree_horizontal.js.map +1 -1
- package/dist/assets/illustrations/acknowledgement_statements_illustration.js.map +1 -1
- package/dist/assets/illustrations/challenges_illustration.js.map +1 -1
- package/dist/assets/illustrations/cohort_builder_illustration.js.map +1 -1
- package/dist/assets/illustrations/data_access_management_illustration.js.map +1 -1
- package/dist/assets/illustrations/datasets_illustration.js.map +1 -1
- package/dist/assets/illustrations/diagonalLinePattern.js.map +1 -1
- package/dist/assets/illustrations/discussions_illustration.js.map +1 -1
- package/dist/assets/illustrations/docker_illustration.js.map +1 -1
- package/dist/assets/illustrations/donation_illustration.js.map +1 -1
- package/dist/assets/illustrations/favorites_illustration.js.map +1 -1
- package/dist/assets/illustrations/files_illustration.js.map +1 -1
- package/dist/assets/illustrations/following_illustration.js.map +1 -1
- package/dist/assets/illustrations/index.js.map +1 -1
- package/dist/assets/illustrations/left_dot_blob_dark_illustration.js.map +1 -1
- package/dist/assets/illustrations/left_dot_blob_illustration.js.map +1 -1
- package/dist/assets/illustrations/projects_illustration.js.map +1 -1
- package/dist/assets/illustrations/right_dot_blob_dark_illustration.js.map +1 -1
- package/dist/assets/illustrations/right_dot_blob_illustration.js.map +1 -1
- package/dist/assets/illustrations/tables_illustration.js.map +1 -1
- package/dist/assets/illustrations/teams_illustration.js.map +1 -1
- package/dist/assets/illustrations/trash_can_illustration.js.map +1 -1
- package/dist/assets/illustrations/underconstruction_illustration.js.map +1 -1
- package/dist/assets/illustrations/wikis_illustration.js.map +1 -1
- package/dist/assets/logos/other/ad-workbench-logo.js.map +1 -1
- package/dist/assets/logos/other/cavatica-logo.js.map +1 -1
- package/dist/assets/logos/other/pluto-logo.js.map +1 -1
- package/dist/assets/logos/other/terra-logo.js.map +1 -1
- package/dist/assets/mui_components/AccessManagement.js.map +1 -1
- package/dist/assets/mui_components/AccountCertified.js.map +1 -1
- package/dist/assets/mui_components/AccountRegistered.js.map +1 -1
- package/dist/assets/mui_components/AccountValidated.js.map +1 -1
- package/dist/assets/mui_components/ActionKey.js.map +1 -1
- package/dist/assets/mui_components/BioChemicalPhysical.js.map +1 -1
- package/dist/assets/mui_components/Chromatin.js.map +1 -1
- package/dist/assets/mui_components/Clinical.js.map +1 -1
- package/dist/assets/mui_components/ComputationalTool.js.map +1 -1
- package/dist/assets/mui_components/Data.js.map +1 -1
- package/dist/assets/mui_components/DataLocked.js.map +1 -1
- package/dist/assets/mui_components/DataReuse.js.map +1 -1
- package/dist/assets/mui_components/Dataset.js.map +1 -1
- package/dist/assets/mui_components/DatasetCollection.js.map +1 -1
- package/dist/assets/mui_components/Docker.js.map +1 -1
- package/dist/assets/mui_components/GeneExpression.js.map +1 -1
- package/dist/assets/mui_components/GeneVariants.js.map +1 -1
- package/dist/assets/mui_components/HelpChatBubble.js.map +1 -1
- package/dist/assets/mui_components/Imaging.js.map +1 -1
- package/dist/assets/mui_components/InSilicoModel.js.map +1 -1
- package/dist/assets/mui_components/Kinomics.js.map +1 -1
- package/dist/assets/mui_components/LineGraph.js.map +1 -1
- package/dist/assets/mui_components/ModelSystem.js.map +1 -1
- package/dist/assets/mui_components/Other.js.map +1 -1
- package/dist/assets/mui_components/PackagableFile.js.map +1 -1
- package/dist/assets/mui_components/PackagableFile2.js.map +1 -1
- package/dist/assets/mui_components/Proteomics.js.map +1 -1
- package/dist/assets/mui_components/Rat.js.map +1 -1
- package/dist/assets/mui_components/SpatialProfiling.js.map +1 -1
- package/dist/assets/sustainability/darkDialPosition1.js.map +1 -1
- package/dist/assets/sustainability/darkDialPosition2.js.map +1 -1
- package/dist/assets/sustainability/darkDialPosition3.js.map +1 -1
- package/dist/assets/sustainability/darkDialPosition4.js.map +1 -1
- package/dist/assets/sustainability/dialPosition1.js.map +1 -1
- package/dist/assets/sustainability/dialPosition2.js.map +1 -1
- package/dist/assets/sustainability/dialPosition3.js.map +1 -1
- package/dist/assets/sustainability/dialPosition4.js.map +1 -1
- package/dist/assets/themed_icons/Active.js.map +1 -1
- package/dist/assets/themed_icons/Chart.js.map +1 -1
- package/dist/assets/themed_icons/Close.js.map +1 -1
- package/dist/assets/themed_icons/Collapse.js.map +1 -1
- package/dist/assets/themed_icons/Columns.js.map +1 -1
- package/dist/assets/themed_icons/ColumnsDark.js.map +1 -1
- package/dist/assets/themed_icons/Database.js.map +1 -1
- package/dist/assets/themed_icons/Download.js.map +1 -1
- package/dist/assets/themed_icons/Expand.js.map +1 -1
- package/dist/assets/themed_icons/Explore.js.map +1 -1
- package/dist/assets/themed_icons/ExternalLink.js.map +1 -1
- package/dist/assets/themed_icons/Filter.js.map +1 -1
- package/dist/assets/themed_icons/Program.js.map +1 -1
- package/dist/assets/themed_icons/Project.js.map +1 -1
- package/dist/assets/themed_icons/Publication.js.map +1 -1
- package/dist/assets/themed_icons/Search.js.map +1 -1
- package/dist/assets/themed_icons/Settings.js.map +1 -1
- package/dist/assets/themed_icons/SortDown.js.map +1 -1
- package/dist/assets/themed_icons/SortUp.js.map +1 -1
- package/dist/assets/themed_icons/SqlEditorIcon.js.map +1 -1
- package/dist/assets/themed_icons/Study.js.map +1 -1
- package/dist/assets/themed_icons/ToolClinical.js.map +1 -1
- package/dist/assets/themed_icons/ToolComputational.js.map +1 -1
- package/dist/assets/themed_icons/ToolExperimental.js.map +1 -1
- package/dist/assets/themed_icons/VerticalDots.js.map +1 -1
- package/dist/components/AccessRequirement/AddConditionsForUseButton/AddConditionsForUseButton.js.map +1 -1
- package/dist/components/AccessRequirement/EntityActionsRequired.js.map +1 -1
- package/dist/components/AccessRequirement/ImposeRestrictionDialog/ImposeRestrictionDialog.js.map +1 -1
- package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.js.map +1 -1
- package/dist/components/AccessRequirementList/AccessApprovalCheckMark.js +10 -11
- package/dist/components/AccessRequirementList/AccessApprovalCheckMark.js.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementList.js +73 -76
- package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementListItem.js.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementListUtils.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/CancelRequestDataAccess.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DocumentTemplate.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementFormWikiWrapper.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementItem.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementItemView.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/RequestDataAccessSuccess.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/UploadDocumentField.js.map +1 -1
- package/dist/components/AccessRequirementList/RequirementItem/AuthenticatedRequirement.js.map +1 -1
- package/dist/components/AccessRequirementList/RequirementItem/CertificationRequirement.js.map +1 -1
- package/dist/components/AccessRequirementList/RequirementItem/LockAccessRequirementItem.js.map +1 -1
- package/dist/components/AccessRequirementList/RequirementItem/RequirementItem.js.map +1 -1
- package/dist/components/AccessRequirementList/RequirementItem/SelfSignAccessRequirementItem.js.map +1 -1
- package/dist/components/AccessRequirementList/RequirementItem/TwoFactorAuthEnabledRequirement.js.map +1 -1
- package/dist/components/AccessRequirementList/RequirementItem/UnmanagedACTAccessRequirementItem.js.map +1 -1
- package/dist/components/AccessRequirementList/RequirementItem/ValidationRequirement.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/AccessTokenPage/AccessTokenPage.js.map +1 -1
- package/dist/components/AccessTokenPage/CreateAccessTokenModal.js.map +1 -1
- package/dist/components/AccountLevelBadge/AccountLevelBadge.js.map +1 -1
- package/dist/components/AccountLevelBadges/AccountLevelBadges.js.map +1 -1
- package/dist/components/AccountLevelBadges/useRevokeCertificationUI.js.map +1 -1
- package/dist/components/AcknowledgementsPage/AcknowledgementsDialog.js.map +1 -1
- package/dist/components/AcknowledgementsPage/AcknowledgementsPage.js.map +1 -1
- package/dist/components/AcknowledgementsPage/StudyAcknowledgement.js.map +1 -1
- package/dist/components/AcknowledgementsPage/StudyAcknowledgements.js.map +1 -1
- package/dist/components/AclEditor/AclEditor.js.map +1 -1
- package/dist/components/AclEditor/AclEditor.test-utils.js.map +1 -1
- package/dist/components/AclEditor/AclEditorSkeleton.js.map +1 -1
- package/dist/components/AclEditor/PermissionLevelMenu.js.map +1 -1
- package/dist/components/AclEditor/ReadOnlyPermissionLevel.js.map +1 -1
- package/dist/components/AclEditor/ResourceAccessAndUserGroupHeader.js +2 -4
- package/dist/components/AclEditor/ResourceAccessAndUserGroupHeader.js.map +1 -1
- package/dist/components/AclEditor/ResourceAccessItem.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/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.js.map +1 -1
- package/dist/components/AddToDownloadListV2.js.map +1 -1
- package/dist/components/Aridhia/AridhiaAccessStatus.js.map +1 -1
- package/dist/components/Aridhia/aridhiaAccessStatusUtils.js.map +1 -1
- package/dist/components/Authentication/AuthenticationMethodSelection.js.map +1 -1
- package/dist/components/Authentication/LastLoginInfo.js.map +1 -1
- package/dist/components/Authentication/LoginFlowBackButton.js.map +1 -1
- package/dist/components/Authentication/LoginForm.js.map +1 -1
- package/dist/components/Authentication/LoginMethod.js.map +1 -1
- package/dist/components/Authentication/LoginMethodButton.js.map +1 -1
- package/dist/components/Authentication/Logout.js.map +1 -1
- package/dist/components/Authentication/OneTimePasswordForm.js.map +1 -1
- package/dist/components/Authentication/PasswordField.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.map +1 -1
- package/dist/components/Authentication/TOTPForm.js.map +1 -1
- package/dist/components/Authentication/TwoFactorAuthSettingsPanel.js.map +1 -1
- package/dist/components/Authentication/TwoFactorBackupCodes.js.map +1 -1
- package/dist/components/Authentication/TwoFactorEnrollmentForm.js.map +1 -1
- package/dist/components/Authentication/TwoFactorSecretDialog.js.map +1 -1
- package/dist/components/Authentication/UsernamePasswordForm.js.map +1 -1
- package/dist/components/BasePortalCard/BasePortalCard.js.map +1 -1
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.js.map +1 -1
- package/dist/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
- package/dist/components/CTASectionWrapper/CTASectionWrapper.js.map +1 -1
- package/dist/components/CannedRejectionDialog/CannedRejectionDialog.js.map +1 -1
- package/dist/components/CardContainer/CardContainer.js.map +1 -1
- package/dist/components/CardContainerLogic/CardContainerLogic.js.map +1 -1
- package/dist/components/CardDeck/CardDeck.Desktop.js.map +1 -1
- package/dist/components/CardDeck/CardDeck.Mobile.js.map +1 -1
- package/dist/components/CardDeck/CardDeck.js.map +1 -1
- package/dist/components/CardDeck/TableQueryCardDeck.js.map +1 -1
- package/dist/components/CardGridWithLinks/CardGridWithLinks.js.map +1 -1
- package/dist/components/CertificationQuiz/CertificationAnswer.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/ChallengeDetailPage/ChallengeDetailPage.js.map +1 -1
- package/dist/components/ChallengeRegisterButton/ChallengeRegisterButton.js.map +1 -1
- package/dist/components/ChallengeRequirementsModal/ChallengeRequirementsModal.js.map +1 -1
- package/dist/components/ChallengeSubmission/AddExternalRepo.js.map +1 -1
- package/dist/components/ChallengeSubmission/AvailableEvaluationQueueList.js.map +1 -1
- package/dist/components/ChallengeSubmission/ChallengeSubmission.js.map +1 -1
- package/dist/components/ChallengeSubmission/ChallengeSubmissionStepper.js +62 -64
- 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/SubmissionCommitList.js.map +1 -1
- package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/ChallengeTeamSearch.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/ChallengeTeamTable.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/ChallengeTeamWizard.js +96 -102
- package/dist/components/ChallengeTeamWizard/ChallengeTeamWizard.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/MembershipRequestForm.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/OpenMembershipInvitation.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/RegistrationSuccessful.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/SelectChallengeTeam.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/useCreateAndRegisterChallengeTeam.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.map +1 -1
- package/dist/components/CitationPopover/CitationPopover.js.map +1 -1
- package/dist/components/CitationPopover/CitationPopoverContent.js.map +1 -1
- package/dist/components/CitationPopover/CitationPopoverUtils.js.map +1 -1
- package/dist/components/CitationPopover/useCitation.js.map +1 -1
- package/dist/components/ColorGradient/ColorGradient.js.map +1 -1
- package/dist/components/ColoredBulletListItem/ColoredBulletListItem.js.map +1 -1
- package/dist/components/ColumnFilter/ColumnFilter.js.map +1 -1
- package/dist/components/ComponentCollapse.js.map +1 -1
- package/dist/components/ConfirmationDialog/ConfirmationDialog.js.map +1 -1
- package/dist/components/CookiesNotification/CookiePreferencesDialog.js.map +1 -1
- package/dist/components/CookiesNotification/CookiesNotification.d.ts.map +1 -1
- package/dist/components/CookiesNotification/CookiesNotification.js +9 -9
- package/dist/components/CookiesNotification/CookiesNotification.js.map +1 -1
- package/dist/components/CopyToClipboardIcon.js.map +1 -1
- package/dist/components/CopyToClipboardInput/CopyToClipboardInput.js.map +1 -1
- package/dist/components/CopyToClipboardString/CopyToClipboardString.js.map +1 -1
- package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js.map +1 -1
- package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizardUtils.js.map +1 -1
- package/dist/components/CreateProjectModal/CreateProjectModal.js.map +1 -1
- package/dist/components/CreateProjectModal/ProjectVisibilityRadioGroup.js.map +1 -1
- package/dist/components/CreateTableViewWizard/CreateTableViewWizard.js.map +1 -1
- package/dist/components/CreateTableViewWizard/CreateTableViewWizardUtils.js.map +1 -1
- package/dist/components/CreateTableViewWizard/TableNameForm.js.map +1 -1
- package/dist/components/CreateTableViewWizard/TableTypeSelection.js.map +1 -1
- package/dist/components/CreateTableViewWizard/ViewTypeSelection.js.map +1 -1
- package/dist/components/CrispChat/CrispChat.js.map +1 -1
- package/dist/components/DataExplorer/DataExplorer.css +1 -0
- package/dist/components/DataExplorer/DataExplorer.d.ts +13 -0
- package/dist/components/DataExplorer/DataExplorer.d.ts.map +1 -0
- package/dist/components/DataExplorer/DataExplorer.js +116 -0
- package/dist/components/DataExplorer/DataExplorer.js.map +1 -0
- package/dist/components/DataExplorer/DataExplorer.module.js +22 -0
- package/dist/components/DataExplorer/DataExplorer.module.js.map +1 -0
- package/dist/components/DataExplorer/DataExplorer.module.scss +156 -0
- package/dist/components/DataGrid/DataGrid.js +72 -72
- package/dist/components/DataGrid/DataGrid.js.map +1 -1
- package/dist/components/DataGrid/DataGridTypes.js.map +1 -1
- package/dist/components/DataGrid/DataGridWebSocket.d.ts +2 -0
- package/dist/components/DataGrid/DataGridWebSocket.d.ts.map +1 -1
- package/dist/components/DataGrid/DataGridWebSocket.js +9 -10
- package/dist/components/DataGrid/DataGridWebSocket.js.map +1 -1
- package/dist/components/DataGrid/MergeGridWithSourceTableButton.js.map +1 -1
- package/dist/components/DataGrid/StartGridSession.js.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.d.ts +3 -1
- package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.js +219 -211
- package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteColumn.js +106 -102
- package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js +97 -89
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js.map +1 -1
- package/dist/components/DataGrid/columns/DateTimeColumn.js.map +1 -1
- package/dist/components/DataGrid/columns/GridAutocompleteChip.js.map +1 -1
- package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts +19 -8
- package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/useGridAutocompleteState.js +64 -43
- package/dist/components/DataGrid/columns/useGridAutocompleteState.js.map +1 -1
- package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.js.map +1 -1
- package/dist/components/DataGrid/components/ExportCsvFromGridButton.js.map +1 -1
- package/dist/components/DataGrid/components/GridMenuButton/GridMenuButton.js.map +1 -1
- package/dist/components/DataGrid/components/GridSessionSelectionField.js.map +1 -1
- package/dist/components/DataGrid/components/UploadCsvToGridButton.js.map +1 -1
- package/dist/components/DataGrid/components/UploadCsvToGridDialog.d.ts.map +1 -1
- package/dist/components/DataGrid/components/UploadCsvToGridDialog.js +9 -9
- package/dist/components/DataGrid/components/UploadCsvToGridDialog.js.map +1 -1
- package/dist/components/DataGrid/components/ValidationAlert.js.map +1 -1
- package/dist/components/DataGrid/components/contextMenu.js.map +1 -1
- package/dist/components/DataGrid/hooks/useColumnResizeHandles.js +2 -0
- package/dist/components/DataGrid/hooks/useColumnResizeHandles.js.map +1 -1
- package/dist/components/DataGrid/hooks/useExportDataGridToCsv.js.map +1 -1
- package/dist/components/DataGrid/hooks/useGetSchemaForGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js +8 -1
- package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js.map +1 -1
- package/dist/components/DataGrid/hooks/useGridReplicaUsers.js.map +1 -1
- package/dist/components/DataGrid/hooks/useGridUndoRedo.js.map +1 -1
- package/dist/components/DataGrid/hooks/useRemoteSelections.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 +2 -0
- package/dist/components/DataGrid/useDataGridWebsocket.d.ts.map +1 -1
- package/dist/components/DataGrid/useDataGridWebsocket.js +12 -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/MessageCounter.js.map +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
- package/dist/components/DataGrid/utils/calculateColumnWidth.js.map +1 -1
- 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/convertActionToModelChange.js.map +1 -1
- package/dist/components/DataGrid/utils/createTestModel.js.map +1 -1
- package/dist/components/DataGrid/utils/enrichRowsWithChangeInfo.js.map +1 -1
- package/dist/components/DataGrid/utils/extractColumnValidationMessages.js.map +1 -1
- package/dist/components/DataGrid/utils/getCellAuthorSid.js.map +1 -1
- package/dist/components/DataGrid/utils/getCellClassName.js.map +1 -1
- package/dist/components/DataGrid/utils/getChangeTooltipText.js.map +1 -1
- package/dist/components/DataGrid/utils/getEmptyValue.js.map +1 -1
- package/dist/components/DataGrid/utils/getReplicaCategory.js.map +1 -1
- package/dist/components/DataGrid/utils/isValidationUpToDateForRow.js.map +1 -1
- package/dist/components/DataGrid/utils/json-rx/JsonRx.js.map +1 -1
- package/dist/components/DataGrid/utils/json-rx/JsonRxMessage.js.map +1 -1
- package/dist/components/DataGrid/utils/json-rx/JsonRxNotification.js.map +1 -1
- package/dist/components/DataGrid/utils/json-rx/JsonRxRequest.js.map +1 -1
- package/dist/components/DataGrid/utils/json-rx/JsonRxRequestComplete.js.map +1 -1
- package/dist/components/DataGrid/utils/json-rx/JsonRxResponse.js.map +1 -1
- package/dist/components/DataGrid/utils/json-rx/JsonRxResponseComplete.js.map +1 -1
- package/dist/components/DataGrid/utils/logicalTimestampToString.js.map +1 -1
- package/dist/components/DataGrid/utils/mapOperationsToModelChanges.js.map +1 -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/replicaSelectionToGridSelection.js.map +1 -1
- package/dist/components/DataGrid/utils/schemaAwarePasteValue.js.map +1 -1
- package/dist/components/DataGrid/utils/splitPatch.js.map +1 -1
- package/dist/components/DatasetJsonLdScript.js.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
- package/dist/components/Dialog/ConfirmCloseWithoutSavingDialog.js.map +1 -1
- package/dist/components/DialogBase.js.map +1 -1
- package/dist/components/DirectDownload/DirectDownload.js.map +1 -1
- package/dist/components/DirectDownload/FileEntityDirectDownload.js.map +1 -1
- package/dist/components/DirectDownloadButton.js.map +1 -1
- package/dist/components/DownloadCart/ActionRequiredCard/ActionRequiredCard.js.map +1 -1
- package/dist/components/DownloadCart/ActionRequiredListItem.js.map +1 -1
- package/dist/components/DownloadCart/AvailableForDownloadTable.js.map +1 -1
- package/dist/components/DownloadCart/CreatePackageV2.js.map +1 -1
- package/dist/components/DownloadCart/DirectProgrammaticDownload.js.map +1 -1
- package/dist/components/DownloadCart/DownloadCartPage.js.map +1 -1
- package/dist/components/DownloadCart/DownloadDetails.js.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
- package/dist/components/DownloadCart/DownloadListActionsRequired.js.map +1 -1
- package/dist/components/DownloadCart/DownloadListStats.js.map +1 -1
- package/dist/components/DownloadCart/DownloadListTable.js.map +1 -1
- package/dist/components/DownloadCart/EnableTwoFaRequirementCard.js.map +1 -1
- package/dist/components/DownloadCart/MeetAccessRequirementCard.js.map +1 -1
- package/dist/components/DownloadCart/RequestDownloadCard.js.map +1 -1
- package/dist/components/DownloadCart/ShowDownloadV2.js.map +1 -1
- package/dist/components/DownloadCart/TableQueryActionsRequired.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/DropdownSelect/DropdownSelect.js.map +1 -1
- package/dist/components/DynamicForm/DynamicForm.js.map +1 -1
- package/dist/components/DynamicForm/DynamicFormModal.js.map +1 -1
- package/dist/components/Ecosystem/EcosystemCard.js.map +1 -1
- package/dist/components/Ecosystem/EcosystemLayout.js.map +1 -1
- package/dist/components/Ecosystem/EcosystemSkeleton.js.map +1 -1
- package/dist/components/Ecosystem/TableQueryEcosystem.js.map +1 -1
- package/dist/components/EntityAclEditor/CreateOrDeleteLocalSharingSettingsButton.js.map +1 -1
- package/dist/components/EntityAclEditor/EntityAclEditor.js.map +1 -1
- package/dist/components/EntityAclEditor/EntityAclEditorModal.js.map +1 -1
- package/dist/components/EntityAclEditor/InheritanceMessage.js.map +1 -1
- package/dist/components/EntityAclEditor/OpenData.js.map +1 -1
- package/dist/components/EntityAclEditor/useNotifyNewACLUsers.js.map +1 -1
- package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js +68 -70
- package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js.map +1 -1
- package/dist/components/EntityCitation/EntityCitation.js.map +1 -1
- package/dist/components/EntityCitation/EntityCitationUtils.js.map +1 -1
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js +32 -35
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
- package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js.map +1 -1
- package/dist/components/EntityFinder/Breadcrumbs.js.map +1 -1
- package/dist/components/EntityFinder/EntityFinder.js +134 -136
- package/dist/components/EntityFinder/EntityFinder.js.map +1 -1
- package/dist/components/EntityFinder/EntityFinderModal.js.map +1 -1
- package/dist/components/EntityFinder/EntityIdTextField.js.map +1 -1
- package/dist/components/EntityFinder/VersionSelectionType.js.map +1 -1
- package/dist/components/EntityFinder/details/EntityDetailsList.js +20 -20
- package/dist/components/EntityFinder/details/EntityDetailsList.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/configurations/ReferenceDetails.js.map +1 -1
- package/dist/components/EntityFinder/details/configurations/SearchDetails.js.map +1 -1
- package/dist/components/EntityFinder/details/view/DetailsView.js +67 -67
- package/dist/components/EntityFinder/details/view/DetailsView.js.map +1 -1
- package/dist/components/EntityFinder/details/view/VersionColumnHeader.js +1 -1
- package/dist/components/EntityFinder/details/view/VersionColumnHeader.js.map +1 -1
- package/dist/components/EntityFinder/details/view/table/AddToDownloadListCell.js.map +1 -1
- package/dist/components/EntityFinder/details/view/table/CreatedOnCell.js.map +1 -1
- package/dist/components/EntityFinder/details/view/table/DateCell.js.map +1 -1
- package/dist/components/EntityFinder/details/view/table/EntityBadgeIconsCell.js.map +1 -1
- package/dist/components/EntityFinder/details/view/table/EntityFinderCheckboxCell.js.map +1 -1
- package/dist/components/EntityFinder/details/view/table/EntityFinderVersionCell.js.map +1 -1
- package/dist/components/EntityFinder/details/view/table/EntityNameCell.js.map +1 -1
- package/dist/components/EntityFinder/details/view/table/EntityTypeCell.js.map +1 -1
- package/dist/components/EntityFinder/details/view/table/FileEntityDirectDownloadCell.js.map +1 -1
- package/dist/components/EntityFinder/details/view/table/FileEntityMD5Cell.js.map +1 -1
- package/dist/components/EntityFinder/details/view/table/FileEntitySizeCell.js.map +1 -1
- package/dist/components/EntityFinder/details/view/table/ModifiedByCell.js.map +1 -1
- package/dist/components/EntityFinder/details/view/table/ModifiedOnCell.js.map +1 -1
- package/dist/components/EntityFinder/details/view/table/ParentProjectCell.js.map +1 -1
- package/dist/components/EntityFinder/details/view/table/UserBadgeCell.js.map +1 -1
- package/dist/components/EntityFinder/tree/EntityTree.js +80 -80
- package/dist/components/EntityFinder/tree/EntityTree.js.map +1 -1
- package/dist/components/EntityFinder/tree/VirtualizedTree.js +31 -31
- 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/DebouncedInput.js.map +1 -1
- package/dist/components/EntityHeaderTable/EntityHeaderTable.js.map +1 -1
- package/dist/components/EntityHeaderTable/EntityHeaderTableCellRenderers.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/EntityIcon.js.map +1 -1
- package/dist/components/EntityLink.js.map +1 -1
- package/dist/components/EntitySubjectsSelector/EntitySubjectsSelector.js.map +1 -1
- package/dist/components/EntityTreeTable/EntityTreeTable.js.map +1 -1
- package/dist/components/EntityTreeTable/components/AutoLoadMore.js.map +1 -1
- package/dist/components/EntityTreeTable/components/ColumnHeaders.js.map +1 -1
- package/dist/components/EntityTreeTable/components/EntityBadgeIconsCell.js.map +1 -1
- package/dist/components/EntityTreeTable/components/EntityNameCell.js.map +1 -1
- package/dist/components/EntityTreeTable/components/EntityTreeTableContext.js.map +1 -1
- package/dist/components/EntityTreeTable/components/EntityTreeTableRow.js.map +1 -1
- package/dist/components/EntityTreeTable/components/EntityTreeTableView.js.map +1 -1
- package/dist/components/EntityTreeTable/components/IdCell.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/EntityUpload/EntityUploadModal.js +29 -31
- package/dist/components/EntityUpload/EntityUploadModal.js.map +1 -1
- package/dist/components/EntityUpload/EntityUploadPromptDialog.js.map +1 -1
- package/dist/components/EntityUpload/ExternalObjectStoreCredentialsForm.js.map +1 -1
- package/dist/components/EntityUpload/FileUploadProgress.js.map +1 -1
- package/dist/components/EntityUpload/LinkToURL.js.map +1 -1
- package/dist/components/EntityUpload/ProjectStorageLimitAlert.js.map +1 -1
- package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js.map +1 -1
- package/dist/components/EntityViewScopeEditor/EntityViewScopeEditor.js.map +1 -1
- package/dist/components/EntityViewScopeEditor/EntityViewScopeEditorModal.js.map +1 -1
- package/dist/components/Evaluation/CreatedOnByUserDiv.js.map +1 -1
- package/dist/components/Evaluation/DeleteEvaluationQueueConfirmationDialog.js.map +1 -1
- package/dist/components/Evaluation/EvaluationCard.js.map +1 -1
- package/dist/components/Evaluation/EvaluationEditor.js.map +1 -1
- package/dist/components/Evaluation/EvaluationEditorPage.js.map +1 -1
- package/dist/components/Evaluation/EvaluationRoundEditor.js.map +1 -1
- package/dist/components/Evaluation/EvaluationRoundEditorDropdown.js.map +1 -1
- package/dist/components/Evaluation/EvaluationRoundEditorList.js.map +1 -1
- package/dist/components/Evaluation/input_models/models.js.map +1 -1
- package/dist/components/Evaluation/round_limits/EvaluationRoundLimitOptions.js.map +1 -1
- package/dist/components/Evaluation/round_limits/EvaluationRoundLimitOptionsList.js.map +1 -1
- package/dist/components/EvaluationFinder/EvaluationFinder.js.map +1 -1
- package/dist/components/ExperimentalMode/ExperimentalMode.d.ts.map +1 -1
- package/dist/components/ExperimentalMode/ExperimentalMode.js +24 -30
- 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/FacetPlotsCardGrid.js.map +1 -1
- package/dist/components/FeaturedDataTabs/FeaturedDataPlots.js.map +1 -1
- package/dist/components/FeaturedDataTabs/FeaturedDataTabs.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 +16 -18
- package/dist/components/FeaturedResearch/FeaturedResearch.js.map +1 -1
- package/dist/components/FeaturedToolsList/FeaturedToolCard.js.map +1 -1
- package/dist/components/FeaturedToolsList/FeaturedToolsList.js.map +1 -1
- package/dist/components/FilePreview/EntityPreview.js.map +1 -1
- package/dist/components/FilePreview/FileEntityPreview.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/PdfPreview.js.map +1 -1
- package/dist/components/FilePreview/PreviewRendererType.js.map +1 -1
- package/dist/components/FilePreview/PreviewUtils.js.map +1 -1
- package/dist/components/FileUpload/FileUpload.js.map +1 -1
- package/dist/components/Forum/DiscussionReply.js.map +1 -1
- package/dist/components/Forum/DiscussionSearchResult.js.map +1 -1
- package/dist/components/Forum/DiscussionThread.js.map +1 -1
- package/dist/components/Forum/ForumPage.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/Forum/SubscribersModal.js.map +1 -1
- package/dist/components/ForumSearch/ForumSearch.js.map +1 -1
- package/dist/components/FullTextSearch/FullTextSearch.js.map +1 -1
- package/dist/components/FullTextSearch/FullTextSearchUtils.js.map +1 -1
- package/dist/components/FullWidthAlert/FullWidthAlert.js.map +1 -1
- package/dist/components/GenericCard/BioregistryRules.js.map +1 -1
- package/dist/components/GenericCard/CardUtils.js.map +1 -1
- package/dist/components/GenericCard/CollapsibleDescription.js.map +1 -1
- package/dist/components/GenericCard/CroissantButton/CroissantButton.js.map +1 -1
- package/dist/components/GenericCard/GenericCard.js.map +1 -1
- package/dist/components/GenericCard/GenericCardActionButton.js.map +1 -1
- package/dist/components/GenericCard/GenericCardIcon.js.map +1 -1
- package/dist/components/GenericCard/GenericCardTitle.js.map +1 -1
- package/dist/components/GenericCard/LabelMaybeWithIcon.js.map +1 -1
- package/dist/components/GenericCard/Linkify.js.map +1 -1
- package/dist/components/GenericCard/PortalDOI/PortalDOI.js.map +1 -1
- package/dist/components/GenericCard/PortalDOI/PortalDOIUtils.js.map +1 -1
- package/dist/components/GenericCard/SynapseCardLabel.js +1 -1
- package/dist/components/GenericCard/SynapseCardLabel.js.map +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
- package/dist/components/GenericCard/useResolvedSynapseEntity.js.map +1 -1
- package/dist/components/Goals/Goals.Desktop.js.map +1 -1
- package/dist/components/Goals/Goals.Mobile.js.map +1 -1
- package/dist/components/Goals/Goals.js +25 -27
- package/dist/components/Goals/Goals.js.map +1 -1
- package/dist/components/GoalsV2/GoalsV2.Desktop.js.map +1 -1
- package/dist/components/GoalsV2/GoalsV2.Mobile.js.map +1 -1
- package/dist/components/GoalsV2/GoalsV2.js +14 -16
- package/dist/components/GoalsV2/GoalsV2.js.map +1 -1
- package/dist/components/GoalsV3/GoalsV3.Desktop.js.map +1 -1
- package/dist/components/GoalsV3/GoalsV3.Mobile.js.map +1 -1
- package/dist/components/GoalsV3/GoalsV3.js +14 -16
- package/dist/components/GoalsV3/GoalsV3.js.map +1 -1
- package/dist/components/GoogleAnalytics/GoogleAnalytics.js.map +1 -1
- package/dist/components/GoogleMap/GoogleMap.js.map +1 -1
- package/dist/components/GoogleMap/SynapseUserMarker.js.map +1 -1
- package/dist/components/HasAccess/AccessIcon.js +10 -10
- package/dist/components/HasAccess/AccessIcon.js.map +1 -1
- package/dist/components/HasAccess/HasAccessV2.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.js.map +1 -1
- package/dist/components/HelpPopover/HelpPopover.js.map +1 -1
- package/dist/components/HexGrid/HexGrid.js.map +1 -1
- package/dist/components/IDUReport/IDUReport.js.map +1 -1
- package/dist/components/IDUReport/IDUReportSubmissionInfo.js.map +1 -1
- package/dist/components/Icon/Icon.js.map +1 -1
- package/dist/components/IconList.js.map +1 -1
- package/dist/components/IconSvg/IconSvg.js.map +1 -1
- package/dist/components/IconSvgButton.js.map +1 -1
- package/dist/components/ImageCardGridWithLinks/ImageCardGridWithLinks.js +7 -9
- package/dist/components/ImageCardGridWithLinks/ImageCardGridWithLinks.js.map +1 -1
- package/dist/components/ImageFromSynapseTable.js.map +1 -1
- package/dist/components/InteractiveCopyIdsIcon.js.map +1 -1
- package/dist/components/JSONArrayEditor/JSONArrayEditor.js.map +1 -1
- package/dist/components/JSONArrayEditor/JSONArrayEditorModal.js.map +1 -1
- package/dist/components/JSONArrayEditor/useParseCsv.js.map +1 -1
- package/dist/components/JsonLdScript.js.map +1 -1
- package/dist/components/JsonSchemaForm/JsonSchemaForm.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/ArrayFieldDescriptionTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/ArrayFieldItemButtonTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/ArrayFieldItemTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/ArrayFieldTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/ArrayFieldTitleTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/ButtonTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/DescriptionFieldTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/ErrorListTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/FieldDescriptionTable.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/FieldErrorTemplate.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/JsonSchemaForm/widgets/BooleanWidget.js.map +1 -1
- package/dist/components/JsonSchemaForm/widgets/DateTimeWidget.js.map +1 -1
- package/dist/components/JsonSchemaForm/widgets/SelectWidget.js.map +1 -1
- package/dist/components/LoadingScreen/LoadingScreen.js.map +1 -1
- package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.js.map +1 -1
- package/dist/components/Markdown/GovernanceMarkdownGithub.js.map +1 -1
- package/dist/components/Markdown/MarkdownCollapse.js.map +1 -1
- package/dist/components/Markdown/MarkdownEditor.js.map +1 -1
- package/dist/components/Markdown/MarkdownGithub.js.map +1 -1
- package/dist/components/Markdown/MarkdownPopover.js.map +1 -1
- package/dist/components/Markdown/MarkdownSynapse.d.ts.map +1 -1
- package/dist/components/Markdown/MarkdownSynapse.js +75 -106
- package/dist/components/Markdown/MarkdownSynapse.js.map +1 -1
- package/dist/components/Markdown/MarkdownUtils.d.ts +14 -4
- package/dist/components/Markdown/MarkdownUtils.d.ts.map +1 -1
- package/dist/components/Markdown/MarkdownUtils.js +38 -37
- package/dist/components/Markdown/MarkdownUtils.js.map +1 -1
- package/dist/components/Markdown/MarkdownWidget.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/Bookmarks.js.map +1 -1
- package/dist/components/Markdown/widget/MarkdownButton.js.map +1 -1
- package/dist/components/Markdown/widget/MarkdownEntityPreview.js.map +1 -1
- package/dist/components/Markdown/widget/MarkdownIDUReport.js.map +1 -1
- package/dist/components/Markdown/widget/MarkdownProvenanceGraph.js.map +1 -1
- package/dist/components/Markdown/widget/MarkdownSynapseImage.js.map +1 -1
- package/dist/components/Markdown/widget/MarkdownSynapsePlot.js.map +1 -1
- package/dist/components/Markdown/widget/MarkdownSynapseTable.js.map +1 -1
- package/dist/components/Markdown/widget/MarkdownTableOfContents.js.map +1 -1
- package/dist/components/Markdown/widget/MarkdownUserOrTeamBadge.js.map +1 -1
- package/dist/components/Markdown/widget/MarkdownVideo.js.map +1 -1
- package/dist/components/MissingQueryResultsWarning/MissingQueryResultsWarning.js.map +1 -1
- package/dist/components/ModalDownload/ModalDownload.FormSchema.js.map +1 -1
- package/dist/components/ModalDownload/ModalDownload.js.map +1 -1
- package/dist/components/MuiContainer.js.map +1 -1
- package/dist/components/OAuthClientAclEditor/OAuthAclEditorModal.js.map +1 -1
- package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.js.map +1 -1
- package/dist/components/OAuthClientManagement/CreateOAuthClient.js.map +1 -1
- package/dist/components/OAuthClientManagement/OAuthManagement.js.map +1 -1
- package/dist/components/OrientationBanner/OrientationBanner.js.map +1 -1
- package/dist/components/PageProgress/PageProgress.js.map +1 -1
- package/dist/components/Plot/BarPlot.js.map +1 -1
- package/dist/components/Plot/DotPlot.js.map +1 -1
- package/dist/components/Plot/Plot.d.ts +12 -1
- package/dist/components/Plot/Plot.d.ts.map +1 -1
- package/dist/components/Plot/Plot.js +5 -1
- package/dist/components/Plot/Plot.js.map +1 -1
- package/dist/components/Plot/PlotPanelHeader.js.map +1 -1
- package/dist/components/Plot/SynapsePlot.js.map +1 -1
- package/dist/components/Plot/SynapseSankeyPlot.d.ts +12 -0
- package/dist/components/Plot/SynapseSankeyPlot.d.ts.map +1 -0
- package/dist/components/Plot/SynapseSankeyPlot.js +54 -0
- package/dist/components/Plot/SynapseSankeyPlot.js.map +1 -0
- package/dist/components/Plot/ThemesPlot.js.map +1 -1
- package/dist/components/Plot/UpsetPlot.js.map +1 -1
- package/dist/components/Plot/index.d.ts +3 -1
- package/dist/components/Plot/index.d.ts.map +1 -1
- package/dist/components/Plot/index.js +2 -1
- package/dist/components/Plot/safe-react-plotly-factory.js.map +1 -1
- package/dist/components/PortalAclEditor/PortalAclEditor.js.map +1 -1
- package/dist/components/PortalAclEditor/PortalAclEditorModal.js.map +1 -1
- package/dist/components/PortalFeatureHighlights/PortalFeatureHighlights.js.map +1 -1
- package/dist/components/PortalFeaturedPartners/PortalFeaturedPartners.js +4 -6
- package/dist/components/PortalFeaturedPartners/PortalFeaturedPartners.js.map +1 -1
- package/dist/components/PortalHomePageHeader/PortalHomePageHeader.js.map +1 -1
- package/dist/components/PortalList/CreatePortalModal.js.map +1 -1
- package/dist/components/PortalList/PortalCard.js.map +1 -1
- package/dist/components/PortalList/PortalList.js.map +1 -1
- package/dist/components/PortalSectionHeader/PortalSectionHeader.js.map +1 -1
- package/dist/components/ProgrammaticInstructionsModal/ProgrammaticInstructionsModal.js +69 -69
- package/dist/components/ProgrammaticInstructionsModal/ProgrammaticInstructionsModal.js.map +1 -1
- package/dist/components/ProgrammaticTableDownload/ProgrammaticTableDownload.js.map +1 -1
- package/dist/components/Programs/Programs.Desktop.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/ProjectStorage/ProjectDataAvailability.js.map +1 -1
- package/dist/components/ProvenanceGraph/ActivityNodeLabel.js.map +1 -1
- package/dist/components/ProvenanceGraph/EntityNodeLabel.js.map +1 -1
- package/dist/components/ProvenanceGraph/EntityPlaceholderNodeLabel.js.map +1 -1
- package/dist/components/ProvenanceGraph/ExpandGraphNodeLabel.js.map +1 -1
- package/dist/components/ProvenanceGraph/ExternalGraphNodeLabel.js.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceEntityIcon.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 +13 -13
- package/dist/components/ProvenanceGraph/ProvenanceUtils.js.map +1 -1
- package/dist/components/ProvenanceGraph/UndefinedNodeLabel.js.map +1 -1
- package/dist/components/QueryContext/QueryContext.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/QuerySortSelector.js.map +1 -1
- package/dist/components/QueryVisualizationWrapper/NoContentPlaceholder.js.map +1 -1
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationContext.js.map +1 -1
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts.map +1 -1
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +67 -65
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
- package/dist/components/QueryWrapper/QueryWrapper.js +27 -27
- package/dist/components/QueryWrapper/QueryWrapper.js.map +1 -1
- package/dist/components/QueryWrapper/QueryWrapperLoadingScreen.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/ViewMoreQueryResultsButton.js.map +1 -1
- package/dist/components/QueryWrapper/generateEncodedPathAndQueryForSelectedFacetURL.js.map +1 -1
- package/dist/components/QueryWrapper/useComputeRowSelectionPrimaryKey.js.map +1 -1
- package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.js.map +1 -1
- package/dist/components/QueryWrapper/useGetQueryMetadata.js.map +1 -1
- package/dist/components/QueryWrapper/useHasFacetedSelectColumn.js.map +1 -1
- package/dist/components/QueryWrapper/useOnQueryDataChange.js.map +1 -1
- package/dist/components/QueryWrapperErrorBoundary.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/LastUpdatedOn.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +1 -0
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperSynapsePlot.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/RowSetView.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/UseRowSet.js.map +1 -1
- package/dist/components/RORInstitutionField/RORInstitutionField.js.map +1 -1
- package/dist/components/RecentPublicationsGrid/RecentPublicationsGrid.js +6 -8
- package/dist/components/RecentPublicationsGrid/RecentPublicationsGrid.js.map +1 -1
- package/dist/components/RegisterPageLogoutPrompt/RegisterPageLogoutPrompt.js.map +1 -1
- package/dist/components/ReleaseCard/ReleaseCard.js.map +1 -1
- package/dist/components/ReleaseCard/ReleaseCardLarge.js.map +1 -1
- package/dist/components/ReleaseCard/ReleaseCardMedium.js.map +1 -1
- package/dist/components/ReleaseCard/ReleaseCardUtils.js.map +1 -1
- package/dist/components/RenderIfInView/RenderIfInView.js.map +1 -1
- package/dist/components/ResizableContainer/ResizableContainer.js.map +1 -1
- package/dist/components/ResizableContainer/hooks/useResizable.js.map +1 -1
- package/dist/components/Resources/Resources.Desktop.js.map +1 -1
- package/dist/components/Resources/Resources.Mobile.js.map +1 -1
- package/dist/components/Resources/Resources.js +8 -11
- package/dist/components/Resources/Resources.js.map +1 -1
- package/dist/components/RowDataTable/RowDataTable.js.map +1 -1
- package/dist/components/RowDataTable/RowDataTableWithQuery.js.map +1 -1
- package/dist/components/RssFeedCards/RssFeedCards.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/SchemaDrivenAnnotationEditor/SchemaDrivenAnnotationEditor.js.map +1 -1
- package/dist/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField.js.map +1 -1
- package/dist/components/SchemaDrivenAnnotationEditor/field/SynapseAnnotationsRJSFObjectField.js.map +1 -1
- package/dist/components/SchemaDrivenAnnotationEditor/template/AdditionalPropertyContext.js.map +1 -1
- package/dist/components/SchemaDrivenAnnotationEditor/template/ObjectFieldTemplate.js.map +1 -1
- package/dist/components/SchemaDrivenAnnotationEditor/template/SynapseAnnotationsWrapIfAdditionalTemplate.js.map +1 -1
- package/dist/components/SchemaDrivenAnnotationEditor/widget/TextWidget.js.map +1 -1
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -1
- package/dist/components/SearchQueryWrapper/SearchQueryWrapper.js.map +1 -1
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts +1 -1
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts.map +1 -1
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js +1 -0
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js.map +1 -1
- package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js.map +1 -1
- package/dist/components/SetBasicAccessRequirementFields/AccessRequirementTextInstructions.js.map +1 -1
- package/dist/components/SetBasicAccessRequirementFields/AccessRequirementWikiInstructions.js.map +1 -1
- package/dist/components/SetBasicAccessRequirementFields/AccessorRequirements.js.map +1 -1
- package/dist/components/SetBasicAccessRequirementFields/GovernanceUtils.js.map +1 -1
- package/dist/components/SetBasicAccessRequirementFields/SetBasicAccessRequirementFields.js.map +1 -1
- package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js.map +1 -1
- package/dist/components/ShareThisPage/ShareThisPage.js.map +1 -1
- package/dist/components/ShowMore/ShowMore.js.map +1 -1
- package/dist/components/SignInButton.js.map +1 -1
- package/dist/components/SignInRequiredModal/SignInRequiredModal.js.map +1 -1
- package/dist/components/Skeleton/SkeletonButton.js.map +1 -1
- package/dist/components/Skeleton/SkeletonInlineBlock.js.map +1 -1
- package/dist/components/Skeleton/SkeletonParagraph.js.map +1 -1
- package/dist/components/Skeleton/SkeletonTable.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/SmartLink/useSmartLink.js.map +1 -1
- package/dist/components/SourceAppImage.js.map +1 -1
- package/dist/components/SpinnerButton/SpinnerButton.js.map +1 -1
- package/dist/components/SqlDefinedTableEditor/SqlDefinedTableEditor.js.map +1 -1
- package/dist/components/SqlDefinedTableEditor/SqlDefinedTableEditorModal.js.map +1 -1
- package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.d.ts +1 -1
- package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.d.ts.map +1 -1
- package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.js.map +1 -1
- package/dist/components/StatisticsPlot.js.map +1 -1
- package/dist/components/StepperDialog/StepperDialog.js.map +1 -1
- package/dist/components/StorybookComponentWrapper.js.map +1 -1
- package/dist/components/SubmissionViewScopeEditor/SubmissionViewScopeEditor.js.map +1 -1
- package/dist/components/SubmissionViewScopeEditor/SubmissionViewScopeEditorModal.js.map +1 -1
- package/dist/components/SubscriptionPage/ForumTopic.js.map +1 -1
- package/dist/components/SubscriptionPage/SubscriptionItem.js.map +1 -1
- package/dist/components/SubscriptionPage/SubscriptionPage.js.map +1 -1
- package/dist/components/SubscriptionPage/ThreadTopic.js.map +1 -1
- package/dist/components/SubscriptionPage/Topic.js.map +1 -1
- package/dist/components/SubsectionRowRenderer/SubsectionRowRenderer.js.map +1 -1
- package/dist/components/SustainabilityScorecard/Dial.js.map +1 -1
- package/dist/components/SustainabilityScorecard/DialLayout.js.map +1 -1
- package/dist/components/SustainabilityScorecard/SustainabilityScorecard.js.map +1 -1
- package/dist/components/SustainabilityScorecard/SustainabilityScorecardSummary.js.map +1 -1
- package/dist/components/SustainabilityScorecard/SustainabilityScorecardUtils.js.map +1 -1
- package/dist/components/SynapseChat/AccessLevelMenu.js.map +1 -1
- package/dist/components/SynapseChat/GridAgentChat.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChat.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChatDialog.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/SynapsePortalChatDialog.js.map +1 -1
- package/dist/components/SynapseChat/extractMessageFromTraceEvent.js.map +1 -1
- package/dist/components/SynapseChat/useChatState.js.map +1 -1
- package/dist/components/SynapseFooter/SynapseFooter.js.map +1 -1
- package/dist/components/SynapseFooter/SynapseLinksColumn.js.map +1 -1
- package/dist/components/SynapseForm/DataDebug.js.map +1 -1
- package/dist/components/SynapseForm/Header.js.map +1 -1
- package/dist/components/SynapseForm/NavButtons.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.map +1 -1
- package/dist/components/SynapseForm/SynapseFormCheckboxWidget.js.map +1 -1
- package/dist/components/SynapseForm/SynapseFormCheckboxesWidget.js.map +1 -1
- package/dist/components/SynapseForm/SynapseFormRadioWidget.js.map +1 -1
- package/dist/components/SynapseForm/SynapseFormSubmissionGrid.js.map +1 -1
- package/dist/components/SynapseForm/SynapseFormUtils.js.map +1 -1
- package/dist/components/SynapseForm/SynapseFormWrapper.js.map +1 -1
- package/dist/components/SynapseForm/WarningDialog.js.map +1 -1
- package/dist/components/SynapseForm/types.js.map +1 -1
- package/dist/components/SynapseForm/useGetFormPropsFromSearchParams.js.map +1 -1
- package/dist/components/SynapseHomepageV2/FloatingBlobsBackground.js.map +1 -1
- package/dist/components/SynapseHomepageV2/HomepageStyles.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseByTheNumbers.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/SynapseFeaturedDatasetItem.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseFeaturedDatasets.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseFeatures.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.js +18 -21
- package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageNavBar.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageSearch.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageV2.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHotdrops.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHotdropsItem.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseInAction.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseInActionItem.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapsePartners.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapsePlan.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapsePlanContent.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapsePlans.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapsePlansPage.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseSearchChips.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseTrendingProjects.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseTrendingProjectsItem.js.map +1 -1
- package/dist/components/SynapseHomepageV2/WordPressNews.js.map +1 -1
- package/dist/components/SynapseHomepageV2/WordPressNewsItem.js.map +1 -1
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js +78 -78
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js.map +1 -1
- package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/HasAccessChip.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/HighlightedTypography.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/SearchPagePortalBanners.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SynapseSearchPage.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SynapseSearchPageResults.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SynapseSearchPageRouter.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SynapseSearchResultsCard.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/chipStyles.js.map +1 -1
- package/dist/components/SynapseTable/CustomControls/CustomControlButton.js.map +1 -1
- package/dist/components/SynapseTable/CustomControls/CustomControlPanel.js.map +1 -1
- package/dist/components/SynapseTable/CustomControls/CustomControls.js.map +1 -1
- package/dist/components/SynapseTable/EntityIDColumnCopyIcon.js.map +1 -1
- package/dist/components/SynapseTable/ExpandCollapseButton.js.map +1 -1
- package/dist/components/SynapseTable/ExpandableTableDataCell.js.map +1 -1
- package/dist/components/SynapseTable/NoContentAvailable.js.map +1 -1
- package/dist/components/SynapseTable/NoContentPlaceholderType.js.map +1 -1
- package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js +4 -4
- package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js.map +1 -1
- package/dist/components/SynapseTable/RowSelection/RowSelectionUI.js.map +1 -1
- package/dist/components/SynapseTable/SearchResultsNotFound.js.map +1 -1
- package/dist/components/SynapseTable/SearchV2.js.map +1 -1
- package/dist/components/SynapseTable/SqlEditor.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTable.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableCell/EntityIdList.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableCell/EvaluationIdRenderer.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableCell/JSON/ComplexJSONRenderer.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableCell/JSON/JSONArrayRenderer.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableCell/JSON/JSONObjectRenderer.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableCell/JSON/JSONPrimitiveRenderer.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableCell/JSON/JSONRendererUtils.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableCell/JSON/JSONTableCellRenderer.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableCell/SynapseTableCell.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableCell/UserIdList.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableConstants.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableContext.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableRenderers.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableUtils.js.map +1 -1
- package/dist/components/SynapseTable/TableIsEmpty.js.map +1 -1
- package/dist/components/SynapseTable/TablePagination.js.map +1 -1
- package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js.map +1 -1
- package/dist/components/SynapseTable/TopLevelControls/TopLevelControlsUtils.js.map +1 -1
- package/dist/components/SynapseTable/datasets/DatasetEditorCheckboxCell.js.map +1 -1
- package/dist/components/SynapseTable/datasets/DatasetEditorUtils.js.map +1 -1
- package/dist/components/SynapseTable/datasets/DatasetEditorVersionCell.js.map +1 -1
- package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js +131 -133
- package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js.map +1 -1
- package/dist/components/SynapseTable/datasets/EntityFetchErrorCell.js.map +1 -1
- package/dist/components/SynapseTable/export/ADDiscoveryPortalInstructions.js.map +1 -1
- package/dist/components/SynapseTable/export/ExportToAnalysisPlatformDialog.js +48 -51
- package/dist/components/SynapseTable/export/ExportToAnalysisPlatformDialog.js.map +1 -1
- package/dist/components/SynapseTable/export/ExternalAnalysisPlatformInstructions.js.map +1 -1
- package/dist/components/SynapseTable/export/ExternalAnalysisPlatformsConstants.js.map +1 -1
- package/dist/components/SynapseTable/export/ExternalPlatformActionsRequiredPrecheck.js.map +1 -1
- package/dist/components/SynapseTable/export/ExternalPlatformDisclaimer.js.map +1 -1
- package/dist/components/SynapseTable/table-top/ColumnSelection.js.map +1 -1
- package/dist/components/SynapseTable/table-top/DownloadLoginModal.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/SynapseTable/useTableSort.js.map +1 -1
- package/dist/components/SystemUseNotification/SystemUseNotification.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js +12 -12
- package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelFormFields/DefaultValueField.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelFormFields/FieldWithRecommendedMinimum.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelFormFields/MultiValueField.js +4 -4
- package/dist/components/TableColumnSchemaEditor/ColumnModelFormFields/MultiValueField.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ImportTableColumnsButton.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditor.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorTestUtils.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js +32 -32
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaFormActions.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaFormReducer.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/BooleanSchema.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/TableColumnSchemaEditor/Validators/DefaultValueValidator.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/DoubleSchema.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/EntityIdSchema.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/EnumValuesValidator.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/IntegerSchema.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/OptionalStringSchema.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/getZodSchemaForColumnType.js.map +1 -1
- package/dist/components/TableFeedCards/TableFeedCards.js.map +1 -1
- package/dist/components/TanStackTable/ColumnHeader.js.map +1 -1
- package/dist/components/TanStackTable/ColumnHeaderEnumFilter.js.map +1 -1
- package/dist/components/TanStackTable/StyledTanStackTable.js.map +1 -1
- package/dist/components/TanStackTable/StyledVirtualTanStackTable.js.map +1 -1
- package/dist/components/TanStackTable/TableBody.js.map +1 -1
- package/dist/components/TanStackTable/TableCellRenderer.js.map +1 -1
- package/dist/components/TanStackTable/TanStackTableUtils.js.map +1 -1
- package/dist/components/TeamBadge.js.map +1 -1
- package/dist/components/TeamSubjectsSelector/TeamBadgeOrError.js.map +1 -1
- package/dist/components/TeamSubjectsSelector/TeamSubjectsSelector.js.map +1 -1
- package/dist/components/TemplateComponent.js.map +1 -1
- package/dist/components/TemporaryBanner/TemporaryBanner.js.map +1 -1
- package/dist/components/TermsAndConditions/TermsAndConditions.js.map +1 -1
- package/dist/components/TermsAndConditions/TermsAndConditionsItem.js.map +1 -1
- package/dist/components/TextField/TextField.js.map +1 -1
- package/dist/components/TextField/TextFieldWithWordLimit.js.map +1 -1
- package/dist/components/TextToComponentCollapse.js.map +1 -1
- package/dist/components/ThemeGallery/ThemeGallery.js.map +1 -1
- package/dist/components/TimelinePlot/TimelineLegendItem.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/TimelinePlot/phasesQueryResponseData.js.map +1 -1
- package/dist/components/ToastMessage/ToastMessage.js.map +1 -1
- package/dist/components/TotalQueryResults.js.map +1 -1
- package/dist/components/UserCard/Avatar.js.map +1 -1
- package/dist/components/UserCard/UserBadge.js.map +1 -1
- package/dist/components/UserCard/UserCard.js.map +1 -1
- package/dist/components/UserCard/UserCardContextMenu.js.map +1 -1
- package/dist/components/UserCard/UserCardLarge.js.map +1 -1
- package/dist/components/UserCard/UserCardMedium.js.map +1 -1
- package/dist/components/UserCardList/UserCardList.js.map +1 -1
- package/dist/components/UserCardList/UserCardListGroups/UserCardListGroups.Desktop.js.map +1 -1
- package/dist/components/UserCardList/UserCardListGroups/UserCardListGroups.Mobile.js.map +1 -1
- package/dist/components/UserCardList/UserCardListGroups/UserCardListGroups.js.map +1 -1
- package/dist/components/UserCardList/UserCardListRotate.js.map +1 -1
- package/dist/components/UserOrTeamBadge/UserOrTeamBadge.js.map +1 -1
- package/dist/components/UserOrTeamBadge/useUserOrTeam.js.map +1 -1
- package/dist/components/UserProfileLinks/UserChallenges.js.map +1 -1
- package/dist/components/UserProfileLinks/UserProfileLinks.js.map +1 -1
- package/dist/components/UserProfileLinks/UserProjects.js.map +1 -1
- package/dist/components/UserProfileLinks/UserTeams.js.map +1 -1
- package/dist/components/UserSearchBox/UserSearchBox.js.map +1 -1
- package/dist/components/Webhook/CreateWebhookModal.js.map +1 -1
- package/dist/components/Webhook/WebhookDashboard.js.map +1 -1
- package/dist/components/Webhook/WebhookVerificationDialog.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/WizardChoiceButton/WizardChoiceButton.js.map +1 -1
- package/dist/components/WizardChoiceButton/WizardChoiceButtonDescription.js.map +1 -1
- package/dist/components/WizardChoiceButton/WizardChoiceButtonGroup.js.map +1 -1
- package/dist/components/WordPress/WordPressLatestPostChip.js.map +1 -1
- package/dist/components/WordPress/useWordPressCategories.js.map +1 -1
- package/dist/components/WordPress/useWordPressPosts.js.map +1 -1
- package/dist/components/dataaccess/AccessApprovalsTable.js.map +1 -1
- package/dist/components/dataaccess/AccessHistoryDashboard.js.map +1 -1
- package/dist/components/dataaccess/AccessRequestSubmissionTable.js.map +1 -1
- package/dist/components/dataaccess/AccessRequirementDashboard.js.map +1 -1
- package/dist/components/dataaccess/AccessRequirementSearchBox/AccessRequirementSearchBox.js.map +1 -1
- package/dist/components/dataaccess/AccessRequirementTable.js.map +1 -1
- package/dist/components/dataaccess/AccessSubmissionDashboard.js.map +1 -1
- package/dist/components/dataaccess/RejectDataAccessRequestModal.js.map +1 -1
- package/dist/components/dataaccess/RejectProfileValidationRequestModal.js.map +1 -1
- package/dist/components/dataaccess/ReviewerDashboard.js.map +1 -1
- package/dist/components/dataaccess/SubmissionPage/ApproveSubmissionConfirmationModal.js.map +1 -1
- package/dist/components/dataaccess/SubmissionPage/CancelDataAccessRequestConfirmationModal.js.map +1 -1
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
- package/dist/components/dataaccess/UseAccessRequirementTable.js.map +1 -1
- package/dist/components/dataaccess/UserAccessRequestHistory/SubmissionSortStateTranslator.js.map +1 -1
- package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPage.js.map +1 -1
- package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryPlace.js.map +1 -1
- package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryTable.js.map +1 -1
- package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
- package/dist/components/doi/DoiFormSchemas.js.map +1 -1
- package/dist/components/doi/PrivateEntityDoiWarning.js.map +1 -1
- package/dist/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js.map +1 -1
- package/dist/components/download_list/DownloadConfirmationUI.js +30 -32
- package/dist/components/download_list/DownloadConfirmationUI.js.map +1 -1
- package/dist/components/download_list/DownloadConfirmationUtils.js.map +1 -1
- package/dist/components/download_list/DownloadDetails.js.map +1 -1
- package/dist/components/download_list/index.js.map +1 -1
- package/dist/components/entity/metadata/AnnotationsTable.js.map +1 -1
- package/dist/components/entity/metadata/EntityAnnotationKey.js.map +1 -1
- package/dist/components/entity/metadata/EntityModal.js.map +1 -1
- package/dist/components/entity/metadata/MetadataTable.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/breadcrumbs/EntityPageBreadcrumbs.js.map +1 -1
- package/dist/components/entity/page/title_bar/CitationsDialog.js.map +1 -1
- package/dist/components/entity/page/title_bar/EntityPageTitleBar.js.map +1 -1
- package/dist/components/entity/page/title_bar/EntityTitleBarVersionInfo.js.map +1 -1
- package/dist/components/entity/page/title_bar/TitleBarProperties.js.map +1 -1
- package/dist/components/entity/page/title_bar/useDataCiteUsage.js.map +1 -1
- package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.js.map +1 -1
- package/dist/components/entity/page/title_bar/useGetMentions.js.map +1 -1
- package/dist/components/error/ErrorBanner.js.map +1 -1
- package/dist/components/error/ErrorChip.js.map +1 -1
- package/dist/components/error/ErrorPage.js +24 -24
- package/dist/components/error/ErrorPage.js.map +1 -1
- package/dist/components/error/RouteErrorBoundary.js.map +1 -1
- package/dist/components/error/SendMessageToEntityOwnerDialog.js.map +1 -1
- package/dist/components/error/SynapseObjectDOIInfo.js.map +1 -1
- package/dist/components/favorites/FavoriteButton.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/file/upload/MultiFileUploadProgress.js.map +1 -1
- package/dist/components/file/upload/UploadFilePanel.js.map +1 -1
- package/dist/components/form/RadioGroupWithOtherString.js.map +1 -1
- package/dist/components/home_page/ExpandableContent.js.map +1 -1
- package/dist/components/index.js +48 -47
- package/dist/components/layout/InfiniteTableLayout.js.map +1 -1
- package/dist/components/layout/SWCHeader.js.map +1 -1
- package/dist/components/layout/SWCPageLayout.js.map +1 -1
- package/dist/components/menu/ComplexMenu.js.map +1 -1
- package/dist/components/menu/DropdownMenu.js.map +1 -1
- package/dist/components/row_renderers/Dataset.js.map +1 -1
- package/dist/components/row_renderers/Funder.js.map +1 -1
- package/dist/components/row_renderers/ObservationCard.js.map +1 -1
- package/dist/components/row_renderers/utils/CardFooter.js.map +1 -1
- package/dist/components/row_renderers/utils/ChipContainer.js.map +1 -1
- package/dist/components/styled/HoverPopover.js.map +1 -1
- package/dist/components/styled/InlineBadge.js.map +1 -1
- package/dist/components/styled/InputSizedButton.js.map +1 -1
- package/dist/components/styled/LargeButton.js.map +1 -1
- package/dist/components/styled/LeftRightPanel.js.map +1 -1
- package/dist/components/styled/LightTooltip.js.map +1 -1
- package/dist/components/styled/StyledFormControl.js.map +1 -1
- package/dist/components/styled/StyledPopover.js.map +1 -1
- package/dist/components/styled/StyledTableContainer.js.map +1 -1
- package/dist/components/styled/WideButton.js.map +1 -1
- package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.d.ts +18 -0
- package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.js +113 -0
- package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.js.map +1 -0
- package/dist/components/table/CsvPreview/CsvPreview.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreviewDialog.d.ts +5 -5
- package/dist/components/table/CsvPreview/CsvPreviewDialog.d.ts.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreviewDialog.js +27 -76
- package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreviewWithOptions.d.ts +19 -0
- package/dist/components/table/CsvPreview/CsvPreviewWithOptions.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/CsvPreviewWithOptions.js +41 -0
- package/dist/components/table/CsvPreview/CsvPreviewWithOptions.js.map +1 -0
- package/dist/components/table/CsvPreview/CsvUploadPreviewContent.d.ts +12 -0
- package/dist/components/table/CsvPreview/CsvUploadPreviewContent.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/CsvUploadPreviewContent.js +25 -0
- package/dist/components/table/CsvPreview/CsvUploadPreviewContent.js.map +1 -0
- package/dist/components/table/CsvPreview/UpdateTableWithCsvDialog.d.ts +18 -0
- package/dist/components/table/CsvPreview/UpdateTableWithCsvDialog.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/UpdateTableWithCsvDialog.js +55 -0
- package/dist/components/table/CsvPreview/UpdateTableWithCsvDialog.js.map +1 -0
- package/dist/components/table/CsvPreview/useCreateTableFromCsv.d.ts +19 -0
- package/dist/components/table/CsvPreview/useCreateTableFromCsv.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/useCreateTableFromCsv.js +35 -0
- package/dist/components/table/CsvPreview/useCreateTableFromCsv.js.map +1 -0
- package/dist/components/table/CsvPreview/useCsvUploadPreview.d.ts +22 -0
- package/dist/components/table/CsvPreview/useCsvUploadPreview.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/useCsvUploadPreview.js +32 -0
- package/dist/components/table/CsvPreview/useCsvUploadPreview.js.map +1 -0
- package/dist/components/table/CsvPreview/useUploadCsvToExistingTable.d.ts +14 -0
- package/dist/components/table/CsvPreview/useUploadCsvToExistingTable.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/useUploadCsvToExistingTable.js +23 -0
- package/dist/components/table/CsvPreview/useUploadCsvToExistingTable.js.map +1 -0
- package/dist/components/table/CsvTableDescriptorForm/CsvTableDescriptorForm.js.map +1 -1
- package/dist/components/trash/TrashCanList.js.map +1 -1
- package/dist/components/utils/Blocker.js.map +1 -1
- package/dist/components/utils/ConditionalWrapper.js.map +1 -1
- package/dist/components/utils/VisibilityObserver.js.map +1 -1
- package/dist/components/widgets/ElementWithTooltip.js.map +1 -1
- package/dist/components/widgets/EntityColumnImage.js.map +1 -1
- package/dist/components/widgets/FileHandleLink.js.map +1 -1
- package/dist/components/widgets/ImageFileHandle.js.map +1 -1
- package/dist/components/widgets/LoginAwareButton.js.map +1 -1
- package/dist/components/widgets/Range.js.map +1 -1
- package/dist/components/widgets/RangeSlider/RangeSlider.js.map +1 -1
- package/dist/components/widgets/SynapseImage.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/FacetPlotLegendList.js.map +1 -1
- package/dist/components/widgets/facet-nav/FacetPlotLegendTable.js.map +1 -1
- package/dist/components/widgets/facet-nav/FacetPlotLegendUtils.js.map +1 -1
- package/dist/components/widgets/facet-nav/PlotsContainer.js.map +1 -1
- package/dist/components/widgets/facet-nav/PlotsContainerSkeleton.js.map +1 -1
- package/dist/components/widgets/facet-nav/SelectionCriteriaPill.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/EnumFacetFilter/EnumFacetFilterDropdown.js.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.js.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterSkeleton.js.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUtils.js.map +1 -1
- package/dist/components/widgets/query-filter/FacetChip.js.map +1 -1
- package/dist/components/widgets/query-filter/FacetFilterControls.js.map +1 -1
- package/dist/components/widgets/query-filter/FacetFilterHeader.js.map +1 -1
- package/dist/components/widgets/query-filter/FacetFilterSkeleton.js.map +1 -1
- package/dist/components/widgets/query-filter/FacetFilterUtils.js.map +1 -1
- package/dist/components/widgets/query-filter/JsonColumnFacetFilters.js.map +1 -1
- package/dist/components/widgets/query-filter/RangeFacetFilter.js +3 -3
- package/dist/components/widgets/query-filter/RangeFacetFilter.js.map +1 -1
- package/dist/components/widgets/query-filter/RangeFacetFilterUI.js +41 -41
- package/dist/components/widgets/query-filter/RangeFacetFilterUI.js.map +1 -1
- package/dist/features/curator/GridPage/GridPage.js.map +1 -1
- package/dist/features/curator/GridPage/components/GridPageRouter.js.map +1 -1
- package/dist/features/curator/GridPage/components/GridPageTitle.js.map +1 -1
- package/dist/features/curator/GridPage/components/UpdateGridPageSearchParamsForm.js.map +1 -1
- package/dist/features/curator/dashboard/CuratorDashboard.js.map +1 -1
- package/dist/features/curator/dashboard/components/CurationTaskCard.js.map +1 -1
- package/dist/features/curator/dashboard/components/NextStepButton.js.map +1 -1
- package/dist/features/curator/dashboard/components/UserOrTeamChip.js.map +1 -1
- package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.d.ts +5 -0
- package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js +227 -181
- package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js +3 -0
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksPage.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksPage.js +37 -34
- package/dist/features/entity/metadata-task/components/MetadataTasksPage.js.map +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.d.ts.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.js.map +1 -1
- package/dist/features/entity/metadata-task/utils/constants.d.ts +11 -3
- package/dist/features/entity/metadata-task/utils/constants.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/utils/constants.js +2 -2
- package/dist/features/entity/metadata-task/utils/constants.js.map +1 -1
- package/dist/features/entity/metadata-task/utils/getCreateGridRequestForMetadataTask.js.map +1 -1
- package/dist/features/entity/metadata-task/utils/getGridSourceIdForTask.js.map +1 -1
- package/dist/features/entity/metadata-task/utils/getLatestGridSessionForSource.js.map +1 -1
- package/dist/features/entity/metadata-task/utils/taskHasAssignee.js.map +1 -1
- package/dist/features/team/invitation/components/OpenInvitationsToUserCard.js.map +1 -1
- package/dist/index.js +54 -53
- package/dist/index.js.map +1 -1
- package/dist/mocks/MockAccessApprovals.js.map +1 -1
- package/dist/mocks/MockSynapseContext.js.map +1 -1
- package/dist/mocks/accessRequirement/mockAccessRequirementAcls.js.map +1 -1
- package/dist/mocks/accessRequirement/mockAccessRequirements.js.map +1 -1
- package/dist/mocks/applicationSessionContext/MockApplicationSessionContext.js.map +1 -1
- package/dist/mocks/challenge/mockChallenge.js.map +1 -1
- package/dist/mocks/chat/mockChat.js.map +1 -1
- package/dist/mocks/curation/mockCurationTask.js.map +1 -1
- package/dist/mocks/dataaccess/MockDataAccessRequest.js.map +1 -1
- package/dist/mocks/dataaccess/MockResearchProject.js.map +1 -1
- package/dist/mocks/dataaccess/MockSubmission.js.map +1 -1
- package/dist/mocks/dataaccess/mockAccessRequest.js.map +1 -1
- package/dist/mocks/discussion/mock_discussion.js.map +1 -1
- package/dist/mocks/doi/MockDoi.js.map +1 -1
- package/dist/mocks/entity/index.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/mockEntity.js.map +1 -1
- package/dist/mocks/entity/mockEvaluationQueue.js.map +1 -1
- package/dist/mocks/entity/mockFileEntity.js.map +1 -1
- package/dist/mocks/entity/mockFileEntityACLVariants.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/mockReleaseCardsTable.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/faker/fakerUtils.js.map +1 -1
- package/dist/mocks/faker/generateDiscussion.js.map +1 -1
- package/dist/mocks/faker/generateEvaluation.js.map +1 -1
- package/dist/mocks/faker/generateFakeEntity.js.map +1 -1
- package/dist/mocks/faker/generateSubscription.js.map +1 -1
- package/dist/mocks/mockAnnotationColumns.js.map +1 -1
- package/dist/mocks/mockCertificationQuiz.js.map +1 -1
- package/dist/mocks/mockDataCatalogQuery.js.map +1 -1
- package/dist/mocks/mockFileViewQuery.js.map +1 -1
- package/dist/mocks/mockOAuthClientAcls.js.map +1 -1
- package/dist/mocks/mockQueryResponseData.js.map +1 -1
- package/dist/mocks/mockQueryResponseDataWithManyEnumFacets.js.map +1 -1
- package/dist/mocks/mockSchema.js.map +1 -1
- package/dist/mocks/mockSearchQueryData.js.map +1 -1
- package/dist/mocks/mockShortIo.js.map +1 -1
- package/dist/mocks/mockSourceAppConfigQuery.js.map +1 -1
- package/dist/mocks/mockSubscription.js.map +1 -1
- package/dist/mocks/mockWiki.js.map +1 -1
- package/dist/mocks/mockWikiPageKey.js.map +1 -1
- package/dist/mocks/mock_drug_tool_data.js.map +1 -1
- package/dist/mocks/mock_file_handle.js.map +1 -1
- package/dist/mocks/mock_file_statistics.js.map +1 -1
- package/dist/mocks/mock_has_access_data.js.map +1 -1
- package/dist/mocks/mock_upload_destination.js.map +1 -1
- package/dist/mocks/msw/handlers/accessRequirementAclHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/accessRequirementHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/asyncJobHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/authHandlers.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/chatHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/dataAccessRequestHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/dataciteHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/discussionHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/doiHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/entityHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/evaluationHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/featureFlagHandlers.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/messageHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/oauthClientAclHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/personalAccessTokenHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/projectStorageHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/realmHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/researchProjectHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/resetTwoFactorAuthHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/schemaHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/searchQueryHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/shortIoHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/subscriptionHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/tableQueryHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/tableQueryService.js.map +1 -1
- package/dist/mocks/msw/handlers/teamHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/termsOfServiceHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/userProfileHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/webhookHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/wikiHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers.js.map +1 -1
- package/dist/mocks/msw/server.d.ts +1 -1
- package/dist/mocks/msw/server.d.ts.map +1 -1
- package/dist/mocks/msw/server.js.map +1 -1
- package/dist/mocks/msw/util/BasicMockedCrudService.js.map +1 -1
- package/dist/mocks/oauth/MockClient.js.map +1 -1
- package/dist/mocks/personalAccessToken/mockPersonalAccessToken.js.map +1 -1
- package/dist/mocks/projectStorage/mockProjectStorageLimits.js.map +1 -1
- package/dist/mocks/provenance/mockActivity.js.map +1 -1
- package/dist/mocks/query/defaultFileViewColumnModels.js.map +1 -1
- package/dist/mocks/query/mockFeaturedDataTabsQueryData.js.map +1 -1
- package/dist/mocks/query/mockHomepageQueryResultData.js.map +1 -1
- package/dist/mocks/query/mockProjectViewQueryResults.js.map +1 -1
- package/dist/mocks/query/mockRejectionReasonsTableQueryResultBundle.js.map +1 -1
- package/dist/mocks/query/mockReleaseCardsTableQueryResultBundle.js.map +1 -1
- package/dist/mocks/query/mockUserCardTableQueryResultBundle.js.map +1 -1
- package/dist/mocks/query/mock_query_data.js.map +1 -1
- package/dist/mocks/query/syn16787123.js.map +1 -1
- package/dist/mocks/query/syn17328596.js.map +1 -1
- package/dist/mocks/query/syn51735464.js.map +1 -1
- package/dist/mocks/query/syn51735464GroupBySpecies.js.map +1 -1
- package/dist/mocks/realm/mockRealmPrincipal.js.map +1 -1
- package/dist/mocks/team/mockTeam.js.map +1 -1
- package/dist/mocks/termsOfService/mockTermsOfService.js.map +1 -1
- package/dist/mocks/user/mock_user_profile.js.map +1 -1
- package/dist/mocks/usergroup/mockUserGroup.js.map +1 -1
- package/dist/ror-client/index.js.map +1 -1
- package/dist/stories/ColorPaletteInspector.js.map +1 -1
- package/dist/stories/ToastDemo.js.map +1 -1
- package/dist/stories/stubs/Alert/MuiAlert.js.map +1 -1
- package/dist/stories/stubs/Button/MuiButton.js.map +1 -1
- package/dist/stories/stubs/Dialog/MuiDialog.js.map +1 -1
- package/dist/stories/stubs/TextField/MuiTextField.js.map +1 -1
- package/dist/stories/stubs/Tooltip/MuiTooltip.js.map +1 -1
- package/dist/synapse-client/HttpClient.js.map +1 -1
- package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
- package/dist/synapse-client/SynapseClient.js +61 -69
- package/dist/synapse-client/SynapseClient.js.map +1 -1
- package/dist/synapse-client/SynapseClientUtils.js.map +1 -1
- package/dist/synapse-queries/InfiniteQueryUtils.js.map +1 -1
- package/dist/synapse-queries/KeyFactory.js.map +1 -1
- package/dist/synapse-queries/QueryFilterUtils.js.map +1 -1
- package/dist/synapse-queries/QueryMatching.test-utils.js.map +1 -1
- package/dist/synapse-queries/asynchronous/usePollAsynchronousJob.js.map +1 -1
- package/dist/synapse-queries/auth/useChangePassword.js.map +1 -1
- package/dist/synapse-queries/auth/useOIDC.js.map +1 -1
- package/dist/synapse-queries/auth/useResetPassword.js.map +1 -1
- package/dist/synapse-queries/auth/useTwoFactorEnrollment.js.map +1 -1
- package/dist/synapse-queries/challenge/useChallenge.js.map +1 -1
- package/dist/synapse-queries/chat/useChat.js.map +1 -1
- package/dist/synapse-queries/croissant/useGetCroissantUrl.js.map +1 -1
- package/dist/synapse-queries/curation/task/useCurationTask.d.ts +1 -0
- package/dist/synapse-queries/curation/task/useCurationTask.d.ts.map +1 -1
- package/dist/synapse-queries/curation/task/useCurationTask.js +12 -2
- package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useAccessApprovals.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useAccessRequirements.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useDataAccessSubmission.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useGetApprovedSubmissionInfo.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useRestrictionInformation.js.map +1 -1
- package/dist/synapse-queries/docker/useGetDockerTag.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/useActionsRequiredForTableQuery.js.map +1 -1
- package/dist/synapse-queries/entity/useEntity.js.map +1 -1
- package/dist/synapse-queries/entity/useEntityBoundSchema.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/useExportToADWorkbench.js.map +1 -1
- package/dist/synapse-queries/entity/useExportToCavatica.js.map +1 -1
- package/dist/synapse-queries/entity/useExportToPluto.js.map +1 -1
- package/dist/synapse-queries/entity/useExportToTerra.js.map +1 -1
- package/dist/synapse-queries/entity/useGetEntityActionsRequired.js.map +1 -1
- package/dist/synapse-queries/entity/useGetEntityChallenge.js.map +1 -1
- package/dist/synapse-queries/entity/useGetEntityChildren.js.map +1 -1
- package/dist/synapse-queries/entity/useGetEntityForum.js.map +1 -1
- package/dist/synapse-queries/entity/useGetEntityHeaders.js.map +1 -1
- package/dist/synapse-queries/entity/useGetQueryResultBundle.js.map +1 -1
- package/dist/synapse-queries/entity/useProjectStorage.js.map +1 -1
- package/dist/synapse-queries/entity/useSchema.js.map +1 -1
- package/dist/synapse-queries/evaluation/useEvaluation.js.map +1 -1
- package/dist/synapse-queries/featureflags/useGetFeatureFlag.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/useFileHandle.js.map +1 -1
- package/dist/synapse-queries/file/useFiles.js.map +1 -1
- package/dist/synapse-queries/file/useSynapseMultipartUpload.js.map +1 -1
- package/dist/synapse-queries/file/useUploadDestination.js.map +1 -1
- package/dist/synapse-queries/forum/useForum.js.map +1 -1
- package/dist/synapse-queries/forum/useReply.js.map +1 -1
- package/dist/synapse-queries/forum/useThread.js.map +1 -1
- package/dist/synapse-queries/github/useGithub.js.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/useGridPresignedUrl.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/message/useMessage.js.map +1 -1
- package/dist/synapse-queries/oauth/useOAuthClient.js.map +1 -1
- package/dist/synapse-queries/portal/useListPortals.js.map +1 -1
- package/dist/synapse-queries/portal/usePortal.js.map +1 -1
- package/dist/synapse-queries/provenance/useGetActivityForEntity.js.map +1 -1
- package/dist/synapse-queries/realm/useRealmPrincipals.js.map +1 -1
- package/dist/synapse-queries/ror/index.js.map +1 -1
- package/dist/synapse-queries/search/useSearch.js.map +1 -1
- package/dist/synapse-queries/search/useSuggestion.js.map +1 -1
- package/dist/synapse-queries/subscription/useSubscription.js.map +1 -1
- package/dist/synapse-queries/table/useColumnModel.js.map +1 -1
- package/dist/synapse-queries/table/useDefiningSql.js.map +1 -1
- package/dist/synapse-queries/table/useDownloadTable.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/useTeam.js.map +1 -1
- package/dist/synapse-queries/team/useTeamList.js.map +1 -1
- package/dist/synapse-queries/team/useTeamMembers.js.map +1 -1
- package/dist/synapse-queries/termsOfService/useTermsOfService.js.map +1 -1
- package/dist/synapse-queries/trash/useTrashCan.js.map +1 -1
- package/dist/synapse-queries/user/useCertificationQuiz.js.map +1 -1
- package/dist/synapse-queries/user/useFavorites.js.map +1 -1
- package/dist/synapse-queries/user/useGetUserChallenges.js.map +1 -1
- package/dist/synapse-queries/user/useGetUserProjects.js.map +1 -1
- package/dist/synapse-queries/user/useGetUserTeams.js.map +1 -1
- package/dist/synapse-queries/user/usePersonalAccessToken.js.map +1 -1
- package/dist/synapse-queries/user/useProjects.js.map +1 -1
- package/dist/synapse-queries/user/useRevokeCertification.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/synapse-queries/verificationSubmission/useVerificationSubmission.js.map +1 -1
- package/dist/synapse-queries/webhook/useWebhook.js.map +1 -1
- package/dist/synapse-queries/wiki/useWiki.js.map +1 -1
- package/dist/testutils/ComponentToBePassedPropsCustomMatcher.js.map +1 -1
- package/dist/testutils/IsEditingStoreTestUtils.js +17 -0
- package/dist/testutils/IsEditingStoreTestUtils.js.map +1 -0
- package/dist/testutils/LocationTracker.js.map +1 -1
- package/dist/testutils/MarkdownSynapseUtils.js.map +1 -1
- package/dist/testutils/ReactQueryMockUtils.js.map +1 -1
- package/dist/testutils/TestingLibraryUtils.js +18 -16
- package/dist/testutils/TestingLibraryUtils.js.map +1 -1
- package/dist/testutils/muiDatePickerMock.js.map +1 -1
- package/dist/testutils/vitest.setup.js.map +1 -1
- package/dist/theme/DefaultTheme.js.map +1 -1
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/mergeTheme.js.map +1 -1
- package/dist/theme/palette/Palettes.js.map +1 -1
- package/dist/theme/spreadSx.js.map +1 -1
- package/dist/theme/typography/Link.js.map +1 -1
- package/dist/theme/typography/Typography.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/APIConstants.js.map +1 -1
- package/dist/utils/AppUtils/AppUtils.d.ts.map +1 -1
- package/dist/utils/AppUtils/AppUtils.js +11 -11
- package/dist/utils/AppUtils/AppUtils.js.map +1 -1
- package/dist/utils/AppUtils/session/ApplicationSessionContext.js.map +1 -1
- package/dist/utils/AppUtils/session/ApplicationSessionManager.js.map +1 -1
- package/dist/utils/AppUtils/session/AuthenticationGuard.js.map +1 -1
- package/dist/utils/AppUtils/session/SessionInitializedGuard.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/ContentTypeUtils.js.map +1 -1
- package/dist/utils/OrientationBannerConstants.js.map +1 -1
- package/dist/utils/PermissionLevelToAccessType.js.map +1 -1
- package/dist/utils/SynapseConstants.js.map +1 -1
- package/dist/utils/analytics/sendAnalyticsEvent.js.map +1 -1
- package/dist/utils/analytics/sendSearchEvent.js.map +1 -1
- package/dist/utils/analytics/useGoogleAnalytics.js.map +1 -1
- package/dist/utils/appendFinalQueryParamKey.js.map +1 -1
- package/dist/utils/challenge/evaluation/EvaluationUtils.js.map +1 -1
- package/dist/utils/context/AridhiaContext.js.map +1 -1
- package/dist/utils/context/DocumentMetadataContext.js.map +1 -1
- package/dist/utils/context/FullContextProvider.js.map +1 -1
- package/dist/utils/context/GlobalIsEditingContext.js.map +1 -1
- package/dist/utils/context/SynapseContext.js.map +1 -1
- package/dist/utils/featureflag/FeatureFlags.d.ts +2 -1
- package/dist/utils/featureflag/FeatureFlags.d.ts.map +1 -1
- package/dist/utils/featureflag/FeatureFlags.js +1 -1
- package/dist/utils/featureflag/FeatureFlags.js.map +1 -1
- package/dist/utils/functions/AccessControlListUtils.js.map +1 -1
- package/dist/utils/functions/ArrayUtils.js.map +1 -1
- package/dist/utils/functions/DateFormatter.js.map +1 -1
- package/dist/utils/functions/DateTimeUtils.js.map +1 -1
- package/dist/utils/functions/EntityTypeUtils.js.map +1 -1
- package/dist/utils/functions/FileHandleUtils.js.map +1 -1
- package/dist/utils/functions/GridApiUtils.js.map +1 -1
- package/dist/utils/functions/IsEqualTreatUndefinedAsMissing.js.map +1 -1
- package/dist/utils/functions/IsExternalLink.js.map +1 -1
- package/dist/utils/functions/ObjectUtils.js.map +1 -1
- package/dist/utils/functions/QueryFilterUtils.js.map +1 -1
- package/dist/utils/functions/RealmUtils.js.map +1 -1
- package/dist/utils/functions/RegularExpressions.js.map +1 -1
- package/dist/utils/functions/ResolveLinkEntity.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/TableColumnSchemaUtils.js.map +1 -1
- package/dist/utils/functions/calculateFriendlyFileSize.js.map +1 -1
- package/dist/utils/functions/colorPalette.js.map +1 -1
- package/dist/utils/functions/deepLinkingUtils.js.map +1 -1
- package/dist/utils/functions/dispatchDownloadListChangeEvent.js.map +1 -1
- package/dist/utils/functions/generateCsrfToken.js.map +1 -1
- package/dist/utils/functions/getDataFromFromStorage.js.map +1 -1
- package/dist/utils/functions/getEndpoint.js +3 -3
- package/dist/utils/functions/getEndpoint.js.map +1 -1
- package/dist/utils/functions/getPrincipalDisplayName.js.map +1 -1
- package/dist/utils/functions/getSynapseEntityUrl.js.map +1 -1
- package/dist/utils/functions/getSynapseWebClientLink.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/functions/unCamelCase.js.map +1 -1
- package/dist/utils/hooks/useConfirmItems.js.map +1 -1
- package/dist/utils/hooks/useCookiePreferences.d.ts.map +1 -1
- package/dist/utils/hooks/useCookiePreferences.js +24 -23
- package/dist/utils/hooks/useCookiePreferences.js.map +1 -1
- package/dist/utils/hooks/useCreateShortUrl.js.map +1 -1
- package/dist/utils/hooks/useDebouncedEffect.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/useGetEntityMetadata.js.map +1 -1
- package/dist/utils/hooks/useGetGoalData.js +2 -4
- package/dist/utils/hooks/useGetGoalData.js.map +1 -1
- package/dist/utils/hooks/useGetInfoFromIds.js.map +1 -1
- package/dist/utils/hooks/useGetIsAllSelectedInfiniteList.js.map +1 -1
- package/dist/utils/hooks/useImageUrlUtils.js.map +1 -1
- package/dist/utils/hooks/useImmutableTableQuery/TableQueryReducerActions.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/useJsonLdScriptElement.js.map +1 -1
- package/dist/utils/hooks/useListState.js.map +1 -1
- package/dist/utils/hooks/useLogin.js.map +1 -1
- package/dist/utils/hooks/useMediaPrintOnly.js.map +1 -1
- package/dist/utils/hooks/useMutuallyExclusiveState.js.map +1 -1
- package/dist/utils/hooks/useNativeSearchParams.js.map +1 -1
- package/dist/utils/hooks/useOneSageURL.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/useShowDesktop.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/useTraceUpdate.js.map +1 -1
- package/dist/utils/hooks/useTrackTransientListItems.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/getActiveUploadCount.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/getFileEntityIdWithSameName.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/useCreateFolderPath.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/dist/utils/jsonschema/getEnumeratedValues.js.map +1 -1
- package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.js.map +1 -1
- package/dist/utils/jsonschema/getRequiredAttributes.js.map +1 -1
- package/dist/utils/jsonschema/getSchemaForProperty.js.map +1 -1
- package/dist/utils/jsonschema/getSchemaPropertyInfo.js.map +1 -1
- package/dist/utils/jsonschema/getType.js.map +1 -1
- package/dist/utils/searchDefaults.js.map +1 -1
- package/dist/utils/slots/SlotUtils.js.map +1 -1
- package/dist/utils/types/IsType.js.map +1 -1
- package/package.json +67 -66
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AclEditor.js","names":[],"sources":["../../../src/components/AclEditor/AclEditor.tsx"],"sourcesContent":["import { PermissionLevel } from '@/utils/PermissionLevelToAccessType'\nimport { useGetRealmPrincipals } from '@/synapse-queries/realm/useRealmPrincipals'\nimport {\n Box,\n Button,\n ButtonProps,\n Checkbox,\n Collapse,\n FormControlLabel,\n Tooltip,\n Typography,\n} from '@mui/material'\nimport { ResourceAccess } from '@sage-bionetworks/synapse-types'\nimport { noop } from 'lodash-es'\nimport React, { ReactNode } from 'react'\nimport { TransitionGroup } from 'react-transition-group'\nimport IconSvg from '../IconSvg'\nimport UserSearchBox from '../UserSearchBox/UserSearchBox'\nimport { AclEditorSkeleton } from './AclEditorSkeleton'\nimport { ResourceAccessItem } from './ResourceAccessItem'\nimport useUpdateAcl from './useUpdateAcl'\n\nexport const ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL = 'Add a user or team'\nexport const ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT = 'Make Public'\nexport const REMOVE_PUBLIC_PRINCIPALS_BUTTON_TEXT = 'Remove Public Access'\n\nexport type AclEditorProps = {\n resourceAccessList: ResourceAccess[]\n availablePermissionLevels: PermissionLevel[]\n /** If true, the user can edit the ACL. If a function, it will be called with the ResourceAccess to determine if the user can edit it. */\n canEdit: boolean | ((resourceAccess: ResourceAccess) => boolean)\n /** If true, object ACL is inherited from another object */\n isInherited: boolean\n /**\n * If true, the user can remove any entry from the ACL. a function, it will be called with the ResourceAccess to determine if the user can remove it.\n * If undefined, then the behavior will fall back to the value of `canEdit`\n */\n canRemoveEntry?: boolean | ((resourceAccess: ResourceAccess) => boolean)\n isLoading?: boolean\n emptyText: ReactNode\n onAddPrincipalToAcl: (id: number) => void\n updateResourceAccessItem: ReturnType<\n typeof useUpdateAcl\n >['updateResourceAccessItem']\n removeResourceAccessItem: ReturnType<\n typeof useUpdateAcl\n >['removeResourceAccessItem']\n /** If true, shows a button to add/remove AUTHENTICATED and PUBLIC groups when in edit mode */\n showAddRemovePublicButton: boolean\n /** If present, a checkbox to notify those added to the email will be shown. */\n showNotifyCheckbox: boolean\n notifyCheckboxValue?: boolean\n onNotifyCheckboxChange?: (checked: boolean) => void\n /**\n * In special cases, can be used to display a permission level that is different from the typical permission levels.\n * For example, the PUBLIC group \"Can download\" an entity if they have READ access and the entity is marked as\n * \"open data\" (open data status is not captured in the ResourceAccess)\n */\n displayedPermissionLevelOverride?: (\n resourceAccess: ResourceAccess,\n ) => string | undefined\n}\n\nexport const NOTIFY_NEW_ACL_USERS_CHECKBOX_LABEL = 'Notify people via email'\n\nexport function AclEditor(props: AclEditorProps): React.ReactNode {\n const {\n resourceAccessList,\n availablePermissionLevels,\n canEdit,\n isInherited,\n canRemoveEntry = canEdit,\n isLoading = false,\n emptyText,\n onAddPrincipalToAcl,\n updateResourceAccessItem,\n removeResourceAccessItem,\n showAddRemovePublicButton,\n showNotifyCheckbox,\n notifyCheckboxValue,\n onNotifyCheckboxChange = noop,\n displayedPermissionLevelOverride,\n } = props\n\n const { data, isLoading: isLoadingRealmPrincipals } = useGetRealmPrincipals()\n const realmPrincipals = data || {}\n const {\n authenticatedUsers: authenticatedUsersId,\n publicGroup: publicGroupId,\n anonymousUser: anonymousUserId,\n } = realmPrincipals\n\n const publicPrincipalIds = [\n authenticatedUsersId,\n publicGroupId,\n anonymousUserId,\n ].filter((id): id is string => id !== undefined)\n\n if (isLoading || isLoadingRealmPrincipals) {\n return <AclEditorSkeleton />\n }\n\n const resourceAccessListCurrentlyIncludesPublic = Boolean(\n resourceAccessList.find(resourceAccess =>\n publicPrincipalIds.some(id => resourceAccess.principalId === Number(id)),\n ),\n )\n\n const addOrRemovePublicButtonProps: ButtonProps =\n resourceAccessListCurrentlyIncludesPublic\n ? {\n startIcon: <IconSvg icon={'close'} wrap={false} />,\n children: REMOVE_PUBLIC_PRINCIPALS_BUTTON_TEXT,\n onClick: () => {\n publicPrincipalIds.forEach(publicId => {\n removeResourceAccessItem(Number(publicId))\n })\n },\n }\n : {\n startIcon: <IconSvg icon={'public'} wrap={false} />,\n children: ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT,\n onClick: () => {\n if (publicGroupId) onAddPrincipalToAcl(Number(publicGroupId))\n if (authenticatedUsersId)\n onAddPrincipalToAcl(Number(authenticatedUsersId))\n },\n }\n\n return (\n <Box>\n <Box\n sx={{\n mb: '30px',\n }}\n >\n <Typography\n variant=\"headline3\"\n sx={{\n mb: '10px',\n }}\n >\n Users and Teams with Permissions\n </Typography>\n\n {resourceAccessList.length === 0 ? (\n <Typography variant=\"body1Italic\">{emptyText}</Typography>\n ) : (\n <TransitionGroup>\n {resourceAccessList.map(resourceAccess => {\n const canChangePermission =\n typeof canEdit === 'function'\n ? canEdit(resourceAccess)\n : canEdit\n const canDelete =\n typeof canRemoveEntry === 'function'\n ? canRemoveEntry(resourceAccess)\n : canRemoveEntry\n\n const permissionLevelOverride = displayedPermissionLevelOverride\n ? displayedPermissionLevelOverride(resourceAccess)\n : undefined\n return (\n <Collapse key={resourceAccess.principalId}>\n <ResourceAccessItem\n resourceAccess={resourceAccess}\n availablePermissionLevels={availablePermissionLevels}\n canChangePermission={canChangePermission}\n displayedPermissionLevelOverride={permissionLevelOverride}\n showDeleteButton={canDelete}\n onChange={accessType =>\n updateResourceAccessItem(\n resourceAccess.principalId,\n accessType,\n )\n }\n onRemove={() =>\n removeResourceAccessItem(resourceAccess.principalId)\n }\n />\n </Collapse>\n )\n })}\n </TransitionGroup>\n )}\n </Box>\n {canEdit && (\n <Box>\n <Typography\n variant=\"headline3\"\n sx={{\n mb: '10px',\n }}\n >\n Add More\n </Typography>\n <Typography\n sx={{\n mb: '20px',\n variant: 'body1',\n lineHeight: '20px',\n fontStyle: 'italic',\n color: 'text.secondary',\n }}\n >\n Search for a username or team to add. You can search by username,\n first or last names, or team name.\n </Typography>\n <Box sx={{ mb: 1 }}>\n <Typography\n component=\"label\"\n variant=\"smallText2\"\n htmlFor=\"reviewer-search\"\n >\n {ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL}\n </Typography>\n <UserSearchBox\n value={null}\n inputId=\"reviewer-search\"\n placeholder=\"Username, name (first and last) or team name.\"\n onChange={id => {\n const parsedId = parseInt(id || '')\n if (parsedId) {\n onAddPrincipalToAcl(parsedId)\n }\n }}\n />\n </Box>\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n gap: 2,\n }}\n >\n <Box>\n {showAddRemovePublicButton && (\n <Button\n size={'small'}\n variant={'outlined'}\n {...addOrRemovePublicButtonProps}\n />\n )}\n </Box>\n {showNotifyCheckbox && (\n <Tooltip\n title={\n 'Select to notify newly added people that this item has been shared with them'\n }\n >\n <FormControlLabel\n sx={{ mr: 0 }}\n control={\n <Checkbox\n value={notifyCheckboxValue}\n onChange={() =>\n onNotifyCheckboxChange(!notifyCheckboxValue)\n }\n />\n }\n label={\n <Typography variant={'smallText1'}>\n {NOTIFY_NEW_ACL_USERS_CHECKBOX_LABEL}\n </Typography>\n }\n />\n </Tooltip>\n )}\n </Box>\n </Box>\n )}\n {!canEdit && !isInherited && (\n <Typography variant={'body1'}>\n You do not have sufficient privileges to modify the sharing settings.\n </Typography>\n )}\n </Box>\n )\n}\n"],"mappings":";;;;;;;;;;;AAsBA,IAAa,IAAsC,sBACtC,IAAoC,eACpC,IAAuC,wBAuCvC,IAAsC;AAEnD,SAAgB,EAAU,GAAwC;CAChE,IAAM,EACJ,uBACA,8BACA,YACA,gBACA,oBAAiB,GACjB,eAAY,IACZ,cACA,wBACA,6BACA,6BACA,8BACA,uBACA,wBACA,4BAAyB,GACzB,wCACE,GAEE,EAAE,SAAM,WAAW,MAA6B,GAAuB,EAEvE,EACJ,oBAAoB,GACpB,aAAa,GACb,eAAe,MAJO,KAAQ,EAAE,EAO5B,IAAqB;EACzB;EACA;EACA;EACD,CAAC,QAAQ,MAAqB,MAAO,KAAA,EAAU;AAEhD,KAAI,KAAa,EACf,QAAO,kBAAC,GAAD,EAAqB,CAAA;CAS9B,IAAM,IALJ,EAAmB,MAAK,MACtB,EAAmB,MAAK,MAAM,EAAe,gBAAgB,OAAO,EAAG,CAAC,CACzE,GAKG;EACE,WAAW,kBAAC,GAAD;GAAS,MAAM;GAAS,MAAM;GAAS,CAAA;EAClD,UAAU;EACV,eAAe;AACb,KAAmB,SAAQ,MAAY;AACrC,MAAyB,OAAO,EAAS,CAAC;KAC1C;;EAEL,GACD;EACE,WAAW,kBAAC,GAAD;GAAS,MAAM;GAAU,MAAM;GAAS,CAAA;EACnD,UAAU;EACV,eAAe;AAEb,GADI,KAAe,EAAoB,OAAO,EAAc,CAAC,EACzD,KACF,EAAoB,OAAO,EAAqB,CAAC;;EAEtD;AAEP,QACE,kBAAC,GAAD,EAAA,UAAA;EACE,kBAAC,GAAD;GACE,IAAI,EACF,IAAI,QACL;aAHH,CAKE,kBAAC,GAAD;IACE,SAAQ;IACR,IAAI,EACF,IAAI,QACL;cACF;IAEY,CAAA,EAEZ,EAAmB,WAAW,IAC7B,kBAAC,GAAD;IAAY,SAAQ;cAAe;IAAuB,CAAA,GAE1D,kBAAC,GAAD,EAAA,UACG,EAAmB,KAAI,MAAkB;IACxC,IAAM,IACJ,OAAO,KAAY,aACf,EAAQ,EAAe,GACvB,GACA,IACJ,OAAO,KAAmB,aACtB,EAAe,EAAe,GAC9B;AAKN,WACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KACkB;KACW;KACN;KACrB,kCAT0B,IAC5B,EAAiC,EAAe,GAChD,KAAA;KAQE,kBAAkB;KAClB,WAAU,MACR,EACE,EAAe,aACf,EACD;KAEH,gBACE,EAAyB,EAAe,YAAY;KAEtD,CAAA,EACO,EAjBI,EAAe,YAiBnB;KAEb,EACc,CAAA,CAEhB;;EACL,KACC,kBAAC,GAAD,EAAA,UAAA;GACE,kBAAC,GAAD;IACE,SAAQ;IACR,IAAI,EACF,IAAI,QACL;cACF;IAEY,CAAA;GACb,kBAAC,GAAD;IACE,IAAI;KACF,IAAI;KACJ,SAAS;KACT,YAAY;KACZ,WAAW;KACX,OAAO;KACR;cACF;IAGY,CAAA;GACb,kBAAC,GAAD;IAAK,IAAI,EAAE,IAAI,GAAG;cAAlB,CACE,kBAAC,GAAD;KACE,WAAU;KACV,SAAQ;KACR,SAAQ;;KAGG,CAAA,EACb,kBAAC,GAAD;KACE,OAAO;KACP,SAAQ;KACR,aAAY;KACZ,WAAU,MAAM;MACd,IAAM,IAAW,SAAS,KAAM,GAAG;AACnC,MAAI,KACF,EAAoB,EAAS;;KAGjC,CAAA,CACE;;GACN,kBAAC,GAAD;IACE,IAAI;KACF,SAAS;KACT,gBAAgB;KAChB,KAAK;KACN;cALH,CAOE,kBAAC,GAAD,EAAA,UACG,KACC,kBAAC,GAAD;KACE,MAAM;KACN,SAAS;KACT,GAAI;KACJ,CAAA,EAEA,CAAA,EACL,KACC,kBAAC,GAAD;KACE,OACE;eAGF,kBAAC,GAAD;MACE,IAAI,EAAE,IAAI,GAAG;MACb,SACE,kBAAC,GAAD;OACE,OAAO;OACP,gBACE,EAAuB,CAAC,EAAoB;OAE9C,CAAA;MAEJ,OACE,kBAAC,GAAD;OAAY,SAAS;;OAER,CAAA;MAEf,CAAA;KACM,CAAA,CAER;;GACF,EAAA,CAAA;EAEP,CAAC,KAAW,CAAC,KACZ,kBAAC,GAAD;GAAY,SAAS;aAAS;GAEjB,CAAA;EAEX,EAAA,CAAA"}
|
|
1
|
+
{"version":3,"file":"AclEditor.js","names":[],"sources":["../../../src/components/AclEditor/AclEditor.tsx"],"sourcesContent":["import { PermissionLevel } from '@/utils/PermissionLevelToAccessType'\nimport { useGetRealmPrincipals } from '@/synapse-queries/realm/useRealmPrincipals'\nimport {\n Box,\n Button,\n ButtonProps,\n Checkbox,\n Collapse,\n FormControlLabel,\n Tooltip,\n Typography,\n} from '@mui/material'\nimport { ResourceAccess } from '@sage-bionetworks/synapse-types'\nimport { noop } from 'lodash-es'\nimport React, { ReactNode } from 'react'\nimport { TransitionGroup } from 'react-transition-group'\nimport IconSvg from '../IconSvg'\nimport UserSearchBox from '../UserSearchBox/UserSearchBox'\nimport { AclEditorSkeleton } from './AclEditorSkeleton'\nimport { ResourceAccessItem } from './ResourceAccessItem'\nimport useUpdateAcl from './useUpdateAcl'\n\nexport const ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL = 'Add a user or team'\nexport const ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT = 'Make Public'\nexport const REMOVE_PUBLIC_PRINCIPALS_BUTTON_TEXT = 'Remove Public Access'\n\nexport type AclEditorProps = {\n resourceAccessList: ResourceAccess[]\n availablePermissionLevels: PermissionLevel[]\n /** If true, the user can edit the ACL. If a function, it will be called with the ResourceAccess to determine if the user can edit it. */\n canEdit: boolean | ((resourceAccess: ResourceAccess) => boolean)\n /** If true, object ACL is inherited from another object */\n isInherited: boolean\n /**\n * If true, the user can remove any entry from the ACL. a function, it will be called with the ResourceAccess to determine if the user can remove it.\n * If undefined, then the behavior will fall back to the value of `canEdit`\n */\n canRemoveEntry?: boolean | ((resourceAccess: ResourceAccess) => boolean)\n isLoading?: boolean\n emptyText: ReactNode\n onAddPrincipalToAcl: (id: number) => void\n updateResourceAccessItem: ReturnType<\n typeof useUpdateAcl\n >['updateResourceAccessItem']\n removeResourceAccessItem: ReturnType<\n typeof useUpdateAcl\n >['removeResourceAccessItem']\n /** If true, shows a button to add/remove AUTHENTICATED and PUBLIC groups when in edit mode */\n showAddRemovePublicButton: boolean\n /** If present, a checkbox to notify those added to the email will be shown. */\n showNotifyCheckbox: boolean\n notifyCheckboxValue?: boolean\n onNotifyCheckboxChange?: (checked: boolean) => void\n /**\n * In special cases, can be used to display a permission level that is different from the typical permission levels.\n * For example, the PUBLIC group \"Can download\" an entity if they have READ access and the entity is marked as\n * \"open data\" (open data status is not captured in the ResourceAccess)\n */\n displayedPermissionLevelOverride?: (\n resourceAccess: ResourceAccess,\n ) => string | undefined\n}\n\nexport const NOTIFY_NEW_ACL_USERS_CHECKBOX_LABEL = 'Notify people via email'\n\nexport function AclEditor(props: AclEditorProps): React.ReactNode {\n const {\n resourceAccessList,\n availablePermissionLevels,\n canEdit,\n isInherited,\n canRemoveEntry = canEdit,\n isLoading = false,\n emptyText,\n onAddPrincipalToAcl,\n updateResourceAccessItem,\n removeResourceAccessItem,\n showAddRemovePublicButton,\n showNotifyCheckbox,\n notifyCheckboxValue,\n onNotifyCheckboxChange = noop,\n displayedPermissionLevelOverride,\n } = props\n\n const { data, isLoading: isLoadingRealmPrincipals } = useGetRealmPrincipals()\n const realmPrincipals = data || {}\n const {\n authenticatedUsers: authenticatedUsersId,\n publicGroup: publicGroupId,\n anonymousUser: anonymousUserId,\n } = realmPrincipals\n\n const publicPrincipalIds = [\n authenticatedUsersId,\n publicGroupId,\n anonymousUserId,\n ].filter((id): id is string => id !== undefined)\n\n if (isLoading || isLoadingRealmPrincipals) {\n return <AclEditorSkeleton />\n }\n\n const resourceAccessListCurrentlyIncludesPublic = Boolean(\n resourceAccessList.find(resourceAccess =>\n publicPrincipalIds.some(id => resourceAccess.principalId === Number(id)),\n ),\n )\n\n const addOrRemovePublicButtonProps: ButtonProps =\n resourceAccessListCurrentlyIncludesPublic\n ? {\n startIcon: <IconSvg icon={'close'} wrap={false} />,\n children: REMOVE_PUBLIC_PRINCIPALS_BUTTON_TEXT,\n onClick: () => {\n publicPrincipalIds.forEach(publicId => {\n removeResourceAccessItem(Number(publicId))\n })\n },\n }\n : {\n startIcon: <IconSvg icon={'public'} wrap={false} />,\n children: ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT,\n onClick: () => {\n if (publicGroupId) onAddPrincipalToAcl(Number(publicGroupId))\n if (authenticatedUsersId)\n onAddPrincipalToAcl(Number(authenticatedUsersId))\n },\n }\n\n return (\n <Box>\n <Box\n sx={{\n mb: '30px',\n }}\n >\n <Typography\n variant=\"headline3\"\n sx={{\n mb: '10px',\n }}\n >\n Users and Teams with Permissions\n </Typography>\n\n {resourceAccessList.length === 0 ? (\n <Typography variant=\"body1Italic\">{emptyText}</Typography>\n ) : (\n <TransitionGroup>\n {resourceAccessList.map(resourceAccess => {\n const canChangePermission =\n typeof canEdit === 'function'\n ? canEdit(resourceAccess)\n : canEdit\n const canDelete =\n typeof canRemoveEntry === 'function'\n ? canRemoveEntry(resourceAccess)\n : canRemoveEntry\n\n const permissionLevelOverride = displayedPermissionLevelOverride\n ? displayedPermissionLevelOverride(resourceAccess)\n : undefined\n return (\n <Collapse key={resourceAccess.principalId}>\n <ResourceAccessItem\n resourceAccess={resourceAccess}\n availablePermissionLevels={availablePermissionLevels}\n canChangePermission={canChangePermission}\n displayedPermissionLevelOverride={permissionLevelOverride}\n showDeleteButton={canDelete}\n onChange={accessType =>\n updateResourceAccessItem(\n resourceAccess.principalId,\n accessType,\n )\n }\n onRemove={() =>\n removeResourceAccessItem(resourceAccess.principalId)\n }\n />\n </Collapse>\n )\n })}\n </TransitionGroup>\n )}\n </Box>\n {canEdit && (\n <Box>\n <Typography\n variant=\"headline3\"\n sx={{\n mb: '10px',\n }}\n >\n Add More\n </Typography>\n <Typography\n sx={{\n mb: '20px',\n variant: 'body1',\n lineHeight: '20px',\n fontStyle: 'italic',\n color: 'text.secondary',\n }}\n >\n Search for a username or team to add. You can search by username,\n first or last names, or team name.\n </Typography>\n <Box sx={{ mb: 1 }}>\n <Typography\n component=\"label\"\n variant=\"smallText2\"\n htmlFor=\"reviewer-search\"\n >\n {ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL}\n </Typography>\n <UserSearchBox\n value={null}\n inputId=\"reviewer-search\"\n placeholder=\"Username, name (first and last) or team name.\"\n onChange={id => {\n const parsedId = parseInt(id || '')\n if (parsedId) {\n onAddPrincipalToAcl(parsedId)\n }\n }}\n />\n </Box>\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n gap: 2,\n }}\n >\n <Box>\n {showAddRemovePublicButton && (\n <Button\n size={'small'}\n variant={'outlined'}\n {...addOrRemovePublicButtonProps}\n />\n )}\n </Box>\n {showNotifyCheckbox && (\n <Tooltip\n title={\n 'Select to notify newly added people that this item has been shared with them'\n }\n >\n <FormControlLabel\n sx={{ mr: 0 }}\n control={\n <Checkbox\n value={notifyCheckboxValue}\n onChange={() =>\n onNotifyCheckboxChange(!notifyCheckboxValue)\n }\n />\n }\n label={\n <Typography variant={'smallText1'}>\n {NOTIFY_NEW_ACL_USERS_CHECKBOX_LABEL}\n </Typography>\n }\n />\n </Tooltip>\n )}\n </Box>\n </Box>\n )}\n {!canEdit && !isInherited && (\n <Typography variant={'body1'}>\n You do not have sufficient privileges to modify the sharing settings.\n </Typography>\n )}\n </Box>\n )\n}\n"],"mappings":";;;;;;;;;;;AAsBA,IAAa,IAAsC,sBACtC,IAAoC,eACpC,IAAuC,wBAuCvC,IAAsC;AAEnD,SAAgB,EAAU,GAAwC;CAChE,IAAM,EACJ,uBACA,8BACA,YACA,gBACA,oBAAiB,GACjB,eAAY,IACZ,cACA,wBACA,6BACA,6BACA,8BACA,uBACA,wBACA,4BAAyB,GACzB,wCACE,GAEE,EAAE,SAAM,WAAW,MAA6B,EAAsB,GAEtE,EACJ,oBAAoB,GACpB,aAAa,GACb,eAAe,MAJO,KAAQ,CAAC,GAO3B,IAAqB;EACzB;EACA;EACA;CACF,EAAE,QAAQ,MAAqB,MAAO,KAAA,CAAS;CAE/C,IAAI,KAAa,GACf,OAAO,kBAAC,GAAD,CAAoB,CAAA;CAS7B,IAAM,IALJ,EAAmB,MAAK,MACtB,EAAmB,MAAK,MAAM,EAAe,gBAAgB,OAAO,CAAE,CAAC,CACzE,IAKI;EACE,WAAW,kBAAC,GAAD;GAAS,MAAM;GAAS,MAAM;EAAQ,CAAA;EACjD,UAAU;EACV,eAAe;GACb,EAAmB,SAAQ,MAAY;IACrC,EAAyB,OAAO,CAAQ,CAAC;GAC3C,CAAC;EACH;CACF,IACA;EACE,WAAW,kBAAC,GAAD;GAAS,MAAM;GAAU,MAAM;EAAQ,CAAA;EAClD,UAAU;EACV,eAAe;GAEb,AADI,KAAe,EAAoB,OAAO,CAAa,CAAC,GACxD,KACF,EAAoB,OAAO,CAAoB,CAAC;EACpD;CACF;CAEN,OACE,kBAAC,GAAD,EAAA,UAAA;EACE,kBAAC,GAAD;GACE,IAAI,EACF,IAAI,OACN;aAHF,CAKE,kBAAC,GAAD;IACE,SAAQ;IACR,IAAI,EACF,IAAI,OACN;cACD;GAEW,CAAA,GAEX,EAAmB,WAAW,IAC7B,kBAAC,GAAD;IAAY,SAAQ;cAAe;GAAsB,CAAA,IAEzD,kBAAC,GAAD,EAAA,UACG,EAAmB,KAAI,MAAkB;IACxC,IAAM,IACJ,OAAO,KAAY,aACf,EAAQ,CAAc,IACtB,GACA,IACJ,OAAO,KAAmB,aACtB,EAAe,CAAc,IAC7B;IAKN,OACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KACkB;KACW;KACN;KACrB,kCAT0B,IAC5B,EAAiC,CAAc,IAC/C,KAAA;KAQE,kBAAkB;KAClB,WAAU,MACR,EACE,EAAe,aACf,CACF;KAEF,gBACE,EAAyB,EAAe,WAAW;IAEtD,CAAA,EACO,GAjBK,EAAe,WAiBpB;GAEd,CAAC,EACc,CAAA,CAEhB;;EACJ,KACC,kBAAC,GAAD,EAAA,UAAA;GACE,kBAAC,GAAD;IACE,SAAQ;IACR,IAAI,EACF,IAAI,OACN;cACD;GAEW,CAAA;GACZ,kBAAC,GAAD;IACE,IAAI;KACF,IAAI;KACJ,SAAS;KACT,YAAY;KACZ,WAAW;KACX,OAAO;IACT;cACD;GAGW,CAAA;GACZ,kBAAC,GAAD;IAAK,IAAI,EAAE,IAAI,EAAE;cAAjB,CACE,kBAAC,GAAD;KACE,WAAU;KACV,SAAQ;KACR,SAAQ;;IAGE,CAAA,GACZ,kBAAC,GAAD;KACE,OAAO;KACP,SAAQ;KACR,aAAY;KACZ,WAAU,MAAM;MACd,IAAM,IAAW,SAAS,KAAM,EAAE;MAClC,AAAI,KACF,EAAoB,CAAQ;KAEhC;IACD,CAAA,CACE;;GACL,kBAAC,GAAD;IACE,IAAI;KACF,SAAS;KACT,gBAAgB;KAChB,KAAK;IACP;cALF,CAOE,kBAAC,GAAD,EAAA,UACG,KACC,kBAAC,GAAD;KACE,MAAM;KACN,SAAS;KACT,GAAI;IACL,CAAA,EAEA,CAAA,GACJ,KACC,kBAAC,GAAD;KACE,OACE;eAGF,kBAAC,GAAD;MACE,IAAI,EAAE,IAAI,EAAE;MACZ,SACE,kBAAC,GAAD;OACE,OAAO;OACP,gBACE,EAAuB,CAAC,CAAmB;MAE9C,CAAA;MAEH,OACE,kBAAC,GAAD;OAAY,SAAS;;MAET,CAAA;KAEf,CAAA;IACM,CAAA,CAER;;EACF,EAAA,CAAA;EAEN,CAAC,KAAW,CAAC,KACZ,kBAAC,GAAD;GAAY,SAAS;aAAS;EAElB,CAAA;CAEX,EAAA,CAAA;AAET"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AclEditor.test-utils.js","names":[],"sources":["../../../src/components/AclEditor/AclEditor.test-utils.ts"],"sourcesContent":["import userEvent from '@testing-library/user-event'\nimport { screen, waitFor, within } from '@testing-library/react'\nimport { REMOVE_BUTTON_LABEL } from './ResourceAccessItem'\nimport {\n AUTHENTICATED_GROUP_DISPLAY_TEXT,\n PUBLIC_GROUP_DISPLAY_TEXT,\n} from '../TeamBadge'\nimport {\n ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL,\n ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT,\n} from './AclEditor'\n\n/**\n * Find a row in the ACL editor that contains the specified principal name.\n * @param rows\n * @param principalName\n */\nexport function queryForRowWithPrincipalName(\n rows: HTMLElement[],\n principalName: string,\n) {\n return rows.find(row => {\n return within(row).queryByText(principalName, { exact: false })\n })\n}\n\n/**\n * Verify that a row in the ACL editor contains the expected principal name and access type.\n * @param rows\n * @param principalName\n * @param accessTypeLabel\n */\nexport async function confirmItemViaQuery(\n rows: HTMLElement[],\n principalName: string,\n accessTypeLabel: string,\n) {\n let row: HTMLElement | undefined\n try {\n await waitFor(() => {\n row = queryForRowWithPrincipalName(rows, principalName)!\n expect(row).toBeInTheDocument()\n })\n } catch (e) {\n screen.debug()\n throw new Error(`Principal ${principalName} not found in ACL`, { cause: e })\n }\n\n const editorCombobox = within(row!).queryByRole('combobox')\n if (editorCombobox) {\n expect(editorCombobox).toHaveTextContent(accessTypeLabel)\n } else {\n within(row!).getByText(accessTypeLabel)\n }\n return row!\n}\n\n/**\n * Verify that a row in the ACL editor contains the expected principal name and access type.\n * @param row\n * @param principalName\n * @param accessTypeLabel\n */\nexport function confirmItem(\n row: HTMLElement,\n principalName: string,\n accessTypeLabel: string,\n) {\n expect(within(row).queryByRole('link') ?? row).toHaveTextContent(\n principalName,\n )\n const editorCombobox = within(row).queryByRole('combobox')\n if (editorCombobox) {\n expect(editorCombobox).toHaveTextContent(accessTypeLabel)\n } else {\n within(row).getByText(accessTypeLabel)\n }\n}\n\n/**\n * Remove a particular row from the HTML editor.\n * @param row\n * @param user\n * @param verifyRemoval\n */\nexport async function removeItem(\n row: HTMLElement,\n user: ReturnType<(typeof userEvent)['setup']>,\n verifyRemoval = true,\n) {\n const removeButton = within(row).getByRole('button', {\n name: REMOVE_BUTTON_LABEL,\n })\n await user.click(removeButton)\n if (verifyRemoval) {\n await waitFor(() => {\n expect(removeButton).not.toBeInTheDocument()\n expect(row).not.toBeInTheDocument()\n })\n }\n}\n\n/**\n * Updates the permission level of a particular row in the ACL editor.\n * @param row\n * @param user\n * @param updatedPermissionLevelLabel\n */\nexport async function updatePermissionLevel(\n row: HTMLElement,\n user: ReturnType<(typeof userEvent)['setup']>,\n updatedPermissionLevelLabel: string,\n) {\n const menu = within(row).getByRole('combobox')\n await user.click(menu)\n\n const option = screen.getByRole('option', {\n name: updatedPermissionLevelLabel,\n })\n await user.click(option)\n\n await waitFor(() => {\n expect(option).not.toBeInTheDocument()\n })\n}\n\nexport function queryForAddUserCombobox() {\n return screen.queryByRole('combobox', {\n name: ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL,\n })\n}\n\n/**\n * Adds a user to the ACL editor.\n * @param user\n * @param userName\n */\nexport async function addUserToAcl(\n user: ReturnType<(typeof userEvent)['setup']>,\n userName: string,\n) {\n const userInput = queryForAddUserCombobox()!\n expect(userInput).toBeInTheDocument()\n await user.clear(userInput)\n await user.type(userInput, userName)\n\n const option = await screen.findByText(new RegExp(`\\\\(@${userName}\\\\)`))\n await user.click(option)\n\n await waitFor(() => expect(option).not.toBeInTheDocument())\n const rows = screen.getAllByRole('row')\n return rows[rows.length - 1]\n}\n\n/**\n * Adds public / authenticated groups to the ACL editor.\n * @param user\n */\nexport async function addPublicToAcl(\n user: ReturnType<(typeof userEvent)['setup']>,\n) {\n const makePublicButton = screen.getByRole('button', {\n name: ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT,\n })\n await user.click(makePublicButton)\n\n let rows: HTMLElement[] = []\n let publicRow: HTMLElement | undefined = undefined\n let authenticatedUsersRow: HTMLElement | undefined = undefined\n await waitFor(() => {\n rows = screen.getAllByRole('row')\n publicRow = queryForRowWithPrincipalName(rows, PUBLIC_GROUP_DISPLAY_TEXT)\n authenticatedUsersRow = queryForRowWithPrincipalName(\n rows,\n AUTHENTICATED_GROUP_DISPLAY_TEXT,\n )\n expect(publicRow).toBeInTheDocument()\n expect(authenticatedUsersRow).toBeInTheDocument()\n })\n\n return {\n publicRow: rows[rows.length - 2],\n authenticatedUsersRow: rows[rows.length - 1],\n }\n}\n"],"mappings":";;;;;AAiBA,SAAgB,EACd,GACA,GACA;
|
|
1
|
+
{"version":3,"file":"AclEditor.test-utils.js","names":[],"sources":["../../../src/components/AclEditor/AclEditor.test-utils.ts"],"sourcesContent":["import userEvent from '@testing-library/user-event'\nimport { screen, waitFor, within } from '@testing-library/react'\nimport { REMOVE_BUTTON_LABEL } from './ResourceAccessItem'\nimport {\n AUTHENTICATED_GROUP_DISPLAY_TEXT,\n PUBLIC_GROUP_DISPLAY_TEXT,\n} from '../TeamBadge'\nimport {\n ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL,\n ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT,\n} from './AclEditor'\n\n/**\n * Find a row in the ACL editor that contains the specified principal name.\n * @param rows\n * @param principalName\n */\nexport function queryForRowWithPrincipalName(\n rows: HTMLElement[],\n principalName: string,\n) {\n return rows.find(row => {\n return within(row).queryByText(principalName, { exact: false })\n })\n}\n\n/**\n * Verify that a row in the ACL editor contains the expected principal name and access type.\n * @param rows\n * @param principalName\n * @param accessTypeLabel\n */\nexport async function confirmItemViaQuery(\n rows: HTMLElement[],\n principalName: string,\n accessTypeLabel: string,\n) {\n let row: HTMLElement | undefined\n try {\n await waitFor(() => {\n row = queryForRowWithPrincipalName(rows, principalName)!\n expect(row).toBeInTheDocument()\n })\n } catch (e) {\n screen.debug()\n throw new Error(`Principal ${principalName} not found in ACL`, { cause: e })\n }\n\n const editorCombobox = within(row!).queryByRole('combobox')\n if (editorCombobox) {\n expect(editorCombobox).toHaveTextContent(accessTypeLabel)\n } else {\n within(row!).getByText(accessTypeLabel)\n }\n return row!\n}\n\n/**\n * Verify that a row in the ACL editor contains the expected principal name and access type.\n * @param row\n * @param principalName\n * @param accessTypeLabel\n */\nexport function confirmItem(\n row: HTMLElement,\n principalName: string,\n accessTypeLabel: string,\n) {\n expect(within(row).queryByRole('link') ?? row).toHaveTextContent(\n principalName,\n )\n const editorCombobox = within(row).queryByRole('combobox')\n if (editorCombobox) {\n expect(editorCombobox).toHaveTextContent(accessTypeLabel)\n } else {\n within(row).getByText(accessTypeLabel)\n }\n}\n\n/**\n * Remove a particular row from the HTML editor.\n * @param row\n * @param user\n * @param verifyRemoval\n */\nexport async function removeItem(\n row: HTMLElement,\n user: ReturnType<(typeof userEvent)['setup']>,\n verifyRemoval = true,\n) {\n const removeButton = within(row).getByRole('button', {\n name: REMOVE_BUTTON_LABEL,\n })\n await user.click(removeButton)\n if (verifyRemoval) {\n await waitFor(() => {\n expect(removeButton).not.toBeInTheDocument()\n expect(row).not.toBeInTheDocument()\n })\n }\n}\n\n/**\n * Updates the permission level of a particular row in the ACL editor.\n * @param row\n * @param user\n * @param updatedPermissionLevelLabel\n */\nexport async function updatePermissionLevel(\n row: HTMLElement,\n user: ReturnType<(typeof userEvent)['setup']>,\n updatedPermissionLevelLabel: string,\n) {\n const menu = within(row).getByRole('combobox')\n await user.click(menu)\n\n const option = screen.getByRole('option', {\n name: updatedPermissionLevelLabel,\n })\n await user.click(option)\n\n await waitFor(() => {\n expect(option).not.toBeInTheDocument()\n })\n}\n\nexport function queryForAddUserCombobox() {\n return screen.queryByRole('combobox', {\n name: ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL,\n })\n}\n\n/**\n * Adds a user to the ACL editor.\n * @param user\n * @param userName\n */\nexport async function addUserToAcl(\n user: ReturnType<(typeof userEvent)['setup']>,\n userName: string,\n) {\n const userInput = queryForAddUserCombobox()!\n expect(userInput).toBeInTheDocument()\n await user.clear(userInput)\n await user.type(userInput, userName)\n\n const option = await screen.findByText(new RegExp(`\\\\(@${userName}\\\\)`))\n await user.click(option)\n\n await waitFor(() => expect(option).not.toBeInTheDocument())\n const rows = screen.getAllByRole('row')\n return rows[rows.length - 1]\n}\n\n/**\n * Adds public / authenticated groups to the ACL editor.\n * @param user\n */\nexport async function addPublicToAcl(\n user: ReturnType<(typeof userEvent)['setup']>,\n) {\n const makePublicButton = screen.getByRole('button', {\n name: ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT,\n })\n await user.click(makePublicButton)\n\n let rows: HTMLElement[] = []\n let publicRow: HTMLElement | undefined = undefined\n let authenticatedUsersRow: HTMLElement | undefined = undefined\n await waitFor(() => {\n rows = screen.getAllByRole('row')\n publicRow = queryForRowWithPrincipalName(rows, PUBLIC_GROUP_DISPLAY_TEXT)\n authenticatedUsersRow = queryForRowWithPrincipalName(\n rows,\n AUTHENTICATED_GROUP_DISPLAY_TEXT,\n )\n expect(publicRow).toBeInTheDocument()\n expect(authenticatedUsersRow).toBeInTheDocument()\n })\n\n return {\n publicRow: rows[rows.length - 2],\n authenticatedUsersRow: rows[rows.length - 1],\n }\n}\n"],"mappings":";;;;;AAiBA,SAAgB,EACd,GACA,GACA;CACA,OAAO,EAAK,MAAK,MACR,EAAO,CAAG,EAAE,YAAY,GAAe,EAAE,OAAO,GAAM,CAAC,CAC/D;AACH;AAQA,eAAsB,EACpB,GACA,GACA,GACA;CACA,IAAI;CACJ,IAAI;EACF,MAAM,QAAc;GAElB,AADA,IAAM,EAA6B,GAAM,CAAa,GACtD,OAAO,CAAG,EAAE,kBAAkB;EAChC,CAAC;CACH,SAAS,GAAG;EAEV,MADA,EAAO,MAAM,GACH,MAAM,aAAa,EAAc,oBAAoB,EAAE,OAAO,EAAE,CAAC;CAC7E;CAEA,IAAM,IAAiB,EAAO,CAAI,EAAE,YAAY,UAAU;CAM1D,OALI,IACF,OAAO,CAAc,EAAE,kBAAkB,CAAe,IAExD,EAAO,CAAI,EAAE,UAAU,CAAe,GAEjC;AACT;AAQA,SAAgB,EACd,GACA,GACA,GACA;CACA,OAAO,EAAO,CAAG,EAAE,YAAY,MAAM,KAAK,CAAG,EAAE,kBAC7C,CACF;CACA,IAAM,IAAiB,EAAO,CAAG,EAAE,YAAY,UAAU;CACzD,AAAI,IACF,OAAO,CAAc,EAAE,kBAAkB,CAAe,IAExD,EAAO,CAAG,EAAE,UAAU,CAAe;AAEzC;AAQA,eAAsB,EACpB,GACA,GACA,IAAgB,IAChB;CACA,IAAM,IAAe,EAAO,CAAG,EAAE,UAAU,UAAU,EACnD,MAAM,EACR,CAAC;CAED,AADA,MAAM,EAAK,MAAM,CAAY,GACzB,KACF,MAAM,QAAc;EAElB,AADA,OAAO,CAAY,EAAE,IAAI,kBAAkB,GAC3C,OAAO,CAAG,EAAE,IAAI,kBAAkB;CACpC,CAAC;AAEL;AAQA,eAAsB,EACpB,GACA,GACA,GACA;CACA,IAAM,IAAO,EAAO,CAAG,EAAE,UAAU,UAAU;CAC7C,MAAM,EAAK,MAAM,CAAI;CAErB,IAAM,IAAS,EAAO,UAAU,UAAU,EACxC,MAAM,EACR,CAAC;CAGD,AAFA,MAAM,EAAK,MAAM,CAAM,GAEvB,MAAM,QAAc;EAClB,OAAO,CAAM,EAAE,IAAI,kBAAkB;CACvC,CAAC;AACH;AAEA,SAAgB,IAA0B;CACxC,OAAO,EAAO,YAAY,YAAY,EACpC,MAAM,EACR,CAAC;AACH;AAOA,eAAsB,EACpB,GACA,GACA;CACA,IAAM,IAAY,EAAwB;CAG1C,AAFA,OAAO,CAAS,EAAE,kBAAkB,GACpC,MAAM,EAAK,MAAM,CAAS,GAC1B,MAAM,EAAK,KAAK,GAAW,CAAQ;CAEnC,IAAM,IAAS,MAAM,EAAO,WAAe,OAAO,OAAO,EAAS,IAAI,CAAC;CAGvE,AAFA,MAAM,EAAK,MAAM,CAAM,GAEvB,MAAM,QAAc,OAAO,CAAM,EAAE,IAAI,kBAAkB,CAAC;CAC1D,IAAM,IAAO,EAAO,aAAa,KAAK;CACtC,OAAO,EAAK,EAAK,SAAS;AAC5B;AAMA,eAAsB,EACpB,GACA;CACA,IAAM,IAAmB,EAAO,UAAU,UAAU,EAClD,MAAM,EACR,CAAC;CACD,MAAM,EAAK,MAAM,CAAgB;CAEjC,IAAI,IAAsB,CAAC,GACvB,GACA;CAYJ,OAXA,MAAM,QAAc;EAQlB,AAPA,IAAO,EAAO,aAAa,KAAK,GAChC,IAAY,EAA6B,GAAM,CAAyB,GACxE,IAAwB,EACtB,GACA,CACF,GACA,OAAO,CAAS,EAAE,kBAAkB,GACpC,OAAO,CAAqB,EAAE,kBAAkB;CAClD,CAAC,GAEM;EACL,WAAW,EAAK,EAAK,SAAS;EAC9B,uBAAuB,EAAK,EAAK,SAAS;CAC5C;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AclEditorSkeleton.js","names":[],"sources":["../../../src/components/AclEditor/AclEditorSkeleton.tsx"],"sourcesContent":["import { Skeleton, Stack } from '@mui/material'\nimport React from 'react'\nimport { SkeletonParagraph, SkeletonTable } from '../Skeleton'\n\nexport function AclEditorSkeleton(): React.ReactNode {\n return (\n <Stack\n role={'progressbar'}\n sx={{\n gap: 2,\n }}\n >\n <Skeleton height={50} width={200} />\n <SkeletonParagraph numRows={2} />\n\n <SkeletonTable numCols={2} numRows={4} rowHeight={'30px'} />\n\n <Skeleton height={50} width={100} />\n <SkeletonParagraph numRows={2} />\n </Stack>\n )\n}\n"],"mappings":";;;;;;;AAIA,SAAgB,IAAqC;
|
|
1
|
+
{"version":3,"file":"AclEditorSkeleton.js","names":[],"sources":["../../../src/components/AclEditor/AclEditorSkeleton.tsx"],"sourcesContent":["import { Skeleton, Stack } from '@mui/material'\nimport React from 'react'\nimport { SkeletonParagraph, SkeletonTable } from '../Skeleton'\n\nexport function AclEditorSkeleton(): React.ReactNode {\n return (\n <Stack\n role={'progressbar'}\n sx={{\n gap: 2,\n }}\n >\n <Skeleton height={50} width={200} />\n <SkeletonParagraph numRows={2} />\n\n <SkeletonTable numCols={2} numRows={4} rowHeight={'30px'} />\n\n <Skeleton height={50} width={100} />\n <SkeletonParagraph numRows={2} />\n </Stack>\n )\n}\n"],"mappings":";;;;;;;AAIA,SAAgB,IAAqC;CACnD,OACE,kBAAC,GAAD;EACE,MAAM;EACN,IAAI,EACF,KAAK,EACP;YAJF;GAME,kBAAC,GAAD;IAAU,QAAQ;IAAI,OAAO;GAAM,CAAA;GACnC,kBAAC,GAAD,EAAmB,SAAS,EAAI,CAAA;GAEhC,kBAAC,GAAD;IAAe,SAAS;IAAG,SAAS;IAAG,WAAW;GAAS,CAAA;GAE3D,kBAAC,GAAD;IAAU,QAAQ;IAAI,OAAO;GAAM,CAAA;GACnC,kBAAC,GAAD,EAAmB,SAAS,EAAI,CAAA;EAC3B;;AAEX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionLevelMenu.js","names":[],"sources":["../../../src/components/AclEditor/PermissionLevelMenu.tsx"],"sourcesContent":["import {\n getAccessTypeFromPermissionLevel,\n getPermissionLevelFromAccessType,\n PermissionLevel,\n permissionLevelToLabel,\n} from '@/utils/PermissionLevelToAccessType'\nimport { MenuItem, TextField, Typography } from '@mui/material'\nimport { ACCESS_TYPE } from '@sage-bionetworks/synapse-types'\nimport React from 'react'\n\nexport type PermissionLevelMenuProps = {\n currentAccessType: ACCESS_TYPE[]\n availablePermissionLevels: PermissionLevel[]\n onChange: (accessTypes: ACCESS_TYPE[]) => void\n}\n\nconst CUSTOM_VALUE = 'CUSTOM'\nconst CUSTOM_TEXT = 'Custom'\n\nexport function PermissionLevelMenu(\n props: PermissionLevelMenuProps,\n): React.ReactNode {\n const { currentAccessType, availablePermissionLevels, onChange } = props\n\n const selectedPermissionLevel: PermissionLevel | null =\n getPermissionLevelFromAccessType(currentAccessType)\n\n const isCustomPermissionSelected = selectedPermissionLevel == null\n\n return (\n <TextField\n value={\n isCustomPermissionSelected ? CUSTOM_VALUE : selectedPermissionLevel\n }\n onChange={e => {\n const accessType = getAccessTypeFromPermissionLevel(\n e.target.value as PermissionLevel,\n )\n\n onChange(accessType || currentAccessType)\n }}\n fullWidth\n select\n size=\"small\"\n slotProps={{\n select: {\n renderValue: selected => {\n if (selected == CUSTOM_VALUE) {\n return CUSTOM_TEXT\n }\n return permissionLevelToLabel[selected as PermissionLevel]\n },\n },\n }}\n >\n {Object.values(availablePermissionLevels).map(permissionLevel => {\n return (\n <MenuItem key={permissionLevel} value={permissionLevel}>\n <Typography variant=\"smallText1\" noWrap>\n {permissionLevelToLabel[permissionLevel]}\n </Typography>\n </MenuItem>\n )\n })}\n {isCustomPermissionSelected && (\n <MenuItem value={CUSTOM_VALUE}>\n <Typography variant=\"smallText1\" noWrap>\n {CUSTOM_TEXT}\n </Typography>\n </MenuItem>\n )}\n </TextField>\n )\n}\n"],"mappings":";;;;;AAgBA,IAAM,IAAe,UACf,IAAc;AAEpB,SAAgB,EACd,GACiB;CACjB,IAAM,EAAE,sBAAmB,8BAA2B,gBAAa,GAE7D,IACJ,EAAiC,
|
|
1
|
+
{"version":3,"file":"PermissionLevelMenu.js","names":[],"sources":["../../../src/components/AclEditor/PermissionLevelMenu.tsx"],"sourcesContent":["import {\n getAccessTypeFromPermissionLevel,\n getPermissionLevelFromAccessType,\n PermissionLevel,\n permissionLevelToLabel,\n} from '@/utils/PermissionLevelToAccessType'\nimport { MenuItem, TextField, Typography } from '@mui/material'\nimport { ACCESS_TYPE } from '@sage-bionetworks/synapse-types'\nimport React from 'react'\n\nexport type PermissionLevelMenuProps = {\n currentAccessType: ACCESS_TYPE[]\n availablePermissionLevels: PermissionLevel[]\n onChange: (accessTypes: ACCESS_TYPE[]) => void\n}\n\nconst CUSTOM_VALUE = 'CUSTOM'\nconst CUSTOM_TEXT = 'Custom'\n\nexport function PermissionLevelMenu(\n props: PermissionLevelMenuProps,\n): React.ReactNode {\n const { currentAccessType, availablePermissionLevels, onChange } = props\n\n const selectedPermissionLevel: PermissionLevel | null =\n getPermissionLevelFromAccessType(currentAccessType)\n\n const isCustomPermissionSelected = selectedPermissionLevel == null\n\n return (\n <TextField\n value={\n isCustomPermissionSelected ? CUSTOM_VALUE : selectedPermissionLevel\n }\n onChange={e => {\n const accessType = getAccessTypeFromPermissionLevel(\n e.target.value as PermissionLevel,\n )\n\n onChange(accessType || currentAccessType)\n }}\n fullWidth\n select\n size=\"small\"\n slotProps={{\n select: {\n renderValue: selected => {\n if (selected == CUSTOM_VALUE) {\n return CUSTOM_TEXT\n }\n return permissionLevelToLabel[selected as PermissionLevel]\n },\n },\n }}\n >\n {Object.values(availablePermissionLevels).map(permissionLevel => {\n return (\n <MenuItem key={permissionLevel} value={permissionLevel}>\n <Typography variant=\"smallText1\" noWrap>\n {permissionLevelToLabel[permissionLevel]}\n </Typography>\n </MenuItem>\n )\n })}\n {isCustomPermissionSelected && (\n <MenuItem value={CUSTOM_VALUE}>\n <Typography variant=\"smallText1\" noWrap>\n {CUSTOM_TEXT}\n </Typography>\n </MenuItem>\n )}\n </TextField>\n )\n}\n"],"mappings":";;;;;AAgBA,IAAM,IAAe,UACf,IAAc;AAEpB,SAAgB,EACd,GACiB;CACjB,IAAM,EAAE,sBAAmB,8BAA2B,gBAAa,GAE7D,IACJ,EAAiC,CAAiB,GAE9C,IAA6B,KAA2B;CAE9D,OACE,kBAAC,GAAD;EACE,OACE,IAA6B,IAAe;EAE9C,WAAU,MAAK;GAKb,EAJmB,EACjB,EAAE,OAAO,KAGF,KAAc,CAAiB;EAC1C;EACA,WAAA;EACA,QAAA;EACA,MAAK;EACL,WAAW,EACT,QAAQ,EACN,cAAa,MACP,KAAY,IACP,IAEF,EAAuB,GAElC,EACF;YAvBF,CAyBG,OAAO,OAAO,CAAyB,EAAE,KAAI,MAE1C,kBAAC,GAAD;GAAgC,OAAO;aACrC,kBAAC,GAAD;IAAY,SAAQ;IAAa,QAAA;cAC9B,EAAuB;GACd,CAAA;EACJ,GAJK,CAIL,CAEb,GACA,KACC,kBAAC,GAAD;GAAU,OAAO;aACf,kBAAC,GAAD;IAAY,SAAQ;IAAa,QAAA;cAC9B;GACS,CAAA;EACJ,CAAA,CAEH;;AAEf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReadOnlyPermissionLevel.js","names":[],"sources":["../../../src/components/AclEditor/ReadOnlyPermissionLevel.tsx"],"sourcesContent":["import {\n getPermissionLevelFromAccessType,\n permissionLevelToLabel,\n} from '@/utils/PermissionLevelToAccessType'\nimport { ACCESS_TYPE } from '@sage-bionetworks/synapse-types'\nimport React from 'react'\n\nexport type ReadOnlyPermissionLevelProps = {\n accessType: ACCESS_TYPE[]\n}\n\nexport function ReadOnlyPermissionLevel(\n props: ReadOnlyPermissionLevelProps,\n): React.ReactNode {\n const { accessType } = props\n\n return (\n permissionLevelToLabel[getPermissionLevelFromAccessType(accessType)] ||\n 'Custom'\n )\n}\n"],"mappings":";;AAWA,SAAgB,EACd,GACiB;CACjB,IAAM,EAAE,kBAAe;
|
|
1
|
+
{"version":3,"file":"ReadOnlyPermissionLevel.js","names":[],"sources":["../../../src/components/AclEditor/ReadOnlyPermissionLevel.tsx"],"sourcesContent":["import {\n getPermissionLevelFromAccessType,\n permissionLevelToLabel,\n} from '@/utils/PermissionLevelToAccessType'\nimport { ACCESS_TYPE } from '@sage-bionetworks/synapse-types'\nimport React from 'react'\n\nexport type ReadOnlyPermissionLevelProps = {\n accessType: ACCESS_TYPE[]\n}\n\nexport function ReadOnlyPermissionLevel(\n props: ReadOnlyPermissionLevelProps,\n): React.ReactNode {\n const { accessType } = props\n\n return (\n permissionLevelToLabel[getPermissionLevelFromAccessType(accessType)] ||\n 'Custom'\n )\n}\n"],"mappings":";;AAWA,SAAgB,EACd,GACiB;CACjB,IAAM,EAAE,kBAAe;CAEvB,OACE,EAAuB,EAAiC,CAAU,MAClE;AAEJ"}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { ACCESS_TYPE as e } from "@sage-bionetworks/synapse-types";
|
|
2
2
|
//#region src/components/AclEditor/ResourceAccessAndUserGroupHeader.ts
|
|
3
3
|
function t(t, n, r, i) {
|
|
4
|
-
let a =
|
|
5
|
-
|
|
6
|
-
}({}), o = t.resourceAccess.accessType.includes(e.CHANGE_PERMISSIONS), s = n.resourceAccess.accessType.includes(e.CHANGE_PERMISSIONS);
|
|
7
|
-
return o && !s ? a.A_FIRST : !o && s ? a.B_FIRST : r && String(t.resourceAccess.principalId) === r && String(n.resourceAccess.principalId) !== r ? a.A_FIRST : r && String(t.resourceAccess.principalId) !== r && String(n.resourceAccess.principalId) === r ? a.B_FIRST : i && String(t.resourceAccess.principalId) === i && String(n.resourceAccess.principalId) !== i ? a.A_FIRST : i && String(t.resourceAccess.principalId) !== i && String(n.resourceAccess.principalId) === i ? a.B_FIRST : t.userGroupHeader.userName.localeCompare(n.userGroupHeader.userName);
|
|
4
|
+
let a = t.resourceAccess.accessType.includes(e.CHANGE_PERMISSIONS), o = n.resourceAccess.accessType.includes(e.CHANGE_PERMISSIONS);
|
|
5
|
+
return a && !o ? -1 : !a && o ? 1 : r && String(t.resourceAccess.principalId) === r && String(n.resourceAccess.principalId) !== r ? -1 : r && String(t.resourceAccess.principalId) !== r && String(n.resourceAccess.principalId) === r ? 1 : i && String(t.resourceAccess.principalId) === i && String(n.resourceAccess.principalId) !== i ? -1 : i && String(t.resourceAccess.principalId) !== i && String(n.resourceAccess.principalId) === i ? 1 : t.userGroupHeader.userName.localeCompare(n.userGroupHeader.userName);
|
|
8
6
|
}
|
|
9
7
|
//#endregion
|
|
10
8
|
export { t as compareResourceAccessAndUserGroupHeader };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceAccessAndUserGroupHeader.js","names":[],"sources":["../../../src/components/AclEditor/ResourceAccessAndUserGroupHeader.ts"],"sourcesContent":["import {\n ACCESS_TYPE,\n ResourceAccess,\n UserGroupHeader,\n} from '@sage-bionetworks/synapse-types'\n\n/**\n * Utility type to combine a ResourceAccess and the associated UserGroupHeader for that principalId.\n * This allows us to easily sort the ResourceAccess list by the name of the user or team.\n */\nexport type ResourceAccessAndUserGroupHeader = {\n resourceAccess: ResourceAccess\n userGroupHeader: UserGroupHeader\n}\n\n/**\n * Comparator for ResourceAccess list. Sorts by the following criteria:\n * 1. Users or teams with the CHANGE_PERMISSIONS permission should be at the top, sorted alphabetically by username\n * 2. The authenticated group (all users signed in to Synapse)\n * 3. The public group (all users signed in to Synapse, and 'anonymous')\n * 4. All other users or teams, sorted alphabetically by username\n */\nexport function compareResourceAccessAndUserGroupHeader(\n a: ResourceAccessAndUserGroupHeader,\n b: ResourceAccessAndUserGroupHeader,\n authenticatedPrincipalId?: string,\n publicPrincipalId?: string,\n): number {\n enum CompareResult {\n A_FIRST = -1,\n B_FIRST = 1,\n }\n\n const hasChangePermissionA = a.resourceAccess.accessType.includes(\n ACCESS_TYPE.CHANGE_PERMISSIONS,\n )\n const hasChangePermissionB = b.resourceAccess.accessType.includes(\n ACCESS_TYPE.CHANGE_PERMISSIONS,\n )\n\n if (hasChangePermissionA && !hasChangePermissionB)\n return CompareResult.A_FIRST\n if (!hasChangePermissionA && hasChangePermissionB)\n return CompareResult.B_FIRST\n\n // Both have CHANGE_PERMISSIONS or neither have it, proceed with other checks\n\n // AUTHENTICATED group always appears before PUBLIC group\n if (\n authenticatedPrincipalId &&\n String(a.resourceAccess.principalId) === authenticatedPrincipalId &&\n String(b.resourceAccess.principalId) !== authenticatedPrincipalId\n )\n return CompareResult.A_FIRST\n if (\n authenticatedPrincipalId &&\n String(a.resourceAccess.principalId) !== authenticatedPrincipalId &&\n String(b.resourceAccess.principalId) === authenticatedPrincipalId\n )\n return CompareResult.B_FIRST\n\n // PUBLIC group always appears before other users / teams\n if (\n publicPrincipalId &&\n String(a.resourceAccess.principalId) === publicPrincipalId &&\n String(b.resourceAccess.principalId) !== publicPrincipalId\n )\n return CompareResult.A_FIRST\n if (\n publicPrincipalId &&\n String(a.resourceAccess.principalId) !== publicPrincipalId &&\n String(b.resourceAccess.principalId) === publicPrincipalId\n )\n return CompareResult.B_FIRST\n\n // If none of the other cases apply, sort alphabetically by userName\n return a.userGroupHeader.userName.localeCompare(b.userGroupHeader.userName)\n}\n"],"mappings":";;AAsBA,SAAgB,EACd,GACA,GACA,GACA,GACQ;
|
|
1
|
+
{"version":3,"file":"ResourceAccessAndUserGroupHeader.js","names":[],"sources":["../../../src/components/AclEditor/ResourceAccessAndUserGroupHeader.ts"],"sourcesContent":["import {\n ACCESS_TYPE,\n ResourceAccess,\n UserGroupHeader,\n} from '@sage-bionetworks/synapse-types'\n\n/**\n * Utility type to combine a ResourceAccess and the associated UserGroupHeader for that principalId.\n * This allows us to easily sort the ResourceAccess list by the name of the user or team.\n */\nexport type ResourceAccessAndUserGroupHeader = {\n resourceAccess: ResourceAccess\n userGroupHeader: UserGroupHeader\n}\n\n/**\n * Comparator for ResourceAccess list. Sorts by the following criteria:\n * 1. Users or teams with the CHANGE_PERMISSIONS permission should be at the top, sorted alphabetically by username\n * 2. The authenticated group (all users signed in to Synapse)\n * 3. The public group (all users signed in to Synapse, and 'anonymous')\n * 4. All other users or teams, sorted alphabetically by username\n */\nexport function compareResourceAccessAndUserGroupHeader(\n a: ResourceAccessAndUserGroupHeader,\n b: ResourceAccessAndUserGroupHeader,\n authenticatedPrincipalId?: string,\n publicPrincipalId?: string,\n): number {\n enum CompareResult {\n A_FIRST = -1,\n B_FIRST = 1,\n }\n\n const hasChangePermissionA = a.resourceAccess.accessType.includes(\n ACCESS_TYPE.CHANGE_PERMISSIONS,\n )\n const hasChangePermissionB = b.resourceAccess.accessType.includes(\n ACCESS_TYPE.CHANGE_PERMISSIONS,\n )\n\n if (hasChangePermissionA && !hasChangePermissionB)\n return CompareResult.A_FIRST\n if (!hasChangePermissionA && hasChangePermissionB)\n return CompareResult.B_FIRST\n\n // Both have CHANGE_PERMISSIONS or neither have it, proceed with other checks\n\n // AUTHENTICATED group always appears before PUBLIC group\n if (\n authenticatedPrincipalId &&\n String(a.resourceAccess.principalId) === authenticatedPrincipalId &&\n String(b.resourceAccess.principalId) !== authenticatedPrincipalId\n )\n return CompareResult.A_FIRST\n if (\n authenticatedPrincipalId &&\n String(a.resourceAccess.principalId) !== authenticatedPrincipalId &&\n String(b.resourceAccess.principalId) === authenticatedPrincipalId\n )\n return CompareResult.B_FIRST\n\n // PUBLIC group always appears before other users / teams\n if (\n publicPrincipalId &&\n String(a.resourceAccess.principalId) === publicPrincipalId &&\n String(b.resourceAccess.principalId) !== publicPrincipalId\n )\n return CompareResult.A_FIRST\n if (\n publicPrincipalId &&\n String(a.resourceAccess.principalId) !== publicPrincipalId &&\n String(b.resourceAccess.principalId) === publicPrincipalId\n )\n return CompareResult.B_FIRST\n\n // If none of the other cases apply, sort alphabetically by userName\n return a.userGroupHeader.userName.localeCompare(b.userGroupHeader.userName)\n}\n"],"mappings":";;AAsBA,SAAgB,EACd,GACA,GACA,GACA,GACQ;CAMR,IAAM,IAAuB,EAAE,eAAe,WAAW,SACvD,EAAY,kBACd,GACM,IAAuB,EAAE,eAAe,WAAW,SACvD,EAAY,kBACd;CAsCA,OApCI,KAAwB,CAAC,IAC3B,KACE,CAAC,KAAwB,IAC3B,IAMA,KACA,OAAO,EAAE,eAAe,WAAW,MAAM,KACzC,OAAO,EAAE,eAAe,WAAW,MAAM,IAEzC,KAEA,KACA,OAAO,EAAE,eAAe,WAAW,MAAM,KACzC,OAAO,EAAE,eAAe,WAAW,MAAM,IAEzC,IAIA,KACA,OAAO,EAAE,eAAe,WAAW,MAAM,KACzC,OAAO,EAAE,eAAe,WAAW,MAAM,IAEzC,KAEA,KACA,OAAO,EAAE,eAAe,WAAW,MAAM,KACzC,OAAO,EAAE,eAAe,WAAW,MAAM,IAEzC,IAGK,EAAE,gBAAgB,SAAS,cAAc,EAAE,gBAAgB,QAAQ;AAC5E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceAccessItem.js","names":[],"sources":["../../../src/components/AclEditor/ResourceAccessItem.tsx"],"sourcesContent":["import { PermissionLevel } from '@/utils/PermissionLevelToAccessType'\nimport { Stack, Typography } from '@mui/material'\nimport { ACCESS_TYPE, ResourceAccess } from '@sage-bionetworks/synapse-types'\nimport React from 'react'\nimport { IconSvgButton } from '../IconSvgButton'\nimport UserOrTeamBadge from '../UserOrTeamBadge'\nimport { PermissionLevelMenu } from './PermissionLevelMenu'\nimport { ReadOnlyPermissionLevel } from './ReadOnlyPermissionLevel'\n\nexport const REMOVE_BUTTON_LABEL = 'Remove from AR Permissions'\n\ntype ResourceAccessItemProps = {\n canChangePermission: boolean\n showDeleteButton: boolean\n resourceAccess: ResourceAccess\n availablePermissionLevels: PermissionLevel[]\n displayedPermissionLevelOverride?: string\n onChange: (accessType: ACCESS_TYPE[]) => void\n onRemove: () => void\n}\n\nexport function ResourceAccessItem(\n props: ResourceAccessItemProps,\n): React.ReactNode {\n const {\n resourceAccess,\n availablePermissionLevels,\n canChangePermission,\n showDeleteButton,\n onChange,\n onRemove,\n displayedPermissionLevelOverride,\n } = props\n\n return (\n <>\n <Stack\n direction=\"row\"\n role=\"row\"\n sx={{\n justifyContent: 'space-between',\n alignItems: 'center',\n gap: '10px',\n py: '6px',\n }}\n >\n <Typography\n sx={{\n fontSize: '16px',\n lineHeight: '20px',\n }}\n >\n <UserOrTeamBadge\n principalId={resourceAccess.principalId}\n openLinkInNewTab={true}\n />\n </Typography>\n <Stack\n direction=\"row\"\n sx={{\n gap: '10px',\n alignItems: 'center',\n width: '200px',\n flexShrink: 0,\n }}\n >\n {canChangePermission ? (\n <PermissionLevelMenu\n currentAccessType={resourceAccess.accessType}\n availablePermissionLevels={availablePermissionLevels}\n onChange={onChange}\n />\n ) : (\n <Typography\n variant={'smallText1'}\n sx={{\n flexGrow: 1,\n }}\n >\n {displayedPermissionLevelOverride ?? (\n <ReadOnlyPermissionLevel\n accessType={resourceAccess.accessType}\n />\n )}\n </Typography>\n )}\n {showDeleteButton && (\n <IconSvgButton\n aria-label={REMOVE_BUTTON_LABEL}\n onClick={() => onRemove()}\n icon=\"delete\"\n sx={{\n '&:hover': {\n color: 'error.main',\n },\n }}\n />\n )}\n </Stack>\n </Stack>\n </>\n )\n}\n"],"mappings":";;;;;;;;AASA,IAAa,IAAsB;AAYnC,SAAgB,EACd,GACiB;CACjB,IAAM,EACJ,mBACA,8BACA,wBACA,qBACA,aACA,aACA,wCACE;
|
|
1
|
+
{"version":3,"file":"ResourceAccessItem.js","names":[],"sources":["../../../src/components/AclEditor/ResourceAccessItem.tsx"],"sourcesContent":["import { PermissionLevel } from '@/utils/PermissionLevelToAccessType'\nimport { Stack, Typography } from '@mui/material'\nimport { ACCESS_TYPE, ResourceAccess } from '@sage-bionetworks/synapse-types'\nimport React from 'react'\nimport { IconSvgButton } from '../IconSvgButton'\nimport UserOrTeamBadge from '../UserOrTeamBadge'\nimport { PermissionLevelMenu } from './PermissionLevelMenu'\nimport { ReadOnlyPermissionLevel } from './ReadOnlyPermissionLevel'\n\nexport const REMOVE_BUTTON_LABEL = 'Remove from AR Permissions'\n\ntype ResourceAccessItemProps = {\n canChangePermission: boolean\n showDeleteButton: boolean\n resourceAccess: ResourceAccess\n availablePermissionLevels: PermissionLevel[]\n displayedPermissionLevelOverride?: string\n onChange: (accessType: ACCESS_TYPE[]) => void\n onRemove: () => void\n}\n\nexport function ResourceAccessItem(\n props: ResourceAccessItemProps,\n): React.ReactNode {\n const {\n resourceAccess,\n availablePermissionLevels,\n canChangePermission,\n showDeleteButton,\n onChange,\n onRemove,\n displayedPermissionLevelOverride,\n } = props\n\n return (\n <>\n <Stack\n direction=\"row\"\n role=\"row\"\n sx={{\n justifyContent: 'space-between',\n alignItems: 'center',\n gap: '10px',\n py: '6px',\n }}\n >\n <Typography\n sx={{\n fontSize: '16px',\n lineHeight: '20px',\n }}\n >\n <UserOrTeamBadge\n principalId={resourceAccess.principalId}\n openLinkInNewTab={true}\n />\n </Typography>\n <Stack\n direction=\"row\"\n sx={{\n gap: '10px',\n alignItems: 'center',\n width: '200px',\n flexShrink: 0,\n }}\n >\n {canChangePermission ? (\n <PermissionLevelMenu\n currentAccessType={resourceAccess.accessType}\n availablePermissionLevels={availablePermissionLevels}\n onChange={onChange}\n />\n ) : (\n <Typography\n variant={'smallText1'}\n sx={{\n flexGrow: 1,\n }}\n >\n {displayedPermissionLevelOverride ?? (\n <ReadOnlyPermissionLevel\n accessType={resourceAccess.accessType}\n />\n )}\n </Typography>\n )}\n {showDeleteButton && (\n <IconSvgButton\n aria-label={REMOVE_BUTTON_LABEL}\n onClick={() => onRemove()}\n icon=\"delete\"\n sx={{\n '&:hover': {\n color: 'error.main',\n },\n }}\n />\n )}\n </Stack>\n </Stack>\n </>\n )\n}\n"],"mappings":";;;;;;;;AASA,IAAa,IAAsB;AAYnC,SAAgB,EACd,GACiB;CACjB,IAAM,EACJ,mBACA,8BACA,wBACA,qBACA,aACA,aACA,wCACE;CAEJ,OACE,kBAAA,GAAA,EAAA,UACE,kBAAC,GAAD;EACE,WAAU;EACV,MAAK;EACL,IAAI;GACF,gBAAgB;GAChB,YAAY;GACZ,KAAK;GACL,IAAI;EACN;YARF,CAUE,kBAAC,GAAD;GACE,IAAI;IACF,UAAU;IACV,YAAY;GACd;aAEA,kBAAC,GAAD;IACE,aAAa,EAAe;IAC5B,kBAAkB;GACnB,CAAA;EACS,CAAA,GACZ,kBAAC,GAAD;GACE,WAAU;GACV,IAAI;IACF,KAAK;IACL,YAAY;IACZ,OAAO;IACP,YAAY;GACd;aAPF,CASG,IACC,kBAAC,GAAD;IACE,mBAAmB,EAAe;IACP;IACjB;GACX,CAAA,IAED,kBAAC,GAAD;IACE,SAAS;IACT,IAAI,EACF,UAAU,EACZ;cAEC,KACC,kBAAC,GAAD,EACE,YAAY,EAAe,WAC5B,CAAA;GAEO,CAAA,GAEb,KACC,kBAAC,GAAD;IACE,cAAA;IACA,eAAe,EAAS;IACxB,MAAK;IACL,IAAI,EACF,WAAW,EACT,OAAO,aACT,EACF;GACD,CAAA,CAEE;IACF;IACP,CAAA;AAEN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSortResourceAccessList.js","names":[],"sources":["../../../src/components/AclEditor/useSortResourceAccessList.ts"],"sourcesContent":["import { useGetUserGroupHeaders } from '@/synapse-queries'\nimport { useGetRealmPrincipals } from '@/synapse-queries/realm/useRealmPrincipals'\nimport { ResourceAccess } from '@sage-bionetworks/synapse-types'\nimport { useEffect, useMemo } from 'react'\nimport {\n compareResourceAccessAndUserGroupHeader,\n ResourceAccessAndUserGroupHeader,\n} from './ResourceAccessAndUserGroupHeader'\n\n/**\n * Custom hook to sort a list of ResourceAccess objects by the permissions and name of the user or team.\n * @param resourceAccessList\n */\nexport default function useSortResourceAccessList(\n resourceAccessList: ResourceAccess[],\n) {\n const { data } = useGetRealmPrincipals()\n const realmPrincipals = data || {}\n const {\n authenticatedUsers: authenticatedUsersId,\n publicGroup: publicGroupId,\n } = realmPrincipals\n const principalIdsOnResourceAccessList = useMemo(\n () => resourceAccessList.map(ra => ra.principalId),\n [resourceAccessList],\n )\n\n const {\n data: userGroupHeadersOnResourceAccessList,\n isLoading,\n error,\n } = useGetUserGroupHeaders(principalIdsOnResourceAccessList.map(String), {\n enabled: principalIdsOnResourceAccessList.length > 0,\n })\n\n useEffect(() => {\n if (error) {\n console.error('Error fetching user group headers: ', error)\n }\n }, [error])\n\n const sortedResourceAccessList = useMemo(() => {\n if (!userGroupHeadersOnResourceAccessList) {\n return null\n }\n\n const joinedWithUserGroupHeaders = resourceAccessList.map(\n (ral): ResourceAccessAndUserGroupHeader => ({\n resourceAccess: ral,\n userGroupHeader: userGroupHeadersOnResourceAccessList.find(\n ugh => String(ugh.ownerId) === String(ral.principalId),\n )!,\n }),\n )\n\n const allEntriesHaveUserGroupHeader = joinedWithUserGroupHeaders.every(\n obj => Boolean(obj.userGroupHeader),\n )\n\n if (!allEntriesHaveUserGroupHeader) {\n console.warn(\n 'Some ACL entries do not have a corresponding UserGroupHeader. The ResourceAccess list will not be sorted. Missing entries: ',\n joinedWithUserGroupHeaders.filter(obj => !obj.userGroupHeader),\n )\n return null\n }\n\n return joinedWithUserGroupHeaders\n .toSorted((a, b) =>\n compareResourceAccessAndUserGroupHeader(\n a,\n b,\n authenticatedUsersId,\n publicGroupId,\n ),\n )\n .map(obj => obj.resourceAccess)\n }, [\n resourceAccessList,\n userGroupHeadersOnResourceAccessList,\n authenticatedUsersId,\n publicGroupId,\n ])\n\n return {\n sortedResourceAccessList,\n isLoading,\n }\n}\n"],"mappings":";;;;;;AAaA,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,YAAS,
|
|
1
|
+
{"version":3,"file":"useSortResourceAccessList.js","names":[],"sources":["../../../src/components/AclEditor/useSortResourceAccessList.ts"],"sourcesContent":["import { useGetUserGroupHeaders } from '@/synapse-queries'\nimport { useGetRealmPrincipals } from '@/synapse-queries/realm/useRealmPrincipals'\nimport { ResourceAccess } from '@sage-bionetworks/synapse-types'\nimport { useEffect, useMemo } from 'react'\nimport {\n compareResourceAccessAndUserGroupHeader,\n ResourceAccessAndUserGroupHeader,\n} from './ResourceAccessAndUserGroupHeader'\n\n/**\n * Custom hook to sort a list of ResourceAccess objects by the permissions and name of the user or team.\n * @param resourceAccessList\n */\nexport default function useSortResourceAccessList(\n resourceAccessList: ResourceAccess[],\n) {\n const { data } = useGetRealmPrincipals()\n const realmPrincipals = data || {}\n const {\n authenticatedUsers: authenticatedUsersId,\n publicGroup: publicGroupId,\n } = realmPrincipals\n const principalIdsOnResourceAccessList = useMemo(\n () => resourceAccessList.map(ra => ra.principalId),\n [resourceAccessList],\n )\n\n const {\n data: userGroupHeadersOnResourceAccessList,\n isLoading,\n error,\n } = useGetUserGroupHeaders(principalIdsOnResourceAccessList.map(String), {\n enabled: principalIdsOnResourceAccessList.length > 0,\n })\n\n useEffect(() => {\n if (error) {\n console.error('Error fetching user group headers: ', error)\n }\n }, [error])\n\n const sortedResourceAccessList = useMemo(() => {\n if (!userGroupHeadersOnResourceAccessList) {\n return null\n }\n\n const joinedWithUserGroupHeaders = resourceAccessList.map(\n (ral): ResourceAccessAndUserGroupHeader => ({\n resourceAccess: ral,\n userGroupHeader: userGroupHeadersOnResourceAccessList.find(\n ugh => String(ugh.ownerId) === String(ral.principalId),\n )!,\n }),\n )\n\n const allEntriesHaveUserGroupHeader = joinedWithUserGroupHeaders.every(\n obj => Boolean(obj.userGroupHeader),\n )\n\n if (!allEntriesHaveUserGroupHeader) {\n console.warn(\n 'Some ACL entries do not have a corresponding UserGroupHeader. The ResourceAccess list will not be sorted. Missing entries: ',\n joinedWithUserGroupHeaders.filter(obj => !obj.userGroupHeader),\n )\n return null\n }\n\n return joinedWithUserGroupHeaders\n .toSorted((a, b) =>\n compareResourceAccessAndUserGroupHeader(\n a,\n b,\n authenticatedUsersId,\n publicGroupId,\n ),\n )\n .map(obj => obj.resourceAccess)\n }, [\n resourceAccessList,\n userGroupHeadersOnResourceAccessList,\n authenticatedUsersId,\n publicGroupId,\n ])\n\n return {\n sortedResourceAccessList,\n isLoading,\n }\n}\n"],"mappings":";;;;;;AAaA,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,YAAS,EAAsB,GAEjC,EACJ,oBAAoB,GACpB,aAAa,MAHS,KAAQ,CAAC,GAK3B,IAAmC,QACjC,EAAmB,KAAI,MAAM,EAAG,WAAW,GACjD,CAAC,CAAkB,CACrB,GAEM,EACJ,MAAM,GACN,cACA,aACE,EAAuB,EAAiC,IAAI,MAAM,GAAG,EACvE,SAAS,EAAiC,SAAS,EACrD,CAAC;CAmDD,OAjDA,QAAgB;EACd,AAAI,KACF,QAAQ,MAAM,uCAAuC,CAAK;CAE9D,GAAG,CAAC,CAAK,CAAC,GA6CH;EACL,0BA5C+B,QAAc;GAC7C,IAAI,CAAC,GACH,OAAO;GAGT,IAAM,IAA6B,EAAmB,KACnD,OAA2C;IAC1C,gBAAgB;IAChB,iBAAiB,EAAqC,MACpD,MAAO,OAAO,EAAI,OAAO,MAAM,OAAO,EAAI,WAAW,CACvD;GACF,EACF;GAcA,OAZsC,EAA2B,OAC/D,MAAO,EAAQ,EAAI,eAGhB,IAQE,EACJ,UAAU,GAAG,MACZ,EACE,GACA,GACA,GACA,CACF,CACF,EACC,KAAI,MAAO,EAAI,cAAc,KAhB9B,QAAQ,KACN,+HACA,EAA2B,QAAO,MAAO,CAAC,EAAI,eAAe,CAC/D,GACO;EAaX,GAAG;GACD;GACA;GACA;GACA;EACF,CAGE;EACA;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUpdateAcl.js","names":[],"sources":["../../../src/components/AclEditor/useUpdateAcl.ts"],"sourcesContent":["import { useGlobalIsEditingContext } from '@/utils/context/GlobalIsEditingContext'\nimport { ACCESS_TYPE, ResourceAccess } from '@sage-bionetworks/synapse-types'\nimport {\n Dispatch,\n SetStateAction,\n useCallback,\n useEffect,\n useState,\n} from 'react'\nimport { noop } from 'lodash-es'\nimport useSortResourceAccessList from './useSortResourceAccessList'\n\nexport const PRINCIPAL_ALREADY_ADDED_ERROR_MESSAGE =\n 'User or team already has permissions.'\n\nexport type UseUpdateAclOptions = {\n initialResourceAccessList?: ResourceAccess[]\n onChange?: (resourceAccessList: ResourceAccess[]) => void\n onError?: (e: string) => void\n}\n\ntype UseUpdateAclReturn = {\n /** The ResourceAccess list that is being updated. It will automatically be sorted unless the `add`, `update` or `remove` functions are called. */\n resourceAccessList: ResourceAccess[]\n /** Set the ResourceAccess list. Does not prevent re-sorting */\n setResourceAccessList: Dispatch<SetStateAction<ResourceAccess[]>>\n /** Adds a principal to the list with the provided accessTypes */\n addResourceAccessItem: (\n principalId: number,\n accessTypes: ACCESS_TYPE[],\n ) => void\n /** Updates the principal in the list with the provided accessTypes */\n updateResourceAccessItem: (\n principalId: number,\n accessType: ACCESS_TYPE[],\n ) => void\n /** Removes the principal from the list */\n removeResourceAccessItem: (principalId: number) => void\n /** Resets the dirty state of the form, which will immediately trigger sorting the resourceAccessList */\n resetDirtyState: () => void\n}\n\nconst EMPTY_ARRAY: ResourceAccess[] = []\n\nexport default function useUpdateAcl(\n options: UseUpdateAclOptions = {},\n): UseUpdateAclReturn {\n const {\n initialResourceAccessList = EMPTY_ARRAY,\n onChange = noop,\n onError = noop,\n } = options\n const [isDirty, setIsDirty] = useState(false)\n const { setIsEditing } = useGlobalIsEditingContext()\n\n // When the form is dirty, set the global editing state to true\n useEffect(() => {\n setIsEditing(isDirty)\n return () => {\n setIsEditing(false)\n }\n }, [isDirty, setIsEditing])\n\n const [resourceAccessList, setResourceAccessList] = useState<\n ResourceAccess[]\n >(initialResourceAccessList)\n const [hasSorted, setHasSorted] = useState(false)\n\n // While the form has not been edited, sort the resourceAccessList\n const { sortedResourceAccessList, isLoading: isLoadingSortedList } =\n useSortResourceAccessList(resourceAccessList)\n useEffect(() => {\n if (\n !isDirty &&\n !isLoadingSortedList &&\n !hasSorted &&\n sortedResourceAccessList != null\n ) {\n setResourceAccessList(sortedResourceAccessList)\n // `useSortResourceAccessList` will return a new array every time `resourceAccessList` changes, so we need to\n // track if we've already sorted to prevent an infinite loop\n setHasSorted(true)\n }\n }, [hasSorted, isDirty, isLoadingSortedList, sortedResourceAccessList])\n\n useEffect(() => {\n onChange(resourceAccessList)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [resourceAccessList])\n\n const addResourceAccessItem = useCallback(\n (principalId: number, accessTypes: ACCESS_TYPE[]) => {\n setIsDirty(true)\n if (principalId) {\n setResourceAccessList(resourceAccessList => {\n const alreadyReviewer = resourceAccessList.some(\n resourceAccess => resourceAccess.principalId === principalId,\n )\n if (alreadyReviewer) {\n onError(PRINCIPAL_ALREADY_ADDED_ERROR_MESSAGE)\n } else {\n const newResourceAccess: ResourceAccess = {\n principalId: principalId,\n accessType: accessTypes,\n }\n return [...resourceAccessList, newResourceAccess]\n }\n return resourceAccessList\n })\n }\n },\n [onError],\n )\n\n const updateResourceAccessItem = useCallback(\n (principalId: number, accessType: ACCESS_TYPE[]) => {\n setIsDirty(true)\n setResourceAccessList(resourceAccessList =>\n resourceAccessList.map(resourceAccess => {\n return resourceAccess.principalId === principalId\n ? { ...resourceAccess, accessType }\n : resourceAccess\n }),\n )\n },\n [],\n )\n\n const removeResourceAccessItem = useCallback((principalId: number) => {\n setIsDirty(true)\n setResourceAccessList(resourceAccessList =>\n resourceAccessList.filter(\n raListItem => raListItem.principalId !== principalId,\n ),\n )\n }, [])\n\n const resetDirtyState = useCallback(() => {\n setIsDirty(false)\n }, [])\n\n return {\n resourceAccessList,\n setResourceAccessList,\n addResourceAccessItem,\n updateResourceAccessItem,\n removeResourceAccessItem,\n resetDirtyState,\n }\n}\n"],"mappings":";;;;;AAYA,IAAa,IACX,yCA6BI,IAAgC,
|
|
1
|
+
{"version":3,"file":"useUpdateAcl.js","names":[],"sources":["../../../src/components/AclEditor/useUpdateAcl.ts"],"sourcesContent":["import { useGlobalIsEditingContext } from '@/utils/context/GlobalIsEditingContext'\nimport { ACCESS_TYPE, ResourceAccess } from '@sage-bionetworks/synapse-types'\nimport {\n Dispatch,\n SetStateAction,\n useCallback,\n useEffect,\n useState,\n} from 'react'\nimport { noop } from 'lodash-es'\nimport useSortResourceAccessList from './useSortResourceAccessList'\n\nexport const PRINCIPAL_ALREADY_ADDED_ERROR_MESSAGE =\n 'User or team already has permissions.'\n\nexport type UseUpdateAclOptions = {\n initialResourceAccessList?: ResourceAccess[]\n onChange?: (resourceAccessList: ResourceAccess[]) => void\n onError?: (e: string) => void\n}\n\ntype UseUpdateAclReturn = {\n /** The ResourceAccess list that is being updated. It will automatically be sorted unless the `add`, `update` or `remove` functions are called. */\n resourceAccessList: ResourceAccess[]\n /** Set the ResourceAccess list. Does not prevent re-sorting */\n setResourceAccessList: Dispatch<SetStateAction<ResourceAccess[]>>\n /** Adds a principal to the list with the provided accessTypes */\n addResourceAccessItem: (\n principalId: number,\n accessTypes: ACCESS_TYPE[],\n ) => void\n /** Updates the principal in the list with the provided accessTypes */\n updateResourceAccessItem: (\n principalId: number,\n accessType: ACCESS_TYPE[],\n ) => void\n /** Removes the principal from the list */\n removeResourceAccessItem: (principalId: number) => void\n /** Resets the dirty state of the form, which will immediately trigger sorting the resourceAccessList */\n resetDirtyState: () => void\n}\n\nconst EMPTY_ARRAY: ResourceAccess[] = []\n\nexport default function useUpdateAcl(\n options: UseUpdateAclOptions = {},\n): UseUpdateAclReturn {\n const {\n initialResourceAccessList = EMPTY_ARRAY,\n onChange = noop,\n onError = noop,\n } = options\n const [isDirty, setIsDirty] = useState(false)\n const { setIsEditing } = useGlobalIsEditingContext()\n\n // When the form is dirty, set the global editing state to true\n useEffect(() => {\n setIsEditing(isDirty)\n return () => {\n setIsEditing(false)\n }\n }, [isDirty, setIsEditing])\n\n const [resourceAccessList, setResourceAccessList] = useState<\n ResourceAccess[]\n >(initialResourceAccessList)\n const [hasSorted, setHasSorted] = useState(false)\n\n // While the form has not been edited, sort the resourceAccessList\n const { sortedResourceAccessList, isLoading: isLoadingSortedList } =\n useSortResourceAccessList(resourceAccessList)\n useEffect(() => {\n if (\n !isDirty &&\n !isLoadingSortedList &&\n !hasSorted &&\n sortedResourceAccessList != null\n ) {\n setResourceAccessList(sortedResourceAccessList)\n // `useSortResourceAccessList` will return a new array every time `resourceAccessList` changes, so we need to\n // track if we've already sorted to prevent an infinite loop\n setHasSorted(true)\n }\n }, [hasSorted, isDirty, isLoadingSortedList, sortedResourceAccessList])\n\n useEffect(() => {\n onChange(resourceAccessList)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [resourceAccessList])\n\n const addResourceAccessItem = useCallback(\n (principalId: number, accessTypes: ACCESS_TYPE[]) => {\n setIsDirty(true)\n if (principalId) {\n setResourceAccessList(resourceAccessList => {\n const alreadyReviewer = resourceAccessList.some(\n resourceAccess => resourceAccess.principalId === principalId,\n )\n if (alreadyReviewer) {\n onError(PRINCIPAL_ALREADY_ADDED_ERROR_MESSAGE)\n } else {\n const newResourceAccess: ResourceAccess = {\n principalId: principalId,\n accessType: accessTypes,\n }\n return [...resourceAccessList, newResourceAccess]\n }\n return resourceAccessList\n })\n }\n },\n [onError],\n )\n\n const updateResourceAccessItem = useCallback(\n (principalId: number, accessType: ACCESS_TYPE[]) => {\n setIsDirty(true)\n setResourceAccessList(resourceAccessList =>\n resourceAccessList.map(resourceAccess => {\n return resourceAccess.principalId === principalId\n ? { ...resourceAccess, accessType }\n : resourceAccess\n }),\n )\n },\n [],\n )\n\n const removeResourceAccessItem = useCallback((principalId: number) => {\n setIsDirty(true)\n setResourceAccessList(resourceAccessList =>\n resourceAccessList.filter(\n raListItem => raListItem.principalId !== principalId,\n ),\n )\n }, [])\n\n const resetDirtyState = useCallback(() => {\n setIsDirty(false)\n }, [])\n\n return {\n resourceAccessList,\n setResourceAccessList,\n addResourceAccessItem,\n updateResourceAccessItem,\n removeResourceAccessItem,\n resetDirtyState,\n }\n}\n"],"mappings":";;;;;AAYA,IAAa,IACX,yCA6BI,IAAgC,CAAC;AAEvC,SAAwB,EACtB,IAA+B,CAAC,GACZ;CACpB,IAAM,EACJ,+BAA4B,GAC5B,cAAW,GACX,aAAU,MACR,GACE,CAAC,GAAS,KAAc,EAAS,EAAK,GACtC,EAAE,oBAAiB,EAA0B;CAGnD,SACE,EAAa,CAAO,SACP;EACX,EAAa,EAAK;CACpB,IACC,CAAC,GAAS,CAAY,CAAC;CAE1B,IAAM,CAAC,GAAoB,KAAyB,EAElD,CAAyB,GACrB,CAAC,GAAW,KAAgB,EAAS,EAAK,GAG1C,EAAE,6BAA0B,WAAW,MAC3C,EAA0B,CAAkB;CAuE9C,OAtEA,QAAgB;EACd,AACE,CAAC,KACD,CAAC,KACD,CAAC,KACD,KAA4B,SAE5B,EAAsB,CAAwB,GAG9C,EAAa,EAAI;CAErB,GAAG;EAAC;EAAW;EAAS;EAAqB;CAAwB,CAAC,GAEtE,QAAgB;EACd,EAAS,CAAkB;CAE7B,GAAG,CAAC,CAAkB,CAAC,GAqDhB;EACL;EACA;EACA,uBAtD4B,GAC3B,GAAqB,MAA+B;GAEnD,AADA,EAAW,EAAI,GACX,KACF,GAAsB,MAAsB;IAI1C,IAHwB,EAAmB,MACzC,MAAkB,EAAe,gBAAgB,CAE/C,GACF,EAAQ,CAAqC;SACxC;KACL,IAAM,IAAoC;MAC3B;MACb,YAAY;KACd;KACA,OAAO,CAAC,GAAG,GAAoB,CAAiB;IAClD;IACA,OAAO;GACT,CAAC;EAEL,GACA,CAAC,CAAO,CAiCR;EACA,0BA/B+B,GAC9B,GAAqB,MAA8B;GAElD,AADA,EAAW,EAAI,GACf,GAAsB,MACpB,EAAmB,KAAI,MACd,EAAe,gBAAgB,IAClC;IAAE,GAAG;IAAgB;GAAW,IAChC,CACL,CACH;EACF,GACA,CAAC,CAoBD;EACA,0BAlB+B,GAAa,MAAwB;GAEpE,AADA,EAAW,EAAI,GACf,GAAsB,MACpB,EAAmB,QACjB,MAAc,EAAW,gBAAgB,CAC3C,CACF;EACF,GAAG,CAAC,CAWF;EACA,iBAVsB,QAAkB;GACxC,EAAW,EAAK;EAClB,GAAG,CAAC,CAQF;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdaptiveTwoColumnLayout.js","names":[],"sources":["../../../src/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.tsx"],"sourcesContent":["import { Box, SxProps } from '@mui/material'\nimport { ReactNode, useLayoutEffect, useRef, useState } from 'react'\n\nexport type MeasurementInfo = {\n leftHeight: number\n rightHeight: number\n ratio: number\n stacked: boolean\n}\n\nexport type AdaptiveTwoColumnLayoutProps = {\n leftContent: ReactNode\n rightContent?: ReactNode\n /**\n * Stack if leftHeight / rightHeight falls below this ratio.\n * Measured once after initial render with both columns side-by-side.\n * Default: 0.45\n */\n stackRatioThreshold?: number\n gap?: string | number\n sx?: SxProps\n /**\n * Called once after the initial measurement completes. Useful for debugging.\n */\n onMeasure?: (info: MeasurementInfo) => void\n}\n\n/**\n * Lays out two columns side-by-side and, after the initial render, measures\n * their heights. If leftHeight / rightHeight < stackRatioThreshold, the layout\n * switches to a single stacked column. On mobile (xs–md) the layout always stacks.\n *\n * Measurement is performed once on mount via useLayoutEffect, which fires\n * synchronously before the browser paints, so there is no visible layout shift.\n *\n * Algorithm mirrors the prototype at https://github.com/adamhindman/detail-page-columns:\n * measure in side-by-side mode, compute ratio = leftHeight / rightHeight, stack if below threshold.\n *\n * Implementation note: CSS Grid with align-items:start is used (not Flexbox).\n * Flexbox's default align-items:stretch causes both children to report the same\n * offsetHeight (the taller column's height), making the ratio always 1.0 and\n * stacking never triggering. Grid cells with align-items:start only take the\n * height of their own content, giving accurate independent measurements.\n */\nexport function AdaptiveTwoColumnLayout({\n leftContent,\n rightContent,\n stackRatioThreshold = 0.45,\n gap = '40px',\n sx,\n onMeasure,\n}: AdaptiveTwoColumnLayoutProps) {\n // null = not yet measured (2-column mode until useLayoutEffect reads heights)\n const [isStacked, setIsStacked] = useState<boolean | null>(null)\n const leftRef = useRef<HTMLDivElement>(null)\n const rightRef = useRef<HTMLDivElement>(null)\n // Stable ref so onMeasure is never a useEffect dependency.\n const onMeasureRef = useRef(onMeasure)\n onMeasureRef.current = onMeasure\n\n // useLayoutEffect fires synchronously after React commits the DOM but before\n // the browser paints, so offsetHeight values are accurate and the user never\n // sees the intermediate 2-column state.\n //\n // NOTE: rightContent and onMeasure are intentionally excluded from the\n // dependency array. rightContent is JSX — a new object reference on every\n // parent render — so including it would restart this effect on every render,\n // preventing measurement from completing. onMeasure is accessed via\n // onMeasureRef to avoid the same issue.\n useLayoutEffect(() => {\n if (!leftRef.current) return\n\n if (!rightRef.current) {\n setIsStacked(false)\n return\n }\n\n // Both columns are in 2-column grid mode (isStacked is still null).\n // offsetHeight gives each column's independent content height.\n const leftH = leftRef.current.offsetHeight\n const rightH = rightRef.current.offsetHeight\n\n if (rightH > 0) {\n const ratio = leftH / rightH\n const stacked = ratio < stackRatioThreshold\n setIsStacked(stacked)\n onMeasureRef.current?.({\n leftHeight: leftH,\n rightHeight: rightH,\n ratio,\n stacked,\n })\n } else {\n setIsStacked(false)\n }\n // rightContent and onMeasure intentionally omitted — see note above.\n }, [stackRatioThreshold])\n\n return (\n <Box\n sx={{\n display: 'grid',\n // While unmeasured: 2 equal columns so heights are independently comparable.\n // After measurement: xs always single column; md+ follows the decision.\n gridTemplateColumns:\n isStacked === null\n ? '1fr 1fr'\n : { xs: '1fr', md: isStacked ? '1fr' : '1fr 1fr' },\n // align-items:start is critical — each cell is only as tall as its own\n // content, giving independent heights for the ratio comparison.\n alignItems: 'start',\n gap,\n ...sx,\n }}\n >\n <Box ref={leftRef}>{leftContent}</Box>\n {rightContent && <Box ref={rightRef}>{rightContent}</Box>}\n </Box>\n )\n}\n\nexport default AdaptiveTwoColumnLayout\n"],"mappings":";;;;AA4CA,SAAgB,EAAwB,EACtC,gBACA,iBACA,yBAAsB,KACtB,SAAM,QACN,OACA,gBAC+B;CAE/B,IAAM,CAAC,GAAW,KAAgB,EAAyB,
|
|
1
|
+
{"version":3,"file":"AdaptiveTwoColumnLayout.js","names":[],"sources":["../../../src/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.tsx"],"sourcesContent":["import { Box, SxProps } from '@mui/material'\nimport { ReactNode, useLayoutEffect, useRef, useState } from 'react'\n\nexport type MeasurementInfo = {\n leftHeight: number\n rightHeight: number\n ratio: number\n stacked: boolean\n}\n\nexport type AdaptiveTwoColumnLayoutProps = {\n leftContent: ReactNode\n rightContent?: ReactNode\n /**\n * Stack if leftHeight / rightHeight falls below this ratio.\n * Measured once after initial render with both columns side-by-side.\n * Default: 0.45\n */\n stackRatioThreshold?: number\n gap?: string | number\n sx?: SxProps\n /**\n * Called once after the initial measurement completes. Useful for debugging.\n */\n onMeasure?: (info: MeasurementInfo) => void\n}\n\n/**\n * Lays out two columns side-by-side and, after the initial render, measures\n * their heights. If leftHeight / rightHeight < stackRatioThreshold, the layout\n * switches to a single stacked column. On mobile (xs–md) the layout always stacks.\n *\n * Measurement is performed once on mount via useLayoutEffect, which fires\n * synchronously before the browser paints, so there is no visible layout shift.\n *\n * Algorithm mirrors the prototype at https://github.com/adamhindman/detail-page-columns:\n * measure in side-by-side mode, compute ratio = leftHeight / rightHeight, stack if below threshold.\n *\n * Implementation note: CSS Grid with align-items:start is used (not Flexbox).\n * Flexbox's default align-items:stretch causes both children to report the same\n * offsetHeight (the taller column's height), making the ratio always 1.0 and\n * stacking never triggering. Grid cells with align-items:start only take the\n * height of their own content, giving accurate independent measurements.\n */\nexport function AdaptiveTwoColumnLayout({\n leftContent,\n rightContent,\n stackRatioThreshold = 0.45,\n gap = '40px',\n sx,\n onMeasure,\n}: AdaptiveTwoColumnLayoutProps) {\n // null = not yet measured (2-column mode until useLayoutEffect reads heights)\n const [isStacked, setIsStacked] = useState<boolean | null>(null)\n const leftRef = useRef<HTMLDivElement>(null)\n const rightRef = useRef<HTMLDivElement>(null)\n // Stable ref so onMeasure is never a useEffect dependency.\n const onMeasureRef = useRef(onMeasure)\n onMeasureRef.current = onMeasure\n\n // useLayoutEffect fires synchronously after React commits the DOM but before\n // the browser paints, so offsetHeight values are accurate and the user never\n // sees the intermediate 2-column state.\n //\n // NOTE: rightContent and onMeasure are intentionally excluded from the\n // dependency array. rightContent is JSX — a new object reference on every\n // parent render — so including it would restart this effect on every render,\n // preventing measurement from completing. onMeasure is accessed via\n // onMeasureRef to avoid the same issue.\n useLayoutEffect(() => {\n if (!leftRef.current) return\n\n if (!rightRef.current) {\n setIsStacked(false)\n return\n }\n\n // Both columns are in 2-column grid mode (isStacked is still null).\n // offsetHeight gives each column's independent content height.\n const leftH = leftRef.current.offsetHeight\n const rightH = rightRef.current.offsetHeight\n\n if (rightH > 0) {\n const ratio = leftH / rightH\n const stacked = ratio < stackRatioThreshold\n setIsStacked(stacked)\n onMeasureRef.current?.({\n leftHeight: leftH,\n rightHeight: rightH,\n ratio,\n stacked,\n })\n } else {\n setIsStacked(false)\n }\n // rightContent and onMeasure intentionally omitted — see note above.\n }, [stackRatioThreshold])\n\n return (\n <Box\n sx={{\n display: 'grid',\n // While unmeasured: 2 equal columns so heights are independently comparable.\n // After measurement: xs always single column; md+ follows the decision.\n gridTemplateColumns:\n isStacked === null\n ? '1fr 1fr'\n : { xs: '1fr', md: isStacked ? '1fr' : '1fr 1fr' },\n // align-items:start is critical — each cell is only as tall as its own\n // content, giving independent heights for the ratio comparison.\n alignItems: 'start',\n gap,\n ...sx,\n }}\n >\n <Box ref={leftRef}>{leftContent}</Box>\n {rightContent && <Box ref={rightRef}>{rightContent}</Box>}\n </Box>\n )\n}\n\nexport default AdaptiveTwoColumnLayout\n"],"mappings":";;;;AA4CA,SAAgB,EAAwB,EACtC,gBACA,iBACA,yBAAsB,KACtB,SAAM,QACN,OACA,gBAC+B;CAE/B,IAAM,CAAC,GAAW,KAAgB,EAAyB,IAAI,GACzD,IAAU,EAAuB,IAAI,GACrC,IAAW,EAAuB,IAAI,GAEtC,IAAe,EAAO,CAAS;CAyCrC,OAxCA,EAAa,UAAU,GAWvB,QAAsB;EACpB,IAAI,CAAC,EAAQ,SAAS;EAEtB,IAAI,CAAC,EAAS,SAAS;GACrB,EAAa,EAAK;GAClB;EACF;EAIA,IAAM,IAAQ,EAAQ,QAAQ,cACxB,IAAS,EAAS,QAAQ;EAEhC,IAAI,IAAS,GAAG;GACd,IAAM,IAAQ,IAAQ,GAChB,IAAU,IAAQ;GAExB,AADA,EAAa,CAAO,GACpB,EAAa,UAAU;IACrB,YAAY;IACZ,aAAa;IACb;IACA;GACF,CAAC;EACH,OACE,EAAa,EAAK;CAGtB,GAAG,CAAC,CAAmB,CAAC,GAGtB,kBAAC,GAAD;EACE,IAAI;GACF,SAAS;GAGT,qBACE,MAAc,OACV,YACA;IAAE,IAAI;IAAO,IAAI,IAAY,QAAQ;GAAU;GAGrD,YAAY;GACZ;GACA,GAAG;EACL;YAdF,CAgBE,kBAAC,GAAD;GAAK,KAAK;aAAU;EAAiB,CAAA,GACpC,KAAgB,kBAAC,GAAD;GAAK,KAAK;aAAW;EAAkB,CAAA,CACrD;;AAET"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddToDownloadListV2.js","names":[],"sources":["../../src/components/AddToDownloadListV2.tsx"],"sourcesContent":["import { useGetEntity } from '@/synapse-queries'\nimport { useAddFileToDownloadList } from '@/synapse-queries/download/useDownloadList'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { Link, Tooltip } from '@mui/material'\nimport IconSvg from './IconSvg/IconSvg'\nimport { displayToast } from './ToastMessage/ToastMessage'\n\nexport type AddToDownloadListV2Props = {\n entityId: string\n entityVersionNumber?: number\n}\n\nfunction AddToDownloadListV2(props: AddToDownloadListV2Props) {\n const { entityId, entityVersionNumber } = props\n const { isAuthenticated } = useSynapseContext()\n\n const { data: entity } = useGetEntity(entityId, entityVersionNumber)\n\n const { mutate: addToDownloadList } = useAddFileToDownloadList({\n onSuccess: () => {\n displayToast(\n `${\n entity?.name ?? entityId\n } was successfully added to your Download List.`,\n 'success',\n )\n },\n onError: e => {\n displayToast(\n `Unable to add the file to your Download List. ${e.reason}`,\n 'danger',\n )\n },\n })\n\n if (!isAuthenticated) {\n return <></>\n }\n\n return (\n <>\n <Tooltip\n title=\"Add this file to your Download List\"\n placement=\"right\"\n enterNextDelay={300}\n >\n <Link\n data-testid=\"AddToDownloadListV2\"\n onClick={() => {\n addToDownloadList({ entityId, entityVersionNumber })\n }}\n className=\"ignoreLink\"\n >\n <IconSvg icon={'addToCart'} />\n </Link>\n </Tooltip>\n </>\n )\n}\n\nexport default AddToDownloadListV2\n"],"mappings":";;;;;;;;;AAYA,SAAS,EAAoB,GAAiC;CAC5D,IAAM,EAAE,aAAU,2BAAwB,GACpC,EAAE,uBAAoB,
|
|
1
|
+
{"version":3,"file":"AddToDownloadListV2.js","names":[],"sources":["../../src/components/AddToDownloadListV2.tsx"],"sourcesContent":["import { useGetEntity } from '@/synapse-queries'\nimport { useAddFileToDownloadList } from '@/synapse-queries/download/useDownloadList'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { Link, Tooltip } from '@mui/material'\nimport IconSvg from './IconSvg/IconSvg'\nimport { displayToast } from './ToastMessage/ToastMessage'\n\nexport type AddToDownloadListV2Props = {\n entityId: string\n entityVersionNumber?: number\n}\n\nfunction AddToDownloadListV2(props: AddToDownloadListV2Props) {\n const { entityId, entityVersionNumber } = props\n const { isAuthenticated } = useSynapseContext()\n\n const { data: entity } = useGetEntity(entityId, entityVersionNumber)\n\n const { mutate: addToDownloadList } = useAddFileToDownloadList({\n onSuccess: () => {\n displayToast(\n `${\n entity?.name ?? entityId\n } was successfully added to your Download List.`,\n 'success',\n )\n },\n onError: e => {\n displayToast(\n `Unable to add the file to your Download List. ${e.reason}`,\n 'danger',\n )\n },\n })\n\n if (!isAuthenticated) {\n return <></>\n }\n\n return (\n <>\n <Tooltip\n title=\"Add this file to your Download List\"\n placement=\"right\"\n enterNextDelay={300}\n >\n <Link\n data-testid=\"AddToDownloadListV2\"\n onClick={() => {\n addToDownloadList({ entityId, entityVersionNumber })\n }}\n className=\"ignoreLink\"\n >\n <IconSvg icon={'addToCart'} />\n </Link>\n </Tooltip>\n </>\n )\n}\n\nexport default AddToDownloadListV2\n"],"mappings":";;;;;;;;;AAYA,SAAS,EAAoB,GAAiC;CAC5D,IAAM,EAAE,aAAU,2BAAwB,GACpC,EAAE,uBAAoB,EAAkB,GAExC,EAAE,MAAM,MAAW,EAAa,GAAU,CAAmB,GAE7D,EAAE,QAAQ,MAAsB,EAAyB;EAC7D,iBAAiB;GACf,EACE,GACE,GAAQ,QAAQ,EACjB,iDACD,SACF;EACF;EACA,UAAS,MAAK;GACZ,EACE,iDAAiD,EAAE,UACnD,QACF;EACF;CACF,CAAC;CAMD,OAJK,IAKH,kBAAA,GAAA,EAAA,UACE,kBAAC,GAAD;EACE,OAAM;EACN,WAAU;EACV,gBAAgB;YAEhB,kBAAC,GAAD;GACE,eAAY;GACZ,eAAe;IACb,EAAkB;KAAE;KAAU;IAAoB,CAAC;GACrD;GACA,WAAU;aAEV,kBAAC,GAAD,EAAS,MAAM,YAAc,CAAA;EACzB,CAAA;CACC,CAAA,EACT,CAAA,IApBK,kBAAA,GAAA,CAAI,CAAA;AAsBf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AridhiaAccessStatus.js","names":[],"sources":["../../../src/components/Aridhia/AridhiaAccessStatus.tsx"],"sourcesContent":["import { Button } from '@mui/material'\nimport { useGetAridhiaRequests } from '@/aridhia-queries'\nimport AccessIcon, { RestrictionUiType } from '../HasAccess/AccessIcon'\nimport { SRC_SIGN_IN_CLASS } from '@/utils/SynapseConstants'\nimport { useSynapseContext } from '@/utils'\nimport {\n getRestrictionUiTypeFromAridhiaRequest,\n findRequestForDataset,\n} from './aridhiaAccessStatusUtils'\n\nconst buttonSx = { p: '0px', minWidth: 'unset' }\n\nexport type AridhiaAccessStatusProps = {\n /**\n * dataset code\n */\n datasetCode: string\n url?: string\n}\n\n/**\n * Component that displays the Aridhia data access request status.\n * If the user is not authenticated with Aridhia, shows a sign-in button.\n * Otherwise, shows the access status based on the data access requests.\n */\nexport default function AridhiaAccessStatus(props: AridhiaAccessStatusProps) {\n const { datasetCode, url } = props\n const { isAuthenticated } = useSynapseContext()\n const { data: requestsResponse, isLoading } = useGetAridhiaRequests()\n\n if (!isAuthenticated) {\n return (\n <Button\n sx={buttonSx}\n className={SRC_SIGN_IN_CLASS}\n onClick={ev => {\n if (ev.isTrusted) {\n /*\n There is a tricky problem - \n The portals listens to click events for buttons with the class SRC_SIGN_IN_CLASS set, it listens to this event\n so that it can display the login modal.\n\n This button has an svg inside of it which is problematic because more often than not clicking this button will \n instead click that svg. The event listener in the portals will break as a result.\n\n Though the svg may get the actual click event, because of event bubbling this button will get its onClick called.\n Once onClick is called we can manually dispatch an event off of this button. This does pose a problem, we end up in a \n infinite loop because this button keeps dispatching click events, so we can use the isTrusted to recognize if onClick was\n triggered programmatically or by user click. Lastly, using { bubbles: true } ensures the event bubbles up to the document level.\n\n */\n const clickEvent = new MouseEvent('click', { bubbles: true })\n ev.currentTarget.dispatchEvent(clickEvent)\n }\n }}\n >\n <AccessIcon\n restrictionUiType={RestrictionUiType.AccessBlockedToAnonymous}\n />\n </Button>\n )\n }\n\n // Show loading state\n if (isLoading) {\n return <></>\n }\n\n // Check if there's a request for this dataset\n const entityRequest = findRequestForDataset(\n requestsResponse?.items ?? [],\n datasetCode,\n )\n\n const restrictionUiType =\n getRestrictionUiTypeFromAridhiaRequest(entityRequest)\n\n const icon = <AccessIcon restrictionUiType={restrictionUiType} />\n\n // If URL provided, wrap icon in link\n return url ? (\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\">\n {icon}\n </a>\n ) : (\n icon\n )\n}\n"],"mappings":";;;;;;;;;;AAUA,IAAM,IAAW;CAAE,GAAG;CAAO,UAAU;
|
|
1
|
+
{"version":3,"file":"AridhiaAccessStatus.js","names":[],"sources":["../../../src/components/Aridhia/AridhiaAccessStatus.tsx"],"sourcesContent":["import { Button } from '@mui/material'\nimport { useGetAridhiaRequests } from '@/aridhia-queries'\nimport AccessIcon, { RestrictionUiType } from '../HasAccess/AccessIcon'\nimport { SRC_SIGN_IN_CLASS } from '@/utils/SynapseConstants'\nimport { useSynapseContext } from '@/utils'\nimport {\n getRestrictionUiTypeFromAridhiaRequest,\n findRequestForDataset,\n} from './aridhiaAccessStatusUtils'\n\nconst buttonSx = { p: '0px', minWidth: 'unset' }\n\nexport type AridhiaAccessStatusProps = {\n /**\n * dataset code\n */\n datasetCode: string\n url?: string\n}\n\n/**\n * Component that displays the Aridhia data access request status.\n * If the user is not authenticated with Aridhia, shows a sign-in button.\n * Otherwise, shows the access status based on the data access requests.\n */\nexport default function AridhiaAccessStatus(props: AridhiaAccessStatusProps) {\n const { datasetCode, url } = props\n const { isAuthenticated } = useSynapseContext()\n const { data: requestsResponse, isLoading } = useGetAridhiaRequests()\n\n if (!isAuthenticated) {\n return (\n <Button\n sx={buttonSx}\n className={SRC_SIGN_IN_CLASS}\n onClick={ev => {\n if (ev.isTrusted) {\n /*\n There is a tricky problem - \n The portals listens to click events for buttons with the class SRC_SIGN_IN_CLASS set, it listens to this event\n so that it can display the login modal.\n\n This button has an svg inside of it which is problematic because more often than not clicking this button will \n instead click that svg. The event listener in the portals will break as a result.\n\n Though the svg may get the actual click event, because of event bubbling this button will get its onClick called.\n Once onClick is called we can manually dispatch an event off of this button. This does pose a problem, we end up in a \n infinite loop because this button keeps dispatching click events, so we can use the isTrusted to recognize if onClick was\n triggered programmatically or by user click. Lastly, using { bubbles: true } ensures the event bubbles up to the document level.\n\n */\n const clickEvent = new MouseEvent('click', { bubbles: true })\n ev.currentTarget.dispatchEvent(clickEvent)\n }\n }}\n >\n <AccessIcon\n restrictionUiType={RestrictionUiType.AccessBlockedToAnonymous}\n />\n </Button>\n )\n }\n\n // Show loading state\n if (isLoading) {\n return <></>\n }\n\n // Check if there's a request for this dataset\n const entityRequest = findRequestForDataset(\n requestsResponse?.items ?? [],\n datasetCode,\n )\n\n const restrictionUiType =\n getRestrictionUiTypeFromAridhiaRequest(entityRequest)\n\n const icon = <AccessIcon restrictionUiType={restrictionUiType} />\n\n // If URL provided, wrap icon in link\n return url ? (\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\">\n {icon}\n </a>\n ) : (\n icon\n )\n}\n"],"mappings":";;;;;;;;;;AAUA,IAAM,IAAW;CAAE,GAAG;CAAO,UAAU;AAAQ;AAe/C,SAAwB,EAAoB,GAAiC;CAC3E,IAAM,EAAE,gBAAa,WAAQ,GACvB,EAAE,uBAAoB,EAAkB,GACxC,EAAE,MAAM,GAAkB,iBAAc,EAAsB;CAEpE,IAAI,CAAC,GACH,OACE,kBAAC,GAAD;EACE,IAAI;EACJ,WAAW;EACX,UAAS,MAAM;GACb,IAAI,EAAG,WAAW;IAehB,IAAM,IAAa,IAAI,WAAW,SAAS,EAAE,SAAS,GAAK,CAAC;IAC5D,EAAG,cAAc,cAAc,CAAU;GAC3C;EACF;YAEA,kBAAC,GAAD,EACE,mBAAmB,EAAkB,yBACtC,CAAA;CACK,CAAA;CAKZ,IAAI,GACF,OAAO,kBAAA,GAAA,CAAI,CAAA;CAYb,IAAM,IAAO,kBAAC,GAAD,EAA+B,mBAF1C,EANoB,EACpB,GAAkB,SAAS,CAAC,GAC5B,CAIuC,CAEG,EAAoB,CAAA;CAGhE,OAAO,IACL,kBAAC,KAAD;EAAG,MAAM;EAAK,QAAO;EAAS,KAAI;YAC/B;CACA,CAAA,IAEH;AAEJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aridhiaAccessStatusUtils.js","names":[],"sources":["../../../src/components/Aridhia/aridhiaAccessStatusUtils.ts"],"sourcesContent":["import { RestrictionUiType } from '../HasAccess/AccessIcon'\nimport { Request } from '@sage-bionetworks/aridhia-client/generated/models'\n\n/**\n * Maps an Aridhia request status to the appropriate RestrictionUiType for display.\n *\n * @param request - The Aridhia request object, or undefined if no request exists\n * @returns The appropriate RestrictionUiType based on the request status\n */\nexport function getRestrictionUiTypeFromAridhiaRequest(\n request: Request | undefined,\n): RestrictionUiType {\n if (!request) {\n // No request found - user needs to request access\n return RestrictionUiType.AccessBlockedByRestriction\n }\n\n switch (request.status) {\n case 'approved':\n return RestrictionUiType.Accessible\n case 'pending':\n return RestrictionUiType.AccessBlockedByRestrictionWithPendingRDCADAPRequest\n case 'denied':\n return RestrictionUiType.AccessBlockedByRestrictionWithRejectedRDCADAPRequest\n case 'error':\n return RestrictionUiType.AccessBlockedByACL\n default:\n return RestrictionUiType.AccessBlockedByRestriction\n }\n}\n\n/**\n * Finds the Aridhia request for a specific dataset from a list of requests.\n * If multiple requests match, returns the most recently updated one.\n *\n * @param requests - Array of Aridhia requests\n * @param datasetCode - The dataset code to search for\n * @returns The most recently updated request that contains the specified dataset, or undefined if not found\n */\nexport function findRequestForDataset(\n requests: Request[],\n datasetCode: string,\n): Request | undefined {\n const matchingRequests = requests.filter(request =>\n request.datasets?.some(dataset => dataset.code === datasetCode),\n )\n\n if (matchingRequests.length === 0) {\n return undefined\n }\n\n // Return the most recently updated request\n return matchingRequests.reduce((mostRecent, current) => {\n if (!mostRecent.updated_at) {\n return current\n }\n if (!current.updated_at) {\n return mostRecent\n }\n return current.updated_at > mostRecent.updated_at ? current : mostRecent\n })\n}\n"],"mappings":";;AASA,SAAgB,EACd,GACmB;
|
|
1
|
+
{"version":3,"file":"aridhiaAccessStatusUtils.js","names":[],"sources":["../../../src/components/Aridhia/aridhiaAccessStatusUtils.ts"],"sourcesContent":["import { RestrictionUiType } from '../HasAccess/AccessIcon'\nimport { Request } from '@sage-bionetworks/aridhia-client/generated/models'\n\n/**\n * Maps an Aridhia request status to the appropriate RestrictionUiType for display.\n *\n * @param request - The Aridhia request object, or undefined if no request exists\n * @returns The appropriate RestrictionUiType based on the request status\n */\nexport function getRestrictionUiTypeFromAridhiaRequest(\n request: Request | undefined,\n): RestrictionUiType {\n if (!request) {\n // No request found - user needs to request access\n return RestrictionUiType.AccessBlockedByRestriction\n }\n\n switch (request.status) {\n case 'approved':\n return RestrictionUiType.Accessible\n case 'pending':\n return RestrictionUiType.AccessBlockedByRestrictionWithPendingRDCADAPRequest\n case 'denied':\n return RestrictionUiType.AccessBlockedByRestrictionWithRejectedRDCADAPRequest\n case 'error':\n return RestrictionUiType.AccessBlockedByACL\n default:\n return RestrictionUiType.AccessBlockedByRestriction\n }\n}\n\n/**\n * Finds the Aridhia request for a specific dataset from a list of requests.\n * If multiple requests match, returns the most recently updated one.\n *\n * @param requests - Array of Aridhia requests\n * @param datasetCode - The dataset code to search for\n * @returns The most recently updated request that contains the specified dataset, or undefined if not found\n */\nexport function findRequestForDataset(\n requests: Request[],\n datasetCode: string,\n): Request | undefined {\n const matchingRequests = requests.filter(request =>\n request.datasets?.some(dataset => dataset.code === datasetCode),\n )\n\n if (matchingRequests.length === 0) {\n return undefined\n }\n\n // Return the most recently updated request\n return matchingRequests.reduce((mostRecent, current) => {\n if (!mostRecent.updated_at) {\n return current\n }\n if (!current.updated_at) {\n return mostRecent\n }\n return current.updated_at > mostRecent.updated_at ? current : mostRecent\n })\n}\n"],"mappings":";;AASA,SAAgB,EACd,GACmB;CACnB,IAAI,CAAC,GAEH,OAAO,EAAkB;CAG3B,QAAQ,EAAQ,QAAhB;EACE,KAAK,YACH,OAAO,EAAkB;EAC3B,KAAK,WACH,OAAO,EAAkB;EAC3B,KAAK,UACH,OAAO,EAAkB;EAC3B,KAAK,SACH,OAAO,EAAkB;EAC3B,SACE,OAAO,EAAkB;CAC7B;AACF;AAUA,SAAgB,EACd,GACA,GACqB;CACrB,IAAM,IAAmB,EAAS,QAAO,MACvC,EAAQ,UAAU,MAAK,MAAW,EAAQ,SAAS,CAAW,CAChE;CAEI,MAAiB,WAAW,GAKhC,OAAO,EAAiB,QAAQ,GAAY,MACrC,EAAW,aAGX,EAAQ,cAGN,EAAQ,aAAa,EAAW,aAAa,IAAU,IALrD,CAMV;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthenticationMethodSelection.js","names":[],"sources":["../../../src/components/Authentication/AuthenticationMethodSelection.tsx"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport { OAuth2State, SynapseClientError } from '@/utils'\nimport { generateCsrfToken } from '@/utils/functions/generateCsrfToken'\nimport {\n LOGIN_METHOD_EMAIL,\n LOGIN_METHOD_OAUTH2_ARCUS,\n LOGIN_METHOD_OAUTH2_GOOGLE,\n LOGIN_METHOD_OAUTH2_ORCID,\n LOGIN_METHOD_OAUTH2_SAGE_BIONETWORKS,\n OAUTH2_PROVIDERS,\n} from '@/utils/SynapseConstants'\nimport { Box } from '@mui/material'\nimport { MouseEvent } from 'react'\nimport LoginMethodButton from './LoginMethodButton'\nimport { Realm } from '@sage-bionetworks/synapse-client'\nimport {\n hasArcusProvider,\n hasSageBionetworksProvider,\n} from '@/utils/functions/RealmUtils'\n\ntype AuthenticationMethodSelectionProps = {\n ssoRedirectUrl?: string\n /* Invoked before redirecting to OAuth provider. Useful in portals where we may want to store the current URL to redirect back here. */\n onBeginOAuthSignIn?: () => void\n onSelectUsernameAndPassword: () => void\n state?: OAuth2State\n realm?: Realm\n}\n\nconst csrfToken = generateCsrfToken()\n\n/**\n * To support Google SSO in your portal, you must add your domain to the Authorized Redirect URIs for Synapse authentication.\n * This can be done by visiting https://sagebionetworks.jira.com/servicedesk/customer/portal/9 to set up a collaboration.\n * Synapse engineers must add your redirect URL in the Google API console found at https://console.cloud.google.com/ for this functionality to work.\n */\nexport default function AuthenticationMethodSelection(\n props: AuthenticationMethodSelectionProps,\n) {\n const {\n onBeginOAuthSignIn,\n ssoRedirectUrl,\n onSelectUsernameAndPassword,\n state,\n realm,\n } = props\n\n const showArcusSSOButtonOnly = hasArcusProvider(realm)\n const showSageBionetworksSSOButtonOnly = hasSageBionetworksProvider(realm)\n\n const isSingleIdpOnly =\n showArcusSSOButtonOnly || showSageBionetworksSSOButtonOnly\n const stateWithCSRF: OAuth2State = { ...state, csrfToken }\n\n function onSSOSignIn(event: MouseEvent<HTMLButtonElement>, provider: string) {\n if (onBeginOAuthSignIn) {\n onBeginOAuthSignIn()\n }\n\n event.preventDefault()\n const redirectUrl = ssoRedirectUrl\n ? `${ssoRedirectUrl}${provider}`\n : `${SynapseClient.getRootURL()}?provider=${provider}`\n SynapseClient.oAuthUrlRequest(provider, redirectUrl, stateWithCSRF)\n .then(data => {\n // Send the user to the authorization URL\n window.location.href = data.authorizationUrl\n })\n .catch((err: SynapseClientError) => {\n console.log('Error on oAuth url ', err)\n })\n }\n\n return (\n <Box>\n {!isSingleIdpOnly && (\n <>\n <LoginMethodButton\n loginMethod={LOGIN_METHOD_OAUTH2_GOOGLE}\n iconName=\"google24\"\n onClick={event => {\n onSSOSignIn(event, OAUTH2_PROVIDERS.GOOGLE)\n }}\n />\n <LoginMethodButton\n loginMethod={LOGIN_METHOD_OAUTH2_ORCID}\n iconName=\"orcid\"\n onClick={event => {\n onSSOSignIn(event, OAUTH2_PROVIDERS.ORCID)\n }}\n />\n <LoginMethodButton\n loginMethod={LOGIN_METHOD_EMAIL}\n iconName=\"email\"\n onClick={onSelectUsernameAndPassword}\n />\n </>\n )}\n {showArcusSSOButtonOnly && (\n <LoginMethodButton\n loginMethod={LOGIN_METHOD_OAUTH2_ARCUS}\n // iconName=\"arcusbio\"\n onClick={event => {\n onSSOSignIn(event, OAUTH2_PROVIDERS.ARCUS)\n }}\n />\n )}\n {showSageBionetworksSSOButtonOnly && (\n <LoginMethodButton\n loginMethod={LOGIN_METHOD_OAUTH2_SAGE_BIONETWORKS}\n onClick={event => {\n onSSOSignIn(event, OAUTH2_PROVIDERS.SAGE_BIONETWORKS)\n }}\n />\n )}\n </Box>\n )\n}\n"],"mappings":";;;;;;;;AA6BA,IAAM,IAAY,
|
|
1
|
+
{"version":3,"file":"AuthenticationMethodSelection.js","names":[],"sources":["../../../src/components/Authentication/AuthenticationMethodSelection.tsx"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport { OAuth2State, SynapseClientError } from '@/utils'\nimport { generateCsrfToken } from '@/utils/functions/generateCsrfToken'\nimport {\n LOGIN_METHOD_EMAIL,\n LOGIN_METHOD_OAUTH2_ARCUS,\n LOGIN_METHOD_OAUTH2_GOOGLE,\n LOGIN_METHOD_OAUTH2_ORCID,\n LOGIN_METHOD_OAUTH2_SAGE_BIONETWORKS,\n OAUTH2_PROVIDERS,\n} from '@/utils/SynapseConstants'\nimport { Box } from '@mui/material'\nimport { MouseEvent } from 'react'\nimport LoginMethodButton from './LoginMethodButton'\nimport { Realm } from '@sage-bionetworks/synapse-client'\nimport {\n hasArcusProvider,\n hasSageBionetworksProvider,\n} from '@/utils/functions/RealmUtils'\n\ntype AuthenticationMethodSelectionProps = {\n ssoRedirectUrl?: string\n /* Invoked before redirecting to OAuth provider. Useful in portals where we may want to store the current URL to redirect back here. */\n onBeginOAuthSignIn?: () => void\n onSelectUsernameAndPassword: () => void\n state?: OAuth2State\n realm?: Realm\n}\n\nconst csrfToken = generateCsrfToken()\n\n/**\n * To support Google SSO in your portal, you must add your domain to the Authorized Redirect URIs for Synapse authentication.\n * This can be done by visiting https://sagebionetworks.jira.com/servicedesk/customer/portal/9 to set up a collaboration.\n * Synapse engineers must add your redirect URL in the Google API console found at https://console.cloud.google.com/ for this functionality to work.\n */\nexport default function AuthenticationMethodSelection(\n props: AuthenticationMethodSelectionProps,\n) {\n const {\n onBeginOAuthSignIn,\n ssoRedirectUrl,\n onSelectUsernameAndPassword,\n state,\n realm,\n } = props\n\n const showArcusSSOButtonOnly = hasArcusProvider(realm)\n const showSageBionetworksSSOButtonOnly = hasSageBionetworksProvider(realm)\n\n const isSingleIdpOnly =\n showArcusSSOButtonOnly || showSageBionetworksSSOButtonOnly\n const stateWithCSRF: OAuth2State = { ...state, csrfToken }\n\n function onSSOSignIn(event: MouseEvent<HTMLButtonElement>, provider: string) {\n if (onBeginOAuthSignIn) {\n onBeginOAuthSignIn()\n }\n\n event.preventDefault()\n const redirectUrl = ssoRedirectUrl\n ? `${ssoRedirectUrl}${provider}`\n : `${SynapseClient.getRootURL()}?provider=${provider}`\n SynapseClient.oAuthUrlRequest(provider, redirectUrl, stateWithCSRF)\n .then(data => {\n // Send the user to the authorization URL\n window.location.href = data.authorizationUrl\n })\n .catch((err: SynapseClientError) => {\n console.log('Error on oAuth url ', err)\n })\n }\n\n return (\n <Box>\n {!isSingleIdpOnly && (\n <>\n <LoginMethodButton\n loginMethod={LOGIN_METHOD_OAUTH2_GOOGLE}\n iconName=\"google24\"\n onClick={event => {\n onSSOSignIn(event, OAUTH2_PROVIDERS.GOOGLE)\n }}\n />\n <LoginMethodButton\n loginMethod={LOGIN_METHOD_OAUTH2_ORCID}\n iconName=\"orcid\"\n onClick={event => {\n onSSOSignIn(event, OAUTH2_PROVIDERS.ORCID)\n }}\n />\n <LoginMethodButton\n loginMethod={LOGIN_METHOD_EMAIL}\n iconName=\"email\"\n onClick={onSelectUsernameAndPassword}\n />\n </>\n )}\n {showArcusSSOButtonOnly && (\n <LoginMethodButton\n loginMethod={LOGIN_METHOD_OAUTH2_ARCUS}\n // iconName=\"arcusbio\"\n onClick={event => {\n onSSOSignIn(event, OAUTH2_PROVIDERS.ARCUS)\n }}\n />\n )}\n {showSageBionetworksSSOButtonOnly && (\n <LoginMethodButton\n loginMethod={LOGIN_METHOD_OAUTH2_SAGE_BIONETWORKS}\n onClick={event => {\n onSSOSignIn(event, OAUTH2_PROVIDERS.SAGE_BIONETWORKS)\n }}\n />\n )}\n </Box>\n )\n}\n"],"mappings":";;;;;;;;AA6BA,IAAM,IAAY,EAAkB;AAOpC,SAAwB,EACtB,GACA;CACA,IAAM,EACJ,uBACA,mBACA,gCACA,UACA,aACE,GAEE,IAAyB,EAAiB,CAAK,GAC/C,IAAmC,EAA2B,CAAK,GAEnE,IACJ,KAA0B,GACtB,IAA6B;EAAE,GAAG;EAAO;CAAU;CAEzD,SAAS,EAAY,GAAsC,GAAkB;EAK3E,AAJI,KACF,EAAmB,GAGrB,EAAM,eAAe;EACrB,IAAM,IAAc,IAChB,GAAG,IAAiB,MACpB,GAAG,EAAc,WAAW,EAAE,YAAY;EAC9C,EAAc,gBAAgB,GAAU,GAAa,CAAa,EAC/D,MAAK,MAAQ;GAEZ,OAAO,SAAS,OAAO,EAAK;EAC9B,CAAC,EACA,OAAO,MAA4B;GAClC,QAAQ,IAAI,uBAAuB,CAAG;EACxC,CAAC;CACL;CAEA,OACE,kBAAC,GAAD,EAAA,UAAA;EACG,CAAC,KACA,kBAAA,GAAA,EAAA,UAAA;GACE,kBAAC,GAAD;IACE,aAAA;IACA,UAAS;IACT,UAAS,MAAS;KAChB,EAAY,GAAO,EAAiB,MAAM;IAC5C;GACD,CAAA;GACD,kBAAC,GAAD;IACE,aAAA;IACA,UAAS;IACT,UAAS,MAAS;KAChB,EAAY,GAAO,EAAiB,KAAK;IAC3C;GACD,CAAA;GACD,kBAAC,GAAD;IACE,aAAA;IACA,UAAS;IACT,SAAS;GACV,CAAA;EACD,EAAA,CAAA;EAEH,KACC,kBAAC,GAAD;GACE,aAAA;GAEA,UAAS,MAAS;IAChB,EAAY,GAAO,EAAiB,KAAK;GAC3C;EACD,CAAA;EAEF,KACC,kBAAC,GAAD;GACE,aAAA;GACA,UAAS,MAAS;IAChB,EAAY,GAAO,EAAiB,gBAAgB;GACtD;EACD,CAAA;CAEA,EAAA,CAAA;AAET"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LastLoginInfo.js","names":[],"sources":["../../../src/components/Authentication/LastLoginInfo.tsx"],"sourcesContent":["import { formatDate } from '@/utils/functions/DateFormatter'\nimport {\n CURRENT_SOURCEAPP_NAME_LOCALSTORAGE_KEY,\n LAST_LOGIN_DATE_LOCALSTORAGE_KEY,\n LAST_LOGIN_METHOD_LOCALSTORAGE_KEY,\n LAST_LOGIN_SOURCEAPP_NAME_LOCALSTORAGE_KEY,\n LAST_LOGIN_SOURCEAPP_URL_LOCALSTORAGE_KEY,\n} from '@/utils/SynapseConstants'\nimport { InfoTwoTone } from '@mui/icons-material'\nimport { Box, Link, Tooltip, Typography } from '@mui/material'\nimport { useLocalStorageValue } from '@react-hookz/web'\nimport dayjs from 'dayjs'\nimport { getLoginMethodFriendlyName, LoginMethod } from './LoginMethod'\n\nexport type LastLoginInfoProps = {\n currentSourceAppName: string | undefined\n lastLoginMethod: LoginMethod | undefined\n lastLoginSourceAppName: string | undefined\n lastLoginSourceAppURL: string | undefined\n lastLoginDate: string | undefined\n display: 'sentence' | 'box'\n}\n\nexport function useLastLoginInfoState() {\n return {\n currentSourceAppNameState: useLocalStorageValue<string>(\n CURRENT_SOURCEAPP_NAME_LOCALSTORAGE_KEY,\n ),\n lastLoginMethodState: useLocalStorageValue<LoginMethod>(\n LAST_LOGIN_METHOD_LOCALSTORAGE_KEY,\n ),\n lastLoginSourceAppNameState: useLocalStorageValue<string>(\n LAST_LOGIN_SOURCEAPP_NAME_LOCALSTORAGE_KEY,\n ),\n lastLoginSourceAppURLState: useLocalStorageValue<string>(\n LAST_LOGIN_SOURCEAPP_URL_LOCALSTORAGE_KEY,\n ),\n lastLoginDateState: useLocalStorageValue<string>(\n LAST_LOGIN_DATE_LOCALSTORAGE_KEY,\n ),\n }\n}\n\nexport function useLastLoginInfo() {\n const states = useLastLoginInfoState()\n return {\n currentSourceAppName: states.currentSourceAppNameState.value,\n lastLoginMethod: states.lastLoginMethodState.value,\n lastLoginSourceAppName: states.lastLoginSourceAppNameState.value,\n lastLoginSourceAppURL: states.lastLoginSourceAppURLState.value,\n lastLoginDate: states.lastLoginDateState.value,\n }\n}\n\nexport function clearLastLoginInfo() {\n const keys = [\n CURRENT_SOURCEAPP_NAME_LOCALSTORAGE_KEY,\n LAST_LOGIN_METHOD_LOCALSTORAGE_KEY,\n LAST_LOGIN_SOURCEAPP_NAME_LOCALSTORAGE_KEY,\n LAST_LOGIN_SOURCEAPP_URL_LOCALSTORAGE_KEY,\n LAST_LOGIN_DATE_LOCALSTORAGE_KEY,\n ]\n keys.forEach(key => localStorage.removeItem(key))\n}\n\nfunction getSourceAppIndefiniteArticle(val: string) {\n return val.match(/^[aeiou]/i) ? 'an' : 'a'\n}\n\nfunction getSourceAppDefiniteArticle(val: string) {\n return val.match(' Portal$') ? 'the ' : ''\n}\n\nexport default function LastLoginInfo(props: LastLoginInfoProps) {\n const {\n currentSourceAppName,\n lastLoginMethod,\n lastLoginSourceAppName,\n lastLoginSourceAppURL,\n lastLoginDate,\n display,\n } = props\n\n const showLastLoginInfo =\n currentSourceAppName &&\n lastLoginMethod &&\n lastLoginSourceAppName &&\n lastLoginSourceAppURL &&\n lastLoginDate &&\n currentSourceAppName !== lastLoginSourceAppName\n\n if (!showLastLoginInfo) {\n return null\n }\n\n const currentSourceAppIndefiniteArticle =\n getSourceAppIndefiniteArticle(currentSourceAppName)\n const currentSourceAppDefiniteArticle =\n getSourceAppDefiniteArticle(currentSourceAppName)\n const lastLoginSourceAppDefiniteArticle = getSourceAppDefiniteArticle(\n lastLoginSourceAppName,\n )\n\n const title = `You may already have ${currentSourceAppIndefiniteArticle} ${currentSourceAppName} account`\n const accountLastUsed = `Account last used on ${formatDate(\n dayjs(lastLoginDate),\n 'MMMM D, YYYY',\n )}`\n\n const tooltipText = (\n <>\n <Typography\n variant=\"smallText2\"\n sx={{\n mb: 1,\n }}\n >\n {title}\n </Typography>\n <Typography\n variant=\"smallText1\"\n color=\"white\"\n sx={{\n mb: 1,\n }}\n >\n {`This computer was used to sign in to an account on ${lastLoginSourceAppDefiniteArticle}${lastLoginSourceAppName}. \n You can use the same account to sign in to ${currentSourceAppDefiniteArticle}${currentSourceAppName}.`}\n </Typography>\n <Typography variant=\"smallText1\" color=\"white\">\n {accountLastUsed}\n </Typography>\n </>\n )\n\n const boxText = (\n <>\n <Typography\n variant=\"smallText2\"\n sx={{\n mb: 1,\n color: 'grey.900',\n fontSize: '12px',\n }}\n >\n {title}\n </Typography>\n <Typography\n variant=\"smallText1\"\n sx={{\n mb: 1,\n color: 'grey.900',\n fontSize: '12px',\n }}\n >\n It looks like you already have an account, last used on{' '}\n {lastLoginSourceAppDefiniteArticle}\n <Link href={lastLoginSourceAppURL}>{lastLoginSourceAppName}</Link>.{' '}\n {`You can use this account to sign in via ${getLoginMethodFriendlyName(\n lastLoginMethod,\n )}.`}\n </Typography>\n <Typography\n variant=\"smallText1\"\n sx={{ color: 'grey.700', fontSize: '10px' }}\n >\n {accountLastUsed}\n </Typography>\n </>\n )\n\n return (\n <>\n {display === 'sentence' ? (\n <Typography\n variant=\"smallText1\"\n sx={{ color: 'grey.700', textTransform: 'none' }}\n >\n You may be able to use an existing account\n <Tooltip\n title={tooltipText}\n placement={'top'}\n slotProps={{\n tooltip: {\n sx: {\n bgcolor: '#63676C',\n '& .MuiTooltip-arrow': {\n color: '#63676C',\n },\n },\n },\n }}\n >\n <InfoTwoTone\n sx={{\n color: 'grey.700',\n width: '12px',\n height: '12px',\n ml: '4px',\n verticalAlign: 'middle',\n }}\n />\n </Tooltip>\n </Typography>\n ) : (\n <Box sx={{ backgroundColor: 'grey.100', p: '10px' }}>{boxText}</Box>\n )}\n </>\n )\n}\n"],"mappings":";;;;;;;;;AAuBA,SAAgB,IAAwB;
|
|
1
|
+
{"version":3,"file":"LastLoginInfo.js","names":[],"sources":["../../../src/components/Authentication/LastLoginInfo.tsx"],"sourcesContent":["import { formatDate } from '@/utils/functions/DateFormatter'\nimport {\n CURRENT_SOURCEAPP_NAME_LOCALSTORAGE_KEY,\n LAST_LOGIN_DATE_LOCALSTORAGE_KEY,\n LAST_LOGIN_METHOD_LOCALSTORAGE_KEY,\n LAST_LOGIN_SOURCEAPP_NAME_LOCALSTORAGE_KEY,\n LAST_LOGIN_SOURCEAPP_URL_LOCALSTORAGE_KEY,\n} from '@/utils/SynapseConstants'\nimport { InfoTwoTone } from '@mui/icons-material'\nimport { Box, Link, Tooltip, Typography } from '@mui/material'\nimport { useLocalStorageValue } from '@react-hookz/web'\nimport dayjs from 'dayjs'\nimport { getLoginMethodFriendlyName, LoginMethod } from './LoginMethod'\n\nexport type LastLoginInfoProps = {\n currentSourceAppName: string | undefined\n lastLoginMethod: LoginMethod | undefined\n lastLoginSourceAppName: string | undefined\n lastLoginSourceAppURL: string | undefined\n lastLoginDate: string | undefined\n display: 'sentence' | 'box'\n}\n\nexport function useLastLoginInfoState() {\n return {\n currentSourceAppNameState: useLocalStorageValue<string>(\n CURRENT_SOURCEAPP_NAME_LOCALSTORAGE_KEY,\n ),\n lastLoginMethodState: useLocalStorageValue<LoginMethod>(\n LAST_LOGIN_METHOD_LOCALSTORAGE_KEY,\n ),\n lastLoginSourceAppNameState: useLocalStorageValue<string>(\n LAST_LOGIN_SOURCEAPP_NAME_LOCALSTORAGE_KEY,\n ),\n lastLoginSourceAppURLState: useLocalStorageValue<string>(\n LAST_LOGIN_SOURCEAPP_URL_LOCALSTORAGE_KEY,\n ),\n lastLoginDateState: useLocalStorageValue<string>(\n LAST_LOGIN_DATE_LOCALSTORAGE_KEY,\n ),\n }\n}\n\nexport function useLastLoginInfo() {\n const states = useLastLoginInfoState()\n return {\n currentSourceAppName: states.currentSourceAppNameState.value,\n lastLoginMethod: states.lastLoginMethodState.value,\n lastLoginSourceAppName: states.lastLoginSourceAppNameState.value,\n lastLoginSourceAppURL: states.lastLoginSourceAppURLState.value,\n lastLoginDate: states.lastLoginDateState.value,\n }\n}\n\nexport function clearLastLoginInfo() {\n const keys = [\n CURRENT_SOURCEAPP_NAME_LOCALSTORAGE_KEY,\n LAST_LOGIN_METHOD_LOCALSTORAGE_KEY,\n LAST_LOGIN_SOURCEAPP_NAME_LOCALSTORAGE_KEY,\n LAST_LOGIN_SOURCEAPP_URL_LOCALSTORAGE_KEY,\n LAST_LOGIN_DATE_LOCALSTORAGE_KEY,\n ]\n keys.forEach(key => localStorage.removeItem(key))\n}\n\nfunction getSourceAppIndefiniteArticle(val: string) {\n return val.match(/^[aeiou]/i) ? 'an' : 'a'\n}\n\nfunction getSourceAppDefiniteArticle(val: string) {\n return val.match(' Portal$') ? 'the ' : ''\n}\n\nexport default function LastLoginInfo(props: LastLoginInfoProps) {\n const {\n currentSourceAppName,\n lastLoginMethod,\n lastLoginSourceAppName,\n lastLoginSourceAppURL,\n lastLoginDate,\n display,\n } = props\n\n const showLastLoginInfo =\n currentSourceAppName &&\n lastLoginMethod &&\n lastLoginSourceAppName &&\n lastLoginSourceAppURL &&\n lastLoginDate &&\n currentSourceAppName !== lastLoginSourceAppName\n\n if (!showLastLoginInfo) {\n return null\n }\n\n const currentSourceAppIndefiniteArticle =\n getSourceAppIndefiniteArticle(currentSourceAppName)\n const currentSourceAppDefiniteArticle =\n getSourceAppDefiniteArticle(currentSourceAppName)\n const lastLoginSourceAppDefiniteArticle = getSourceAppDefiniteArticle(\n lastLoginSourceAppName,\n )\n\n const title = `You may already have ${currentSourceAppIndefiniteArticle} ${currentSourceAppName} account`\n const accountLastUsed = `Account last used on ${formatDate(\n dayjs(lastLoginDate),\n 'MMMM D, YYYY',\n )}`\n\n const tooltipText = (\n <>\n <Typography\n variant=\"smallText2\"\n sx={{\n mb: 1,\n }}\n >\n {title}\n </Typography>\n <Typography\n variant=\"smallText1\"\n color=\"white\"\n sx={{\n mb: 1,\n }}\n >\n {`This computer was used to sign in to an account on ${lastLoginSourceAppDefiniteArticle}${lastLoginSourceAppName}. \n You can use the same account to sign in to ${currentSourceAppDefiniteArticle}${currentSourceAppName}.`}\n </Typography>\n <Typography variant=\"smallText1\" color=\"white\">\n {accountLastUsed}\n </Typography>\n </>\n )\n\n const boxText = (\n <>\n <Typography\n variant=\"smallText2\"\n sx={{\n mb: 1,\n color: 'grey.900',\n fontSize: '12px',\n }}\n >\n {title}\n </Typography>\n <Typography\n variant=\"smallText1\"\n sx={{\n mb: 1,\n color: 'grey.900',\n fontSize: '12px',\n }}\n >\n It looks like you already have an account, last used on{' '}\n {lastLoginSourceAppDefiniteArticle}\n <Link href={lastLoginSourceAppURL}>{lastLoginSourceAppName}</Link>.{' '}\n {`You can use this account to sign in via ${getLoginMethodFriendlyName(\n lastLoginMethod,\n )}.`}\n </Typography>\n <Typography\n variant=\"smallText1\"\n sx={{ color: 'grey.700', fontSize: '10px' }}\n >\n {accountLastUsed}\n </Typography>\n </>\n )\n\n return (\n <>\n {display === 'sentence' ? (\n <Typography\n variant=\"smallText1\"\n sx={{ color: 'grey.700', textTransform: 'none' }}\n >\n You may be able to use an existing account\n <Tooltip\n title={tooltipText}\n placement={'top'}\n slotProps={{\n tooltip: {\n sx: {\n bgcolor: '#63676C',\n '& .MuiTooltip-arrow': {\n color: '#63676C',\n },\n },\n },\n }}\n >\n <InfoTwoTone\n sx={{\n color: 'grey.700',\n width: '12px',\n height: '12px',\n ml: '4px',\n verticalAlign: 'middle',\n }}\n />\n </Tooltip>\n </Typography>\n ) : (\n <Box sx={{ backgroundColor: 'grey.100', p: '10px' }}>{boxText}</Box>\n )}\n </>\n )\n}\n"],"mappings":";;;;;;;;;AAuBA,SAAgB,IAAwB;CACtC,OAAO;EACL,2BAA2B,EACzB,CACF;EACA,sBAAsB,EACpB,CACF;EACA,6BAA6B,EAC3B,CACF;EACA,4BAA4B,EAC1B,CACF;EACA,oBAAoB,EAClB,CACF;CACF;AACF;AAEA,SAAgB,IAAmB;CACjC,IAAM,IAAS,EAAsB;CACrC,OAAO;EACL,sBAAsB,EAAO,0BAA0B;EACvD,iBAAiB,EAAO,qBAAqB;EAC7C,wBAAwB,EAAO,4BAA4B;EAC3D,uBAAuB,EAAO,2BAA2B;EACzD,eAAe,EAAO,mBAAmB;CAC3C;AACF;AAEA,SAAgB,IAAqB;CAQnC;EANE;EACA;EACA;EACA;EACA;CAEF,EAAK,SAAQ,MAAO,aAAa,WAAW,CAAG,CAAC;AAClD;AAEA,SAAS,EAA8B,GAAa;CAClD,OAAO,EAAI,MAAM,WAAW,IAAI,OAAO;AACzC;AAEA,SAAS,EAA4B,GAAa;CAChD,OAAO,EAAI,MAAM,UAAU,IAAI,SAAS;AAC1C;AAEA,SAAwB,EAAc,GAA2B;CAC/D,IAAM,EACJ,yBACA,oBACA,2BACA,0BACA,kBACA,eACE;CAUJ,IAAI,EAPF,KACA,KACA,KACA,KACA,KACA,MAAyB,IAGzB,OAAO;CAGT,IAAM,IACJ,EAA8B,CAAoB,GAC9C,IACJ,EAA4B,CAAoB,GAC5C,IAAoC,EACxC,CACF,GAEM,IAAQ,wBAAwB,EAAkC,GAAG,EAAqB,WAC1F,IAAkB,wBAAwB,EAC9C,EAAM,CAAa,GACnB,cACF,KAEM,IACJ,kBAAA,GAAA,EAAA,UAAA;EACE,kBAAC,GAAD;GACE,SAAQ;GACR,IAAI,EACF,IAAI,EACN;aAEC;EACS,CAAA;EACZ,kBAAC,GAAD;GACE,SAAQ;GACR,OAAM;GACN,IAAI,EACF,IAAI,EACN;aAEC,sDAAsD,IAAoC,EAAuB;uDACnE,IAAkC,EAAqB;EAC5F,CAAA;EACZ,kBAAC,GAAD;GAAY,SAAQ;GAAa,OAAM;aACpC;EACS,CAAA;CACZ,EAAA,CAAA,GAGE,IACJ,kBAAA,GAAA,EAAA,UAAA;EACE,kBAAC,GAAD;GACE,SAAQ;GACR,IAAI;IACF,IAAI;IACJ,OAAO;IACP,UAAU;GACZ;aAEC;EACS,CAAA;EACZ,kBAAC,GAAD;GACE,SAAQ;GACR,IAAI;IACF,IAAI;IACJ,OAAO;IACP,UAAU;GACZ;aANF;IAOC;IACyD;IACvD;IACD,kBAAC,GAAD;KAAM,MAAM;eAAwB;IAA6B,CAAA;IAAC;IAAE;IACnE,2CAA2C,EAC1C,CACF,EAAE;GACQ;;EACZ,kBAAC,GAAD;GACE,SAAQ;GACR,IAAI;IAAE,OAAO;IAAY,UAAU;GAAO;aAEzC;EACS,CAAA;CACZ,EAAA,CAAA;CAGJ,OACE,kBAAA,GAAA,EAAA,UACG,MAAY,aACX,kBAAC,GAAD;EACE,SAAQ;EACR,IAAI;GAAE,OAAO;GAAY,eAAe;EAAO;YAFjD,CAGC,8CAEC,kBAAC,GAAD;GACE,OAAO;GACP,WAAW;GACX,WAAW,EACT,SAAS,EACP,IAAI;IACF,SAAS;IACT,uBAAuB,EACrB,OAAO,UACT;GACF,EACF,EACF;aAEA,kBAAC,GAAD,EACE,IAAI;IACF,OAAO;IACP,OAAO;IACP,QAAQ;IACR,IAAI;IACJ,eAAe;GACjB,EACD,CAAA;EACM,CAAA,CACC;MAEZ,kBAAC,GAAD;EAAK,IAAI;GAAE,iBAAiB;GAAY,GAAG;EAAO;YAAI;CAAa,CAAA,EAErE,CAAA;AAEN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoginFlowBackButton.js","names":[],"sources":["../../../src/components/Authentication/LoginFlowBackButton.tsx"],"sourcesContent":["import { UseLoginReturn } from '@/utils/hooks'\nimport { LOGIN_BACK_BUTTON_CLASS_NAME } from '@/utils/SynapseConstants'\nimport { IconButton, SxProps } from '@mui/material'\nimport IconSvg from '../IconSvg/IconSvg'\n\ntype LoginFormBackButtonProps = {\n step: UseLoginReturn['step']\n onStepChange: (step: UseLoginReturn['step']) => void\n sx?: SxProps\n}\n\nfunction getPreviousStep(currentStep: UseLoginReturn['step']) {\n switch (currentStep) {\n case 'CHOOSE_AUTH_METHOD':\n // Should never happen\n return 'CHOOSE_AUTH_METHOD'\n case 'USERNAME_PASSWORD':\n return 'CHOOSE_AUTH_METHOD'\n case 'VERIFICATION_CODE':\n // Could have reached this step from either username + password or OAuth sign in, so go back to the beginning\n return 'CHOOSE_AUTH_METHOD'\n case 'RECOVERY_CODE':\n return 'VERIFICATION_CODE'\n case 'DISABLE_2FA_PROMPT':\n return 'VERIFICATION_CODE'\n case 'LOGGED_IN':\n // Should never happen\n return 'LOGGED_IN'\n }\n}\n\nexport default function LoginFlowBackButton(props: LoginFormBackButtonProps) {\n const { step, onStepChange, sx } = props\n const shouldRender =\n step === 'USERNAME_PASSWORD' ||\n step === 'VERIFICATION_CODE' ||\n step === 'RECOVERY_CODE'\n\n if (!shouldRender) {\n return null\n }\n return (\n <IconButton\n className={LOGIN_BACK_BUTTON_CLASS_NAME}\n type=\"button\"\n onClick={() => {\n onStepChange(getPreviousStep(step))\n }}\n sx={sx}\n >\n <IconSvg\n icon=\"arrowBack\"\n wrap={false}\n sx={{ height: '24px', width: '24px' }}\n />\n </IconButton>\n )\n}\n"],"mappings":";;;;;AAWA,SAAS,EAAgB,GAAqC;
|
|
1
|
+
{"version":3,"file":"LoginFlowBackButton.js","names":[],"sources":["../../../src/components/Authentication/LoginFlowBackButton.tsx"],"sourcesContent":["import { UseLoginReturn } from '@/utils/hooks'\nimport { LOGIN_BACK_BUTTON_CLASS_NAME } from '@/utils/SynapseConstants'\nimport { IconButton, SxProps } from '@mui/material'\nimport IconSvg from '../IconSvg/IconSvg'\n\ntype LoginFormBackButtonProps = {\n step: UseLoginReturn['step']\n onStepChange: (step: UseLoginReturn['step']) => void\n sx?: SxProps\n}\n\nfunction getPreviousStep(currentStep: UseLoginReturn['step']) {\n switch (currentStep) {\n case 'CHOOSE_AUTH_METHOD':\n // Should never happen\n return 'CHOOSE_AUTH_METHOD'\n case 'USERNAME_PASSWORD':\n return 'CHOOSE_AUTH_METHOD'\n case 'VERIFICATION_CODE':\n // Could have reached this step from either username + password or OAuth sign in, so go back to the beginning\n return 'CHOOSE_AUTH_METHOD'\n case 'RECOVERY_CODE':\n return 'VERIFICATION_CODE'\n case 'DISABLE_2FA_PROMPT':\n return 'VERIFICATION_CODE'\n case 'LOGGED_IN':\n // Should never happen\n return 'LOGGED_IN'\n }\n}\n\nexport default function LoginFlowBackButton(props: LoginFormBackButtonProps) {\n const { step, onStepChange, sx } = props\n const shouldRender =\n step === 'USERNAME_PASSWORD' ||\n step === 'VERIFICATION_CODE' ||\n step === 'RECOVERY_CODE'\n\n if (!shouldRender) {\n return null\n }\n return (\n <IconButton\n className={LOGIN_BACK_BUTTON_CLASS_NAME}\n type=\"button\"\n onClick={() => {\n onStepChange(getPreviousStep(step))\n }}\n sx={sx}\n >\n <IconSvg\n icon=\"arrowBack\"\n wrap={false}\n sx={{ height: '24px', width: '24px' }}\n />\n </IconButton>\n )\n}\n"],"mappings":";;;;;AAWA,SAAS,EAAgB,GAAqC;CAC5D,QAAQ,GAAR;EACE,KAAK,sBAEH,OAAO;EACT,KAAK,qBACH,OAAO;EACT,KAAK,qBAEH,OAAO;EACT,KAAK,iBACH,OAAO;EACT,KAAK,sBACH,OAAO;EACT,KAAK,aAEH,OAAO;CACX;AACF;AAEA,SAAwB,EAAoB,GAAiC;CAC3E,IAAM,EAAE,SAAM,iBAAc,UAAO;CASnC,OAPE,MAAS,uBACT,MAAS,uBACT,MAAS,kBAMT,kBAAC,GAAD;EACE,WAAW;EACX,MAAK;EACL,eAAe;GACb,EAAa,EAAgB,CAAI,CAAC;EACpC;EACI;YAEJ,kBAAC,GAAD;GACE,MAAK;GACL,MAAM;GACN,IAAI;IAAE,QAAQ;IAAQ,OAAO;GAAO;EACrC,CAAA;CACS,CAAA,IAhBL;AAkBX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoginForm.js","names":[],"sources":["../../../src/components/Authentication/LoginForm.tsx"],"sourcesContent":["import { OAuth2State } from '@/utils'\nimport appendFinalQueryParamKey from '@/utils/appendFinalQueryParamKey'\nimport { UseLoginReturn, useOneSageURL } from '@/utils/hooks'\nimport { Box, Link } from '@mui/material'\nimport { TwoFactorAuthErrorResponse } from '@sage-bionetworks/synapse-types'\nimport { Realm } from '@sage-bionetworks/synapse-client'\nimport { noop } from 'lodash-es'\nimport FullWidthAlert from '../FullWidthAlert/FullWidthAlert'\nimport AuthenticationMethodSelection from './AuthenticationMethodSelection'\nimport OneTimePasswordForm from './OneTimePasswordForm'\nimport UsernamePasswordForm from './UsernamePasswordForm'\n\ntype Props = {\n ssoRedirectUrl?: string\n registerAccountUrl?: string\n resetPasswordUrl?: string\n /* Invoked before redirecting to Google. Useful in portals where we may want to store the current URL to redirect back here. */\n onBeginOAuthSignIn?: () => void\n step: UseLoginReturn['step']\n onStepChange: (step: UseLoginReturn['step']) => void\n /* optionally pass the 2FA error response to directly start the 2FA challenge */\n twoFactorAuthenticationRequired?: TwoFactorAuthErrorResponse\n submitUsernameAndPassword: UseLoginReturn['submitUsernameAndPassword']\n submitOneTimePassword: UseLoginReturn['submitOneTimePassword']\n errorMessage: UseLoginReturn['errorMessage']\n loginIsPending: UseLoginReturn['loginIsPending']\n beginTwoFactorAuthReset: UseLoginReturn['beginTwoFactorAuthReset']\n twoFactorAuthResetIsSuccess: UseLoginReturn['twoFactorAuthResetIsSuccess']\n twoFactorAuthResetIsPending: UseLoginReturn['twoFactorAuthResetIsPending']\n hideRegisterButton?: boolean\n hideForgotPasswordButton?: boolean\n // Optional state passed to and returned by an identity provider on SSO\n ssoState?: OAuth2State\n /* The URI where the user should be directed in an email when attempting to reset 2FA */\n twoFactorAuthResetUri?: string\n /* Invoked when password login is selected */\n onPasswordLoginSelected?: () => void\n realm?: Realm\n}\n\nexport default function LoginForm(props: Props) {\n const defaultRegistrationUrl = useOneSageURL('/register1')\n const defaultTwoFactorAuthResetUrl = useOneSageURL('/reset2FA')\n\n const {\n ssoRedirectUrl,\n ssoState,\n registerAccountUrl = defaultRegistrationUrl.toString(),\n resetPasswordUrl,\n onBeginOAuthSignIn,\n onStepChange,\n step,\n submitUsernameAndPassword,\n submitOneTimePassword,\n errorMessage,\n loginIsPending,\n beginTwoFactorAuthReset,\n hideRegisterButton,\n hideForgotPasswordButton,\n twoFactorAuthResetIsSuccess,\n twoFactorAuthResetIsPending,\n twoFactorAuthResetUri = appendFinalQueryParamKey(\n defaultTwoFactorAuthResetUrl,\n 'twoFAResetToken',\n ),\n onPasswordLoginSelected = noop,\n realm,\n } = props\n\n return (\n <>\n {step == 'CHOOSE_AUTH_METHOD' && (\n <AuthenticationMethodSelection\n onSelectUsernameAndPassword={() => {\n onPasswordLoginSelected()\n onStepChange('USERNAME_PASSWORD')\n }}\n onBeginOAuthSignIn={onBeginOAuthSignIn}\n ssoRedirectUrl={ssoRedirectUrl}\n state={ssoState}\n realm={realm}\n />\n )}\n {step === 'USERNAME_PASSWORD' && (\n <UsernamePasswordForm\n loginIsPending={loginIsPending}\n resetPasswordUrl={resetPasswordUrl}\n onSubmit={(username, password) => {\n submitUsernameAndPassword(username, password)\n }}\n hideForgotPasswordButton={hideForgotPasswordButton}\n />\n )}\n {(step === 'VERIFICATION_CODE' ||\n step === 'RECOVERY_CODE' ||\n step === 'DISABLE_2FA_PROMPT') && (\n <OneTimePasswordForm\n step={step}\n loginIsPending={loginIsPending}\n onSubmit={(totp, otpType) => {\n submitOneTimePassword(totp, otpType)\n }}\n onClickUseTOTP={() => {\n onStepChange('VERIFICATION_CODE')\n }}\n onClickUseBackupCode={() => {\n onStepChange('RECOVERY_CODE')\n }}\n onClickPromptReset2FA={() => {\n onStepChange('DISABLE_2FA_PROMPT')\n }}\n onClickReset2FA={() => {\n beginTwoFactorAuthReset(twoFactorAuthResetUri)\n }}\n twoFactorAuthResetIsPending={twoFactorAuthResetIsPending}\n twoFactorAuthResetIsSuccess={twoFactorAuthResetIsSuccess}\n />\n )}\n {!hideRegisterButton &&\n (step === 'CHOOSE_AUTH_METHOD' || step === 'USERNAME_PASSWORD') && (\n <Box sx={{ display: 'flex', justifyContent: 'center', mt: '10px' }}>\n <Link href={registerAccountUrl} align={'center'}>\n Don't have an account? Create one now\n </Link>\n </Box>\n )}\n {errorMessage && (\n <FullWidthAlert\n variant={'warning'}\n isGlobal={false}\n description={errorMessage}\n />\n )}\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;AAwCA,SAAwB,EAAU,GAAc;CAC9C,IAAM,IAAyB,EAAc,
|
|
1
|
+
{"version":3,"file":"LoginForm.js","names":[],"sources":["../../../src/components/Authentication/LoginForm.tsx"],"sourcesContent":["import { OAuth2State } from '@/utils'\nimport appendFinalQueryParamKey from '@/utils/appendFinalQueryParamKey'\nimport { UseLoginReturn, useOneSageURL } from '@/utils/hooks'\nimport { Box, Link } from '@mui/material'\nimport { TwoFactorAuthErrorResponse } from '@sage-bionetworks/synapse-types'\nimport { Realm } from '@sage-bionetworks/synapse-client'\nimport { noop } from 'lodash-es'\nimport FullWidthAlert from '../FullWidthAlert/FullWidthAlert'\nimport AuthenticationMethodSelection from './AuthenticationMethodSelection'\nimport OneTimePasswordForm from './OneTimePasswordForm'\nimport UsernamePasswordForm from './UsernamePasswordForm'\n\ntype Props = {\n ssoRedirectUrl?: string\n registerAccountUrl?: string\n resetPasswordUrl?: string\n /* Invoked before redirecting to Google. Useful in portals where we may want to store the current URL to redirect back here. */\n onBeginOAuthSignIn?: () => void\n step: UseLoginReturn['step']\n onStepChange: (step: UseLoginReturn['step']) => void\n /* optionally pass the 2FA error response to directly start the 2FA challenge */\n twoFactorAuthenticationRequired?: TwoFactorAuthErrorResponse\n submitUsernameAndPassword: UseLoginReturn['submitUsernameAndPassword']\n submitOneTimePassword: UseLoginReturn['submitOneTimePassword']\n errorMessage: UseLoginReturn['errorMessage']\n loginIsPending: UseLoginReturn['loginIsPending']\n beginTwoFactorAuthReset: UseLoginReturn['beginTwoFactorAuthReset']\n twoFactorAuthResetIsSuccess: UseLoginReturn['twoFactorAuthResetIsSuccess']\n twoFactorAuthResetIsPending: UseLoginReturn['twoFactorAuthResetIsPending']\n hideRegisterButton?: boolean\n hideForgotPasswordButton?: boolean\n // Optional state passed to and returned by an identity provider on SSO\n ssoState?: OAuth2State\n /* The URI where the user should be directed in an email when attempting to reset 2FA */\n twoFactorAuthResetUri?: string\n /* Invoked when password login is selected */\n onPasswordLoginSelected?: () => void\n realm?: Realm\n}\n\nexport default function LoginForm(props: Props) {\n const defaultRegistrationUrl = useOneSageURL('/register1')\n const defaultTwoFactorAuthResetUrl = useOneSageURL('/reset2FA')\n\n const {\n ssoRedirectUrl,\n ssoState,\n registerAccountUrl = defaultRegistrationUrl.toString(),\n resetPasswordUrl,\n onBeginOAuthSignIn,\n onStepChange,\n step,\n submitUsernameAndPassword,\n submitOneTimePassword,\n errorMessage,\n loginIsPending,\n beginTwoFactorAuthReset,\n hideRegisterButton,\n hideForgotPasswordButton,\n twoFactorAuthResetIsSuccess,\n twoFactorAuthResetIsPending,\n twoFactorAuthResetUri = appendFinalQueryParamKey(\n defaultTwoFactorAuthResetUrl,\n 'twoFAResetToken',\n ),\n onPasswordLoginSelected = noop,\n realm,\n } = props\n\n return (\n <>\n {step == 'CHOOSE_AUTH_METHOD' && (\n <AuthenticationMethodSelection\n onSelectUsernameAndPassword={() => {\n onPasswordLoginSelected()\n onStepChange('USERNAME_PASSWORD')\n }}\n onBeginOAuthSignIn={onBeginOAuthSignIn}\n ssoRedirectUrl={ssoRedirectUrl}\n state={ssoState}\n realm={realm}\n />\n )}\n {step === 'USERNAME_PASSWORD' && (\n <UsernamePasswordForm\n loginIsPending={loginIsPending}\n resetPasswordUrl={resetPasswordUrl}\n onSubmit={(username, password) => {\n submitUsernameAndPassword(username, password)\n }}\n hideForgotPasswordButton={hideForgotPasswordButton}\n />\n )}\n {(step === 'VERIFICATION_CODE' ||\n step === 'RECOVERY_CODE' ||\n step === 'DISABLE_2FA_PROMPT') && (\n <OneTimePasswordForm\n step={step}\n loginIsPending={loginIsPending}\n onSubmit={(totp, otpType) => {\n submitOneTimePassword(totp, otpType)\n }}\n onClickUseTOTP={() => {\n onStepChange('VERIFICATION_CODE')\n }}\n onClickUseBackupCode={() => {\n onStepChange('RECOVERY_CODE')\n }}\n onClickPromptReset2FA={() => {\n onStepChange('DISABLE_2FA_PROMPT')\n }}\n onClickReset2FA={() => {\n beginTwoFactorAuthReset(twoFactorAuthResetUri)\n }}\n twoFactorAuthResetIsPending={twoFactorAuthResetIsPending}\n twoFactorAuthResetIsSuccess={twoFactorAuthResetIsSuccess}\n />\n )}\n {!hideRegisterButton &&\n (step === 'CHOOSE_AUTH_METHOD' || step === 'USERNAME_PASSWORD') && (\n <Box sx={{ display: 'flex', justifyContent: 'center', mt: '10px' }}>\n <Link href={registerAccountUrl} align={'center'}>\n Don't have an account? Create one now\n </Link>\n </Box>\n )}\n {errorMessage && (\n <FullWidthAlert\n variant={'warning'}\n isGlobal={false}\n description={errorMessage}\n />\n )}\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;AAwCA,SAAwB,EAAU,GAAc;CAC9C,IAAM,IAAyB,EAAc,YAAY,GACnD,IAA+B,EAAc,WAAW,GAExD,EACJ,mBACA,aACA,wBAAqB,EAAuB,SAAS,GACrD,qBACA,uBACA,iBACA,SACA,8BACA,0BACA,iBACA,mBACA,4BACA,uBACA,6BACA,gCACA,gCACA,2BAAwB,EACtB,GACA,iBACF,GACA,6BAA0B,GAC1B,aACE;CAEJ,OACE,kBAAA,GAAA,EAAA,UAAA;EACG,KAAQ,wBACP,kBAAC,GAAD;GACE,mCAAmC;IAEjC,AADA,EAAwB,GACxB,EAAa,mBAAmB;GAClC;GACoB;GACJ;GAChB,OAAO;GACA;EACR,CAAA;EAEF,MAAS,uBACR,kBAAC,GAAD;GACkB;GACE;GAClB,WAAW,GAAU,MAAa;IAChC,EAA0B,GAAU,CAAQ;GAC9C;GAC0B;EAC3B,CAAA;GAED,MAAS,uBACT,MAAS,mBACT,MAAS,yBACT,kBAAC,GAAD;GACQ;GACU;GAChB,WAAW,GAAM,MAAY;IAC3B,EAAsB,GAAM,CAAO;GACrC;GACA,sBAAsB;IACpB,EAAa,mBAAmB;GAClC;GACA,4BAA4B;IAC1B,EAAa,eAAe;GAC9B;GACA,6BAA6B;IAC3B,EAAa,oBAAoB;GACnC;GACA,uBAAuB;IACrB,EAAwB,CAAqB;GAC/C;GAC6B;GACA;EAC9B,CAAA;EAEF,CAAC,MACC,MAAS,wBAAwB,MAAS,wBACzC,kBAAC,GAAD;GAAK,IAAI;IAAE,SAAS;IAAQ,gBAAgB;IAAU,IAAI;GAAO;aAC/D,kBAAC,GAAD;IAAM,MAAM;IAAoB,OAAO;cAAU;GAE3C,CAAA;EACH,CAAA;EAER,KACC,kBAAC,GAAD;GACE,SAAS;GACT,UAAU;GACV,aAAa;EACd,CAAA;CAEH,EAAA,CAAA;AAEN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoginMethod.js","names":[],"sources":["../../../src/components/Authentication/LoginMethod.ts"],"sourcesContent":["import {\n LOGIN_METHOD_EMAIL,\n LOGIN_METHOD_OAUTH2_ARCUS,\n LOGIN_METHOD_OAUTH2_GOOGLE,\n LOGIN_METHOD_OAUTH2_ORCID,\n LOGIN_METHOD_OAUTH2_SAGE_BIONETWORKS,\n} from '@/utils/SynapseConstants'\n\nexport const LoginMethods = [\n LOGIN_METHOD_OAUTH2_ARCUS,\n LOGIN_METHOD_OAUTH2_GOOGLE,\n LOGIN_METHOD_OAUTH2_ORCID,\n LOGIN_METHOD_EMAIL,\n LOGIN_METHOD_OAUTH2_SAGE_BIONETWORKS,\n] as const\nexport type LoginMethod = (typeof LoginMethods)[number]\n\nexport function getLoginMethodFriendlyName(loginMethod: LoginMethod) {\n switch (loginMethod) {\n case LOGIN_METHOD_OAUTH2_ARCUS:\n return 'Arcus Biosciences'\n case LOGIN_METHOD_OAUTH2_GOOGLE:\n return 'Google'\n case LOGIN_METHOD_OAUTH2_ORCID:\n return 'ORCiD'\n case LOGIN_METHOD_EMAIL:\n return 'your email'\n case LOGIN_METHOD_OAUTH2_SAGE_BIONETWORKS:\n return 'Sage Bionetworks (Realm)'\n default:\n return 'unknown login method'\n }\n}\n"],"mappings":";;AAQA,IAAa,IAAe;CAC1B;CACA;CACA;CACA;CACA;
|
|
1
|
+
{"version":3,"file":"LoginMethod.js","names":[],"sources":["../../../src/components/Authentication/LoginMethod.ts"],"sourcesContent":["import {\n LOGIN_METHOD_EMAIL,\n LOGIN_METHOD_OAUTH2_ARCUS,\n LOGIN_METHOD_OAUTH2_GOOGLE,\n LOGIN_METHOD_OAUTH2_ORCID,\n LOGIN_METHOD_OAUTH2_SAGE_BIONETWORKS,\n} from '@/utils/SynapseConstants'\n\nexport const LoginMethods = [\n LOGIN_METHOD_OAUTH2_ARCUS,\n LOGIN_METHOD_OAUTH2_GOOGLE,\n LOGIN_METHOD_OAUTH2_ORCID,\n LOGIN_METHOD_EMAIL,\n LOGIN_METHOD_OAUTH2_SAGE_BIONETWORKS,\n] as const\nexport type LoginMethod = (typeof LoginMethods)[number]\n\nexport function getLoginMethodFriendlyName(loginMethod: LoginMethod) {\n switch (loginMethod) {\n case LOGIN_METHOD_OAUTH2_ARCUS:\n return 'Arcus Biosciences'\n case LOGIN_METHOD_OAUTH2_GOOGLE:\n return 'Google'\n case LOGIN_METHOD_OAUTH2_ORCID:\n return 'ORCiD'\n case LOGIN_METHOD_EMAIL:\n return 'your email'\n case LOGIN_METHOD_OAUTH2_SAGE_BIONETWORKS:\n return 'Sage Bionetworks (Realm)'\n default:\n return 'unknown login method'\n }\n}\n"],"mappings":";;AAQA,IAAa,IAAe;CAC1B;CACA;CACA;CACA;CACA;AACF;AAGA,SAAgB,EAA2B,GAA0B;CACnE,QAAQ,GAAR;EACE,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,KAAK,GACH,OAAO;EACT,SACE,OAAO;CACX;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoginMethodButton.js","names":[],"sources":["../../../src/components/Authentication/LoginMethodButton.tsx"],"sourcesContent":["import { Box, Button, SxProps } from '@mui/material'\nimport { MouseEventHandler } from 'react'\nimport IconSvg, { IconName } from '../IconSvg'\nimport LastLoginInfo, { useLastLoginInfo } from './LastLoginInfo'\nimport { LoginMethod, getLoginMethodFriendlyName } from './LoginMethod'\n\nconst buttonSx: SxProps = {\n color: 'grey.800',\n mb: '10px',\n}\n\nconst iconSx: SxProps = {\n width: '28px',\n height: '28px',\n}\n\nexport type LoginMethodButtonProps = {\n loginMethod: LoginMethod\n iconName?: IconName\n onClick: MouseEventHandler<HTMLButtonElement>\n}\n\nexport default function LoginMethodButton(props: LoginMethodButtonProps) {\n const { loginMethod, iconName, onClick } = props\n\n const { lastLoginMethod, ...rest } = useLastLoginInfo()\n const lastLoginInfo = LastLoginInfo({\n lastLoginMethod: lastLoginMethod,\n display: 'sentence',\n ...rest,\n })\n\n const shouldShowLastLoginInfo =\n lastLoginMethod === loginMethod && lastLoginInfo\n\n const buttonText = `Sign in with ${getLoginMethodFriendlyName(loginMethod)}`\n\n return (\n <>\n {shouldShowLastLoginInfo ? (\n <Button\n fullWidth\n variant=\"outlined\"\n onClick={onClick}\n sx={{ ...buttonSx, height: '74px', py: 1.5 }}\n data-testid=\"button-with-last-login-info\"\n >\n <Box\n sx={{\n flexDirection: 'column',\n }}\n >\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n mb: '10px',\n }}\n >\n {iconName && (\n <IconSvg icon={iconName} sx={{ ...iconSx, mr: 1, ml: -0.5 }} />\n )}\n {buttonText}\n </Box>\n {lastLoginInfo}\n </Box>\n </Button>\n ) : (\n <Button\n fullWidth\n variant=\"outlined\"\n onClick={onClick}\n sx={{ ...buttonSx, height: '50px' }}\n startIcon={iconName && <IconSvg icon={iconName} sx={iconSx} />}\n data-testid=\"button-without-last-login-info\"\n >\n {buttonText}\n </Button>\n )}\n </>\n )\n}\n"],"mappings":";;;;;;AAMA,IAAM,IAAoB;CACxB,OAAO;CACP,IAAI;
|
|
1
|
+
{"version":3,"file":"LoginMethodButton.js","names":[],"sources":["../../../src/components/Authentication/LoginMethodButton.tsx"],"sourcesContent":["import { Box, Button, SxProps } from '@mui/material'\nimport { MouseEventHandler } from 'react'\nimport IconSvg, { IconName } from '../IconSvg'\nimport LastLoginInfo, { useLastLoginInfo } from './LastLoginInfo'\nimport { LoginMethod, getLoginMethodFriendlyName } from './LoginMethod'\n\nconst buttonSx: SxProps = {\n color: 'grey.800',\n mb: '10px',\n}\n\nconst iconSx: SxProps = {\n width: '28px',\n height: '28px',\n}\n\nexport type LoginMethodButtonProps = {\n loginMethod: LoginMethod\n iconName?: IconName\n onClick: MouseEventHandler<HTMLButtonElement>\n}\n\nexport default function LoginMethodButton(props: LoginMethodButtonProps) {\n const { loginMethod, iconName, onClick } = props\n\n const { lastLoginMethod, ...rest } = useLastLoginInfo()\n const lastLoginInfo = LastLoginInfo({\n lastLoginMethod: lastLoginMethod,\n display: 'sentence',\n ...rest,\n })\n\n const shouldShowLastLoginInfo =\n lastLoginMethod === loginMethod && lastLoginInfo\n\n const buttonText = `Sign in with ${getLoginMethodFriendlyName(loginMethod)}`\n\n return (\n <>\n {shouldShowLastLoginInfo ? (\n <Button\n fullWidth\n variant=\"outlined\"\n onClick={onClick}\n sx={{ ...buttonSx, height: '74px', py: 1.5 }}\n data-testid=\"button-with-last-login-info\"\n >\n <Box\n sx={{\n flexDirection: 'column',\n }}\n >\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n mb: '10px',\n }}\n >\n {iconName && (\n <IconSvg icon={iconName} sx={{ ...iconSx, mr: 1, ml: -0.5 }} />\n )}\n {buttonText}\n </Box>\n {lastLoginInfo}\n </Box>\n </Button>\n ) : (\n <Button\n fullWidth\n variant=\"outlined\"\n onClick={onClick}\n sx={{ ...buttonSx, height: '50px' }}\n startIcon={iconName && <IconSvg icon={iconName} sx={iconSx} />}\n data-testid=\"button-without-last-login-info\"\n >\n {buttonText}\n </Button>\n )}\n </>\n )\n}\n"],"mappings":";;;;;;AAMA,IAAM,IAAoB;CACxB,OAAO;CACP,IAAI;AACN,GAEM,IAAkB;CACtB,OAAO;CACP,QAAQ;AACV;AAQA,SAAwB,EAAkB,GAA+B;CACvE,IAAM,EAAE,gBAAa,aAAU,eAAY,GAErC,EAAE,oBAAiB,GAAG,MAAS,EAAiB,GAChD,IAAgB,EAAc;EACjB;EACjB,SAAS;EACT,GAAG;CACL,CAAC,GAEK,IACJ,MAAoB,KAAe,GAE/B,IAAa,gBAAgB,EAA2B,CAAW;CAEzE,OACE,kBAAA,GAAA,EAAA,UACG,IACC,kBAAC,GAAD;EACE,WAAA;EACA,SAAQ;EACC;EACT,IAAI;GAAE,GAAG;GAAU,QAAQ;GAAQ,IAAI;EAAI;EAC3C,eAAY;YAEZ,kBAAC,GAAD;GACE,IAAI,EACF,eAAe,SACjB;aAHF,CAKE,kBAAC,GAAD;IACE,IAAI;KACF,SAAS;KACT,gBAAgB;KAChB,YAAY;KACZ,IAAI;IACN;cANF,CAQG,KACC,kBAAC,GAAD;KAAS,MAAM;KAAU,IAAI;MAAE,GAAG;MAAQ,IAAI;MAAG,IAAI;KAAK;IAAI,CAAA,GAE/D,CACE;OACJ,CACE;;CACC,CAAA,IAER,kBAAC,GAAD;EACE,WAAA;EACA,SAAQ;EACC;EACT,IAAI;GAAE,GAAG;GAAU,QAAQ;EAAO;EAClC,WAAW,KAAY,kBAAC,GAAD;GAAS,MAAM;GAAU,IAAI;EAAS,CAAA;EAC7D,eAAY;YAEX;CACK,CAAA,EAEV,CAAA;AAEN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Logout.js","names":[],"sources":["../../../src/components/Authentication/Logout.tsx"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport { Button } from '@mui/material'\n\nexport type LogoutProps = {\n callback: () => void\n}\n\nexport default function Logout(props: LogoutProps) {\n const { callback } = props\n return (\n <div>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n SynapseClient.signOut().then(callback)\n }}\n >\n Log out\n </Button>\n </div>\n )\n}\n"],"mappings":";;;;AAOA,SAAwB,EAAO,GAAoB;CACjD,IAAM,EAAE,gBAAa;
|
|
1
|
+
{"version":3,"file":"Logout.js","names":[],"sources":["../../../src/components/Authentication/Logout.tsx"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport { Button } from '@mui/material'\n\nexport type LogoutProps = {\n callback: () => void\n}\n\nexport default function Logout(props: LogoutProps) {\n const { callback } = props\n return (\n <div>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n SynapseClient.signOut().then(callback)\n }}\n >\n Log out\n </Button>\n </div>\n )\n}\n"],"mappings":";;;;AAOA,SAAwB,EAAO,GAAoB;CACjD,IAAM,EAAE,gBAAa;CACrB,OACE,kBAAC,OAAD,EAAA,UACE,kBAAC,GAAD;EACE,SAAQ;EACR,OAAM;EACN,eAAe;GACb,EAAc,QAAQ,EAAE,KAAK,CAAQ;EACvC;YACD;CAEO,CAAA,EACL,CAAA;AAET"}
|