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

{#include base.html}

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

{#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}
