{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tom/templates/research-diary.js"],"names":["Morph","Graph","_","DEFAULT_FOLDER_URL","promisedEvent","debounce","sortBy","last","getTodaysTitle","Date","toFormattedString","ResearchDiary","codeEditor","get","currentEntryURL","getAttribute","url","setAttribute","initialize","windowTitle","windowIcon","prepareEditor","refreshList","addEventListener","createNewEntry","urlToLoad","graph","getInstance","entryKnot","requestKnot","loadEntry","editorComp","editorLoaded","editor","setOption","debouncedSetPreviewText","setPreviewText","debouncedSave","save","e","value","researchDiaryURL","entryOfURL","getEntries","researchDiaryKnot","entryOfKnot","query","map","triple","subject","getDateStringofEntry","entry","label","split","getEntriesSorted","getDateString","entries","reverse","selectFirstEntry","setTimeout","focusEditor","ul","innerHTML","forEach","a","appendChild","entryTemplate","setCursor","line","ch","execCommand","focus","content","setValue","immediatePreviewNoSave","newKnot","createKnot","createTriple","lively","notify","cancel","md","setContent","setDir","replace","followPath","openBrowser","text","getKnots","find","knot","livelyPrepareSave"],"mappings":"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","file":"research-diary.js","sourcesContent":["import 'lang';\n\nimport Morph from 'src/components/widgets/lively-morph.js';\n\nimport { Graph, _, DEFAULT_FOLDER_URL } from 'src/client/triples/triples.js';\nimport { promisedEvent, debounce, sortBy, last } from \"utils\";\n\nfunction getTodaysTitle() {\n  return 'Research-Diary Entry ' + new Date().toFormattedString('yyyy.MM.dd');\n}\n\nexport default class ResearchDiary extends Morph {\n  get codeEditor() { return this.get('#ace'); }\n  get currentEntryURL() { return this.getAttribute('data-current-entry-url'); }\n  set currentEntryURL(url) { this.setAttribute(\"data-current-entry-url\", url); return url; }\n  \n  async initialize() {\n    this.windowTitle = \"Research Diary\";\n    this.windowIcon = '<i class=\"fa fa-book\" aria-hidden=\"true\"></i>';\n\n    await this.prepareEditor();\n    await this.refreshList();\n\n    this.get('#new').addEventListener(\"click\", ::this.createNewEntry);\n    \n    const urlToLoad = this.currentEntryURL;\n    if (urlToLoad && urlToLoad !== \"\") {\n      const graph = await Graph.getInstance();\n      const entryKnot = await graph.requestKnot(urlToLoad);\n      this.loadEntry(entryKnot);\n    }\n    \n    // this.codeEditor.editor.navigateFileStart()\n  }\n  \n  async prepareEditor() {\n    const editorComp = this.codeEditor;\n\n    await editorComp.editorLoaded();\n    \n    // editorComp.editor.setOptions({\n    //   maxLines:Infinity,\n    // });\n    // editorComp.enableAutocompletion();\n    // editorComp.aceRequire('ace/ext/searchbox')\n\n    editorComp.editor.setOption(\"mode\", \"gfm\");\n    editorComp.editor.setOption(\"lineWrapping\", true);\n    \n    this.debouncedSetPreviewText = ::this.setPreviewText::debounce(600);\n    editorComp.addEventListener(\"change\" , this.debouncedSetPreviewText);\n    this.debouncedSave = ::this.save::debounce(2000);\n    editorComp.addEventListener(\"change\" , e => this.debouncedSave(this.codeEditor.value));\n  }\n  \n  get researchDiaryURL() { return DEFAULT_FOLDER_URL + \"Research_Diary.md\"; }\n  get entryOfURL() { return DEFAULT_FOLDER_URL + \"entry_of.md\"; }\n  async getEntries() {\n    const graph = await Graph.getInstance();\n    const researchDiaryKnot = await graph.requestKnot(this.researchDiaryURL);\n    const entryOfKnot = await graph.requestKnot(this.entryOfURL);\n\n    return graph.query(_, entryOfKnot, researchDiaryKnot).map(triple => triple.subject);\n  }\n  getDateStringofEntry(entry) {\n    return entry.label().split(' ')::last();\n  }\n  async getEntriesSorted() {\n    function getDateString(entry) {\n      return entry.label().split(' ')::last();\n    }\n\n    const entries = await this.getEntries();\n\n    return entries\n      ::sortBy(entry => this.getDateStringofEntry(entry))\n      .reverse();\n  }\n  async selectFirstEntry() {\n    const entries = await this.getEntriesSorted();\n    this.loadEntry(entries[0]);\n    setTimeout(() => this.focusEditor(), 100);\n  }\n  async refreshList() {\n    const ul = this.get('#nav ul');\n    ul.innerHTML = \"\";\n\n    const entries = await this.getEntriesSorted();\n    entries.forEach(entry => {\n      const a = <a>{this.getDateStringofEntry(entry)}</a>;\n      a.addEventListener('click', e => this.loadEntry(entry));\n\n      ul.appendChild(<li>{a}</li>);\n    });\n  }\n  \n  entryTemplate() {\n    return `# ${getTodaysTitle()}\n\n## Erkenntnisse\n\n- \n\n## MITs for Today\n\n- \n\n## Further Tasks\n\n- \n\n## Big Rocks (for the week)\n\n- \n`;\n  }\n  focusEditor() {\n    this.codeEditor.editor.setCursor({line: 8, ch: 0});\n    this.codeEditor.editor.execCommand(\"goLineEnd\")\n    this.codeEditor.editor.focus();\n  }\n  async createNewEntry() {\n    let content = this.entryTemplate();\n    \n    this.codeEditor.editor.setValue(content);\n    this.focusEditor();\n    \n    this.immediatePreviewNoSave();\n    \n    let graph = await Graph.getInstance();\n    let newKnot = await graph.createKnot(DEFAULT_FOLDER_URL, getTodaysTitle(), 'md');\n    this.currentEntryURL = newKnot.url;\n\n    await newKnot.save(content);\n    await graph.createTriple(newKnot.url, this.entryOfURL, this.researchDiaryURL, DEFAULT_FOLDER_URL);\n    \n    this.refreshList();\n    lively.notify(`Created new diary entry.`);\n  }\n  loadEntry(entryKnot) {\n    this.currentEntryURL = entryKnot.url;\n    \n    this.codeEditor.editor.setValue(entryKnot.content);    \n    this.immediatePreviewNoSave();\n  }\n  immediatePreviewNoSave() {\n    this.debouncedSave.cancel();\n    this.debouncedSetPreviewText.cancel();\n    this.setPreviewText();\n  }\n  setPreviewText() {\n    const md = this.get(\"#markdown\");\n    md.setContent(this.codeEditor.value);\n    \n    if(this.currentEntryURL) {\n      md.setDir(this.currentEntryURL.replace(/[^\\/]*$/, ''))\n      md.followPath = url => lively.openBrowser(url);\n    }\n  }\n  async save(text) {\n    let graph = await Graph.getInstance();\n    let entry = graph.getKnots().find(knot => knot.url === this.currentEntryURL)\n    if(entry) {      \n      await entry.save(text);\n      lively.notify('saved diary entry');\n    } else {\n      lively.notify(`No knot found for ${this.currentEntryURL}`);\n    }\n  }\n\n  livelyPrepareSave() {\n    //this.setAttribute(\"data-knot-url\", this.urlString);\n  }\n}\n"]}