diff --git a/frontend/src/components/services/view.js b/frontend/src/components/services/view.js new file mode 100644 index 00000000..2b1a49f4 --- /dev/null +++ b/frontend/src/components/services/view.js @@ -0,0 +1,71 @@ +import React from 'react'; +import EmptyServices from '@components/empty/services'; +import PropTypes from '@root/prop-types'; +import Row from '@ui/components/row'; +import Column from '@ui/components/column'; +import { H2 } from '@ui/components/base-elements'; +import { + FormGroup, + Toggle, + ToggleList +} from '@ui/components/form'; + +const ServicesView = ({ + children, + org = {}, + match = {}, + project = {}, + routerPush = {}, + services = [] +}) => { + const toggle = () => { + if(!services) { + return null; + } + + const value = match.path === '/:org/projects/:projectId/services' ? + 'topology' : 'list'; + + const onToggleChange = (evt) => { + evt.preventDefault(); + const value = evt.target.value; + const path = `/${org.id}/projects/${project.id}/services${ + value === 'list' ? '/list' : '' + }`; + routerPush(path); + }; + + return ( + + + Topology + List + + + ); + }; + + const content = services.length ? + children : ; + + return ( + + +

Services

+ { toggle() } + { content } +
+
+ ); +}; + +ServicesView.propTypes = { + children: React.PropTypes.node, + match: React.PropTypes.object.isRequired, + org: PropTypes.org, + project: PropTypes.project, + routerPush: React.PropTypes.func.isRequired, + services: React.PropTypes.arrayOf(PropTypes.service) +}; + +export default ServicesView; diff --git a/frontend/src/containers/project/services.js b/frontend/src/containers/project/services.js index 1decbdc5..7c0f3af9 100644 --- a/frontend/src/containers/project/services.js +++ b/frontend/src/containers/project/services.js @@ -1,23 +1,35 @@ import React from 'react'; import { Switch, Route } from 'react-router-dom'; import Section from './section'; -import Services from '@containers/services'; +import ServicesTopology from '@containers/services'; +import ServicesList from '@containers/services/list'; import Service from '@containers/service'; export default () => { + const topology = (props) => ( +
+ +
+ ); + const list = (props) => (
- +
); return ( + { - const empty = services.length ? null : ( - - ); +const Services = (props) => { - const serviceList = services.map((service) => ( - - )); + const { + services = [] + } = props; return ( - - -

Services

- - {empty} - {serviceList} -
-
+ + + ); }; Services.propTypes = { - org: PropTypes.org, - project: PropTypes.project, - services: React.PropTypes.arrayOf(PropTypes.service), - servicesForTopology: React.PropTypes.arrayOf(React.PropTypes.object) + services: React.PropTypes.arrayOf(PropTypes.service) }; const mapStateToProps = (state, { match = { params: {} - } + }, + push }) => ({ org: orgByIdSelector(match.params.org)(state), project: projectByIdSelector(match.params.projectId)(state), - services: servicesByProjectIdSelector(match.params.projectId)(state), - servicesForTopology: - servicesForTopologySelector(match.params.projectId)(state) + routerPush: push, + services: servicesForTopologySelector(match.params.projectId)(state) }); export default connect( diff --git a/frontend/src/containers/services/list.js b/frontend/src/containers/services/list.js new file mode 100644 index 00000000..5bf57cac --- /dev/null +++ b/frontend/src/containers/services/list.js @@ -0,0 +1,56 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import PropTypes from '@root/prop-types'; +import ServiceItem from '@components/service/item'; +import ServicesView from '@components/services/view'; + +import { + orgByIdSelector, + projectByIdSelector, + servicesByProjectIdSelector +} from '@state/selectors'; + +const Services = (props) => { + const { + org = {}, + project = {}, + services = [] + } = props; + + const serviceList = services.map((service) => ( + + )); + + return ( + + {serviceList} + + ); +}; + +Services.propTypes = { + org: PropTypes.org, + project: PropTypes.project, + services: React.PropTypes.arrayOf(PropTypes.service) +}; + +const mapStateToProps = (state, { + match = { + params: {} + }, + push +}) => ({ + org: orgByIdSelector(match.params.org)(state), + project: projectByIdSelector(match.params.projectId)(state), + routerPush: push, + services: servicesByProjectIdSelector(match.params.projectId)(state) +}); + +export default connect( + mapStateToProps +)(Services); diff --git a/ui/src/components/form/index.js b/ui/src/components/form/index.js index 535cb863..cfce00b6 100644 --- a/ui/src/components/form/index.js +++ b/ui/src/components/form/index.js @@ -1,22 +1,12 @@ -import Checkbox from './checkbox'; -import Fieldset from './fieldset'; -import FormGroup from './group'; -import Input from './input'; -import FormLabel from './label'; -import Legend from './legend'; -import FormMeta from './meta'; -import Radio, { RadioList } from './radio'; -import Select from './select'; - -export { - Checkbox, - Fieldset, - FormGroup, - Input, - FormLabel, - Legend, - FormMeta, - Radio, - RadioList, - Select -}; +export { default as Checkbox } from './checkbox'; +export { default as Fieldset } from './fieldset'; +export { default as FormGroup } from './group'; +export { default as Input } from './input'; +export { default as FormLabel } from './label'; +export { default as Legend } from './legend'; +export { default as FormMeta } from './meta'; +export { default as Radio } from './radio'; +export { RadioList as RadioList } from './radio'; +export { default as Select } from './select'; +export { default as Toggle } from './toggle'; +export { ToggleList as ToggleList } from './toggle'; diff --git a/ui/src/components/form/toggle/index.js b/ui/src/components/form/toggle/index.js index 6fe99d5f..f9783ee0 100644 --- a/ui/src/components/form/toggle/index.js +++ b/ui/src/components/form/toggle/index.js @@ -5,6 +5,7 @@ import { Subscriber } from 'react-broadcast'; import { Baseline } from '../../../shared/composers'; import BaseInput from '../base-input'; import { boxes, colors } from '../../../shared/constants'; +import { rndId } from '../../../shared/functions'; const Input = styled.input` display: none; @@ -91,16 +92,20 @@ const Toggle = BaseInput(({ ...props }) => { const render = (value) => { + const id = rndId(); return (