29 lines
1.7 KiB
Text
29 lines
1.7 KiB
Text
|
|
<div data-bliss-ui>
|
||
|
|
<div class="mb-2 flex items-center justify-between border-b-4 border-double border-black pb-2"><strong><%= it.sourceRoute.verb %> <%= it.sourceRoute.path %></strong><span data-status class="text-xs"></span></div>
|
||
|
|
<% if (it.sourceRoute.verb !== "GET") { %>
|
||
|
|
<div class="mb-2 rounded border border-amber-600 bg-amber-950 p-2 text-amber-200">Rerunning this <%= it.sourceRoute.verb %> request can repeat writes or external side effects. Bliss will not rerun it automatically.</div>
|
||
|
|
<% } %>
|
||
|
|
<div data-source class="h-[55vh] w-full border-2 border-black"><%= it.sourceRoute.handler %></div>
|
||
|
|
<button data-save type="button" class="mt-2 border-2 border-black bg-white px-3 py-2 font-bold shadow-[3px_3px_0_#000] active:translate-x-0.5 active:translate-y-0.5 active:shadow-none">Save Route</button>
|
||
|
|
</div>
|
||
|
|
<script>
|
||
|
|
(function () {
|
||
|
|
const box = document.currentScript.previousElementSibling;
|
||
|
|
if (!box) return;
|
||
|
|
const editor = ace.edit(box.querySelector("[data-source]"));
|
||
|
|
editor.setTheme("ace/theme/monokai");
|
||
|
|
editor.session.setMode("ace/mode/javascript");
|
||
|
|
box.querySelector("[data-save]").onclick = async () => {
|
||
|
|
const status = box.querySelector("[data-status]");
|
||
|
|
status.textContent = "Saving…";
|
||
|
|
const response = await fetch("/workshop/<%= it.sourceRoute.structure_id %>/route/<%= it.sourceRoute.id %>", {
|
||
|
|
method: "PUT", headers: { "Content-Type": "application/json" },
|
||
|
|
body: JSON.stringify({ handler: editor.getValue() })
|
||
|
|
});
|
||
|
|
if (!response.ok) return void (status.textContent = "Save failed");
|
||
|
|
status.textContent = "Saved";
|
||
|
|
document.dispatchEvent(new CustomEvent("bliss:source-saved", { detail: { kind: "route", id: "<%= it.sourceRoute.id %>", method: "<%= it.sourceRoute.verb %>" } }));
|
||
|
|
};
|
||
|
|
})();
|
||
|
|
</script>
|