orchard
mirrorEvery site I host, in one repo, along with the Cloudflare Tunnel and Caddy that front them. It's all Go, Vite, and SQLite, and it runs on a desktop at home with nothing listening on an inbound port.
blogbuncaddycloudflare-tunneldockergogolanghomelabhtml-templatemonorepoself-hostedseosqlitestatic-sitetypstuptime-monitoringviteweb-analytics
1document.addEventListener("DOMContentLoaded", function () {
2 const dateRange = document.getElementById("date-range");
3 const dateStart = document.getElementById("date-start");
4 const dateEnd = document.getElementById("date-end");
5 if (!dateRange) return;
6
7 const url = new URL(window.location.href);
8 const date_range = url.searchParams.get("date_range");
9
10 if (date_range) {
11 dateRange.value = date_range;
12 }
13
14 dateRange.addEventListener("change", function () {
15 const date_range = parseInt(dateRange.value);
16 let dateEndValue = new Date();
17 let dateStartValue = new Date(dateEndValue.getTime() - date_range * 86400000);
18
19 dateEndValue = dateEndValue.toISOString().split("T")[0];
20 dateStartValue = dateStartValue.toISOString().split("T")[0];
21
22 dateEnd.value = dateEndValue;
23 dateStart.value = dateStartValue;
24
25 const form = dateRange.closest("form");
26 form.submit();
27 });
28
29 dateStart.addEventListener("change", function () {
30 if (dateStart.value && dateEnd.value) {
31 if (new Date(dateStart.value) > new Date(dateEnd.value)) {
32 const temp = dateStart.value;
33 dateStart.value = dateEnd.value;
34 dateEnd.value = temp;
35 }
36 dateRange.value = "custom";
37 const form = dateStart.closest("form");
38 form.submit();
39 }
40 });
41 dateEnd.addEventListener("change", function () {
42 if (dateStart.value && dateEnd.value) {
43 if (new Date(dateStart.value) > new Date(dateEnd.value)) {
44 const temp = dateStart.value;
45 dateStart.value = dateEnd.value;
46 dateEnd.value = temp;
47 }
48 dateRange.value = "custom";
49 const form = dateEnd.closest("form");
50 form.submit();
51 }
52 });
53});