summaryrefslogtreecommitdiff
path: root/clients/screens_settings.c
diff options
context:
space:
mode:
authorAnders Betts <anders.betts@gmail.com>2026-09-23 13:44:11 +0200
committerAnders Betts <anders.betts@gmail.com>2026-09-23 13:44:11 +0200
commita78b03f9c2c68eec7fae5eda328ffdbef90b6487 (patch)
tree2ad5384002058c389b8d49702d1e18cff518714f /clients/screens_settings.c
parent01feeb96c342f216fd5bf7702037fbd98ca49337 (diff)
downloadbokf-a78b03f9c2c68eec7fae5eda328ffdbef90b6487.tar.gz
bokf-a78b03f9c2c68eec7fae5eda328ffdbef90b6487.zip
tui: Bolaget → Användare (read-only member list for owners); org.member_list owner-onlyv0.1.71
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'clients/screens_settings.c')
-rw-r--r--clients/screens_settings.c132
1 files changed, 111 insertions, 21 deletions
diff --git a/clients/screens_settings.c b/clients/screens_settings.c
index f47a51b..27582c0 100644
--- a/clients/screens_settings.c
+++ b/clients/screens_settings.c
@@ -482,52 +482,142 @@ static void company_data_screen(struct app *a)
}
}
+static const char *role_label(const char *role)
+{
+ if (!role)
+ return "";
+ if (strcmp(role, "owner") == 0)
+ return "Ägare";
+ if (strcmp(role, "bookkeeper") == 0)
+ return "Bokförare";
+ if (strcmp(role, "viewer") == 0)
+ return "Läsare";
+ return role;
+}
+
+/* Members of the org and their roles; read-only for now. */
+static void users_screen(struct app *a)
+{
+ int cursor = 0;
+ for (;;) {
+ if (g_quit)
+ return;
+ char *resp = client_rpc(&a->conn, "org.member_list", a->session,
+ a->org, "{}");
+ if (!resp || !client_ok(resp)) {
+ show_error("Användare", resp);
+ free(resp);
+ return;
+ }
+ size_t n = jarr_size(resp, "result.items");
+ char **lines = xcalloc(n ? n : 1, sizeof(char *));
+ for (size_t i = 0; i < n; i++) {
+ char path[64];
+ snprintf(path, sizeof path, "result.items.%zu.username", i);
+ char *user = jstr_dup(resp, path);
+ snprintf(path, sizeof path, "result.items.%zu.display_name", i);
+ char *name = jstr_dup(resp, path);
+ snprintf(path, sizeof path, "result.items.%zu.role", i);
+ char *role = jstr_dup(resp, path);
+ char ubuf[160], nbuf[224], line[512];
+ snprintf(ubuf, sizeof ubuf, "%s", user ? user : "");
+ tui_pad_field(ubuf, sizeof ubuf, 20);
+ snprintf(nbuf, sizeof nbuf, "%s", name ? name : "");
+ tui_pad_field(nbuf, sizeof nbuf, 28);
+ snprintf(line, sizeof line, "%s %s %s", ubuf, nbuf,
+ role_label(role));
+ lines[i] = xstrdup(line);
+ free(user);
+ free(name);
+ free(role);
+ }
+ free(resp);
+ int s = tui_select_list("Användare", lines, (int)n, cursor, 1,
+ &cursor, 0, NULL, 0);
+ for (size_t i = 0; i < n; i++)
+ free(lines[i]);
+ free(lines);
+ if (s == -1)
+ return;
+ }
+}
+
+enum company_item {
+ CI_COMPANY,
+ CI_INVOICE,
+ CI_SERIES,
+ CI_SMTP,
+ CI_BOARD,
+ CI_USERS,
+ CI_REGISTER,
+ CI_EMPLOYEES,
+ CI_CUSTOMERS,
+ CI_RULES,
+};
+
static const char *const COMPANY_ITEMS[] = {
- "Företagsuppgifter",
- "Fakturauppgifter",
- "Verifikationsserier",
- "E-post (SMTP)",
- "Styrelseledamöter",
- MK_SECTION "Register",
- "Anställda",
- "Kunder",
- "Momsregler",
+ [CI_COMPANY] = "Företagsuppgifter",
+ [CI_INVOICE] = "Fakturauppgifter",
+ [CI_SERIES] = "Verifikationsserier",
+ [CI_SMTP] = "E-post (SMTP)",
+ [CI_BOARD] = "Styrelseledamöter",
+ [CI_USERS] = "Användare",
+ [CI_REGISTER] = MK_SECTION "Register",
+ [CI_EMPLOYEES] = "Anställda",
+ [CI_CUSTOMERS] = "Kunder",
+ [CI_RULES] = "Momsregler",
};
void company_screen(struct app *a)
{
static int sel = 0;
+ const int all = (int)(sizeof COMPANY_ITEMS / sizeof COMPANY_ITEMS[0]);
for (;;) {
if (g_quit)
return;
- int r = tui_menu("Bolaget", COMPANY_ITEMS,
- (int)(sizeof COMPANY_ITEMS / sizeof COMPANY_ITEMS[0]),
- 0, &sel);
+ int owner = a->role[0] && strcmp(a->role, "owner") == 0;
+ const char *items[sizeof COMPANY_ITEMS / sizeof COMPANY_ITEMS[0]];
+ int map[sizeof COMPANY_ITEMS / sizeof COMPANY_ITEMS[0]];
+ int n = 0;
+ for (int i = 0; i < all; i++) {
+ if (i == CI_USERS && !owner)
+ continue;
+ items[n] = COMPANY_ITEMS[i];
+ map[n++] = i;
+ }
+ if (sel >= n)
+ sel = 0;
+ int r = tui_menu("Bolaget", items, n, 0, &sel);
if (r < 0)
return;
- switch (r) {
- case 0:
+ if (r >= n)
+ continue;
+ switch (map[r]) {
+ case CI_COMPANY:
company_data_screen(a);
break;
- case 1:
+ case CI_INVOICE:
invoice_settings_screen(a);
break;
- case 2:
+ case CI_SERIES:
series_settings_screen(a);
break;
- case 3:
+ case CI_SMTP:
smtp_settings_screen(a);
break;
- case 4:
+ case CI_BOARD:
board_screen(a);
break;
- case 6:
+ case CI_USERS:
+ users_screen(a);
+ break;
+ case CI_EMPLOYEES:
employees_screen(a);
break;
- case 7:
+ case CI_CUSTOMERS:
customers_screen(a);
break;
- case 8:
+ case CI_RULES:
rules_screen(a);
break;
default: