Farmbot-Web-App/frontend/controls/sensors/index.tsx

101 lines
3.0 KiB
TypeScript
Raw Normal View History

2018-03-10 00:17:53 -07:00
import * as React from "react";
2019-06-24 15:39:49 -06:00
import { error } from "../../toast/toast";
2018-03-10 00:17:53 -07:00
import { SensorList } from "./sensor_list";
import { SensorForm } from "./sensor_form";
import { Widget, WidgetBody, WidgetHeader, SaveBtn } from "../../ui/index";
import { SensorsProps } from "../../devices/interfaces";
import { SensorState } from "./interfaces";
2018-10-31 19:01:31 -06:00
import { getArrayStatus } from "../../resources/tagged_resources";
2018-03-10 00:17:53 -07:00
import { saveAll, init } from "../../api/crud";
import { ToolTips } from "../../constants";
import { uniq } from "lodash";
2019-04-02 13:59:37 -06:00
import { t } from "../../i18next_wrapper";
2018-03-10 00:17:53 -07:00
export class Sensors extends React.Component<SensorsProps, SensorState> {
constructor(props: SensorsProps) {
super(props);
this.state = { isEditing: false };
}
toggle = () => {
this.setState({ isEditing: !this.state.isEditing });
}
maybeSave = () => {
const pinNums = this.props.sensors.map(x => x.body.pin);
const allAreUniq = uniq(pinNums).length === pinNums.length;
if (allAreUniq) {
this.props.dispatch(saveAll(this.props.sensors, this.toggle));
} else {
error(t("Pin numbers must be unique."));
}
}
showPins = () => {
const { sensors, dispatch, bot, disabled } = this.props;
const pins = bot.hardware.pins;
if (this.state.isEditing) {
return <SensorForm sensors={sensors}
dispatch={dispatch} />;
} else {
return <SensorList sensors={sensors}
dispatch={dispatch}
pins={pins}
disabled={disabled} />;
}
}
2018-10-31 19:01:31 -06:00
newSensor = (pin = 0, label = t("New Sensor"), mode: 0 | 1 = 0) => {
this.props.dispatch(init("Sensor", { pin, label, mode: mode || 0 }));
};
2018-03-10 00:17:53 -07:00
2018-10-31 19:01:31 -06:00
stockSensors = () => {
this.newSensor(63, t("Tool Verification"), 0);
this.newSensor(59, t("Soil Moisture"), 1);
2018-03-10 00:17:53 -07:00
}
render() {
const { isEditing } = this.state;
2018-10-31 19:01:31 -06:00
const status = getArrayStatus(this.props.sensors);
2020-02-28 09:34:28 -07:00
const editButtonText = isEditing
? t("Back")
: t("Edit");
2018-03-10 00:17:53 -07:00
return <Widget className="sensors-widget">
<WidgetHeader title={t("Sensors")} helpText={ToolTips.SENSORS}>
<button
className="fb-button gray"
onClick={this.toggle}
2020-02-28 09:34:28 -07:00
title={editButtonText}
2018-09-14 14:02:29 -06:00
disabled={!!status && isEditing}>
2020-02-28 09:34:28 -07:00
{editButtonText}
2018-03-10 00:17:53 -07:00
</button>
<SaveBtn
hidden={!isEditing}
status={status}
onClick={this.maybeSave} />
<button
hidden={!isEditing}
className="fb-button green"
type="button"
2020-02-28 09:34:28 -07:00
title={t("add sensors")}
2018-10-31 19:01:31 -06:00
onClick={() => this.newSensor()}>
2018-03-10 00:17:53 -07:00
<i className="fa fa-plus" />
</button>
2020-02-26 11:10:59 -07:00
<button
hidden={!isEditing || this.props.firmwareHardware == "none"}
className="fb-button green"
type="button"
2020-02-28 09:34:28 -07:00
title={t("add stock sensors")}
2020-02-26 11:10:59 -07:00
onClick={this.stockSensors}>
<i className="fa fa-plus" style={{ marginRight: "0.5rem" }} />
{t("Stock sensors")}
</button>
2018-03-10 00:17:53 -07:00
</WidgetHeader>
<WidgetBody>
{this.showPins()}
</WidgetBody>
</Widget>;
}
}