Support importing multiple raw materials via JSON array.
Upsert strategy: If a raw material with the same name exists, update unit and pricePerUnit; otherwise create a new record.
Provide Bulk JSON Import UI on the Raw Materials list page (/raw-materials) with preview and validation.
Full-Page Edit & Create Routes (apps/admin):
Replace modal-based editing with dedicated full-page routes:
/raw-materials: Table list, search, and Bulk JSON Import modal/dialog.
/raw-materials/new: Dedicated full page to add new raw material.
/raw-materials/🆔 Dedicated full page to view and edit raw material.
Technical Scope
Backend (apps/backend): POST /raw-materials/bulk endpoint with upsert transaction in routes/raw-materials.ts.
Admin (apps/admin): Routing in App.tsx, update RawMaterialsPage.tsx, and add RawMaterialDetailPage.tsx.
### Objectives
1. **Bulk JSON Import (/api/raw-materials/bulk):**
- Support importing multiple raw materials via JSON array.
- Upsert strategy: If a raw material with the same name exists, update unit and pricePerUnit; otherwise create a new record.
- Provide Bulk JSON Import UI on the Raw Materials list page (/raw-materials) with preview and validation.
2. **Full-Page Edit & Create Routes (apps/admin):**
- Replace modal-based editing with dedicated full-page routes:
- /raw-materials: Table list, search, and Bulk JSON Import modal/dialog.
- /raw-materials/new: Dedicated full page to add new raw material.
- /raw-materials/:id: Dedicated full page to view and edit raw material.
### Technical Scope
- **Backend (apps/backend):** POST /raw-materials/bulk endpoint with upsert transaction in routes/raw-materials.ts.
- **Admin (apps/admin):** Routing in App.tsx, update RawMaterialsPage.tsx, and add RawMaterialDetailPage.tsx.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Objectives
Bulk JSON Import (/api/raw-materials/bulk):
Full-Page Edit & Create Routes (apps/admin):
Technical Scope