Dot.QuartzPanel 1.2.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package Dot.QuartzPanel --version 1.2.0
                    
NuGet\Install-Package Dot.QuartzPanel -Version 1.2.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Dot.QuartzPanel" Version="1.2.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Dot.QuartzPanel" Version="1.2.0" />
                    
Directory.Packages.props
<PackageReference Include="Dot.QuartzPanel" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Dot.QuartzPanel --version 1.2.0
                    
#r "nuget: Dot.QuartzPanel, 1.2.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Dot.QuartzPanel@1.2.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Dot.QuartzPanel&version=1.2.0
                    
Install as a Cake Addin
#tool nuget:?package=Dot.QuartzPanel&version=1.2.0
                    
Install as a Cake Tool

<div align="center">

⚡ Dot.QuartzPanel

A powerful, plug-and-play Blazor admin panel for Quartz.NET

Real-time monitoring • Job management • Execution history • Modern UI

NuGet .NET License Quartz.NET MudBlazor

</div>


🌟 Features

✨ Real-time Dashboard

  • Live metrics with job execution statistics
  • Interactive charts showing 24-hour execution history (configurable time ranges: 1h, 3h, 6h, 12h, 24h)
  • Scheduler controls for Start/Standby/Shutdown operations
  • SignalR integration for instant updates without page refresh
  • Visual indicators for real-time data changes

🎯 Job Management

  • Comprehensive job browser with instant search
  • Detailed job inspection with metadata and configuration
  • Job operations: Pause, resume, trigger, and delete
  • Bulk operations for managing multiple jobs
  • Data map viewer to inspect job parameters

⏰ Trigger Management

  • View all triggers across your jobs in one place
  • All trigger types: Cron, Simple, DailyTimeInterval, CalendarInterval
  • Trigger operations: Pause/resume/delete with detail view
  • Next fire time predictions for scheduled jobs
  • Create new triggers via intuitive tabbed dialog

📆 Calendar Management

  • Holiday calendars to exclude dates from trigger firing
  • Create and manage calendars through the UI
  • Associate calendars with triggers

📊 Execution History

  • Complete audit trail of all job executions
  • Advanced filtering by job name, status, and time range
  • Error tracking with full stack traces for debugging
  • Performance metrics including execution duration
  • Instant search for quick lookups

🎨 Modern UI

  • Glassmorphic design with a contemporary aesthetic
  • Dark/Light mode toggle with preference persistence
  • Fully responsive layout for desktop and mobile
  • Smooth animations and micro-interactions
  • Loading skeletons for seamless perceived performance
  • Built with MudBlazor components

♿ Accessibility

  • ARIA labels on all interactive elements
  • Tooltips explaining button actions
  • Keyboard navigation support throughout
  • Screen reader compatible

⚡ Performance

  • Event throttling (100ms batching) for high-frequency updates
  • Debounced search (300ms) on all list pages
  • Exponential backoff for SignalR reconnection
  • Server-side filtering for efficient data handling

🚀 Quick Start

Installation

Install via NuGet Package Manager:

dotnet add package Dot.QuartzPanel

Or via Package Manager Console:

Install-Package Dot.QuartzPanel

Basic Setup

Add to your Program.cs:

using Dot.QuartzPanel;

var builder = WebApplication.CreateBuilder(args);

// 1️⃣ Configure Quartz.NET (your existing Quartz setup)
builder.Services.AddQuartz(q =>
{
    q.AddJob<SampleJob>(opts => opts
        .WithIdentity("SampleJob", "MyGroup")
        .StoreDurably());
    
    q.AddTrigger(opts => opts
        .ForJob("SampleJob", "MyGroup")
        .WithIdentity("SampleTrigger", "MyGroup")
        .WithCronSchedule("0 */5 * * * ?"));
});
builder.Services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);

// 2️⃣ Add Quartz Panel - That's it! ✨
builder.AddQuartzPanel();

var app = builder.Build();

// 3️⃣ Use Quartz Panel - One line! ✨
app.UseQuartzPanel();

app.Run();

That's only 2 lines of code to add a complete admin panel! 🎉

What's Included Automatically

When you call AddQuartzPanel() and UseQuartzPanel(), you get:

  • ✅ SignalR real-time updates
  • ✅ MudBlazor UI components
  • ✅ Job execution history tracking
  • ✅ Health check endpoint at /quartz/health
  • ✅ Stats API at /quartz/api/stats
  • ✅ Auto-registered job listener (no manual setup needed!)
  • ✅ Static files for panel assets

