@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":"ResourcesTab.esm.js","sources":["../../../../../src/features/environment/InstanceDrawer/tabs/ResourcesTab.tsx"],"sourcesContent":["import { Fragment, useMemo, useState } from 'react';\nimport { useApi } from '@backstage/frontend-plugin-api';\nimport {\n composeEnvironmentId,\n parseEnvironmentId,\n parseInstanceId,\n resourceUrl,\n} from '@massdriver/backstage-plugin-common';\nimport Box from '@massdriver/ui/Box';\nimport Typography from '@massdriver/ui/Typography';\nimport Tooltip from '@massdriver/ui/Tooltip';\nimport Collapse from '@massdriver/ui/Collapse';\nimport CodeBlock from '@massdriver/ui/CodeBlock';\nimport CopyButton from '@massdriver/ui/CopyButton';\nimport Chip from '@massdriver/ui/Chip';\nimport IconButton from '@massdriver/ui/IconButton';\nimport HelpOutlineIcon from '@massdriver/ui/icons/HelpOutlineIcon';\nimport ExpandMoreIcon from '@massdriver/ui/icons/ExpandMoreIcon';\nimport ExpandLessIcon from '@massdriver/ui/icons/ExpandLessIcon';\nimport DownloadIcon from '@massdriver/ui/icons/DownloadIcon';\nimport stylin from '@massdriver/ui/stylin';\nimport { massdriverApiRef } from '../../../../api';\nimport { RouterLinkAdapter } from '../../../../components/RouterLinkAdapter';\nimport { internalRoutes } from '../../../../internalRoutes';\nimport { useLiveRelayQuery } from '../../realtime/useLiveRelayQuery';\nimport { TabState } from '../TabState';\nimport { RESOURCES_QUERY, RESOURCE_CONSUMERS_QUERY } from '../queries';\nimport { useInstanceApiQuery } from '../useInstanceApiQuery';\nimport {\n buildResourceRows,\n formatGrantConditions,\n formatPayload,\n RESOURCE_STATE,\n type ResourceRow,\n} from '../helpers';\nimport type {\n BundleResourceEntry,\n InstanceResourceEntry,\n ProducedResource,\n} from '../types';\nimport { chipClasses } from '../../../../theme/muiClasses';\n\n/** Read-only Resources tab: produced/pending resources with consumers + grants. */\nexport const ResourcesTab = ({ instanceId }: { instanceId: string | null }) => {\n const { value, loading, error } = useInstanceApiQuery<{\n instance: {\n id: string;\n bundle?: {\n id: string;\n resources?: (BundleResourceEntry | null)[] | null;\n } | null;\n resources?: (InstanceResourceEntry | null)[] | null;\n } | null;\n }>(RESOURCES_QUERY, instanceId);\n\n const rows = useMemo(\n () =>\n buildResourceRows(\n value?.instance?.bundle?.resources,\n value?.instance?.resources,\n ),\n [value?.instance],\n );\n\n return (\n <TabState loading={loading} error={error}>\n <Root>\n {rows.length === 0 ? (\n <EmptyNote>This instance does not produce any resources.</EmptyNote>\n ) : (\n <List>\n {rows.map(row =>\n row.state === RESOURCE_STATE.CREATED ? (\n <CreatedResourceCard key={row.field} row={row} />\n ) : (\n <UncreatedResourceCard key={row.field} row={row} />\n ),\n )}\n </List>\n )}\n </Root>\n </TabState>\n );\n};\n\nexport default ResourcesTab;\n\ninterface Grant {\n id: string;\n action?: string | null;\n recipientConditions?: unknown;\n}\ninterface Connection {\n id: string;\n toField?: string | null;\n toInstance?: { id: string; name?: string | null } | null;\n}\ninterface RemoteReference {\n id: string;\n field?: string | null;\n instance?: { id: string; name?: string | null } | null;\n}\ninterface EnvironmentDefault {\n id: string;\n environment?: {\n id: string;\n name?: string | null;\n project?: { id: string; name?: string | null } | null;\n } | null;\n}\n\nconst instanceHref = (id?: string | null): string | null => {\n if (!id) return null;\n const { projectId, scopedEnvironmentId, scopedComponentId } =\n parseInstanceId(id);\n if (!projectId || !scopedEnvironmentId || !scopedComponentId) return null;\n return internalRoutes.instance(\n projectId,\n scopedEnvironmentId,\n scopedComponentId,\n );\n};\n\nconst environmentHref = (id?: string | null): string | null => {\n if (!id) return null;\n const { projectId, scopedEnvironmentId } = parseEnvironmentId(id);\n if (!projectId || !scopedEnvironmentId) return null;\n return internalRoutes.environment(\n projectId,\n composeEnvironmentId(projectId, scopedEnvironmentId),\n );\n};\n\nconst CreatedResourceCard = ({ row }: { row: ResourceRow }) => {\n const api = useApi(massdriverApiRef);\n const [payloadOpen, setPayloadOpen] = useState(false);\n const resource = row.resource as ProducedResource | null;\n\n // Live query: consumers (connections/remote refs/env defaults/grants) track\n // realtime events instead of going stale after the first render.\n const { value: consumersResult, error: consumersError } = useLiveRelayQuery<{\n resource: {\n connections?: { items?: (Connection | null)[] | null };\n environmentDefaults?: { items?: (EnvironmentDefault | null)[] | null };\n remoteReferences?: { items?: (RemoteReference | null)[] | null };\n grants?: { items?: (Grant | null)[] | null };\n } | null;\n }>(RESOURCE_CONSUMERS_QUERY, resource?.id ? { id: resource.id } : null);\n const consumers = consumersResult?.resource ?? null;\n\n const grants = (consumers?.grants?.items ?? []).filter(Boolean) as Grant[];\n const connectionItems = (consumers?.connections?.items ?? []).filter(\n Boolean,\n ) as Connection[];\n const remoteReferenceItems = (\n consumers?.remoteReferences?.items ?? []\n ).filter(Boolean) as RemoteReference[];\n const environmentDefaultItems = (\n consumers?.environmentDefaults?.items ?? []\n ).filter(Boolean) as EnvironmentDefault[];\n\n const payloadString = formatPayload(resource?.payload);\n const resourceName = resource?.name || '—';\n const resHref =\n resource?.id && api.appUrl\n ? resourceUrl(api.appUrl, api.organizationId, resource.id)\n : '';\n\n return (\n <Card>\n <HeaderRow>\n <TitleRow>\n <CardTitle title={row.field}>{row.field}</CardTitle>\n <Tooltip\n placement=\"top\"\n arrow\n title={\n <TooltipBody>\n <div>\n <strong>Type:</strong> The resource type produced by this\n instance output.\n </div>\n <div>\n <strong>Resource:</strong> The name of the produced resource.\n </div>\n <div>\n <strong>Connections / Remote refs / Env defaults:</strong>{' '}\n Other instances or environments that consume this resource.\n </div>\n <div>\n <strong>Resource data:</strong> The redacted payload.\n </div>\n </TooltipBody>\n }\n >\n <HelpIcon />\n </Tooltip>\n </TitleRow>\n <HeaderActions>\n <ResourceGrantsChip grants={grants} />\n {resource?.id ? (\n <CopyButton\n text={resource.id}\n tooltip=\"Copy resource ID\"\n size=\"small\"\n />\n ) : null}\n <Tooltip\n title=\"This view is read-only. Open in Massdriver to download resource data.\"\n placement=\"top\"\n >\n <DownloadWrap>\n <IconButton\n size=\"small\"\n disabled\n aria-label=\"Download resource data\"\n >\n <DownloadIcon fontSize=\"small\" />\n </IconButton>\n </DownloadWrap>\n </Tooltip>\n </HeaderActions>\n </HeaderRow>\n <DetailColumn>\n <DetailRow>\n <Label>Type:</Label>\n <Detail title={row.resourceType?.name || '—'}>\n {row.resourceType?.name || '—'}\n </Detail>\n </DetailRow>\n <DetailRow>\n <Label>Resource:</Label>\n {resHref ? (\n <ResourceLink\n href={resHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title={resourceName}\n >\n {resourceName}\n </ResourceLink>\n ) : (\n <Detail title={resourceName}>{resourceName}</Detail>\n )}\n </DetailRow>\n {connectionItems.length > 0 ? (\n <DetailRow>\n <Label>Connections:</Label>\n <ListValue>\n <ConsumerList\n items={connectionItems.map(connection => ({\n key: connection.id,\n label: connection.toInstance?.name ?? 'instance',\n href: instanceHref(connection.toInstance?.id),\n }))}\n />\n </ListValue>\n </DetailRow>\n ) : null}\n {remoteReferenceItems.length > 0 ? (\n <DetailRow>\n <Label>Remote refs:</Label>\n <ListValue>\n <ConsumerList\n items={remoteReferenceItems.map(reference => ({\n key: reference.id,\n label: reference.instance?.name ?? 'instance',\n href: instanceHref(reference.instance?.id),\n }))}\n />\n </ListValue>\n </DetailRow>\n ) : null}\n {environmentDefaultItems.length > 0 ? (\n <DetailRow>\n <Label>Env defaults:</Label>\n <ListValue>\n <ConsumerList\n items={environmentDefaultItems.map(envDefault => {\n const projectName = envDefault.environment?.project?.name;\n const envName = envDefault.environment?.name ?? 'environment';\n return {\n key: envDefault.id,\n label: projectName\n ? `${projectName} / ${envName}`\n : envName,\n href: environmentHref(envDefault.environment?.id),\n };\n })}\n />\n </ListValue>\n </DetailRow>\n ) : null}\n {consumersError ? (\n <DetailRow>\n <Label>Consumers:</Label>\n <Detail title={consumersError.message}>\n Couldn't load consumers\n </Detail>\n </DetailRow>\n ) : null}\n </DetailColumn>\n <PayloadSection>\n <PayloadToggle\n type=\"button\"\n onClick={() => setPayloadOpen(open => !open)}\n aria-expanded={payloadOpen}\n >\n <PayloadToggleLabel>Resource data</PayloadToggleLabel>\n {payloadOpen ? (\n <ExpandLessIcon fontSize=\"small\" />\n ) : (\n <ExpandMoreIcon fontSize=\"small\" />\n )}\n </PayloadToggle>\n <Collapse in={payloadOpen} unmountOnExit>\n <PayloadInner>\n {payloadString ? (\n <PayloadCodeBlock>{payloadString}</PayloadCodeBlock>\n ) : (\n <EmptyPayload>No payload available.</EmptyPayload>\n )}\n </PayloadInner>\n </Collapse>\n </PayloadSection>\n </Card>\n );\n};\n\nconst UncreatedResourceCard = ({ row }: { row: ResourceRow }) => (\n <Card pending>\n <HeaderRow>\n <TitleRow>\n <CardTitle title={row.field}>{row.field}</CardTitle>\n <Tooltip\n placement=\"top\"\n arrow\n title={\n <TooltipBody>\n <div>\n This resource has not been produced yet. Once the instance is\n deployed successfully, it will be created and details will\n appear here.\n </div>\n </TooltipBody>\n }\n >\n <HelpIcon />\n </Tooltip>\n </TitleRow>\n </HeaderRow>\n <DetailColumn>\n <DetailRow>\n <Label>Type:</Label>\n <Detail title={row.resourceType?.name || '—'}>\n {row.resourceType?.name || '—'}\n </Detail>\n </DetailRow>\n </DetailColumn>\n </Card>\n);\n\nconst ConsumerList = ({\n items,\n}: {\n items: Array<{ key: string; label: string; href: string | null }>;\n}) => (\n <>\n {items.map((item, index) => (\n <Fragment key={item.key}>\n {index > 0 ? <Comma>, </Comma> : null}\n {item.href ? (\n <ConsumerAnchor href={item.href} title={item.label}>\n {item.label}\n </ConsumerAnchor>\n ) : (\n <ConsumerText title={item.label}>{item.label}</ConsumerText>\n )}\n </Fragment>\n ))}\n </>\n);\n\nconst ResourceGrantsChip = ({ grants }: { grants: Grant[] }) => {\n if (!grants || grants.length === 0) return null;\n return (\n <Tooltip\n placement=\"top\"\n arrow\n title={\n <TooltipBody>\n <TooltipTitle>\n Shared with {grants.length} grant{grants.length === 1 ? '' : 's'}\n </TooltipTitle>\n {grants.map(grant => (\n <GrantRow key={grant.id}>\n <GrantAction>{grant.action}</GrantAction>\n <GrantConditions>\n {formatGrantConditions(grant.recipientConditions)}\n </GrantConditions>\n </GrantRow>\n ))}\n </TooltipBody>\n }\n >\n <SharedChip label=\"Shared\" size=\"small\" color=\"info\" variant=\"outlined\" />\n </Tooltip>\n );\n};\n\nconst Root = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(4),\n padding: theme.spacing(1),\n}));\n\nconst List = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2),\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\nconst Card = stylin(Box, ['pending'])(\n ({ theme, pending }: { theme: any; pending?: boolean }) => ({\n position: 'relative',\n border: `1px ${pending ? 'dashed' : 'solid'} ${theme.palette.divider}`,\n backgroundColor: theme.palette.background.paper,\n borderRadius: '4px',\n padding: theme.spacing(1, 1.75),\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(0.5),\n }),\n);\n\nconst HeaderRow = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: theme.spacing(0.5),\n minWidth: 0,\n}));\n\nconst TitleRow = stylin(Box)({\n display: 'flex',\n alignItems: 'center',\n gap: '2px',\n minWidth: 0,\n flex: 1,\n});\n\nconst CardTitle = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(14),\n color: theme.palette.text.primary,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n minWidth: 0,\n}));\n\nconst HeaderActions = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.25),\n flexShrink: 0,\n}));\n\nconst DownloadWrap = stylin('span')({\n display: 'inline-flex',\n});\n\nconst ResourceLink = stylin('a')(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(11),\n color: theme.palette.primary.main,\n textDecoration: 'underline',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n minWidth: 0,\n '&:hover': { color: theme.palette.primary.dark },\n}));\n\nconst HelpIcon = stylin(HelpOutlineIcon)(({ theme }: { theme: any }) => ({\n width: 15,\n height: 15,\n color: theme.palette.text.secondary,\n flexShrink: 0,\n '&:hover': { color: theme.palette.primary.main },\n}));\n\nconst DetailColumn = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: '2px',\n marginLeft: theme.spacing(1.5),\n}));\n\nconst DetailRow = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n minWidth: 0,\n}));\n\nconst Label = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(11),\n fontWeight: theme.typography.fontWeightMedium,\n whiteSpace: 'nowrap',\n flexShrink: 0,\n}));\n\nconst Detail = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(11),\n color: theme.palette.text.primary,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n}));\n\nconst ListValue = stylin(Box)({\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'wrap',\n alignItems: 'baseline',\n minWidth: 0,\n});\n\nconst Comma = stylin('span')(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(11),\n color: theme.palette.text.primary,\n marginRight: '2px',\n}));\n\nconst ConsumerAnchor = stylin(RouterLinkAdapter)(\n ({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(11),\n color: theme.palette.primary.main,\n textDecoration: 'underline',\n whiteSpace: 'nowrap',\n '&:hover': { color: theme.palette.primary.dark },\n }),\n);\n\nconst ConsumerText = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(11),\n color: theme.palette.text.primary,\n whiteSpace: 'nowrap',\n}));\n\nconst TooltipBody = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: '2px',\n fontSize: theme.typography.pxToRem(12),\n lineHeight: 1.4,\n maxWidth: 320,\n}));\n\nconst TooltipTitle = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(12),\n fontWeight: theme.typography.fontWeightBold,\n}));\n\nconst GrantRow = stylin(Box)({\n display: 'flex',\n flexDirection: 'column',\n gap: '2px',\n});\n\nconst GrantAction = stylin('span')(({ theme }: { theme: any }) => ({\n fontFamily: 'monospace',\n fontSize: theme.typography.pxToRem(11),\n}));\n\nconst GrantConditions = stylin('span')(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(11),\n opacity: 0.9,\n}));\n\nconst SharedChip = stylin(Chip)(({ theme }: { theme: any }) => ({\n height: 18,\n fontSize: theme.typography.pxToRem(11),\n [`& .${chipClasses.label}`]: { paddingLeft: '6px', paddingRight: '6px' },\n}));\n\nconst PayloadSection = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n marginTop: theme.spacing(1),\n marginLeft: `-${theme.spacing(1.75)}`,\n marginRight: `-${theme.spacing(1.75)}`,\n marginBottom: `-${theme.spacing(1)}`,\n}));\n\nconst PayloadToggle = stylin('button')(({ theme }: { theme: any }) => ({\n border: 'none',\n borderTop: `1px solid ${theme.palette.divider}`,\n background: 'transparent',\n padding: theme.spacing(0.75, 1.75),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n cursor: 'pointer',\n color: theme.palette.text.secondary,\n fontFamily: 'inherit',\n borderRadius: 0,\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n color: theme.palette.primary.main,\n },\n}));\n\nconst PayloadToggleLabel = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(11),\n fontWeight: theme.typography.fontWeightMedium,\n color: 'inherit',\n}));\n\nconst PayloadInner = stylin(Box)(({ theme }: { theme: any }) => ({\n padding: theme.spacing(1.75),\n}));\n\nconst PayloadCodeBlock = stylin(CodeBlock)(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(11),\n padding: theme.spacing(1),\n}));\n\nconst EmptyPayload = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(11),\n color: theme.palette.text.secondary,\n fontStyle: 'italic',\n}));\n"],"names":["Fragment"],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import Box from '@massdriver/ui/Box';
|
|
3
|
+
import Typography from '@massdriver/ui/Typography';
|
|
4
|
+
import TextField from '@massdriver/ui/TextField';
|
|
5
|
+
import FormsMarkdown from '@massdriver/ui/FormsMarkdown';
|
|
6
|
+
import stylin from '@massdriver/ui/stylin';
|
|
7
|
+
import { DisabledAction } from '../../../../components/DisabledAction.esm.js';
|
|
8
|
+
|
|
9
|
+
const MASKED_VALUE = "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";
|
|
10
|
+
const SecretsTab = ({
|
|
11
|
+
secretFields = []
|
|
12
|
+
}) => /* @__PURE__ */ jsx(Root, { children: secretFields.length > 0 ? secretFields.map((field) => {
|
|
13
|
+
const isSet = Boolean(field.sha256);
|
|
14
|
+
return /* @__PURE__ */ jsxs(Item, { children: [
|
|
15
|
+
/* @__PURE__ */ jsx(SecretTitle, { children: `${field.title || field.name}${field.required ? "*" : ""}` }),
|
|
16
|
+
/* @__PURE__ */ jsxs(ValueRow, { children: [
|
|
17
|
+
/* @__PURE__ */ jsx(
|
|
18
|
+
MaskedField,
|
|
19
|
+
{
|
|
20
|
+
value: isSet ? MASKED_VALUE : "",
|
|
21
|
+
placeholder: isSet ? "" : "No value set",
|
|
22
|
+
size: "small",
|
|
23
|
+
fullWidth: true,
|
|
24
|
+
disabled: true
|
|
25
|
+
}
|
|
26
|
+
),
|
|
27
|
+
/* @__PURE__ */ jsxs(Actions, { children: [
|
|
28
|
+
/* @__PURE__ */ jsx(
|
|
29
|
+
DisabledAction,
|
|
30
|
+
{
|
|
31
|
+
label: "Edit",
|
|
32
|
+
variant: "text",
|
|
33
|
+
size: "small",
|
|
34
|
+
tooltip: "This view is read-only. Open in Massdriver to set this secret."
|
|
35
|
+
}
|
|
36
|
+
),
|
|
37
|
+
isSet ? /* @__PURE__ */ jsx(
|
|
38
|
+
DisabledAction,
|
|
39
|
+
{
|
|
40
|
+
label: "Clear",
|
|
41
|
+
variant: "text",
|
|
42
|
+
size: "small",
|
|
43
|
+
color: "error",
|
|
44
|
+
tooltip: "This view is read-only. Open in Massdriver to clear this secret."
|
|
45
|
+
}
|
|
46
|
+
) : null
|
|
47
|
+
] })
|
|
48
|
+
] }),
|
|
49
|
+
isSet && field.sha256 ? /* @__PURE__ */ jsxs(Meta, { title: field.sha256, children: [
|
|
50
|
+
"sha256: ",
|
|
51
|
+
field.sha256.slice(0, 12),
|
|
52
|
+
"\u2026"
|
|
53
|
+
] }) : null,
|
|
54
|
+
field.description ? /* @__PURE__ */ jsx(Description, { children: /* @__PURE__ */ jsx(FormsMarkdown, { children: field.description }) }) : null
|
|
55
|
+
] }, field.name);
|
|
56
|
+
}) : /* @__PURE__ */ jsx(EmptyNote, { children: "This component doesn't declare any secrets." }) });
|
|
57
|
+
const Root = stylin(Box)(({ theme }) => ({
|
|
58
|
+
display: "flex",
|
|
59
|
+
flexDirection: "column",
|
|
60
|
+
gap: theme.spacing(3),
|
|
61
|
+
padding: theme.spacing(1)
|
|
62
|
+
}));
|
|
63
|
+
const Item = stylin(Box)(({ theme }) => ({
|
|
64
|
+
display: "flex",
|
|
65
|
+
flexDirection: "column",
|
|
66
|
+
gap: theme.spacing(0.75),
|
|
67
|
+
paddingBottom: theme.spacing(1.5),
|
|
68
|
+
borderBottom: `1px solid ${theme.palette.divider}`
|
|
69
|
+
}));
|
|
70
|
+
const SecretTitle = stylin(Typography)(({ theme }) => ({
|
|
71
|
+
fontSize: theme.typography.pxToRem(13),
|
|
72
|
+
fontWeight: 600,
|
|
73
|
+
color: theme.palette.text.primary
|
|
74
|
+
}));
|
|
75
|
+
const ValueRow = stylin(Box)(({ theme }) => ({
|
|
76
|
+
display: "flex",
|
|
77
|
+
alignItems: "center",
|
|
78
|
+
gap: theme.spacing(1)
|
|
79
|
+
}));
|
|
80
|
+
const MaskedField = stylin(TextField)({
|
|
81
|
+
flex: 1,
|
|
82
|
+
minWidth: 0
|
|
83
|
+
});
|
|
84
|
+
const Actions = stylin(Box)(({ theme }) => ({
|
|
85
|
+
display: "flex",
|
|
86
|
+
alignItems: "center",
|
|
87
|
+
gap: theme.spacing(0.5),
|
|
88
|
+
flexShrink: 0
|
|
89
|
+
}));
|
|
90
|
+
const Meta = stylin(Typography)(({ theme }) => ({
|
|
91
|
+
fontSize: theme.typography.pxToRem(11),
|
|
92
|
+
color: theme.palette.text.secondary,
|
|
93
|
+
fontFamily: theme.typography.fontFamilyMono,
|
|
94
|
+
overflow: "hidden",
|
|
95
|
+
textOverflow: "ellipsis",
|
|
96
|
+
whiteSpace: "nowrap"
|
|
97
|
+
}));
|
|
98
|
+
const Description = stylin(Box)(({ theme }) => ({
|
|
99
|
+
fontSize: theme.typography.pxToRem(12),
|
|
100
|
+
color: theme.palette.text.secondary
|
|
101
|
+
}));
|
|
102
|
+
const EmptyNote = stylin(Typography)(({ theme }) => ({
|
|
103
|
+
fontSize: theme.typography.pxToRem(12),
|
|
104
|
+
color: theme.palette.text.secondary,
|
|
105
|
+
fontStyle: "italic"
|
|
106
|
+
}));
|
|
107
|
+
|
|
108
|
+
export { SecretsTab, SecretsTab as default };
|
|
109
|
+
//# sourceMappingURL=SecretsTab.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecretsTab.esm.js","sources":["../../../../../src/features/environment/InstanceDrawer/tabs/SecretsTab.tsx"],"sourcesContent":["import Box from '@massdriver/ui/Box';\nimport Typography from '@massdriver/ui/Typography';\nimport TextField from '@massdriver/ui/TextField';\nimport FormsMarkdown from '@massdriver/ui/FormsMarkdown';\nimport stylin from '@massdriver/ui/stylin';\nimport { DisabledAction } from '../../../../components/DisabledAction';\nimport type { SecretField } from '../types';\n\n// The secret value is never fetched (only `sha256`), so it is always masked.\nconst MASKED_VALUE = '••••••••••••';\n\n/**\n * Read-only Secrets tab: mirrors the web app's per-secret line item (masked\n * value field, sha256 fingerprint, markdown description). Set/clear are\n * mutations, so they render as disabled controls with a tooltip pointing to\n * Massdriver (the web app is where secrets are actually managed).\n */\nexport const SecretsTab = ({\n secretFields = [],\n}: {\n secretFields?: SecretField[];\n}) => (\n <Root>\n {secretFields.length > 0 ? (\n secretFields.map(field => {\n const isSet = Boolean(field.sha256);\n return (\n <Item key={field.name}>\n <SecretTitle>\n {`${field.title || field.name}${field.required ? '*' : ''}`}\n </SecretTitle>\n <ValueRow>\n <MaskedField\n value={isSet ? MASKED_VALUE : ''}\n placeholder={isSet ? '' : 'No value set'}\n size=\"small\"\n fullWidth\n disabled\n />\n <Actions>\n <DisabledAction\n label=\"Edit\"\n variant=\"text\"\n size=\"small\"\n tooltip=\"This view is read-only. Open in Massdriver to set this secret.\"\n />\n {isSet ? (\n <DisabledAction\n label=\"Clear\"\n variant=\"text\"\n size=\"small\"\n color=\"error\"\n tooltip=\"This view is read-only. Open in Massdriver to clear this secret.\"\n />\n ) : null}\n </Actions>\n </ValueRow>\n {isSet && field.sha256 ? (\n <Meta title={field.sha256}>\n sha256: {field.sha256.slice(0, 12)}…\n </Meta>\n ) : null}\n {field.description ? (\n <Description>\n <FormsMarkdown>{field.description}</FormsMarkdown>\n </Description>\n ) : null}\n </Item>\n );\n })\n ) : (\n <EmptyNote>This component doesn't declare any secrets.</EmptyNote>\n )}\n </Root>\n);\n\nexport default SecretsTab;\n\nconst Root = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(3),\n padding: theme.spacing(1),\n}));\n\nconst Item = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(0.75),\n paddingBottom: theme.spacing(1.5),\n borderBottom: `1px solid ${theme.palette.divider}`,\n}));\n\nconst SecretTitle = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(13),\n fontWeight: 600,\n color: theme.palette.text.primary,\n}));\n\nconst ValueRow = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n}));\n\nconst MaskedField = stylin(TextField)({\n flex: 1,\n minWidth: 0,\n});\n\nconst Actions = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n flexShrink: 0,\n}));\n\nconst Meta = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(11),\n color: theme.palette.text.secondary,\n fontFamily: theme.typography.fontFamilyMono,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}));\n\nconst Description = stylin(Box)(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(12),\n color: theme.palette.text.secondary,\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":";;;;;;;;AASA,MAAM,YAAA,GAAe,0EAAA;AAQd,MAAM,aAAa,CAAC;AAAA,EACzB,eAAe;AACjB,CAAA,yBAGG,IAAA,EAAA,EACE,QAAA,EAAA,YAAA,CAAa,SAAS,CAAA,GACrB,YAAA,CAAa,IAAI,CAAA,KAAA,KAAS;AACxB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA;AAClC,EAAA,4BACG,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,WAAA,EAAA,EACE,QAAA,EAAA,CAAA,EAAG,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,IAAI,CAAA,EAAG,KAAA,CAAM,QAAA,GAAW,GAAA,GAAM,EAAE,CAAA,CAAA,EAC3D,CAAA;AAAA,yBACC,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,QAAQ,YAAA,GAAe,EAAA;AAAA,UAC9B,WAAA,EAAa,QAAQ,EAAA,GAAK,cAAA;AAAA,UAC1B,IAAA,EAAK,OAAA;AAAA,UACL,SAAA,EAAS,IAAA;AAAA,UACT,QAAA,EAAQ;AAAA;AAAA,OACV;AAAA,2BACC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,MAAA;AAAA,YACN,OAAA,EAAQ,MAAA;AAAA,YACR,IAAA,EAAK,OAAA;AAAA,YACL,OAAA,EAAQ;AAAA;AAAA,SACV;AAAA,QACC,KAAA,mBACC,GAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,OAAA;AAAA,YACN,OAAA,EAAQ,MAAA;AAAA,YACR,IAAA,EAAK,OAAA;AAAA,YACL,KAAA,EAAM,OAAA;AAAA,YACN,OAAA,EAAQ;AAAA;AAAA,SACV,GACE;AAAA,OAAA,EACN;AAAA,KAAA,EACF,CAAA;AAAA,IACC,SAAS,KAAA,CAAM,MAAA,wBACb,IAAA,EAAA,EAAK,KAAA,EAAO,MAAM,MAAA,EAAQ,QAAA,EAAA;AAAA,MAAA,UAAA;AAAA,MAChB,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,MAAE;AAAA,KAAA,EACrC,CAAA,GACE,IAAA;AAAA,IACH,KAAA,CAAM,8BACL,GAAA,CAAC,WAAA,EAAA,EACC,8BAAC,aAAA,EAAA,EAAe,QAAA,EAAA,KAAA,CAAM,WAAA,EAAY,CAAA,EACpC,CAAA,GACE;AAAA,GAAA,EAAA,EAvCK,MAAM,IAwCjB,CAAA;AAEJ,CAAC,CAAA,mBAED,GAAA,CAAC,SAAA,EAAA,EAAU,QAAA,EAAA,6CAAA,EAA2C,CAAA,EAE1D;AAKF,MAAM,OAAO,MAAA,CAAO,GAAG,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EACvD,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,EACpB,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC;AAC1B,CAAA,CAAE,CAAA;AAEF,MAAM,OAAO,MAAA,CAAO,GAAG,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EACvD,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,EACvB,aAAA,EAAe,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAAA,EAChC,YAAA,EAAc,CAAA,UAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA;AAClD,CAAA,CAAE,CAAA;AAEF,MAAM,cAAc,MAAA,CAAO,UAAU,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EACrE,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ,EAAE,CAAA;AAAA,EACrC,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK;AAC5B,CAAA,CAAE,CAAA;AAEF,MAAM,WAAW,MAAA,CAAO,GAAG,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EAC3D,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC;AACtB,CAAA,CAAE,CAAA;AAEF,MAAM,WAAA,GAAc,MAAA,CAAO,SAAS,CAAA,CAAE;AAAA,EACpC,IAAA,EAAM,CAAA;AAAA,EACN,QAAA,EAAU;AACZ,CAAC,CAAA;AAED,MAAM,UAAU,MAAA,CAAO,GAAG,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EAC1D,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAAA,EACtB,UAAA,EAAY;AACd,CAAA,CAAE,CAAA;AAEF,MAAM,OAAO,MAAA,CAAO,UAAU,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EAC9D,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ,EAAE,CAAA;AAAA,EACrC,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,SAAA;AAAA,EAC1B,UAAA,EAAY,MAAM,UAAA,CAAW,cAAA;AAAA,EAC7B,QAAA,EAAU,QAAA;AAAA,EACV,YAAA,EAAc,UAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA,CAAE,CAAA;AAEF,MAAM,cAAc,MAAA,CAAO,GAAG,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EAC9D,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ,EAAE,CAAA;AAAA,EACrC,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK;AAC5B,CAAA,CAAE,CAAA;AAEF,MAAM,YAAY,MAAA,CAAO,UAAU,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EACnE,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ,EAAE,CAAA;AAAA,EACrC,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,SAAA;AAAA,EAC1B,SAAA,EAAW;AACb,CAAA,CAAE,CAAA;;;;"}
|
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useMemo } from 'react';
|
|
3
|
+
import { useApi } from '@backstage/frontend-plugin-api';
|
|
4
|
+
import useAsync from 'react-use/esm/useAsync';
|
|
5
|
+
import { Dialog, DialogHeader, DialogActions, DialogContent } from '@massdriver/ui/Dialog';
|
|
6
|
+
import Box from '@massdriver/ui/Box';
|
|
7
|
+
import Typography from '@massdriver/ui/Typography';
|
|
8
|
+
import Button from '@massdriver/ui/Button';
|
|
9
|
+
import IconButton from '@massdriver/ui/IconButton';
|
|
10
|
+
import CopyButton from '@massdriver/ui/CopyButton';
|
|
11
|
+
import Alert from '@massdriver/ui/Alert';
|
|
12
|
+
import LoadingIndicator from '@massdriver/ui/LoadingIndicator';
|
|
13
|
+
import DataList, { col } from '@massdriver/ui/DataList';
|
|
14
|
+
import stylin from '@massdriver/ui/stylin';
|
|
15
|
+
import CloseIcon from '@massdriver/ui/icons/CloseIcon';
|
|
16
|
+
import HistoryIcon from '@massdriver/ui/icons/HistoryIcon';
|
|
17
|
+
import { massdriverApiRef } from '../../../../api.esm.js';
|
|
18
|
+
import InstanceStatusPill from '../../components/InstanceStatusPill.esm.js';
|
|
19
|
+
import { composeInstanceStatus } from '../../../../utils/instanceStatuses.esm.js';
|
|
20
|
+
import VersionBadge from '../../../../components/VersionBadge.esm.js';
|
|
21
|
+
import { ComparisonValueCell } from '../../CompareEnvironmentsDialog/ComparisonValueCell.esm.js';
|
|
22
|
+
import { DEPLOYMENT_QUERY } from '../queries.esm.js';
|
|
23
|
+
import { formatDeploymentStatus, formatElapsed, formatRelativeTime, formatAbsoluteDateTime, parsePlanMessage, parseRollbackMessage, stripMessageContext, deploymentHasLogs, parseMap, truncateDeploymentId, formatAttributeValue } from '../helpers.esm.js';
|
|
24
|
+
import flattenParams from './flattenParams.esm.js';
|
|
25
|
+
import { useOpenLogs } from './DeploymentLogsPanel.esm.js';
|
|
26
|
+
import { DisabledApprovalCluster, DisabledRollbackButton, LogsButton } from './DeploymentReadOnlyActions.esm.js';
|
|
27
|
+
|
|
28
|
+
const renderValueCell = (_value, row) => /* @__PURE__ */ jsx(
|
|
29
|
+
ComparisonValueCell,
|
|
30
|
+
{
|
|
31
|
+
side: { present: true, value: row.value },
|
|
32
|
+
isDifferent: false,
|
|
33
|
+
isMissing: false
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
const COLUMNS = [
|
|
37
|
+
col.text("path", "Path", {
|
|
38
|
+
flex: 2,
|
|
39
|
+
minWidth: 200,
|
|
40
|
+
sortable: true,
|
|
41
|
+
searchable: true
|
|
42
|
+
}),
|
|
43
|
+
col.custom("value", "Value", renderValueCell, {
|
|
44
|
+
flex: 3,
|
|
45
|
+
minWidth: 220,
|
|
46
|
+
sortable: false,
|
|
47
|
+
searchable: false
|
|
48
|
+
})
|
|
49
|
+
];
|
|
50
|
+
const buildHeading = (componentName, statusLabel) => {
|
|
51
|
+
const verb = statusLabel && statusLabel !== "\u2014" ? statusLabel.toLowerCase() : null;
|
|
52
|
+
if (!componentName && !verb) return "Deployment";
|
|
53
|
+
if (!verb) return `${componentName} deployment`;
|
|
54
|
+
return componentName ? `${componentName} \xB7 ${verb}` : verb;
|
|
55
|
+
};
|
|
56
|
+
const ViewDeploymentDetails = ({
|
|
57
|
+
deploymentId,
|
|
58
|
+
onClose,
|
|
59
|
+
onShowSource
|
|
60
|
+
}) => {
|
|
61
|
+
const api = useApi(massdriverApiRef);
|
|
62
|
+
const openLogs = useOpenLogs();
|
|
63
|
+
const open = Boolean(deploymentId);
|
|
64
|
+
const { value, loading, error } = useAsync(async () => {
|
|
65
|
+
if (!deploymentId) return null;
|
|
66
|
+
const data = await api.query(DEPLOYMENT_QUERY, { id: deploymentId });
|
|
67
|
+
return data.deployment;
|
|
68
|
+
}, [api, deploymentId]);
|
|
69
|
+
const deployment = value;
|
|
70
|
+
const paramRows = useMemo(
|
|
71
|
+
() => flattenParams(deployment?.params),
|
|
72
|
+
[deployment?.params]
|
|
73
|
+
);
|
|
74
|
+
const statusLabel = formatDeploymentStatus(
|
|
75
|
+
deployment?.action,
|
|
76
|
+
deployment?.status
|
|
77
|
+
);
|
|
78
|
+
const componentName = deployment?.instance?.component?.name;
|
|
79
|
+
const elapsed = formatElapsed(deployment?.elapsedTime);
|
|
80
|
+
const occurredIso = deployment?.lastTransitionedAt ?? deployment?.createdAt;
|
|
81
|
+
const time = formatRelativeTime(occurredIso);
|
|
82
|
+
const absoluteDate = formatAbsoluteDateTime(occurredIso);
|
|
83
|
+
const deployedBy = deployment?.deployedBy ?? "system";
|
|
84
|
+
const heading = buildHeading(componentName, statusLabel);
|
|
85
|
+
const planSource = deployment?.action === "PLAN" ? parsePlanMessage(deployment?.message) : null;
|
|
86
|
+
const rollbackSource = parseRollbackMessage(deployment?.message);
|
|
87
|
+
const displayMessage = stripMessageContext(deployment?.message);
|
|
88
|
+
const isProposed = deployment?.status === "PROPOSED";
|
|
89
|
+
const isRollbackEligible = deployment?.action === "PROVISION" && deployment?.status === "COMPLETED";
|
|
90
|
+
const hasLogs = deploymentHasLogs(deployment?.status);
|
|
91
|
+
const handleViewLogs = () => {
|
|
92
|
+
if (!deployment) return;
|
|
93
|
+
onClose();
|
|
94
|
+
openLogs(deployment.id);
|
|
95
|
+
};
|
|
96
|
+
const attributes = parseMap(deployment?.effectiveAttributes);
|
|
97
|
+
const attributeEntries = attributes ? Object.entries(attributes) : [];
|
|
98
|
+
return /* @__PURE__ */ jsxs(Dialog, { open, onClose, maxWidth: "md", fullWidth: true, children: [
|
|
99
|
+
/* @__PURE__ */ jsx(
|
|
100
|
+
DialogHeader,
|
|
101
|
+
{
|
|
102
|
+
icon: /* @__PURE__ */ jsx(HistoryIcon, {}),
|
|
103
|
+
actions: /* @__PURE__ */ jsx(IconButton, { onClick: onClose, "aria-label": "Close deployment details", children: /* @__PURE__ */ jsx(CloseIcon, {}) }),
|
|
104
|
+
children: heading
|
|
105
|
+
}
|
|
106
|
+
),
|
|
107
|
+
/* @__PURE__ */ jsx(Body, { children: loading ? /* @__PURE__ */ jsx(Centered, { children: /* @__PURE__ */ jsx(LoadingIndicator, {}) }) : error ? /* @__PURE__ */ jsx(Alert, { severity: "error", children: String(error.message ?? error) }) : deployment ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
108
|
+
/* @__PURE__ */ jsxs(SummaryCard, { children: [
|
|
109
|
+
/* @__PURE__ */ jsxs(SummaryHeader, { children: [
|
|
110
|
+
/* @__PURE__ */ jsxs(SummaryHeaderLeft, { children: [
|
|
111
|
+
/* @__PURE__ */ jsx(
|
|
112
|
+
InstanceStatusPill,
|
|
113
|
+
{
|
|
114
|
+
status: composeInstanceStatus(
|
|
115
|
+
deployment.action,
|
|
116
|
+
deployment.status
|
|
117
|
+
),
|
|
118
|
+
onClick: hasLogs ? handleViewLogs : void 0
|
|
119
|
+
}
|
|
120
|
+
),
|
|
121
|
+
deployment.version ? /* @__PURE__ */ jsx(VersionBadge, { version: deployment.version }) : null
|
|
122
|
+
] }),
|
|
123
|
+
isProposed ? /* @__PURE__ */ jsx(DisabledApprovalCluster, {}) : /* @__PURE__ */ jsxs(HeaderActions, { children: [
|
|
124
|
+
isRollbackEligible ? /* @__PURE__ */ jsx(DisabledRollbackButton, {}) : null,
|
|
125
|
+
hasLogs ? /* @__PURE__ */ jsx(LogsButton, { onClick: handleViewLogs }) : null
|
|
126
|
+
] })
|
|
127
|
+
] }),
|
|
128
|
+
/* @__PURE__ */ jsxs(DefList, { children: [
|
|
129
|
+
/* @__PURE__ */ jsxs(DefRow, { children: [
|
|
130
|
+
/* @__PURE__ */ jsx(DefLabel, { children: "Status" }),
|
|
131
|
+
/* @__PURE__ */ jsx(DefValue, { children: statusLabel })
|
|
132
|
+
] }),
|
|
133
|
+
/* @__PURE__ */ jsxs(DefRow, { children: [
|
|
134
|
+
/* @__PURE__ */ jsx(DefLabel, { children: "Occurred" }),
|
|
135
|
+
/* @__PURE__ */ jsxs(DefValue, { children: [
|
|
136
|
+
time,
|
|
137
|
+
absoluteDate ? /* @__PURE__ */ jsx(DefMuted, { children: ` \xB7 ${absoluteDate}` }) : null
|
|
138
|
+
] })
|
|
139
|
+
] }),
|
|
140
|
+
/* @__PURE__ */ jsxs(DefRow, { children: [
|
|
141
|
+
/* @__PURE__ */ jsx(DefLabel, { children: "Duration" }),
|
|
142
|
+
/* @__PURE__ */ jsx(DefValue, { children: elapsed ?? "\u2014" })
|
|
143
|
+
] }),
|
|
144
|
+
/* @__PURE__ */ jsxs(DefRow, { children: [
|
|
145
|
+
/* @__PURE__ */ jsx(DefLabel, { children: "Deployed by" }),
|
|
146
|
+
/* @__PURE__ */ jsx(DefValue, { children: /* @__PURE__ */ jsx("strong", { children: deployedBy }) })
|
|
147
|
+
] }),
|
|
148
|
+
/* @__PURE__ */ jsxs(DefRow, { children: [
|
|
149
|
+
/* @__PURE__ */ jsx(DefLabel, { children: "Deployment ID" }),
|
|
150
|
+
/* @__PURE__ */ jsxs(DefValue, { children: [
|
|
151
|
+
/* @__PURE__ */ jsx(Mono, { children: deployment.id }),
|
|
152
|
+
/* @__PURE__ */ jsx(
|
|
153
|
+
CopyButton,
|
|
154
|
+
{
|
|
155
|
+
text: deployment.id,
|
|
156
|
+
ariaLabel: "Copy deployment ID"
|
|
157
|
+
}
|
|
158
|
+
)
|
|
159
|
+
] })
|
|
160
|
+
] })
|
|
161
|
+
] }),
|
|
162
|
+
planSource ? /* @__PURE__ */ jsxs(PlanSourceBlock, { children: [
|
|
163
|
+
/* @__PURE__ */ jsxs(
|
|
164
|
+
PlanSourceLink,
|
|
165
|
+
{
|
|
166
|
+
variant: "text",
|
|
167
|
+
size: "small",
|
|
168
|
+
onClick: () => onShowSource(planSource.sourceId),
|
|
169
|
+
children: [
|
|
170
|
+
"Planned deployment of",
|
|
171
|
+
" ",
|
|
172
|
+
truncateDeploymentId(planSource.sourceId)
|
|
173
|
+
]
|
|
174
|
+
}
|
|
175
|
+
),
|
|
176
|
+
displayMessage ? /* @__PURE__ */ jsxs(MessageQuote, { children: [
|
|
177
|
+
'"',
|
|
178
|
+
displayMessage,
|
|
179
|
+
'"'
|
|
180
|
+
] }) : null
|
|
181
|
+
] }) : rollbackSource ? /* @__PURE__ */ jsxs(PlanSourceBlock, { children: [
|
|
182
|
+
/* @__PURE__ */ jsxs(
|
|
183
|
+
PlanSourceLink,
|
|
184
|
+
{
|
|
185
|
+
variant: "text",
|
|
186
|
+
size: "small",
|
|
187
|
+
onClick: () => onShowSource(rollbackSource.sourceId),
|
|
188
|
+
children: [
|
|
189
|
+
isProposed ? "Proposed rollback to deployment" : "Rollback to deployment",
|
|
190
|
+
" ",
|
|
191
|
+
truncateDeploymentId(rollbackSource.sourceId),
|
|
192
|
+
rollbackSource.version ? ` (v${rollbackSource.version})` : ""
|
|
193
|
+
]
|
|
194
|
+
}
|
|
195
|
+
),
|
|
196
|
+
displayMessage ? /* @__PURE__ */ jsxs(MessageQuote, { children: [
|
|
197
|
+
'"',
|
|
198
|
+
displayMessage,
|
|
199
|
+
'"'
|
|
200
|
+
] }) : null
|
|
201
|
+
] }) : displayMessage ? /* @__PURE__ */ jsxs(MessageQuote, { children: [
|
|
202
|
+
'"',
|
|
203
|
+
displayMessage,
|
|
204
|
+
'"'
|
|
205
|
+
] }) : null
|
|
206
|
+
] }),
|
|
207
|
+
/* @__PURE__ */ jsxs(Section, { children: [
|
|
208
|
+
/* @__PURE__ */ jsx(SectionHeading, { variant: "subtitle1", children: "Attributes" }),
|
|
209
|
+
/* @__PURE__ */ jsx(Card, { children: attributeEntries.length === 0 ? /* @__PURE__ */ jsx(EmptyNote, { children: "No effective attributes." }) : attributeEntries.map(([key, attrValue]) => /* @__PURE__ */ jsxs(RowLine, { children: [
|
|
210
|
+
/* @__PURE__ */ jsx(MonoLabel, { title: key, children: key }),
|
|
211
|
+
/* @__PURE__ */ jsx(MonoValue, { title: formatAttributeValue(attrValue), children: formatAttributeValue(attrValue) })
|
|
212
|
+
] }, key)) })
|
|
213
|
+
] }),
|
|
214
|
+
/* @__PURE__ */ jsxs(Section, { children: [
|
|
215
|
+
/* @__PURE__ */ jsx(SectionHeading, { variant: "subtitle1", children: "Snapshot params" }),
|
|
216
|
+
/* @__PURE__ */ jsx(
|
|
217
|
+
DataList,
|
|
218
|
+
{
|
|
219
|
+
rows: paramRows,
|
|
220
|
+
columns: COLUMNS,
|
|
221
|
+
searchable: true,
|
|
222
|
+
searchPlaceholder: "Search path\u2026",
|
|
223
|
+
defaultSort: { field: "path", direction: "asc" },
|
|
224
|
+
defaultPageSize: 5,
|
|
225
|
+
variant: "outlined",
|
|
226
|
+
size: "small",
|
|
227
|
+
emptyMessage: "No parameters captured for this deployment."
|
|
228
|
+
}
|
|
229
|
+
)
|
|
230
|
+
] })
|
|
231
|
+
] }) : null }),
|
|
232
|
+
/* @__PURE__ */ jsx(DialogActions, { children: /* @__PURE__ */ jsx(Button, { variant: "contained", onClick: onClose, children: "Close" }) })
|
|
233
|
+
] });
|
|
234
|
+
};
|
|
235
|
+
const Body = stylin(DialogContent)(({ theme }) => ({
|
|
236
|
+
display: "flex",
|
|
237
|
+
flexDirection: "column",
|
|
238
|
+
gap: theme.spacing(2),
|
|
239
|
+
"& > *": {
|
|
240
|
+
flexShrink: 0
|
|
241
|
+
}
|
|
242
|
+
}));
|
|
243
|
+
const Centered = stylin(Box)(({ theme }) => ({
|
|
244
|
+
display: "flex",
|
|
245
|
+
justifyContent: "center",
|
|
246
|
+
padding: theme.spacing(6)
|
|
247
|
+
}));
|
|
248
|
+
const SummaryCard = stylin(Box)(({ theme }) => ({
|
|
249
|
+
display: "flex",
|
|
250
|
+
flexDirection: "column",
|
|
251
|
+
gap: theme.spacing(2.5),
|
|
252
|
+
padding: theme.spacing(2.5, 3),
|
|
253
|
+
borderRadius: 1,
|
|
254
|
+
border: `1px solid ${theme.palette.divider}`,
|
|
255
|
+
backgroundColor: theme.palette.background.paper
|
|
256
|
+
}));
|
|
257
|
+
const SummaryHeader = stylin(Box)(({ theme }) => ({
|
|
258
|
+
display: "flex",
|
|
259
|
+
alignItems: "center",
|
|
260
|
+
justifyContent: "space-between",
|
|
261
|
+
flexWrap: "wrap",
|
|
262
|
+
gap: theme.spacing(1.5)
|
|
263
|
+
}));
|
|
264
|
+
const SummaryHeaderLeft = stylin(Box)(({ theme }) => ({
|
|
265
|
+
display: "flex",
|
|
266
|
+
alignItems: "center",
|
|
267
|
+
flexWrap: "wrap",
|
|
268
|
+
gap: theme.spacing(1.5)
|
|
269
|
+
}));
|
|
270
|
+
const HeaderActions = stylin(Box)(({ theme }) => ({
|
|
271
|
+
display: "flex",
|
|
272
|
+
alignItems: "center",
|
|
273
|
+
gap: theme.spacing(1)
|
|
274
|
+
}));
|
|
275
|
+
const DefList = stylin(Box)(({ theme }) => ({
|
|
276
|
+
display: "flex",
|
|
277
|
+
flexDirection: "column",
|
|
278
|
+
gap: theme.spacing(1.25)
|
|
279
|
+
}));
|
|
280
|
+
const DefRow = stylin(Box)(({ theme }) => ({
|
|
281
|
+
display: "grid",
|
|
282
|
+
gridTemplateColumns: `${theme.spacing(18)} 1fr`,
|
|
283
|
+
alignItems: "center",
|
|
284
|
+
gap: theme.spacing(2),
|
|
285
|
+
[theme.breakpoints.down("sm")]: {
|
|
286
|
+
gridTemplateColumns: "1fr",
|
|
287
|
+
gap: theme.spacing(0.25)
|
|
288
|
+
}
|
|
289
|
+
}));
|
|
290
|
+
const DefLabel = stylin(Typography)(({ theme }) => ({
|
|
291
|
+
color: theme.palette.text.secondary,
|
|
292
|
+
fontSize: theme.typography.body2.fontSize,
|
|
293
|
+
textTransform: "uppercase",
|
|
294
|
+
letterSpacing: "0.04em",
|
|
295
|
+
fontWeight: theme.typography.fontWeightMedium
|
|
296
|
+
}));
|
|
297
|
+
const DefValue = stylin(Typography)(({ theme }) => ({
|
|
298
|
+
color: theme.palette.text.primary,
|
|
299
|
+
fontSize: theme.typography.body1.fontSize,
|
|
300
|
+
display: "flex",
|
|
301
|
+
alignItems: "center",
|
|
302
|
+
gap: theme.spacing(0.75),
|
|
303
|
+
minWidth: 0
|
|
304
|
+
}));
|
|
305
|
+
const DefMuted = stylin("span")(({ theme }) => ({
|
|
306
|
+
color: theme.palette.text.secondary
|
|
307
|
+
}));
|
|
308
|
+
const Mono = stylin("span")(({ theme }) => ({
|
|
309
|
+
fontFamily: theme.typography.fontFamilyMono,
|
|
310
|
+
fontSize: theme.typography.body2.fontSize,
|
|
311
|
+
color: theme.palette.text.primary,
|
|
312
|
+
wordBreak: "break-all",
|
|
313
|
+
minWidth: 0
|
|
314
|
+
}));
|
|
315
|
+
const MessageQuote = stylin(Box)(({ theme }) => ({
|
|
316
|
+
fontStyle: "italic",
|
|
317
|
+
color: theme.palette.text.secondary,
|
|
318
|
+
borderLeft: `3px solid ${theme.palette.divider}`,
|
|
319
|
+
paddingLeft: theme.spacing(1.5),
|
|
320
|
+
paddingTop: theme.spacing(0.5),
|
|
321
|
+
paddingBottom: theme.spacing(0.5)
|
|
322
|
+
}));
|
|
323
|
+
const PlanSourceBlock = stylin(Box)(({ theme }) => ({
|
|
324
|
+
display: "flex",
|
|
325
|
+
flexDirection: "column",
|
|
326
|
+
gap: theme.spacing(1),
|
|
327
|
+
alignItems: "flex-start"
|
|
328
|
+
}));
|
|
329
|
+
const PlanSourceLink = stylin(Button)(({ theme }) => ({
|
|
330
|
+
alignSelf: "flex-start",
|
|
331
|
+
padding: theme.spacing(0.25, 1),
|
|
332
|
+
marginLeft: theme.spacing(-1)
|
|
333
|
+
}));
|
|
334
|
+
const Section = stylin(Box)(({ theme }) => ({
|
|
335
|
+
display: "flex",
|
|
336
|
+
flexDirection: "column",
|
|
337
|
+
gap: theme.spacing(1)
|
|
338
|
+
}));
|
|
339
|
+
const SectionHeading = stylin(Typography)(({ theme }) => ({
|
|
340
|
+
fontWeight: theme.typography.fontWeightBold
|
|
341
|
+
}));
|
|
342
|
+
const Card = stylin(Box)(({ theme }) => ({
|
|
343
|
+
border: `1px solid ${theme.palette.divider}`,
|
|
344
|
+
borderRadius: 1,
|
|
345
|
+
padding: theme.spacing(1),
|
|
346
|
+
display: "flex",
|
|
347
|
+
flexDirection: "column",
|
|
348
|
+
gap: theme.spacing(0.5),
|
|
349
|
+
overflow: "hidden"
|
|
350
|
+
}));
|
|
351
|
+
const RowLine = stylin(Box)(({ theme }) => ({
|
|
352
|
+
display: "flex",
|
|
353
|
+
alignItems: "center",
|
|
354
|
+
gap: theme.spacing(1),
|
|
355
|
+
flexWrap: "wrap",
|
|
356
|
+
minWidth: 0
|
|
357
|
+
}));
|
|
358
|
+
const MonoLabel = stylin(Typography)(({ theme }) => ({
|
|
359
|
+
fontSize: theme.typography.pxToRem(11),
|
|
360
|
+
color: theme.palette.text.secondary,
|
|
361
|
+
minWidth: 110,
|
|
362
|
+
fontFamily: theme.typography.fontFamilyMono,
|
|
363
|
+
overflow: "hidden",
|
|
364
|
+
textOverflow: "ellipsis",
|
|
365
|
+
whiteSpace: "nowrap"
|
|
366
|
+
}));
|
|
367
|
+
const MonoValue = stylin(Typography)(({ theme }) => ({
|
|
368
|
+
fontSize: theme.typography.pxToRem(12),
|
|
369
|
+
color: theme.palette.text.primary,
|
|
370
|
+
fontFamily: theme.typography.fontFamilyMono,
|
|
371
|
+
overflow: "hidden",
|
|
372
|
+
textOverflow: "ellipsis",
|
|
373
|
+
whiteSpace: "nowrap",
|
|
374
|
+
flex: 1,
|
|
375
|
+
minWidth: 0
|
|
376
|
+
}));
|
|
377
|
+
const EmptyNote = stylin(Typography)(({ theme }) => ({
|
|
378
|
+
fontSize: theme.typography.pxToRem(12),
|
|
379
|
+
color: theme.palette.text.secondary,
|
|
380
|
+
fontStyle: "italic"
|
|
381
|
+
}));
|
|
382
|
+
|
|
383
|
+
export { ViewDeploymentDetails, ViewDeploymentDetails as default };
|
|
384
|
+
//# sourceMappingURL=ViewDeploymentDetails.esm.js.map
|