import { Component, createRef, ReactNode } from "react"; import { useStatusWithEvent, IMixinStatusProps } from "@Context/Status"; import { Label } from "@Model/Label"; import { Group } from "@Model/Group"; import { Range } from "@Model/Range"; import { CtrlObject } from "@Model/CtrlObject"; import { Behavior } from "@Model/Behavior"; import { TextField, ITextFieldProps } from "@Input/TextField/TextField"; import { PickerList, IDisplayItem, getObjectDisplayInfo, IDisplayInfo } from "@Input/PickerList/PickerList"; import { Localization } from "@Component/Localization/Localization"; import { Icon } from "@fluentui/react"; import "./ObjectPicker.scss"; type IObjectType = Label | Group | Range | CtrlObject; interface IObjectPickerProps extends ITextFieldProps { type: string; value?: IObjectType; valueChange?: (value: IObjectType) => any; cleanValue?: () => any; } interface IObjectPickerState { isPickerVisible: boolean; } @useStatusWithEvent("objectChange", "labelChange") class ObjectPicker extends Component { private getAllOption() { let option: Array = []; if (!this.props.status) return option; if (this.props.type.includes("L")) { for (let j = 0; j < this.props.status.model.labelPool.length; j++) { option.push(this.props.status.model.labelPool[j]); } if (this.props.type.includes("R")) { option.push(this.props.status.model.allRangeLabel); } if (this.props.type.includes("G")) { option.push(this.props.status.model.allGroupLabel); } } if (this.props.type.includes("R")) { for (let j = 0; j < this.props.status.model.objectPool.length; j++) { if (this.props.status.model.objectPool[j] instanceof Range) { option.push(this.props.status.model.objectPool[j]); } } } if (this.props.type.includes("G")) { for (let j = 0; j < this.props.status.model.objectPool.length; j++) { if (this.props.status.model.objectPool[j] instanceof Group) { option.push(this.props.status.model.objectPool[j]); } } } return option; } private isClean: boolean = false; public constructor(props: IObjectPickerProps) { super(props); this.state = { isPickerVisible: false } } private pickerTarget = createRef(); private renderPicker() { return { if (item instanceof Behavior) return; if (this.props.valueChange) { this.props.valueChange(item); } this.setState({ isPickerVisible: false }) })} dismiss={() => { this.setState({ isPickerVisible: false }) }} /> } public render(): ReactNode { let disPlayInfo: IDisplayInfo = getObjectDisplayInfo(this.props.value); let isDelete: boolean = !!this.props.value?.isDeleted(); return <> { if (this.isClean) { this.isClean = false; } else { this.setState({ isPickerVisible: true }) } }} >
{ disPlayInfo.internal ? : {disPlayInfo.name} }
{ if (this.props.cleanValue && disPlayInfo.name) { this.isClean = true; this.props.cleanValue(); } }} > { disPlayInfo.name ? : null }
{this.state.isPickerVisible ? this.renderPicker(): null} } } export { ObjectPicker, IDisplayItem };