From 1a1c8e71fcd14858f595029f089b2d4a00202b32 Mon Sep 17 00:00:00 2001
From: ogi <Administrator@S-OGI-PC>
Date: Fri, 05 Dec 2025 09:24:16 +0900
Subject: [PATCH] プロジェクトファイルを追加。

---
 HotelPms.Client.Blazor/Pages/Pages/Master/RoomStatus/Detail.razor |  277 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 277 insertions(+), 0 deletions(-)

diff --git a/HotelPms.Client.Blazor/Pages/Pages/Master/RoomStatus/Detail.razor b/HotelPms.Client.Blazor/Pages/Pages/Master/RoomStatus/Detail.razor
new file mode 100644
index 0000000..4c48db2
--- /dev/null
+++ b/HotelPms.Client.Blazor/Pages/Pages/Master/RoomStatus/Detail.razor
@@ -0,0 +1,277 @@
+@using System.ComponentModel.DataAnnotations
+@using System.Text.RegularExpressions
+@using System.Reflection
+@using HotelPms.Client.Blazor.ViewModel
+@using HotelPms.Data.Common
+@using HotelPms.Data.Common.Interface.Master
+@using HotelPms.DataAccessGrpc.Client
+@using HotelPms.Share.IO
+@using HotelPms.Share.Util
+@using ViewModel = HotelPms.Client.Blazor.ViewModel
+@using static HotelPms.Client.Blazor.Util.SystemEnum
+@inject IJSRuntime JSRuntime
+
+<MudDialog Style="width: 900px;">
+    <TitleContent>
+        <MudText Typo="Typo.h6">
+            <MudIcon Icon="@Icons.Material.Filled.Dvr" Class="mr-3 mb-n1"/>
+            部屋状態マスタ詳細
+        </MudText>
+    </TitleContent>
+    <DialogContent>
+        <MudGrid Justify="Justify.FlexStart" Class="align-center">
+            @if (errorAll.Length > 0)
+            {
+                <MudItem xs="12">
+                    <MudText Color="@Color.Error">@errorAll</MudText>
+                </MudItem>
+            }
+
+            @foreach (var field in Data.Fields)
+            {
+                <MudItem xs="@field.WidthUnit">
+                    <MudTextField @bind-Value="field.Text" Error="@field.Error" ErrorText="@field.ErrorText" @ref="field.Ref" T="string" Label="@field.Caption"
+                              AutoFocus="@((field.Index == 0 && Data.EditMode == (int)EMasterEditStatus.Create) || (field.Index == 1 && Data.EditMode == (int)EMasterEditStatus.Update))"
+                              OnKeyDown="@(e => Data.KeyDown(field.Index, e))" KeyDownPreventDefault="@Data.KeyDownPreventDefault"
+                              OnKeyPress="@(e => Data.KeyPress(field.Index, e))" KeyPressPreventDefault="@Data.KeyPressPreventDefault"
+                              OnBlur="@(e => Data.Leave(field.Index, e))"
+                              @onfocus="(e => Data.Enter(field.Index, e))" Margin="Margin.Dense" maxlength="@field.MaxLenth"
+                              Adornment="@(field.ShowStyle == EShowStyle.ShowList ? Adornment.End : Adornment.None)"
+                              AdornmentIcon="@(field.ShowStyle == EShowStyle.ShowList ? Icons.Material.Filled.ListAlt : string.Empty)"
+                              OnAdornmentClick="@(() => ShowListAction(field))" Disabled="@field.Disabled" />
+                </MudItem>
+
+                if (field.DispNameEnabled)
+                {
+                    if (field.Name == "ForeColor" || field.Name == "BackColor")
+                    {
+                        <MudItem xs="@field.DispWidthUnit">
+                            <MudPaper Class="pa-3" Style="@($"background-color: {field.Text};")"></MudPaper>
+                        </MudItem>
+                    }
+                    else
+                    {                        
+                        <MudItem xs="@field.DispWidthUnit">
+                            <MudField Variant="Variant.Text" Margin="Margin.Dense">@field.DispText</MudField>
+                        </MudItem>
+                    }                    
+                }                
+
+                if (field.NewLine)
+                {
+                    <MudItem xs="@(12 - field.WidthUnit)"></MudItem>
+                }
+            }
+        </MudGrid>
+    </DialogContent>
+    <DialogActions>
+        <MudGrid Spacing="2" Justify="Justify.Center" Class="my-3">
+            <MudItem>
+                <MudButton @ref="btnSave" Variant="Variant.Filled" Color="MudBlazor.Color.Primary" OnClick="Save" StartIcon="@Icons.Filled.Save" Class="focus-button" Style="width: 120px; height: 40px;">保存</MudButton>
+            </MudItem>
+            <MudItem>
+                <MudButton Variant="Variant.Filled" Color="MudBlazor.Color.Primary" OnClick="Close" StartIcon="@Icons.Filled.Close" Class="focus-button" Style="width: 120px; height: 40px;">閉じる</MudButton>
+            </MudItem>
+        </MudGrid>                
+    </DialogActions>
+</MudDialog>
+
+@*<style>
+    /* 伪类选择器 :focus-within */
+    /* 它表示一个元素获得焦点,或,该元素的后代元素获得焦点。划重点,它或它的后代获得焦点。 */
+    /* 这也就意味着,它或它的后代获得焦点,都可以触发 :focus-within。 */
+    .focus-button:focus-within {
+        border: 1px solid;
+        border-color: #00FF00;
+        -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(0, 255, 0, 0.6);
+        -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(0, 255, 0, 0.6);
+        box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.075), 0px 0px 8px rgba(0, 255, 0, 0.6);
+    }
+</style>
+*@
+
+@code {
+    [Inject] private IDialogService DialogService { get; set; }
+    [Inject] private GrpcChannel Channel { get; set; }
+    [CascadingParameter] MudDialogInstance MudDialog { get; set; }
+    [Parameter] public ViewModel.RoomStatus Data { get; set; }
+    private string errorAll = string.Empty;
+    private MudButton btnSave;
+
+    protected override void OnInitialized()
+    {
+        Data.Refresh = new Action(StateHasChanged);  //メイン画面の更新
+        Data.BeforeAutoNextFocus += BeforeAutoNextFocus;
+        Data.BusinessValid += BusinessValid;
+        Data.ShowList += ShowList;  
+    }
+
+    private async void ShowList(ValidField sender, ValidEventArgs e)
+    {
+        await ShowListAction(sender);
+    }
+
+    /// <summary>
+    /// 業務チェックを行う
+    /// </summary>
+    /// <param name="sender"></param>
+    /// <param name="e"></param>
+    /// <returns></returns>
+    private async Task<bool> BusinessValid(ValidField sender, ValidEventArgs e)
+    {
+        if (sender.Name == "ID")
+        {
+            using (RoomStatusAccess access = new RoomStatusAccess(Channel))
+            {
+                bool ret = await access.ExistsAsync(CConvert.ToInt(e.Text));
+                EnvironmentSetting.Debug($"access.Exists:{ret}");
+                if(Data.EditMode == (int)EMasterEditStatus.Create && ret)
+                {
+                    if (e.EnterPush)
+                    {
+                        sender.Error = true;
+                        sender.ErrorText = "当該データが既に存在します。";                        
+                    }
+                    else
+                    {
+                        sender.Error = false;
+                        sender.ErrorText = string.Empty;
+                    } 
+                    //StateHasChanged();
+                    return false;
+                }
+                else if(Data.EditMode == (int)EMasterEditStatus.Update && !ret)
+                {
+                    if (e.EnterPush)
+                    {
+                        sender.Error = true;
+                        sender.ErrorText = "当該データが存在しません。";
+                    }
+                    else
+                    {
+                        sender.Error = false;
+                        sender.ErrorText = string.Empty;
+                    } 
+                    //StateHasChanged();
+                    return false;
+                }
+            }
+        }
+        else if (sender.Name == "MaidType")
+        {
+            sender.DispText = ((EMaidType)CConvert.ToInt(e.Text)).ToDescription<EMaidType>();
+        }
+
+        sender.Error = false;
+        sender.ErrorText = string.Empty;
+        //StateHasChanged();
+        return true;
+    }
+
+    /// <summary>
+    /// フォーカスを移動
+    /// </summary>
+    /// <param name="sender"></param>
+    /// <param name="e"></param>
+    /// <returns></returns>
+    private async Task<bool> BeforeAutoNextFocus(ValidField sender, ValidEventArgs e)
+    {
+        if (sender.Index == Data.Fields.Count - 1 && e.EnterPush)
+        {
+            await btnSave.FocusAsync();   //ここから非同期処理
+            return false;
+        }
+        return true;
+    }
+
+    /// <summary>
+    /// Endキー
+    /// </summary>
+    /// <param name="item"></param>
+    private async Task ShowListAction(ViewModel.ValidField item)
+    {
+        if (item.Name == "MaidType")
+        {
+            if(item.Text.Length == 0) { return; }
+            using (DataTable data = CConvert.GetEnumTypeList<EMaidType>())
+            {
+                var parameters = new DialogParameters { ["Data"] = data };
+                var dialog = DialogService.Show<SelectList>($"{item.Caption}検索", parameters);
+                var ret = await dialog.Result;
+                if (!ret.Cancelled)
+                {
+                    var row = ret.Data as DataRow;
+                    item.Text = row[0].ToString();
+                    item.DispText = row[1].ToString();
+                    StateHasChanged();
+                }
+            }
+        }
+        else if (item.Name == "ForeColor" || item.Name == "BackColor")
+        {
+            var parameters = new DialogParameters { ["Title"] = $"{item.Caption}選択", ["Data"] = item.Text };
+            var dialog = DialogService.Show<SelectColor>(string.Empty, parameters);
+            var ret = await dialog.Result;
+            if (!ret.Cancelled)
+            {
+                EnvironmentSetting.Debug(ret.Data.ToString());
+                item.Text = ret.Data.ToString();
+                StateHasChanged();
+            }
+        }
+        else
+        {
+            await DialogService.ShowMessageBox(
+                "Warning",
+                "未実装!",
+                yesText: "OK", cancelText: "Cancel");
+        }
+    }
+
+    /// <summary>
+    /// 画面閉じる
+    /// </summary>
+    private void Close()
+    {
+        MudDialog.Cancel();
+    }
+
+    /// <summary>
+    /// 保存
+    /// </summary>
+    private async void Save()
+    {
+        if (!await Data.IsValidAll())
+        {
+            //errorAll = Data.ErrText;
+            return;
+        }
+
+        //データ保存
+        using RoomStatusAccess access = new RoomStatusAccess(Channel);       
+        HotelPms.Data.Master.RoomStatus item = new HotelPms.Data.Master.RoomStatus()
+            {
+                ID = CConvert.ToInt(Data.GetField("ID").Text),
+                Name = Data.GetField("Name").Text,
+                ShortName = Data.GetField("ShortName").Text,
+                EnName = Data.GetField("EnName").Text,
+                SortID = CConvert.ToInt(Data.GetField("SortID").Text),
+                ForeColor = Data.GetField("ForeColor").Text,
+                BackColor = Data.GetField("BackColor").Text,
+                MaidType = CConvert.ToInt(Data.GetField("MaidType").Text),
+                Memo = Data.GetField("Memo").Text,
+            };
+        //IMaster im = item as IMaster;
+
+        var result = Data.EditMode == (int)EMasterEditStatus.Create ? await access.AddAsync(item) : await access.UpdateAsync(item);
+        if (result.ErrNo != 0)
+        {
+            errorAll = $"更新に失敗しました。";
+            OperationLog.Instance.WriteLog($"RoomStatus.Save:{result.ErrNo}.{result.ErrData}");
+            return;
+        }
+        
+
+        MudDialog.Close(DialogResult.Ok(Data));
+    }
+}
\ No newline at end of file

--
Gitblit v1.10.0