Files
advotracker/advotracker_client/src/widgets/ticketdata/ticketdata_state.rs
2021-05-21 12:46:33 +02:00

236 lines
11 KiB
Rust

/*
* advotracker - Hotline tackingtool for Advocats
*
* Copyright 2020 Ralf Zerres <ralf.zerres@networkx.de>
* SPDX-License-Identifier: (0BSD or MIT)
*/
//use locales::t;
use orbtk::prelude::*;
use serde::Deserialize;
//use std::process;
//use std::collections::HashMap;
use std::time::SystemTime;
use tracing::{error, info, trace};
use crate::{
data::{constants::*, structures::Email},
widgets::global_state::GlobalState,
services::exports::send_ticketdata::sendticketdata,
widgets::ticketdata::ticketdata_view::TicketdataView,
//widgets::policycheck::policycheck_state::PolicycheckAction,
Lang,
};
/// Valid `actions` that are handled as state changes in the `Ticketdata` widget.
#[derive(Debug, Clone)]
pub enum TicketdataAction {
/// Clear text in the form
ClearForm(String),
ParseEntry(Entity),
SendForm(),
UpdatePolicyCode(String)
}
/// Define valid environment variables provided via .env files
/// located in the current call directory.
/// This is primarily used in testing scenarios (eg. debugging).
#[derive(Debug, Deserialize)]
struct Environment {
test_lang: String,
rust_log: String,
}
/// Valid `structures` that are handled inside the state of the `Ticket` widget.
#[derive(AsAny, Default)]
pub struct TicketdataState {
actions: Vec<TicketdataAction>,
button_menu: Entity,
lang: Lang,
target: Entity
}
impl GlobalState for TicketdataState {}
/// Method definitions, that react on any given state change inside the `Ticketdata` widget.
impl TicketdataState {
/// Clear the text property of all children of the given form entity
pub fn clear_form(entity: Entity, id: &str, ctx: &mut Context<'_>) {
// form is identified by its id
if ctx.entity_of_child(id).is_some() {
let form_entity = ctx.entity_of_child(ID_TICKET_DATA_FORM_GRID).unwrap();
let form_container: WidgetContainer<'_> = ctx.get_widget(form_entity);
// BUG: Why does name defer from id, they are using the same constant?
info!("Form id: {:?}", form_container.get::<String>("id"));
info!("Form name: {:?}", form_container.get::<String>("name"));
//ctx.clear_children_of(form_entity); // complete form is cleared!
// switch into the context of the form_container
ctx.change_into(form_entity);
if let Some(count) = ctx.widget().children_count() {
for i in 0..count {
if let Some(child) = &mut ctx.try_child_from_index(i) {
let child_name: &str = child.get::<String>("name");
info!("child({:?}) name: {:?}",
i, child_name);
let child_id: &str = child.get::<String>("id");
info!("child({:?}) name: {:?}",
i, child_id);
// TODO: check the orbtk type
// if let child_type: bool = child.get::<String>("id") = std::any::type_name::<TextBox>().to_string() {
match child_name {
"TextBox" => TextBox::text_set(child, ""),
"ticket_data_policy_code" => TextBox::text_set(child, ""),
_ => info!("don't act on types other than 'TextBox'"),
}
// match child_id {
// "ticket_data_policy_code" => TextBox::text_set(child, ""),
// "ticket_data_policy_holder" => TextBox::text_set(child, ""),
// "ticket_data_policy_deductible" => TextBox::text_set(child, ""),
// "ticket_data_policy_callback_number" => TextBox::text_set(child, ""),
// "ticket_data_policy_callback_date" => TextBox::text_set(child, ""),
// "ticket_data_policy_callback_harm_type" => TextBox::text_set(child, ""),
// "ticket_data_policy_callback_ivr_comment" => TextBox::text_set(child, ""),
// _ => info!("don't act on child_id '{:?}", child_id),
// }
}
}
}
// switch back to parent entity
ctx.change_into(entity);
Stack::visibility_set(&mut ctx.child(ID_TICKET_DATA_ACTION_STACK), Visibility::Collapsed);
Button::background_set(&mut ctx.child(ID_TICKET_DATA_ACTION_BUTTON_SEND), String::from("#008000"));
Button::icon_set(&mut ctx.child(ID_TICKET_DATA_ACTION_BUTTON_SEND), material_icons_font::MD_SEND);
}
}
pub fn send_form(entity: Entity, ctx: &mut Context<'_>, _lang: Lang) {
info!("TicketdataState: processing entity[{:?}]", entity);
let mail_to_index = *TicketdataView::selected_index_ref(&ctx.widget()) as usize;
let mail_to_item = TicketdataView::mail_to_ref(&ctx.widget())[mail_to_index].clone();
info!("mail_to item[{:?}]: {:?}]", mail_to_index, mail_to_item);
// create Email structures
let email = Email {
mail_to: mail_to_item.to_string(),
mail_cc: PROP_MAIL_CC_1.to_string(),
mail_bcc: PROP_MAIL_BCC_1.to_string(),
mail_from: PROP_MAIL_FROM.to_string(),
mail_reply: PROP_MAIL_REPLY.to_string(),
subject: PROP_MAIL_SUBJECT.to_string(),
policy_code: ctx.child(ID_TICKET_DATA_POLICY_CODE).get::<String>("text").to_string(),
policy_holder: ctx.child(ID_TICKET_DATA_POLICY_HOLDER).get::<String>("text").to_string(),
deductible: ctx.child(ID_TICKET_DATA_DEDUCTIBLE).get::<String>("text").to_string(),
callback_number: ctx.child(ID_TICKET_DATA_CALLBACK_NUMBER).get::<String>("text").to_string(),
callback_date: ctx.child(ID_TICKET_DATA_CALLBACK_DATE).get::<String>("text").to_string(),
harm_type: ctx.child(ID_TICKET_DATA_HARM_TYPE).get::<String>("text").to_string(),
ivr_comment: ctx.child(ID_TICKET_DATA_IVR_COMMENT).get::<String>("text").to_string(),
};
trace!("eMail fields: {:?}", email);
// send email via service
let lang = Lang::De("");
if let Err(err) = sendticketdata(&email, &lang) {
error!("sendticketdata error: {:?}", err);
Button::icon_brush_set(&mut ctx.child(ID_TICKET_DATA_ACTION_BUTTON_SEND), String::from("#008000"));
//Button::foreground_set(&mut ctx.child(ID_TICKET_DATA_ACTION_BUTTON_SEND), String::from("#CC000000"));
Button::background_set(&mut ctx.child(ID_TICKET_DATA_ACTION_BUTTON_SEND), String::from("#CC000000"));
Button::icon_set(&mut ctx.child(ID_TICKET_DATA_ACTION_BUTTON_SEND), material_icons_font::MD_THUMB_DOWN);
//Button::icon_set(&mut ctx.child(ID_TICKET_DATA_ACTION_BUTTON_SEND), material_icons_font::MD_ERROR);
} else {
Button::icon_brush_set(&mut ctx.child(ID_TICKET_DATA_ACTION_BUTTON_SEND), String::from("#FF0000"));
//Button::foreground_set(&mut ctx.child(ID_TICKET_DATA_ACTION_BUTTON_SEND), String::from("#FF0000"));
Button::background_set(&mut ctx.child(ID_TICKET_DATA_ACTION_BUTTON_SEND), String::from("#FF0000"));
Button::icon_set(&mut ctx.child(ID_TICKET_DATA_ACTION_BUTTON_SEND), material_icons_font::MD_THUMB_UP);
};
}
pub fn update_policy_code(_entity: Entity, _id: &str, ctx: &mut Context<'_>) {
Stack::visibility_set(&mut ctx.child(ID_TICKET_DATA_ACTION_STACK), Visibility::Visible);
//self.actions.push(TicketdataAction::UpdatePolicyCode(entity));
}
}
/// Supported methods handled inside the `TicketState`
impl State for TicketdataState {
/// Initialize the state of widgets inside `TicketState`
fn init(&mut self, _: &mut Registry, ctx: &mut Context<'_>) {
let time_start= SystemTime::now();
trace!(target: "advotracker", ticketdata_state = "init", status = "started");
// Initialize required menu button entity
self.button_menu = ctx
.entity_of_child(ID_TICKET_DATA_BUTTON_MENU)
.expect("TicketState.init: Can't find resource entity 'ID_TICKET_DATA_BUTTON_MENU'.");
// initialize the entity object, that will receive messages
self.target = Entity::from(ctx.widget().try_clone::<u32>("target")
.expect("TicketState.init: Can't find resource entity 'target'."));
// Get language from environment
//self.lang = TicketdataState::get_lang();
//let self.lang = Lang::De("");
Stack::visibility_set(&mut ctx.child(ID_TICKET_DATA_ACTION_STACK), Visibility::Collapsed);
Button::icon_set(&mut ctx.child(ID_TICKET_DATA_ACTION_BUTTON_CLEAR), material_icons_font::MD_CLEAR);
Button::icon_set(&mut ctx.child(ID_TICKET_DATA_ACTION_BUTTON_SEND), material_icons_font::MD_SEND);
let time_end = SystemTime::now();
let duration = time_end.duration_since(time_start);
trace!(target: "advotracker", ticketdata_state = "init", status = "finished", duration = ?duration);
}
/// The reader component of the message system handing `TicketdataState``
fn messages(
&mut self,
mut messages: MessageReader,
_registry: &mut Registry,
ctx: &mut Context<'_>,
) {
for message in messages.read::<TicketdataAction>() {
match message {
TicketdataAction::ClearForm(id) => {
TicketdataState::clear_form(ctx.entity(), &id, ctx);
}
TicketdataAction::SendForm() => {
TicketdataState::send_form(ctx.entity(), ctx, self.lang);
}
TicketdataAction::UpdatePolicyCode(id) => {
TicketdataState::update_policy_code(ctx.entity(), &id, ctx);
}
_ => { println!("messages: action not implemented!"); }
}
}
}
fn update(&mut self, _registry: &mut Registry, ctx: &mut Context<'_>) {
let actions: Vec<TicketdataAction> = self.actions.drain(..).collect();
for action in actions {
match action {
TicketdataAction::ClearForm(ref id) => {
ctx.send_message(TicketdataAction::ClearForm(id.to_string()), self.target);
}
// TicketdataAction::SendForm() => {
// //ctx.send_message(TicketdataAction::SendForm(), self.ID_TICKETDATA_FORM);
// info!("update: got send_message {:?}", action);
// }
_ => { println!("TicketdataAction: action not implemented!"); }
}
}
}
}