2026-05-26 Gate 2 ship. Two fixes from Narong's same-day Telegram review. (U6.1) "Hide from POS" → "Show on POS" with new products defaulting to hidden so admins can stage drafts. (U6.2) Per-value popover for editing attribute-value extra prices (Iced +$0.50) — works uniformly across both modifier and SKU-splitting attributes.
checked={!isHidden}); internal isHidden variable preserved verbatim so DB column name + all downstream POS filters stay unchanged.is_hidden=true immediately after redirect to /products/[id], and the checkbox rendered unchecked.is_hidden=false (verified directly via Supabase). Save flash testid hits successfully.useState(false) regardless of saved state — now hydrates from template.isHidden via the loader.updateAttributeValueAction. Schema column cafe.product_attribute_value.price_extra_usd already existed from H4-P1; U6 surfaces it in the UI.price_extra_usd = 0.50 → reloaded page → chip rendered with "+$0.50" suffix. Hot value (untouched) stayed without an extra-price node.attributesLibrary state patches on save (no router.refresh round-trip). Outside-click + Escape both dismiss without saving.price_extra + lst_price shape).nix-outdoor-sales-backend/migrations/20260526100000_u6_product_default_hidden.tsnix-outdoor-sales-backend/migrate.js — idempotent registry entry after U5nix-cafe/lib/db/schema.ts — isHidden on cafeProductTemplate defaults to truenix-cafe/lib/db/products.ts — createProduct + rename-create both drop the hardcoded isHidden: false; rely on column defaultnix-cafe/lib/db/product_attribute.ts — TemplateRow.isHidden + select/return on both DAOs + createTemplate return shapenix-cafe/lib/actions/product_attribute.ts — createTemplateAction propagates row.isHiddennix-cafe/app/(authed)/products/[id]/product-detail-client.tsx — label flip, state hydration fix, chip rendering with extra-price suffix + edit icon, new AttributeValuePopover component (~150 LOC)| ✓ | Prod: cafe.product_template.is_hidden DEFAULT = true (migration landed) |
| ✓ | DAO probe: createTemplate on prod returns isHidden=true |
| ✓ | Set up: create test attribute + 2 values via DAO probe |
| ✓ | Login to lumiere-coffee |
| ✓ | /cafe/products renders + new-product button visible |
| ✓ | Open New Product modal + create test product |
| ✓ | U6.1: 'Show on POS' label present + checkbox unchecked (default hidden) |
| ✓ | U6.1: DB confirms is_hidden=true on the new product |
| ✓ | U6.1: tick 'Show on POS' + Save → DB flips is_hidden=false |
| ✓ | Attach test attribute line to the new template (DAO probe) |
| ✓ | U6.2: reload page + value chips render (Hot, Iced) |
| ✓ | U6.2: click ✎ on the Iced chip → popover opens (data-value-id binds correctly) |
| ✓ | U6.2: fill +$0.50 + Save → popover auto-closes |
| ✓ | U6.2: DB confirms priceExtraUsd = 0.50 on the Iced value |
| ✓ | U6.2: chip rendering — Iced shows '+$0.50' suffix after reload; Hot has no extra node |
| ✓ | Cleanup: delete test template + attribute via DAO |
| ✓ | No 5xx HTTP responses during the suite |
| test-phase1-prod.mjs | 11/11 |
| test-phase2-sso-outdoor-prod.mjs | 6/6 |
| test-m1-prod.mjs | 10/10 |
| test-r7-prod.mjs | 14/14 |
| test-r8-prod.mjs | 4/4 |
| test-phase2-cafe-multishop-prod.mjs (solo) | 6/6 |
narongix chain ran sequentially (shared get-coffee creds). phase2-cafe-multishop ran solo per feedback_phase2_cafe_multishop_solo_retry — first-attempt green (7th validation of the rule).
product.attribute.value.price_extra. Per-template overrides (Odoo's deeper product.template.attribute.value.price_extra layer) would need a new join table; out of scope for this slice.nameKh and categoryId are still useState("") regardless of saved state, same pattern as the isHidden bug U6 fixed. Touched the file with intent to stay scoped to visibility, so left those as a followup.