Add groups to dropdown list; prevent runtime error in move_abs

pull/1463/head
Rick Carlino 2019-09-25 13:40:37 -05:00
parent 7b046af751
commit 82b7f4cf16
3 changed files with 38 additions and 12 deletions

View File

@ -21,6 +21,7 @@ import {
TaggedFarmwareEnv,
TaggedFarmwareInstallation,
TaggedAlert,
TaggedPointGroup,
} from "farmbot";
import {
isTaggedResource,
@ -73,6 +74,8 @@ export const selectAllPeripherals =
(i: ResourceIndex) => findAll<TaggedPeripheral>(i, "Peripheral");
export const selectAllPoints =
(i: ResourceIndex) => findAll<TaggedPoint>(i, "Point");
export const selectAllPointGroups =
(i: ResourceIndex) => findAll<TaggedPointGroup>(i, "PointGroup");
export const selectAllActivePoints = (input: ResourceIndex) =>
selectAllPoints(input).filter(x => !x.body.discarded_at);

View File

@ -3,10 +3,11 @@ import {
selectAllToolSlotPointers,
selectAllActivePoints,
maybeFindToolById,
selectAllPointGroups,
} from "../../resources/selectors";
import { betterCompact } from "../../util";
import {
TaggedTool, TaggedPoint, TaggedToolSlotPointer, Xyz, Vector3
TaggedTool, TaggedPoint, TaggedToolSlotPointer, Xyz, Vector3, TaggedPointGroup
} from "farmbot";
import { DropDownItem } from "../../ui";
import { capitalize, isNumber } from "lodash";
@ -27,7 +28,11 @@ export function activeToolDDIs(resources: ResourceIndex): DropDownItem[] {
}
type PointerTypeName = Point["pointer_type"];
type DropdownHeadingId = PointerTypeName | typeof TOOL | "Other";
type DropdownHeadingId =
| PointerTypeName
| typeof TOOL
| "PointGroup"
| "Other";
/** Location selection menu section names. */
export const NAME_MAP: Record<DropdownHeadingId, string> = {
@ -35,6 +40,7 @@ export const NAME_MAP: Record<DropdownHeadingId, string> = {
"Plant": "Plants",
"ToolSlot": "Tool Slots",
"Tool": "Tools and Seed Containers",
"PointGroup": "Groups",
"Other": "Other",
};
@ -45,7 +51,7 @@ const heading = (name: DropdownHeadingId): DropDownItem[] => ([{
headingId: name
}]);
const ddiFrom = (points: TaggedPoint[], pointerType: PointerTypeName) => points
const points2ddi = (points: TaggedPoint[], pointerType: PointerTypeName) => points
.filter(x => x.body.pointer_type === pointerType)
.map(formatPoint)
.filter(x => parseInt("" + x.value) > 0);
@ -54,27 +60,42 @@ const maybeGroup = (display: boolean) =>
(groupDDI: DropDownItem): DropDownItem[] =>
display ? [groupDDI] : [];
const groups2Ddi = (groups: TaggedPointGroup[]): DropDownItem[] => {
return groups
.filter(x => x.body.id)
.map(x => {
return { label: x.body.name, value: x.uuid, headingId: "PointGroup" };
});
};
/** Location selection menu items. */
export function locationFormList(resources: ResourceIndex,
additionalItems: DropDownItem[], displayGroups?: boolean): DropDownItem[] {
const points = selectAllActivePoints(resources)
.filter(x => x.body.pointer_type !== "ToolSlot");
const plantDDI = ddiFrom(points, "Plant");
const genericPointerDDI = ddiFrom(points, "GenericPointer");
const plantDDI = points2ddi(points, "Plant");
const genericPointerDDI = points2ddi(points, "GenericPointer");
const toolDDI = activeToolDDIs(resources);
const group = maybeGroup(!!displayGroups);
return [COORDINATE_DDI()]
const clump = maybeGroup(!!displayGroups);
const output = [COORDINATE_DDI()]
.concat(additionalItems)
.concat(heading("Tool"))
.concat(group(everyPointDDI("Tool")))
.concat(group(everyPointDDI("ToolSlot")))
.concat(clump(everyPointDDI("Tool")))
.concat(clump(everyPointDDI("ToolSlot")))
.concat(toolDDI)
.concat(heading("Plant"))
.concat(group(everyPointDDI("Plant")))
.concat(clump(everyPointDDI("Plant")))
.concat(plantDDI)
.concat(heading("GenericPointer"))
.concat(group(everyPointDDI("GenericPointer")))
.concat(clump(everyPointDDI("GenericPointer")))
.concat(genericPointerDDI);
if (displayGroups) {
return output
.concat(heading("PointGroup"))
.concat(groups2Ddi(selectAllPointGroups(resources)));
} else {
return output;
}
}
/** Create drop down item with label; i.e., "Point/Plant (1, 2, 3)" */

View File

@ -93,7 +93,9 @@ export class TileMoveAbsolute extends React.Component<StepParams, MoveAbsState>
}}
sequenceUuid={this.props.currentSequence.uuid}
resources={this.props.resources}
onChange={this.updateLocation}
onChange={(x) => x &&
x.kind == "parameter_application" &&
this.updateLocation(x)}
shouldDisplay={this.props.shouldDisplay || (() => false)}
hideHeader={true}
locationDropdownKey={JSON.stringify(this.props.currentSequence)}