83 lines
1.9 KiB
C#
83 lines
1.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Microsoft.AspNetCore.Html;
|
|
|
|
namespace WebfrontCore.ViewModels;
|
|
|
|
public class TableInfo
|
|
{
|
|
public string Header { get; set; }
|
|
public List<ColumnDefinition> Columns { get; } = new();
|
|
public List<RowDefinition> Rows { get; } = new();
|
|
public int InitialRowCount { get; }
|
|
|
|
public TableInfo(int initialRowCount = 0)
|
|
{
|
|
InitialRowCount = initialRowCount;
|
|
}
|
|
}
|
|
|
|
public class RowDefinition
|
|
{
|
|
public List<ColumnTypeDefinition> Datum { get; } = new();
|
|
}
|
|
|
|
public class ColumnDefinition
|
|
{
|
|
public string Title { get; set; }
|
|
public string ColumnSpan { get; set; }
|
|
}
|
|
|
|
public enum ColumnType
|
|
{
|
|
Text,
|
|
Link,
|
|
Icon,
|
|
Button
|
|
}
|
|
|
|
public class ColumnTypeDefinition
|
|
{
|
|
public ColumnType Type { get; set; }
|
|
public string Value { get; set; }
|
|
public string Data { get; set; }
|
|
public IHtmlContent Template { get; set; }
|
|
public int Id { get; set; }
|
|
}
|
|
|
|
public static class TableInfoExtensions
|
|
{
|
|
public static TableInfo WithColumns(this TableInfo info, IEnumerable<string> columns)
|
|
{
|
|
info.Columns.AddRange(columns.Select(column => new ColumnDefinition
|
|
{
|
|
Title = column
|
|
}));
|
|
|
|
return info;
|
|
}
|
|
|
|
public static TableInfo WithRows<T>(this TableInfo info, IEnumerable<T> source,
|
|
Func<T, IEnumerable<string>> selector)
|
|
{
|
|
return WithRows(info, source, (outer) => selector(outer).Select(item => new ColumnTypeDefinition
|
|
{
|
|
Value = item,
|
|
Type = ColumnType.Text
|
|
}));
|
|
}
|
|
|
|
public static TableInfo WithRows<T>(this TableInfo info, IEnumerable<T> source,
|
|
Func<T, IEnumerable<ColumnTypeDefinition>> selector)
|
|
{
|
|
info.Rows.AddRange(source.Select(row =>
|
|
{
|
|
var rowDef = new RowDefinition();
|
|
rowDef.Datum.AddRange(selector(row));
|
|
return rowDef;
|
|
}));
|
|
return info;
|
|
}
|
|
}
|