Files
edr-platform/apps/edr-passenger-web/backoffice
Stephanos A. 59d05b19cc Fix: Make Inter font loading resilient to network failures during build
Replace direct Inter font import with fallback to system fonts. This prevents the build from failing if fonts.googleapis.com is unreachable during Docker build.

The `fallback` parameter ensures that if the Google Font fails to load, the application will gracefully fall back to system fonts instead of failing the entire build process.
2026-06-02 23:11:56 +03:00
..

EDR Admin Portal (Backoffice)

Comprehensive admin portal for the Ethio-Djibouti Railway passenger management system. Built with Next.js 14, TypeScript, and Tailwind CSS with full dark mode support and EDR branding.

🚀 Enhanced Features

Complete Admin Module Coverage

  • Overview - Dashboard with KPIs, revenue trends, and real-time metrics
  • Operations - Bookings, Passengers, Tickets, Live Tracking, Agent Operations
  • Master Data - Stations, Routes, Fleet Management, Schedules, Seat Classes
  • Financial - Pricing & Fares, Payments, Wallet Management, Promotions
  • Customer Services - Loyalty Program, Support Center, Notifications, Food & Dining
  • Security & Compliance - Fraud Detection, Verifayda Integration, Audit Logs
  • Analytics & Reports - Comprehensive reporting and operational analytics
  • System - Settings and configuration management

UI/UX Enhancements

  • EDR Branding - Official blue, orange, and red color scheme
  • Dark Mode - Full dark mode support with theme persistence
  • Collapsible Sidebar - Space-efficient navigation with categorized sections
  • Responsive Design - Mobile-first approach with adaptive layouts
  • Loading States - Skeleton loaders and async action feedback
  • Interactive Components - Sortable tables, action buttons, modals

Technical Features

  • Real API Integration - Connected to all EDR passenger API endpoints
  • Functional CRUD Operations - Add, edit, delete with optimistic updates
  • Advanced Data Tables - Sorting, filtering, pagination, bulk actions
  • Form Validation - Client-side validation with error handling
  • State Management - Zustand for auth and theme state
  • Query Management - React Query for server state and caching
  • Type Safety - Full TypeScript coverage with EDR domain types

📋 Prerequisites

🛠️ Installation

1. Install Dependencies

From the monorepo root:

pnpm install

Or from the backoffice directory:

cd apps/edr-passenger-web/backoffice
pnpm install

2. Environment Configuration

Copy the environment template:

cp .env.example .env.local

Edit .env.local:

# API Configuration
NEXT_PUBLIC_API_URL=http://localhost:4000

# IAM Configuration (Corporate Authentication)
NEXT_PUBLIC_IAM_ENABLED=false
NEXT_PUBLIC_IAM_API_URL=https://iam.tria-plc.com/api

3. Start Development Server

From the backoffice directory:

pnpm dev

Or from the monorepo root:

pnpm --filter @edr/passenger-backoffice run dev

The admin portal will be available at: http://localhost:3001

🔑 Login Credentials

Use these demo credentials to access the admin portal:

Email Password Role
admin@edr-platform.com admin123 Admin

Note: This is a stub authentication flow. TODO: Integrate with real backend auth endpoint.

📁 Enhanced Project Structure

