Skip to content

feat: update atlas cluster states COMPASS-8228 #6884

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 14 commits into from
May 6, 2025
Next Next commit
init
  • Loading branch information
syn-zhu committed Apr 30, 2025
commit 3b30da4fc47c97798328487e3cc7ce7bb002835a
1 change: 1 addition & 0 deletions packages/compass-components/src/hooks/use-theme.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ enum Theme {
export function useDarkMode(localDarkMode?: boolean): boolean | undefined {
const darkMode = useLeafyGreenDarkMode(localDarkMode);
return darkMode.darkMode;
// return false;
}

interface WithDarkModeProps {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,16 @@ import {
css,
ItemActionControls,
cx,
Badge,
BadgeVariant,
} from '@mongodb-js/compass-components';
import { type Actions, ROW_HEIGHT } from './constants';
import { ExpandButton } from './tree-item';
import { type NavigationItemActions } from './item-actions';
import type { SidebarTreeItem, SidebarActionableItem } from './tree-data';

type NavigationBaseItemProps = {
item: SidebarTreeItem;
name: string;
isActive: boolean;
isExpandVisible: boolean;
Expand Down Expand Up @@ -87,6 +91,7 @@ const actionControlsWrapperStyles = css({
});

export const NavigationBaseItem: React.FC<NavigationBaseItemProps> = ({
item,
isActive,
actionProps,
name,
Expand All @@ -101,6 +106,26 @@ export const NavigationBaseItem: React.FC<NavigationBaseItemProps> = ({
toggleExpand,
children,
}) => {
// TODO: add extra UI stuff here

let isDisabled = false;
let status = '';
let variant = BadgeVariant.LightGray;
if (item.type === 'connection') {
const connectionInfo = item.connectionInfo;
isDisabled =
connectionInfo.atlasMetadata?.clusterState === 'DELETING' ||
connectionInfo.atlasMetadata?.clusterState === 'PAUSED' ||
connectionInfo.atlasMetadata?.clusterState === 'CREATING';
if (isDisabled) {
status = connectionInfo.atlasMetadata?.clusterState;
if (status === 'CREATING') {
variant = BadgeVariant.Blue;
}
console.log(status);
}
}

const [hoverProps, isHovered] = useHoverState();
return (
<div
Expand All @@ -127,6 +152,18 @@ export const NavigationBaseItem: React.FC<NavigationBaseItemProps> = ({
{icon}
<span title={name}>{name}</span>
</div>
{isDisabled && (
<Badge
variant={variant}
className={css({
verticalAlign: 'middle',
marginLeft: spacing[100],
})}
data-testid="navigation-item-state-badge"
>
{status}
</Badge>
)}
<div className={actionControlsWrapperStyles}>
<ItemActionControls
menuClassName={menuStyles}
Expand Down
7 changes: 7 additions & 0 deletions packages/compass-connections-navigation/src/item-actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,13 @@ export const notConnectedConnectionItemActions = ({
connectionInfo: ConnectionInfo;
connectionStatus: NotConnectedConnectionStatus;
}): NavigationItemActions => {
if (
connectionInfo.atlasMetadata?.clusterState === 'DELETING' ||
connectionInfo.atlasMetadata?.clusterState === 'PAUSED' ||
connectionInfo.atlasMetadata?.clusterState === 'CREATING'
) {
return [];
}
const commonActions = commonConnectionItemActions({ connectionInfo });
if (connectionStatus === 'connecting') {
return commonActions;
Expand Down
18 changes: 14 additions & 4 deletions packages/compass-connections-navigation/src/navigation-item.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -111,14 +111,23 @@ export function NavigationItem({
onItemExpand,
getItemActions,
}: NavigationItemProps) {
let isDisabled = false;
if (item.type === 'connection') {
const connectionInfo = item.connectionInfo;
isDisabled =
connectionInfo.atlasMetadata?.clusterState === 'DELETING' ||
connectionInfo.atlasMetadata?.clusterState === 'PAUSED' ||
connectionInfo.atlasMetadata?.clusterState === 'CREATING';
}

const isDarkMode = useDarkMode();
const onAction = useCallback(
(action: Actions) => {
if (item.type !== 'placeholder') {
if (item.type !== 'placeholder' || !isDisabled) {
onItemAction(item, action);
}
},
[item, onItemAction]
[item, onItemAction, isDisabled]
);

const style = useMemo(() => getTreeItemStyles(item), [item]);
Expand Down Expand Up @@ -201,17 +210,18 @@ export function NavigationItem({
}, [item, isDarkMode]);

const toggleExpand = useCallback(() => {
if (item.type !== 'placeholder') {
if (item.type !== 'placeholder' || isDisabled) {
onItemExpand(item, !item.isExpanded);
}
}, [onItemExpand, item]);
}, [onItemExpand, item, isDisabled]);

return (
<StyledNavigationItem item={item}>
{item.type === 'placeholder' ? (
<PlaceholderItem level={item.level} />
) : (
<NavigationBaseItem
item={item}
isActive={isActive}
isFocused={isFocused}
isExpanded={!!item.isExpanded}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ export default function StyledNavigationItem({
const style: AcceptedStyles = {};
const isDisconnectedConnection =
item.type === 'connection' && item.connectionStatus !== 'connected';

const isNonExistentNamespace =
(item.type === 'database' || item.type === 'collection') &&
item.isNonExistent;
Expand All @@ -44,12 +45,21 @@ export default function StyledNavigationItem({
style['--item-bg-color-active'] = connectionColorToHexActive(colorCode);
}

if (isDisconnectedConnection || isNonExistentNamespace) {
if (isDisconnectedConnection) {
style['--item-color'] = inactiveColor;
const connectionInfo = item.connectionInfo;
if (
connectionInfo.atlasMetadata?.clusterState === 'DELETING' ||
connectionInfo.atlasMetadata?.clusterState === 'PAUSED' ||
connectionInfo.atlasMetadata?.clusterState === 'CREATING'
) {
style['--item-color-active'] = inactiveColor;
}
}

// For a non-existent namespace, even if its active, we show it as inactive
if (isNonExistentNamespace) {
style['--item-color'] = inactiveColor;
style['--item-color-active'] = inactiveColor;
}
return style;
Expand Down
22 changes: 15 additions & 7 deletions packages/compass-web/src/connection-storage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -247,10 +247,13 @@ export function buildConnectionInfoFromClusterDescription(
};
}

const CONNECTABLE_CLUSTER_STATES: AtlasClusterMetadata['clusterState'][] = [
const VISIBLE_CLUSTER_STATES: AtlasClusterMetadata['clusterState'][] = [
'IDLE',
'REPARING',
'REPAIRING',
'UPDATING',
'PAUSED',
'CREATING',
'DELETING',
];

/**
Expand Down Expand Up @@ -288,20 +291,21 @@ export class AtlasCloudConnectionStorage

const connectionInfoList = (await res.json()) as ConnectionInfo[];

return connectionInfoList
console.log(connectionInfoList);

const cil = connectionInfoList
.map((connectionInfo: ConnectionInfo): ConnectionInfo | null => {
if (
!connectionInfo.connectionOptions.connectionString ||
!connectionInfo.atlasMetadata ||
// TODO(COMPASS-8228): do not filter out those connections, display
// them in navigation, but in a way that doesn't allow connecting
!CONNECTABLE_CLUSTER_STATES.includes(
!VISIBLE_CLUSTER_STATES.includes(
connectionInfo.atlasMetadata.clusterState
)
) {
return null;
}

console.log(connectionInfo);

const clusterName = connectionInfo.atlasMetadata.clusterName;

return {
Expand All @@ -323,6 +327,10 @@ export class AtlasCloudConnectionStorage
.filter((connectionInfo): connectionInfo is ConnectionInfo => {
return !!connectionInfo;
});

console.log('FILTERED');
console.log(cil);
return cil;
}

/**
Expand Down
2 changes: 1 addition & 1 deletion packages/connection-info/src/connection-info.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ export interface AtlasClusterMetadata {
| 'UPDATING'
| 'PAUSED'
| 'IDLE'
| 'REPARING'
| 'REPAIRING'
| 'DELETING'
| 'DELETED';
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's a related comment above, is SUCCESSor WORKING a state we want to have here? Where's the source of truth for these?
It's not this right?
https://github.com/10gen/mms/blob/8f63b6c6e79f50a310a662260131f2f05818cdd8/server/src/main/com/xgen/cloud/nds/project/_public/model/ClusterDescription.java#L4681

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


Expand Down