|
|
@@ -78,7 +78,7 @@ impl KioskLoginView {
|
|
|
offset: None,
|
|
|
joins: None,
|
|
|
};
|
|
|
-
|
|
|
+
|
|
|
if let Ok(response) = client.query(&role_req) {
|
|
|
if response.success {
|
|
|
if let Some(data) = response.data {
|
|
|
@@ -90,17 +90,20 @@ impl KioskLoginView {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // Build users request
|
|
|
let request = QueryRequest {
|
|
|
action: "select".to_string(),
|
|
|
table: "users".to_string(),
|
|
|
- columns: Some(vec!["id".to_string(), "username".to_string(), "name".to_string(), "role_id".to_string()]),
|
|
|
+ columns: Some(vec![
|
|
|
+ "id".to_string(),
|
|
|
+ "username".to_string(),
|
|
|
+ "name".to_string(),
|
|
|
+ "role_id".to_string(),
|
|
|
+ ]),
|
|
|
data: None,
|
|
|
r#where: None,
|
|
|
filter: None,
|
|
|
- order_by: Some(vec![OrderBy {
|
|
|
- column: "name".to_string(),
|
|
|
- direction: "ASC".to_string(),
|
|
|
- }]),
|
|
|
+ order_by: Some(vec![OrderBy { column: "name".to_string(), direction: "ASC".to_string() }]),
|
|
|
limit: Some(100),
|
|
|
offset: None,
|
|
|
joins: None,
|
|
|
@@ -297,44 +300,45 @@ impl KioskLoginView {
|
|
|
return self.attempt_login(client);
|
|
|
}
|
|
|
|
|
|
- ui.add_space(20.0);
|
|
|
+ ui.add_space(10.0);
|
|
|
|
|
|
// OSK
|
|
|
if self.ui_settings.enable_osk {
|
|
|
self.show_osk(ui);
|
|
|
- ui.add_space(20.0);
|
|
|
+ ui.add_space(10.0);
|
|
|
}
|
|
|
|
|
|
- let result = ui.horizontal(|ui| {
|
|
|
- // Align buttons to bottom/center; shrink if needed to keep on-screen
|
|
|
- let mut btn_h = self.ui_settings.button_height;
|
|
|
- let avail_h = ui.available_height();
|
|
|
- if avail_h < btn_h + 12.0 {
|
|
|
- btn_h = (avail_h - 12.0).max(36.0);
|
|
|
- }
|
|
|
- let btn_size = egui::vec2(150.0, btn_h);
|
|
|
- let total_width = btn_size.x * 2.0 + 20.0; // 2 buttons + spacing
|
|
|
- let available_width = ui.available_width();
|
|
|
- let margin = (available_width - total_width) / 2.0;
|
|
|
-
|
|
|
- if margin > 0.0 {
|
|
|
- ui.add_space(margin);
|
|
|
- }
|
|
|
-
|
|
|
- if ui.add_sized(btn_size, egui::Button::new(egui::RichText::new("Back").size((self.ui_settings.font_size * 0.8).min(btn_h * 0.6)))).clicked() {
|
|
|
- self.selected_user = None;
|
|
|
- self.pin_input.clear();
|
|
|
- self.error_message = None;
|
|
|
- }
|
|
|
-
|
|
|
- ui.add_space(20.0);
|
|
|
+ // Reserve a bottom strip and place action buttons centered, respecting button_height
|
|
|
+ let result = ui.allocate_ui_with_layout(
|
|
|
+ egui::vec2(ui.available_width(), self.ui_settings.button_height),
|
|
|
+ egui::Layout::bottom_up(egui::Align::Center),
|
|
|
+ |ui| {
|
|
|
+ ui.horizontal(|ui| {
|
|
|
+ let btn_h = self.ui_settings.button_height;
|
|
|
+ let btn_size = egui::vec2(150.0, btn_h);
|
|
|
+ let label_size = (self.ui_settings.font_size * 0.8).min(btn_h * 0.6);
|
|
|
+
|
|
|
+ let total_width = btn_size.x * 2.0 + 30.0; // 2 buttons + spacing
|
|
|
+ let available_width = ui.available_width();
|
|
|
+ let margin = (available_width - total_width) / 2.0;
|
|
|
+ if margin > 0.0 { ui.add_space(margin); }
|
|
|
+
|
|
|
+ if ui.add_sized(btn_size, egui::Button::new(egui::RichText::new("Back").size(label_size))).clicked() {
|
|
|
+ self.selected_user = None;
|
|
|
+ self.pin_input.clear();
|
|
|
+ self.error_message = None;
|
|
|
+ }
|
|
|
+
|
|
|
+ ui.add_space(20.0);
|
|
|
|
|
|
- if ui.add_sized(btn_size, egui::Button::new(egui::RichText::new("Login").size((self.ui_settings.font_size * 0.8).min(btn_h * 0.6)))).clicked() {
|
|
|
- return self.attempt_login(client);
|
|
|
+ if ui.add_sized(btn_size, egui::Button::new(egui::RichText::new("Login").size(label_size))).clicked() {
|
|
|
+ return self.attempt_login(client);
|
|
|
+ }
|
|
|
+
|
|
|
+ LoginResult::None
|
|
|
+ }).inner
|
|
|
}
|
|
|
-
|
|
|
- LoginResult::None
|
|
|
- }).inner;
|
|
|
+ ).inner;
|
|
|
|
|
|
if let Some(error) = &self.error_message {
|
|
|
ui.add_space(10.0);
|
|
|
@@ -351,7 +355,7 @@ impl KioskLoginView {
|
|
|
["1", "2", "3"],
|
|
|
["4", "5", "6"],
|
|
|
["7", "8", "9"],
|
|
|
- ["CLR", "0", "DEL"],
|
|
|
+ ["C", "0", "D"],
|
|
|
];
|
|
|
|
|
|
// Adaptive key size to ensure keypad never goes off-screen
|
|
|
@@ -364,7 +368,7 @@ impl KioskLoginView {
|
|
|
let reserved_bottom = self.ui_settings.button_height + 120.0;
|
|
|
let max_h_per_key = ((avail_h - reserved_bottom) - spacing.y * (rows - 1.0)) / rows;
|
|
|
let max_w_per_key = (avail_w - spacing.x * (cols - 1.0)) / cols;
|
|
|
- let key_edge = max_h_per_key.min(max_w_per_key).clamp(48.0, 80.0);
|
|
|
+ let key_edge = max_h_per_key.min(max_w_per_key).clamp(12.0, 80.0);
|
|
|
let btn_size = egui::vec2(key_edge, key_edge);
|
|
|
|
|
|
ui.vertical_centered(|ui| {
|
|
|
@@ -382,14 +386,13 @@ impl KioskLoginView {
|
|
|
let key_font = (self.ui_settings.font_size * 0.8).min(btn_size.y * 0.6).max(16.0);
|
|
|
if ui.add_sized(btn_size, egui::Button::new(egui::RichText::new(key).size(key_font))).clicked() {
|
|
|
match key {
|
|
|
- "CLR" => self.pin_input.clear(),
|
|
|
- "DEL" => { self.pin_input.pop(); },
|
|
|
+ "C" => self.pin_input.clear(),
|
|
|
+ "D" => { self.pin_input.pop(); },
|
|
|
_ => self.pin_input.push_str(key),
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
- ui.add_space(10.0);
|
|
|
}
|
|
|
});
|
|
|
}
|