@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));
|
}
|
}
|