@gen-epix/ui-client-casedb 4.0.0 → 4.0.1
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/@types/mui.d.ts +1 -1
- package/dist/@types/{ui-casedb.d.ts → ui-client-casedb.d.ts} +1 -1
- package/dist/_chunks/AddCasesToEventDialog.js +74 -74
- package/dist/_chunks/AddCasesToEventDialog.js.map +1 -1
- package/dist/_chunks/CaseContentForm.js +2 -2
- package/dist/_chunks/CaseContentForm.js.map +1 -1
- package/dist/_chunks/CaseDbDownloadUtil.js +40 -35
- package/dist/_chunks/CaseDbDownloadUtil.js.map +1 -1
- package/dist/_chunks/CaseInfoDialog.js +195 -195
- package/dist/_chunks/CaseInfoDialog.js.map +1 -1
- package/dist/_chunks/CaseSetInfoDialog.js +131 -131
- package/dist/_chunks/CaseSetInfoDialog.js.map +1 -1
- package/dist/_chunks/CaseTypeInfoDialog.js +63 -61
- package/dist/_chunks/CaseTypeInfoDialog.js.map +1 -1
- package/dist/_chunks/CasesAlreadyInCaseSetWarning.js +6 -6
- package/dist/_chunks/CasesAlreadyInCaseSetWarning.js.map +1 -1
- package/dist/_chunks/CompletCaseTypeLoader.js +3 -3
- package/dist/_chunks/CompletCaseTypeLoader.js.map +1 -1
- package/dist/_chunks/CreateEventDialogSuccessNotificationMessage.js +1 -1
- package/dist/_chunks/CreateEventDialogSuccessNotificationMessage.js.map +1 -1
- package/dist/_chunks/CustomTabPanel.js.map +1 -1
- package/dist/_chunks/Dashboard.js +399 -386
- package/dist/_chunks/Dashboard.js.map +1 -1
- package/dist/_chunks/DashboardStoreLoader.js +5 -5
- package/dist/_chunks/DashboardStoreLoader.js.map +1 -1
- package/dist/_chunks/DataCollectionAccessInfo.js +21 -21
- package/dist/_chunks/DataCollectionAccessInfo.js.map +1 -1
- package/dist/_chunks/EpiCurveUtil.js +4 -4
- package/dist/_chunks/EpiCurveUtil.js.map +1 -1
- package/dist/_chunks/EpiCurveWidget.js +189 -183
- package/dist/_chunks/EpiCurveWidget.js.map +1 -1
- package/dist/_chunks/FilterUtil.js +103 -101
- package/dist/_chunks/FilterUtil.js.map +1 -1
- package/dist/_chunks/FindSimilarCasesDialog.js +16 -16
- package/dist/_chunks/FindSimilarCasesDialog.js.map +1 -1
- package/dist/_chunks/FindSimilarCasesUtil.js +9 -9
- package/dist/_chunks/FindSimilarCasesUtil.js.map +1 -1
- package/dist/_chunks/HomePageTrends.js +8 -8
- package/dist/_chunks/HomePageTrends.js.map +1 -1
- package/dist/_chunks/LegendaItem.js +3 -3
- package/dist/_chunks/LegendaItem.js.map +1 -1
- package/dist/_chunks/LineListWidget.js +23 -21
- package/dist/_chunks/LineListWidget.js.map +1 -1
- package/dist/_chunks/PanelSeparator.js +374 -384
- package/dist/_chunks/PanelSeparator.js.map +1 -1
- package/dist/_chunks/Upload.js +222 -207
- package/dist/_chunks/Upload.js.map +1 -1
- package/dist/_chunks/UploadUtil.js +1970 -841
- package/dist/_chunks/UploadUtil.js.map +1 -1
- package/dist/_chunks/UserRightsDialog.js +12 -12
- package/dist/_chunks/UserRightsDialog.js.map +1 -1
- package/dist/_chunks/_MapCache.js +2 -2
- package/dist/_chunks/_baseGet.js +1 -1
- package/dist/_chunks/_baseGet.js.map +1 -1
- package/dist/_chunks/_baseIteratee.js +1 -1
- package/dist/_chunks/_baseIteratee.js.map +1 -1
- package/dist/_chunks/_setToString.js.map +1 -1
- package/dist/_chunks/{chunk-KS7C4IRE.js → chunk-BV7QT456.js} +330 -495
- package/dist/_chunks/chunk-BV7QT456.js.map +1 -0
- package/dist/_chunks/cloneDeep.js +11 -9
- package/dist/_chunks/cloneDeep.js.map +1 -1
- package/dist/_chunks/dashboardStore.js +259 -261
- package/dist/_chunks/dashboardStore.js.map +1 -1
- package/dist/_chunks/esm.js +2900 -2868
- package/dist/_chunks/esm.js.map +1 -1
- package/dist/_chunks/format.js +8 -8
- package/dist/_chunks/format.js.map +1 -1
- package/dist/_chunks/index.esm.js +919 -796
- package/dist/_chunks/index.esm.js.map +1 -1
- package/dist/_chunks/index.module.js +1 -1
- package/dist/_chunks/index.module.js.map +1 -1
- package/dist/_chunks/protectedTokens.js +79 -81
- package/dist/_chunks/protectedTokens.js.map +1 -1
- package/dist/_chunks/react.js +1 -1
- package/dist/_chunks/react.js.map +1 -1
- package/dist/_chunks/round.js +1 -1
- package/dist/_chunks/round.js.map +1 -1
- package/dist/_chunks/shallow.js +2 -2
- package/dist/_chunks/shallow.js.map +1 -1
- package/dist/_chunks/sync.js +198 -161
- package/dist/_chunks/sync.js.map +1 -1
- package/dist/_chunks/toDate.js +1 -1
- package/dist/_chunks/toDate.js.map +1 -1
- package/dist/_chunks/toString.js +1 -1
- package/dist/_chunks/toString.js.map +1 -1
- package/dist/_chunks/useUnit.js.map +1 -1
- package/dist/_chunks/vanilla.js +1 -1
- package/dist/_chunks/vanilla.js.map +1 -1
- package/dist/_chunks/yup.js +5 -5
- package/dist/_chunks/yup.js.map +1 -1
- package/dist/classes/filters/SelectionFilter.d.ts +2 -2
- package/dist/classes/filters/TreeFilter.d.ts +2 -2
- package/dist/classes/services/DataService/index.js +3 -3
- package/dist/classes/services/DataService/index.js.map +1 -1
- package/dist/classes/services/EventBusService/EventBusService.d.ts +1 -1
- package/dist/classes/services/EventBusService/index.js.map +1 -1
- package/dist/classes/services/LineListService/LineListServiceAbstract/index.js +1 -1
- package/dist/classes/services/LineListService/LineListServiceAbstract/index.js.map +1 -1
- package/dist/components/app/CaseDbApp/index.js +8 -5
- package/dist/components/app/CaseDbApp/index.js.map +1 -1
- package/dist/components/form/fields/ArrangementEditor/index.js +83 -83
- package/dist/components/form/fields/ArrangementEditor/index.js.map +1 -1
- package/dist/components/ui/AddCasesToEventDialog/AddCasesToEventDialog.d.ts +2 -2
- package/dist/components/ui/CaseContentFormDialog/CaseContentFormDialog.d.ts +2 -2
- package/dist/components/ui/CaseContentFormDialog/index.js +1 -1
- package/dist/components/ui/CaseContentFormDialog/index.js.map +1 -1
- package/dist/components/ui/CaseInfoDialog/CaseInfoDialog.d.ts +2 -2
- package/dist/components/ui/CaseSetInfoDialog/CaseSetInfoDialog.d.ts +2 -2
- package/dist/components/ui/CaseSummary/index.js +1 -1
- package/dist/components/ui/CaseSummary/index.js.map +1 -1
- package/dist/components/ui/CaseTypeInfoDialog/CaseTypeInfoDialog.d.ts +2 -2
- package/dist/components/ui/CaseTypeInfoDialog/CaseTypeInfoDialogContent.d.ts +1 -1
- package/dist/components/ui/CaseTypeInfoDialog/CaseTypeInfoDialogWithLoader.d.ts +2 -2
- package/dist/components/ui/ContextMenu/index.js.map +1 -1
- package/dist/components/ui/CreateEventDialog/CreateEventDialog.d.ts +2 -2
- package/dist/components/ui/CreateEventDialog/index.js +9 -9
- package/dist/components/ui/CreateEventDialog/index.js.map +1 -1
- package/dist/components/ui/Dashboard/DashboardDownloadSidebarItem.d.ts +1 -1
- package/dist/components/ui/Dashboard/DashboardSettingsSidebarItem.d.ts +1 -1
- package/dist/components/ui/Dashboard/DashboardWidget.d.ts +1 -1
- package/dist/components/ui/DashboardEditCases/index.js +1 -1
- package/dist/components/ui/DashboardEditCases/index.js.map +1 -1
- package/dist/components/ui/FileSelector/index.js +46 -46
- package/dist/components/ui/FileSelector/index.js.map +1 -1
- package/dist/components/ui/FindSimilarCasesDialog/FindSimilarCasesDialog.d.ts +2 -2
- package/dist/components/ui/Grouping/index.js +50 -50
- package/dist/components/ui/Grouping/index.js.map +1 -1
- package/dist/components/ui/HistogramWidget/index.js +1 -1
- package/dist/components/ui/HistogramWidget/index.js.map +1 -1
- package/dist/components/ui/MapWidget/index.js +7 -3
- package/dist/components/ui/MapWidget/index.js.map +1 -1
- package/dist/components/ui/RemoveCasesFromEventDialog/RemoveCasesFromEventDialog.d.ts +2 -2
- package/dist/components/ui/RemoveCasesFromEventDialog/index.js +6 -6
- package/dist/components/ui/RemoveCasesFromEventDialog/index.js.map +1 -1
- package/dist/components/ui/RemoveFindSimilarCasesResultDialog/RemoveFindSimilarCasesResultDialog.d.ts +2 -2
- package/dist/components/ui/SequenceDownloadDialog/SequenceDownloadDialog.d.ts +2 -2
- package/dist/components/ui/SequenceDownloadDialog/index.js +22 -22
- package/dist/components/ui/SequenceDownloadDialog/index.js.map +1 -1
- package/dist/components/ui/TreeDescription/index.js.map +1 -1
- package/dist/components/ui/TreeWidget/index.js +11 -11
- package/dist/components/ui/TreeWidget/index.js.map +1 -1
- package/dist/components/ui/Upload/UploadCaseResultTable.d.ts +2 -2
- package/dist/components/ui/Upload/UploadEditColumnValuesDialog.d.ts +2 -2
- package/dist/components/ui/UserRightsDialog/UserRightsDialog.d.ts +2 -2
- package/dist/components/ui/UsersEffectiveRightsDetailsDialog/UsersEffectiveRightsDetailsDialog.d.ts +2 -2
- package/dist/components/ui/UsersEffectiveRightsDetailsDialog/index.js +25 -11
- package/dist/components/ui/UsersEffectiveRightsDetailsDialog/index.js.map +1 -1
- package/dist/components/ui/Warning/index.js.map +1 -1
- package/dist/components/ui/WidgetHeaderIconButton/index.js.map +1 -1
- package/dist/components/ui/WidgetMenu/WidgetMenu.d.ts +1 -1
- package/dist/components/ui/WidgetMenu/index.js +2 -2
- package/dist/components/ui/WidgetMenu/index.js.map +1 -1
- package/dist/components/ui/WidgetUnavailable/index.js.map +1 -1
- package/dist/constants/query.d.ts +1 -1
- package/dist/constants/query.js +1 -1
- package/dist/constants/query.js.map +1 -1
- package/dist/context/caseAbac/CaseAbacContext.d.ts +1 -1
- package/dist/dataHooks/useAssemblyProtocolsQuery/index.js +3 -3
- package/dist/dataHooks/useAssemblyProtocolsQuery/index.js.map +1 -1
- package/dist/dataHooks/useAssemblyProtocolsQuery/useAssemblyProtocolsQuery.d.ts +1 -1
- package/dist/dataHooks/useCaseRightsQuery/index.js +2 -2
- package/dist/dataHooks/useCaseRightsQuery/index.js.map +1 -1
- package/dist/dataHooks/useCaseSetCategoriesQuery/index.js +3 -3
- package/dist/dataHooks/useCaseSetCategoriesQuery/index.js.map +1 -1
- package/dist/dataHooks/useCaseSetCategoriesQuery/useCaseSetCategoriesQuery.d.ts +1 -1
- package/dist/dataHooks/useCaseSetRightsQuery/index.js +2 -2
- package/dist/dataHooks/useCaseSetRightsQuery/index.js.map +1 -1
- package/dist/dataHooks/useCaseSetStatsQuery/index.js +3 -3
- package/dist/dataHooks/useCaseSetStatsQuery/index.js.map +1 -1
- package/dist/dataHooks/useCaseSetStatsQuery/useCaseSetStatsQuery.d.ts +1 -1
- package/dist/dataHooks/useCaseSetStatusesQuery/index.js +3 -3
- package/dist/dataHooks/useCaseSetStatusesQuery/index.js.map +1 -1
- package/dist/dataHooks/useCaseSetStatusesQuery/useCaseSetStatusesQuery.d.ts +1 -1
- package/dist/dataHooks/useCaseSetsQuery/index.js +3 -3
- package/dist/dataHooks/useCaseSetsQuery/index.js.map +1 -1
- package/dist/dataHooks/useCaseSetsQuery/useCaseSetsQuery.d.ts +1 -1
- package/dist/dataHooks/useCaseTypeSetCategoriesQuery/index.js +3 -3
- package/dist/dataHooks/useCaseTypeSetCategoriesQuery/index.js.map +1 -1
- package/dist/dataHooks/useCaseTypeSetCategoriesQuery/useCaseTypeSetCategoriesQuery.d.ts +1 -1
- package/dist/dataHooks/useCaseTypeSetCategoryPurposeQuery/index.js.map +1 -1
- package/dist/dataHooks/useCaseTypeSetCategoryPurposeQuery/useCaseTypeSetCategoryPurposeQuery.d.ts +1 -1
- package/dist/dataHooks/useCaseTypeSetMembersQuery/index.js +2 -2
- package/dist/dataHooks/useCaseTypeSetMembersQuery/index.js.map +1 -1
- package/dist/dataHooks/useCaseTypeSetsQuery/index.js +3 -3
- package/dist/dataHooks/useCaseTypeSetsQuery/index.js.map +1 -1
- package/dist/dataHooks/useCaseTypeSetsQuery/useCaseTypeSetsQuery.d.ts +1 -1
- package/dist/dataHooks/useCaseTypeStatsQuery/index.js +2 -2
- package/dist/dataHooks/useCaseTypeStatsQuery/index.js.map +1 -1
- package/dist/dataHooks/useCaseTypesQuery/index.js +3 -3
- package/dist/dataHooks/useCaseTypesQuery/index.js.map +1 -1
- package/dist/dataHooks/useCaseTypesQuery/useCaseTypesQuery.d.ts +1 -1
- package/dist/dataHooks/useColSetMembersQuery/index.js +2 -2
- package/dist/dataHooks/useColSetMembersQuery/index.js.map +1 -1
- package/dist/dataHooks/useColSetsQuery/index.js +3 -3
- package/dist/dataHooks/useColSetsQuery/index.js.map +1 -1
- package/dist/dataHooks/useColSetsQuery/useColSetsQuery.d.ts +1 -1
- package/dist/dataHooks/useColTypesQuery/index.js.map +1 -1
- package/dist/dataHooks/useColTypesQuery/useColTypesQuery.d.ts +1 -1
- package/dist/dataHooks/useColsQuery/index.js +3 -3
- package/dist/dataHooks/useColsQuery/index.js.map +1 -1
- package/dist/dataHooks/useColsQuery/useColsQuery.d.ts +1 -1
- package/dist/dataHooks/useConceptQuery/index.js +3 -3
- package/dist/dataHooks/useConceptQuery/index.js.map +1 -1
- package/dist/dataHooks/useConceptQuery/useConceptQuery.d.ts +1 -1
- package/dist/dataHooks/useConceptRelationTypeQuery/index.js.map +1 -1
- package/dist/dataHooks/useConceptRelationTypeQuery/useConceptRelationTypeQuery.d.ts +1 -1
- package/dist/dataHooks/useConceptSetTypeQuery/index.js.map +1 -1
- package/dist/dataHooks/useConceptSetTypeQuery/useConceptSetTypeQuery.d.ts +1 -1
- package/dist/dataHooks/useConceptSetsQuery/index.js +3 -3
- package/dist/dataHooks/useConceptSetsQuery/index.js.map +1 -1
- package/dist/dataHooks/useConceptSetsQuery/useConceptSetsQuery.d.ts +1 -1
- package/dist/dataHooks/useDataCollectionSetMembersQuery/index.js +2 -2
- package/dist/dataHooks/useDataCollectionSetMembersQuery/index.js.map +1 -1
- package/dist/dataHooks/useDataCollectionsQuery/index.js +3 -3
- package/dist/dataHooks/useDataCollectionsQuery/index.js.map +1 -1
- package/dist/dataHooks/useDataCollectionsQuery/useDataCollectionsQuery.d.ts +1 -1
- package/dist/dataHooks/useDimTypesQuery/index.js.map +1 -1
- package/dist/dataHooks/useDimTypesQuery/useDimTypesQuery.d.ts +1 -1
- package/dist/dataHooks/useDimsQuery/index.js +3 -3
- package/dist/dataHooks/useDimsQuery/index.js.map +1 -1
- package/dist/dataHooks/useDimsQuery/useDimsQuery.d.ts +1 -1
- package/dist/dataHooks/useDiseasesQuery/index.js +3 -3
- package/dist/dataHooks/useDiseasesQuery/index.js.map +1 -1
- package/dist/dataHooks/useDiseasesQuery/useDiseasesQuery.d.ts +1 -1
- package/dist/dataHooks/useEtiologicalAgentsQuery/index.js +3 -3
- package/dist/dataHooks/useEtiologicalAgentsQuery/index.js.map +1 -1
- package/dist/dataHooks/useEtiologicalAgentsQuery/useEtiologicalAgentsQuery.d.ts +1 -1
- package/dist/dataHooks/useGeneticDistanceProtocolsQuery/index.js +3 -3
- package/dist/dataHooks/useGeneticDistanceProtocolsQuery/index.js.map +1 -1
- package/dist/dataHooks/useGeneticDistanceProtocolsQuery/useGeneticDistanceProtocolsQuery.d.ts +1 -1
- package/dist/dataHooks/useOrganizationAccessCasePoliciesQuery/index.js +2 -2
- package/dist/dataHooks/useOrganizationAccessCasePoliciesQuery/index.js.map +1 -1
- package/dist/dataHooks/useOrganizationShareCasePoliciesQuery/index.js +2 -2
- package/dist/dataHooks/useOrganizationShareCasePoliciesQuery/index.js.map +1 -1
- package/dist/dataHooks/useRefColsQuery/index.js +3 -3
- package/dist/dataHooks/useRefColsQuery/index.js.map +1 -1
- package/dist/dataHooks/useRefColsQuery/useRefColsQuery.d.ts +1 -1
- package/dist/dataHooks/useRefColsValidationRulesQuery/index.js +2 -2
- package/dist/dataHooks/useRefColsValidationRulesQuery/index.js.map +1 -1
- package/dist/dataHooks/useRefDimsQuery/index.js +3 -3
- package/dist/dataHooks/useRefDimsQuery/index.js.map +1 -1
- package/dist/dataHooks/useRefDimsQuery/useRefDimsQuery.d.ts +1 -1
- package/dist/dataHooks/useRegionQuery/index.js +3 -3
- package/dist/dataHooks/useRegionQuery/index.js.map +1 -1
- package/dist/dataHooks/useRegionQuery/useRegionQuery.d.ts +1 -1
- package/dist/dataHooks/useRegionRelationTypeQuery/index.js.map +1 -1
- package/dist/dataHooks/useRegionRelationTypeQuery/useRegionRelationTypeQuery.d.ts +1 -1
- package/dist/dataHooks/useRegionSetsQuery/index.js +3 -3
- package/dist/dataHooks/useRegionSetsQuery/index.js.map +1 -1
- package/dist/dataHooks/useRegionSetsQuery/useRegionSetsQuery.d.ts +1 -1
- package/dist/dataHooks/useSequencingProtocolsQuery/index.js +3 -3
- package/dist/dataHooks/useSequencingProtocolsQuery/index.js.map +1 -1
- package/dist/dataHooks/useSequencingProtocolsQuery/useSequencingProtocolsQuery.d.ts +1 -1
- package/dist/dataHooks/useTreeAlgorithmCodesQuery/index.js.map +1 -1
- package/dist/dataHooks/useTreeAlgorithmCodesQuery/useTreeAlgorithmCodesQuery.d.ts +1 -1
- package/dist/dataHooks/useUnitQuery/useUnit.d.ts +1 -1
- package/dist/dataHooks/useUserAccessCasePoliciesQuery/index.js +2 -2
- package/dist/dataHooks/useUserAccessCasePoliciesQuery/index.js.map +1 -1
- package/dist/dataHooks/useUserEffectiveRightsQuery/index.js +3 -3
- package/dist/dataHooks/useUserEffectiveRightsQuery/index.js.map +1 -1
- package/dist/dataHooks/useUserEffectiveRightsQuery/useUserEffectiveRightsQuery.d.ts +1 -1
- package/dist/dataHooks/useUserShareCasePoliciesQuery/index.js +2 -2
- package/dist/dataHooks/useUserShareCasePoliciesQuery/index.js.map +1 -1
- package/dist/hooks/useOrganizationCasePolicyNameFactory/index.js +2 -2
- package/dist/hooks/useOrganizationCasePolicyNameFactory/index.js.map +1 -1
- package/dist/hooks/useOrganizationCasePolicyNameFactory/useOrganizationCasePolicyNameFactory.d.ts +1 -1
- package/dist/hooks/useUserCasePolicyNameFactory/index.js +3 -3
- package/dist/hooks/useUserCasePolicyNameFactory/index.js.map +1 -1
- package/dist/hooks/useUserCasePolicyNameFactory/useUserCasePolicyNameFactory.d.ts +1 -1
- package/dist/locale/nl.json +1 -1
- package/dist/models/config.d.ts +1 -1
- package/dist/models/dashboard.d.ts +1 -1
- package/dist/models/dashboard.js.map +1 -1
- package/dist/models/theme.d.ts +2 -2
- package/dist/pages/CaseDbUsersAdminPage/index.js +5 -5
- package/dist/pages/CaseDbUsersAdminPage/index.js.map +1 -1
- package/dist/pages/CaseSetCategoryAdminPage/index.js +4 -4
- package/dist/pages/CaseSetCategoryAdminPage/index.js.map +1 -1
- package/dist/pages/CaseSetStatusAdminPage/index.js +4 -4
- package/dist/pages/CaseSetStatusAdminPage/index.js.map +1 -1
- package/dist/pages/CaseTypeSetCategoriesAdminPage/index.js +4 -4
- package/dist/pages/CaseTypeSetCategoriesAdminPage/index.js.map +1 -1
- package/dist/pages/CaseTypeSetsAdminPage/index.js +6 -6
- package/dist/pages/CaseTypeSetsAdminPage/index.js.map +1 -1
- package/dist/pages/CaseTypesAdminPage/index.js +5 -5
- package/dist/pages/CaseTypesAdminPage/index.js.map +1 -1
- package/dist/pages/CasesDetailPage/index.js +5 -5
- package/dist/pages/CasesDetailPage/index.js.map +1 -1
- package/dist/pages/CasesPage/index.js +10 -10
- package/dist/pages/CasesPage/index.js.map +1 -1
- package/dist/pages/ColSetsAdminPage/index.js +6 -6
- package/dist/pages/ColSetsAdminPage/index.js.map +1 -1
- package/dist/pages/ColsAdminPage/index.js +5 -5
- package/dist/pages/ColsAdminPage/index.js.map +1 -1
- package/dist/pages/ConceptRelationsAdminPage/index.js +19 -19
- package/dist/pages/ConceptRelationsAdminPage/index.js.map +1 -1
- package/dist/pages/ConceptSetsAdminPage/index.js +5 -5
- package/dist/pages/ConceptSetsAdminPage/index.js.map +1 -1
- package/dist/pages/ConceptsAdminPage/index.js +5 -5
- package/dist/pages/ConceptsAdminPage/index.js.map +1 -1
- package/dist/pages/DataCollectionSetsAdminPage/index.js +12 -12
- package/dist/pages/DataCollectionSetsAdminPage/index.js.map +1 -1
- package/dist/pages/DataCollectionVisualizationPage/index.js +4 -4
- package/dist/pages/DataCollectionVisualizationPage/index.js.map +1 -1
- package/dist/pages/DataCollectionsAdminPage/index.js +4 -4
- package/dist/pages/DataCollectionsAdminPage/index.js.map +1 -1
- package/dist/pages/DimsAdminPage/index.js +6 -6
- package/dist/pages/DimsAdminPage/index.js.map +1 -1
- package/dist/pages/DiseasesAdminPage/index.js +4 -4
- package/dist/pages/DiseasesAdminPage/index.js.map +1 -1
- package/dist/pages/EtiologicalAgentsAdminPage/index.js +4 -4
- package/dist/pages/EtiologicalAgentsAdminPage/index.js.map +1 -1
- package/dist/pages/EtiologiesAdminPage/index.js +3 -3
- package/dist/pages/EtiologiesAdminPage/index.js.map +1 -1
- package/dist/pages/EventsDetailPage/index.js +5 -5
- package/dist/pages/EventsDetailPage/index.js.map +1 -1
- package/dist/pages/EventsPage/index.js +11 -11
- package/dist/pages/EventsPage/index.js.map +1 -1
- package/dist/pages/HomePage/index.js +2 -2
- package/dist/pages/HomePage/index.js.map +1 -1
- package/dist/pages/OrganizationAccessCasePoliciesAdminPage/index.js +4 -4
- package/dist/pages/OrganizationAccessCasePoliciesAdminPage/index.js.map +1 -1
- package/dist/pages/OrganizationShareCasePoliciesAdminPage/index.js +4 -4
- package/dist/pages/OrganizationShareCasePoliciesAdminPage/index.js.map +1 -1
- package/dist/pages/RefColsAdminPage/index.js +7 -7
- package/dist/pages/RefColsAdminPage/index.js.map +1 -1
- package/dist/pages/RefDimsAdminPage/index.js +5 -5
- package/dist/pages/RefDimsAdminPage/index.js.map +1 -1
- package/dist/pages/RegionRelationsAdminPage/index.js +3 -3
- package/dist/pages/RegionRelationsAdminPage/index.js.map +1 -1
- package/dist/pages/RegionSetShapesAdminPage/index.js +4 -4
- package/dist/pages/RegionSetShapesAdminPage/index.js.map +1 -1
- package/dist/pages/RegionSetsAdminPage/index.js +5 -5
- package/dist/pages/RegionSetsAdminPage/index.js.map +1 -1
- package/dist/pages/RegionsAdminPage/index.js +5 -5
- package/dist/pages/RegionsAdminPage/index.js.map +1 -1
- package/dist/pages/TrendsPage/index.js +1 -1
- package/dist/pages/TrendsPage/index.js.map +1 -1
- package/dist/pages/UploadPage/index.js +1 -1
- package/dist/pages/UploadPage/index.js.map +1 -1
- package/dist/pages/UserAccessCasePoliciesAdminPage/index.js +4 -4
- package/dist/pages/UserAccessCasePoliciesAdminPage/index.js.map +1 -1
- package/dist/pages/UserEffectiveRightsAdminPage/index.js +12 -12
- package/dist/pages/UserEffectiveRightsAdminPage/index.js.map +1 -1
- package/dist/pages/UserEffectiveRightsTesterAdminPage/index.js +8 -8
- package/dist/pages/UserEffectiveRightsTesterAdminPage/index.js.map +1 -1
- package/dist/pages/UserShareCasePoliciesAdminPage/index.js +4 -4
- package/dist/pages/UserShareCasePoliciesAdminPage/index.js.map +1 -1
- package/dist/routes/adminRoutes.d.ts +1 -1
- package/dist/routes/index.js +11 -8
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/routes.d.ts +1 -1
- package/dist/setup/setup.js +5 -5
- package/dist/setup/setup.js.map +1 -1
- package/dist/stores/dashboardStore/dashboardStore.d.ts +1 -1
- package/dist/stores/uploadStore/index.js +2 -2
- package/dist/stores/uploadStore/index.js.map +1 -1
- package/dist/stores/uploadStore/uploadStore.d.ts +1 -1
- package/dist/stores/userProfileStore/index.js +2 -2
- package/dist/stores/userProfileStore/index.js.map +1 -1
- package/dist/theme/demoTheme/index.js +2 -2
- package/dist/theme/demoTheme/index.js.map +1 -1
- package/dist/utils/CaseDbDataUtil/CaseDbDataUtil.d.ts +1 -1
- package/dist/utils/CaseDbDataUtil/index.js +1 -1
- package/dist/utils/CaseDbDataUtil/index.js.map +1 -1
- package/dist/utils/CaseDbStandardConfigUtil/index.js +2488 -1408
- package/dist/utils/CaseDbStandardConfigUtil/index.js.map +1 -1
- package/dist/utils/CaseDbTableUtil/CaseDbTableUtil.d.ts +1 -1
- package/dist/utils/CaseDbTableUtil/index.js +1 -1
- package/dist/utils/CaseDbTableUtil/index.js.map +1 -1
- package/dist/utils/CaseSelectionUtil/index.js.map +1 -1
- package/dist/utils/CaseTypeFormUtil/CaseTypeFormUtil.d.ts +1 -1
- package/dist/utils/CaseTypeFormUtil/index.js +7 -10
- package/dist/utils/CaseTypeFormUtil/index.js.map +1 -1
- package/dist/utils/CaseTypeUtil/index.js +1 -1
- package/dist/utils/CaseTypeUtil/index.js.map +1 -1
- package/dist/utils/CaseUtil/index.js +3 -3
- package/dist/utils/CaseUtil/index.js.map +1 -1
- package/dist/utils/DashboardUtil/index.js +1 -1
- package/dist/utils/DashboardUtil/index.js.map +1 -1
- package/dist/utils/DataSetUtil/index.js.map +1 -1
- package/dist/utils/FileUtil/index.js +1 -1
- package/dist/utils/FileUtil/index.js.map +1 -1
- package/dist/utils/FilterUtil/FilterUtil.d.ts +2 -2
- package/dist/utils/HistogramUtil/index.js +1 -1
- package/dist/utils/HistogramUtil/index.js.map +1 -1
- package/dist/utils/MapUtil/index.js +1 -1
- package/dist/utils/MapUtil/index.js.map +1 -1
- package/dist/utils/StratificationUtil/index.js +3 -2
- package/dist/utils/StratificationUtil/index.js.map +1 -1
- package/dist/utils/UploadUtil/UploadUtil.d.ts +1 -1
- package/package.json +11 -11
- package/dist/_chunks/chunk-KS7C4IRE.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/ui/TreeWidget/TreeWidget.tsx"],"sourcesContent":["import {\n Box,\n Button,\n ListItemIcon,\n ListItemText,\n MenuItem,\n useTheme,\n} from '@mui/material';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport FilterAltIcon from '@mui/icons-material/FilterAlt';\nimport InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';\nimport LinkIcon from '@mui/icons-material/Link';\nimport type { ReactElement } from 'react';\nimport {\n use,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\nimport { useDebouncedCallback } from 'use-debounce';\nimport type { CaseDbRetrievePhylogeneticTreeRequestBody } from '@gen-epix/api-casedb';\nimport { CaseDbCaseApi } from '@gen-epix/api-casedb';\nimport type { MenuItemData } from '@gen-epix/ui/models/nestedMenu';\nimport { ConfigService } from '@gen-epix/ui/classes/services/ConfigService';\nimport { Spinner } from '@gen-epix/ui/components/ui/Spinner';\nimport { useQueryMemo } from '@gen-epix/ui/hooks/useQueryMemo';\nimport { Subject } from '@gen-epix/ui-core/classes/Subject';\nimport { PhylogeneticTree } from '@gen-epix/ui-phylogenetic-tree/components/PhylogeneticTree';\nimport type {\n PhylogeneticTreeHighlightedNodeNamesSubjectValue,\n PhylogeneticTreePathClickEvent,\n PhylogeneticTreeRef,\n PhylogeneticTreeViewState,\n} from '@gen-epix/ui-phylogenetic-tree/components/PhylogeneticTree';\n\nimport { EventBusService } from '../../../classes/services/EventBusService';\nimport type {\n DashboardTreeSettings,\n TreeConfiguration,\n TreeWidgetData,\n TreeWidgetDataPersistable,\n} from '../../../models/dashboard';\nimport type { Highlighting } from '../../../models/caseDb';\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\nimport { SELECTION_FILTER_GROUP } from '../../../utils/CaseTypeUtil';\nimport { CaseDbDownloadUtil } from '../../../utils/CaseDbDownloadUtil';\nimport { TreeWidgetUtil } from '../../../utils/TreeWidgetUtil';\nimport type { ContextMenuConfigWithPosition } from '../ContextMenu';\nimport { ContextMenu } from '../ContextMenu';\nimport { TreeDescription } from '../TreeDescription';\nimport { WidgetUnavailable } from '../WidgetUnavailable';\nimport { CASEDB_QUERY_KEY } from '../../../constants/query';\nimport type { CaseDbConfig } from '../../../models/config';\nimport { TreeFilter } from '../../../classes/filters/TreeFilter';\nimport { DashboardWidget } from '../Dashboard';\nimport { DASHBOARD_COMPONENT_NAME } from '../../../constants/dashboard';\nimport { DashboardContext } from '../Dashboard/context/DashboardContext';\nimport { UserProfileStoreContext } from '../../../stores/userProfileStore/userProfileStoreContext';\n\ntype ZoomInMenuItemConfig = {\n caseIds?: string[];\n rootId?: string;\n};\n\nexport const TreeWidget = () => {\n const theme = useTheme();\n const { t } = useTranslation();\n const treeConfig = ConfigService.getInstance<CaseDbConfig>().config.tree;\n const [treeCanvas, setTreeCanvas] = useState<HTMLCanvasElement>();\n const [isTreeLinked, setIsTreeLinked] = useState(true);\n const treeRef = useRef<PhylogeneticTreeRef>(null);\n const dashboardStore = use(DashboardStoreContext);\n const dashboardContext = use(DashboardContext);\n const userProfileStore = use(UserProfileStoreContext);\n const setPhylogeneticTreeResponse = useStore(dashboardStore, (state) => state.setPhylogeneticTreeResponse);\n const baseData = useStore(dashboardStore, (state) => state.baseData);\n const sortedData = useStore(dashboardStore, (state) => state.sortedData);\n const filteredCases = useStore(dashboardStore, (state) => state.filteredData[SELECTION_FILTER_GROUP]);\n const setSorting = useStore(dashboardStore, (state) => state.setSorting);\n const tree = useStore(dashboardStore, (state) => state.tree);\n const sortByField = useStore(dashboardStore, (state) => state.sortByField);\n const stratification = useStore(dashboardStore, (state) => state.stratification);\n const completeCaseType = useStore(dashboardStore, (state) => state.completeCaseType);\n const hasActiveTreeFilter = useStore(dashboardStore, (state) => !state.filters.find(filter => filter instanceof TreeFilter).isInitialFilterValue());\n const addTreeFilter = useStore(dashboardStore, (state) => state.addTreeFilter);\n const treeFilterStepOut = useStore(dashboardStore, (state) => state.treeFilterStepOut);\n const updateWidgetData = useStore(dashboardStore, (state) => state.updateWidgetData);\n const updateWidgetDataPersistable = useStore(dashboardStore, (state) => state.updateWidgetDataPersistable);\n const removeTreeFilter = useStore(dashboardStore, (state) => state.removeTreeFilter);\n const isCaseDataLoading = useStore(dashboardStore, (state) => state.isDataLoading);\n const newick = useStore(dashboardStore, (state) => state.newick);\n const resetTreeAddresses = useStore(dashboardStore, (state) => state.resetTreeAddresses);\n const isShowDistancesEnabled = useStore(userProfileStore, (state) => (state.dashboardWidgetSettings[DASHBOARD_COMPONENT_NAME.TREE] as DashboardTreeSettings).isShowDistancesEnabled);\n const isShowSupportLinesWhenUnlinkedEnabled = useStore(userProfileStore, (state) => (state.dashboardWidgetSettings[DASHBOARD_COMPONENT_NAME.TREE] as DashboardTreeSettings).isShowSupportLinesWhenUnlinkedEnabled);\n const [contextMenuConfig, setContextMenuConfig] = useState<ContextMenuConfigWithPosition | null>(null);\n const [zoomInMenuItemConfig, setZoomInMenuItemConfig] = useState<ZoomInMenuItemConfig>(null);\n const [extraLeafInfoId, setExtraLeafInfoId] = useState<string>(null);\n const [treeConfiguration, setTreeConfiguration] = useState<TreeConfiguration>(dashboardStore.getState().getWidgetDataPersistable<TreeWidgetDataPersistable>(DASHBOARD_COMPONENT_NAME.TREE).treeConfiguration);\n const treeHighlightingSubject = useMemo(() => new Subject<Highlighting>({\n caseIds: [],\n origin: null,\n }), []);\n const initialTreeViewState = useMemo<PhylogeneticTreeViewState>(() => {\n const widgetData = dashboardStore.getState().getWidgetData<TreeWidgetData>(DASHBOARD_COMPONENT_NAME.TREE);\n return {\n horizontalScrollPosition: !isNaN(widgetData?.horizontalScrollPosition) ? widgetData.horizontalScrollPosition : 0,\n verticalScrollPosition: !isNaN(widgetData?.verticalScrollPosition) ? widgetData.verticalScrollPosition : 0,\n zoomLevel: !isNaN(widgetData?.zoomLevel) ? widgetData.zoomLevel : 1,\n };\n }, [dashboardStore]);\n\n const sortedLeafNames = useMemo(() => {\n return sortedData.map(c => c.id);\n }, [sortedData]);\n\n const treeConfigurations = useMemo(() => TreeWidgetUtil.getTreeConfigurations(completeCaseType), [completeCaseType]);\n\n const treeCanvasAriaLabel = useMemo(() => {\n if (!treeConfiguration) {\n return t('Phylogenetic tree visualization');\n }\n\n const label = treeConfiguration.col?.label || t('data');\n const geneticDistanceProtocol = treeConfiguration.geneticDistanceProtocol?.name || t('unknown protocol');\n const treeAlgorithm = treeConfiguration.treeAlgorithm?.name || t('unknown algorithm');\n\n return t('Figure of a phylogenetic tree belonging to {{label}}. Generated using {{geneticDistanceProtocol}} and {{treeAlgorithm}}.', {\n geneticDistanceProtocol,\n label,\n treeAlgorithm,\n });\n }, [treeConfiguration, t]);\n\n useEffect(() => {\n const unsubscribeHighlightingManager = dashboardContext.highlightSubject.subscribe((highlighting) => {\n if (highlighting.origin === DASHBOARD_COMPONENT_NAME.TREE) {\n return;\n }\n treeHighlightingSubject.next(highlighting);\n });\n const unsubscribeTreeHighlightingSubject = treeHighlightingSubject.subscribe((highlighting) => {\n if (highlighting.origin !== DASHBOARD_COMPONENT_NAME.TREE) {\n return;\n }\n dashboardContext.highlight(highlighting);\n });\n\n return () => {\n unsubscribeHighlightingManager();\n unsubscribeTreeHighlightingSubject();\n };\n }, [dashboardContext, treeHighlightingSubject]);\n\n const caseIds = useMemo(() => filteredCases.map(c => c.id).sort(), [filteredCases]);\n\n useEffect(() => {\n resetTreeAddresses();\n }, [caseIds, resetTreeAddresses]);\n\n const hasEnoughSequencesToShowTree = useMemo(() => caseIds.length >= 2 && caseIds.every(x => !!x), [caseIds]);\n const hasToManyResultsToShowTree = useMemo(() => caseIds.length > 0 && completeCaseType.props.read_max_tree_size > 0 && caseIds.length > completeCaseType.props.read_max_tree_size, [caseIds, completeCaseType.props.read_max_tree_size]);\n\n const retrievePhylogeneticTreeRequestBody = useMemo<CaseDbRetrievePhylogeneticTreeRequestBody>(() => ({\n case_ids: caseIds,\n case_type_id: completeCaseType.id,\n genetic_distance_col_id: treeConfiguration?.col.id,\n tree_algorithm_code: treeConfiguration?.treeAlgorithm.code,\n }), [caseIds, completeCaseType.id, treeConfiguration]);\n\n const { data: treeData, error: treeError, isLoading: isTreeLoading } = useQueryMemo({\n enabled: hasEnoughSequencesToShowTree && !!treeConfiguration && !hasToManyResultsToShowTree,\n queryFn: async ({ signal }) => {\n const response = await CaseDbCaseApi.getInstance().retrievePhylogeneticTree(retrievePhylogeneticTreeRequestBody, { signal });\n return response.data;\n },\n queryKey: [CASEDB_QUERY_KEY.PHYLOGENETIC_TREE, JSON.stringify(retrievePhylogeneticTreeRequestBody)],\n retry: false,\n staleTime: Infinity,\n });\n\n const onOpenFiltersButtonClick = useCallback(() => {\n EventBusService.getInstance().emit('openFiltersMenu');\n }, []);\n\n const isLoading = !!treeConfiguration && (isCaseDataLoading || (hasEnoughSequencesToShowTree && isTreeLoading));\n const isTreeUnavailable = hasToManyResultsToShowTree || !isCaseDataLoading && ((!isLoading && !!treeError) || !hasEnoughSequencesToShowTree || tree?.maxBranchLength?.toNumber() === 0 || tree?.size === 0 || !treeConfiguration || (!isLoading && tree === null));\n const shouldShowTree = !hasToManyResultsToShowTree && !!treeConfiguration && !isCaseDataLoading && !treeError && !isTreeLoading && tree?.size > 0 && hasEnoughSequencesToShowTree;\n\n const widgetUnavailableReason = useMemo<ReactElement | string>(() => {\n if (!isTreeUnavailable) {\n return null;\n }\n if (!hasEnoughSequencesToShowTree) {\n return t`The phylogenetic tree cannot be displayed because there are not enough sequences available for the shown cases. A minimum of 2 sequences is required to generate a phylogenetic tree.`;\n }\n if (hasEnoughSequencesToShowTree && !tree) {\n return t`The phylogenetic tree cannot be displayed because the tree could not be generated. Either there are no sequences available for the shown cases or the selected tree configuration does not yield a valid tree.`;\n }\n if (hasToManyResultsToShowTree) {\n return (\n (\n <>\n <Box\n sx={{\n marginBottom: 2,\n }}\n >\n {t('The phylogenetic tree cannot be displayed because the number of cases ({{caseCount}}) exceeds the maximum allowed number of cases ({{maxSize}}) to display a phylogenetic tree. Refine your filters to reduce the number of results.', {\n caseCount: caseIds.length,\n maxSize: completeCaseType.props.read_max_tree_size,\n })}\n </Box>\n <Button\n color={'inherit'}\n onClick={onOpenFiltersButtonClick}\n variant={'outlined'}\n >\n {t`Refine filters`}\n </Button>\n </>\n )\n );\n }\n }, [caseIds.length, completeCaseType.props.read_max_tree_size, hasEnoughSequencesToShowTree, hasToManyResultsToShowTree, isTreeUnavailable, onOpenFiltersButtonClick, t, tree]);\n\n useEffect(() => {\n if (treeData) {\n setPhylogeneticTreeResponse(treeData);\n }\n }, [treeData, setPhylogeneticTreeResponse]);\n\n useEffect(() => {\n if (!treeConfigurations?.length) {\n setTreeConfiguration(null);\n updateWidgetDataPersistable<TreeWidgetDataPersistable>(DASHBOARD_COMPONENT_NAME.TREE, {\n treeConfiguration: null,\n });\n return;\n }\n const newConfig = dashboardStore.getState().getWidgetDataPersistable<TreeWidgetDataPersistable>(DASHBOARD_COMPONENT_NAME.TREE)?.treeConfiguration || treeConfigurations[0];\n\n setTreeConfiguration(newConfig);\n updateWidgetDataPersistable<TreeWidgetDataPersistable>(DASHBOARD_COMPONENT_NAME.TREE, {\n treeConfiguration: newConfig,\n });\n }, [dashboardStore, treeConfigurations, updateWidgetDataPersistable]);\n\n useEffect(() => {\n if (sortByField && isTreeLinked && shouldShowTree) {\n treeRef.current?.unlink({\n positionX: 0,\n positionY: 0,\n zoomLevel: ConfigService.getInstance<CaseDbConfig>().config.tree.INITIAL_UNLINKED_ZOOM_LEVEL,\n });\n }\n }, [isTreeLinked, shouldShowTree, sortByField]);\n\n const updateEpiTreeWidgetDataDebounced = useDebouncedCallback((viewState: PhylogeneticTreeViewState) => {\n updateWidgetData<TreeWidgetData>(DASHBOARD_COMPONENT_NAME.TREE, {\n horizontalScrollPosition: viewState.horizontalScrollPosition,\n verticalScrollPosition: viewState.verticalScrollPosition,\n zoomLevel: viewState.zoomLevel,\n });\n }, 500);\n\n const onTreeViewStateChange = useCallback((viewState: PhylogeneticTreeViewState) => {\n updateEpiTreeWidgetDataDebounced(viewState);\n }, [updateEpiTreeWidgetDataDebounced]);\n\n const onTreeCanvasChange = useCallback((canvas?: HTMLCanvasElement) => {\n setTreeCanvas(canvas);\n }, []);\n\n const onEpiContextMenuClose = useCallback(() => {\n setContextMenuConfig(null);\n setZoomInMenuItemConfig(null);\n }, []);\n\n const linkLineListToTree = useCallback(() => {\n const perform = async () => {\n await setSorting(null, null);\n treeRef.current?.syncScrollToVisibleTree();\n };\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n perform();\n\n }, [setSorting]);\n\n const onLinkButtonClick = useCallback(() => {\n linkLineListToTree();\n\n }, [linkLineListToTree]);\n\n const resetZoomLevelAndScrollPosition = useCallback(() => {\n treeRef.current?.link(0);\n }, []);\n\n const onAddTreeFilterMenuItemClick = useCallback(async (onMenuClose: () => void) => {\n await addTreeFilter(zoomInMenuItemConfig.rootId);\n resetZoomLevelAndScrollPosition();\n onMenuClose();\n }, [addTreeFilter, zoomInMenuItemConfig, resetZoomLevelAndScrollPosition]);\n\n const onRemoveTreeFilterButtonClick = useCallback(async () => {\n await removeTreeFilter();\n resetZoomLevelAndScrollPosition();\n }, [removeTreeFilter, resetZoomLevelAndScrollPosition]);\n\n const onTreeFilterStepOutButtonClick = useCallback(async () => {\n await treeFilterStepOut();\n resetZoomLevelAndScrollPosition();\n }, [resetZoomLevelAndScrollPosition, treeFilterStepOut]);\n\n const onTreePathClick = useCallback(({ mouseEvent, pathProperties }: PhylogeneticTreePathClickEvent) => {\n setZoomInMenuItemConfig(null);\n setExtraLeafInfoId(null);\n\n if (pathProperties?.treeNode) {\n const { treeNode } = pathProperties;\n setContextMenuConfig({\n caseIds: treeNode.subTreeLeaveNames ? treeNode.subTreeLeaveNames : [treeNode.name],\n mouseEvent,\n position: {\n left: mouseEvent.clientX,\n top: mouseEvent.clientY,\n },\n });\n if (treeNode.subTreeNames.length && treeNode.name && treeNode.maxBranchLength.toNumber()) {\n setZoomInMenuItemConfig({\n caseIds: treeNode.subTreeLeaveNames,\n rootId: treeNode.name,\n });\n }\n if (treeNode.name && !treeNode.subTreeNames.length) {\n setExtraLeafInfoId(treeNode.name);\n }\n return;\n }\n\n if (pathProperties?.subTreeLeaveNames?.length) {\n setContextMenuConfig({\n caseIds: pathProperties.subTreeLeaveNames,\n mouseEvent,\n position: {\n left: mouseEvent.clientX,\n top: mouseEvent.clientY,\n },\n });\n }\n }, []);\n\n const onShowDetailsSelectionMenuItemClick = useCallback((onMenuClose: () => void) => {\n EventBusService.getInstance().emit('openCaseInfoDialog', {\n caseId: baseData.find(c => c.id === extraLeafInfoId).id,\n caseTypeId: completeCaseType.id,\n });\n onMenuClose();\n }, [extraLeafInfoId, baseData, completeCaseType.id]);\n\n const getEpiContextMenuExtraItems = useCallback((onMenuClose: () => void): ReactElement => {\n if (zoomInMenuItemConfig) {\n return (\n <MenuItem\n divider\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={async () => onAddTreeFilterMenuItemClick(onMenuClose)}\n >\n <ListItemIcon>\n <FilterAltIcon fontSize={'small'} />\n </ListItemIcon>\n <ListItemText>\n {t`Filter (show only this subtree)`}\n </ListItemText>\n </MenuItem>\n );\n }\n if (extraLeafInfoId) {\n return (\n <MenuItem\n divider\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => onShowDetailsSelectionMenuItemClick(onMenuClose)}\n >\n <ListItemIcon>\n <InfoOutlinedIcon fontSize={'small'} />\n </ListItemIcon>\n <ListItemText>\n {t`Show details`}\n </ListItemText>\n </MenuItem>\n );\n }\n }, [extraLeafInfoId, onShowDetailsSelectionMenuItemClick, onAddTreeFilterMenuItemClick, t, zoomInMenuItemConfig]);\n\n const titleMenu = useMemo<MenuItemData | string>(() => {\n if (!treeConfigurations?.length) {\n return t`Tree`;\n }\n\n const menu: MenuItemData = {\n disabled: !treeConfiguration,\n items: treeConfigurations?.map<MenuItemData>(config => ({\n active: !!treeConfiguration && treeConfiguration.computedId === config.computedId,\n callback: () => {\n const perform = async () => {\n await removeTreeFilter();\n updateWidgetDataPersistable<TreeWidgetDataPersistable>(DASHBOARD_COMPONENT_NAME.TREE, {\n treeConfiguration: config,\n });\n setTreeConfiguration(config);\n };\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n perform();\n },\n label: TreeWidgetUtil.getTreeConfigurationLabel(config),\n tooltip: (\n <TreeDescription\n treeConfiguration={config}\n />\n ),\n })) ?? [],\n label: treeConfiguration ? t('Tree: {{algorithm}}', { algorithm: TreeWidgetUtil.getTreeConfigurationLabel(treeConfiguration) }) : t`Tree`,\n tooltip: treeConfiguration\n ? (\n <TreeDescription\n treeConfiguration={treeConfiguration}\n />\n )\n : undefined,\n };\n\n return menu;\n }, [treeConfigurations, treeConfiguration, t, removeTreeFilter, updateWidgetDataPersistable]);\n\n const primaryMenu = useMemo<MenuItemData[]>(() => {\n return [\n {\n callback: onTreeFilterStepOutButtonClick,\n disabled: !hasActiveTreeFilter,\n label: t`Change tree filter to nearest ancestor`,\n leftIcon: <ArrowUpwardIcon />,\n },\n {\n callback: onRemoveTreeFilterButtonClick,\n disabled: !hasActiveTreeFilter,\n label: t`Remove tree filter`,\n leftIcon: <ClearIcon />,\n },\n {\n callback: onLinkButtonClick,\n label: t`Link and snap the Line List to the Tree (resets tree zoom level and Line List sorting)`,\n leftIcon: (\n <LinkIcon\n sx={{\n color: isTreeLinked ? undefined : theme.palette.error.main,\n }}\n />\n ),\n },\n ];\n }, [hasActiveTreeFilter, isTreeLinked, onLinkButtonClick, onRemoveTreeFilterButtonClick, onTreeFilterStepOutButtonClick, t, theme.palette.error.main]);\n\n useEffect(() => {\n const emitDownloadOptions = () => {\n const baseName = t('Phylogenetic Tree - {{geneticDistanceProtocol}} - {{treeAlgorithm}}',\n {\n geneticDistanceProtocol: treeConfiguration?.geneticDistanceProtocol.name ?? '',\n treeAlgorithm: treeConfiguration?.treeAlgorithm.name ?? '',\n });\n\n EventBusService.getInstance().emit('onDownloadOptionsChanged', {\n disabled: isTreeUnavailable,\n items: [\n {\n callback: () => CaseDbDownloadUtil.downloadNewick(baseName, newick, completeCaseType, t),\n label: t`Save as Newick`,\n },\n {\n callback: () => CaseDbDownloadUtil.downloadCanvasImage(baseName, treeCanvas, 'jpeg', completeCaseType, t),\n label: t`Save as JPEG`,\n },\n {\n callback: () => CaseDbDownloadUtil.downloadCanvasImage(baseName, treeCanvas, 'png', completeCaseType, t),\n label: t`Save as PNG`,\n },\n ],\n zone: DASHBOARD_COMPONENT_NAME.TREE,\n zoneLabel: t`Phylogenetic Tree`,\n });\n };\n\n\n emitDownloadOptions();\n const eventBusService = EventBusService.getInstance();\n eventBusService.addEventListener('onDownloadOptionsRequested', emitDownloadOptions);\n\n return () => {\n eventBusService.emit('onDownloadOptionsChanged', {\n items: null,\n zone: DASHBOARD_COMPONENT_NAME.TREE,\n zoneLabel: t`Tree`,\n });\n eventBusService.removeEventListener('onDownloadOptionsRequested', emitDownloadOptions);\n };\n }, [completeCaseType, isTreeLinked, isTreeUnavailable, newick, t, treeCanvas, treeConfiguration?.geneticDistanceProtocol.name, treeConfiguration?.treeAlgorithm.name]);\n\n\n useEffect(() => {\n // eslint-disable-next-line @eslint-react/web-api-no-leaked-event-listener\n const removeEventListener = EventBusService.getInstance().addEventListener('onLinkLineListAndTree', () => treeRef.current?.link());\n return () => {\n removeEventListener();\n };\n }, []);\n\n\n const onLinkStateChange = useCallback((linked: boolean) => {\n setIsTreeLinked(linked);\n }, [setIsTreeLinked]);\n\n const phylogeneticTreeHighlightedNodeNamesSubject = useMemo(() => {\n const subject = new Subject<PhylogeneticTreeHighlightedNodeNamesSubjectValue>({\n highlightedNodeNames: dashboardContext.highlightSubject.data.caseIds,\n });\n return subject;\n }, [dashboardContext.highlightSubject.data.caseIds]);\n\n useEffect(() => {\n const unsubscribe = phylogeneticTreeHighlightedNodeNamesSubject.subscribe((data) => {\n dashboardContext.highlight({\n caseIds: data.highlightedNodeNames,\n origin: DASHBOARD_COMPONENT_NAME.TREE,\n });\n });\n return () => {\n unsubscribe();\n };\n }, [phylogeneticTreeHighlightedNodeNamesSubject, dashboardContext]);\n\n useEffect(() => {\n const unsubscribe = dashboardContext.highlightSubject.subscribe(data => {\n if (data.origin === DASHBOARD_COMPONENT_NAME.TREE) {\n return;\n }\n phylogeneticTreeHighlightedNodeNamesSubject.next({\n highlightedNodeNames: data.caseIds,\n });\n });\n return () => {\n unsubscribe();\n };\n }, [dashboardContext.highlightSubject, phylogeneticTreeHighlightedNodeNamesSubject]);\n\n return (\n <DashboardWidget\n expandDisabled={isTreeUnavailable}\n primaryMenu={primaryMenu}\n title={titleMenu}\n widgetName={DASHBOARD_COMPONENT_NAME.TREE}\n >\n <Box\n sx={{\n height: '100%',\n overflow: 'clip',\n position: 'relative',\n width: '100%',\n }}\n >\n {isTreeUnavailable && (\n <>\n <WidgetUnavailable\n reason={widgetUnavailableReason}\n widgetLabel={t`phylogenetic tree`}\n />\n </>\n )}\n {(isLoading && !isTreeUnavailable) && (\n <Spinner\n label={t`Loading`}\n takingLongerTimeoutMs={ConfigService.getInstance<CaseDbConfig>().config.tree.TAKING_LONGER_TIMEOUT_MS}\n />\n )}\n {!isTreeUnavailable && shouldShowTree && (\n <PhylogeneticTree\n ancestorDotRadius={treeConfig.ANCESTOR_DOT_RADIUS}\n ariaLabel={treeCanvasAriaLabel}\n backgroundColor={theme.palette.background.paper}\n dimFn={theme['gen-epix-ui-casedb'].tree.dimFn}\n fontFamily={theme.typography.fontFamily}\n headerHeight={treeConfig.HEADER_HEIGHT}\n highlightedNodeNamesSubject={phylogeneticTreeHighlightedNodeNamesSubject}\n initialViewState={initialTreeViewState}\n itemHeight={ConfigService.getInstance<CaseDbConfig>().config.lineList.TABLE_ROW_HEIGHT}\n leafDotRadius={treeConfig.LEAF_DOT_RADIUS}\n linkedScrollDebounceDelayMs={treeConfig.LINKED_SCROLL_DEBOUNCE_DELAY_MS}\n maxScaleWidthPx={treeConfig.MAX_SCALE_WIDTH_PX}\n maxZoomLevel={treeConfig.MAX_ZOOM_LEVEL}\n maxZoomSpeed={treeConfig.MAX_ZOOM_SPEED}\n minimumDistancePercentageToShowLabel={treeConfig.MINIMUM_DISTANCE_PERCENTAGE_TO_SHOW_LABEL}\n minScaleWidthPx={treeConfig.MIN_SCALE_WIDTH_PX}\n minZoomLevel={treeConfig.MIN_ZOOM_LEVEL}\n minZoomSpeed={treeConfig.MIN_ZOOM_SPEED}\n nodeNameColors={stratification?.caseIdColors}\n onCanvasChange={onTreeCanvasChange}\n onLinkStateChange={onLinkStateChange}\n onPathClick={onTreePathClick}\n onViewStateChange={onTreeViewStateChange}\n panningThreshold={treeConfig.PANNING_THRESHOLD}\n ref={treeRef}\n regularFillColorSupportLine={treeConfig.REGULAR_FILL_COLOR_SUPPORT_LINE}\n scaleColor={theme.palette.text.primary}\n scaleIncrements={treeConfig.SCALE_INCREMENTS}\n scrollSubject={dashboardContext.linkedScrollSubject}\n shouldShowDistances={isShowDistancesEnabled}\n shouldShowSupportLinesWhenUnlinked={isShowSupportLinesWhenUnlinkedEnabled}\n sortedLeafNames={sortedLeafNames}\n supportLineColorLinked={theme['gen-epix-ui-casedb'].tree.supportLineColorLinked}\n supportLineColorUnlinked={theme['gen-epix-ui-casedb'].tree.supportLineColorUnlinked}\n tree={tree}\n treeColor={theme['gen-epix-ui-casedb'].tree.color}\n treeFont={theme['gen-epix-ui-casedb'].tree.font}\n treePadding={treeConfig.TREE_PADDING}\n visibleRangeSubject={dashboardContext.lineListRangeSubject}\n />\n )}\n </Box>\n <ContextMenu\n config={contextMenuConfig}\n getExtraItems={getEpiContextMenuExtraItems}\n onMenuClose={onEpiContextMenuClose}\n />\n </DashboardWidget>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/ui/TreeWidget/TreeWidget.tsx"],"sourcesContent":["import {\n Box,\n Button,\n ListItemIcon,\n ListItemText,\n MenuItem,\n useTheme,\n} from '@mui/material';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport FilterAltIcon from '@mui/icons-material/FilterAlt';\nimport InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';\nimport LinkIcon from '@mui/icons-material/Link';\nimport type { ReactElement } from 'react';\nimport {\n use,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStore } from 'zustand';\nimport { useDebouncedCallback } from 'use-debounce';\nimport type { CaseDbRetrievePhylogeneticTreeRequestBody } from '@gen-epix/api-casedb';\nimport { CaseDbCaseApi } from '@gen-epix/api-casedb';\nimport type { MenuItemData } from '@gen-epix/ui-core-components/models/nestedMenu';\nimport { ConfigService } from '@gen-epix/ui-client-common/classes/services/ConfigService';\nimport { Spinner } from '@gen-epix/ui-core-components/components/Spinner';\nimport { useQueryMemo } from '@gen-epix/ui-client-common/hooks/useQueryMemo';\nimport { Subject } from '@gen-epix/ui-core/classes/Subject';\nimport { PhylogeneticTree } from '@gen-epix/ui-phylogenetic-tree/components/PhylogeneticTree';\nimport type {\n PhylogeneticTreeHighlightedNodeNamesSubjectValue,\n PhylogeneticTreePathClickEvent,\n PhylogeneticTreeRef,\n PhylogeneticTreeViewState,\n} from '@gen-epix/ui-phylogenetic-tree/components/PhylogeneticTree';\n\nimport { EventBusService } from '../../../classes/services/EventBusService';\nimport type {\n DashboardTreeSettings,\n TreeConfiguration,\n TreeWidgetData,\n TreeWidgetDataPersistable,\n} from '../../../models/dashboard';\nimport type { Highlighting } from '../../../models/caseDb';\nimport { DashboardStoreContext } from '../../../stores/dashboardStore';\nimport { SELECTION_FILTER_GROUP } from '../../../utils/CaseTypeUtil';\nimport { CaseDbDownloadUtil } from '../../../utils/CaseDbDownloadUtil';\nimport { TreeWidgetUtil } from '../../../utils/TreeWidgetUtil';\nimport type { ContextMenuConfigWithPosition } from '../ContextMenu';\nimport { ContextMenu } from '../ContextMenu';\nimport { TreeDescription } from '../TreeDescription';\nimport { WidgetUnavailable } from '../WidgetUnavailable';\nimport { CASEDB_QUERY_KEY } from '../../../constants/query';\nimport type { CaseDbConfig } from '../../../models/config';\nimport { TreeFilter } from '../../../classes/filters/TreeFilter';\nimport { DashboardWidget } from '../Dashboard';\nimport { DASHBOARD_COMPONENT_NAME } from '../../../constants/dashboard';\nimport { DashboardContext } from '../Dashboard/context/DashboardContext';\nimport { UserProfileStoreContext } from '../../../stores/userProfileStore/userProfileStoreContext';\n\ntype ZoomInMenuItemConfig = {\n caseIds?: string[];\n rootId?: string;\n};\n\nexport const TreeWidget = () => {\n const theme = useTheme();\n const { t } = useTranslation();\n const treeConfig = ConfigService.getInstance<CaseDbConfig>().config.tree;\n const [treeCanvas, setTreeCanvas] = useState<HTMLCanvasElement>();\n const [isTreeLinked, setIsTreeLinked] = useState(true);\n const treeRef = useRef<PhylogeneticTreeRef>(null);\n const dashboardStore = use(DashboardStoreContext);\n const dashboardContext = use(DashboardContext);\n const userProfileStore = use(UserProfileStoreContext);\n const setPhylogeneticTreeResponse = useStore(dashboardStore, (state) => state.setPhylogeneticTreeResponse);\n const baseData = useStore(dashboardStore, (state) => state.baseData);\n const sortedData = useStore(dashboardStore, (state) => state.sortedData);\n const filteredCases = useStore(dashboardStore, (state) => state.filteredData[SELECTION_FILTER_GROUP]);\n const setSorting = useStore(dashboardStore, (state) => state.setSorting);\n const tree = useStore(dashboardStore, (state) => state.tree);\n const sortByField = useStore(dashboardStore, (state) => state.sortByField);\n const stratification = useStore(dashboardStore, (state) => state.stratification);\n const completeCaseType = useStore(dashboardStore, (state) => state.completeCaseType);\n const hasActiveTreeFilter = useStore(dashboardStore, (state) => !state.filters.find(filter => filter instanceof TreeFilter).isInitialFilterValue());\n const addTreeFilter = useStore(dashboardStore, (state) => state.addTreeFilter);\n const treeFilterStepOut = useStore(dashboardStore, (state) => state.treeFilterStepOut);\n const updateWidgetData = useStore(dashboardStore, (state) => state.updateWidgetData);\n const updateWidgetDataPersistable = useStore(dashboardStore, (state) => state.updateWidgetDataPersistable);\n const removeTreeFilter = useStore(dashboardStore, (state) => state.removeTreeFilter);\n const isCaseDataLoading = useStore(dashboardStore, (state) => state.isDataLoading);\n const newick = useStore(dashboardStore, (state) => state.newick);\n const resetTreeAddresses = useStore(dashboardStore, (state) => state.resetTreeAddresses);\n const isShowDistancesEnabled = useStore(userProfileStore, (state) => (state.dashboardWidgetSettings[DASHBOARD_COMPONENT_NAME.TREE] as DashboardTreeSettings).isShowDistancesEnabled);\n const isShowSupportLinesWhenUnlinkedEnabled = useStore(userProfileStore, (state) => (state.dashboardWidgetSettings[DASHBOARD_COMPONENT_NAME.TREE] as DashboardTreeSettings).isShowSupportLinesWhenUnlinkedEnabled);\n const [contextMenuConfig, setContextMenuConfig] = useState<ContextMenuConfigWithPosition | null>(null);\n const [zoomInMenuItemConfig, setZoomInMenuItemConfig] = useState<ZoomInMenuItemConfig>(null);\n const [extraLeafInfoId, setExtraLeafInfoId] = useState<string>(null);\n const [treeConfiguration, setTreeConfiguration] = useState<TreeConfiguration>(dashboardStore.getState().getWidgetDataPersistable<TreeWidgetDataPersistable>(DASHBOARD_COMPONENT_NAME.TREE).treeConfiguration);\n const treeHighlightingSubject = useMemo(() => new Subject<Highlighting>({\n caseIds: [],\n origin: null,\n }), []);\n const initialTreeViewState = useMemo<PhylogeneticTreeViewState>(() => {\n const widgetData = dashboardStore.getState().getWidgetData<TreeWidgetData>(DASHBOARD_COMPONENT_NAME.TREE);\n return {\n horizontalScrollPosition: !isNaN(widgetData?.horizontalScrollPosition) ? widgetData.horizontalScrollPosition : 0,\n verticalScrollPosition: !isNaN(widgetData?.verticalScrollPosition) ? widgetData.verticalScrollPosition : 0,\n zoomLevel: !isNaN(widgetData?.zoomLevel) ? widgetData.zoomLevel : 1,\n };\n }, [dashboardStore]);\n\n const sortedLeafNames = useMemo(() => {\n return sortedData.map(c => c.id);\n }, [sortedData]);\n\n const treeConfigurations = useMemo(() => TreeWidgetUtil.getTreeConfigurations(completeCaseType), [completeCaseType]);\n\n const treeCanvasAriaLabel = useMemo(() => {\n if (!treeConfiguration) {\n return t('Phylogenetic tree visualization');\n }\n\n const label = treeConfiguration.col?.label || t('data');\n const geneticDistanceProtocol = treeConfiguration.geneticDistanceProtocol?.name || t('unknown protocol');\n const treeAlgorithm = treeConfiguration.treeAlgorithm?.name || t('unknown algorithm');\n\n return t('Figure of a phylogenetic tree belonging to {{label}}. Generated using {{geneticDistanceProtocol}} and {{treeAlgorithm}}.', {\n geneticDistanceProtocol,\n label,\n treeAlgorithm,\n });\n }, [treeConfiguration, t]);\n\n useEffect(() => {\n const unsubscribeHighlightingManager = dashboardContext.highlightSubject.subscribe((highlighting) => {\n if (highlighting.origin === DASHBOARD_COMPONENT_NAME.TREE) {\n return;\n }\n treeHighlightingSubject.next(highlighting);\n });\n const unsubscribeTreeHighlightingSubject = treeHighlightingSubject.subscribe((highlighting) => {\n if (highlighting.origin !== DASHBOARD_COMPONENT_NAME.TREE) {\n return;\n }\n dashboardContext.highlight(highlighting);\n });\n\n return () => {\n unsubscribeHighlightingManager();\n unsubscribeTreeHighlightingSubject();\n };\n }, [dashboardContext, treeHighlightingSubject]);\n\n const caseIds = useMemo(() => filteredCases.map(c => c.id).sort(), [filteredCases]);\n\n useEffect(() => {\n resetTreeAddresses();\n }, [caseIds, resetTreeAddresses]);\n\n const hasEnoughSequencesToShowTree = useMemo(() => caseIds.length >= 2 && caseIds.every(x => !!x), [caseIds]);\n const hasToManyResultsToShowTree = useMemo(() => caseIds.length > 0 && completeCaseType.props.read_max_tree_size > 0 && caseIds.length > completeCaseType.props.read_max_tree_size, [caseIds, completeCaseType.props.read_max_tree_size]);\n\n const retrievePhylogeneticTreeRequestBody = useMemo<CaseDbRetrievePhylogeneticTreeRequestBody>(() => ({\n case_ids: caseIds,\n case_type_id: completeCaseType.id,\n genetic_distance_col_id: treeConfiguration?.col.id,\n tree_algorithm_code: treeConfiguration?.treeAlgorithm.code,\n }), [caseIds, completeCaseType.id, treeConfiguration]);\n\n const { data: treeData, error: treeError, isLoading: isTreeLoading } = useQueryMemo({\n enabled: hasEnoughSequencesToShowTree && !!treeConfiguration && !hasToManyResultsToShowTree,\n queryFn: async ({ signal }) => {\n const response = await CaseDbCaseApi.getInstance().retrievePhylogeneticTree(retrievePhylogeneticTreeRequestBody, { signal });\n return response.data;\n },\n queryKey: [CASEDB_QUERY_KEY.PHYLOGENETIC_TREE, JSON.stringify(retrievePhylogeneticTreeRequestBody)],\n retry: false,\n staleTime: Infinity,\n });\n\n const onOpenFiltersButtonClick = useCallback(() => {\n EventBusService.getInstance().emit('openFiltersMenu');\n }, []);\n\n const isLoading = !!treeConfiguration && (isCaseDataLoading || (hasEnoughSequencesToShowTree && isTreeLoading));\n const isTreeUnavailable = hasToManyResultsToShowTree || !isCaseDataLoading && ((!isLoading && !!treeError) || !hasEnoughSequencesToShowTree || tree?.maxBranchLength?.toNumber() === 0 || tree?.size === 0 || !treeConfiguration || (!isLoading && tree === null));\n const shouldShowTree = !hasToManyResultsToShowTree && !!treeConfiguration && !isCaseDataLoading && !treeError && !isTreeLoading && tree?.size > 0 && hasEnoughSequencesToShowTree;\n\n const widgetUnavailableReason = useMemo<ReactElement | string>(() => {\n if (!isTreeUnavailable) {\n return null;\n }\n if (!hasEnoughSequencesToShowTree) {\n return t`The phylogenetic tree cannot be displayed because there are not enough sequences available for the shown cases. A minimum of 2 sequences is required to generate a phylogenetic tree.`;\n }\n if (hasEnoughSequencesToShowTree && !tree) {\n return t`The phylogenetic tree cannot be displayed because the tree could not be generated. Either there are no sequences available for the shown cases or the selected tree configuration does not yield a valid tree.`;\n }\n if (hasToManyResultsToShowTree) {\n return (\n (\n <>\n <Box\n sx={{\n marginBottom: 2,\n }}\n >\n {t('The phylogenetic tree cannot be displayed because the number of cases ({{caseCount}}) exceeds the maximum allowed number of cases ({{maxSize}}) to display a phylogenetic tree. Refine your filters to reduce the number of results.', {\n caseCount: caseIds.length,\n maxSize: completeCaseType.props.read_max_tree_size,\n })}\n </Box>\n <Button\n color={'inherit'}\n onClick={onOpenFiltersButtonClick}\n variant={'outlined'}\n >\n {t`Refine filters`}\n </Button>\n </>\n )\n );\n }\n }, [caseIds.length, completeCaseType.props.read_max_tree_size, hasEnoughSequencesToShowTree, hasToManyResultsToShowTree, isTreeUnavailable, onOpenFiltersButtonClick, t, tree]);\n\n useEffect(() => {\n if (treeData) {\n setPhylogeneticTreeResponse(treeData);\n }\n }, [treeData, setPhylogeneticTreeResponse]);\n\n useEffect(() => {\n if (!treeConfigurations?.length) {\n setTreeConfiguration(null);\n updateWidgetDataPersistable<TreeWidgetDataPersistable>(DASHBOARD_COMPONENT_NAME.TREE, {\n treeConfiguration: null,\n });\n return;\n }\n const newConfig = dashboardStore.getState().getWidgetDataPersistable<TreeWidgetDataPersistable>(DASHBOARD_COMPONENT_NAME.TREE)?.treeConfiguration || treeConfigurations[0];\n\n setTreeConfiguration(newConfig);\n updateWidgetDataPersistable<TreeWidgetDataPersistable>(DASHBOARD_COMPONENT_NAME.TREE, {\n treeConfiguration: newConfig,\n });\n }, [dashboardStore, treeConfigurations, updateWidgetDataPersistable]);\n\n useEffect(() => {\n if (sortByField && isTreeLinked && shouldShowTree) {\n treeRef.current?.unlink({\n positionX: 0,\n positionY: 0,\n zoomLevel: ConfigService.getInstance<CaseDbConfig>().config.tree.INITIAL_UNLINKED_ZOOM_LEVEL,\n });\n }\n }, [isTreeLinked, shouldShowTree, sortByField]);\n\n const updateEpiTreeWidgetDataDebounced = useDebouncedCallback((viewState: PhylogeneticTreeViewState) => {\n updateWidgetData<TreeWidgetData>(DASHBOARD_COMPONENT_NAME.TREE, {\n horizontalScrollPosition: viewState.horizontalScrollPosition,\n verticalScrollPosition: viewState.verticalScrollPosition,\n zoomLevel: viewState.zoomLevel,\n });\n }, 500);\n\n const onTreeViewStateChange = useCallback((viewState: PhylogeneticTreeViewState) => {\n updateEpiTreeWidgetDataDebounced(viewState);\n }, [updateEpiTreeWidgetDataDebounced]);\n\n const onTreeCanvasChange = useCallback((canvas?: HTMLCanvasElement) => {\n setTreeCanvas(canvas);\n }, []);\n\n const onEpiContextMenuClose = useCallback(() => {\n setContextMenuConfig(null);\n setZoomInMenuItemConfig(null);\n }, []);\n\n const linkLineListToTree = useCallback(() => {\n const perform = async () => {\n await setSorting(null, null);\n treeRef.current?.syncScrollToVisibleTree();\n };\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n perform();\n\n }, [setSorting]);\n\n const onLinkButtonClick = useCallback(() => {\n linkLineListToTree();\n\n }, [linkLineListToTree]);\n\n const resetZoomLevelAndScrollPosition = useCallback(() => {\n treeRef.current?.link(0);\n }, []);\n\n const onAddTreeFilterMenuItemClick = useCallback(async (onMenuClose: () => void) => {\n await addTreeFilter(zoomInMenuItemConfig.rootId);\n resetZoomLevelAndScrollPosition();\n onMenuClose();\n }, [addTreeFilter, zoomInMenuItemConfig, resetZoomLevelAndScrollPosition]);\n\n const onRemoveTreeFilterButtonClick = useCallback(async () => {\n await removeTreeFilter();\n resetZoomLevelAndScrollPosition();\n }, [removeTreeFilter, resetZoomLevelAndScrollPosition]);\n\n const onTreeFilterStepOutButtonClick = useCallback(async () => {\n await treeFilterStepOut();\n resetZoomLevelAndScrollPosition();\n }, [resetZoomLevelAndScrollPosition, treeFilterStepOut]);\n\n const onTreePathClick = useCallback(({ mouseEvent, pathProperties }: PhylogeneticTreePathClickEvent) => {\n setZoomInMenuItemConfig(null);\n setExtraLeafInfoId(null);\n\n if (pathProperties?.treeNode) {\n const { treeNode } = pathProperties;\n setContextMenuConfig({\n caseIds: treeNode.subTreeLeaveNames ? treeNode.subTreeLeaveNames : [treeNode.name],\n mouseEvent,\n position: {\n left: mouseEvent.clientX,\n top: mouseEvent.clientY,\n },\n });\n if (treeNode.subTreeNames.length && treeNode.name && treeNode.maxBranchLength.toNumber()) {\n setZoomInMenuItemConfig({\n caseIds: treeNode.subTreeLeaveNames,\n rootId: treeNode.name,\n });\n }\n if (treeNode.name && !treeNode.subTreeNames.length) {\n setExtraLeafInfoId(treeNode.name);\n }\n return;\n }\n\n if (pathProperties?.subTreeLeaveNames?.length) {\n setContextMenuConfig({\n caseIds: pathProperties.subTreeLeaveNames,\n mouseEvent,\n position: {\n left: mouseEvent.clientX,\n top: mouseEvent.clientY,\n },\n });\n }\n }, []);\n\n const onShowDetailsSelectionMenuItemClick = useCallback((onMenuClose: () => void) => {\n EventBusService.getInstance().emit('openCaseInfoDialog', {\n caseId: baseData.find(c => c.id === extraLeafInfoId).id,\n caseTypeId: completeCaseType.id,\n });\n onMenuClose();\n }, [extraLeafInfoId, baseData, completeCaseType.id]);\n\n const getEpiContextMenuExtraItems = useCallback((onMenuClose: () => void): ReactElement => {\n if (zoomInMenuItemConfig) {\n return (\n <MenuItem\n divider\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={async () => onAddTreeFilterMenuItemClick(onMenuClose)}\n >\n <ListItemIcon>\n <FilterAltIcon fontSize={'small'} />\n </ListItemIcon>\n <ListItemText>\n {t`Filter (show only this subtree)`}\n </ListItemText>\n </MenuItem>\n );\n }\n if (extraLeafInfoId) {\n return (\n <MenuItem\n divider\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => onShowDetailsSelectionMenuItemClick(onMenuClose)}\n >\n <ListItemIcon>\n <InfoOutlinedIcon fontSize={'small'} />\n </ListItemIcon>\n <ListItemText>\n {t`Show details`}\n </ListItemText>\n </MenuItem>\n );\n }\n }, [extraLeafInfoId, onShowDetailsSelectionMenuItemClick, onAddTreeFilterMenuItemClick, t, zoomInMenuItemConfig]);\n\n const titleMenu = useMemo<MenuItemData | string>(() => {\n if (!treeConfigurations?.length) {\n return t`Tree`;\n }\n\n const menu: MenuItemData = {\n disabled: !treeConfiguration,\n items: treeConfigurations?.map<MenuItemData>(config => ({\n active: !!treeConfiguration && treeConfiguration.computedId === config.computedId,\n callback: () => {\n const perform = async () => {\n await removeTreeFilter();\n updateWidgetDataPersistable<TreeWidgetDataPersistable>(DASHBOARD_COMPONENT_NAME.TREE, {\n treeConfiguration: config,\n });\n setTreeConfiguration(config);\n };\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n perform();\n },\n label: TreeWidgetUtil.getTreeConfigurationLabel(config),\n tooltip: (\n <TreeDescription\n treeConfiguration={config}\n />\n ),\n })) ?? [],\n label: treeConfiguration ? t('Tree: {{algorithm}}', { algorithm: TreeWidgetUtil.getTreeConfigurationLabel(treeConfiguration) }) : t`Tree`,\n tooltip: treeConfiguration\n ? (\n <TreeDescription\n treeConfiguration={treeConfiguration}\n />\n )\n : undefined,\n };\n\n return menu;\n }, [treeConfigurations, treeConfiguration, t, removeTreeFilter, updateWidgetDataPersistable]);\n\n const primaryMenu = useMemo<MenuItemData[]>(() => {\n return [\n {\n callback: onTreeFilterStepOutButtonClick,\n disabled: !hasActiveTreeFilter,\n label: t`Change tree filter to nearest ancestor`,\n leftIcon: <ArrowUpwardIcon />,\n },\n {\n callback: onRemoveTreeFilterButtonClick,\n disabled: !hasActiveTreeFilter,\n label: t`Remove tree filter`,\n leftIcon: <ClearIcon />,\n },\n {\n callback: onLinkButtonClick,\n label: t`Link and snap the Line List to the Tree (resets tree zoom level and Line List sorting)`,\n leftIcon: (\n <LinkIcon\n sx={{\n color: isTreeLinked ? undefined : theme.palette.error.main,\n }}\n />\n ),\n },\n ];\n }, [hasActiveTreeFilter, isTreeLinked, onLinkButtonClick, onRemoveTreeFilterButtonClick, onTreeFilterStepOutButtonClick, t, theme.palette.error.main]);\n\n useEffect(() => {\n const emitDownloadOptions = () => {\n const baseName = t('Phylogenetic Tree - {{geneticDistanceProtocol}} - {{treeAlgorithm}}',\n {\n geneticDistanceProtocol: treeConfiguration?.geneticDistanceProtocol.name ?? '',\n treeAlgorithm: treeConfiguration?.treeAlgorithm.name ?? '',\n });\n\n EventBusService.getInstance().emit('onDownloadOptionsChanged', {\n disabled: isTreeUnavailable,\n items: [\n {\n callback: () => CaseDbDownloadUtil.downloadNewick(baseName, newick, completeCaseType, t),\n label: t`Save as Newick`,\n },\n {\n callback: () => CaseDbDownloadUtil.downloadCanvasImage(baseName, treeCanvas, 'jpeg', completeCaseType, t),\n label: t`Save as JPEG`,\n },\n {\n callback: () => CaseDbDownloadUtil.downloadCanvasImage(baseName, treeCanvas, 'png', completeCaseType, t),\n label: t`Save as PNG`,\n },\n ],\n zone: DASHBOARD_COMPONENT_NAME.TREE,\n zoneLabel: t`Phylogenetic Tree`,\n });\n };\n\n\n emitDownloadOptions();\n const eventBusService = EventBusService.getInstance();\n eventBusService.addEventListener('onDownloadOptionsRequested', emitDownloadOptions);\n\n return () => {\n eventBusService.emit('onDownloadOptionsChanged', {\n items: null,\n zone: DASHBOARD_COMPONENT_NAME.TREE,\n zoneLabel: t`Tree`,\n });\n eventBusService.removeEventListener('onDownloadOptionsRequested', emitDownloadOptions);\n };\n }, [completeCaseType, isTreeLinked, isTreeUnavailable, newick, t, treeCanvas, treeConfiguration?.geneticDistanceProtocol.name, treeConfiguration?.treeAlgorithm.name]);\n\n\n useEffect(() => {\n // eslint-disable-next-line @eslint-react/web-api-no-leaked-event-listener\n const removeEventListener = EventBusService.getInstance().addEventListener('onLinkLineListAndTree', () => treeRef.current?.link());\n return () => {\n removeEventListener();\n };\n }, []);\n\n\n const onLinkStateChange = useCallback((linked: boolean) => {\n setIsTreeLinked(linked);\n }, [setIsTreeLinked]);\n\n const phylogeneticTreeHighlightedNodeNamesSubject = useMemo(() => {\n const subject = new Subject<PhylogeneticTreeHighlightedNodeNamesSubjectValue>({\n highlightedNodeNames: dashboardContext.highlightSubject.data.caseIds,\n });\n return subject;\n }, [dashboardContext.highlightSubject.data.caseIds]);\n\n useEffect(() => {\n const unsubscribe = phylogeneticTreeHighlightedNodeNamesSubject.subscribe((data) => {\n dashboardContext.highlight({\n caseIds: data.highlightedNodeNames,\n origin: DASHBOARD_COMPONENT_NAME.TREE,\n });\n });\n return () => {\n unsubscribe();\n };\n }, [phylogeneticTreeHighlightedNodeNamesSubject, dashboardContext]);\n\n useEffect(() => {\n const unsubscribe = dashboardContext.highlightSubject.subscribe(data => {\n if (data.origin === DASHBOARD_COMPONENT_NAME.TREE) {\n return;\n }\n phylogeneticTreeHighlightedNodeNamesSubject.next({\n highlightedNodeNames: data.caseIds,\n });\n });\n return () => {\n unsubscribe();\n };\n }, [dashboardContext.highlightSubject, phylogeneticTreeHighlightedNodeNamesSubject]);\n\n return (\n <DashboardWidget\n expandDisabled={isTreeUnavailable}\n primaryMenu={primaryMenu}\n title={titleMenu}\n widgetName={DASHBOARD_COMPONENT_NAME.TREE}\n >\n <Box\n sx={{\n height: '100%',\n overflow: 'clip',\n position: 'relative',\n width: '100%',\n }}\n >\n {isTreeUnavailable && (\n <>\n <WidgetUnavailable\n reason={widgetUnavailableReason}\n widgetLabel={t`phylogenetic tree`}\n />\n </>\n )}\n {(isLoading && !isTreeUnavailable) && (\n <Spinner\n label={t`Loading`}\n takingLongerTimeoutMs={ConfigService.getInstance<CaseDbConfig>().config.tree.TAKING_LONGER_TIMEOUT_MS}\n />\n )}\n {!isTreeUnavailable && shouldShowTree && (\n <PhylogeneticTree\n ancestorDotRadius={treeConfig.ANCESTOR_DOT_RADIUS}\n ariaLabel={treeCanvasAriaLabel}\n backgroundColor={theme.palette.background.paper}\n dimFn={theme['gen-epix-ui-client-casedb'].tree.dimFn}\n fontFamily={theme.typography.fontFamily}\n headerHeight={treeConfig.HEADER_HEIGHT}\n highlightedNodeNamesSubject={phylogeneticTreeHighlightedNodeNamesSubject}\n initialViewState={initialTreeViewState}\n itemHeight={ConfigService.getInstance<CaseDbConfig>().config.lineList.TABLE_ROW_HEIGHT}\n leafDotRadius={treeConfig.LEAF_DOT_RADIUS}\n linkedScrollDebounceDelayMs={treeConfig.LINKED_SCROLL_DEBOUNCE_DELAY_MS}\n maxScaleWidthPx={treeConfig.MAX_SCALE_WIDTH_PX}\n maxZoomLevel={treeConfig.MAX_ZOOM_LEVEL}\n maxZoomSpeed={treeConfig.MAX_ZOOM_SPEED}\n minimumDistancePercentageToShowLabel={treeConfig.MINIMUM_DISTANCE_PERCENTAGE_TO_SHOW_LABEL}\n minScaleWidthPx={treeConfig.MIN_SCALE_WIDTH_PX}\n minZoomLevel={treeConfig.MIN_ZOOM_LEVEL}\n minZoomSpeed={treeConfig.MIN_ZOOM_SPEED}\n nodeNameColors={stratification?.caseIdColors}\n onCanvasChange={onTreeCanvasChange}\n onLinkStateChange={onLinkStateChange}\n onPathClick={onTreePathClick}\n onViewStateChange={onTreeViewStateChange}\n panningThreshold={treeConfig.PANNING_THRESHOLD}\n ref={treeRef}\n regularFillColorSupportLine={treeConfig.REGULAR_FILL_COLOR_SUPPORT_LINE}\n scaleColor={theme.palette.text.primary}\n scaleIncrements={treeConfig.SCALE_INCREMENTS}\n scrollSubject={dashboardContext.linkedScrollSubject}\n shouldShowDistances={isShowDistancesEnabled}\n shouldShowSupportLinesWhenUnlinked={isShowSupportLinesWhenUnlinkedEnabled}\n sortedLeafNames={sortedLeafNames}\n supportLineColorLinked={theme['gen-epix-ui-client-casedb'].tree.supportLineColorLinked}\n supportLineColorUnlinked={theme['gen-epix-ui-client-casedb'].tree.supportLineColorUnlinked}\n tree={tree}\n treeColor={theme['gen-epix-ui-client-casedb'].tree.color}\n treeFont={theme['gen-epix-ui-client-casedb'].tree.font}\n treePadding={treeConfig.TREE_PADDING}\n visibleRangeSubject={dashboardContext.lineListRangeSubject}\n />\n )}\n </Box>\n <ContextMenu\n config={contextMenuConfig}\n getExtraItems={getEpiContextMenuExtraItems}\n onMenuClose={onEpiContextMenuClose}\n />\n </DashboardWidget>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqEA,IAAa,UAAmB;CAC9B,IAAM,IAAQ,GAAS,GACjB,EAAE,SAAM,GAAe,GACvB,IAAa,EAAc,YAA0B,CAAC,CAAC,OAAO,MAC9D,CAAC,GAAY,MAAiB,EAA4B,GAC1D,CAAC,GAAc,KAAmB,EAAS,EAAI,GAC/C,IAAU,GAA4B,IAAI,GAC1C,IAAiB,EAAI,EAAqB,GAC1C,IAAmB,EAAI,EAAgB,GACvC,IAAmB,EAAI,EAAuB,GAC9C,IAA8B,EAAS,IAAiB,MAAU,EAAM,2BAA2B,GACnG,IAAW,EAAS,IAAiB,MAAU,EAAM,QAAQ,GAC7D,KAAa,EAAS,IAAiB,MAAU,EAAM,UAAU,GACjE,KAAgB,EAAS,IAAiB,MAAU,EAAM,aAAa,EAAuB,GAC9F,KAAa,EAAS,IAAiB,MAAU,EAAM,UAAU,GACjE,IAAO,EAAS,IAAiB,MAAU,EAAM,IAAI,GACrD,IAAc,EAAS,IAAiB,MAAU,EAAM,WAAW,GACnE,KAAiB,EAAS,IAAiB,MAAU,EAAM,cAAc,GACzE,IAAmB,EAAS,IAAiB,MAAU,EAAM,gBAAgB,GAC7E,IAAsB,EAAS,IAAiB,MAAU,CAAC,EAAM,QAAQ,MAAK,MAAU,aAAkB,CAAU,CAAC,CAAC,qBAAqB,CAAC,GAC5I,KAAgB,EAAS,IAAiB,MAAU,EAAM,aAAa,GACvE,KAAoB,EAAS,IAAiB,MAAU,EAAM,iBAAiB,GAC/E,KAAmB,EAAS,IAAiB,MAAU,EAAM,gBAAgB,GAC7E,IAA8B,EAAS,IAAiB,MAAU,EAAM,2BAA2B,GACnG,IAAmB,EAAS,IAAiB,MAAU,EAAM,gBAAgB,GAC7E,IAAoB,EAAS,IAAiB,MAAU,EAAM,aAAa,GAC3E,KAAS,EAAS,IAAiB,MAAU,EAAM,MAAM,GACzD,KAAqB,EAAS,IAAiB,MAAU,EAAM,kBAAkB,GACjF,KAAyB,EAAS,IAAmB,MAAW,EAAM,wBAAwB,EAAyB,KAAK,CAA2B,sBAAsB,GAC7K,KAAwC,EAAS,IAAmB,MAAW,EAAM,wBAAwB,EAAyB,KAAK,CAA2B,qCAAqC,GAC3M,CAAC,IAAmB,KAAwB,EAA+C,IAAI,GAC/F,CAAC,GAAsB,KAA2B,EAA+B,IAAI,GACrF,CAAC,GAAiB,MAAsB,EAAiB,IAAI,GAC7D,CAAC,GAAmB,KAAwB,EAA4B,EAAe,SAAS,CAAC,CAAC,yBAAoD,EAAyB,IAAI,CAAC,CAAC,iBAAiB,GACtM,IAA0B,QAAc,IAAI,GAAsB;EACtE,SAAS,CAAC;EACV,QAAQ;CACV,CAAC,GAAG,CAAC,CAAC,GACA,KAAuB,QAAyC;EACpE,IAAM,IAAa,EAAe,SAAS,CAAC,CAAC,cAA8B,EAAyB,IAAI;EACxG,OAAO;GACL,0BAA2B,MAAM,GAAY,wBAAwB,IAA0C,IAAtC,EAAW;GACpF,wBAAyB,MAAM,GAAY,sBAAsB,IAAwC,IAApC,EAAW;GAChF,WAAY,MAAM,GAAY,SAAS,IAA2B,IAAvB,EAAW;EACxD;CACF,GAAG,CAAC,CAAc,CAAC,GAEb,KAAkB,QACf,GAAW,KAAI,MAAK,EAAE,EAAE,GAC9B,CAAC,EAAU,CAAC,GAET,IAAqB,QAAc,EAAe,sBAAsB,CAAgB,GAAG,CAAC,CAAgB,CAAC,GAE7G,KAAsB,QAAc;EACxC,IAAI,CAAC,GACH,OAAO,EAAE,iCAAiC;EAG5C,IAAM,IAAQ,EAAkB,KAAK,SAAS,EAAE,MAAM,GAChD,IAA0B,EAAkB,yBAAyB,QAAQ,EAAE,kBAAkB,GACjG,IAAgB,EAAkB,eAAe,QAAQ,EAAE,mBAAmB;EAEpF,OAAO,EAAE,4HAA4H;GACnI;GACA;GACA;EACF,CAAC;CACH,GAAG,CAAC,GAAmB,CAAC,CAAC;CAEzB,QAAgB;EACd,IAAM,IAAiC,EAAiB,iBAAiB,WAAW,MAAiB;GAC/F,EAAa,WAAW,EAAyB,QAGrD,EAAwB,KAAK,CAAY;EAC3C,CAAC,GACK,IAAqC,EAAwB,WAAW,MAAiB;GACzF,EAAa,WAAW,EAAyB,QAGrD,EAAiB,UAAU,CAAY;EACzC,CAAC;EAED,aAAa;GAEX,AADA,EAA+B,GAC/B,EAAmC;EACrC;CACF,GAAG,CAAC,GAAkB,CAAuB,CAAC;CAE9C,IAAM,IAAU,QAAc,GAAc,KAAI,MAAK,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,EAAa,CAAC;CAElF,QAAgB;EACd,GAAmB;CACrB,GAAG,CAAC,GAAS,EAAkB,CAAC;CAEhC,IAAM,IAA+B,QAAc,EAAQ,UAAU,KAAK,EAAQ,OAAM,MAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAO,CAAC,GACtG,IAA6B,QAAc,EAAQ,SAAS,KAAK,EAAiB,MAAM,qBAAqB,KAAK,EAAQ,SAAS,EAAiB,MAAM,oBAAoB,CAAC,GAAS,EAAiB,MAAM,kBAAkB,CAAC,GAElO,KAAsC,SAA0D;EACpG,UAAU;EACV,cAAc,EAAiB;EAC/B,yBAAyB,GAAmB,IAAI;EAChD,qBAAqB,GAAmB,cAAc;CACxD,IAAI;EAAC;EAAS,EAAiB;EAAI;CAAiB,CAAC,GAE/C,EAAE,MAAM,GAAU,OAAO,IAAW,WAAW,OAAkB,GAAa;EAClF,SAAS,KAAgC,CAAC,CAAC,KAAqB,CAAC;EACjE,SAAS,OAAO,EAAE,iBAET,MADgB,GAAc,YAAY,CAAC,CAAC,yBAAyB,IAAqC,EAAE,UAAO,CAAC,EAAA,CAC3G;EAElB,UAAU,CAAC,EAAiB,mBAAmB,KAAK,UAAU,EAAmC,CAAC;EAClG,OAAO;EACP,WAAW;CACb,CAAC,GAEK,KAA2B,QAAkB;EACjD,EAAgB,YAAY,CAAC,CAAC,KAAK,iBAAiB;CACtD,GAAG,CAAC,CAAC,GAEC,IAAY,CAAC,CAAC,MAAsB,KAAsB,KAAgC,KAC1F,IAAoB,KAA8B,CAAC,MAAuB,CAAC,KAAa,CAAC,CAAC,MAAc,CAAC,KAAgC,GAAM,iBAAiB,SAAS,MAAM,KAAK,GAAM,SAAS,KAAK,CAAC,KAAsB,CAAC,KAAa,MAAS,OACtP,IAAiB,CAAC,KAA8B,CAAC,CAAC,KAAqB,CAAC,KAAqB,CAAC,MAAa,CAAC,MAAiB,GAAM,OAAO,KAAK,GAE/I,KAA0B,QAAqC;EACnE,IAAI,CAAC,GACH,OAAO;EAET,IAAI,CAAC,GACH,OAAO,CAAC;EAEV,IAAI,KAAgC,CAAC,GACnC,OAAO,CAAC;EAEV,IAAI,GACF,OAEI,kBAAA,IAAA,EAAA,UAAA,CACE,kBAAC,IAAD;GACE,IAAI,EACF,cAAc,EAChB;GAEC,UAAA,EAAE,wOAAwO;IACzO,WAAW,EAAQ;IACnB,SAAS,EAAiB,MAAM;GAClC,CAAC;EACE,CAAA,GACL,kBAAC,IAAD;GACE,OAAO;GACP,SAAS;GACT,SAAS;GAER,UAAA,CAAC;EACI,CAAA,CACR,EAAA,CAAA;CAIV,GAAG;EAAC,EAAQ;EAAQ,EAAiB,MAAM;EAAoB;EAA8B;EAA4B;EAAmB;EAA0B;EAAG;CAAI,CAAC;CAwB9K,AAtBA,QAAgB;EACd,AAAI,KACF,EAA4B,CAAQ;CAExC,GAAG,CAAC,GAAU,CAA2B,CAAC,GAE1C,QAAgB;EACd,IAAI,CAAC,GAAoB,QAAQ;GAE/B,AADA,EAAqB,IAAI,GACzB,EAAuD,EAAyB,MAAM,EACpF,mBAAmB,KACrB,CAAC;GACD;EACF;EACA,IAAM,IAAY,EAAe,SAAS,CAAC,CAAC,yBAAoD,EAAyB,IAAI,CAAC,EAAE,qBAAqB,EAAmB;EAGxK,AADA,EAAqB,CAAS,GAC9B,EAAuD,EAAyB,MAAM,EACpF,mBAAmB,EACrB,CAAC;CACH,GAAG;EAAC;EAAgB;EAAoB;CAA2B,CAAC,GAEpE,QAAgB;EACd,AAAI,KAAe,KAAgB,KACjC,EAAQ,SAAS,OAAO;GACtB,WAAW;GACX,WAAW;GACX,WAAW,EAAc,YAA0B,CAAC,CAAC,OAAO,KAAK;EACnE,CAAC;CAEL,GAAG;EAAC;EAAc;EAAgB;CAAW,CAAC;CAE9C,IAAM,KAAmC,IAAsB,MAAyC;EACtG,GAAiC,EAAyB,MAAM;GAC9D,0BAA0B,EAAU;GACpC,wBAAwB,EAAU;GAClC,WAAW,EAAU;EACvB,CAAC;CACH,GAAG,GAAG,GAEA,KAAwB,GAAa,MAAyC;EAClF,GAAiC,CAAS;CAC5C,GAAG,CAAC,EAAgC,CAAC,GAE/B,KAAqB,GAAa,MAA+B;EACrE,GAAc,CAAM;CACtB,GAAG,CAAC,CAAC,GAEC,KAAwB,QAAkB;EAE9C,AADA,EAAqB,IAAI,GACzB,EAAwB,IAAI;CAC9B,GAAG,CAAC,CAAC,GAEC,KAAqB,QAAkB;EAO3C,aAN4B;GAE1B,AADA,MAAM,GAAW,MAAM,IAAI,GAC3B,EAAQ,SAAS,wBAAwB;EAC3C,EAGA,CAAQ;CAEV,GAAG,CAAC,EAAU,CAAC,GAET,KAAoB,QAAkB;EAC1C,GAAmB;CAErB,GAAG,CAAC,EAAkB,CAAC,GAEjB,IAAkC,QAAkB;EACxD,EAAQ,SAAS,KAAK,CAAC;CACzB,GAAG,CAAC,CAAC,GAEC,KAA+B,EAAY,OAAO,MAA4B;EAGlF,AAFA,MAAM,GAAc,EAAqB,MAAM,GAC/C,EAAgC,GAChC,EAAY;CACd,GAAG;EAAC;EAAe;EAAsB;CAA+B,CAAC,GAEnE,KAAgC,EAAY,YAAY;EAE5D,AADA,MAAM,EAAiB,GACvB,EAAgC;CAClC,GAAG,CAAC,GAAkB,CAA+B,CAAC,GAEhD,KAAiC,EAAY,YAAY;EAE7D,AADA,MAAM,GAAkB,GACxB,EAAgC;CAClC,GAAG,CAAC,GAAiC,EAAiB,CAAC,GAEjD,KAAkB,GAAa,EAAE,eAAY,wBAAqD;EAItG,IAHA,EAAwB,IAAI,GAC5B,GAAmB,IAAI,GAEnB,GAAgB,UAAU;GAC5B,IAAM,EAAE,gBAAa;GAerB,AAdA,EAAqB;IACnB,SAAS,EAAS,oBAAoB,EAAS,oBAAoB,CAAC,EAAS,IAAI;IACjF;IACA,UAAU;KACR,MAAM,EAAW;KACjB,KAAK,EAAW;IAClB;GACF,CAAC,GACG,EAAS,aAAa,UAAU,EAAS,QAAQ,EAAS,gBAAgB,SAAS,KACrF,EAAwB;IACtB,SAAS,EAAS;IAClB,QAAQ,EAAS;GACnB,CAAC,GAEC,EAAS,QAAQ,CAAC,EAAS,aAAa,UAC1C,GAAmB,EAAS,IAAI;GAElC;EACF;EAEA,AAAI,GAAgB,mBAAmB,UACrC,EAAqB;GACnB,SAAS,EAAe;GACxB;GACA,UAAU;IACR,MAAM,EAAW;IACjB,KAAK,EAAW;GAClB;EACF,CAAC;CAEL,GAAG,CAAC,CAAC,GAEC,KAAsC,GAAa,MAA4B;EAKnF,AAJA,EAAgB,YAAY,CAAC,CAAC,KAAK,sBAAsB;GACvD,QAAQ,EAAS,MAAK,MAAK,EAAE,OAAO,CAAe,CAAC,CAAC;GACrD,YAAY,EAAiB;EAC/B,CAAC,GACD,EAAY;CACd,GAAG;EAAC;EAAiB;EAAU,EAAiB;CAAE,CAAC,GAE7C,KAA8B,GAAa,MAA0C;EACzF,IAAI,GACF,OACE,kBAAC,GAAD;GACE,SAAA;GAEA,SAAS,YAAY,GAA6B,CAAW;GAH/D,UAAA,CAKE,kBAAC,IAAD,EAAA,UACE,kBAAC,IAAD,EAAe,UAAU,QAAU,CAAA,EACvB,CAAA,GACd,kBAAC,GAAD,EAAA,UACG,CAAC,kCACU,CAAA,CACN;;EAGd,IAAI,GACF,OACE,kBAAC,GAAD;GACE,SAAA;GAEA,eAAe,GAAoC,CAAW;GAHhE,UAAA,CAKE,kBAAC,IAAD,EAAA,UACE,kBAAC,IAAD,EAAkB,UAAU,QAAU,CAAA,EAC1B,CAAA,GACd,kBAAC,GAAD,EAAA,UACG,CAAC,eACU,CAAA,CACN;;CAGhB,GAAG;EAAC;EAAiB;EAAqC;EAA8B;EAAG;CAAoB,CAAC,GAE1G,KAAY,QACX,GAAoB,SAoClB;EA/BL,UAAU,CAAC;EACX,OAAO,GAAoB,KAAkB,OAAW;GACtD,QAAQ,CAAC,CAAC,KAAqB,EAAkB,eAAe,EAAO;GACvE,gBAAgB;IASd,aAR4B;KAK1B,AAJA,MAAM,EAAiB,GACvB,EAAuD,EAAyB,MAAM,EACpF,mBAAmB,EACrB,CAAC,GACD,EAAqB,CAAM;IAC7B,EAEA,CAAQ;GACV;GACA,OAAO,EAAe,0BAA0B,CAAM;GACtD,SACE,kBAAC,IAAD,EACE,mBAAmB,EACpB,CAAA;EAEL,EAAE,KAAK,CAAC;EACR,OAAO,IAAoB,EAAE,uBAAuB,EAAE,WAAW,EAAe,0BAA0B,CAAiB,EAAE,CAAC,IAAI,CAAC;EACnI,SAAS,IAEL,kBAAC,IAAD,EACqB,qBACpB,CAAA,IAED,KAAA;CAGC,IAnCE,CAAC,QAoCT;EAAC;EAAoB;EAAmB;EAAG;EAAkB;CAA2B,CAAC,GAEtF,KAAc,QACX;EACL;GACE,UAAU;GACV,UAAU,CAAC;GACX,OAAO,CAAC;GACR,UAAU,kBAAC,IAAD,CAAkB,CAAA;EAC9B;EACA;GACE,UAAU;GACV,UAAU,CAAC;GACX,OAAO,CAAC;GACR,UAAU,kBAAC,IAAD,CAAY,CAAA;EACxB;EACA;GACE,UAAU;GACV,OAAO,CAAC;GACR,UACE,kBAAC,IAAD,EACE,IAAI,EACF,OAAO,IAAe,KAAA,IAAY,EAAM,QAAQ,MAAM,KACxD,EACD,CAAA;EAEL;CACF,GACC;EAAC;EAAqB;EAAc;EAAmB;EAA+B;EAAgC;EAAG,EAAM,QAAQ,MAAM;CAAI,CAAC;CA+CrJ,AA7CA,QAAgB;EACd,IAAM,UAA4B;GAChC,IAAM,IAAW,EAAE,uEACjB;IACE,yBAAyB,GAAmB,wBAAwB,QAAQ;IAC5E,eAAe,GAAmB,cAAc,QAAQ;GAC1D,CAAC;GAEH,EAAgB,YAAY,CAAC,CAAC,KAAK,4BAA4B;IAC7D,UAAU;IACV,OAAO;KACL;MACE,gBAAgB,EAAmB,eAAe,GAAU,IAAQ,GAAkB,CAAC;MACvF,OAAO,CAAC;KACV;KACA;MACE,gBAAgB,EAAmB,oBAAoB,GAAU,GAAY,QAAQ,GAAkB,CAAC;MACxG,OAAO,CAAC;KACV;KACA;MACE,gBAAgB,EAAmB,oBAAoB,GAAU,GAAY,OAAO,GAAkB,CAAC;MACvG,OAAO,CAAC;KACV;IACF;IACA,MAAM,EAAyB;IAC/B,WAAW,CAAC;GACd,CAAC;EACH;EAGA,EAAoB;EACpB,IAAM,IAAkB,EAAgB,YAAY;EAGpD,OAFA,EAAgB,iBAAiB,8BAA8B,CAAmB,SAErE;GAMX,AALA,EAAgB,KAAK,4BAA4B;IAC/C,OAAO;IACP,MAAM,EAAyB;IAC/B,WAAW,CAAC;GACd,CAAC,GACD,EAAgB,oBAAoB,8BAA8B,CAAmB;EACvF;CACF,GAAG;EAAC;EAAkB;EAAc;EAAmB;EAAQ;EAAG;EAAY,GAAmB,wBAAwB;EAAM,GAAmB,cAAc;CAAI,CAAC,GAGrK,QAAgB;EAEd,IAAM,IAAsB,EAAgB,YAAY,CAAC,CAAC,iBAAiB,+BAA+B,EAAQ,SAAS,KAAK,CAAC;EACjI,aAAa;GACX,EAAoB;EACtB;CACF,GAAG,CAAC,CAAC;CAGL,IAAM,KAAoB,GAAa,MAAoB;EACzD,EAAgB,CAAM;CACxB,GAAG,CAAC,CAAe,CAAC,GAEd,IAA8C,QAI3C,IAHa,GAA0D,EAC5E,sBAAsB,EAAiB,iBAAiB,KAAK,QAC/D,CACO,GACN,CAAC,EAAiB,iBAAiB,KAAK,OAAO,CAAC;CA4BnD,OA1BA,QAAgB;EACd,IAAM,IAAc,EAA4C,WAAW,MAAS;GAClF,EAAiB,UAAU;IACzB,SAAS,EAAK;IACd,QAAQ,EAAyB;GACnC,CAAC;EACH,CAAC;EACD,aAAa;GACX,EAAY;EACd;CACF,GAAG,CAAC,GAA6C,CAAgB,CAAC,GAElE,QAAgB;EACd,IAAM,IAAc,EAAiB,iBAAiB,WAAU,MAAQ;GAClE,EAAK,WAAW,EAAyB,QAG7C,EAA4C,KAAK,EAC/C,sBAAsB,EAAK,QAC7B,CAAC;EACH,CAAC;EACD,aAAa;GACX,EAAY;EACd;CACF,GAAG,CAAC,EAAiB,kBAAkB,CAA2C,CAAC,GAGjF,kBAAC,IAAD;EACE,gBAAgB;EACH;EACb,OAAO;EACP,YAAY,EAAyB;EAJvC,UAAA,CAME,kBAAC,IAAD;GACE,IAAI;IACF,QAAQ;IACR,UAAU;IACV,UAAU;IACV,OAAO;GACT;GANF,UAAA;IAQG,KACC,kBAAA,IAAA,EAAA,UACE,kBAAC,IAAD;KACE,QAAQ;KACR,aAAa,CAAC;IACf,CAAA,EACD,CAAA;IAEF,KAAa,CAAC,KACd,kBAAC,IAAD;KACE,OAAO,CAAC;KACR,uBAAuB,EAAc,YAA0B,CAAC,CAAC,OAAO,KAAK;IAC9E,CAAA;IAEF,CAAC,KAAqB,KACrB,kBAAC,IAAD;KACE,mBAAmB,EAAW;KAC9B,WAAW;KACX,iBAAiB,EAAM,QAAQ,WAAW;KAC1C,OAAO,EAAM,4BAA4B,CAAC,KAAK;KAC/C,YAAY,EAAM,WAAW;KAC7B,cAAc,EAAW;KACzB,6BAA6B;KAC7B,kBAAkB;KAClB,YAAY,EAAc,YAA0B,CAAC,CAAC,OAAO,SAAS;KACtE,eAAe,EAAW;KAC1B,6BAA6B,EAAW;KACxC,iBAAiB,EAAW;KAC5B,cAAc,EAAW;KACzB,cAAc,EAAW;KACzB,sCAAsC,EAAW;KACjD,iBAAiB,EAAW;KAC5B,cAAc,EAAW;KACzB,cAAc,EAAW;KACzB,gBAAgB,IAAgB;KAChC,gBAAgB;KACG;KACnB,aAAa;KACb,mBAAmB;KACnB,kBAAkB,EAAW;KAC7B,KAAK;KACL,6BAA6B,EAAW;KACxC,YAAY,EAAM,QAAQ,KAAK;KAC/B,iBAAiB,EAAW;KAC5B,eAAe,EAAiB;KAChC,qBAAqB;KACrB,oCAAoC;KACnB;KACjB,wBAAwB,EAAM,4BAA4B,CAAC,KAAK;KAChE,0BAA0B,EAAM,4BAA4B,CAAC,KAAK;KAC5D;KACN,WAAW,EAAM,4BAA4B,CAAC,KAAK;KACnD,UAAU,EAAM,4BAA4B,CAAC,KAAK;KAClD,aAAa,EAAW;KACxB,qBAAqB,EAAiB;IACvC,CAAA;GAEA;EACL,CAAA,GAAA,kBAAC,IAAD;GACE,QAAQ;GACR,eAAe;GACf,aAAa;EACd,CAAA,CACc;;AAErB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { StoreApi } from 'zustand';
|
|
2
2
|
import { CaseDbCase, CaseDbCaseDataIssue, CaseDbCaseUploadResult, CaseDbCol, CaseDbCompleteCaseType } from '@gen-epix/api-casedb';
|
|
3
|
-
import { TableRowAndColumnParams } from '@gen-epix/ui/models/table';
|
|
4
|
-
import { TableStore } from '@gen-epix/ui/stores/tableStore';
|
|
3
|
+
import { TableRowAndColumnParams } from '@gen-epix/ui-client-common/models/table';
|
|
4
|
+
import { TableStore } from '@gen-epix/ui-client-common/stores/tableStore';
|
|
5
5
|
export type UploadCaseResultTableProps = {
|
|
6
6
|
readonly caseRightsColMap?: {
|
|
7
7
|
[colId: string]: string[];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CaseDbCase, CaseDbCompleteCaseType } from '@gen-epix/api-casedb';
|
|
2
|
-
import { WithDialogRefMethods, WithDialogRenderProps } from '@gen-epix/ui/hoc/withDialog';
|
|
2
|
+
import { WithDialogRefMethods, WithDialogRenderProps } from '@gen-epix/ui-core-components/hoc/withDialog';
|
|
3
3
|
export interface UploadEditColumnValuesDialogOpenProps {
|
|
4
4
|
colId: string;
|
|
5
5
|
completeCaseType: CaseDbCompleteCaseType;
|
|
@@ -9,4 +9,4 @@ export interface UploadEditColumnValuesDialogProps extends WithDialogRenderProps
|
|
|
9
9
|
onSubmit: (content: CaseDbCase['content']) => void;
|
|
10
10
|
}
|
|
11
11
|
export type UploadEditColumnValuesDialogRefMethods = WithDialogRefMethods<UploadEditColumnValuesDialogProps, UploadEditColumnValuesDialogOpenProps>;
|
|
12
|
-
export declare const UploadEditColumnValuesDialog: import('react').ComponentClass<UploadEditColumnValuesDialogProps, import('@gen-epix/ui/hoc/withDialog').WithDialogState<UploadEditColumnValuesDialogOpenProps>>;
|
|
12
|
+
export declare const UploadEditColumnValuesDialog: import('react').ComponentClass<UploadEditColumnValuesDialogProps, import('@gen-epix/ui-core-components/hoc/withDialog').WithDialogState<UploadEditColumnValuesDialogOpenProps>>;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { CaseDbUser } from '@gen-epix/api-casedb';
|
|
2
|
-
import { WithDialogRefMethods, WithDialogRenderProps } from '@gen-epix/ui/hoc/withDialog';
|
|
2
|
+
import { WithDialogRefMethods, WithDialogRenderProps } from '@gen-epix/ui-core-components/hoc/withDialog';
|
|
3
3
|
export interface UserRightsDialogOpenProps {
|
|
4
4
|
user: CaseDbUser;
|
|
5
5
|
}
|
|
6
6
|
export interface UserRightsDialogProps extends WithDialogRenderProps<UserRightsDialogOpenProps> {
|
|
7
7
|
}
|
|
8
8
|
export type UserRightsDialogRefMethods = WithDialogRefMethods<UserRightsDialogProps, UserRightsDialogOpenProps>;
|
|
9
|
-
export declare const UserRightsDialog: import('react').ComponentClass<UserRightsDialogProps, import('@gen-epix/ui/hoc/withDialog').WithDialogState<UserRightsDialogOpenProps>>;
|
|
9
|
+
export declare const UserRightsDialog: import('react').ComponentClass<UserRightsDialogProps, import('@gen-epix/ui-core-components/hoc/withDialog').WithDialogState<UserRightsDialogOpenProps>>;
|
package/dist/components/ui/UsersEffectiveRightsDetailsDialog/UsersEffectiveRightsDetailsDialog.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CaseDbUser } from '@gen-epix/api-casedb';
|
|
2
|
-
import { WithDialogRefMethods, WithDialogRenderProps } from '@gen-epix/ui/hoc/withDialog';
|
|
2
|
+
import { WithDialogRefMethods, WithDialogRenderProps } from '@gen-epix/ui-core-components/hoc/withDialog';
|
|
3
3
|
import { UserEffectiveRight } from '../../../models/caseAccess';
|
|
4
4
|
export interface UsersEffectiveRightsDetailsDialogOpenProps {
|
|
5
5
|
type: 'caseTypeSets' | 'readColSets' | 'writeColSets';
|
|
@@ -10,4 +10,4 @@ export type UsersEffectiveRightsDetailsType = 'caseTypeSets' | 'readColSets' | '
|
|
|
10
10
|
export interface UsersEffectiveRightsDetailsDialogProps extends WithDialogRenderProps<UsersEffectiveRightsDetailsDialogOpenProps> {
|
|
11
11
|
}
|
|
12
12
|
export type UsersEffectiveRightsDetailsDialogRefMethods = WithDialogRefMethods<UsersEffectiveRightsDetailsDialogProps, UsersEffectiveRightsDetailsDialogOpenProps>;
|
|
13
|
-
export declare const UsersEffectiveRightsDetailsDialog: import('react').ComponentClass<UsersEffectiveRightsDetailsDialogProps, import('@gen-epix/ui/hoc/withDialog').WithDialogState<UsersEffectiveRightsDetailsDialogOpenProps>>;
|
|
13
|
+
export declare const UsersEffectiveRightsDetailsDialog: import('react').ComponentClass<UsersEffectiveRightsDetailsDialogProps, import('@gen-epix/ui-core-components/hoc/withDialog').WithDialogState<UsersEffectiveRightsDetailsDialogOpenProps>>;
|
|
@@ -11,12 +11,12 @@ import { Box as u, Link as d, Tab as f, Tabs as p, Typography as m } from "@mui/
|
|
|
11
11
|
import { useCallback as h, useEffect as g, useState as _ } from "react";
|
|
12
12
|
import { useTranslation as v } from "react-i18next";
|
|
13
13
|
import { jsx as y, jsxs as b } from "react/jsx-runtime";
|
|
14
|
-
import { ResponseHandler as x } from "@gen-epix/ui/components/ui/ResponseHandler";
|
|
14
|
+
import { ResponseHandler as x } from "@gen-epix/ui-client-common/components/ui/ResponseHandler";
|
|
15
15
|
import { useArray as S } from "@gen-epix/ui-core/hooks/useArray";
|
|
16
|
-
import { withDialog as C } from "@gen-epix/ui/hoc/withDialog";
|
|
16
|
+
import { withDialog as C } from "@gen-epix/ui-core-components/hoc/withDialog";
|
|
17
17
|
import { TestIdUtil as w } from "@gen-epix/ui-core/utils/TestIdUtil";
|
|
18
|
-
import { LoadableUtil as T } from "@gen-epix/ui/utils/LoadableUtil";
|
|
19
|
-
import { UserUtil as E } from "@gen-epix/ui/utils/UserUtil";
|
|
18
|
+
import { LoadableUtil as T } from "@gen-epix/ui-client-common/utils/LoadableUtil";
|
|
19
|
+
import { UserUtil as E } from "@gen-epix/ui-client-common/utils/UserUtil";
|
|
20
20
|
//#region src/components/ui/UsersEffectiveRightsDetailsDialog/UsersEffectiveRightsDetailsDialog.tsx
|
|
21
21
|
var D = [
|
|
22
22
|
"caseTypeSets",
|
|
@@ -41,7 +41,7 @@ var D = [
|
|
|
41
41
|
}, []), X = h((e) => {
|
|
42
42
|
R((t) => t.includes(e) ? t.filter((t) => t !== e) : [...t, e]);
|
|
43
43
|
}, []);
|
|
44
|
-
|
|
44
|
+
g(() => {
|
|
45
45
|
A(P("{{userName}} effective rights details for {{dataCollectionName}}", {
|
|
46
46
|
dataCollectionName: H.map.get(N.data_collection_id)?.name ?? N.data_collection_id,
|
|
47
47
|
userName: E.getUserDisplayValue(M, P)
|
|
@@ -65,10 +65,12 @@ var D = [
|
|
|
65
65
|
C,
|
|
66
66
|
k,
|
|
67
67
|
P
|
|
68
|
-
])
|
|
68
|
+
]);
|
|
69
|
+
let Z = T.isSomeLoading(J);
|
|
70
|
+
return /* @__PURE__ */ y(x, {
|
|
69
71
|
inlineSpinner: !0,
|
|
70
72
|
loadables: J,
|
|
71
|
-
children: !
|
|
73
|
+
children: !Z && /* @__PURE__ */ b(u, {
|
|
72
74
|
sx: { width: "100%" },
|
|
73
75
|
children: [
|
|
74
76
|
/* @__PURE__ */ y(u, {
|
|
@@ -126,7 +128,10 @@ var D = [
|
|
|
126
128
|
children: V.getName(t) ?? e
|
|
127
129
|
}), /* @__PURE__ */ y(u, {
|
|
128
130
|
sx: { display: L.includes(`case-type-sets-${e}`) ? "block" : "none" },
|
|
129
|
-
children: n.map((e) =>
|
|
131
|
+
children: n.map((e) => {
|
|
132
|
+
let t = z.map.get(e.case_type_id);
|
|
133
|
+
return /* @__PURE__ */ y(u, { children: t?.name ?? e.case_type_id }, e.case_type_id);
|
|
134
|
+
})
|
|
130
135
|
})]
|
|
131
136
|
}) }, e);
|
|
132
137
|
}) }),
|
|
@@ -142,7 +147,10 @@ var D = [
|
|
|
142
147
|
children: N.uncategorized_case_type_ids.sort((e, t) => {
|
|
143
148
|
let n = z.map.get(e), r = z.map.get(t);
|
|
144
149
|
return (n?.name ?? "").localeCompare(r?.name ?? "");
|
|
145
|
-
}).map((e) =>
|
|
150
|
+
}).map((e) => {
|
|
151
|
+
let t = z.map.get(e);
|
|
152
|
+
return /* @__PURE__ */ y(u, { children: t?.name ?? e }, e);
|
|
153
|
+
})
|
|
146
154
|
})]
|
|
147
155
|
})
|
|
148
156
|
]
|
|
@@ -314,7 +322,10 @@ var D = [
|
|
|
314
322
|
children: V.getName(n) ?? t
|
|
315
323
|
}), /* @__PURE__ */ y(u, {
|
|
316
324
|
sx: { display: L.includes(`${e.from_data_collection_id}-${t}`) ? "block" : "none" },
|
|
317
|
-
children: r.map((e) =>
|
|
325
|
+
children: r.map((e) => {
|
|
326
|
+
let t = z.map.get(e.case_type_id);
|
|
327
|
+
return /* @__PURE__ */ y(u, { children: t?.name ?? e.case_type_id }, e.case_type_id);
|
|
328
|
+
})
|
|
318
329
|
})]
|
|
319
330
|
}) }, t);
|
|
320
331
|
}),
|
|
@@ -330,7 +341,10 @@ var D = [
|
|
|
330
341
|
children: e.uncategorized_case_type_ids.sort((e, t) => {
|
|
331
342
|
let n = z.map.get(e), r = z.map.get(t);
|
|
332
343
|
return (n?.name ?? "").localeCompare(r?.name ?? "");
|
|
333
|
-
}).map((e) =>
|
|
344
|
+
}).map((e) => {
|
|
345
|
+
let t = z.map.get(e);
|
|
346
|
+
return /* @__PURE__ */ y(u, { children: t?.name ?? e }, e);
|
|
347
|
+
})
|
|
334
348
|
})]
|
|
335
349
|
})
|
|
336
350
|
] }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/ui/UsersEffectiveRightsDetailsDialog/UsersEffectiveRightsDetailsDialog.tsx"],"sourcesContent":["import { useTranslation } from 'react-i18next';\nimport {\n Box,\n Link,\n Tab,\n Tabs,\n Typography,\n} from '@mui/material';\nimport type {\n ReactElement,\n SyntheticEvent,\n} from 'react';\nimport {\n useCallback,\n useEffect,\n useState,\n} from 'react';\nimport type { CaseDbUser } from '@gen-epix/api-casedb';\nimport type { DialogAction } from '@gen-epix/ui/components/ui/Dialog';\nimport type {\n WithDialogRefMethods,\n WithDialogRenderProps,\n} from '@gen-epix/ui/hoc/withDialog';\nimport { LoadableUtil } from '@gen-epix/ui/utils/LoadableUtil';\nimport { ResponseHandler } from '@gen-epix/ui/components/ui/ResponseHandler';\nimport { UserUtil } from '@gen-epix/ui/utils/UserUtil';\nimport { withDialog } from '@gen-epix/ui/hoc/withDialog';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\nimport { useArray } from '@gen-epix/ui-core/hooks/useArray';\n\nimport { useCaseTypeSetMembersQuery } from '../../../dataHooks/useCaseTypeSetMembersQuery';\nimport {\n useCaseTypeSetNameFactory,\n useCaseTypeSetsMapQuery,\n} from '../../../dataHooks/useCaseTypeSetsQuery';\nimport { useCaseTypeMapQuery } from '../../../dataHooks/useCaseTypesQuery';\nimport { useColSetMembersQuery } from '../../../dataHooks/useColSetMembersQuery';\nimport { useColSetMapQuery } from '../../../dataHooks/useColSetsQuery';\nimport {\n useColMapQuery,\n useColNameFactory,\n} from '../../../dataHooks/useColsQuery';\nimport { useDataCollectionsMapQuery } from '../../../dataHooks/useDataCollectionsQuery';\nimport type { UserEffectiveRight } from '../../../models/caseAccess';\nimport { CustomTabPanel } from '../CustomTabPanel';\n\n\nexport interface UsersEffectiveRightsDetailsDialogOpenProps {\n type: 'caseTypeSets' | 'readColSets' | 'writeColSets';\n user: CaseDbUser;\n userEffectiveRight: UserEffectiveRight;\n}\n\nexport type UsersEffectiveRightsDetailsType = 'caseTypeSets' | 'readColSets' | 'writeColSets';\n\nconst usersEffectiveRightsDetailsTypeOrder = ['caseTypeSets', 'readColSets', 'writeColSets'] as const;\n\nexport interface UsersEffectiveRightsDetailsDialogProps extends WithDialogRenderProps<UsersEffectiveRightsDetailsDialogOpenProps> {\n //\n}\n\nexport type UsersEffectiveRightsDetailsDialogRefMethods = WithDialogRefMethods<UsersEffectiveRightsDetailsDialogProps, UsersEffectiveRightsDetailsDialogOpenProps>;\n\nconst a11yProps = (index: number) => {\n return {\n 'aria-controls': `simple-tabpanel-${index}`,\n id: `simple-tab-${index}`,\n };\n};\n\nexport const UsersEffectiveRightsDetailsDialog = withDialog<UsersEffectiveRightsDetailsDialogProps, UsersEffectiveRightsDetailsDialogOpenProps>((\n {\n onActionsChange,\n onClose,\n onTitleChange,\n openProps: { type, user, userEffectiveRight },\n }: UsersEffectiveRightsDetailsDialogProps,\n): ReactElement => {\n\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState(usersEffectiveRightsDetailsTypeOrder.indexOf(type));\n const [visibleItems, setVisibleItems] = useState<string[]>([]);\n\n const caseTypeMapQuery = useCaseTypeMapQuery();\n const caseTypeSetMapQuery = useCaseTypeSetsMapQuery();\n const caseTypeSetNameFactory = useCaseTypeSetNameFactory();\n const dataCollectionsMapQuery = useDataCollectionsMapQuery();\n const colSetMapQuery = useColSetMapQuery();\n const colMapQuery = useColMapQuery();\n const colNameFactory = useColNameFactory();\n const caseTypeSetMembersQuery = useCaseTypeSetMembersQuery();\n const colSetMembersQuery = useColSetMembersQuery();\n\n const loadables = useArray([\n caseTypeMapQuery,\n caseTypeSetMapQuery,\n caseTypeSetNameFactory,\n dataCollectionsMapQuery,\n colSetMapQuery,\n colMapQuery,\n colNameFactory,\n caseTypeSetMembersQuery,\n colSetMembersQuery,\n ]);\n\n const onTabChange = useCallback((_event: SyntheticEvent, newValue: number) => {\n setActiveTab(newValue);\n }, []);\n\n const onToggleSectionLinkClick = useCallback((key: string) => {\n setVisibleItems((prev) => {\n if (prev.includes(key)) {\n return prev.filter(item => item !== key);\n }\n return [...prev, key];\n });\n }, []);\n\n useEffect(() => {\n onTitleChange(t('{{userName}} effective rights details for {{dataCollectionName}}', { dataCollectionName: dataCollectionsMapQuery.map.get(userEffectiveRight.data_collection_id)?.name ?? userEffectiveRight.data_collection_id, userName: UserUtil.getUserDisplayValue(user, t) }));\n }, [dataCollectionsMapQuery.map, onTitleChange, t, user, userEffectiveRight.data_collection_id]);\n\n useEffect(() => {\n const actions: DialogAction[] = [];\n actions.push({\n ...TestIdUtil.createAttributes('UsersEffectiveRightsDetailsDialog-closeButton'),\n color: 'secondary',\n label: t`Close`,\n onClick: onClose,\n variant: 'contained',\n });\n onActionsChange(actions);\n }, [onActionsChange, onClose, t]);\n\n const isLoading = LoadableUtil.isSomeLoading(loadables);\n return (\n <ResponseHandler\n inlineSpinner\n loadables={loadables}\n >\n {!isLoading && (\n <Box sx={{ width: '100%' }}>\n <Box sx={{ borderBottom: 1, borderColor: 'divider' }}>\n <Tabs\n aria-label={'basic tabs example'}\n onChange={onTabChange}\n value={activeTab}\n >\n <Tab\n label={'Case types'}\n {...a11yProps(0)}\n />\n <Tab\n label={'Read columns'}\n {...a11yProps(1)}\n />\n <Tab\n label={'Write columns'}\n {...a11yProps(2)}\n />\n <Tab\n label={'Rights'}\n {...a11yProps(3)}\n />\n <Tab\n label={'Additional rights'}\n {...a11yProps(4)}\n />\n </Tabs>\n </Box>\n <CustomTabPanel\n index={0}\n value={activeTab}\n >\n { !userEffectiveRight.categorized_case_type_ids.length && !userEffectiveRight.uncategorized_case_type_ids.length && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n {t`No case types assigned`}\n </Box>\n )}\n { userEffectiveRight.case_type_set_ids.length > 0 && (\n <Box>\n {userEffectiveRight.case_type_set_ids.map((caseTypeSetId) => {\n const caseTypeSet = caseTypeSetMapQuery.map.get(caseTypeSetId);\n const caseTypeSetMembers = caseTypeSetMembersQuery.data.filter(x => x.case_type_set_id === caseTypeSetId);\n const sortedCaseTypeSetMembers = caseTypeSetMembers.sort((a, b) => {\n const caseTypeA = caseTypeMapQuery.map.get(a.case_type_id);\n const caseTypeB = caseTypeMapQuery.map.get(b.case_type_id);\n return (caseTypeA?.name ?? '').localeCompare(caseTypeB?.name ?? '');\n });\n return (\n <Box key={caseTypeSetId}>\n <Box\n sx={{\n marginY: 1,\n }}\n >\n <Link\n href={'#'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => onToggleSectionLinkClick(`case-type-sets-${caseTypeSetId}`)}\n tabIndex={0}\n >\n {caseTypeSetNameFactory.getName(caseTypeSet) ?? caseTypeSetId}\n </Link>\n <Box sx={{ display: visibleItems.includes(`case-type-sets-${caseTypeSetId}`) ? 'block' : 'none' }}>\n {sortedCaseTypeSetMembers.map((caseTypeSetMember) => {\n const caseType = caseTypeMapQuery.map.get(caseTypeSetMember.case_type_id);\n return (\n <Box key={caseTypeSetMember.case_type_id}>\n {caseType?.name ?? caseTypeSetMember.case_type_id}\n </Box>\n );\n })}\n </Box>\n </Box>\n </Box>\n );\n })}\n </Box>\n )}\n { userEffectiveRight.uncategorized_case_type_ids.length > 0 && (\n <Box\n sx={{\n marginY: 1,\n }}\n >\n <Link\n href={'#'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => onToggleSectionLinkClick(`uncategorized-case-type-sets`)}\n tabIndex={0}\n >\n {t`Uncategorized case types`}\n </Link>\n <Box sx={{ display: visibleItems.includes(`uncategorized-case-type-sets`) ? 'block' : 'none' }}>\n {userEffectiveRight.uncategorized_case_type_ids.sort((a, b) => {\n const caseTypeA = caseTypeMapQuery.map.get(a);\n const caseTypeB = caseTypeMapQuery.map.get(b);\n return (caseTypeA?.name ?? '').localeCompare(caseTypeB?.name ?? '');\n }).map((caseTypeId) => {\n const caseType = caseTypeMapQuery.map.get(caseTypeId);\n return (\n <Box key={caseTypeId}>\n {caseType?.name ?? caseTypeId}\n </Box>\n );\n })}\n </Box>\n </Box>\n )}\n </CustomTabPanel>\n <CustomTabPanel\n index={1}\n value={activeTab}\n >\n { !userEffectiveRight.categorized_read_col_ids.length && !userEffectiveRight.uncategorized_read_col_ids.length && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n {t`No read columns assigned`}\n </Box>\n )}\n { userEffectiveRight.read_col_set_ids.length > 0 && (\n <Box>\n {userEffectiveRight.read_col_set_ids.map((colSetId) => {\n const colSet = colSetMapQuery.map.get(colSetId);\n const colSetMembers = colSetMembersQuery.data.filter(x => x.col_set_id === colSetId);\n const sortedColSetMembers = colSetMembers.sort((a, b) => {\n const colA = colMapQuery.map.get(a.col_id);\n const colB = colMapQuery.map.get(b.col_id);\n const colAName = colNameFactory.getName(colA) ?? a.col_id;\n const colBName = colNameFactory.getName(colB) ?? b.col_id;\n return colAName.localeCompare(colBName);\n });\n return (\n <Box key={colSetId}>\n <Box\n sx={{\n marginY: 1,\n }}\n >\n <Link\n href={'#'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => onToggleSectionLinkClick(`read-col-sets-${colSetId}`)}\n tabIndex={0}\n >\n {colSet?.name ?? colSetId}\n </Link>\n <Box sx={{ display: visibleItems.includes(`read-col-sets-${colSetId}`) ? 'block' : 'none' }}>\n {sortedColSetMembers.map((colSetMember) => {\n const refCol = colMapQuery.map.get(colSetMember.col_id);\n return (\n <Box key={refCol.id}>\n {(refCol && colNameFactory.getName(refCol)) ?? colSetMember.col_id}\n </Box>\n );\n })}\n </Box>\n </Box>\n </Box>\n );\n })}\n </Box>\n )}\n { userEffectiveRight.uncategorized_read_col_ids.length > 0 && (\n <Box\n sx={{\n marginY: 1,\n }}\n >\n <Typography variant={'h5'}>\n {t`Uncategorized read columns sets`}\n </Typography>\n <Link\n href={'#'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => onToggleSectionLinkClick(`uncategorized-read-col-sets`)}\n tabIndex={0}\n >\n {t`Uncategorized read columns sets`}\n </Link>\n <Box sx={{ display: visibleItems.includes(`uncategorized-read-col-sets`) ? 'block' : 'none' }}>\n {userEffectiveRight.uncategorized_read_col_ids.sort((a, b) => {\n const colA = colMapQuery.map.get(a);\n const colB = colMapQuery.map.get(b);\n const colAName = colNameFactory.getName(colA) ?? a;\n const colBName = colNameFactory.getName(colB) ?? b;\n return colAName.localeCompare(colBName);\n }).map((colId) => {\n const refCol = colMapQuery.map.get(colId);\n return (\n <Box key={colId}>\n {colNameFactory.getName(refCol) ?? colId}\n </Box>\n );\n })}\n </Box>\n </Box>\n )}\n </CustomTabPanel>\n <CustomTabPanel\n index={2}\n value={activeTab}\n >\n { !userEffectiveRight.categorized_write_col_ids.length && !userEffectiveRight.uncategorized_write_col_ids.length && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n {t`No write columns assigned`}\n </Box>\n )}\n { userEffectiveRight.write_col_set_ids.length > 0 && (\n <Box>\n {userEffectiveRight.write_col_set_ids.map((colSetId) => {\n const colSet = colSetMapQuery.map.get(colSetId);\n const colSetMembers = colSetMembersQuery.data.filter(x => x.col_set_id === colSetId);\n const sortedColSetMembers = colSetMembers.sort((a, b) => {\n const colA = colMapQuery.map.get(a.col_id);\n const colB = colMapQuery.map.get(b.col_id);\n const colAName = colNameFactory.getName(colA) ?? a.col_id;\n const colBName = colNameFactory.getName(colB) ?? b.col_id;\n return colAName.localeCompare(colBName);\n });\n return (\n <Box key={colSetId}>\n <Box\n sx={{\n marginY: 1,\n }}\n >\n <Link\n href={'#'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => onToggleSectionLinkClick(`write-col-sets-${colSetId}`)}\n tabIndex={0}\n >\n {colSet?.name ?? colSetId}\n </Link>\n <Box sx={{ display: visibleItems.includes(`write-col-sets-${colSetId}`) ? 'block' : 'none' }}>\n {sortedColSetMembers.map((colSetMember) => {\n const refCol = colMapQuery.map.get(colSetMember.col_id);\n return (\n <Box key={refCol.id}>\n {colNameFactory.getName(refCol) ?? colSetMember.col_id}\n </Box>\n );\n })}\n </Box>\n </Box>\n </Box>\n );\n })}\n </Box>\n )}\n { userEffectiveRight.uncategorized_write_col_ids.length > 0 && (\n <Box\n sx={{\n marginY: 1,\n }}\n >\n <Link\n href={'#'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => onToggleSectionLinkClick(`uncategorized-write-col-sets`)}\n tabIndex={0}\n >\n {t`Uncategorized write columns sets`}\n </Link>\n <Box sx={{ display: visibleItems.includes(`uncategorized-write-col-sets`) ? 'block' : 'none' }}>\n {userEffectiveRight.uncategorized_write_col_ids.sort((a, b) => {\n const colA = colMapQuery.map.get(a);\n const colB = colMapQuery.map.get(b);\n const colAName = colNameFactory.getName(colA) ?? a;\n const colBName = colNameFactory.getName(colB) ?? b;\n return colAName.localeCompare(colBName);\n }).map((colId) => {\n const refCol = colMapQuery.map.get(colId);\n return (\n <Box key={colId}>\n {colNameFactory.getName(refCol) ?? colId}\n </Box>\n );\n })}\n </Box>\n </Box>\n )}\n </CustomTabPanel>\n <CustomTabPanel\n index={3}\n value={activeTab}\n >\n <Box\n component={'dl'}\n sx={{ display: 'grid', gap: 2, gridTemplateColumns: '1fr 1fr' }}\n >\n <dt>\n {t`Add case`}\n </dt>\n <dd>\n {userEffectiveRight.add_case ? t`Yes` : t`No`}\n </dd>\n <dt>\n {t`Remove case`}\n </dt>\n <dd>\n {userEffectiveRight.remove_case ? t`Yes` : t`No`}\n </dd>\n <dt>\n {t`Add case set`}\n </dt>\n <dd>\n {userEffectiveRight.add_case_set ? t`Yes` : t`No`}\n </dd>\n <dt>\n {t`Remove case set`}\n </dt>\n <dd>\n {userEffectiveRight.remove_case_set ? t`Yes` : t`No`}\n </dd>\n <dt>\n {t`Read case set`}\n </dt>\n <dd>\n {userEffectiveRight.read_case_set ? t`Yes` : t`No`}\n </dd>\n <dt>\n {t`Write case set`}\n </dt>\n <dd>\n {userEffectiveRight.write_case_set ? t`Yes` : t`No`}\n </dd>\n <dt>\n {t`Private`}\n </dt>\n <dd>\n {userEffectiveRight.is_private ? t`Yes` : t`No`}\n </dd>\n </Box>\n </CustomTabPanel>\n <CustomTabPanel\n index={4}\n value={activeTab}\n >\n <Box\n sx={{\n marginY: 2,\n }}\n >\n { !userEffectiveRight.effective_share_case_rights.length && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n {t`No additional rights assigned`}\n </Box>\n )}\n {userEffectiveRight.effective_share_case_rights.map((right) => (\n <Box\n key={right.from_data_collection_id}\n sx={{\n marginY: 2,\n }}\n >\n <Box>\n <Typography variant={'h5'}>\n {t('From: {{dataCollectionName}}', {\n dataCollectionName: dataCollectionsMapQuery.map.get(right.from_data_collection_id)?.name ?? right.from_data_collection_id,\n })}\n </Typography>\n </Box>\n <Box>\n {right.categorized_case_type_ids.length === 0 && right.uncategorized_case_type_ids.length === 0 && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n {t`No case types assigned`}\n </Box>\n )}\n {right.case_type_set_ids.map((caseTypeSetId) => {\n const caseTypeSet = caseTypeSetMapQuery.map.get(caseTypeSetId);\n const caseTypeSetMembers = caseTypeSetMembersQuery.data.filter(x => x.case_type_set_id === caseTypeSetId);\n const sortedCaseTypeSetMembers = caseTypeSetMembers.sort((a, b) => {\n const caseTypeA = caseTypeMapQuery.map.get(a.case_type_id);\n const caseTypeB = caseTypeMapQuery.map.get(b.case_type_id);\n return (caseTypeA?.name ?? '').localeCompare(caseTypeB?.name ?? '');\n });\n return (\n <Box key={caseTypeSetId}>\n <Box\n sx={{\n marginY: 1,\n }}\n >\n <Link\n href={'#'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => onToggleSectionLinkClick(`${right.from_data_collection_id}-${caseTypeSetId}`)}\n tabIndex={0}\n >\n {caseTypeSetNameFactory.getName(caseTypeSet) ?? caseTypeSetId}\n </Link>\n <Box sx={{ display: visibleItems.includes(`${right.from_data_collection_id}-${caseTypeSetId}`) ? 'block' : 'none' }}>\n {sortedCaseTypeSetMembers.map((caseTypeSetMember) => {\n const caseType = caseTypeMapQuery.map.get(caseTypeSetMember.case_type_id);\n return (\n <Box key={caseTypeSetMember.case_type_id}>\n {caseType?.name ?? caseTypeSetMember.case_type_id}\n </Box>\n );\n })}\n </Box>\n </Box>\n </Box>\n );\n })}\n {right.uncategorized_case_type_ids.length > 0 && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n <Link\n href={'#'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => onToggleSectionLinkClick(`${right.from_data_collection_id}-uncategorized`)}\n tabIndex={0}\n >\n {t`Uncategorized case types`}\n </Link>\n <Box sx={{ display: visibleItems.includes(`${right.from_data_collection_id}-uncategorized`) ? 'block' : 'none' }}>\n {right.uncategorized_case_type_ids.sort((a, b) => {\n const caseTypeA = caseTypeMapQuery.map.get(a);\n const caseTypeB = caseTypeMapQuery.map.get(b);\n return (caseTypeA?.name ?? '').localeCompare(caseTypeB?.name ?? '');\n }).map((caseTypeId) => {\n const caseType = caseTypeMapQuery.map.get(caseTypeId);\n return (\n <Box key={caseTypeId}>\n {caseType?.name ?? caseTypeId}\n </Box>\n );\n })}\n </Box>\n </Box>\n )}\n </Box>\n <Box\n component={'dl'}\n sx={{ display: 'grid', gap: 0, gridTemplateColumns: '1fr 1fr' }}\n >\n <dt>\n {t`Add case`}\n </dt>\n <dd>\n {right.add_case ? t`Yes` : t`No`}\n </dd>\n <dt>\n {t`Remove case`}\n </dt>\n <dd>\n {right.remove_case ? t`Yes` : t`No`}\n </dd>\n <dt>\n {t`Add case set`}\n </dt>\n <dd>\n {right.add_case_set ? t`Yes` : t`No`}\n </dd>\n <dt>\n {t`Remove case set`}\n </dt>\n <dd>\n {right.remove_case_set ? t`Yes` : t`No`}\n </dd>\n </Box>\n </Box>\n ))}\n\n </Box>\n </CustomTabPanel>\n </Box>\n )}\n </ResponseHandler>\n );\n}, {\n defaultTitle: '',\n disableBackdropClick: false,\n fullWidth: true,\n maxWidth: 'lg',\n noCloseButton: false,\n testId: 'UsersEffectiveRightsDetailsDialog',\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuDA,IAAM,IAAuC;CAAC;CAAgB;CAAe;AAAc,GAQrF,KAAa,OACV;CACL,iBAAiB,mBAAmB;CACpC,IAAI,cAAc;AACpB,IAGW,IAAoC,GAC/C,EACE,oBACA,YACA,kBACA,WAAW,EAAE,SAAM,SAAM,8BAEV;CAEjB,IAAM,EAAE,SAAM,EAAe,GACvB,CAAC,GAAW,KAAgB,EAAS,EAAqC,QAAQ,CAAI,CAAC,GACvF,CAAC,GAAc,KAAmB,EAAmB,CAAC,CAAC,GAEvD,IAAmB,EAAoB,GACvC,IAAsB,EAAwB,GAC9C,IAAyB,EAA0B,GACnD,IAA0B,EAA2B,GACrD,IAAiB,EAAkB,GACnC,IAAc,EAAe,GAC7B,IAAiB,EAAkB,GACnC,IAA0B,EAA2B,GACrD,IAAqB,EAAsB,GAE3C,IAAY,EAAS;EACzB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,GAEK,IAAc,GAAa,GAAwB,MAAqB;EAC5E,EAAa,CAAQ;CACvB,GAAG,CAAC,CAAC,GAEC,IAA2B,GAAa,MAAgB;EAC5D,GAAiB,MACX,EAAK,SAAS,CAAG,IACZ,EAAK,QAAO,MAAQ,MAAS,CAAG,IAElC,CAAC,GAAG,GAAM,CAAG,CACrB;CACH,GAAG,CAAC,CAAC;CAmBL,OAjBA,QAAgB;EACd,EAAc,EAAE,oEAAoE;GAAE,oBAAoB,EAAwB,IAAI,IAAI,EAAmB,kBAAkB,CAAC,EAAE,QAAQ,EAAmB;GAAoB,UAAU,EAAS,oBAAoB,GAAM,CAAC;EAAE,CAAC,CAAC;CACrR,GAAG;EAAC,EAAwB;EAAK;EAAe;EAAG;EAAM,EAAmB;CAAkB,CAAC,GAE/F,QAAgB;EACd,IAAM,IAA0B,CAAC;EAQjC,AAPA,EAAQ,KAAK;GACX,GAAG,EAAW,iBAAiB,+CAA+C;GAC9E,OAAO;GACP,OAAO,CAAC;GACR,SAAS;GACT,SAAS;EACX,CAAC,GACD,EAAgB,CAAO;CACzB,GAAG;EAAC;EAAiB;EAAS;CAAC,CAAC,GAI9B,kBAAC,GAAD;EACE,eAAA;EACW;YAEV,CANa,EAAa,cAAc,CAMvC,KACA,kBAAC,GAAD;GAAK,IAAI,EAAE,OAAO,OAAO;aAAzB;IACE,kBAAC,GAAD;KAAK,IAAI;MAAE,cAAc;MAAG,aAAa;KAAU;eACjD,kBAAC,GAAD;MACE,cAAY;MACZ,UAAU;MACV,OAAO;gBAHT;OAKE,kBAAC,GAAD;QACE,OAAO;QACP,GAAI,EAAU,CAAC;OAChB,CAAA;OACD,kBAAC,GAAD;QACE,OAAO;QACP,GAAI,EAAU,CAAC;OAChB,CAAA;OACD,kBAAC,GAAD;QACE,OAAO;QACP,GAAI,EAAU,CAAC;OAChB,CAAA;OACD,kBAAC,GAAD;QACE,OAAO;QACP,GAAI,EAAU,CAAC;OAChB,CAAA;OACD,kBAAC,GAAD;QACE,OAAO;QACP,GAAI,EAAU,CAAC;OAChB,CAAA;MACG;;IACH,CAAA;IACL,kBAAC,GAAD;KACE,OAAO;KACP,OAAO;eAFT;MAII,CAAC,EAAmB,0BAA0B,UAAU,CAAC,EAAmB,4BAA4B,UACxG,kBAAC,GAAD;OACE,IAAI,EACF,SAAS,EACX;iBAEC,CAAC;MACC,CAAA;MAEL,EAAmB,kBAAkB,SAAS,KAC9C,kBAAC,GAAD,EAAA,UACG,EAAmB,kBAAkB,KAAK,MAAkB;OAC3D,IAAM,IAAc,EAAoB,IAAI,IAAI,CAAa,GAEvD,IADqB,EAAwB,KAAK,QAAO,MAAK,EAAE,qBAAqB,CAC1D,CAAA,CAAmB,MAAM,GAAG,MAAM;QACjE,IAAM,IAAY,EAAiB,IAAI,IAAI,EAAE,YAAY,GACnD,IAAY,EAAiB,IAAI,IAAI,EAAE,YAAY;QACzD,QAAQ,GAAW,QAAQ,GAAA,CAAI,cAAc,GAAW,QAAQ,EAAE;OACpE,CAAC;OACD,OACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;QACE,IAAI,EACF,SAAS,EACX;kBAHF,CAKE,kBAAC,GAAD;SACE,MAAM;SAEN,eAAe,EAAyB,kBAAkB,GAAe;SACzE,UAAU;mBAET,EAAuB,QAAQ,CAAW,KAAK;QAC5C,CAAA,GACN,kBAAC,GAAD;SAAK,IAAI,EAAE,SAAS,EAAa,SAAS,kBAAkB,GAAe,IAAI,UAAU,OAAO;mBAC7F,EAAyB,KAAK,MAG3B,kBAAC,GAAD,EAAA,UAFe,EAAiB,IAAI,IAAI,EAAkB,YAGvD,CAAA,EAAU,QAAQ,EAAkB,aAClC,GAFK,EAAkB,YAEvB,CAER;QACE,CAAA,CACF;UACF,GAzBK,CAyBL;MAET,CAAC,EACE,CAAA;MAEL,EAAmB,4BAA4B,SAAS,KACxD,kBAAC,GAAD;OACE,IAAI,EACF,SAAS,EACX;iBAHF,CAKE,kBAAC,GAAD;QACE,MAAM;QAEN,eAAe,EAAyB,8BAA8B;QACtE,UAAU;kBAET,CAAC;OACE,CAAA,GACN,kBAAC,GAAD;QAAK,IAAI,EAAE,SAAS,EAAa,SAAS,8BAA8B,IAAI,UAAU,OAAO;kBAC1F,EAAmB,4BAA4B,MAAM,GAAG,MAAM;SAC7D,IAAM,IAAY,EAAiB,IAAI,IAAI,CAAC,GACtC,IAAY,EAAiB,IAAI,IAAI,CAAC;SAC5C,QAAQ,GAAW,QAAQ,GAAA,CAAI,cAAc,GAAW,QAAQ,EAAE;QACpE,CAAC,CAAC,CAAC,KAAK,MAGJ,kBAAC,GAAD,EAAA,UAFe,EAAiB,IAAI,IAAI,CAGrC,CAAA,EAAU,QAAQ,EAChB,GAFK,CAEL,CAER;OACE,CAAA,CACF;;KAEO;;IAChB,kBAAC,GAAD;KACE,OAAO;KACP,OAAO;eAFT;MAII,CAAC,EAAmB,yBAAyB,UAAU,CAAC,EAAmB,2BAA2B,UACtG,kBAAC,GAAD;OACE,IAAI,EACF,SAAS,EACX;iBAEC,CAAC;MACC,CAAA;MAEL,EAAmB,iBAAiB,SAAS,KAC7C,kBAAC,GAAD,EAAA,UACG,EAAmB,iBAAiB,KAAK,MAAa;OACrD,IAAM,IAAS,EAAe,IAAI,IAAI,CAAQ,GAExC,IADgB,EAAmB,KAAK,QAAO,MAAK,EAAE,eAAe,CAC/C,CAAA,CAAc,MAAM,GAAG,MAAM;QACvD,IAAM,IAAO,EAAY,IAAI,IAAI,EAAE,MAAM,GACnC,IAAO,EAAY,IAAI,IAAI,EAAE,MAAM,GACnC,IAAW,EAAe,QAAQ,CAAI,KAAK,EAAE,QAC7C,IAAW,EAAe,QAAQ,CAAI,KAAK,EAAE;QACnD,OAAO,EAAS,cAAc,CAAQ;OACxC,CAAC;OACD,OACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;QACE,IAAI,EACF,SAAS,EACX;kBAHF,CAKE,kBAAC,GAAD;SACE,MAAM;SAEN,eAAe,EAAyB,iBAAiB,GAAU;SACnE,UAAU;mBAET,GAAQ,QAAQ;QACb,CAAA,GACN,kBAAC,GAAD;SAAK,IAAI,EAAE,SAAS,EAAa,SAAS,iBAAiB,GAAU,IAAI,UAAU,OAAO;mBACvF,EAAoB,KAAK,MAAiB;UACzC,IAAM,IAAS,EAAY,IAAI,IAAI,EAAa,MAAM;UACtD,OACE,kBAAC,GAAD,EAAA,WACI,KAAU,EAAe,QAAQ,CAAM,MAAM,EAAa,OACzD,GAFK,EAAO,EAEZ;SAET,CAAC;QACE,CAAA,CACF;UACF,GAzBK,CAyBL;MAET,CAAC,EACE,CAAA;MAEL,EAAmB,2BAA2B,SAAS,KACvD,kBAAC,GAAD;OACE,IAAI,EACF,SAAS,EACX;iBAHF;QAKE,kBAAC,GAAD;SAAY,SAAS;mBAClB,CAAC;QACQ,CAAA;QACZ,kBAAC,GAAD;SACE,MAAM;SAEN,eAAe,EAAyB,6BAA6B;SACrE,UAAU;mBAET,CAAC;QACE,CAAA;QACN,kBAAC,GAAD;SAAK,IAAI,EAAE,SAAS,EAAa,SAAS,6BAA6B,IAAI,UAAU,OAAO;mBACzF,EAAmB,2BAA2B,MAAM,GAAG,MAAM;UAC5D,IAAM,IAAO,EAAY,IAAI,IAAI,CAAC,GAC5B,IAAO,EAAY,IAAI,IAAI,CAAC,GAC5B,IAAW,EAAe,QAAQ,CAAI,KAAK,GAC3C,IAAW,EAAe,QAAQ,CAAI,KAAK;UACjD,OAAO,EAAS,cAAc,CAAQ;SACxC,CAAC,CAAC,CAAC,KAAK,MAAU;UAChB,IAAM,IAAS,EAAY,IAAI,IAAI,CAAK;UACxC,OACE,kBAAC,GAAD,EAAA,UACG,EAAe,QAAQ,CAAM,KAAK,EAChC,GAFK,CAEL;SAET,CAAC;QACE,CAAA;OACF;;KAEO;;IAChB,kBAAC,GAAD;KACE,OAAO;KACP,OAAO;eAFT;MAII,CAAC,EAAmB,0BAA0B,UAAU,CAAC,EAAmB,4BAA4B,UACxG,kBAAC,GAAD;OACE,IAAI,EACF,SAAS,EACX;iBAEC,CAAC;MACC,CAAA;MAEL,EAAmB,kBAAkB,SAAS,KAC9C,kBAAC,GAAD,EAAA,UACG,EAAmB,kBAAkB,KAAK,MAAa;OACtD,IAAM,IAAS,EAAe,IAAI,IAAI,CAAQ,GAExC,IADgB,EAAmB,KAAK,QAAO,MAAK,EAAE,eAAe,CAC/C,CAAA,CAAc,MAAM,GAAG,MAAM;QACvD,IAAM,IAAO,EAAY,IAAI,IAAI,EAAE,MAAM,GACnC,IAAO,EAAY,IAAI,IAAI,EAAE,MAAM,GACnC,IAAW,EAAe,QAAQ,CAAI,KAAK,EAAE,QAC7C,IAAW,EAAe,QAAQ,CAAI,KAAK,EAAE;QACnD,OAAO,EAAS,cAAc,CAAQ;OACxC,CAAC;OACD,OACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;QACE,IAAI,EACF,SAAS,EACX;kBAHF,CAKE,kBAAC,GAAD;SACE,MAAM;SAEN,eAAe,EAAyB,kBAAkB,GAAU;SACpE,UAAU;mBAET,GAAQ,QAAQ;QACb,CAAA,GACN,kBAAC,GAAD;SAAK,IAAI,EAAE,SAAS,EAAa,SAAS,kBAAkB,GAAU,IAAI,UAAU,OAAO;mBACxF,EAAoB,KAAK,MAAiB;UACzC,IAAM,IAAS,EAAY,IAAI,IAAI,EAAa,MAAM;UACtD,OACE,kBAAC,GAAD,EAAA,UACG,EAAe,QAAQ,CAAM,KAAK,EAAa,OAC7C,GAFK,EAAO,EAEZ;SAET,CAAC;QACE,CAAA,CACF;UACF,GAzBK,CAyBL;MAET,CAAC,EACE,CAAA;MAEL,EAAmB,4BAA4B,SAAS,KACxD,kBAAC,GAAD;OACE,IAAI,EACF,SAAS,EACX;iBAHF,CAKE,kBAAC,GAAD;QACE,MAAM;QAEN,eAAe,EAAyB,8BAA8B;QACtE,UAAU;kBAET,CAAC;OACE,CAAA,GACN,kBAAC,GAAD;QAAK,IAAI,EAAE,SAAS,EAAa,SAAS,8BAA8B,IAAI,UAAU,OAAO;kBAC1F,EAAmB,4BAA4B,MAAM,GAAG,MAAM;SAC7D,IAAM,IAAO,EAAY,IAAI,IAAI,CAAC,GAC5B,IAAO,EAAY,IAAI,IAAI,CAAC,GAC5B,IAAW,EAAe,QAAQ,CAAI,KAAK,GAC3C,IAAW,EAAe,QAAQ,CAAI,KAAK;SACjD,OAAO,EAAS,cAAc,CAAQ;QACxC,CAAC,CAAC,CAAC,KAAK,MAAU;SAChB,IAAM,IAAS,EAAY,IAAI,IAAI,CAAK;SACxC,OACE,kBAAC,GAAD,EAAA,UACG,EAAe,QAAQ,CAAM,KAAK,EAChC,GAFK,CAEL;QAET,CAAC;OACE,CAAA,CACF;;KAEO;;IAChB,kBAAC,GAAD;KACE,OAAO;KACP,OAAO;eAEP,kBAAC,GAAD;MACE,WAAW;MACX,IAAI;OAAE,SAAS;OAAQ,KAAK;OAAG,qBAAqB;MAAU;gBAFhE;OAIE,kBAAC,MAAD,EAAA,UACG,CAAC,WACA,CAAA;OACJ,kBAAC,MAAD,EAAA,UACG,EAAmB,WAAW,CAAC,QAAQ,CAAC,KACvC,CAAA;OACJ,kBAAC,MAAD,EAAA,UACG,CAAC,cACA,CAAA;OACJ,kBAAC,MAAD,EAAA,UACG,EAAmB,cAAc,CAAC,QAAQ,CAAC,KAC1C,CAAA;OACJ,kBAAC,MAAD,EAAA,UACG,CAAC,eACA,CAAA;OACJ,kBAAC,MAAD,EAAA,UACG,EAAmB,eAAe,CAAC,QAAQ,CAAC,KAC3C,CAAA;OACJ,kBAAC,MAAD,EAAA,UACG,CAAC,kBACA,CAAA;OACJ,kBAAC,MAAD,EAAA,UACG,EAAmB,kBAAkB,CAAC,QAAQ,CAAC,KAC9C,CAAA;OACJ,kBAAC,MAAD,EAAA,UACG,CAAC,gBACA,CAAA;OACJ,kBAAC,MAAD,EAAA,UACG,EAAmB,gBAAgB,CAAC,QAAQ,CAAC,KAC5C,CAAA;OACJ,kBAAC,MAAD,EAAA,UACG,CAAC,iBACA,CAAA;OACJ,kBAAC,MAAD,EAAA,UACG,EAAmB,iBAAiB,CAAC,QAAQ,CAAC,KAC7C,CAAA;OACJ,kBAAC,MAAD,EAAA,UACG,CAAC,UACA,CAAA;OACJ,kBAAC,MAAD,EAAA,UACG,EAAmB,aAAa,CAAC,QAAQ,CAAC,KACzC,CAAA;MACD;;IACS,CAAA;IAChB,kBAAC,GAAD;KACE,OAAO;KACP,OAAO;eAEP,kBAAC,GAAD;MACE,IAAI,EACF,SAAS,EACX;gBAHF,CAKI,CAAC,EAAmB,4BAA4B,UAChD,kBAAC,GAAD;OACE,IAAI,EACF,SAAS,EACX;iBAEC,CAAC;MACC,CAAA,GAEN,EAAmB,4BAA4B,KAAK,MACnD,kBAAC,GAAD;OAEE,IAAI,EACF,SAAS,EACX;iBAJF;QAME,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;SAAY,SAAS;mBAClB,EAAE,gCAAgC,EACjC,oBAAoB,EAAwB,IAAI,IAAI,EAAM,uBAAuB,CAAC,EAAE,QAAQ,EAAM,wBACpG,CAAC;QACS,CAAA,EACT,CAAA;QACL,kBAAC,GAAD,EAAA,UAAA;SACG,EAAM,0BAA0B,WAAW,KAAK,EAAM,4BAA4B,WAAW,KAC5F,kBAAC,GAAD;UACE,IAAI,EACF,SAAS,EACX;oBAEC,CAAC;SACC,CAAA;SAEN,EAAM,kBAAkB,KAAK,MAAkB;UAC9C,IAAM,IAAc,EAAoB,IAAI,IAAI,CAAa,GAEvD,IADqB,EAAwB,KAAK,QAAO,MAAK,EAAE,qBAAqB,CAC1D,CAAA,CAAmB,MAAM,GAAG,MAAM;WACjE,IAAM,IAAY,EAAiB,IAAI,IAAI,EAAE,YAAY,GACnD,IAAY,EAAiB,IAAI,IAAI,EAAE,YAAY;WACzD,QAAQ,GAAW,QAAQ,GAAA,CAAI,cAAc,GAAW,QAAQ,EAAE;UACpE,CAAC;UACD,OACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;WACE,IAAI,EACF,SAAS,EACX;qBAHF,CAKE,kBAAC,GAAD;YACE,MAAM;YAEN,eAAe,EAAyB,GAAG,EAAM,wBAAwB,GAAG,GAAe;YAC3F,UAAU;sBAET,EAAuB,QAAQ,CAAW,KAAK;WAC5C,CAAA,GACN,kBAAC,GAAD;YAAK,IAAI,EAAE,SAAS,EAAa,SAAS,GAAG,EAAM,wBAAwB,GAAG,GAAe,IAAI,UAAU,OAAO;sBAC/G,EAAyB,KAAK,MAG3B,kBAAC,GAAD,EAAA,UAFe,EAAiB,IAAI,IAAI,EAAkB,YAGvD,CAAA,EAAU,QAAQ,EAAkB,aAClC,GAFK,EAAkB,YAEvB,CAER;WACE,CAAA,CACF;aACF,GAzBK,CAyBL;SAET,CAAC;SACA,EAAM,4BAA4B,SAAS,KAC1C,kBAAC,GAAD;UACE,IAAI,EACF,SAAS,EACX;oBAHF,CAKE,kBAAC,GAAD;WACE,MAAM;WAEN,eAAe,EAAyB,GAAG,EAAM,wBAAwB,eAAe;WACxF,UAAU;qBAET,CAAC;UACE,CAAA,GACN,kBAAC,GAAD;WAAK,IAAI,EAAE,SAAS,EAAa,SAAS,GAAG,EAAM,wBAAwB,eAAe,IAAI,UAAU,OAAO;qBAC5G,EAAM,4BAA4B,MAAM,GAAG,MAAM;YAChD,IAAM,IAAY,EAAiB,IAAI,IAAI,CAAC,GACtC,IAAY,EAAiB,IAAI,IAAI,CAAC;YAC5C,QAAQ,GAAW,QAAQ,GAAA,CAAI,cAAc,GAAW,QAAQ,EAAE;WACpE,CAAC,CAAC,CAAC,KAAK,MAGJ,kBAAC,GAAD,EAAA,UAFe,EAAiB,IAAI,IAAI,CAGrC,CAAA,EAAU,QAAQ,EAChB,GAFK,CAEL,CAER;UACE,CAAA,CACF;;QAEJ,EAAA,CAAA;QACL,kBAAC,GAAD;SACE,WAAW;SACX,IAAI;UAAE,SAAS;UAAQ,KAAK;UAAG,qBAAqB;SAAU;mBAFhE;UAIE,kBAAC,MAAD,EAAA,UACG,CAAC,WACA,CAAA;UACJ,kBAAC,MAAD,EAAA,UACG,EAAM,WAAW,CAAC,QAAQ,CAAC,KAC1B,CAAA;UACJ,kBAAC,MAAD,EAAA,UACG,CAAC,cACA,CAAA;UACJ,kBAAC,MAAD,EAAA,UACG,EAAM,cAAc,CAAC,QAAQ,CAAC,KAC7B,CAAA;UACJ,kBAAC,MAAD,EAAA,UACG,CAAC,eACA,CAAA;UACJ,kBAAC,MAAD,EAAA,UACG,EAAM,eAAe,CAAC,QAAQ,CAAC,KAC9B,CAAA;UACJ,kBAAC,MAAD,EAAA,UACG,CAAC,kBACA,CAAA;UACJ,kBAAC,MAAD,EAAA,UACG,EAAM,kBAAkB,CAAC,QAAQ,CAAC,KACjC,CAAA;SACD;;OACF;SAvHE,EAAM,uBAuHR,CACN,CAEE;;IACS,CAAA;GACb;;CAEQ,CAAA;AAErB,GAAG;CACD,cAAc;CACd,sBAAsB;CACtB,WAAW;CACX,UAAU;CACV,eAAe;CACf,QAAQ;AACV,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/ui/UsersEffectiveRightsDetailsDialog/UsersEffectiveRightsDetailsDialog.tsx"],"sourcesContent":["import { useTranslation } from 'react-i18next';\nimport {\n Box,\n Link,\n Tab,\n Tabs,\n Typography,\n} from '@mui/material';\nimport type {\n ReactElement,\n SyntheticEvent,\n} from 'react';\nimport {\n useCallback,\n useEffect,\n useState,\n} from 'react';\nimport type { CaseDbUser } from '@gen-epix/api-casedb';\nimport type { DialogAction } from '@gen-epix/ui-core-components/components/Dialog';\nimport type {\n WithDialogRefMethods,\n WithDialogRenderProps,\n} from '@gen-epix/ui-core-components/hoc/withDialog';\nimport { LoadableUtil } from '@gen-epix/ui-client-common/utils/LoadableUtil';\nimport { ResponseHandler } from '@gen-epix/ui-client-common/components/ui/ResponseHandler';\nimport { UserUtil } from '@gen-epix/ui-client-common/utils/UserUtil';\nimport { withDialog } from '@gen-epix/ui-core-components/hoc/withDialog';\nimport { TestIdUtil } from '@gen-epix/ui-core/utils/TestIdUtil';\nimport { useArray } from '@gen-epix/ui-core/hooks/useArray';\n\nimport { useCaseTypeSetMembersQuery } from '../../../dataHooks/useCaseTypeSetMembersQuery';\nimport {\n useCaseTypeSetNameFactory,\n useCaseTypeSetsMapQuery,\n} from '../../../dataHooks/useCaseTypeSetsQuery';\nimport { useCaseTypeMapQuery } from '../../../dataHooks/useCaseTypesQuery';\nimport { useColSetMembersQuery } from '../../../dataHooks/useColSetMembersQuery';\nimport { useColSetMapQuery } from '../../../dataHooks/useColSetsQuery';\nimport {\n useColMapQuery,\n useColNameFactory,\n} from '../../../dataHooks/useColsQuery';\nimport { useDataCollectionsMapQuery } from '../../../dataHooks/useDataCollectionsQuery';\nimport type { UserEffectiveRight } from '../../../models/caseAccess';\nimport { CustomTabPanel } from '../CustomTabPanel';\n\n\nexport interface UsersEffectiveRightsDetailsDialogOpenProps {\n type: 'caseTypeSets' | 'readColSets' | 'writeColSets';\n user: CaseDbUser;\n userEffectiveRight: UserEffectiveRight;\n}\n\nexport type UsersEffectiveRightsDetailsType = 'caseTypeSets' | 'readColSets' | 'writeColSets';\n\nconst usersEffectiveRightsDetailsTypeOrder = ['caseTypeSets', 'readColSets', 'writeColSets'] as const;\n\nexport interface UsersEffectiveRightsDetailsDialogProps extends WithDialogRenderProps<UsersEffectiveRightsDetailsDialogOpenProps> {\n //\n}\n\nexport type UsersEffectiveRightsDetailsDialogRefMethods = WithDialogRefMethods<UsersEffectiveRightsDetailsDialogProps, UsersEffectiveRightsDetailsDialogOpenProps>;\n\nconst a11yProps = (index: number) => {\n return {\n 'aria-controls': `simple-tabpanel-${index}`,\n id: `simple-tab-${index}`,\n };\n};\n\nexport const UsersEffectiveRightsDetailsDialog = withDialog<UsersEffectiveRightsDetailsDialogProps, UsersEffectiveRightsDetailsDialogOpenProps>((\n {\n onActionsChange,\n onClose,\n onTitleChange,\n openProps: { type, user, userEffectiveRight },\n }: UsersEffectiveRightsDetailsDialogProps,\n): ReactElement => {\n\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState(usersEffectiveRightsDetailsTypeOrder.indexOf(type));\n const [visibleItems, setVisibleItems] = useState<string[]>([]);\n\n const caseTypeMapQuery = useCaseTypeMapQuery();\n const caseTypeSetMapQuery = useCaseTypeSetsMapQuery();\n const caseTypeSetNameFactory = useCaseTypeSetNameFactory();\n const dataCollectionsMapQuery = useDataCollectionsMapQuery();\n const colSetMapQuery = useColSetMapQuery();\n const colMapQuery = useColMapQuery();\n const colNameFactory = useColNameFactory();\n const caseTypeSetMembersQuery = useCaseTypeSetMembersQuery();\n const colSetMembersQuery = useColSetMembersQuery();\n\n const loadables = useArray([\n caseTypeMapQuery,\n caseTypeSetMapQuery,\n caseTypeSetNameFactory,\n dataCollectionsMapQuery,\n colSetMapQuery,\n colMapQuery,\n colNameFactory,\n caseTypeSetMembersQuery,\n colSetMembersQuery,\n ]);\n\n const onTabChange = useCallback((_event: SyntheticEvent, newValue: number) => {\n setActiveTab(newValue);\n }, []);\n\n const onToggleSectionLinkClick = useCallback((key: string) => {\n setVisibleItems((prev) => {\n if (prev.includes(key)) {\n return prev.filter(item => item !== key);\n }\n return [...prev, key];\n });\n }, []);\n\n useEffect(() => {\n onTitleChange(t('{{userName}} effective rights details for {{dataCollectionName}}', { dataCollectionName: dataCollectionsMapQuery.map.get(userEffectiveRight.data_collection_id)?.name ?? userEffectiveRight.data_collection_id, userName: UserUtil.getUserDisplayValue(user, t) }));\n }, [dataCollectionsMapQuery.map, onTitleChange, t, user, userEffectiveRight.data_collection_id]);\n\n useEffect(() => {\n const actions: DialogAction[] = [];\n actions.push({\n ...TestIdUtil.createAttributes('UsersEffectiveRightsDetailsDialog-closeButton'),\n color: 'secondary',\n label: t`Close`,\n onClick: onClose,\n variant: 'contained',\n });\n onActionsChange(actions);\n }, [onActionsChange, onClose, t]);\n\n const isLoading = LoadableUtil.isSomeLoading(loadables);\n return (\n <ResponseHandler\n inlineSpinner\n loadables={loadables}\n >\n {!isLoading && (\n <Box sx={{ width: '100%' }}>\n <Box sx={{ borderBottom: 1, borderColor: 'divider' }}>\n <Tabs\n aria-label={'basic tabs example'}\n onChange={onTabChange}\n value={activeTab}\n >\n <Tab\n label={'Case types'}\n {...a11yProps(0)}\n />\n <Tab\n label={'Read columns'}\n {...a11yProps(1)}\n />\n <Tab\n label={'Write columns'}\n {...a11yProps(2)}\n />\n <Tab\n label={'Rights'}\n {...a11yProps(3)}\n />\n <Tab\n label={'Additional rights'}\n {...a11yProps(4)}\n />\n </Tabs>\n </Box>\n <CustomTabPanel\n index={0}\n value={activeTab}\n >\n { !userEffectiveRight.categorized_case_type_ids.length && !userEffectiveRight.uncategorized_case_type_ids.length && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n {t`No case types assigned`}\n </Box>\n )}\n { userEffectiveRight.case_type_set_ids.length > 0 && (\n <Box>\n {userEffectiveRight.case_type_set_ids.map((caseTypeSetId) => {\n const caseTypeSet = caseTypeSetMapQuery.map.get(caseTypeSetId);\n const caseTypeSetMembers = caseTypeSetMembersQuery.data.filter(x => x.case_type_set_id === caseTypeSetId);\n const sortedCaseTypeSetMembers = caseTypeSetMembers.sort((a, b) => {\n const caseTypeA = caseTypeMapQuery.map.get(a.case_type_id);\n const caseTypeB = caseTypeMapQuery.map.get(b.case_type_id);\n return (caseTypeA?.name ?? '').localeCompare(caseTypeB?.name ?? '');\n });\n return (\n <Box key={caseTypeSetId}>\n <Box\n sx={{\n marginY: 1,\n }}\n >\n <Link\n href={'#'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => onToggleSectionLinkClick(`case-type-sets-${caseTypeSetId}`)}\n tabIndex={0}\n >\n {caseTypeSetNameFactory.getName(caseTypeSet) ?? caseTypeSetId}\n </Link>\n <Box sx={{ display: visibleItems.includes(`case-type-sets-${caseTypeSetId}`) ? 'block' : 'none' }}>\n {sortedCaseTypeSetMembers.map((caseTypeSetMember) => {\n const caseType = caseTypeMapQuery.map.get(caseTypeSetMember.case_type_id);\n return (\n <Box key={caseTypeSetMember.case_type_id}>\n {caseType?.name ?? caseTypeSetMember.case_type_id}\n </Box>\n );\n })}\n </Box>\n </Box>\n </Box>\n );\n })}\n </Box>\n )}\n { userEffectiveRight.uncategorized_case_type_ids.length > 0 && (\n <Box\n sx={{\n marginY: 1,\n }}\n >\n <Link\n href={'#'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => onToggleSectionLinkClick(`uncategorized-case-type-sets`)}\n tabIndex={0}\n >\n {t`Uncategorized case types`}\n </Link>\n <Box sx={{ display: visibleItems.includes(`uncategorized-case-type-sets`) ? 'block' : 'none' }}>\n {userEffectiveRight.uncategorized_case_type_ids.sort((a, b) => {\n const caseTypeA = caseTypeMapQuery.map.get(a);\n const caseTypeB = caseTypeMapQuery.map.get(b);\n return (caseTypeA?.name ?? '').localeCompare(caseTypeB?.name ?? '');\n }).map((caseTypeId) => {\n const caseType = caseTypeMapQuery.map.get(caseTypeId);\n return (\n <Box key={caseTypeId}>\n {caseType?.name ?? caseTypeId}\n </Box>\n );\n })}\n </Box>\n </Box>\n )}\n </CustomTabPanel>\n <CustomTabPanel\n index={1}\n value={activeTab}\n >\n { !userEffectiveRight.categorized_read_col_ids.length && !userEffectiveRight.uncategorized_read_col_ids.length && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n {t`No read columns assigned`}\n </Box>\n )}\n { userEffectiveRight.read_col_set_ids.length > 0 && (\n <Box>\n {userEffectiveRight.read_col_set_ids.map((colSetId) => {\n const colSet = colSetMapQuery.map.get(colSetId);\n const colSetMembers = colSetMembersQuery.data.filter(x => x.col_set_id === colSetId);\n const sortedColSetMembers = colSetMembers.sort((a, b) => {\n const colA = colMapQuery.map.get(a.col_id);\n const colB = colMapQuery.map.get(b.col_id);\n const colAName = colNameFactory.getName(colA) ?? a.col_id;\n const colBName = colNameFactory.getName(colB) ?? b.col_id;\n return colAName.localeCompare(colBName);\n });\n return (\n <Box key={colSetId}>\n <Box\n sx={{\n marginY: 1,\n }}\n >\n <Link\n href={'#'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => onToggleSectionLinkClick(`read-col-sets-${colSetId}`)}\n tabIndex={0}\n >\n {colSet?.name ?? colSetId}\n </Link>\n <Box sx={{ display: visibleItems.includes(`read-col-sets-${colSetId}`) ? 'block' : 'none' }}>\n {sortedColSetMembers.map((colSetMember) => {\n const refCol = colMapQuery.map.get(colSetMember.col_id);\n return (\n <Box key={refCol.id}>\n {(refCol && colNameFactory.getName(refCol)) ?? colSetMember.col_id}\n </Box>\n );\n })}\n </Box>\n </Box>\n </Box>\n );\n })}\n </Box>\n )}\n { userEffectiveRight.uncategorized_read_col_ids.length > 0 && (\n <Box\n sx={{\n marginY: 1,\n }}\n >\n <Typography variant={'h5'}>\n {t`Uncategorized read columns sets`}\n </Typography>\n <Link\n href={'#'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => onToggleSectionLinkClick(`uncategorized-read-col-sets`)}\n tabIndex={0}\n >\n {t`Uncategorized read columns sets`}\n </Link>\n <Box sx={{ display: visibleItems.includes(`uncategorized-read-col-sets`) ? 'block' : 'none' }}>\n {userEffectiveRight.uncategorized_read_col_ids.sort((a, b) => {\n const colA = colMapQuery.map.get(a);\n const colB = colMapQuery.map.get(b);\n const colAName = colNameFactory.getName(colA) ?? a;\n const colBName = colNameFactory.getName(colB) ?? b;\n return colAName.localeCompare(colBName);\n }).map((colId) => {\n const refCol = colMapQuery.map.get(colId);\n return (\n <Box key={colId}>\n {colNameFactory.getName(refCol) ?? colId}\n </Box>\n );\n })}\n </Box>\n </Box>\n )}\n </CustomTabPanel>\n <CustomTabPanel\n index={2}\n value={activeTab}\n >\n { !userEffectiveRight.categorized_write_col_ids.length && !userEffectiveRight.uncategorized_write_col_ids.length && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n {t`No write columns assigned`}\n </Box>\n )}\n { userEffectiveRight.write_col_set_ids.length > 0 && (\n <Box>\n {userEffectiveRight.write_col_set_ids.map((colSetId) => {\n const colSet = colSetMapQuery.map.get(colSetId);\n const colSetMembers = colSetMembersQuery.data.filter(x => x.col_set_id === colSetId);\n const sortedColSetMembers = colSetMembers.sort((a, b) => {\n const colA = colMapQuery.map.get(a.col_id);\n const colB = colMapQuery.map.get(b.col_id);\n const colAName = colNameFactory.getName(colA) ?? a.col_id;\n const colBName = colNameFactory.getName(colB) ?? b.col_id;\n return colAName.localeCompare(colBName);\n });\n return (\n <Box key={colSetId}>\n <Box\n sx={{\n marginY: 1,\n }}\n >\n <Link\n href={'#'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => onToggleSectionLinkClick(`write-col-sets-${colSetId}`)}\n tabIndex={0}\n >\n {colSet?.name ?? colSetId}\n </Link>\n <Box sx={{ display: visibleItems.includes(`write-col-sets-${colSetId}`) ? 'block' : 'none' }}>\n {sortedColSetMembers.map((colSetMember) => {\n const refCol = colMapQuery.map.get(colSetMember.col_id);\n return (\n <Box key={refCol.id}>\n {colNameFactory.getName(refCol) ?? colSetMember.col_id}\n </Box>\n );\n })}\n </Box>\n </Box>\n </Box>\n );\n })}\n </Box>\n )}\n { userEffectiveRight.uncategorized_write_col_ids.length > 0 && (\n <Box\n sx={{\n marginY: 1,\n }}\n >\n <Link\n href={'#'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => onToggleSectionLinkClick(`uncategorized-write-col-sets`)}\n tabIndex={0}\n >\n {t`Uncategorized write columns sets`}\n </Link>\n <Box sx={{ display: visibleItems.includes(`uncategorized-write-col-sets`) ? 'block' : 'none' }}>\n {userEffectiveRight.uncategorized_write_col_ids.sort((a, b) => {\n const colA = colMapQuery.map.get(a);\n const colB = colMapQuery.map.get(b);\n const colAName = colNameFactory.getName(colA) ?? a;\n const colBName = colNameFactory.getName(colB) ?? b;\n return colAName.localeCompare(colBName);\n }).map((colId) => {\n const refCol = colMapQuery.map.get(colId);\n return (\n <Box key={colId}>\n {colNameFactory.getName(refCol) ?? colId}\n </Box>\n );\n })}\n </Box>\n </Box>\n )}\n </CustomTabPanel>\n <CustomTabPanel\n index={3}\n value={activeTab}\n >\n <Box\n component={'dl'}\n sx={{ display: 'grid', gap: 2, gridTemplateColumns: '1fr 1fr' }}\n >\n <dt>\n {t`Add case`}\n </dt>\n <dd>\n {userEffectiveRight.add_case ? t`Yes` : t`No`}\n </dd>\n <dt>\n {t`Remove case`}\n </dt>\n <dd>\n {userEffectiveRight.remove_case ? t`Yes` : t`No`}\n </dd>\n <dt>\n {t`Add case set`}\n </dt>\n <dd>\n {userEffectiveRight.add_case_set ? t`Yes` : t`No`}\n </dd>\n <dt>\n {t`Remove case set`}\n </dt>\n <dd>\n {userEffectiveRight.remove_case_set ? t`Yes` : t`No`}\n </dd>\n <dt>\n {t`Read case set`}\n </dt>\n <dd>\n {userEffectiveRight.read_case_set ? t`Yes` : t`No`}\n </dd>\n <dt>\n {t`Write case set`}\n </dt>\n <dd>\n {userEffectiveRight.write_case_set ? t`Yes` : t`No`}\n </dd>\n <dt>\n {t`Private`}\n </dt>\n <dd>\n {userEffectiveRight.is_private ? t`Yes` : t`No`}\n </dd>\n </Box>\n </CustomTabPanel>\n <CustomTabPanel\n index={4}\n value={activeTab}\n >\n <Box\n sx={{\n marginY: 2,\n }}\n >\n { !userEffectiveRight.effective_share_case_rights.length && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n {t`No additional rights assigned`}\n </Box>\n )}\n {userEffectiveRight.effective_share_case_rights.map((right) => (\n <Box\n key={right.from_data_collection_id}\n sx={{\n marginY: 2,\n }}\n >\n <Box>\n <Typography variant={'h5'}>\n {t('From: {{dataCollectionName}}', {\n dataCollectionName: dataCollectionsMapQuery.map.get(right.from_data_collection_id)?.name ?? right.from_data_collection_id,\n })}\n </Typography>\n </Box>\n <Box>\n {right.categorized_case_type_ids.length === 0 && right.uncategorized_case_type_ids.length === 0 && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n {t`No case types assigned`}\n </Box>\n )}\n {right.case_type_set_ids.map((caseTypeSetId) => {\n const caseTypeSet = caseTypeSetMapQuery.map.get(caseTypeSetId);\n const caseTypeSetMembers = caseTypeSetMembersQuery.data.filter(x => x.case_type_set_id === caseTypeSetId);\n const sortedCaseTypeSetMembers = caseTypeSetMembers.sort((a, b) => {\n const caseTypeA = caseTypeMapQuery.map.get(a.case_type_id);\n const caseTypeB = caseTypeMapQuery.map.get(b.case_type_id);\n return (caseTypeA?.name ?? '').localeCompare(caseTypeB?.name ?? '');\n });\n return (\n <Box key={caseTypeSetId}>\n <Box\n sx={{\n marginY: 1,\n }}\n >\n <Link\n href={'#'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => onToggleSectionLinkClick(`${right.from_data_collection_id}-${caseTypeSetId}`)}\n tabIndex={0}\n >\n {caseTypeSetNameFactory.getName(caseTypeSet) ?? caseTypeSetId}\n </Link>\n <Box sx={{ display: visibleItems.includes(`${right.from_data_collection_id}-${caseTypeSetId}`) ? 'block' : 'none' }}>\n {sortedCaseTypeSetMembers.map((caseTypeSetMember) => {\n const caseType = caseTypeMapQuery.map.get(caseTypeSetMember.case_type_id);\n return (\n <Box key={caseTypeSetMember.case_type_id}>\n {caseType?.name ?? caseTypeSetMember.case_type_id}\n </Box>\n );\n })}\n </Box>\n </Box>\n </Box>\n );\n })}\n {right.uncategorized_case_type_ids.length > 0 && (\n <Box\n sx={{\n marginY: 2,\n }}\n >\n <Link\n href={'#'}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => onToggleSectionLinkClick(`${right.from_data_collection_id}-uncategorized`)}\n tabIndex={0}\n >\n {t`Uncategorized case types`}\n </Link>\n <Box sx={{ display: visibleItems.includes(`${right.from_data_collection_id}-uncategorized`) ? 'block' : 'none' }}>\n {right.uncategorized_case_type_ids.sort((a, b) => {\n const caseTypeA = caseTypeMapQuery.map.get(a);\n const caseTypeB = caseTypeMapQuery.map.get(b);\n return (caseTypeA?.name ?? '').localeCompare(caseTypeB?.name ?? '');\n }).map((caseTypeId) => {\n const caseType = caseTypeMapQuery.map.get(caseTypeId);\n return (\n <Box key={caseTypeId}>\n {caseType?.name ?? caseTypeId}\n </Box>\n );\n })}\n </Box>\n </Box>\n )}\n </Box>\n <Box\n component={'dl'}\n sx={{ display: 'grid', gap: 0, gridTemplateColumns: '1fr 1fr' }}\n >\n <dt>\n {t`Add case`}\n </dt>\n <dd>\n {right.add_case ? t`Yes` : t`No`}\n </dd>\n <dt>\n {t`Remove case`}\n </dt>\n <dd>\n {right.remove_case ? t`Yes` : t`No`}\n </dd>\n <dt>\n {t`Add case set`}\n </dt>\n <dd>\n {right.add_case_set ? t`Yes` : t`No`}\n </dd>\n <dt>\n {t`Remove case set`}\n </dt>\n <dd>\n {right.remove_case_set ? t`Yes` : t`No`}\n </dd>\n </Box>\n </Box>\n ))}\n\n </Box>\n </CustomTabPanel>\n </Box>\n )}\n </ResponseHandler>\n );\n}, {\n defaultTitle: '',\n disableBackdropClick: false,\n fullWidth: true,\n maxWidth: 'lg',\n noCloseButton: false,\n testId: 'UsersEffectiveRightsDetailsDialog',\n});\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/ui/Warning/Warning.tsx"],"sourcesContent":["import {\n Alert,\n AlertTitle,\n styled,\n} from '@mui/material';\n\nconst StyledAlert = styled(Alert)(({ theme }) => ({\n '& .MuiAlert-icon': {\n alignItems: 'center',\n display: 'inline-flex',\n fontSize: '18px',\n lineHeight: '18px',\n padding: 0,\n },\n '& .MuiAlert-message': {\n lineHeight: '16px !important',\n padding: '4px 0',\n },\n '& .MuiTypography-root': {\n display: 'inline-block',\n height: '16px',\n lineHeight: '16px !important',\n },\n padding: `0 ${theme.spacing(1)}`,\n}));\n\nexport type WarningProps = {\n readonly warningMessage: string;\n};\n\nexport const Warning = ({ warningMessage }: WarningProps) => {\n return (\n <StyledAlert severity={'warning'}>\n <AlertTitle>\n {warningMessage}\n </AlertTitle>\n </StyledAlert>\n );\n};\n"],"mappings":";;;AAMA,IAAM,IAAc,EAAO,CAAK,CAAC,EAAE,EAAE,gBAAa;CAChD,oBAAoB;EAClB,YAAY;EACZ,SAAS;EACT,UAAU;EACV,YAAY;EACZ,SAAS;CACX;CACA,uBAAuB;EACrB,YAAY;EACZ,SAAS;CACX;CACA,yBAAyB;EACvB,SAAS;EACT,QAAQ;EACR,YAAY;CACd;CACA,SAAS,KAAK,EAAM,QAAQ,CAAC;AAC/B,EAAE,GAMW,KAAW,EAAE,wBAEtB,kBAAC,GAAD;CAAa,UAAU;
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/ui/Warning/Warning.tsx"],"sourcesContent":["import {\n Alert,\n AlertTitle,\n styled,\n} from '@mui/material';\n\nconst StyledAlert = styled(Alert)(({ theme }) => ({\n '& .MuiAlert-icon': {\n alignItems: 'center',\n display: 'inline-flex',\n fontSize: '18px',\n lineHeight: '18px',\n padding: 0,\n },\n '& .MuiAlert-message': {\n lineHeight: '16px !important',\n padding: '4px 0',\n },\n '& .MuiTypography-root': {\n display: 'inline-block',\n height: '16px',\n lineHeight: '16px !important',\n },\n padding: `0 ${theme.spacing(1)}`,\n}));\n\nexport type WarningProps = {\n readonly warningMessage: string;\n};\n\nexport const Warning = ({ warningMessage }: WarningProps) => {\n return (\n <StyledAlert severity={'warning'}>\n <AlertTitle>\n {warningMessage}\n </AlertTitle>\n </StyledAlert>\n );\n};\n"],"mappings":";;;AAMA,IAAM,IAAc,EAAO,CAAK,CAAC,EAAE,EAAE,gBAAa;CAChD,oBAAoB;EAClB,YAAY;EACZ,SAAS;EACT,UAAU;EACV,YAAY;EACZ,SAAS;CACX;CACA,uBAAuB;EACrB,YAAY;EACZ,SAAS;CACX;CACA,yBAAyB;EACvB,SAAS;EACT,QAAQ;EACR,YAAY;CACd;CACA,SAAS,KAAK,EAAM,QAAQ,CAAC;AAC/B,EAAE,GAMW,KAAW,EAAE,wBAEtB,kBAAC,GAAD;CAAa,UAAU;CACrB,UAAA,kBAAC,GAAD,EAAA,UACG,EACS,CAAA;AACD,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/ui/WidgetHeaderIconButton/WidgetHeaderIconButton.tsx"],"sourcesContent":["import type { IconButtonProps } from '@mui/material';\nimport {\n IconButton,\n Tooltip,\n} from '@mui/material';\n\nexport interface WidgetHeaderIconButtonProps extends IconButtonProps {\n readonly label: string;\n}\n\nexport const WidgetHeaderIconButton = ({ label, ...props }: WidgetHeaderIconButtonProps) => {\n const iconButtonElement = (\n <IconButton\n {...props}\n aria-label={label}\n color={'primary'}\n sx={{\n ...props.sx,\n '& svg': {\n fontSize: 18,\n },\n }}\n />\n );\n\n // Note: disabled buttons cannot have a tooltip\n if (props.disabled) {\n return iconButtonElement;\n }\n\n return (\n <Tooltip\n arrow\n placement={'bottom'}\n title={label}\n >\n {iconButtonElement}\n </Tooltip>\n );\n};\n"],"mappings":";;;AAUA,IAAa,KAA0B,EAAE,UAAO,GAAG,QAAyC;CAC1F,IAAM,IACJ,kBAAC,GAAD;EACE,GAAI;EACJ,cAAY;EACZ,OAAO;EACP,IAAI;GACF,GAAG,EAAM;GACT,SAAS,EACP,UAAU,GACZ;EACF;CACD,CAAA;CAQH,OAJI,EAAM,WACD,IAIP,kBAAC,GAAD;EACE,OAAA;EACA,WAAW;EACX,OAAO;
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/ui/WidgetHeaderIconButton/WidgetHeaderIconButton.tsx"],"sourcesContent":["import type { IconButtonProps } from '@mui/material';\nimport {\n IconButton,\n Tooltip,\n} from '@mui/material';\n\nexport interface WidgetHeaderIconButtonProps extends IconButtonProps {\n readonly label: string;\n}\n\nexport const WidgetHeaderIconButton = ({ label, ...props }: WidgetHeaderIconButtonProps) => {\n const iconButtonElement = (\n <IconButton\n {...props}\n aria-label={label}\n color={'primary'}\n sx={{\n ...props.sx,\n '& svg': {\n fontSize: 18,\n },\n }}\n />\n );\n\n // Note: disabled buttons cannot have a tooltip\n if (props.disabled) {\n return iconButtonElement;\n }\n\n return (\n <Tooltip\n arrow\n placement={'bottom'}\n title={label}\n >\n {iconButtonElement}\n </Tooltip>\n );\n};\n"],"mappings":";;;AAUA,IAAa,KAA0B,EAAE,UAAO,GAAG,QAAyC;CAC1F,IAAM,IACJ,kBAAC,GAAD;EACE,GAAI;EACJ,cAAY;EACZ,OAAO;EACP,IAAI;GACF,GAAG,EAAM;GACT,SAAS,EACP,UAAU,GACZ;EACF;CACD,CAAA;CAQH,OAJI,EAAM,WACD,IAIP,kBAAC,GAAD;EACE,OAAA;EACA,WAAW;EACX,OAAO;EAEN,UAAA;CACM,CAAA;AAEb"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { WidgetHeaderIconButton as e } from "../WidgetHeaderIconButton/index.js";
|
|
2
2
|
import { isValidElement as t } from "react";
|
|
3
3
|
import { Fragment as n, jsx as r } from "react/jsx-runtime";
|
|
4
|
-
import { NestedDropdown as i } from "@gen-epix/ui/components/
|
|
5
|
-
import { MenuDataUtil as a } from "@gen-epix/ui/utils/MenuDataUtil";
|
|
4
|
+
import { NestedDropdown as i } from "@gen-epix/ui-core-components/components/NestedMenu";
|
|
5
|
+
import { MenuDataUtil as a } from "@gen-epix/ui-client-common/utils/MenuDataUtil";
|
|
6
6
|
//#region src/components/ui/WidgetMenu/WidgetMenu.tsx
|
|
7
7
|
var o = ({ menu: o }) => t(o) ? o : a.isMenuItemDataArray(o) ? /* @__PURE__ */ r(n, { children: o?.map((t) => t.items ? /* @__PURE__ */ r(i, {
|
|
8
8
|
ButtonProps: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/ui/WidgetMenu/WidgetMenu.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { isValidElement } from 'react';\nimport type { MenuItemData } from '@gen-epix/ui/models/nestedMenu';\nimport { MenuDataUtil } from '@gen-epix/ui/utils/MenuDataUtil';\nimport { NestedDropdown } from '@gen-epix/ui/components/
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/ui/WidgetMenu/WidgetMenu.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { isValidElement } from 'react';\nimport type { MenuItemData } from '@gen-epix/ui-core-components/models/nestedMenu';\nimport { MenuDataUtil } from '@gen-epix/ui-client-common/utils/MenuDataUtil';\nimport { NestedDropdown } from '@gen-epix/ui-core-components/components/NestedMenu';\n\nimport { WidgetHeaderIconButton } from '../WidgetHeaderIconButton';\n\nexport type WidgetMenuProps = {\n readonly menu: MenuItemData[] | ReactNode;\n};\n\nexport const WidgetMenu = ({\n menu,\n}: WidgetMenuProps) => {\n if (isValidElement(menu)) {\n return menu;\n }\n if (!MenuDataUtil.isMenuItemDataArray(menu)) {\n return null;\n }\n\n return (\n <>\n {menu?.map(menuItemsData => {\n if (menuItemsData.items) {\n return (\n <NestedDropdown\n ButtonProps={{\n color: 'primary',\n disabled: menuItemsData.disabled,\n size: 'small',\n variant: 'text',\n }}\n key={menuItemsData.label}\n menuItemsData={menuItemsData}\n MenuProps={{ elevation: 3 }}\n />\n );\n }\n return (\n <WidgetHeaderIconButton\n disabled={menuItemsData.disabled}\n key={menuItemsData.label}\n label={menuItemsData.label}\n // eslint-disable-next-line @eslint-react/kit/jsx-no-bind\n onClick={() => menuItemsData.callback()}\n size={'small'}\n >\n {menuItemsData.leftIcon || menuItemsData.rightIcon}\n </WidgetHeaderIconButton>\n );\n })}\n </>\n );\n};\n"],"mappings":";;;;;;AAYA,IAAa,KAAc,EACzB,cAEI,EAAe,CAAI,IACd,IAEJ,EAAa,oBAAoB,CAAI,IAKxC,kBAAA,GAAA,EAAA,UACG,GAAM,KAAI,MACL,EAAc,QAEd,kBAAC,GAAD;CACE,aAAa;EACX,OAAO;EACP,UAAU,EAAc;EACxB,MAAM;EACN,SAAS;CACX;CAEe;CACf,WAAW,EAAE,WAAW,EAAE;AAC3B,GAHM,EAAc,KAGpB,IAIH,kBAAC,GAAD;CACE,UAAU,EAAc;CAExB,OAAO,EAAc;CAErB,eAAe,EAAc,SAAS;CACtC,MAAM;CAEL,UAAA,EAAc,YAAY,EAAc;AACnB,GAPjB,EAAc,KAOG,CAE3B,EACD,CAAA,IAlCK"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/ui/WidgetUnavailable/WidgetUnavailable.tsx"],"sourcesContent":["import {\n Alert,\n AlertTitle,\n} from '@mui/material';\nimport type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nexport type WidgetUnavailableProps = {\n readonly reason?: ReactElement | string;\n readonly widgetLabel: string;\n};\n\nexport const WidgetUnavailable = ({ reason, widgetLabel }: WidgetUnavailableProps) => {\n const { t } = useTranslation();\n\n return (\n <Alert\n severity={'info'}\n >\n <AlertTitle\n sx={{\n width: '100%',\n }}\n >\n {t('The {{widgetLabel}} cannot be shown.', { widgetLabel })}\n </AlertTitle>\n {reason}\n </Alert>\n );\n};\n"],"mappings":";;;;AAYA,IAAa,KAAqB,EAAE,WAAQ,qBAA0C;CACpF,IAAM,EAAE,SAAM,EAAe;CAE7B,OACE,kBAAC,GAAD;EACE,UAAU;
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/ui/WidgetUnavailable/WidgetUnavailable.tsx"],"sourcesContent":["import {\n Alert,\n AlertTitle,\n} from '@mui/material';\nimport type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nexport type WidgetUnavailableProps = {\n readonly reason?: ReactElement | string;\n readonly widgetLabel: string;\n};\n\nexport const WidgetUnavailable = ({ reason, widgetLabel }: WidgetUnavailableProps) => {\n const { t } = useTranslation();\n\n return (\n <Alert\n severity={'info'}\n >\n <AlertTitle\n sx={{\n width: '100%',\n }}\n >\n {t('The {{widgetLabel}} cannot be shown.', { widgetLabel })}\n </AlertTitle>\n {reason}\n </Alert>\n );\n};\n"],"mappings":";;;;AAYA,IAAa,KAAqB,EAAE,WAAQ,qBAA0C;CACpF,IAAM,EAAE,SAAM,EAAe;CAE7B,OACE,kBAAC,GAAD;EACE,UAAU;EADZ,UAAA,CAGE,kBAAC,GAAD;GACE,IAAI,EACF,OAAO,OACT;GAEC,UAAA,EAAE,wCAAwC,EAAE,eAAY,CAAC;EAChD,CAAA,GACX,CACI;;AAEX"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { COMMON_QUERY_KEY } from '@gen-epix/ui/constants/query';
|
|
1
|
+
import { COMMON_QUERY_KEY } from '@gen-epix/ui-client-common/constants/query';
|
|
2
2
|
export declare const CASEDB_QUERY_KEY: {
|
|
3
3
|
readonly ALLELE_PROFILES: "ALLELE_PROFILES";
|
|
4
4
|
readonly ASSEMBLY_PROTOCOLS: "ASSEMBLY_PROTOCOLS";
|
package/dist/constants/query.js
CHANGED