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 🙏

© 2025 – Pkg Stats / Ryan Hefner

mui-toolpad-extended-tuni

v2.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 2.1.0

Recent Changes

  • 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

Breaking Changes

  • 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)
  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

npm install mui-toolpad-extended-tuni

Basic Usage

  1. Setup your application with LMSProvider and routing:
import { BrowserRouter } from 'react-router-dom';
import { LMSProvider } from 'mui-toolpad-extended-tuni';

function App() {
  return (
    <BrowserRouter>
      <LMSProvider>{/* Your application content */}</LMSProvider>
    </BrowserRouter>
  );
}
  1. Use the included stores and components:
import {
  useUserStore,
  useCourseStore,
  useNavigationStore,
} from 'mui-toolpad-extended-tuni';

function MyComponent() {
  const { user } = useUserStore();
  const { currentCourse } = useCourseStore();

  return (
    <div>
      <h1>Welcome, {user?.name}!</h1>
      <p>Current course: {currentCourse?.title}</p>
    </div>
  );
}

Core Components

LMSProvider

The main provider component that sets up the application context:

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

function App() {
  return (
    <BrowserRouter>
      <LMSProvider>
        <YourComponents />
      </LMSProvider>
    </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

CourseSelector

A component for listing and selecting courses:

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

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

CourseTools

Manages course-specific tools and LTI configuration:

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

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

LTI Login Configuration

For teachers to set up course authentication:

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

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

useUserStore

const {
  user, // Current user data
  getUser, // Fetch user data
  changeRole, // Switch user role
  logout, // Logout current user
} = useUserStore();

useCourseStore

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
  updateSection, // Update navigation section
  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 pre-configured Axios instance for API communications:

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

// Handles CSRF tokens and base URL automatically
const response = await axiosInstance.get('/api/endpoint');

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

Current Limitations

  1. Authentication:

    • LTI login URL must be configured per course
    • Only supports single active session
    • Development mode uses mock authentication
  2. Course Management:

    • 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
  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
  • Network requests must use the provided axios instance
  • Theme modifications should extend EduMLTheme
  • Components should handle null states appropriately

Support

For issues and feature requests, please use the GitHub issue tracker.