{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-eslint/src/components/tools/lively-generic-search.js"],"names":["Morph","FileIndex","pt","LivelyGenericSearch","input","get","outer","inner","list","initialize","calculateListToShow","setupInput","init","evt","onKeyInput","inputChanged","startSearching","keyActions","Map","jumpToSelectedItem","remove","getOrCreate","keyCode","onUpDown","stopPropagation","preventDefault","currentItem","nextItem","getAllSubmorphs","onDownDown","item","container","openBrowser","getAttribute","setFocus","setPosition","getFiles","result","current","file","push","pattern","search","RegExp","filteredFiles","lively4url","relativePath","match","cutFiles","slice","updateList","filesToDisplay","forEach","name","regex","text","realResult","realStart","counter","exec","start","l","normal","substring","highlight","first","onKeyDown","livelyPreMigrate","livelyMigrate","other","livelyInspect","contentNode","inspector"],"mappings":"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","file":"lively-generic-search.js","sourcesContent":["\"enable aexpr\";\n\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport FileIndex from \"src/client/fileindex.js\";\nimport { pt } from 'src/client/graphics.js';\n\nexport default class LivelyGenericSearch extends Morph {\n  get input() { return this.get('#input'); }\n  get outer() { return this.get('#outer'); }\n  get inner() { return this.get('#inner'); }\n  get list() { return this.get('#list'); }\n  \n  // #TODO: mark as meta\n  async initialize() {\n    this.windowTitle = \"LivelyGenericSearch\";\n\n    this.startSearching = (() => this.calculateListToShow()).throttle(300);\n    this.setupInput();\n\n    lively.html.registerKeys(this); // automatically installs handler for some methods\n    \n    this.init()\n  }\n  \n  setupInput() {\n    this.input.addEventListener(\"keyup\", evt => {\n      this.onKeyInput(evt);\n    });\n    this.input.addEventListener('input', evt => this.inputChanged(evt));\n  }\n\n  inputChanged(evt) {\n    // lively.success('input is now ${this.input.value}', evt)\n    this.startSearching()\n  }\n  \n  onKeyInput(evt) {\n    const keyActions = new Map([\n      [13, evt => {\n        this.jumpToSelectedItem(evt);\n        this.remove();\n      }], // ENTER\n      [27, evt => this.remove()], // ESCAPE\n    ]);\n    \n    keyActions.getOrCreate(evt.keyCode, keyCode => evt => {})(evt);\n  }\n  \n  onUpDown(evt) {\n    evt.stopPropagation();\n    evt.preventDefault();\n\n    const currentItem = this.get('.selected')\n    if (!currentItem) { return; }\n    \n    const nextItem = currentItem.previousElementSibling || this.getAllSubmorphs('.item').last;\n    if(!nextItem) { return; }\n    \n    currentItem.classList.remove('selected')\n    nextItem.classList.add('selected')\n  }\n  onDownDown(evt) {\n    evt.stopPropagation();\n    evt.preventDefault();\n    \n    const currentItem = this.get('.selected')\n    if (!currentItem) { return; }\n    \n    var nextItem = currentItem.nextElementSibling || this.getAllSubmorphs('.item').first;\n    if(!nextItem) { return; }\n    \n    currentItem.classList.remove('selected')\n    nextItem.classList.add('selected')\n  }\n  \n  async jumpToSelectedItem(evt) {\n    const item = this.get('.selected')\n    if (item) {\n      const container = await lively.openBrowser(item.getAttribute('file'), !evt.shiftKey);\n      // lively.setGlobalPosition(container.parentElement, lively.getPosition(evt));\n    }\n  }\n  \n  setFocus() {\n    this.input.focus();\n  }\n  init() {\n    lively.setPosition(this, pt(500, 100), 'fixed')\n    this.files = this.getFiles();\n    this.startSearching();\n  }\n\n  async getFiles() {\n    var result = [];\n    await FileIndex.current().db.files.each(file => result.push(file));\n    return result;\n  }\n  \n  async calculateListToShow() {\n    var pattern = this.input.value;\n    var search = new RegExp(pattern, 'ig');\n\n    const filteredFiles = (await this.files).filter(file => {\n      if (file.url.startsWith(lively4url)) {\n        const relativePath = file.url.replace(/.*\\//ig, '');\n        return relativePath.match(search);\n      } else {\n        return false;\n      }\n    });\n    \n    const cutFiles = filteredFiles.slice(0, 50);\n    this.updateList(cutFiles);\n  }\n  async updateList(filesToDisplay) {\n    this.list.innerHTML = '';\n    filesToDisplay.forEach(file => {\n      const name = file.url.replace(lively4url, '')\n      \n      if (this.input.value.length >= 3) {\n        var regex = new RegExp(this.input.value, 'ig')\n        var text = name;\n        const realResult = [];\n        var result;\n        var realStart = 0\n        var counter = 0\n        while((result = regex.exec(text)) !== null) {\n          var start = result.index\n          var l = result[0].length\n\n          var normal = <span>{text.substring(realStart, start)}</span>\n          var highlight = <span style=\"color: red\">{result[0]}</span>\n              realResult.push(normal)\n              realResult.push(highlight)\n          realStart = start+l\n          if (counter++ > 10) {break;}\n        }\n        realResult.push(<span>{text.substring(realStart, text.length)}</span>)\n\n\n        this.list.appendChild(<div class=\"item\" file={file.url}><span>{...realResult}</span></div>); \n      } else {\n        this.list.appendChild(<div class=\"item\" file={file.url}><span>{name}</span></div>); \n      }\n    });\n    const first = this.list.querySelector('.item')\n    if (first) {\n      first.classList.add('selected');\n    }\n  }\n  \n  // this method is autmatically registered through the ``registerKeys`` method\n  onKeyDown(evt) {\n    // lively.notify(\"Key Down: \" + evt.charCode)\n  }\n  \n  livelyPreMigrate() {\n    // is called on the old object before the migration\n  }\n  \n  livelyMigrate(other) {\n    // whenever a component is replaced with a newer version during development\n    // this method is called on the new object during migration, but before initialization\n    this.input.value = other.input.value;\n    this.input.focus();\n  }\n  \n  livelyInspect(contentNode, inspector) {\n    // do nothing\n  }\n}"]}