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/Demo/Detail.razor |  244 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 244 insertions(+), 0 deletions(-)

diff --git a/HotelPms.Client.Blazor/Pages/Pages/Master/Demo/Detail.razor b/HotelPms.Client.Blazor/Pages/Pages/Master/Demo/Detail.razor
new file mode 100644
index 0000000..4fd065a
--- /dev/null
+++ b/HotelPms.Client.Blazor/Pages/Pages/Master/Demo/Detail.razor
@@ -0,0 +1,244 @@
+@page "/master/demo/detail/{id:int}"
+@inject GrpcChannel Channel
+@inject IJSRuntime JSRuntime
+@inject NavigationManager NavigationManager
+@using HotelPms.Share.IO
+@using HotelPms.Share.Util
+@using HotelPms.Data.Common
+@using ViewModel = HotelPms.Client.Blazor.ViewModel
+@using static HotelPms.Client.Blazor.Util.SystemEnum
+<MudGrid Spacing="1" Justify="Justify.FlexStart" Class="align-center mt-2 mb-5">
+    <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>
+@if (Data != null)
+{
+    <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)
+            {
+                <MudItem xs="@field.DispWidthUnit">
+                    <MudField Variant="Variant.Filled" Margin="Margin.Dense">@field.DispText</MudField>
+                </MudItem>
+            }
+
+            if (field.NewLine)
+            {
+                 <MudItem xs="@(12 - field.WidthUnit)"></MudItem>
+            }
+        }
+    </MudGrid>
+}
+
+@code {
+    [Parameter]public int ID { get; set; }
+    [Inject] private IDialogService? DialogService { get; set; }
+    private ViewModel.Demo? Data;
+    private string errorAll = string.Empty;
+    private MudButton? btnSave;
+
+    /// <summary>
+    /// onfocusの変数化可能になった
+    /// </summary>
+    protected override void OnInitialized()
+    {        
+        Data = CacheStorage.Instance.Get(CacheStorage.Key.ViewModel) as ViewModel.Demo;  //簡単&乱暴
+        Data.Refresh = new Action(StateHasChanged);  //メイン画面の更新
+        Data.BeforeAutoNextFocus += BeforeAutoNextFocus;
+        Data.BusinessValid += BusinessValid;
+        Data.ShowList += ShowList;
+    }
+
+    private async void ShowList(ViewModel.ValidField sender, ViewModel.ValidEventArgs e)
+    {
+        await ShowListAction(sender);
+    }
+
+    /// <summary>
+    /// 業務チェックを行う
+    /// </summary>
+    /// <param name="sender"></param>
+    /// <param name="e"></param>
+    /// <returns></returns>
+    private async Task<bool> BusinessValid(ViewModel.ValidField sender, ViewModel.ValidEventArgs e)
+    {
+        if (sender.Name == "ID")
+        {
+            using (DemoAccess access = new DemoAccess(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 == "FBit")
+        {
+            sender.DispText = ((EVisible)CConvert.ToInt(e.Text)).ToDescription<EVisible>();
+        }
+
+        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(ViewModel.ValidField sender, ViewModel.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 == "FBit")
+        {
+            if (item.Text.Length == 0) { return; }
+            using (DataTable data = CConvert.GetEnumTypeList<EVisible>())
+            {
+                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 == "FDate")
+        {
+            var parameters = new DialogParameters { ["Title"] = $"{item.Caption}選択", ["Data"] = CConvert.ToDateTime(item.Text) };
+            var dialog = DialogService.Show<SelectDate>(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 async void Save()
+    {
+        if (!await Data.IsValidAll())
+        {
+            //errorAll = Data.ErrText;
+            return;
+        }
+
+        //データ保存
+        using (DemoAccess access = new DemoAccess(Channel))
+        {
+            HotelPms.Data.Master.Demo item = new HotelPms.Data.Master.Demo()
+            {
+                ID = CConvert.ToInt(Data.GetField("ID").Text),
+                Name = Data.GetField("Name").Text,
+                FInt = CConvert.ToInt(Data.GetField("FInt").Text),
+                FTinyInt = CConvert.ToInt(Data.GetField("FTinyInt").Text),
+                FSmallInt = CConvert.ToInt(Data.GetField("FSmallInt").Text),
+                FFloat = CConvert.ToInt(Data.GetField("FFloat").Text),
+                FBit = CConvert.ToBool(Data.GetField("FBit").Text),
+                FDecimal = CConvert.ToDecimal(Data.GetField("FDecimal").Text),
+                FDate = CConvert.ToDateTime(Data.GetField("FDate").Text),
+            };
+
+            var result = Data.EditMode == (int)EMasterEditStatus.Create ?  await access.AddAsync(item) : await access.UpdateAsync(item);
+            if(result.ErrNo != 0)
+            {
+                errorAll = $"更新に失敗しました。";
+                OperationLog.Instance.WriteLog($"Demo.Save:{result.ErrNo}.{result.ErrData}");
+                return; 
+            }
+        }
+
+        NavigationManager.NavigateTo($"master/demo/crud", false);
+    }
+
+    /// <summary>
+    /// 前の頁に戻る
+    /// </summary>
+    private void Close()
+    {
+        NavigationManager.NavigateTo($"master/demo/crud", false);
+    }
+}

--
Gitblit v1.10.0