diff options
Diffstat (limited to 'clients/screens_settings.c')
| -rw-r--r-- | clients/screens_settings.c | 132 |
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: |