Access the Panel

Navigate to https://localhost:5000/quartz to access your Quartz admin panel! 🎉

Health Check Endpoint

The panel exposes a health check endpoint for monitoring:

curl https://localhost:5000/quartz/health

Returns:

{
  "status": "healthy",
  "scheduler": {
    "name": "QuartzScheduler",
    "instanceId": "NON_CLUSTERED",
    "isStarted": true,
    "isShutdown": false,
    "inStandbyMode": false,
    "state": "Running"
  },
  "timestamp": "2024-01-15T10:30:00Z"
}

⚙️ Configuration

Panel Options

Configure the panel when registering services:

builder.Services.AddQuartzPanel(options =>
{
    // Maximum number of execution history items to keep in memory
    options.MaxHistoryItems = 1000;
    
    // Enable or disable real-time updates via SignalR
    options.EnableRealTimeUpdates = true;
    
    // Auto-refresh interval in seconds (0 = disabled)
    // Note: Real-time updates via SignalR are preferred over polling
    options.AutoRefreshIntervalSeconds = 5;
    
    // Base path for panel routes (default: "/quartz")
    options.BasePath = "/quartz";
    
    // Enable dark mode by default
    options.DefaultDarkMode = false;
    
    // Custom panel title
    options.Title = "My Job Scheduler";
});

Custom Route

Customize the panel's URL path:

// Access panel at /jobs instead of /quartz
app.MapQuartzPanel("/jobs");

📦 Architecture

Components

  • Blazor Server: Server-side Blazor for rich, interactive UI
  • MudBlazor: Material Design component library for modern aesthetics
  • SignalR: Real-time bidirectional communication for live updates
  • Quartz.NET: Robust job scheduling framework

Data Flow

graph LR
    A[Quartz Scheduler] --> B[Job Listener]
    B --> C[History Store]
    C --> D[SignalR Hub]
    D --> E[Blazor Components]
    E --> F[User Interface]
    F --> G[Job Operations]
    G --> A

Storage

By default, execution history is stored in-memory with a configurable maximum size. For enterprise applications requiring persistent storage, implement a custom store:

public class DatabaseJobHistoryStore : IJobHistoryStore
{
    private readonly ApplicationDbContext _db;
    
    public DatabaseJobHistoryStore(ApplicationDbContext db)
    {
        _db = db;
    }
    
    public async Task AddExecutionAsync(JobExecutionRecord record)
    {
        _db.JobExecutions.Add(record);
        await _db.SaveChangesAsync();
    }
    
    public async Task<IEnumerable<JobExecutionRecord>> GetExecutionsAsync(int maxItems)
    {
        return await _db.JobExecutions
            .OrderByDescending(x => x.FiredTime)
            .Take(maxItems)
            .ToListAsync();
    }
    
    // Implement other interface methods...
}

// Register your custom implementation
builder.Services.AddSingleton<IJobHistoryStore, DatabaseJobHistoryStore>();

💡 Advanced Usage

Custom Jobs Integration

Create jobs that work seamlessly with the panel:

public class ReportGenerationJob : IJob
{
    private readonly ILogger<ReportGenerationJob> _logger;
    private readonly IReportService _reportService;
    
    public ReportGenerationJob(
        ILogger<ReportGenerationJob> logger, 
        IReportService reportService)
    {
        _logger = logger;
        _reportService = reportService;
    }
    
    public async Task Execute(IJobExecutionContext context)
    {
        _logger.LogInformation("Starting report generation...");
        
        var dataMap = context.JobDetail.JobDataMap;
        var reportType = dataMap.GetString("ReportType");
        
        await _reportService.GenerateAsync(reportType);
        
        _logger.LogInformation("Report generation completed!");
    }
}

Register with data map:

q.AddJob<ReportGenerationJob>(opts => opts
    .WithIdentity("MonthlyReport", "Reports")
    .UsingJobData("ReportType", "Monthly")
    .StoreDurably());

Cron Expression Examples

// Every minute
.WithCronSchedule("0 * * * * ?")

// Every 5 minutes
.WithCronSchedule("0 */5 * * * ?")

// Every day at 3:00 AM
.WithCronSchedule("0 0 3 * * ?")

