{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-bp2019/src/client/draganddrop.js"],"names":["pt","debounce","through","asDragImageFor","getObjectFor","removeTempKey","letsScript","applyDragCSSClass","addEventListener","evt","classList","add","remove","appendToContainerAt","node","dropOnDocumentBehavior","openAt","DropOnBodyHandler","constructor","mimeType","handler","handle","dt","dataTransfer","types","includes","element","getData","then","r","findDropContext","path","container","document","body","find","ea","contains","localName","DropElementHandler","customHandler","handleElement","composedPath","appendChild","lively","setGlobalPosition","getPosition","lastDragOffset","moveBy","tempKey","cb","removeListeners","removeEventListener","load","onDragOver","onDrop","handlers","dataTempKey","data","viewTempKey","sourceView","icon","offset","JSON","parse","clientX","clientY","subPt","knotURL","create","urlString","match","openInspector","getGlobalPosition","existing","querySelector","notify","link","replace","preventDefault","stopPropagation","openBrowser","htmlString","div","innerHTML","text","target","lastDropTarget","lastDropTargetHighlight","Array","from","showElement","handleFiles","files","length","forEach","file","extension","name","ctrlKey","reader","FileReader","onload","event","dataURL","result","img","readAsDataURL","item","url","readBlobAsDataURL","cssText","split","pair","value","style","warn","__unload__"],"mappings":"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","file":"draganddrop.js","sourcesContent":["import { pt } from 'src/client/graphics.js';\nimport { debounce, through, asDragImageFor, getObjectFor, removeTempKey } from \"utils\";\nimport { letsScript } from 'src/client/vivide/vivide.js';\n\nexport function applyDragCSSClass() {\n  this.addEventListener('dragenter', evt => this.classList.add(\"drag\"), false);\n  this.addEventListener('dragleave', evt => this.classList.remove(\"drag\"), false);\n  this.addEventListener('drop', evt => this.classList.remove(\"drag\"));\n}\n\nfunction appendToContainerAt(node, evt) {\n  dropOnDocumentBehavior.openAt(node, evt)\n  // document.body.appendChild(node);\n  // lively.setGlobalPosition(node, pt(evt.clientX, evt.clientY));\n}\n\n\n//class DataTransferItemHandler {\n//  handle() {\n//    \n//  }\n//}\n\nclass DropOnBodyHandler {\n  constructor(mimeType, handler) {\n    this.mimeType = mimeType;\n    this.handler = handler;\n  }\n  \n  handle(evt) {\n    const dt = evt.dataTransfer;\n    if(!dt.types.includes(this.mimeType)) { return false; }\n    \n    const element = this.handler(dt.getData(this.mimeType));\n    if(element) {\n      if(element.then) {\n        element.then( r => {\n          appendToContainerAt(r, evt);  \n        })\n      } else {\n        appendToContainerAt(element, evt);\n      }\n      return true;\n    } else {\n      return false;\n    }\n  }\n}\n\nfunction findDropContext(element, path, container=document.body) {\n  return path.find(ea => {\n    return ea && (ea === container || (ea.classList && ea.classList.contains(\"lively-content\")) || ea.localName == \"lively-folder\")\n  }) || container\n}\n\n\n// drop and a dragged html element into a container\nexport class DropElementHandler {\n  constructor(container, customHandler) {\n    this.container = container;\n    if (customHandler) {\n      this.handleElement = customHandler\n    }\n  }\n  \n  handleElement(element, evt) {\n    var container = findDropContext(element, evt.composedPath(), this.container)\n    container.appendChild(element)\n    lively.setGlobalPosition(element, lively.getPosition(evt))\n    if (element.lastDragOffset) {\n      lively.moveBy(element, element.lastDragOffset)\n    }\n  }\n  \n  handle(evt) {\n    const dt = evt.dataTransfer\n    if(!dt.types.includes(\"lively/element\")) { return false }\n    const tempKey = dt.getData(\"lively/element\")\n    const element = getObjectFor(tempKey)\n    if (!element) return false\n    \n    this.handleElement(element, evt)\n    \n    removeTempKey(tempKey)\n    return true\n  }\n  \n  static handle(evt, container, cb) {\n    new this(container, cb).handle(evt)\n  }\n}\n\nconst dropOnDocumentBehavior = {\n  \n  removeListeners() {\n    lively.removeEventListener(\"dropOnDocumentBehavior\", document);\n  },\n  \n  load() {\n    // #HACK: we remove listeners here, because this module is called three times (without unloading in between!!)\n    this.removeListeners();\n    lively.addEventListener(\"dropOnDocumentBehavior\", document, \"dragover\", ::this.onDragOver);\n    lively.addEventListener(\"dropOnDocumentBehavior\", document, \"drop\", ::this.onDrop);\n    \n    this.handlers = [\n      // lively elements\n      new DropElementHandler(document.body),\n      // {\n      //   handle(evt) {\n      //     const dt = evt.dataTransfer;\n      //     if(!dt.types.includes(\"lively/element\")) { return false; }\n      //     const tempKey = dt.getData(\"lively/element\");\n      //     const element = getObjectFor(tempKey);\n      //     if (!element) return false;\n      //     document.body.appendChild(element)\n      //     lively.setGlobalPosition(element, lively.getPosition(evt))\n      //     if (element.lastDragOffset) {\n      //       lively.moveBy(element, element.lastDragOffset)\n      //     }\n      //     removeTempKey(tempKey);\n      //     return true;\n      //   }\n      // },\n      // vivide list\n      {\n        handle(evt) {\n          const dt = evt.dataTransfer;\n          if(!dt.types.includes(\"vivide\")) { return false; }\n          if(!dt.types.includes(\"javascript/object\")) { return false; }\n          const dataTempKey = dt.getData(\"javascript/object\");\n          const data = getObjectFor(dataTempKey);\n          const viewTempKey = dt.getData(\"vivide/source-view\");\n          const sourceView = getObjectFor(viewTempKey);\n          getObjectFor\n          letsScript(data, evt, sourceView);\n          return true;\n        }\n      },\n\n      // move a desktop item\n      {\n        handle(evt) {\n          const dt = evt.dataTransfer;\n          if(!dt.types.includes(\"desktop-icon/object\")) { return false; }\n          const tempKey = dt.getData(\"desktop-icon/object\");\n          const icon = getObjectFor(tempKey);\n          removeTempKey(tempKey);\n\n          const offset = dt.types.includes(\"desktop-icon/offset\") ?\n            JSON.parse(dt.getData(\"desktop-icon/offset\")) :\n            pt(0, 0);\n          lively.setGlobalPosition(icon, pt(evt.clientX, evt.clientY).subPt(offset));\n          return true;\n        }\n      },\n\n      // knot/url to desktop item\n      {\n        handle(evt) {\n          const dt = evt.dataTransfer;\n          if(!dt.types.includes(\"knot/url\")) { return false; }\n          const knotURL = dt.getData(\"knot/url\");\n\n          lively.create('knot-desktop-icon')\n            .through(icon => lively.setGlobalPosition(icon, pt(evt.clientX, evt.clientY)))\n            .then(icon => icon.knotURL = knotURL);\n\n          return true;\n        }\n      },\n      \n      new DropOnBodyHandler('text/uri-list', urlString => {\n        if (!urlString.match(/^data\\:image\\/png/)) { return false; }\n        \n        return <img class=\"lively-content\" src={urlString}></img>;\n      }),\n      \n      // open javascript/object in inspector\n      {\n        handle(evt) {\n          const dt = evt.dataTransfer;\n          if(!dt.types.includes(\"javascript/object\")) { return false; }\n          const tempKey = dt.getData(\"javascript/object\");\n          \n          lively.openInspector(getObjectFor(tempKey), pt(\n            evt.clientX,\n            evt.clientY).subPt(lively.getGlobalPosition(document.body)));\n          removeTempKey(tempKey);\n\n          return true;\n        }\n      },\n\n      new DropOnBodyHandler('text/uri-list', urlString => {\n        if (!urlString.match(/^plex:\\//)) { return false; }\n        var existing = document.body.querySelector(`plex-link[src=\"${urlString}\"]`)\n        if (existing) {\n          existing.remove()\n        }\n        lively.notify(\"dropped \" + urlString)\n        return <plex-link src={urlString}></plex-link>\n      }),\n\n      \n      new DropOnBodyHandler('text/uri-list', urlString => {\n        var link = <div class=\"lively-content\"><a  href={urlString}>\n          {urlString.replace(/\\/$/,\"\").replace(/.*\\//,\"\")}\n        </a></div>;\n        // register the event... to be able to remove it again...\n        lively.addEventListener(\"link\", link, \"click\", evt => {\n          // #TODO make this bevior persistent?\n          evt.preventDefault();\n          evt.stopPropagation();\n          lively.openBrowser(urlString);\n          return true;\n        })\n        return link\n      }),\n\n      new DropOnBodyHandler('text/html', htmlString => {\n        const div = <div></div>;\n        div.innerHTML = htmlString;\n\n        return div;\n      }),\n\n      new DropOnBodyHandler('text/plain', text => {\n        return <p>{text}</p>;\n      }),\n\n      // just an ui interaction, no data\n      {\n        handle(evt) {\n          return evt.dataTransfer.types.includes(\"ui/interaction\");\n        }\n      }\n    ];\n  },\n  \n  openAt(node, evt) {  \n    var target = this.lastDropTarget || document.body\n    target.appendChild(node);\n    lively.setGlobalPosition(node, pt(evt.clientX, evt.clientY));\n    if (this.lastDropTargetHighlight) this.lastDropTargetHighlight.remove()\n  },\n\n\n  \n  \n  onDragOver(evt) {\n    this.lastDropTarget = Array.from(evt.composedPath())\n      .find(ea => ea && ((ea.classList && ea.classList.contains(\"lively-content\")) || ea.localName == \"lively-folder\"))\n    if (this.lastDropTargetHighlight) this.lastDropTargetHighlight.remove()\n    this.lastDropTargetHighlight = lively.showElement(this.lastDropTarget)\n    \n    evt.stopPropagation();\n    evt.preventDefault();\n  },\n\n  handleFiles(evt) {\n    const files = evt.dataTransfer.files;\n\n    if(files.length === 0) { return false; }\n\n    lively.notify(`Dropped ${files.length} file(s).`);\n    Array.from(files).forEach(async (file) => {\n        const extension = lively.files.extension(file.name)\n        // #Research how do we deal with content vs. container... drop a picture here or a file that contains the picture? #Journal #Interesting\n        if (extension == \"png\" && !evt.ctrlKey) {\n            // #Refactor #TODO use lively.files.readBlobAsDataURL\n            const reader = new FileReader();\n            reader.onload = event => {\n              const dataURL = event.target.result.replace(/^data\\:image\\/png;/, `data:image/png;name=${file.name};`);\n              const img = <img class=\"lively-content\" src={dataURL}></img>;\n              appendToContainerAt(img, evt);\n            };\n            reader.readAsDataURL(file); \n        } \n        // else if (extension == \"html\") {\n        //   var source = await lively.files.readBlobAsText(file)\n        //   lively.clipboard.pasteHTMLDataInto(source, document.body, false, lively.getPosition(evt));\n        // } \n        else {          \n          var item = await (<lively-file></lively-file>)\n          item.classList.add(\"lively-content\") // for persistence\n          // #TODO check for existing \"file\"\n          item.name = file.name\n          this.openAt(item, evt);\n          item.url = await lively.files.readBlobAsDataURL(file) \n        }\n      });\n    return true;\n  },\n  \n  async onDrop(evt) {\n    // var target = evt.composedPath().find(ea => ea.classList.contains(\"lively-content\") )\n    const dt = evt.dataTransfer;\n    \n    /*\n    console.group(\"Drop Event on body\");\n    console.log(dt);\n    console.log(`#files ${dt.files.length}`);\n    console.log(Array.from(dt.items));\n    lively.notify(Array.from(dt.types).join(\" \"));\n    console.groupEnd();\n    */\n\n    evt.stopPropagation();\n    evt.preventDefault();\n    \n    if(this.handleFiles(evt)) { return; }\n\n    if(Array.from(dt.types).length > 0) {\n      if(this.handlers.find(handler => handler.handle(evt))) {\n        return;\n      }\n    }\n    var cssText = evt.dataTransfer.getData(\"lively/cssText\")\n    if (this.lastDropTarget && cssText) {\n      cssText.split(/; */).forEach(pair => {\n        var name, value;\n        [name,value] = pair.split(/: */)\n        lively.notify(\"set \" + this.lastDropTarget + \"'s \" + name + \" to \" + value)\n        name = name.replace(/ /g,\"\")\n        this.lastDropTarget.style[name] = value\n        // window.LastDT = this.lastDropTarget\n        // window.LastName = name\n        // window.LastCSS = value\n        // target.style[\"background\"] = \"red\"\n      })\n        \n      } else {\n      \n      lively.warn(\"Dragged content contained neither files nor handled items\");\n    }\n    \n  }\n}\n\nexport function __unload__() {\n  dropOnDocumentBehavior.removeListeners();\n}\n\ndropOnDocumentBehavior.load()"]}