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

diff --git a/HotelPms.Client.Blazor/Pages/Pages/Master/Demo/Crud.razor b/HotelPms.Client.Blazor/Pages/Pages/Master/Demo/Crud.razor
new file mode 100644
index 0000000..335cd1f
--- /dev/null
+++ b/HotelPms.Client.Blazor/Pages/Pages/Master/Demo/Crud.razor
@@ -0,0 +1,358 @@
+@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
+        {
+        }
+    }
+}
\ No newline at end of file

--
Gitblit v1.10.0