2017-09-20 12:30:53 +03:00
|
|
|
import React from 'react';
|
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
import { compose, graphql } from 'react-apollo';
|
|
|
|
import { connect } from 'react-redux';
|
|
|
|
import { reduxForm } from 'redux-form';
|
|
|
|
import forceArray from 'force-array';
|
|
|
|
import get from 'lodash.get';
|
|
|
|
import find from 'lodash.find';
|
|
|
|
|
2017-09-27 17:44:57 +03:00
|
|
|
import { ViewContainer, Title, Message } from 'joyent-ui-toolkit';
|
2017-09-20 12:30:53 +03:00
|
|
|
|
|
|
|
import GetInstances from '@graphql/list-instances.gql';
|
|
|
|
import { List as InstanceList } from '@components/instances';
|
|
|
|
import GenIndex from '@state/gen-index';
|
|
|
|
|
|
|
|
const InstanceListForm = reduxForm({
|
|
|
|
form: `instance-list`
|
|
|
|
})(InstanceList);
|
|
|
|
|
2017-09-27 17:23:49 +03:00
|
|
|
const List = ({ instances = [], loading = false, error }) => {
|
2017-09-20 12:30:53 +03:00
|
|
|
const _title = <Title>Instances</Title>;
|
|
|
|
const _instances = forceArray(instances);
|
2017-09-27 17:44:57 +03:00
|
|
|
const _loading = !instances.length && loading;
|
2017-09-20 12:30:53 +03:00
|
|
|
|
|
|
|
const _error = !error ? null : (
|
|
|
|
<Message
|
|
|
|
title="Ooops!"
|
|
|
|
message="An error occurred while loading your instances."
|
|
|
|
error
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
|
|
|
|
return (
|
2017-09-27 17:23:49 +03:00
|
|
|
<ViewContainer main>
|
2017-09-20 12:30:53 +03:00
|
|
|
{_title}
|
|
|
|
{!_loading && _error}
|
2017-09-27 17:23:49 +03:00
|
|
|
<InstanceListForm instances={_instances} loading={loading} />
|
2017-09-20 12:30:53 +03:00
|
|
|
</ViewContainer>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
List.propTypes = {
|
|
|
|
loading: PropTypes.bool,
|
|
|
|
instances: PropTypes.arrayOf(
|
|
|
|
PropTypes.shape({
|
|
|
|
id: PropTypes.string,
|
|
|
|
name: PropTypes.string
|
|
|
|
})
|
|
|
|
)
|
|
|
|
};
|
|
|
|
|
|
|
|
export default compose(
|
|
|
|
graphql(GetInstances, {
|
|
|
|
options: () => ({
|
|
|
|
pollInterval: 1000
|
|
|
|
}),
|
|
|
|
props: ({ ownProps, data: { machines, loading, error } }) => {
|
|
|
|
const _instances = forceArray(machines);
|
|
|
|
|
|
|
|
return {
|
|
|
|
instances: _instances,
|
|
|
|
loading,
|
|
|
|
error,
|
|
|
|
index: GenIndex(_instances)
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
connect((state, ownProps) => {
|
|
|
|
const filter = get(state, 'form.instance-list.values.filter');
|
|
|
|
const { index, instances = [], ...rest } = ownProps;
|
|
|
|
|
|
|
|
return {
|
|
|
|
...rest,
|
|
|
|
instances: !filter
|
|
|
|
? instances
|
|
|
|
: index.search(filter).map(({ ref }) => find(instances, ['id', ref]))
|
|
|
|
};
|
|
|
|
})
|
|
|
|
)(List);
|