using AyCode.Core.Extensions; using AyCode.Core.Loggers; using AyCode.Utils.Extensions; using DevExpress.Blazor; using DevExpress.Data.Helpers; using DevExpress.Utils.Filtering.Internal; using FruitBank.Common.Models; using FruitBankHybrid.Shared.Services.SignalRs; using Microsoft.AspNetCore.Components; using Microsoft.JSInterop; using System.Collections.ObjectModel; using System.Reflection; namespace FruitBankHybrid.Shared.Components; public class MgGridBase : DxGrid { private bool _isFirstInitializeParameterCore; private bool _isFirstInitializeParameters; public bool PreRendered { get; set; } [Inject] public required IEnumerable LogWriters { get; set; } [Inject] public required FruitBankSignalRClient FruitBankSignalRClient { get; set; } [Inject] public required LoggedInModel LoggedInModel { get; set; } [Inject] public required IJSRuntime JSRuntime { get; set; } [Parameter] public bool IsMasterGrid { get; set; } = false; [Parameter] public string AutoSaveLayoutName { get; set; } [Parameter] public required object DataSource { get => Data; set => Data = value; } protected override async Task OnInitializedAsync() { //var json = await GetLocalStorageItemAsync(LocalStorageItemsKey); //if (!string.IsNullOrEmpty(json)) // Layouts = JsonSerializer.Deserialize>(json); } protected virtual void CustomizeElementHideDetailButton(GridCustomizeElementEventArgs e) { if (e.ElementType == GridElementType.DataRow && !LoggedInModel.IsDeveloper) { e.CssClass = "hideDetailButton"; } } protected void OnCustomizeElement(GridCustomizeElementEventArgs e) { //if (!IsMasterGrid) e.CssClass = "hideDetailButton"; if (IsMasterGrid && e.ElementType == GridElementType.DataRow && e.VisibleIndex % 2 == 1 && !e.Grid.IsRowSelected(e.VisibleIndex) && !e.Grid.IsRowFocused(e.VisibleIndex)) { e.CssClass = " alt-item"; } CustomizeElementHideDetailButton(e); if (e.ElementType == GridElementType.HeaderCell) { e.Style = "background-color: #E6E6E6;"; //e.CssClass = "header-bold"; } } protected override Task SetParametersAsyncCore(ParameterView parameters) { if (!_isFirstInitializeParameterCore) { //if (typeof(TDataItem) is IId || typeof(TDataItem) is IId) KeyFieldName = "Id"; //base.DataItemDeleting = EventCallback.Factory.Create(this, OnItemDeleting); //base.EditModelSaving = EventCallback.Factory.Create(this, OnItemSaving); CustomizeElement += OnCustomizeElement; _isFirstInitializeParameterCore = true; } return base.SetParametersAsyncCore(parameters); } protected override void OnParametersSet() { if (!_isFirstInitializeParameters) { SizeMode = DevExpress.Blazor.SizeMode.Small; ShowGroupPanel = IsMasterGrid; ShowSearchBox = IsMasterGrid; ShowFilterRow = IsMasterGrid; FilterMenuButtonDisplayMode = (IsMasterGrid ? GridFilterMenuButtonDisplayMode.Never : GridFilterMenuButtonDisplayMode.Always); DetailRowDisplayMode = IsMasterGrid ? GridDetailRowDisplayMode.Auto : GridDetailRowDisplayMode.Never; DetailExpandButtonDisplayMode = IsMasterGrid ? GridDetailExpandButtonDisplayMode.Auto : GridDetailExpandButtonDisplayMode.Never; TextWrapEnabled = false; AllowSelectRowByClick = true; HighlightRowOnHover = true; AutoCollapseDetailRow = true; AutoExpandAllGroupRows = false; PagerVisible = IsMasterGrid; PageSize = IsMasterGrid ? (SizeMode == DevExpress.Blazor.SizeMode.Small ? 23 : 15) : 50; AllowColumnReorder = true; AllowGroup = IsMasterGrid; AllowSort = true; EditMode = GridEditMode.EditRow; FocusedRowEnabled = true; ColumnResizeMode = GridColumnResizeMode.NextColumn; //VirtualScrollingEnabled = IsMasterGrid; PageSizeSelectorVisible = true; if (IsMasterGrid && !AutoSaveLayoutName.IsNullOrWhiteSpace()) { LayoutAutoLoading = Grid_LayoutAutoLoading; LayoutAutoSaving = Grid_LayoutAutoSaving; } _isFirstInitializeParameters = true; } base.OnParametersSet(); } protected override void OnAfterRender(bool firstRender) { if (firstRender) { PreRendered = true; //StateHasChanged(); } } async Task Grid_LayoutAutoLoading(GridPersistentLayoutEventArgs e) { e.Layout = await LoadLayoutFromLocalStorageAsync($"{AutoSaveLayoutName}_AutoSave_{LoggedInModel.CustomerDto?.Id ?? 0}"); } private async Task Grid_LayoutAutoSaving(GridPersistentLayoutEventArgs e) { await SaveLayoutToLocalStorageAsync(e.Layout, $"{AutoSaveLayoutName}_AutoSave_{LoggedInModel.CustomerDto?.Id ?? 0}"); } async Task LoadLayoutFromLocalStorageAsync(string localStorageKey) { try { var json = await JSRuntime.InvokeAsync("localStorage.getItem", localStorageKey); if (!json.IsNullOrWhiteSpace()) return json.JsonTo(); } catch { // Mute exceptions for the server prerender stage } return null; } async Task SaveLayoutToLocalStorageAsync(GridPersistentLayout layout, string localStorageKey) { try { var json = layout.ToJson(); await JSRuntime.InvokeVoidAsync("localStorage.setItem", localStorageKey, json); } catch { // Mute exceptions for the server prerender stage } } async Task RemoveLayoutFromLocalStorageAsync() { try { await JSRuntime.InvokeVoidAsync("localStorage.removeItem", AutoSaveLayoutName); } catch { // Mute exceptions for the server prerender stage } } async Task ReloadPageButton_ClickAsync() { await JSRuntime.InvokeVoidAsync("location.reload"); } async Task ResetLayoutButton_ClickAsync() { await RemoveLayoutFromLocalStorageAsync(); await JSRuntime.InvokeVoidAsync("location.reload"); } //public RenderFragment AddCommandColumn() //{ // RenderFragment columns = b => // { // if (!IsMasterGrid) // { // b.OpenComponent(0, typeof(DxGridCommandColumn)); // b.CloseComponent(); // } // }; // this.Columns.ApplyChain(x) = AddCommandColumn(); // return columns; //} //private RenderFragment BuildColumnsGrid() //{ // PropertyInfo[] props = DataSource.FirstOrDefault().GetType().GetProperties(); // RenderFragment columns = b => // { // foreach (var prop in props) // { // if (prop.PropertyType == typeof(string)) // { // b.OpenComponent(0, typeof(DxGridDataColumn)); // b.AddAttribute(0, "FieldName", prop.Name); // b.CloseComponent(); // } // } // }; // return columns; //} }