@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,247 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useApi } from '@backstage/frontend-plugin-api';
|
|
3
|
+
import { useNavigate } from 'react-router-dom';
|
|
4
|
+
import { parseEnvironmentId, projectUrl } from '@massdriver/backstage-plugin-common';
|
|
5
|
+
import Box from '@massdriver/ui/Box';
|
|
6
|
+
import Typography from '@massdriver/ui/Typography';
|
|
7
|
+
import IconButton from '@massdriver/ui/IconButton';
|
|
8
|
+
import Tooltip from '@massdriver/ui/Tooltip';
|
|
9
|
+
import Divider from '@massdriver/ui/Divider';
|
|
10
|
+
import { MenuItem } from '@massdriver/ui/Menu';
|
|
11
|
+
import stylin from '@massdriver/ui/stylin';
|
|
12
|
+
import ChevronLeftIcon from '@massdriver/ui/icons/ChevronLeftIcon';
|
|
13
|
+
import AddIcon from '@massdriver/ui/icons/AddIcon';
|
|
14
|
+
import { massdriverApiRef } from '../../../api.esm.js';
|
|
15
|
+
import { ForkPill } from '../../../components/ForkPill.esm.js';
|
|
16
|
+
import { RouterLinkAdapter } from '../../../components/RouterLinkAdapter.esm.js';
|
|
17
|
+
import { internalRoutes } from '../../../internalRoutes.esm.js';
|
|
18
|
+
import { useLiveRelayQuery } from '../realtime/useLiveRelayQuery.esm.js';
|
|
19
|
+
import { Switcher } from './Switcher.esm.js';
|
|
20
|
+
import { EnvironmentDefaults } from './EnvironmentDefaults.esm.js';
|
|
21
|
+
import { HeaderActions } from './HeaderActions.esm.js';
|
|
22
|
+
import { HEADER_PROJECTS_QUERY, HEADER_ENVIRONMENTS_QUERY } from './queries.esm.js';
|
|
23
|
+
|
|
24
|
+
const GraphHeader = ({
|
|
25
|
+
projectId,
|
|
26
|
+
environmentId
|
|
27
|
+
}) => {
|
|
28
|
+
const api = useApi(massdriverApiRef);
|
|
29
|
+
const navigate = useNavigate();
|
|
30
|
+
const projectsQuery = useLiveRelayQuery(
|
|
31
|
+
HEADER_PROJECTS_QUERY,
|
|
32
|
+
{}
|
|
33
|
+
);
|
|
34
|
+
const environmentsQuery = useLiveRelayQuery(
|
|
35
|
+
HEADER_ENVIRONMENTS_QUERY,
|
|
36
|
+
{ filter: { projectId: { eq: projectId } } }
|
|
37
|
+
);
|
|
38
|
+
const headerPending = projectsQuery.loading || environmentsQuery.loading || Boolean(projectsQuery.error ?? environmentsQuery.error);
|
|
39
|
+
const projects = (projectsQuery.value?.projects?.items ?? []).filter(
|
|
40
|
+
Boolean
|
|
41
|
+
);
|
|
42
|
+
const environments = (environmentsQuery.value?.environments?.items ?? []).filter(Boolean);
|
|
43
|
+
const project = projects.find((item) => item.id === projectId) ?? null;
|
|
44
|
+
const environment = environments.find((item) => item.id === environmentId) ?? null;
|
|
45
|
+
const projectName = project?.name ?? (headerPending ? projectId : "\u2014");
|
|
46
|
+
const environmentFallback = headerPending ? parseEnvironmentId(environmentId).scopedEnvironmentId : "\u2014";
|
|
47
|
+
const createEnvironmentUrl = `${projectUrl(
|
|
48
|
+
api.appUrl,
|
|
49
|
+
api.organizationId,
|
|
50
|
+
projectId
|
|
51
|
+
)}/environments?createEnvironment=true`;
|
|
52
|
+
const handleProjectChange = async (selectedProjectId) => {
|
|
53
|
+
if (selectedProjectId === projectId) return;
|
|
54
|
+
try {
|
|
55
|
+
const data = await api.query(HEADER_ENVIRONMENTS_QUERY, {
|
|
56
|
+
filter: { projectId: { eq: selectedProjectId } }
|
|
57
|
+
});
|
|
58
|
+
const envs = (data.environments?.items ?? []).filter(
|
|
59
|
+
Boolean
|
|
60
|
+
);
|
|
61
|
+
navigate(
|
|
62
|
+
envs.length > 0 ? internalRoutes.environment(selectedProjectId, envs[0].id) : internalRoutes.projectTab(selectedProjectId, "overview")
|
|
63
|
+
);
|
|
64
|
+
} catch {
|
|
65
|
+
navigate(internalRoutes.projectTab(selectedProjectId, "overview"));
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
return /* @__PURE__ */ jsxs(HeaderRoot, { children: [
|
|
69
|
+
/* @__PURE__ */ jsxs(LeftZone, { children: [
|
|
70
|
+
/* @__PURE__ */ jsx(Tooltip, { title: "Back to project", arrow: true, enterDelay: 600, children: /* @__PURE__ */ jsx(
|
|
71
|
+
BackButton,
|
|
72
|
+
{
|
|
73
|
+
size: "small",
|
|
74
|
+
component: RouterLinkAdapter,
|
|
75
|
+
href: internalRoutes.project(projectId),
|
|
76
|
+
"aria-label": "Back to project",
|
|
77
|
+
children: /* @__PURE__ */ jsx(ChevronLeftIcon, { fontSize: "small" })
|
|
78
|
+
}
|
|
79
|
+
) }),
|
|
80
|
+
/* @__PURE__ */ jsx(
|
|
81
|
+
Switcher,
|
|
82
|
+
{
|
|
83
|
+
ariaLabel: "Switch project",
|
|
84
|
+
trigger: /* @__PURE__ */ jsx(TriggerLabel, { variant: "body2", color: "text.secondary", children: projectName }),
|
|
85
|
+
children: (close) => projects.map((item) => /* @__PURE__ */ jsx(
|
|
86
|
+
MenuItem,
|
|
87
|
+
{
|
|
88
|
+
selected: item.id === projectId,
|
|
89
|
+
onClick: () => {
|
|
90
|
+
close();
|
|
91
|
+
handleProjectChange(item.id);
|
|
92
|
+
},
|
|
93
|
+
children: item.name
|
|
94
|
+
},
|
|
95
|
+
item.id
|
|
96
|
+
))
|
|
97
|
+
}
|
|
98
|
+
),
|
|
99
|
+
/* @__PURE__ */ jsx(Separator, { children: "/" }),
|
|
100
|
+
/* @__PURE__ */ jsx(
|
|
101
|
+
Switcher,
|
|
102
|
+
{
|
|
103
|
+
ariaLabel: "Switch environment",
|
|
104
|
+
trigger: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
105
|
+
/* @__PURE__ */ jsx(TriggerLabel, { variant: "body2", children: environment ? environment.name : environmentFallback }),
|
|
106
|
+
environment ? /* @__PURE__ */ jsx(
|
|
107
|
+
ForkPill,
|
|
108
|
+
{
|
|
109
|
+
parent: environment.parent,
|
|
110
|
+
createdAt: environment.createdAt
|
|
111
|
+
}
|
|
112
|
+
) : null
|
|
113
|
+
] }),
|
|
114
|
+
children: (close) => [
|
|
115
|
+
/* @__PURE__ */ jsxs(
|
|
116
|
+
CreateMenuItem,
|
|
117
|
+
{
|
|
118
|
+
onClick: () => {
|
|
119
|
+
close();
|
|
120
|
+
window.open(createEnvironmentUrl, "_blank", "noopener");
|
|
121
|
+
},
|
|
122
|
+
children: [
|
|
123
|
+
/* @__PURE__ */ jsx(AddIcon, { fontSize: "small" }),
|
|
124
|
+
/* @__PURE__ */ jsx("span", { children: "Create new environment" })
|
|
125
|
+
]
|
|
126
|
+
},
|
|
127
|
+
"__create__"
|
|
128
|
+
),
|
|
129
|
+
/* @__PURE__ */ jsx(Divider, {}, "__divider__"),
|
|
130
|
+
...environments.map((item) => /* @__PURE__ */ jsxs(
|
|
131
|
+
EnvironmentMenuItem,
|
|
132
|
+
{
|
|
133
|
+
selected: item.id === environmentId,
|
|
134
|
+
title: item.name,
|
|
135
|
+
onClick: () => {
|
|
136
|
+
close();
|
|
137
|
+
navigate(internalRoutes.environment(projectId, item.id));
|
|
138
|
+
},
|
|
139
|
+
children: [
|
|
140
|
+
/* @__PURE__ */ jsx(EnvironmentMenuLabel, { children: item.name }),
|
|
141
|
+
/* @__PURE__ */ jsx(ForkPill, { parent: item.parent, createdAt: item.createdAt })
|
|
142
|
+
]
|
|
143
|
+
},
|
|
144
|
+
item.id
|
|
145
|
+
))
|
|
146
|
+
]
|
|
147
|
+
}
|
|
148
|
+
)
|
|
149
|
+
] }),
|
|
150
|
+
/* @__PURE__ */ jsx(CenterZone, { children: environment ? /* @__PURE__ */ jsx(EnvironmentDefaults, { environmentId: environment.id }) : null }),
|
|
151
|
+
/* @__PURE__ */ jsx(RightZone, { children: /* @__PURE__ */ jsx(
|
|
152
|
+
HeaderActions,
|
|
153
|
+
{
|
|
154
|
+
appUrl: api.appUrl,
|
|
155
|
+
organizationId: api.organizationId,
|
|
156
|
+
environment,
|
|
157
|
+
environments,
|
|
158
|
+
projectName: project?.name
|
|
159
|
+
}
|
|
160
|
+
) })
|
|
161
|
+
] });
|
|
162
|
+
};
|
|
163
|
+
const HeaderRoot = stylin(Box)(({ theme }) => ({
|
|
164
|
+
display: "flex",
|
|
165
|
+
alignItems: "center",
|
|
166
|
+
justifyContent: "space-between",
|
|
167
|
+
height: theme.spacing(6),
|
|
168
|
+
paddingLeft: theme.spacing(1),
|
|
169
|
+
paddingRight: theme.spacing(1.5),
|
|
170
|
+
gap: theme.spacing(1),
|
|
171
|
+
borderBottom: `1px solid ${theme.palette.divider}`,
|
|
172
|
+
backgroundColor: theme.palette.background.paper,
|
|
173
|
+
flexShrink: 0,
|
|
174
|
+
[theme.breakpoints.down("sm")]: {
|
|
175
|
+
overflowX: "auto",
|
|
176
|
+
overflowY: "hidden",
|
|
177
|
+
scrollbarWidth: "none",
|
|
178
|
+
"&::-webkit-scrollbar": { display: "none" }
|
|
179
|
+
}
|
|
180
|
+
}));
|
|
181
|
+
const LeftZone = stylin(Box)(({ theme }) => ({
|
|
182
|
+
display: "flex",
|
|
183
|
+
alignItems: "center",
|
|
184
|
+
gap: theme.spacing(0.5),
|
|
185
|
+
minWidth: 0,
|
|
186
|
+
flexShrink: 1,
|
|
187
|
+
[theme.breakpoints.down("sm")]: {
|
|
188
|
+
flexShrink: 0
|
|
189
|
+
}
|
|
190
|
+
}));
|
|
191
|
+
const CenterZone = stylin(Box)(({ theme }) => ({
|
|
192
|
+
display: "flex",
|
|
193
|
+
alignItems: "center",
|
|
194
|
+
justifyContent: "center",
|
|
195
|
+
flex: 1,
|
|
196
|
+
minWidth: 0,
|
|
197
|
+
[theme.breakpoints.down("sm")]: {
|
|
198
|
+
flex: "none"
|
|
199
|
+
}
|
|
200
|
+
}));
|
|
201
|
+
const RightZone = stylin(Box)({
|
|
202
|
+
display: "flex",
|
|
203
|
+
alignItems: "center",
|
|
204
|
+
flexShrink: 0
|
|
205
|
+
});
|
|
206
|
+
const BackButton = stylin(IconButton)(({ theme }) => ({
|
|
207
|
+
color: theme.palette.text.secondary
|
|
208
|
+
}));
|
|
209
|
+
const TriggerLabel = stylin(Typography)(({ theme }) => ({
|
|
210
|
+
whiteSpace: "nowrap",
|
|
211
|
+
overflow: "hidden",
|
|
212
|
+
textOverflow: "ellipsis",
|
|
213
|
+
maxWidth: theme.spacing(25),
|
|
214
|
+
lineHeight: 1.4,
|
|
215
|
+
[theme.breakpoints.down("md")]: {
|
|
216
|
+
maxWidth: theme.spacing(15)
|
|
217
|
+
}
|
|
218
|
+
}));
|
|
219
|
+
const Separator = stylin(Typography)(({ theme }) => ({
|
|
220
|
+
color: theme.palette.text.disabled,
|
|
221
|
+
fontSize: theme.typography.body2.fontSize,
|
|
222
|
+
lineHeight: 1,
|
|
223
|
+
userSelect: "none"
|
|
224
|
+
}));
|
|
225
|
+
const CreateMenuItem = stylin(MenuItem)(({ theme }) => ({
|
|
226
|
+
display: "flex",
|
|
227
|
+
alignItems: "center",
|
|
228
|
+
gap: theme.spacing(1),
|
|
229
|
+
color: theme.palette.primary.main,
|
|
230
|
+
fontWeight: theme.typography.fontWeightMedium,
|
|
231
|
+
"& > svg": { fontSize: 18 }
|
|
232
|
+
}));
|
|
233
|
+
const EnvironmentMenuItem = stylin(MenuItem)(({ theme }) => ({
|
|
234
|
+
display: "flex",
|
|
235
|
+
alignItems: "center",
|
|
236
|
+
gap: theme.spacing(1)
|
|
237
|
+
}));
|
|
238
|
+
const EnvironmentMenuLabel = stylin("span")({
|
|
239
|
+
flex: 1,
|
|
240
|
+
minWidth: 0,
|
|
241
|
+
overflow: "hidden",
|
|
242
|
+
textOverflow: "ellipsis",
|
|
243
|
+
whiteSpace: "nowrap"
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
export { GraphHeader };
|
|
247
|
+
//# sourceMappingURL=GraphHeader.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GraphHeader.esm.js","sources":["../../../../src/features/environment/GraphHeader/GraphHeader.tsx"],"sourcesContent":["import { useApi } from '@backstage/frontend-plugin-api';\nimport { useNavigate } from 'react-router-dom';\nimport {\n parseEnvironmentId,\n projectUrl,\n} from '@massdriver/backstage-plugin-common';\nimport Box from '@massdriver/ui/Box';\nimport Typography from '@massdriver/ui/Typography';\nimport IconButton from '@massdriver/ui/IconButton';\nimport Tooltip from '@massdriver/ui/Tooltip';\nimport Divider from '@massdriver/ui/Divider';\nimport { MenuItem } from '@massdriver/ui/Menu';\nimport stylin from '@massdriver/ui/stylin';\nimport ChevronLeftIcon from '@massdriver/ui/icons/ChevronLeftIcon';\nimport AddIcon from '@massdriver/ui/icons/AddIcon';\nimport { massdriverApiRef } from '../../../api';\nimport { ForkPill } from '../../../components/ForkPill';\nimport { RouterLinkAdapter } from '../../../components/RouterLinkAdapter';\nimport { internalRoutes } from '../../../internalRoutes';\nimport { useLiveRelayQuery } from '../realtime/useLiveRelayQuery';\nimport Switcher from './Switcher';\nimport EnvironmentDefaults from './EnvironmentDefaults';\nimport HeaderActions from './HeaderActions';\nimport {\n HEADER_ENVIRONMENTS_QUERY,\n HEADER_PROJECTS_QUERY,\n type HeaderEnvironment,\n type HeaderEnvironmentsResult,\n type HeaderProject,\n type HeaderProjectsResult,\n} from './queries';\n\n/**\n * Read-only environment graph header: back-to-project link, project + env\n * switchers, centered environment defaults, and right-hand actions. Ports the\n * web app's `GraphHeader` layout without any mutation surface.\n */\nexport const GraphHeader = ({\n projectId,\n environmentId,\n}: {\n projectId: string;\n environmentId: string;\n}) => {\n const api = useApi(massdriverApiRef);\n const navigate = useNavigate();\n\n // Live queries: a project/environment created or renamed in the web app\n // shows up in the switchers on the next realtime event.\n const projectsQuery = useLiveRelayQuery<HeaderProjectsResult>(\n HEADER_PROJECTS_QUERY,\n {},\n );\n const environmentsQuery = useLiveRelayQuery<HeaderEnvironmentsResult>(\n HEADER_ENVIRONMENTS_QUERY,\n { filter: { projectId: { eq: projectId } } },\n );\n const headerPending =\n projectsQuery.loading ||\n environmentsQuery.loading ||\n Boolean(projectsQuery.error ?? environmentsQuery.error);\n\n const projects = (projectsQuery.value?.projects?.items ?? []).filter(\n Boolean,\n ) as HeaderProject[];\n const environments = (\n environmentsQuery.value?.environments?.items ?? []\n ).filter(Boolean) as HeaderEnvironment[];\n const project = projects.find(item => item.id === projectId) ?? null;\n const environment =\n environments.find(item => item.id === environmentId) ?? null;\n\n // While loading (or if the header queries fail) fall back to the route ids —\n // never pretend an existing project/environment is missing.\n const projectName = project?.name ?? (headerPending ? projectId : '—');\n const environmentFallback = headerPending\n ? parseEnvironmentId(environmentId).scopedEnvironmentId\n : '—';\n const createEnvironmentUrl = `${projectUrl(\n api.appUrl,\n api.organizationId,\n projectId,\n )}/environments?createEnvironment=true`;\n\n // Switching project navigates to that project's first environment graph, or\n // its overview if it has no environments (mirrors the web app).\n const handleProjectChange = async (selectedProjectId: string) => {\n if (selectedProjectId === projectId) return;\n try {\n const data = (await api.query(HEADER_ENVIRONMENTS_QUERY, {\n filter: { projectId: { eq: selectedProjectId } },\n })) as HeaderEnvironmentsResult;\n const envs = (data.environments?.items ?? []).filter(\n Boolean,\n ) as HeaderEnvironment[];\n navigate(\n envs.length > 0\n ? internalRoutes.environment(selectedProjectId, envs[0].id)\n : internalRoutes.projectTab(selectedProjectId, 'overview'),\n );\n } catch {\n navigate(internalRoutes.projectTab(selectedProjectId, 'overview'));\n }\n };\n\n return (\n <HeaderRoot>\n <LeftZone>\n <Tooltip title=\"Back to project\" arrow enterDelay={600}>\n <BackButton\n size=\"small\"\n component={RouterLinkAdapter}\n href={internalRoutes.project(projectId)}\n aria-label=\"Back to project\"\n >\n <ChevronLeftIcon fontSize=\"small\" />\n </BackButton>\n </Tooltip>\n\n <Switcher\n ariaLabel=\"Switch project\"\n trigger={\n <TriggerLabel variant=\"body2\" color=\"text.secondary\">\n {projectName}\n </TriggerLabel>\n }\n >\n {close =>\n projects.map(item => (\n <MenuItem\n key={item.id}\n selected={item.id === projectId}\n onClick={() => {\n close();\n handleProjectChange(item.id);\n }}\n >\n {item.name}\n </MenuItem>\n ))\n }\n </Switcher>\n\n <Separator>/</Separator>\n\n <Switcher\n ariaLabel=\"Switch environment\"\n trigger={\n <>\n <TriggerLabel variant=\"body2\">\n {environment ? environment.name : environmentFallback}\n </TriggerLabel>\n {environment ? (\n <ForkPill\n parent={environment.parent}\n createdAt={environment.createdAt}\n />\n ) : null}\n </>\n }\n >\n {close => [\n <CreateMenuItem\n key=\"__create__\"\n onClick={() => {\n close();\n window.open(createEnvironmentUrl, '_blank', 'noopener');\n }}\n >\n <AddIcon fontSize=\"small\" />\n <span>Create new environment</span>\n </CreateMenuItem>,\n <Divider key=\"__divider__\" />,\n ...environments.map(item => (\n <EnvironmentMenuItem\n key={item.id}\n selected={item.id === environmentId}\n title={item.name}\n onClick={() => {\n close();\n navigate(internalRoutes.environment(projectId, item.id));\n }}\n >\n <EnvironmentMenuLabel>{item.name}</EnvironmentMenuLabel>\n <ForkPill parent={item.parent} createdAt={item.createdAt} />\n </EnvironmentMenuItem>\n )),\n ]}\n </Switcher>\n </LeftZone>\n\n <CenterZone>\n {environment ? (\n <EnvironmentDefaults environmentId={environment.id} />\n ) : null}\n </CenterZone>\n\n <RightZone>\n <HeaderActions\n appUrl={api.appUrl}\n organizationId={api.organizationId}\n environment={environment}\n environments={environments}\n projectName={project?.name}\n />\n </RightZone>\n </HeaderRoot>\n );\n};\n\nexport default GraphHeader;\n\nconst HeaderRoot = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n height: theme.spacing(6),\n paddingLeft: theme.spacing(1),\n paddingRight: theme.spacing(1.5),\n gap: theme.spacing(1),\n borderBottom: `1px solid ${theme.palette.divider}`,\n backgroundColor: theme.palette.background.paper,\n flexShrink: 0,\n [theme.breakpoints.down('sm')]: {\n overflowX: 'auto',\n overflowY: 'hidden',\n scrollbarWidth: 'none',\n '&::-webkit-scrollbar': { display: 'none' },\n },\n}));\n\nconst LeftZone = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n minWidth: 0,\n flexShrink: 1,\n [theme.breakpoints.down('sm')]: {\n flexShrink: 0,\n },\n}));\n\nconst CenterZone = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flex: 1,\n minWidth: 0,\n [theme.breakpoints.down('sm')]: {\n flex: 'none',\n },\n}));\n\nconst RightZone = stylin(Box)({\n display: 'flex',\n alignItems: 'center',\n flexShrink: 0,\n});\n\nconst BackButton = stylin(IconButton)(({ theme }: { theme: any }) => ({\n color: theme.palette.text.secondary,\n}));\n\nconst TriggerLabel = stylin(Typography)(({ theme }: { theme: any }) => ({\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n maxWidth: theme.spacing(25),\n lineHeight: 1.4,\n [theme.breakpoints.down('md')]: {\n maxWidth: theme.spacing(15),\n },\n}));\n\nconst Separator = stylin(Typography)(({ theme }: { theme: any }) => ({\n color: theme.palette.text.disabled,\n fontSize: theme.typography.body2.fontSize,\n lineHeight: 1,\n userSelect: 'none',\n}));\n\nconst CreateMenuItem = stylin(MenuItem)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n color: theme.palette.primary.main,\n fontWeight: theme.typography.fontWeightMedium,\n '& > svg': { fontSize: 18 },\n}));\n\nconst EnvironmentMenuItem = stylin(MenuItem)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n}));\n\nconst EnvironmentMenuLabel = stylin('span')({\n flex: 1,\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { environmentUrl } from '@massdriver/backstage-plugin-common';
|
|
4
|
+
import Box from '@massdriver/ui/Box';
|
|
5
|
+
import Button from '@massdriver/ui/Button';
|
|
6
|
+
import IconButton from '@massdriver/ui/IconButton';
|
|
7
|
+
import Tooltip from '@massdriver/ui/Tooltip';
|
|
8
|
+
import Divider from '@massdriver/ui/Divider';
|
|
9
|
+
import stylin from '@massdriver/ui/stylin';
|
|
10
|
+
import CompareArrowsIcon from '@massdriver/ui/icons/CompareArrowsIcon';
|
|
11
|
+
import ForkRightIcon from '@massdriver/ui/icons/ForkRightIcon';
|
|
12
|
+
import SettingsIcon from '@massdriver/ui/icons/SettingsIcon';
|
|
13
|
+
import { CompareEnvironmentsDialog } from '../CompareEnvironmentsDialog/CompareEnvironmentsDialog.esm.js';
|
|
14
|
+
|
|
15
|
+
const HeaderActions = ({
|
|
16
|
+
appUrl,
|
|
17
|
+
organizationId,
|
|
18
|
+
environment,
|
|
19
|
+
environments,
|
|
20
|
+
projectName
|
|
21
|
+
}) => {
|
|
22
|
+
const [compareOpen, setCompareOpen] = useState(false);
|
|
23
|
+
const canCompare = environments.length >= 2;
|
|
24
|
+
const envBaseUrl = environment ? environmentUrl(appUrl, organizationId, environment.id) : null;
|
|
25
|
+
const forkUrl = envBaseUrl ? `${envBaseUrl}?forkEnvironment=true` : void 0;
|
|
26
|
+
const settingsUrl = envBaseUrl ? `${envBaseUrl}/settings` : void 0;
|
|
27
|
+
return /* @__PURE__ */ jsxs(Root, { children: [
|
|
28
|
+
/* @__PURE__ */ jsx(Tooltip, { title: "Fork this environment", arrow: true, enterDelay: 400, children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsxs(
|
|
29
|
+
Action,
|
|
30
|
+
{
|
|
31
|
+
variant: "text",
|
|
32
|
+
href: forkUrl,
|
|
33
|
+
target: "_blank",
|
|
34
|
+
rel: "noopener noreferrer",
|
|
35
|
+
disabled: !environment,
|
|
36
|
+
children: [
|
|
37
|
+
/* @__PURE__ */ jsx(ForkRightIcon, {}),
|
|
38
|
+
/* @__PURE__ */ jsx(Label, { children: "Fork" })
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
) }) }),
|
|
42
|
+
/* @__PURE__ */ jsx(
|
|
43
|
+
Tooltip,
|
|
44
|
+
{
|
|
45
|
+
title: canCompare ? "Compare" : "Need at least two environments to compare",
|
|
46
|
+
arrow: true,
|
|
47
|
+
enterDelay: 400,
|
|
48
|
+
children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsxs(
|
|
49
|
+
Action,
|
|
50
|
+
{
|
|
51
|
+
variant: "text",
|
|
52
|
+
disabled: !canCompare,
|
|
53
|
+
onClick: () => setCompareOpen(true),
|
|
54
|
+
children: [
|
|
55
|
+
/* @__PURE__ */ jsx(CompareArrowsIcon, {}),
|
|
56
|
+
/* @__PURE__ */ jsx(Label, { children: "Compare" })
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
) })
|
|
60
|
+
}
|
|
61
|
+
),
|
|
62
|
+
/* @__PURE__ */ jsx(StyledDivider, { orientation: "vertical", flexItem: true }),
|
|
63
|
+
/* @__PURE__ */ jsx(Tooltip, { title: "Environment settings", arrow: true, enterDelay: 400, children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(
|
|
64
|
+
GearButton,
|
|
65
|
+
{
|
|
66
|
+
size: "small",
|
|
67
|
+
href: settingsUrl,
|
|
68
|
+
target: "_blank",
|
|
69
|
+
rel: "noopener noreferrer",
|
|
70
|
+
disabled: !environment,
|
|
71
|
+
"aria-label": "Environment settings",
|
|
72
|
+
children: /* @__PURE__ */ jsx(SettingsIcon, {})
|
|
73
|
+
}
|
|
74
|
+
) }) }),
|
|
75
|
+
/* @__PURE__ */ jsx(
|
|
76
|
+
CompareEnvironmentsDialog,
|
|
77
|
+
{
|
|
78
|
+
open: compareOpen,
|
|
79
|
+
onClose: () => setCompareOpen(false),
|
|
80
|
+
projectName,
|
|
81
|
+
environments,
|
|
82
|
+
defaultSourceEnvironment: environment
|
|
83
|
+
}
|
|
84
|
+
)
|
|
85
|
+
] });
|
|
86
|
+
};
|
|
87
|
+
const Root = stylin(Box)(({ theme }) => ({
|
|
88
|
+
display: "flex",
|
|
89
|
+
alignItems: "center",
|
|
90
|
+
gap: theme.spacing(0.25)
|
|
91
|
+
}));
|
|
92
|
+
const Action = stylin(Button)(({ theme }) => ({
|
|
93
|
+
alignItems: "center",
|
|
94
|
+
minWidth: theme.spacing(2.5),
|
|
95
|
+
gap: theme.spacing(0.5),
|
|
96
|
+
padding: `${theme.spacing(0.5)} ${theme.spacing(1)}`,
|
|
97
|
+
color: theme.palette.text.secondary,
|
|
98
|
+
fontSize: theme.typography.caption.fontSize,
|
|
99
|
+
fontWeight: 500,
|
|
100
|
+
fontFamily: theme.typography.fontFamily,
|
|
101
|
+
whiteSpace: "nowrap",
|
|
102
|
+
transition: "color 120ms ease, background-color 120ms ease",
|
|
103
|
+
"& > svg": { fontSize: 18 },
|
|
104
|
+
"&:hover": {
|
|
105
|
+
color: theme.palette.text.primary,
|
|
106
|
+
backgroundColor: theme.palette.action.hover
|
|
107
|
+
}
|
|
108
|
+
}));
|
|
109
|
+
const Label = stylin("span")(({ theme }) => ({
|
|
110
|
+
[theme.breakpoints.down("md")]: {
|
|
111
|
+
display: "none"
|
|
112
|
+
}
|
|
113
|
+
}));
|
|
114
|
+
const GearButton = stylin(IconButton)(({ theme }) => ({
|
|
115
|
+
color: theme.palette.text.secondary,
|
|
116
|
+
"& > svg": { fontSize: 18 },
|
|
117
|
+
"&:hover": {
|
|
118
|
+
color: theme.palette.text.primary
|
|
119
|
+
}
|
|
120
|
+
}));
|
|
121
|
+
const StyledDivider = stylin(Divider)(({ theme }) => ({
|
|
122
|
+
marginLeft: theme.spacing(0.5),
|
|
123
|
+
marginRight: theme.spacing(0.5)
|
|
124
|
+
}));
|
|
125
|
+
|
|
126
|
+
export { HeaderActions, HeaderActions as default };
|
|
127
|
+
//# sourceMappingURL=HeaderActions.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeaderActions.esm.js","sources":["../../../../src/features/environment/GraphHeader/HeaderActions.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { environmentUrl } from '@massdriver/backstage-plugin-common';\nimport Box from '@massdriver/ui/Box';\nimport Button from '@massdriver/ui/Button';\nimport IconButton from '@massdriver/ui/IconButton';\nimport Tooltip from '@massdriver/ui/Tooltip';\nimport Divider from '@massdriver/ui/Divider';\nimport stylin from '@massdriver/ui/stylin';\nimport CompareArrowsIcon from '@massdriver/ui/icons/CompareArrowsIcon';\nimport ForkRightIcon from '@massdriver/ui/icons/ForkRightIcon';\nimport SettingsIcon from '@massdriver/ui/icons/SettingsIcon';\nimport CompareEnvironmentsDialog from '../CompareEnvironmentsDialog';\nimport type { HeaderEnvironment } from './queries';\n\n/**\n * Right-hand header actions. Fork + Settings deep-link out to the web app (this\n * plugin is read-only); Compare opens the local read-only comparison dialog.\n */\nexport const HeaderActions = ({\n appUrl,\n organizationId,\n environment,\n environments,\n projectName,\n}: {\n appUrl: string;\n organizationId: string;\n environment: HeaderEnvironment | null;\n environments: HeaderEnvironment[];\n projectName?: string;\n}) => {\n const [compareOpen, setCompareOpen] = useState(false);\n\n const canCompare = environments.length >= 2;\n const envBaseUrl = environment\n ? environmentUrl(appUrl, organizationId, environment.id)\n : null;\n const forkUrl = envBaseUrl ? `${envBaseUrl}?forkEnvironment=true` : undefined;\n const settingsUrl = envBaseUrl ? `${envBaseUrl}/settings` : undefined;\n\n return (\n <Root>\n <Tooltip title=\"Fork this environment\" arrow enterDelay={400}>\n <span>\n <Action\n variant=\"text\"\n href={forkUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n disabled={!environment}\n >\n <ForkRightIcon />\n <Label>Fork</Label>\n </Action>\n </span>\n </Tooltip>\n\n <Tooltip\n title={\n canCompare ? 'Compare' : 'Need at least two environments to compare'\n }\n arrow\n enterDelay={400}\n >\n <span>\n <Action\n variant=\"text\"\n disabled={!canCompare}\n onClick={() => setCompareOpen(true)}\n >\n <CompareArrowsIcon />\n <Label>Compare</Label>\n </Action>\n </span>\n </Tooltip>\n\n <StyledDivider orientation=\"vertical\" flexItem />\n\n <Tooltip title=\"Environment settings\" arrow enterDelay={400}>\n <span>\n <GearButton\n size=\"small\"\n href={settingsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n disabled={!environment}\n aria-label=\"Environment settings\"\n >\n <SettingsIcon />\n </GearButton>\n </span>\n </Tooltip>\n\n <CompareEnvironmentsDialog\n open={compareOpen}\n onClose={() => setCompareOpen(false)}\n projectName={projectName}\n environments={environments}\n defaultSourceEnvironment={environment}\n />\n </Root>\n );\n};\n\nexport default HeaderActions;\n\nconst Root = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.25),\n}));\n\nconst Action = stylin(Button)(({ theme }: { theme: any }) => ({\n alignItems: 'center',\n minWidth: theme.spacing(2.5),\n gap: theme.spacing(0.5),\n padding: `${theme.spacing(0.5)} ${theme.spacing(1)}`,\n color: theme.palette.text.secondary,\n fontSize: theme.typography.caption.fontSize,\n fontWeight: 500,\n fontFamily: theme.typography.fontFamily,\n whiteSpace: 'nowrap',\n transition: 'color 120ms ease, background-color 120ms ease',\n '& > svg': { fontSize: 18 },\n '&:hover': {\n color: theme.palette.text.primary,\n backgroundColor: theme.palette.action.hover,\n },\n}));\n\nconst Label = stylin('span')(({ theme }: { theme: any }) => ({\n [theme.breakpoints.down('md')]: {\n display: 'none',\n },\n}));\n\nconst GearButton = stylin(IconButton)(({ theme }: { theme: any }) => ({\n color: theme.palette.text.secondary,\n '& > svg': { fontSize: 18 },\n '&:hover': {\n color: theme.palette.text.primary,\n },\n}));\n\nconst StyledDivider = stylin(Divider)(({ theme }: { theme: any }) => ({\n marginLeft: theme.spacing(0.5),\n marginRight: theme.spacing(0.5),\n}));\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import Box from '@massdriver/ui/Box';
|
|
4
|
+
import Menu from '@massdriver/ui/Menu';
|
|
5
|
+
import ArrowDropDownIcon from '@massdriver/ui/icons/ArrowDropDownIcon';
|
|
6
|
+
import stylin from '@massdriver/ui/stylin';
|
|
7
|
+
|
|
8
|
+
const Switcher = ({
|
|
9
|
+
trigger,
|
|
10
|
+
children,
|
|
11
|
+
ariaLabel
|
|
12
|
+
}) => {
|
|
13
|
+
const [anchorEl, setAnchorEl] = useState(null);
|
|
14
|
+
const open = Boolean(anchorEl);
|
|
15
|
+
const close = () => setAnchorEl(null);
|
|
16
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
17
|
+
/* @__PURE__ */ jsxs(
|
|
18
|
+
Trigger,
|
|
19
|
+
{
|
|
20
|
+
role: "button",
|
|
21
|
+
tabIndex: 0,
|
|
22
|
+
"aria-label": ariaLabel,
|
|
23
|
+
onClick: (event) => setAnchorEl(event.currentTarget),
|
|
24
|
+
onKeyDown: (event) => {
|
|
25
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
26
|
+
event.preventDefault();
|
|
27
|
+
setAnchorEl(event.currentTarget);
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
children: [
|
|
31
|
+
trigger,
|
|
32
|
+
/* @__PURE__ */ jsx(DropdownIcon, {})
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
),
|
|
36
|
+
/* @__PURE__ */ jsx(
|
|
37
|
+
Menu,
|
|
38
|
+
{
|
|
39
|
+
anchorEl,
|
|
40
|
+
open,
|
|
41
|
+
onClose: close,
|
|
42
|
+
anchorOrigin: { vertical: "bottom", horizontal: "left" },
|
|
43
|
+
transformOrigin: { vertical: "top", horizontal: "left" },
|
|
44
|
+
MenuListProps: { sx: { py: 0.5 } },
|
|
45
|
+
slotProps: { paper: { sx: { maxWidth: 320, minWidth: 200 } } },
|
|
46
|
+
children: children(close)
|
|
47
|
+
}
|
|
48
|
+
)
|
|
49
|
+
] });
|
|
50
|
+
};
|
|
51
|
+
const Trigger = stylin(Box)(({ theme }) => ({
|
|
52
|
+
display: "flex",
|
|
53
|
+
alignItems: "center",
|
|
54
|
+
gap: theme.spacing(0.5),
|
|
55
|
+
cursor: "pointer",
|
|
56
|
+
padding: `${theme.spacing(0.5)} ${theme.spacing(0.75)}`,
|
|
57
|
+
borderRadius: theme.custom.general.borderRadius,
|
|
58
|
+
transition: "background-color 120ms ease",
|
|
59
|
+
minWidth: 0,
|
|
60
|
+
"&:hover": {
|
|
61
|
+
backgroundColor: theme.palette.action.hover
|
|
62
|
+
},
|
|
63
|
+
"&:focus-visible": {
|
|
64
|
+
outline: `2px solid ${theme.palette.primary.main}`,
|
|
65
|
+
outlineOffset: 2
|
|
66
|
+
}
|
|
67
|
+
}));
|
|
68
|
+
const DropdownIcon = stylin(ArrowDropDownIcon)(({ theme }) => ({
|
|
69
|
+
color: theme.palette.text.disabled,
|
|
70
|
+
fontSize: 16,
|
|
71
|
+
flexShrink: 0
|
|
72
|
+
}));
|
|
73
|
+
|
|
74
|
+
export { Switcher, Switcher as default };
|
|
75
|
+
//# sourceMappingURL=Switcher.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Switcher.esm.js","sources":["../../../../src/features/environment/GraphHeader/Switcher.tsx"],"sourcesContent":["import { useState, type ReactNode } from 'react';\nimport Box from '@massdriver/ui/Box';\nimport Menu from '@massdriver/ui/Menu';\nimport ArrowDropDownIcon from '@massdriver/ui/icons/ArrowDropDownIcon';\nimport stylin from '@massdriver/ui/stylin';\n\n/**\n * A click-to-open dropdown built on `@massdriver/ui/Menu`. Replaces the web\n * app's Apollo-backed `InfiniteSelect` with a plain menu — the header already\n * has the full option list in memory, so no infinite scroll is needed.\n *\n * `trigger` renders the label; `children` is a render-prop given a `close`\n * callback to build the menu body.\n */\nexport const Switcher = ({\n trigger,\n children,\n ariaLabel,\n}: {\n trigger: ReactNode;\n children: (close: () => void) => ReactNode;\n ariaLabel?: string;\n}) => {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n const close = () => setAnchorEl(null);\n\n return (\n <>\n <Trigger\n role=\"button\"\n tabIndex={0}\n aria-label={ariaLabel}\n onClick={(event: any) => setAnchorEl(event.currentTarget)}\n onKeyDown={(event: any) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n setAnchorEl(event.currentTarget);\n }\n }}\n >\n {trigger}\n <DropdownIcon />\n </Trigger>\n <Menu\n anchorEl={anchorEl}\n open={open}\n onClose={close}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n transformOrigin={{ vertical: 'top', horizontal: 'left' }}\n MenuListProps={{ sx: { py: 0.5 } }}\n slotProps={{ paper: { sx: { maxWidth: 320, minWidth: 200 } } }}\n >\n {children(close)}\n </Menu>\n </>\n );\n};\n\nexport default Switcher;\n\nconst Trigger = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n cursor: 'pointer',\n padding: `${theme.spacing(0.5)} ${theme.spacing(0.75)}`,\n borderRadius: theme.custom.general.borderRadius,\n transition: 'background-color 120ms ease',\n minWidth: 0,\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n '&:focus-visible': {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 2,\n },\n}));\n\nconst DropdownIcon = stylin(ArrowDropDownIcon)(({ theme }: { theme: any }) => ({\n color: theme.palette.text.disabled,\n fontSize: 16,\n flexShrink: 0,\n}));\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
const HEADER_PROJECTS_QUERY = `
|
|
2
|
+
query MassdriverHeaderProjects($organizationId: ID!) {
|
|
3
|
+
projects(organizationId: $organizationId, cursor: { limit: 100 }) {
|
|
4
|
+
items {
|
|
5
|
+
id
|
|
6
|
+
name
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
`;
|
|
11
|
+
const HEADER_ENVIRONMENTS_QUERY = `
|
|
12
|
+
query MassdriverHeaderEnvironments(
|
|
13
|
+
$organizationId: ID!
|
|
14
|
+
$filter: EnvironmentsFilter
|
|
15
|
+
) {
|
|
16
|
+
environments(
|
|
17
|
+
organizationId: $organizationId
|
|
18
|
+
filter: $filter
|
|
19
|
+
cursor: { limit: 100 }
|
|
20
|
+
) {
|
|
21
|
+
items {
|
|
22
|
+
id
|
|
23
|
+
name
|
|
24
|
+
createdAt
|
|
25
|
+
parent {
|
|
26
|
+
id
|
|
27
|
+
name
|
|
28
|
+
createdAt
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
`;
|
|
34
|
+
const ENVIRONMENT_DEFAULTS_QUERY = `
|
|
35
|
+
query MassdriverEnvironmentDefaults(
|
|
36
|
+
$organizationId: ID!
|
|
37
|
+
$environmentId: ID!
|
|
38
|
+
) {
|
|
39
|
+
environment(organizationId: $organizationId, id: $environmentId) {
|
|
40
|
+
id
|
|
41
|
+
defaults(cursor: { limit: 100 }) {
|
|
42
|
+
items {
|
|
43
|
+
id
|
|
44
|
+
resource {
|
|
45
|
+
id
|
|
46
|
+
name
|
|
47
|
+
resourceType {
|
|
48
|
+
id
|
|
49
|
+
name
|
|
50
|
+
icon
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
`;
|
|
58
|
+
|
|
59
|
+
export { ENVIRONMENT_DEFAULTS_QUERY, HEADER_ENVIRONMENTS_QUERY, HEADER_PROJECTS_QUERY };
|
|
60
|
+
//# sourceMappingURL=queries.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.esm.js","sources":["../../../../src/features/environment/GraphHeader/queries.ts"],"sourcesContent":["// Queries backing the read-only environment graph header. `organizationId` is\n// injected by the backend relay, so callers pass only the other variables.\n\n// Both switcher queries carry an explicit cursor bound: the current\n// project/environment is resolved by `.find()` over the returned page, so an\n// unbounded (default-page) query could fail to resolve an entity that sorts\n// past the first page — the header would show '—' for a project/environment\n// that exists.\nexport const HEADER_PROJECTS_QUERY = `\n query MassdriverHeaderProjects($organizationId: ID!) {\n projects(organizationId: $organizationId, cursor: { limit: 100 }) {\n items {\n id\n name\n }\n }\n }\n`;\n\nexport const HEADER_ENVIRONMENTS_QUERY = `\n query MassdriverHeaderEnvironments(\n $organizationId: ID!\n $filter: EnvironmentsFilter\n ) {\n environments(\n organizationId: $organizationId\n filter: $filter\n cursor: { limit: 100 }\n ) {\n items {\n id\n name\n createdAt\n parent {\n id\n name\n createdAt\n }\n }\n }\n }\n`;\n\nexport const ENVIRONMENT_DEFAULTS_QUERY = `\n query MassdriverEnvironmentDefaults(\n $organizationId: ID!\n $environmentId: ID!\n ) {\n environment(organizationId: $organizationId, id: $environmentId) {\n id\n defaults(cursor: { limit: 100 }) {\n items {\n id\n resource {\n id\n name\n resourceType {\n id\n name\n icon\n }\n }\n }\n }\n }\n }\n`;\n\nexport interface HeaderProject {\n id: string;\n name: string;\n}\n\nexport interface HeaderEnvironment {\n id: string;\n name: string;\n createdAt?: string | null;\n parent?: { id: string; name?: string; createdAt?: string } | null;\n}\n\nexport interface HeaderProjectsResult {\n projects: { items?: (HeaderProject | null)[] | null } | null;\n}\n\nexport interface HeaderEnvironmentsResult {\n environments: { items?: (HeaderEnvironment | null)[] | null } | null;\n}\n\nexport interface ResourceType {\n id: string;\n name: string;\n icon?: string | null;\n}\n\nexport interface EnvironmentDefaultItem {\n id: string;\n resource: {\n id: string;\n name: string;\n resourceType: ResourceType;\n };\n}\n\nexport interface EnvironmentDefaultsResult {\n environment: {\n id: string;\n defaults?: { items?: (EnvironmentDefaultItem | null)[] | null } | null;\n } | null;\n}\n"],"names":[],"mappings":"AAQO,MAAM,qBAAA,GAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAW9B,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;AAwBlC,MAAM,0BAAA,GAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;"}
|