@using System.Diagnostics @using FluentValidation; @using Somnia.GuestLog.Models.DTOs; @using Somnia.GuestLog.Services; @using Somnia.GuestLog.Validators; @inject IDataListService dataListService; @inject IValidator stayValidator; @inject IDialogService dialogService; @inject ISnackbar snackbar @LanguageLocale.control_StayEntryForm_sectionDetails @foreach (string payment in PaymentMethodSet) { @dataListService.GetLocalizedValue(GuestConsts.DataList_PaymentMethods, payment) } @LanguageLocale.control_StayEntryForm_sectionGuests @if (!ReadOnly) { @LanguageLocale.control_StayEntryForm_btnAddGuest } @LanguageLocale.dto_GuestDocument_DocumentType @LanguageLocale.dto_GuestDocument_DocumentNum @LanguageLocale.dto_GuestDocument_Name @LanguageLocale.dto_GuestDocument_Surname @LanguageLocale.dto_GuestDocument_Surname2 @if (!ReadOnly) { @LanguageLocale.general_actions } @context.DocumentType @context.DocumentNum @context.Name @context.Surname @context.Surname2 @if (!ReadOnly) { } @code { [Parameter] public StayEntryDTO Model { private get; set; } = new(); [Parameter] public bool ReadOnly { get; set; } = false; private TimeSpan? TimeIn = DateTime.Now.TimeOfDay; private TimeSpan? TimeOut = new(hours: 12, minutes: 0, seconds: 0); private MudForm _form = null!; private const string FieldMarginY = "margin-block: 0.5em"; private IEnumerable PaymentMethodSet { get { if (field is null) { field = dataListService.GetDataListByName(GuestConsts.DataList_PaymentMethods); } return field; } } protected override void OnInitialized() { Model.DateIn = DateTime.Today; } #region Public Methods public async Task ValidateForm() { await _form.ValidateAsync(); if (Model.GuestDocuments is null || Model.GuestDocuments.Count == 0) { snackbar.Add("At least 1 guest is required!", MudBlazor.Severity.Warning); return false; } return _form.IsValid; } public StayEntryDTO GetModel() { //Update model times. Model.DateIn = GetDateTimeFromDateAndTime(Model.DateIn, TimeIn); Model.DateOut = GetDateTimeFromDateAndTime(Model.DateOut, TimeOut); return Model; } #endregion private static DateTime? GetDateTimeFromDateAndTime(DateTime? date, TimeSpan? time) { DateOnly? dateOnly = date is not null ? DateOnly.FromDateTime(date.Value) : null; TimeOnly? timeOnly = time is not null ? TimeOnly.FromTimeSpan(time.Value) : null; if (dateOnly is not null && timeOnly is not null) { return new DateTime(dateOnly.Value, timeOnly.Value); } return null; } #region Event Handlers private async Task BtnAddGuest() { var dialog = await dialogService.ShowAsync(); DialogResult? result = await dialog.Result; if (result is null || result.Canceled) { return; } GuestDocumentDTO? resultData = await dialog.GetReturnValueAsync(); if (resultData is null) { snackbar.Add("Error! No Guest Document selected!", MudBlazor.Severity.Error); return; } //Check if this guest is already added. if (Model.GuestDocuments is not null && Model.GuestDocuments.Count > 0) { bool alreadyAdded = Model.GuestDocuments.Any(e => e.DocumentType == resultData.DocumentType && e.DocumentNum == resultData.DocumentNum); if (alreadyAdded) { snackbar.Add("GuestDocument already added!", MudBlazor.Severity.Warning); return; } } //Init List. if (Model.GuestDocuments is null) { Model.GuestDocuments = []; } Model.GuestDocuments.Add(resultData); } private void BtnDeleteGuest(string docType, string docNum) { Debug.Assert(Model.GuestDocuments is not null); //Filter out given GuestDocument from model. Model.GuestDocuments = Model.GuestDocuments .Where(e => !(e.DocumentType == docType && e.DocumentNum == docNum)) .ToList(); } #endregion }