aboutsummaryrefslogtreecommitdiff
path: root/clients
diff options
context:
space:
mode:
authorAnders Betts <anders.betts@gmail.com>2026-09-21 14:03:36 +0200
committerAnders Betts <anders.betts@gmail.com>2026-09-21 14:03:44 +0200
commit776dbdf6f6f12289c874fd9d1eada379f1b02a0b (patch)
tree8bdf34d311c5a2f02956b1bb94dc2b502eb738fa /clients
parentb0189d7d6b58a4761daebe761afeaf4a68a9296c (diff)
downloadbokf-776dbdf6f6f12289c874fd9d1eada379f1b02a0b.tar.gz
bokf-776dbdf6f6f12289c874fd9d1eada379f1b02a0b.zip
tui: flat menu, System hub, remembered attachment directoryv0.1.57
Diffstat (limited to 'clients')
-rw-r--r--clients/bokftui.c9
-rw-r--r--clients/screens_dashboard.c43
-rw-r--r--clients/screens_settings.c27
-rw-r--r--clients/ui.c19
-rw-r--r--clients/ui.h3
5 files changed, 53 insertions, 48 deletions
diff --git a/clients/bokftui.c b/clients/bokftui.c
index a047ef5..2dc23ba 100644
--- a/clients/bokftui.c
+++ b/clients/bokftui.c
@@ -45,7 +45,7 @@ static const struct scene SCENES[] = {
{ "audit", audit_screen },
{ "company", company_screen },
{ "settings", company_screen }, /* ^R/--screen compatibility */
- { "system", system_settings_screen },
+ { "system", system_screen },
{ "bokslut", bokslut_screen },
{ "yearinfo", bokslut_screen }, /* ^R compatibility */
};
@@ -146,11 +146,14 @@ static void config_load(struct app *a)
snprintf(a->socket, sizeof a->socket, "%s", val);
else if (strcmp(line, "user") == 0 && !a->username[0])
snprintf(a->username, sizeof a->username, "%s", val);
+ else if (strcmp(line, "attachment_dir") == 0 &&
+ !a->attachment_dir[0])
+ snprintf(a->attachment_dir, sizeof a->attachment_dir, "%s", val);
}
fclose(f);
}
-static void config_save(const struct app *a)
+void config_save(struct app *a)
{
char path[512];
config_path(path, sizeof path);
@@ -161,6 +164,8 @@ static void config_save(const struct app *a)
fprintf(f, "server=%s\n", a->socket);
if (a->username[0])
fprintf(f, "user=%s\n", a->username);
+ if (a->attachment_dir[0])
+ fprintf(f, "attachment_dir=%s\n", a->attachment_dir);
fclose(f);
chmod(path, 0600);
}
diff --git a/clients/screens_dashboard.c b/clients/screens_dashboard.c
index 9deca37..83b4f6a 100644
--- a/clients/screens_dashboard.c
+++ b/clients/screens_dashboard.c
@@ -268,18 +268,11 @@ static void select_fiscal_year(struct app *a)
}
}
static const char *const MAIN_ITEMS[] = {
- MK_SECTION "Bokföring",
"Verifikat", "Underlag (inkorg)", "Bankavstämning", "Mallar",
- MK_SECTION "Fakturering",
"Fakturor",
- MK_SECTION "Lön",
"Lönekörningar",
- MK_SECTION "Rapporter & bokslut",
"Rapporter", "Bokslut",
- "Bolaget",
- MK_SECTION "System",
- "Skattetabeller", "Revision", "Systeminställningar",
- MK_SECTION "Räkenskapsår",
+ "Bolaget", "System",
"Ingående balans", "Räkenskapsår",
"Logga ut / avsluta",
};
@@ -305,52 +298,46 @@ void dashboard(struct app *a)
if (sel < 0)
continue; /* Esc/back at the top level never exits */
switch (sel) {
- case 1:
+ case 0:
open_scene(a, "vouchers");
break;
- case 2:
+ case 1:
open_scene(a, "inbox");
break;
- case 3:
+ case 2:
open_scene(a, "bank");
break;
- case 4:
+ case 3:
open_scene(a, "templates");
break;
- case 6:
+ case 4:
open_scene(a, "invoices");
break;
- case 8:
+ case 5:
open_scene(a, "payroll");
break;
- case 10:
+ case 6:
open_scene(a, "reports");
break;
- case 11:
+ case 7:
open_scene(a, "bokslut");
break;
- case 12:
+ case 8:
open_scene(a, "company");
break;
- case 14:
- open_scene(a, "tax_tables");
- break;
- case 15:
- open_scene(a, "audit");
- break;
- case 16:
+ case 9:
open_scene(a, "system");
break;
- case 18:
+ case 10:
open_scene(a, "ib");
break;
- case 19:
+ case 11:
select_fiscal_year(a);
break;
- case 20:
+ case 12:
return;
default:
- break; /* section header */
+ break;
}
}
}
diff --git a/clients/screens_settings.c b/clients/screens_settings.c
index 227ee68..8a31620 100644
--- a/clients/screens_settings.c
+++ b/clients/screens_settings.c
@@ -321,10 +321,6 @@ static const struct setting_field SMTP_SETTINGS[] = {
{ "smtp_password", "SMTP-lösenord", NULL, 0, 1 },
};
-static const struct setting_field SYSTEM_SETTINGS[] = {
- { "attachment_dir", "Bilagornas mapp", NULL, 0, 0 },
-};
-
static int settings_can_write(struct app *a)
{
return a->role[0] && (strcmp(a->role, "owner") == 0 ||
@@ -347,12 +343,27 @@ static void smtp_settings_screen(struct app *a)
settings_can_write(a), 1, &sel);
}
-void system_settings_screen(struct app *a)
+static const char *const SYSTEM_ITEMS[] = {
+ "Skattetabeller",
+ "Revision",
+};
+
+void system_screen(struct app *a)
{
static int sel = 0;
- settings_form(a, "Systeminställningar", SYSTEM_SETTINGS,
- (int)(sizeof SYSTEM_SETTINGS / sizeof SYSTEM_SETTINGS[0]),
- settings_can_write(a), 0, &sel);
+ for (;;) {
+ if (g_quit)
+ return;
+ int r = tui_menu("System", SYSTEM_ITEMS,
+ (int)(sizeof SYSTEM_ITEMS / sizeof SYSTEM_ITEMS[0]),
+ 0, &sel);
+ if (r < 0)
+ return;
+ if (r == 0)
+ payroll_tax_tables_screen(a);
+ else if (r == 1)
+ audit_screen(a);
+ }
}
static void company_data_screen(struct app *a)
diff --git a/clients/ui.c b/clients/ui.c
index a95ce44..ca6906f 100644
--- a/clients/ui.c
+++ b/clients/ui.c
@@ -217,17 +217,12 @@ void app_refresh_context(struct app *a)
free(resp);
snprintf(a->default_series, sizeof a->default_series, "%s", "A");
- a->attachment_dir[0] = '\0';
resp = client_rpc(&a->conn, "settings.get", a->session, a->org, "{}");
if (resp && client_ok(resp)) {
char *ser = jstr_dup(resp, "result.default_series");
if (ser && *ser)
snprintf(a->default_series, sizeof a->default_series, "%s", ser);
free(ser);
- char *dir = jstr_dup(resp, "result.attachment_dir");
- if (dir && *dir)
- snprintf(a->attachment_dir, sizeof a->attachment_dir, "%s", dir);
- free(dir);
}
free(resp);
@@ -332,14 +327,18 @@ static void expand_path(const char *in, char *out, size_t n)
Returns a malloc'd path, or NULL on cancel. */
char *file_browser(struct app *a, const char *start_dir)
{
- (void)a;
if (g_quit)
return NULL;
char dir[1024];
- const char *start = (start_dir && *start_dir) ? start_dir : getenv("HOME");
+ const char *home = getenv("HOME");
+ const char *start = (start_dir && *start_dir) ? start_dir : home;
expand_path(start, dir, sizeof dir);
- if (!dir[0])
- snprintf(dir, sizeof dir, ".");
+ struct stat sb;
+ if (!dir[0] || stat(dir, &sb) != 0 || !S_ISDIR(sb.st_mode)) {
+ expand_path(home && *home ? home : ".", dir, sizeof dir);
+ if (!dir[0])
+ snprintf(dir, sizeof dir, ".");
+ }
for (;;) {
DIR *d = opendir(dir);
if (!d) {
@@ -408,6 +407,8 @@ char *file_browser(struct app *a, const char *start_dir)
continue;
}
free(ents);
+ snprintf(a->attachment_dir, sizeof a->attachment_dir, "%.255s", dir);
+ config_save(a);
return xstrdup(full);
}
}
diff --git a/clients/ui.h b/clients/ui.h
index 2b93106..b37eb4f 100644
--- a/clients/ui.h
+++ b/clients/ui.h
@@ -102,6 +102,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);
+void config_save(struct app *a);
/* Optional prefill for the new-voucher form (bank reconciliation). */
struct voucher_prefill {
@@ -130,12 +131,12 @@ void audit_screen(struct app *a);
void templates_screen(struct app *a);
void ib_screen(struct app *a);
void company_screen(struct app *a);
-void system_settings_screen(struct app *a);
void invoices_screen(struct app *a);
void customers_screen(struct app *a);
void bokslut_screen(struct app *a);
void employees_screen(struct app *a);
void payroll_screen(struct app *a);
void payroll_tax_tables_screen(struct app *a);
+void system_screen(struct app *a);
#endif