Recap and next steps#

You’ve built a two-entity admin console end-to-end: annotated schema on the backend, Mantine screens on the frontend, with a foreign-key lookup connecting the two. This page sums up what’s wired and points at where to take the app next.

What’s wired, end to end#

UI API call
Department grid GET /api/department?... via SummaryGrid’s internal grid store
Department view GET /api/department/{id} via PalmyraViewForm
Department new / save POST /api/department / POST /api/department/{id}
Employee grid GET /api/employee?... via SummaryGrid — dotted department.code column projects the FK join inline
Employee view GET /api/employee/{id} via PalmyraViewForm
Department lookup (inside Employee form) GET /api/department?name=...&_limit=... via MantineServerLookup’s lookup store
Employee new / save POST /api/employee with payload { department: { id } }
Employee edit / save POST /api/employee/{id} with the same FK shape

No axios.post, no fetch, no per-entity data layer — every call flows through the single PalmyraStoreFactory configured in the frontend API wiring step.

Where to go next#

Backend#

  • Exports — publish a CsvHandler / ExcelHandler for /api/employee/export.csv and let the Mantine grid’s toolbar point at it.
  • Permissions — replace the open defaults with @Permission keys and plug them into the ACL extension, or register your own Spring PermissionEvaluator to route through an existing auth layer.
  • Custom filters — move tenant scoping and soft-delete guards into applyQueryFilter; see Custom query filters.
  • Native reports — add a /api/reports/... endpoint with NativeQueryHandler when a report outgrows the declarative query surface.

Frontend#

  • Related sibling grids. Add EmployeeActivityLog, EmployeeDocuments, or DepartmentMembers grids under the respective view/ folders — mirroring how the clinic sample stacks ProductPurchaseHistory and ProductStockRequestGrid under product/view/.
  • Richer cell editors. Swap the Mantine Badge cellRenderer on the status column for a popup editor that writes back via useFormstore(...).put(...); the clinic’s PreferenceEditor is the canonical reference.
  • Toolbar variant. Ship an EmpAppDataGridControls with per-row edit / delete buttons if row-click-to-navigate isn’t enough — pass it through SummaryGrid’s DataGridControls prop.
  • Filter plugin. Extract a shared filter panel using the FilterForm plugin once multiple grids need the same filter shape.
  • Auth. Add a login route and a 401 interceptor on the store factory — see the Auth decorators reference.