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/Building/Crud.razor |  370 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 370 insertions(+), 0 deletions(-)

diff --git a/HotelPms.Client.Blazor/Pages/Pages/Master/Building/Crud.razor b/HotelPms.Client.Blazor/Pages/Pages/Master/Building/Crud.razor
new file mode 100644
index 0000000..7ada279
--- /dev/null
+++ b/HotelPms.Client.Blazor/Pages/Pages/Master/Building/Crud.razor
@@ -0,0 +1,370 @@
+@page "/master/building/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.Building>>>(GetData))" id="idBuildingGrid"
+                    @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.TopCenter" 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.Building> table;
+    private PagingRequest pagingRequest = new PagingRequest();
+    private string searchKey;
+    private bool loading = true;
+    private ViewModel.Building? 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.Building(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.Building, 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("idBuildingGrid", $"{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.Building>> GetData(TableState state)
+    {
+        loading = true;
+        pagingRequest.OrderBy = viewModel.GetOrderSql();
+        pagingRequest.PageSize = state.PageSize;
+        pagingRequest.PageNumber = state.Page + 1;
+        using (BuildingAccess access = new BuildingAccess(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.Building>
+                    {
+                        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.Building>
+                    {
+                        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.Building>
+                    {
+                        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.Building ret = result.Data as ViewModel.Building;
+            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 (BuildingAccess access = new BuildingAccess(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.Building, 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.Building 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());
+        }
+
+/*        
+        viewModel.SetField("ID", item.ID.ToString());
+        viewModel.SetField("Name", item.Name);
+        viewModel.SetField("ShortName", item.ShortName);
+        viewModel.SetField("ZipCode", item.ZipCode);
+        viewModel.SetField("Tel", item.Tel);
+        viewModel.SetField("Fax", item.Fax);
+        viewModel.SetField("Address1", item.Address1);
+        viewModel.SetField("Address2", item.Address2);
+*/
+
+        var parameters = new DialogParameters { ["Data"]=viewModel };
+        var dialog = DialogService.Show<Detail>("詳細情報", parameters);
+        var result = await dialog.Result;
+
+        if (!result.Cancelled)
+        {
+            //ViewModel.Building ret = result.Data as ViewModel.Building;
+            await table.ReloadServerData();  //⇒Raise GetDataイベント
+        }
+    }
+
+
+    /// <summary>
+    /// 削除処理
+    /// </summary>
+    /// <param name="item"></param>
+    /// <param name="args"></param>
+    /// <returns></returns>
+    private async Task Delete(HotelPms.Data.Master.Building 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 (BuildingAccess access = new BuildingAccess(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