@page "/master/demo/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>
|
</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.Demo>>>(GetData))" id="idDemoGrid"
|
@ref="table" FixedHeader="true" Breakpoint="Breakpoint.Sm" Height="650px" Hover="true" Bordered="true" Striped="true" Dense="true" HorizontalScrollbar="true" Elevation=4 >
|
|
<ToolBarContent>
|
<MudTextField Class="mr-2" Margin="Margin.Dense" @bind-Value="searchKey" Label="フィルター" Variant="Variant.Filled" Adornment="Adornment.End" AdornmentIcon="@Icons.Filled.Search" AdornmentColor="MudBlazor.Color.Secondary" Style="ime-mode: active;background-color:#DCEBF2" OnAdornmentClick="Search" />
|
<MudSelect Margin="Margin.Dense" T="KeyValuePair<int,string>" Value="@selectPattern" Label="列設定パターン" Variant="Variant.Filled" Style="background-color:#DCEBF2" 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;background-color:#DCEBF2" />
|
}
|
</ToolBarContent>
|
|
<ColGroup>
|
|
@foreach (HotelPms.Data.Master.OutputItem w in defColSetting.Items)
|
{
|
<col style="@EnvironmentSetting.GetWidthCss((int)w.Width)" />
|
}
|
<col style="@EnvironmentSetting.GetOpeColWidthCss()" />
|
</ColGroup>
|
<HeaderContent>
|
|
@foreach (HotelPms.Data.Master.OutputItem th in defColSetting.Items)
|
{
|
<MudTh>@th.Name</MudTh>
|
}
|
<MudTh Style="text-align: center;">操作</MudTh>
|
</HeaderContent>
|
<RowTemplate>
|
|
@foreach (HotelPms.Data.Master.OutputItem td in defColSetting.Items)
|
{
|
<MudTd DataLabel="@GetFieldName(td.Name)">@context.GetFieldString(GetFieldName(td.Name))</MudTd>
|
}
|
|
<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>
|
</RowTemplate>
|
</MudTable>
|
</MudItem>
|
</MudGrid>
|
}
|
|
@code {
|
private int spacing { get; set; } = 1;
|
//private string buttonStyle = $"color:{Colors.Shades.White};background-color:{Colors.Green.Darken2};width: 150px; height: 40px;";
|
private string buttonStyle = $"color:{Colors.Shades.White};background-color:#58A85D;width: 150px; height: 40px;";
|
//private string buttonStyleEdit = $"color:{Colors.Shades.White};background-color:{Colors.Indigo.Darken2};width: 100px; height: 40px;";
|
private string buttonStyleEdit = $"color:{Colors.Shades.White};background-color:#3693A8;width: 100px; height: 40px;";
|
//private string buttonStyleDelete = $"color:{Colors.Shades.White};background-color:{Colors.Red.Darken2};width: 100px; height: 40px;";
|
private string buttonStyleDelete = $"color:{Colors.Shades.White};background-color:#F58066;width: 100px; height: 40px;";
|
private MudTable<HotelPms.Data.Master.Demo> table;
|
private PagingRequest pagingRequest = new PagingRequest();
|
private string searchKey;
|
private bool loading = true;
|
private ViewModel.Demo? 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.Demo(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.Demo, 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("idDemoGrid", $"{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.Demo>> GetData(TableState state)
|
{
|
loading = true;
|
pagingRequest.OrderBy = viewModel.GetOrderSql();
|
pagingRequest.PageSize = state.PageSize;
|
pagingRequest.PageNumber = state.Page + 1;
|
using (DemoAccess access = new DemoAccess(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.Demo>
|
{
|
Items = dataPage.Rows,
|
TotalItems = pagingRespone.TotalRow
|
};
|
}
|
else if (dataPage.ErrNo == 401)
|
{
|
NavigationManager.NavigateTo("pages/authentication/login", false);
|
|
return new TableData<HotelPms.Data.Master.Demo>
|
{
|
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.Demo>
|
{
|
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 void Add()
|
{
|
//viewModel = new ViewModel.Demo(JSRuntime);
|
|
viewModel.Clear();
|
viewModel.EditMode = (int)EMasterEditStatus.Create;
|
|
CacheStorage.Instance.Set(CacheStorage.Key.ViewModel, viewModel); //簡単&乱暴
|
NavigationManager.NavigateTo($"master/demo/detail/0", false);
|
}
|
|
/// <summary>
|
/// 出力
|
/// </summary>
|
private async Task Output()
|
{
|
loading = true;
|
PagingRequest request = new PagingRequest();
|
pagingRequest.CopyTo(request);
|
request.PageSize = 1;
|
request.PageNumber = -1;
|
using (DemoAccess access = new DemoAccess(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.Demo, 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.Demo item, MouseEventArgs args)
|
{
|
//viewModel = new ViewModel.Demo(JSRuntime)
|
//{
|
// EditMode = (int)EMasterEditStatus.Update,
|
//};
|
|
viewModel.Clear();
|
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.GetFieldString(viewModel.Fields[i].Name).ToString());
|
if (viewModel.Fields[i].Name == "FBit")
|
{
|
viewModel.Fields[i].DispText = ((EVisible)CConvert.ToInt(viewModel.Fields[i].Text)).ToDescription<EVisible>();
|
}
|
}
|
|
CacheStorage.Instance.Set(CacheStorage.Key.ViewModel, viewModel); //簡単&乱暴
|
NavigationManager.NavigateTo($"master/demo/detail/{item.ID}", false);
|
}
|
|
/// <summary>
|
/// 削除処理
|
/// </summary>
|
/// <param name="item"></param>
|
/// <param name="args"></param>
|
/// <returns></returns>
|
private async Task Delete(HotelPms.Data.Master.Demo 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 (DemoAccess access = new DemoAccess(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
|
{
|
}
|
}
|
}
|