aboutsummaryrefslogtreecommitdiff
path: root/clients/ui.h
diff options
context:
space:
mode:
authorAnders Betts <anders.betts@gmail.com>2026-09-20 22:00:01 +0200
committerAnders Betts <anders.betts@gmail.com>2026-09-20 22:00:01 +0200
commit10a535ace098144980d0ffd1593f6384c39cc221 (patch)
tree53a7c6c5026d479c4b6d5fd4e5b341474cd190fa /clients/ui.h
parent3a5a6d3b04dc4e17a42225afb243eecb3502ead6 (diff)
downloadbokf-10a535ace098144980d0ffd1593f6384c39cc221.tar.gz
bokf-10a535ace098144980d0ffd1593f6384c39cc221.zip
tui: split bokftui into screen files
Diffstat (limited to 'clients/ui.h')
-rw-r--r--clients/ui.h125
1 files changed, 125 insertions, 0 deletions
diff --git a/clients/ui.h b/clients/ui.h
new file mode 100644
index 0000000..1737259
--- /dev/null
+++ b/clients/ui.h
@@ -0,0 +1,125 @@
+#ifndef BOKF_UI_H
+#define BOKF_UI_H
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include "client.h"
+#include "tui.h"
+#include "util.h"
+#include "yyjson.h"
+
+/* Shared UI state and helpers for the bokftui screens (screens_<group>.c).
+ The scene registry and main() live in bokftui.c. */
+
+/* universal "new/add" hotkey: ^N (0x0e), the de-facto Linux convention */
+#define KEY_CTRL_N 0x0e
+/* ^X clears the focused row in row editors */
+#define KEY_CTRL_X 0x18
+/* ^Enter saves/posts the form; sent via xterm modifyOtherKeys */
+#define KEY_CTRL_ENTER (KEY_MAX + 1)
+/* Pager markup: headings, dimmed derived lines and full-width rules. */
+#define MK_HEAD "\001"
+#define MK_DIM "\002"
+#define MK_RULE "\003"
+#define MK_STICKY "\004"
+/* Menu item prefix for a non-selectable section header. */
+#define MK_SECTION MK_HEAD
+
+struct app {
+ struct client_conn conn;
+ char socket[256];
+ char session[128];
+ char username[64];
+ char password[128]; /* typed or from BOKFD_PASSWORD, kept for ^R */
+ int64_t org;
+ char org_name[128];
+ char role[32];
+ int64_t fy;
+ int64_t voucher_sel; /* last selected voucher id in the list view */
+ int64_t invoice_sel; /* last selected invoice id in the list view */
+ int64_t customer_sel; /* last selected customer id in the list view */
+ char default_series[16];
+ char attachment_dir[256];
+ long max_attachment_bytes;
+ char fy_label[64];
+ char fy_start[16];
+ char fy_end[16];
+};
+
+/* ^C quits the application; Esc is navigation only */
+extern int g_quit;
+/* ^R re-execs the binary, keeping session, org, year and screen */
+extern int g_reload;
+extern char g_scene[32];
+extern char g_reload_scene[32];
+extern char g_server_version[32];
+
+/* json helpers */
+yyjson_val *jget(yyjson_val *root, const char *path);
+yyjson_doc *parse(const char *resp);
+char *jstr_dup(const char *resp, const char *path);
+int64_t jint_val(const char *resp, const char *path, int64_t def);
+size_t jarr_size(const char *resp, const char *path);
+int jbool_val(const char *resp, const char *path, int def);
+
+/* shared UI primitives */
+int ui_getch(void);
+void request_quit(void);
+void tui_log(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
+void show_error(const char *title, const char *resp);
+void kr_whole(int64_t ore, char *buf, size_t n);
+int parse_x_double(const char *s, double *out);
+void replace_x_into(const char *src, double x, char *dst, size_t cap);
+void app_refresh_context(struct app *a);
+char *rpc_dry(struct app *a, const char *cmd, const char *args);
+char *read_file_b64(const char *path);
+char *file_browser(struct app *a, const char *start_dir);
+void attachment_download(struct app *a, int64_t att_id);
+int64_t pick_voucher(struct app *a);
+
+/* generated-document helpers (reports, bokslut) */
+void buf_line(struct buf *b, const char *fmt, ...)
+ __attribute__((format(printf, 2, 3)));
+void buf_rule(struct buf *b, int width);
+const char *vstr(yyjson_val *o, const char *k);
+int64_t vint(yyjson_val *o, const char *k);
+int acct_in(const char *number, int lo, int hi);
+extern const char *const BS_KEYS[3];
+struct is_group {
+ const char *section;
+ const char *title;
+ int lo, hi;
+ int rev;
+};
+#define IS_GROUPS_N 7
+extern const struct is_group IS_GROUPS[IS_GROUPS_N];
+
+/* defined in bokftui.c, used by screens */
+void open_scene(struct app *a, const char *name);
+void config_mkdirs(const char *path);
+
+/* screen entry points (scene registry) */
+void dashboard(struct app *a);
+void update_status(struct app *a);
+int64_t vouchers_new(struct app *a);
+void vouchers_screen(struct app *a);
+void acct_cache_free(void);
+const char *acct_name(struct app *a, const char *number);
+int acct_exists(struct app *a, const char *number);
+void accounts_report(struct app *a);
+void reports_screen(struct app *a);
+void ink2_screen(struct app *a);
+void rules_screen(struct app *a);
+void inbox_screen(struct app *a);
+void bank_screen(struct app *a);
+void audit_screen(struct app *a);
+void templates_screen(struct app *a);
+void ib_screen(struct app *a);
+void settings_screen(struct app *a);
+void company_screen(struct app *a);
+void invoices_screen(struct app *a);
+void customers_screen(struct app *a);
+void bokslut_screen(struct app *a);
+
+#endif