From bf6e59d9024c0e3ac62cecdda96b4a25352262ca Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Wed, 21 May 2014 16:04:52 +0100 Subject: [PATCH] Implemented drag 'n' drop from plugin list. Into editor Load After, Requirement and Incompatibility tables. --- resources/report/css/style.css | 3 +++ resources/report/js/script.js | 43 +++++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/resources/report/css/style.css b/resources/report/css/style.css index b49e4811..e605c616 100644 --- a/resources/report/css/style.css +++ b/resources/report/css/style.css @@ -473,4 +473,7 @@ header.editMode #headerOverlay { } label[for=editorPriorityValue] { margin-left: 0.5em; +} +[draggable] { + -webkit-user-select: none; } \ No newline at end of file diff --git a/resources/report/js/script.js b/resources/report/js/script.js index 746753cd..4869d8f3 100644 --- a/resources/report/js/script.js +++ b/resources/report/js/script.js @@ -287,7 +287,13 @@ function hideEditor(evt) { if (evt.target.className.indexOf('accept') != -1) { } - var section = evt.target.parentElement.parentElement.parentElement; + + /* Remove drag 'n' drop event handlers. */ + var elements = document.getElementById('pluginsNav').children; + for (var i = 0; i < elements.length; ++i) { + elements[i].removeAttribute('draggable', true); + elements[i].removeEventListener('dragstart', handlePluginDragStart, false); + } /* Disable priority hover in plugins list. */ document.getElementById('pluginsNav').classList.toggle('editMode', false); @@ -296,11 +302,32 @@ function hideEditor(evt) { document.getElementsByTagName('header')[0].classList.toggle('editMode', false); /* Hide editor. */ + var section = evt.target.parentElement.parentElement.parentElement; section.classList.toggle('flip'); /* Now delete editor panel. */ section.removeChild(section.getElementsByClassName('editor')[0]); } +function handlePluginDrop(evt) { + evt.stopPropagation(); + + if (evt.currentTarget.tagName == 'TABLE' && (evt.currentTarget.className.indexOf('req') != -1 || evt.currentTarget.className.indexOf('inc') != -1 || evt.currentTarget.className.indexOf('loadAfter') != -1)) { + var data = { + file: evt.dataTransfer.getData('text/plain') + }; + addTableRow(evt.currentTarget.getElementsByTagName('tbody')[0], data); + } + + return false; +} +function handlePluginDragStart(evt) { + evt.dataTransfer.effectAllowed = 'copy'; + evt.dataTransfer.setData('text/plain', evt.target.getElementsByClassName('name')[0].textContent); +} +function handlePluginDragOver(evt) { + evt.preventDefault(); + evt.dataTransfer.dropEffect = 'copy'; +} function showEditor(sectionId) { /* Editor is attached to plugins on-demand. */ var content = document.getElementById('pluginEditor').content; @@ -333,6 +360,20 @@ function showEditor(sectionId) { editor.getElementsByClassName('accept')[0].addEventListener('click', hideEditor, false); editor.getElementsByClassName('cancel')[0].addEventListener('click', hideEditor, false); + /* Set up drag 'n' drop event handlers. */ + elements = document.getElementById('pluginsNav').children; + for (var i = 0; i < elements.length; ++i) { + elements[i].setAttribute('draggable', true); + elements[i].addEventListener('dragstart', handlePluginDragStart, false); + } + elements = editor.getElementsByTagName('table'); + for (var i = 0; i < elements.length; ++i) { + if (elements[i].className.indexOf('loadAfter') != -1 || elements[i].className.indexOf('req') != -1 || elements[i].className.indexOf('inc') != -1) { + elements[i].addEventListener('drop', handlePluginDrop, false); + elements[i].addEventListener('dragover', handlePluginDragOver, false); + } + } + /* Enable priority hover in plugins list. */ document.getElementById('pluginsNav').classList.toggle('editMode', true);