Farmbot-Web-App/frontend/sequences/step_tiles/tile_mark_as/field_warning.tsx

71 lines
2.6 KiB
TypeScript

import * as React from "react";
import { t } from "../../../i18next_wrapper";
import { Resource, Identifier, Nothing } from "farmbot";
import {
PlantPointer, ToolSlotPointer, WeedPointer, GenericPointer,
DeviceAccountSettings, Point,
} from "farmbot/dist/resources/api_resources";
import { CustomFieldWarningProps } from "./interfaces";
export const CustomFieldWarning = (props: CustomFieldWarningProps) =>
props.field && !validFields(props.resource).includes(props.field)
&& !props.field.includes("meta.")
? <div className="custom-field-warning">
<i className="fa fa-exclamation-triangle" />
<p>
{t("Invalid field for resource.")}
</p>
{!(props.resource.kind == "resource" &&
props.resource.args.resource_type == "Device") &&
<p className={"did-you-mean"}
onClick={() => props.update({
field: "meta." + props.field,
value: undefined
})}>
{t("Did you mean meta.{{field}}?", { field: props.field })}
</p>}
</div>
: <div className="custom-field-warning" />;
const validFields = (resource: Resource | Identifier | Nothing): string[] => {
if (resource.kind == "identifier" || resource.kind == "nothing") {
return POINT_FIELDS;
}
switch (resource.args.resource_type) {
case "Device": return DEVICE_FIELDS;
case "Weed": return WEED_FIELDS;
case "GenericPointer": return GENERIC_POINTER_FIELDS;
default: return PLANT_FIELDS;
}
};
type BaseFields = (keyof Point)[];
type PlantFields = (keyof PlantPointer)[];
type ToolSlotFields = (keyof ToolSlotPointer)[];
type GenericPointerFields = (keyof GenericPointer)[];
type WeedFields = (keyof WeedPointer)[];
type PointFields = (
keyof PlantPointer
| keyof ToolSlotPointer
| keyof GenericPointer
| keyof WeedPointer
)[];
const BASE_FIELDS: BaseFields =
["name", "pointer_type", "x", "y", "z", "meta"];
const PLANT_FIELDS: PlantFields = (BASE_FIELDS as PlantFields)
.concat(["openfarm_slug", "plant_stage", "planted_at", "radius"]);
const TOOL_SLOT_FIELDS: ToolSlotFields = (BASE_FIELDS as ToolSlotFields)
.concat(["tool_id", "pullout_direction", "gantry_mounted"]);
const GENERIC_POINTER_FIELDS: GenericPointerFields =
(BASE_FIELDS as GenericPointerFields).concat(["radius"]);
const WEED_FIELDS: WeedFields = (BASE_FIELDS as WeedFields)
.concat(["plant_stage", "radius"]);
const POINT_FIELDS: PointFields = (BASE_FIELDS as PointFields)
.concat(PLANT_FIELDS)
.concat(TOOL_SLOT_FIELDS)
.concat(GENERIC_POINTER_FIELDS)
.concat(WEED_FIELDS);
const DEVICE_FIELDS: (keyof DeviceAccountSettings)[] =
["name", "mounted_tool_id", "ota_hour", "timezone"];