{"version":3,"sources":["https://lively-kernel.org/lively4S2/lively4-markus/src/components/tools/lively-file-browser.js"],"names":["Morph","FileBrowser","initialize","_path","location","get","addEventListener","event","keyCode","path","target","value","preventDefault","lively4url","lively","notify","mainAction","file","url","openFile","files","isURL","updateURL","source","split","filter","str","length","charAt","concat","token","pop","push","setMainAction","cb","setMainDirectoryAction","mainDirectoryAction","join","getURL","setAttribute","_update","setURL","toString","Promise","resolve","URL","getAttribute","hideToolbar","shadowRoot","querySelector","style","display","classList","remove","fetch","method","then","response","ok","json","catch","err","Error","statusText","status","message","Array","isArray","contents","console","log","firstChild","removeChild","forEach","item","document","createElement","type","name","size","newPath","baseURL","newURL","Event","Object","assign","dispatchEvent","appendChild","innerHTML","error","add"],"mappings":";;;;;;;;;AAAOA,W;;;;;;;;;;;;;;;;;;AAEQ,YAAMC,WAAN,SAA0BD,KAA1B,CAAgC;AAC7CE,qBAAa;AACX,cAAI,CAAC,KAAKC,KAAV,EAAiB;AACf;AACA;AACA;AACD;;AAED,cAAIC,WAAW,KAAKC,GAAL,CAAS,WAAT,CAAf;AACAD,mBAASE,gBAAT,CAA0B,UAA1B,EAAuCC,KAAD,IAAW;AAC/C,gBAAGA,MAAMC,OAAN,KAAkB,EAArB,EAAyB;AACvB;AACD;AACD,iBAAKC,IAAL,GAAYF,MAAMG,MAAN,CAAaC,KAAzB;AACD,WALD;;AAOA,eAAKN,GAAL,CAAS,KAAT,EAAgBC,gBAAhB,CAAiC,OAAjC,EAA2CC,KAAD,IAAW;AACnD,gBAAI,CAAC,KAAKE,IAAV,EAAgB;AAChBF,kBAAMK,cAAN;AACA,iBAAKH,IAAL,GAAY,KAAKA,IAAL,GAAY,KAAxB;AACD,WAJD;;AAMA,eAAKJ,GAAL,CAAS,OAAT,EAAkBC,gBAAlB,CAAmC,OAAnC,EAA6CC,KAAD,IAAW;AACrDA,kBAAMK,cAAN;AACA,iBAAKH,IAAL,GAAYI,UAAZ;AACD,WAHD;AAIA,eAAKP,gBAAL,CAAsB,aAAtB,EAAsCC,KAAD,IAAW;AAC9CO,mBAAOC,MAAP,CAAc,aAAd;AACA,gBAAI,KAAKC,UAAT,EAAqB;AACnB,mBAAKA,UAAL,CAAgBT,MAAMU,IAAN,CAAWC,GAA3B;AACD,aAFD,MAEO;AACLJ,qBAAOK,QAAP,CAAgBZ,MAAMU,IAAN,CAAWC,GAA3B;AACD;AACF,WAPD;AAQD;;AAED,YAAIT,IAAJ,CAASE,KAAT,EAAgB;AACd,cAAIG,OAAOM,KAAP,CAAaC,KAAb,CAAmBV,KAAnB,CAAJ,EAA+B;AAC7B;AACA,iBAAKR,KAAL,GAAa,CAACQ,KAAD,CAAb;AACA,iBAAKW,SAAL,CAAeX,KAAf;AACD,WAJD,MAIO;AACL,gBAAIY,SAASZ,MAAMa,KAAN,CAAY,KAAZ,EAAmBC,MAAnB,CAA2BC,GAAD,IAASA,IAAIC,MAAJ,GAAa,CAAhD,CAAb;AACA,gBAAIjB,SAAS,EAAb;;AAEA,gBAAGC,MAAMiB,MAAN,CAAa,CAAb,MAAoB,GAAvB,EACElB,SAASA,OAAOmB,MAAP,CAAc,KAAK1B,KAAnB,CAAT;;AAEF,iBAAI,IAAI2B,KAAR,IAAiBP,MAAjB,EAAyB;AACvB,kBAAGO,UAAU,IAAb,EAAmB;AACjBpB,uBAAOqB,GAAP;AACD,eAFD,MAEO,IAAGrB,WAAW,EAAX,IAAiBA,WAAW,GAA/B,EAAoC;AACzCA,uBAAOsB,IAAP,CAAYF,KAAZ;AACD;AACF;AACD,iBAAK3B,KAAL,GAAaO,MAAb;AACA,iBAAKY,SAAL,CAAe,oBAAoB,KAAKb,IAAxC;AACD;AACF;;AAED;;;AAGAwB,sBAAcC,EAAd,EAAkB;AAChB,eAAKlB,UAAL,GAAkBkB,EAAlB;AACD;;AAEDC,+BAAuBD,EAAvB,EAA2B;AACzB,eAAKE,mBAAL,GAA2BF,EAA3B;AACD;;AAED;AACA,YAAIzB,IAAJ,GAAW;AACT,cAAI,CAAC,KAAKN,KAAV,EAAiB,OAAO,GAAP;AACjB,iBAAO,CAAC,KAAKA,KAAL,IAAc,KAAKA,KAAL,CAAW,CAAX,CAAd,IAA+BW,OAAOM,KAAP,CAAaC,KAAb,CAAmB,KAAKlB,KAAL,CAAW,CAAX,CAAnB,CAA/B,GAAmE,EAAnE,GAAwE,GAAzE,IACH,KAAKA,KAAL,CAAWkC,IAAX,CAAgB,GAAhB,CADJ;AAED;;AAED,YAAInB,GAAJ,GAAU;AACR,iBAAO,KAAKoB,MAAL,EAAP;AACD;;AAEDhB,kBAAUJ,GAAV,EAAe;AACb,eAAKqB,YAAL,CAAkB,KAAlB,EAAyB,KAAGrB,GAA5B;AACA,eAAKsB,OAAL;AACD;;AAED;AACA,cAAMC,MAAN,CAAavB,GAAb,EAAkB;AAChB,eAAKT,IAAL,GAAYS,MAAMA,IAAIwB,QAAJ,EAAN,GAAuB,GAAnC;AACA,iBAAQC,QAAQC,OAAR,CAAgB1B,GAAhB,CAAR;AACD;;AAEDoB,iBAAS;AACP,iBAAO,IAAIO,GAAJ,CAAQ,KAAKC,YAAL,CAAkB,KAAlB,CAAR,CAAP;AACD;;AAEDC,sBAAc;AACZ,eAAKC,UAAL,CAAgBC,aAAhB,CAA8B,UAA9B,EAA0CC,KAA1C,CAAgDC,OAAhD,GAA0D,MAA1D;AACD;;AAEDX,kBAAU;AACR,cAAI/B,OAAO,KAAKA,IAAhB;;AAEA,eAAKJ,GAAL,CAAS,WAAT,EAAsBM,KAAtB,GAA8BF,IAA9B;AACA,eAAKJ,GAAL,CAAS,QAAT,EAAmB+C,SAAnB,CAA6BC,MAA7B,CAAoC,SAApC;;AAEAC,gBAAM,KAAKhB,MAAL,EAAN,EAAqB,EAACiB,QAAQ,SAAT,EAArB,EAA0CC,IAA1C,CAAgDC,QAAD,IAAc;AAC3D,gBAAGA,SAASC,EAAZ,EAAgB;AACd,qBAAOD,SAASE,IAAT,EAAP;AACD,aAFD,MAEO;AACL,qBAAOF,SAASE,IAAT,GACJC,KADI,CACGC,GAAD,IAAS;AACd,sBAAM,IAAIC,KAAJ,CAAUL,SAASM,UAAT,GAAsB,IAAtB,GAA6BN,SAASO,MAAtC,GAA+C,GAAzD,CAAN;AACD,eAHI,EAIJR,IAJI,CAIEG,IAAD,IAAU;AACd,oBAAGA,KAAKM,OAAR,EACE,MAAM,IAAIH,KAAJ,CAAUH,KAAKM,OAAf,CAAN,CADF,KAGE,MAAM,IAAIH,KAAJ,CAAUL,SAASM,UAAT,GAAsB,IAAtB,GAA6BN,SAASO,MAAtC,GAA+C,GAAzD,CAAN;AACH,eATI,CAAP;AAUD;AACF,WAfD,EAeGR,IAfH,CAeSG,IAAD,IAAU;AAChB,gBAAGO,MAAMC,OAAN,CAAcR,KAAKS,QAAnB,CAA6B,kCAA7B,CAAH,EAAoE;AAClE,qBAAOT,IAAP;AACD,aAFD,MAEO;AACLU,sBAAQC,GAAR,CAAYX,IAAZ;AACA,oBAAM,IAAIG,KAAJ,CAAU,iDAAV,CAAN;AACD;AACF,WAtBD,EAsBGN,IAtBH,CAsBSG,IAAD,IAAU;AAChB,gBAAIS,WAAW,KAAKpB,UAAL,CAAgBC,aAAhB,CAA8B,WAA9B,CAAf;;AAEA,gBAAGxC,SAAS,KAAKA,IAAjB,EAAuB;AACrB4D,sBAAQC,GAAR,CAAY,oCAAZ;AACA;AACD;;AAED;AACA,mBAAMF,SAASG,UAAf,EAA2B;AACzBH,uBAASI,WAAT,CAAqBJ,SAASG,UAA9B;AACD;;AAEDZ,iBAAKS,QAAL,CAAcK,OAAd,CAAuBxD,IAAD,IAAU;AAC9B,kBAAIyD,0BAAOC,SAASC,aAAT,CAAuB,0BAAvB,CAAP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAJ;;AAEAF,mBAAKG,IAAL,GAAY5D,KAAK4D,IAAjB;AACAH,mBAAKI,IAAL,GAAY7D,KAAK6D,IAAjB;AACAJ,mBAAKK,IAAL,GAAY9D,KAAK8D,IAAjB;;AAEAL,mBAAKpE,gBAAL,CAAsB,OAAtB,EAAgCC,KAAD,IAAW;AACxC,oBAAIyE,UAAUvE,OAAO,GAAP,GAAaQ,KAAK6D,IAAhC;AACA,oBAAIG,UAAUnE,OAAOM,KAAP,CAAaC,KAAb,CAAmB2D,OAAnB,IAA6B,EAA7B,GAAkC,iBAAhD;AACA,oBAAIE,SAAS,IAAIrC,GAAJ,CAAQoC,UAAUD,OAAlB,CAAb;;AAEA,oBAAG/D,KAAK4D,IAAL,KAAc,WAAjB,EAA8B;AAC5B,sBAAI,KAAKzC,mBAAT,EACE,KAAKA,mBAAL,CAAyB8C,MAAzB,EADF,KAGE,KAAKzE,IAAL,GAAYuE,OAAZ;AACH,iBALD,MAKO;AACL,sBAAIzE,QAAQ,IAAI4E,KAAJ,CAAU,aAAV,CAAZ;AACA5E,wBAAMU,IAAN,GAAamE,OAAOC,MAAP,CAAc,EAAd,EAAkBpE,IAAlB,EAAwB;AACnCR,0BAAMuE,OAD6B;AAEnC9D,yBAAKgE;AAF8B,mBAAxB,CAAb;AAIA,uBAAKI,aAAL,CAAmB/E,KAAnB;AACD;AACF,eAlBD;AAmBA6D,uBAASmB,WAAT,CAAqBb,IAArB;AACD,aA3BD;AA4BD,WA/DD,EA+DGlB,IA/DH,CA+DQ,MAAM;AACZ;AACA,iBAAKnD,GAAL,CAAS,QAAT,EAAmBmF,SAAnB,GAA+B,EAA/B;AACA,iBAAKnF,GAAL,CAAS,QAAT,EAAmB+C,SAAnB,CAA6BC,MAA7B,CAAoC,SAApC;AACD,WAnED,EAmEGO,KAnEH,CAmEUC,GAAD,IAAS;AAChBQ,oBAAQoB,KAAR,CAAc5B,GAAd;AACA,iBAAKxD,GAAL,CAAS,QAAT,EAAmBmF,SAAnB,GAA+B3B,IAAInB,QAAJ,EAA/B;AACA,iBAAKrC,GAAL,CAAS,QAAT,EAAmB+C,SAAnB,CAA6BsC,GAA7B,CAAiC,SAAjC;AACD,WAvED;AAwED;AAnL4C;;yBAA1BzF,W","file":"lively-file-browser.js","sourcesContent":["import Morph from \"src/components/widgets/lively-morph.js\"\n\nexport default class FileBrowser 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  set path(value) {\n    if (lively.files.isURL(value)) {\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  /** Path  API */\n  get path() {\n    if (!this._path) return \"/\";\n    return (this._path && this._path[0] && lively.files.isURL(this._path[0]) ? \"\" : '/') \n      + this._path.join('/');\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\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\n        item.type = file.type;\n        item.name = file.name;\n        item.size = file.size;\n\n        item.addEventListener('click', (event) => {\n          var newPath = path + '/' + file.name;\n          var baseURL = lively.files.isURL(newPath)? \"\" : '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}\n"]}