From 0c817cc0ae9a6e1b66d6e6ff45fa80bacabc58a9 Mon Sep 17 00:00:00 2001 From: Jesper Jensen Date: Sat, 21 Feb 2026 23:47:28 +0100 Subject: Parse the status closer to the database --- src/html.c | 68 ++++++++++++++++++++++++++++---------------------------------- 1 file changed, 31 insertions(+), 37 deletions(-) (limited to 'src/html.c') diff --git a/src/html.c b/src/html.c index b7fd4de..a848ebe 100644 --- a/src/html.c +++ b/src/html.c @@ -2,6 +2,7 @@ #include "mytime.h" #include +#include #include #include @@ -178,7 +179,6 @@ static void emit_stylesheet(FILE *f) { " .clients > a.stale { border-left: 3px solid var(--purple); padding-left: 11px; }\n" " .clients > a.stale .client-name { border-left: none; padding-left: 0; }\n" "}\n" - "/* BADGES */\n" ".badge { border: 1px solid; padding: 2px 7px; font-size: 10px; letter-spacing: 1px; justify-self: center; }\n" ".badge.ok { color: var(--green); background: var(--green-bg); border-color: var(--green-bor); }\n" ".badge.run { color: var(--yellow); background: var(--yellow-bg); border-color: var(--yellow-bor); }\n" @@ -282,7 +282,7 @@ static void emit_stylesheet(FILE *f) { " gap: 12px;\n" "}\n" ".backups > div > time { color: var(--hi); font-size: 13px; flex: 1; }\n" - ".backups > div > span { color: var(--dim); font-size: 12px; min-width: 70px; text-align: right; }\n" + ".backups > div > .duration { color: var(--dim); font-size: 12px; min-width: 70px; text-align: right; }\n" "\n" ); } @@ -298,22 +298,24 @@ static void mask_secret(const char *secret, char *out, size_t out_len) { } } -static const char *status_to_badge_class(const char *status) { - if (strcmp(status, "OK") == 0) return "ok"; - if (strcmp(status, "RUNNING") == 0) return "run"; - if (strcmp(status, "STALE") == 0) return "stale"; - if (strcmp(status, "INTERRUPTED") == 0) return "fail"; - if (strcmp(status, "FINISHED") == 0) return "ok"; - return ""; +static const char *status_to_badge_class(enum BackupStatus status) { + switch (status) { + case STATUS_RUNNING: return "run"; + case STATUS_INTERRUPTED: return "fail"; + case STATUS_FINISHED: return "ok"; + } + + abort(); } -static const char *status_to_display(const char *status) { - if (strcmp(status, "OK") == 0) return "OK"; - if (strcmp(status, "RUNNING") == 0) return "Running"; - if (strcmp(status, "STALE") == 0) return "Stale"; - if (strcmp(status, "INTERRUPTED") == 0) return "Failed"; - if (strcmp(status, "FINISHED") == 0) return "Done"; - return status; +static const char *status_to_display(enum BackupStatus status) { + switch (status) { + case STATUS_RUNNING: return "Running"; + case STATUS_INTERRUPTED: return "Failed"; + case STATUS_FINISHED: return "Done"; + } + + abort(); } char *html_render_clients_page(const struct Request *request, const struct ListClientResult *result, size_t *out_len) { @@ -386,7 +388,7 @@ char *html_render_clients_page(const struct Request *request, const struct ListC " %s\n" " %s\n" " %s\n" - " %s\n" + " %s\n" " View →\n" " \n", result->clients[i].id, @@ -413,13 +415,13 @@ char *html_render_clients_page(const struct Request *request, const struct ListC char *html_render_client_detail_page(const struct Request *request, const struct GetClientOnlyResult *client_result, const struct GetBackupsResult *backups_result, size_t *out_len) { // Determine status and staleness int is_stale = 0; - const char *current_status = "OK"; + enum BackupStatus current_status = 0; if (backups_result->backups_len > 0) { - const char *last_status = backups_result->backups[0].status; - if (strcmp(last_status, "RUNNING") == 0) { - current_status = "RUNNING"; - } else if (strcmp(last_status, "INTERRUPTED") == 0) { - current_status = "INTERRUPTED"; + enum BackupStatus last_status = backups_result->backups[0].status; + if (last_status == STATUS_RUNNING) { + current_status = STATUS_RUNNING; + } else if (last_status == STATUS_INTERRUPTED) { + current_status = STATUS_INTERRUPTED; } } @@ -449,7 +451,7 @@ char *html_render_client_detail_page(const struct Request *request, const struct " ← Back to clients\n" " \n" "

%s

\n" - "

%d backups %s

\n", + "

%d backups %s

\n", is_stale ? " class=\"stale\"" : "", client_result->name, backups_result->backups_len, @@ -485,34 +487,26 @@ char *html_render_client_detail_page(const struct Request *request, const struct fprintf(f, "

Recent Backups

\n"); if(backups_result->backups_len == 0) { + // @CLEANUP: Remove the inline style here fprintf(f, "

No backups recorded.

\n"); } else { fprintf(f, "
\n"); for (int i = 0; i < backups_result->backups_len; i++) { - const char *badge_class; - const char *badge_text; bool duration_valid = false; - if (strcmp(backups_result->backups[i].status, "RUNNING") == 0) { - badge_class = "run"; - badge_text = "Running"; - } else if (strcmp(backups_result->backups[i].status, "INTERRUPTED") == 0) { + if (backups_result->backups[i].status == STATUS_INTERRUPTED) { duration_valid = true; - badge_class = "fail"; - badge_text = "Failed"; } else { duration_valid = true; - badge_class = "ok"; - badge_text = "Done"; } struct timespec duration = time_sub(&backups_result->backups[i].completed, &backups_result->backups[i].started); fprintf(f, - "
%s%s
\n", + "
%s
\n", format_time(backups_result->backups[i].started).buf, duration_valid ? format_duration(duration).buf : "", - badge_class, - badge_text + status_to_badge_class(backups_result->backups[i].status), + status_to_display(backups_result->backups[i].status) ); } -- cgit v1.2.3