Lewati ke isi

Frontend Stack

Teknologi dan arsitektur frontend Scola.

Last verified: 2026-03-16


Tech Stack

Layer Technology Version
Framework Vue 3 (Composition API) 3.x
Build Vite 5.x
Styling TailwindCSS 3.x
Icons Lucide Vue Next latest
State Management Pinia latest
Routing Vue Router 4.x
HTTP Client Axios latest
PWA Vite PWA Plugin latest
E2E Testing Playwright latest
Auth Firebase (FCM + Google SSO) latest

Project Structure

src/
├── api/              # Axios instances & API service modules
├── components/       # Reusable UI components
│   ├── ui/           # Base primitives (buttons, inputs, cards, modals)
│   ├── layout/       # Layout (NSidebar3, MobileBottomBar, AppHeader)
│   ├── dashboard/    # Dashboard widget components
│   └── shared/       # Cross-domain shared components
├── composables/      # Vue composables (useXxx pattern)
├── config/           # App configuration
│   ├── menuRegistry.js      # Menu structure per role
│   └── roleCapabilities.js  # Role → capability mapping
├── layouts/          # Page layout wrappers (AppLayout.vue)
├── router/           # Vue Router definitions
│   ├── index.js              # Router setup + guards
│   ├── adminRoutes.js        # Admin portal routes (~4500 lines)
│   ├── teacherRoutes.js      # Teacher routes (~500 lines)
│   ├── studentRoutes.js      # Student portal routes
│   ├── parentRoutes.js       # Parent portal routes
│   ├── counselingRoutes.js   # Counselor routes
│   ├── principalRoutes.js    # Principal routes
│   ├── foundationRoutes.js   # Foundation chairman routes
│   ├── vicePrincipalRoutes.js # Vice-principal routes
│   ├── librarianRoutes.js    # Librarian routes
│   ├── labTechnicianRoutes.js # Lab technician routes
│   └── spmbRoutes.js         # SPMB public routes
├── services/         # Business logic service layer
├── stores/           # Pinia stores
├── utils/            # Utility functions (roleUtils, formatters, etc.)
└── views/            # Page components organized by domain
    ├── AdminViews/
    ├── FacultyViews/
    ├── StudentViews/
    ├── ParentViews/
    ├── Principal/
    ├── Yayasan/
    ├── CounselingManagement/
    ├── LearningManagement/
    ├── ExamManagement/
    ├── ReportCardManagement/
    ├── AttendanceManagement/
    ├── AccountingManagement/
    ├── LibraryManagement/
    ├── ScheduleManagement/
    ├── AssignmentManagement/
    ├── AnalyticsManagement/
    ├── AdmissionManagement/
    ├── Communication/
    ├── Chat/
    ├── Calendar/
    ├── Laboran/
    └── BendaharaViews/

Key Architectural Patterns

Route Guards (Capability-Based)

// Route definition
{
  path: "/faculty/schedule",
  meta: {
    requiresAuth: true,
    capability: 'academics.schedule.view'  // Required capability
  }
}

// Guard checks:
// 1. User authenticated?
// 2. User has required capability? (from roleCapabilities.js)
// 3. User role in allowedRoles? (if specified)
// 4. Portal scope boundary check

Portal Scope Isolation

Each role group has its own portal scope to prevent cross-role access: - admin → admin portal - principal → principal portal - vice_principal → vice-principal portal - counseling → counselor portal - student → student portal (fail-closed for safety)

// menuRegistry.js defines menu structure
// roleCapabilities.js maps roles → capabilities
// At runtime: menu items filtered by user's capabilities

Environment Variables

Variable Description Default
VITE_API_URL Backend API URL (leave empty for same-origin proxy) empty
VITE_FIREBASE_* Firebase config keys per-environment
VITE_APP_ENV Environment identifier development