@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
|
|
<MudCard Style="@Style" Elevation="6">
|
<MudCardHeader Class="mb-0 pb-0">
|
<CardHeaderAvatar>
|
<MudTooltip Text="顧客割当" Color="MudBlazor.Color.Tertiary" Placement="Placement.Top" Arrow="true">
|
<MudAvatar Color="MudBlazor.Color.Secondary">済</MudAvatar>
|
</MudTooltip>
|
</CardHeaderAvatar>
|
<CardHeaderContent>
|
<MudText Typo="Typo.body1">個人情報</MudText>
|
</CardHeaderContent>
|
<CardHeaderActions>
|
<MudIconButton Icon="@Icons.Material.Filled.Search" Color="MudBlazor.Color.Default" Title="顧客検索" />
|
<MudIconButton Icon="@Icons.Material.Filled.Cancel" Color="MudBlazor.Color.Default" Title="顧客解除" />
|
</CardHeaderActions>
|
</MudCardHeader>
|
<MudCardContent Class="mt-0 pt-0 mb-0 pb-0">
|
<MudGrid Spacing="3" Justify="Justify.FlexStart" Class="align-center mt-0 pt-0 mb-0 pb-0">
|
@foreach (var field in Data.GetGroup(ViewModel.UseInput.GroupKey.Person))
|
{
|
EnvironmentSetting.Debug($"Index={field.Index},Text={field.Text},Error={field.Error},ErrorText={field.ErrorText}");
|
if (field.DispNameEnabled)
|
{
|
<MudItem lg="@field.WidthUnit" Class="@rowSpaceStyle">
|
<MudGrid Spacing="0" Justify="Justify.FlexStart" Class="align-center mt-0 pt-0 mb-0 pb-0">
|
<MudItem xs="@(12 - field.DispWidthUnit)" Class="mt-0 pt-0 mb-0 pb-0">
|
<MudTextField Class="input-pink" @bind-Value="field.Text" Error="@field.Error" ErrorText="@field.ErrorText" @ref="field.Ref" T="string" Label="@field.Caption"
|
AutoFocus="@(field.Index == 0)" Margin="Margin.Dense" MaxLength="@field.MaxLenth" Disabled="@field.Disabled" ReadOnly="@field.ReadOnly"
|
id="@($"{Data.ID}-{field.Index}")" data-guid="@Data.ID" data-valid-index="@field.Index" data-valid-name="@field.Name" data-valid-org-text="@field.OrgText" data-valid-text="@field.Text"
|
data-valid-input-char="@((int)field.InputChar)" data-valid-show-style="@((int)field.ShowStyle)" data-valid-thousand-format="@field.ThousandFormat"/>
|
</MudItem>
|
<MudItem xs="@field.DispWidthUnit" Class="mt-0 pt-0 mb-0 pb-0">
|
<MudField Margin="Margin.Dense">@field.DispText</MudField>
|
</MudItem>
|
</MudGrid>
|
</MudItem>
|
}
|
else
|
{
|
<MudItem lg="@field.WidthUnit" Class="@rowSpaceStyle">
|
<MudTextField Class="@(field.ShowStyle == EShowStyle.ShowList ? "input-pink" : string.Empty)" @bind-Value="field.Text" Error="@field.Error" ErrorText="@field.ErrorText" @ref="field.Ref" T="string" Label="@field.Caption"
|
AutoFocus="@(field.Index == 0)" Margin="Margin.Dense" MaxLength="@field.MaxLenth" Disabled="@field.Disabled" ReadOnly="@field.ReadOnly"
|
id="@($"{Data.ID}-{field.Index}")" data-guid="@Data.ID" data-valid-index="@field.Index" data-valid-name="@field.Name" data-valid-org-text="@field.OrgText" data-valid-text="@field.Text"
|
data-valid-input-char="@((int)field.InputChar)" data-valid-show-style="@((int)field.ShowStyle)" data-valid-thousand-format="@field.ThousandFormat"/>
|
</MudItem>
|
}
|
}
|
</MudGrid>
|
</MudCardContent>
|
</MudCard>
|
|
@*<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.UseInput? Data { get; set; }
|
[Parameter] public EventCallback<ValidField> ParentShowList { get; set; }
|
[Parameter] public string Style { get; set; }
|
|
private string errorAll = string.Empty;
|
private MudButton btnSave;
|
private string rowSpaceStyle = "mt-2 pt-0 mb-0 pb-0";
|
|
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 ParentShowList.InvokeAsync(sender);
|
//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();
|
}
|
|
public void SetResvNo(string no)
|
{
|
Data.GetField("ResvNo").Text = no;
|
StateHasChanged();
|
}
|
|
/// <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));
|
}
|
}
|