import { get } from 'lodash'; import React from 'react'; import type { IDockerViewModel, IJenkinsViewModel } from './ServerGroup'; import type { Application } from '../application'; import { ArtifactIconService } from '../artifact'; import { CloudProviderLogo } from '../cloudProvider'; import type { IServerGroup } from '../domain'; import { EntityNotifications } from '../entityTag/notifications/EntityNotifications'; import type { ISortFilter } from '../filterModel'; import { HealthCounts } from '../healthCounts'; import { LoadBalancersTagWrapper } from '../loadBalancer'; import { NameUtils } from '../naming'; import { Overridable } from '../overrideRegistry'; import { RunningTasksTag } from './pod/RunningTasksTag'; export interface IServerGroupHeaderProps { application: Application; images?: string[]; isMultiSelected: boolean; jenkins: IJenkinsViewModel; docker: IDockerViewModel; serverGroup: IServerGroup; sortFilter: ISortFilter; } export class LoadBalancers extends React.Component { public render() { const { application, serverGroup } = this.props; const hasLoadBalancer = !!get(serverGroup, 'loadBalancers.length') || !!get(serverGroup, 'targetGroups.length'); return ( hasLoadBalancer && ); } } export class MultiSelectCheckbox extends React.Component { public render() { // ServerGroup.tsx handles multi-select events and state const { isMultiSelected, sortFilter: { multiselect }, } = this.props; return multiselect && ; } } export class CloudProviderIcon extends React.Component { public render() { const { serverGroup } = this.props; return ; } } export interface IImageListState { collapsed: boolean; } export class ImageList extends React.Component { private toggle() { this.setState((previousState: IImageListState) => { return { collapsed: !previousState.collapsed }; }); } constructor(props: IServerGroupHeaderProps) { super(props); this.state = { collapsed: true, }; this.toggle = this.toggle.bind(this); } public render() { const images = this.props.images.sort(); const { collapsed } = this.state; const buttonStyle = { padding: 0, fontSize: '13px', }; return ( <> {collapsed && ( <> {images[0]}   {images.length > 1 && ( )} )} {!collapsed && ( <> {images.map((image, index) => ( {index > 0 &&
} {image} {index < images.length - 1 ? ',' : ''}
))}
)} ); } } export class SequenceAndBuildAndImages extends React.Component { public render() { const { serverGroup, jenkins, images, docker } = this.props; const serverGroupSequence = NameUtils.getSequence(serverGroup.moniker.sequence); const ciBuild = serverGroup.buildInfo && serverGroup.buildInfo.ciBuild; const appArtifact = serverGroup.buildInfo && serverGroup.buildInfo.appArtifact; return (
{!!serverGroupSequence && {serverGroupSequence}} {!!serverGroupSequence && (!!jenkins || !!images) && : } {!!jenkins && ( Build: #{jenkins.number} )} {!!docker && ( {docker.image}:{docker.tag || docker.digest} )} {!!appArtifact && !!appArtifact.version ? ( <>      {!!appArtifact.url ? ( {appArtifact.version} ) : ( <>{appArtifact.version} )} ) : ( !!ciBuild && !!ciBuild.jobNumber && ( <>      {!!ciBuild.jobUrl ? ( {ciBuild.jobNumber} ) : ( <>{ciBuild.jobNumber} )} ) )} {!!images && }
); } } export class Alerts extends React.Component { public render() { const { application, serverGroup } = this.props; return ( application.serverGroups.refresh()} pageLocation="pod" placement="top" /> ); } } @Overridable('serverGroups.pod.header.health') export class Health extends React.Component { public render() { const { serverGroup } = this.props; return ; } } export class RunningTasks extends React.Component { public render() { const { serverGroup } = this.props; const hasRunningExecutions = !!serverGroup.runningExecutions.length || !!serverGroup.runningTasks.length; return ( hasRunningExecutions && ( ) ); } } @Overridable('serverGroups.pod.header') export class ServerGroupHeader extends React.Component { public render() { const props = this.props; return (
); } }