{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-livelyenergy/src/components/widgets/lively-file.js"],"names":["Morph","ContextMenu","Mimetypes","getTempKeyFor","LivelyFile","html","File","initialize","addEventListener","evt","onContextMenu","updateView","name","draggable","onDragStart","onClick","onDoubleClick","get","onNameClick","registerAttributeObservers","attachedCallback","shiftKey","classList","contains","remove","add","parentElement","querySelectorAll","forEach","ea","comp","lively","openBrowser","fileToURI","hideNavbar","nameField","setAttribute","focus","preventDefault","stopPropagation","removeEventListener","renameFile","textContent","tmpKey","dataTransfer","setData","lastDragOffset","getGlobalPosition","subPt","getPosition","url","files","tempfile","mimetype","extension","contents","fetch","then","r","blob","saveFile","setAsBackground","setURLAsBackground","encodeURIComponent","items","map","isPicture","push","menu","openIn","document","body","value","innerHTML","match","_setIcon","onIdChanged","notify","getAttribute","setContent","data","contenttype","Blob","dataURL","readBlobAsDataURL","console","log","btoa","type","iconClass","livelyExample"],"mappings":"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","file":"lively-file.js","sourcesContent":["/*MD # Lively File \n\n![](lively-file.png){height=100px}\n\nMD*/\n\nimport Morph from \"src/components/widgets/lively-morph.js\"\nimport ContextMenu from 'src/client/contextmenu.js'\nimport Mimetypes from 'src/client/mimetypes.js'\nimport {getTempKeyFor} from 'utils'\nimport {LivelyFile} from \"src/client/poid.js\"\nimport html from  'src/client/html.js'\n\nexport default class File extends Morph {\n  initialize() {\n    this.addEventListener('contextmenu', evt => this.onContextMenu(evt), false);     \n    this.updateView(this.name)\n    this.draggable = true;\n    this.addEventListener(\"dragstart\", evt => this.onDragStart(evt))\n    this.addEventListener(\"click\", evt => this.onClick(evt))\n    this.addEventListener(\"dblclick\", evt => this.onDoubleClick(evt))    \n    this.get(\"#item-name\").addEventListener(\"click\", evt => this.onNameClick(evt))\n    html.registerAttributeObservers(this);\n  }\n  \n  attachedCallback() {\n    this.updateView(this.name)\n  }\n\n  onClick(evt) {\n    if (evt.shiftKey) {\n      // add and remove to a selection\n      if (this.classList.contains(\"selected\")) {\n        this.classList.remove(\"selected\")        \n      } else {\n        this.classList.add(\"selected\")  \n      }\n    } else {\n      // select one\n      this.parentElement.querySelectorAll(\"lively-file\").forEach(ea => {\n        ea.classList.remove(\"selected\")\n      })\n      this.classList.add(\"selected\")        \n    }\n  }\n  \n  async onDoubleClick() {\n    var comp = await lively.openBrowser(LivelyFile.fileToURI(this), false)\n    comp.hideNavbar() \n  }\n  \n  onNameClick(evt) {\n    if (this.classList.contains(\"selected\")) {\n      var nameField = this.get(\"#item-name\")\n      nameField.setAttribute(\"contenteditable\", true)\n      nameField.focus()\n      evt.preventDefault()\n      evt.stopPropagation()\n\n      \n      lively.removeEventListener(\"name\", nameField)\n      lively.addEventListener(\"name\", nameField, \"blur\", () => {\n        this.renameFile(nameField.textContent)\n        nameField.setAttribute(\"contenteditable\", false);\n      })\n      \n    }\n  }\n  \n  async onDragStart(evt) {\n    var tmpKey = getTempKeyFor(this)\n    evt.dataTransfer.setData(\"lively/element\", tmpKey)\n    \n    this.lastDragOffset  = lively.getGlobalPosition(this).subPt(lively.getPosition(evt))\n    \n    \n    let url = lively.files.tempfile(), // #Problem, we need to tell the server syncronously about that temp file...\n        // because, this does not work (no sync web requests allowed...) we have to find another solution\n        // #Idea all GET requests on temp files will block wait on an actual file (maybe with a timeout)\n      name = this.name,\n      mimetype = Mimetypes.mimetype(lively.files.extension(this.name));\n    evt.dataTransfer.setData(\"DownloadURL\", `${mimetype}:${name}:${url}`); // #TODO or make other drop places aware of DownloadURL\n  \n    // oh, shit... just because we want to be able to drag it to the desktop\n    var contents = await fetch(this.url).then(r => r.blob())\n    lively.files.saveFile(url, contents)\n  }\n  \n  async setAsBackground() {\n    lively.files.setURLAsBackground(\n          `https://lively4/scheme/livelyfile//${encodeURIComponent(this.name)}`)\n  }\n\n  onContextMenu(evt) {\n    if (!evt.shiftKey) {\n      evt.stopPropagation();\n      evt.preventDefault();\n      var items = [\n          ...([\"browse\", \"edit\"].map(ea => [ea, async () => {\n            var comp = await lively.openBrowser(\"livelyfile://#\" + this.name, ea == \"edit\")\n            comp.hideNavbar() \n          }]))\n      ]\n      if (lively.files.isPicture(this.name)) {\n        items.push([\"set as background\", () => this.setAsBackground()])\n      }\n      var menu = new ContextMenu(this, items);\n      \n      \n      \n      menu.openIn(document.body, evt, this);\n      return true;\n    }\n  }\n\n  \n  updateView(value) {\n    if (!value) return\n    this.get('#item-name').innerHTML = value\n    if (value.match(/\\.(md)|(txt)$/)) {\n      this._setIcon('fa-file-text-o') \n    } else if (value.match(/\\.(png)|(jpeg)$/)) {\n      this._setIcon('fa-file-picture-o')\n    } else if (value.match(/\\.(html)|(js)|(json)$/)) {\n      this._setIcon('fa-file-code-o')\n    } else if (value.match(/\\.(mkv)|(mov)|(mp4)$/)) {\n      this._setIcon('fa-film')\n    } else if (value.match(/\\.(mp3)$/)) {\n      this._setIcon('fa-audio')\n    } else {\n      this._setIcon('fa-file-o') \n    }\n    \n  }\n  \n  set name(value) {\n    this.setAttribute(\"name\", value)\n    this.updateView(value)\n  }\n \n  onIdChanged(value) {\n    lively.notify(\"id changed \" + value)\n    this.updateView(value)  \n  }\n  \n  get name() {\n    return this.getAttribute('name')\n  }\n\n  renameFile(name) {\n    this.name = name\n  }\n  \n  set url(value) {\n    this.setAttribute(\"url\", value)\n  }\n  \n  get url() {\n    return this.getAttribute('url')\n  }\n  \n  async setContent(data, contenttype) {\n    if (data instanceof Blob) {\n      var dataURL = await lively.files.readBlobAsDataURL(data)\n      console.log(\"data: \", dataURL)\n      this.url = dataURL\n    } else {\n      this.url = `data:${contenttype || \"text/plain\" };base64,` + btoa(data);\n    }\n  }\n\n  set type(value) {\n    switch(value) {\n      case 'directory':\n        this._setIcon('fa-folder')\n        break\n      default:\n        this._setIcon('fa-file-o')\n    }\n  }\n\n  _setIcon(iconClass) {\n    this.get('#item-icon').classList.add(iconClass);\n  }\n  \n  livelyExample() {\n    this.name = \"hello-world-foo.md\"    \n  }\n  \n  \n}\n"]}