diff --git a/an_website/static/js/uptime/uptime.js.map b/an_website/static/js/uptime/uptime.js.map index d4bcd8df6..59fbfe5ad 100644 --- a/an_website/static/js/uptime/uptime.js.map +++ b/an_website/static/js/uptime/uptime.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../../uptime/uptime.ts"], - "sourcesContent": ["// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-3.0-or-later\nexport { };\n\nconst UPTIME_STRING = \"uptime\";\n\nconst currentTimeInSeconds = () => (performance.now() / 1000);\nconst floor = Math.floor;\n\nconst startDisplayingUptime = () => {\n const uptimeDiv = document.getElementById(UPTIME_STRING) as HTMLDivElement;\n // set the font family, because it looks much better\n uptimeDiv.style.fontFamily = \"clock-face,monospace\";\n // the time the website got loaded minus the uptime\n const startTime = currentTimeInSeconds() - Number(\n uptimeDiv.getAttribute(UPTIME_STRING)!,\n );\n\n const displayUptime = () => {\n // the uptime: currentTime - (startTime - uptime at start)\n // time on website + uptime at start\n const uptime = floor(currentTimeInSeconds() - startTime);\n // display uptime:\n const div_60 = floor(uptime / 60);\n const div_60_60 = floor(div_60 / 60);\n uptimeDiv.innerText = [\n div_60_60 / 24, // days\n div_60_60 % 24, // hours\n div_60 % 60, // minutes\n uptime % 60, // seconds\n ]\n .map((n: number) => (floor(n) as unknown as string + \"\").padStart(2, \"0\"))\n .join(\":\");\n uptimeDiv.setAttribute(UPTIME_STRING, uptime as unknown as string);\n };\n\n displayUptime();\n setInterval(displayUptime, 1000);\n};\n\nstartDisplayingUptime();\n"], - "mappings": "AAAA;AAGA,IAAMA,EAAgB,SAEhBC,EAAuB,IAAO,YAAY,IAAI,EAAI,IAClDC,EAAQ,KAAK,MAEbC,EAAwB,IAAM,CAChC,IAAMC,EAAY,SAAS,eAAeJ,CAAa,EAEvDI,EAAU,MAAM,WAAa,uBAE7B,IAAMC,EAAYJ,EAAqB,EAAI,OACvCG,EAAU,aAAaJ,CAAa,CACxC,EAEMM,EAAgB,IAAM,CAGxB,IAAMC,EAASL,EAAMD,EAAqB,EAAII,CAAS,EAEjDG,EAASN,EAAMK,EAAS,EAAE,EAC1BE,EAAYP,EAAMM,EAAS,EAAE,EACnCJ,EAAU,UAAY,CAClBK,EAAY,GACZA,EAAY,GACZD,EAAS,GACTD,EAAS,EACb,EACK,IAAKG,IAAeR,EAAMQ,CAAC,EAAyB,IAAI,SAAS,EAAG,GAAG,CAAC,EACxE,KAAK,GAAG,EACbN,EAAU,aAAaJ,EAAeO,CAA2B,CACrE,EAEAD,EAAc,EACd,YAAYA,EAAe,GAAI,CACnC,EAEAH,EAAsB", + "sourcesContent": ["// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-3.0-or-later\nexport {};\n\nconst UPTIME_STRING = \"uptime\";\n\nconst currentTimeInSeconds = () => (performance.now() / 1000);\nconst floor = Math.floor;\n\nconst startDisplayingUptime = () => {\n const uptimeDiv = document.getElementById(UPTIME_STRING) as HTMLDivElement;\n // set the font family, because it looks much better\n uptimeDiv.style.fontFamily = \"clock-face,monospace\";\n // the time the website got loaded minus the uptime\n const startTime = currentTimeInSeconds() - Number(\n uptimeDiv.getAttribute(UPTIME_STRING)!,\n );\n\n const displayUptime = () => {\n // the uptime: currentTime - (startTime - uptime at start)\n // time on website + uptime at start\n const uptime = floor(currentTimeInSeconds() - startTime);\n // display uptime:\n const div_60 = floor(uptime / 60);\n const div_60_60 = floor(div_60 / 60);\n uptimeDiv.innerText = [\n div_60_60 / 24, // days\n div_60_60 % 24, // hours\n div_60 % 60, // minutes\n uptime % 60, // seconds\n ]\n .map((n: number) =>\n (floor(n) as unknown as string + \"\").padStart(2, \"0\")\n )\n .join(\":\");\n uptimeDiv.setAttribute(UPTIME_STRING, uptime as unknown as string);\n };\n\n displayUptime();\n setInterval(displayUptime, 1000);\n};\n\nstartDisplayingUptime();\n"], + "mappings": "AAAA;AAGA,IAAMA,EAAgB,SAEhBC,EAAuB,IAAO,YAAY,IAAI,EAAI,IAClDC,EAAQ,KAAK,MAEbC,EAAwB,IAAM,CAChC,IAAMC,EAAY,SAAS,eAAeJ,CAAa,EAEvDI,EAAU,MAAM,WAAa,uBAE7B,IAAMC,EAAYJ,EAAqB,EAAI,OACvCG,EAAU,aAAaJ,CAAa,CACxC,EAEMM,EAAgB,IAAM,CAGxB,IAAMC,EAASL,EAAMD,EAAqB,EAAII,CAAS,EAEjDG,EAASN,EAAMK,EAAS,EAAE,EAC1BE,EAAYP,EAAMM,EAAS,EAAE,EACnCJ,EAAU,UAAY,CAClBK,EAAY,GACZA,EAAY,GACZD,EAAS,GACTD,EAAS,EACb,EACK,IAAKG,IACDR,EAAMQ,CAAC,EAAyB,IAAI,SAAS,EAAG,GAAG,CACxD,EACC,KAAK,GAAG,EACbN,EAAU,aAAaJ,EAAeO,CAA2B,CACrE,EAEAD,EAAc,EACd,YAAYA,EAAe,GAAI,CACnC,EAEAH,EAAsB", "names": ["UPTIME_STRING", "currentTimeInSeconds", "floor", "startDisplayingUptime", "uptimeDiv", "startTime", "displayUptime", "uptime", "div_60", "div_60_60", "n"] } diff --git a/an_website/static/js/utils/utils.js.map b/an_website/static/js/utils/utils.js.map index 51939ab7d..da44a4011 100644 --- a/an_website/static/js/utils/utils.js.map +++ b/an_website/static/js/utils/utils.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../../utils/better_ui_.ts", "../../../utils/utils.ts"], - "sourcesContent": ["// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-3.0-or-later\nconst d = document;\n\ntype EventHandler = (\n event: HTMLElementEventMap[T],\n) => unknown;\nconst addEventListener = (\n element: HTMLElement,\n type: T,\n fun: EventHandler,\n) => {\n element.addEventListener(type, fun);\n};\n\ntype DocumentEventHandler = (\n event: DocumentEventMap[T],\n) => unknown;\nconst addDocumentEventListener = (\n type: T,\n fun: DocumentEventHandler,\n) => {\n d.addEventListener(type, fun);\n};\n\nconst openPane = d.getElementById(\"open-pane\");\nconst sitePane = d.getElementById(\"site-pane\");\n\nif (!openPane || !sitePane) {\n throw Error(\"open-pane or site-pane not found\");\n}\n\nconst setSitePaneState = (state: \"open\" | \"close\") => {\n console.debug(`${state} sitePane`);\n sitePane.setAttribute(\"state\", state);\n};\n\nexport const showSitePane = () => { setSitePaneState(\"open\") };\nexport const hideSitePane = () => { setSitePaneState(\"close\") };\n\nconst belongsToSitePane = (el: HTMLElement) => (\n el === openPane || el === sitePane || sitePane.contains(el)\n);\n\n// mouse users\naddEventListener(openPane, \"mouseover\", showSitePane);\naddEventListener(openPane, \"mouseleave\", hideSitePane);\n\n// keyboard users\naddDocumentEventListener(\"focusin\", (event) => {\n if (belongsToSitePane(event.target as HTMLElement)) {\n console.debug(\"showing site pane because of focus event\", event);\n showSitePane();\n } else {\n console.debug(\"hiding site pane because of focus event\", event);\n hideSitePane();\n }\n});\naddDocumentEventListener(\"focusout\", (event) => {\n if (belongsToSitePane(event.target as HTMLElement)) {\n console.debug(\"hiding site pane because of blur event\", event);\n hideSitePane();\n } else {\n console.debug(\"blur event\", event);\n }\n});\n\n// phone users\naddEventListener(openPane, \"click\", showSitePane);\naddDocumentEventListener(\"click\", (event) => {\n if (!belongsToSitePane(event.target as HTMLElement)) {\n hideSitePane();\n }\n});\n\n// swipe gestures (for phone users)\nconst startPos: { x: number | null; y: number | null } = {\n x: null,\n y: null,\n};\naddDocumentEventListener(\"touchstart\", (event) => {\n // save start pos of touch\n startPos.x = event.touches[0]?.clientX ?? null;\n startPos.y = event.touches[0]?.clientY ?? null;\n});\naddDocumentEventListener(\"touchmove\", (event) => {\n if (startPos.x === null || startPos.y === null) {\n return;\n }\n // calculate difference\n const diffX = startPos.x - (event.touches[0]?.clientX ?? 0);\n const diffY = startPos.y - (event.touches[0]?.clientY ?? 0);\n\n // early return if just clicked, not swiped\n if (diffX === 0 && diffY === 0) {\n return;\n }\n\n // reset start pos\n startPos.x = null;\n startPos.y = null;\n\n const minDiffX = Math.max(12, 0.01 * screen.width, diffY * 1.5);\n\n console.debug({ diffX, minDiffX });\n\n if (Math.abs(diffX) >= minDiffX) {\n if (diffX > 0) {\n showSitePane();\n } else {\n hideSitePane();\n }\n }\n});\n", "export { hideSitePane /*, showSitePane */ } from \"./better_ui_.js\";\n\nexport const d = document;\nfunction getElementById(id: string): HTMLElement | null {\n return d.getElementById(id);\n}\nexport const e = getElementById;\n\nlet lastLocation = String(location);\n\n// export function getLastLocation(): string { return lastLocation; }\n\nexport function setLastLocation(url: string): void {\n lastLocation = url;\n}\n\nexport function post(\n url: string,\n params = {},\n ondata = console.log,\n onerror: (data: unknown) => void = console.error,\n accept = \"application/json\",\n): Promise {\n return fetch(url, {\n method: \"POST\",\n body: JSON.stringify(params),\n headers: {\n \"Accept\": accept,\n \"Content-Type\": \"application/json\",\n },\n })\n .then((response) => response.json())\n .catch(onerror)\n .then(ondata)\n .catch(onerror);\n}\n\nexport function get(\n url: string,\n params: Record | string = {},\n ondata = console.log,\n onerror: (data: unknown) => void = console.error,\n accept = \"application/json\",\n): Promise {\n const paramsString = (new URLSearchParams(params)).toString();\n return fetch(paramsString ? `${url}?${paramsString}` : url, {\n method: \"GET\",\n headers: { Accept: accept },\n })\n .then(\n (response) => response.json(),\n )\n .catch(onerror)\n .then(ondata)\n .catch(onerror);\n}\n\nexport const PopStateHandlers: Record<\n string,\n (state: PopStateEvent) => unknown\n> = {\n // always reload the location if URLParamChange\n URLParamChange: () => {\n location.reload();\n },\n};\n\nexport function setURLParam(\n param: string,\n value: string,\n state: unknown,\n stateType = \"URLParamChange\",\n push = true,\n) {\n return setMultipleURLParams([[param, value]], state, stateType, push);\n}\n\nexport function setMultipleURLParams(\n params: [string, string][],\n state: unknown,\n stateType = \"URLParamChange\",\n push = true,\n) {\n // log(\"setURLParam\", param, value, state, onpopstate);\n const urlParams = new URLSearchParams(location.search);\n for (const [param, value] of params) {\n urlParams.set(param, value);\n }\n const newUrl =\n `${location.origin}${location.pathname}?${urlParams.toString()}`;\n // log(\"newUrl\", newUrl);\n (state as { stateType: string }).stateType = stateType;\n if (push && newUrl !== location.href) {\n history.pushState(state, newUrl, newUrl);\n } else {\n history.replaceState(state, newUrl, newUrl);\n }\n lastLocation = location.href;\n return newUrl;\n}\n\nfunction scrollToId() {\n if (location.hash === \"\") {\n return;\n }\n const header = getElementById(\"header\");\n if (!header) {\n return;\n }\n const el = d.querySelector(location.hash);\n if (!el) {\n return;\n }\n\n scrollBy(\n 0,\n el.getBoundingClientRect().top - Math.floor(\n parseFloat(getComputedStyle(header).height),\n ),\n );\n}\n// scroll after few ms so the scroll is right on page load\nsetTimeout(scrollToId, 4);\nwindow.onhashchange = scrollToId;\n\nwindow.onpopstate = (event: PopStateEvent) => {\n if (lastLocation.split(\"#\")[0] === location.href.split(\"#\")[0]) {\n // Only hash changed\n lastLocation = location.href;\n scrollToId();\n return;\n }\n if (event.state) {\n const state = event.state as { stateType: string };\n const stateHandler = PopStateHandlers[state.stateType];\n if (stateHandler) {\n event.preventDefault();\n stateHandler(event);\n lastLocation = location.href;\n scrollToId();\n return;\n } else {\n console.error(\"Couldn't find state handler for state\", state);\n }\n }\n\n console.error(\"Couldn't handle state. \", event.state);\n lastLocation = location.href;\n location.reload();\n};\n"], - "mappings": "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", + "sourcesContent": ["// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-3.0-or-later\nconst d = document;\n\ntype EventHandler = (\n event: HTMLElementEventMap[T],\n) => unknown;\nconst addEventListener = (\n element: HTMLElement,\n type: T,\n fun: EventHandler,\n) => {\n element.addEventListener(type, fun);\n};\n\ntype DocumentEventHandler = (\n event: DocumentEventMap[T],\n) => unknown;\nconst addDocumentEventListener = (\n type: T,\n fun: DocumentEventHandler,\n) => {\n d.addEventListener(type, fun);\n};\n\nconst openPane = d.getElementById(\"open-pane\");\nconst sitePane = d.getElementById(\"site-pane\");\n\nif (!openPane || !sitePane) {\n throw Error(\"open-pane or site-pane not found\");\n}\n\nconst setSitePaneState = (state: \"open\" | \"close\") => {\n console.debug(`${state} sitePane`);\n sitePane.setAttribute(\"state\", state);\n};\n\nexport const showSitePane = () => {\n setSitePaneState(\"open\");\n};\nexport const hideSitePane = () => {\n setSitePaneState(\"close\");\n};\n\nconst belongsToSitePane = (el: HTMLElement) => (\n el === openPane || el === sitePane || sitePane.contains(el)\n);\n\n// mouse users\naddEventListener(openPane, \"mouseover\", showSitePane);\naddEventListener(openPane, \"mouseleave\", hideSitePane);\n\n// keyboard users\naddDocumentEventListener(\"focusin\", (event) => {\n if (belongsToSitePane(event.target as HTMLElement)) {\n console.debug(\"showing site pane because of focus event\", event);\n showSitePane();\n } else {\n console.debug(\"hiding site pane because of focus event\", event);\n hideSitePane();\n }\n});\naddDocumentEventListener(\"focusout\", (event) => {\n if (belongsToSitePane(event.target as HTMLElement)) {\n console.debug(\"hiding site pane because of blur event\", event);\n hideSitePane();\n } else {\n console.debug(\"blur event\", event);\n }\n});\n\n// phone users\naddEventListener(openPane, \"click\", showSitePane);\naddDocumentEventListener(\"click\", (event) => {\n if (!belongsToSitePane(event.target as HTMLElement)) {\n hideSitePane();\n }\n});\n\n// swipe gestures (for phone users)\nconst startPos: { x: number | null; y: number | null } = {\n x: null,\n y: null,\n};\naddDocumentEventListener(\"touchstart\", (event) => {\n // save start pos of touch\n startPos.x = event.touches[0]?.clientX ?? null;\n startPos.y = event.touches[0]?.clientY ?? null;\n});\naddDocumentEventListener(\"touchmove\", (event) => {\n if (startPos.x === null || startPos.y === null) {\n return;\n }\n // calculate difference\n const diffX = startPos.x - (event.touches[0]?.clientX ?? 0);\n const diffY = startPos.y - (event.touches[0]?.clientY ?? 0);\n\n // early return if just clicked, not swiped\n if (diffX === 0 && diffY === 0) {\n return;\n }\n\n // reset start pos\n startPos.x = null;\n startPos.y = null;\n\n const minDiffX = Math.max(12, 0.01 * screen.width, diffY * 1.5);\n\n console.debug({ diffX, minDiffX });\n\n if (Math.abs(diffX) >= minDiffX) {\n if (diffX > 0) {\n showSitePane();\n } else {\n hideSitePane();\n }\n }\n});\n", "export { hideSitePane /*, showSitePane */ } from \"./better_ui_.js\";\n\nexport const d = document;\nfunction getElementById(id: string): HTMLElement | null {\n return d.getElementById(id);\n}\nexport const e = getElementById;\n\nlet lastLocation = String(location);\n\n// export function getLastLocation(): string { return lastLocation; }\n\nexport function setLastLocation(url: string): void {\n lastLocation = url;\n}\n\nexport function post(\n url: string,\n params = {},\n ondata = console.log,\n onerror: (data: unknown) => void = console.error,\n accept = \"application/json\",\n): Promise {\n return fetch(url, {\n method: \"POST\",\n body: JSON.stringify(params),\n headers: {\n \"Accept\": accept,\n \"Content-Type\": \"application/json\",\n },\n })\n .then((response) => response.json())\n .catch(onerror)\n .then(ondata)\n .catch(onerror);\n}\n\nexport function get(\n url: string,\n params: Record | string = {},\n ondata = console.log,\n onerror: (data: unknown) => void = console.error,\n accept = \"application/json\",\n): Promise {\n const paramsString = (new URLSearchParams(params)).toString();\n return fetch(paramsString ? `${url}?${paramsString}` : url, {\n method: \"GET\",\n headers: { Accept: accept },\n })\n .then(\n (response) => response.json(),\n )\n .catch(onerror)\n .then(ondata)\n .catch(onerror);\n}\n\nexport const PopStateHandlers: Record<\n string,\n (state: PopStateEvent) => unknown\n> = {\n // always reload the location if URLParamChange\n URLParamChange: () => {\n location.reload();\n },\n};\n\nexport function setURLParam(\n param: string,\n value: string,\n state: unknown,\n stateType = \"URLParamChange\",\n push = true,\n) {\n return setMultipleURLParams([[param, value]], state, stateType, push);\n}\n\nexport function setMultipleURLParams(\n params: [string, string][],\n state: unknown,\n stateType = \"URLParamChange\",\n push = true,\n) {\n // log(\"setURLParam\", param, value, state, onpopstate);\n const urlParams = new URLSearchParams(location.search);\n for (const [param, value] of params) {\n urlParams.set(param, value);\n }\n const newUrl =\n `${location.origin}${location.pathname}?${urlParams.toString()}`;\n // log(\"newUrl\", newUrl);\n (state as { stateType: string }).stateType = stateType;\n if (push && newUrl !== location.href) {\n history.pushState(state, newUrl, newUrl);\n } else {\n history.replaceState(state, newUrl, newUrl);\n }\n lastLocation = location.href;\n return newUrl;\n}\n\nfunction scrollToId() {\n if (location.hash === \"\") {\n return;\n }\n const header = getElementById(\"header\");\n if (!header) {\n return;\n }\n const el = d.querySelector(location.hash);\n if (!el) {\n return;\n }\n\n scrollBy(\n 0,\n el.getBoundingClientRect().top - Math.floor(\n parseFloat(getComputedStyle(header).height),\n ),\n );\n}\n// scroll after few ms so the scroll is right on page load\nsetTimeout(scrollToId, 4);\nwindow.onhashchange = scrollToId;\n\nwindow.onpopstate = (event: PopStateEvent) => {\n if (lastLocation.split(\"#\")[0] === location.href.split(\"#\")[0]) {\n // Only hash changed\n lastLocation = location.href;\n scrollToId();\n return;\n }\n if (event.state) {\n const state = event.state as { stateType: string };\n const stateHandler = PopStateHandlers[state.stateType];\n if (stateHandler) {\n event.preventDefault();\n stateHandler(event);\n lastLocation = location.href;\n scrollToId();\n return;\n } else {\n console.error(\"Couldn't find state handler for state\", state);\n }\n }\n\n console.error(\"Couldn't handle state. \", event.state);\n lastLocation = location.href;\n location.reload();\n};\n"], + "mappings": "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", "names": ["d", "addEventListener", "element", "type", "fun", "addDocumentEventListener", "openPane", "sitePane", "setSitePaneState", "state", "showSitePane", "hideSitePane", "belongsToSitePane", "el", "event", "startPos", "_a", "_b", "_c", "_d", "diffX", "diffY", "minDiffX", "d", "getElementById", "id", "e", "lastLocation", "setLastLocation", "url", "post", "params", "ondata", "onerror", "accept", "response", "get", "paramsString", "PopStateHandlers", "setURLParam", "param", "value", "state", "stateType", "push", "setMultipleURLParams", "urlParams", "newUrl", "scrollToId", "header", "el", "event", "stateHandler"] } diff --git a/an_website/uptime/uptime.ts b/an_website/uptime/uptime.ts index 4db5362fb..f1d81797b 100644 --- a/an_website/uptime/uptime.ts +++ b/an_website/uptime/uptime.ts @@ -1,5 +1,5 @@ // @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-3.0-or-later -export { }; +export {}; const UPTIME_STRING = "uptime"; @@ -28,7 +28,9 @@ const startDisplayingUptime = () => { div_60 % 60, // minutes uptime % 60, // seconds ] - .map((n: number) => (floor(n) as unknown as string + "").padStart(2, "0")) + .map((n: number) => + (floor(n) as unknown as string + "").padStart(2, "0") + ) .join(":"); uptimeDiv.setAttribute(UPTIME_STRING, uptime as unknown as string); }; diff --git a/an_website/utils/better_ui_.ts b/an_website/utils/better_ui_.ts index 080e13815..438f857fa 100644 --- a/an_website/utils/better_ui_.ts +++ b/an_website/utils/better_ui_.ts @@ -34,8 +34,12 @@ const setSitePaneState = (state: "open" | "close") => { sitePane.setAttribute("state", state); }; -export const showSitePane = () => { setSitePaneState("open") }; -export const hideSitePane = () => { setSitePaneState("close") }; +export const showSitePane = () => { + setSitePaneState("open"); +}; +export const hideSitePane = () => { + setSitePaneState("close"); +}; const belongsToSitePane = (el: HTMLElement) => ( el === openPane || el === sitePane || sitePane.contains(el)