scripts.js


Element.prototype.getTemplateData 
= function(key){
    if (this.hasAttribute('data-templateData')){
        const templateData = JSON.parse(this.getAttribute('data-templateData'));
        if (key===null)return templateData;
        else return templateData[key];
    } else {
        console.log('data-templateData is not set on');
        console.log(this);
    }
};

DataTransfer.prototype.getTemplateData 
= function(key){
    const templateData = JSON.parse(this.getData('templateData'));
    return templateData[key];
};

function generateUUIDISH() { // Public Domain/MIT
    var d = new Date().getTime();//Timestamp
    var d2 = (performance && performance.now && (performance.now()*1000)) || 0;//Time in microseconds since page-load or 0 if unsupported
    return 'axxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxxz'.replace(/\-/g,'_').replace(/[xy]/g, function(c) {
        var r = Math.random() * 16;//random number between 0 and 16
        if(d > 0){//Use timestamp until depleted
            r = (d + r)%16 | 0;
            d = Math.floor(d/16);
        } else {//Use microseconds since page-load if supported
            r = (d2 + r)%16 | 0;
            d2 = Math.floor(d2/16);
        }
        return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
    });
}
function toggleEditorMode(button){
    const editor = document.getElementById("wyg");
    if (button.innerText=='Show HTML'){
        editor.tagName = 'textarea';
        button.innerText = 'Hide HTML';
        editor.classList.toggle('show_html');
        // editor.setAttribute('data-innerHTML',editor.innerHTML);
        // editor.innerText = editor.innerHTML;
    } else {
        editor.tagName = 'div';
        button.innerText = 'Show HTML';
        editor.classList.toggle('show_html');
        // editor.innerHTML = editor.innerText;
    }
}
function showElementForm(event){
    var element = event.target;

    let request = new Request('/wyg/get_element_form/?templateId='+encodeURIComponent(element.getTemplateData('id')));
    fetch(request)
        .then(response => {
            if (response.status === 200) {
                return response.text();
            }
        })
        .then(formHtml => {
            document.getElementById("settings").innerHTML = formHtml;
        });
}

function showGroupSettings(event){
    let groupName = event.target.getAttribute('data-groupName');
    let request = new Request('/wyg/get_group_settings/?group='
        +encodeURIComponent(groupName)
        );
    fetch(request)
        .then(response => {
            if (response.status === 200) {
                return response.json();
            }
        })
        .then(json => {
            let settingsBox = document.getElementById("settings");
            settingsBox.innerText = '';
            settings_html = json.settings_html;
            settingsBox.innerHTML = settings_html;
        });
}
function showElementsOfGroup(event){
    showGroupSettings(event);
    let groupName = event.target.getAttribute('data-groupName');
    let request = new Request('/wyg/get_elements_from_group/?group='+encodeURIComponent(groupName));
    fetch(request)
        .then(response => {
            if (response.status === 200) {
                return response.json();
            }
        })
        .then(json => {
            let elementsBox = document.getElementById("elementsBox");
            elementsBox.innerText = '';
            var key;
            for (key in json){
                let elementData = json[key];
                let templateId = elementData.id;
                let elementDescription = elementData.description;
                let friendlyName = elementData.friendlyName || elementData.tagName;
                let templateHtml = elementData.templateHtml;
                let isContainer = elementData.isContainer;
                
                let element = document.createElement('div');
                element.innerText = friendlyName;
                element.setAttribute('draggable',true);
                element.addEventListener('dragstart',event => dragGroupedElement(event));
                element.addEventListener('click',event=>showElementForm(event));
                element.setAttribute('id','el_'+templateId);
                element.setAttribute('class','element');
                element.setAttribute('data-templateData',JSON.stringify(elementData));
                // element.setAttribute('data-description',elementDescription);
                // element.setAttribute('data-templateId', templateId);
                // element.setAttribute('data-templateHtml',templateHtml);
                // element.setAttribute('data-isContainer',isContainer);
                elementsBox.appendChild(element);
            }
            
        });
}

function showTemplatesOfGroup(event){
    showGroupSettings(event);
    let groupName = event.target.getAttribute('data-groupName');
    let request = new Request('/wyg/get_templates_from_group/?group='+encodeURIComponent(groupName));
    fetch(request)
        .then(response => {
            if (response.status === 200) {
                return response.json();
            }
        })
        .then(json => {
            let elementsBox = document.getElementById("elementsBox");
            elementsBox.innerText = '';
            var key;
            for (key in json){
                let elementData = json[key];
                let templateId = elementData.id;
                let elementDescription = elementData.description;
                let friendlyName = elementData.friendlyName || elementData.tagName;
                let templateHtml = elementData.templateHtml;
                let isContainer = elementData.isContainer;
                
                let element = document.createElement('div');
                element.innerText = friendlyName;
                element.setAttribute('draggable',true);
                element.addEventListener('dragstart',event => dragGroupedElement(event));
                element.addEventListener('click',event=>showElementForm(event));
                element.setAttribute('id','el_'+templateId);
                element.setAttribute('class','element');
                element.setAttribute('data-templateData',JSON.stringify(elementData));
                // element.setAttribute('data-description',elementDescription);
                // element.setAttribute('data-templateId', templateId);
                // element.setAttribute('data-templateHtml',templateHtml);
                // element.setAttribute('data-isContainer',isContainer);
                elementsBox.appendChild(element);
            }
            
        });
}


function dragGroupedElement(event){
    let node = event.target;
    event.dataTransfer.setData("templateData", 
        JSON.stringify(node.getTemplateData(null))
        );
}


function setGroupOfElement(templateId,groupName){

    let request = new Request('/wyg/set_group_on_element/?group='
        +encodeURIComponent(groupName)
        +'&element='
        +encodeURIComponent(templateId));
    fetch(request)
        .then(response => {
            if (response.status === 200) {
                return response.text();
            }
        })
        .then(text => {
            console.log("element group was changed. text response:"+ text+"");
        });
}


function dropElementIntoGroup(event){

    let groupDiv = event.target;
    let groupName = groupDiv.id.substring(String('gr_').length);
    let templateId = JSON.parse(event.dataTransfer.getData("templateData"));
    let originalNode = document.getElementById("el_"+templateId);
    
    originalNode.parentNode.removeChild(originalNode);
    let node = document.createElement('span');
    node.innerText = templateId+", ";
    groupDiv.appendChild(node);

    setGroupOfElement(templateId,groupName);
}

function htmlAsNode(html){
    const wrapper = document.createElement('div');
    wrapper.innerHTML = html;
    const node = wrapper.firstChild;
    return node;
}