import * as React from "react"; import { t } from "../../../i18next_wrapper"; import { cloneDeep, capitalize } from "lodash"; import { Row, Col, FBSelect, DropDownItem } from "../../../ui"; import { editCriteria, toggleStringCriteria } from "."; import { AddEqCriteriaProps, AddEqCriteriaState, NumberCriteriaProps, AddNumberCriteriaState, AddStringCriteriaProps, } from "./interfaces"; import { PLANT_STAGE_DDI_LOOKUP, PLANT_STAGE_LIST } from "../../plants/edit_plant_status"; export class AddEqCriteria extends React.Component, AddEqCriteriaState> { state: AddEqCriteriaState = { key: "", value: "" }; commit = () => { const { dispatch, group, criteriaKey, criteriaField } = this.props; const tempEqCriteria = cloneDeep(criteriaField || {}); const tempValues = tempEqCriteria[this.state.key] || []; const value = this.props.type == "number" ? parseInt(this.state.value) : this.state.value; this.state.value && tempValues.push(value as T); tempEqCriteria[this.state.key] = tempValues; dispatch(editCriteria(group, { [criteriaKey]: tempEqCriteria })); this.setState({ key: "", value: "" }); } render() { return
this.setState({ key: e.currentTarget.value })} /> {"="} this.setState({ value: e.currentTarget.value })} />
; } } export const CRITERIA_TYPE_DDI_LOOKUP = (): { [x: string]: DropDownItem } => ({ pointer_type: { label: t("Point Type"), value: "pointer_type" }, plant_stage: { label: t("Plant Status"), value: "plant_stage" }, openfarm_slug: { label: t("Plant Type"), value: "openfarm_slug" }, }); export const CRITERIA_TYPE_LIST = () => [ CRITERIA_TYPE_DDI_LOOKUP().pointer_type, CRITERIA_TYPE_DDI_LOOKUP().plant_stage, CRITERIA_TYPE_DDI_LOOKUP().openfarm_slug, ]; export const POINTER_TYPE_DDI_LOOKUP = (): { [x: string]: DropDownItem } => ({ Plant: { label: t("Plants"), value: "Plant" }, GenericPointer: { label: t("Points"), value: "GenericPointer" }, ToolSlot: { label: t("Slots"), value: "ToolSlot" }, }); export const POINTER_TYPE_LIST = () => [ POINTER_TYPE_DDI_LOOKUP().Plant, POINTER_TYPE_DDI_LOOKUP().GenericPointer, POINTER_TYPE_DDI_LOOKUP().ToolSlot, ]; export class AddStringCriteria extends React.Component { state: AddEqCriteriaState = { key: "", value: "" }; commit = () => { if (this.state.key && this.state.value) { this.props.dispatch(toggleStringCriteria(this.props.group, this.state.key, this.state.value)); this.setState({ key: "", value: "" }); } } get key() { return JSON.stringify(this.props.group.body.criteria || {}); } change = (ddi: DropDownItem) => this.setState({ value: "" + ddi.value }); get selected() { switch (this.state.key) { case "openfarm_slug": return this.state.value ? { label: t(capitalize(this.state.value)), value: this.state.value } : undefined; case "pointer_type": return this.state.value ? POINTER_TYPE_DDI_LOOKUP()[this.state.value] : undefined; case "plant_stage": return this.state.value ? PLANT_STAGE_DDI_LOOKUP()[this.state.value] : undefined; default: return undefined; } } get options() { switch (this.state.key) { case "openfarm_slug": return this.props.slugs.map(slug => ({ label: t(capitalize(slug)), value: slug })); case "pointer_type": return POINTER_TYPE_LIST(); case "plant_stage": return PLANT_STAGE_LIST(); default: return []; } } render() { const noKey = this.options.length < 1; return
this.setState({ key: "" + ddi.value })} />
; } } export class AddNumberCriteria extends React.Component { state: AddNumberCriteriaState = { key: "", value: 0 }; commit = () => { const { dispatch, group, criteriaKey } = this.props; const tempNumberCriteria = cloneDeep(group.body.criteria?.[criteriaKey] || {}); tempNumberCriteria[this.state.key] = this.state.value; dispatch(editCriteria(group, { [criteriaKey]: tempNumberCriteria })); this.setState({ key: "", value: 0 }); } changeKey = (e: React.FormEvent) => this.setState({ key: e.currentTarget.value }) changeValue = (e: React.FormEvent) => this.setState({ value: parseInt(e.currentTarget.value) }) render() { return
{this.props.criteriaKey == "number_gt" ? ">" : "<"}
; } }