From 573b0ef483c2d23c6f363c045b2c548b38147556 Mon Sep 17 00:00:00 2001 From: Samir Boulahtit Date: Tue, 5 May 2026 21:20:07 +0200 Subject: [PATCH] fix(loyalty): wire merchant staff PIN form to team-member autocomplete MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The shared loyalty pins list factory has an autocomplete-from-team flow gated behind config.staffApiPrefix (loaded once into a list, then filtered client-side). The merchant entry in static/merchant/js/loyalty-pins.js never set staffApiPrefix, so the loadStaffMembers branch never ran and the "Staff member name" field on /merchants/loyalty/pins fell back to free text instead of suggesting actual team members. Wire the merchant config to /merchants/account, and add a flat GET /merchants/account/team/members alias next to the existing /merchants/account/team that returns just {members: [...]} — matching the shape the shared autocomplete factory already expects at ${prefix}/team/members. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../loyalty/static/merchant/js/loyalty-pins.js | 1 + app/modules/tenancy/routes/api/merchant.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/app/modules/loyalty/static/merchant/js/loyalty-pins.js b/app/modules/loyalty/static/merchant/js/loyalty-pins.js index 5a2b6988..8e6b6a7e 100644 --- a/app/modules/loyalty/static/merchant/js/loyalty-pins.js +++ b/app/modules/loyalty/static/merchant/js/loyalty-pins.js @@ -6,6 +6,7 @@ const merchantPinsLog = window.LogConfig.loggers.merchantPins || window.LogConfi function merchantLoyaltyPins() { return loyaltyPinsList({ apiPrefix: '/merchants/loyalty', + staffApiPrefix: '/merchants/account', showStoreFilter: true, showCrud: true, currentPage: 'pins', diff --git a/app/modules/tenancy/routes/api/merchant.py b/app/modules/tenancy/routes/api/merchant.py index 6efe8726..61e89a91 100644 --- a/app/modules/tenancy/routes/api/merchant.py +++ b/app/modules/tenancy/routes/api/merchant.py @@ -179,6 +179,21 @@ async def merchant_team_overview( return merchant_store_service.get_merchant_team_members(db, merchant.id) +@_account_router.get("/team/members") +async def merchant_team_members_list( + merchant=Depends(get_merchant_for_current_user), + db: Session = Depends(get_db), +): + """Flat ``{members: [...]}`` view of merchant team members. + + Same data as ``GET /team`` but with the wrapper fields stripped, so it + matches the shape store-side autocomplete factories already expect at + ``${prefix}/team/members``. + """ + full = merchant_store_service.get_merchant_team_members(db, merchant.id) + return {"members": full["members"]} + + @_account_router.get("/team/stores/{store_id}/roles") async def merchant_team_store_roles( store_id: int,