From a1d639e963eaad1f8d24d47cd004c22052166978 Mon Sep 17 00:00:00 2001 From: Aldrik Ramaekers Date: Thu, 1 Jan 2026 14:33:14 +0100 Subject: export dropdown ui --- src/exporter.cpp | 6 +++- src/providers/MailerSend.cpp | 5 ++++ src/ui/imgui_extensions.cpp | 65 ++++++++++++++++++++++++++++++++++++++++++++ src/ui/ui_invoices.cpp | 36 ++++++++++++++++-------- src/ui/ui_settings.cpp | 6 +--- 5 files changed, 101 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/exporter.cpp b/src/exporter.cpp index c53b70d..e296973 100644 --- a/src/exporter.cpp +++ b/src/exporter.cpp @@ -45,11 +45,14 @@ static int _send_email_t(void* arg) { request->error = impl.send_email(request->sender, request->recipient, request->subject, request->text); request->status = exporter::status::EXPORT_DONE; + request->done_at = time(NULL); + + if (request->callback) request->callback(request->error); return 0; } -exporter::export_request* exporter::send_email(char* sender, char* recipient, const char* subject, const char* text) +exporter::export_request* exporter::send_email(char* sender, char* recipient, const char* subject, const char* text, send_email_callback ev) { exporter::export_request* result = (exporter::export_request*)memops::alloc(sizeof(exporter::export_request)); result->started_at = time(NULL); @@ -59,6 +62,7 @@ exporter::export_request* exporter::send_email(char* sender, char* recipient, co result->recipient = recipient; result->subject = subject; result->text = text; + result->callback = ev; thrd_t thr; if (thrd_create(&thr, _send_email_t, result) != thrd_success) { diff --git a/src/providers/MailerSend.cpp b/src/providers/MailerSend.cpp index 1a633d9..122b7b2 100644 --- a/src/providers/MailerSend.cpp +++ b/src/providers/MailerSend.cpp @@ -24,6 +24,11 @@ bool _MailerSend_send_email(char* sender, char* recipient, const char* subject, const char* text) { + #if SIMULATE_EMAIL + usleep(1000 * 1000); + return E_ERR_SUCCESS; + #endif + const char *api_key = administration::get_email_service().api_key; httplib::SSLClient cli("api.mailersend.com", 443); cli.enable_server_certificate_verification(false); diff --git a/src/ui/imgui_extensions.cpp b/src/ui/imgui_extensions.cpp index f8adb70..05eeb7b 100644 --- a/src/ui/imgui_extensions.cpp +++ b/src/ui/imgui_extensions.cpp @@ -1,3 +1,5 @@ +#include + #include "ui.hpp" #include "strops.hpp" #include "memops.hpp" @@ -707,4 +709,67 @@ namespace ImGui ImGui::CountryDropdown(buffer->country_code, IM_ARRAYSIZE(buffer->country_code), active_countries_only); } + + bool BeginExportDropdown(const char* title, const char* text, exporter::export_request* active_request) + { + static bool is_new_request = false; + static bool show_status_change = false; + static time_t status_changed_at = 0; + static e_err last_err; + + if (active_request && active_request->status == exporter::status::EXPORT_DONE && is_new_request) + { + is_new_request = false; + show_status_change = true; + last_err = active_request->error; + status_changed_at = time(NULL); + } + + if (active_request && active_request->status != exporter::status::EXPORT_DONE) { + is_new_request = true; + ImGui::BeginDisabled(); + ImGui::BeginCombo("##sendStatus", NULL, 1 << 20); + { + if (ImGui::BeginComboPreview()) + { + ImGui::Text("Sending"); // @Localize + ImGui::SameLine(); + ImGui::LoadingIndicatorCircleSmall(); + ImGui::EndComboPreview(); + } + } + ImGui::EndDisabled(); + } + else if (show_status_change) { + ImGui::BeginDisabled(); + ImGui::BeginCombo("##sendStatus", NULL, 1 << 20); + { + if (ImGui::BeginComboPreview()) + { + if (last_err == E_ERR_SUCCESS) { + ImGui::PushStyleColor(ImGuiCol_Text, config::colors::COLOR_SUCCESS); + ImGui::Text("√"); + ImGui::PopStyleColor(); + ImGui::Text("Success"); // @Localize + } + else { + ImGui::PushStyleColor(ImGuiCol_Text, config::colors::COLOR_ERROR); + ImGui::Text("X"); + ImGui::PopStyleColor(); + ImGui::Text("Failed"); // @Localize + } + ImGui::EndComboPreview(); + } + } + ImGui::EndDisabled(); + + if (difftime(time(NULL), status_changed_at) > 1.0f) { + show_status_change = false; + } + } + else { + return ImGui::BeginCombo(title, text); + } + return false; + } } \ No newline at end of file diff --git a/src/ui/ui_invoices.cpp b/src/ui/ui_invoices.cpp index 6a50c7f..eb04af4 100644 --- a/src/ui/ui_invoices.cpp +++ b/src/ui/ui_invoices.cpp @@ -20,6 +20,7 @@ #include "ui.hpp" #include "imgui.h" #include "memops.hpp" +#include "config.hpp" #include "strops.hpp" #include "locales.hpp" #include "importer.hpp" @@ -484,6 +485,28 @@ static void draw_invoice_create() ImGui::EndChild(); } +static void draw_send_options() +{ + static exporter::export_request* active_request = NULL; + + if (ImGui::BeginExportDropdown("##Send", locale::get("ui.sendAs"), active_request)) + { + if (ImGui::Selectable(locale::get("ui.sendAs.email"), false)) { + active_request = exporter::send_email("test@test-vz9dlemj2564kj50.mlsender.net", "aldrikboy@gmail.com", "test", "test 123", + [](e_err status) { + if (status == E_ERR_SUCCESS) { + administration::activity_add(ACTIVITY_USER, active_invoice.id, "Sent email", 0); + _reload_activities(); + } + }); + } + // if (ImGui::Selectable(locale::get("ui.sendAs.einvoice"), false)) { + + // } + ImGui::EndCombo(); + } +} + static void draw_invoice_view() { if (ImGui::Button(locale::get("form.back"), true, false)) { @@ -499,17 +522,8 @@ static void draw_invoice_view() ImGui::SameLine(); - ImGui::PushItemWidth(100.0f); - if (ImGui::BeginCombo("##Send", locale::get("ui.sendAs"))) - { - if (ImGui::Selectable(locale::get("ui.sendAs.email"), false)) { - exporter::send_email("test@test-vz9dlemj2564kj50.mlsender.net", "aldrikboy@gmail.com", "test", "test 123"); - } - // if (ImGui::Selectable(locale::get("ui.sendAs.einvoice"), false)) { - - // } - ImGui::EndCombo(); - } + ImGui::PushItemWidth(180.0f); + draw_send_options(); ImGui::PushItemWidth(0.0f); ImGui::SameLine(); diff --git a/src/ui/ui_settings.cpp b/src/ui/ui_settings.cpp index fd0d5b9..fb02738 100644 --- a/src/ui/ui_settings.cpp +++ b/src/ui/ui_settings.cpp @@ -314,11 +314,7 @@ static void draw_ai_service_ui() if (ImGui::BeginComboPreview()) { if (model_request->status != importer::status::IMPORT_DONE) { - float radius = 10.0f; - const ImVec4 col = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); - const ImVec4 bg = ImGui::GetStyleColorVec4(ImGuiCol_Button); - ImGui::LoadingIndicatorCircle(radius, bg, col, 6, 4.0f); - + ImGui::LoadingIndicatorCircleSmall(); ImGui::SameLine(); } ImGui::TextUnformatted(new_ai_service.model_name); -- cgit v1.2.3-70-g09d2