1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-01-06 00:07:44 +01:00
unleash.unleash/frontend/src/component/application/application-edit-component.js

290 lines
12 KiB
JavaScript
Raw Normal View History

2016-12-09 14:02:36 +01:00
/* eslint react/no-multi-comp:off */
import React, { Component, PureComponent } from 'react';
2016-12-05 15:15:01 +01:00
import { Link } from 'react-router';
2016-12-13 20:54:53 +01:00
import {
Grid,
Cell,
Card,
CardTitle,
CardText,
CardMenu,
List,
ListItem,
ListItemContent,
Textfield,
Icon,
ProgressBar,
Tabs,
Tab,
Switch,
2016-12-13 20:54:53 +01:00
} from 'react-mdl';
import { IconLink, shorten, styles as commonStyles } from '../common';
2017-01-06 11:41:52 +01:00
import { formatFullDateTime } from '../common/util';
2016-12-05 15:15:01 +01:00
2016-12-09 14:02:36 +01:00
class StatefulTextfield extends Component {
constructor(props) {
2016-12-09 14:02:36 +01:00
super(props);
this.state = { value: props.value };
this.setValue = function setValue(e) {
2016-12-09 14:02:36 +01:00
this.setState({ value: e.target.value });
}.bind(this);
}
render() {
return (
<Textfield
style={{ width: '100%' }}
label={this.props.label}
floatingLabel
rows={this.props.rows}
value={this.state.value}
onChange={this.setValue}
onBlur={this.props.onBlur}
/>
2016-12-09 14:02:36 +01:00
);
}
}
2016-12-13 20:54:53 +01:00
class ClientApplications extends PureComponent {
constructor(props) {
2016-12-13 20:54:53 +01:00
super(props);
this.state = { activeTab: 0 };
}
componentDidMount() {
2016-12-05 15:15:01 +01:00
this.props.fetchApplication(this.props.appName);
}
render() {
2016-12-05 15:15:01 +01:00
if (!this.props.application) {
2016-12-10 14:19:52 +01:00
return <ProgressBar indeterminate />;
2016-12-05 15:15:01 +01:00
}
const { application, storeApplicationMetaData } = this.props;
2016-12-05 15:15:01 +01:00
const {
appName,
instances,
strategies,
seenToggles,
2016-12-09 22:11:05 +01:00
url,
description,
icon = 'apps',
color,
2016-12-09 14:02:36 +01:00
} = application;
const content =
this.state.activeTab === 0 ? (
<Grid style={{ margin: 0 }}>
<Cell col={6} tablet={4} phone={12}>
<h6> Toggles</h6>
<hr />
<List>
{seenToggles.map(
({ name, description, enabled, notFound }, i) =>
notFound ? (
<ListItem twoLine key={i}>
<ListItemContent
icon={'report'}
subtitle={
'Missing, want to create?'
}
>
<Link
to={`/features/create?name=${name}`}
>
{name}
</Link>
</ListItemContent>
</ListItem>
) : (
<ListItem twoLine key={i}>
<ListItemContent
icon={
<span>
<Switch
disabled
checked={!!enabled}
/>
</span>
}
subtitle={shorten(
description,
60
)}
>
<Link
to={`/features/view/${name}`}
>
{shorten(name, 50)}
</Link>
</ListItemContent>
</ListItem>
)
)}
</List>
</Cell>
<Cell col={6} tablet={4} phone={12}>
<h6>Implemented strategies</h6>
<hr />
<List>
{strategies.map(
({ name, description, notFound }, i) =>
notFound ? (
<ListItem twoLine key={`${name}-${i}`}>
<ListItemContent
icon={'report'}
subtitle={
'Missing, want to create?'
}
>
<Link
to={`/strategies/create?name=${name}`}
>
{name}
</Link>
</ListItemContent>
</ListItem>
) : (
<ListItem twoLine key={`${name}-${i}`}>
<ListItemContent
icon={'extension'}
subtitle={shorten(
description,
60
)}
>
<Link
to={`/strategies/view/${name}`}
>
{shorten(name, 50)}
</Link>
</ListItemContent>
</ListItem>
)
)}
</List>
</Cell>
<Cell col={12} tablet={12}>
<h6>{instances.length} Instances registered</h6>
<hr />
<List>
{instances.map(
(
{
instanceId,
clientIp,
lastSeen,
sdkVersion,
},
i
) => (
<ListItem key={i} twoLine>
<ListItemContent
icon="timeline"
subtitle={
<span>
{clientIp} last seen at{' '}
<small>{formatFullDateTime(lastSeen)}</small>
</span>
}
>
{instanceId}{' '}
{sdkVersion ? `(${sdkVersion})` : ''}
</ListItemContent>
</ListItem>
)
)}
</List>
</Cell>
</Grid>
) : (
<Grid>
<Cell col={12}>
<h5>Edit app meta data</h5>
</Cell>
<Cell col={6} tablet={12}>
<StatefulTextfield
value={url}
label="URL"
onBlur={e =>
storeApplicationMetaData(
appName,
'url',
e.target.value
)}
/>
<br />
<StatefulTextfield
value={description}
label="Description"
rows={5}
onBlur={e =>
storeApplicationMetaData(
appName,
'description',
e.target.value
)}
/>
</Cell>
<Cell col={6} tablet={12}>
<StatefulTextfield
value={icon}
label="Select icon"
onBlur={e =>
storeApplicationMetaData(
appName,
'icon',
e.target.value
)}
/>
<StatefulTextfield
value={color}
label="Select color"
onBlur={e =>
storeApplicationMetaData(
appName,
'color',
e.target.value
)}
/>
</Cell>
</Grid>
);
2016-12-13 20:54:53 +01:00
return (
<Card shadow={0} className={commonStyles.fullwidth}>
<CardTitle
style={{
paddingTop: '24px',
paddingRight: '64px',
wordBreak: 'break-all',
}}
>
<Icon name={icon} /> {appName}
</CardTitle>
{description && <CardText>{description}</CardText>}
{url && (
<CardMenu>
<IconLink url={url} icon="link" />
</CardMenu>
)}
<hr />
<Tabs
activeTab={this.state.activeTab}
onChange={tabId => this.setState({ activeTab: tabId })}
ripple
tabBarProps={{ style: { width: '100%' } }}
className="mdl-color--grey-100"
>
<Tab>Details</Tab>
<Tab>Edit</Tab>
</Tabs>
2016-12-09 14:02:36 +01:00
{content}
</Card>
2016-12-05 15:15:01 +01:00
);
}
}
2016-12-13 20:54:53 +01:00
export default ClientApplications;