joyent-portal/packages/cp-frontend/src/containers/services/list.js

183 lines
4.7 KiB
JavaScript
Raw Normal View History

2017-05-11 20:16:52 +03:00
import React, { Component } from 'react';
2017-05-19 00:04:29 +03:00
import { compose, graphql } from 'react-apollo';
import { connect } from 'react-redux';
2017-05-19 00:04:29 +03:00
import styled from 'styled-components';
2017-05-11 20:16:52 +03:00
import ServicesQuery from '@graphql/Services.gql';
import ServicesRestartMutation from '@graphql/ServicesRestartMutation.gql';
import ServicesStopMutation from '@graphql/ServicesStopMutation.gql';
import ServicesStartMutation from '@graphql/ServicesStartMutation.gql';
2017-02-28 20:34:48 +02:00
2017-05-19 00:04:29 +03:00
import { processServices } from '@root/state/selectors';
import { toggleServicesQuickActions } from '@root/state/actions';
2017-05-19 00:04:29 +03:00
import { LayoutContainer } from '@components/layout';
2017-05-22 20:13:24 +03:00
import { Loader, ErrorMessage } from '@components/messaging';
2017-05-19 00:04:29 +03:00
import { ServiceListItem } from '@components/services';
import { ServicesQuickActions } from '@components/services';
2017-05-19 00:04:29 +03:00
const StyledContainer = styled.div`
position: relative;
`;
2017-05-11 20:16:52 +03:00
class ServiceList extends Component {
ref(name) {
this._refs = this._refs || {};
return el => {
this._refs[name] = el;
};
}
render() {
const {
deploymentGroup,
services,
loading,
error,
servicesQuickActions,
toggleServicesQuickActions,
url,
restartServices,
stopServices,
startServices
} = this.props;
2017-05-11 20:16:52 +03:00
if (loading) {
2017-05-22 20:13:24 +03:00
return (
<LayoutContainer>
<Loader />
</LayoutContainer>
);
} else if (error) {
2017-05-19 00:04:29 +03:00
return (
2017-05-22 20:13:24 +03:00
<LayoutContainer>
<ErrorMessage message="Oops, and error occured while loading your services." />
2017-05-22 20:13:24 +03:00
</LayoutContainer>
);
2017-05-19 00:04:29 +03:00
}
const handleQuickActionsClick = (evt, { service }) => {
const list = this._refs.container;
const listRect = list.getBoundingClientRect();
const button = evt.currentTarget;
const buttonRect = button.getBoundingClientRect();
const position = {
left:
buttonRect.left -
listRect.left +
(buttonRect.right - buttonRect.left) / 2,
top: buttonRect.bottom - listRect.top
};
toggleServicesQuickActions({
service,
position
});
};
const handleRestartClick = (evt, service) => {
restartServices(service.id);
};
const handleStopClick = (evt, service) => {
stopServices(service.id);
};
const handleStartClick = (evt, service) => {
startServices(service.id);
};
const handleQuickActionsBlur = o => {
toggleServicesQuickActions({ show: false });
};
const serviceList = services.map(service =>
2017-05-19 00:04:29 +03:00
<ServiceListItem
key={service.id}
2017-05-19 00:04:29 +03:00
deploymentGroup={deploymentGroup.slug}
service={service}
onQuickActionsClick={handleQuickActionsClick}
2017-05-19 00:04:29 +03:00
/>
);
2017-03-22 18:50:21 +02:00
return (
2017-05-19 00:04:29 +03:00
<LayoutContainer>
<StyledContainer>
<div ref={this.ref('container')}>
2017-05-19 00:04:29 +03:00
{serviceList}
<ServicesQuickActions
position={servicesQuickActions.position}
service={servicesQuickActions.service}
show={servicesQuickActions.show}
url={url}
onBlur={handleQuickActionsBlur}
onRestartClick={handleRestartClick}
onStopClick={handleStopClick}
onStartClick={handleStartClick}
/>
2017-05-19 00:04:29 +03:00
</div>
</StyledContainer>
</LayoutContainer>
);
}
}
2017-02-28 20:34:48 +02:00
const mapStateToProps = (state, ownProps) => ({
servicesQuickActions: state.ui.services.quickActions,
url: ownProps.match.url
});
const mapDispatchToProps = dispatch => ({
toggleServicesQuickActions: data => dispatch(toggleServicesQuickActions(data))
});
const UiConnect = connect(mapStateToProps, mapDispatchToProps);
2017-05-19 00:04:29 +03:00
const ServicesGql = graphql(ServicesQuery, {
2017-05-11 20:16:52 +03:00
options(props) {
return {
variables: {
2017-05-17 21:02:35 +03:00
deploymentGroupSlug: props.match.params.deploymentGroup
2017-05-11 20:16:52 +03:00
}
};
2017-02-28 20:34:48 +02:00
},
props: ({ data: { deploymentGroup, loading, error } }) => ({
2017-05-19 00:04:29 +03:00
deploymentGroup,
services: deploymentGroup
? processServices(deploymentGroup.services, null)
: null,
2017-05-11 20:16:52 +03:00
loading,
error
})
2017-05-19 00:04:29 +03:00
});
const ServicesRestartGql = graphql(ServicesRestartMutation, {
props: ({ mutate }) => ({
restartServices: serviceId => mutate({ variables: { ids: [serviceId] } })
})
});
const ServicesStopGql = graphql(ServicesStopMutation, {
props: ({ mutate }) => ({
stopServices: serviceId => mutate({ variables: { ids: [serviceId] } })
})
});
const ServicesStartGql = graphql(ServicesStartMutation, {
props: ({ mutate }) => ({
startServices: serviceId => mutate({ variables: { ids: [serviceId] } })
})
});
const ServiceListWithData = compose(
ServicesGql,
ServicesStopGql,
ServicesStartGql,
ServicesGql,
UiConnect
)(ServiceList);
2017-05-11 20:16:52 +03:00
export default ServiceListWithData;