@massdriver/backstage-plugin 1.0.0
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/LICENSE +202 -0
- package/README.md +196 -0
- package/dist/MassdriverRouter.esm.js +78 -0
- package/dist/MassdriverRouter.esm.js.map +1 -0
- package/dist/api.esm.js +119 -0
- package/dist/api.esm.js.map +1 -0
- package/dist/assets/massdriver-logo-dark.svg +55 -0
- package/dist/assets/massdriver-logo-light.svg +50 -0
- package/dist/components/AttributesColumn.esm.js +95 -0
- package/dist/components/AttributesColumn.esm.js.map +1 -0
- package/dist/components/AttributesSummaryCell.esm.js +103 -0
- package/dist/components/AttributesSummaryCell.esm.js.map +1 -0
- package/dist/components/AuthedIcon.esm.js +26 -0
- package/dist/components/AuthedIcon.esm.js.map +1 -0
- package/dist/components/ConditionsCell.esm.js +48 -0
- package/dist/components/ConditionsCell.esm.js.map +1 -0
- package/dist/components/DisabledAction.esm.js +30 -0
- package/dist/components/DisabledAction.esm.js.map +1 -0
- package/dist/components/EntityMassdriverContent/EntityMassdriverContent.esm.js +80 -0
- package/dist/components/EntityMassdriverContent/EntityMassdriverContent.esm.js.map +1 -0
- package/dist/components/EntityMassdriverContent/index.esm.js +6 -0
- package/dist/components/EntityMassdriverContent/index.esm.js.map +1 -0
- package/dist/components/EntityMassdriverOverviewCard/EntityMassdriverOverviewCard.esm.js +75 -0
- package/dist/components/EntityMassdriverOverviewCard/EntityMassdriverOverviewCard.esm.js.map +1 -0
- package/dist/components/EntityMassdriverOverviewCard/index.esm.js +6 -0
- package/dist/components/EntityMassdriverOverviewCard/index.esm.js.map +1 -0
- package/dist/components/ForkPill.esm.js +84 -0
- package/dist/components/ForkPill.esm.js.map +1 -0
- package/dist/components/InstanceStatusIndicator.esm.js +21 -0
- package/dist/components/InstanceStatusIndicator.esm.js.map +1 -0
- package/dist/components/InstanceStatusPill.esm.js +67 -0
- package/dist/components/InstanceStatusPill.esm.js.map +1 -0
- package/dist/components/MassdriverIcon.esm.js +13 -0
- package/dist/components/MassdriverIcon.esm.js.map +1 -0
- package/dist/components/MassdriverSidebarItem.esm.js +45 -0
- package/dist/components/MassdriverSidebarItem.esm.js.map +1 -0
- package/dist/components/NotFound.esm.js +44 -0
- package/dist/components/NotFound.esm.js.map +1 -0
- package/dist/components/OpenInMassdriverButton.esm.js +24 -0
- package/dist/components/OpenInMassdriverButton.esm.js.map +1 -0
- package/dist/components/PageLayout.esm.js +88 -0
- package/dist/components/PageLayout.esm.js.map +1 -0
- package/dist/components/RouterLinkAdapter.esm.js +12 -0
- package/dist/components/RouterLinkAdapter.esm.js.map +1 -0
- package/dist/components/VersionBadge.esm.js +57 -0
- package/dist/components/VersionBadge.esm.js.map +1 -0
- package/dist/components/grantColumns.esm.js +56 -0
- package/dist/components/grantColumns.esm.js.map +1 -0
- package/dist/components/icons/BundleIcon.esm.js +7 -0
- package/dist/components/icons/BundleIcon.esm.js.map +1 -0
- package/dist/components/icons/FolderOutlinedIcon.esm.js +7 -0
- package/dist/components/icons/FolderOutlinedIcon.esm.js.map +1 -0
- package/dist/components/icons/TokenIcon.esm.js +7 -0
- package/dist/components/icons/TokenIcon.esm.js.map +1 -0
- package/dist/entity.esm.js +23 -0
- package/dist/entity.esm.js.map +1 -0
- package/dist/features/environment/CompareDeploymentsDialog/CompareDeploymentsDialog.esm.js +115 -0
- package/dist/features/environment/CompareDeploymentsDialog/CompareDeploymentsDialog.esm.js.map +1 -0
- package/dist/features/environment/CompareDeploymentsDialog/ResultsStep.esm.js +165 -0
- package/dist/features/environment/CompareDeploymentsDialog/ResultsStep.esm.js.map +1 -0
- package/dist/features/environment/CompareDeploymentsDialog/SelectStep.esm.js +216 -0
- package/dist/features/environment/CompareDeploymentsDialog/SelectStep.esm.js.map +1 -0
- package/dist/features/environment/CompareDeploymentsDialog/compareColumns.esm.js +86 -0
- package/dist/features/environment/CompareDeploymentsDialog/compareColumns.esm.js.map +1 -0
- package/dist/features/environment/CompareDeploymentsDialog/flattenDeploymentComparison.esm.js +57 -0
- package/dist/features/environment/CompareDeploymentsDialog/flattenDeploymentComparison.esm.js.map +1 -0
- package/dist/features/environment/CompareDeploymentsDialog/queries.esm.js +53 -0
- package/dist/features/environment/CompareDeploymentsDialog/queries.esm.js.map +1 -0
- package/dist/features/environment/CompareEnvironmentsDialog/CompareEnvironmentsDialog.esm.js +94 -0
- package/dist/features/environment/CompareEnvironmentsDialog/CompareEnvironmentsDialog.esm.js.map +1 -0
- package/dist/features/environment/CompareEnvironmentsDialog/ComparisonValueCell.esm.js +67 -0
- package/dist/features/environment/CompareEnvironmentsDialog/ComparisonValueCell.esm.js.map +1 -0
- package/dist/features/environment/CompareEnvironmentsDialog/ResultsStep.esm.js +202 -0
- package/dist/features/environment/CompareEnvironmentsDialog/ResultsStep.esm.js.map +1 -0
- package/dist/features/environment/CompareEnvironmentsDialog/SelectStep.esm.js +183 -0
- package/dist/features/environment/CompareEnvironmentsDialog/SelectStep.esm.js.map +1 -0
- package/dist/features/environment/CompareEnvironmentsDialog/compareColumns.esm.js +73 -0
- package/dist/features/environment/CompareEnvironmentsDialog/compareColumns.esm.js.map +1 -0
- package/dist/features/environment/CompareEnvironmentsDialog/flattenComparison.esm.js +70 -0
- package/dist/features/environment/CompareEnvironmentsDialog/flattenComparison.esm.js.map +1 -0
- package/dist/features/environment/CompareEnvironmentsDialog/queries.esm.js +32 -0
- package/dist/features/environment/CompareEnvironmentsDialog/queries.esm.js.map +1 -0
- package/dist/features/environment/EnvironmentGraphPage.esm.js +131 -0
- package/dist/features/environment/EnvironmentGraphPage.esm.js.map +1 -0
- package/dist/features/environment/GraphHeader/EnvironmentDefaults.esm.js +252 -0
- package/dist/features/environment/GraphHeader/EnvironmentDefaults.esm.js.map +1 -0
- package/dist/features/environment/GraphHeader/GraphHeader.esm.js +247 -0
- package/dist/features/environment/GraphHeader/GraphHeader.esm.js.map +1 -0
- package/dist/features/environment/GraphHeader/HeaderActions.esm.js +127 -0
- package/dist/features/environment/GraphHeader/HeaderActions.esm.js.map +1 -0
- package/dist/features/environment/GraphHeader/Switcher.esm.js +75 -0
- package/dist/features/environment/GraphHeader/Switcher.esm.js.map +1 -0
- package/dist/features/environment/GraphHeader/queries.esm.js +60 -0
- package/dist/features/environment/GraphHeader/queries.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/AlarmCard.esm.js +151 -0
- package/dist/features/environment/InstanceDrawer/AlarmCard.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/InstanceDrawer.esm.js +165 -0
- package/dist/features/environment/InstanceDrawer/InstanceDrawer.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/InstanceDrawerHeader.esm.js +241 -0
- package/dist/features/environment/InstanceDrawer/InstanceDrawerHeader.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/InstanceTabs.esm.js +119 -0
- package/dist/features/environment/InstanceDrawer/InstanceTabs.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/TabState.esm.js +30 -0
- package/dist/features/environment/InstanceDrawer/TabState.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/formsDataSource.esm.js +25 -0
- package/dist/features/environment/InstanceDrawer/formsDataSource.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/helpers.esm.js +282 -0
- package/dist/features/environment/InstanceDrawer/helpers.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/queries.esm.js +281 -0
- package/dist/features/environment/InstanceDrawer/queries.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/ConfigTab.esm.js +170 -0
- package/dist/features/environment/InstanceDrawer/tabs/ConfigTab.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/DependenciesTab.esm.js +413 -0
- package/dist/features/environment/InstanceDrawer/tabs/DependenciesTab.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/DeploymentLogsPanel.esm.js +191 -0
- package/dist/features/environment/InstanceDrawer/tabs/DeploymentLogsPanel.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/DeploymentReadOnlyActions.esm.js +63 -0
- package/dist/features/environment/InstanceDrawer/tabs/DeploymentReadOnlyActions.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/GuideTab.esm.js +48 -0
- package/dist/features/environment/InstanceDrawer/tabs/GuideTab.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/HistoryTab.esm.js +446 -0
- package/dist/features/environment/InstanceDrawer/tabs/HistoryTab.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/MonitorTab.esm.js +146 -0
- package/dist/features/environment/InstanceDrawer/tabs/MonitorTab.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/OverviewTab.esm.js +572 -0
- package/dist/features/environment/InstanceDrawer/tabs/OverviewTab.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/ResourcesTab.esm.js +471 -0
- package/dist/features/environment/InstanceDrawer/tabs/ResourcesTab.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/SecretsTab.esm.js +109 -0
- package/dist/features/environment/InstanceDrawer/tabs/SecretsTab.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/ViewDeploymentDetails.esm.js +384 -0
- package/dist/features/environment/InstanceDrawer/tabs/ViewDeploymentDetails.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/flattenParams.esm.js +23 -0
- package/dist/features/environment/InstanceDrawer/tabs/flattenParams.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/useInstanceApiQuery.esm.js +6 -0
- package/dist/features/environment/InstanceDrawer/useInstanceApiQuery.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/useOverflowMeasure.esm.js +55 -0
- package/dist/features/environment/InstanceDrawer/useOverflowMeasure.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/useResizableWidth.esm.js +44 -0
- package/dist/features/environment/InstanceDrawer/useResizableWidth.esm.js.map +1 -0
- package/dist/features/environment/components/InstanceStatusPill.esm.js +54 -0
- package/dist/features/environment/components/InstanceStatusPill.esm.js.map +1 -0
- package/dist/features/environment/graph/Diagram.esm.js +143 -0
- package/dist/features/environment/graph/Diagram.esm.js.map +1 -0
- package/dist/features/environment/graph/DiagramNode.constants.esm.js +5 -0
- package/dist/features/environment/graph/DiagramNode.constants.esm.js.map +1 -0
- package/dist/features/environment/graph/DiagramNode.esm.js +221 -0
- package/dist/features/environment/graph/DiagramNode.esm.js.map +1 -0
- package/dist/features/environment/graph/NodeMeta.esm.js +182 -0
- package/dist/features/environment/graph/NodeMeta.esm.js.map +1 -0
- package/dist/features/environment/graph/NodeVersionBadges.esm.js +150 -0
- package/dist/features/environment/graph/NodeVersionBadges.esm.js.map +1 -0
- package/dist/features/environment/graph/diagramFactory.esm.js +151 -0
- package/dist/features/environment/graph/diagramFactory.esm.js.map +1 -0
- package/dist/features/environment/graph/handles/ExpandableHandleWrapper.esm.js +174 -0
- package/dist/features/environment/graph/handles/ExpandableHandleWrapper.esm.js.map +1 -0
- package/dist/features/environment/graph/handles/NodeHandle.esm.js +45 -0
- package/dist/features/environment/graph/handles/NodeHandle.esm.js.map +1 -0
- package/dist/features/environment/graph/handles/NodeHandleTooltip.esm.js +134 -0
- package/dist/features/environment/graph/handles/NodeHandleTooltip.esm.js.map +1 -0
- package/dist/features/environment/graph/handles/handleTypes.esm.js +170 -0
- package/dist/features/environment/graph/handles/handleTypes.esm.js.map +1 -0
- package/dist/features/environment/graph/handles/useAnimationFrameSync.esm.js +19 -0
- package/dist/features/environment/graph/handles/useAnimationFrameSync.esm.js.map +1 -0
- package/dist/features/environment/graph/handles/useRadialPositions.esm.js +37 -0
- package/dist/features/environment/graph/handles/useRadialPositions.esm.js.map +1 -0
- package/dist/features/environment/graph/handles/useTransitionLifecycle.esm.js +19 -0
- package/dist/features/environment/graph/handles/useTransitionLifecycle.esm.js.map +1 -0
- package/dist/features/environment/graph/hasUndeployedPlan.esm.js +43 -0
- package/dist/features/environment/graph/hasUndeployedPlan.esm.js.map +1 -0
- package/dist/features/environment/graph/queries.esm.js +103 -0
- package/dist/features/environment/graph/queries.esm.js.map +1 -0
- package/dist/features/environment/graph/useDiagramSnapshot.esm.js +43 -0
- package/dist/features/environment/graph/useDiagramSnapshot.esm.js.map +1 -0
- package/dist/features/environment/realtime/RealtimeProvider.esm.js +43 -0
- package/dist/features/environment/realtime/RealtimeProvider.esm.js.map +1 -0
- package/dist/features/environment/realtime/queries.esm.js +76 -0
- package/dist/features/environment/realtime/queries.esm.js.map +1 -0
- package/dist/features/environment/realtime/useLiveRelayQuery.esm.js +36 -0
- package/dist/features/environment/realtime/useLiveRelayQuery.esm.js.map +1 -0
- package/dist/features/project/ProjectDetailsPage.esm.js +101 -0
- package/dist/features/project/ProjectDetailsPage.esm.js.map +1 -0
- package/dist/features/project/tabs/ComponentsTab.esm.js +149 -0
- package/dist/features/project/tabs/ComponentsTab.esm.js.map +1 -0
- package/dist/features/project/tabs/EnvStatus.esm.js +149 -0
- package/dist/features/project/tabs/EnvStatus.esm.js.map +1 -0
- package/dist/features/project/tabs/EnvironmentsTab.esm.js +199 -0
- package/dist/features/project/tabs/EnvironmentsTab.esm.js.map +1 -0
- package/dist/features/project/tabs/OverviewTab.esm.js +420 -0
- package/dist/features/project/tabs/OverviewTab.esm.js.map +1 -0
- package/dist/features/projects/ProjectsListPage.esm.js +50 -0
- package/dist/features/projects/ProjectsListPage.esm.js.map +1 -0
- package/dist/features/projects/ProjectsListPageLazy.esm.js +12 -0
- package/dist/features/projects/ProjectsListPageLazy.esm.js.map +1 -0
- package/dist/features/projects/projectColumns.esm.js +38 -0
- package/dist/features/projects/projectColumns.esm.js.map +1 -0
- package/dist/features/projects/useProjects.esm.js +48 -0
- package/dist/features/projects/useProjects.esm.js.map +1 -0
- package/dist/features/repo/DeploymentLogsDrawer.esm.js +213 -0
- package/dist/features/repo/DeploymentLogsDrawer.esm.js.map +1 -0
- package/dist/features/repo/DeploymentLogsDrawer.loading.esm.js +43 -0
- package/dist/features/repo/DeploymentLogsDrawer.loading.esm.js.map +1 -0
- package/dist/features/repo/FileTree.esm.js +179 -0
- package/dist/features/repo/FileTree.esm.js.map +1 -0
- package/dist/features/repo/FileViewer.esm.js +115 -0
- package/dist/features/repo/FileViewer.esm.js.map +1 -0
- package/dist/features/repo/FileViewer.helpers.esm.js +54 -0
- package/dist/features/repo/FileViewer.helpers.esm.js.map +1 -0
- package/dist/features/repo/RepoDetailsPage.esm.js +127 -0
- package/dist/features/repo/RepoDetailsPage.esm.js.map +1 -0
- package/dist/features/repo/RepoEmptyState.esm.js +58 -0
- package/dist/features/repo/RepoEmptyState.esm.js.map +1 -0
- package/dist/features/repo/RepoNoVersionsState.esm.js +29 -0
- package/dist/features/repo/RepoNoVersionsState.esm.js.map +1 -0
- package/dist/features/repo/RepoTabHeader.esm.js +30 -0
- package/dist/features/repo/RepoTabHeader.esm.js.map +1 -0
- package/dist/features/repo/RepoTabLayout.esm.js +18 -0
- package/dist/features/repo/RepoTabLayout.esm.js.map +1 -0
- package/dist/features/repo/RepoVersionSelect.esm.js +176 -0
- package/dist/features/repo/RepoVersionSelect.esm.js.map +1 -0
- package/dist/features/repo/ViewDeploymentDetailsDialog.esm.js +427 -0
- package/dist/features/repo/ViewDeploymentDetailsDialog.esm.js.map +1 -0
- package/dist/features/repo/deploymentHelpers.esm.js +74 -0
- package/dist/features/repo/deploymentHelpers.esm.js.map +1 -0
- package/dist/features/repo/fileTreeHelpers.esm.js +45 -0
- package/dist/features/repo/fileTreeHelpers.esm.js.map +1 -0
- package/dist/features/repo/flattenParams.esm.js +23 -0
- package/dist/features/repo/flattenParams.esm.js.map +1 -0
- package/dist/features/repo/queries.esm.js +239 -0
- package/dist/features/repo/queries.esm.js.map +1 -0
- package/dist/features/repo/repoFilter.esm.js +9 -0
- package/dist/features/repo/repoFilter.esm.js.map +1 -0
- package/dist/features/repo/repoTabs.esm.js +22 -0
- package/dist/features/repo/repoTabs.esm.js.map +1 -0
- package/dist/features/repo/resolveVersion.esm.js +22 -0
- package/dist/features/repo/resolveVersion.esm.js.map +1 -0
- package/dist/features/repo/tabs/DeploymentRow.esm.js +201 -0
- package/dist/features/repo/tabs/DeploymentRow.esm.js.map +1 -0
- package/dist/features/repo/tabs/DeploymentsTab.esm.js +188 -0
- package/dist/features/repo/tabs/DeploymentsTab.esm.js.map +1 -0
- package/dist/features/repo/tabs/DeploymentsTab.helpers.esm.js +46 -0
- package/dist/features/repo/tabs/DeploymentsTab.helpers.esm.js.map +1 -0
- package/dist/features/repo/tabs/DeploymentsTab.loading.esm.js +37 -0
- package/dist/features/repo/tabs/DeploymentsTab.loading.esm.js.map +1 -0
- package/dist/features/repo/tabs/FilesTab.esm.js +142 -0
- package/dist/features/repo/tabs/FilesTab.esm.js.map +1 -0
- package/dist/features/repo/tabs/InstanceRow.esm.js +121 -0
- package/dist/features/repo/tabs/InstanceRow.esm.js.map +1 -0
- package/dist/features/repo/tabs/InstancesTab.esm.js +147 -0
- package/dist/features/repo/tabs/InstancesTab.esm.js.map +1 -0
- package/dist/features/repo/tabs/InstancesTab.helpers.esm.js +44 -0
- package/dist/features/repo/tabs/InstancesTab.helpers.esm.js.map +1 -0
- package/dist/features/repo/tabs/InstancesTab.loading.esm.js +33 -0
- package/dist/features/repo/tabs/InstancesTab.loading.esm.js.map +1 -0
- package/dist/features/repo/tabs/OverviewTab.esm.js +77 -0
- package/dist/features/repo/tabs/OverviewTab.esm.js.map +1 -0
- package/dist/features/repo/tabs/PermissionsTab.esm.js +56 -0
- package/dist/features/repo/tabs/PermissionsTab.esm.js.map +1 -0
- package/dist/features/repo/tabs/VersionsTab.esm.js +152 -0
- package/dist/features/repo/tabs/VersionsTab.esm.js.map +1 -0
- package/dist/features/repo/useInfiniteRelayList.esm.js +92 -0
- package/dist/features/repo/useInfiniteRelayList.esm.js.map +1 -0
- package/dist/features/repo/useInfiniteScroll.esm.js +21 -0
- package/dist/features/repo/useInfiniteScroll.esm.js.map +1 -0
- package/dist/features/repos/ReposListPage.esm.js +53 -0
- package/dist/features/repos/ReposListPage.esm.js.map +1 -0
- package/dist/features/repos/queries.esm.js +40 -0
- package/dist/features/repos/queries.esm.js.map +1 -0
- package/dist/features/repos/repoColumns.esm.js +121 -0
- package/dist/features/repos/repoColumns.esm.js.map +1 -0
- package/dist/features/repos/useRepos.esm.js +22 -0
- package/dist/features/repos/useRepos.esm.js.map +1 -0
- package/dist/features/resource/OriginChip.esm.js +42 -0
- package/dist/features/resource/OriginChip.esm.js.map +1 -0
- package/dist/features/resource/ResourceDetailsPage.esm.js +167 -0
- package/dist/features/resource/ResourceDetailsPage.esm.js.map +1 -0
- package/dist/features/resource/queries.esm.js +141 -0
- package/dist/features/resource/queries.esm.js.map +1 -0
- package/dist/features/resource/tabs/GeneralTab.esm.js +247 -0
- package/dist/features/resource/tabs/GeneralTab.esm.js.map +1 -0
- package/dist/features/resource/tabs/GeneralTab.loading.esm.js +76 -0
- package/dist/features/resource/tabs/GeneralTab.loading.esm.js.map +1 -0
- package/dist/features/resource/tabs/PermissionsTab.esm.js +57 -0
- package/dist/features/resource/tabs/PermissionsTab.esm.js.map +1 -0
- package/dist/features/resource/tabs/SettingsTabLayout.esm.js +18 -0
- package/dist/features/resource/tabs/SettingsTabLayout.esm.js.map +1 -0
- package/dist/features/resource/tabs/TabHeader.esm.js +30 -0
- package/dist/features/resource/tabs/TabHeader.esm.js.map +1 -0
- package/dist/features/resource/tabs/UsagePanel.esm.js +35 -0
- package/dist/features/resource/tabs/UsagePanel.esm.js.map +1 -0
- package/dist/features/resource/tabs/UsageTab.esm.js +91 -0
- package/dist/features/resource/tabs/UsageTab.esm.js.map +1 -0
- package/dist/features/resource/tabs/UsageTab.helpers.esm.js +168 -0
- package/dist/features/resource/tabs/UsageTab.helpers.esm.js.map +1 -0
- package/dist/features/resources/ResourcesEmptyState.esm.js +148 -0
- package/dist/features/resources/ResourcesEmptyState.esm.js.map +1 -0
- package/dist/features/resources/ResourcesListPage.esm.js +115 -0
- package/dist/features/resources/ResourcesListPage.esm.js.map +1 -0
- package/dist/features/resources/queries.esm.js +50 -0
- package/dist/features/resources/queries.esm.js.map +1 -0
- package/dist/features/resources/resourceColumns.esm.js +158 -0
- package/dist/features/resources/resourceColumns.esm.js.map +1 -0
- package/dist/features/resources/resourceConstants.esm.js +7 -0
- package/dist/features/resources/resourceConstants.esm.js.map +1 -0
- package/dist/features/resources/toResourceRow.esm.js +29 -0
- package/dist/features/resources/toResourceRow.esm.js.map +1 -0
- package/dist/hooks/useAuthedSvg.esm.js +34 -0
- package/dist/hooks/useAuthedSvg.esm.js.map +1 -0
- package/dist/hooks/useCursorPagination.esm.js +40 -0
- package/dist/hooks/useCursorPagination.esm.js.map +1 -0
- package/dist/hooks/useMassdriverSubscription.esm.js +61 -0
- package/dist/hooks/useMassdriverSubscription.esm.js.map +1 -0
- package/dist/hooks/usePaginatedRelayQuery.esm.js +68 -0
- package/dist/hooks/usePaginatedRelayQuery.esm.js.map +1 -0
- package/dist/index.d.ts +256 -0
- package/dist/index.esm.js +8 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/internalRoutes.esm.js +29 -0
- package/dist/internalRoutes.esm.js.map +1 -0
- package/dist/plugin.esm.js +57 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/queries.esm.js +54 -0
- package/dist/queries.esm.js.map +1 -0
- package/dist/routes.esm.js +6 -0
- package/dist/routes.esm.js.map +1 -0
- package/dist/shell/MassdriverHeader.esm.js +37 -0
- package/dist/shell/MassdriverHeader.esm.js.map +1 -0
- package/dist/shell/MassdriverShell.esm.js +30 -0
- package/dist/shell/MassdriverShell.esm.js.map +1 -0
- package/dist/theme/MassdriverThemeScope.esm.js +30 -0
- package/dist/theme/MassdriverThemeScope.esm.js.map +1 -0
- package/dist/theme/ThemeModeContext.esm.js +35 -0
- package/dist/theme/ThemeModeContext.esm.js.map +1 -0
- package/dist/theme/muiClassNameAudit.esm.js +11 -0
- package/dist/theme/muiClassNameAudit.esm.js.map +1 -0
- package/dist/useInstances.esm.js +39 -0
- package/dist/useInstances.esm.js.map +1 -0
- package/dist/utils/attributes.esm.js +28 -0
- package/dist/utils/attributes.esm.js.map +1 -0
- package/dist/utils/conditions.esm.js +20 -0
- package/dist/utils/conditions.esm.js.map +1 -0
- package/dist/utils/formatRelativeTime.esm.js +40 -0
- package/dist/utils/formatRelativeTime.esm.js.map +1 -0
- package/dist/utils/instanceStatuses.esm.js +74 -0
- package/dist/utils/instanceStatuses.esm.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { parseInstanceId, parseComponentId } from '@massdriver/backstage-plugin-common';
|
|
2
|
+
import { NODE_HEIGHT, NODE_WIDTH } from './DiagramNode.constants.esm.js';
|
|
3
|
+
|
|
4
|
+
const BASE_EDGE_STYLE = {
|
|
5
|
+
strokeWidth: "3",
|
|
6
|
+
stroke: "#b7b7b7"
|
|
7
|
+
};
|
|
8
|
+
const DISCONNECTED_EDGE_STYLE = {
|
|
9
|
+
...BASE_EDGE_STYLE,
|
|
10
|
+
strokeDasharray: "6 4"
|
|
11
|
+
};
|
|
12
|
+
const deriveHandleType = ({ resourceType, required }, showFieldStatus) => {
|
|
13
|
+
if (!resourceType) return "error";
|
|
14
|
+
if (showFieldStatus && required) return "required";
|
|
15
|
+
return "default";
|
|
16
|
+
};
|
|
17
|
+
const buildHandles = (slots = [], connectedNames, { showFieldStatus = true } = {}) => slots.filter(
|
|
18
|
+
(slot) => !slot.resourceType || slot.resourceType.connectionOrientation === "LINK"
|
|
19
|
+
).map((slot) => ({
|
|
20
|
+
id: slot.name,
|
|
21
|
+
name: slot.name,
|
|
22
|
+
required: slot.required,
|
|
23
|
+
resourceTypeId: slot.resourceType?.id ?? null,
|
|
24
|
+
hasConnection: connectedNames.has(slot.name),
|
|
25
|
+
handleType: deriveHandleType(slot, showFieldStatus),
|
|
26
|
+
showFieldStatus
|
|
27
|
+
}));
|
|
28
|
+
const buildDiagram = ({
|
|
29
|
+
components = [],
|
|
30
|
+
links = [],
|
|
31
|
+
instances = [],
|
|
32
|
+
connections = [],
|
|
33
|
+
selectedComponentId = null
|
|
34
|
+
} = {}) => {
|
|
35
|
+
const instancesByScopedComponentId = new Map(
|
|
36
|
+
instances.map((inst) => [parseInstanceId(inst.id).scopedComponentId, inst])
|
|
37
|
+
);
|
|
38
|
+
const connectionsByLinkId = new Map(
|
|
39
|
+
connections.map((conn) => [conn.link?.id, conn]).filter(([id]) => id != null)
|
|
40
|
+
);
|
|
41
|
+
const outgoingByInstanceId = /* @__PURE__ */ new Map();
|
|
42
|
+
const incomingByInstanceId = /* @__PURE__ */ new Map();
|
|
43
|
+
connections.forEach((conn) => {
|
|
44
|
+
const fromId = conn.fromInstance?.id;
|
|
45
|
+
const toId = conn.toInstance?.id;
|
|
46
|
+
if (fromId) {
|
|
47
|
+
if (!outgoingByInstanceId.has(fromId))
|
|
48
|
+
outgoingByInstanceId.set(fromId, /* @__PURE__ */ new Set());
|
|
49
|
+
outgoingByInstanceId.get(fromId).add(conn.fromField);
|
|
50
|
+
}
|
|
51
|
+
if (toId) {
|
|
52
|
+
if (!incomingByInstanceId.has(toId))
|
|
53
|
+
incomingByInstanceId.set(toId, /* @__PURE__ */ new Set());
|
|
54
|
+
incomingByInstanceId.get(toId).add(conn.toField);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
const componentsWithInstance = components.map((component) => ({
|
|
58
|
+
component,
|
|
59
|
+
instance: instancesByScopedComponentId.get(
|
|
60
|
+
parseComponentId(component.id).scopedComponentId
|
|
61
|
+
) ?? null
|
|
62
|
+
})).filter(
|
|
63
|
+
(entry) => entry.instance !== null
|
|
64
|
+
);
|
|
65
|
+
const instanceByComponentId = new Map(
|
|
66
|
+
componentsWithInstance.map(({ component, instance }) => [
|
|
67
|
+
component.id,
|
|
68
|
+
instance
|
|
69
|
+
])
|
|
70
|
+
);
|
|
71
|
+
const resourceFieldsByComponentId = new Map(
|
|
72
|
+
componentsWithInstance.map(({ component, instance }) => [
|
|
73
|
+
component.id,
|
|
74
|
+
new Set((instance.bundle?.resources ?? []).map((slot) => slot.name))
|
|
75
|
+
])
|
|
76
|
+
);
|
|
77
|
+
const dependencyFieldsByComponentId = new Map(
|
|
78
|
+
componentsWithInstance.map(({ component, instance }) => [
|
|
79
|
+
component.id,
|
|
80
|
+
new Set((instance.bundle?.dependencies ?? []).map((slot) => slot.name))
|
|
81
|
+
])
|
|
82
|
+
);
|
|
83
|
+
const nodes = componentsWithInstance.map(
|
|
84
|
+
({ component, instance }) => {
|
|
85
|
+
const incoming = incomingByInstanceId.get(instance.id) ?? /* @__PURE__ */ new Set();
|
|
86
|
+
const outgoing = outgoingByInstanceId.get(instance.id) ?? /* @__PURE__ */ new Set();
|
|
87
|
+
const { scopedComponentId } = parseComponentId(component.id);
|
|
88
|
+
return {
|
|
89
|
+
id: component.id,
|
|
90
|
+
position: component.position ?? { x: 0, y: 0 },
|
|
91
|
+
type: "DiagramNode",
|
|
92
|
+
width: NODE_WIDTH,
|
|
93
|
+
height: NODE_HEIGHT,
|
|
94
|
+
data: {
|
|
95
|
+
id: scopedComponentId,
|
|
96
|
+
instanceId: scopedComponentId,
|
|
97
|
+
fullInstanceId: instance.id,
|
|
98
|
+
name: component.name,
|
|
99
|
+
ociRepoName: component.ociRepo?.name ?? null,
|
|
100
|
+
icon: instance.bundle?.icon ?? null,
|
|
101
|
+
version: instance.version ?? null,
|
|
102
|
+
status: instance.status ?? null,
|
|
103
|
+
isSelected: scopedComponentId === selectedComponentId,
|
|
104
|
+
dependencyHandles: buildHandles(
|
|
105
|
+
instance.bundle?.dependencies ?? [],
|
|
106
|
+
incoming
|
|
107
|
+
),
|
|
108
|
+
resourceHandles: buildHandles(
|
|
109
|
+
instance.bundle?.resources ?? [],
|
|
110
|
+
outgoing,
|
|
111
|
+
{
|
|
112
|
+
showFieldStatus: false
|
|
113
|
+
}
|
|
114
|
+
)
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
);
|
|
119
|
+
const edges = links.map((link) => ({
|
|
120
|
+
link,
|
|
121
|
+
connection: connectionsByLinkId.get(link.id) ?? null
|
|
122
|
+
})).filter(({ link }) => {
|
|
123
|
+
const fromInstance = instanceByComponentId.get(link.fromComponent?.id);
|
|
124
|
+
const toInstance = instanceByComponentId.get(link.toComponent?.id);
|
|
125
|
+
if (!fromInstance || !toInstance) return false;
|
|
126
|
+
const resourceFields = resourceFieldsByComponentId.get(
|
|
127
|
+
link.fromComponent.id
|
|
128
|
+
);
|
|
129
|
+
const dependencyFields = dependencyFieldsByComponentId.get(
|
|
130
|
+
link.toComponent.id
|
|
131
|
+
);
|
|
132
|
+
return Boolean(
|
|
133
|
+
resourceFields?.has(link.fromField) && dependencyFields?.has(link.toField)
|
|
134
|
+
);
|
|
135
|
+
}).map(({ link, connection }) => {
|
|
136
|
+
const isConnection = connection !== null;
|
|
137
|
+
return {
|
|
138
|
+
id: link.id,
|
|
139
|
+
source: link.fromComponent.id,
|
|
140
|
+
sourceHandle: link.fromField,
|
|
141
|
+
target: link.toComponent.id,
|
|
142
|
+
targetHandle: link.toField,
|
|
143
|
+
style: isConnection ? BASE_EDGE_STYLE : DISCONNECTED_EDGE_STYLE,
|
|
144
|
+
data: { isConnection }
|
|
145
|
+
};
|
|
146
|
+
});
|
|
147
|
+
return { nodes, edges };
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
export { BASE_EDGE_STYLE, DISCONNECTED_EDGE_STYLE, buildDiagram };
|
|
151
|
+
//# sourceMappingURL=diagramFactory.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagramFactory.esm.js","sources":["../../../../src/features/environment/graph/diagramFactory.ts"],"sourcesContent":["import type { Edge, Node } from '@xyflow/react';\nimport {\n parseComponentId,\n parseInstanceId,\n} from '@massdriver/backstage-plugin-common';\nimport { NODE_WIDTH, NODE_HEIGHT } from './DiagramNode.constants';\n\n// Ported from apps/web/features/environments/utils/diagramFactory.js. Read-only:\n// edges use the default React Flow edge type (the app's `deletable` edge type\n// is dropped since links cannot be removed here).\n\nconst BASE_EDGE_STYLE = {\n strokeWidth: '3',\n stroke: '#b7b7b7',\n};\n\nconst DISCONNECTED_EDGE_STYLE = {\n ...BASE_EDGE_STYLE,\n strokeDasharray: '6 4',\n};\n\nexport interface ResourceType {\n id: string;\n connectionOrientation?: string | null;\n}\n\nexport interface Slot {\n name: string;\n required?: boolean | null;\n resourceType?: ResourceType | null;\n}\n\nexport interface Bundle {\n id?: string;\n name?: string | null;\n version?: string | null;\n icon?: string | null;\n dependencies?: Slot[] | null;\n resources?: Slot[] | null;\n}\n\nexport interface Instance {\n id: string;\n name?: string | null;\n status?: string | null;\n version?: string | null;\n bundle?: Bundle | null;\n}\n\nexport interface Component {\n id: string;\n name: string;\n position?: { x: number; y: number } | null;\n ociRepo?: { id: string; name?: string | null } | null;\n}\n\nexport interface Link {\n id: string;\n fromField: string;\n toField: string;\n fromComponent?: { id: string } | null;\n toComponent?: { id: string } | null;\n}\n\nexport interface Connection {\n id: string;\n fromField: string;\n toField: string;\n fromInstance?: { id: string } | null;\n toInstance?: { id: string } | null;\n link?: { id: string } | null;\n}\n\nexport interface DiagramHandle {\n id: string;\n name: string;\n required?: boolean | null;\n resourceTypeId: string | null;\n hasConnection: boolean;\n handleType: string;\n showFieldStatus: boolean;\n}\n\nexport interface DiagramNodeData {\n id: string;\n instanceId: string;\n fullInstanceId: string;\n name: string;\n ociRepoName: string | null;\n icon: string | null;\n version: string | null;\n status: string | null;\n isSelected: boolean;\n dependencyHandles: DiagramHandle[];\n resourceHandles: DiagramHandle[];\n [key: string]: unknown;\n}\n\nexport type DiagramNodeType = Node<DiagramNodeData>;\n\ninterface BuildDiagramArgs {\n components?: Component[];\n links?: Link[];\n instances?: Instance[];\n connections?: Connection[];\n selectedComponentId?: string | null;\n}\n\nconst deriveHandleType = (\n { resourceType, required }: Slot,\n showFieldStatus: boolean,\n): string => {\n if (!resourceType) return 'error';\n if (showFieldStatus && required) return 'required';\n return 'default';\n};\n\nconst buildHandles = (\n slots: Slot[] = [],\n connectedNames: Set<string>,\n { showFieldStatus = true }: { showFieldStatus?: boolean } = {},\n): DiagramHandle[] =>\n slots\n .filter(\n slot =>\n !slot.resourceType ||\n slot.resourceType.connectionOrientation === 'LINK',\n )\n .map(slot => ({\n id: slot.name,\n name: slot.name,\n required: slot.required,\n resourceTypeId: slot.resourceType?.id ?? null,\n hasConnection: connectedNames.has(slot.name),\n handleType: deriveHandleType(slot, showFieldStatus),\n showFieldStatus,\n }));\n\nconst buildDiagram = ({\n components = [],\n links = [],\n instances = [],\n connections = [],\n selectedComponentId = null,\n}: BuildDiagramArgs = {}): { nodes: DiagramNodeType[]; edges: Edge[] } => {\n const instancesByScopedComponentId = new Map(\n instances.map(inst => [parseInstanceId(inst.id).scopedComponentId, inst]),\n );\n\n const connectionsByLinkId = new Map(\n connections\n .map(conn => [conn.link?.id, conn] as const)\n .filter(([id]) => id != null),\n );\n\n const outgoingByInstanceId = new Map<string, Set<string>>();\n const incomingByInstanceId = new Map<string, Set<string>>();\n connections.forEach(conn => {\n const fromId = conn.fromInstance?.id;\n const toId = conn.toInstance?.id;\n if (fromId) {\n if (!outgoingByInstanceId.has(fromId))\n outgoingByInstanceId.set(fromId, new Set());\n outgoingByInstanceId.get(fromId)!.add(conn.fromField);\n }\n if (toId) {\n if (!incomingByInstanceId.has(toId))\n incomingByInstanceId.set(toId, new Set());\n incomingByInstanceId.get(toId)!.add(conn.toField);\n }\n });\n\n const componentsWithInstance = components\n .map(component => ({\n component,\n instance:\n instancesByScopedComponentId.get(\n parseComponentId(component.id).scopedComponentId,\n ) ?? null,\n }))\n .filter(\n (entry): entry is { component: Component; instance: Instance } =>\n entry.instance !== null,\n );\n\n const instanceByComponentId = new Map(\n componentsWithInstance.map(({ component, instance }) => [\n component.id,\n instance,\n ]),\n );\n\n const resourceFieldsByComponentId = new Map(\n componentsWithInstance.map(({ component, instance }) => [\n component.id,\n new Set((instance.bundle?.resources ?? []).map(slot => slot.name)),\n ]),\n );\n\n const dependencyFieldsByComponentId = new Map(\n componentsWithInstance.map(({ component, instance }) => [\n component.id,\n new Set((instance.bundle?.dependencies ?? []).map(slot => slot.name)),\n ]),\n );\n\n const nodes: DiagramNodeType[] = componentsWithInstance.map(\n ({ component, instance }) => {\n const incoming = incomingByInstanceId.get(instance.id) ?? new Set();\n const outgoing = outgoingByInstanceId.get(instance.id) ?? new Set();\n const { scopedComponentId } = parseComponentId(component.id);\n\n return {\n id: component.id,\n position: component.position ?? { x: 0, y: 0 },\n type: 'DiagramNode',\n width: NODE_WIDTH,\n height: NODE_HEIGHT,\n data: {\n id: scopedComponentId,\n instanceId: scopedComponentId,\n fullInstanceId: instance.id,\n name: component.name,\n ociRepoName: component.ociRepo?.name ?? null,\n icon: instance.bundle?.icon ?? null,\n version: instance.version ?? null,\n status: instance.status ?? null,\n isSelected: scopedComponentId === selectedComponentId,\n dependencyHandles: buildHandles(\n instance.bundle?.dependencies ?? [],\n incoming,\n ),\n resourceHandles: buildHandles(\n instance.bundle?.resources ?? [],\n outgoing,\n {\n showFieldStatus: false,\n },\n ),\n },\n };\n },\n );\n\n const edges: Edge[] = links\n .map(link => ({\n link,\n connection: connectionsByLinkId.get(link.id) ?? null,\n }))\n .filter(({ link }) => {\n const fromInstance = instanceByComponentId.get(link.fromComponent?.id!);\n const toInstance = instanceByComponentId.get(link.toComponent?.id!);\n if (!fromInstance || !toInstance) return false;\n const resourceFields = resourceFieldsByComponentId.get(\n link.fromComponent!.id,\n );\n const dependencyFields = dependencyFieldsByComponentId.get(\n link.toComponent!.id,\n );\n return Boolean(\n resourceFields?.has(link.fromField) &&\n dependencyFields?.has(link.toField),\n );\n })\n .map(({ link, connection }) => {\n const isConnection = connection !== null;\n return {\n id: link.id,\n source: link.fromComponent!.id,\n sourceHandle: link.fromField,\n target: link.toComponent!.id,\n targetHandle: link.toField,\n style: isConnection ? BASE_EDGE_STYLE : DISCONNECTED_EDGE_STYLE,\n data: { isConnection },\n };\n });\n\n return { nodes, edges };\n};\n\nexport { buildDiagram, BASE_EDGE_STYLE, DISCONNECTED_EDGE_STYLE };\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useCallback, useEffect } from 'react';
|
|
3
|
+
import { useConnection, Position } from '@xyflow/react';
|
|
4
|
+
import Box from '@massdriver/ui/Box';
|
|
5
|
+
import ExpandCircleDownOutlinedIcon from '@massdriver/ui/icons/ExpandCircleDownOutlinedIcon';
|
|
6
|
+
import stylin from '@massdriver/ui/stylin';
|
|
7
|
+
import NodeHandle from './NodeHandle.esm.js';
|
|
8
|
+
import useRadialPositions from './useRadialPositions.esm.js';
|
|
9
|
+
import useAnimationFrameSync from './useAnimationFrameSync.esm.js';
|
|
10
|
+
import useTransitionLifecycle from './useTransitionLifecycle.esm.js';
|
|
11
|
+
import { NODE_HEIGHT } from '../DiagramNode.constants.esm.js';
|
|
12
|
+
|
|
13
|
+
const HOTSPOT_WIDTH = 200;
|
|
14
|
+
const HOTSPOT_HEIGHT = 200;
|
|
15
|
+
const RADIUS = 70;
|
|
16
|
+
const START_ANGLE = 70;
|
|
17
|
+
const END_ANGLE = -70;
|
|
18
|
+
const TRANSITION_STAGGER_MS = 10;
|
|
19
|
+
const OPEN_EASING = "cubic-bezier(0.4, 0.0, 0.2, 1)";
|
|
20
|
+
const CLOSE_EASING = "cubic-bezier(0.0, 0.0, 0.2, 1)";
|
|
21
|
+
const ORIGIN_X = HOTSPOT_WIDTH / 2;
|
|
22
|
+
const ORIGIN_Y = (HOTSPOT_HEIGHT - NODE_HEIGHT) / 2 + NODE_HEIGHT / 2;
|
|
23
|
+
const CLOSED_POSITION = { xPos: ORIGIN_X, yPos: ORIGIN_Y };
|
|
24
|
+
const connectionSelector = ({ inProgress }) => inProgress;
|
|
25
|
+
const transitionStyle = (isOpen, index) => ({
|
|
26
|
+
transition: isOpen ? `top 250ms ${OPEN_EASING} ${index * TRANSITION_STAGGER_MS}ms, left 250ms ${OPEN_EASING} ${index * TRANSITION_STAGGER_MS}ms, right 250ms ${OPEN_EASING} ${index * TRANSITION_STAGGER_MS}ms` : `top 200ms ${CLOSE_EASING}, left 200ms ${CLOSE_EASING}, right 200ms ${CLOSE_EASING}`,
|
|
27
|
+
willChange: isOpen ? "top, left, right" : "auto"
|
|
28
|
+
});
|
|
29
|
+
const ANIMATING_SAFETY_TIMEOUT_MS = 500;
|
|
30
|
+
const ExpandableHandleWrapper = ({
|
|
31
|
+
type,
|
|
32
|
+
placement,
|
|
33
|
+
handles = [],
|
|
34
|
+
nodeId,
|
|
35
|
+
isOpen: isOpenProp
|
|
36
|
+
}) => {
|
|
37
|
+
const inProgress = useConnection(connectionSelector);
|
|
38
|
+
const isOpen = Boolean(isOpenProp) || inProgress;
|
|
39
|
+
const showFan = handles.length > 1;
|
|
40
|
+
const openPositions = useRadialPositions(
|
|
41
|
+
{
|
|
42
|
+
startAngle: START_ANGLE,
|
|
43
|
+
endAngle: END_ANGLE,
|
|
44
|
+
radius: RADIUS,
|
|
45
|
+
numItems: handles.length,
|
|
46
|
+
originX: ORIGIN_X,
|
|
47
|
+
originY: ORIGIN_Y
|
|
48
|
+
},
|
|
49
|
+
{ skip: !showFan }
|
|
50
|
+
);
|
|
51
|
+
const [isAnimating, setIsAnimating] = useState(false);
|
|
52
|
+
const onTransitionStart = useCallback((event) => {
|
|
53
|
+
if (event.propertyName !== "top") return;
|
|
54
|
+
setIsAnimating((prev) => prev ? prev : true);
|
|
55
|
+
}, []);
|
|
56
|
+
const onTransitionEnd = useCallback((event) => {
|
|
57
|
+
if (event.propertyName !== "top") return;
|
|
58
|
+
setIsAnimating((prev) => !prev ? prev : false);
|
|
59
|
+
}, []);
|
|
60
|
+
const onTransitionCancel = useCallback(() => {
|
|
61
|
+
setIsAnimating((prev) => !prev ? prev : false);
|
|
62
|
+
}, []);
|
|
63
|
+
const containerRef = useTransitionLifecycle(
|
|
64
|
+
onTransitionStart,
|
|
65
|
+
onTransitionCancel
|
|
66
|
+
);
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
if (!isAnimating) return void 0;
|
|
69
|
+
const safety = setTimeout(
|
|
70
|
+
() => setIsAnimating(false),
|
|
71
|
+
ANIMATING_SAFETY_TIMEOUT_MS
|
|
72
|
+
);
|
|
73
|
+
return () => clearTimeout(safety);
|
|
74
|
+
}, [isAnimating]);
|
|
75
|
+
useAnimationFrameSync(nodeId, isAnimating);
|
|
76
|
+
if (handles.length === 0) return null;
|
|
77
|
+
const reactFlowPosition = placement === "left" ? Position.Left : Position.Right;
|
|
78
|
+
if (!showFan) {
|
|
79
|
+
const handle = handles[0];
|
|
80
|
+
return /* @__PURE__ */ jsx(
|
|
81
|
+
NodeHandle,
|
|
82
|
+
{
|
|
83
|
+
id: handle.id,
|
|
84
|
+
type,
|
|
85
|
+
position: reactFlowPosition,
|
|
86
|
+
placement,
|
|
87
|
+
handleType: handle.handleType,
|
|
88
|
+
hasConnection: handle.hasConnection,
|
|
89
|
+
resourceTypeId: handle.resourceTypeId,
|
|
90
|
+
fieldName: handle.name,
|
|
91
|
+
required: handle.required,
|
|
92
|
+
showFieldStatus: handle.showFieldStatus,
|
|
93
|
+
xPos: 0,
|
|
94
|
+
yPos: Math.round(NODE_HEIGHT / 2)
|
|
95
|
+
},
|
|
96
|
+
handle.id
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
100
|
+
/* @__PURE__ */ jsx(
|
|
101
|
+
HandleContainer,
|
|
102
|
+
{
|
|
103
|
+
className: "node-handle nodrag",
|
|
104
|
+
ref: containerRef,
|
|
105
|
+
placement,
|
|
106
|
+
children: handles.map((handle, index) => {
|
|
107
|
+
const { xPos, yPos } = isOpen ? openPositions?.[index] ?? CLOSED_POSITION : CLOSED_POSITION;
|
|
108
|
+
return /* @__PURE__ */ jsx(
|
|
109
|
+
NodeHandle,
|
|
110
|
+
{
|
|
111
|
+
id: handle.id,
|
|
112
|
+
type,
|
|
113
|
+
position: reactFlowPosition,
|
|
114
|
+
placement,
|
|
115
|
+
handleType: handle.handleType,
|
|
116
|
+
hasConnection: handle.hasConnection,
|
|
117
|
+
resourceTypeId: handle.resourceTypeId,
|
|
118
|
+
fieldName: handle.name,
|
|
119
|
+
required: handle.required,
|
|
120
|
+
showFieldStatus: handle.showFieldStatus,
|
|
121
|
+
xPos,
|
|
122
|
+
yPos,
|
|
123
|
+
onTransitionEnd,
|
|
124
|
+
sx: transitionStyle(isOpen, index)
|
|
125
|
+
},
|
|
126
|
+
handle.id
|
|
127
|
+
);
|
|
128
|
+
})
|
|
129
|
+
}
|
|
130
|
+
),
|
|
131
|
+
/* @__PURE__ */ jsx(
|
|
132
|
+
NestedIcon,
|
|
133
|
+
{
|
|
134
|
+
className: "node-handle",
|
|
135
|
+
placement,
|
|
136
|
+
onClick: (event) => event.stopPropagation()
|
|
137
|
+
}
|
|
138
|
+
)
|
|
139
|
+
] });
|
|
140
|
+
};
|
|
141
|
+
const HandleContainer = stylin(Box, ["placement"])(
|
|
142
|
+
({ placement }) => ({
|
|
143
|
+
position: "absolute",
|
|
144
|
+
width: `${HOTSPOT_WIDTH}px`,
|
|
145
|
+
height: `${HOTSPOT_HEIGHT}px`,
|
|
146
|
+
top: `calc(50% - ${HOTSPOT_HEIGHT / 2}px)`,
|
|
147
|
+
borderRadius: "50%",
|
|
148
|
+
...placement === "left" ? {
|
|
149
|
+
left: `-${HOTSPOT_WIDTH / 2}px`,
|
|
150
|
+
clipPath: "polygon(0 0, 50% 0, 50% 100%, 0 100%)"
|
|
151
|
+
} : {
|
|
152
|
+
right: `-${HOTSPOT_WIDTH / 2}px`,
|
|
153
|
+
clipPath: "polygon(50% 0, 100% 0, 100% 100%, 50% 100%)"
|
|
154
|
+
}
|
|
155
|
+
})
|
|
156
|
+
);
|
|
157
|
+
const NestedIcon = stylin(ExpandCircleDownOutlinedIcon, ["placement"])(
|
|
158
|
+
({ theme, placement }) => ({
|
|
159
|
+
zIndex: 10,
|
|
160
|
+
position: "absolute",
|
|
161
|
+
backgroundColor: theme.palette.background.paper,
|
|
162
|
+
borderRadius: "50%",
|
|
163
|
+
fontSize: "18px",
|
|
164
|
+
width: "27px",
|
|
165
|
+
height: "27px",
|
|
166
|
+
top: "50%",
|
|
167
|
+
left: placement === "left" ? "0%" : "100%",
|
|
168
|
+
transform: `translate(-50%, -50%) rotate(${placement === "left" ? 90 : 270}deg)`,
|
|
169
|
+
color: theme.palette.grey[600]
|
|
170
|
+
})
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
export { ExpandableHandleWrapper as default };
|
|
174
|
+
//# sourceMappingURL=ExpandableHandleWrapper.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExpandableHandleWrapper.esm.js","sources":["../../../../../src/features/environment/graph/handles/ExpandableHandleWrapper.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport { Position, useConnection } from '@xyflow/react';\nimport Box from '@massdriver/ui/Box';\nimport ExpandCircleDownOutlinedIcon from '@massdriver/ui/icons/ExpandCircleDownOutlinedIcon';\nimport stylin from '@massdriver/ui/stylin';\nimport NodeHandle from './NodeHandle';\nimport useRadialPositions from './useRadialPositions';\nimport useAnimationFrameSync from './useAnimationFrameSync';\nimport useTransitionLifecycle from './useTransitionLifecycle';\nimport type { DiagramHandle } from '../diagramFactory';\nimport { NODE_HEIGHT } from '../DiagramNode.constants';\n\nconst HOTSPOT_WIDTH = 200;\nconst HOTSPOT_HEIGHT = 200;\nconst RADIUS = 70;\nconst START_ANGLE = 70;\nconst END_ANGLE = -70;\nconst TRANSITION_STAGGER_MS = 10;\nconst OPEN_EASING = 'cubic-bezier(0.4, 0.0, 0.2, 1)';\nconst CLOSE_EASING = 'cubic-bezier(0.0, 0.0, 0.2, 1)';\n\nconst ORIGIN_X = HOTSPOT_WIDTH / 2;\nconst ORIGIN_Y = (HOTSPOT_HEIGHT - NODE_HEIGHT) / 2 + NODE_HEIGHT / 2;\nconst CLOSED_POSITION = { xPos: ORIGIN_X, yPos: ORIGIN_Y };\n\nconst connectionSelector = ({ inProgress }: { inProgress: boolean }) =>\n inProgress;\n\nconst transitionStyle = (isOpen: boolean, index: number) => ({\n transition: isOpen\n ? `top 250ms ${OPEN_EASING} ${\n index * TRANSITION_STAGGER_MS\n }ms, left 250ms ${OPEN_EASING} ${\n index * TRANSITION_STAGGER_MS\n }ms, right 250ms ${OPEN_EASING} ${index * TRANSITION_STAGGER_MS}ms`\n : `top 200ms ${CLOSE_EASING}, left 200ms ${CLOSE_EASING}, right 200ms ${CLOSE_EASING}`,\n willChange: isOpen ? 'top, left, right' : 'auto',\n});\n\nconst ANIMATING_SAFETY_TIMEOUT_MS = 500;\n\nconst ExpandableHandleWrapper = ({\n type,\n placement,\n handles = [],\n nodeId,\n isOpen: isOpenProp,\n}: {\n type: 'source' | 'target';\n placement: 'left' | 'right';\n handles?: DiagramHandle[];\n nodeId: string;\n isOpen?: boolean;\n}) => {\n const inProgress = useConnection(connectionSelector);\n const isOpen = Boolean(isOpenProp) || inProgress;\n\n const showFan = handles.length > 1;\n\n const openPositions = useRadialPositions(\n {\n startAngle: START_ANGLE,\n endAngle: END_ANGLE,\n radius: RADIUS,\n numItems: handles.length,\n originX: ORIGIN_X,\n originY: ORIGIN_Y,\n },\n { skip: !showFan },\n );\n\n const [isAnimating, setIsAnimating] = useState(false);\n\n const onTransitionStart = useCallback((event: TransitionEvent) => {\n if (event.propertyName !== 'top') return;\n setIsAnimating(prev => (prev ? prev : true));\n }, []);\n\n const onTransitionEnd = useCallback((event: any) => {\n if (event.propertyName !== 'top') return;\n setIsAnimating(prev => (!prev ? prev : false));\n }, []);\n\n const onTransitionCancel = useCallback(() => {\n setIsAnimating(prev => (!prev ? prev : false));\n }, []);\n\n const containerRef = useTransitionLifecycle(\n onTransitionStart,\n onTransitionCancel,\n );\n\n useEffect(() => {\n if (!isAnimating) return undefined;\n const safety = setTimeout(\n () => setIsAnimating(false),\n ANIMATING_SAFETY_TIMEOUT_MS,\n );\n return () => clearTimeout(safety);\n }, [isAnimating]);\n\n useAnimationFrameSync(nodeId, isAnimating);\n\n if (handles.length === 0) return null;\n\n const reactFlowPosition =\n placement === 'left' ? Position.Left : Position.Right;\n\n if (!showFan) {\n const handle = handles[0];\n return (\n <NodeHandle\n key={handle.id}\n id={handle.id}\n type={type}\n position={reactFlowPosition}\n placement={placement}\n handleType={handle.handleType}\n hasConnection={handle.hasConnection}\n resourceTypeId={handle.resourceTypeId}\n fieldName={handle.name}\n required={handle.required}\n showFieldStatus={handle.showFieldStatus}\n xPos={0}\n yPos={Math.round(NODE_HEIGHT / 2)}\n />\n );\n }\n\n return (\n <>\n <HandleContainer\n className=\"node-handle nodrag\"\n ref={containerRef}\n placement={placement}\n >\n {handles.map((handle, index) => {\n const { xPos, yPos } = isOpen\n ? openPositions?.[index] ?? CLOSED_POSITION\n : CLOSED_POSITION;\n\n return (\n <NodeHandle\n key={handle.id}\n id={handle.id}\n type={type}\n position={reactFlowPosition}\n placement={placement}\n handleType={handle.handleType}\n hasConnection={handle.hasConnection}\n resourceTypeId={handle.resourceTypeId}\n fieldName={handle.name}\n required={handle.required}\n showFieldStatus={handle.showFieldStatus}\n xPos={xPos}\n yPos={yPos}\n onTransitionEnd={onTransitionEnd}\n sx={transitionStyle(isOpen, index)}\n />\n );\n })}\n </HandleContainer>\n <NestedIcon\n className=\"node-handle\"\n placement={placement}\n onClick={(event: any) => event.stopPropagation()}\n />\n </>\n );\n};\n\nconst HandleContainer = stylin(Box, ['placement'])(\n ({ placement }: { placement: 'left' | 'right' }) => ({\n position: 'absolute',\n width: `${HOTSPOT_WIDTH}px`,\n height: `${HOTSPOT_HEIGHT}px`,\n top: `calc(50% - ${HOTSPOT_HEIGHT / 2}px)`,\n borderRadius: '50%',\n ...(placement === 'left'\n ? {\n left: `-${HOTSPOT_WIDTH / 2}px`,\n clipPath: 'polygon(0 0, 50% 0, 50% 100%, 0 100%)',\n }\n : {\n right: `-${HOTSPOT_WIDTH / 2}px`,\n clipPath: 'polygon(50% 0, 100% 0, 100% 100%, 50% 100%)',\n }),\n }),\n);\n\nconst NestedIcon = stylin(ExpandCircleDownOutlinedIcon, ['placement'])(\n ({ theme, placement }: { theme: any; placement: 'left' | 'right' }) => ({\n zIndex: 10,\n position: 'absolute',\n backgroundColor: theme.palette.background.paper,\n borderRadius: '50%',\n fontSize: '18px',\n width: '27px',\n height: '27px',\n top: '50%',\n left: placement === 'left' ? '0%' : '100%',\n transform: `translate(-50%, -50%) rotate(${\n placement === 'left' ? 90 : 270\n }deg)`,\n color: theme.palette.grey[600],\n }),\n);\n\nexport default ExpandableHandleWrapper;\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { HANDLE_TYPES, HANDLE_TYPE } from './handleTypes.esm.js';
|
|
3
|
+
import NodeHandleTooltip from './NodeHandleTooltip.esm.js';
|
|
4
|
+
|
|
5
|
+
const ERROR_MESSAGE = "Resource type not found";
|
|
6
|
+
const NodeHandle = ({
|
|
7
|
+
handleType,
|
|
8
|
+
resourceTypeId,
|
|
9
|
+
fieldName,
|
|
10
|
+
required,
|
|
11
|
+
showFieldStatus = true,
|
|
12
|
+
hasConnection,
|
|
13
|
+
isValidConnectionTarget,
|
|
14
|
+
placement,
|
|
15
|
+
...handleProps
|
|
16
|
+
}) => {
|
|
17
|
+
const Component = HANDLE_TYPES[handleType] ?? HANDLE_TYPES[HANDLE_TYPE.DEFAULT];
|
|
18
|
+
const isError = handleType === HANDLE_TYPE.ERROR;
|
|
19
|
+
const isRemoteReference = handleType === HANDLE_TYPE.REMOTE_REFERENCE;
|
|
20
|
+
const handle = /* @__PURE__ */ jsx(
|
|
21
|
+
Component,
|
|
22
|
+
{
|
|
23
|
+
className: "node-handle nodrag",
|
|
24
|
+
hasConnection,
|
|
25
|
+
isValidConnectionTarget,
|
|
26
|
+
...handleProps
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
return /* @__PURE__ */ jsx(
|
|
30
|
+
NodeHandleTooltip,
|
|
31
|
+
{
|
|
32
|
+
resourceTypeId: isError ? null : resourceTypeId,
|
|
33
|
+
errorMessage: isError ? ERROR_MESSAGE : null,
|
|
34
|
+
fieldName,
|
|
35
|
+
required,
|
|
36
|
+
isRemoteReference,
|
|
37
|
+
showFieldStatus,
|
|
38
|
+
placement,
|
|
39
|
+
children: handle
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export { NodeHandle as default };
|
|
45
|
+
//# sourceMappingURL=NodeHandle.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeHandle.esm.js","sources":["../../../../../src/features/environment/graph/handles/NodeHandle.tsx"],"sourcesContent":["import { HANDLE_TYPE, HANDLE_TYPES } from './handleTypes';\nimport NodeHandleTooltip from './NodeHandleTooltip';\n\nconst ERROR_MESSAGE = 'Resource type not found';\n\nconst NodeHandle = ({\n handleType,\n resourceTypeId,\n fieldName,\n required,\n showFieldStatus = true,\n hasConnection,\n isValidConnectionTarget,\n placement,\n ...handleProps\n}: {\n handleType: string;\n resourceTypeId?: string | null;\n fieldName?: string;\n required?: boolean | null;\n showFieldStatus?: boolean;\n hasConnection?: boolean;\n isValidConnectionTarget?: boolean;\n placement?: string;\n [key: string]: unknown;\n}) => {\n const Component =\n HANDLE_TYPES[handleType] ?? HANDLE_TYPES[HANDLE_TYPE.DEFAULT];\n const isError = handleType === HANDLE_TYPE.ERROR;\n const isRemoteReference = handleType === HANDLE_TYPE.REMOTE_REFERENCE;\n\n const handle = (\n <Component\n className=\"node-handle nodrag\"\n hasConnection={hasConnection}\n isValidConnectionTarget={isValidConnectionTarget}\n {...handleProps}\n />\n );\n\n return (\n <NodeHandleTooltip\n resourceTypeId={isError ? null : resourceTypeId}\n errorMessage={isError ? ERROR_MESSAGE : null}\n fieldName={fieldName}\n required={required}\n isRemoteReference={isRemoteReference}\n showFieldStatus={showFieldStatus}\n placement={placement}\n >\n {handle}\n </NodeHandleTooltip>\n );\n};\n\nexport default NodeHandle;\n"],"names":[],"mappings":";;;;AAGA,MAAM,aAAA,GAAgB,yBAAA;AAEtB,MAAM,aAAa,CAAC;AAAA,EAClB,UAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB,aAAA;AAAA,EACA,uBAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,KAUM;AACJ,EAAA,MAAM,YACJ,YAAA,CAAa,UAAU,CAAA,IAAK,YAAA,CAAa,YAAY,OAAO,CAAA;AAC9D,EAAA,MAAM,OAAA,GAAU,eAAe,WAAA,CAAY,KAAA;AAC3C,EAAA,MAAM,iBAAA,GAAoB,eAAe,WAAA,CAAY,gBAAA;AAErD,EAAA,MAAM,MAAA,mBACJ,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,oBAAA;AAAA,MACV,aAAA;AAAA,MACA,uBAAA;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAGF,EAAA,uBACE,GAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,cAAA,EAAgB,UAAU,IAAA,GAAO,cAAA;AAAA,MACjC,YAAA,EAAc,UAAU,aAAA,GAAgB,IAAA;AAAA,MACxC,SAAA;AAAA,MACA,QAAA;AAAA,MACA,iBAAA;AAAA,MACA,eAAA;AAAA,MACA,SAAA;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;;;;"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import Box from '@massdriver/ui/Box';
|
|
3
|
+
import Typography from '@massdriver/ui/Typography';
|
|
4
|
+
import Tooltip from '@massdriver/ui/Tooltip';
|
|
5
|
+
import Chip from '@massdriver/ui/Chip';
|
|
6
|
+
import stylin from '@massdriver/ui/stylin';
|
|
7
|
+
import { chipClasses } from '@mui/material/Chip';
|
|
8
|
+
import '@mui/material/Drawer';
|
|
9
|
+
import '@mui/material/OutlinedInput';
|
|
10
|
+
import '@mui/material/Select';
|
|
11
|
+
import '@mui/material/ToggleButton';
|
|
12
|
+
|
|
13
|
+
const TOOLTIP_BG = "rgba(34, 51, 84, 0.95)";
|
|
14
|
+
const TOOLTIP_BORDER = "rgba(255, 255, 255, 0.1)";
|
|
15
|
+
const TOOLTIP_TEXT_MUTED = "rgba(255, 255, 255, 0.7)";
|
|
16
|
+
const TOOLTIP_TEXT_SUBTLE = "rgba(255, 255, 255, 0.6)";
|
|
17
|
+
const NodeHandleTooltip = ({
|
|
18
|
+
resourceTypeId,
|
|
19
|
+
errorMessage,
|
|
20
|
+
fieldName,
|
|
21
|
+
required,
|
|
22
|
+
isRemoteReference = false,
|
|
23
|
+
showFieldStatus = true,
|
|
24
|
+
placement,
|
|
25
|
+
children
|
|
26
|
+
}) => {
|
|
27
|
+
const title = errorMessage ? /* @__PURE__ */ jsxs(TooltipContent, { children: [
|
|
28
|
+
/* @__PURE__ */ jsx(ErrorText, { children: errorMessage }),
|
|
29
|
+
/* @__PURE__ */ jsx(FieldName, { as: "span", children: fieldName })
|
|
30
|
+
] }) : /* @__PURE__ */ jsxs(TooltipContent, { children: [
|
|
31
|
+
/* @__PURE__ */ jsx(HeaderSection, { children: /* @__PURE__ */ jsxs(ContentSection, { children: [
|
|
32
|
+
/* @__PURE__ */ jsx(FieldName, { children: fieldName }),
|
|
33
|
+
/* @__PURE__ */ jsx(TypeText, { children: resourceTypeId })
|
|
34
|
+
] }) }),
|
|
35
|
+
showFieldStatus ? /* @__PURE__ */ jsxs(MetaSection, { children: [
|
|
36
|
+
/* @__PURE__ */ jsx(FieldStatusLabel, { variant: "caption", children: "Field Status" }),
|
|
37
|
+
/* @__PURE__ */ jsx(
|
|
38
|
+
RequiredChip,
|
|
39
|
+
{
|
|
40
|
+
label: required ? "Required" : "Optional",
|
|
41
|
+
color: required ? isRemoteReference ? "success" : "error" : "info",
|
|
42
|
+
variant: "filled",
|
|
43
|
+
size: "small"
|
|
44
|
+
}
|
|
45
|
+
)
|
|
46
|
+
] }) : null,
|
|
47
|
+
isRemoteReference ? /* @__PURE__ */ jsx(RemoteReferenceNote, { variant: "caption", children: "Fulfilled by a remote reference." }) : null
|
|
48
|
+
] });
|
|
49
|
+
return /* @__PURE__ */ jsx(
|
|
50
|
+
Tooltip,
|
|
51
|
+
{
|
|
52
|
+
title,
|
|
53
|
+
arrow: true,
|
|
54
|
+
enterDelay: 600,
|
|
55
|
+
placement,
|
|
56
|
+
componentsProps: TOOLTIP_COMPONENTS_PROPS,
|
|
57
|
+
children
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
};
|
|
61
|
+
const TOOLTIP_COMPONENTS_PROPS = {
|
|
62
|
+
tooltip: {
|
|
63
|
+
className: "node-handle",
|
|
64
|
+
sx: {
|
|
65
|
+
bgcolor: TOOLTIP_BG,
|
|
66
|
+
backdropFilter: "blur(8px)",
|
|
67
|
+
border: `1px solid ${TOOLTIP_BORDER}`,
|
|
68
|
+
boxShadow: (theme) => theme.shadows[8]
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
arrow: { sx: { color: TOOLTIP_BG } }
|
|
72
|
+
};
|
|
73
|
+
const TooltipContent = stylin(Box)({
|
|
74
|
+
display: "flex",
|
|
75
|
+
flexDirection: "column",
|
|
76
|
+
gap: 1.5,
|
|
77
|
+
minWidth: 200,
|
|
78
|
+
maxWidth: 300
|
|
79
|
+
});
|
|
80
|
+
const HeaderSection = stylin(Box)({
|
|
81
|
+
display: "flex",
|
|
82
|
+
alignItems: "flex-start",
|
|
83
|
+
gap: 1.5
|
|
84
|
+
});
|
|
85
|
+
const ContentSection = stylin(Box)({
|
|
86
|
+
display: "flex",
|
|
87
|
+
flexDirection: "column",
|
|
88
|
+
gap: 0.5,
|
|
89
|
+
flex: 1,
|
|
90
|
+
minWidth: 0
|
|
91
|
+
});
|
|
92
|
+
const MetaSection = stylin(Box)(({ theme }) => ({
|
|
93
|
+
display: "flex",
|
|
94
|
+
alignItems: "center",
|
|
95
|
+
justifyContent: "space-between",
|
|
96
|
+
gap: theme.spacing(1),
|
|
97
|
+
paddingTop: theme.spacing(0.5),
|
|
98
|
+
borderTop: `1px solid ${TOOLTIP_BORDER}`
|
|
99
|
+
}));
|
|
100
|
+
const FieldStatusLabel = stylin(Typography)({
|
|
101
|
+
color: TOOLTIP_TEXT_SUBTLE
|
|
102
|
+
});
|
|
103
|
+
const RemoteReferenceNote = stylin(Typography)(({ theme }) => ({
|
|
104
|
+
color: theme.palette.success.light,
|
|
105
|
+
fontSize: "0.7rem",
|
|
106
|
+
fontStyle: "italic",
|
|
107
|
+
textAlign: "center"
|
|
108
|
+
}));
|
|
109
|
+
const FieldName = stylin(Typography)(({ theme }) => ({
|
|
110
|
+
fontWeight: 600,
|
|
111
|
+
fontSize: "0.875rem",
|
|
112
|
+
color: theme.palette.common.white,
|
|
113
|
+
lineHeight: 1.2
|
|
114
|
+
}));
|
|
115
|
+
const TypeText = stylin(Typography)({
|
|
116
|
+
fontSize: "0.75rem",
|
|
117
|
+
color: TOOLTIP_TEXT_MUTED,
|
|
118
|
+
fontFamily: "monospace",
|
|
119
|
+
lineHeight: 1.2
|
|
120
|
+
});
|
|
121
|
+
const ErrorText = stylin(Typography)(({ theme }) => ({
|
|
122
|
+
color: theme.palette.error.light,
|
|
123
|
+
fontWeight: 600,
|
|
124
|
+
fontSize: "0.875rem"
|
|
125
|
+
}));
|
|
126
|
+
const RequiredChip = stylin(Chip)({
|
|
127
|
+
height: 18,
|
|
128
|
+
fontSize: "0.625rem",
|
|
129
|
+
fontWeight: 600,
|
|
130
|
+
[`& .${chipClasses.label}`]: { px: 0.75 }
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
export { NodeHandleTooltip as default };
|
|
134
|
+
//# sourceMappingURL=NodeHandleTooltip.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeHandleTooltip.esm.js","sources":["../../../../../src/features/environment/graph/handles/NodeHandleTooltip.tsx"],"sourcesContent":["import { ReactNode } from 'react';\nimport Box from '@massdriver/ui/Box';\nimport Typography from '@massdriver/ui/Typography';\nimport Tooltip from '@massdriver/ui/Tooltip';\nimport Chip from '@massdriver/ui/Chip';\nimport stylin from '@massdriver/ui/stylin';\nimport { chipClasses } from '../../../../theme/muiClasses';\n\n// Read-only port of NodeHandleTooltip. The web app fetches the resource type\n// (for its icon) lazily on hover; that query is dropped here — the tooltip\n// shows the field name, resource-type id, and required/optional status only.\n\nconst TOOLTIP_BG = 'rgba(34, 51, 84, 0.95)';\nconst TOOLTIP_BORDER = 'rgba(255, 255, 255, 0.1)';\nconst TOOLTIP_TEXT_MUTED = 'rgba(255, 255, 255, 0.7)';\nconst TOOLTIP_TEXT_SUBTLE = 'rgba(255, 255, 255, 0.6)';\n\nconst NodeHandleTooltip = ({\n resourceTypeId,\n errorMessage,\n fieldName,\n required,\n isRemoteReference = false,\n showFieldStatus = true,\n placement,\n children,\n}: {\n resourceTypeId?: string | null;\n errorMessage?: string | null;\n fieldName?: string;\n required?: boolean | null;\n isRemoteReference?: boolean;\n showFieldStatus?: boolean;\n placement?: string;\n children: ReactNode;\n}) => {\n const title = errorMessage ? (\n <TooltipContent>\n <ErrorText>{errorMessage}</ErrorText>\n <FieldName as=\"span\">{fieldName}</FieldName>\n </TooltipContent>\n ) : (\n <TooltipContent>\n <HeaderSection>\n <ContentSection>\n <FieldName>{fieldName}</FieldName>\n <TypeText>{resourceTypeId}</TypeText>\n </ContentSection>\n </HeaderSection>\n {showFieldStatus ? (\n <MetaSection>\n <FieldStatusLabel variant=\"caption\">Field Status</FieldStatusLabel>\n <RequiredChip\n label={required ? 'Required' : 'Optional'}\n color={\n required ? (isRemoteReference ? 'success' : 'error') : 'info'\n }\n variant=\"filled\"\n size=\"small\"\n />\n </MetaSection>\n ) : null}\n {isRemoteReference ? (\n <RemoteReferenceNote variant=\"caption\">\n Fulfilled by a remote reference.\n </RemoteReferenceNote>\n ) : null}\n </TooltipContent>\n );\n\n return (\n <Tooltip\n title={title}\n arrow\n enterDelay={600}\n placement={placement}\n componentsProps={TOOLTIP_COMPONENTS_PROPS}\n >\n {children}\n </Tooltip>\n );\n};\n\nexport default NodeHandleTooltip;\n\nconst TOOLTIP_COMPONENTS_PROPS = {\n tooltip: {\n className: 'node-handle',\n sx: {\n bgcolor: TOOLTIP_BG,\n backdropFilter: 'blur(8px)',\n border: `1px solid ${TOOLTIP_BORDER}`,\n boxShadow: (theme: any) => theme.shadows[8],\n },\n },\n arrow: { sx: { color: TOOLTIP_BG } },\n};\n\nconst TooltipContent = stylin(Box)({\n display: 'flex',\n flexDirection: 'column',\n gap: 1.5,\n minWidth: 200,\n maxWidth: 300,\n});\n\nconst HeaderSection = stylin(Box)({\n display: 'flex',\n alignItems: 'flex-start',\n gap: 1.5,\n});\n\nconst ContentSection = stylin(Box)({\n display: 'flex',\n flexDirection: 'column',\n gap: 0.5,\n flex: 1,\n minWidth: 0,\n});\n\nconst MetaSection = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: theme.spacing(1),\n paddingTop: theme.spacing(0.5),\n borderTop: `1px solid ${TOOLTIP_BORDER}`,\n}));\n\nconst FieldStatusLabel = stylin(Typography)({\n color: TOOLTIP_TEXT_SUBTLE,\n});\n\nconst RemoteReferenceNote = stylin(Typography)(({ theme }: { theme: any }) => ({\n color: theme.palette.success.light,\n fontSize: '0.7rem',\n fontStyle: 'italic',\n textAlign: 'center',\n}));\n\nconst FieldName = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontWeight: 600,\n fontSize: '0.875rem',\n color: theme.palette.common.white,\n lineHeight: 1.2,\n}));\n\nconst TypeText = stylin(Typography)({\n fontSize: '0.75rem',\n color: TOOLTIP_TEXT_MUTED,\n fontFamily: 'monospace',\n lineHeight: 1.2,\n});\n\nconst ErrorText = stylin(Typography)(({ theme }: { theme: any }) => ({\n color: theme.palette.error.light,\n fontWeight: 600,\n fontSize: '0.875rem',\n}));\n\nconst RequiredChip = stylin(Chip)({\n height: 18,\n fontSize: '0.625rem',\n fontWeight: 600,\n [`& .${chipClasses.label}`]: { px: 0.75 },\n});\n"],"names":[],"mappings":"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"}
|