summaryrefslogtreecommitdiff
path: root/src/ui
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/ui_settings.cpp172
1 files changed, 152 insertions, 20 deletions
diff --git a/src/ui/ui_settings.cpp b/src/ui/ui_settings.cpp
index 7854be3..c2c34b9 100644
--- a/src/ui/ui_settings.cpp
+++ b/src/ui/ui_settings.cpp
@@ -38,25 +38,39 @@ void ui_setup_settings()
static void ui_draw_vat_rates()
{
+ static bool is_adding_item = false;
+ static country_tax_bracket new_tax_bracket;
+
+ static bool is_editing_item = false;
+ static u32 editing_item_index = 0;
+
if (ImGui::BeginTable("TableVatRates", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) {
ImGui::TableSetupColumn(localize("settings.vat.table.country"), ImGuiTableColumnFlags_WidthFixed, 140);
ImGui::TableSetupColumn(localize("settings.vat.table.rates"));
+ // Used to generate headers for each individual country.
char prev_country[3];
prev_country[0] = 0;
for (u32 i = 0; i < tax_bracket_count; i++) {
country_tax_bracket c = tax_brackets[i];
+ // Set to false for shared rates.
+ bool can_be_modified = true;
+
+ // Check for fixed rates shared accross countries.
if (strcmp(c.country_code, "00") == 0)
{
- strops_copy(prev_country, c.country_code, 3);
+ strops_copy(prev_country, c.country_code, 3);
+ can_be_modified = false;
}
+ // Generate headers per country.
else if (strcmp(c.country_code, prev_country) != 0)
- {
+ {
strops_copy(prev_country, c.country_code, 3);
+ // Empty row.
ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0); ImGui::Text("");
ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, IM_COL32(69, 69, 69, 255));
@@ -67,13 +81,108 @@ static void ui_draw_vat_rates()
char locale_buf[20];
snprintf(locale_buf, sizeof(locale_buf), "country.%s", c.country_code);
- ImGui::TableSetColumnIndex(0); ImGui::Text(localize(locale_buf));
+ ImGui::TableSetColumnIndex(0);
+ ImGui::Text(localize(locale_buf));
+
+ // If not adding an item already, show + button next to country name.
+ if (!is_adding_item)
+ {
+ ImGui::SameLine();
+ char btn_name[20];
+ snprintf(btn_name, sizeof(btn_name), "+##%d",i);
+ ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0,0));
+ if (ImGui::Button(btn_name, ImVec2(20,20))) {
+ is_adding_item = true;
+ is_editing_item = false;
+ memset(&new_tax_bracket, 0, sizeof(new_tax_bracket));
+ strops_copy(new_tax_bracket.country_code, c.country_code, 3);
+ }
+ ImGui::PopStyleVar();
+ }
+
ImGui::TableSetColumnIndex(1); ImGui::Text("");
}
+ // Column 1: description of tax bracket. Is only displayed on shared tax brackets for clarity.
ImGui::TableNextRow();
- ImGui::TableSetColumnIndex(0); ImGui::Text(localize(c.description));
- ImGui::TableSetColumnIndex(1); ImGui::Text("%.2f%%", c.rate);
+ ImGui::TableSetColumnIndex(0);
+ ImGui::Text(can_be_modified ? "" : localize(c.description));
+
+
+ // Column 2: When editing, show input for new rate. Else we display the stored rate and check for modify request.
+ ImGui::TableSetColumnIndex(1);
+ if (is_editing_item && editing_item_index == i)
+ {
+ ImGui::InputFloat("##Rate", &new_tax_bracket.rate, 1.0f, 5.0f, "%.2f");
+
+ if (new_tax_bracket.rate < 0.0f) new_tax_bracket.rate = 0.0f;
+ if (new_tax_bracket.rate > 100.0f) new_tax_bracket.rate = 100.0f;
+
+ ImGui::SameLine();
+ if (ImGui::Button(localize("form.save"))) {
+ is_editing_item = false;
+ is_adding_item = false;
+
+ administration_update_tax_bracket(new_tax_bracket);
+
+ ui_destroy_settings();
+ ui_setup_settings();
+ }
+
+ ImGui::SameLine();
+ if (ImGui::Button(localize("form.cancel"))) {
+ is_editing_item = false;
+ is_adding_item = false;
+ memset(&new_tax_bracket, 0, sizeof(new_tax_bracket));
+ }
+ }
+ else
+ {
+ ImGui::Text("%.2f%%", c.rate);
+
+ if (can_be_modified && ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left))
+ {
+ is_editing_item = true;
+ is_adding_item = false;
+ editing_item_index = i;
+ new_tax_bracket = c;
+ }
+ }
+
+ // When adding a new entry it is displayed at the bottom of the list of the country we are adding to.
+ // Check for end of list (for last country in the list), or check if next country differs from current country.
+ // If it is different we have reached the end of the list for the current country.
+ if (i == tax_bracket_count-1 || (i < tax_bracket_count-1 && strcmp(tax_brackets[i+1].country_code, c.country_code) != 0))
+ {
+ if (is_adding_item && strcmp(new_tax_bracket.country_code, prev_country) == 0)
+ {
+ ImGui::TableNextRow();
+ ImGui::TableSetColumnIndex(0); ImGui::Text("");
+ ImGui::TableSetColumnIndex(1);
+ ImGui::InputFloat("##Rate", &new_tax_bracket.rate, 1.0f, 5.0f, "%.2f");
+
+ if (new_tax_bracket.rate < 0.0f) new_tax_bracket.rate = 0.0f;
+ if (new_tax_bracket.rate > 100.0f) new_tax_bracket.rate = 100.0f;
+
+ ImGui::SameLine();
+ if (ImGui::Button(localize("form.save"))) {
+ is_editing_item = false;
+ is_adding_item = false;
+
+ administration_add_tax_bracket(new_tax_bracket);
+
+ ui_destroy_settings();
+ ui_setup_settings();
+ }
+
+ ImGui::SameLine();
+ if (ImGui::Button(localize("form.cancel"))) {
+ is_editing_item = false;
+ is_adding_item = false;
+ memset(&new_tax_bracket, 0, sizeof(new_tax_bracket));
+ }
+ }
+ }
}
ImGui::EndTable();
@@ -97,14 +206,18 @@ static void ui_draw_cost_centers()
cost_center c = cost_centers[i];
ImGui::TableNextRow();
+
+ // Column 1: Code of cost center.
ImGui::TableSetColumnIndex(0); ImGui::Text(c.code);
- ImGui::TableSetColumnIndex(1);
-
+
+ // Column 2: When editing, show inputs for new description. Else show stored description and check for modify request.
+ ImGui::TableSetColumnIndex(1);
if (is_editing_item && editing_item_index == i)
{
- ImGui::InputText("##Description", new_cost_center.description, IM_ARRAYSIZE(new_cost_center.description));
-
bool is_desc_valid = administration_verify_cost_center_description(new_cost_center.description);
+ if (!is_desc_valid) ImGui::PushStyleColor(ImGuiCol_FrameBg, IM_COL32(105, 43, 43, 255));
+ ImGui::InputText("##Description", new_cost_center.description, IM_ARRAYSIZE(new_cost_center.description));
+ if (!is_desc_valid) ImGui::PopStyleColor();
if (!is_desc_valid) ImGui::BeginDisabled();
ImGui::SameLine();
@@ -113,37 +226,48 @@ static void ui_draw_cost_centers()
is_adding_item = false;
administration_update_cost_center(new_cost_center);
+ memset(&new_cost_center, 0, sizeof(new_cost_center));
ui_destroy_settings();
ui_setup_settings();
}
if (!is_desc_valid) ImGui::EndDisabled();
+
+ ImGui::SameLine();
+ if (ImGui::Button(localize("form.cancel"))) {
+ is_editing_item = false;
+ is_adding_item = false;
+ memset(&new_cost_center, 0, sizeof(new_cost_center));
+ }
}
else
{
ImGui::Text(localize(c.description));
- }
- if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left))
- {
- is_editing_item = true;
- is_adding_item = false;
- editing_item_index = i;
- new_cost_center = c;
- }
+ if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left))
+ {
+ is_editing_item = true;
+ is_adding_item = false;
+ editing_item_index = i;
+ new_cost_center = c;
+ }
+ }
}
+ // When adding a new item. Show inputs for code and description, check validity, and handle save/cancel.
+ // Form for new entry is displayed at bottom of list.
if (is_adding_item)
{
ImGui::TableNextRow();
bool is_code_valid = administration_verify_cost_center_code(new_cost_center.code);
- if (!is_code_valid) ImGui::PushStyleColor(ImGuiCol_FrameBg, IM_COL32(255, 0, 0, 64));
- ImGui::TableSetColumnIndex(0); ImGui::InputText("##Code", new_cost_center.code, IM_ARRAYSIZE(new_cost_center.code));
+ if (!is_code_valid) ImGui::PushStyleColor(ImGuiCol_FrameBg, IM_COL32(105, 43, 43, 255));
+ ImGui::TableSetColumnIndex(0); ImGui::InputText("##Code", new_cost_center.code, IM_ARRAYSIZE(new_cost_center.code),
+ ImGuiInputTextFlags_CharsUppercase|ImGuiInputTextFlags_CharsNoBlank);
if (!is_code_valid) ImGui::PopStyleColor();
bool is_desc_valid = administration_verify_cost_center_description(new_cost_center.description);
- if (!is_desc_valid) ImGui::PushStyleColor(ImGuiCol_FrameBg, IM_COL32(255, 0, 0, 64));
+ if (!is_desc_valid) ImGui::PushStyleColor(ImGuiCol_FrameBg, IM_COL32(105, 43, 43, 255));
ImGui::TableSetColumnIndex(1); ImGui::InputText("##Description", new_cost_center.description, IM_ARRAYSIZE(new_cost_center.description));
if (!is_desc_valid) ImGui::PopStyleColor();
@@ -161,11 +285,19 @@ static void ui_draw_cost_centers()
ui_setup_settings();
}
if (!can_save) ImGui::EndDisabled();
+
+ ImGui::SameLine();
+ if (ImGui::Button(localize("form.cancel"))) {
+ is_adding_item = false;
+ is_editing_item = false;
+ memset(&new_cost_center, 0, sizeof(new_cost_center));
+ }
}
ImGui::EndTable();
}
+ // If not adding a new item already, show create button at bottom of list.
if (!is_adding_item && ImGui::Button(localize("form.create")))
{
is_adding_item = true;