A table property editor for Umbraco 17+ that allows content editors to create and manage tabular data with support for header rows, header columns, and inline editing.
- Inline cell editing with contenteditable
- Header row and header column toggles
- Add and remove rows and columns
- Right-click context menu for quick operations
- Strongly-typed C# models with PropertyValueConverter
- Configurable min/max rows and columns
- Read-only mode support
- Built with Lit/Vite/TypeScript following Umbraco 17 patterns
Install the NuGet package:
dotnet add package UmbHost.TablesOr via the Package Manager Console:
Install-Package UmbHost.Tables- In the Umbraco backoffice, go to Settings → Data Types
- Click Create Data Type
- Select Table as the property editor
- Configure your options (header toggles, row/column limits, etc.)
- Save the Data Type
- Edit your Document Type
- Add a new property
- Select your Table Data Type
- Save the Document Type
@using UmbHost.Tables.Models
@{
var table = Model.Value<TableModel>("tableProperty");
}
@if (table != null && table.Rows.Any())
{
<table class="table">
@if (table.UseFirstRowAsHeader && table.Rows.Any())
{
<thead>
<tr>
@foreach (var cell in table.Rows.First().Cells)
{
<th>@Html.Raw(cell.Value)</th>
}
</tr>
</thead>
}
<tbody>
@foreach (var row in table.UseFirstRowAsHeader ? table.Rows.Skip(1) : table.Rows)
{
<tr>
@for (var i = 0; i < row.Cells.Count; i++)
{
var cell = row.Cells[i];
if (table.UseFirstColumnAsHeader && i == 0)
{
<th>@Html.Raw(cell.Value)</th>
}
else
{
<td>@Html.Raw(cell.Value)</td>
}
}
</tr>
}
</tbody>
</table>
}The TableModel includes a helper method for simpler rendering:
@using UmbHost.Tables.Models
@{
var table = Model.Value<TableModel>("tableProperty");
}
@if (table != null)
{
@Html.Raw(table.ToHtmlTable("table table-striped"))
}The main model representing the table:
| Property | Type | Description |
|---|---|---|
Rows |
List<TableRow> |
Collection of table rows |
UseFirstRowAsHeader |
bool |
Whether the first row should render as <th> elements |
UseFirstColumnAsHeader |
bool |
Whether the first column should render as <th> elements |
RowCount |
int |
Number of rows |
ColumnCount |
int |
Number of columns (from first row) |
Represents a single row:
| Property | Type | Description |
|---|---|---|
Cells |
List<TableCell> |
Collection of cells in the row |
HasHeaderCells |
bool |
Whether any cells are headers |
IsEmpty |
bool |
Whether all cells are empty |
CellCount |
int |
Number of cells |
Represents a single cell:
| Property | Type | Description |
|---|---|---|
Value |
string |
HTML/text content |
Type |
TableCellType |
Td or Th |
ColSpan |
int |
Column span (for future use) |
RowSpan |
int |
Row span (for future use) |
IsEmpty |
bool |
Whether cell is empty |
IsHeader |
bool |
Whether cell is a header |
When creating a Data Type, the following options are available:
| Option | Default | Description |
|---|---|---|
showUseFirstRowAsHeader |
true |
Show the "use first row as header" toggle |
showUseFirstColumnAsHeader |
true |
Show the "use first column as header" toggle |
defaultRows |
3 |
Initial number of rows for new tables |
defaultColumns |
3 |
Initial number of columns for new tables |
minRows |
1 |
Minimum allowed rows |
maxRows |
0 |
Maximum allowed rows (0 = unlimited) |
minColumns |
1 |
Minimum allowed columns |
maxColumns |
0 |
Maximum allowed columns (0 = unlimited) |
- Umbraco 17.0.0 or later
- .NET 10.0 or later
- .NET 10 SDK
- Node.js 18+
Clone the repository and build the client assets:
cd src/UmbHost.Tables.Client
npm install
npm run buildBuild the .NET project:
dotnet buildDuring development, you can watch for client-side changes:
cd src/UmbHost.Tables.Client
npm run watchdotnet pack src/UmbHost.Tables/UmbHost.Tables.csproj -c ReleaseIf you're migrating from Limbo.Umbraco.Tables:
- The data structure is compatible, so existing content should work without migration
- Update your using statements from
Limbo.Umbraco.Tables.ModelstoUmbHost.Tables.Models - The
TableModelproperties are largely the same - Update your Data Types to use the new "Table" property editor
Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License - see the LICENSE file for details.
Inspired by Limbo.Umbraco.Tables by Limbo.
Built for Umbraco 17+ by UmbHost.