From 0c18689afd813e977e4c3b542886f5cb2678e80b Mon Sep 17 00:00:00 2001 From: Erik Brakkee Date: Sat, 10 Aug 2024 16:26:49 +0200 Subject: [PATCH] Generalized persistence of forms in separate js file. Some minor improvements to the usage instructions. --- pkg/server/templates/basepage.templ | 4 +- pkg/server/templates/usage.templ | 113 +++---------------------- static/js/custom.js | 4 +- static/js/modules.js | 4 + static/js/persistentforms.js | 123 ++++++++++++++++++++++++++++ 5 files changed, 143 insertions(+), 105 deletions(-) create mode 100644 static/js/modules.js create mode 100644 static/js/persistentforms.js diff --git a/pkg/server/templates/basepage.templ b/pkg/server/templates/basepage.templ index ea5f3d5..3822a33 100644 --- a/pkg/server/templates/basepage.templ +++ b/pkg/server/templates/basepage.templ @@ -24,7 +24,9 @@ templ BasePage(tab int) { - + + + Converge diff --git a/pkg/server/templates/usage.templ b/pkg/server/templates/usage.templ index c22fa53..82ed0c9 100644 --- a/pkg/server/templates/usage.templ +++ b/pkg/server/templates/usage.templ @@ -148,6 +148,14 @@ templ Usage(access models.ConvergeAccess) {

usage

+

+

    +
  1. Configure agent settings below
  2. +
  3. Copy paste the required commands for your agent
  4. +
  5. Copy paste the required commands for connecting to the remote shell on the agent through + Converge.
  6. +
+

+ hx-on::after-request="saveFormToCookieEvent(event)"> @@ -209,108 +218,6 @@ templ Usage(access models.ConvergeAccess) {
- - } diff --git a/static/js/custom.js b/static/js/custom.js index 06db985..9c2e8b1 100644 --- a/static/js/custom.js +++ b/static/js/custom.js @@ -1,2 +1,4 @@ -import './copy-to-clipboard.js'; \ No newline at end of file +import './persistentforms.js'; + + diff --git a/static/js/modules.js b/static/js/modules.js new file mode 100644 index 0000000..79b5535 --- /dev/null +++ b/static/js/modules.js @@ -0,0 +1,4 @@ + +import './copy-to-clipboard.js'; + + diff --git a/static/js/persistentforms.js b/static/js/persistentforms.js new file mode 100644 index 0000000..ab24734 --- /dev/null +++ b/static/js/persistentforms.js @@ -0,0 +1,123 @@ +function setCookie(name, value, days) { + let expires = ""; + if (days) { + const date = new Date(); + date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); + expires = "; expires=" + date.toUTCString(); + } + document.cookie = name + "=" + encodeURIComponent(value) + expires + "; path=/"; +} + +function getCookie(name) { + const nameEQ = name + "="; + const ca = document.cookie.split(';'); + for(let i=0; i < ca.length; i++) { + let c = ca[i]; + while (c.charAt(0)==' ') c = c.substring(1,c.length); + if (c.indexOf(nameEQ) == 0) return decodeURIComponent(c.substring(nameEQ.length,c.length)); + } + return null; +} + +function saveFormToCookie(form) { + const formData = new FormData(form); + for (let element of form.elements) { + if (element.id) { + //console.log("Saving " + element.id) + if (element.type === 'checkbox') { + //console.log("Checkbox " + element.checked) + setCookie(element.id, element.checked ? 'true' : 'false', 7); + } else if (element.type === 'radio') { + if (element.checked) { + //console.log("Set cookie " + element.id + " " + element.value) + setCookie(element.id, element.value, 7); + } else { + //console.log("Set cookie " + element.id + " EMPTY") + setCookie(element.id, "", 7) + } + } else { + setCookie(element.id, element.value, 7); + } + } + } +} + +function saveFormToCookieEvent(evt) { + //console.log("save form to cookie: " + evt.target) + form = evt.target + saveFormToCookie(form) +} + +function loadFormFromCookie(form) { + //console.log("Load form from cookie") + if (!form) { + return + } + let updated = false + for (let element of form.elements) { + if (element.id) { + const value = getCookie(element.id); + //console.log("Loading " + element.id + " value: " + value) + if (value !== null) { + if (element.type === 'checkbox') { + let newvalue = value === "true" + if (element.checked != newvalue) { + element.checked = newvalue + updated = true + } + } else if (element.type === 'radio') { + let newvalue = element.value === value + if (element.checked != newvalue) { + element.checked = newvalue; + updated = true + } + } else { + if (element.value != value) { + element.value = value; + updated = true + } + } + } + } + } + if (updated) { + htmx.trigger(form, 'formdataloaded') + } +} + +function getPersistentForms() { + return document.getElementsByClassName("persistent-form"); +} + +function loadFormsFromCookie() { + let forms = getPersistentForms(); + for (let i = 0; i < forms.length; i++) { + loadFormFromCookie(forms[i]) + } +} + +// Most likely not needed. +/* +( () => { + let forms = getPersistentForms() + for (let i = 0; i < forms.length; i++) { + forms[i].addEventListener('change', function() { + saveFormToCookie(form) + }) + } + })() +*/ + +htmx.on('htmx:load', function(event) { + //console.log("htmx:load") + loadFormsFromCookie(); +}); + +htmx.on('htmx:afterSettle', function(event) { + //console.log("htmx:afterSettle") + loadFormsFromCookie(); +}); + +// when hx-boost=false +// Load form data from cookie on page load +//document.addEventListener('DOMContentLoaded', loadFormFromCookie);