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