backoffice/
├── src/
│   ├── app/                      # Next.js App Router pages
│   │   ├── dashboard/            # Dashboard with KPIs
│   │   ├── bookings/             # Booking management
│   │   ├── passengers/           # Passenger management
│   │   ├── stations/             # Station master data
│   │   ├── routes/               # Route management
│   │   ├── fleet/                # Train & coach management
│   │   ├── schedules/            # Trip schedules
│   │   ├── seat-classes/         # Seat class configuration
│   │   ├── pricing/              # Fare rules & pricing
│   │   ├── payments/             # Payment management
│   │   ├── tickets/              # Ticket operations
│   │   ├── agents/               # Agent operations
│   │   ├── loyalty/              # Loyalty program
│   │   ├── wallet/               # Wallet management
│   │   ├── promotions/           # Promotion management
│   │   ├── support/              # Customer support
│   │   ├── notifications/        # Notification center
│   │   ├── fraud/                # Fraud detection
│   │   ├── verifayda/            # ID verification
│   │   ├── audit/                # Audit logs
│   │   ├── live/                 # Live tracking
│   │   ├── food/                 # Food & dining
│   │   ├── reports/              # Analytics & reports
│   │   ├── operational-reports/  # Operational reports
│   │   ├── settings/             # System settings
│   │   └── login/                # Authentication
│   ├── components/
│   │   ├── layout/               # Layout components
│   │   │   ├── Sidebar.tsx       # Collapsible navigation
│   │   │   └── Header.tsx        # Top header
│   │   ├── dashboard/            # Dashboard components
│   │   │   └── StatCard.tsx      # KPI cards
│   │   └── ui/                   # Enhanced UI components
│   │       ├── DataTable.tsx     # Advanced data table
│   │       ├── ActionButton.tsx  # Loading button
│   │       ├── Badge.tsx         # Status badges
│   │       ├── Modal.tsx         # Modal dialogs
│   │       └── Pagination.tsx    # Pagination
│   ├── lib/
│   │   ├── api/                  # Comprehensive API layer
│   │   │   ├── index.ts          # All EDR API services
│   │   │   ├── bookings.ts       # Booking operations
│   │   │   ├── passengers.ts     # Passenger operations
│   │   │   ├── routes.ts         # Route operations
│   │   │   └── dashboard.ts      # Dashboard data
│   │   ├── api-client.ts         # Axios client
│   │   ├── auth-store.ts         # Authentication state
│   │   ├── theme-store.ts        # Dark mode state
│   │   └── utils.ts              # Utility functions
│   ├── types/
│   │   ├── index.ts              # Main types
│   │   └── edr.ts                # EDR domain types
│   └── styles/
│       └── globals.css           # Enhanced styles with dark mode
├── .env.example                  # Environment template
├── .env.local                    # Local environment
├── next.config.js                # Next.js configuration
├── tailwind.config.js            # Enhanced Tailwind config
├── tsconfig.json                 # TypeScript configuration
└── package.json                  # Dependencies

🎨 EDR Design System

Color Palette

  • Primary Blue: #2563eb (EDR Blue)
  • Secondary Orange: #f97316 (EDR Orange)
  • Accent Red: #ef4444 (EDR Red)
  • Success: #10b981
  • Warning: #f59e0b
  • Danger: #ef4444

Components

Enhanced DataTable

<DataTable
  data={items}
  columns={[
    { key: 'name', label: 'Name', sortable: true },
    { key: 'status', label: 'Status', render: (item) => <Badge variant="status" status={item.status}>{item.status}</Badge> },
  ]}
  actions={[
    { label: 'Edit', onClick: handleEdit, variant: 'secondary', icon: Edit },
    { label: 'Delete', onClick: handleDelete, variant: 'danger', icon: Trash2 },
  ]}
  loading={isLoading}
/>

ActionButton with Loading

<ActionButton
  onClick={handleSubmit}
  variant="primary"
  icon={Plus}
  loading={mutation.isPending}
>
  Create Item
</ActionButton>

🔌 Complete API Integration

Available Services

  • stationsApi - Station CRUD operations
  • fleetApi - Train and coach management
  • schedulesApi - Trip schedule operations
  • seatsApi - Seat management and blocking
  • bookingsApi - Booking lifecycle management
  • passengersApi - Passenger operations
  • paymentsApi - Payment processing
  • ticketsApi - Ticket operations
  • agentsApi - Agent management
  • loyaltyApi - Loyalty program
  • walletApi - Wallet operations
  • promotionsApi - Promotion management
  • supportApi - Customer support
  • notificationsApi - Notification system
  • fraudApi - Fraud detection
  • verifaydaApi - ID verification
  • auditApi - Audit logging
  • liveApi - Live tracking
  • seatClassesApi - Seat class management
  • foodApi - Food & dining

