timekeeper

[Abandoned unfinished] CGI web application in C for time tracking. (My first, just a learning project)
Log | Files | Refs | README

commit 36090048851cdf7e07ac53209d78429cb3a5f157
parent 3b59becd574888d4dce219fb6f4e1b4e337a62f7
Author: Jacob R. Edwards <jacob@jacobedwards.org>
Date:   Thu, 29 Feb 2024 20:15:06 -0800

Add timekeeping page

It's not much of anything right now. Just a paragraph with a number
which can be updated every second using JavaScript or simply reloaded
(which resets it to it's original value since there is no backend
yet).

Diffstat:
MMakefile | 4++++
Ascripts/main.js | 16++++++++++++++++
Mtimekeeper.c | 29+++++++++++++++++++++++++++++
3 files changed, 49 insertions(+), 0 deletions(-)

diff --git a/Makefile b/Makefile @@ -20,6 +20,9 @@ clean: rm -f ${name} ${name}.o ${obj} install: ${name} + mkdir -p ${prefix}/scripts + cp scripts/* ${prefix}/scripts + # Otherwise 'Text file is busy' pkill kfcgi || true cp -af ${name} ${prefix} @@ -27,6 +30,7 @@ install: ${name} uninstall: rm -f ${prefix}/${name} + rm -rf ${prefix}/scripts .PHONY: clean install uninstall .SUFFIX: .c .o diff --git a/scripts/main.js b/scripts/main.js @@ -0,0 +1,16 @@ +counter = document.querySelector("#counter") + +function updatetime() { + counter.textContent = String(Number(counter.textContent) + 1) + if (!document.hidden) + setTimeout(updatetime, 1000) +} + +<!-- +document.addEventListener("visibilitychange", () => { + if (!document.hidden) { + updatetime() +}); +--> + +updatetime() diff --git a/timekeeper.c b/timekeeper.c @@ -40,6 +40,7 @@ enum Page { PageLogin, PageLogout, PageAccount, + PageMain, Page404, PageMax }; @@ -71,6 +72,7 @@ static char *pages[] = { [PageLogin] = "login", [PageLogout] = "logout", [PageAccount] = "account", + [PageMain] = "main", [Page404] = "404" }; @@ -321,6 +323,9 @@ pageindex(struct pagedata *pd) if ((status = khtml_puts(&pd->html, " | ")) != KCGI_OK || (status = htmllink(pd, pages[PageAccount], "Manage account"))) return status; + if ((status = khtml_puts(&pd->html, " | ")) != KCGI_OK || + (status = htmllink(pd, pages[PageMain], "Timekeeper"))) + return status; } return khtml_close(&pd->html); @@ -523,6 +528,29 @@ pageaccount(struct pagedata *pd) return khtml_close(&pd->html); } +enum kcgi_err +pagemain(struct pagedata *pd) +{ + enum kcgi_err status; + struct user *user; + + user = sitegetlogin(pd); + if (!user) + return errorpage(pd, KHTTP_401); + + if ((status = khttp_head(&pd->req, kresps[KRESP_STATUS], "%s", khttps[KHTTP_200])) != KCGI_OK || + (status = khttp_head(&pd->req, kresps[KRESP_CONTENT_TYPE], "%s", kmimetypes[KMIME_TEXT_HTML])) != KCGI_OK || + (status = khttp_body(&pd->req))) + return status; + khttp_puts(&pd->req, "<!doctype html><html><head><title>Main</title></head><body><h1>Main</h1>" + "<noscript><a href=\".\">Reload</a></noscript>" + "<p id=\"counter\">0</p>" + "<script src=\"scripts/main.js\"></script>" + "</body></html>"); + freeuser(user); + return KCGI_OK; +} + int main(void) { @@ -554,6 +582,7 @@ main(void) [PageLogin] = pagelogin, [PageLogout] = pagelogout, [PageAccount] = pageaccount, + [PageMain] = pagemain, [Page404] = page404 };