BreweryControlSystem/code/src/order_tab.rs

146 lines
4.3 KiB
Rust

use std::sync::Arc;
use egui::{Sense, mutex::RwLock};
use egui_extras::Column;
use crate::{
database::DBOperator,
misc,
models::Order,
tab::{TABS_CAN_BE_WINDOWS, Tab, TabTypes},
};
pub struct OrderTabViewer {
db_oper: DBOperator,
rt: tokio::runtime::Runtime,
incoming_orders: Arc<RwLock<Vec<Order>>>,
outcoming_orders: Arc<RwLock<Vec<Order>>>,
incoming_order_page: i32,
outcoming_order_page: i32,
is_admin: bool,
}
impl OrderTabViewer {
pub fn new(is_admin: bool) -> Self {
Self {
is_admin,
..Default::default()
}
}
pub fn show_orders(&mut self, ui: &mut egui::Ui, incoming_orders: bool) {
let orders = if incoming_orders {
&self.incoming_orders
} else {
&self.outcoming_orders
};
ui.horizontal(|ui| {
if ui.button("Добавить").clicked() {}
if ui.button("<-").clicked() {}
ui.monospace(if incoming_orders {
self.incoming_order_page.to_string()
} else {
self.outcoming_order_page.to_string()
});
if ui.button("->").clicked() {}
});
egui_extras::TableBuilder::new(ui)
.columns(Column::auto(), 5)
.striped(true)
.vscroll(true)
.sense(Sense::click())
.header(25.0, |mut heading| {
heading.col(|ui| {
ui.heading(if incoming_orders {
"Заказчик"
} else {
"Клиент"
});
});
heading.col(|ui| {
ui.heading("Состав");
});
heading.col(|ui| {
ui.heading("Стоимость");
});
heading.col(|ui| {
ui.heading("Дата создания");
});
})
.body(|mut body| {
for or in orders.read().iter() {
body.row(25.0, |mut row| {
let len = orders.read().iter().clone().len();
row.col(|ui| {
ui.label(&or.client.name);
});
row.col(|ui| {
ui.label(match len {
0 => "Пусто".to_owned(),
_ => format!("{} пт.", len),
});
});
row.col(|ui| {
ui.label(len.to_string());
});
row.col(|ui| {
ui.label(or.order_date.date_naive().to_string());
});
row.col(|ui| if ui.button("Удалить").clicked() {});
});
}
});
}
}
impl egui_dock::TabViewer for OrderTabViewer {
type Tab = Tab;
fn title(&mut self, tab: &mut Self::Tab) -> egui::WidgetText {
tab.title.clone().into()
}
fn ui(&mut self, ui: &mut egui::Ui, tab: &mut Self::Tab) {
match tab.tab_type {
TabTypes::IncomingOrderList => {
self.show_orders(ui, true);
}
TabTypes::OutcomingOrderList => {
self.show_orders(ui, false);
}
_ => {
ui.label("Nope");
}
}
}
fn allowed_in_windows(&self, _tab: &mut Self::Tab) -> bool {
TABS_CAN_BE_WINDOWS
}
fn is_closeable(&self, _tab: &Self::Tab) -> bool {
false
}
}
impl Default for OrderTabViewer {
fn default() -> Self {
let rt = tokio::runtime::Runtime::new().unwrap();
let db_oper = rt.block_on(async { DBOperator::new().await });
Self {
incoming_orders: Arc::new(RwLock::new(
rt.block_on(async { db_oper.get_orders(0, misc::ELEMENTS_PER_PAGE, true).await }),
)),
outcoming_orders: Arc::new(RwLock::new(
rt.block_on(async { db_oper.get_orders(0, misc::ELEMENTS_PER_PAGE, false).await }),
)),
incoming_order_page: 0,
outcoming_order_page: 0,
db_oper,
rt,
is_admin: false,
}
}
}