Как получить перетаскиваемый элемент в моем элементе Drop в приложении Drag and Drop? - PullRequest
0 голосов
/ 29 октября 2018

Я создаю динамический создатель форм с помощью React (и Microsoft Fabric UI).

Моя страница разделена на три раздела (поля). Поле слева покажет различные варианты полей формы. Из этого левого окна вы сможете перетащить поле в среднее поле. Моя проблема в том, что я получил Drag для работы, но не Drop. То есть я могу перетащить поле из моего левого ящика, но оно не прилипает к среднему.

Как я могу решить это? Я полностью застрял и не знаю, как двигаться дальше. Может ли кто-нибудь помочь мне?

Спасибо !! Любая помощь приветствуется, я сейчас волнуюсь :(

import React, { Component } from 'react';
import { DayPickerStrings } from '../MS UI/Calendar'
import Textfield from '../MS UI/Textfield';
import { Checkbox } from 'office-ui-fabric-react/lib/Checkbox';
import Button from '../MS UI/Button';
import { DatePicker, DayOfWeek, IDatePickerStrings } from 'office-ui- 
fabric-react/lib/DatePicker';
import { Dropdown, IDropdownOption } from 'office-ui-fabric- 
react/lib/Dropdown';



const ElementType = {
Button: 'Button',
TextBox: 'TextBox',
Calendar: 'Calendar',
Checkbox: 'Checkbox'

};

  class Boxes extends Component {
constructor (){
    super ();

this.state = {
    leftBox: [
        {id: "Button", elementType:ElementType.Button, category:"left" },
        {id: "textfield", elementType:ElementType.TextBox, category:"left" },
        {id: "Calendar", elementType:ElementType.Calendar, category:"left"},
        {id: "Checkbox", elementType:ElementType.Checkbox, category:"left"},
        {id: "  ", category: "middle" }
        /*{name:<Textfield/> , category:"left" },
        {name: <Dropdown/>, category: "left"},
        ,
        {name: "  ", category: "left" }*/
    ],
    middleBox: [],
    rightBox:[],
    dragObjectId: ''
    }
}

onDragStart = (ev, id) => {
    console.log(ev);
    console.log('dragstart:', id);
    ev.dataTransfer.setData("id", id);

    this.setState({
        ...this.state,
        dragObjectId:id
        //Gives element ID by DragStart
    })

};

onDragOver = (ev) => {
    ev.preventDefault();
    // Makes drop-div stick
};

onDrop = (ev, cat) => {

    let id = this.state.dragObjectId
    console.log(id);

    let boxes = this.state.boxes.filter((box) => {
        console.log(box);
        if (box.name === id) {
            box.category = cat;
            console.log(box)

        }

        return box;
        //This return an updated array of boxes
    });

    this.setState({
        ...this.state,
        boxes        ,
        dragObjectId:''

        // Empties the ID that was given by DragStart
    })
};

 GetRenderForObject(object){
    if(object.elementType == ElementType.Button){
        return (
            <div
                 onDragStart={(e) => this.onDragStart(e)}
                 draggable>
            <Button id={object.id} key={object.id} />
            </div>
        )
    } else if (object.elementType == ElementType.Calendar){
        return (
            <div
                onDragStart={(e) => this.onDragStart(e)}
                draggable>
                <DatePicker id={object.id} key={object.id}
                // firstDayOfWeek={ firstDayOfWeek}
                strings={DayPickerStrings}
                placeholder="Select a date..."
                ariaLabel="Select a date..."
                onAfterMenuDismiss={() => console.log('onAfterMenuDismiss called')}/>
            </div>
        );
     }
     else if (object.elementType == ElementType.TextBox){
        return (

            <div onDragStart={(e) => this.onDragStart(e)}
                 draggable>
                <Textfield id={object.id} key={object.id}/>
            </div>

        );
    } else {
         return (
             <Checkbox
             label="Checkbox"
             />
         );
    }

}

render() {


    const leftBoxContent= this.state.leftBox.map((object, index) => {
       return this.GetRenderForObject(object);
    });

    const middleBoxContent = this.state.middleBox.map((object, index) => {
        return this.GetRenderForObject(object);
    });

    const rightBoxButtons = this.state.leftBox.map((object, index) => {
        return this.GetRenderForObject(object);
    });

    const sLeft = {
        borderRight: '1px solid #eee',

    };
    const margin = {

        marginTop: '5px',
        height: '500px',
    };


    return (

        <div className="ms-Grid" dir="ltr">
            <div className="ms-Grid-row">

                <div className="ms-Grid-col ms-sm12 ms-md-4 ms-lg4"
                style={sLeft}>
                <div  onDragOver={(e) => this.onDragOver(e)}
                onDrop={(e) => {this.onDrop(e, "left")}} style={margin} >
                    {leftBoxContent}
                    {/*<Button id="MyButton1"
                              onDragOver={(e) => this.onDragOver(e)}
                              onDrop={(e) => {this.onDrop(e, "left")}}*/}
                </div>
                </div>

                <div className="ms-Grid-col ms-sm12 ms-md-4 ms-lg4"
                style={sLeft}>
                <div  onDragOver={(e) => this.onDragOver(e)}
                onDrop={(e) => this.onDrop(e, "middle")} style= 
 {margin}>
                    {/* Makes drop-div stick */}
                    {middleBoxContent}
                    <div>  </div>

                </div>
                </div>

                <div className="ms-Grid-col ms-sm12 ms-md-4 ms-lg4">

                   // HoverCard - Settings //
                </div>

            </div>

        </div>



    );
}
}

export default Boxes;
...