- Add en_name column to recipes table (migration in database.py)
- Include en_name in recipe API responses and RecipeUpdate model
- Save en_name when admin/senior_editor applies translation
- Load en_name on overlay open, so translation persists across sessions
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add canManage computed (senior_editor + admin) to auth store and use it
for oil edit/delete buttons, PDF export, and public recipe section
visibility. Backend already allowed these operations for senior_editor.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Previously only editor+ roles could manage recipes, so viewer users
saw an empty "我的配方" section. Now any authenticated user can CRUD
their own recipes while admin/senior_editor retain full access.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- oils store: change Map to plain object for Vue reactivity
- recipes store: map `oil_name` from API (was only mapping `oil`/`name`)
- OilReference: fix .get() calls to bracket access
- Add price-display.cy.js regression test (3 tests)
- Add visual-check.cy.js for screenshot verification
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>