{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-drawio/templates/knot-view.js"],"names":["Morph","Graph","Triple","_","TAG_URL","select","trackInstance","baseViewForClass","debounce","KnotView","urlString","get","tagURLString","initialize","pathToLoad","addEventListener","event","onPathEntered","editorComp","urlToLoad","getAttribute","loadKnotForURL","initAExprs","knotLabel","knot","altText","Function","label","success","graph","tag","requestKnot","URL","triples","filter","t","buildTableRowFor","buildMetadata","metadataTable","entries","getMetadata","entry","key","value","appendChild","buildNavigatableLinkFor","e","buildRefFor","buildTableDataFor","openInspector","undefined","triple","knot1","knot2","replaceTableBodyFor","selector","s","p","o","propForFirstCell","propForSecondCell","poTableBody","query","url","loadKnot","deleteKnot","urlList","getUrlsByKnot","isExternalLink","followURL","open","container","openBrowser","focus","preventDefault","stopPropagation","tagContainer","tagElement","buildTagWidget","addTag","evt","addTripleWithKnotAsSubject","addTripleWithKnotAsPredicate","addTripleWithKnotAsObject","buildContentFor","buildDeleteTagElement","deleteTagTriple","refresh","notify","elementToRemove","remove","createAddTriple","addTriple","openComponentInWindow","setField","buildListItemFor","role","removeEventListener","spoList","isTriple","hide","show","enableAutocompletion","urls","changeModeForFile","error","saveKnot","text","save","debouncedSave","element","path","livelyPrepareSave","setAttribute"],"mappings":"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","file":"knot-view.js","sourcesContent":["'enable aexpr';\n\nimport Morph from \"src/components/widgets/lively-morph.js\"\n\nimport { Graph, Triple, _, TAG_URL } from 'src/client/triples/triples.js';\nimport select, { trackInstance, baseViewForClass } from 'active-group';\n\nimport { debounce } from \"utils\";\n\nexport default class KnotView extends Morph {\n  get urlString() { return this.get(\"#path-to-load\").value; }\n  get tagURLString() { return TAG_URL; }\n  \n  async initialize() {\n    this.windowTitle = \"Knot View\";\n\n    var pathToLoad = this.get(\"#path-to-load\");\n    pathToLoad.addEventListener('keyup',  event => {\n      if (event.keyCode == 13) { // ENTER\n        this.onPathEntered(this.urlString);\n      }\n    });\n    \n    let editorComp = this.get('#content-editor');\n    // editorComp.editor.setOptions({maxLines:Infinity});\n\n    let urlToLoad = this.getAttribute('data-knot-url');\n    if (urlToLoad && urlToLoad !== \"\") {\n      this.loadKnotForURL(urlToLoad);\n    }\n    \n    this.initAExprs();\n  }\n  \n  knotLabel(knot, altText = \"no knot label available\") {\n    return knot &&\n      knot.label instanceof Function && \n      knot.label() || altText;\n  }\n  \n  async initAExprs() {\n    lively.success('setup aexprs');\n    \n    let graph = await Graph.getInstance();\n    let tag = await graph.requestKnot(new URL(TAG_URL));\n\n    this.get('#label-container')\n      .appendChild(<h1>{aexpr(() => this.knotLabel(this.knot))}</h1>);\n    \n    const triples = select(Triple);\n    \n    this.get('#r-po-table').appendChild(<tbody>{\n          ...triples\n            .filter(t => t.subject === this.knot)\n            .map(t => this.buildTableRowFor(t, t.predicate, t.object))\n        }</tbody>);\n    \n    this.get('#r-so-table').appendChild(<tbody>{\n          ...triples\n            .filter(t => t.predicate === this.knot)\n            .map(t => this.buildTableRowFor(t, t.subject, t.object))\n        }</tbody>);\n    \n    this.get('#r-sp-table').appendChild(<tbody>{\n          ...triples\n            .filter(t => t.object === this.knot)\n            .map(t => this.buildTableRowFor(t, t.subject, t.predicate))\n        }</tbody>);\n  }\n  \n  buildMetadata(knot) {\n    const metadataTable = this.get(\"#metadata-table\");\n    metadataTable.innerHTML = \"\";\n    \n    Object.entries(knot.getMetadata()).forEach(entry => {\n      const key = entry[0];\n      const value = entry[1];\n    // for (const [key, value] of Object.entries(knot.getMetadata())) {\n      metadataTable.appendChild(<tr>\n        <td>{key}</td>\n        <td>{value}</td>\n      </tr>);\n    // }\n    });\n  }\n  \n  buildNavigatableLinkFor(knot) {\n    return <a click={e => this.loadKnotForURL(knot.fileName)}>\n      {knot.label()}\n    </a>;\n  }\n  buildRefFor(knot) {\n    return this.buildNavigatableLinkFor(knot);\n  }\n  buildTableDataFor(knot) {\n    return <td>\n      {this.buildRefFor(knot)}\n      <i class=\"fa fa-search\" click={e => {\n        lively.openInspector(knot, undefined, knot.label());\n      }}></i>\n    </td>;\n  }\n  buildTableRowFor(triple, knot1, knot2) {\n    return <tr>\n      {this.buildTableDataFor(knot1)}\n      {this.buildTableDataFor(knot2)}\n      {this.buildTableDataFor(triple)}\n    </tr>;\n  }\n  async replaceTableBodyFor(selector, s, p, o, propForFirstCell, propForSecondCell) {\n    let graph = await Graph.getInstance();\n    let poTableBody = this.get(selector + ' tbody');\n    poTableBody.innerHTML = \"\";\n    graph.query(s, p, o).forEach(triple => {\n      poTableBody.appendChild(\n        this.buildTableRowFor(\n          triple,\n          triple[propForFirstCell],\n          triple[propForSecondCell]\n        )\n      );\n    });\n  }\n  \n  async loadKnotForURL(url) {\n    return this.loadKnot(url);\n  }\n  async loadKnot(url) {\n    let graph = await Graph.getInstance();\n    let knot = await graph.requestKnot(new URL(url));\n    this.knot = knot;\n    \n    this.get(\"#path-to-load\").value = knot.url;\n    \n    let deleteKnot = this.get('#delete-button');\n    deleteKnot.onclick = event => this.deleteKnot(event);\n\n    // URLs\n    let urlList = this.get(\"#url-list\");\n    urlList.innerHTML = \"\";\n    graph.getUrlsByKnot(knot).forEach(url => {\n      function isExternalLink(url) {\n        try {\n          return Graph.isExternalURL(new URL(url));\n        } catch(e) {\n          return false;\n        }\n      }\n      \n      async function followURL(e) {\n        if(isExternalLink(url)) {\n          window.open(url);\n        } else {\n          const container = await lively.openBrowser(url, false);\n          container.focus();\n        }\n        e.preventDefault();\n        e.stopPropagation();\n        return true;\n      }\n\n      urlList.appendChild(<li click={followURL}>\n        {isExternalLink(url) ?\n          url + '<i class=\"fa fa-external-link\"></i>' :\n          url\n        }\n      </li>);\n    });\n    \n    // Tags\n    let tag = await graph.requestKnot(new URL(TAG_URL));\n    let tagContainer = this.get('#tag-container');\n    tagContainer.innerHTML = \"\";\n    graph.query(knot, tag, _).forEach(triple => {\n      let tagElement = this.buildTagWidget(triple.object, triple);\n      tagContainer.appendChild(tagElement);\n    });\n    this.get('#add-tag').onclick = event => this.addTag(event);\n\n    // spo tables\n    // this.replaceTableBodyFor('#po-table', knot, _, _, 'predicate', 'object');\n    // this.replaceTableBodyFor('#so-table', _, knot, _, 'subject', 'object');\n    // this.replaceTableBodyFor('#sp-table', _, _, knot, 'subject', 'predicate');\n\n    // add button behavior\n    this.get('#r-add-triple-as-subject').onclick = evt => this.addTripleWithKnotAsSubject(evt);\n    this.get('#r-add-triple-as-predicate').onclick = evt => this.addTripleWithKnotAsPredicate(evt);\n    this.get('#r-add-triple-as-object').onclick = evt => this.addTripleWithKnotAsObject(evt);\n\n    // metadata\n    //this.buildMetadata(knot);\n    \n    // content\n    this.buildContentFor(knot);\n\n  }\n  \n  buildTagWidget(tag, triple) {\n    return <div>\n      {this.buildNavigatableLinkFor(tag)}\n      {this.buildDeleteTagElement(triple)}\n    </div>;\n  }\n  buildDeleteTagElement(triple) {\n    return <i class=\"fa fa-trash\" click={e => {\n      this.deleteTagTriple(triple);\n    }}></i>;\n  }\n  async deleteTagTriple(triple) {\n    const graph = await Graph.getInstance();\n    const knot = await graph.requestKnot(new URL(triple.fileName));\n    \n    if(await graph.deleteKnot(knot)) {\n      this.refresh();\n    } else {\n      lively.notify(`did not delete tag ${triple.object.fileName}`);\n    }\n  }\n\n  refresh() {\n    this.loadKnot(this.urlString);\n  }\n  async deleteKnot() {\n    const graph = await Graph.getInstance();\n    const knot = await graph.requestKnot(new URL(this.urlString));\n    \n    if(await graph.deleteKnot(knot)) {\n      const elementToRemove = this.parentElement.isWindow ? this.parentElement : this;\n      elementToRemove.remove();\n    } else {\n      lively.notify(`did not delete knot ${this.urlString}`);\n    }\n  }\n  \n  async createAddTriple() {\n    const addTriple = await lively.openComponentInWindow(\"add-triple\");\n    addTriple.afterSubmit = () => {\n      addTriple.parentElement.remove();\n      this.refresh();\n    }\n    return addTriple;\n  }\n  async addTag(event) {\n    const addTriple = await this.createAddTriple();\n\n    addTriple.setField('subject', this.urlString);\n    addTriple.setField('predicate', this.tagURLString);\n    addTriple.focus('object');\n  }\n  \n  async addTripleWithKnotAsSubject() {\n    const addTriple = await this.createAddTriple();\n\n    addTriple.setField('subject', this.urlString);\n    addTriple.focus('predicate');\n  }\n\n  async addTripleWithKnotAsPredicate() {\n    const addTriple = await this.createAddTriple();\n\n    addTriple.setField('predicate', this.urlString);\n    addTriple.focus('subject');\n  }\n\n  async addTripleWithKnotAsObject() {\n    const addTriple = await this.createAddTriple();\n\n    addTriple.setField('object', this.urlString);\n    addTriple.focus('subject');\n  }\n\n  buildListItemFor(knot, role) {\n    return <li>{role}: {this.buildRefFor(knot)}</li>;\n  }\n  async buildContentFor(knot) {\n    let editorComp = this.get('#content-editor');\n    lively.removeEventListener('knot-view-editor', editorComp, 'change');\n    let spoList = this.get('#spo-list');\n    if(knot.isTriple()) {\n      this.hide(editorComp);\n      this.show(spoList);\n      spoList.innerHTML = '';\n      spoList.appendChild(this.buildListItemFor(knot.subject, 'Subject'));\n      spoList.appendChild(this.buildListItemFor(knot.predicate, 'Predicate'));\n      spoList.appendChild(this.buildListItemFor(knot.object, 'Object'));\n    } else {\n      this.show(editorComp);\n      this.hide(spoList);\n      if (editorComp.value !== knot.content) {\n        editorComp.value = knot.content;\n      }\n      editorComp.enableAutocompletion();\n\n      let graph = await Graph.getInstance();\n      let urls = graph.getUrlsByKnot(knot);\n      if(urls.length >= 1) {\n        editorComp.changeModeForFile(urls[0]);\n      } else {\n        lively.error('no url found for ' + knot.label());\n      }\n      const saveKnot = async text => {\n        await knot.save(text);\n        lively.notify('saved knot')\n        // this.refresh();\n      }\n      editorComp.doSave = saveKnot;\n      const debouncedSave = (() => saveKnot(editorComp.value)).debounce(2000);\n      lively.addEventListener('knot-view-editor', editorComp, 'change', debouncedSave);\n    }\n  }\n  \n  hide(element) { element.style.display = \"none\"; }\n  show(element) { element.style.display = \"block\"; }\n\n  onPathEntered(path) {\n    this.loadKnotForURL(path);\n  }\n  \n  livelyPrepareSave() {\n    this.setAttribute(\"data-knot-url\", this.urlString);\n  }\n}\n"]}