fix(payment): 售后弹窗改为按钮载荷同步弹出,修复首次点击无反馈

原实现是「点击 → 先请求 /orders/{n} → 再弹窗」,与项目里所有可用弹窗
(含举报链路 report.js)不同构:举报弹窗把数据放在按钮 data-* 属性里同步
弹出。前置请求会让首次点击在请求返回前毫无反应,体感就是"得二次点击"。

- 按钮 data-aksrt-after-sale-apply / -detail 携带订单与售后状态载荷
  (PHP 模板与 order-center.js 的 actionHtml 同构生成),点击当拍即开
  对应弹窗:申请表单 / 超时效提示 / 售后详细,零前置请求
- 「再次申请售后」同样使用已渲染载荷,不再重新拉取订单
- 提交与图片上传仍走 REST,服务端校验不变;列表刷新后载荷随之更新
- jsdom 多脚本环境实测:三种入口均在点击同一拍弹出且 fetch 计数为 0
This commit is contained in:
2026-10-06 23:29:59 +08:00
parent 4ea02f25ac
commit 93579cbc9f
4 changed files with 77 additions and 51 deletions
@@ -279,7 +279,7 @@ test('frontend after-sale modals are standalone and config-driven', () => {
assert.match(js, /REAPPLY_BLOCKED_TEXT = '该无法再次申请售后,该订单已售后,暂不支持再次申请售后。'/)
assert.match(js, /escapeHtml\(REAPPLY_BLOCKED_TEXT\)/)
assert.match(js, /data-aksrt-modal-close>我知道了</)
assert.match(js, /data-aksrt-after-sale-reapply=/)
assert.match(js, /data-aksrt-after-sale-reapply data-aksrt-after-sale-payload="/)
// 提交后关闭弹窗并刷新订单列表
assert.match(js, /AKSRTOrderCenter\.refresh\(orderNumber\)/)
@@ -300,9 +300,12 @@ test('order center drops the embedded after-sale form and exposes refresh()', ()
assert.ok(!js.includes('onDocumentSubmit'), 'document submit handler for the after-sale form must be removed')
// 列表卡片与订单详情弹窗底部共用新的售后按钮
assert.match(js, /function afterSaleButtons\(orderNumber, afterSale\)/)
assert.match(js, /if \(afterSale\.enabled\) html \+= afterSaleButtons\(order\.order_number, afterSale\);/)
assert.match(js, /html \+= afterSaleButtons\(order\.order_number, order\.after_sale \|\| \{\}\);/)
assert.match(js, /function afterSaleButtons\(order\)/)
assert.match(js, /var payload = escapeHtml\(JSON.stringify\(\{/)
assert.match(js, /data-aksrt-after-sale-detail="' \+ payload \+ '"/)
assert.match(js, /data-aksrt-after-sale-apply="' \+ payload \+ '"/)
assert.match(js, /if \(afterSale\.enabled\) html \+= afterSaleButtons\(order\);/)
assert.ok(js.includes('html += afterSaleButtons(order);'), 'detail modal footer renders the after-sale buttons')
assert.match(js, /data-aksrt-after-sale-detail="/)
assert.match(js, /data-aksrt-after-sale-apply="/)
@@ -328,8 +331,11 @@ test('after-sale assets, template buttons and runtime data are wired', () => {
const template = read('inc/helpers/user-center-renderers/profile-orders.php')
assert.match(template, /\$after_sale = is_array\(\$order\['after_sale'\] \?\? null\) \? \$order\['after_sale'\] : \[\];/)
assert.match(template, /data-aksrt-after-sale-detail="/)
assert.match(template, /data-aksrt-after-sale-apply="/)
// 载荷随按钮渲染(order-after_sale.js 同步消费),点击即弹窗、无前置请求
assert.match(template, /\$after_sale_payload = wp_json_encode\(\[/)
assert.match(template, /'after_sale'\s*=> \$after_sale,/)
assert.match(template, /data-aksrt-after-sale-detail="<\?php echo esc_attr\(\$after_sale_payload\);/)
assert.match(template, /data-aksrt-after-sale-apply="<\?php echo esc_attr\(\$after_sale_payload\);/)
assert.match(template, /esc_html_e\('售后详细', 'aksrt'\)/)
assert.ok(!template.includes('can_after_sale'), 'template must not use the removed can_after_sale flag')