{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-markus/src/client/reactive/components/basic/node-ancestry-list.js"],"names":["Morph","NodeAncestryList","initialize","windowTitle","isMetaNode","parentElements","sourceEditor","lively","setExtent","pt","setPosition","hideToolbar","init","jsxRay","get","openBrowserForElementOrigin","ele","elementMetaData","sourceLocation","srcRange","success","openBrowser","warn","buildElementListFor","element","style","display","innerHTML","parentListElementByElement","Map","elementByParentListElement","allParents","reverse","filter","ShadowRoot","forEach","entry","buildAttribute","name","value","id","classes","classList","length","toString","localName","jsxCSSClass","jsx","aexpr","activeGroup","clickHandler","evt","shiftKey","ctrlKey","selectElement","container","innerSelect","selectElementForParentElementsList","appendChild","set","positionRightOf","subject","Array","from","children","div","remove","add","showHighlight","buildEditorFor","anchor","offset","toolsOrigin","getTotalGlobalBounds","rightCenter","addPt","subPt","getExtent","y","setGlobalPosition","location","file","getURLString","setURL","loadFile","currentEditor","scrollIntoView","line","start","ch","column","setSelection","end","scroll","hide"],"mappings":"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","file":"node-ancestry-list.js","sourcesContent":["\"enable aexpr\";\n\nimport Morph from 'src/components/widgets/lively-morph.js';\n\nexport default class NodeAncestryList extends Morph {\n  async initialize() {\n    this.windowTitle = \"NodeAncestryList\";\n\n    this.isMetaNode = true\n    this.parentElements.isMetaNode = true\n    this.sourceEditor.isMetaNode = true\n    \n    lively.setExtent(this.sourceEditor, lively.pt(600,150))\n    lively.setPosition(this.sourceEditor, lively.pt(0,200))\n    this.sourceEditor.hideToolbar();\n  }\n  \n  init(jsxRay) {\n    this.jsxRay = jsxRay;\n  }\n  \n  get parentElements() { return this.get('#parentElements'); }\n  get sourceEditor() { return this.get('#sourceEditor'); }\n\n  openBrowserForElementOrigin(ele) {\n    if (ele.elementMetaData && ele.elementMetaData.sourceLocation) {\n      const srcRange = ele.elementMetaData.sourceLocation;\n      lively.success('open!!');\n      lively.openBrowser(srcRange, true, srcRange);\n    } else {\n      lively.warn('no source');\n    }\n  }\n  buildElementListFor(element) {\n\n    this.parentElements.style.display = 'block';\n    this.parentElements.innerHTML = '';\n    \n    this.parentListElementByElement = new Map();\n    this.elementByParentListElement = new Map();\n    \n    [element, ...lively.allParents(element, [], true)]\n      .reverse()\n      .filter(ele => !(ele instanceof ShadowRoot))\n      .forEach(ele => {\n        let entry;\n\n        if (ele instanceof ShadowRoot) {\n          entry = <span class=\"element-shadow-root\">#shadow-root</span>;\n        } else {\n          function buildAttribute(name, value) {\n            return <span><span class=\"attribute-name\"> {name}</span><span class=\"attribute-syntax\">=</span><span class=\"attribute-value\">'{value}'</span></span>;\n          }\n          const id = ele.id ? buildAttribute('id', ele.id) : '';\n          const classes = ele.classList.length >= 1 ? buildAttribute('class', ele.classList.toString()) : '';\n\n          entry = <span><span class=\"element-tag\">&lt;{ele.localName}</span>{id}{classes}<span class=\"element-tag\">&gt;</span></span>;\n        }\n\n        let jsxCSSClass = '';\n        if (ele.elementMetaData) {\n          jsxCSSClass = 'element-meta-data ';\n\n          if (ele.elementMetaData.jsx) {\n            jsxCSSClass += 'jsx ';\n          }\n\n          if (ele.elementMetaData.aexpr) {\n            jsxCSSClass += 'active-expression ';\n          }\n\n          if (ele.elementMetaData.activeGroup) {\n            jsxCSSClass += 'active-group-item ';\n          }\n        }\n      \n        const clickHandler = evt => {\n          if (evt.shiftKey || evt.ctrlKey) {\n            this.openBrowserForElementOrigin(ele);\n          } else {\n            this.jsxRay.selectElement(ele);\n          }\n        }\n\n        const container = <div mouseenter={evt => {\n          this.innerSelect(ele)\n          this.selectElementForParentElementsList(ele)\n        }} click={clickHandler} class={jsxCSSClass}>{entry}</div>;\n        container.isMetaNode = true;\n        this.parentElements.appendChild(container);\n\n        this.parentListElementByElement.set(ele, container);\n        this.elementByParentListElement.set(container, ele);\n      })\n\n    this.positionRightOf(element, this.parentElements, lively.pt(30, 0));\n    \n    this.selectElementForParentElementsList(element);\n  }\n  \n  // #TODO: from hover\n  selectElementForParentElementsList(subject) {\n    Array.from(this.parentElements.children).forEach(div => {\n      div.classList.remove('selected-node');\n    })\n    const container = this.parentListElementByElement.get(subject);\n    if (container) {\n      container.classList.add('selected-node');\n    }\n    this.innerSelect(subject);\n  }\n  \n  innerSelect(element) {\n    this.jsxRay.showHighlight(element);\n    this.buildEditorFor(element);\n  }\n  \n  positionRightOf(anchor, element, offset = lively.pt(0, 0)) {\n    const toolsOrigin = lively.getTotalGlobalBounds(anchor)\n    let rightCenter = toolsOrigin.rightCenter()\n    rightCenter = rightCenter.addPt(offset)\n    rightCenter = rightCenter.subPt(lively.pt(0, lively.getExtent(element).y / 2))\n    lively.setGlobalPosition(element, rightCenter)\n  }\n  \n  async buildEditorFor(element) {\n    if (element.elementMetaData) {\n      const location = element.elementMetaData.sourceLocation;\n      \n      if (location.file !== this.sourceEditor.getURLString()) {\n        this.sourceEditor.setURL(location.file);\n        await this.sourceEditor.loadFile();\n      }\n      \n      this.sourceEditor.style.display = 'block';\n  \n      this.sourceEditor.currentEditor().scrollIntoView({\n        line: location.start.line - 1,\n        ch: location.start.column\n      }, 50);\n      \n      this.sourceEditor.currentEditor().setSelection({\n        line: location.start.line - 1,\n        ch: location.start.column\n      }, {\n        line: location.end.line - 1,\n        ch: location.end.column\n      }, { scroll: false });\n\n      // this case is for finding locations of web components\n      // it currently results in rendering issues by the browser, wierd issues O_o?\n//     } else if (element.localName.includes('-')) {\n//       const fileName = await lively.components.searchTemplateFilename(element.localName + '.js');\n\n//       if (!fileName) {\n//         this.sourceEditor.style.display = 'none';\n//         return;\n//       }\n//       if (fileName !== this.sourceEditor.getURLString()) {\n//         this.sourceEditor.setURL(fileName);\n//         await this.sourceEditor.loadFile();\n//       }\n        \n//       this.sourceEditor.style.display = 'block';\n\n//       this.sourceEditor.currentEditor().scrollIntoView({\n//         line: 0,\n//         ch: 0\n//       }, 50);\n\n    } else {\n      this.sourceEditor.style.display = 'none';\n    }\n\n    this.positionRightOf(this.parentElements, this.sourceEditor, lively.pt(5,   0));\n  }\n  \n  hide() {\n    this.sourceEditor.style.display = 'none';\n    this.parentElements.style.display = 'none';\n  }\n\n}"]}