diff --git a/.vscode/settings.json b/.vscode/settings.json index 3117456..32d343a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,7 +9,18 @@ "file_operations.h": "c", "string.h": "c", "termios.h": "c", - "typeinfo": "c" + "typeinfo": "c", + "stdio.h": "c", + "array": "c", + "hash_map": "c", + "bitset": "c", + "string_view": "c", + "hash_set": "c", + "format": "c", + "initializer_list": "c", + "ranges": "c", + "span": "c", + "valarray": "c" }, "C_Cpp.errorSquiggles": "enabled" } \ No newline at end of file diff --git a/include/db_handler.h b/include/db_handler.h index 94f5fc3..20b45e4 100644 --- a/include/db_handler.h +++ b/include/db_handler.h @@ -15,4 +15,6 @@ int loadListFromCSV(char* _filename, list_t * _list); int saveListToCSV(char* _filename, list_t * _list); +int exportPersonInfo(node_t * _person); + #endif \ No newline at end of file diff --git a/include/main.h b/include/main.h index ba84ae6..97ee4b8 100644 --- a/include/main.h +++ b/include/main.h @@ -1,13 +1,36 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "utils.h" #ifndef __MAIN_H__ #define __MAIN_H__ -#define TRUE !0 +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE #define FALSE 0 +#endif + +#ifndef BYTE #define BYTE uint8_t +#endif + #define MIN_X_TERMINAL_SIZE 50 #define MIN_Y_TERMINAL_SIZE 20 diff --git a/include/tui.h b/include/tui.h index 4556860..8a36406 100644 --- a/include/tui.h +++ b/include/tui.h @@ -4,15 +4,20 @@ #include #include #include +#include #include "main.h" #include "users.h" void uartDialog(char *uart_adress, int terminal_x, int terminal_y); -void mainMenu(list_t * person_list, int terminal_x, int terminal_y); +void mainMenu(list_t *person_list, int terminal_x, int terminal_y); -void personListing(list_t * person_list, int terminal_x, int terminal_y); +void personListing(list_t *person_list, int terminal_x, int terminal_y); -void personSearch(list_t * person_list, int terminal_x, int terminal_y); +void personSearch(list_t *person_list, int terminal_x, int terminal_y); + +void personInfo(node_t *_person, int terminal_x, int terminal_y); + +void exportDialog(list_t _list, int terminal_x, int terminal_y) #endif \ No newline at end of file diff --git a/include/users.h b/include/users.h index c739e7d..03de68e 100644 --- a/include/users.h +++ b/include/users.h @@ -1,10 +1,5 @@ #include "main.h" -#include -#include -#include -#include - #ifndef __USERS_H__ #define __USERS_H__ diff --git a/include/utils.h b/include/utils.h new file mode 100644 index 0000000..7e9bc34 --- /dev/null +++ b/include/utils.h @@ -0,0 +1,10 @@ +#ifndef __UTILS_H__ +#define __UTILS_H__ + +#include "main.h" + +void printTimeInString(time_t _input, char * _output); + +void printDateAndTimeInString(time_t _input, char * _output); + +#endif \ No newline at end of file diff --git a/src/db_handler.c b/src/db_handler.c index def5a80..7c95b52 100644 --- a/src/db_handler.c +++ b/src/db_handler.c @@ -60,4 +60,28 @@ int saveListToCSV(char *_filename, list_t *_list) fclose(f_out); return save_sum; +} + +int exportPersonInfo(node_t *_person) +{ + char filename[64]; + sprintf(filename, "person_uuid%d.txt", _person->user.uuid); + + FILE *f_out = fopen(filename, "w"); + if (f_out == NULL) + { + return 0; + } + + char last_time_event_str[64]; + printDateAndTimeInString(_person->user.last_time_event, last_time_event_str); + + char total_time_str[64]; + printTimeInString(_person->user.total, total_time_str); + + fprintf(f_out, "NAME: %s\nSURNAME: %s\nDEPARTMENT: %d\nLAST TIME EVENT: %s\nTOTAL TIME: %s\n", _person->user.name, _person->user.surname, _person->user.department, last_time_event_str, total_time_str); + + fclose(f_out); + + return 1; } \ No newline at end of file diff --git a/src/main.c b/src/main.c index 2183ba7..06d9acd 100644 --- a/src/main.c +++ b/src/main.c @@ -1,14 +1,3 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - #include "main.h" #include "users.h" #include "tui.h" @@ -72,6 +61,7 @@ int main(int argc, char const **argv) init_pair(2, COLOR_WHITE, COLOR_RED); init_pair(3, COLOR_GREEN, COLOR_BLUE); init_pair(4, COLOR_RED, COLOR_BLUE); + init_pair(6, COLOR_BLUE, COLOR_BLACK); assume_default_colors(COLOR_WHITE, COLOR_BLUE); erase(); diff --git a/src/tui.c b/src/tui.c index ddf6b82..b5c8ee3 100644 --- a/src/tui.c +++ b/src/tui.c @@ -4,6 +4,7 @@ #include #include #include "main.h" +#include "db_handler.h" #include "tui.h" void uartDialog(char *uart_adress, int terminal_x, int terminal_y) @@ -118,9 +119,9 @@ void mainMenu(list_t *person_list, int terminal_x, int terminal_y) int start_y = (terminal_y - win_height) / 2; int start_x = (terminal_x - win_width) / 2; - char choices[6][30] = {"List all employees", "Find employee", "Edit database", "Save", "Save as...", "Exit"}; + char choices[6][30] = {"List all employees", "Find employee", "Edit database", "Save", "Export", "Exit"}; - char keboard_input; + char keyboard_input; int highlight = 0; start_color(); @@ -129,12 +130,6 @@ void mainMenu(list_t *person_list, int terminal_x, int terminal_y) wbkgd(mainmenu, COLOR_PAIR(1)); - box(mainmenu, 0, 0); - wattron(mainmenu, COLOR_PAIR(1)); - wattron(mainmenu, A_BOLD); - mvwprintw(mainmenu, 0, (win_width - strlen("Administration")) / 2, "%s", "Administration"); - wattroff(mainmenu, A_BOLD); - wattroff(mainmenu, COLOR_PAIR(1)); keypad(mainmenu, true); int text_x = (win_width - 52) / 2; @@ -143,6 +138,12 @@ void mainMenu(list_t *person_list, int terminal_x, int terminal_y) while (1) { + box(mainmenu, 0, 0); + wattron(mainmenu, COLOR_PAIR(1)); + wattron(mainmenu, A_BOLD); + mvwprintw(mainmenu, 0, (win_width - strlen("Administration")) / 2, "%s", "Administration"); + wattroff(mainmenu, A_BOLD); + wattroff(mainmenu, COLOR_PAIR(1)); for (int i = 0; i < 6; i++) { if (i == highlight) @@ -160,9 +161,9 @@ void mainMenu(list_t *person_list, int terminal_x, int terminal_y) } wrefresh(mainmenu); flushinp(); - keboard_input = wgetch(mainmenu); + keyboard_input = wgetch(mainmenu); - if (keboard_input == '\t') + if (keyboard_input == '\t') { if (highlight < 5) highlight++; @@ -170,7 +171,7 @@ void mainMenu(list_t *person_list, int terminal_x, int terminal_y) highlight = 0; } - else if (keboard_input == '\n') + else if (keyboard_input == '\n') { switch (highlight) { @@ -180,9 +181,10 @@ void mainMenu(list_t *person_list, int terminal_x, int terminal_y) case 1: personSearch(person_list, terminal_x, terminal_y); + break; case 5: - if (keboard_input == '\n') + if (keyboard_input == '\n') { wclear(mainmenu); wrefresh(mainmenu); @@ -209,14 +211,6 @@ void personListing(list_t *person_list, int terminal_x, int terminal_y) WINDOW *personlisting = newwin(win_height, win_width, start_y, start_x); wbkgd(personlisting, COLOR_PAIR(1)); - box(personlisting, 0, 0); - - wattron(personlisting, COLOR_PAIR(1)); - wattron(personlisting, A_BOLD); - mvwprintw(personlisting, 0, (win_width - strlen("Filtered list")) / 2, "%s", "Filtered list"); - wattroff(personlisting, A_BOLD); - wattroff(personlisting, COLOR_PAIR(1)); - keypad(personlisting, TRUE); int max_rows = win_height - 2; int total_count = 0; @@ -229,10 +223,17 @@ void personListing(list_t *person_list, int terminal_x, int terminal_y) int offset = 0; int highlight = 0; - int keboard_input; + int keyboard_input; while (1) { + box(personlisting, 0, 0); + wattron(personlisting, COLOR_PAIR(1)); + wattron(personlisting, A_BOLD); + mvwprintw(personlisting, 0, (win_width - strlen("Filtered list")) / 2, "%s", "Filtered list"); + wattroff(personlisting, A_BOLD); + wattroff(personlisting, COLOR_PAIR(1)); + keypad(personlisting, TRUE); werase(personlisting); box(personlisting, 0, 0); wattron(personlisting, COLOR_PAIR(1)); @@ -247,7 +248,7 @@ void personListing(list_t *person_list, int terminal_x, int terminal_y) current = person_list->head; int idx = 0, row = 2; - while (current && row < win_height - 1) + while (current && row < win_height) { if (current->user.uuid) if (idx >= offset && row < win_height - 1) @@ -269,17 +270,17 @@ void personListing(list_t *person_list, int terminal_x, int terminal_y) wrefresh(personlisting); - keboard_input = wgetch(personlisting); - if (keboard_input == KEY_UP) + keyboard_input = wgetch(personlisting); + if (keyboard_input == KEY_UP) { - if (highlight > 0) + if (highlight > 1) { highlight--; if (highlight < offset) offset--; } } - else if (keboard_input == KEY_DOWN) + else if (keyboard_input == KEY_DOWN) { if (highlight < total_count - 1) { @@ -288,7 +289,7 @@ void personListing(list_t *person_list, int terminal_x, int terminal_y) offset++; } } - else if (keboard_input == '\n') + else if (keyboard_input == '\n') { int idx = 0; node_t *selected = person_list->head; @@ -297,8 +298,9 @@ void personListing(list_t *person_list, int terminal_x, int terminal_y) selected = selected->next; idx++; } + personInfo(selected, terminal_x, terminal_y); } - else if (keboard_input == 27) + else if (keyboard_input == 27 || keyboard_input == 'q') { break; } @@ -311,8 +313,8 @@ void personListing(list_t *person_list, int terminal_x, int terminal_y) void personSearch(list_t *person_list, int terminal_x, int terminal_y) { - int win_height = 20; - int win_width = 76; + int win_height = 11; + int win_width = 50; int start_y = (terminal_y - win_height) / 2; int start_x = (terminal_x - win_width) / 2; @@ -323,16 +325,8 @@ void personSearch(list_t *person_list, int terminal_x, int terminal_y) WINDOW *searchdialog = newwin(win_height, win_width, start_y, start_x); wbkgd(searchdialog, COLOR_PAIR(1)); - box(searchdialog, 0, 0); - wattron(searchdialog, COLOR_PAIR(1)); - wattron(searchdialog, A_BOLD); - mvwprintw(searchdialog, 0, (win_width - strlen("Search")) / 2, "%s", "Search"); - wattroff(searchdialog, A_BOLD); - wattroff(searchdialog, COLOR_PAIR(1)); - keypad(searchdialog, TRUE); - - char choice; + char keyboard_input; int highlight = 0; int field_y = 2; @@ -342,10 +336,18 @@ void personSearch(list_t *person_list, int terminal_x, int terminal_y) char *fields[2] = {name, surname}; int field_lens[2] = {31, 31}; - uint16_t * uuids_found; + uint16_t *uuids_found; while (1) { + box(searchdialog, 0, 0); + + wattron(searchdialog, COLOR_PAIR(1)); + wattron(searchdialog, A_BOLD); + mvwprintw(searchdialog, 0, (win_width - strlen("Search")) / 2, "%s", "Search"); + wattroff(searchdialog, A_BOLD); + wattroff(searchdialog, COLOR_PAIR(1)); + keypad(searchdialog, TRUE); for (int i = 0; i < 2; i++) { @@ -353,7 +355,12 @@ void personSearch(list_t *person_list, int terminal_x, int terminal_y) wattron(searchdialog, COLOR_PAIR(2)); else wattron(searchdialog, COLOR_PAIR(1)); - mvwprintw(searchdialog, field_y + i * 2, field_x, "%s [%30s]", prompts[i], fields[i]); + + mvwprintw(searchdialog, field_y + i * 2, field_x, "%s ", prompts[i]); + mvwprintw(searchdialog, field_y + i * 2, field_x + strlen(prompts[i]) + 3, "[%30s]", fields[i]); + if (strcmp(fields[i], "\0") == 0) + mvwprintw(searchdialog, field_y + i * 2, field_x + strlen(prompts[i]) + 3, "[______________________________]"); + if (highlight == i) wattroff(searchdialog, COLOR_PAIR(2)); else @@ -379,9 +386,9 @@ void personSearch(list_t *person_list, int terminal_x, int terminal_y) wrefresh(searchdialog); - choice = wgetch(searchdialog); + keyboard_input = wgetch(searchdialog); - if (choice == '\t') + if (keyboard_input == '\t') { if (highlight < 3) { @@ -390,7 +397,7 @@ void personSearch(list_t *person_list, int terminal_x, int terminal_y) else highlight = 0; } - else if (choice == '\n') + else if (keyboard_input == '\n') { if (highlight < 2) { @@ -404,42 +411,157 @@ void personSearch(list_t *person_list, int terminal_x, int terminal_y) } else if (highlight == 2) { - uint16_t count = searchUUIDByName(person_list, name, surname, &uuids_found); - list_t found_pesons; - found_pesons.head = NULL; - node_t **last_ptr = &found_pesons.head; - for (uint16_t i = 0; i < count; i++) { - node_t *cur = person_list->head; - while (cur) { - if (cur->user.uuid == uuids_found[i]) { - node_t *new_node = malloc(sizeof(node_t)); - if (new_node) { - new_node->user = cur->user; - new_node->next = NULL; - *last_ptr = new_node; - last_ptr = &new_node->next; - } - break; - } - cur = cur->next; - } - } - personListing(&found_pesons, terminal_x, terminal_y); + uint16_t count = searchUUIDByName(person_list, name, surname, &uuids_found); + list_t found_pesons; + found_pesons.head = NULL; + node_t **last_ptr = &found_pesons.head; + for (uint16_t i = 0; i < count; i++) + { + node_t *cur = person_list->head; + while (cur) + { + if (cur->user.uuid == uuids_found[i]) + { + node_t *new_node = malloc(sizeof(node_t)); + if (new_node) + { + new_node->user = cur->user; + new_node->next = NULL; + *last_ptr = new_node; + last_ptr = &new_node->next; + } + break; + } + cur = cur->next; + } + } + personListing(&found_pesons, terminal_x, terminal_y); } else if (highlight == 3) { delwin(searchdialog); touchwin(stdscr); refresh(); - break; + return; } } - else if (choice == 27) + else if (keyboard_input == 27 || keyboard_input == 'q') { // ESC delwin(searchdialog); touchwin(stdscr); refresh(); - break; + return; } } +} + +void personInfo(node_t *_person, int terminal_x, int terminal_y) +{ + int win_height = 14; + int win_width = 50; + int start_y = (terminal_y - win_height) / 2; + int start_x = (terminal_x - win_width) / 2; + + start_color(); + + WINDOW *personinfodialog = newwin(win_height, win_width, start_y, start_x); + wbkgd(personinfodialog, COLOR_PAIR(6)); + + int max_rows = win_height - 2; + int total_count = 0; + box(personinfodialog, 0, 0); + + wattron(personinfodialog, COLOR_PAIR(6)); + wattron(personinfodialog, A_BOLD); + mvwprintw(personinfodialog, 0, (win_width - strlen("Search")) / 2, "%s", "Search"); + wattroff(personinfodialog, A_BOLD); + wattroff(personinfodialog, COLOR_PAIR(6)); + keypad(personinfodialog, TRUE); + + char buttons[2][20] = {"", ""}; + char prompts[6][32] = {"Name", "Surname", "Department", "Last time event", "Total time", "Available"}; + + char keyboard_input; + int highlight = 0; + + int field_y = 2; + int field_x = 4; + int button_y = field_y + 15; + int button_x = field_x; + + while (1) + { + werase(personinfodialog); + box(personinfodialog, 0, 0); + wattron(personinfodialog, COLOR_PAIR(6)); + wattron(personinfodialog, A_BOLD); + mvwprintw(personinfodialog, 0, (win_width - strlen("Person Information")) / 2, "%s", "Person Information"); + wattroff(personinfodialog, A_BOLD); + + char last_time_event_str[64]; + printDateAndTimeInString(_person->user.last_time_event, last_time_event_str); + + char total_time_str[64]; + printTimeInString(_person->user.total, total_time_str); + + mvwprintw(personinfodialog, field_y, field_x, "%s: %s", prompts[0], _person->user.name); + mvwprintw(personinfodialog, field_y + 1, field_x, "%s: %s", prompts[1], _person->user.surname); + mvwprintw(personinfodialog, field_y + 2, field_x, "%s: %d", prompts[2], _person->user.department); + mvwprintw(personinfodialog, field_y + 4, field_x, "%s: %s", prompts[3], last_time_event_str); + mvwprintw(personinfodialog, field_y + 5, field_x, "%s: %s", prompts[4], total_time_str); + mvwprintw(personinfodialog, field_y + 7, field_x, "%s: %s", prompts[5], _person->user.available ? "Yes" : "No"); + + wattroff(personinfodialog, COLOR_PAIR(6)); + + wrefresh(personinfodialog); + + for (int i = 0; i < 2; i++) + { + if (highlight == i) + wattron(personinfodialog, COLOR_PAIR(2)); + else + wattron(personinfodialog, COLOR_PAIR(6)); + wattron(personinfodialog, A_BOLD); + mvwprintw(personinfodialog, field_y + 10, field_x + i * 20, "%s", buttons[i]); + wattroff(personinfodialog, A_BOLD); + if (highlight == i) + wattroff(personinfodialog, COLOR_PAIR(2)); + else + wattroff(personinfodialog, COLOR_PAIR(6)); + } + + wrefresh(personinfodialog); + + keyboard_input = wgetch(personinfodialog); + + if (keyboard_input == '\t') + { + highlight = !highlight; + } + else if (keyboard_input == '\n') + { + if (highlight == 0) + { + exportPersonInfo(_person); + } + else if (highlight == 1) + { + delwin(personinfodialog); + touchwin(stdscr); + refresh(); + return; + } + } + else if (keyboard_input == 27 || keyboard_input == 'q') + { + delwin(personinfodialog); + touchwin(stdscr); + refresh(); + return; + } + } +} + +void exportDialog(list_t _list, int terminal_x, int terminal_y){ + } \ No newline at end of file diff --git a/src/utils.c b/src/utils.c new file mode 100644 index 0000000..e1a5f1d --- /dev/null +++ b/src/utils.c @@ -0,0 +1,28 @@ +#include "utils.h" +#include "main.h" + +void printTimeInString(time_t _input, char *_output) +{ + long hours = _input / 3600; + long minutes = (_input % 3600) / 60; + long seconds = _input % 60; + snprintf(_output, 64, "%ld:%02ld:%02ld", hours, minutes, seconds); + + return; +} + +void printDateAndTimeInString(time_t _input, char *_output) +{ + time_t raw_time = _input; + struct tm *last_time_event = localtime(&raw_time); + if (last_time_event) + { + strftime(_output, 64, "%d/%m/%Y %H:%M:%S", last_time_event); + } + else + { + strcpy(_output, "N/A"); + } + + return; +}