WYGContainer.js


class WYGContainer extends WYG.Wire {

    __construct(){
        this.objects = new WeakMap();
        this.keys = {};
    }
    __attach(){
        this.parser = WYG.Parser;
    }
    ondragover(event){
        event.preventDefault();
        event.stopPropagation();
    }
    ondrop(event){
        event.preventDefault();
        event.stopPropagation();
        let objKey;
        if (objKey = event.dataTransfer.getData('objKey')){
            //dragging a node that is already in the editor
            const obj = this.objFor(objKey);
            obj.node.parentNode.removeChild(obj.node);
            // console.log(obj.node);
            this.addNode(obj,this.deriveTarget(event));
            return;
        }
        //dragging from the elements panel / control panel
        const dt = event.dataTransfer;
        const target = this.deriveTarget(event);
        const newNode = this.parser.htmlAsNode(dt.getData('code'));
        const obj = WYG.Node.wireNode(newNode);
        const settings = JSON.parse(dt.getData('settings'));
        for (const key in settings) obj[key] = settings[key];

        this.addNode(obj,target);
    }

    onclick(event){
        event.preventDefault();
    }
    addCode(code,target=undefined,settings=undefined){
        const newNode = this.parser.htmlAsNode(code);
        const obj = WYG.Node.wireNode(newNode);
        if (settings !== undefined)for (const key in settings) obj[key] = settings[key];
        this.addNode(obj,target);
    }
    addNode(obj,target=undefined){
        if (target==undefined)target = this;
        const node = obj.node;
        if (target.node.classList.contains("WYGContainer")
            ||target.isContainer
                &&(!obj.isContainer||target.isSuperContainer)){
                    console.log(target);
            target.node.appendChild(obj.node);
        } else if (obj.isContainer
            &&target.isSuperContainer){
                target.node.appendChild(obj.node);
        } else {
            this.addNode(obj,RB.WireContext.fromNode(target.node.parentNode));
            // target.node.parentNode.appendChild(obj.node);
        }
    }

    deriveTarget(event){
        let node = event.target;
        const obj = RB.WireContext.fromNode(node);
        return obj;
        // const obj = RB.WireContext.fromNode(node);
        // console.log(obj);
        // console.log('derive target done');
        // return node;

        // if (node.classList.contains("WYGContainer")){
        //     console.log("container");
        //     return node;
        // } else if (node.classList.contains('wyg-wrapper')){
        //     return node.firstChild;
        // } else if (node.nodeName==='#text'){
        //     node = node.parentNode;
        // } else if (node.tagName=='INPUT'){
        //     node = node.parentNode;
        // } else if (node.parentNode.classList.contains('wyg-wrapper')) {
        //     return node;
        // }

        // // while (node!==undefined
        // //         &&node!==null
        // //         &&!this.editor.isContainer(node)){
        // //     node = node.parentNode;
        // // }

        // return node;
    }

    keyFor(obj){
        if (this.objects.has(obj))return this.objects.get(obj);
        else {
            const uniqueId = this.objects.length 
                        + '-'+window.performance.now() 
                        + '-'+Math.random();
            this.objects.set(obj,uniqueId);
            this.keys[uniqueId] = obj;
            return uniqueId;
        }
    }
    objFor(key){
        return this.keys[key] ?? undefined;
    }
}

WYGContainer.autowire();