@page "/master/roomstatus/crud"
|
@inject GrpcChannel Channel
|
@inject IJSRuntime JSRuntime
|
@using HotelPms.Data.Common
|
@using HotelPms.Data.Common.Pagination
|
@using Google.Protobuf.WellKnownTypes
|
@using System.Text.Json
|
@using ViewModel = HotelPms.Client.Blazor.ViewModel
|
@using static HotelPms.Client.Blazor.Util.SystemEnum
|
@inject IDialogService DialogService
|
@inject NavigationManager NavigationManager
|
|
<MudGrid Spacing="5" Class="align-center">
|
<MudItem>
|
<MudText Typo="Typo.h3">部屋状態マスタ設定【@EnvironmentSetting.ClientID】</MudText>
|
</MudItem>
|
@* <MudItem>
|
<MudProgressCircular Class="@(loading ? "d-flex" : "d-none")" Color="MudBlazor.ColorInfo" Indeterminate="true" />
|
</MudItem>
|
*@</MudGrid>
|
@if(defColSetting != null)
|
{
|
<MudGrid Spacing="@spacing" Justify="Justify.FlexStart" Class="align-center mt-2 mb-5">
|
<MudItem>
|
<MudButton Variant="Variant.Filled" Style ="@buttonStyle" StartIcon="@Icons.Filled.Add" OnClick="Add">新規</MudButton>
|
</MudItem>
|
<MudItem>
|
<MudButton Variant="Variant.Filled" Style ="@buttonStyle" StartIcon="@Icons.Filled.Print" OnClick="Output">出力</MudButton>
|
</MudItem>
|
<MudItem>
|
<MudButton Variant="Variant.Filled" Style ="@buttonStyle" StartIcon="@Icons.Filled.PostAdd" OnClick="SetCol">列設定</MudButton>
|
</MudItem>
|
<MudItem>
|
<MudButton Variant="Variant.Filled" Style ="@buttonStyle" StartIcon="@Icons.Filled.Input">インポート</MudButton>
|
</MudItem>
|
</MudGrid>
|
<MudGrid Class="@(loading ? "d-none" : "d-flex")">
|
<MudItem xs="12">
|
<MudTable ServerData="@(new Func<TableState, Task<TableData<HotelPms.Data.Master.RoomStatus>>>(GetData))" id="idRoomStatusGrid"
|
@ref="table" FixedHeader="true" Breakpoint="Breakpoint.Sm" Height="650px" Hover="true" Bordered="true" Striped="true" Dense="true" HorizontalScrollbar="true">
|
<ToolBarContent>
|
<MudTextField Class="mr-2" Margin="Margin.Dense" @bind-Value="searchKey" Label="フィルター" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentIcon="@Icons.Filled.Search" AdornmentColor="MudBlazor.Color.Secondary" Style="ime-mode: active;" OnAdornmentClick="Search" />
|
<MudSelect Margin="Margin.Dense" T="KeyValuePair<int,string>" Value="@selectPattern" Label="列設定パターン" Variant="Variant.Outlined" ToStringFunc="@PatternConverter" AnchorOrigin="Origin.BottomLeft" TransformOrigin="Origin.TopLeft" ValueChanged="PatternChanged">
|
@foreach (KeyValuePair<int,string> pattern in defColSetting.SelectList)
|
{
|
<MudSelectItem Value="@pattern" />
|
}
|
</MudSelect>
|
<MudSpacer />
|
@if(existsData)
|
{
|
<MudTablePager PageSizeOptions="@EnvironmentSetting.CountOfPage" RowsPerPageString="頁毎表示行数 " Style="border-top: none;" />
|
}
|
</ToolBarContent>
|
<ColGroup>
|
<col style="@EnvironmentSetting.GetOpeColWidthCss()" />
|
@foreach(HotelPms.Data.Master.OutputItem w in defColSetting.Items)
|
{
|
<col style="@EnvironmentSetting.GetWidthCss((int)w.Width)" />
|
}
|
</ColGroup>
|
<HeaderContent>
|
<MudTh Style="text-align: center;">操作</MudTh>
|
@foreach(HotelPms.Data.Master.OutputItem th in defColSetting.Items)
|
{
|
<MudTh>@th.Name</MudTh>
|
}
|
</HeaderContent>
|
<RowTemplate>
|
<MudTd>
|
<MudGrid Spacing="@spacing" Justify="Justify.Center" Class="align-center">
|
<MudItem>
|
<MudButton Variant="Variant.Filled" Style ="@buttonStyleEdit" StartIcon="@Icons.Filled.Edit" OnClick="@(e => Edit(context, e))">編集</MudButton>
|
</MudItem>
|
<MudItem>
|
<MudButton Variant="Variant.Filled" Style ="@buttonStyleDelete" StartIcon="@Icons.Filled.Delete" OnClick="@(e => Delete(context, e))">削除</MudButton>
|
</MudItem>
|
</MudGrid>
|
</MudTd>
|
@foreach(HotelPms.Data.Master.OutputItem td in defColSetting.Items)
|
{
|
<MudTd DataLabel="@GetFieldName(td.Name)">@context.GetField(GetFieldName(td.Name))</MudTd>
|
}
|
</RowTemplate>
|
</MudTable>
|
</MudItem>
|
</MudGrid>
|
}
|
|
@code {
|
[CascadingParameter]
|
public Error Error { get; set; }
|
private int spacing { get; set; } = 1;
|
private string buttonStyle = $"color:{Colors.Shades.White};background-color:{Colors.Green.Darken2};width: 150px; height: 40px;";
|
private string buttonStyleEdit = $"color:{Colors.Shades.White};background-color:{Colors.Indigo.Darken2};width: 100px; height: 40px;";
|
private string buttonStyleDelete = $"color:{Colors.Shades.White};background-color:{Colors.Red.Darken2};width: 100px; height: 40px;";
|
private MudTable<HotelPms.Data.Master.RoomStatus> table;
|
private PagingRequest pagingRequest = new PagingRequest();
|
private string searchKey;
|
private bool loading = true;
|
private ViewModel.RoomStatus? viewModel;
|
private bool existsData = false;
|
private HotelPms.Data.Master.Output defColSetting = null;
|
private KeyValuePair<int, string> selectPattern;
|
|
private Func<KeyValuePair<int, string>, string> PatternConverter = p => p.Value;
|
|
private async Task PatternChanged(KeyValuePair<int, string> e)
|
{
|
selectPattern = e;
|
EnvironmentSetting.Debug($"{selectPattern.Key}.{selectPattern.Value}");
|
await LoadColSetting();
|
await table.ReloadServerData(); //⇒Raise GetDataイベント
|
await SetGridWidth();
|
}
|
|
protected override async Task OnInitializedAsync()
|
{
|
EnvironmentSetting.Debug($"【{DateTime.Now.ToString("HH:mm:ss fff")}】館マスタ⇒OnInitializedAsync.Begin");
|
viewModel = new ViewModel.RoomStatus(JSRuntime);
|
await LoadColSetting();
|
EnvironmentSetting.Debug($"【{DateTime.Now.ToString("HH:mm:ss fff")}】館マスタ⇒OnInitializedAsync.End");
|
}
|
|
private async Task LoadColSetting()
|
{
|
using (OutputAccess access = new OutputAccess(Channel))
|
{
|
EnvironmentSetting.Debug($"【{DateTime.Now.ToString("HH:mm:ss fff")}】selectPattern.Key = {selectPattern.Key}");
|
defColSetting = await access.GetDefColSetting(Environment.MachineName, EnvironmentSetting.UserName, (int)EReportID.RoomStatus, selectPattern.Key);
|
if (selectPattern.Key == 0) { selectPattern = defColSetting.SelectList.FirstOrDefault(); } //絶対ある
|
}
|
}
|
|
private async Task SetGridWidth()
|
{
|
if (defColSetting != null && !loading)
|
{
|
int total = EnvironmentSetting.MasterOpeColWidth;
|
foreach (HotelPms.Data.Master.OutputItem w in defColSetting.Items)
|
{
|
total += (int)w.Width;
|
}
|
await JSRuntime.SetGridWidth("idRoomStatusGrid", $"{total}px"); //列幅設定値に固定する
|
EnvironmentSetting.Debug($"館マスタ⇒SetGridWidth");
|
}
|
}
|
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
{
|
EnvironmentSetting.Debug($"【{DateTime.Now.ToString("HH:mm:ss fff")}】館マスタ⇒OnAfterRenderAsync.Begin firstRender={firstRender}");
|
await SetGridWidth();
|
EnvironmentSetting.Debug($"【{DateTime.Now.ToString("HH:mm:ss fff")}】館マスタ⇒OnAfterRenderAsync.End firstRender={firstRender}");
|
}
|
|
private string GetFieldName(string name)
|
{
|
return defColSetting.FieldMap.ContainsKey(name) ? defColSetting.FieldMap[name] : name;
|
}
|
|
/// <summary>
|
/// サーバーデータの読込
|
/// </summary>
|
/// <param name="state"></param>
|
/// <returns></returns>
|
private async Task<TableData<HotelPms.Data.Master.RoomStatus>> GetData(TableState state)
|
{
|
loading = true;
|
pagingRequest.OrderBy = viewModel.GetOrderSql();
|
pagingRequest.PageSize = state.PageSize;
|
pagingRequest.PageNumber = state.Page + 1;
|
using (RoomStatusAccess access = new RoomStatusAccess(Channel))
|
{
|
var dataPage = await access.GetPageData(pagingRequest);
|
if (dataPage.ErrNo == 0)
|
{
|
PagingRespone pagingRespone = JsonSerializer.Deserialize<PagingRespone>(dataPage.Tag);
|
existsData = pagingRespone.TotalRow > 0;
|
loading = false;
|
StateHasChanged();
|
|
return new TableData<HotelPms.Data.Master.RoomStatus>
|
{
|
Items = dataPage.Rows,
|
TotalItems = pagingRespone.TotalRow
|
};
|
}
|
else if (dataPage.ErrNo == 401)
|
{
|
Error.ProcessError(new Exception("aaaa"));
|
|
NavigationManager.NavigateTo("/user/login", false);
|
return new TableData<HotelPms.Data.Master.RoomStatus>
|
{
|
Items = null,
|
TotalItems = 0
|
};
|
}
|
else
|
{
|
var parameters = new DialogParameters { ["MsgType"] = EMessageType.OK, ["Title"] = "データ読込", ["Data"] = new List<string> { "データ読込に失敗しました。", $"{dataPage.ErrNo}.{dataPage.ErrData}" } };
|
var dialog = DialogService.Show<MessageBox>(string.Empty, parameters);
|
await dialog.Result;
|
existsData = false;
|
loading = false;
|
StateHasChanged();
|
|
return new TableData<HotelPms.Data.Master.RoomStatus>
|
{
|
Items = null,
|
TotalItems = 0
|
};
|
}
|
}
|
}
|
|
/// <summary>
|
/// 検索
|
/// </summary>
|
private async Task Search()
|
{
|
if(searchKey == null) { searchKey = string.Empty; }
|
pagingRequest.Filter = viewModel.GetFilterSql(searchKey);
|
await table.ReloadServerData(); //⇒Raise GetDataイベント
|
}
|
|
/// <summary>
|
/// 新規作成
|
/// </summary>
|
private async Task Add()
|
{
|
viewModel.Clear();
|
viewModel.JSRuntime = JSRuntime;
|
viewModel.EditMode = (int)EMasterEditStatus.Create;
|
viewModel.GetField("ID").Disabled = false;
|
var parameters = new DialogParameters { ["Data"]=viewModel };
|
var dialog = DialogService.Show<Detail>("詳細情報", parameters);
|
var result = await dialog.Result;
|
|
if (!result.Cancelled)
|
{
|
//ViewModel.RoomStatus ret = result.Data as ViewModel.RoomStatus;
|
await table.ReloadServerData(); //⇒Raise GetDataイベント
|
}
|
}
|
|
/// <summary>
|
/// 出力
|
/// </summary>
|
private async Task Output()
|
{
|
loading = true;
|
PagingRequest request = new PagingRequest();
|
pagingRequest.CopyTo(request);
|
request.PageSize = 1;
|
request.PageNumber = -1;
|
using (RoomStatusAccess access = new RoomStatusAccess(Channel))
|
{
|
var data = await access.OutputStream(request);
|
if (data != null)
|
{
|
await JSRuntime.SaveAsFileAsync("data", data.Content.ToByteArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", false);
|
}
|
}
|
loading = false;
|
}
|
|
private async Task SetCol()
|
{
|
ViewModel.ColSettingData data = await ViewModel.ColSettingData.Create((int)EReportID.RoomStatus, Channel);
|
if (data != null)
|
{
|
var parameters = new DialogParameters { ["Data"] = data };
|
var dialog = DialogService.Show<ColSetting>("列情報設定", parameters);
|
var result = await dialog.Result;
|
if (!result.Cancelled)
|
{
|
await LoadColSetting();
|
await table.ReloadServerData(); //⇒Raise GetDataイベント
|
await SetGridWidth();
|
}
|
}
|
}
|
|
/// <summary>
|
/// 編集
|
/// </summary>
|
/// <param name="item"></param>
|
/// <param name="args"></param>
|
private async Task Edit(HotelPms.Data.Master.RoomStatus item, MouseEventArgs args)
|
{
|
viewModel.Clear();
|
viewModel.JSRuntime = JSRuntime;
|
viewModel.EditMode = (int)EMasterEditStatus.Update;
|
viewModel.GetField("ID").Disabled = true;
|
for (int i = 0; i < viewModel.Fields.Count; i++)
|
{
|
viewModel.SetField(viewModel.Fields[i].Name, item.GetField(viewModel.Fields[i].Name).ToString());
|
if (viewModel.Fields[i].Name == "MaidType")
|
{
|
viewModel.Fields[i].DispText = ((EMaidType)CConvert.ToInt(viewModel.Fields[i].Text)).ToDescription<EMaidType>();
|
}
|
}
|
|
var parameters = new DialogParameters { ["Data"]=viewModel };
|
var dialog = DialogService.Show<Detail>("詳細情報", parameters);
|
var result = await dialog.Result;
|
|
if (!result.Cancelled)
|
{
|
//ViewModel.RoomStatus ret = result.Data as ViewModel.RoomStatus;
|
await table.ReloadServerData(); //⇒Raise GetDataイベント
|
}
|
}
|
|
|
/// <summary>
|
/// 削除処理
|
/// </summary>
|
/// <param name="item"></param>
|
/// <param name="args"></param>
|
/// <returns></returns>
|
private async Task Delete(HotelPms.Data.Master.RoomStatus item, MouseEventArgs args)
|
{
|
var parameters = new DialogParameters { ["MsgType"]=EMessageType.YesNo, ["Title"]="削除" ,["Data"]=Message.GetConfirmForRemove($"{item.ID}.{item.Name}") };
|
var dialog = DialogService.Show<MessageBox>(string.Empty, parameters);
|
var result = await dialog.Result;
|
if (result.Cancelled)
|
{
|
return;
|
}
|
|
using (RoomStatusAccess access = new RoomStatusAccess(Channel))
|
{
|
var resultData = await access.RemoveAsync($"ID={item.ID}");
|
if(resultData.ErrNo == 0)
|
{
|
await table.ReloadServerData(); //⇒Raise GetDataイベント
|
}
|
else
|
{
|
parameters = new DialogParameters { ["MsgType"] = EMessageType.OK, ["Title"] = "DB更新エラー", ["Data"] = new List<string> { "削除に失敗しました。", $"{resultData.ErrNo}.{resultData.ErrData}" } };
|
dialog = DialogService.Show<MessageBox>(string.Empty, parameters);
|
await dialog.Result;
|
}
|
}
|
}
|
|
/// <summary>
|
/// グリッドの選択イベント
|
/// </summary>
|
/// <param name="row"></param>
|
private void SelectionChangedEvent(object row)
|
{
|
if (row == null)
|
{
|
//未選択
|
}
|
else
|
{
|
}
|
}
|
}
|