@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,216 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import Box from '@massdriver/ui/Box';
|
|
3
|
+
import Typography from '@massdriver/ui/Typography';
|
|
4
|
+
import IconButton from '@massdriver/ui/IconButton';
|
|
5
|
+
import Tooltip from '@massdriver/ui/Tooltip';
|
|
6
|
+
import Button from '@massdriver/ui/Button';
|
|
7
|
+
import Select, { MenuItem } from '@massdriver/ui/Select';
|
|
8
|
+
import stylin from '@massdriver/ui/stylin';
|
|
9
|
+
import CompareArrowsIcon from '@massdriver/ui/icons/CompareArrowsIcon';
|
|
10
|
+
import SwapHorizIcon from '@massdriver/ui/icons/SwapHorizIcon';
|
|
11
|
+
import VersionBadge from '../../../components/VersionBadge.esm.js';
|
|
12
|
+
import { truncateDeploymentId, formatDeploymentStatus } from '../InstanceDrawer/helpers.esm.js';
|
|
13
|
+
|
|
14
|
+
const optionLabel = (deployment, fallbackId, position) => {
|
|
15
|
+
const short = truncateDeploymentId(deployment?.id ?? fallbackId);
|
|
16
|
+
return position != null ? `#${position} \xB7 ${short}` : short;
|
|
17
|
+
};
|
|
18
|
+
const SelectStep = ({
|
|
19
|
+
source,
|
|
20
|
+
target,
|
|
21
|
+
deployments,
|
|
22
|
+
positionMap,
|
|
23
|
+
onSourceChange,
|
|
24
|
+
onTargetChange,
|
|
25
|
+
onSwap,
|
|
26
|
+
onCompare
|
|
27
|
+
}) => {
|
|
28
|
+
const sameSelected = Boolean(source && target && source.id === target.id);
|
|
29
|
+
const canCompare = Boolean(source && target && !sameSelected);
|
|
30
|
+
const canSwap = Boolean(source) && Boolean(target);
|
|
31
|
+
const find = (id) => deployments.find((deployment) => deployment.id === id) ?? null;
|
|
32
|
+
const renderOptions = (excludeId) => deployments.map((deployment) => /* @__PURE__ */ jsx(
|
|
33
|
+
MenuItem,
|
|
34
|
+
{
|
|
35
|
+
value: deployment.id,
|
|
36
|
+
disabled: deployment.id === excludeId,
|
|
37
|
+
children: /* @__PURE__ */ jsxs(OptionRow, { children: [
|
|
38
|
+
/* @__PURE__ */ jsxs(OptionMain, { children: [
|
|
39
|
+
/* @__PURE__ */ jsx(Position, { children: positionMap.get(deployment.id) ?? "" }),
|
|
40
|
+
/* @__PURE__ */ jsx(OptionId, { title: deployment.id, children: truncateDeploymentId(deployment.id) }),
|
|
41
|
+
deployment.version ? /* @__PURE__ */ jsx(VersionBadge, { version: deployment.version }) : null
|
|
42
|
+
] }),
|
|
43
|
+
/* @__PURE__ */ jsx(OptionStatus, { children: formatDeploymentStatus(deployment.action, deployment.status) })
|
|
44
|
+
] })
|
|
45
|
+
},
|
|
46
|
+
deployment.id
|
|
47
|
+
));
|
|
48
|
+
return /* @__PURE__ */ jsx(Root, { children: /* @__PURE__ */ jsxs(Center, { children: [
|
|
49
|
+
/* @__PURE__ */ jsx(IconBadge, { children: /* @__PURE__ */ jsx(CompareArrowsIcon, {}) }),
|
|
50
|
+
/* @__PURE__ */ jsxs(Heading, { children: [
|
|
51
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h4", component: "h2", children: "Compare Deployments" }),
|
|
52
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body1", color: "text.secondary", children: "Pick two deployments to see how their parameters and version differ." })
|
|
53
|
+
] }),
|
|
54
|
+
/* @__PURE__ */ jsxs(PickerRow, { children: [
|
|
55
|
+
/* @__PURE__ */ jsx(PickerSlot, { children: /* @__PURE__ */ jsx(
|
|
56
|
+
Select,
|
|
57
|
+
{
|
|
58
|
+
fullWidth: true,
|
|
59
|
+
displayEmpty: true,
|
|
60
|
+
value: source?.id ?? "",
|
|
61
|
+
onChange: (event) => onSourceChange(find(event.target.value)),
|
|
62
|
+
renderValue: (value) => value ? optionLabel(find(value), value, positionMap.get(value)) : "Pick a deployment\u2026",
|
|
63
|
+
children: renderOptions(target?.id)
|
|
64
|
+
}
|
|
65
|
+
) }),
|
|
66
|
+
/* @__PURE__ */ jsx(
|
|
67
|
+
Tooltip,
|
|
68
|
+
{
|
|
69
|
+
title: canSwap ? "Swap deployments" : "Pick both first",
|
|
70
|
+
arrow: true,
|
|
71
|
+
children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(
|
|
72
|
+
SwapButton,
|
|
73
|
+
{
|
|
74
|
+
size: "medium",
|
|
75
|
+
onClick: onSwap,
|
|
76
|
+
disabled: !canSwap,
|
|
77
|
+
"aria-label": "Swap deployments",
|
|
78
|
+
children: /* @__PURE__ */ jsx(SwapHorizIcon, {})
|
|
79
|
+
}
|
|
80
|
+
) })
|
|
81
|
+
}
|
|
82
|
+
),
|
|
83
|
+
/* @__PURE__ */ jsx(PickerSlot, { children: /* @__PURE__ */ jsx(
|
|
84
|
+
Select,
|
|
85
|
+
{
|
|
86
|
+
fullWidth: true,
|
|
87
|
+
displayEmpty: true,
|
|
88
|
+
value: target?.id ?? "",
|
|
89
|
+
onChange: (event) => onTargetChange(find(event.target.value)),
|
|
90
|
+
renderValue: (value) => value ? optionLabel(find(value), value, positionMap.get(value)) : "Pick a deployment\u2026",
|
|
91
|
+
children: renderOptions(source?.id)
|
|
92
|
+
}
|
|
93
|
+
) })
|
|
94
|
+
] }),
|
|
95
|
+
sameSelected ? /* @__PURE__ */ jsx(WarnLine, { variant: "caption", children: "Pick two different deployments to compare." }) : /* @__PURE__ */ jsx(Spacer, {}),
|
|
96
|
+
/* @__PURE__ */ jsx(
|
|
97
|
+
CompareButton,
|
|
98
|
+
{
|
|
99
|
+
variant: "contained",
|
|
100
|
+
size: "large",
|
|
101
|
+
onClick: onCompare,
|
|
102
|
+
disabled: !canCompare,
|
|
103
|
+
children: "Compare"
|
|
104
|
+
}
|
|
105
|
+
)
|
|
106
|
+
] }) });
|
|
107
|
+
};
|
|
108
|
+
const Root = stylin(Box)(({ theme }) => ({
|
|
109
|
+
flex: 1,
|
|
110
|
+
display: "flex",
|
|
111
|
+
alignItems: "center",
|
|
112
|
+
justifyContent: "center",
|
|
113
|
+
padding: theme.spacing(4)
|
|
114
|
+
}));
|
|
115
|
+
const Center = stylin(Box)(({ theme }) => ({
|
|
116
|
+
width: "100%",
|
|
117
|
+
maxWidth: theme.spacing(90),
|
|
118
|
+
display: "flex",
|
|
119
|
+
flexDirection: "column",
|
|
120
|
+
alignItems: "center",
|
|
121
|
+
gap: theme.spacing(3)
|
|
122
|
+
}));
|
|
123
|
+
const IconBadge = stylin(Box)(({ theme }) => ({
|
|
124
|
+
display: "flex",
|
|
125
|
+
alignItems: "center",
|
|
126
|
+
justifyContent: "center",
|
|
127
|
+
width: theme.spacing(7),
|
|
128
|
+
height: theme.spacing(7),
|
|
129
|
+
borderRadius: "50%",
|
|
130
|
+
backgroundColor: theme.palette.action.selected,
|
|
131
|
+
color: theme.palette.primary.main,
|
|
132
|
+
"& > svg": { fontSize: 32 }
|
|
133
|
+
}));
|
|
134
|
+
const Heading = stylin(Box)(({ theme }) => ({
|
|
135
|
+
display: "flex",
|
|
136
|
+
flexDirection: "column",
|
|
137
|
+
alignItems: "center",
|
|
138
|
+
textAlign: "center",
|
|
139
|
+
gap: theme.spacing(1),
|
|
140
|
+
maxWidth: theme.spacing(75)
|
|
141
|
+
}));
|
|
142
|
+
const PickerRow = stylin(Box)(({ theme }) => ({
|
|
143
|
+
width: "100%",
|
|
144
|
+
display: "flex",
|
|
145
|
+
alignItems: "center",
|
|
146
|
+
gap: theme.spacing(1.5),
|
|
147
|
+
marginTop: theme.spacing(2),
|
|
148
|
+
[theme.breakpoints.down("sm")]: {
|
|
149
|
+
flexDirection: "column"
|
|
150
|
+
}
|
|
151
|
+
}));
|
|
152
|
+
const PickerSlot = stylin(Box)({
|
|
153
|
+
flex: 1,
|
|
154
|
+
minWidth: 0,
|
|
155
|
+
width: "100%"
|
|
156
|
+
});
|
|
157
|
+
const OptionRow = stylin(Box)(({ theme }) => ({
|
|
158
|
+
display: "flex",
|
|
159
|
+
alignItems: "center",
|
|
160
|
+
justifyContent: "space-between",
|
|
161
|
+
gap: theme.spacing(1.5),
|
|
162
|
+
width: "100%",
|
|
163
|
+
minWidth: 0
|
|
164
|
+
}));
|
|
165
|
+
const OptionMain = stylin(Box)(({ theme }) => ({
|
|
166
|
+
display: "flex",
|
|
167
|
+
alignItems: "center",
|
|
168
|
+
gap: theme.spacing(1),
|
|
169
|
+
minWidth: 0
|
|
170
|
+
}));
|
|
171
|
+
const Position = stylin("span")(({ theme }) => ({
|
|
172
|
+
fontFamily: theme.typography.fontFamilyMono,
|
|
173
|
+
fontSize: theme.typography.body2.fontSize,
|
|
174
|
+
fontWeight: theme.typography.fontWeightBold,
|
|
175
|
+
color: theme.palette.text.secondary
|
|
176
|
+
}));
|
|
177
|
+
const OptionId = stylin("span")(({ theme }) => ({
|
|
178
|
+
fontFamily: theme.typography.fontFamilyMono,
|
|
179
|
+
fontSize: theme.typography.body2.fontSize,
|
|
180
|
+
fontWeight: theme.typography.fontWeightBold,
|
|
181
|
+
color: theme.palette.text.primary,
|
|
182
|
+
whiteSpace: "nowrap",
|
|
183
|
+
overflow: "hidden",
|
|
184
|
+
textOverflow: "ellipsis"
|
|
185
|
+
}));
|
|
186
|
+
const OptionStatus = stylin("span")(({ theme }) => ({
|
|
187
|
+
fontSize: theme.typography.caption.fontSize,
|
|
188
|
+
color: theme.palette.text.secondary,
|
|
189
|
+
whiteSpace: "nowrap",
|
|
190
|
+
flexShrink: 0
|
|
191
|
+
}));
|
|
192
|
+
const SwapButton = stylin(IconButton)(({ theme }) => ({
|
|
193
|
+
color: theme.palette.text.secondary,
|
|
194
|
+
border: `1px solid ${theme.palette.divider}`,
|
|
195
|
+
backgroundColor: theme.palette.background.paper,
|
|
196
|
+
flexShrink: 0,
|
|
197
|
+
"&:hover": {
|
|
198
|
+
color: theme.palette.primary.main,
|
|
199
|
+
borderColor: theme.palette.primary.main,
|
|
200
|
+
backgroundColor: theme.palette.background.paper
|
|
201
|
+
}
|
|
202
|
+
}));
|
|
203
|
+
const WarnLine = stylin(Typography)(({ theme }) => ({
|
|
204
|
+
color: theme.palette.warning.main,
|
|
205
|
+
marginTop: theme.spacing(0.5)
|
|
206
|
+
}));
|
|
207
|
+
const Spacer = stylin(Box)(({ theme }) => ({
|
|
208
|
+
height: theme.spacing(2)
|
|
209
|
+
}));
|
|
210
|
+
const CompareButton = stylin(Button)(({ theme }) => ({
|
|
211
|
+
minWidth: theme.spacing(24),
|
|
212
|
+
marginTop: theme.spacing(1)
|
|
213
|
+
}));
|
|
214
|
+
|
|
215
|
+
export { SelectStep, SelectStep as default };
|
|
216
|
+
//# sourceMappingURL=SelectStep.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectStep.esm.js","sources":["../../../../src/features/environment/CompareDeploymentsDialog/SelectStep.tsx"],"sourcesContent":["import Box from '@massdriver/ui/Box';\nimport Typography from '@massdriver/ui/Typography';\nimport IconButton from '@massdriver/ui/IconButton';\nimport Tooltip from '@massdriver/ui/Tooltip';\nimport Button from '@massdriver/ui/Button';\nimport Select, { MenuItem } from '@massdriver/ui/Select';\nimport stylin from '@massdriver/ui/stylin';\nimport CompareArrowsIcon from '@massdriver/ui/icons/CompareArrowsIcon';\nimport SwapHorizIcon from '@massdriver/ui/icons/SwapHorizIcon';\nimport VersionBadge from '../../../components/VersionBadge';\nimport {\n formatDeploymentStatus,\n truncateDeploymentId,\n} from '../InstanceDrawer/helpers';\nimport type { Deployment } from '../InstanceDrawer/types';\n\n// `deployment` can be null when a held selection is no longer in the list\n// (e.g. the deployment aged out of the capped fetch) — fall back to the raw id.\nconst optionLabel = (\n deployment: Deployment | null,\n fallbackId: string,\n position?: number,\n): string => {\n const short = truncateDeploymentId(deployment?.id ?? fallbackId);\n return position != null ? `#${position} · ${short}` : short;\n};\n\n/**\n * Step 1 of the deployment compare flow: pick two deployments. Simplified from\n * the web app's infinite-scroll pickers to plain Selects — the dialog already\n * fetches the instance's (capped) deployment list into memory.\n */\nexport const SelectStep = ({\n source,\n target,\n deployments,\n positionMap,\n onSourceChange,\n onTargetChange,\n onSwap,\n onCompare,\n}: {\n source: Deployment | null;\n target: Deployment | null;\n deployments: Deployment[];\n positionMap: Map<string, number>;\n onSourceChange: (deployment: Deployment | null) => void;\n onTargetChange: (deployment: Deployment | null) => void;\n onSwap: () => void;\n onCompare: () => void;\n}) => {\n const sameSelected = Boolean(source && target && source.id === target.id);\n const canCompare = Boolean(source && target && !sameSelected);\n const canSwap = Boolean(source) && Boolean(target);\n\n const find = (id: string) =>\n deployments.find(deployment => deployment.id === id) ?? null;\n\n const renderOptions = (excludeId?: string) =>\n deployments.map(deployment => (\n <MenuItem\n key={deployment.id}\n value={deployment.id}\n disabled={deployment.id === excludeId}\n >\n <OptionRow>\n <OptionMain>\n <Position>{positionMap.get(deployment.id) ?? ''}</Position>\n <OptionId title={deployment.id}>\n {truncateDeploymentId(deployment.id)}\n </OptionId>\n {deployment.version ? (\n <VersionBadge version={deployment.version} />\n ) : null}\n </OptionMain>\n <OptionStatus>\n {formatDeploymentStatus(deployment.action, deployment.status)}\n </OptionStatus>\n </OptionRow>\n </MenuItem>\n ));\n\n return (\n <Root>\n <Center>\n <IconBadge>\n <CompareArrowsIcon />\n </IconBadge>\n\n <Heading>\n <Typography variant=\"h4\" component=\"h2\">\n Compare Deployments\n </Typography>\n <Typography variant=\"body1\" color=\"text.secondary\">\n Pick two deployments to see how their parameters and version differ.\n </Typography>\n </Heading>\n\n <PickerRow>\n <PickerSlot>\n <Select\n fullWidth\n displayEmpty\n value={source?.id ?? ''}\n onChange={(event: any) =>\n onSourceChange(find(event.target.value))\n }\n renderValue={(value: string) =>\n value\n ? optionLabel(find(value), value, positionMap.get(value))\n : 'Pick a deployment…'\n }\n >\n {renderOptions(target?.id)}\n </Select>\n </PickerSlot>\n\n <Tooltip\n title={canSwap ? 'Swap deployments' : 'Pick both first'}\n arrow\n >\n <span>\n <SwapButton\n size=\"medium\"\n onClick={onSwap}\n disabled={!canSwap}\n aria-label=\"Swap deployments\"\n >\n <SwapHorizIcon />\n </SwapButton>\n </span>\n </Tooltip>\n\n <PickerSlot>\n <Select\n fullWidth\n displayEmpty\n value={target?.id ?? ''}\n onChange={(event: any) =>\n onTargetChange(find(event.target.value))\n }\n renderValue={(value: string) =>\n value\n ? optionLabel(find(value), value, positionMap.get(value))\n : 'Pick a deployment…'\n }\n >\n {renderOptions(source?.id)}\n </Select>\n </PickerSlot>\n </PickerRow>\n\n {sameSelected ? (\n <WarnLine variant=\"caption\">\n Pick two different deployments to compare.\n </WarnLine>\n ) : (\n <Spacer />\n )}\n\n <CompareButton\n variant=\"contained\"\n size=\"large\"\n onClick={onCompare}\n disabled={!canCompare}\n >\n Compare\n </CompareButton>\n </Center>\n </Root>\n );\n};\n\nexport default SelectStep;\n\nconst Root = stylin(Box)(({ theme }: { theme: any }) => ({\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: theme.spacing(4),\n}));\n\nconst Center = stylin(Box)(({ theme }: { theme: any }) => ({\n width: '100%',\n maxWidth: theme.spacing(90),\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: theme.spacing(3),\n}));\n\nconst IconBadge = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: theme.spacing(7),\n height: theme.spacing(7),\n borderRadius: '50%',\n backgroundColor: theme.palette.action.selected,\n color: theme.palette.primary.main,\n '& > svg': { fontSize: 32 },\n}));\n\nconst Heading = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n textAlign: 'center',\n gap: theme.spacing(1),\n maxWidth: theme.spacing(75),\n}));\n\nconst PickerRow = stylin(Box)(({ theme }: { theme: any }) => ({\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1.5),\n marginTop: theme.spacing(2),\n [theme.breakpoints.down('sm')]: {\n flexDirection: 'column',\n },\n}));\n\nconst PickerSlot = stylin(Box)({\n flex: 1,\n minWidth: 0,\n width: '100%',\n});\n\nconst OptionRow = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: theme.spacing(1.5),\n width: '100%',\n minWidth: 0,\n}));\n\nconst OptionMain = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n minWidth: 0,\n}));\n\nconst Position = stylin('span')(({ theme }: { theme: any }) => ({\n fontFamily: theme.typography.fontFamilyMono,\n fontSize: theme.typography.body2.fontSize,\n fontWeight: theme.typography.fontWeightBold,\n color: theme.palette.text.secondary,\n}));\n\nconst OptionId = stylin('span')(({ theme }: { theme: any }) => ({\n fontFamily: theme.typography.fontFamilyMono,\n fontSize: theme.typography.body2.fontSize,\n fontWeight: theme.typography.fontWeightBold,\n color: theme.palette.text.primary,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n}));\n\nconst OptionStatus = stylin('span')(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.caption.fontSize,\n color: theme.palette.text.secondary,\n whiteSpace: 'nowrap',\n flexShrink: 0,\n}));\n\nconst SwapButton = stylin(IconButton)(({ theme }: { theme: any }) => ({\n color: theme.palette.text.secondary,\n border: `1px solid ${theme.palette.divider}`,\n backgroundColor: theme.palette.background.paper,\n flexShrink: 0,\n '&:hover': {\n color: theme.palette.primary.main,\n borderColor: theme.palette.primary.main,\n backgroundColor: theme.palette.background.paper,\n },\n}));\n\nconst WarnLine = stylin(Typography)(({ theme }: { theme: any }) => ({\n color: theme.palette.warning.main,\n marginTop: theme.spacing(0.5),\n}));\n\nconst Spacer = stylin(Box)(({ theme }: { theme: any }) => ({\n height: theme.spacing(2),\n}));\n\nconst CompareButton = stylin(Button)(({ theme }: { theme: any }) => ({\n minWidth: theme.spacing(24),\n marginTop: theme.spacing(1),\n}));\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { col } from '@massdriver/ui/DataList';
|
|
3
|
+
import Box from '@massdriver/ui/Box';
|
|
4
|
+
import Chip from '@massdriver/ui/Chip';
|
|
5
|
+
import stylin from '@massdriver/ui/stylin';
|
|
6
|
+
import { ComparisonValueCell } from '../CompareEnvironmentsDialog/ComparisonValueCell.esm.js';
|
|
7
|
+
import { VERSION_PATH } from '../CompareEnvironmentsDialog/flattenComparison.esm.js';
|
|
8
|
+
|
|
9
|
+
const renderPathCell = (value, row) => /* @__PURE__ */ jsxs(PathCellWrap, { children: [
|
|
10
|
+
/* @__PURE__ */ jsx(StatusStripe, { status: row.status }),
|
|
11
|
+
value === VERSION_PATH ? /* @__PURE__ */ jsx(Chip, { size: "small", variant: "outlined", label: "Version" }) : /* @__PURE__ */ jsx(PathText, { children: value })
|
|
12
|
+
] });
|
|
13
|
+
const renderLeftCell = (_value, row) => /* @__PURE__ */ jsx(
|
|
14
|
+
ComparisonValueCell,
|
|
15
|
+
{
|
|
16
|
+
side: row.source,
|
|
17
|
+
isDifferent: row.status === "different",
|
|
18
|
+
isMissing: row.status === "targetOnly"
|
|
19
|
+
}
|
|
20
|
+
);
|
|
21
|
+
const renderRightCell = (_value, row) => /* @__PURE__ */ jsx(
|
|
22
|
+
ComparisonValueCell,
|
|
23
|
+
{
|
|
24
|
+
side: row.target,
|
|
25
|
+
isDifferent: row.status === "different",
|
|
26
|
+
isMissing: row.status === "sourceOnly"
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
const buildCompareColumns = ({
|
|
30
|
+
leftLabel,
|
|
31
|
+
rightLabel
|
|
32
|
+
} = {}) => [
|
|
33
|
+
col.custom("path", "Path", renderPathCell, {
|
|
34
|
+
flex: 2,
|
|
35
|
+
minWidth: 200,
|
|
36
|
+
sortable: true,
|
|
37
|
+
searchable: true
|
|
38
|
+
}),
|
|
39
|
+
col.custom("sourceValue", leftLabel || "Source", renderLeftCell, {
|
|
40
|
+
flex: 2,
|
|
41
|
+
minWidth: 180,
|
|
42
|
+
sortable: true,
|
|
43
|
+
searchable: true
|
|
44
|
+
}),
|
|
45
|
+
col.custom("targetValue", rightLabel || "Target", renderRightCell, {
|
|
46
|
+
flex: 2,
|
|
47
|
+
minWidth: 180,
|
|
48
|
+
sortable: true,
|
|
49
|
+
searchable: true
|
|
50
|
+
})
|
|
51
|
+
];
|
|
52
|
+
const stripeColor = (theme, status) => {
|
|
53
|
+
if (status === "different") return theme.palette.warning.main;
|
|
54
|
+
if (status === "sourceOnly" || status === "targetOnly") {
|
|
55
|
+
return theme.palette.info.main;
|
|
56
|
+
}
|
|
57
|
+
return "transparent";
|
|
58
|
+
};
|
|
59
|
+
const PathCellWrap = stylin(Box)(({ theme }) => ({
|
|
60
|
+
display: "flex",
|
|
61
|
+
alignItems: "center",
|
|
62
|
+
gap: theme.spacing(1),
|
|
63
|
+
minWidth: 0
|
|
64
|
+
}));
|
|
65
|
+
const StatusStripe = stylin(Box, ["status"])(
|
|
66
|
+
({ theme, status }) => ({
|
|
67
|
+
width: 3,
|
|
68
|
+
alignSelf: "stretch",
|
|
69
|
+
minHeight: theme.spacing(3),
|
|
70
|
+
borderRadius: "2px",
|
|
71
|
+
backgroundColor: stripeColor(theme, status),
|
|
72
|
+
flexShrink: 0,
|
|
73
|
+
marginLeft: "-4px"
|
|
74
|
+
})
|
|
75
|
+
);
|
|
76
|
+
const PathText = stylin(Box)(({ theme }) => ({
|
|
77
|
+
fontFamily: theme.typography.fontFamilyMono,
|
|
78
|
+
fontSize: theme.typography.caption.fontSize,
|
|
79
|
+
color: theme.palette.text.secondary,
|
|
80
|
+
whiteSpace: "nowrap",
|
|
81
|
+
overflow: "hidden",
|
|
82
|
+
textOverflow: "ellipsis"
|
|
83
|
+
}));
|
|
84
|
+
|
|
85
|
+
export { buildCompareColumns, buildCompareColumns as default };
|
|
86
|
+
//# sourceMappingURL=compareColumns.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compareColumns.esm.js","sources":["../../../../src/features/environment/CompareDeploymentsDialog/compareColumns.tsx"],"sourcesContent":["import { col } from '@massdriver/ui/DataList';\nimport Box from '@massdriver/ui/Box';\nimport Chip from '@massdriver/ui/Chip';\nimport stylin from '@massdriver/ui/stylin';\nimport ComparisonValueCell from '../CompareEnvironmentsDialog/ComparisonValueCell';\nimport {\n VERSION_PATH,\n type ComparisonStatus,\n} from '../CompareEnvironmentsDialog/flattenComparison';\nimport type { DeploymentComparisonRow } from './flattenDeploymentComparison';\n\nconst renderPathCell = (value: string, row: DeploymentComparisonRow) => (\n <PathCellWrap>\n <StatusStripe status={row.status} />\n {value === VERSION_PATH ? (\n <Chip size=\"small\" variant=\"outlined\" label=\"Version\" />\n ) : (\n <PathText>{value}</PathText>\n )}\n </PathCellWrap>\n);\n\nconst renderLeftCell = (_value: unknown, row: DeploymentComparisonRow) => (\n <ComparisonValueCell\n side={row.source}\n isDifferent={row.status === 'different'}\n isMissing={row.status === 'targetOnly'}\n />\n);\n\nconst renderRightCell = (_value: unknown, row: DeploymentComparisonRow) => (\n <ComparisonValueCell\n side={row.target}\n isDifferent={row.status === 'different'}\n isMissing={row.status === 'sourceOnly'}\n />\n);\n\nexport const buildCompareColumns = ({\n leftLabel,\n rightLabel,\n}: {\n leftLabel?: string;\n rightLabel?: string;\n} = {}) => [\n col.custom('path', 'Path', renderPathCell, {\n flex: 2,\n minWidth: 200,\n sortable: true,\n searchable: true,\n }),\n col.custom('sourceValue', leftLabel || 'Source', renderLeftCell, {\n flex: 2,\n minWidth: 180,\n sortable: true,\n searchable: true,\n }),\n col.custom('targetValue', rightLabel || 'Target', renderRightCell, {\n flex: 2,\n minWidth: 180,\n sortable: true,\n searchable: true,\n }),\n];\n\nexport default buildCompareColumns;\n\n// Left status stripe: different → warning, source/target-only → info, equal →\n// transparent. Colors resolve from the theme palette (raw CSS, not sx tokens).\nconst stripeColor = (theme: any, status: ComparisonStatus): string => {\n if (status === 'different') return theme.palette.warning.main;\n if (status === 'sourceOnly' || status === 'targetOnly') {\n return theme.palette.info.main;\n }\n return 'transparent';\n};\n\nconst PathCellWrap = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n minWidth: 0,\n}));\n\nconst StatusStripe = stylin(Box, ['status'])(\n ({ theme, status }: { theme: any; status: ComparisonStatus }) => ({\n width: 3,\n alignSelf: 'stretch',\n minHeight: theme.spacing(3),\n borderRadius: '2px',\n backgroundColor: stripeColor(theme, status),\n flexShrink: 0,\n marginLeft: '-4px',\n }),\n);\n\nconst PathText = stylin(Box)(({ theme }: { theme: any }) => ({\n fontFamily: theme.typography.fontFamilyMono,\n fontSize: theme.typography.caption.fontSize,\n color: theme.palette.text.secondary,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n}));\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { computeStatus, VERSION_PATH } from '../CompareEnvironmentsDialog/flattenComparison.esm.js';
|
|
2
|
+
|
|
3
|
+
const sideToString = (side) => {
|
|
4
|
+
if (!side?.present) return null;
|
|
5
|
+
const value = side.value;
|
|
6
|
+
if (value == null) return "null";
|
|
7
|
+
return typeof value === "string" ? value : JSON.stringify(value);
|
|
8
|
+
};
|
|
9
|
+
const flattenDeploymentComparison = (comparison) => {
|
|
10
|
+
if (!comparison) return [];
|
|
11
|
+
const version = comparison.version;
|
|
12
|
+
const params = (comparison.params ?? []).filter(
|
|
13
|
+
Boolean
|
|
14
|
+
);
|
|
15
|
+
const versionSource = {
|
|
16
|
+
present: version?.source != null,
|
|
17
|
+
value: version?.source ?? null
|
|
18
|
+
};
|
|
19
|
+
const versionTarget = {
|
|
20
|
+
present: version?.target != null,
|
|
21
|
+
value: version?.target ?? null
|
|
22
|
+
};
|
|
23
|
+
const versionRow = {
|
|
24
|
+
id: "__version__",
|
|
25
|
+
kind: "version",
|
|
26
|
+
path: VERSION_PATH,
|
|
27
|
+
source: versionSource,
|
|
28
|
+
target: versionTarget,
|
|
29
|
+
sourceValue: sideToString(versionSource),
|
|
30
|
+
targetValue: sideToString(versionTarget),
|
|
31
|
+
equal: version?.equal ?? false,
|
|
32
|
+
status: computeStatus({
|
|
33
|
+
equal: version?.equal,
|
|
34
|
+
source: versionSource,
|
|
35
|
+
target: versionTarget
|
|
36
|
+
})
|
|
37
|
+
};
|
|
38
|
+
const paramRows = params.map((param) => {
|
|
39
|
+
const source = param.source ?? { present: false };
|
|
40
|
+
const target = param.target ?? { present: false };
|
|
41
|
+
return {
|
|
42
|
+
id: param.path,
|
|
43
|
+
kind: "param",
|
|
44
|
+
path: param.path,
|
|
45
|
+
source,
|
|
46
|
+
target,
|
|
47
|
+
sourceValue: sideToString(source),
|
|
48
|
+
targetValue: sideToString(target),
|
|
49
|
+
equal: param.equal ?? false,
|
|
50
|
+
status: computeStatus({ equal: param.equal, source, target })
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
return [versionRow, ...paramRows];
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export { flattenDeploymentComparison as default };
|
|
57
|
+
//# sourceMappingURL=flattenDeploymentComparison.esm.js.map
|
package/dist/features/environment/CompareDeploymentsDialog/flattenDeploymentComparison.esm.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flattenDeploymentComparison.esm.js","sources":["../../../../src/features/environment/CompareDeploymentsDialog/flattenDeploymentComparison.ts"],"sourcesContent":["import {\n computeStatus,\n VERSION_PATH,\n type ComparisonSide,\n type ComparisonStatus,\n} from '../CompareEnvironmentsDialog/flattenComparison';\n\n// Deployment comparison rows are un-grouped (no component dimension): a single\n// version row plus one row per param. Ported from the web app's\n// flattenDeploymentComparison.js. `computeStatus` / `VERSION_PATH` are reused\n// unchanged from the environment-compare flatten module.\nexport interface DeploymentComparisonRow {\n id: string;\n kind: 'version' | 'param';\n path: string;\n source: ComparisonSide;\n target: ComparisonSide;\n sourceValue: string | null;\n targetValue: string | null;\n equal: boolean;\n status: ComparisonStatus;\n}\n\ninterface DeploymentCompareParam {\n path: string;\n equal?: boolean | null;\n source?: ComparisonSide | null;\n target?: ComparisonSide | null;\n}\n\nexport interface DeploymentComparison {\n source?: Record<string, unknown> | null;\n target?: Record<string, unknown> | null;\n version?: {\n source?: string | null;\n target?: string | null;\n equal?: boolean | null;\n } | null;\n params?: (DeploymentCompareParam | null)[] | null;\n}\n\nconst sideToString = (side: ComparisonSide): string | null => {\n if (!side?.present) return null;\n const value = side.value;\n if (value == null) return 'null';\n return typeof value === 'string' ? value : JSON.stringify(value);\n};\n\nconst flattenDeploymentComparison = (\n comparison?: DeploymentComparison | null,\n): DeploymentComparisonRow[] => {\n if (!comparison) return [];\n\n const version = comparison.version;\n const params = (comparison.params ?? []).filter(\n Boolean,\n ) as DeploymentCompareParam[];\n\n const versionSource: ComparisonSide = {\n present: version?.source != null,\n value: version?.source ?? null,\n };\n const versionTarget: ComparisonSide = {\n present: version?.target != null,\n value: version?.target ?? null,\n };\n\n const versionRow: DeploymentComparisonRow = {\n id: '__version__',\n kind: 'version',\n path: VERSION_PATH,\n source: versionSource,\n target: versionTarget,\n sourceValue: sideToString(versionSource),\n targetValue: sideToString(versionTarget),\n equal: version?.equal ?? false,\n status: computeStatus({\n equal: version?.equal,\n source: versionSource,\n target: versionTarget,\n }),\n };\n\n const paramRows: DeploymentComparisonRow[] = params.map(param => {\n const source: ComparisonSide = param.source ?? { present: false };\n const target: ComparisonSide = param.target ?? { present: false };\n return {\n id: param.path,\n kind: 'param' as const,\n path: param.path,\n source,\n target,\n sourceValue: sideToString(source),\n targetValue: sideToString(target),\n equal: param.equal ?? false,\n status: computeStatus({ equal: param.equal, source, target }),\n };\n });\n\n return [versionRow, ...paramRows];\n};\n\nexport default flattenDeploymentComparison;\n"],"names":[],"mappings":";;AAyCA,MAAM,YAAA,GAAe,CAAC,IAAA,KAAwC;AAC5D,EAAA,IAAI,CAAC,IAAA,EAAM,OAAA,EAAS,OAAO,IAAA;AAC3B,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,MAAA;AAC1B,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AACjE,CAAA;AAEA,MAAM,2BAAA,GAA8B,CAClC,UAAA,KAC8B;AAC9B,EAAA,IAAI,CAAC,UAAA,EAAY,OAAO,EAAC;AAEzB,EAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAC3B,EAAA,MAAM,MAAA,GAAA,CAAU,UAAA,CAAW,MAAA,IAAU,EAAC,EAAG,MAAA;AAAA,IACvC;AAAA,GACF;AAEA,EAAA,MAAM,aAAA,GAAgC;AAAA,IACpC,OAAA,EAAS,SAAS,MAAA,IAAU,IAAA;AAAA,IAC5B,KAAA,EAAO,SAAS,MAAA,IAAU;AAAA,GAC5B;AACA,EAAA,MAAM,aAAA,GAAgC;AAAA,IACpC,OAAA,EAAS,SAAS,MAAA,IAAU,IAAA;AAAA,IAC5B,KAAA,EAAO,SAAS,MAAA,IAAU;AAAA,GAC5B;AAEA,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,EAAA,EAAI,aAAA;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,IAAA,EAAM,YAAA;AAAA,IACN,MAAA,EAAQ,aAAA;AAAA,IACR,MAAA,EAAQ,aAAA;AAAA,IACR,WAAA,EAAa,aAAa,aAAa,CAAA;AAAA,IACvC,WAAA,EAAa,aAAa,aAAa,CAAA;AAAA,IACvC,KAAA,EAAO,SAAS,KAAA,IAAS,KAAA;AAAA,IACzB,QAAQ,aAAA,CAAc;AAAA,MACpB,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,MAAA,EAAQ,aAAA;AAAA,MACR,MAAA,EAAQ;AAAA,KACT;AAAA,GACH;AAEA,EAAA,MAAM,SAAA,GAAuC,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,KAAS;AAC/D,IAAA,MAAM,MAAA,GAAyB,KAAA,CAAM,MAAA,IAAU,EAAE,SAAS,KAAA,EAAM;AAChE,IAAA,MAAM,MAAA,GAAyB,KAAA,CAAM,MAAA,IAAU,EAAE,SAAS,KAAA,EAAM;AAChE,IAAA,OAAO;AAAA,MACL,IAAI,KAAA,CAAM,IAAA;AAAA,MACV,IAAA,EAAM,OAAA;AAAA,MACN,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA,EAAa,aAAa,MAAM,CAAA;AAAA,MAChC,WAAA,EAAa,aAAa,MAAM,CAAA;AAAA,MAChC,KAAA,EAAO,MAAM,KAAA,IAAS,KAAA;AAAA,MACtB,MAAA,EAAQ,cAAc,EAAE,KAAA,EAAO,MAAM,KAAA,EAAO,MAAA,EAAQ,QAAQ;AAAA,KAC9D;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,CAAC,UAAA,EAAY,GAAG,SAAS,CAAA;AAClC;;;;"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const COMPARE_DEPLOYMENTS_QUERY = `
|
|
2
|
+
query MassdriverCompareDeployments(
|
|
3
|
+
$organizationId: ID!
|
|
4
|
+
$sourceId: UUID!
|
|
5
|
+
$targetId: UUID!
|
|
6
|
+
) {
|
|
7
|
+
compareDeployments(
|
|
8
|
+
organizationId: $organizationId
|
|
9
|
+
sourceId: $sourceId
|
|
10
|
+
targetId: $targetId
|
|
11
|
+
) {
|
|
12
|
+
source { id status action version createdAt deployedBy message }
|
|
13
|
+
target { id status action version createdAt deployedBy message }
|
|
14
|
+
version { source target equal }
|
|
15
|
+
params {
|
|
16
|
+
path
|
|
17
|
+
equal
|
|
18
|
+
source { present value }
|
|
19
|
+
target { present value }
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
`;
|
|
24
|
+
const DEPLOYMENTS_BY_INSTANCE_QUERY = `
|
|
25
|
+
query MassdriverDeploymentsByInstance(
|
|
26
|
+
$organizationId: ID!
|
|
27
|
+
$filter: DeploymentsFilter
|
|
28
|
+
) {
|
|
29
|
+
deployments(
|
|
30
|
+
organizationId: $organizationId
|
|
31
|
+
filter: $filter
|
|
32
|
+
sort: { field: UPDATED_AT, order: DESC }
|
|
33
|
+
cursor: { limit: 50 }
|
|
34
|
+
) {
|
|
35
|
+
cursor { next }
|
|
36
|
+
items {
|
|
37
|
+
id
|
|
38
|
+
status
|
|
39
|
+
action
|
|
40
|
+
version
|
|
41
|
+
message
|
|
42
|
+
createdAt
|
|
43
|
+
updatedAt
|
|
44
|
+
lastTransitionedAt
|
|
45
|
+
elapsedTime
|
|
46
|
+
deployedBy
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
`;
|
|
51
|
+
|
|
52
|
+
export { COMPARE_DEPLOYMENTS_QUERY, DEPLOYMENTS_BY_INSTANCE_QUERY };
|
|
53
|
+
//# sourceMappingURL=queries.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.esm.js","sources":["../../../../src/features/environment/CompareDeploymentsDialog/queries.ts"],"sourcesContent":["import type { DeploymentComparison } from './flattenDeploymentComparison';\n\n// Field-by-field diff of two deployments. `organizationId` is injected by the\n// relay; callers pass sourceId + targetId only. NOTE: `compareDeployments` takes\n// `UUID!` ids (unlike the deployments-list filter, which takes `ID!`) — the\n// relay rejects the query if this is mismatched.\nexport const COMPARE_DEPLOYMENTS_QUERY = `\n query MassdriverCompareDeployments(\n $organizationId: ID!\n $sourceId: UUID!\n $targetId: UUID!\n ) {\n compareDeployments(\n organizationId: $organizationId\n sourceId: $sourceId\n targetId: $targetId\n ) {\n source { id status action version createdAt deployedBy message }\n target { id status action version createdAt deployedBy message }\n version { source target equal }\n params {\n path\n equal\n source { present value }\n target { present value }\n }\n }\n }\n`;\n\nexport interface CompareDeploymentsResult {\n compareDeployments: DeploymentComparison | null;\n}\n\n// Feeds the two deployment pickers. Filtered by instance only (unaffected by the\n// History tab's action filter) and capped at a single page of 50 — the web app's\n// infinite-scroll picker is dropped as an acceptable read-only simplification.\nexport const DEPLOYMENTS_BY_INSTANCE_QUERY = `\n query MassdriverDeploymentsByInstance(\n $organizationId: ID!\n $filter: DeploymentsFilter\n ) {\n deployments(\n organizationId: $organizationId\n filter: $filter\n sort: { field: UPDATED_AT, order: DESC }\n cursor: { limit: 50 }\n ) {\n cursor { next }\n items {\n id\n status\n action\n version\n message\n createdAt\n updatedAt\n lastTransitionedAt\n elapsedTime\n deployedBy\n }\n }\n }\n`;\n"],"names":[],"mappings":"AAMO,MAAM,yBAAA,GAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BlC,MAAM,6BAAA,GAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useEffect, useMemo } from 'react';
|
|
3
|
+
import { useApi } from '@backstage/frontend-plugin-api';
|
|
4
|
+
import useAsync from 'react-use/esm/useAsync';
|
|
5
|
+
import { Dialog, DialogTitle, DialogActions, DialogContent } from '@massdriver/ui/Dialog';
|
|
6
|
+
import Box from '@massdriver/ui/Box';
|
|
7
|
+
import Button from '@massdriver/ui/Button';
|
|
8
|
+
import Alert from '@massdriver/ui/Alert';
|
|
9
|
+
import LoadingIndicator from '@massdriver/ui/LoadingIndicator';
|
|
10
|
+
import stylin from '@massdriver/ui/stylin';
|
|
11
|
+
import { massdriverApiRef } from '../../../api.esm.js';
|
|
12
|
+
import { SelectStep } from './SelectStep.esm.js';
|
|
13
|
+
import { ResultsStep } from './ResultsStep.esm.js';
|
|
14
|
+
import flattenComparison from './flattenComparison.esm.js';
|
|
15
|
+
import { COMPARE_ENVIRONMENTS_QUERY } from './queries.esm.js';
|
|
16
|
+
|
|
17
|
+
const CompareEnvironmentsDialog = ({
|
|
18
|
+
open,
|
|
19
|
+
onClose,
|
|
20
|
+
projectName,
|
|
21
|
+
environments,
|
|
22
|
+
defaultSourceEnvironment
|
|
23
|
+
}) => {
|
|
24
|
+
const api = useApi(massdriverApiRef);
|
|
25
|
+
const [step, setStep] = useState("select");
|
|
26
|
+
const [source, setSource] = useState(null);
|
|
27
|
+
const [target, setTarget] = useState(null);
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
if (open) {
|
|
30
|
+
setSource(defaultSourceEnvironment ?? null);
|
|
31
|
+
setTarget(null);
|
|
32
|
+
setStep("select");
|
|
33
|
+
}
|
|
34
|
+
}, [open, defaultSourceEnvironment]);
|
|
35
|
+
const runCompare = step === "results" && source && target;
|
|
36
|
+
const { value, loading, error } = useAsync(async () => {
|
|
37
|
+
if (!runCompare) return null;
|
|
38
|
+
const data = await api.query(COMPARE_ENVIRONMENTS_QUERY, {
|
|
39
|
+
sourceId: source.id,
|
|
40
|
+
targetId: target.id
|
|
41
|
+
});
|
|
42
|
+
return data.compareEnvironments;
|
|
43
|
+
}, [api, runCompare, source?.id, target?.id]);
|
|
44
|
+
const rows = useMemo(() => flattenComparison(value), [value]);
|
|
45
|
+
const handleCompare = () => {
|
|
46
|
+
if (!source || !target || source.id === target.id) return;
|
|
47
|
+
setStep("results");
|
|
48
|
+
};
|
|
49
|
+
const handleSwap = () => {
|
|
50
|
+
setSource(target);
|
|
51
|
+
setTarget(source);
|
|
52
|
+
};
|
|
53
|
+
return /* @__PURE__ */ jsxs(Dialog, { open, onClose, maxWidth: "lg", fullWidth: true, children: [
|
|
54
|
+
/* @__PURE__ */ jsx(DialogTitle, { children: "Compare Environments" }),
|
|
55
|
+
/* @__PURE__ */ jsx(Body, { children: runCompare ? loading ? /* @__PURE__ */ jsx(Centered, { children: /* @__PURE__ */ jsx(LoadingIndicator, {}) }) : error ? /* @__PURE__ */ jsx(Centered, { children: /* @__PURE__ */ jsx(Alert, { severity: "error", children: String(error.message ?? error) }) }) : /* @__PURE__ */ jsx(
|
|
56
|
+
ResultsStep,
|
|
57
|
+
{
|
|
58
|
+
rows,
|
|
59
|
+
sourceName: value?.source?.name || source?.name,
|
|
60
|
+
targetName: value?.target?.name || target?.name,
|
|
61
|
+
loading,
|
|
62
|
+
onChangeSelection: () => setStep("select")
|
|
63
|
+
}
|
|
64
|
+
) : /* @__PURE__ */ jsx(
|
|
65
|
+
SelectStep,
|
|
66
|
+
{
|
|
67
|
+
source,
|
|
68
|
+
target,
|
|
69
|
+
environments,
|
|
70
|
+
projectName,
|
|
71
|
+
onSourceChange: setSource,
|
|
72
|
+
onTargetChange: setTarget,
|
|
73
|
+
onSwap: handleSwap,
|
|
74
|
+
onCompare: handleCompare
|
|
75
|
+
}
|
|
76
|
+
) }),
|
|
77
|
+
/* @__PURE__ */ jsx(DialogActions, { children: /* @__PURE__ */ jsx(Button, { variant: "text", onClick: onClose, children: "Close" }) })
|
|
78
|
+
] });
|
|
79
|
+
};
|
|
80
|
+
const Body = stylin(DialogContent)(({ theme }) => ({
|
|
81
|
+
display: "flex",
|
|
82
|
+
flexDirection: "column",
|
|
83
|
+
minHeight: theme.spacing(60)
|
|
84
|
+
}));
|
|
85
|
+
const Centered = stylin(Box)(({ theme }) => ({
|
|
86
|
+
flex: 1,
|
|
87
|
+
display: "flex",
|
|
88
|
+
alignItems: "center",
|
|
89
|
+
justifyContent: "center",
|
|
90
|
+
padding: theme.spacing(6)
|
|
91
|
+
}));
|
|
92
|
+
|
|
93
|
+
export { CompareEnvironmentsDialog, CompareEnvironmentsDialog as default };
|
|
94
|
+
//# sourceMappingURL=CompareEnvironmentsDialog.esm.js.map
|
package/dist/features/environment/CompareEnvironmentsDialog/CompareEnvironmentsDialog.esm.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompareEnvironmentsDialog.esm.js","sources":["../../../../src/features/environment/CompareEnvironmentsDialog/CompareEnvironmentsDialog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport { useApi } from '@backstage/frontend-plugin-api';\nimport useAsync from 'react-use/esm/useAsync';\nimport {\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n} from '@massdriver/ui/Dialog';\nimport Box from '@massdriver/ui/Box';\nimport Button from '@massdriver/ui/Button';\nimport Alert from '@massdriver/ui/Alert';\nimport LoadingIndicator from '@massdriver/ui/LoadingIndicator';\nimport stylin from '@massdriver/ui/stylin';\nimport { massdriverApiRef } from '../../../api';\nimport type { HeaderEnvironment } from '../GraphHeader/queries';\nimport SelectStep from './SelectStep';\nimport ResultsStep from './ResultsStep';\nimport flattenComparison from './flattenComparison';\nimport {\n COMPARE_ENVIRONMENTS_QUERY,\n type CompareEnvironmentsResult,\n} from './queries';\n\n/**\n * Read-only environment comparison dialog. Two steps: pick source + target\n * (SelectStep), then view the flattened field-by-field diff (ResultsStep). No\n * mutations — the web app's URL-param state is replaced with local `useState`.\n */\nexport const CompareEnvironmentsDialog = ({\n open,\n onClose,\n projectName,\n environments,\n defaultSourceEnvironment,\n}: {\n open: boolean;\n onClose: () => void;\n projectName?: string;\n environments: HeaderEnvironment[];\n defaultSourceEnvironment?: HeaderEnvironment | null;\n}) => {\n const api = useApi(massdriverApiRef);\n const [step, setStep] = useState<'select' | 'results'>('select');\n const [source, setSource] = useState<HeaderEnvironment | null>(null);\n const [target, setTarget] = useState<HeaderEnvironment | null>(null);\n\n useEffect(() => {\n if (open) {\n setSource(defaultSourceEnvironment ?? null);\n setTarget(null);\n setStep('select');\n }\n }, [open, defaultSourceEnvironment]);\n\n const runCompare = step === 'results' && source && target;\n\n const { value, loading, error } = useAsync(async () => {\n if (!runCompare) return null;\n const data = (await api.query(COMPARE_ENVIRONMENTS_QUERY, {\n sourceId: source!.id,\n targetId: target!.id,\n })) as CompareEnvironmentsResult;\n return data.compareEnvironments;\n }, [api, runCompare, source?.id, target?.id]);\n\n const rows = useMemo(() => flattenComparison(value), [value]);\n\n const handleCompare = () => {\n if (!source || !target || source.id === target.id) return;\n setStep('results');\n };\n\n const handleSwap = () => {\n setSource(target);\n setTarget(source);\n };\n\n return (\n <Dialog open={open} onClose={onClose} maxWidth=\"lg\" fullWidth>\n <DialogTitle>Compare Environments</DialogTitle>\n <Body>\n {runCompare ? (\n loading ? (\n <Centered>\n <LoadingIndicator />\n </Centered>\n ) : error ? (\n <Centered>\n <Alert severity=\"error\">{String(error.message ?? error)}</Alert>\n </Centered>\n ) : (\n <ResultsStep\n rows={rows}\n sourceName={value?.source?.name || source?.name}\n targetName={value?.target?.name || target?.name}\n loading={loading}\n onChangeSelection={() => setStep('select')}\n />\n )\n ) : (\n <SelectStep\n source={source}\n target={target}\n environments={environments}\n projectName={projectName}\n onSourceChange={setSource}\n onTargetChange={setTarget}\n onSwap={handleSwap}\n onCompare={handleCompare}\n />\n )}\n </Body>\n <DialogActions>\n <Button variant=\"text\" onClick={onClose}>\n Close\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default CompareEnvironmentsDialog;\n\nconst Body = stylin(DialogContent)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n minHeight: theme.spacing(60),\n}));\n\nconst Centered = stylin(Box)(({ theme }: { theme: any }) => ({\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: theme.spacing(6),\n}));\n"],"names":[],"mappings":"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"}
|