UNPKG

mui-toolpad-extended-tuni

Version:
570 lines (417 loc) 14.8 kB
<!-- @format --> # MUI Toolpad Extended Library (TUNI) A React library extending MUI Toolpad functionality with additional features for educational applications. This library provides components and tools for building interactive educational interfaces. ## Version 3.0.0 ### Recent Changes - **Modular Architecture**: Calendar, Courses, and Users are now optional extension packages - **Standalone Core**: Main package (`mui-toolpad-extended-tuni`) is fully functional without extensions - **Extension Packages**: Install only the microservices you need: - `@mui-toolpad-extended-tuni/calendar` - Calendar microservice - `@mui-toolpad-extended-tuni/courses` - Courses microservice - `@mui-toolpad-extended-tuni/users` - Users microservice - Enhanced course navigation structure with support for course instances - Improved MicroserviceRoutes component with better TypeScript support - Added new CourseInstanceSelector and CourseCodeLoader components - Updated navigation store with better course instance handling - Introduced new course filtering utilities - Improved sidebar footer with responsive design - Fixed axios configuration to use configured instance with baseURL - Fixed user.platformRoles undefined error with optional chaining ### Breaking Changes in v3.0.0 - **Renamed `LMSProvider` to `ToolpadProvider`**: Update all imports and usage from `LMSProvider` to `ToolpadProvider` - **Extension Packages**: Calendar, Courses, and Users are no longer included in the main package - **Optional Extensions**: These microservices must be installed separately if needed - **Peer Dependencies**: Extension packages require `mui-toolpad-extended-tuni` as a peer dependency - Navigation structure now requires course code and instance properties - MicroserviceRoutes configuration requires updated navigation builder function - Course data structure updated to include code and instance fields ### Breaking Changes in v2.1.0 - Navigation structure now requires course code and instance properties - MicroserviceRoutes configuration requires updated navigation builder function - Course data structure updated to include code and instance fields ## Breaking Changes in v2.0.0 1. Renamed `EduMLProvider` to `LMSProvider` (EduMLProvider is now deprecated) - **Note**: In v3.0.0, `LMSProvider` was renamed to `ToolpadProvider` 2. All routing components must now be imported from this package 3. State management is now centralized through the package ## Prerequisites This library requires the following peer dependencies: - React ≥18.0.0 - React DOM ≥18.0.0 - @mui/material ≥6.0.0 - @mui/icons-material ≥6.0.0 - @emotion/react ≥11.0.0 - @emotion/styled ≥11.0.0 ## Installation ### Core Package (Required) ```bash npm install mui-toolpad-extended-tuni ``` ### Optional Extension Packages The main package is fully functional standalone. Install extension packages only if you need their functionality: ```bash # Calendar microservice npm install @mui-toolpad-extended-tuni/calendar # Courses microservice npm install @mui-toolpad-extended-tuni/courses # Users microservice npm install @mui-toolpad-extended-tuni/users ``` **Note**: Extension packages require `mui-toolpad-extended-tuni` as a peer dependency and will automatically register themselves when imported. ## Basic Usage 1. Setup your application with `ToolpadProvider` and routing: ```tsx import { BrowserRouter } from 'react-router-dom'; import { ToolpadProvider } from 'mui-toolpad-extended-tuni'; function App() { return ( <BrowserRouter> <ToolpadProvider>{/* Your application content */}</ToolpadProvider> </BrowserRouter> ); } ``` 2. Use the included stores and components: ```tsx import { useNavigationStore, useNotificationStore, } from 'mui-toolpad-extended-tuni'; function MyComponent() { const { navigation } = useNavigationStore(); const { addNotificationData } = useNotificationStore(); return ( <div> <h1>Welcome!</h1> {/* Your content */} </div> ); } ``` ### Using Extension Packages If you've installed extension packages, import and use them as microservices: ```tsx import { ToolpadProvider, Microservices } from 'mui-toolpad-extended-tuni'; import { CourseMicroservice } from '@mui-toolpad-extended-tuni/courses'; import { UserMicroservice } from '@mui-toolpad-extended-tuni/users'; import { CalendarMicroservice } from '@mui-toolpad-extended-tuni/calendar'; function App() { return ( <BrowserRouter> <ToolpadProvider> <Microservices> {/* Optionally include extension microservices */} <CourseMicroservice> {/* Your course microservices */} </CourseMicroservice> <UserMicroservice /> <CalendarMicroservice /> </Microservices> </ToolpadProvider> </BrowserRouter> ); } ``` **Note**: Extension packages auto-register themselves when imported. You don't need to manually register them. ## Core Components ### ToolpadProvider The main provider component that sets up the application context: ```tsx import { ToolpadProvider, BrowserRouter } from 'mui-toolpad-extended-tuni'; function App() { return ( <BrowserRouter> <ToolpadProvider> <YourComponents /> </ToolpadProvider> </BrowserRouter> ); } ``` ### LoadingScreen A customizable loading indicator with animations: ```tsx import { LoadingScreen } from 'mui-toolpad-extended-tuni'; function MyComponent() { return isLoading ? <LoadingScreen /> : <YourContent />; } ``` ### Notifications Built-in notification system using notistack: ```tsx import { useNotificationStore } from 'mui-toolpad-extended-tuni'; function MyComponent() { const { addNotificationData } = useNotificationStore(); const showNotification = () => { addNotificationData({ type: 'success', message: 'Operation completed successfully', singular: true, // Optional: show only once }); }; } ``` ### ExtendedDialog A responsive dialog component: ```tsx import { ExtendedDialog } from 'mui-toolpad-extended-tuni'; function MyComponent() { const [open, setOpen] = useState(false); return ( <ExtendedDialog open={open} onClose={() => setOpen(false)}> <DialogContent>Your content here</DialogContent> </ExtendedDialog> ); } ``` ### Course Management Components **Note**: Course management components are available in the `@mui-toolpad-extended-tuni/courses` extension package. #### CourseSelector A component for listing and selecting courses: ```tsx import { CourseSelector } from '@mui-toolpad-extended-tuni/courses'; function MyComponent() { return <CourseSelector />; } ``` #### CourseTools Manages course-specific tools and LTI configuration: ```tsx import { CourseTools } from '@mui-toolpad-extended-tuni/courses'; function MyComponent() { return <CourseTools />; } ``` #### LTI Login Configuration For teachers to set up course authentication: ```tsx import { LtiLoginUrlForm } from '@mui-toolpad-extended-tuni/courses'; function MyComponent() { return <LtiLoginUrlForm />; } ``` ### Error Handling Components #### ErrorBoundary Catches and handles React component errors: ```tsx import { ErrorBoundary } from 'mui-toolpad-extended-tuni'; function App() { return ( <ErrorBoundary> <YourComponents /> </ErrorBoundary> ); } ``` #### NullStateWarning Detects and displays warnings for null states: ```tsx import { NullStateWarning } from 'mui-toolpad-extended-tuni'; function MyComponent() { const states = [{ user: currentUser }, { course: currentCourse }]; return ( <NullStateWarning states={states}> <YourContent /> </NullStateWarning> ); } ``` ## Development Tools When running in development mode (localhost), the library provides additional tools: - User Switcher: Easily switch between different user roles (student/teacher/guest) - Development Toolbar: Additional debugging and testing features ## Features - User authentication and management - Course handling and navigation - Notification system - Custom dialog management - Role-based navigation filtering - LTI integration support - Customizable theme ## Available Stores ### Core Stores (Main Package) The following stores are available in the main package: ### useNavigationStore ```tsx const { navigation, // Current navigation structure addSection, // Add a new section with optional header removeSection, // Remove a section and its header if last section addMicroserviceNavigation, // Add microservice navigation items setNavigation, // Set entire navigation } = useNavigationStore(); ``` ### Extension Package Stores **Note**: User and Course stores are available in their respective extension packages: #### useUserStore (`@mui-toolpad-extended-tuni/users`) ```tsx import { useUserStore } from '@mui-toolpad-extended-tuni/users'; const { user, // Current user data getUser, // Fetch user data changeRole, // Switch user role logout, // Logout current user } = useUserStore(); ``` #### useCourseStore (`@mui-toolpad-extended-tuni/courses`) ```tsx import { useCourseStore } from '@mui-toolpad-extended-tuni/courses'; const { currentCourse, // Current active course courses, // List of available courses getCourses, // Fetch all courses getCourseByUrl, // Get course by URL } = useCourseStore(); ``` ### useNavigationStore ```tsx const { navigation, // Current navigation structure addSection, // Add a new section with optional header removeSection, // Remove a section and its header if last section addMicroserviceNavigation, // Add microservice navigation items setNavigation, // Set entire navigation } = useNavigationStore(); ``` ### useNotificationStore ```tsx const { addNotificationData, // Add new notification removeNotificationData, // Remove notification } = useNotificationStore(); ``` ## Utility Functions ### String Manipulation ```tsx import { slugify, camelCaseToUnderscore, underscoreToCamelCase, } from 'mui-toolpad-extended-tuni'; // Convert strings to URL-friendly format const slug = slugify('My Course Title'); // 'my-course-title' // Convert between case styles const underscore = camelCaseToUnderscore('myVariable'); // 'my_variable' const camelCase = underscoreToCamelCase('my_variable'); // 'myVariable' ``` ### Object Key Conversion ```tsx import { convertObjectKeysToCamelCase, convertObjectKeysToUnderscore, } from 'mui-toolpad-extended-tuni'; // Convert API responses const camelCaseData = convertObjectKeysToCamelCase(apiResponse); const underscoreData = convertObjectKeysToUnderscore(requestData); ``` ## Network Configuration The library includes a pre-configured Axios instance for API communications: ```tsx import { axios } from 'mui-toolpad-extended-tuni'; // Handles CSRF tokens and base URL automatically const response = await axios.get('/api/endpoint'); ``` **Important**: Extension packages should use the configured axios instance from the main package to ensure consistent baseURL and CSRF token handling: ```tsx // In extension packages import { axios } from 'mui-toolpad-extended-tuni'; // This ensures correct API path resolution const response = await axios.get('api/users/current/'); ``` ## Course Types and Interfaces ```tsx interface Course { id: string; title: string; description: string; createdAt: string; ltiLoginUrl: string; updatedAt: string; } // Course creation payload interface CourseRaw { title: string; description: string; } ``` ## Theme Customization The library includes a customizable Material-UI theme: ```tsx import { EduMLTheme } from 'mui-toolpad-extended-tuni'; // Theme includes predefined: // - Color schemes (light/dark) // - Typography scales // - Component style overrides // - Transition effects // - Z-index hierarchy ``` **Note**: The theme is provided by the main package and is available to all extension packages automatically. ## Package Architecture ### Main Package (`mui-toolpad-extended-tuni`) The core package provides: - ToolpadProvider and routing infrastructure - Navigation system - Notification system - Dialog management - Theme customization - Utility functions - Configured axios instance - Common components and layouts ### Extension Packages Extension packages are optional microservices that can be installed separately: - **`@mui-toolpad-extended-tuni/calendar`**: Calendar functionality - **`@mui-toolpad-extended-tuni/courses`**: Course management, routing, and tools - **`@mui-toolpad-extended-tuni/users`**: User management and authentication Each extension: - Depends on `mui-toolpad-extended-tuni` as a peer dependency - Auto-registers itself when imported - Can be used independently or together - Uses the configured axios instance from the main package ## Current Limitations 1. **Authentication:** - LTI login URL must be configured per course (requires Courses extension) - Only supports single active session - Development mode uses mock authentication 2. **Course Management:** - Requires `@mui-toolpad-extended-tuni/courses` extension package - Limited to predefined course structure - No bulk operations support - Course tools must follow specific navigation structure 3. **State Management:** - No persistence between page reloads - Limited offline support - State updates are synchronous 4. **Network:** - Base URL is fixed to '/' - CSRF token handling is mandatory - No request caching implementation - Extension packages must use the configured axios instance 5. **Browser Support:** - Requires modern browser features - Limited mobile responsiveness - No IE11 support ## Types and Interfaces ### Common Types ```typescript type fetchState = 'idle' | 'loading' | 'error' | 'success'; interface NavigationStoreItem { kind: 'header' | 'page'; title: string; segment?: string; children?: NavigationStoreItem[]; } ``` ## License MIT License - See LICENSE file for details. ## Contributing When contributing, please note: - All components must implement error boundaries - State management should use Zustand stores with `createWithEqualityFn` from `zustand/traditional` - Network requests must use the configured axios instance from the main package (`import { axios } from 'mui-toolpad-extended-tuni'`) - Extension packages should depend on `mui-toolpad-extended-tuni` as a peer dependency - Extension packages should auto-register themselves when imported - Theme modifications should extend EduMLTheme - Components should handle null states appropriately - Use optional chaining for potentially undefined properties (e.g., `user?.platformRoles?.includes(...)`) ## Support For issues and feature requests, please use the GitHub issue tracker.