@namespace Oqtane.Modules.Controls @inherits LocalizableComponent @typeparam TableItem @if (ItemList != null) { @if ((Toolbar == "Top" || Toolbar == "Both") && _pages > 0 && Items.Count() > _maxItems) { } @if (Format == "Table" && Row != null) {
@Header @foreach (var item in ItemList) { @Row(item) @if (Detail != null) { @Detail(item) } }
} @if (Format == "Grid" && Row != null) { int count = 0; int rows = 0; int cols = 0; if (ItemList != null) { if (_columns == 0) { count = ItemList.Count(); rows = 1; cols = count; } else { count = (int)Math.Ceiling(ItemList.Count() / (decimal)_columns) * _columns; rows = count / _columns; cols = _columns; } }
@for (int row = 0; row < rows; row++) {
@for (int col = 0; col < cols; col++) { int index = (row * _columns) + col; if (index < ItemList.Count()) {
@Row(ItemList.ElementAt(index))
} else {
 
} }
}
} @if ((Toolbar == "Bottom" || Toolbar == "Both") && _pages > 0 && Items.Count() > _maxItems) { } } @code { private int _pages = 0; private int _page = 1; private int _maxItems = 10; private int _displayPages = 5; private int _startPage = 0; private int _endPage = 0; private int _columns = 0; [Parameter] public string Format { get; set; } // Table or Grid [Parameter] public string Toolbar { get; set; } // Top, Bottom or Both [Parameter] public RenderFragment Header { get; set; } = null; // only applicable to Table layouts [Parameter] public RenderFragment Row { get; set; } = null; // required [Parameter] public RenderFragment Detail { get; set; } = null; // only applicable to Table layouts [Parameter] public IEnumerable Items { get; set; } // the IEnumerable data source [Parameter] public string PageSize { get; set; } // number of items to display on a page [Parameter] public string Columns { get; set; } // only applicable to Grid layouts - default is zero indicating use responsive behavior [Parameter] public string CurrentPage { get; set; } // sets the initial page to display [Parameter] public string DisplayPages { get; set; } // maximum number of page numbers to display for user selection [Parameter] public string Class { get; set; } // class for the containing element - ie. for Table or
for Grid [Parameter] public string RowClass { get; set; } // class for row element - ie.
for Table or
for Grid [Parameter] public string ColumnClass { get; set; } // class for column element - only applicable to Grid format [Parameter] public Action OnPageChange { get; set; } // a method to be executed in the calling component when the page changes private IEnumerable ItemList { get; set; } protected override void OnParametersSet() { if (string.IsNullOrEmpty(Format)) { Format = "Table"; } if (string.IsNullOrEmpty(Toolbar)) { Toolbar = "Top"; } if (string.IsNullOrEmpty(Class)) { if (Format == "Table") { Class = "table table-borderless"; } else { Class = "container-fluid"; } } if (string.IsNullOrEmpty(RowClass)) { if (Format == "Table") { RowClass = ""; } else { RowClass = "row"; } } if (string.IsNullOrEmpty(ColumnClass)) { if (Format == "Table") { ColumnClass = ""; } else { ColumnClass = "col"; } } if (!string.IsNullOrEmpty(PageSize)) { _maxItems = int.Parse(PageSize); } if (!string.IsNullOrEmpty(Columns)) { _columns = int.Parse(Columns); } if (!string.IsNullOrEmpty(DisplayPages)) { _displayPages = int.Parse(DisplayPages); } if (!string.IsNullOrEmpty(CurrentPage)) { _page = int.Parse(CurrentPage); } else { _page = 1; } _startPage = 0; _endPage = 0; if (Items != null) { _pages = (int)Math.Ceiling(Items.Count() / (decimal)_maxItems); if (_page > _pages) { _page = _pages; } ItemList = Items.Skip((_page - 1) * _maxItems).Take(_maxItems); SetPagerSize(); } } public void SetPagerSize() { _startPage = ((_page - 1) / _displayPages) * _displayPages + 1; _endPage = _startPage + _displayPages - 1; if (_endPage > _pages) { _endPage = _pages; } OnPageChange?.Invoke(_page); StateHasChanged(); } public void UpdateList(int page) { ItemList = Items.Skip((page - 1) * _maxItems).Take(_maxItems); _page = page; SetPagerSize(); } public void SkipPages(string direction) { switch (direction) { case "forward": _page = _endPage + 1; break; case "back": _page = _startPage - 1; break; } SetPagerSize(); } public void NavigateToPage(string direction) { switch (direction) { case "next": if (_page < _pages) { _page += 1; } break; case "previous": if (_page > 1) { _page -= 1; } break; } UpdateList(_page); } }