A refactored Angular dashboard built on top of the Sakai PrimeNG template, with improved architecture inspired by NG Matero.
- Angular
- PrimeNG
- TypeScript
- Tailwind and SCSS
- Transloco for localization
git clone <your-repo-link>
cd <project-folder>
npm install
ng serveThen open: http://localhost:4200/
These components are mandatory. Never bypass them with raw PrimeNG equivalents.
| Component | File | Use when |
|---|---|---|
<app-popup-shell> |
popup-shell/popup-shell.ts |
Custom overlay without dialog chrome |
<app-delete-confirm-popup> |
delete-confirm-popup/... |
Per-row inline delete confirmation |
<app-delete-button> |
delete-button/... |
Bulk delete or programmatic row delete |
<app-actions-menu> |
actions-menu/... |
Standalone 3-dots row menu |
<app-tree-table> |
tree-table/tree-table.ts |
Hierarchical data (2 or 3 levels) |
| You want to… | Use |
|---|---|
| Flat data table with toolbar, filters, pagination | <app-table [data]="..." [columns]="..."> |
| Table + cards/grid toggle | <app-table [showLayoutToggle]="true"> + #cardTemplate |
| Custom card per row in grid view | Project <ng-template #cardTemplate let-item> inside <app-table> |
| Card 3-dots menu | One shared <p-menu #cardMenu> + openCardMenu() swapping model |
| Open create/edit dialog | <app-dialog-shell [(visible)]="..." (save)="..."> |
| Per-row action menu | [rowActions]="myArrowFn" on <app-table> |
| Bulk delete bottom bar | Built into <app-table> — enable with [showBulkDelete]="true" |
| Toolbar filter chips | [toolbarFilters]="..." on <app-table> |
| Status tag coloring | [severityMap]="..." on <app-table> or | severity pipe |
| 2-level hierarchy (parent → children) | <app-tree-table [nestedConfig]="cfg"> |
| 3-level hierarchy | <app-tree-table> with nested nestedConfig |
| Lightweight overlay / context popup | <app-popup-shell (dismissed)="..."> |
| Per-row inline delete confirm | <app-delete-confirm-popup> |
| Bulk / bottom-bar delete with confirm | <app-delete-button> |
| Reduce unnecessary re-renders | changeDetection: ChangeDetectionStrategy.OnPush on every component |
| Local UI state | signal<T>() — not plain variables |
| Derived/computed values | computed() — not getters |
| Unsubscribe from Observables | takeUntilDestroyed(destroyRef) |
| Mock data before backend is ready | JSON file in public/api/ + BaseApiService |