aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/edit.js155
1 files changed, 155 insertions, 0 deletions
diff --git a/src/edit.js b/src/edit.js
new file mode 100644
index 0000000..6843fff
--- /dev/null
+++ b/src/edit.js
@@ -0,0 +1,155 @@
+import CodeMirror from "codemirror";
+import "codemirror/lib/codemirror.css";
+import "codemirror/mode/markdown/markdown";
+import "codemirror/mode/css/css"
+import "codemirror/mode/htmlmixed/htmlmixed"
+import "codemirror/mode/javascript/javascript"
+
+let form;
+let editors = [];
+let unsavedChanges = false;
+const inputEvent = new InputEvent('input');
+
+window.onload = () => {
+ form = document.getElementById('update');
+ let inputs = form.elements;
+ for (const input of inputs) {
+ input.oninput = changeHandler;
+ }
+
+ form.addEventListener("submit", function (event) {
+ event.preventDefault();
+ submitHandler(this);
+ });
+
+ delete CodeMirror.keyMap['default']["Ctrl-D"];
+
+ editors = [
+ CodeMirror.fromTextArea(document.getElementById('editmain'), {
+ mode: 'markdown',
+ lineNumbers: true,
+ }),
+ CodeMirror.fromTextArea(document.getElementById('editcss'), {
+ mode: 'css',
+ lineNumbers: true,
+ }),
+ CodeMirror.fromTextArea(document.getElementById('editheader'), {
+ mode: 'markdown',
+ lineNumbers: true,
+ }),
+ CodeMirror.fromTextArea(document.getElementById('editnav'), {
+ mode: 'markdown',
+ lineNumbers: true,
+ }),
+ CodeMirror.fromTextArea(document.getElementById('editaside'), {
+ mode: 'markdown',
+ lineNumbers: true,
+ }),
+ CodeMirror.fromTextArea(document.getElementById('editfooter'), {
+ mode: 'markdown',
+ lineNumbers: true,
+ }),
+ CodeMirror.fromTextArea(document.getElementById('editbody'), {
+ mode: 'htmlmixed',
+ lineNumbers: true,
+ }),
+ CodeMirror.fromTextArea(document.getElementById('editjavascript'), {
+ mode: 'javascript',
+ lineNumbers: true,
+ }),
+ ];
+ for (const editor of editors) {
+ editor.on('change', cmChangeHandler);
+ }
+
+ const fontSizeInput = document.getElementById('editfontsize');
+ fontSizeInput.addEventListener('change', fontSizeChangeHandler)
+ fontSizeInput.dispatchEvent(new Event('change'));
+
+ window.onkeydown = keyboardHandler;
+ window.onbeforeunload = confirmExit;
+};
+
+/**
+ * Manage a keyboardEvent
+ * @param {KeyboardEvent} e
+ */
+function keyboardHandler(e) {
+ if (e.composed) {
+ if (e.ctrlKey) {
+ switch (e.key) {
+ // ctrl + s
+ case 's':
+ submitHandler(form);
+ break;
+ // ctrl + d
+ case 'd':
+ const url = document.getElementById('update').getAttribute('href');
+ window.open(url);
+ break;
+ default:
+ return true;
+ }
+ e.preventDefault();
+ return false;
+ }
+ }
+}
+
+/**
+ * Manage change event
+ * @param {InputEvent} e
+ */
+function changeHandler(e) {
+ if(e.target.classList.contains("toggle")||e.target.classList.contains("checkboxtab")) {
+ return;
+ }
+ unsavedChanges = true;
+}
+
+/**
+ * Manage CodeMirror editor change event
+ * @param {CodeMirror.EditorFromTextArea} cm the CodeMirror instance
+ */
+function cmChangeHandler(cm){
+ let textArea = cm.getTextArea();
+ textArea.value = cm.getValue();
+ textArea.dispatchEvent(inputEvent);
+}
+
+function fontSizeChangeHandler(e) {
+ for (const editor of editors) {
+ const element = editor.getWrapperElement();
+ element.style.fontSize = `${e.target.value}px`;
+ editor.refresh();
+ }
+}
+
+/**
+ * Manage submit event
+ * @param {HTMLFormElement} form
+ */
+function submitHandler(form) {
+ var xhr = new XMLHttpRequest();
+ var fd = new FormData(form);
+
+ xhr.addEventListener("load", function(event) {
+ unsavedChanges = false;
+ alert("updated");
+ });
+ xhr.addEventListener("error", function(event) {
+ alert('Error while trying to update.');
+ });
+ xhr.open(form.method, form.action);
+ xhr.send(fd);
+}
+
+/**
+ * Manage a beforeUnloadEvent
+ * @param {BeforeUnloadEvent} e
+ */
+function confirmExit(e) {
+ if (unsavedChanges) {
+ return 'You have unsaved changes, do you really want to leave this page?';
+ }
+}