A factual, side-by-side comparison for Angular apps moving off PrimeNG's
p-table onto @inandu-solutions/grid-angular. Both are MIT-licensed —
this isn't about unlocking paywalled features, it's about grouping, aggregates and export
being built in rather than assembled from several PrimeNG pieces.
p-table is flexible but leaves you assembling row grouping, aggregate footers,
Excel-compatible export and cell-range selection from separate PrimeNG building blocks (or
writing them yourself). inandu-grid ships those as built-in, opt-in attributes on
<inandu-grid>. If your app depends on p-table's column-group
header spans, virtual scroll ships as core here rather than a separate module you assemble.
| Concept | PrimeNG | inandu-grid |
|---|---|---|
| Install | primeng | ng add @inandu-solutions/grid-angular |
| Component | <p-table> + <ng-template pTemplate> | <inandu-grid> + <inandu-column> |
| Row data | [value] | [data] |
| Column definitions | [columns] array + a pTemplate="header"/"body" pair of templates | one <inandu-column field title> per column, declared directly |
PrimeNG's template-driven style, with header/body templates kept in sync by hand:
<p-table [value]="people" [paginator]="true" [rows]="25">
<ng-template pTemplate="header">
<tr><th pSortableColumn="name">Name</th><th pSortableColumn="age">Age</th></tr>
</ng-template>
<ng-template pTemplate="body" let-row>
<tr><td>{{ row.name }}</td><td>{{ row.age }}</td></tr>
</ng-template>
</p-table>
becomes one declarative element per column, no header/body template pair to keep in sync:
<inandu-grid [data]="people" [paging]="{ pageSize: 25 }">
<inandu-column field="name" title="Name" sortable="true" />
<inandu-column field="age" title="Age" type="number" sortable="true" />
</inandu-grid>
| Feature | PrimeNG p-table | inandu-grid |
|---|---|---|
| Sorting | pSortableColumn | sortable="true" per column, shift-click for multi-sort |
| Per-column filter | pColumnFilter / column filter templates | filter="yes" — type-aware popup built in |
| Global filter | [globalFilterFields] + an external search input | filter="true" on <inandu-grid> — search box included |
| Pagination | [paginator]="true" + [rows] | [paging]="{ pageSize: 25 }" |
| Row grouping | rowGroupMode="subheader" + groupRowsBy | groupable="true" per column |
| Aggregates / totals | a separate <ng-template pTemplate="footer"> you write by hand | showTotals + aggregate="sum" — computed and rendered for you |
| Cell range selection | not built in | cellRangeSelection (+ multiRange) |
| Excel / CSV export | exportCSV() (CSV only, built in) | CSV, plus SpreadsheetML .xls, plus PDF — all free |
| Row selection | [(selection)] + selectionMode | selectable="true" |
| Inline editing | pEditableColumn + p-cellEditor templates | editable="true" per column, plus required/min/max/pattern/[validator] — no editor template boilerplate |
| Column resize / reorder | [resizableColumns] / [reorderableColumns] | on by default, opt out with resize="false" / reorder="false" |
| Frozen columns | pFrozenColumn | sticky="true" (or "right") |
| Virtual scroll | [virtualScroll]="true" + [virtualScrollItemSize] | virtualScroll, opt-in |
| Lazy / server-side rows | [lazy]="true" + (onLazyLoad) | serverSide + outputs; pairs with the .NET/EF Core companion for ASP.NET Core APIs |
p-chart) you'd otherwise pair with p-table; inandu-grid expects you to bring your own chart library the same way.colspan multi-level headers in p-table, inandu-grid doesn't have a grouped-header equivalent yet.<p-table>'s header/body template pair with one <inandu-column> per column, using the table above.showTotals + aggregate="sum" (or avg/min/max/count).pEditableColumn/p-cellEditor boilerplate with editable="true" and column-level validation attributes.Full API reference, every input/output, and runnable examples: see the user manual. Questions or migration issues: open an issue.