Update Saqel Platform: 2026-09-04 21:26:55

This commit is contained in:
Hamza-Ayed
2026-09-04 21:26:55 +03:00
parent 24f6b5a589
commit ae00aa943e
36 changed files with 5621 additions and 1617 deletions
@@ -0,0 +1,21 @@
/**
* ==============================================================================
* SAQEL SOVEREIGN COMMAND - APPLICATION CONFIGURATION
* ==============================================================================
*
* ملف إعدادات تطبيق المدير الأعلى (SuperAdmin App):
* يحدد الروابط الأساسية وعناوين الخوادم والمؤشرات المرجعية للسيادة الرقمية.
*/
class AppConfig {
static const String appTitle = 'صَقِل — القيادة السيادية العليا';
static const String founderName = 'حمزة العائد';
static const String founderRole = 'المؤسس ورئيس المعمارية التقنية واستراتيجي المناهج';
static const String apiBaseUrl = 'http://127.0.0.1:8000';
static const String localAiClusterUrl = 'http://127.0.0.1:8000/v1';
// Key Operational Targets
static const double targetGrossMargin = 82.5; // 82.5% gross margin goal
static const double targetSlaSpeedMinutes = 4.0;
static const int totalTargetMilitarySchools = 43;
}
@@ -0,0 +1,50 @@
import 'package:flutter/material.dart';
/**
* ==============================================================================
* SAQEL SOVEREIGN COMMAND - LUXURY CUPERTINO DARK THEME
* ==============================================================================
*
* سمة أبل كوبرتينو الداكنة الفخمة ذات الهيبة السيادية:
* - تدرجات ملكية من البنفسجي الإمبراطوري (#8B5CF6) والذهب الملكي (#FFD166) والزمردي (#10B981).
* - خطوط أبل SF Pro مع دعم SF Arabic و Cairo للنصوص العربية عالية الوضوح.
*/
class SuperAdminTheme {
static const Color background = Color(0xFF06090F);
static const Color surface = Color(0xFF0E1422);
static const Color surfaceCard = Color(0xFF141C2E);
static const Color border = Color(0xFF1E293B);
static const Color royalGold = Color(0xFFFFD166);
static const Color imperialPurple = Color(0xFF8B5CF6);
static const Color emeraldGreen = Color(0xFF10B981);
static const Color cyberCyan = Color(0xFF38BDF8);
static const Color dangerRed = Color(0xFFEF4444);
static ThemeData get darkTheme {
return ThemeData(
brightness: Brightness.dark,
scaffoldBackgroundColor: background,
fontFamily: '-apple-system',
fontFamilyFallback: const [
'SF Pro Display',
'SF Pro Text',
'SF Arabic',
'Cairo',
'system-ui',
],
colorScheme: const ColorScheme.dark(
primary: imperialPurple,
secondary: royalGold,
surface: surface,
background: background,
),
appBarTheme: const AppBarTheme(
backgroundColor: surface,
elevation: 0,
centerTitle: false,
),
);
}
}
@@ -0,0 +1,104 @@
/**
* ==============================================================================
* SAQEL SOVEREIGN COMMAND - DATA MODELS
* ==============================================================================
*
* نماذج البيانات السيادية للرصد الكلي، الخزينة، وخوادم الذكاء الاصطناعي المحلي.
*/
class MacroTelemetryModel {
final int totalDirectorates;
final int totalSchools;
final int totalStudents;
final int totalTeachers;
final double grossMarginPercent;
final double treasuryBalanceJod;
final double totalCliqInflowJod;
final int pendingPayoutsCount;
final double r2BandwidthCostSavingsJod;
final double uptimePercent;
const MacroTelemetryModel({
required this.totalDirectorates,
required this.totalSchools,
required this.totalStudents,
required this.totalTeachers,
required this.grossMarginPercent,
required this.treasuryBalanceJod,
required this.totalCliqInflowJod,
required this.pendingPayoutsCount,
required this.r2BandwidthCostSavingsJod,
required this.uptimePercent,
});
factory MacroTelemetryModel.fromJson(Map<String, dynamic> json) {
return MacroTelemetryModel(
totalDirectorates: json['total_directorates'] ?? 2,
totalSchools: json['total_schools'] ?? 43,
totalStudents: json['total_students'] ?? 19350,
totalTeachers: json['total_teachers'] ?? 812,
grossMarginPercent: (json['gross_margin_percent'] as num?)?.toDouble() ?? 84.6,
treasuryBalanceJod: (json['treasury_balance_jod'] as num?)?.toDouble() ?? 48500.0,
totalCliqInflowJod: (json['total_cliq_inflow_jod'] as num?)?.toDouble() ?? 15200.0,
pendingPayoutsCount: json['pending_payouts_count'] ?? 4,
r2BandwidthCostSavingsJod: (json['r2_cost_savings_jod'] as num?)?.toDouble() ?? 3240.0,
uptimePercent: (json['uptime_percent'] as num?)?.toDouble() ?? 99.98,
);
}
}
class AiClusterNodeModel {
final String nodeName;
final String modelName;
final String role;
final double gpuVramUsageGb;
final double gpuTotalVramGb;
final int latencyMs;
final String status; // 'active_online', 'idle', 'rebalancing'
const AiClusterNodeModel({
required this.nodeName,
required this.modelName,
required this.role,
required this.gpuVramUsageGb,
required this.gpuTotalVramGb,
required this.latencyMs,
required this.status,
});
}
class PayoutQueueItemModel {
final int id;
final String teacherName;
final String cliqAlias;
final double amountJod;
final String requestedAt;
final String status; // 'queued', 'approved', 'completed'
const PayoutQueueItemModel({
required this.id,
required this.teacherName,
required this.cliqAlias,
required this.amountJod,
required this.requestedAt,
required this.status,
});
}
class SecurityIntegrityAlertModel {
final String alertId;
final String title;
final String schoolName;
final String details;
final String severity; // 'critical', 'warning', 'info'
final String timeAgo;
const SecurityIntegrityAlertModel({
required this.alertId,
required this.title,
required this.schoolName,
required this.details,
required this.severity,
required this.timeAgo,
});
}
@@ -0,0 +1,130 @@
import 'dart:convert';
import 'package:http/http.dart' as http;
import '../../core/config/app_config.dart';
import '../models/super_admin_models.dart';
/**
* ==============================================================================
* SAQEL SOVEREIGN COMMAND - REPOSITORY LAYER
* ==============================================================================
*
* يتولى جلب المؤشرات من خوادم صَقِل الخلفية، ويوفر محاكاة سيادية عالية الدقة
* للعمل دون اتصال بالإنترنت في حال التواجد في بيئات مغلقة أو ميدانية.
*/
class SuperAdminRepository {
Future<MacroTelemetryModel> getMacroTelemetry() async {
try {
final res = await http.get(Uri.parse('${AppConfig.apiBaseUrl}/api/directorate/dashboard'))
.timeout(const Duration(seconds: 3));
if (res.statusCode == 200) {
final data = json.decode(utf8.decode(res.bodyBytes));
return MacroTelemetryModel.fromJson(data);
}
} catch (_) {}
// Sovereign High-Fidelity Snapshot
return const MacroTelemetryModel(
totalDirectorates: 2,
totalSchools: 43,
totalStudents: 19350,
totalTeachers: 812,
grossMarginPercent: 86.4,
treasuryBalanceJod: 54200.0,
totalCliqInflowJod: 18400.0,
pendingPayoutsCount: 4,
r2BandwidthCostSavingsJod: 4120.0,
uptimePercent: 99.99,
);
}
Future<List<AiClusterNodeModel>> getAiClusterNodes() async {
return const [
AiClusterNodeModel(
nodeName: 'عقدة 01 — عمان السيادية',
modelName: 'Qwen 2.5-VL-7B (AWQ 4-bit)',
role: 'فحص إيصالات كليك اللحظي والتعرف البصري على الخط العربي',
gpuVramUsageGb: 5.4,
gpuTotalVramGb: 24.0,
latencyMs: 140,
status: 'active_online',
),
AiClusterNodeModel(
nodeName: 'عقدة 02 — الحوسبة الثقيلة',
modelName: 'Qwen 2.5-VL-72B (FP8 quantized)',
role: 'تدقيق حصص الأستوديو 25 دقيقة واستخراج الوقفات السقراطية',
gpuVramUsageGb: 44.2,
gpuTotalVramGb: 80.0,
latencyMs: 620,
status: 'active_online',
),
AiClusterNodeModel(
nodeName: 'عقدة 03 — الاستدلال الرياضي',
modelName: 'DeepSeek-R1 (Distill 32B)',
role: 'حل خطوات مسائل فيزياء ورياضيات التوجيهي الوزاري',
gpuVramUsageGb: 19.8,
gpuTotalVramGb: 24.0,
latencyMs: 380,
status: 'active_online',
),
];
}
Future<List<PayoutQueueItemModel>> getPayoutQueue() async {
return [
const PayoutQueueItemModel(
id: 1,
teacherName: 'أ. أحمد المجالي',
cliqAlias: 'AHMAD@CLIQ',
amountJod: 240.0,
requestedAt: 'منذ 15 دقيقة',
status: 'queued',
),
const PayoutQueueItemModel(
id: 2,
teacherName: 'أ. خلدون بني هاني',
cliqAlias: 'KHALDOON@ARAB',
amountJod: 180.0,
requestedAt: 'منذ 35 دقيقة',
status: 'queued',
),
const PayoutQueueItemModel(
id: 3,
teacherName: 'أ. طارق الحنيطي',
cliqAlias: 'TARIQ@ETIHAD',
amountJod: 310.0,
requestedAt: 'منذ ساعة',
status: 'queued',
),
const PayoutQueueItemModel(
id: 4,
teacherName: 'أ. عمر الحباشنة',
cliqAlias: 'OMAR@HOUSING',
amountJod: 150.0,
requestedAt: 'منذ ساعتين',
status: 'queued',
),
];
}
Future<List<SecurityIntegrityAlertModel>> getSecurityAlerts() async {
return const [
SecurityIntegrityAlertModel(
alertId: 'SEC-01',
title: 'تشفير الأرقام الوطنية السيادي',
schoolName: 'مديرية الثقافة العسكرية (43 مدرسة)',
details: 'تم حماية 19,350 رقماً وطنياً بتشفير AES-256-GCM ومؤشر HMAC الأعمى دون أي تسريب.',
severity: 'info',
timeAgo: 'مستقر الآن',
),
SecurityIntegrityAlertModel(
alertId: 'SEC-02',
title: 'رصد شذوذ السرعة المستحيلة في الامتحان التجريبي',
schoolName: 'مدرسة البادية الشمالية الثانوية العسكرية',
details: 'إنهاء 18 طالباً لمسألة تفاضل في 14 ثانية — تم إرسال الإنذار للمشرف الميداني للتحقق.',
severity: 'critical',
timeAgo: 'منذ ساعتين',
),
];
}
}
@@ -0,0 +1,44 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../data/repositories/super_admin_repository.dart';
import 'super_admin_state.dart';
/**
* ==============================================================================
* SAQEL SOVEREIGN COMMAND - SUPER ADMIN CUBIT
* ==============================================================================
*
* إدارة حالة المؤشرات السيادية الكلية، والتحكم بالخوادم، ومفتاح الطوارئ (Kill-Switch).
*/
class SuperAdminCubit extends Cubit<SuperAdminState> {
final SuperAdminRepository repository;
SuperAdminCubit({required this.repository}) : super(SuperAdminInitial());
Future<void> loadDashboard() async {
emit(SuperAdminLoading());
try {
final telemetry = await repository.getMacroTelemetry();
final aiNodes = await repository.getAiClusterNodes();
final alerts = await repository.getSecurityAlerts();
emit(SuperAdminLoaded(
telemetry: telemetry,
aiNodes: aiNodes,
alerts: alerts,
isEmergencyKillSwitchActive: false,
));
} catch (e) {
emit(SuperAdminError('فشل تحميل لوحة القيادة السيادية: $e'));
}
}
void toggleEmergencyKillSwitch() {
if (state is SuperAdminLoaded) {
final cur = state as SuperAdminLoaded;
emit(cur.copyWith(
isEmergencyKillSwitchActive: !cur.isEmergencyKillSwitchActive,
));
}
}
}
@@ -0,0 +1,42 @@
import '../../data/models/super_admin_models.dart';
abstract class SuperAdminState {
const SuperAdminState();
}
class SuperAdminInitial extends SuperAdminState {}
class SuperAdminLoading extends SuperAdminState {}
class SuperAdminLoaded extends SuperAdminState {
final MacroTelemetryModel telemetry;
final List<AiClusterNodeModel> aiNodes;
final List<SecurityIntegrityAlertModel> alerts;
final bool isEmergencyKillSwitchActive;
const SuperAdminLoaded({
required this.telemetry,
required this.aiNodes,
required this.alerts,
this.isEmergencyKillSwitchActive = false,
});
SuperAdminLoaded copyWith({
MacroTelemetryModel? telemetry,
List<AiClusterNodeModel>? aiNodes,
List<SecurityIntegrityAlertModel>? alerts,
bool? isEmergencyKillSwitchActive,
}) {
return SuperAdminLoaded(
telemetry: telemetry ?? this.telemetry,
aiNodes: aiNodes ?? this.aiNodes,
alerts: alerts ?? this.alerts,
isEmergencyKillSwitchActive: isEmergencyKillSwitchActive ?? this.isEmergencyKillSwitchActive,
);
}
}
class SuperAdminError extends SuperAdminState {
final String message;
const SuperAdminError(this.message);
}
@@ -0,0 +1,110 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../data/models/super_admin_models.dart';
import '../../data/repositories/super_admin_repository.dart';
abstract class TreasuryState {
const TreasuryState();
}
class TreasuryInitial extends TreasuryState {}
class TreasuryLoading extends TreasuryState {}
class TreasuryLoaded extends TreasuryState {
final List<PayoutQueueItemModel> queue;
final double totalTreasuryBalanceJod;
final double totalApprovedTodayJod;
const TreasuryLoaded({
required this.queue,
required this.totalTreasuryBalanceJod,
required this.totalApprovedTodayJod,
});
TreasuryLoaded copyWith({
List<PayoutQueueItemModel>? queue,
double? totalTreasuryBalanceJod,
double? totalApprovedTodayJod,
}) {
return TreasuryLoaded(
queue: queue ?? this.queue,
totalTreasuryBalanceJod: totalTreasuryBalanceJod ?? this.totalTreasuryBalanceJod,
totalApprovedTodayJod: totalApprovedTodayJod ?? this.totalApprovedTodayJod,
);
}
}
class TreasuryCubit extends Cubit<TreasuryState> {
final SuperAdminRepository repository;
TreasuryCubit({required this.repository}) : super(TreasuryInitial());
Future<void> loadTreasury() async {
emit(TreasuryLoading());
try {
final queue = await repository.getPayoutQueue();
emit(TreasuryLoaded(
queue: queue,
totalTreasuryBalanceJod: 54200.0,
totalApprovedTodayJod: 0.0,
));
} catch (_) {
emit(const TreasuryLoaded(
queue: [],
totalTreasuryBalanceJod: 54200.0,
totalApprovedTodayJod: 0.0,
));
}
}
void approvePayout(int payoutId) {
if (state is TreasuryLoaded) {
final cur = state as TreasuryLoaded;
double approvedAmt = 0.0;
final updated = cur.queue.map((item) {
if (item.id == payoutId) {
approvedAmt = item.amountJod;
return PayoutQueueItemModel(
id: item.id,
teacherName: item.teacherName,
cliqAlias: item.cliqAlias,
amountJod: item.amountJod,
requestedAt: item.requestedAt,
status: 'completed',
);
}
return item;
}).toList();
emit(cur.copyWith(
queue: updated,
totalApprovedTodayJod: cur.totalApprovedTodayJod + approvedAmt,
));
}
}
void approveAllPayouts() {
if (state is TreasuryLoaded) {
final cur = state as TreasuryLoaded;
double sum = 0.0;
final updated = cur.queue.map((item) {
if (item.status == 'queued') sum += item.amountJod;
return PayoutQueueItemModel(
id: item.id,
teacherName: item.teacherName,
cliqAlias: item.cliqAlias,
amountJod: item.amountJod,
requestedAt: item.requestedAt,
status: 'completed',
);
}).toList();
emit(cur.copyWith(
queue: updated,
totalApprovedTodayJod: cur.totalApprovedTodayJod + sum,
));
}
}
}
+48
View File
@@ -0,0 +1,48 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'core/theme/super_admin_theme.dart';
import 'data/repositories/super_admin_repository.dart';
import 'logic/cubits/super_admin_cubit.dart';
import 'logic/cubits/treasury_cubit.dart';
import 'presentation/screens/super_admin_shell.dart';
/**
* ==============================================================================
* SAQEL SOVEREIGN COMMAND - SUPER ADMIN APP (APPLICATION ROOT)
* ==============================================================================
*
* تطبيق القيادة السيادية العليا المخصص للمؤسس والمهندس المعماري التقني
* (حمزة العائد / Hamza Ayed) لمتابعة وحوكمة المنظومة التعليمية الرقمية.
*/
void main() {
WidgetsFlutterBinding.ensureInitialized();
final repository = SuperAdminRepository();
runApp(SaqelSuperAdminApp(repository: repository));
}
class SaqelSuperAdminApp extends StatelessWidget {
final SuperAdminRepository repository;
const SaqelSuperAdminApp({super.key, required this.repository});
@override
Widget build(BuildContext context) {
return MultiBlocProvider(
providers: [
BlocProvider<SuperAdminCubit>(
create: (_) => SuperAdminCubit(repository: repository),
),
BlocProvider<TreasuryCubit>(
create: (_) => TreasuryCubit(repository: repository),
),
],
child: MaterialApp(
title: 'صاقل | القيادة السيادية العليا',
debugShowCheckedModeBanner: false,
theme: SuperAdminTheme.darkTheme,
home: const SuperAdminShell(),
),
);
}
}
@@ -0,0 +1,210 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../core/theme/super_admin_theme.dart';
import '../../logic/cubits/super_admin_cubit.dart';
import '../../logic/cubits/super_admin_state.dart';
import '../../logic/cubits/treasury_cubit.dart';
import 'tabs/macro_radar_tab.dart';
import 'tabs/ai_cluster_tab.dart';
import 'tabs/treasury_cliq_tab.dart';
import 'tabs/security_integrity_tab.dart';
/**
* ==============================================================================
* SAQEL SOVEREIGN COMMAND - SUPER ADMIN SHELL
* ==============================================================================
*
* الهيكل التنفيذي الرئيسي لتطبيق SuperAdmin الخاص بالمؤسس والمهندس المعماري التقني
* (حمزة العائد / Hamza Ayed) - يوفر تنقلاً سلساً وفورياً بين أركان القيادة الأربعة:
* 1. الرادار السيادي الكلي (مديريات، مدارس، اقتصاديات الوحدة، وهوامش الربح)
* 2. عنقود الذكاء الاصطناعي المحلي (استهلاك VRAM، نماذج Qwen و DeepSeek)
* 3. الخزينة وسحوبات كليك (الرصيد المركزي، الاعتماد الجماعي الفوري)
* 4. النزاهة السيبرانية والأكاديمية (AES-256-GCM، فحص الترفع، كشف الشذوذ، Kill-Switch)
*/
class SuperAdminShell extends StatefulWidget {
const SuperAdminShell({super.key});
@override
State<SuperAdminShell> createState() => _SuperAdminShellState();
}
class _SuperAdminShellState extends State<SuperAdminShell> {
int _currentIndex = 0;
@override
void initState() {
super.initState();
context.read<SuperAdminCubit>().loadDashboard();
context.read<TreasuryCubit>().loadTreasury();
}
@override
Widget build(BuildContext context) {
return Directionality(
textDirection: TextDirection.rtl,
child: Scaffold(
backgroundColor: SuperAdminTheme.backgroundDark,
appBar: AppBar(
backgroundColor: SuperAdminTheme.surfaceDark,
elevation: 0,
toolbarHeight: 74,
title: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Container(
padding: const EdgeInsets.all(6),
decoration: BoxDecoration(
color: SuperAdminTheme.royalGold.withOpacity(0.15),
shape: BoxShape.circle,
),
child: const Icon(CupertinoIcons.shield_lefthalf_fill, color: SuperAdminTheme.royalGold, size: 18),
),
const SizedBox(width: 8),
const Text(
'صاقل | القيادة السيادية العليا',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w900,
color: Colors.white,
letterSpacing: 0.3,
),
),
const Spacer(),
Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
decoration: BoxDecoration(
color: SuperAdminTheme.emeraldGreen.withOpacity(0.15),
borderRadius: BorderRadius.circular(12),
border: Border.all(color: SuperAdminTheme.emeraldGreen.withOpacity(0.3)),
),
child: const Row(
mainAxisSize: MainAxisSize.min,
children: [
CircleAvatar(radius: 3, backgroundColor: SuperAdminTheme.emeraldGreen),
SizedBox(width: 5),
Text('Sovereign Live', style: TextStyle(fontSize: 10, fontWeight: FontWeight.bold, color: SuperAdminTheme.emeraldGreen)),
],
),
),
],
),
const SizedBox(height: 3),
const Text(
'المؤسس والمهندس المعماري: حمزة العائد (Hamza Ayed)',
style: TextStyle(fontSize: 11.5, color: Colors.white60),
),
],
),
actions: [
IconButton(
icon: const Icon(CupertinoIcons.arrow_clockwise, color: SuperAdminTheme.cyberCyan, size: 20),
tooltip: 'تحديث المؤشرات السيادية',
onPressed: () {
context.read<SuperAdminCubit>().loadDashboard();
context.read<TreasuryCubit>().loadTreasury();
},
),
],
bottom: PreferredSize(
preferredSize: const Size.fromHeight(1),
child: Container(color: Colors.white.withOpacity(0.08), height: 1),
),
),
body: BlocBuilder<SuperAdminCubit, SuperAdminState>(
builder: (context, state) {
if (state is SuperAdminLoading) {
return const Center(
child: CupertinoActivityIndicator(color: SuperAdminTheme.cyberCyan, radius: 16),
);
}
if (state is SuperAdminError) {
return Center(
child: Padding(
padding: const EdgeInsets.all(24.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Icon(CupertinoIcons.exclamationmark_triangle, color: SuperAdminTheme.crimsonRed, size: 48),
const SizedBox(height: 16),
Text(
state.message,
textAlign: TextAlign.center,
style: const TextStyle(color: Colors.white70, fontSize: 13),
),
const SizedBox(height: 16),
CupertinoButton(
color: SuperAdminTheme.cyberCyan,
onPressed: () => context.read<SuperAdminCubit>().loadDashboard(),
child: const Text('إعادة المحاولة', style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold)),
),
],
),
),
);
}
if (state is SuperAdminLoaded) {
return IndexedStack(
index: _currentIndex,
children: [
MacroRadarTab(telemetry: state.telemetry),
AiClusterTab(nodes: state.aiNodes),
const TreasuryCliqTab(),
SecurityIntegrityTab(
alerts: state.alerts,
isKillSwitchActive: state.isEmergencyKillSwitchActive,
),
],
);
}
return const SizedBox.shrink();
},
),
bottomNavigationBar: Container(
decoration: BoxDecoration(
color: SuperAdminTheme.surfaceDark,
border: Border(top: BorderSide(color: Colors.white.withOpacity(0.08), width: 1)),
),
child: BottomNavigationBar(
currentIndex: _currentIndex,
backgroundColor: Colors.transparent,
elevation: 0,
selectedItemColor: SuperAdminTheme.royalGold,
unselectedItemColor: Colors.white38,
type: BottomNavigationBarType.fixed,
selectedFontSize: 11,
unselectedFontSize: 10,
onTap: (index) => setState(() => _currentIndex = index),
items: const [
BottomNavigationBarItem(
icon: Icon(CupertinoIcons.chart_bar_alt_fill),
activeIcon: Icon(CupertinoIcons.chart_bar_alt_fill, color: SuperAdminTheme.royalGold),
label: 'الرصد الكلي',
),
BottomNavigationBarItem(
icon: Icon(CupertinoIcons.cpu),
activeIcon: Icon(CupertinoIcons.cpu, color: SuperAdminTheme.royalGold),
label: 'الذكاء المحلي',
),
BottomNavigationBarItem(
icon: Icon(CupertinoIcons.money_dollar_circle_fill),
activeIcon: Icon(CupertinoIcons.money_dollar_circle_fill, color: SuperAdminTheme.royalGold),
label: 'الخزينة وكليك',
),
BottomNavigationBarItem(
icon: Icon(CupertinoIcons.shield_lefthalf_fill),
activeIcon: Icon(CupertinoIcons.shield_lefthalf_fill, color: SuperAdminTheme.royalGold),
label: 'النزاهة والأمان',
),
],
),
),
),
);
}
}
@@ -0,0 +1,284 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import '../../../core/theme/super_admin_theme.dart';
import '../../../data/models/super_admin_models.dart';
/**
* ==============================================================================
* SAQEL SOVEREIGN COMMAND - LOCAL AI & GPU CLUSTER TAB
* ==============================================================================
*
* رصد فوري لعناقيد الذكاء الاصطناعي السيادي المحلي:
* - نماذج Qwen 2.5-VL (تحليل ومراجعة كراسات الحصص والمحتوى المرئي)
* - نموذج DeepSeek-R1 (المحاكمة المنطقية والاستدلال التربوي والردود السقراطية)
* - قياس استهلاك الذاكرة الرسومية VRAM وزمن الاستجابة (Latency ms)
* - ضمان السيادة الرقمية التامة (Zero-Egress Sovereignty) بدون تسريب أي بيانات للخارج.
*/
class AiClusterTab extends StatelessWidget {
final List<AiClusterNodeModel> nodes;
const AiClusterTab({super.key, required this.nodes});
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// Sovereign AI Sovereignty Moat Card
Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
gradient: const LinearGradient(
colors: [Color(0xFF0F172A), Color(0xFF1E293B)],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: BorderRadius.circular(20),
border: Border.all(color: SuperAdminTheme.cyberCyan.withOpacity(0.4)),
boxShadow: [
BoxShadow(
color: SuperAdminTheme.cyberCyan.withOpacity(0.12),
blurRadius: 18,
offset: const Offset(0, 6),
)
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Row(
children: [
Icon(CupertinoIcons.cpu, color: SuperAdminTheme.cyberCyan, size: 22),
SizedBox(width: 8),
Text(
'عنقود الذكاء الاصطناعي السيادي (Local Inference)',
style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold, color: Colors.white),
),
],
),
Container(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4),
decoration: BoxDecoration(
color: SuperAdminTheme.emeraldGreen.withOpacity(0.2),
borderRadius: BorderRadius.circular(8),
),
child: const Text(
'100% Zero-Egress',
style: TextStyle(fontSize: 11, fontWeight: FontWeight.bold, color: SuperAdminTheme.emeraldGreen),
),
),
],
),
const SizedBox(height: 12),
const Text(
'يعمل هذا العنقود داخل البنية التحتية الوطنية المغلقة. يتم معالجة تسجيلات الحصص المدرسية وكراسات التقييم باستخدام نماذج Qwen 2.5-VL و DeepSeek-R1 دون خروج أي بايت إلى خوادم أجنبية.',
style: TextStyle(fontSize: 12.5, color: Colors.white70, height: 1.5),
),
const SizedBox(height: 16),
Row(
children: [
_buildQuickMetric('إجمالي العقد النشطة', '${nodes.length} عقد مخصصة', CupertinoIcons.layers_alt_fill),
const SizedBox(width: 12),
_buildQuickMetric('متوسط زمن الاستجابة', '120 ms', CupertinoIcons.bolt_fill),
],
),
],
),
),
const SizedBox(height: 20),
// Nodes List Section Title
const Row(
children: [
Icon(CupertinoIcons.circle_grid_hex_fill, color: SuperAdminTheme.royalGold, size: 18),
SizedBox(width: 8),
Text(
'حالة عقد المعالجة الرسومية (GPU Nodes Telemetry)',
style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold, color: Colors.white),
),
],
),
const SizedBox(height: 12),
// Render Nodes
...nodes.map((node) => _buildNodeCard(node)),
const SizedBox(height: 24),
// Inference Model Architecture Guide
Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: SuperAdminTheme.surfaceCard,
borderRadius: BorderRadius.circular(16),
border: Border.all(color: Colors.white10),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'توزيع مهام النماذج المتخصصة:',
style: TextStyle(fontSize: 13, fontWeight: FontWeight.bold, color: Colors.white),
),
const SizedBox(height: 10),
_buildModelArchitectureRow(
'Qwen 2.5-VL 7B / 72B',
'تحليل كراسات الطلاب، تدقيق فيديوهات الحصص (MIT 20-25 Min Limit)، واستخراج الرسوم التوضيحية.',
SuperAdminTheme.cyberCyan,
),
const Divider(color: Colors.white10, height: 20),
_buildModelArchitectureRow(
'DeepSeek-R1 (Distill / Dense)',
'الاستدلال الرياضي المتقدم، المحاكمة المنطقية، وبناء الحوارات السقراطية لغرف التساؤلات المدرسية.',
SuperAdminTheme.imperialPurple,
),
],
),
),
],
),
);
}
Widget _buildQuickMetric(String label, String value, IconData icon) {
return Expanded(
child: Container(
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: Colors.black.withOpacity(0.3),
borderRadius: BorderRadius.circular(12),
border: Border.all(color: Colors.white12),
),
child: Row(
children: [
Icon(icon, size: 18, color: SuperAdminTheme.cyberCyan),
const SizedBox(width: 8),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(label, style: const TextStyle(fontSize: 11, color: Colors.white54)),
const SizedBox(height: 2),
Text(value, style: const TextStyle(fontSize: 13, fontWeight: FontWeight.bold, color: Colors.white)),
],
),
],
),
),
);
}
Widget _buildNodeCard(AiClusterNodeModel node) {
final double vramPercentage = (node.gpuVramUsageGb / node.gpuTotalVramGb).clamp(0.0, 1.0);
final Color progressColor = vramPercentage > 0.85
? SuperAdminTheme.crimsonRed
: (vramPercentage > 0.65 ? SuperAdminTheme.royalGold : SuperAdminTheme.emeraldGreen);
return Container(
margin: const EdgeInsets.only(bottom: 12),
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: SuperAdminTheme.surfaceCard,
borderRadius: BorderRadius.circular(16),
border: Border.all(color: Colors.white12),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
Container(
width: 10,
height: 10,
decoration: BoxDecoration(
color: node.status == 'active_online' ? SuperAdminTheme.emeraldGreen : SuperAdminTheme.royalGold,
shape: BoxShape.circle,
boxShadow: [
BoxShadow(
color: (node.status == 'active_online' ? SuperAdminTheme.emeraldGreen : SuperAdminTheme.royalGold).withOpacity(0.6),
blurRadius: 6,
)
],
),
),
const SizedBox(width: 8),
Text(
node.nodeName,
style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: Colors.white),
),
],
),
Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 3),
decoration: BoxDecoration(
color: Colors.black45,
borderRadius: BorderRadius.circular(6),
border: Border.all(color: Colors.white12),
),
child: Text(
'${node.latencyMs} ms',
style: const TextStyle(fontSize: 11, fontWeight: FontWeight.w600, color: SuperAdminTheme.cyberCyan),
),
),
],
),
const SizedBox(height: 8),
Text(
'${node.modelName} • ${node.role}',
style: const TextStyle(fontSize: 12, color: Colors.white70),
),
const SizedBox(height: 12),
// VRAM Progress
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text('استهلاك VRAM للبطاقة الرسومية', style: TextStyle(fontSize: 11.5, color: Colors.white54)),
Text(
'${node.gpuVramUsageGb.toStringAsFixed(1)} GB / ${node.gpuTotalVramGb.toStringAsFixed(0)} GB (${(vramPercentage * 100).toStringAsFixed(0)}%)',
style: TextStyle(fontSize: 11.5, fontWeight: FontWeight.w600, color: progressColor),
),
],
),
const SizedBox(height: 6),
ClipRRect(
borderRadius: BorderRadius.circular(4),
child: LinearProgressIndicator(
value: vramPercentage,
minHeight: 6,
backgroundColor: Colors.white10,
valueColor: AlwaysStoppedAnimation<Color>(progressColor),
),
),
],
),
);
}
Widget _buildModelArchitectureRow(String model, String role, Color accentColor) {
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Icon(CupertinoIcons.checkmark_seal_fill, size: 16, color: accentColor),
const SizedBox(width: 8),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(model, style: TextStyle(fontSize: 12.5, fontWeight: FontWeight.bold, color: accentColor)),
const SizedBox(height: 2),
Text(role, style: const TextStyle(fontSize: 11.5, color: Colors.white60, height: 1.4)),
],
),
),
],
);
}
}
@@ -0,0 +1,228 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import '../../../core/theme/super_admin_theme.dart';
import '../../../data/models/super_admin_models.dart';
class MacroRadarTab extends StatelessWidget {
final MacroTelemetryModel telemetry;
const MacroRadarTab({super.key, required this.telemetry});
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// Unit Economics & Gross Margin Sovereign Moat Banner
Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
gradient: const LinearGradient(
colors: [Color(0xFF1E1B4B), Color(0xFF0F172A)],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: BorderRadius.circular(20),
border: Border.all(color: SuperAdminTheme.imperialPurple.withOpacity(0.5)),
boxShadow: [
BoxShadow(
color: SuperAdminTheme.imperialPurple.withOpacity(0.15),
blurRadius: 20,
offset: const Offset(0, 8),
)
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Row(
children: [
Icon(CupertinoIcons.sparkles, color: SuperAdminTheme.royalGold, size: 20),
SizedBox(width: 8),
Text(
'حماية هوامش الربح ووحدة الاقتصاد (Unit Economics)',
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w800, color: Colors.white),
),
],
),
Container(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4),
decoration: BoxDecoration(
color: SuperAdminTheme.emeraldGreen.withOpacity(0.2),
borderRadius: BorderRadius.circular(8),
),
child: Text(
'هامش ربح ${telemetry.grossMarginPercent}%',
style: const TextStyle(fontSize: 12.5, fontWeight: FontWeight.w900, color: SuperAdminTheme.emeraldGreen),
),
),
],
),
const SizedBox(height: 14),
const Text(
'وفر معمارية صَقِل السيادية مقارنة بالمنصات التقليدية:\n'
'• خفض تكلفة الخرائط والبث بمقدار 0.30 دولار لكل طالب.\n'
'• استبدال اشتراكات السحابة الأجنبية بالذكاء الاصطناعي المحلي (Qwen/DeepSeek).\n'
'• التخزين السيادي عبر كودك البث المشفر لتوفير آلاف الدنانير شهرياً.',
style: TextStyle(fontSize: 12.5, color: Color(0xFFCBD5E1), height: 1.5),
),
],
),
),
const SizedBox(height: 16),
// Core Metric Tiles (2x2 Grid)
Row(
children: [
Expanded(
child: _metricCard(
title: 'إجمالي المدارس',
value: '${telemetry.totalSchools} مدرسة',
subtitle: '43 ثقافة عسكرية + مجمعات خاصة',
icon: CupertinoIcons.building_2_fill,
color: SuperAdminTheme.cyberCyan,
),
),
const SizedBox(width: 12),
Expanded(
child: _metricCard(
title: 'الطلبة المسجلون',
value: '${telemetry.totalStudents}',
subtitle: '19,350 برقم وطني مشفر',
icon: CupertinoIcons.person_3_fill,
color: SuperAdminTheme.imperialPurple,
),
),
],
),
const SizedBox(height: 12),
Row(
children: [
Expanded(
child: _metricCard(
title: 'الكادر التعليمي',
value: '${telemetry.totalTeachers} معلماً',
subtitle: 'معتمدون ومصنفون بالجدارة',
icon: CupertinoIcons.star_circle_fill,
color: SuperAdminTheme.royalGold,
),
),
const SizedBox(width: 12),
Expanded(
child: _metricCard(
title: 'استقرار النظام',
value: '${telemetry.uptimePercent}%',
subtitle: 'خوادم سيادية بلا انقطاع',
icon: CupertinoIcons.checkmark_shield_fill,
color: SuperAdminTheme.emeraldGreen,
),
),
],
),
const SizedBox(height: 16),
// Directorate Matrix Overview
Container(
padding: const EdgeInsets.all(18),
decoration: BoxDecoration(
color: SuperAdminTheme.surfaceCard,
borderRadius: BorderRadius.circular(18),
border: Border.all(color: SuperAdminTheme.border),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'المظلات المركزية المعتمدة في المنظومة 🏛️',
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w800, color: Colors.white),
),
const SizedBox(height: 12),
_directorateRow(
name: 'مديرية التربية والتعليم والثقافة العسكرية',
schools: 43,
students: 19350,
badge: 'عقد مؤسسي سيادي',
color: SuperAdminTheme.emeraldGreen,
),
const Divider(color: SuperAdminTheme.border, height: 20),
_directorateRow(
name: 'مجمعات المدارس الخاصة المعتمدة (النمو السحابي)',
schools: 12,
students: 4200,
badge: 'سوق صَقِل المفتوح',
color: SuperAdminTheme.cyberCyan,
),
],
),
),
],
),
);
}
Widget _metricCard({
required String title,
required String value,
required String subtitle,
required IconData icon,
required Color color,
}) {
return Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: SuperAdminTheme.surfaceCard,
borderRadius: BorderRadius.circular(16),
border: Border.all(color: SuperAdminTheme.border),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Icon(icon, color: color, size: 24),
const SizedBox(height: 10),
Text(title, style: const TextStyle(fontSize: 12, color: Color(0xFF94A3B8))),
const SizedBox(height: 4),
Text(value, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.w900, color: Colors.white)),
const SizedBox(height: 2),
Text(subtitle, style: const TextStyle(fontSize: 10.5, color: Color(0xFF64748B))),
],
),
);
}
Widget _directorateRow({
required String name,
required int schools,
required int students,
required String badge,
required Color color,
}) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(name, style: const TextStyle(fontSize: 13, fontWeight: FontWeight.w700, color: Colors.white)),
const SizedBox(height: 3),
Text('$schools مدرسة · $students طالباً', style: const TextStyle(fontSize: 11, color: Color(0xFF94A3B8))),
],
),
),
Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
decoration: BoxDecoration(
color: color.withOpacity(0.15),
borderRadius: BorderRadius.circular(6),
),
child: Text(badge, style: TextStyle(fontSize: 11, fontWeight: FontWeight.w700, color: color)),
),
],
);
}
}
@@ -0,0 +1,257 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../core/theme/super_admin_theme.dart';
import '../../../data/models/super_admin_models.dart';
import '../../../logic/cubits/super_admin_cubit.dart';
/**
* ==============================================================================
* SAQEL SOVEREIGN COMMAND - CYBER & EXAM INTEGRITY TAB
* ==============================================================================
*
* رادار النزاهة الأكاديمية والأمن السيبراني السيادي:
* - تشفير الأرقام الوطنية AES-256-GCM وحماية السجلات من أي تسريب
* - مراقبة فحص الترفع الصفي والتحقق من صلاحيات الدخول المؤسسي
* - إنذارات فورية لمحاولات الغش وحل الاختبارات بسرعة مستحيلة فلكياً (Impossible Speed)
* - زر الإغلاق السيادي الطارئ (Emergency Sovereign Kill-Switch).
*/
class SecurityIntegrityTab extends StatelessWidget {
final List<SecurityIntegrityAlertModel> alerts;
final bool isKillSwitchActive;
const SecurityIntegrityTab({
super.key,
required this.alerts,
required this.isKillSwitchActive,
});
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// Emergency Kill-Switch Card
Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: isKillSwitchActive ? SuperAdminTheme.crimsonRed.withOpacity(0.2) : SuperAdminTheme.surfaceCard,
borderRadius: BorderRadius.circular(20),
border: Border.all(
color: isKillSwitchActive ? SuperAdminTheme.crimsonRed : Colors.white12,
width: 1.5,
),
),
child: Row(
children: [
Icon(
isKillSwitchActive ? CupertinoIcons.exclamationmark_octagon_fill : CupertinoIcons.shield_fill,
color: isKillSwitchActive ? SuperAdminTheme.crimsonRed : SuperAdminTheme.emeraldGreen,
size: 32,
),
const SizedBox(width: 14),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
isKillSwitchActive ? 'وضع العزل الطارئ نشط (Kill-Switch Active)' : 'منظومة الدفاع السيادية تعمل بنجاح',
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.bold,
color: isKillSwitchActive ? SuperAdminTheme.crimsonRed : Colors.white,
),
),
const SizedBox(height: 3),
Text(
isKillSwitchActive
? 'تم إيقاف استلام الطلبات الخارجية وتجميد جلسات الامتحانات احترازياً.'
: 'جميع جلسات الاختبارات مشفرة وتخضع لرقابة النزاهة اللحظية.',
style: const TextStyle(fontSize: 11.5, color: Colors.white60),
),
],
),
),
const SizedBox(width: 8),
CupertinoSwitch(
value: isKillSwitchActive,
activeColor: SuperAdminTheme.crimsonRed,
onChanged: (val) {
context.read<SuperAdminCubit>().toggleEmergencyKillSwitch();
},
),
],
),
),
const SizedBox(height: 20),
// Sovereign Encryption & Integrity Badges
Row(
children: [
_buildSecurityStatBadge(
'تشفير الأرقام الوطنية',
'AES-256-GCM',
'صفر تسريب بيانات',
SuperAdminTheme.cyberCyan,
CupertinoIcons.lock_shield_fill,
),
const SizedBox(width: 12),
_buildSecurityStatBadge(
'بوابة الحصص والصفوف',
'Grade-Gate 100%',
'فصل تام للصفوف 8 - 12',
SuperAdminTheme.emeraldGreen,
CupertinoIcons.checkmark_seal_fill,
),
],
),
const SizedBox(height: 24),
// Security Incidents Header
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Row(
children: [
Icon(CupertinoIcons.shield_slash_fill, color: SuperAdminTheme.royalGold, size: 18),
SizedBox(width: 8),
Text(
'إنذارات النزاهة السيادية اللحظية',
style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold, color: Colors.white),
),
],
),
Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 3),
decoration: BoxDecoration(
color: SuperAdminTheme.crimsonRed.withOpacity(0.15),
borderRadius: BorderRadius.circular(6),
),
child: Text(
'${alerts.length} إنذارات',
style: const TextStyle(fontSize: 11, fontWeight: FontWeight.bold, color: SuperAdminTheme.crimsonRed),
),
),
],
),
const SizedBox(height: 12),
// Alerts List
...alerts.map((alert) => _buildAlertCard(alert)),
const SizedBox(height: 20),
// Audit Log Integrity Explanation
Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: SuperAdminTheme.surfaceCard,
borderRadius: BorderRadius.circular(16),
border: Border.all(color: Colors.white10),
),
child: const Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Icon(CupertinoIcons.eye_solid, size: 16, color: SuperAdminTheme.cyberCyan),
SizedBox(width: 8),
Text(
'خوارزمية كشف الشذوذ الأكاديمي (Anomaly Detection):',
style: TextStyle(fontSize: 12.5, fontWeight: FontWeight.bold, color: Colors.white),
),
],
),
SizedBox(height: 8),
Text(
'تقوم المنظومة بمقارنة زمن حل الطالب لكل سؤال رياضي بالحد الأدنى المعرفي. إذا تم تقديم اختبار يحتوي 30 مسألة تفاضل في أقل من 12 ثانية، يُصنف الاختبار فوراً كـ Anomaly ويتم تجميد العلامة لتدقيق المعلم والمشرف.',
style: TextStyle(fontSize: 11.5, color: Colors.white60, height: 1.5),
),
],
),
),
],
),
);
}
Widget _buildSecurityStatBadge(String title, String value, String subtitle, Color color, IconData icon) {
return Expanded(
child: Container(
padding: const EdgeInsets.all(14),
decoration: BoxDecoration(
color: SuperAdminTheme.surfaceCard,
borderRadius: BorderRadius.circular(16),
border: Border.all(color: color.withOpacity(0.3)),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Icon(icon, color: color, size: 20),
const SizedBox(height: 10),
Text(value, style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: color)),
const SizedBox(height: 2),
Text(title, style: const TextStyle(fontSize: 11.5, fontWeight: FontWeight.w600, color: Colors.white)),
const SizedBox(height: 2),
Text(subtitle, style: const TextStyle(fontSize: 10, color: Colors.white54)),
],
),
),
);
}
Widget _buildAlertCard(SecurityIntegrityAlertModel alert) {
final bool isCritical = alert.severity == 'critical';
final Color alertColor = isCritical ? SuperAdminTheme.crimsonRed : SuperAdminTheme.royalGold;
return Container(
margin: const EdgeInsets.only(bottom: 10),
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: SuperAdminTheme.surfaceCard,
borderRadius: BorderRadius.circular(16),
border: Border.all(color: alertColor.withOpacity(0.35)),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
Icon(
isCritical ? CupertinoIcons.exclamationmark_triangle_fill : CupertinoIcons.bell_fill,
color: alertColor,
size: 16,
),
const SizedBox(width: 8),
Text(
alert.title,
style: const TextStyle(fontSize: 13.5, fontWeight: FontWeight.bold, color: Colors.white),
),
],
),
Text(
alert.timeAgo,
style: const TextStyle(fontSize: 11, color: Colors.white38),
),
],
),
const SizedBox(height: 6),
Text(
'الموقع / المدرسة: ${alert.schoolName}',
style: const TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: SuperAdminTheme.cyberCyan),
),
const SizedBox(height: 4),
Text(
alert.details,
style: const TextStyle(fontSize: 11.5, color: Colors.white70, height: 1.4),
),
],
),
);
}
}
@@ -0,0 +1,322 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../core/theme/super_admin_theme.dart';
import '../../../data/models/super_admin_models.dart';
import '../../../logic/cubits/treasury_cubit.dart';
/**
* ==============================================================================
* SAQEL SOVEREIGN COMMAND - TREASURY & CLIQ PAYOUT QUEUE TAB
* ==============================================================================
*
* إدارة الخزينة المركزية السيادية والموافقة الفورية على دفعات المعلمين عبر CliQ:
* - رصيد الخزينة الإجمالي (54,200 دينار أردني)
* - موافقة جماعية بنقرة واحدة (1-Click Mass Payout Approval)
* - معالجة فورية عبر نمط Siro-Engine بدون عمولات وسيطة (Zero-Intermediary Fee)
* - سجل تفصيلي لطلبات السحب المعلقة والمكتملة.
*/
class TreasuryCliqTab extends StatelessWidget {
const TreasuryCliqTab({super.key});
@override
Widget build(BuildContext context) {
return BlocBuilder<TreasuryCubit, TreasuryState>(
builder: (context, state) {
if (state is TreasuryLoading) {
return const Center(
child: CupertinoActivityIndicator(color: SuperAdminTheme.cyberCyan),
);
}
if (state is TreasuryLoaded) {
final pendingItems = state.queue.where((item) => item.status == 'queued').toList();
final completedItems = state.queue.where((item) => item.status == 'completed').toList();
final double pendingSum = pendingItems.fold(0.0, (acc, item) => acc + item.amountJod);
return SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// Sovereign Treasury Card
Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
gradient: const LinearGradient(
colors: [Color(0xFF064E3B), Color(0xFF0F172A)],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: BorderRadius.circular(20),
border: Border.all(color: SuperAdminTheme.emeraldGreen.withOpacity(0.5)),
boxShadow: [
BoxShadow(
color: SuperAdminTheme.emeraldGreen.withOpacity(0.18),
blurRadius: 20,
offset: const Offset(0, 8),
)
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Row(
children: [
Icon(CupertinoIcons.money_dollar_circle_fill, color: SuperAdminTheme.emeraldGreen, size: 22),
SizedBox(width: 8),
Text(
'الخزينة السيادية المركزية (Sovereign Treasury)',
style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: Colors.white),
),
],
),
Container(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4),
decoration: BoxDecoration(
color: Colors.black38,
borderRadius: BorderRadius.circular(8),
),
child: const Text(
'CliQ Direct Rail',
style: TextStyle(fontSize: 11, fontWeight: FontWeight.bold, color: SuperAdminTheme.emeraldGreen),
),
),
],
),
const SizedBox(height: 16),
Text(
'${state.totalTreasuryBalanceJod.toStringAsFixed(2)} د.أ',
style: const TextStyle(
fontSize: 32,
fontWeight: FontWeight.w900,
color: Colors.white,
letterSpacing: 0.5,
),
),
const SizedBox(height: 6),
const Text(
'صافي السيولة النقدية المودعة والمحمية في الحساب المصرفي المركزي الموحد.',
style: TextStyle(fontSize: 12, color: Colors.white70),
),
const SizedBox(height: 16),
Row(
children: [
_buildStatBadge('المعلق للسحب', '${pendingSum.toStringAsFixed(2)} د.أ', SuperAdminTheme.royalGold),
const SizedBox(width: 10),
_buildStatBadge('المصروف اليوم', '${state.totalApprovedTodayJod.toStringAsFixed(2)} د.أ', SuperAdminTheme.cyberCyan),
],
),
],
),
),
const SizedBox(height: 20),
// 1-Click Mass Approval Action
if (pendingItems.isNotEmpty)
Container(
margin: const EdgeInsets.only(bottom: 20),
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: SuperAdminTheme.surfaceCard,
borderRadius: BorderRadius.circular(16),
border: Border.all(color: SuperAdminTheme.royalGold.withOpacity(0.4)),
),
child: Row(
children: [
const Icon(CupertinoIcons.checkmark_shield_fill, color: SuperAdminTheme.royalGold, size: 26),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'يوجد ${pendingItems.length} طلبات سحب معلقة بقيمة ${pendingSum.toStringAsFixed(2)} د.أ',
style: const TextStyle(fontSize: 13, fontWeight: FontWeight.bold, color: Colors.white),
),
const SizedBox(height: 2),
const Text(
'يمكنك اعتماد وإرسال التحويلات فورياً عبر شبكة كليك المركزية.',
style: TextStyle(fontSize: 11.5, color: Colors.white60),
),
],
),
),
const SizedBox(width: 10),
CupertinoButton(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10),
color: SuperAdminTheme.royalGold,
borderRadius: BorderRadius.circular(10),
onPressed: () {
context.read<TreasuryCubit>().approveAllPayouts();
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('تم اعتماد وصرف جميع مستحقات المعلمين بنجاح عبر شبكة CliQ!'),
backgroundColor: SuperAdminTheme.emeraldGreen,
),
);
},
child: const Text(
'اعتماد الكل',
style: TextStyle(fontSize: 12.5, fontWeight: FontWeight.bold, color: Colors.black),
),
),
],
),
),
// Payout Queue Section Header
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Row(
children: [
Icon(CupertinoIcons.arrow_right_arrow_left, color: SuperAdminTheme.cyberCyan, size: 18),
SizedBox(width: 8),
Text(
'طابور سحوبات المعلمين (Payout Queue)',
style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold, color: Colors.white),
),
],
),
Text(
'${state.queue.length} عمليات',
style: const TextStyle(fontSize: 12, color: Colors.white54),
),
],
),
const SizedBox(height: 12),
// List Items
...state.queue.map((item) => _buildPayoutCard(context, item)),
if (state.queue.isEmpty)
Container(
padding: const EdgeInsets.all(28),
alignment: Alignment.center,
child: const Text(
'لا توجد طلبات سحب حالياً في الطابور.',
style: TextStyle(color: Colors.white38, fontSize: 13),
),
),
],
),
);
}
return const SizedBox.shrink();
},
);
}
Widget _buildStatBadge(String label, String value, Color color) {
return Expanded(
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10),
decoration: BoxDecoration(
color: Colors.black.withOpacity(0.35),
borderRadius: BorderRadius.circular(12),
border: Border.all(color: Colors.white12),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(label, style: const TextStyle(fontSize: 11, color: Colors.white54)),
const SizedBox(height: 2),
Text(value, style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: color)),
],
),
),
);
}
Widget _buildPayoutCard(BuildContext context, PayoutQueueItemModel item) {
final bool isQueued = item.status == 'queued';
return Container(
margin: const EdgeInsets.only(bottom: 10),
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: SuperAdminTheme.surfaceCard,
borderRadius: BorderRadius.circular(16),
border: Border.all(
color: isQueued ? SuperAdminTheme.royalGold.withOpacity(0.3) : Colors.white10,
),
),
child: Row(
children: [
CircleAvatar(
backgroundColor: isQueued ? SuperAdminTheme.royalGold.withOpacity(0.15) : SuperAdminTheme.emeraldGreen.withOpacity(0.15),
child: Icon(
isQueued ? CupertinoIcons.clock_fill : CupertinoIcons.checkmark_alt,
color: isQueued ? SuperAdminTheme.royalGold : SuperAdminTheme.emeraldGreen,
size: 18,
),
),
const SizedBox(width: 14),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
item.teacherName,
style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: Colors.white),
),
const SizedBox(height: 2),
Text(
'اسم مستعار كليك: ${item.cliqAlias} • ${item.requestedAt}',
style: const TextStyle(fontSize: 11.5, color: Colors.white54),
),
],
),
),
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(
'${item.amountJod.toStringAsFixed(2)} د.أ',
style: const TextStyle(fontSize: 15, fontWeight: FontWeight.w800, color: Colors.white),
),
const SizedBox(height: 6),
if (isQueued)
CupertinoButton(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4),
color: SuperAdminTheme.emeraldGreen,
borderRadius: BorderRadius.circular(6),
minSize: 26,
onPressed: () {
context.read<TreasuryCubit>().approvePayout(item.id);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('تم اعتماد تحويل ${item.amountJod} د.أ إلى المعلم ${item.teacherName} عبر CliQ'),
backgroundColor: SuperAdminTheme.emeraldGreen,
),
);
},
child: const Text(
'اعتماد',
style: TextStyle(fontSize: 11, fontWeight: FontWeight.bold, color: Colors.black),
),
)
else
Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 2),
decoration: BoxDecoration(
color: SuperAdminTheme.emeraldGreen.withOpacity(0.15),
borderRadius: BorderRadius.circular(6),
),
child: const Text(
'مكتمل ومحوّل',
style: TextStyle(fontSize: 10, fontWeight: FontWeight.bold, color: SuperAdminTheme.emeraldGreen),
),
),
],
),
],
),
);
}
}
+634
View File
@@ -0,0 +1,634 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
args:
dependency: transitive
description:
name: args
sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04
url: "https://pub.dev"
source: hosted
version: "2.7.0"
async:
dependency: transitive
description:
name: async
sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37
url: "https://pub.dev"
source: hosted
version: "2.13.1"
bloc:
dependency: transitive
description:
name: bloc
sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e"
url: "https://pub.dev"
source: hosted
version: "8.1.4"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
characters:
dependency: transitive
description:
name: characters
sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b
url: "https://pub.dev"
source: hosted
version: "1.4.1"
clock:
dependency: transitive
description:
name: clock
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev"
source: hosted
version: "1.1.2"
code_assets:
dependency: transitive
description:
name: code_assets
sha256: bf394f466ba9205f1812a0433b392d6af280f155f56651eda7c18cc32ed493b8
url: "https://pub.dev"
source: hosted
version: "1.2.1"
collection:
dependency: transitive
description:
name: collection
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
url: "https://pub.dev"
source: hosted
version: "1.19.1"
crypto:
dependency: transitive
description:
name: crypto
sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf
url: "https://pub.dev"
source: hosted
version: "3.0.7"
cupertino_icons:
dependency: "direct main"
description:
name: cupertino_icons
sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd"
url: "https://pub.dev"
source: hosted
version: "1.0.9"
device_info_plus:
dependency: "direct main"
description:
name: device_info_plus
sha256: a7fd703482b391a87d60b6061d04dfdeab07826b96f9abd8f5ed98068acc0074
url: "https://pub.dev"
source: hosted
version: "10.1.2"
device_info_plus_platform_interface:
dependency: transitive
description:
name: device_info_plus_platform_interface
sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f
url: "https://pub.dev"
source: hosted
version: "7.0.3"
fake_async:
dependency: transitive
description:
name: fake_async
sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
url: "https://pub.dev"
source: hosted
version: "1.3.3"
ffi:
dependency: transitive
description:
name: ffi
sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45"
url: "https://pub.dev"
source: hosted
version: "2.2.0"
file:
dependency: transitive
description:
name: file
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
url: "https://pub.dev"
source: hosted
version: "7.0.1"
flutter:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_bloc:
dependency: "direct main"
description:
name: flutter_bloc
sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a
url: "https://pub.dev"
source: hosted
version: "8.1.6"
flutter_lints:
dependency: "direct dev"
description:
name: flutter_lints
sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1"
url: "https://pub.dev"
source: hosted
version: "3.0.2"
flutter_secure_storage:
dependency: "direct main"
description:
name: flutter_secure_storage
sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea"
url: "https://pub.dev"
source: hosted
version: "9.2.4"
flutter_secure_storage_linux:
dependency: transitive
description:
name: flutter_secure_storage_linux
sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688
url: "https://pub.dev"
source: hosted
version: "1.2.3"
flutter_secure_storage_macos:
dependency: transitive
description:
name: flutter_secure_storage_macos
sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247"
url: "https://pub.dev"
source: hosted
version: "3.1.3"
flutter_secure_storage_platform_interface:
dependency: transitive
description:
name: flutter_secure_storage_platform_interface
sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8
url: "https://pub.dev"
source: hosted
version: "1.1.2"
flutter_secure_storage_web:
dependency: transitive
description:
name: flutter_secure_storage_web
sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9
url: "https://pub.dev"
source: hosted
version: "1.2.1"
flutter_secure_storage_windows:
dependency: transitive
description:
name: flutter_secure_storage_windows
sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709
url: "https://pub.dev"
source: hosted
version: "3.1.2"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
google_fonts:
dependency: "direct main"
description:
name: google_fonts
sha256: ba03d03bcaa2f6cb7bd920e3b5027181db75ab524f8891c8bc3aa603885b8055
url: "https://pub.dev"
source: hosted
version: "6.3.3"
hooks:
dependency: transitive
description:
name: hooks
sha256: "9a62a50b50b769a737bc0a8ff381f333529df3ab746b2f6b02e83760231455ba"
url: "https://pub.dev"
source: hosted
version: "2.0.2"
http:
dependency: "direct main"
description:
name: http
sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412"
url: "https://pub.dev"
source: hosted
version: "1.6.0"
http_parser:
dependency: transitive
description:
name: http_parser
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
url: "https://pub.dev"
source: hosted
version: "4.1.2"
intl:
dependency: "direct main"
description:
name: intl
sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
url: "https://pub.dev"
source: hosted
version: "0.19.0"
jni:
dependency: transitive
description:
name: jni
sha256: f038e58b4dc2c9037f50e233175086337e0b305e356d28211bf55f21c504cbd3
url: "https://pub.dev"
source: hosted
version: "1.0.3"
jni_flutter:
dependency: transitive
description:
name: jni_flutter
sha256: b2310cdd4c18c65c081ab141a41efa94aa26c65431803703ece51996f174f351
url: "https://pub.dev"
source: hosted
version: "1.0.3"
jni_util:
dependency: transitive
description:
name: jni_util
sha256: "1ba86da04a5f2bf18fde2edb235587e70c5b0fc5bd4ba955f46b00942c3fc35f"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
js:
dependency: transitive
description:
name: js
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
url: "https://pub.dev"
source: hosted
version: "0.6.7"
leak_tracker:
dependency: transitive
description:
name: leak_tracker
sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
url: "https://pub.dev"
source: hosted
version: "11.0.2"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
url: "https://pub.dev"
source: hosted
version: "3.0.10"
leak_tracker_testing:
dependency: transitive
description:
name: leak_tracker_testing
sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
url: "https://pub.dev"
source: hosted
version: "3.0.2"
lints:
dependency: transitive
description:
name: lints
sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290
url: "https://pub.dev"
source: hosted
version: "3.0.0"
logging:
dependency: transitive
description:
name: logging
sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
url: "https://pub.dev"
source: hosted
version: "1.3.0"
matcher:
dependency: transitive
description:
name: matcher
sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6"
url: "https://pub.dev"
source: hosted
version: "0.12.18"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b"
url: "https://pub.dev"
source: hosted
version: "0.13.0"
meta:
dependency: transitive
description:
name: meta
sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
url: "https://pub.dev"
source: hosted
version: "1.17.0"
nested:
dependency: transitive
description:
name: nested
sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
objective_c:
dependency: transitive
description:
name: objective_c
sha256: b7fb95a6d9a4f009edd63dc5ac69f07420b23a16161c6dd8660290b59c602e8e
url: "https://pub.dev"
source: hosted
version: "9.5.0"
package_config:
dependency: transitive
description:
name: package_config
sha256: ffcf4cf3d6c0b74ac43708d9f56625506e8a68aa935abe9d267a7330f320eb5d
url: "https://pub.dev"
source: hosted
version: "3.0.0"
path:
dependency: transitive
description:
name: path
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
url: "https://pub.dev"
source: hosted
version: "1.9.1"
path_provider:
dependency: transitive
description:
name: path_provider
sha256: a7f4874f987173da295a61c181b8ee71dab59b332a486b391babf26a1b884825
url: "https://pub.dev"
source: hosted
version: "2.1.6"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd"
url: "https://pub.dev"
source: hosted
version: "2.3.1"
path_provider_foundation:
dependency: transitive
description:
name: path_provider_foundation
sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699"
url: "https://pub.dev"
source: hosted
version: "2.6.0"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
sha256: "58c2005f147315b11e9b4a7bc889cd5203e250cba8e3f012dae259b4972b5c16"
url: "https://pub.dev"
source: hosted
version: "2.2.2"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
sha256: "484838772624c3a4b94f1e44a3e19897fee738f2d5c4ce448443b0417f7c9dda"
url: "https://pub.dev"
source: hosted
version: "2.1.3"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
url: "https://pub.dev"
source: hosted
version: "2.3.0"
platform:
dependency: transitive
description:
name: platform
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
url: "https://pub.dev"
source: hosted
version: "3.1.6"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.dev"
source: hosted
version: "2.1.8"
provider:
dependency: transitive
description:
name: provider
sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272"
url: "https://pub.dev"
source: hosted
version: "6.1.5+1"
pub_semver:
dependency: transitive
description:
name: pub_semver
sha256: "261236774e8b1d69cfc6b9eabbc96c40f25e7a2d6b171f3385d4f65d5734fb24"
url: "https://pub.dev"
source: hosted
version: "2.2.1"
record_use:
dependency: transitive
description:
name: record_use
sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed"
url: "https://pub.dev"
source: hosted
version: "0.6.0"
shared_preferences:
dependency: "direct main"
description:
name: shared_preferences
sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf
url: "https://pub.dev"
source: hosted
version: "2.5.5"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53
url: "https://pub.dev"
source: hosted
version: "2.4.23"
shared_preferences_foundation:
dependency: transitive
description:
name: shared_preferences_foundation
sha256: "2ec3934efa51e46117f23031cc141b8fc878e8525b94ec1ea4f7f586cf1b47ea"
url: "https://pub.dev"
source: hosted
version: "2.5.7"
shared_preferences_linux:
dependency: transitive
description:
name: shared_preferences_linux
sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
shared_preferences_platform_interface:
dependency: transitive
description:
name: shared_preferences_platform_interface
sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9"
url: "https://pub.dev"
source: hosted
version: "2.4.2"
shared_preferences_web:
dependency: transitive
description:
name: shared_preferences_web
sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019
url: "https://pub.dev"
source: hosted
version: "2.4.3"
shared_preferences_windows:
dependency: transitive
description:
name: shared_preferences_windows
sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
source_span:
dependency: transitive
description:
name: source_span
sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab"
url: "https://pub.dev"
source: hosted
version: "1.10.2"
stack_trace:
dependency: transitive
description:
name: stack_trace
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
url: "https://pub.dev"
source: hosted
version: "1.12.1"
stream_channel:
dependency: transitive
description:
name: stream_channel
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
string_scanner:
dependency: transitive
description:
name: string_scanner
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
url: "https://pub.dev"
source: hosted
version: "1.4.1"
term_glyph:
dependency: transitive
description:
name: term_glyph
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
url: "https://pub.dev"
source: hosted
version: "1.2.2"
test_api:
dependency: transitive
description:
name: test_api
sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636"
url: "https://pub.dev"
source: hosted
version: "0.7.9"
typed_data:
dependency: transitive
description:
name: typed_data
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
url: "https://pub.dev"
source: hosted
version: "1.4.0"
vector_math:
dependency: transitive
description:
name: vector_math
sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
url: "https://pub.dev"
source: hosted
version: "2.2.0"
vm_service:
dependency: transitive
description:
name: vm_service
sha256: "5f37239c4851efcef929cea7824e76df7f2f0970aef85d66bbc430afa40e72f0"
url: "https://pub.dev"
source: hosted
version: "15.3.0"
web:
dependency: transitive
description:
name: web
sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
url: "https://pub.dev"
source: hosted
version: "1.1.1"
win32:
dependency: transitive
description:
name: win32
sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e
url: "https://pub.dev"
source: hosted
version: "5.15.0"
win32_registry:
dependency: transitive
description:
name: win32_registry
sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852"
url: "https://pub.dev"
source: hosted
version: "1.1.5"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
yaml:
dependency: transitive
description:
name: yaml
sha256: f67cdd8e07d3c6329146aaef1ba043542b3134c12489f553ca9a7435d1068aea
url: "https://pub.dev"
source: hosted
version: "3.1.4"
sdks:
dart: ">=3.11.0 <4.0.0"
flutter: ">=3.38.4"
+28
View File
@@ -0,0 +1,28 @@
name: super_admin_app
description: "Saqel Sovereign Command - تطبيق المدير الأعلى للمؤسس والمهندس المعماري"
publish_to: 'none'
version: 1.0.0+1
environment:
sdk: '>=3.0.0 <4.0.0'
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.8
flutter_bloc: ^8.1.3
flutter_secure_storage: ^9.2.2
shared_preferences: ^2.2.3
http: ^1.2.0
device_info_plus: ^10.1.0
google_fonts: ^6.2.1
intl: ^0.19.0
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^3.0.0
flutter:
uses-material-design: true