{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tom/src/components/tools/file-chooser.js"],"names":["Morph","Bindings","promisedEvent","ContextMenu","FileChooser","initialize","registerAttributes","v","updateView","registerButtons","get","evt","onContextMenu","getMenuElements","menuElements","menu","openIn","document","getSelection","onOk","dispatchEvent","CustomEvent","detail","chooseFile","dir","match","lively","chooseFiles","livelyExample"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;AAEOA,W;;AACAC,c;;AACCC,mB,qBAAAA,a;;AACDC,iB;;;;;;;;;;;;;;AAHAH,mL;;;;;;;;;;;;;;;;;;;;;;;;;;AACAC,sL;;;;;;;;;;;;;;;;;;;;;;;;;;AACCC,2L;;;;;;;;;;;;;;;;;;;;;;;;;;AACDC,yL;;;;;;;;;;;;;;;;;;;;AAGP;;;;;;AAMe,YAAMC,WAAN,SAA0BJ,KAA1B,CAAgC;AAC7C,cAAMK,UAAN,GAAmB;AAAA;;AACjB,eAAKC,kBAAL,CAAwB,CAAC,MAAD,CAAxB;AACA,mCAAM;AAAO;AAAP,WAAN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAAiCC;AAAK,qGAAKC,UAAL;AAAL,WAAjC;AACA,0CAAmB,aAAnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAHiB;AAIjB,eAAKC,eAAL;;AAEA,4IAAyB,IAAzB,GANiB,CAMe;AANf;AAOjB,eAAKD,UAAL;AACA,iGAAKE,GAAL,CAAS,SAAT,qBAAoCC;AAAA;AAAO,wGAAKC,aAAL,6EAAmBD,GAAnB;AAAP,WAApC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AARiB;AASlB;;AAED;AACAE,0BAAkB;AACd,iBAAO,EAAP;AACH;;AAEDD,sBAAcD,GAAd,EAAmB;AAAA;;AACjB,gBAAMG,kGAAe,KAAKD,eAAL,EAAf,CAAN;;AAEA,gBAAME,OAAO,+FAAIZ,WAAJ,EAAgB,IAAhB,gGAAsBW,YAAtB,EAAb;AAHiB;AAIjB,8FAAKE,MAAL,gFAAYC,QAAZ,wFAA2BN,GAA3B,GAAgC,IAAhC;AACD;;AAED,cAAMH,UAAN,GAAmB;AACjB,cAAI,YAAC,IAAD,SAAJ;AAAgB;AAAhB,WACA,eAAI,IAAJ;AAAyB;AAAzB,WACA,IAAI;AACF,+CAAsB,IAAtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,2GAAM,KAAKE,GAAL,CAAS,SAAT,CAAN,uBAA+B,IAA/B;AACA,0GAAKA,GAAL,CAAS,SAAT;AACD,WAJD,SAIU;AACR,+CAAsB,KAAtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;AACF;;AAEDQ,uBAAe;AACb,0GAAO,KAAKR,GAAL,CAAS,SAAT,CAAP;AACD;;AAEDS,eAAO;AACL,oHAAW,KAAKT,GAAL,CAAS,SAAT,CAAX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AADK;AAEL,eAAKU,aAAL,CAAmB,2EAAIC,WAAJ,EAAgB,aAAhB,EAA+B,EAACC,mBAAQ,IAAR,QAAD,EAA/B,CAAnB;AACA,cAAI,qCAAsB,8DAAgC,eAA1D,EAA0E;AACxE;AACD;AACF;;AAED,cAAMC,UAAN,CAAiBC,GAAjB,EAAsB;AAAA;;AACpB,cAAG,yEAAC,iFAAIC,KAAJ,CAAU,KAAV,CAAD,MAAqB,qGAAMC,MAAN,yGAA+BF,GAA/B,GAArB,CAAH,EAA6D;AAC3DA,kBAAM,mFAAM,GAAZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAD2D,CAC3C;AACjB;AACD,+GAAYA,GAAZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAJoB;AAKpB,eAAKhB,UAAL;;AAEA,gBAAM,8GAAc,IAAd,EAAoB,aAApB,CAAN;AACA,4BAAO,IAAP;AACD;;AAED,cAAMmB,WAAN,CAAkBH,GAAlB,EAAuB;AAAA;;AACrB,8FAAM,KAAKD,UAAL,6EAAgBC,GAAhB,EAAN;AACA,gGAAO,KAAKN,YAAL,EAAP;AACD;;AAED,cAAMU,aAAN,GAAsB;AACpB,mCAAY,oFAAa,YAAzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACD;;AAlE4C;;yBAA1BxB,W;;;;;;;;;;6BAAAA,gL","file":"file-chooser.js","sourcesContent":["\"enable aexpr\";\n\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport Bindings from \"src/client/bindings.js\"\nimport {promisedEvent} from \"src/client/utils.js\"\nimport ContextMenu from 'src/client/contextmenu.js';\n\n\n/*MD # File Chooser\n\n![](file-chooser.png){width=300px}\n\nMD*/\n\nexport default class FileChooser extends Morph {\n  async initialize() {\n    this.registerAttributes([\"root\"]);\n    aexpr(() =>  this.root).onChange(v => this.updateView());\n    this.windowTitle = \"FileChooser\";\n    this.registerButtons()\n\n    lively.html.registerKeys(this); // automatically installs handler for some methods\n    this.updateView();\n    this.get('#navbar').onContextMenu = evt => this.onContextMenu(evt);\n  }\n\n  // Please overwrite for your use case\n  getMenuElements() {\n      return [];\n  }\n    \n  onContextMenu(evt) {\n    const menuElements = this.getMenuElements();\n      \n    const menu = new ContextMenu(this, menuElements)\n    menu.openIn(document.body, evt, this)\n  }\n  \n  async updateView() {\n    if (!this.root) return\n    if (this.isUpdatingView) return;\n    try {\n      this.isUpdatingView = true \n      await this.get(\"#navbar\").show(this.root)\n      this.get(\"#navbar\").hideDetails()      \n    } finally {\n      this.isUpdatingView = false\n    }\n  }\n  \n  getSelection() {\n    return this.get(\"#navbar\").getSelection()\n  }\n  \n  onOk() {\n    this.url = this.get(\"#navbar\").url\n    this.dispatchEvent(new CustomEvent(\"choose-file\", {detail: this.url}))\n    if (this.parentElement && this.parentElement.localName == \"lively-window\"){\n      this.parentElement.remove()\n    } \n  }\n\n  async chooseFile(dir) {\n    if(!dir.match(/\\/$/) && await lively.files.isDirectory(dir)) {\n      dir = dir + \"/\" // ensure directories end with slash\n    }\n    this.root = dir\n    this.updateView()\n    \n    await promisedEvent(this, \"choose-file\")\n    return this.url\n  }\n\n  async chooseFiles(dir) {\n    await this.chooseFile(dir)\n    return this.getSelection()\n  }\n\n  async livelyExample() {\n    this.root = lively4url + \"/README.md\"\n  }\n  \n  \n}"]}