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

{#include base.html}

{#title}{page.title} &#8212; Benki Wiki{/title}
{#siteSection}Wiki{/siteSection}
{#wikiClass}this-page{/wikiClass}

{#nav}{#navbar siteSection="Wiki" /}

{#head}
<link rel="stylesheet" type="text/css" href="/web_modules/ContentTools/build/content-tools.min.css" />
<script type="module" src="/web_modules/elix/define/ExpandablePanel.js" defer></script>

<style type="text/css">
  #warning-panel {
    background-color: lightcoral;
    font-style: italic;
  }
</style>

<script type="module" defer>
  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) {
      document.getElementById("warning-panel").close();

      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
      });

      if (!response.ok) {
        document.getElementById("warning-panel").open();
        document.getElementById("warning-text").innerText = "Failed to save page: " + response.statusText;
        this.busy(false);
        return;
      }

      let status = await response.json();
      if (status.status !== "ok") {
        document.getElementById("warning-panel").open();
        document.getElementById("warning-text").innerText = "Failed to save page: " + JSON.stringify(status);
        this.busy(false);
        return;
      }

      if (status.hasOwnProperty("content")) {
        document.getElementById("wiki-content").innerHTML = status.content;
      }

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

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

    <elix-expandable-panel id="warning-panel" role="alert"><div id="warning-text"></div></elix-expandable-panel>
  </header>

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

  <hr>

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

{/include}
