Skip to content
This repository has been archived by the owner on Jul 10, 2024. It is now read-only.

Commit

Permalink
Merge pull request #250 from NilsPur/master
Browse files Browse the repository at this point in the history
Detail Template, Column Reordering, Custom Rows
  • Loading branch information
IvanJosipovic authored Feb 1, 2021
2 parents 98c94aa + 6dc63aa commit b9ce343
Show file tree
Hide file tree
Showing 12 changed files with 309 additions and 50 deletions.
1 change: 1 addition & 0 deletions src/BlazorTable.Sample.Server/wwwroot/css/site.css
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ app {

.sidebar {
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
overflow: auto;
}

.sidebar .top-row {
Expand Down
5 changes: 5 additions & 0 deletions src/BlazorTable.Sample.Shared/NavMenu.razor
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,11 @@
<span class="oi oi-eye" aria-hidden="true"></span> Column Visibility
</NavLink>
</li>
<li class="nav-item px-3">
<NavLink class="nav-link" href="CustomRow" Match="NavLinkMatch.All">
<span class="oi oi-align-center" aria-hidden="true"></span> Custom Row
</NavLink>
</li>
</ul>
</div>

Expand Down
42 changes: 41 additions & 1 deletion src/BlazorTable.Sample.Shared/Pages/Detail.razor
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,28 @@

<p>The <code>DetailTemplate</code> can be used to display additional details below an item.</p>
<br />
<Table TableItem="PersonData" Items="data" PageSize="15" ColumnReorder="true">
<div class="btn-toolbar mb-3">
<div class="btn-group mr-2">
<button class="btn btn-primary" @onclick="_ => Try(() => table.ToggleAllDetailsView(open: true))">Open All</button>
<button class="btn btn-danger" @onclick="_ => Try(() => table.ToggleAllDetailsView(open: false))">Close All</button>
</div>
<div class="input-group mr-1">
<div class="input-group-prepend">
<div class="input-group-text">Row Number:</div>
</div>
<input type="number" @bind="rowNumber" class="form-control">
</div>
<div class="btn-group">
<button class="btn btn-primary" @onclick="_ => Try(() => table.ToggleDetailView(rowNumber, open: true))">Open</button>
<button class="btn btn-danger" @onclick="_ => Try(() => table.ToggleDetailView(rowNumber, open: false))">Close</button>
</div>
</div>
<br />
@if (errorMessage != "")
{
<label>@errorMessage</label>
}
<Table @ref="table" TableItem="PersonData" Items="data" PageSize="15" ColumnReorder="true">
<Column TableItem="PersonData" Title="Id" Field="@(x => x.id)" Sortable="true" Filterable="true" Width="10%" DefaultSortColumn="true" />
<Column TableItem="PersonData" Title="Full Name" Field="@(x => x.full_name)" Sortable="true" Filterable="true" Width="20%" />
<Column TableItem="PersonData" Title="Email" Field="@(x => x.email)" Sortable="true" Filterable="true" Width="20%">
Expand Down Expand Up @@ -46,8 +67,14 @@
[Inject]
private HttpClient Http { get; set; }

private ITable<PersonData> table;

private PersonData[] data;

private int rowNumber;

private string errorMessage = "";

protected override async Task OnInitializedAsync()
{
data = await Http.GetFromJsonAsync<PersonData[]>("sample-data/MOCK_DATA.json");
Expand All @@ -71,4 +98,17 @@
MasterCard = 1,
Visa = 2
}

private void Try(Action action)
{
try
{
errorMessage = "";
action();
}
catch (Exception e)
{
errorMessage = e.Message;
}
}
}
80 changes: 80 additions & 0 deletions src/BlazorTable.Sample.Shared/Pages/RowTemplate.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
@page "/CustomRow"
@inject HttpClient Http
@using BlazorTable
@using System.ComponentModel

<h1>Row Template - Custom Row</h1>

<p></p>

<p>Use</p>

<Table @ref="table" TableItem="PersonData" Items="data" PageSize="15" ColumnReorder="true" ShowSearchBar="true">
<Column TableItem="PersonData" Title="Id" Field="@(x => x.id)" Sortable="true" Filterable="true" Width="10%" DefaultSortColumn="true" />
<Column TableItem="PersonData" Title="Full Name" Field="@(x => x.full_name)" Sortable="true" Filterable="true" Width="20%" />
<Column TableItem="PersonData" Title="Email" Field="@(x => x.email)" Sortable="true" Filterable="true" Width="20%">
<Template>
<a href="mailto:@context.email">@context.email</a>
</Template>
</Column>
<Column TableItem="PersonData" Title="Paid" Field="@(x => x.paid)" Sortable="true" Filterable="true" Width="10%">
<Template>
@context.paid.ToString()
</Template>
</Column>
<Column TableItem="PersonData" Title="Price" Field="@(x => x.price)" Sortable="true" Filterable="true" Width="10%" Format="C" Align="Align.Right" />
<Column TableItem="PersonData" Title="Created Date" Field="@(x => x.created_date)" Sortable="true" Filterable="true" Width="10%">
<Template>
@(context.created_date.HasValue ? context.created_date.Value.ToShortDateString() : string.Empty)
</Template>
</Column>
<Column TableItem="PersonData" Title="Enum" Field="@(x => x.cc_type)" Sortable="true" Filterable="true" Width="10%">
<Template>
@context.cc_type
</Template>
</Column>
<CustomRow TableItem="PersonData" IsActiveForItem="x => (x.id % 4) == 0">
<tr>
<td colspan="@(table.Columns.Count)">
<div class="text-center w-100"><b>Custom Row</b></div>
</td>
</tr>
</CustomRow>
<Pager ShowPageNumber="true" ShowTotalCount="true" />
</Table>

@code
{
[Inject]
private HttpClient httpClient { get; set; }

private ITable<PersonData> table;

private PersonData[] data;

private int i = 0;

protected override async Task OnInitializedAsync()
{
data = await httpClient.GetFromJsonAsync<PersonData[]>("sample-data/MOCK_DATA.json");
}

public class PersonData
{
public int? id { get; set; }
public string full_name { get; set; }
public string email { get; set; }
public bool? paid { get; set; }
public decimal? price { get; set; }
public CreditCard? cc_type { get; set; }
public DateTime? created_date { get; set; }
}

public enum CreditCard
{
none = 0,
[Description("MasterCard")]
MasterCard = 1,
Visa = 2
}
}
15 changes: 13 additions & 2 deletions src/BlazorTable.Sample.Shared/Pages/ToggleColumnVisibility.razor
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@

<h1>Toggle Column Visibility</h1>

<p>Users can change the visibility of a column if its "Hideable" attribute is set to true.</p>

<button class="btn btn-primary mb-2" @onclick="@(_ => showSearchBar = !showSearchBar)">Toggle Search Bar</button>

<Table TableItem="PersonData" Items="data" PageSize="15" ColumnReorder="true" ShowSearchBar="showSearchBar">
<Table @ref="table" TableItem="PersonData" Items="data" PageSize="15" ColumnReorder="true" ShowSearchBar="showSearchBar">
<Column Hideable="true" TableItem="PersonData" Title="Id" Field="@(x => x.id)" Sortable="true" Filterable="true" Width="10%" DefaultSortColumn="true" />
<Column Hideable="true" TableItem="PersonData" Title="Full Name" Field="@(x => x.full_name)" Sortable="true" Filterable="true" Width="20%" />
<Column Hideable="true" TableItem="PersonData" Title="Email" Field="@(x => x.email)" Sortable="true" Filterable="true" Width="20%">
Expand Down Expand Up @@ -35,17 +37,26 @@
</Table>

@code
{
{
[Inject]
private HttpClient httpClient { get; set; }

private ITable<PersonData> table;

private PersonData[] data;

private bool showSearchBar;

protected override async Task OnInitializedAsync()
{
data = await httpClient.GetFromJsonAsync<PersonData[]>("sample-data/MOCK_DATA.json");

Random random = new Random(123);

foreach (IColumn<PersonData> column in table.Columns)
{
column.Visible = random.Next(2) == 1 ? true : false; // column visibility
}
}

public class PersonData
Expand Down
1 change: 1 addition & 0 deletions src/BlazorTable.Sample.Wasm/wwwroot/css/site.css
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ app {

.sidebar {
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
overflow: auto;
}

.sidebar .top-row {
Expand Down
2 changes: 2 additions & 0 deletions src/BlazorTable/Components/CustomRow.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
@namespace BlazorTable
@typeparam TableItem
38 changes: 38 additions & 0 deletions src/BlazorTable/Components/CustomRow.razor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
using Microsoft.AspNetCore.Components;
using System;

namespace BlazorTable
{
/// <summary>
/// A custom row template
/// </summary>
/// <typeparam name="TableItem"></typeparam>
public partial class CustomRow<TableItem> : ComponentBase
{
/// <summary>
/// Parent Table
/// </summary>
[CascadingParameter(Name = "Table")]
public ITable<TableItem> Table { get; set; }

/// <summary>
/// Function that defines if the custom row is active for the TableItem inserted as parameter
/// </summary>
[Parameter]
public Func<TableItem, bool> IsActiveForItem { get; set; }

/// <summary>
/// Content to show
/// </summary>
[Parameter]
public RenderFragment<TableItem> ChildContent { get; set; }

/// <summary>
/// When initialized, add custom row to table
/// </summary>
protected override void OnInitialized()
{
Table.AddCustomRow(this);
}
}
}
97 changes: 58 additions & 39 deletions src/BlazorTable/Components/Table.razor
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,8 @@
@if (column.Visible)
{
<th scope="col" style="@(!string.IsNullOrEmpty(column.Width) ? $"width:{column.Width};" : "") user-select: none"
@ondrop="@(() => HandleDrop(column))"
@ondragstart="@(() => HandleDragStart(column))"
@ondrop="@(_ => HandleDrop(column))"
@ondragstart="@(_ => HandleDragStart(column))"
ondragover="event.preventDefault();"
draggable="@(ColumnReorder.ToString())"
@key="column"
Expand Down Expand Up @@ -145,57 +145,76 @@
if (FilteredItems.Any())
{
int i = 0;
bool detailViewActive = _detailTemplate != null;

foreach (TableItem item in FilteredItems)
{
<tr @key="item" aria-selected="@(SelectedItems.Contains(item) ? "true" : null)" class="@RowClass(item) @(SelectedItems.Contains(item) ? "table-active" : "")" @onclick="(() => OnRowClickHandler(item))">
bool rowDisplayed = false;

@{
int locali = i;
bool isOpen = detailsViewOpen.ContainsKey(locali) && detailsViewOpen[locali];
}
@if (_detailTemplate != null)
foreach (CustomRow<TableItem> customRow in CustomRows)
{
if (customRow.IsActiveForItem != null && customRow.IsActiveForItem(item))
{
<td>
<a href="javascript:;" style="text-decoration: none" @onclick="@(() => { detailsViewOpen[locali] = !isOpen; StateHasChanged(); })" title="@Localization["TableDetailsView"]" aria-expanded="@(isOpen ? "true" : "false")">
@if (isOpen)
{<span aria-hidden="true"><img src="_content/BlazorTable/images/minus.png" /></span>}
else
{<span aria-hidden="true"><img src="_content/BlazorTable/images/plus.png" /></span>}
</a>
</td>
@customRow.ChildContent(item)
rowDisplayed = true;
break;
}
}

@foreach (IColumn<TableItem> column in Columns)
{
@if (column.Visible)
{
<td @key="column"
style="@(column.Align > 0 ? $"text-align: {column.Align};" : "")"
class="@(column.Class)">
if (!rowDisplayed)
{
<tr @key="item" aria-selected="@(SelectedItems.Contains(item) ? "true" : null)" class="@RowClass(item) @(SelectedItems.Contains(item) ? "table-active" : "")" @onclick="(() => OnRowClickHandler(item))">

@if (IsEditMode && column.EditTemplate != null)
@column.EditTemplate(item)
else if (column.Template == null)
@column.Render(item)
else
@column.Template(item)
@{
int locali = i;
if (!detailsViewOpen.ContainsKey(locali))
{
detailsViewOpen[locali] = false;
}
}
@if (detailViewActive)
{
<td>
<a href="javascript:;" style="text-decoration: none" @onclick="@(() => { detailsViewOpen[locali] = !detailsViewOpen[locali]; StateHasChanged(); })" title="@Localization["TableDetailsView"]" aria-expanded="@(detailsViewOpen[locali] ? "true" : "false")">
@if (detailsViewOpen[locali])
{<span aria-hidden="true"><img src="_content/BlazorTable/images/minus.png" /></span>}
else
{<span aria-hidden="true"><img src="_content/BlazorTable/images/plus.png" /></span>}
</a>
</td>
}
}
</tr>

if (_detailTemplate != null && isOpen)
{
<tr>
<td></td>
<td colspan="@(Columns.Count)">
@_detailTemplate(item)
</td>
@foreach (IColumn<TableItem> column in Columns)
{
@if (column.Visible)
{
<td @key="column"
style="@(column.Align > 0 ? $"text-align: {column.Align};" : "")"
class="@(column.Class)">

@if (IsEditMode && column.EditTemplate != null)
@column.EditTemplate(item)
else if (column.Template == null)
@column.Render(item)
else
@column.Template(item)
</td>
}
}
</tr>

if (detailViewActive && detailsViewOpen[i])
{
<tr>
<td></td>
<td colspan="@(Columns.Count)">
@_detailTemplate(item)
</td>
</tr>
}
}

{ i = locali + 1; }
{ i++; }
}
}
else if (_emptyDataTemplate != null)
Expand Down
Loading

0 comments on commit b9ce343

Please sign in to comment.