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