import { DetailsList } from "@Component/DetailsList/DetailsList"; import { Component, ReactNode, createRef } from "react"; import { Behavior } from "@Model/Behavior"; import { Icon } from "@fluentui/react"; import { useSettingWithEvent, IMixinSettingProps } from "@Context/Setting"; import { useStatusWithEvent, IMixinStatusProps } from "@Context/Status"; import { Localization } from "@Component/Localization/Localization"; import { PickerList } from "@Component/PickerList/PickerList"; import "./BehaviorPicker.scss"; interface IBehaviorPickerProps { behavior: Behavior[]; focusBehavior?: Behavior; click?: (behavior: Behavior) => void; delete?: (behavior: Behavior) => void; action?: (behavior: Behavior) => void; add?: (behavior: Behavior) => void; } interface IBehaviorPickerState { isPickerListOpen: boolean; } @useStatusWithEvent("behaviorChange") @useSettingWithEvent("language") class BehaviorPicker extends Component { public state = { isPickerListOpen: false } private isInnerClick: boolean = false; private clickLineRef = createRef(); private getData() { let data: Array<{select: boolean, key: string, behavior: Behavior | undefined}> = []; for (let i = 0; i < this.props.behavior.length; i++) { data.push({ key: this.props.behavior[i].id, behavior: this.props.behavior[i], select: this.props.behavior[i].id === this.props.focusBehavior?.id }) } data.push({ key: "@@AddButton_List_Key", behavior: undefined, select: false }) return data; } private renderLine = (behavior?: Behavior): ReactNode => { if (behavior) { const titleClassList: string[] = ["behavior-picker-title"]; if (this.props.setting) { titleClassList.push(this.props.setting.language); } if (behavior.isDeleted()) { titleClassList.push("is-deleted"); } return <>
{ this.isInnerClick = true; this.props.action && this.props.action(behavior); }} > { behavior.isDeleted() ? : <> }
{behavior.name}
{ this.isInnerClick = true; this.props.delete && this.props.delete(behavior); }} >
; } else { const openPicker = () => { this.isInnerClick = true; this.setState({ isPickerListOpen: true }); } return <>
; } } private getAllData = (): Behavior[] => { if (this.props.status) { let res: Behavior[] = []; for (let i = 0; i < this.props.status.model.behaviorPool.length; i++) { let isAdded = false; for (let j = 0; j < this.props.behavior.length; j++) { if (this.props.status.model.behaviorPool[i].id === this.props.behavior[j].id) { isAdded = true; break; } } if (!isAdded) { res.push(this.props.status.model.behaviorPool[i]); } } return res; } else { return []; } } private renderPickerList(): ReactNode { return { if (item instanceof Behavior && this.props.add) { this.props.add(item); } this.setState({ isPickerListOpen: false }) })} dismiss={() => { this.setState({ isPickerListOpen: false }); }} /> } public render(): ReactNode { return <> { if (!this.isInnerClick && this.props.click && item.behavior) { this.props.click(item.behavior); } this.isInnerClick = false; }} columns={[{ className: "behavior-picker-line", key: "behavior", render: this.renderLine }]} /> {this.state.isPickerListOpen ? this.renderPickerList() : null} } } export { BehaviorPicker };