@if( Data is not null && Data.Any()) {
@if (ShowQuickSearch) {
}
@if (ShowPageButtons) { }
@if (RenderSelect) { } @foreach (var column in Columns) { if (!column.Contains("Hide:")) { } } @if (RenderButtons) { } @foreach (var item in PaginatedData.Where(row => string.IsNullOrWhiteSpace(SearchTerm) || Columns.Any(col => row[col]?.ToString()?.IndexOf(SearchTerm, StringComparison.OrdinalIgnoreCase) >= 0))) { int index = PaginatedData.IndexOf(item); @if (RenderSelect) { } @foreach (var column in Columns) { if(column.Contains("Descarga:")) { @* *@ } else if (column.Contains("Hide:")) { } else { } } @if (RenderButtons) { } }
@column @if (column==SortedColumn) { @(new MarkupString(GetSortIcon(column))) } Acciones
@if (!string.IsNullOrEmpty(item[column]?.ToString())) { @foreach (var link in item[column].ToString().Split('|')) { } } else { } @item[column] @foreach (var button in Buttons) { string cUrlAction = string.Empty; @if (!string.IsNullOrEmpty(button.UrlAction)) { cUrlAction = button.UrlAction; @if (!string.IsNullOrEmpty(SelectionField)) { cUrlAction = @button.UrlAction + item[SelectionField].ToString(); } } @if (button.OnClickAction is not null) { @* @button.Caption *@ @if (item[SelectionField] != null) { @((MarkupString)button.Caption) } } else { @button.Caption } }
} @code { #region Parameters [Parameter] public List Columns { get; set; } = new List(); [Parameter] public List> Data { get; set; } = new List>(); [Parameter] public bool ShowQuickSearch { get; set; } = true; [Parameter] public bool RenderButtons { get; set; } = false; [Parameter] public List Buttons { get; set; } = new List(); [Parameter] public bool RenderSelect {get;set;} =false; [Parameter] public List SorteableCols { get; set; } = new List(); [Parameter] public int RowsPerPage { get; set; } = 10; [Parameter] public bool ShowPageButtons { get; set; } = true; [Parameter] public string SelectionField { get; set; } = string.Empty; [Parameter] public string TableTitle { get; set; } = string.Empty; // [Parameter] // public string HeaderColorScheme { get; set; } = "#f7f7f7"; #endregion #region Declarations private string SearchTerm { get; set; } = string.Empty; private int CurrentPage { get; set; } = 1; private int TotalPages => (int)Math.Ceiling((double)Data.Count/RowsPerPage); public string SortedColumn { get; set; } = null!; public bool SortDirection { get; set; } public bool SelectAll { get; set; } = false; public Dictionary SortDirections { get; set; } = new Dictionary(); private List> PaginatedData { get; set; } = new List>(); private List SelectedRowIndexes = new List(); private List> SelectRows => GetSelectedRows(); public event Action>>? OnGetSelectedRows; #endregion #region Sort Procedures private void SortbyColumn(string column) { if (SorteableCols.Contains(column)) { if (SortedColumn == column) { SortDirection = !SortDirection; } else { SortedColumn = column; SortDirection = true; } if (SortDirections.ContainsKey(column)) { SortDirections[column] = !SortDirections[column]; } else { SortDirections[column] = true; } if (SortDirections[column]) { PaginatedData = PaginatedData.OrderBy(_ => _[column]).ToList(); } else { PaginatedData = PaginatedData.OrderByDescending(_ => _[column]).ToList(); } } } private string GetSortIcon(string column) { if (SortDirections.ContainsKey(column) && column == SortedColumn) { if (SortDirection) { return "↑"; } else { return "↓"; } } return string.Empty; } #endregion #region Selection Procedures private void ToggleSelectAll() { SelectAll = !SelectAll; if (SelectAll) { foreach (var item in Data) { string? rowId = item[SelectionField]?.ToString(); if (rowId != null && !SelectedRowIndexes.Contains(rowId)) { SelectedRowIndexes.Add(rowId); } } } else { SelectedRowIndexes.Clear(); } OnGetSelectedRows?.Invoke(GetSelectedRows()); } private List> GetSelectedRows() { List> selectedRows = new List>(); foreach (var item in Data) { string? rowId = item[SelectionField]?.ToString(); // Usa el operador null-conditional if (rowId != null && SelectedRowIndexes.Contains(rowId)) { selectedRows.Add(item); } } return selectedRows; } private void ToggleRowSelection (string rowIndex) { if (SelectedRowIndexes.Contains(rowIndex)) { SelectedRowIndexes.Remove(rowIndex); } else { SelectedRowIndexes.Add(rowIndex); } OnGetSelectedRows?.Invoke(GetSelectedRows()); } #endregion #region Pagination Procedures protected override void OnParametersSet() { PaginateData(); } private void PaginateData() { int startIndex = (CurrentPage - 1) * RowsPerPage; PaginatedData = Data.Skip(startIndex).Take(RowsPerPage).ToList(); } private void ChangePage(int pageNumber) { CurrentPage = pageNumber; PaginateData(); } private void GoToNextPage() { if (CurrentPage < TotalPages) { CurrentPage++; PaginateData(); } } private void GoToPreviousPage() { if (CurrentPage > 1) { CurrentPage--; PaginateData(); } } #endregion #region Elements Configuration public class ButtonOptions { public string Caption { get; set; } = string.Empty; public string UrlAction { get; set; } = string.Empty; public string ElementClass { get; set; } = string.Empty; public string ElementZoom { get; set; } = "100%"; public Func OnClickAction { get; set; } = _ => Task.CompletedTask; } #endregion public void UpdateSearchTerm() { CurrentPage = 1; // Resetear la página a 1 al cambiar el término de búsqueda PaginateData(); // Volver a paginar los datos con el nuevo término de búsqueda StateHasChanged(); // Forzar la actualización de la interfaz de usuario } }