Browser drag-and-drop support for views and nodes, covering drop targets, drag sources, and MIME-type dispatch.
The browser's native HTML5 drag-and-drop API is low-level and inconsistent—you must manually parse DataTransfer objects, handle files versus text strings differently, prevent default browser navigation on dropped files, and manage empty-space drops that bypass child elements.
STRVCT wraps this into a clean, declarative protocol:
setIsRegisteredForBrowserDrop(true)). Dropped data arrives pre-parsed, typed by MIME, and dispatched directly to a handler method named by convention.setIsRegisteredForBrowserDrag(true)), populating DataTransfer payloads when a drag initiates.| File / Class Name | Purpose & Responsibilities |
|---|---|
SvDomView_browserDragAndDrop.js | Category on SvDomView implementing drop/drag target APIs. |
SvDropListener.js | Manages element drop event listeners (dragenter, dragover, dragleave, drop). |
SvDragListener.js | Manages element drag source event listeners (dragstart, dragend). |
SvDocumentBody.js | Global drop prevention on document.body to stop browser file navigation. |
init () {
super.init();
this.setIsRegisteredForBrowserDrop(true); // Attaches SvDropListener
return this;
}Override acceptsDrop(event) to inspect incoming transfer types:
acceptsDrop (event) {
// Inspect event.dataTransfer.types
return event.dataTransfer.types.includes("text/plain");
}dropMethodForMimeType)| MIME Type | Convention Handler Method Name |
|---|---|
text/plain | onBrowserDropTextPlain(dataChunk) |
text/html | onBrowserDropTextHtml(dataChunk) |
image/png | onBrowserDropImagePng(dataChunk) |
image/jpeg | onBrowserDropImageJpeg(dataChunk) |
application/json | onBrowserDropApplicationJson(dataChunk) |
SvDataUrl)Dropped payloads are wrapped in an SvDataUrl instance (dataChunk):
dataChunk.mimeType(): Returns the MIME type string.dataChunk.decodedData(): Returns the decoded string or JSON content.dataChunk.setDataUrlString(url): Contains the data URL string for dropped files.Override styling hooks for hover feedback:
dragHighlight () {
this.setBorder("2px dashed cornflowerblue");
}
dragUnhighlight () {
this.setBorder("none");
}To make a view draggable:
init () {
super.init();
this.setIsRegisteredForBrowserDrag(true);
return this;
}
// Populate transfer payload on drag start
onBrowserDragStart (event) {
const dt = event.dataTransfer;
dt.setData("text/plain", this.node().title());
dt.setData("application/json", JSON.stringify(this.node().asJson()));
}