+
+
+
+ Multi-Jurisdiction Regulatory Decision Framework
-
+
Next-Generation Flight Disruption Orchestration
-
- Automate passenger segmentation, multi-jurisdiction regulatory compensation, goodwill
- policies, and live manifest recovery simulations in real time.
+
+ Automate passenger cohort segmentation, statutory compensation (EU261, US DOT, APPR, UK261),
+ goodwill policies, and live manifest recovery simulation in real time.
+ {/* Operational Feature Badges */}
+
+
+
+
+ Dynamic Policy Rule Engine
+
+
+
+
+
+ Real-Time Incident Recovery
+
+
+
+
+ {/* Metrics Row */}
- 99.98%
+ 99.98%
Uptime Reliability
- < 150ms
- Policy Engine Evaluation
+ < 150ms
+ Evaluation Latency
{/* Bottom Trust Footer */}
-
-
- {/* Header Mobile / Title */}
-
-
-
-
- Sign In to Terminal
-
-
- Enter your credentials to access operations management.
-
-
-
- {/* Quick Demo Fill Helper */}
-
-
-
-
- Super Admin Demo Credentials
- admin@aeroresolve.com
-
-
-
- Fill Credentials
-
-
-
- {/* Error Banner */}
- {error && (
-
- )}
-
- {/* Form */}
-
-
- {/* Security badge footer */}
-
-
- Encrypted with HTTP-Only Cookie Authentication
-
+
diff --git a/src/app/recoveryIncidents/tabs/index.tsx b/src/app/recoveryIncidents/tabs/index.tsx
index bd6e5ab..4322cc0 100644
--- a/src/app/recoveryIncidents/tabs/index.tsx
+++ b/src/app/recoveryIncidents/tabs/index.tsx
@@ -1,12 +1,11 @@
import { useState, useEffect } from 'react';
import { useParams, useNavigate } from 'react-router-dom';
-import { User, Checks, X, ClockCounterClockwiseIcon, ArrowLeftIcon, ArrowsClockwiseIcon, AirplaneTiltIcon } from '@phosphor-icons/react';
+import { User, Checks, X, ClockCounterClockwiseIcon, ArrowLeftIcon, ArrowsClockwiseIcon, AirplaneTiltIcon, SparkleIcon } from '@phosphor-icons/react';
import { CustomButton, CustomTabs, CustomBackButton, CustomStatus, Skeleton, CustomAlertBanner } from '../../../components/custom';
import SummaryTab from './SummaryTab';
import CaseDetailsTab from './CaseDetailsTab';
import RecoveryPlanTab from './RecoveryPlanTab';
import AuditTrailTab from './AuditTrailTab';
-import { SparkleIcon } from 'lucide-react';
import { getRecoveryIncident, updateIncidentStatus, reRunPolicyEngine } from '../RecoveryIncidentsApi';
import type { RecoveryIncident } from '../RecoveryIncidentsTypes';
@@ -254,7 +253,7 @@ export default function RecoveryIncidentTabs() {
{/* Sidebar Content */}
-
+
AI RECOMMENDATION
diff --git a/src/app/roles/components/AddRoles.tsx b/src/app/roles/components/AddRoles.tsx
index 3ce8ea6..52c5d1f 100644
--- a/src/app/roles/components/AddRoles.tsx
+++ b/src/app/roles/components/AddRoles.tsx
@@ -4,15 +4,15 @@ import {
CustomInput,
CustomButton,
CustomCheckBox,
+ CustomTextArea,
CustomAlertBanner,
+ CustomSuccessModal,
Skeleton,
} from '../../../components/custom';
import {
ShieldCheckIcon,
- LockKeyIcon,
ArrowLeftIcon,
- FloppyDiskIcon,
- SquaresFourIcon,
+ LockKeyIcon,
} from '@phosphor-icons/react';
interface AddRolesProps {
@@ -29,6 +29,8 @@ export default function AddRoles({ roleToEdit, onBack, onSaved }: AddRolesProps)
const [loading, setLoading] = useState(false);
const [fetching, setFetching] = useState(true);
const [error, setError] = useState
(null);
+ const [showSuccessModal, setShowSuccessModal] = useState(false);
+ const [successTitle, setSuccessTitle] = useState('');
const isSystemRole = roleToEdit?.isSystem ?? false;
@@ -103,8 +105,8 @@ export default function AddRoles({ roleToEdit, onBack, onSaved }: AddRolesProps)
setSelectedPermissionIds(new Set());
};
- const handleSubmit = async (e: React.FormEvent) => {
- e.preventDefault();
+ const handleSubmit = async (e?: React.FormEvent) => {
+ if (e) e.preventDefault();
if (!name.trim()) {
setError('Role name is required.');
return;
@@ -126,14 +128,16 @@ export default function AddRoles({ roleToEdit, onBack, onSaved }: AddRolesProps)
description: description.trim(),
permissionIds,
});
+ setSuccessTitle('Role Updated Successfully.');
} else {
await RolesApi.createRole({
name: name.trim(),
description: description.trim(),
permissionIds,
});
+ setSuccessTitle('Role Created Successfully.');
}
- onSaved();
+ setShowSuccessModal(true);
} catch (err: any) {
setError(err?.response?.data?.message || 'Failed to save role.');
} finally {
@@ -141,215 +145,312 @@ export default function AddRoles({ roleToEdit, onBack, onSaved }: AddRolesProps)
}
};
+ const CardHeader = ({ icon: Icon, title }: { icon: any; title: string }) => (
+
+ );
+
if (fetching) {
return (
-
-
-
-
+
+ {/* ─── Header Skeleton ────────────────────────────────────────────── */}
+
+
+ {/* ─── Body Content Skeleton ──────────────────────────────────────── */}
+
+
+ {/* Role Information Card Skeleton */}
+
+
+ {/* Permissions Matrix Card Skeleton */}
+
+
+
);
}
return (
-
- {/* Header bar */}
-
-
-
}
+
+ {/* ─── Header ────────────────────────────────────────────────────── */}
+
+
+
- Back
-
-
-
- {roleToEdit ? `Edit Role: ${roleToEdit.name}` : 'Create Custom Role'}
- {isSystemRole && (
-
- System Protected
-
- )}
-
-
- Configure role metadata and assign module-specific action permissions.
-
+
+
+
+
+ {roleToEdit ? (isSystemRole ? 'View System Role' : 'Edit Role') : 'Create Custom Role'}
+
+ Global Framework Registry
-
- {!isSystemRole && (
-
-
- Select All
-
-
- Deselect All
-
-
- )}
- {/* Error Alert */}
- {error && (
-
setError(null)}
- />
- )}
-
-