@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 @@
|
|
|
1
|
+
{"version":3,"file":"ViewDeploymentDetails.esm.js","sources":["../../../../../src/features/environment/InstanceDrawer/tabs/ViewDeploymentDetails.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useApi } from '@backstage/frontend-plugin-api';\nimport useAsync from 'react-use/esm/useAsync';\nimport {\n Dialog,\n DialogActions,\n DialogContent,\n DialogHeader,\n} from '@massdriver/ui/Dialog';\nimport Box from '@massdriver/ui/Box';\nimport Typography from '@massdriver/ui/Typography';\nimport Button from '@massdriver/ui/Button';\nimport IconButton from '@massdriver/ui/IconButton';\nimport CopyButton from '@massdriver/ui/CopyButton';\nimport Alert from '@massdriver/ui/Alert';\nimport LoadingIndicator from '@massdriver/ui/LoadingIndicator';\nimport DataList, { col } from '@massdriver/ui/DataList';\nimport stylin from '@massdriver/ui/stylin';\nimport CloseIcon from '@massdriver/ui/icons/CloseIcon';\nimport HistoryIcon from '@massdriver/ui/icons/HistoryIcon';\nimport { massdriverApiRef } from '../../../../api';\nimport InstanceStatusPill from '../../components/InstanceStatusPill';\nimport { composeInstanceStatus } from '../../../../utils/instanceStatuses';\nimport VersionBadge from '../../../../components/VersionBadge';\nimport ComparisonValueCell from '../../CompareEnvironmentsDialog/ComparisonValueCell';\nimport { DEPLOYMENT_QUERY } from '../queries';\nimport {\n formatAbsoluteDateTime,\n formatAttributeValue,\n formatDeploymentStatus,\n formatElapsed,\n deploymentHasLogs,\n formatRelativeTime,\n parseMap,\n parsePlanMessage,\n parseRollbackMessage,\n stripMessageContext,\n truncateDeploymentId,\n} from '../helpers';\nimport type { DeploymentDetail } from '../types';\nimport flattenParams from './flattenParams';\nimport { useOpenLogs } from './DeploymentLogsPanel';\nimport {\n DisabledApprovalCluster,\n DisabledRollbackButton,\n LogsButton,\n} from './DeploymentReadOnlyActions';\n\nconst renderValueCell = (_value: unknown, row: { value: unknown }) => (\n <ComparisonValueCell\n side={{ present: true, value: row.value }}\n isDifferent={false}\n isMissing={false}\n />\n);\n\nconst COLUMNS = [\n col.text('path', 'Path', {\n flex: 2,\n minWidth: 200,\n sortable: true,\n searchable: true,\n }),\n col.custom('value', 'Value', renderValueCell, {\n flex: 3,\n minWidth: 220,\n sortable: false,\n searchable: false,\n }),\n];\n\nconst buildHeading = (\n componentName?: string | null,\n statusLabel?: string,\n): string => {\n const verb =\n statusLabel && statusLabel !== '—' ? statusLabel.toLowerCase() : null;\n if (!componentName && !verb) return 'Deployment';\n if (!verb) return `${componentName} deployment`;\n return componentName ? `${componentName} · ${verb}` : verb;\n};\n\n/**\n * Read-only deployment detail panel. Fetches the full deployment snapshot and\n * renders a summary def-list, attributes, and a flattened params DataList. All\n * mutating actions are disabled (tooltip → Massdriver); \"View logs\" opens the\n * in-app read-only logs overlay (closing this dialog first, since the logs\n * overlay lives inside the drawer beneath this dialog's portal).\n */\nexport const ViewDeploymentDetails = ({\n deploymentId,\n onClose,\n onShowSource,\n}: {\n deploymentId: string | null;\n onClose: () => void;\n onShowSource: (sourceId: string) => void;\n}) => {\n const api = useApi(massdriverApiRef);\n const openLogs = useOpenLogs();\n const open = Boolean(deploymentId);\n\n const { value, loading, error } = useAsync(async () => {\n if (!deploymentId) return null;\n const data = (await api.query(DEPLOYMENT_QUERY, { id: deploymentId })) as {\n deployment: DeploymentDetail | null;\n };\n return data.deployment;\n }, [api, deploymentId]);\n\n const deployment = value;\n const paramRows = useMemo(\n () => flattenParams(deployment?.params),\n [deployment?.params],\n );\n\n const statusLabel = formatDeploymentStatus(\n deployment?.action,\n deployment?.status,\n );\n const componentName = deployment?.instance?.component?.name;\n const elapsed = formatElapsed(deployment?.elapsedTime);\n const occurredIso = deployment?.lastTransitionedAt ?? deployment?.createdAt;\n const time = formatRelativeTime(occurredIso);\n const absoluteDate = formatAbsoluteDateTime(occurredIso);\n const deployedBy = deployment?.deployedBy ?? 'system';\n const heading = buildHeading(componentName, statusLabel);\n\n const planSource =\n deployment?.action === 'PLAN'\n ? parsePlanMessage(deployment?.message)\n : null;\n const rollbackSource = parseRollbackMessage(deployment?.message);\n const displayMessage = stripMessageContext(deployment?.message);\n const isProposed = deployment?.status === 'PROPOSED';\n const isRollbackEligible =\n deployment?.action === 'PROVISION' && deployment?.status === 'COMPLETED';\n const hasLogs = deploymentHasLogs(deployment?.status);\n\n const handleViewLogs = () => {\n if (!deployment) return;\n onClose();\n openLogs(deployment.id);\n };\n\n const attributes = parseMap(deployment?.effectiveAttributes);\n const attributeEntries = attributes ? Object.entries(attributes) : [];\n\n return (\n <Dialog open={open} onClose={onClose} maxWidth=\"md\" fullWidth>\n <DialogHeader\n icon={<HistoryIcon />}\n actions={\n <IconButton onClick={onClose} aria-label=\"Close deployment details\">\n <CloseIcon />\n </IconButton>\n }\n >\n {heading}\n </DialogHeader>\n <Body>\n {loading ? (\n <Centered>\n <LoadingIndicator />\n </Centered>\n ) : error ? (\n <Alert severity=\"error\">{String(error.message ?? error)}</Alert>\n ) : deployment ? (\n <>\n <SummaryCard>\n <SummaryHeader>\n <SummaryHeaderLeft>\n <InstanceStatusPill\n status={composeInstanceStatus(\n deployment.action,\n deployment.status,\n )}\n onClick={hasLogs ? handleViewLogs : undefined}\n />\n {deployment.version ? (\n <VersionBadge version={deployment.version} />\n ) : null}\n </SummaryHeaderLeft>\n {isProposed ? (\n <DisabledApprovalCluster />\n ) : (\n <HeaderActions>\n {isRollbackEligible ? <DisabledRollbackButton /> : null}\n {hasLogs ? <LogsButton onClick={handleViewLogs} /> : null}\n </HeaderActions>\n )}\n </SummaryHeader>\n\n <DefList>\n <DefRow>\n <DefLabel>Status</DefLabel>\n <DefValue>{statusLabel}</DefValue>\n </DefRow>\n <DefRow>\n <DefLabel>Occurred</DefLabel>\n <DefValue>\n {time}\n {absoluteDate ? (\n <DefMuted>{` · ${absoluteDate}`}</DefMuted>\n ) : null}\n </DefValue>\n </DefRow>\n <DefRow>\n <DefLabel>Duration</DefLabel>\n <DefValue>{elapsed ?? '—'}</DefValue>\n </DefRow>\n <DefRow>\n <DefLabel>Deployed by</DefLabel>\n <DefValue>\n <strong>{deployedBy}</strong>\n </DefValue>\n </DefRow>\n <DefRow>\n <DefLabel>Deployment ID</DefLabel>\n <DefValue>\n <Mono>{deployment.id}</Mono>\n <CopyButton\n text={deployment.id}\n ariaLabel=\"Copy deployment ID\"\n />\n </DefValue>\n </DefRow>\n </DefList>\n\n {planSource ? (\n <PlanSourceBlock>\n <PlanSourceLink\n variant=\"text\"\n size=\"small\"\n onClick={() => onShowSource(planSource.sourceId)}\n >\n Planned deployment of{' '}\n {truncateDeploymentId(planSource.sourceId)}\n </PlanSourceLink>\n {displayMessage ? (\n <MessageQuote>\"{displayMessage}\"</MessageQuote>\n ) : null}\n </PlanSourceBlock>\n ) : rollbackSource ? (\n <PlanSourceBlock>\n <PlanSourceLink\n variant=\"text\"\n size=\"small\"\n onClick={() => onShowSource(rollbackSource.sourceId)}\n >\n {isProposed\n ? 'Proposed rollback to deployment'\n : 'Rollback to deployment'}{' '}\n {truncateDeploymentId(rollbackSource.sourceId)}\n {rollbackSource.version\n ? ` (v${rollbackSource.version})`\n : ''}\n </PlanSourceLink>\n {displayMessage ? (\n <MessageQuote>\"{displayMessage}\"</MessageQuote>\n ) : null}\n </PlanSourceBlock>\n ) : displayMessage ? (\n <MessageQuote>\"{displayMessage}\"</MessageQuote>\n ) : null}\n </SummaryCard>\n\n <Section>\n <SectionHeading variant=\"subtitle1\">Attributes</SectionHeading>\n <Card>\n {attributeEntries.length === 0 ? (\n <EmptyNote>No effective attributes.</EmptyNote>\n ) : (\n attributeEntries.map(([key, attrValue]) => (\n <RowLine key={key}>\n <MonoLabel title={key}>{key}</MonoLabel>\n <MonoValue title={formatAttributeValue(attrValue)}>\n {formatAttributeValue(attrValue)}\n </MonoValue>\n </RowLine>\n ))\n )}\n </Card>\n </Section>\n\n <Section>\n <SectionHeading variant=\"subtitle1\">\n Snapshot params\n </SectionHeading>\n <DataList\n rows={paramRows}\n columns={COLUMNS}\n searchable\n searchPlaceholder=\"Search path…\"\n defaultSort={{ field: 'path', direction: 'asc' }}\n defaultPageSize={5}\n variant=\"outlined\"\n size=\"small\"\n emptyMessage=\"No parameters captured for this deployment.\"\n />\n </Section>\n </>\n ) : null}\n </Body>\n <DialogActions>\n <Button variant=\"contained\" onClick={onClose}>\n Close\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default ViewDeploymentDetails;\n\nconst Body = stylin(DialogContent)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2),\n '& > *': {\n flexShrink: 0,\n },\n}));\n\nconst Centered = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n justifyContent: 'center',\n padding: theme.spacing(6),\n}));\n\nconst SummaryCard = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2.5),\n padding: theme.spacing(2.5, 3),\n borderRadius: 1,\n border: `1px solid ${theme.palette.divider}`,\n backgroundColor: theme.palette.background.paper,\n}));\n\nconst SummaryHeader = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n flexWrap: 'wrap',\n gap: theme.spacing(1.5),\n}));\n\nconst SummaryHeaderLeft = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: theme.spacing(1.5),\n}));\n\nconst HeaderActions = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n}));\n\nconst DefList = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1.25),\n}));\n\nconst DefRow = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'grid',\n gridTemplateColumns: `${theme.spacing(18)} 1fr`,\n alignItems: 'center',\n gap: theme.spacing(2),\n [theme.breakpoints.down('sm')]: {\n gridTemplateColumns: '1fr',\n gap: theme.spacing(0.25),\n },\n}));\n\nconst DefLabel = stylin(Typography)(({ theme }: { theme: any }) => ({\n color: theme.palette.text.secondary,\n fontSize: theme.typography.body2.fontSize,\n textTransform: 'uppercase',\n letterSpacing: '0.04em',\n fontWeight: theme.typography.fontWeightMedium,\n}));\n\nconst DefValue = stylin(Typography)(({ theme }: { theme: any }) => ({\n color: theme.palette.text.primary,\n fontSize: theme.typography.body1.fontSize,\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.75),\n minWidth: 0,\n}));\n\nconst DefMuted = stylin('span')(({ theme }: { theme: any }) => ({\n color: theme.palette.text.secondary,\n}));\n\nconst Mono = stylin('span')(({ theme }: { theme: any }) => ({\n fontFamily: theme.typography.fontFamilyMono,\n fontSize: theme.typography.body2.fontSize,\n color: theme.palette.text.primary,\n wordBreak: 'break-all',\n minWidth: 0,\n}));\n\nconst MessageQuote = stylin(Box)(({ theme }: { theme: any }) => ({\n fontStyle: 'italic',\n color: theme.palette.text.secondary,\n borderLeft: `3px solid ${theme.palette.divider}`,\n paddingLeft: theme.spacing(1.5),\n paddingTop: theme.spacing(0.5),\n paddingBottom: theme.spacing(0.5),\n}));\n\nconst PlanSourceBlock = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1),\n alignItems: 'flex-start',\n}));\n\nconst PlanSourceLink = stylin(Button)(({ theme }: { theme: any }) => ({\n alignSelf: 'flex-start',\n padding: theme.spacing(0.25, 1),\n marginLeft: theme.spacing(-1),\n}));\n\nconst Section = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1),\n}));\n\nconst SectionHeading = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontWeight: theme.typography.fontWeightBold,\n}));\n\nconst Card = stylin(Box)(({ theme }: { theme: any }) => ({\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: 1,\n padding: theme.spacing(1),\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(0.5),\n overflow: 'hidden',\n}));\n\nconst RowLine = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n flexWrap: 'wrap',\n minWidth: 0,\n}));\n\nconst MonoLabel = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(11),\n color: theme.palette.text.secondary,\n minWidth: 110,\n fontFamily: theme.typography.fontFamilyMono,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}));\n\nconst MonoValue = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(12),\n color: theme.palette.text.primary,\n fontFamily: theme.typography.fontFamilyMono,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n flex: 1,\n minWidth: 0,\n}));\n\nconst EmptyNote = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(12),\n color: theme.palette.text.secondary,\n fontStyle: 'italic',\n}));\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const flattenParams = (params, basePath = "") => {
|
|
2
|
+
if (basePath === "" && params == null) return [];
|
|
3
|
+
if (params === null || typeof params !== "object") {
|
|
4
|
+
return [{ id: basePath || "$", path: basePath || "$", value: params }];
|
|
5
|
+
}
|
|
6
|
+
if (Array.isArray(params)) {
|
|
7
|
+
if (params.length === 0) {
|
|
8
|
+
return [{ id: basePath || "$", path: basePath || "$", value: [] }];
|
|
9
|
+
}
|
|
10
|
+
return params.flatMap(
|
|
11
|
+
(item, index) => flattenParams(item, `${basePath}[${index}]`)
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
const record = params;
|
|
15
|
+
const keys = Object.keys(record);
|
|
16
|
+
if (keys.length === 0) {
|
|
17
|
+
return [{ id: basePath || "$", path: basePath || "$", value: {} }];
|
|
18
|
+
}
|
|
19
|
+
return keys.flatMap((key) => flattenParams(record[key], `${basePath}.${key}`));
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { flattenParams as default };
|
|
23
|
+
//# sourceMappingURL=flattenParams.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flattenParams.esm.js","sources":["../../../../../src/features/environment/InstanceDrawer/tabs/flattenParams.ts"],"sourcesContent":["// Walks a JSON object/array recursively and yields one row per leaf value.\n// Leaf rows have jq-style paths (e.g. `.database.port`, `.containers[0].image`)\n// — the same convention `compareDeployments` uses for `ParamComparison.path`,\n// keeping the detail panel's display consistent with the diff dialog. Ported\n// verbatim from the web app's ViewDeploymentDetailsDialog/flattenParams.js.\nexport interface ParamRow {\n id: string;\n path: string;\n value: unknown;\n}\n\nconst flattenParams = (params: unknown, basePath = ''): ParamRow[] => {\n if (basePath === '' && params == null) return [];\n if (params === null || typeof params !== 'object') {\n return [{ id: basePath || '$', path: basePath || '$', value: params }];\n }\n if (Array.isArray(params)) {\n if (params.length === 0) {\n return [{ id: basePath || '$', path: basePath || '$', value: [] }];\n }\n return params.flatMap((item, index) =>\n flattenParams(item, `${basePath}[${index}]`),\n );\n }\n const record = params as Record<string, unknown>;\n const keys = Object.keys(record);\n if (keys.length === 0) {\n return [{ id: basePath || '$', path: basePath || '$', value: {} }];\n }\n return keys.flatMap(key => flattenParams(record[key], `${basePath}.${key}`));\n};\n\nexport default flattenParams;\n"],"names":[],"mappings":"AAWA,MAAM,aAAA,GAAgB,CAAC,MAAA,EAAiB,QAAA,GAAW,EAAA,KAAmB;AACpE,EAAA,IAAI,QAAA,KAAa,EAAA,IAAM,MAAA,IAAU,IAAA,SAAa,EAAC;AAC/C,EAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,OAAO,MAAA,KAAW,QAAA,EAAU;AACjD,IAAA,OAAO,CAAC,EAAE,EAAA,EAAI,QAAA,IAAY,GAAA,EAAK,MAAM,QAAA,IAAY,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO,CAAC,EAAE,EAAA,EAAI,QAAA,IAAY,GAAA,EAAK,IAAA,EAAM,QAAA,IAAY,GAAA,EAAK,KAAA,EAAO,EAAC,EAAG,CAAA;AAAA,IACnE;AACA,IAAA,OAAO,MAAA,CAAO,OAAA;AAAA,MAAQ,CAAC,MAAM,KAAA,KAC3B,aAAA,CAAc,MAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG;AAAA,KAC7C;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,MAAA;AACf,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAC/B,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,CAAC,EAAE,EAAA,EAAI,QAAA,IAAY,GAAA,EAAK,IAAA,EAAM,QAAA,IAAY,GAAA,EAAK,KAAA,EAAO,EAAC,EAAG,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,GAAA,KAAO,aAAA,CAAc,MAAA,CAAO,GAAG,CAAA,EAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAC,CAAA;AAC7E;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useInstanceApiQuery.esm.js","sources":["../../../../src/features/environment/InstanceDrawer/useInstanceApiQuery.ts"],"sourcesContent":["import { useLiveRelayQuery } from '../realtime/useLiveRelayQuery';\n\n// Thin relay-query wrapper shared by every drawer tab. Skips when there is no\n// instance id yet (drawer closed / unresolved). Stays live through the\n// environment's realtime revision: revision refetches keep the previous result\n// rendered (no loading flash), while switching instances resets to a fresh\n// loading state — see useLiveRelayQuery.\nexport const useInstanceApiQuery = <T>(query: string, id: string | null) =>\n useLiveRelayQuery<T>(query, id ? { id } : null);\n"],"names":[],"mappings":";;AAOO,MAAM,mBAAA,GAAsB,CAAI,KAAA,EAAe,EAAA,KACpD,iBAAA,CAAqB,OAAO,EAAA,GAAK,EAAE,EAAA,EAAG,GAAI,IAAI;;;;"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { useState, useRef, useCallback, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
const useOverflowMeasure = ({
|
|
4
|
+
itemCount,
|
|
5
|
+
minVisible,
|
|
6
|
+
moreButtonWidth
|
|
7
|
+
}) => {
|
|
8
|
+
const [visibleCount, setVisibleCount] = useState(itemCount);
|
|
9
|
+
const [measured, setMeasured] = useState(false);
|
|
10
|
+
const containerRef = useRef(null);
|
|
11
|
+
const tabWidthsRef = useRef([]);
|
|
12
|
+
const measure = useCallback(() => {
|
|
13
|
+
const container = containerRef.current;
|
|
14
|
+
if (!container) return;
|
|
15
|
+
if (tabWidthsRef.current.length === 0) {
|
|
16
|
+
const tabElements = container.querySelectorAll('[role="tab"]');
|
|
17
|
+
if (tabElements.length === 0) return;
|
|
18
|
+
tabWidthsRef.current = Array.from(tabElements).map(
|
|
19
|
+
(element) => element.getBoundingClientRect().width
|
|
20
|
+
);
|
|
21
|
+
setMeasured(true);
|
|
22
|
+
}
|
|
23
|
+
const widths = tabWidthsRef.current;
|
|
24
|
+
const containerWidth = container.getBoundingClientRect().width;
|
|
25
|
+
let usedWidth = 0;
|
|
26
|
+
let count = 0;
|
|
27
|
+
for (let index = 0; index < widths.length; index++) {
|
|
28
|
+
const remaining = widths.length - count;
|
|
29
|
+
const needsMore = remaining > 1;
|
|
30
|
+
const budget = needsMore ? containerWidth - moreButtonWidth : containerWidth;
|
|
31
|
+
if (usedWidth + widths[index] <= budget) {
|
|
32
|
+
usedWidth += widths[index];
|
|
33
|
+
count++;
|
|
34
|
+
} else {
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const minFitWidth = widths.slice(0, minVisible).reduce((sum, width) => sum + width, 0);
|
|
39
|
+
const minFitsWithMore = containerWidth - moreButtonWidth >= minFitWidth;
|
|
40
|
+
const floor = minFitsWithMore ? minVisible : count;
|
|
41
|
+
setVisibleCount(Math.max(floor, count));
|
|
42
|
+
}, [minVisible, moreButtonWidth]);
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
const container = containerRef.current;
|
|
45
|
+
if (!container) return void 0;
|
|
46
|
+
const observer = new ResizeObserver(measure);
|
|
47
|
+
observer.observe(container);
|
|
48
|
+
requestAnimationFrame(measure);
|
|
49
|
+
return () => observer.disconnect();
|
|
50
|
+
}, [measure]);
|
|
51
|
+
return { containerRef, visibleCount, measured };
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export { useOverflowMeasure };
|
|
55
|
+
//# sourceMappingURL=useOverflowMeasure.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOverflowMeasure.esm.js","sources":["../../../../src/features/environment/InstanceDrawer/useOverflowMeasure.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\n/**\n * Measures rendered tab widths against the container and returns how many tabs\n * fit before overflowing into a \"more\" menu. Ported from the web app's\n * `features/environments/components/InstanceTabs/useOverflowMeasure.js`.\n */\nexport const useOverflowMeasure = ({\n itemCount,\n minVisible,\n moreButtonWidth,\n}: {\n itemCount: number;\n minVisible: number;\n moreButtonWidth: number;\n}) => {\n const [visibleCount, setVisibleCount] = useState(itemCount);\n const [measured, setMeasured] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const tabWidthsRef = useRef<number[]>([]);\n\n const measure = useCallback(() => {\n const container = containerRef.current;\n if (!container) return;\n\n if (tabWidthsRef.current.length === 0) {\n const tabElements = container.querySelectorAll('[role=\"tab\"]');\n if (tabElements.length === 0) return;\n tabWidthsRef.current = Array.from(tabElements).map(\n element => element.getBoundingClientRect().width,\n );\n setMeasured(true);\n }\n\n const widths = tabWidthsRef.current;\n const containerWidth = container.getBoundingClientRect().width;\n let usedWidth = 0;\n let count = 0;\n\n for (let index = 0; index < widths.length; index++) {\n const remaining = widths.length - count;\n const needsMore = remaining > 1;\n const budget = needsMore\n ? containerWidth - moreButtonWidth\n : containerWidth;\n\n if (usedWidth + widths[index] <= budget) {\n usedWidth += widths[index];\n count++;\n } else {\n break;\n }\n }\n\n const minFitWidth = widths\n .slice(0, minVisible)\n .reduce((sum, width) => sum + width, 0);\n const minFitsWithMore = containerWidth - moreButtonWidth >= minFitWidth;\n const floor = minFitsWithMore ? minVisible : count;\n\n setVisibleCount(Math.max(floor, count));\n }, [minVisible, moreButtonWidth]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return undefined;\n\n const observer = new ResizeObserver(measure);\n observer.observe(container);\n requestAnimationFrame(measure);\n\n return () => observer.disconnect();\n }, [measure]);\n\n return { containerRef, visibleCount, measured };\n};\n\nexport default useOverflowMeasure;\n"],"names":[],"mappings":";;AAOO,MAAM,qBAAqB,CAAC;AAAA,EACjC,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,KAIM;AACJ,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,SAAS,CAAA;AAC1D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,YAAA,GAAe,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,YAAA,GAAe,MAAA,CAAiB,EAAE,CAAA;AAExC,EAAA,MAAM,OAAA,GAAU,YAAY,MAAM;AAChC,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,IAAI,YAAA,CAAa,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACrC,MAAA,MAAM,WAAA,GAAc,SAAA,CAAU,gBAAA,CAAiB,cAAc,CAAA;AAC7D,MAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC9B,MAAA,YAAA,CAAa,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA,CAAE,GAAA;AAAA,QAC7C,CAAA,OAAA,KAAW,OAAA,CAAQ,qBAAA,EAAsB,CAAE;AAAA,OAC7C;AACA,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,IAClB;AAEA,IAAA,MAAM,SAAS,YAAA,CAAa,OAAA;AAC5B,IAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,qBAAA,EAAsB,CAAE,KAAA;AACzD,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,MAAA,CAAO,QAAQ,KAAA,EAAA,EAAS;AAClD,MAAA,MAAM,SAAA,GAAY,OAAO,MAAA,GAAS,KAAA;AAClC,MAAA,MAAM,YAAY,SAAA,GAAY,CAAA;AAC9B,MAAA,MAAM,MAAA,GAAS,SAAA,GACX,cAAA,GAAiB,eAAA,GACjB,cAAA;AAEJ,MAAA,IAAI,SAAA,GAAY,MAAA,CAAO,KAAK,CAAA,IAAK,MAAA,EAAQ;AACvC,QAAA,SAAA,IAAa,OAAO,KAAK,CAAA;AACzB,QAAA,KAAA,EAAA;AAAA,MACF,CAAA,MAAO;AACL,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,MAAA,CACjB,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA,CACnB,MAAA,CAAO,CAAC,GAAA,EAAK,KAAA,KAAU,GAAA,GAAM,KAAA,EAAO,CAAC,CAAA;AACxC,IAAA,MAAM,eAAA,GAAkB,iBAAiB,eAAA,IAAmB,WAAA;AAC5D,IAAA,MAAM,KAAA,GAAQ,kBAAkB,UAAA,GAAa,KAAA;AAE7C,IAAA,eAAA,CAAgB,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,EACxC,CAAA,EAAG,CAAC,UAAA,EAAY,eAAe,CAAC,CAAA;AAEhC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,WAAW,OAAO,MAAA;AAEvB,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,OAAO,CAAA;AAC3C,IAAA,QAAA,CAAS,QAAQ,SAAS,CAAA;AAC1B,IAAA,qBAAA,CAAsB,OAAO,CAAA;AAE7B,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,EAAE,YAAA,EAAc,YAAA,EAAc,QAAA,EAAS;AAChD;;;;"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { useState, useRef, useCallback, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
const useResizableWidth = ({
|
|
4
|
+
defaultWidth = 720,
|
|
5
|
+
minWidth = 575
|
|
6
|
+
} = {}) => {
|
|
7
|
+
const [width, setWidth] = useState(defaultWidth);
|
|
8
|
+
const panelRef = useRef(null);
|
|
9
|
+
const dragging = useRef(false);
|
|
10
|
+
const onMouseMove = useCallback(
|
|
11
|
+
(event) => {
|
|
12
|
+
if (!dragging.current) return;
|
|
13
|
+
const parent = panelRef.current?.parentElement;
|
|
14
|
+
const rect = parent?.getBoundingClientRect();
|
|
15
|
+
const max = rect ? rect.width : window.innerWidth;
|
|
16
|
+
const next = rect ? rect.right - event.clientX : window.innerWidth - event.clientX;
|
|
17
|
+
setWidth(Math.min(max, Math.max(minWidth, next)));
|
|
18
|
+
},
|
|
19
|
+
[minWidth]
|
|
20
|
+
);
|
|
21
|
+
const onMouseUp = useCallback(() => {
|
|
22
|
+
dragging.current = false;
|
|
23
|
+
document.body.style.cursor = "";
|
|
24
|
+
document.body.style.userSelect = "";
|
|
25
|
+
}, []);
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
document.addEventListener("mousemove", onMouseMove);
|
|
28
|
+
document.addEventListener("mouseup", onMouseUp);
|
|
29
|
+
return () => {
|
|
30
|
+
document.removeEventListener("mousemove", onMouseMove);
|
|
31
|
+
document.removeEventListener("mouseup", onMouseUp);
|
|
32
|
+
};
|
|
33
|
+
}, [onMouseMove, onMouseUp]);
|
|
34
|
+
const onResizeStart = useCallback((event) => {
|
|
35
|
+
event.preventDefault();
|
|
36
|
+
dragging.current = true;
|
|
37
|
+
document.body.style.cursor = "col-resize";
|
|
38
|
+
document.body.style.userSelect = "none";
|
|
39
|
+
}, []);
|
|
40
|
+
return { width, panelRef, onResizeStart };
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export { useResizableWidth };
|
|
44
|
+
//# sourceMappingURL=useResizableWidth.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useResizableWidth.esm.js","sources":["../../../../src/features/environment/InstanceDrawer/useResizableWidth.ts"],"sourcesContent":["import {\n MouseEvent as ReactMouseEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\n/**\n * Drag-to-resize width for the right-anchored instance panel. Mirrors the\n * `@massdriver/ui/Drawer` `useResizable` behaviour (which we can't use directly\n * because MUI's Drawer doesn't paint inside Backstage). Clamps between\n * `minWidth` and the panel's positioned parent width.\n */\nexport const useResizableWidth = ({\n defaultWidth = 720,\n minWidth = 575,\n}: {\n defaultWidth?: number;\n minWidth?: number;\n} = {}) => {\n const [width, setWidth] = useState(defaultWidth);\n const panelRef = useRef<HTMLDivElement>(null);\n const dragging = useRef(false);\n\n const onMouseMove = useCallback(\n (event: globalThis.MouseEvent) => {\n if (!dragging.current) return;\n const parent = panelRef.current?.parentElement;\n const rect = parent?.getBoundingClientRect();\n const max = rect ? rect.width : window.innerWidth;\n const next = rect\n ? rect.right - event.clientX\n : window.innerWidth - event.clientX;\n setWidth(Math.min(max, Math.max(minWidth, next)));\n },\n [minWidth],\n );\n\n const onMouseUp = useCallback(() => {\n dragging.current = false;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }, []);\n\n useEffect(() => {\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n return () => {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n }, [onMouseMove, onMouseUp]);\n\n const onResizeStart = useCallback((event: ReactMouseEvent) => {\n event.preventDefault();\n dragging.current = true;\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }, []);\n\n return { width, panelRef, onResizeStart };\n};\n\nexport default useResizableWidth;\n"],"names":[],"mappings":";;AAcO,MAAM,oBAAoB,CAAC;AAAA,EAChC,YAAA,GAAe,GAAA;AAAA,EACf,QAAA,GAAW;AACb,CAAA,GAGI,EAAC,KAAM;AACT,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,YAAY,CAAA;AAC/C,EAAA,MAAM,QAAA,GAAW,OAAuB,IAAI,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAE7B,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IAClB,CAAC,KAAA,KAAiC;AAChC,MAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACvB,MAAA,MAAM,MAAA,GAAS,SAAS,OAAA,EAAS,aAAA;AACjC,MAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAC3C,MAAA,MAAM,GAAA,GAAM,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,MAAA,CAAO,UAAA;AACvC,MAAA,MAAM,IAAA,GAAO,OACT,IAAA,CAAK,KAAA,GAAQ,MAAM,OAAA,GACnB,MAAA,CAAO,aAAa,KAAA,CAAM,OAAA;AAC9B,MAAA,QAAA,CAAS,IAAA,CAAK,IAAI,GAAA,EAAK,IAAA,CAAK,IAAI,QAAA,EAAU,IAAI,CAAC,CAAC,CAAA;AAAA,IAClD,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,SAAA,GAAY,YAAY,MAAM;AAClC,IAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AACnB,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,MAAA,GAAS,EAAA;AAC7B,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,UAAA,GAAa,EAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,WAAW,CAAA;AAClD,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC9C,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACrD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAAA,IACnD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,SAAS,CAAC,CAAA;AAE3B,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,KAAA,KAA2B;AAC5D,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,MAAA,GAAS,YAAA;AAC7B,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,UAAA,GAAa,MAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,aAAA,EAAc;AAC1C;;;;"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { InstanceStatusPill as InstanceStatusPill$1 } from '../../../components/InstanceStatusPill.esm.js';
|
|
3
|
+
import { useLiveRelayQuery } from '../realtime/useLiveRelayQuery.esm.js';
|
|
4
|
+
import { deriveInstanceStatus } from '../../../utils/instanceStatuses.esm.js';
|
|
5
|
+
|
|
6
|
+
const LATEST_INSTANCE_DEPLOYMENT_QUERY = `
|
|
7
|
+
query MassdriverLatestInstanceDeployment(
|
|
8
|
+
$organizationId: ID!
|
|
9
|
+
$instanceId: ID!
|
|
10
|
+
) {
|
|
11
|
+
deployments(
|
|
12
|
+
organizationId: $organizationId
|
|
13
|
+
filter: { instanceId: { eq: $instanceId } }
|
|
14
|
+
sort: { field: CREATED_AT, order: DESC }
|
|
15
|
+
cursor: { limit: 1 }
|
|
16
|
+
) {
|
|
17
|
+
items {
|
|
18
|
+
id
|
|
19
|
+
action
|
|
20
|
+
status
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
`;
|
|
25
|
+
const InstanceStatusPill = ({
|
|
26
|
+
instance,
|
|
27
|
+
status,
|
|
28
|
+
onClick,
|
|
29
|
+
size = "small",
|
|
30
|
+
...props
|
|
31
|
+
}) => {
|
|
32
|
+
const { value } = useLiveRelayQuery(
|
|
33
|
+
LATEST_INSTANCE_DEPLOYMENT_QUERY,
|
|
34
|
+
instance?.id ? { instanceId: instance.id } : null
|
|
35
|
+
);
|
|
36
|
+
const latestDeployment = value?.deployments?.items?.[0] ?? null;
|
|
37
|
+
const resolvedStatus = instance ? deriveInstanceStatus({
|
|
38
|
+
instanceStatus: instance.status,
|
|
39
|
+
latestDeploymentAction: latestDeployment?.action,
|
|
40
|
+
latestDeploymentStatus: latestDeployment?.status
|
|
41
|
+
}) : status ?? null;
|
|
42
|
+
return /* @__PURE__ */ jsx(
|
|
43
|
+
InstanceStatusPill$1,
|
|
44
|
+
{
|
|
45
|
+
status: resolvedStatus,
|
|
46
|
+
size,
|
|
47
|
+
onClick: onClick ? () => onClick(instance ? latestDeployment : null) : void 0,
|
|
48
|
+
...props
|
|
49
|
+
}
|
|
50
|
+
);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export { InstanceStatusPill as default };
|
|
54
|
+
//# sourceMappingURL=InstanceStatusPill.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InstanceStatusPill.esm.js","sources":["../../../../src/features/environment/components/InstanceStatusPill.tsx"],"sourcesContent":["import { InstanceStatusPill as StatusPillBase } from '../../../components/InstanceStatusPill';\nimport { useLiveRelayQuery } from '../realtime/useLiveRelayQuery';\nimport { deriveInstanceStatus } from '../../../utils/instanceStatuses';\n\n// Latest deployment (any action/status) for an instance — drives the pill's\n// in-flight compound statuses, mirroring the web app's\n// useLatestInstanceDeployment. Being a live relay query, it refetches on every\n// realtime revision bump, so a running provision flips the pill to\n// \"provision running\" and back without a reload.\nconst LATEST_INSTANCE_DEPLOYMENT_QUERY = `\n query MassdriverLatestInstanceDeployment(\n $organizationId: ID!\n $instanceId: ID!\n ) {\n deployments(\n organizationId: $organizationId\n filter: { instanceId: { eq: $instanceId } }\n sort: { field: CREATED_AT, order: DESC }\n cursor: { limit: 1 }\n ) {\n items {\n id\n action\n status\n }\n }\n }\n`;\n\ninterface LatestDeploymentResult {\n deployments: {\n items?: Array<{\n id: string;\n action?: string | null;\n status?: string | null;\n } | null> | null;\n } | null;\n}\n\n/**\n * Instance status chip, ported from the web app's InstanceStatusPill.\n *\n * Two modes, mirroring the web app's container:\n * - `instance={{ id, status }}` — fetches the instance's latest deployment and\n * derives the rendered status (an active deployment shows as a compound like\n * PROVISION_RUNNING; otherwise the stored status). Degrades silently to the\n * bare status while the deployment query is loading or errors.\n * - `status=\"...\"` — renders the given static or compound status as-is. Callers\n * that already hold a deployment's action+status compose it themselves via\n * `composeInstanceStatus` (the web app's per-deployment mode re-queries by\n * id, which is free under Apollo's cache but would be one HTTP request per\n * row through the relay).\n *\n * `onClick` receives the resolved deployment (instance mode's latest\n * deployment; null in status mode — callers there close over their own row).\n * The pill is only clickable while the status is actionable (a deployment in\n * flight or failed), mirroring the web app's click-to-logs affordance.\n */\nexport interface ResolvedDeployment {\n id: string;\n action?: string | null;\n status?: string | null;\n}\n\nconst InstanceStatusPill = ({\n instance,\n status,\n onClick,\n size = 'small',\n ...props\n}: {\n instance?: { id: string; status?: string | null } | null;\n status?: string | null;\n onClick?: (deployment: ResolvedDeployment | null) => void;\n size?: string;\n [key: string]: unknown;\n}) => {\n const { value } = useLiveRelayQuery<LatestDeploymentResult>(\n LATEST_INSTANCE_DEPLOYMENT_QUERY,\n instance?.id ? { instanceId: instance.id } : null,\n );\n const latestDeployment = value?.deployments?.items?.[0] ?? null;\n\n const resolvedStatus = instance\n ? deriveInstanceStatus({\n instanceStatus: instance.status,\n latestDeploymentAction: latestDeployment?.action,\n latestDeploymentStatus: latestDeployment?.status,\n })\n : status ?? null;\n\n // The presentational base (components/InstanceStatusPill) owns the rendering\n // and the actionable-only clickability gate; this wrapper resolves the live\n // status and hands the resolved deployment to the click handler.\n return (\n <StatusPillBase\n status={resolvedStatus}\n size={size}\n onClick={\n onClick ? () => onClick(instance ? latestDeployment : null) : undefined\n }\n {...props}\n />\n );\n};\n\nexport default InstanceStatusPill;\n"],"names":["StatusPillBase"],"mappings":";;;;;AASA,MAAM,gCAAA,GAAmC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAuDzC,MAAM,qBAAqB,CAAC;AAAA,EAC1B,QAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA,GAAO,OAAA;AAAA,EACP,GAAG;AACL,CAAA,KAMM;AACJ,EAAA,MAAM,EAAE,OAAM,GAAI,iBAAA;AAAA,IAChB,gCAAA;AAAA,IACA,UAAU,EAAA,GAAK,EAAE,UAAA,EAAY,QAAA,CAAS,IAAG,GAAI;AAAA,GAC/C;AACA,EAAA,MAAM,gBAAA,GAAmB,KAAA,EAAO,WAAA,EAAa,KAAA,GAAQ,CAAC,CAAA,IAAK,IAAA;AAE3D,EAAA,MAAM,cAAA,GAAiB,WACnB,oBAAA,CAAqB;AAAA,IACnB,gBAAgB,QAAA,CAAS,MAAA;AAAA,IACzB,wBAAwB,gBAAA,EAAkB,MAAA;AAAA,IAC1C,wBAAwB,gBAAA,EAAkB;AAAA,GAC3C,IACD,MAAA,IAAU,IAAA;AAKd,EAAA,uBACE,GAAA;AAAA,IAACA,oBAAA;AAAA,IAAA;AAAA,MACC,MAAA,EAAQ,cAAA;AAAA,MACR,IAAA;AAAA,MACA,SACE,OAAA,GAAU,MAAM,QAAQ,QAAA,GAAW,gBAAA,GAAmB,IAAI,CAAA,GAAI,MAAA;AAAA,MAE/D,GAAG;AAAA;AAAA,GACN;AAEJ;;;;"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useMemo, useRef, useEffect } from 'react';
|
|
3
|
+
import { useNodesState, useEdgesState, ReactFlow, Background, ControlButton, MiniMap, Controls } from '@xyflow/react';
|
|
4
|
+
import '@xyflow/react/dist/style.css';
|
|
5
|
+
import Box from '@massdriver/ui/Box';
|
|
6
|
+
import DownloadIcon from '@massdriver/ui/icons/DownloadIcon';
|
|
7
|
+
import stylin from '@massdriver/ui/stylin';
|
|
8
|
+
import DiagramNode from './DiagramNode.esm.js';
|
|
9
|
+
import useDiagramSnapshot from './useDiagramSnapshot.esm.js';
|
|
10
|
+
|
|
11
|
+
const NODE_TYPES = { DiagramNode };
|
|
12
|
+
const FIT_VIEW_OPTIONS = {
|
|
13
|
+
padding: 1,
|
|
14
|
+
minZoom: 0.3,
|
|
15
|
+
maxZoom: 1
|
|
16
|
+
};
|
|
17
|
+
const Diagram = ({
|
|
18
|
+
nodes: initialNodes,
|
|
19
|
+
edges: initialEdges,
|
|
20
|
+
snapshotName = "environment",
|
|
21
|
+
onNodeClick,
|
|
22
|
+
onPaneClick,
|
|
23
|
+
selectedComponentId
|
|
24
|
+
}) => {
|
|
25
|
+
const nodeTypes = useMemo(() => NODE_TYPES, []);
|
|
26
|
+
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
|
|
27
|
+
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
|
|
28
|
+
const wrapperRef = useRef(null);
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
setNodes(
|
|
31
|
+
initialNodes.map((node) => ({
|
|
32
|
+
...node,
|
|
33
|
+
data: {
|
|
34
|
+
...node.data,
|
|
35
|
+
isSelected: Boolean(
|
|
36
|
+
selectedComponentId && node.data?.id === selectedComponentId
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
}))
|
|
40
|
+
);
|
|
41
|
+
}, [initialNodes, selectedComponentId, setNodes]);
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
setEdges(initialEdges);
|
|
44
|
+
}, [initialEdges, setEdges]);
|
|
45
|
+
const { onSnapshotClick, isSnapshotting } = useDiagramSnapshot({
|
|
46
|
+
wrapperRef,
|
|
47
|
+
fileNameBase: snapshotName
|
|
48
|
+
});
|
|
49
|
+
const handleNodeClick = (_event, node) => {
|
|
50
|
+
const scopedComponentId = node?.data?.id;
|
|
51
|
+
if (scopedComponentId) onNodeClick?.(scopedComponentId);
|
|
52
|
+
};
|
|
53
|
+
return /* @__PURE__ */ jsx(DiagramWrapper, { ref: wrapperRef, children: /* @__PURE__ */ jsxs(
|
|
54
|
+
ReactFlow,
|
|
55
|
+
{
|
|
56
|
+
nodes,
|
|
57
|
+
edges,
|
|
58
|
+
nodeTypes,
|
|
59
|
+
onNodesChange,
|
|
60
|
+
onEdgesChange,
|
|
61
|
+
onNodeClick: handleNodeClick,
|
|
62
|
+
onPaneClick: onPaneClick ? () => onPaneClick() : void 0,
|
|
63
|
+
nodesDraggable: false,
|
|
64
|
+
nodesConnectable: false,
|
|
65
|
+
elementsSelectable: false,
|
|
66
|
+
multiSelectionKeyCode: null,
|
|
67
|
+
selectionKeyCode: null,
|
|
68
|
+
minZoom: 0.2,
|
|
69
|
+
maxZoom: 2,
|
|
70
|
+
fitView: true,
|
|
71
|
+
fitViewOptions: FIT_VIEW_OPTIONS,
|
|
72
|
+
children: [
|
|
73
|
+
/* @__PURE__ */ jsx(Background, { color: "#aaa", gap: 16 }),
|
|
74
|
+
/* @__PURE__ */ jsx(StyledMiniMap, { pannable: true, zoomable: true }),
|
|
75
|
+
/* @__PURE__ */ jsx(StyledControls, { showInteractive: false, children: /* @__PURE__ */ jsx(
|
|
76
|
+
ControlButton,
|
|
77
|
+
{
|
|
78
|
+
onClick: onSnapshotClick,
|
|
79
|
+
disabled: isSnapshotting,
|
|
80
|
+
title: "Download snapshot",
|
|
81
|
+
"aria-label": "Download diagram snapshot",
|
|
82
|
+
children: /* @__PURE__ */ jsx(DownloadIcon, {})
|
|
83
|
+
}
|
|
84
|
+
) })
|
|
85
|
+
]
|
|
86
|
+
}
|
|
87
|
+
) });
|
|
88
|
+
};
|
|
89
|
+
const DiagramWrapper = stylin(Box)({
|
|
90
|
+
width: "100%",
|
|
91
|
+
height: "100%",
|
|
92
|
+
position: "relative"
|
|
93
|
+
});
|
|
94
|
+
const StyledControls = stylin(Controls)(({ theme }) => ({
|
|
95
|
+
"&.react-flow__controls": {
|
|
96
|
+
boxShadow: theme.custom.shadows.cardSm,
|
|
97
|
+
borderRadius: theme.custom.general.borderRadius,
|
|
98
|
+
border: `1px solid ${theme.palette.divider}`,
|
|
99
|
+
overflow: "hidden",
|
|
100
|
+
".react-flow__controls-button": {
|
|
101
|
+
backgroundColor: theme.palette.background.paper,
|
|
102
|
+
borderBottom: `1px solid ${theme.palette.divider}`,
|
|
103
|
+
color: theme.palette.text.secondary,
|
|
104
|
+
width: theme.spacing(3.5),
|
|
105
|
+
height: theme.spacing(3.5),
|
|
106
|
+
padding: 0,
|
|
107
|
+
"&:hover": {
|
|
108
|
+
backgroundColor: theme.palette.action.hover
|
|
109
|
+
},
|
|
110
|
+
"&:last-child": {
|
|
111
|
+
borderBottom: "none"
|
|
112
|
+
},
|
|
113
|
+
"&:disabled": {
|
|
114
|
+
opacity: 0.5,
|
|
115
|
+
cursor: "not-allowed"
|
|
116
|
+
},
|
|
117
|
+
svg: {
|
|
118
|
+
fill: theme.palette.text.secondary,
|
|
119
|
+
maxWidth: theme.spacing(1.75),
|
|
120
|
+
maxHeight: theme.spacing(1.75)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}));
|
|
125
|
+
const StyledMiniMap = stylin(MiniMap)(({ theme }) => ({
|
|
126
|
+
"&.react-flow__minimap": {
|
|
127
|
+
backgroundColor: theme.palette.background.paper,
|
|
128
|
+
boxShadow: theme.custom.shadows.cardSm,
|
|
129
|
+
borderRadius: theme.custom.general.borderRadius,
|
|
130
|
+
border: `1px solid ${theme.palette.divider}`,
|
|
131
|
+
overflow: "hidden",
|
|
132
|
+
".react-flow__minimap-mask": {
|
|
133
|
+
fill: theme.palette.mode === "dark" ? "rgba(0, 0, 0, 0.5)" : "rgba(240, 240, 240, 0.6)"
|
|
134
|
+
},
|
|
135
|
+
".react-flow__minimap-node": {
|
|
136
|
+
fill: theme.palette.text.secondary,
|
|
137
|
+
stroke: "none"
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}));
|
|
141
|
+
|
|
142
|
+
export { Diagram as default };
|
|
143
|
+
//# sourceMappingURL=Diagram.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Diagram.esm.js","sources":["../../../../src/features/environment/graph/Diagram.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef } from 'react';\nimport {\n Background,\n Controls,\n ControlButton,\n MiniMap,\n ReactFlow,\n useEdgesState,\n useNodesState,\n type Edge,\n} from '@xyflow/react';\nimport '@xyflow/react/dist/style.css';\nimport Box from '@massdriver/ui/Box';\nimport DownloadIcon from '@massdriver/ui/icons/DownloadIcon';\nimport stylin from '@massdriver/ui/stylin';\nimport DiagramNode from './DiagramNode';\nimport useDiagramSnapshot from './useDiagramSnapshot';\nimport type { DiagramNodeType } from './diagramFactory';\n\nconst NODE_TYPES = { DiagramNode };\n\nconst FIT_VIEW_OPTIONS = {\n padding: 1,\n minZoom: 0.3,\n maxZoom: 1,\n};\n\n/** Read-only React Flow canvas for an environment's instances and links. */\nconst Diagram = ({\n nodes: initialNodes,\n edges: initialEdges,\n snapshotName = 'environment',\n onNodeClick,\n onPaneClick,\n selectedComponentId,\n}: {\n nodes: DiagramNodeType[];\n edges: Edge[];\n snapshotName?: string;\n onNodeClick?: (scopedComponentId: string) => void;\n onPaneClick?: () => void;\n selectedComponentId?: string;\n}) => {\n const nodeTypes = useMemo(() => NODE_TYPES, []);\n const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);\n const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n // Reseed when the fetched blueprint changes, marking the open instance's node\n // selected (the node styles its own border off `data.isSelected`).\n useEffect(() => {\n setNodes(\n initialNodes.map(node => ({\n ...node,\n data: {\n ...node.data,\n isSelected: Boolean(\n selectedComponentId && node.data?.id === selectedComponentId,\n ),\n },\n })),\n );\n }, [initialNodes, selectedComponentId, setNodes]);\n useEffect(() => {\n setEdges(initialEdges);\n }, [initialEdges, setEdges]);\n\n const { onSnapshotClick, isSnapshotting } = useDiagramSnapshot({\n wrapperRef,\n fileNameBase: snapshotName,\n });\n\n const handleNodeClick = (\n _event: unknown,\n node: { data?: { id?: string } },\n ) => {\n const scopedComponentId = node?.data?.id;\n if (scopedComponentId) onNodeClick?.(scopedComponentId);\n };\n\n return (\n <DiagramWrapper ref={wrapperRef}>\n <ReactFlow\n nodes={nodes}\n edges={edges}\n nodeTypes={nodeTypes}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onNodeClick={handleNodeClick}\n onPaneClick={onPaneClick ? () => onPaneClick() : undefined}\n nodesDraggable={false}\n nodesConnectable={false}\n elementsSelectable={false}\n multiSelectionKeyCode={null}\n selectionKeyCode={null}\n minZoom={0.2}\n maxZoom={2}\n fitView\n fitViewOptions={FIT_VIEW_OPTIONS}\n >\n <Background color=\"#aaa\" gap={16} />\n <StyledMiniMap pannable zoomable />\n <StyledControls showInteractive={false}>\n <ControlButton\n onClick={onSnapshotClick}\n disabled={isSnapshotting}\n title=\"Download snapshot\"\n aria-label=\"Download diagram snapshot\"\n >\n <DownloadIcon />\n </ControlButton>\n </StyledControls>\n </ReactFlow>\n </DiagramWrapper>\n );\n};\n\nexport default Diagram;\n\nconst DiagramWrapper = stylin(Box)({\n width: '100%',\n height: '100%',\n position: 'relative',\n});\n\nconst StyledControls = stylin(Controls)(({ theme }: { theme: any }) => ({\n '&.react-flow__controls': {\n boxShadow: theme.custom.shadows.cardSm,\n borderRadius: theme.custom.general.borderRadius,\n border: `1px solid ${theme.palette.divider}`,\n overflow: 'hidden',\n\n '.react-flow__controls-button': {\n backgroundColor: theme.palette.background.paper,\n borderBottom: `1px solid ${theme.palette.divider}`,\n color: theme.palette.text.secondary,\n width: theme.spacing(3.5),\n height: theme.spacing(3.5),\n padding: 0,\n\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n\n '&:last-child': {\n borderBottom: 'none',\n },\n\n '&:disabled': {\n opacity: 0.5,\n cursor: 'not-allowed',\n },\n\n svg: {\n fill: theme.palette.text.secondary,\n maxWidth: theme.spacing(1.75),\n maxHeight: theme.spacing(1.75),\n },\n },\n },\n}));\n\nconst StyledMiniMap = stylin(MiniMap)(({ theme }: { theme: any }) => ({\n '&.react-flow__minimap': {\n backgroundColor: theme.palette.background.paper,\n boxShadow: theme.custom.shadows.cardSm,\n borderRadius: theme.custom.general.borderRadius,\n border: `1px solid ${theme.palette.divider}`,\n overflow: 'hidden',\n\n '.react-flow__minimap-mask': {\n fill:\n theme.palette.mode === 'dark'\n ? 'rgba(0, 0, 0, 0.5)'\n : 'rgba(240, 240, 240, 0.6)',\n },\n\n '.react-flow__minimap-node': {\n fill: theme.palette.text.secondary,\n stroke: 'none',\n },\n },\n}));\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiagramNode.constants.esm.js","sources":["../../../../src/features/environment/graph/DiagramNode.constants.ts"],"sourcesContent":["export const NODE_WIDTH = 522;\nexport const NODE_HEIGHT = 166;\n"],"names":[],"mappings":"AAAO,MAAM,UAAA,GAAa;AACnB,MAAM,WAAA,GAAc;;;;"}
|