{@eu.mulk.mulkcms2.benki.wiki.WikiPageRevision page}

{#include base.html}

{#title}{page.title} &#8212; Benki Wiki{/title}

{#head}
<link rel="stylesheet" type="text/css" href="/web_modules/ContentTools/build/content-tools.min.css" />
<script type="module">
  import {ContentTools} from "/web_modules/ContentTools.js";

  window.addEventListener('DOMContentLoaded', function() {
    let editor = ContentTools.EditorApp.get();
    editor.init('*[data-editable]', 'data-name');

    editor.addEventListener('saved', async function (ev) {
      let regions = ev.detail().regions;
      if (Object.getOwnPropertyNames(regions).length === 0) {
        // Nothing changed.
        return;
      }

      this.busy(true);

      let requestParams = new URLSearchParams();
      for (let name of Object.getOwnPropertyNames(regions)) {
        requestParams.append(name, regions[name]);
      }

      let response = await fetch("/wiki/{page.title}", {
        method: 'POST',
        body: requestParams
      });

      let status = await response.json();
      if (status.status === "ok") {
        if (status.hasOwnProperty("content")) {
          document.getElementById("wiki-content").innerHTML = status.content;
        }
      } else {
        alert("Failed to save page: " + JSON.stringify(status));
      }

      this.busy(false);
    });
  });
</script>
{/head}

{#body}
<article id="wiki-page">
  <header>
    <div data-editable data-name="wiki-title">
      <h1>{page.title}</h1>
    </div>
  </header>

  <main>
    <div data-editable data-name="wiki-content" id="wiki-content">
      {#with page}{enrichedContent.raw}{/}
    </div>
  </main>

  <hr>

  <footer>
    <a href="/wiki/{page.title}/revisions">Page revisions</a>
  </footer>
</article>
{/body}

{/include}
