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