@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,67 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import Box from '@massdriver/ui/Box';
|
|
3
|
+
import Tooltip from '@massdriver/ui/Tooltip';
|
|
4
|
+
import stylin from '@massdriver/ui/stylin';
|
|
5
|
+
|
|
6
|
+
const TRUNCATE_LENGTH = 64;
|
|
7
|
+
const formatValue = (value) => {
|
|
8
|
+
if (typeof value === "string") return value;
|
|
9
|
+
try {
|
|
10
|
+
return JSON.stringify(value);
|
|
11
|
+
} catch {
|
|
12
|
+
return String(value);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const ComparisonValueCell = ({
|
|
16
|
+
side,
|
|
17
|
+
isDifferent,
|
|
18
|
+
isMissing
|
|
19
|
+
}) => {
|
|
20
|
+
const present = side?.present === true;
|
|
21
|
+
if (!present) {
|
|
22
|
+
return isMissing ? /* @__PURE__ */ jsx(MissingPill, { children: "not set" }) : /* @__PURE__ */ jsx(Missing, { children: "\u2014" });
|
|
23
|
+
}
|
|
24
|
+
const value = side?.value;
|
|
25
|
+
if (value == null) {
|
|
26
|
+
return /* @__PURE__ */ jsx(NullLiteral, { children: "null" });
|
|
27
|
+
}
|
|
28
|
+
const display = formatValue(value);
|
|
29
|
+
const truncated = display.length > TRUNCATE_LENGTH;
|
|
30
|
+
const visible = truncated ? `${display.slice(0, TRUNCATE_LENGTH)}\u2026` : display;
|
|
31
|
+
const cell = /* @__PURE__ */ jsx(ValueText, { isDifferent, children: visible });
|
|
32
|
+
return truncated ? /* @__PURE__ */ jsx(Tooltip, { title: display, arrow: true, placement: "top", children: /* @__PURE__ */ jsx("span", { children: cell }) }) : cell;
|
|
33
|
+
};
|
|
34
|
+
const ValueText = stylin(Box, ["isDifferent"])(
|
|
35
|
+
({ theme, isDifferent }) => ({
|
|
36
|
+
fontFamily: theme.typography.fontFamilyMono,
|
|
37
|
+
fontSize: theme.typography.caption.fontSize,
|
|
38
|
+
color: isDifferent ? theme.palette.text.primary : theme.palette.text.secondary,
|
|
39
|
+
fontWeight: isDifferent ? 600 : 400,
|
|
40
|
+
whiteSpace: "nowrap",
|
|
41
|
+
overflow: "hidden",
|
|
42
|
+
textOverflow: "ellipsis"
|
|
43
|
+
})
|
|
44
|
+
);
|
|
45
|
+
const NullLiteral = stylin(Box)(({ theme }) => ({
|
|
46
|
+
fontStyle: "italic",
|
|
47
|
+
color: theme.palette.text.secondary,
|
|
48
|
+
fontFamily: theme.typography.fontFamilyMono,
|
|
49
|
+
fontSize: theme.typography.caption.fontSize
|
|
50
|
+
}));
|
|
51
|
+
const Missing = stylin(Box)(({ theme }) => ({
|
|
52
|
+
fontStyle: "italic",
|
|
53
|
+
color: theme.palette.text.disabled,
|
|
54
|
+
fontSize: theme.typography.caption.fontSize
|
|
55
|
+
}));
|
|
56
|
+
const MissingPill = stylin(Box)(({ theme }) => ({
|
|
57
|
+
display: "inline-block",
|
|
58
|
+
fontStyle: "italic",
|
|
59
|
+
fontSize: theme.typography.caption.fontSize,
|
|
60
|
+
color: theme.palette.error.main,
|
|
61
|
+
backgroundColor: `${theme.palette.error.main}14`,
|
|
62
|
+
padding: `${theme.spacing(0.25)} ${theme.spacing(0.75)}`,
|
|
63
|
+
borderRadius: 1
|
|
64
|
+
}));
|
|
65
|
+
|
|
66
|
+
export { ComparisonValueCell, ComparisonValueCell as default };
|
|
67
|
+
//# sourceMappingURL=ComparisonValueCell.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComparisonValueCell.esm.js","sources":["../../../../src/features/environment/CompareEnvironmentsDialog/ComparisonValueCell.tsx"],"sourcesContent":["import Box from '@massdriver/ui/Box';\nimport Tooltip from '@massdriver/ui/Tooltip';\nimport stylin from '@massdriver/ui/stylin';\nimport type { ComparisonSide } from './flattenComparison';\n\nconst TRUNCATE_LENGTH = 64;\n\nconst formatValue = (value: unknown): string => {\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n};\n\n/** Renders one side of a comparison row (source or target value). */\nexport const ComparisonValueCell = ({\n side,\n isDifferent,\n isMissing,\n}: {\n side?: ComparisonSide | null;\n isDifferent: boolean;\n isMissing: boolean;\n}) => {\n const present = side?.present === true;\n\n if (!present) {\n return isMissing ? (\n <MissingPill>not set</MissingPill>\n ) : (\n <Missing>—</Missing>\n );\n }\n\n const value = side?.value;\n if (value == null) {\n return <NullLiteral>null</NullLiteral>;\n }\n\n const display = formatValue(value);\n const truncated = display.length > TRUNCATE_LENGTH;\n const visible = truncated ? `${display.slice(0, TRUNCATE_LENGTH)}…` : display;\n\n const cell = <ValueText isDifferent={isDifferent}>{visible}</ValueText>;\n\n return truncated ? (\n <Tooltip title={display} arrow placement=\"top\">\n <span>{cell}</span>\n </Tooltip>\n ) : (\n cell\n );\n};\n\nexport default ComparisonValueCell;\n\nconst ValueText = stylin(Box, ['isDifferent'])(\n ({ theme, isDifferent }: { theme: any; isDifferent: boolean }) => ({\n fontFamily: theme.typography.fontFamilyMono,\n fontSize: theme.typography.caption.fontSize,\n color: isDifferent\n ? theme.palette.text.primary\n : theme.palette.text.secondary,\n fontWeight: isDifferent ? 600 : 400,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }),\n);\n\nconst NullLiteral = stylin(Box)(({ theme }: { theme: any }) => ({\n fontStyle: 'italic',\n color: theme.palette.text.secondary,\n fontFamily: theme.typography.fontFamilyMono,\n fontSize: theme.typography.caption.fontSize,\n}));\n\nconst Missing = stylin(Box)(({ theme }: { theme: any }) => ({\n fontStyle: 'italic',\n color: theme.palette.text.disabled,\n fontSize: theme.typography.caption.fontSize,\n}));\n\nconst MissingPill = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'inline-block',\n fontStyle: 'italic',\n fontSize: theme.typography.caption.fontSize,\n color: theme.palette.error.main,\n backgroundColor: `${theme.palette.error.main}14`,\n padding: `${theme.spacing(0.25)} ${theme.spacing(0.75)}`,\n borderRadius: 1,\n}));\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useMemo } from 'react';
|
|
3
|
+
import Box from '@massdriver/ui/Box';
|
|
4
|
+
import Typography from '@massdriver/ui/Typography';
|
|
5
|
+
import Switch from '@massdriver/ui/Switch';
|
|
6
|
+
import Select, { MenuItem } from '@massdriver/ui/Select';
|
|
7
|
+
import Alert from '@massdriver/ui/Alert';
|
|
8
|
+
import Button from '@massdriver/ui/Button';
|
|
9
|
+
import DataList from '@massdriver/ui/DataList';
|
|
10
|
+
import stylin from '@massdriver/ui/stylin';
|
|
11
|
+
import ChevronLeftIcon from '@massdriver/ui/icons/ChevronLeftIcon';
|
|
12
|
+
import { buildCompareColumns } from './compareColumns.esm.js';
|
|
13
|
+
|
|
14
|
+
const ALL_COMPONENTS = "__all__";
|
|
15
|
+
const ResultsStep = ({
|
|
16
|
+
rows,
|
|
17
|
+
sourceName,
|
|
18
|
+
targetName,
|
|
19
|
+
loading,
|
|
20
|
+
onChangeSelection
|
|
21
|
+
}) => {
|
|
22
|
+
const [hideEqual, setHideEqual] = useState(true);
|
|
23
|
+
const [componentFilter, setComponentFilter] = useState(ALL_COMPONENTS);
|
|
24
|
+
const componentOptions = useMemo(() => {
|
|
25
|
+
const seen = /* @__PURE__ */ new Map();
|
|
26
|
+
rows.forEach((row) => {
|
|
27
|
+
if (!seen.has(row.component.id)) {
|
|
28
|
+
seen.set(row.component.id, row.component.name);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
return Array.from(seen, ([id, name]) => ({ id, name })).sort(
|
|
32
|
+
(first, second) => first.name.localeCompare(second.name)
|
|
33
|
+
);
|
|
34
|
+
}, [rows]);
|
|
35
|
+
const filteredRows = useMemo(
|
|
36
|
+
() => rows.filter((row) => {
|
|
37
|
+
if (hideEqual && row.status === "equal") return false;
|
|
38
|
+
if (componentFilter !== ALL_COMPONENTS && row.component.id !== componentFilter) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
return true;
|
|
42
|
+
}),
|
|
43
|
+
[rows, hideEqual, componentFilter]
|
|
44
|
+
);
|
|
45
|
+
const columns = useMemo(
|
|
46
|
+
() => buildCompareColumns({ leftLabel: sourceName, rightLabel: targetName }),
|
|
47
|
+
[sourceName, targetName]
|
|
48
|
+
);
|
|
49
|
+
const differingCount = useMemo(
|
|
50
|
+
() => rows.filter((row) => row.status !== "equal").length,
|
|
51
|
+
[rows]
|
|
52
|
+
);
|
|
53
|
+
const componentCount = useMemo(() => {
|
|
54
|
+
const seen = /* @__PURE__ */ new Set();
|
|
55
|
+
rows.forEach((row) => seen.add(row.component.id));
|
|
56
|
+
return seen.size;
|
|
57
|
+
}, [rows]);
|
|
58
|
+
const allEqual = rows.length > 0 && differingCount === 0;
|
|
59
|
+
return /* @__PURE__ */ jsxs(Root, { children: [
|
|
60
|
+
/* @__PURE__ */ jsxs(HeaderBar, { children: [
|
|
61
|
+
/* @__PURE__ */ jsx(
|
|
62
|
+
BackButton,
|
|
63
|
+
{
|
|
64
|
+
variant: "text",
|
|
65
|
+
size: "small",
|
|
66
|
+
startIcon: /* @__PURE__ */ jsx(ChevronLeftIcon, {}),
|
|
67
|
+
onClick: onChangeSelection,
|
|
68
|
+
children: "Change selection"
|
|
69
|
+
}
|
|
70
|
+
),
|
|
71
|
+
/* @__PURE__ */ jsxs(Title, { children: [
|
|
72
|
+
/* @__PURE__ */ jsx(EnvName, { children: sourceName || "Environment 1" }),
|
|
73
|
+
/* @__PURE__ */ jsx(ArrowText, { children: "\u2194" }),
|
|
74
|
+
/* @__PURE__ */ jsx(EnvName, { children: targetName || "Environment 2" })
|
|
75
|
+
] }),
|
|
76
|
+
/* @__PURE__ */ jsx(HeaderSpacer, {})
|
|
77
|
+
] }),
|
|
78
|
+
/* @__PURE__ */ jsxs(SummaryRow, { children: [
|
|
79
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: allEqual ? "No differences." : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
80
|
+
/* @__PURE__ */ jsx(Strong, { children: differingCount }),
|
|
81
|
+
" ",
|
|
82
|
+
differingCount === 1 ? "difference" : "differences",
|
|
83
|
+
" across",
|
|
84
|
+
" ",
|
|
85
|
+
/* @__PURE__ */ jsx(Strong, { children: componentCount }),
|
|
86
|
+
" ",
|
|
87
|
+
componentCount === 1 ? "component" : "components"
|
|
88
|
+
] }) }),
|
|
89
|
+
/* @__PURE__ */ jsxs(ToolbarActions, { children: [
|
|
90
|
+
/* @__PURE__ */ jsxs(
|
|
91
|
+
ComponentFilterSelect,
|
|
92
|
+
{
|
|
93
|
+
size: "small",
|
|
94
|
+
value: componentFilter,
|
|
95
|
+
onChange: (event) => setComponentFilter(event.target.value),
|
|
96
|
+
children: [
|
|
97
|
+
/* @__PURE__ */ jsx(MenuItem, { value: ALL_COMPONENTS, children: "All components" }),
|
|
98
|
+
componentOptions.map((component) => /* @__PURE__ */ jsx(MenuItem, { value: component.id, children: component.name }, component.id))
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
),
|
|
102
|
+
/* @__PURE__ */ jsxs(SwitchLabel, { children: [
|
|
103
|
+
/* @__PURE__ */ jsx(
|
|
104
|
+
Switch,
|
|
105
|
+
{
|
|
106
|
+
size: "small",
|
|
107
|
+
checked: hideEqual,
|
|
108
|
+
onChange: (event) => setHideEqual(event.target.checked)
|
|
109
|
+
}
|
|
110
|
+
),
|
|
111
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: "Hide identical" })
|
|
112
|
+
] })
|
|
113
|
+
] })
|
|
114
|
+
] }),
|
|
115
|
+
allEqual ? /* @__PURE__ */ jsx(Alert, { severity: "success", variant: "outlined", children: "These environments are identical." }) : null,
|
|
116
|
+
/* @__PURE__ */ jsx(
|
|
117
|
+
DataList,
|
|
118
|
+
{
|
|
119
|
+
rows: filteredRows,
|
|
120
|
+
columns,
|
|
121
|
+
searchable: true,
|
|
122
|
+
searchPlaceholder: "Search component or path\u2026",
|
|
123
|
+
defaultSort: { field: "componentName", direction: "asc" },
|
|
124
|
+
defaultPageSize: 20,
|
|
125
|
+
variant: "outlined",
|
|
126
|
+
size: "small",
|
|
127
|
+
loading,
|
|
128
|
+
emptyMessage: hideEqual && allEqual ? "All fields are identical." : 'No fields match the current filters. Try clearing the search, switching the component filter, or toggling "Hide identical".'
|
|
129
|
+
}
|
|
130
|
+
)
|
|
131
|
+
] });
|
|
132
|
+
};
|
|
133
|
+
const Root = stylin(Box)(({ theme }) => ({
|
|
134
|
+
display: "flex",
|
|
135
|
+
flexDirection: "column",
|
|
136
|
+
gap: theme.spacing(2),
|
|
137
|
+
flex: 1
|
|
138
|
+
}));
|
|
139
|
+
const HeaderBar = stylin(Box)(({ theme }) => ({
|
|
140
|
+
display: "flex",
|
|
141
|
+
alignItems: "center",
|
|
142
|
+
gap: theme.spacing(2),
|
|
143
|
+
paddingBottom: theme.spacing(1.5),
|
|
144
|
+
borderBottom: `1px solid ${theme.palette.divider}`
|
|
145
|
+
}));
|
|
146
|
+
const BackButton = stylin(Button)(({ theme }) => ({
|
|
147
|
+
color: theme.palette.text.secondary,
|
|
148
|
+
flexShrink: 0
|
|
149
|
+
}));
|
|
150
|
+
const Title = stylin(Box)(({ theme }) => ({
|
|
151
|
+
flex: 1,
|
|
152
|
+
display: "flex",
|
|
153
|
+
alignItems: "center",
|
|
154
|
+
justifyContent: "center",
|
|
155
|
+
gap: theme.spacing(1.5)
|
|
156
|
+
}));
|
|
157
|
+
const EnvName = stylin("span")(({ theme }) => ({
|
|
158
|
+
fontSize: theme.typography.h6.fontSize,
|
|
159
|
+
fontWeight: 600,
|
|
160
|
+
color: theme.palette.text.primary,
|
|
161
|
+
maxWidth: theme.spacing(40),
|
|
162
|
+
whiteSpace: "nowrap",
|
|
163
|
+
overflow: "hidden",
|
|
164
|
+
textOverflow: "ellipsis"
|
|
165
|
+
}));
|
|
166
|
+
const ArrowText = stylin("span")(({ theme }) => ({
|
|
167
|
+
color: theme.palette.text.disabled,
|
|
168
|
+
fontSize: theme.typography.h6.fontSize
|
|
169
|
+
}));
|
|
170
|
+
const HeaderSpacer = stylin(Box)(({ theme }) => ({
|
|
171
|
+
width: theme.spacing(20),
|
|
172
|
+
flexShrink: 0
|
|
173
|
+
}));
|
|
174
|
+
const SummaryRow = stylin(Box)(({ theme }) => ({
|
|
175
|
+
display: "flex",
|
|
176
|
+
alignItems: "center",
|
|
177
|
+
justifyContent: "space-between",
|
|
178
|
+
gap: theme.spacing(2),
|
|
179
|
+
flexWrap: "wrap"
|
|
180
|
+
}));
|
|
181
|
+
const Strong = stylin("span")(({ theme }) => ({
|
|
182
|
+
color: theme.palette.text.primary,
|
|
183
|
+
fontWeight: 600
|
|
184
|
+
}));
|
|
185
|
+
const ToolbarActions = stylin(Box)(({ theme }) => ({
|
|
186
|
+
display: "flex",
|
|
187
|
+
alignItems: "center",
|
|
188
|
+
gap: theme.spacing(1.5),
|
|
189
|
+
flexWrap: "wrap"
|
|
190
|
+
}));
|
|
191
|
+
const ComponentFilterSelect = stylin(Select)(({ theme }) => ({
|
|
192
|
+
minWidth: theme.spacing(22.5)
|
|
193
|
+
}));
|
|
194
|
+
const SwitchLabel = stylin(Box)(({ theme }) => ({
|
|
195
|
+
display: "flex",
|
|
196
|
+
alignItems: "center",
|
|
197
|
+
gap: theme.spacing(0.5),
|
|
198
|
+
userSelect: "none"
|
|
199
|
+
}));
|
|
200
|
+
|
|
201
|
+
export { ResultsStep, ResultsStep as default };
|
|
202
|
+
//# sourceMappingURL=ResultsStep.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResultsStep.esm.js","sources":["../../../../src/features/environment/CompareEnvironmentsDialog/ResultsStep.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport Box from '@massdriver/ui/Box';\nimport Typography from '@massdriver/ui/Typography';\nimport Switch from '@massdriver/ui/Switch';\nimport Select, { MenuItem } from '@massdriver/ui/Select';\nimport Alert from '@massdriver/ui/Alert';\nimport Button from '@massdriver/ui/Button';\nimport DataList from '@massdriver/ui/DataList';\nimport stylin from '@massdriver/ui/stylin';\nimport ChevronLeftIcon from '@massdriver/ui/icons/ChevronLeftIcon';\nimport buildCompareColumns from './compareColumns';\nimport type { ComparisonRow } from './flattenComparison';\n\nconst ALL_COMPONENTS = '__all__';\n\n/** Step 2 of the compare flow: the flattened diff rendered as a DataList. */\nexport const ResultsStep = ({\n rows,\n sourceName,\n targetName,\n loading,\n onChangeSelection,\n}: {\n rows: ComparisonRow[];\n sourceName?: string;\n targetName?: string;\n loading: boolean;\n onChangeSelection: () => void;\n}) => {\n const [hideEqual, setHideEqual] = useState(true);\n const [componentFilter, setComponentFilter] = useState(ALL_COMPONENTS);\n\n const componentOptions = useMemo(() => {\n const seen = new Map<string, string>();\n rows.forEach(row => {\n if (!seen.has(row.component.id)) {\n seen.set(row.component.id, row.component.name);\n }\n });\n return Array.from(seen, ([id, name]) => ({ id, name })).sort(\n (first, second) => first.name.localeCompare(second.name),\n );\n }, [rows]);\n\n const filteredRows = useMemo(\n () =>\n rows.filter(row => {\n if (hideEqual && row.status === 'equal') return false;\n if (\n componentFilter !== ALL_COMPONENTS &&\n row.component.id !== componentFilter\n ) {\n return false;\n }\n return true;\n }),\n [rows, hideEqual, componentFilter],\n );\n\n const columns = useMemo(\n () =>\n buildCompareColumns({ leftLabel: sourceName, rightLabel: targetName }),\n [sourceName, targetName],\n );\n\n const differingCount = useMemo(\n () => rows.filter(row => row.status !== 'equal').length,\n [rows],\n );\n const componentCount = useMemo(() => {\n const seen = new Set<string>();\n rows.forEach(row => seen.add(row.component.id));\n return seen.size;\n }, [rows]);\n const allEqual = rows.length > 0 && differingCount === 0;\n\n return (\n <Root>\n <HeaderBar>\n <BackButton\n variant=\"text\"\n size=\"small\"\n startIcon={<ChevronLeftIcon />}\n onClick={onChangeSelection}\n >\n Change selection\n </BackButton>\n <Title>\n <EnvName>{sourceName || 'Environment 1'}</EnvName>\n <ArrowText>↔</ArrowText>\n <EnvName>{targetName || 'Environment 2'}</EnvName>\n </Title>\n <HeaderSpacer />\n </HeaderBar>\n\n <SummaryRow>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {allEqual ? (\n 'No differences.'\n ) : (\n <>\n <Strong>{differingCount}</Strong>{' '}\n {differingCount === 1 ? 'difference' : 'differences'} across{' '}\n <Strong>{componentCount}</Strong>{' '}\n {componentCount === 1 ? 'component' : 'components'}\n </>\n )}\n </Typography>\n <ToolbarActions>\n <ComponentFilterSelect\n size=\"small\"\n value={componentFilter}\n onChange={(event: any) => setComponentFilter(event.target.value)}\n >\n <MenuItem value={ALL_COMPONENTS}>All components</MenuItem>\n {componentOptions.map(component => (\n <MenuItem key={component.id} value={component.id}>\n {component.name}\n </MenuItem>\n ))}\n </ComponentFilterSelect>\n <SwitchLabel>\n <Switch\n size=\"small\"\n checked={hideEqual}\n onChange={(event: any) => setHideEqual(event.target.checked)}\n />\n <Typography variant=\"body2\" color=\"text.secondary\">\n Hide identical\n </Typography>\n </SwitchLabel>\n </ToolbarActions>\n </SummaryRow>\n\n {allEqual ? (\n <Alert severity=\"success\" variant=\"outlined\">\n These environments are identical.\n </Alert>\n ) : null}\n\n <DataList\n rows={filteredRows}\n columns={columns}\n searchable\n searchPlaceholder=\"Search component or path…\"\n defaultSort={{ field: 'componentName', direction: 'asc' }}\n defaultPageSize={20}\n variant=\"outlined\"\n size=\"small\"\n loading={loading}\n emptyMessage={\n hideEqual && allEqual\n ? 'All fields are identical.'\n : 'No fields match the current filters. Try clearing the search, switching the component filter, or toggling \"Hide identical\".'\n }\n />\n </Root>\n );\n};\n\nexport default ResultsStep;\n\nconst Root = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2),\n flex: 1,\n}));\n\nconst HeaderBar = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(2),\n paddingBottom: theme.spacing(1.5),\n borderBottom: `1px solid ${theme.palette.divider}`,\n}));\n\nconst BackButton = stylin(Button)(({ theme }: { theme: any }) => ({\n color: theme.palette.text.secondary,\n flexShrink: 0,\n}));\n\nconst Title = stylin(Box)(({ theme }: { theme: any }) => ({\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: theme.spacing(1.5),\n}));\n\nconst EnvName = stylin('span')(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.h6.fontSize,\n fontWeight: 600,\n color: theme.palette.text.primary,\n maxWidth: theme.spacing(40),\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n}));\n\nconst ArrowText = stylin('span')(({ theme }: { theme: any }) => ({\n color: theme.palette.text.disabled,\n fontSize: theme.typography.h6.fontSize,\n}));\n\nconst HeaderSpacer = stylin(Box)(({ theme }: { theme: any }) => ({\n width: theme.spacing(20),\n flexShrink: 0,\n}));\n\nconst SummaryRow = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: theme.spacing(2),\n flexWrap: 'wrap',\n}));\n\nconst Strong = stylin('span')(({ theme }: { theme: any }) => ({\n color: theme.palette.text.primary,\n fontWeight: 600,\n}));\n\nconst ToolbarActions = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1.5),\n flexWrap: 'wrap',\n}));\n\nconst ComponentFilterSelect = stylin(Select)(({ theme }: { theme: any }) => ({\n minWidth: theme.spacing(22.5),\n}));\n\nconst SwitchLabel = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n userSelect: 'none',\n}));\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } 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
|
+
|
|
12
|
+
const SelectStep = ({
|
|
13
|
+
source,
|
|
14
|
+
target,
|
|
15
|
+
environments,
|
|
16
|
+
projectName,
|
|
17
|
+
onSourceChange,
|
|
18
|
+
onTargetChange,
|
|
19
|
+
onSwap,
|
|
20
|
+
onCompare
|
|
21
|
+
}) => {
|
|
22
|
+
const sameSelected = Boolean(source && target && source.id === target.id);
|
|
23
|
+
const canCompare = Boolean(source && target && !sameSelected);
|
|
24
|
+
const canSwap = Boolean(source) && Boolean(target);
|
|
25
|
+
const findEnv = (id) => environments.find((environment) => environment.id === id) ?? null;
|
|
26
|
+
return /* @__PURE__ */ jsx(Root, { children: /* @__PURE__ */ jsxs(Center, { children: [
|
|
27
|
+
/* @__PURE__ */ jsx(IconBadge, { children: /* @__PURE__ */ jsx(CompareArrowsIcon, {}) }),
|
|
28
|
+
/* @__PURE__ */ jsxs(Heading, { children: [
|
|
29
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h4", component: "h2", children: "Compare Environments" }),
|
|
30
|
+
/* @__PURE__ */ jsxs(Typography, { variant: "body1", color: "text.secondary", children: [
|
|
31
|
+
"Pick two environments",
|
|
32
|
+
projectName ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
33
|
+
" in ",
|
|
34
|
+
/* @__PURE__ */ jsx("strong", { children: projectName })
|
|
35
|
+
] }) : null,
|
|
36
|
+
" ",
|
|
37
|
+
"to see how their components and parameters differ."
|
|
38
|
+
] })
|
|
39
|
+
] }),
|
|
40
|
+
/* @__PURE__ */ jsxs(PickerRow, { children: [
|
|
41
|
+
/* @__PURE__ */ jsx(PickerSlot, { children: /* @__PURE__ */ jsx(
|
|
42
|
+
Select,
|
|
43
|
+
{
|
|
44
|
+
fullWidth: true,
|
|
45
|
+
displayEmpty: true,
|
|
46
|
+
value: source?.id ?? "",
|
|
47
|
+
onChange: (event) => onSourceChange(findEnv(event.target.value)),
|
|
48
|
+
renderValue: (value) => value ? findEnv(value)?.name : "Pick an environment\u2026",
|
|
49
|
+
children: environments.map((environment) => /* @__PURE__ */ jsx(
|
|
50
|
+
MenuItem,
|
|
51
|
+
{
|
|
52
|
+
value: environment.id,
|
|
53
|
+
disabled: target?.id === environment.id,
|
|
54
|
+
children: environment.name
|
|
55
|
+
},
|
|
56
|
+
environment.id
|
|
57
|
+
))
|
|
58
|
+
}
|
|
59
|
+
) }),
|
|
60
|
+
/* @__PURE__ */ jsx(
|
|
61
|
+
Tooltip,
|
|
62
|
+
{
|
|
63
|
+
title: canSwap ? "Swap environments" : "Pick both first",
|
|
64
|
+
arrow: true,
|
|
65
|
+
children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(
|
|
66
|
+
SwapButton,
|
|
67
|
+
{
|
|
68
|
+
size: "medium",
|
|
69
|
+
onClick: onSwap,
|
|
70
|
+
disabled: !canSwap,
|
|
71
|
+
"aria-label": "Swap environments",
|
|
72
|
+
children: /* @__PURE__ */ jsx(SwapHorizIcon, {})
|
|
73
|
+
}
|
|
74
|
+
) })
|
|
75
|
+
}
|
|
76
|
+
),
|
|
77
|
+
/* @__PURE__ */ jsx(PickerSlot, { children: /* @__PURE__ */ jsx(
|
|
78
|
+
Select,
|
|
79
|
+
{
|
|
80
|
+
fullWidth: true,
|
|
81
|
+
displayEmpty: true,
|
|
82
|
+
value: target?.id ?? "",
|
|
83
|
+
onChange: (event) => onTargetChange(findEnv(event.target.value)),
|
|
84
|
+
renderValue: (value) => value ? findEnv(value)?.name : "Pick an environment\u2026",
|
|
85
|
+
children: environments.map((environment) => /* @__PURE__ */ jsx(
|
|
86
|
+
MenuItem,
|
|
87
|
+
{
|
|
88
|
+
value: environment.id,
|
|
89
|
+
disabled: source?.id === environment.id,
|
|
90
|
+
children: environment.name
|
|
91
|
+
},
|
|
92
|
+
environment.id
|
|
93
|
+
))
|
|
94
|
+
}
|
|
95
|
+
) })
|
|
96
|
+
] }),
|
|
97
|
+
sameSelected ? /* @__PURE__ */ jsx(WarnLine, { variant: "caption", children: "Pick two different environments to compare." }) : /* @__PURE__ */ jsx(Spacer, {}),
|
|
98
|
+
/* @__PURE__ */ jsx(
|
|
99
|
+
CompareButton,
|
|
100
|
+
{
|
|
101
|
+
variant: "contained",
|
|
102
|
+
size: "large",
|
|
103
|
+
onClick: onCompare,
|
|
104
|
+
disabled: !canCompare,
|
|
105
|
+
children: "Compare"
|
|
106
|
+
}
|
|
107
|
+
)
|
|
108
|
+
] }) });
|
|
109
|
+
};
|
|
110
|
+
const Root = stylin(Box)(({ theme }) => ({
|
|
111
|
+
flex: 1,
|
|
112
|
+
display: "flex",
|
|
113
|
+
alignItems: "center",
|
|
114
|
+
justifyContent: "center",
|
|
115
|
+
padding: theme.spacing(4)
|
|
116
|
+
}));
|
|
117
|
+
const Center = stylin(Box)(({ theme }) => ({
|
|
118
|
+
width: "100%",
|
|
119
|
+
maxWidth: theme.spacing(90),
|
|
120
|
+
display: "flex",
|
|
121
|
+
flexDirection: "column",
|
|
122
|
+
alignItems: "center",
|
|
123
|
+
gap: theme.spacing(3)
|
|
124
|
+
}));
|
|
125
|
+
const IconBadge = stylin(Box)(({ theme }) => ({
|
|
126
|
+
display: "flex",
|
|
127
|
+
alignItems: "center",
|
|
128
|
+
justifyContent: "center",
|
|
129
|
+
width: theme.spacing(7),
|
|
130
|
+
height: theme.spacing(7),
|
|
131
|
+
borderRadius: "50%",
|
|
132
|
+
backgroundColor: theme.palette.action.selected,
|
|
133
|
+
color: theme.palette.primary.main,
|
|
134
|
+
"& > svg": { fontSize: 32 }
|
|
135
|
+
}));
|
|
136
|
+
const Heading = stylin(Box)(({ theme }) => ({
|
|
137
|
+
display: "flex",
|
|
138
|
+
flexDirection: "column",
|
|
139
|
+
alignItems: "center",
|
|
140
|
+
textAlign: "center",
|
|
141
|
+
gap: theme.spacing(1),
|
|
142
|
+
maxWidth: theme.spacing(75)
|
|
143
|
+
}));
|
|
144
|
+
const PickerRow = stylin(Box)(({ theme }) => ({
|
|
145
|
+
width: "100%",
|
|
146
|
+
display: "flex",
|
|
147
|
+
alignItems: "center",
|
|
148
|
+
gap: theme.spacing(1.5),
|
|
149
|
+
marginTop: theme.spacing(2),
|
|
150
|
+
[theme.breakpoints.down("sm")]: {
|
|
151
|
+
flexDirection: "column"
|
|
152
|
+
}
|
|
153
|
+
}));
|
|
154
|
+
const PickerSlot = stylin(Box)({
|
|
155
|
+
flex: 1,
|
|
156
|
+
minWidth: 0,
|
|
157
|
+
width: "100%"
|
|
158
|
+
});
|
|
159
|
+
const SwapButton = stylin(IconButton)(({ theme }) => ({
|
|
160
|
+
color: theme.palette.text.secondary,
|
|
161
|
+
border: `1px solid ${theme.palette.divider}`,
|
|
162
|
+
backgroundColor: theme.palette.background.paper,
|
|
163
|
+
flexShrink: 0,
|
|
164
|
+
"&:hover": {
|
|
165
|
+
color: theme.palette.primary.main,
|
|
166
|
+
borderColor: theme.palette.primary.main,
|
|
167
|
+
backgroundColor: theme.palette.background.paper
|
|
168
|
+
}
|
|
169
|
+
}));
|
|
170
|
+
const WarnLine = stylin(Typography)(({ theme }) => ({
|
|
171
|
+
color: theme.palette.warning.main,
|
|
172
|
+
marginTop: theme.spacing(0.5)
|
|
173
|
+
}));
|
|
174
|
+
const Spacer = stylin(Box)(({ theme }) => ({
|
|
175
|
+
height: theme.spacing(2)
|
|
176
|
+
}));
|
|
177
|
+
const CompareButton = stylin(Button)(({ theme }) => ({
|
|
178
|
+
minWidth: theme.spacing(24),
|
|
179
|
+
marginTop: theme.spacing(1)
|
|
180
|
+
}));
|
|
181
|
+
|
|
182
|
+
export { SelectStep, SelectStep as default };
|
|
183
|
+
//# sourceMappingURL=SelectStep.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectStep.esm.js","sources":["../../../../src/features/environment/CompareEnvironmentsDialog/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 type { HeaderEnvironment } from '../GraphHeader/queries';\n\n/**\n * Step 1 of the compare flow: pick two environments. Simplified from the web\n * app's infinite-scroll autocompletes to plain Selects — the dialog already has\n * the project's full environment list in memory.\n */\nexport const SelectStep = ({\n source,\n target,\n environments,\n projectName,\n onSourceChange,\n onTargetChange,\n onSwap,\n onCompare,\n}: {\n source: HeaderEnvironment | null;\n target: HeaderEnvironment | null;\n environments: HeaderEnvironment[];\n projectName?: string;\n onSourceChange: (environment: HeaderEnvironment | null) => void;\n onTargetChange: (environment: HeaderEnvironment | 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 findEnv = (id: string) =>\n environments.find(environment => environment.id === id) ?? null;\n\n return (\n <Root>\n <Center>\n <IconBadge>\n <CompareArrowsIcon />\n </IconBadge>\n\n <Heading>\n <Typography variant=\"h4\" component=\"h2\">\n Compare Environments\n </Typography>\n <Typography variant=\"body1\" color=\"text.secondary\">\n Pick two environments\n {projectName ? (\n <>\n {' in '}\n <strong>{projectName}</strong>\n </>\n ) : null}{' '}\n to see how their components and parameters 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(findEnv(event.target.value))\n }\n renderValue={(value: string) =>\n value ? findEnv(value)?.name : 'Pick an environment…'\n }\n >\n {environments.map(environment => (\n <MenuItem\n key={environment.id}\n value={environment.id}\n disabled={target?.id === environment.id}\n >\n {environment.name}\n </MenuItem>\n ))}\n </Select>\n </PickerSlot>\n\n <Tooltip\n title={canSwap ? 'Swap environments' : 'Pick both first'}\n arrow\n >\n <span>\n <SwapButton\n size=\"medium\"\n onClick={onSwap}\n disabled={!canSwap}\n aria-label=\"Swap environments\"\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(findEnv(event.target.value))\n }\n renderValue={(value: string) =>\n value ? findEnv(value)?.name : 'Pick an environment…'\n }\n >\n {environments.map(environment => (\n <MenuItem\n key={environment.id}\n value={environment.id}\n disabled={source?.id === environment.id}\n >\n {environment.name}\n </MenuItem>\n ))}\n </Select>\n </PickerSlot>\n </PickerRow>\n\n {sameSelected ? (\n <WarnLine variant=\"caption\">\n Pick two different environments 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 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,73 @@
|
|
|
1
|
+
import { 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 './ComparisonValueCell.esm.js';
|
|
7
|
+
import { VERSION_PATH } from './flattenComparison.esm.js';
|
|
8
|
+
|
|
9
|
+
const renderComponentCell = (value) => /* @__PURE__ */ jsx(ComponentName, { children: value || "--" });
|
|
10
|
+
const renderPathCell = (value) => value === VERSION_PATH ? /* @__PURE__ */ jsx(Chip, { size: "small", variant: "outlined", label: "Version" }) : /* @__PURE__ */ jsx(PathCell, { children: value });
|
|
11
|
+
const renderLeftCell = (_value, row) => /* @__PURE__ */ jsx(
|
|
12
|
+
ComparisonValueCell,
|
|
13
|
+
{
|
|
14
|
+
side: row.source,
|
|
15
|
+
isDifferent: row.status === "different",
|
|
16
|
+
isMissing: row.status === "targetOnly"
|
|
17
|
+
}
|
|
18
|
+
);
|
|
19
|
+
const renderRightCell = (_value, row) => /* @__PURE__ */ jsx(
|
|
20
|
+
ComparisonValueCell,
|
|
21
|
+
{
|
|
22
|
+
side: row.target,
|
|
23
|
+
isDifferent: row.status === "different",
|
|
24
|
+
isMissing: row.status === "sourceOnly"
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
const buildCompareColumns = ({
|
|
28
|
+
leftLabel,
|
|
29
|
+
rightLabel
|
|
30
|
+
} = {}) => [
|
|
31
|
+
col.custom("componentName", "Component", renderComponentCell, {
|
|
32
|
+
flex: 1.5,
|
|
33
|
+
minWidth: 160,
|
|
34
|
+
sortable: true,
|
|
35
|
+
searchable: true
|
|
36
|
+
}),
|
|
37
|
+
col.custom("path", "Path", renderPathCell, {
|
|
38
|
+
flex: 2,
|
|
39
|
+
minWidth: 180,
|
|
40
|
+
sortable: true,
|
|
41
|
+
searchable: true
|
|
42
|
+
}),
|
|
43
|
+
col.custom("sourceValue", leftLabel || "Environment 1", renderLeftCell, {
|
|
44
|
+
flex: 2,
|
|
45
|
+
minWidth: 160,
|
|
46
|
+
sortable: true,
|
|
47
|
+
searchable: true
|
|
48
|
+
}),
|
|
49
|
+
col.custom("targetValue", rightLabel || "Environment 2", renderRightCell, {
|
|
50
|
+
flex: 2,
|
|
51
|
+
minWidth: 160,
|
|
52
|
+
sortable: true,
|
|
53
|
+
searchable: true
|
|
54
|
+
})
|
|
55
|
+
];
|
|
56
|
+
const ComponentName = stylin(Box)(({ theme }) => ({
|
|
57
|
+
fontSize: theme.typography.body2.fontSize,
|
|
58
|
+
color: theme.palette.text.primary,
|
|
59
|
+
whiteSpace: "nowrap",
|
|
60
|
+
overflow: "hidden",
|
|
61
|
+
textOverflow: "ellipsis"
|
|
62
|
+
}));
|
|
63
|
+
const PathCell = stylin(Box)(({ theme }) => ({
|
|
64
|
+
fontFamily: theme.typography.fontFamilyMono,
|
|
65
|
+
fontSize: theme.typography.caption.fontSize,
|
|
66
|
+
color: theme.palette.text.secondary,
|
|
67
|
+
whiteSpace: "nowrap",
|
|
68
|
+
overflow: "hidden",
|
|
69
|
+
textOverflow: "ellipsis"
|
|
70
|
+
}));
|
|
71
|
+
|
|
72
|
+
export { buildCompareColumns, buildCompareColumns as default };
|
|
73
|
+
//# sourceMappingURL=compareColumns.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compareColumns.esm.js","sources":["../../../../src/features/environment/CompareEnvironmentsDialog/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 './ComparisonValueCell';\nimport { VERSION_PATH, type ComparisonRow } from './flattenComparison';\n\nconst renderComponentCell = (value: string) => (\n <ComponentName>{value || '--'}</ComponentName>\n);\n\nconst renderPathCell = (value: string) =>\n value === VERSION_PATH ? (\n <Chip size=\"small\" variant=\"outlined\" label=\"Version\" />\n ) : (\n <PathCell>{value}</PathCell>\n );\n\nconst renderLeftCell = (_value: unknown, row: ComparisonRow) => (\n <ComparisonValueCell\n side={row.source}\n isDifferent={row.status === 'different'}\n isMissing={row.status === 'targetOnly'}\n />\n);\n\nconst renderRightCell = (_value: unknown, row: ComparisonRow) => (\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('componentName', 'Component', renderComponentCell, {\n flex: 1.5,\n minWidth: 160,\n sortable: true,\n searchable: true,\n }),\n col.custom('path', 'Path', renderPathCell, {\n flex: 2,\n minWidth: 180,\n sortable: true,\n searchable: true,\n }),\n col.custom('sourceValue', leftLabel || 'Environment 1', renderLeftCell, {\n flex: 2,\n minWidth: 160,\n sortable: true,\n searchable: true,\n }),\n col.custom('targetValue', rightLabel || 'Environment 2', renderRightCell, {\n flex: 2,\n minWidth: 160,\n sortable: true,\n searchable: true,\n }),\n];\n\nexport default buildCompareColumns;\n\nconst ComponentName = stylin(Box)(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.body2.fontSize,\n color: theme.palette.text.primary,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n}));\n\nconst PathCell = 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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"}
|