npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

mui-toolpad-extended-tuni

v3.1.0

Published

Extended Toolpad

Readme

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)

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:

# 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:
import { BrowserRouter } from 'react-router-dom';
import { ToolpadProvider } from 'mui-toolpad-extended-tuni';

function App() {
  return (
    <BrowserRouter>
      <ToolpadProvider>{/* Your application content */}</ToolpadProvider>
    </BrowserRouter>
  );
}
  1. Use the included stores and components:
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:

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:

import { ToolpadProvider, BrowserRouter } from 'mui-toolpad-extended-tuni';

function App() {
  return (
    <BrowserRouter>
      <ToolpadProvider>
        <YourComponents />
      </ToolpadProvider>
    </BrowserRouter>
  );
}

LoadingScreen

A customizable loading indicator with animations:

import { LoadingScreen } from 'mui-toolpad-extended-tuni';

function MyComponent() {
  return isLoading ? <LoadingScreen /> : <YourContent />;
}

Notifications

Built-in notification system using notistack:

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:

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:

import { CourseSelector } from '@mui-toolpad-extended-tuni/courses';

function MyComponent() {
  return <CourseSelector />;
}

CourseTools

Manages course-specific tools and LTI configuration:

import { CourseTools } from '@mui-toolpad-extended-tuni/courses';

function MyComponent() {
  return <CourseTools />;
}

LTI Login Configuration

For teachers to set up course authentication:

import { LtiLoginUrlForm } from '@mui-toolpad-extended-tuni/courses';

function MyComponent() {
  return <LtiLoginUrlForm />;
}

Error Handling Components

ErrorBoundary

Catches and handles React component errors:

import { ErrorBoundary } from 'mui-toolpad-extended-tuni';

function App() {
  return (
    <ErrorBoundary>
      <YourComponents />
    </ErrorBoundary>
  );
}

NullStateWarning

Detects and displays warnings for null states:

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

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)

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)

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

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

const {
  addNotificationData, // Add new notification
  removeNotificationData, // Remove notification
} = useNotificationStore();

Utility Functions

String Manipulation

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

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:

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:

// 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

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:

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

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.