feat(checkin): open reference-parity details modal from signed buttons

- Rebuild checkin details modal HTML 1:1 with reference theme:
  colorful header c-blue, user card (points/level), daily reward
  card and 7-day continuous mini cards
- Signed entry buttons (header dropdown, user-card badge, user
  center) become clickable checkin-details-link modal triggers
  instead of disabled buttons
- Swap data-signin-btn to details link in place after successful
  signin (reference .initiate-checkin replacement behavior)
- Add aksrt-checkin-details-modal runtime shell (modal-mini 400px)
- Remove dead code: legacy lite modal, admin-ajax details handler,
  /signin/history route, signin calendar; rebuild public bundles
- Update contract tests to the new checkin modal contract
This commit is contained in:
kate522 committed 2026-09-19 14:49:58 +08:00
1 parent c289016324
commit 4653128a18
15 files changed
+211 -266

No files matched your search

+41 -9
View File
@@ -7,6 +7,29 @@
defined('ABSPATH') || exit;
if (!function_exists('aksrt_get_user_checkin_details_link')) :
/**
* 已签到详情弹窗触发链接(参考主题 zib_get_user_checkin_details_link 1:1):
* 打开刷新式 mini 弹窗(高 240,移动端底部弹出,每次都重新拉取)。
*
* @param string $class 沿用入口按钮的类。
* @param string $text 链接内文(含图标)。
*/
function aksrt_get_user_checkin_details_link(string $class = '', string $text = ''): string {
$class = trim($class . ' checkin-details-link');
return '<a class="' . esc_attr($class) . '" href="javascript:;"'
. ' data-aksrt-modal="remote"'
. ' data-aksrt-modal-url="' . esc_url(rest_url('aksrt/v1/signin/details')) . '"'
. ' data-aksrt-modal-class="aksrt-checkin-details-modal modal-mini"'
. ' data-aksrt-modal-height="240"'
. ' data-aksrt-modal-mobile-bottom="true"'
. ' data-aksrt-modal-cache="false">'
. $text
. '</a>';
}
endif;
if (!function_exists('aksrt_header_user_checkin_btn')) :
/**
* Check-in CTA for header dropdown and compact card placements.
@@ -31,27 +54,36 @@ if (!function_exists('aksrt_header_user_checkin_btn')) :
$signed = \AKSRT\Credits\Signin::get_instance()->is_signed_today($user_id);
// 已签到:与参考主题一致,入口按钮变为签到详情弹窗触发链接(可点击)。
if ($signed) {
$icon = '<i class="fa fas fa-calendar-check ml3 mr6" aria-hidden="true"></i>';
if ($class !== null) {
// 用户卡片签到书签:保留书签类与 is-done 视觉,仅将行为切换为打开详情弹窗。
return aksrt_get_user_checkin_details_link(
$class . ' is-done',
$icon . '<span>' . esc_html__('已签到', 'aksrt') . '</span>'
);
}
return aksrt_get_user_checkin_details_link(
'but block c-yellow aksrt-header-checkin is-done',
'<i class="fa fas fa-calendar-check" aria-hidden="true"></i> ' . esc_html($compact ? __('已签到', 'aksrt') : __('今日已签到', 'aksrt'))
);
}
$classes = $class ?? ('but block c-yellow aksrt-header-checkin' . ($compact ? ' aksrt-header-checkin--compact' : ''));
// Card badge variant (explicit $class, e.g. the user-card 签到 badge):
// reference parity renders an <a> so the badge inherits the card font
// instead of the UA button stylesheet (font/UI 1:1 with the reference).
if ($class !== null) {
return '<a class="' . esc_attr($classes . ($signed ? ' is-done' : '')) . '" href="javascript:;" data-signin-btn'
return '<a class="' . esc_attr($classes) . '" href="javascript:;" data-signin-btn'
. ' data-signin-idle-label="' . esc_attr__('签到', 'aksrt') . '"'
. ' data-signin-done-label="' . esc_attr__('已签到', 'aksrt') . '">'
. '<i class="fa fas fa-calendar-check ml3 mr6" aria-hidden="true"></i>'
. '<span data-signin-label>' . esc_html($signed ? __('已签到', 'aksrt') : __('签到', 'aksrt')) . '</span>'
. '<span data-signin-label>' . esc_html__('签到', 'aksrt') . '</span>'
. '</a>';
}
if ($signed) {
return '<button type="button" class="' . esc_attr($classes . ' is-done') . '" data-signin-btn data-signin-idle-label="' . esc_attr__('签到', 'aksrt') . '" data-signin-done-label="' . esc_attr__('已签到', 'aksrt') . '" disabled>'
. '<i class="fa fas fa-calendar-check" aria-hidden="true"></i>'
. '<span data-signin-label>' . esc_html($compact ? __('已签到', 'aksrt') : __('今日已签到', 'aksrt')) . '</span>'
. '</button>';
}
return '<button type="button" class="' . esc_attr($classes) . '" data-signin-btn data-signin-idle-label="' . esc_attr__('签到', 'aksrt') . '" data-signin-done-label="' . esc_attr__('已签到', 'aksrt') . '">'
. '<i class="fa fas fa-calendar-check" aria-hidden="true"></i>'
. '<span data-signin-label>' . esc_html($compact ? __('签到', 'aksrt') : __('签到领取今日奖励', 'aksrt')) . '</span>'
@@ -32,9 +32,13 @@ $currency = (string) ($currency_name ?? __('积分', 'aksrt'));
</div>
<?php if (!empty($signin_enabled)) : ?>
<span class="uc-asset-card__head-action muted-color px12" data-aksrt-signin>
<?php if (!empty($signin_signed_today)) : ?>
<?php echo aksrt_get_user_checkin_details_link('uc-asset-card__signin muted-color px12', '<span>' . esc_html__('已签到', 'aksrt') . '</span><i class="fa fas fa-angle-right em12 ml3" aria-hidden="true"></i>'); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
<?php else : ?>
<button type="button" class="uc-asset-card__signin muted-color px12" data-signin-btn data-signin-idle-label="<?php esc_attr_e('签到领积分', 'aksrt'); ?>" data-signin-done-label="<?php esc_attr_e('已签到', 'aksrt'); ?>" disabled>
<span data-signin-label><?php esc_html_e('签到领积分', 'aksrt'); ?></span><i class="fa fas fa-angle-right em12 ml3" aria-hidden="true"></i>
</button>
<?php endif; ?>
<span class="uc-asset-card__signin-status" data-signin-status></span>
</span>
<?php endif; ?>
@@ -69,21 +69,24 @@ extract($context, EXTR_SKIP); // phpcs:ignore WordPress.PHP.DontExtract.extract_
</div>
</div>
<div class="uc-header__actions">
<?php if (!empty($signin_enabled)) : ?>
<span data-aksrt-signin>
<button
type="button"
class="btn btn-sm uc-header__signin-btn<?php echo !empty($signin_signed_today) ? ' is-done' : ''; ?>"
data-signin-btn
data-signin-idle-label="<?php esc_attr_e('签到', 'aksrt'); ?>"
data-signin-done-label="<?php esc_attr_e('已签到', 'aksrt'); ?>"
<?php disabled(!empty($signin_signed_today)); ?>
>
<i class="fa fas fa-calendar-check" aria-hidden="true"></i>
<span data-signin-label><?php echo !empty($signin_signed_today) ? esc_html__('已签到', 'aksrt') : esc_html__('签到', 'aksrt'); ?></span>
</button>
</span>
<?php if (!empty($signin_enabled)) : ?>
<span data-aksrt-signin>
<?php if (!empty($signin_signed_today)) : ?>
<?php echo aksrt_get_user_checkin_details_link('btn btn-sm uc-header__signin-btn is-done', '<i class="fa fas fa-calendar-check" aria-hidden="true"></i><span>' . esc_html__('已签到', 'aksrt') . '</span>'); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
<?php else : ?>
<button
type="button"
class="btn btn-sm uc-header__signin-btn"
data-signin-btn
data-signin-idle-label="<?php esc_attr_e('签到', 'aksrt'); ?>"
data-signin-done-label="<?php esc_attr_e('已签到', 'aksrt'); ?>"
>
<i class="fa fas fa-calendar-check" aria-hidden="true"></i>
<span data-signin-label><?php esc_html_e('签到', 'aksrt'); ?></span>
</button>
<?php endif; ?>
</span>
<?php endif; ?>
<?php if (!empty($messages_url)) : ?>
<a href="<?php echo esc_url($messages_url); ?>" class="btn-ghost btn-sm btn-icon uc-header__message-btn" aria-label="<?php esc_attr_e('消息通知', 'aksrt'); ?>" title="<?php esc_attr_e('消息通知', 'aksrt'); ?>">
<i class="fa fas fa-bell" aria-hidden="true"></i>