3

I am trying to have a grid column layout, (2 columns) inside a single droppable container. The project is for an online menu where you can create a menu item, which goes into a droppable container, then you can drag that onto the menu that will be displayed to the user. So there is currently two columns. However the style of the menu demands two columns. Currently I am assigning different classNames to the mapped columns so I can make one of them grid but its pretty messy. Maybe there is a way I can hardcode the droppable instead of map them and run the map on the lists themselves inside each of the hardcoded droppables? Sorry if this is confusing, it sure is for me.

'results' is API data that is initially mapped into savedItems array where newly created menu items will go. Later on menuItems array will pull from the database as well. Right now just trying to have better styling control over the different droppables.

you can see where im assigning different classNames to the droppable during the mapping and its really not a reliable option.



  //drag and drop states

    const [state, setState] = useState({

        menuItems: {
            title: "menuItems",
            items: []
        },
        savedItems: {
            title: "savedItems",
            items: results
        }
    })

    useEffect(() => {
        setState({ ...state, savedItems: { ...state.savedItems, items: results } })
    }, [results])
    // console.log("state", state)

    console.log("dummy data", dummyArry)

    // updating title graphql mutation
    const [elementId, setElementId] = useState(" ");
    const updateTitle = async () => {
        //api data

        const data = await fetch(`http://localhost:8081/graphql`, {
            method: 'POST',
            body: JSON.stringify({
                query: `
                    mutation {
                        updateMenu(menuInput: {_id: ${JSON.stringify(elementId)},title: ${JSON.stringify(inputValue)}}){
                            title
                        }
                    }
                `
            }),
            headers: {
                'Content-Type': 'application/json'
            }
        })
        //convert api data to json
        const json = await data.json();
    }

    //drag end function
    const handleDragEnd = (data) => {
        console.log("from", data.source)
        console.log("to", data.destination)
        if (!data.destination) {
            // console.log("not dropped in droppable")
            return
        }

        if (data.destination.index === data.source.index && data.destination.droppableId === data.source.droppableId) {
            // console.log("dropped in same place")
            return
        }
        //create copy of item before removing from state
        const itemCopy = { ...state[data.source.droppableId].items[data.source.index] }
        setState(prev => {
            prev = { ...prev }

            //remove from previous items array

            prev[data.source.droppableId].items.splice(data.source.index, 1)

            //adding new item to array
            prev[data.destination.droppableId].items.splice(data.destination.index, 0, itemCopy)


            return prev
        })
    }

    const columnClass = [
        "menuItems-column",
        "savedItems-column"
    ]

    let num = 0


    return (
        <>

            <div className='app'>
                {results && <DragDropContext onDragEnd={handleDragEnd}>
                    {_.map(state, (data, key) => {

                        return (
                            <div key={key} className='column'>
                                <h3>{data.title}</h3>
                                <Droppable droppableId={key}>
                                    {(provided, snapshot) => {

                                        return (
                                            <div
                                                ref={provided.innerRef}
                                                {...provided.droppableProps}
                                                className={columnClass[num]}
                                            // className="droppable-col"

                                            ><span className='class-switch'>{num++}</span>
                                                {data.items.map((el, index) => {
                                                    return (
                                                        <Draggable key={el._id} index={index} draggableId={el._id}>
                                                            {(provided) => {
                                                                return (
                                                                    <div className='element-container'


                                                                       
                                                                        ref={provided.innerRef}
                                                                        {...provided.draggableProps}
                                                                        {...provided.dragHandleProps}
                                                                    >


                                                                        <div contentEditable="true">
                                                                            {el.title}
                                                                        </div>

                                                                    </div>
                                                                )
                                                            }}
                                                        </Draggable>
                                                    )
                                                })}
                                                {provided.placeholder}
                                            </div>



                                        )

                                    }}
                                </Droppable>
                            </div>
                        )

                    })}
                </DragDropContext>}
            </div>
        </>
    )
}



0 Answers0