Farmbot-Web-App/frontend/farm_designer/map/layers/images/image_filter_menu.tsx

194 lines
6.2 KiB
TypeScript
Raw Normal View History

2018-02-20 17:09:40 -07:00
import * as React from "react";
2018-10-25 18:02:54 -06:00
import { BlurableInput } from "../../../../ui/index";
import { offsetTime } from "../../../farm_events/edit_fe_form";
import {
setWebAppConfigValue, GetWebAppConfigValue
} from "../../../../config_storage/actions";
2019-02-04 13:54:17 -07:00
import moment from "moment";
2018-10-25 18:02:54 -06:00
import {
formatDate, formatTime
} from "../../../farm_events/map_state_to_props_add_edit";
2018-02-20 17:09:40 -07:00
import { Slider } from "@blueprintjs/core";
2019-04-02 13:59:37 -06:00
import { t } from "../../../../i18next_wrapper";
2019-04-09 23:17:03 -06:00
import { TimeSettings } from "../../../../interfaces";
2018-02-20 17:09:40 -07:00
interface ImageFilterMenuState {
beginDate: string | undefined;
beginTime: string | undefined;
endDate: string | undefined;
endTime: string | undefined;
slider: number;
}
export interface ImageFilterMenuProps {
2019-04-09 23:17:03 -06:00
timeSettings: TimeSettings;
2018-02-20 17:09:40 -07:00
dispatch: Function;
getConfigValue: GetWebAppConfigValue;
imageAgeInfo: { newestDate: string, toOldest: number };
}
export class ImageFilterMenu
extends React.Component<ImageFilterMenuProps, Partial<ImageFilterMenuState>> {
constructor(props: ImageFilterMenuProps) {
super(props);
this.state = {};
}
2019-08-26 12:20:46 -06:00
UNSAFE_componentWillMount() {
2018-02-20 17:09:40 -07:00
const { newestDate, toOldest } = this.props.imageAgeInfo;
const beginDatetime = this.props.getConfigValue("photo_filter_begin");
this.setState({
slider: toOldest + 1 - (beginDatetime
? Math.abs(moment(beginDatetime.toString())
.diff(moment(newestDate).clone(), "days")) : 0)
});
this.updateState();
}
2019-08-26 10:13:33 -06:00
UNSAFE_componentWillReceiveProps() {
2018-02-20 17:09:40 -07:00
this.updateState();
}
updateState = () => {
const beginDatetime = this.props.getConfigValue("photo_filter_begin");
const endDatetime = this.props.getConfigValue("photo_filter_end");
2019-04-09 23:17:03 -06:00
const { timeSettings } = this.props;
2018-02-20 17:09:40 -07:00
this.setState({
beginDate: beginDatetime
2019-04-09 23:17:03 -06:00
? formatDate(beginDatetime.toString(), timeSettings) : undefined,
2018-02-20 17:09:40 -07:00
beginTime: beginDatetime
2019-04-09 23:17:03 -06:00
? formatTime(beginDatetime.toString(), timeSettings) : undefined,
2018-02-20 17:09:40 -07:00
endDate: endDatetime
2019-04-09 23:17:03 -06:00
? formatDate(endDatetime.toString(), timeSettings) : undefined,
2018-02-20 17:09:40 -07:00
endTime: endDatetime
2019-04-09 23:17:03 -06:00
? formatTime(endDatetime.toString(), timeSettings) : undefined,
2018-02-20 17:09:40 -07:00
});
}
setDatetime = (datetime: keyof ImageFilterMenuState) => {
return (e: React.SyntheticEvent<HTMLInputElement>) => {
const input = e.currentTarget.value;
this.setState({ [datetime]: input });
const { beginDate, beginTime, endDate, endTime } = this.state;
2019-04-09 23:17:03 -06:00
const { dispatch, timeSettings } = this.props;
2018-02-20 17:09:40 -07:00
let value = undefined;
switch (datetime) {
case "beginDate":
2019-04-09 23:17:03 -06:00
value = offsetTime(input, beginTime || "00:00", timeSettings);
2018-02-20 17:09:40 -07:00
dispatch(setWebAppConfigValue("photo_filter_begin", value));
break;
case "beginTime":
if (beginDate) {
2019-04-09 23:17:03 -06:00
value = offsetTime(beginDate, input, timeSettings);
2018-02-20 17:09:40 -07:00
dispatch(setWebAppConfigValue("photo_filter_begin", value));
}
break;
case "endDate":
2019-04-09 23:17:03 -06:00
value = offsetTime(input, endTime || "00:00", timeSettings);
2018-02-20 17:09:40 -07:00
dispatch(setWebAppConfigValue("photo_filter_end", value));
break;
case "endTime":
if (endDate) {
2019-04-09 23:17:03 -06:00
value = offsetTime(endDate, input, timeSettings);
2018-02-20 17:09:40 -07:00
dispatch(setWebAppConfigValue("photo_filter_end", value));
}
break;
}
};
};
sliderChange = (slider: number) => {
const { newestDate, toOldest } = this.props.imageAgeInfo;
this.setState({ slider });
2019-04-09 23:17:03 -06:00
const { dispatch, timeSettings } = this.props;
2018-02-20 17:09:40 -07:00
const calcDate = (day: number) =>
moment(newestDate).subtract(toOldest - day, "days").toISOString();
2019-04-09 23:17:03 -06:00
const begin = offsetTime(calcDate(slider - 1), "00:00", timeSettings);
const end = offsetTime(calcDate(slider), "00:00", timeSettings);
2018-02-20 17:09:40 -07:00
dispatch(setWebAppConfigValue("photo_filter_begin", begin));
dispatch(setWebAppConfigValue("photo_filter_end", end));
}
renderLabel = (day: number) => {
const { newestDate, toOldest } = this.props.imageAgeInfo;
return moment(newestDate)
2019-04-09 23:17:03 -06:00
.utcOffset(this.props.timeSettings.utcOffset)
2018-02-20 17:09:40 -07:00
.subtract(toOldest + 1 - day, "days")
.format("MMM-D");
}
get labelStepSize() {
return Math.max(Math.round(this.props.imageAgeInfo.toOldest / 5), 1);
}
render() {
const { beginDate, beginTime, endDate, endTime, slider } = this.state;
return <div className={"image-filter-menu"}>
<table>
<thead>
<tr>
<th />
<th><label>{t("Date")}</label></th>
<th><label>{t("Time")}</label></th>
</tr>
</thead>
<tbody>
<tr>
<td>
<label>{t("Newer than")}</label>
</td>
<td>
<BlurableInput
type="date"
name="beginDate"
value={beginDate || ""}
allowEmpty={true}
onCommit={this.setDatetime("beginDate")} />
</td>
<td>
<BlurableInput
type="time"
name="beginTime"
value={beginTime || ""}
allowEmpty={true}
disabled={!beginDate}
onCommit={this.setDatetime("beginTime")} />
</td>
</tr>
<tr>
<td>
<label>{t("Older than")}</label>
</td>
<td>
<BlurableInput
type="date"
name="endDate"
value={endDate || ""}
allowEmpty={true}
onCommit={this.setDatetime("endDate")} />
</td>
<td>
<BlurableInput
type="time"
name="endTime"
value={endTime || ""}
allowEmpty={true}
disabled={!endDate}
onCommit={this.setDatetime("endTime")} />
</td>
</tr>
</tbody>
</table>
2018-07-10 22:29:10 -06:00
{this.props.imageAgeInfo.newestDate !== "" &&
<Slider
min={0}
max={this.props.imageAgeInfo.toOldest + 1}
labelStepSize={this.labelStepSize}
value={slider}
onChange={this.sliderChange}
labelRenderer={this.renderLabel}
showTrackFill={false} />}
2018-02-20 17:09:40 -07:00
</div>;
}
}