POS 訂位詳情按鈕順序審計

2026-05-18 · dogfood 5/18 觸發 · 老闆原話:「圖二的那些按鈕應該照時序排列…audit 一下所有的按鈕,排列看看,讓我知道你想怎麼做,最好有示意圖」
狀態:全部 Phase A-F 已 ship (commit pending) · 老闆 confirm「全改、無 emoji」後一次到位實作。Issue A(退還訂金重複按鈕)+ Issue B(藍新文案精準化)併入 Phase E/F 一起完成。

統一排序原則

正向 → 中性 → 破壞性 · 由上而下:
  1. 主動作 (Primary) — 推進 lifecycle 的「下一步」(綠色,加粗)
  2. 輔助 / 等待動作 (Secondary) — 中性、不直接拒絕也不立即推進(橘/藍)
  3. 負向 / 破壞動作 (Destructive) — 拒絕、取消、退款,放最下面(紅色),前面加 Divider 視覺隔離
主動作(綠)
輔助查看(藍)
挽留客人(紫)
柔性負向(橘)
破壞性(紅)

UI 不用任何 emoji — 全部改用 SF Symbols(Apple 系統內建向量 icon)。按鈕文案描述「會發生什麼事」,不只是動詞。

1. pending 待確認 — 老闆截圖中的「圖二」

客人剛送出訂位、老闆還沒同意。實際上是需訂金的案例(豆豆 8 位、訂金 NT$1,600)。

BEFORE

SF確認訂位(需訂金)
SF拒絕訂位
SF取消訂位
三個按鈕語意接近、視覺權重相同。沒分組,「拒絕」跟「取消」在 pending 階段語意重複(都讓訂位失效)。

SHIPPED

checkmark
.circle.fill
確認訂位(需訂金)

hand
.raised.fill
拒絕訂位
xmark
.bin
取消訂位
正向動作獨立群組頂部 + 加粗綠色 + 淡綠 background。Divider 隔開後是兩個 destructive。

2. confirmed 已確認

BEFORE

SF標記到達
SF取消訂位
SF標記未到
SF客人申請取消
「取消」插在「到達」跟「未到」中間,順序錯亂。「客人申請取消」根本不該是 boss button(那是客人端 action)。

SHIPPED

person
.fill.checkmark
標記到達
clock.badge
.exclamationmark
標記未到

xmark
.bin
取消訂位
時序排:正常 → 過時還沒來 → 主動取消。nextStates 中拿掉 .pendingCancellation(Phase B)。

3. arrived 已到達

BEFORE

SF標記入座
SF取消訂位

SHIPPED

chair
.lounge.fill
標記入座

xmark
.bin
取消訂位
加 Divider 隔離,SF Symbol 換成更貼切的 chair.lounge.fill。

4. pendingCancellation 取消待確認 — 新流程的核心

客人申請取消,老闆要決定:同意退錢 / 同意不退錢 / 拒絕取消。

BEFORE

SF同意取消並退款
SF同意取消不退款
SF拒絕取消(挽留客人)
紅色的「同意並退款」其實是最常見、最該按的動作,反而被當作 destructive 染紅;「拒絕取消」染藍像 primary 但其實是少數情境。

SHIPPED

checkmark
.circle.fill
同意取消並退款
scalemass
.fill
同意取消但不退款

bubble.left
.and.bubble
.right.fill
拒絕取消(挽留客人)
主動作改綠色(80% case 就是同意+退錢)。挽留改紫色(主動聯絡客人)。Divider 把「真的取消」vs「挽留」物理隔開。

5. 修改訂位 (modificationSqueezeSection)

5a. 時間變更待確認

BEFORE

SF確認時間修改
SF拒絕時間修改

SHIPPED

checkmark
.circle.fill
確認時間修改

xmark
.circle
拒絕時間修改

5b. 客人請求手動安排

BEFORE

SF幫客人手動安排位子
SF拒絕並說明理由

SHIPPED

tablecells
.badge
.ellipsis
幫客人手動安排位子

xmark
.circle
拒絕並說明理由

5c. 人數變更待確認

SHIPPED

calendar
.badge
.checkmark
查看當天時段並核准修改
person.2
.wave.2
詢問客人擠一擠
這節原本就只有正向 + 輔助,沒有 destructive 所以不需 Divider。順序維持(綠 → 橘)。

6. Phase E — 移除「退還訂金」重複按鈕 (Issue A)

BEFORE

[cancellationPendingSection - 三按鈕]

SF同意取消並退款
SF同意取消不退款
SF拒絕取消(挽留客人)

[操作 section]

SF退還訂金
「退還訂金」跟「同意取消並退款」是同一個動作的兩個入口 — 老闆截圖反映「為什麼有兩顆?」

SHIPPED

[cancellationPendingSection - 三按鈕,重排]

checkmark
.circle.fill
同意取消並退款
scalemass
.fill
同意取消但不退款

bubble.left
.and.bubble
.right.fill
拒絕取消(挽留客人)
取消待確認狀態下「操作」section 整段隱藏(actionsSection 早 return EmptyView)。退還訂金按鈕完全砍掉,沒有重複。

7. Phase F — 「退款待處理」section 文案 (Issue B)

老闆原話:「沒變成已退款是因為沒收到藍新通知嗎?如果是這樣的話是否該寫得更清楚呢?(已向藍新金流申請退款待藍新金流完成刷退動作後會另行通知)」

狀態UI 文案按鈕視覺
newebpayPending
(取消後 < 24h)
「已向藍新金流申請退款。藍新完成刷退後系統會自動更新狀態並通知您 — 實際入帳可能需 1-5 個工作天。」 不顯示按鈕(避免 boss 在 cron 還在跑時誤按蓋掉真實狀態) 藍色 hourglass icon + 「藍新退款處理中」(柔性,非紅警示)
newebpayStuck
(取消後 > 24h 還沒退)
「已超過 24 小時但藍新尚未完成退款。請至藍新後台確認狀態,或在客人實際收到款項後按下方按鈕手動標記完成。」 顯示「已手動退款完成」按鈕(保險) 紅色 warning + 「退款待處理」
manualPending
(銀行匯款)
「請手動匯款退還 NT$X 至客人帳戶,退款完成後按下方按鈕標記。」 顯示「已手動退款完成」按鈕 紅色 warning + 「退款待處理」
關鍵差異(對老闆 dogfood 體驗的影響):
  • newebpay path 預設「藍新處理中」藍色提示(非紅警示),老闆不會以為系統壞了
  • 「已手動退款完成」按鈕在 newebpay normal flow 不出現 — 避免老闆誤按蓋掉 cron 結果
  • 超過 24 小時才升級為紅警示 + 出按鈕當保險(防 cron 完全 stuck 的 edge case)

實作 commit 對照

Phase內容檔案
AactionsSection 排序 + divider + SF Symbols + 顏色語意POSReservationListView.swift
BnextStates(.confirmed) 拿掉 .pendingCancellationReservation.swift
CcancellationPendingSection 三按鈕 reorder + 色彩翻轉(紅→綠)+ 紫色挽留POSReservationListView.swift
D時間修改 / 手動安排 加 DividerPOSReservationListView.swift
EactionsSection 退還訂金按鈕完全移除(pendingCancellation 整段隱藏)POSReservationListView.swift
FmanualRefundSection refundUIState enum + 動態文案 + button gatePOSReservationListView.swift

全部 commit pending — push 完後老闆下輪 dogfood 應該看到全部 UI 變化。

ChefsMate Spec · 2026-05-18 dogfood B3 session #9 · 無 emoji 原則