2017-09-20 12:30:53 +03:00
|
|
|
import React from 'react';
|
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
import paramCase from 'param-case';
|
|
|
|
import forceArray from 'force-array';
|
|
|
|
import { compose, graphql } from 'react-apollo';
|
|
|
|
import { reduxForm } from 'redux-form';
|
|
|
|
import find from 'lodash.find';
|
|
|
|
import get from 'lodash.get';
|
|
|
|
|
|
|
|
import { ViewContainer, Title, StatusLoader, Message } from 'joyent-ui-toolkit';
|
|
|
|
|
|
|
|
import GetMetadata from '@graphql/list-metadata.gql';
|
|
|
|
import { KeyValue } from '@components/instances';
|
|
|
|
|
2017-09-27 17:44:57 +03:00
|
|
|
const MetadataForms = (metadata = []) =>
|
|
|
|
metadata.map(({ key, formName, formValue, value, name }) => {
|
|
|
|
const MetadataForm = reduxForm({
|
|
|
|
form: `instance-metadata-${key}`,
|
|
|
|
initialValues: {
|
|
|
|
[formName]: name,
|
|
|
|
[formValue]: value
|
|
|
|
}
|
|
|
|
})(KeyValue);
|
2017-09-27 17:24:40 +03:00
|
|
|
|
2017-09-27 17:44:57 +03:00
|
|
|
return (
|
|
|
|
<MetadataForm
|
|
|
|
key={key}
|
|
|
|
formName={formName}
|
|
|
|
formValue={formValue}
|
|
|
|
name={key}
|
|
|
|
onSubmit={val => console.log(key, val)}
|
|
|
|
onRemove={key => console.log('remove', key)}
|
|
|
|
textarea
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
});
|
2017-09-27 17:24:40 +03:00
|
|
|
|
2017-09-20 12:30:53 +03:00
|
|
|
const Metadata = ({ metadata = [], loading, error }) => {
|
2017-10-03 13:57:18 +03:00
|
|
|
const values = forceArray(metadata);
|
2017-09-20 12:30:53 +03:00
|
|
|
const _title = <Title>Metadata</Title>;
|
2017-10-04 20:27:55 +03:00
|
|
|
const _loading = !(loading && !values.length) ? null : <StatusLoader />;
|
2017-09-20 12:30:53 +03:00
|
|
|
|
2017-10-03 13:57:18 +03:00
|
|
|
const _metadata = !_loading && MetadataForms(values);
|
2017-09-20 12:30:53 +03:00
|
|
|
|
2017-10-04 20:27:55 +03:00
|
|
|
const _error =
|
|
|
|
error && !values.length && !_loading ? (
|
|
|
|
<Message
|
|
|
|
title="Ooops!"
|
|
|
|
message="An error occurred while loading your instance metadata"
|
|
|
|
error
|
|
|
|
/>
|
|
|
|
) : null;
|
2017-09-20 12:30:53 +03:00
|
|
|
|
|
|
|
return (
|
|
|
|
<ViewContainer center={Boolean(_loading)} main>
|
|
|
|
{_title}
|
|
|
|
{_loading}
|
|
|
|
{_error}
|
2017-09-27 17:24:40 +03:00
|
|
|
{_metadata}
|
2017-09-20 12:30:53 +03:00
|
|
|
</ViewContainer>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
Metadata.propTypes = {
|
|
|
|
loading: PropTypes.bool
|
|
|
|
};
|
|
|
|
|
|
|
|
export default compose(
|
|
|
|
graphql(GetMetadata, {
|
|
|
|
options: ({ match }) => ({
|
|
|
|
pollInterval: 1000,
|
|
|
|
variables: {
|
|
|
|
name: get(match, 'params.instance')
|
|
|
|
}
|
|
|
|
}),
|
2017-09-27 17:24:40 +03:00
|
|
|
props: ({ data: { loading, error, variables, ...rest } }) => {
|
|
|
|
const values = get(
|
2017-09-20 12:30:53 +03:00
|
|
|
find(get(rest, 'machines', []), ['name', variables.name]),
|
|
|
|
'metadata',
|
|
|
|
[]
|
2017-09-27 17:24:40 +03:00
|
|
|
);
|
|
|
|
|
2017-10-03 18:04:54 +03:00
|
|
|
const metadata = values.reduce((all, { name, value }) => {
|
2017-09-27 17:24:40 +03:00
|
|
|
const key = paramCase(name);
|
|
|
|
|
|
|
|
return {
|
|
|
|
...all,
|
|
|
|
[key]: {
|
|
|
|
key,
|
|
|
|
formName: `${key}-name`,
|
|
|
|
formValue: `${key}-value`,
|
2017-10-03 18:04:54 +03:00
|
|
|
value,
|
2017-09-27 17:24:40 +03:00
|
|
|
name
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}, {});
|
|
|
|
|
|
|
|
return { metadata: Object.values(metadata), loading, error };
|
|
|
|
}
|
2017-09-20 12:30:53 +03:00
|
|
|
})
|
|
|
|
)(Metadata);
|