From 6195508481b4209aff7573f59a603ac5ee6cb07c Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 30 Oct 2026 16:42:56 +0800 Subject: [PATCH] feat(admin): move message compose into a header-button dialog Replace the inline
compose card on users.php?page=aksrt_messages with a primary header button that opens a native . NativeUi::header() gains dialog-type actions via NativeUi::button_dialog(). The dialog reopens automatically after a failed send. Co-Authored-By: Claude Fable 5 --- assets/css/admin/messages.css | 71 +++++++++++++++++++++++-- assets/js/admin-messages.js | 40 ++++++++++++++ src/Admin/Native/NativeUi.php | 16 +++++- src/Admin/Native/UsersMenusMessages.php | 57 +++++++++++++++----- 4 files changed, 163 insertions(+), 21 deletions(-) create mode 100644 assets/js/admin-messages.js diff --git a/assets/css/admin/messages.css b/assets/css/admin/messages.css index 5a5e0c3a..7aa7f846 100644 --- a/assets/css/admin/messages.css +++ b/assets/css/admin/messages.css @@ -1,16 +1,77 @@ /* 消息管理(users.php?page=aksrt_messages)——仅本页入队。 - * 页面外壳 / 概览 / 折叠卡 / 表单栅格 / 筛选条 / 空状态均走 native-ui.css 的共享类, - * 本文件只保留消息列表专属样式:收件人模式切换、类型徽章、读取状态、用户单元格、列宽。 */ + * 页面外壳 / 概览 / 表单栅格 / 筛选条 / 空状态均走 native-ui.css 的共享类, + * 本文件只保留本页专属样式:发送弹窗、收件人模式切换、类型徽章、读取状态、用户单元格、列宽。 */ .aksrt-messages-admin__muted { color: var(--an-muted); } .aksrt-messages-admin__sub { margin-top: 3px; color: var(--an-muted); font-size: 12px; } .aksrt-messages-admin__sub code { padding: 0 4px; font-size: 12px; background: var(--an-bg-soft); } -/* ---- 代发:收件人模式切换(纯 CSS,无 JS 时按所选模式显隐字段) ---- */ +/* ---- 页头按钮:图标与文字居中对齐( 与 '; + } + /* ------------------------------------------------------------------ * 统计卡 * ----------------------------------------------------------------*/ diff --git a/src/Admin/Native/UsersMenusMessages.php b/src/Admin/Native/UsersMenusMessages.php index 319836ad..2643727d 100644 --- a/src/Admin/Native/UsersMenusMessages.php +++ b/src/Admin/Native/UsersMenusMessages.php @@ -2,7 +2,7 @@ /** * 消息管理后台页(users.php → aksrt_messages)。 * - * 单页承载:概览卡片 + 代发系统消息(折叠卡片,按用户列表或角色投递)+ 已读状态视图 + * 单页承载:概览卡片 + 代发系统消息(页头按钮打开弹窗,按用户列表或角色投递)+ 已读状态视图 * + 类型 / 收件人 / 关键词筛选 + 全站通知列表(批量标记已读 / 删除)+ 共享分页条。 * 查询与写操作在 AKSRT\Messages\NotificationAdminQuery / AdminBroadcast,这里只做页面与路由。 * @@ -20,15 +20,20 @@ defined('ABSPATH') || exit; trait UsersMenusMessages { private const MESSAGE_PAGE_SLUG = 'aksrt_messages'; + private const MESSAGE_COMPOSE_ID = 'aksrt-msg-compose'; - /** 页面专属样式,只在本页入队。 */ + /** 页面专属样式与弹窗脚本,只在本页入队。 */ public function enqueue_message_assets(string $hook): void { if ($hook !== 'users_page_' . self::MESSAGE_PAGE_SLUG) { return; } $css = '/assets/css/admin/messages.css'; + $js = '/assets/js/admin-messages.js'; if (is_file(AKSRT_DIR . $css)) { - wp_enqueue_style('aksrt-admin-messages', AKSRT_URI . $css, [], (string) filemtime(AKSRT_DIR . $css)); + wp_enqueue_style('aksrt-admin-messages', AKSRT_URI . $css, [NativeUi::STYLE_HANDLE], (string) filemtime(AKSRT_DIR . $css)); + } + if (is_file(AKSRT_DIR . $js)) { + wp_enqueue_script('aksrt-admin-messages', AKSRT_URI . $js, [], (string) filemtime(AKSRT_DIR . $js), true); } } @@ -42,11 +47,19 @@ trait UsersMenusMessages { __('消息管理', 'aksrt'), '', 'dashicons-email-alt', - [[ - 'label' => __('通知配置', 'aksrt'), - 'url' => admin_url('admin.php?page=aksrt-settings#/users/notifications'), - 'icon' => 'dashicons-admin-generic', - ]] + [ + [ + 'label' => __('发送系统消息', 'aksrt'), + 'dialog' => self::MESSAGE_COMPOSE_ID, + 'icon' => 'dashicons-megaphone', + 'primary' => true, + ], + [ + 'label' => __('通知配置', 'aksrt'), + 'url' => admin_url('admin.php?page=aksrt-settings#/users/notifications'), + 'icon' => 'dashicons-admin-generic', + ], + ] ); $this->render_message_notices(); @@ -209,14 +222,28 @@ trait UsersMenusMessages { } private function render_message_compose(): void { + // 发送失败回跳时自动重新打开弹窗,便于修正后再发。 $open = sanitize_key((string) wp_unslash($_GET['aksrt_msg'] ?? '')) === 'send_failed'; - echo '
'; - echo '' . esc_html__('发送系统消息', 'aksrt') . ''; - echo '
'; + printf( + '', + esc_attr(self::MESSAGE_COMPOSE_ID), + esc_attr(self::MESSAGE_COMPOSE_ID), + $open ? ' data-aksrt-dialog-autoopen' : '' + ); + echo ''; echo ''; wp_nonce_field('aksrt_users_send_message'); + printf( + '

%s

' + . '
', + esc_attr(self::MESSAGE_COMPOSE_ID), + esc_html__('发送系统消息', 'aksrt'), + esc_attr__('关闭', 'aksrt') + ); + echo '
'; + echo '
' . esc_html__('收件人', 'aksrt') . ''; printf( '', @@ -256,12 +283,14 @@ trait UsersMenusMessages { (int) AdminBroadcast::CONTENT_MAX ); echo '
'; + echo '

' . esc_html__('以「系统通知」类型逐人投递;邮件 / 公众号提醒按通知配置同步触发。', 'aksrt') . '

'; + echo ''; printf( - '
%s
', - esc_html__('以「系统通知」类型逐人投递;邮件 / 公众号提醒按通知配置同步触发。', 'aksrt'), + '', + esc_html__('取消', 'aksrt'), esc_html__('发送', 'aksrt') ); - echo '
'; + echo '
'; } /** @param array{all:int,unread:int,read:int} $counts */