FrymasterBadgeApp/EmployeeFormPage.xaml.cs

220 lines
8.5 KiB
C#

using System.Text;
using FrymasterBadgeApp.Services;
using Microsoft.Data.SqlClient;
namespace FrymasterBadgeApp;
public partial class EmployeeFormPage : ContentPage
{
private readonly SqlService _db;
private readonly Dictionary<string, object>? _existingEmployee;
public Action<Dictionary<string, object>> OnSavedCallback { get; set; }
private readonly bool _isEditMode;
private string _tempCapturePath = "";
private double _editX = 0;
private double _editY = 0;
private readonly string _photosBasePath;
public bool IsSaved { get; private set; } = false;
public Dictionary<string, object>? SavedEmployee { get; private set; }
public EmployeeFormPage(SqlService db, Dictionary<string, object>? employee = null)
{
InitializeComponent();
_db = db;
_existingEmployee = employee;
_isEditMode = employee != null;
_photosBasePath = Preferences.Default.Get("PhotoBasePath", @"C:\FrymasterData\photos");
EditorPhotoPreview.SetBinding(
Image.ScaleProperty,
new Binding("Value", source: ZoomSlider)
);
if (_isEditMode)
SetupEditMode(employee!);
else
SetupAddMode();
}
private void SetupEditMode(Dictionary<string, object> employee)
{
TitleLabel.Text = "Edit Employee";
SaveButton.Text = "Update";
BadgeFetchButton.Text = "Update Badge";
Data1Entry.Text = employee.GetValueOrDefault("Data1")?.ToString() ?? "";
Data1Entry.IsEnabled = false;
Data2Entry.Text = employee.GetValueOrDefault("Data2")?.ToString() ?? "";
Data3Entry.Text = employee.GetValueOrDefault("Data3")?.ToString() ?? "";
LastNameEntry.Text = employee.GetValueOrDefault("LastName")?.ToString() ?? "";
Data4Entry.Text = employee.GetValueOrDefault("Data4")?.ToString() ?? "";
Data9Entry.Text = employee.GetValueOrDefault("Data9")?.ToString() ?? "";
if (
DateTime.TryParse(employee.GetValueOrDefault("Data5")?.ToString(), out DateTime dateVal)
)
Data5DatePicker.Date = dateVal;
MedicalCheckBox.IsChecked =
(employee.GetValueOrDefault("Data7")?.ToString() ?? "False") == "True";
EmsCheckBox.IsChecked = (employee.GetValueOrDefault("Data8")?.ToString() ?? "0") == "1";
ActiveCheckBox.IsChecked =
(employee.GetValueOrDefault("Active")?.ToString()?.ToUpper() ?? "NO") == "YES";
string picCode = employee.GetValueOrDefault("picCode")?.ToString() ?? "";
string photoPath = Path.Combine(_photosBasePath, $"{picCode}.jpg");
if (File.Exists(photoPath))
{
EditorPhotoPreview.Source = ImageSource.FromFile(photoPath);
_editX = SafeToDouble(employee.GetValueOrDefault("cropX"), 0.0);
_editY = SafeToDouble(employee.GetValueOrDefault("cropY"), 0.0);
EditorPhotoPreview.TranslationX = _editX;
EditorPhotoPreview.TranslationY = _editY;
ZoomSlider.Value = SafeToDouble(employee.GetValueOrDefault("cropScale"), 1.0);
}
}
private void SetupAddMode()
{
TitleLabel.Text = "Add Employee";
Data1Entry.Text = "";
Data5DatePicker.Date = DateTime.Today;
ActiveCheckBox.IsChecked = true;
}
private async void OnTakePhotoClicked(object sender, EventArgs e)
{
try
{
var photo = await MediaPicker.Default.CapturePhotoAsync();
if (photo == null)
return;
_tempCapturePath = Path.Combine(FileSystem.CacheDirectory, "temp_form_capture.jpg");
using (var source = await photo.OpenReadAsync())
using (var destination = File.OpenWrite(_tempCapturePath))
await source.CopyToAsync(destination);
EditorPhotoPreview.Source = ImageSource.FromFile(_tempCapturePath);
_editX = _editY = 0;
EditorPhotoPreview.TranslationX = 0;
EditorPhotoPreview.TranslationY = 0;
ZoomSlider.Value = 1;
}
catch (Exception ex)
{
await DisplayAlert("Error", ex.Message, "OK");
}
}
private void OnPanUpdated(object sender, PanUpdatedEventArgs e)
{
if (e.StatusType == GestureStatus.Running)
{
EditorPhotoPreview.TranslationX = _editX + e.TotalX;
EditorPhotoPreview.TranslationY = _editY + e.TotalY;
}
else if (e.StatusType == GestureStatus.Completed)
{
_editX = EditorPhotoPreview.TranslationX;
_editY = EditorPhotoPreview.TranslationY;
}
}
private async void OnFetchBadgeClicked(object sender, EventArgs e)
{
Data9Entry.Text = await GenerateUniqueBadgeNumberAsync();
}
private async void OnSaveClicked(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(Data2Entry.Text))
return;
try
{
string recordNum = Data1Entry.Text.Trim();
string picCode = _existingEmployee?.GetValueOrDefault("picCode")?.ToString() ?? "";
if (!string.IsNullOrEmpty(_tempCapturePath))
{
picCode = $"{recordNum}_{DateTime.Now.Ticks}";
File.Copy(_tempCapturePath, Path.Combine(_photosBasePath, $"{picCode}.jpg"), true);
}
var parameters = new List<SqlParameter>
{
new SqlParameter("@Data1", recordNum),
new SqlParameter("@Data2", Data2Entry.Text),
new SqlParameter("@Data3", Data3Entry.Text ?? ""),
new SqlParameter("@LastName", LastNameEntry.Text ?? ""),
new SqlParameter("@Data4", Data4Entry.Text ?? ""),
new SqlParameter("@Data5", Data5DatePicker.Date),
new SqlParameter("@Data9", Data9Entry.Text ?? ""),
new SqlParameter("@Data7", MedicalCheckBox.IsChecked ? "True" : "False"),
new SqlParameter("@Data8", EmsCheckBox.IsChecked ? "1" : "0"),
new SqlParameter("@Active", ActiveCheckBox.IsChecked ? "YES" : "NO"),
new SqlParameter("@picCode", picCode),
new SqlParameter("@cropX", EditorPhotoPreview.TranslationX),
new SqlParameter("@cropY", EditorPhotoPreview.TranslationY),
new SqlParameter("@cropScale", ZoomSlider.Value),
};
string sql = _isEditMode
? "UPDATE dbo.tblData SET Data1=@Data1, Data2=@Data2, Data3=@Data3, LastName=@LastName, Data4=@Data4, Data5=@Data5, Data9=@Data9, Data7=@Data7, Data8=@Data8, Active=@Active, picCode=@picCode, cropX=@cropX, cropY=@cropY, cropScale=@cropScale WHERE Data1=@Data1"
: "INSERT INTO dbo.tblData (Data1, Data2, Data3, LastName, Data4, Data5, Data9, Data7, Data8, Active, picCode, cropX, cropY, cropScale, BadgeType, ToPrint, CdsPrinted) VALUES (@Data1, @Data2, @Data3, @LastName, @Data4, @Data5, @Data9, @Data7, @Data8, @Active, @picCode, @cropX, @cropY, @cropScale, 'Office', 0, 0)";
_db.Execute(sql, parameters.ToArray());
try
{
// After successful DB execution:
var savedData = new Dictionary<string, object>
{
{ "Data1", recordNum },
{ "Data2", Data2Entry.Text },
};
// Trigger the callback before closing
OnSavedCallback?.Invoke(savedData);
await Navigation.PopModalAsync();
}
catch (Exception ex)
{
await DisplayAlert("Error", ex.Message, "OK");
}
IsSaved = true;
await Navigation.PopModalAsync();
}
catch (Exception ex)
{
await DisplayAlert("Save Error", ex.Message, "OK");
}
}
private async Task<string> GenerateUniqueBadgeNumberAsync()
{
return $"*$F{Random.Shared.Next(100000, 999999)}$A*";
}
private string GenerateNextRecordNumber()
{
var result = _db.Query(
"SELECT MAX(CAST(Data1 AS INT)) FROM dbo.tblData WHERE ISNUMERIC(Data1) = 1",
null
)
.FirstOrDefault();
return (
result != null ? (int.Parse(result.Values.First().ToString()) + 1) : 100001
).ToString();
}
private double SafeToDouble(object? val, double defaultVal) =>
val != null && double.TryParse(val.ToString(), out double res) ? res : defaultVal;
private async void OnCancelClicked(object sender, EventArgs e) =>
await Navigation.PopModalAsync();
}