blob: a8a7565ca8ed08683964c71c2edb172d3cb1acd5 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import React, { PureComponent } from 'react';
import { Button, Row, Col, Divider, Form, DatePicker, Select } from 'antd';
import moment from 'moment-timezone';
import styles from './index.less';
import CurrentTimePanel from './currentTimePanel';
const { Option } = Select;
const FormItem = Form.Item;
const { RangePicker } = DatePicker;
@Form.create({
mapPropsToFields(props) {
if (!props.selected) return {};
const result = {
step: Form.createFormField({
value: props.selected.step,
}),
};
if (props.selected.label) {
return result;
}
result['range-time-picker'] = Form.createFormField({
value: [props.selected.from(), props.selected.to()],
});
return result;
},
})
class DurationPanel extends PureComponent {
constructor(props) {
super(props);
const now = {
to() {
return moment();
},
};
this.shortcuts = [
{
...now,
from() {
return moment().subtract(15, 'minutes');
},
label: 'Last 15 minutes',
},
{
...now,
from() {
return moment().subtract(30, 'minutes');
},
label: 'Last 30 minutes',
},
{
...now,
from() {
return moment().subtract(1, 'hours');
},
label: 'Last 1 hour',
},
{
...now,
from() {
return moment().subtract(6, 'hours');
},
label: 'Last 6 hours',
},
{
...now,
from() {
return moment().subtract(12, 'hours');
},
label: 'Last 12 hours',
},
{
...now,
from() {
return moment().subtract(24, 'hours');
},
label: 'Last 24 hours',
},
];
this.shortcutsDays = [
{
...now,
from() {
return moment().subtract(2, 'days');
},
label: 'Last 2 days',
},
{
...now,
from() {
return moment().subtract(7, 'days');
},
label: 'Last 7 days',
},
{
...now,
from() {
return moment().subtract(14, 'days');
},
label: 'Last 14 days',
},
{
...now,
from() {
return moment().subtract(30, 'days');
},
label: 'Last 30 days',
},
{
...now,
from() {
return moment().subtract(6, 'months');
},
label: 'Last 6 months',
},
{
...now,
from() {
return moment().subtract(12, 'months');
},
label: 'Last 12 months',
},
];
}
componentDidMount() {
const { onSelected } = this.props;
onSelected(this.shortcuts[0]);
}
disabledDate = current => {
return current && current.valueOf() >= Date.now();
};
handleSubmit = e => {
e.preventDefault();
const { form } = this.props;
form.validateFields((err, fieldsValue) => {
if (err) return;
const selectedTime = {};
for (const key of Object.keys(fieldsValue)) {
if (fieldsValue[key]) {
if (key === 'range-time-picker') {
selectedTime.from = () => fieldsValue[key][0];
selectedTime.to = () => fieldsValue[key][1];
} else {
selectedTime[key] = fieldsValue[key];
}
}
}
if (selectedTime.from && selectedTime.to) {
this.select({ ...selectedTime, label: null });
} else {
this.select(selectedTime);
}
});
};
handleTimeZone = (zone) => {
this.props.dispatch({
type: 'global/changeTimezone',
payload: zone,
});
this.props.dispatch({
type: 'trace/changeTimezone',
payload: zone,
});
this.select(this.props.selected);
}
select = newSelectedTime => {
const { onSelected, selected } = this.props;
onSelected({ ...selected, ...newSelectedTime });
};
render() {
const { collapsed, form, zone } = this.props;
if (collapsed) {
return null;
}
const formItemLayout = {
labelCol: {
xs: { span: 24 },
sm: { span: 7 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 12 },
md: { span: 10 },
},
};
const { getFieldDecorator } = form;
const content = (
<div>
<Row type="flex" justify="end">
<Select showSearch defaultValue={zone} size="small" style={{ width:150, marginRight: 10 }} onSelect={this.handleTimeZone}>
{moment.tz.names().map(_ => <Option key={_} value={_}>{_}</Option>)}
</Select>
<Button type="primary" icon="clock-circle" size="small" style={{ width:170 }}>
<CurrentTimePanel moment={moment} />
</Button>
</Row>
<Divider />
<Row type="flex" justify="end">
<Col xs={24} sm={24} md={24} lg={15} xl={14}>
<Form onSubmit={this.handleSubmit} hideRequiredMark>
<FormItem {...formItemLayout} label="Time Range">
{getFieldDecorator('range-time-picker')(
<RangePicker showTime disabledDate={this.disabledDate} format="YYYY-MM-DD HH:mm" />
)}
</FormItem>
<FormItem {...formItemLayout} label="Reloading every ">
{getFieldDecorator('step')(
<Select style={{ width: 170 }}>
<Option value="0">off</Option>
<Option value="5000">5s</Option>
<Option value="10000">10s</Option>
<Option value="30000">30s</Option>
</Select>
)}
</FormItem>
<FormItem wrapperCol={{ offset: 7 }}>
<Button type="primary" htmlType="submit">
Apply
</Button>
</FormItem>
</Form>
</Col>
<Col xs={0} sm={0} md={0} lg={0} xl={1}>
<Divider type="vertical" style={{ height: 200 }} />
</Col>
<Col xs={24} sm={24} md={4} lg={4} xl={4}>
<ul className={styles.list}>
{this.shortcutsDays.map(d => (
<li key={d.label}>
<a onClick={this.select.bind(this, d)}>{d.label}</a>
</li>
))}
</ul>
</Col>
<Col xs={24} sm={24} md={4} lg={4} xl={4}>
<ul className={styles.list}>
{this.shortcuts.map(d => (
<li key={d.label}>
<a onClick={this.select.bind(this, d)}>{d.label}</a>
</li>
))}
</ul>
</Col>
</Row>
</div>
);
return (
<div className={styles.pageHeader}>
<div className={styles.detail}>
<div className={styles.main}>
<div className={styles.row}>
<div className={styles.content}>{content}</div>
</div>
</div>
</div>
</div>
);
}
}
export default DurationPanel;