{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-stable/src/components/tools/lively-cloudscripting-file-browser.js"],"names":["Morph","endpoint","LivelyCloudscriptingFileBrowser","initialize","_path","location","get","addEventListener","event","keyCode","path","target","value","preventDefault","lively4url","lively","notify","mainAction","file","url","openFile","match","updateURL","source","split","filter","str","length","charAt","concat","token","pop","push","setMainAction","cb","setMainDirectoryAction","mainDirectoryAction","setSomething","something","join","getURL","setAttribute","_update","setURL","toString","Promise","resolve","URL","getAttribute","hideToolbar","shadowRoot","querySelector","style","display","that","classList","remove","fetch","method","then","response","ok","json","catch","err","Error","statusText","status","message","Array","isArray","contents","type","console","log","firstChild","removeChild","forEach","item","document","createElement","name","size","urlExtension","indexOf","$","ajax","data","JSON","stringify","triggerId","dataset","success","result","innerHTML","parse","error","actionId","newPath","baseURL","newURL","Event","Object","assign","dispatchEvent","appendChild","add"],"mappings":"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","file":"lively-cloudscripting-file-browser.js","sourcesContent":["\nimport Morph from \"src/components/widgets/lively-morph.js\"\nconst endpoint = 'https://lively4-services.herokuapp.com/';\nexport default class LivelyCloudscriptingFileBrowser extends Morph {\n  initialize() {\n    if (!this._path) {\n      // initialize is called after the created callback was invoked, which\n      // is why path might be already set\n      // this.path = lively4url;\n    }\n\n    let location = this.get('#location')\n    location.addEventListener('keypress', (event) => {\n      if(event.keyCode !== 13) {\n        return;\n      }\n      this.path = event.target.value;\n    })\n    \n    this.get('#up').addEventListener('click', (event) => {\n      if (!this.path) return;\n      event.preventDefault();\n      this.path = this.path + '/..';\n    })\n\n    this.get('#home').addEventListener('click', (event) => {\n      event.preventDefault()\n      this.path = lively4url;\n    })\n    this.addEventListener('file-select', (event) => {\n      lively.notify(\"file select\")\n      if (this.mainAction) {\n        this.mainAction(event.file.url);\n      } else {\n        lively.openFile(event.file.url);\n      }\n    });\n  }\n  \n\n  set path(value) {\n    if (value.match(/^https?:\\/\\//)) {\n      // lively.notify(\"set path: \" + value)\n      this._path = [value];\n      this.updateURL(value);\n    } else {\n      let source = value.split(/\\/+/).filter((str) => str.length > 0);\n      let target = [];\n  \n      if(value.charAt(0) !== '/')\n        target = target.concat(this._path);\n  \n      for(let token of source) {\n        if(token === '..') {\n          target.pop();\n        } else if(target !== '' && target !== '.') {\n          target.push(token);\n        }\n      }\n      this._path = target;\n      this.updateURL('https://lively4' + this.path);\n    }\n  }\n\n  /** Pluging API  \n    - use it it to replace behavior of browsing direcotries and files \n  */\n  setMainAction(cb) {\n    this.mainAction = cb;\n  }\n\n  setMainDirectoryAction(cb) {\n    this.mainDirectoryAction = cb;\n  }\n  \n  setSomething(something){\n    this.something=something\n  }\n\n  /** Path  API */\n  get path() {\n    if (!this._path) return \"/\";\n    return (this._path && this._path[0] && this._path[0].match(/^https?:\\/\\//) ? \"\" : '/') \n      + this._path.join('/');\n  }\n  \n\n  get url() {\n    return this.getURL();\n  }\n\n  updateURL(url) {\n    this.setAttribute(\"url\", \"\"+url);\n    this._update();\n  }\n\n  /** URL API */\n  async setURL(url) {\n    this.path = url ? url.toString() : \"/\"\n    return  Promise.resolve(url);\n  }\n\n  getURL() {\n    return new URL(this.getAttribute(\"url\"));\n  }\n\n  hideToolbar() {\n    this.shadowRoot.querySelector(\"#toolbar\").style.display = \"none\";\n  }\n\n  _update() {\n    let path = this.path;\n    var that =this\n\n    this.get('#location').value = path;\n    this.get('#error').classList.remove('visible');\n\n    fetch(this.getURL(), {method: 'OPTIONS'}).then((response) => {\n      if(response.ok) {\n        return response.json();\n      } else {\n        return response.json()\n          .catch((err) => {\n            throw new Error(response.statusText + ' (' + response.status + ')');\n          })\n          .then((json) => {\n            if(json.message)\n              throw new Error(json.message);\n            else\n              throw new Error(response.statusText + ' (' + response.status + ')');\n          });\n      }\n    }).then((json) => {\n      if(Array.isArray(json.contents) && json.type === 'directory') {\n        return json;\n      } else {\n        console.log(json);\n        throw new Error('Invalid JSON response content. Not a directory?');\n      }\n    }).then((json) => {\n      let contents = this.shadowRoot.querySelector('#contents');\n\n      if(path !== this.path) {\n        console.log('Path already changed. Skip update.');\n        return;\n      }\n\n      // clear contents\n      while(contents.firstChild) {\n        contents.removeChild(contents.firstChild);\n      }\n      \n      json.contents.forEach((file) => {\n        let item = document.createElement('lively-file-browser-item');\n        item.setAttribute('data-name', file.name)\n        item.type = file.type;\n        item.name = file.name;\n        item.size = file.size;\n        var that = this;\n        console.log(\"url: \"+that.urlExtension)\n        item.addEventListener('mouseover', (event) => {\n          if(path.indexOf(\"action\") === -1){\n            $.ajax({\n              url: endpoint+that.urlExtension,\n              type: 'POST',\n              data: JSON.stringify({triggerId:event.target.dataset.name}),\n             success: (result) => {that.get('#descriptionContent').innerHTML=JSON.parse(result)},\n              error: (err)=>{\n                lively.notify(\"error: \"+ JSON.stringify(err));\n                that.get('#descriptionContent').innerHTML=\"This file has no description yet.\";\n              }\n            })\n          }else{\n            $.ajax({\n            url: endpoint+\"getActionDescription\",\n            type: 'POST',\n            data: JSON.stringify({actionId:event.target.dataset.name}),\n           success: (result) => {that.get('#descriptionContent').innerHTML=JSON.parse(result)},\n            error: (err)=>{\n            lively.notify(\"error: \"+ JSON.stringify(err));\n                that.get('#descriptionContent').innerHTML=\"This file has no description yet.\";\n            }\n          })\n          }\n          \n          \n        })\n\n        item.addEventListener('click', (event) => {\n          var newPath = path + '/' + file.name;\n          var baseURL = newPath.match(/https?:\\/\\//) ? \"\" : 'https://lively4'; \n          var newURL = new URL(baseURL + newPath);\n\n          if(file.type === 'directory') {\n            if (this.mainDirectoryAction)\n              this.mainDirectoryAction(newURL)\n            else\n              this.path = newPath;\n          } else {\n            let event = new Event(\"file-select\");\n            event.file = Object.assign({}, file, {\n              path: newPath,\n              url: newURL\n            });\n            this.dispatchEvent(event);\n          }\n        });\n        contents.appendChild(item);\n      });\n    }).then(() => {\n      // remove old errors\n      this.get('#error').innerHTML = \"\";\n      this.get('#error').classList.remove('visible');\n    }).catch((err) => {\n      console.error(err);\n      this.get('#error').innerHTML = err.toString();\n      this.get('#error').classList.add('visible');\n    });\n  }\n}"]}