From 1a1c8e71fcd14858f595029f089b2d4a00202b32 Mon Sep 17 00:00:00 2001
From: ogi <Administrator@S-OGI-PC>
Date: Fri, 05 Dec 2025 09:24:16 +0900
Subject: [PATCH] プロジェクトファイルを追加。
---
HotelPms.Client.Blazor/Pages/Pages/Master/RoomStatus/Crud.razor | 363 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 363 insertions(+), 0 deletions(-)
diff --git a/HotelPms.Client.Blazor/Pages/Pages/Master/RoomStatus/Crud.razor b/HotelPms.Client.Blazor/Pages/Pages/Master/RoomStatus/Crud.razor
new file mode 100644
index 0000000..e109c0c
--- /dev/null
+++ b/HotelPms.Client.Blazor/Pages/Pages/Master/RoomStatus/Crud.razor
@@ -0,0 +1,363 @@
+@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
+ {
+ }
+ }
+}
--
Gitblit v1.10.0