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/Building/Detail.razor | 285 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 285 insertions(+), 0 deletions(-)
diff --git a/HotelPms.Client.Blazor/Pages/Pages/Master/Building/Detail.razor b/HotelPms.Client.Blazor/Pages/Pages/Master/Building/Detail.razor
new file mode 100644
index 0000000..d9ff900
--- /dev/null
+++ b/HotelPms.Client.Blazor/Pages/Pages/Master/Building/Detail.razor
@@ -0,0 +1,285 @@
+@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: 800px;">
+ <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.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.Building 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 (BuildingAccess access = new BuildingAccess(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;
+ }
+ }
+ }
+
+ 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 == "ZipCode")
+ {
+ if(item.Text.Length == 0) { return; }
+ using (DataTable data = await HotelPms.DataAccessGrpc.Client.AddressAccess.GetPostNoSearch(Channel, item.Text))
+ {
+ if (data.Rows.Count == 0)
+ {
+ await DialogService.ShowMessageBox($"{item.Caption}検索","該当データがありません。",yesText: "OK");
+ return;
+ }
+
+ if (data.Rows.Count > 1000)
+ {
+ await DialogService.ShowMessageBox($"{item.Caption}検索","対象データが1000件以上超えていますので、更に条件を調整してください。",yesText: "OK");
+ return;
+ }
+
+ 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();
+ Data.GetField("Address2").Text = row[1].ToString();
+ StateHasChanged();
+ }
+ }
+ }
+ else if (item.Name == "Address2")
+ {
+ if(item.Text.Length == 0) { return; }
+ using (DataTable data = await HotelPms.DataAccessGrpc.Client.AddressAccess.GetAddressSearch(Channel, item.Text))
+ {
+ if (data.Rows.Count == 0)
+ {
+ await DialogService.ShowMessageBox($"{item.Caption}検索","該当データがありません。",yesText: "OK");
+ return;
+ }
+
+ if (data.Rows.Count > 1000)
+ {
+ await DialogService.ShowMessageBox($"{item.Caption}検索","対象データが1000件以上超えていますので、更に条件を調整してください。",yesText: "OK");
+ return;
+ }
+
+ 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;
+ Data.GetField("ZipCode").Text = row[0].ToString();
+ item.Text = row[1].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 (BuildingAccess access = new BuildingAccess(Channel))
+ {
+ HotelPms.Data.Master.Building item = new HotelPms.Data.Master.Building()
+ {
+ ID = CConvert.ToInt(Data.GetField("ID").Text),
+ Name = Data.GetField("Name").Text,
+ ShortName = Data.GetField("ShortName").Text,
+ ZipCode = Data.GetField("ZipCode").Text,
+ Tel = Data.GetField("Tel").Text,
+ Fax = Data.GetField("Fax").Text,
+ Address2 = Data.GetField("Address2").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($"Building.Save:{result.ErrNo}.{result.ErrData}");
+ return;
+ }
+ }
+
+ MudDialog.Close(DialogResult.Ok(Data));
+ }
+}
\ No newline at end of file
--
Gitblit v1.10.0