Deploy: 2026-05-23 02:42:32

This commit is contained in:
Hamza-Ayed
2026-05-23 02:42:32 +03:00
parent 71e609d869
commit 1814f69ecb
6 changed files with 196 additions and 8 deletions

View File

@@ -759,6 +759,12 @@
<div class="dashboard-layout">
<!-- Left Sidebar Nav -->
<div class="nav-menu">
<!-- Super Admin Dashboard -->
<button class="nav-item" x-show="user?.is_super_admin" :class="{ 'active': activeDashboardTab === 'super_admin' }" @click="activeDashboardTab = 'super_admin'; fetchSuperAdminStats()" id="nav-superadmin-btn">
<span class="nav-icon">👑</span>
<span class="nav-text" x-text="lang === 'ar' ? 'لوحة المشرف العام' : 'Super Admin'"></span>
</button>
<button class="nav-item" :class="{ 'active': activeDashboardTab === 'whatsapp' }" @click="activeDashboardTab = 'whatsapp'" id="nav-whatsapp-btn">
<span>📱</span> <span x-text="lang === 'ar' ? 'اتصال الواتساب' : 'WhatsApp Connection'"></span>
</button>
@@ -799,12 +805,66 @@
</template>
<!-- Panel: WhatsApp Connection -->
<!-- Super Admin Panel -->
<div class="panel" x-show="activeDashboardTab === 'super_admin'" id="panel-superadmin">
<h2 x-text="lang === 'ar' ? 'لوحة المشرف العام' : 'Super Admin Dashboard'"></h2>
<p class="text-muted" x-text="lang === 'ar' ? 'إدارة الشركات والباقات.' : 'Manage tenants and subscriptions.'"></p>
<div class="dashboard-stats" style="margin-top: 1rem;" x-show="superAdminStats">
<div class="stat-card">
<div class="stat-title" x-text="lang === 'ar' ? 'إجمالي الشركات' : 'Total Companies'"></div>
<div class="stat-value" x-text="superAdminStats?.total_companies"></div>
</div>
<div class="stat-card">
<div class="stat-title" x-text="lang === 'ar' ? 'أرقام الواتساب المربوطة' : 'Connected WhatsApps'"></div>
<div class="stat-value" x-text="superAdminStats?.connected_sessions + ' / ' + superAdminStats?.total_sessions"></div>
</div>
</div>
<h3 style="margin-top:2rem;" x-text="lang === 'ar' ? 'قائمة الشركات' : 'Companies List'"></h3>
<div class="data-table" style="overflow-x: auto;">
<table>
<thead>
<tr>
<th>ID</th>
<th x-text="lang === 'ar' ? 'اسم الشركة' : 'Company Name'"></th>
<th x-text="lang === 'ar' ? 'الباقة الحالية' : 'Current Plan'"></th>
<th x-text="lang === 'ar' ? 'استهلاك الرسائل' : 'Request Usage'"></th>
<th x-text="lang === 'ar' ? 'حالة الواتساب' : 'WhatsApp Status'"></th>
<th x-text="lang === 'ar' ? 'الإجراءات' : 'Actions'"></th>
</tr>
</thead>
<tbody>
<template x-for="company in superAdminCompanies" :key="company.id">
<tr>
<td x-text="company.id"></td>
<td x-text="company.name"></td>
<td x-text="company.plan_name ? company.plan_name : 'No Plan'"></td>
<td x-text="company.request_usage"></td>
<td x-text="company.active_sessions + ' / ' + company.sessions_count"></td>
<td>
<select class="form-input" style="padding: 0.2rem; font-size: 0.85rem;" @change="changeCompanyPlan(company.id, $event.target.value)">
<option value="" disabled selected x-text="lang === 'ar' ? 'تغيير الباقة...' : 'Change Plan...'"></option>
<template x-for="plan in superAdminPlans" :key="plan.id">
<option :value="plan.id" x-text="plan.name"></option>
</template>
</select>
</td>
</tr>
</template>
</tbody>
</table>
</div>
</div>
<div class="panel" x-show="activeDashboardTab === 'whatsapp'" id="panel-whatsapp">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.5rem;" :style="lang === 'ar' ? 'flex-direction: row-reverse' : ''">
<h2 style="font-size: 1.4rem; margin: 0;" x-text="lang === 'ar' ? 'إدارة قنوات اتصال واتساب' : 'WhatsApp Session Management'"></h2>
<div style="display: flex; gap: 0.5rem; align-items: center;" :style="lang === 'ar' ? 'flex-direction: row-reverse' : ''">
<input type="text" x-model="newSessionName" :placeholder="lang === 'ar' ? 'اسم الرقم (مثال: الدعم)' : 'Session Name (e.g. Sales)'" class="form-input" style="max-width: 200px; padding: 0.5rem 0.8rem; font-size: 0.85rem;" id="new-session-name-input">
<button @click="createWhatsappSession()" class="btn btn-primary" style="padding: 0.5rem 1rem; font-size: 0.85rem;" id="btn-create-session" :disabled="actionLoading">
<div style="display: flex; gap: 0.5rem; align-items: center;">
<span class="badge badge-warning" x-show="whatsappSessions.length >= whatsappMaxSessions" x-text="lang === 'ar' ? 'تم الوصول للحد الأقصى (' + whatsappSessions.length + '/' + whatsappMaxSessions + ')' : 'Limit Reached (' + whatsappSessions.length + '/' + whatsappMaxSessions + ')'"></span>
<span class="badge badge-success" x-show="whatsappSessions.length < whatsappMaxSessions" x-text="whatsappSessions.length + ' / ' + whatsappMaxSessions + (lang === 'ar' ? ' أرقام' : ' Numbers')"></span>
<input type="text" x-model="newSessionName" class="form-input" :placeholder="lang === 'ar' ? 'اسم الرقم (مثال: الدعم)' : 'Session Name (e.g. Sales)'" style="width: 250px;" id="new-session-name-input">
<button @click="createWhatsappSession()" class="btn btn-primary" style="padding: 0.5rem 1rem; font-size: 0.85rem;" id="btn-create-session" :disabled="actionLoading || whatsappSessions.length >= whatsappMaxSessions">
<span x-text="lang === 'ar' ? '+ إضافة خط جديد' : '+ Add New Line'"></span>
</button>
</div>
@@ -1649,9 +1709,13 @@
user: null,
// Dashboard States
superAdminStats: null,
superAdminCompanies: [],
superAdminPlans: [],
activeDashboardTab: 'whatsapp',
whatsappSession: null,
whatsappSessions: [],
whatsappMaxSessions: 1,
newSessionName: '',
staff: [],
showAddStaffModal: false,
@@ -1895,7 +1959,57 @@
console.error('Failed to retrieve session status:', err);
}
},
// Super Admin methods
async fetchSuperAdminStats() {
if (!this.user?.is_super_admin) return;
this.actionLoading = true;
try {
const response = await fetch('/api/admin/stats', {
headers: { 'Authorization': `Bearer ${this.token}` }
});
const data = await response.json();
if (response.ok && data.status === 'success') {
this.superAdminStats = data.data.stats;
this.superAdminCompanies = data.data.companies;
this.superAdminPlans = data.data.plans;
}
} catch (err) {
console.error(err);
} finally {
this.actionLoading = false;
}
},
async changeCompanyPlan(companyId, planId) {
if (!planId) return;
if (!confirm(this.lang === 'ar' ? 'هل أنت متأكد من تغيير الباقة لهذه الشركة؟' : 'Are you sure you want to change the subscription plan for this company?')) return;
this.actionLoading = true;
try {
const response = await fetch('/api/admin/companies/subscribe', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${this.token}`
},
body: JSON.stringify({
company_id: companyId,
plan_id: planId,
duration_days: 30
})
});
const data = await response.json();
if (response.ok && data.status === 'success') {
alert(this.lang === 'ar' ? 'تم تحديث الباقة بنجاح' : 'Plan updated successfully');
await this.fetchSuperAdminStats();
} else {
alert(data.error || 'Failed to update plan');
}
} catch (err) {
console.error(err);
} finally {
this.actionLoading = false;
}
},
async fetchWhatsappSessions() {
if (!this.token) return;
try {
@@ -1905,6 +2019,15 @@
const data = await response.json();
if (response.ok && data.status === 'success') {
this.whatsappSessions = data.data || [];
this.whatsappMaxSessions = data.max_sessions || 1;
if (this.whatsappSessions.length > 0 && (!this.whatsappSession || !this.whatsappSessions.find(s => s.id === this.whatsappSession.id))) {
this.whatsappSession = this.whatsappSessions[0];
this.fetchChatbotSettings();
}
if (this.whatsappSessions.length === 0) {
this.whatsappSession = null;
}
}
} catch (err) {
console.error('Failed to retrieve sessions list:', err);