Real Data Integration

All components use real API endpoints:

const { data, isLoading } = useQuery({
  queryKey: ['stations', filters],
  queryFn: () => stationsApi.getAll(filters),
});

const createMutation = useMutation({
  mutationFn: stationsApi.create,
  onSuccess: () => {
    queryClient.invalidateQueries({ queryKey: ['stations'] });
    setShowModal(false);
  },
});

🌙 Dark Mode Support

Full dark mode implementation with:

  • System preference detection
  • Manual toggle in sidebar
  • Persistent theme storage
  • Semantic color variables
  • Smooth transitions

📱 Responsive Design

  • Mobile-first approach
  • Collapsible sidebar on mobile
  • Adaptive table layouts
  • Touch-friendly interactions
  • Responsive grid systems

🔐 Enhanced Security

  • JWT token management
  • Automatic token refresh
  • Role-based access control
  • Audit trail logging
  • Fraud detection integration

🚀 Performance Optimizations

  • React Query caching
  • Optimistic updates
  • Lazy loading
  • Code splitting
  • Image optimization

📊 Advanced Features

Functional CRUD Operations

  • Create, Read, Update, Delete for all entities
  • Form validation and error handling
  • Optimistic UI updates
  • Bulk operations support

Data Management

  • Advanced filtering and search
  • Sortable columns
  • Pagination with page size options
  • Export functionality
  • Real-time updates

User Experience

  • Loading states and skeletons
  • Toast notifications
  • Confirmation dialogs
  • Keyboard shortcuts
  • Accessibility compliance

🎯 Available Scripts

# Development
pnpm dev              # Start dev server on port 3001

# Build
pnpm build            # Build for production

# Production
pnpm start            # Start production server

# Linting
pnpm lint             # Run ESLint

# Type Checking
pnpm type-check       # Run TypeScript compiler

🚀 Deployment

Build for Production

pnpm build

Start Production Server

pnpm start

Environment Variables for Production

Ensure these are set in production:

  • NEXT_PUBLIC_API_URL - Backend API URL
  • NEXT_PUBLIC_IAM_ENABLED - Enable IAM authentication
  • NEXT_PUBLIC_IAM_API_URL - Corporate IAM API URL

📝 Development Notes

Adding New Pages

  1. Create directory in src/app/
  2. Add page.tsx and layout.tsx
  3. Update sidebar navigation
  4. Create API service if needed
  5. Add types to src/types/edr.ts

API Integration

  1. Add service to src/lib/api/index.ts
  2. Create types in src/types/edr.ts
  3. Use React Query hooks in components
  4. Handle loading and error states

🔧 Customization

Theme Customization

Update tailwind.config.js for custom colors:

theme: {
  extend: {
    colors: {
      edr: {
        blue: { /* custom blue shades */ },
        orange: { /* custom orange shades */ },
        red: { /* custom red shades */ },
      },
    },
  },
}

Component Styling

Use semantic color classes:

<div className="bg-card text-card-foreground border-border">
  <h1 className="text-foreground">Title</h1>
  <p className="text-muted-foreground">Description</p>
</div>

📝 TODO

  • Integrate with real backend authentication endpoint
  • Implement IAM authentication for back-office users
  • Add real-time WebSocket connections for live updates
  • Implement advanced reporting with chart exports
  • Add bulk operations for data management
  • Implement advanced search with filters
  • Add keyboard shortcuts for power users
  • Implement role-based UI permissions
  • Add comprehensive error boundary handling
  • Implement offline support with service workers

🤝 Contributing

  1. Create a feature branch
  2. Follow the established patterns
  3. Add proper TypeScript types
  4. Test thoroughly
  5. Submit a pull request

📧 Support

For technical support or questions:


Built with ❤️ for Ethio-Djibouti Railway