// This is all mercilessly copied from LoadBalancersTag.tsx. This should be cleaned up at some point // Probably when we convert clusters view to React. import { sortBy } from 'lodash'; import React from 'react'; import type { ILoadBalancer, ILoadBalancersTagProps } from '@spinnaker/core'; import { HealthCounts, HoverablePopover, LoadBalancerDataUtils, logger, ReactInjector, Spinner, Tooltip, } from '@spinnaker/core'; import { AmazonLoadBalancerDataUtils } from './amazonLoadBalancerDataUtils'; import type { IAmazonServerGroup, ITargetGroup } from '../domain'; interface ILoadBalancerListItemProps { loadBalancer: ILoadBalancer | ITargetGroup; onItemClick: (loadBalancer: ILoadBalancer | ITargetGroup) => void; } interface ILoadBalancerSingleItemProps extends ILoadBalancerListItemProps { label: string; } class LoadBalancerListItem extends React.Component { private onClick = (e: React.MouseEvent): void => { this.props.onItemClick(this.props.loadBalancer); e.nativeEvent.preventDefault(); // yay angular JQueryEvent still listening to the click event... }; public render(): React.ReactElement { return ( {this.props.loadBalancer.name} ); } } class LoadBalancerButton extends React.Component { private onClick = (e: React.MouseEvent): void => { this.props.onItemClick(this.props.loadBalancer); e.nativeEvent.preventDefault(); // yay angular JQueryEvent still listening to the click event... }; public render(): React.ReactElement { return ( ); } } export interface IAmazonLoadBalancersTagState { loadBalancers: ILoadBalancer[]; targetGroups: ITargetGroup[]; isLoading: boolean; } export class AmazonLoadBalancersTag extends React.Component { private loadBalancersRefreshUnsubscribe: () => void; private mounted = false; constructor(props: ILoadBalancersTagProps) { super(props); this.state = { loadBalancers: [], targetGroups: [], isLoading: true, }; } private showLoadBalancerDetails = (loadBalancer: ILoadBalancer): void => { const { $state } = ReactInjector; const serverGroup = this.props.serverGroup; logger.log({ category: 'Cluster Pod', action: `Load Load Balancer Details (multiple menu)` }); const nextState = $state.current.name.endsWith('.clusters') ? '.loadBalancerDetails' : '^.loadBalancerDetails'; $state.go(nextState, { region: serverGroup.region, accountId: serverGroup.account, name: loadBalancer.name, provider: serverGroup.type, }); }; private showTargetGroupDetails = (targetGroup: ITargetGroup): void => { const { $state } = ReactInjector; logger.log({ category: 'Cluster Pod', action: `Load Target Group Details (multiple menu)` }); const nextState = $state.current.name.endsWith('.clusters') ? '.targetGroupDetails' : '^.targetGroupDetails'; $state.go(nextState, { region: targetGroup.region, accountId: targetGroup.account, name: targetGroup.name, provider: 'aws', loadBalancerName: targetGroup.loadBalancerNames[0], }); }; private handleShowPopover = () => { logger.log({ category: 'Cluster Pod', action: `Show Load Balancers Menu` }); }; private handleClick = (e: React.MouseEvent): void => { e.preventDefault(); e.stopPropagation(); }; public componentDidMount(): void { this.mounted = true; this.loadBalancersRefreshUnsubscribe = this.props.application.getDataSource('loadBalancers').onRefresh(null, () => { this.forceUpdate(); }); LoadBalancerDataUtils.populateLoadBalancers(this.props.application, this.props.serverGroup).then( (loadBalancers) => { if (this.mounted) { this.setState({ loadBalancers, isLoading: false }); } }, ); AmazonLoadBalancerDataUtils.populateTargetGroups( this.props.application, this.props.serverGroup as IAmazonServerGroup, ).then((targetGroups: ITargetGroup[]) => { if (this.mounted) { this.setState({ targetGroups }); } }); } public componentWillUnmount(): void { this.mounted = false; this.loadBalancersRefreshUnsubscribe(); } public render(): React.ReactElement { const { loadBalancers, targetGroups, isLoading } = this.state; const targetGroupCount = (targetGroups && targetGroups.length) || 0; const loadBalancerCount = (loadBalancers && loadBalancers.length) || 0; const totalCount = targetGroupCount + loadBalancerCount; if (!totalCount) { return isLoading ? : null; } const className = `load-balancers-tag ${totalCount > 1 ? 'overflowing' : ''}`; const popover = (
{loadBalancerCount > 0 &&
Load Balancers
} {sortBy(loadBalancers, 'name').map((loadBalancer) => ( ))} {targetGroupCount > 0 &&
Target Groups
} {sortBy(targetGroups, 'name').map((targetGroup) => ( ))}
); return ( {totalCount > 1 && ( )} {loadBalancers.length === 1 && targetGroups.length === 0 && ( )} {targetGroups.length === 1 && loadBalancers.length === 0 && ( )} ); } }