2026-07-09 13:25:54 +08:00

724 lines
34 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover"
/>
<title>Manage Center</title>
<link
rel="stylesheet"
href="../../common/theme.css?v=20260709-skeleton-mascot"
/>
<link rel="stylesheet" href="../common/center.css?v=20260608" />
<link rel="stylesheet" href="./style.css?v=20260708-manager-actions" />
</head>
<body>
<div class="manager-center" aria-label="Manage Center">
<div class="hero-bg" aria-hidden="true"></div>
<nav class="title-bar">
<button
class="back-button"
id="backButton"
type="button"
aria-label="Back"
data-i18n-aria="manager_center.back"
>
<svg viewBox="0 0 32 32" aria-hidden="true">
<path
d="M20.3 6.8a2 2 0 0 1 0 2.8L14 15.9c-.1.1-.1.2 0 .3l6.3 6.3a2 2 0 1 1-2.8 2.8L9.8 17.6a2.3 2.3 0 0 1 0-3.2l7.7-7.7a2 2 0 0 1 2.8.1Z"
/>
</svg>
</button>
<h1 data-i18n="manager_center.title">Manage Center</h1>
<div class="language-switcher">
<button
class="language-button"
type="button"
aria-label="Change language"
aria-expanded="false"
data-language-toggle
data-i18n-aria="manager_center.change_language"
>
<svg viewBox="0 0 32 32" aria-hidden="true">
<path
d="M16 11.2a4.8 4.8 0 1 0 0 9.6 4.8 4.8 0 0 0 0-9.6Z"
/>
<path
d="M26.2 17.7v-3.4l-3.2-.7a8 8 0 0 0-.8-1.9l1.8-2.8-2.4-2.4-2.8 1.8c-.6-.3-1.2-.6-1.9-.8L16.3 4h-3.4l-.7 3.5c-.7.2-1.3.5-1.9.8L7.5 6.5 5.1 8.9l1.8 2.8c-.3.6-.6 1.2-.8 1.9l-3.3.7v3.4l3.3.7c.2.7.5 1.3.8 1.9l-1.8 2.8 2.4 2.4 2.8-1.8c.6.3 1.2.6 1.9.8l.7 3.5h3.4l.7-3.5c.7-.2 1.3-.5 1.9-.8l2.8 1.8 2.4-2.4-1.8-2.8c.3-.6.6-1.2.8-1.9l3.2-.7Z"
/>
</svg>
</button>
<div class="language-menu" data-language-menu hidden>
<button type="button" data-lang-option="en">EN</button>
<button type="button" data-lang-option="ar">AR</button>
<button type="button" data-lang-option="tr">TR</button>
<button type="button" data-lang-option="es">ES</button>
<button type="button" data-lang-option="zh">ZH</button>
<button type="button" data-lang-option="id">ID</button>
</div>
</div>
</nav>
<main class="content">
<section class="card manager-profile-card">
<div class="manager-avatar-shell">
<img
class="manager-avatar-image"
id="managerAvatar"
src=""
alt=""
hidden
/>
<div
class="manager-avatar-fallback"
id="managerAvatarFallback"
aria-hidden="true"
></div>
</div>
<div class="manager-profile-copy">
<strong id="managerName"></strong>
<span class="manager-role-badge">
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="m5 9 4 4 3-7 3 7 4-4-2 9H7Z" />
</svg>
<span data-i18n="manager_center.role_manager"
>Manager</span
>
</span>
<span class="manager-id-line">
<span>ID:</span>
<span id="managerDisplayId"></span>
<button
class="manager-copy-button"
type="button"
aria-label="Copy manager ID"
data-i18n-aria="manager_center.copy_id"
>
<svg viewBox="0 0 24 24" aria-hidden="true">
<path
d="M8.5 7.2h9.1c1.2 0 2.2 1 2.2 2.2v9.1c0 1.2-1 2.2-2.2 2.2H8.5c-1.2 0-2.2-1-2.2-2.2V9.4c0-1.2 1-2.2 2.2-2.2Z"
/>
<path
d="M5.2 3.3h8.7c1 0 1.8.8 1.8 1.8v.8H7.8c-1.6 0-2.9 1.3-2.9 2.9v7.9H4c-1 0-1.8-.8-1.8-1.8V6.3c0-1.7 1.3-3 3-3Z"
/>
</svg>
</button>
</span>
</div>
</section>
<section class="manager-kpi-grid" aria-label="Manager summary">
<article class="card manager-kpi-card kpi-wallet">
<span class="manager-kpi-icon" aria-hidden="true">
<svg viewBox="0 0 36 36">
<path
d="M8 13.5h18.2a4.2 4.2 0 0 1 4.2 4.2v10.6H8Z"
/>
<path d="M8.2 12.8 23.8 7l2.2 6.5Z" />
<path
class="icon-cutout"
d="M24 19.5h6.4v5.4H24a2.7 2.7 0 0 1 0-5.4Z"
/>
<circle
class="icon-dot"
cx="24.3"
cy="22.2"
r="1.1"
/>
</svg>
</span>
<div class="manager-kpi-copy">
<span data-i18n="manager_center.this_month"
>This Month</span
>
<strong id="managerThisMonthSalary"></strong>
<em data-i18n="manager_center.team_salary"
>Team Salary</em
>
</div>
<i class="manager-bars" aria-hidden="true"></i>
</article>
<article class="card manager-kpi-card kpi-report">
<span class="manager-kpi-icon" aria-hidden="true">
<svg viewBox="0 0 36 36">
<path d="M9.5 5.5h15.4l4.6 4.6v20.4h-20Z" />
<path class="icon-cutout" d="M24 6.5v5h5Z" />
<path
class="icon-cutout"
d="M15 15h9v2.2h-9ZM15 20h6.8v2.2H15Z"
/>
<path
class="icon-cutout"
d="m15.3 27.3 3.4-3.4 2.9 2.8 5-7 1.9 1.4-6.6 9.1-3.1-3-2.1 2.1Z"
/>
</svg>
</span>
<div class="manager-kpi-copy">
<span data-i18n="manager_center.last_month"
>Last Month</span
>
<strong id="managerLastMonthSalary"></strong>
<em data-i18n="manager_center.team_salary"
>Team Salary</em
>
</div>
<i class="manager-bars" aria-hidden="true"></i>
</article>
<article class="card manager-kpi-card kpi-hosts">
<span class="manager-kpi-icon" aria-hidden="true">
<svg viewBox="0 0 36 36">
<circle cx="13.4" cy="12.3" r="5.5" />
<path
d="M4.8 30.5c1.3-6.4 4.2-9.6 8.6-9.6s7.3 3.2 8.6 9.6Z"
/>
<circle cx="24.7" cy="12.7" r="4.8" />
<path
d="M21.4 30.5c1.1-5.4 3.5-8.1 7.2-8.1 3 0 5.1 2 6.4 6.1v2Z"
/>
</svg>
</span>
<div class="manager-kpi-copy">
<span data-i18n="manager_center.active_hosts"
>Active Hosts</span
>
<strong id="managerActiveHosts"></strong>
<em data-i18n="manager_center.total_active"
>Total Active</em
>
</div>
<i class="manager-bars" aria-hidden="true"></i>
</article>
<article class="card manager-kpi-card kpi-growth">
<span class="manager-kpi-icon" aria-hidden="true">
<svg viewBox="0 0 36 36">
<path
d="M7.5 25.5 15.3 17.7l4.4 4.3 8.1-11h3.4v3.4L20.2 29 15.4 24.2 10 29.5Z"
/>
<path d="M23.2 9.6h8v8h-3v-5h-5Z" />
</svg>
</span>
<div class="manager-kpi-copy">
<span data-i18n="manager_center.growth"
>Growth</span
>
<strong id="managerGrowth"></strong>
<em data-i18n="manager_center.vs_last_month"
>vs Last Month</em
>
</div>
<i class="manager-bars" aria-hidden="true"></i>
</article>
</section>
<!-- <section class="card manager-assets-card">
<button class="manager-asset-item" type="button">
<span
class="manager-asset-icon wallet"
aria-hidden="true"
>
<svg viewBox="0 0 36 36">
<path d="M7 12h18.5a4 4 0 0 1 4 4v12H7Z" />
<path d="M7.4 11.4 24.5 7l1.9 5Z" />
<path
class="icon-cutout"
d="M23.4 18.3h6.1v5.6h-6.1a2.8 2.8 0 0 1 0-5.6Z"
/>
<circle
class="icon-dot"
cx="23.8"
cy="21.1"
r="1"
/>
</svg>
</span>
<span>
<strong data-i18n="manager_center.wallet"
>Wallet</strong
>
<em id="managerWallet"></em>
</span>
<i aria-hidden="true"></i>
</button>
<button class="manager-asset-item" type="button">
<span
class="manager-asset-icon bank"
aria-hidden="true"
>
<svg viewBox="0 0 36 36">
<path d="M6 11h24v16H6Z" />
<path
class="icon-cutout"
d="M6 15h24v3H6ZM10 22h7v2.4h-7Z"
/>
</svg>
</span>
<span>
<strong data-i18n="manager_center.bank_cards"
>Bank Cards</strong
>
<em id="managerBankCards"></em>
</span>
<i aria-hidden="true"></i>
</button>
</section> -->
<section class="card manager-actions-card">
<!-- 操作入口按 overview.permissions 显隐renderActionPermissions 按 data-action 对应的权限位隐藏未授权入口 -->
<div class="manager-action-grid" aria-label="Manager tools">
<button
class="manager-action-item action-send-frame"
type="button"
data-action="send-frame"
>
<span
class="manager-action-icon"
aria-hidden="true"
>
<svg viewBox="0 0 36 36">
<path
d="M9 4.5h18A4.5 4.5 0 0 1 31.5 9v18a4.5 4.5 0 0 1-4.5 4.5H9A4.5 4.5 0 0 1 4.5 27V9A4.5 4.5 0 0 1 9 4.5Z"
/>
<circle
class="icon-cutout"
cx="18"
cy="14.6"
r="4.8"
/>
<path
class="icon-cutout"
d="M10.4 28c1.2-5.1 3.8-7.6 7.6-7.6s6.4 2.5 7.6 7.6Z"
/>
</svg>
</span>
<span data-i18n="manager_center.send_frame"
>Send Frame</span
>
</button>
<button
class="manager-action-item action-send-car"
type="button"
data-action="send-car"
>
<span
class="manager-action-icon"
aria-hidden="true"
>
<svg viewBox="0 0 36 36">
<path
d="m6.1 16 2.2-6a3.2 3.2 0 0 1 3-2.1h13.4a3.2 3.2 0 0 1 3 2.1l2.2 6c1.6.5 2.7 1.8 2.7 3.5v6.1a1.8 1.8 0 0 1-1.8 1.8h-1.6a1.8 1.8 0 0 1-1.8-1.8v-1.1H8.6v1.1a1.8 1.8 0 0 1-1.8 1.8H5.2a1.8 1.8 0 0 1-1.8-1.8v-6.1c0-1.7 1.1-3 2.7-3.5Z"
/>
<path
class="icon-cutout"
d="m9.4 15.3 1.5-4.3c.2-.6.8-1 1.4-1h11.4c.6 0 1.2.4 1.4 1l1.5 4.3Z"
/>
<circle
class="icon-cutout"
cx="9.9"
cy="20.3"
r="1.7"
/>
<circle
class="icon-cutout"
cx="26.1"
cy="20.3"
r="1.7"
/>
</svg>
</span>
<span data-i18n="manager_center.send_car"
>Send Car</span
>
</button>
<button
class="manager-action-item action-send-badge"
type="button"
data-action="send-badge"
>
<span
class="manager-action-icon"
aria-hidden="true"
>
<svg viewBox="0 0 36 36">
<path
d="m12.6 20.9-2.8 10 5.3-2.3 2.9 3.9 2.9-3.9 5.3 2.3-2.8-10Z"
/>
<circle cx="18" cy="13.4" r="9.4" />
<path
class="icon-cutout"
d="m18 8.4 1.6 3.1 3.4.5-2.5 2.4.6 3.4-3.1-1.6-3.1 1.6.6-3.4-2.5-2.4 3.4-.5Z"
/>
</svg>
</span>
<span data-i18n="manager_center.send_badge"
>Send Badge</span
>
</button>
<button
class="manager-action-item action-send-vip"
type="button"
data-action="send-vip"
>
<span
class="manager-action-icon"
aria-hidden="true"
>
<svg viewBox="0 0 36 36">
<path
d="m4.8 11.4 6.4 4.9L18 7.6l6.8 8.7 6.4-4.9-2.6 14.3a2.6 2.6 0 0 1-2.6 2.1H10a2.6 2.6 0 0 1-2.6-2.1Z"
/>
<circle
class="icon-cutout"
cx="18"
cy="21.4"
r="2"
/>
</svg>
</span>
<span data-i18n="manager_center.send_vip"
>Send VIP</span
>
</button>
<button
class="manager-action-item action-update-level"
type="button"
data-action="update-user-level"
>
<span
class="manager-action-icon"
aria-hidden="true"
>
<svg viewBox="0 0 36 36">
<path d="M5.5 29.5V20h5.4v9.5Z" />
<path d="M15.3 29.5V13.8h5.4v15.7Z" />
<path d="M25.1 29.5V7.5h5.4v22Z" />
<path
d="M6.2 13.2 12.9 6.5H8.5V3.7h9v9h-2.8V8.5l-6.6 6.6Z"
/>
</svg>
</span>
<span data-i18n="manager_center.user_level"
>User Level</span
>
</button>
<button
class="manager-action-item action-bd"
type="button"
data-action="add-bd-leader"
>
<span
class="manager-action-icon"
aria-hidden="true"
>
<svg viewBox="0 0 36 36">
<circle cx="15" cy="11.5" r="6" />
<path
d="M5.5 30.5c1.4-7.1 4.6-10.6 9.5-10.6 4.2 0 7.1 2.5 8.8 7.5v3.1Z"
/>
<circle cx="27" cy="24.8" r="5.8" />
<path
class="icon-cutout"
d="M26 20.8h2v3h3v2h-3v3h-2v-3h-3v-2h3Z"
/>
</svg>
</span>
<span data-i18n="manager_center.bd_leader"
>BD Leader</span
>
</button>
<button
class="manager-action-item action-invite-admin"
type="button"
data-action="add-admin"
>
<span
class="manager-action-icon"
aria-hidden="true"
>
<svg viewBox="0 0 36 36">
<circle cx="15" cy="11.5" r="6" />
<path
d="M5.5 30.5c1.4-7.1 4.6-10.6 9.5-10.6s8.1 3.5 9.5 10.6Z"
/>
<circle cx="26.5" cy="22.8" r="5.4" />
<path
class="icon-cutout"
d="m26.5 19.3 1 2 2.2.3-1.6 1.5.4 2.2-2-1-2 1 .4-2.2-1.6-1.5 2.2-.3Z"
/>
</svg>
</span>
<span data-i18n="manager_center.admin">Admin</span>
</button>
<button
class="manager-action-item action-super"
type="button"
data-action="add-superadmin"
>
<span
class="manager-action-icon"
aria-hidden="true"
>
<svg viewBox="0 0 36 36">
<path
d="M18 5 29 10v8.2c0 7-4.3 10.8-11 13.3-6.7-2.5-11-6.3-11-13.3V10Z"
/>
<path
class="icon-cutout"
d="m18 11 1.8 3.6 4 .6-2.9 2.8.7 4-3.6-1.9-3.6 1.9.7-4-2.9-2.8 4-.6Z"
/>
</svg>
</span>
<span data-i18n="manager_center.super_admin"
>Super Admin</span
>
</button>
<button
class="manager-action-item action-block-users"
type="button"
data-action="block-user"
>
<span
class="manager-action-icon"
aria-hidden="true"
>
<svg viewBox="0 0 36 36">
<circle cx="16" cy="11.5" r="5.8" />
<path
d="M7.2 28.8c1.3-6.9 4.2-10.3 8.8-10.3s7.5 3.4 8.8 10.3Z"
/>
<circle
class="icon-cutout"
cx="26"
cy="23.5"
r="7.4"
/>
<path
d="M21.4 18.9a7.4 7.4 0 0 1 9.2 9.2Z"
/>
</svg>
</span>
<span data-i18n="manager_center.block_users"
>Block Users</span
>
</button>
</div>
</section>
</main>
<div
class="block-modal level-modal"
id="levelModal"
aria-hidden="true"
hidden
>
<button
class="block-backdrop"
id="levelBackdrop"
type="button"
aria-label="Close update level dialog"
></button>
<section
class="block-dialog"
role="dialog"
aria-modal="true"
aria-labelledby="levelDialogTitle"
>
<div class="block-dialog-header">
<h2 id="levelDialogTitle">Update User Level</h2>
<button
class="block-close"
id="levelCloseButton"
type="button"
aria-label="Close"
>
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M6 6l12 12M18 6 6 18" />
</svg>
</button>
</div>
<div class="block-dialog-body">
<div class="block-field">
<label for="levelSearchInput">User ID</label>
<div class="block-search-row">
<input
id="levelSearchInput"
type="text"
inputmode="numeric"
autocomplete="off"
placeholder="Enter user ID"
/>
<button id="levelSearchButton" type="button">
Search
</button>
</div>
</div>
<div
class="block-search-result"
id="levelSearchResult"
aria-live="polite"
></div>
<div class="level-panel" id="levelPanel" hidden>
<div class="block-section-title">
Select user level
</div>
<div
class="level-grid"
id="levelGrid"
aria-label="Select user level"
></div>
<button
class="confirm-level-button"
id="confirmLevelButton"
type="button"
disabled
>
Confirm Update
</button>
</div>
</div>
</section>
</div>
<div class="block-modal" id="blockModal" aria-hidden="true" hidden>
<button
class="block-backdrop"
id="blockBackdrop"
type="button"
aria-label="Close block user dialog"
></button>
<section
class="block-dialog"
role="dialog"
aria-modal="true"
aria-labelledby="blockDialogTitle"
>
<div class="block-dialog-header">
<h2 id="blockDialogTitle">Block User</h2>
<button
class="block-close"
id="blockCloseButton"
type="button"
aria-label="Close"
>
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M6 6l12 12M18 6 6 18" />
</svg>
</button>
</div>
<div class="block-dialog-body">
<div class="block-field">
<label for="blockSearchInput">User ID</label>
<div class="block-search-row">
<input
id="blockSearchInput"
type="text"
inputmode="numeric"
autocomplete="off"
placeholder="Enter user ID"
/>
<button id="blockSearchButton" type="button">
Search
</button>
</div>
</div>
<div
class="block-search-result"
id="blockSearchResult"
aria-live="polite"
></div>
<div
class="block-duration-panel"
id="blockDurationPanel"
hidden
>
<div class="block-section-title">
Select block duration
</div>
<div class="duration-grid" id="durationGrid">
<button
type="button"
data-duration-ms="3600000"
data-duration-label="1 hour"
>
1 hour
</button>
<button
type="button"
data-duration-ms="86400000"
data-duration-label="1 day"
>
1 day
</button>
<button
type="button"
data-duration-ms="604800000"
data-duration-label="7 days"
>
7 days
</button>
<button
type="button"
data-duration-ms="2592000000"
data-duration-label="30 days"
>
30 days
</button>
<button
type="button"
data-duration-ms="0"
data-duration-label="Permanent"
>
Permanent
</button>
</div>
<button
class="confirm-block-button"
id="confirmBlockButton"
type="button"
disabled
>
Confirm Block
</button>
</div>
<div class="block-list-header">
<div class="block-section-title">Blocked Users</div>
<div class="block-list-count" id="blockListCount">
0
</div>
</div>
<div
class="blocked-list"
id="blockedList"
aria-live="polite"
></div>
</div>
</section>
</div>
<div class="home-indicator" aria-hidden="true"></div>
</div>
<script src="../../common/toast.js"></script>
<script src="../../common/loading.js?v=20260709-lalu-loading"></script>
<script src="../../common/skeleton.js?v=20260709-skeleton-mascot"></script>
<script src="../../common/api.js?v=20260624-manager-badge-country"></script>
<script src="../../common/params.js?v=20260608-manager-real"></script>
<script src="../../common/jsbridge.js"></script>
<script src="../../common/i18n.js?v=20260608"></script>
<script src="./script.js?v=20260709-page-skeleton"></script>
</body>
</html>