about summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--default.css5
-rw-r--r--events.c86
2 files changed, 71 insertions, 20 deletions
diff --git a/default.css b/default.css
index 609ad61..cc45711 100644
--- a/default.css
+++ b/default.css
@@ -42,7 +42,7 @@ nav {
 	flex-wrap: wrap;
 	align-items: center;
 	justify-content: space-between;
-	margin-bottom: 1.5em;
+	margin-bottom: 1em;
 }
 
 nav ol {
@@ -62,6 +62,7 @@ nav form {
 }
 
 table {
+	margin: 1em 0;
 	border-collapse: collapse;
 }
 tr {
@@ -105,7 +106,7 @@ tr.notice td.nick span::before, tr.notice td.nick span::after {
 footer {
 	font-size: 0.83em;
 	color: var(--dim);
-	margin-top: 1.5rem;
+	margin-top: 1rem;
 	display: flex;
 	flex-wrap: wrap;
 	justify-content: space-between;
diff --git a/events.c b/events.c
index 679a8af..89da92d 100644
--- a/events.c
+++ b/events.c
@@ -22,6 +22,72 @@
 
 #include "server.h"
 
+static enum kcgi_err redirect(struct kreq *req, struct Scope scope) {
+	struct tm *tm = gmtime(&(time_t) { time(NULL) });
+	if (!tm) err(EX_OSERR, "gmtime");
+
+	char time[sizeof("0000-00-00T00:00:00")];
+	strftime(time, sizeof(time), "%FT%T", tm);
+
+	char *url = khttp_urlpart(
+		NULL, NULL, Pages[Events],
+		Keys[Network].name, scope.network,
+		Keys[Context].name, scope.context,
+		Keys[Before].name, time,
+		NULL
+	);
+	enum kcgi_err error = httpRedirect(req, url);
+	free(url);
+	return error;
+}
+
+static enum kcgi_err
+dateForm(struct khtmlreq *html, struct Scope scope, const char *_time) {
+	struct tm tm = {0};
+	if (!strptime(_time, "%F", &tm)) {
+		struct tm *now = gmtime(&(time_t) { time(NULL) });
+		if (!now) err(EX_OSERR, "gmtime");
+		tm = *now;
+	}
+	char date[sizeof("0000-00-00")];
+	strftime(date, sizeof(date), "%F", &tm);
+	return 0
+		|| khtml_attr(
+			html, KELEM_FORM,
+			KATTR_METHOD, "get",
+			KATTR_ACTION, Pages[Events],
+			KATTR__MAX
+		)
+		|| khtml_attr(
+			html, KELEM_INPUT,
+			KATTR_TYPE, "hidden",
+			KATTR_NAME, Keys[Network].name,
+			KATTR_VALUE, scope.network,
+			KATTR__MAX
+		)
+		|| khtml_attr(
+			html, KELEM_INPUT,
+			KATTR_TYPE, "hidden",
+			KATTR_NAME, Keys[Context].name,
+			KATTR_VALUE, scope.context,
+			KATTR__MAX
+		)
+		|| khtml_attr(
+			html, KELEM_INPUT,
+			KATTR_TYPE, "date",
+			KATTR_NAME, Keys[After].name,
+			KATTR_VALUE, date,
+			KATTR__MAX
+		)
+		|| khtml_attr(
+			html, KELEM_INPUT,
+			KATTR_TYPE, "submit",
+			KATTR_VALUE, "Jump",
+			KATTR__MAX
+		)
+		|| khtml_closeelem(html, 1);
+}
+
 const char *EventsAfterQuery = SQL(
 	SELECT
 		events.event,
@@ -71,26 +137,9 @@ const char *EventsBeforeQuery = SQL(
 enum kcgi_err pageEvents(struct kreq *req) {
 	struct Scope scope = htmlScope(req);
 	if (!scope.network || !scope.context) return httpFail(req, KHTTP_400);
-
 	if (!req->fieldmap[After] && !req->fieldmap[Before]) {
-		struct tm *tm = gmtime(&(time_t) { time(NULL) });
-		if (!tm) err(EX_OSERR, "gmtime");
-
-		char time[sizeof("0000-00-00T00:00:00")];
-		strftime(time, sizeof(time), "%FT%T", tm);
-
-		char *url = khttp_urlpart(
-			NULL, NULL, Pages[Events],
-			Keys[Network].name, scope.network,
-			Keys[Context].name, scope.context,
-			Keys[Before].name, time,
-			NULL
-		);
-		enum kcgi_err error = httpRedirect(req, url);
-		free(url);
-		return error;
+		return redirect(req, scope);
 	}
-
 	const char *time = req->fieldmap[Before]
 		? req->fieldmap[Before]->parsed.s
 		: req->fieldmap[After]->parsed.s;
@@ -104,6 +153,7 @@ enum kcgi_err pageEvents(struct kreq *req) {
 		|| khtml_open(&html, req, KHTML_PRETTY)
 		|| htmlHead(&html, scope.context)
 		|| htmlNav(&html, scope)
+		|| dateForm(&html, scope, time)
 		|| khtml_elem(&html, KELEM_TABLE);
 	if (error) return error;