// Every weekday at 9:00 AM
.WithCronSchedule("0 0 9 ? * MON-FRI")

// First day of every month at midnight
.WithCronSchedule("0 0 0 1 * ?")

🎯 Demo Project

Test drive the panel with the included demo:

git clone https://github.com/nathanmac/Dot.QuartzPanel.git
cd Dot.QuartzPanel/Dot.QuartzPanel.DemoApi
dotnet run

Then navigate to https://localhost:5001/quartz to explore the panel with sample jobs.

The demo includes:

  • ✅ Multiple sample jobs with different schedules
  • ✅ Real-time SignalR updates
  • ✅ Error simulation for testing error tracking
  • ✅ Various trigger types (Cron, Simple)

🔧 Troubleshooting

Jobs not appearing in the panel

Solution: Ensure jobs are marked as StoreDurably():

q.AddJob<MyJob>(opts => opts
    .WithIdentity("MyJob", "MyGroup")
    .StoreDurably());  // ← Important!

Execution history not showing

Solutions:

  1. The job listener is auto-registered by AddQuartzPanel() - make sure you're using the latest version
  2. Verify Quartz is configured with AddQuartzHostedService()
  3. Check that the scheduler is running (not in standby mode)

Real-time updates not working

Solutions:

  1. Ensure you're calling both AddQuartzPanel() and UseQuartzPanel()
  2. Check browser console for SignalR connection errors
  3. Verify WebSocket connections are not blocked by a proxy

Panel not accessible

Solutions:

  1. Check the URL path - default is /quartz
  2. Verify UseQuartzPanel() is called after UseRouting()
  3. Check the health endpoint: GET /quartz/health

Custom base path

// Configure custom path in options
builder.AddQuartzPanel(options => options.BasePath = "/admin/scheduler");

// Or override when mapping
app.UseQuartzPanel("/admin/scheduler");

📋 Requirements

  • .NET 10.0 or later
  • Quartz.NET 3.x (3.15.1+ recommended)
  • ASP.NET Core with Blazor Server support
  • Modern browser with WebSocket support for SignalR

🗺️ Roadmap

We're continuously improving Dot.QuartzPanel! Here's what's coming:

✅ Completed

  • 🆕 Interactive job creation dialog (with type discovery and data map)
  • 📅 Visual cron expression builder
  • 📁 Export history to CSV/JSON
  • ✏️ Job data map editor with validation
  • 📆 Calendar management (Holiday calendars)
  • ⏰ All trigger types (Cron, Simple, DailyTimeInterval, CalendarInterval)
  • 📋 Trigger detail page
  • 🌙 Dark mode persistence
  • 💀 Loading skeletons for all pages
  • 🔍 Debounced search with improved empty states
  • ⚠️ Confirmation dialogs for destructive actions
  • ♿ ARIA labels and accessibility improvements
  • ⚡ SignalR event throttling and exponential backoff
  • 🎯 Configurable panel title

🔜 Planned

  • 🔐 Built-in authentication & authorization
  • 🌐 Clustering and multi-scheduler support
  • 🔔 Alert notifications for job failures
  • 📊 Advanced analytics and reporting
  • 🎨 Theme customization options
  • 🌍 Internationalization (i18n)

Have a feature request? Open an issue!


🤝 Contributing

Contributions are welcome and appreciated! Whether it's:

  • 🐛 Bug reports
  • 💡 Feature suggestions
  • 📝 Documentation improvements
  • 🔧 Code contributions

Please feel free to:

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Submit a pull request

📄 License

This project is licensed under the MIT License - feel free to use it in your personal and commercial projects!

See the LICENSE file for details.


🙏 Credits

Built with ❤️ using these amazing technologies:


📞 Support


<div align="center">

⭐ If you find this project useful, please consider giving it a star! ⭐

Made by Nathan Wilcké

</div>

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.2.2 99 12/31/2025
1.2.1 177 12/24/2025
1.2.0 137 12/20/2025
1.1.0 152 12/14/2025
1.0.0 434 12/8/2025

v1.2.0: Added Telemetry & Insights page with advanced analytics, heatmaps, and percentile statistics. Enhanced D3.js timeline with interactive zoom/pan. Job Dependencies graph with search, SVG export, and real-time status indicators. Multi-cluster management support. Improved localization and theming options.