-
Order
-
Change the order in which the characters appear in your in-game character selection screen.
+
Order Character Screen
+
Change the order in which the characters appear in your in-game character selection screen, by dragging them, matches in-game position.
-
-
Date: Tue, 23 Jun 2026 16:54:31 +0100
Subject: [PATCH 3/4] Mail Return: redesigned layout, subject escaping,
empty-state reset
---
.../MailReturnMenu/MailReturnController.php | 4 +-
.../MailReturnMenu/MailReturnView.php | 108 ++++++----
.../web/assets/mail-return/mail-return.js | 198 +++++++++++++-----
3 files changed, 210 insertions(+), 100 deletions(-)
diff --git a/src/acore-wp-plugin/src/Components/MailReturnMenu/MailReturnController.php b/src/acore-wp-plugin/src/Components/MailReturnMenu/MailReturnController.php
index 3d54a2227..ba9241125 100644
--- a/src/acore-wp-plugin/src/Components/MailReturnMenu/MailReturnController.php
+++ b/src/acore-wp-plugin/src/Components/MailReturnMenu/MailReturnController.php
@@ -64,7 +64,7 @@ public static function getSentUnreadMails($charGuid)
// Get mails sent by this character that are unread by the receiver
// messageType = 0 means player mail
- $query = "SELECT m.`id`, m.`subject`, m.`has_items`, m.`money`,
+ $query = "SELECT m.`id`, m.`subject`, m.`has_items`, m.`money`, m.`cod`,
m.`expire_time`, m.`deliver_time`,
rc.`name` AS receiver_name, rc.`race` AS receiver_race,
rc.`class` AS receiver_class, rc.`gender` AS receiver_gender,
@@ -94,7 +94,7 @@ public static function getSentUnreadMails($charGuid)
$placeholders = implode(',', array_fill(0, count($mailIds), '?'));
$worldDb = Opts::I()->acore_db_world_name;
$itemQuery = "SELECT mi.`mail_id`, ii.`itemEntry`, ii.`count`,
- it.`name` AS item_name
+ it.`name` AS item_name, it.`Quality` AS item_quality
FROM `mail_items` mi
JOIN `item_instance` ii ON mi.`item_guid` = ii.`guid`
JOIN `$worldDb`.`item_template` it ON ii.`itemEntry` = it.`entry`
diff --git a/src/acore-wp-plugin/src/Components/MailReturnMenu/MailReturnView.php b/src/acore-wp-plugin/src/Components/MailReturnMenu/MailReturnView.php
index 5a882e5c2..74af3c7ed 100644
--- a/src/acore-wp-plugin/src/Components/MailReturnMenu/MailReturnView.php
+++ b/src/acore-wp-plugin/src/Components/MailReturnMenu/MailReturnView.php
@@ -2,6 +2,8 @@
namespace ACore\Components\MailReturnMenu;
+use ACore\Utils\AcoreCharColors;
+
class MailReturnView
{
@@ -17,58 +19,80 @@ public function getMailReturnRender($chars)
ob_start();
wp_enqueue_style('bootstrap-css', '//cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css', array(), '5.1.3');
- wp_enqueue_style('acore-css', ACORE_URL_PLG . 'web/assets/css/main.css', array(), '0.1');
+ wp_enqueue_style('acore-css', ACORE_URL_PLG . 'web/assets/css/main.css', array(), '0.5');
wp_enqueue_script('bootstrap-js', '//cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js', array(), '5.1.3');
wp_enqueue_script('jquery');
- wp_enqueue_script('acore-mail-return-js', ACORE_URL_PLG . 'web/assets/mail-return/mail-return.js', array('jquery'), null, true);
+ wp_enqueue_script('power-js', 'https://wow.zamimg.com/widgets/power.js', array(), null, false);
+ wp_enqueue_script('acore-mail-return-js', ACORE_URL_PLG . 'web/assets/mail-return/mail-return.js', array('jquery'), '2.3', true);
+ wp_localize_script('acore-mail-return-js', 'mailReturnData', [
+ 'mailsUrl' => rest_url(ACORE_SLUG . '/v1/mail-return/list'),
+ 'returnUrl' => rest_url(ACORE_SLUG . '/v1/mail-return'),
+ 'assetsUrl' => ACORE_URL_PLG . 'web/assets/',
+ 'nonce' => wp_create_nonce('wp_rest'),
+ ]);
?>
-
-
-
-
-
Mail Return
-
You can return sent mails that have not yet been read by the recipient in this page. Select the character, the sent mail and hit return.
-
-
-
-
-
-
-
-
Loading...
+
+
+
+
+
+
-
-
Unread Sent Mails
-
-
No unread sent mails found for this character.
+
+
-
-
-
-
-
-
-
+
+
+
+
+ ').text(subjectText).html();
+ var codHtml = (mail.cod && parseInt(mail.cod) > 0)
+ ? '
· CoD: Cash on Delivery'
+ : '';
+
+ // WoW item quality → border color
+ var qualityColors = {
+ 0: '#9d9d9d', // Poor (gray)
+ 1: '#c0c0c0', // Common (white → light grey for dark bg visibility)
+ 2: '#1eff00', // Uncommon (green)
+ 3: '#0070dd', // Rare (blue)
+ 4: '#a335ee', // Epic (purple)
+ 5: '#ff8000', // Legendary (orange)
+ 6: '#e6cc80', // Artifact
+ 7: '#e6cc80', // Heirloom
+ };
+
+ // Items grid — quality-colored border, quantity always shown
+ var itemsHtml = '';
if (mail.items && mail.items.length > 0) {
- itemsHtml = '
';
- mail.items.forEach(function (item, idx) {
- if (idx > 0) itemsHtml += " ";
- var qty = item.count > 1 ? " x" + item.count : "";
- itemsHtml += '
' + item.item_name + '' + qty;
+ itemsHtml = '
';
+ mail.items.forEach(function (item) {
+ var safeName = jQuery('
').text(item.item_name).html();
+ var qualityClr = qualityColors[item.item_quality] || '#9d9d9d';
+ itemsHtml += '
';
});
- itemsHtml += "
";
+ itemsHtml += '
';
}
- // Build money HTML
- var moneyHtml = "";
- if (mail.money > 0) {
- moneyHtml = '
Money: ' + formatMoney(mail.money) + '
';
- }
+ // Level badge: same expansion badge as character selector
+ var lvlExp = mail.receiver_level <= 60 ? 'vanilla' : (mail.receiver_level <= 70 ? 'tbc' : 'wrath');
+ var levelBadge = jQuery('
')
+ .addClass('acore-level')
+ .attr('data-exp', lvlExp)
+ .text('LEVEL ' + mail.receiver_level);
var entry = jQuery('').append(
- jQuery('').addClass('mail-entry').append(
- // Header row: subject + return button
- jQuery('
').addClass('mail-header').append(
- jQuery('
').addClass('mail-subject').text(mail.subject || "(No Subject)"),
- jQuery('