PHPackages                             mlsolutions/nova-dashboard - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Admin Panels](/categories/admin)
4. /
5. mlsolutions/nova-dashboard

ActiveLibrary[Admin Panels](/categories/admin)

mlsolutions/nova-dashboard
==========================

The missing dashboard for nova.

v1.1.1(1w ago)16.1k↓27.9%MITPHPPHP &gt;=8.1

Since Jun 17Pushed 1w agoCompare

[ Source](https://github.com/ml-solutions-ltda/nova-dashboard)[ Packagist](https://packagist.org/packages/mlsolutions/nova-dashboard)[ GitHub Sponsors](https://github.com/milewski)[ RSS](/packages/mlsolutions-nova-dashboard/feed)WikiDiscussions main Synced 3d ago

READMEChangelog (6)Dependencies (2)Versions (9)Used By (0)

Nova Dashboard
==============

[](#nova-dashboard)

[![Latest Version on Packagist](https://camo.githubusercontent.com/f3c8112ad79609fa6a3a45f9fdabb774cb38d37702bc46da3e3296e7ad432c86/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6d6c736f6c7574696f6e732f6e6f76612d64617368626f617264)](https://packagist.org/packages/mlsolutions/nova-dashboard)[![Total Downloads](https://camo.githubusercontent.com/d264bf691f2e6bccbdc5c288cc2537904ee5eab888d9527be49129076512e4cb/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6d6c736f6c7574696f6e732f6e6f76612d64617368626f617264)](https://packagist.org/packages/mlsolutions/nova-dashboard)[![License](https://camo.githubusercontent.com/a0cd8a5755c7e47e097fef3e8ce82177fb0d18e16d350dc5dec63d41738651db/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f6d6c736f6c7574696f6e732f6e6f76612d64617368626f617264)](https://github.com/ml-solutions-ltda/nova-dashboard/blob/main/LICENSE)

  ![Laravel Nova Dashboard In Action](https://raw.githubusercontent.com/ml-solutions-ltda/nova-dashboard/main/screenshots/light.png)The missing dashboard for Laravel Nova!

Installation
============

[](#installation)

You can install the package via composer:

```
composer require mlsolutions/nova-dashboard

```

List of current available widgets:
----------------------------------

[](#list-of-current-available-widgets)

- Value Widget:
- Table Widget:
- ChartJs Widget:
- [Add your widget here.](https://github.com/ml-solutions-ltda/nova-dashboard/edit/main/README.md)

Usage
-----

[](#usage)

The dashboard itself is simply a standard Laravel Nova card, so you can use it either as a card on any resource or within the default Nova dashboard functionality.

```
use App\Models\User;
use MlSolutions\NovaDashboard\Card\NovaDashboard;
use MlSolutions\NovaDashboard\Card\View;
use MlSolutions\NovaDashboard\Filters;
use Laravel\Nova\Dashboards\Main as Dashboard;

class Main extends Dashboard
{
    public function cards(): array
    {
        return [
            NovaDashboard::make()
                ->addView('Website Performance', function (View $view) {
                    return $view
                        ->icon('window')
                        ->addWidgets([
                            BounceRate::make(),
                            ConversionRate::make(),
                            WebsiteTraffic::make(),
                            SessionDuration::make(),
                        ])
                        ->addFilters([
                            LocationFilter::make(),
                            UserTypeFilter::make(),
                            DateRangeFilter::make(),
                        ])
                        ->download(
                            resolver: function ($request, View $view, string $format, Filters $filters) {
                                return $filters
                                    ->applyToQueryBuilder(User::query())
                                    ->select('name', 'email', 'created_at');
                            },
                            label: 'Download Report',
                            filename: 'website-performance',
                            formats: ['csv', 'excel'],
                        );
                }),
        ];
    }
}
```

#### Static

[](#static)

By default, each widget is draggable, and the user is able to rearrange it to their liking. This behavior can be disabled by calling `$view->static()`.

Widgets
-------

[](#widgets)

The widgets are responsible for displaying your data on your views; they are essentially standard Nova cards. However, they respond to dashboard events and reload their data whenever the filters change.

Once you have a widget, they are usually configured like this:

```
class MyCustomWidget extends ValueWidget
{
    /**
     * Here you can configure your widget by calling whatever options are available for each widget
     */
    public function configure(NovaRequest $request): void
    {
        $this->icon('...');
        $this->title('Session Duration');
        $this->textColor('#f95738');
        $this->backgroundColor('#f957384f');
    }

    /**
     * This function is responsible for returning the actual data that will be shown on the widget,
     * each widget expects its own format, so please refer to the widget documentation
     */
    public function value(Filters $filters): mixed
    {
        /**
         * $filters contain all the set values from the filters that were shown on the frontend.
         * You can retrieve them and implement any custom logic you may have.
         */
        $filterValue = $filters->getFilterValue(LikesFilter::class);

        return 'example';
    }
}
```

All widgets have common methods to configure their size and position. The value is not in pixels but in grid units, ranging from `1` to `12` (corresponding to 12 columns).

```
$widget->layout(width: 2, height: 1, x: 0, y: 1);
$widget->minWidth(2);
$widget->minHeight(1);
```

Filters
-------

[](#filters)

  ![Filters Preview](https://raw.githubusercontent.com/ml-solutions-ltda/nova-dashboard/main/screenshots/filter-light.png)These are standard nova filter classes with 1 simple difference, the method `->apply()` does not get called by default. Why?

```
use Illuminate\Http\Request;
use Laravel\Nova\Filters\BooleanFilter;

class ExampleFilter extends BooleanFilter
{
    public function apply(Request $request, $query, $value)
    {
        // this function is required however it is not used by the nova-dashboard
    }
}
```

Usually your widget `->value()` function will receive an instance of `MlSolutions\NovaDashboard\Filters` this class contains a method for retrieving the value of any given filter, for example:

```
class SessionDuration extends ValueWidget
{
    public function value(Filters $filters): mixed
    {
        $filterA = $filters->getFilterValue(YourFilterClass::class);
        $filterB = $filters->getFilterValue(YourSecondFilterClass::class);
    }
}
```

However, if you want to reuse the logic that you have previously set on your filters or share existing filters with the dashboard you can call the method `->applyToQueryBuilder()` to get the same behavior:

```
class SessionDuration extends ValueWidget
{
    public function value(Filters $filters): mixed
    {
        $result = $filters->applyToQueryBuilder(User::query())->get();
    }
}
```

`->applyToQueryBuilder()` will run every filter through the default filter logic of nova.

Downloads
---------

[](#downloads)

Views can expose a report download button that always uses the filters currently applied in the dashboard.

```
use App\Models\User;
use MlSolutions\NovaDashboard\Card\View;
use MlSolutions\NovaDashboard\Downloads\DownloadResult;
use MlSolutions\NovaDashboard\Filters;
use Laravel\Nova\Http\Requests\NovaRequest;

$view->download(
    resolver: function (Filters $filters, NovaRequest $request, View $view, string $format) {
        return $filters
            ->applyToQueryBuilder(User::query())
            ->select('name', 'email', 'created_at');
    },
    label: 'Download Users',
    filename: 'users-report',
    formats: ['csv', 'excel'],
);
```

The resolver receives the current dashboard filter state, not a prebuilt query result.

Available callback arguments:

- `NovaRequest $request`: the active Nova request.
- `View $view`: the current dashboard view.
- `string $format`: either `csv` or `excel`.
- `Filters $filters`: the same filter object used by widgets.
- `array $filterValues`: all current filters serialized as `class`, `name`, and `value`.

This matches how dashboards are commonly built in real projects such as `socialnexa-nova`: widgets read filter values and then assemble the query or service call that produces the final dataset.

Accepted resolver return types:

- `Eloquent\Builder` or `Query\Builder`: the package runs the query and exports the current result set.
- `Collection`, `array` or any iterable list of rows: columns are inferred automatically.
- `DownloadResult`: use it when you want full control over columns, row order or the exported filename.
- An array with `rows`, optional `columns`, and optional `filename`.

Example with custom column order:

```
$view->download(
    resolver: function (Filters $filters, NovaRequest $request, View $view, string $format) {
        $rows = $filters
            ->applyToQueryBuilder(User::query())
            ->get()
            ->map(fn (User $user) => [
                'Name' => $user->name,
                'Email' => $user->email,
                'Joined At' => $user->created_at?->toDateString(),
            ]);

        return DownloadResult::make(
            columns: ['Name', 'Email', 'Joined At'],
            rows: $rows,
            filename: 'filtered-users',
        );
    },
);
```

Example using the raw serialized filter values:

```
$view->download(
    resolver: function (array $filterValues) {
        $dateRange = data_get($filterValues, App\Nova\Filters\CreateAtDateFilter::class . '.value');

        // Build your own query/service call from the active filter values.
        return [];
    },
);
```

`excel` exports a native Excel-compatible `.xls` file, while `csv` exports UTF-8 CSV with BOM for spreadsheet compatibility.

⭐️ Show Your Support
--------------------

[](#️-show-your-support)

Please give a ⭐️ if this project helped you!

### Other Packages You Might Like

[](#other-packages-you-might-like)

- [Nova Dashboard](https://github.com/ml-solutions-ltda/nova-dashboard) - The missing dashboard for Laravel Nova!
- [Nova Welcome Card](https://github.com/ml-solutions-ltda/nova-welcome-card) - A configurable version of the `Help card` that comes with Nova.
- [Icon Action Toolbar](https://github.com/ml-solutions-ltda/icon-action-toolbar) - Replaces the default boring action menu with an inline row of icon-based actions.
- [Expandable Table Row](https://github.com/ml-solutions-ltda/expandable-table-row) - Provides an easy way to append extra data to each row of your resource tables.
- [Collapsible Resource Manager](https://github.com/ml-solutions-ltda/collapsible-resource-manager) - Provides an easy way to order and group your resources on the sidebar.
- [Resource Navigation Tab](https://github.com/ml-solutions-ltda/resource-navigation-tab) - Organize your resource fields into tabs.
- [Resource Navigation Link](https://github.com/ml-solutions-ltda/resource-navigation-link) - Create links to internal or external resources.
- [Nova Mega Filter](https://github.com/ml-solutions-ltda/nova-mega-filter) - Display all your filters in a card instead of a tiny dropdown!
- [Nova Pill Filter](https://github.com/ml-solutions-ltda/nova-pill-filter) - A Laravel Nova filter that renders into clickable pills.
- [Nova Slider Filter](https://github.com/ml-solutions-ltda/nova-slider-filter) - A Laravel Nova filter for picking range between a min/max value.
- [Nova Range Input Filter](https://github.com/ml-solutions-ltda/nova-range-input-filter) - A Laravel Nova range input filter.
- [Nova FilePond](https://github.com/ml-solutions-ltda/nova-filepond) - A Nova field for uploading File, Image and Video using Filepond.
- [Custom Relationship Field](https://github.com/ml-solutions-ltda/custom-relationship-field) - Emulate HasMany relationship without having a real relationship set between resources.
- [Column Toggler](https://github.com/ml-solutions-ltda/column-toggler) - A Laravel Nova package that allows you to hide/show columns in the index view.
- [Batch Edit Toolbar](https://github.com/ml-solutions-ltda/batch-edit-toolbar) - Allows you to update a single column of a resource all at once directly from the index page.

License
-------

[](#license)

The MIT License (MIT). Please see [License File](https://raw.githubusercontent.com/ml-solutions-ltda/nova-dashboard/main/LICENSE) for more information.

###  Health Score

49

—

FairBetter than 94% of packages

Maintenance98

Actively maintained with recent releases

Popularity25

Limited adoption so far

Community12

Small or concentrated contributor base

Maturity51

Maturing project, gaining track record

 Bus Factor2

2 contributors hold 50%+ of commits

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~53 days

Recently: every ~92 days

Total

8

Last Release

13d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/b895f8c44bd74d8ad19241803acb2f5763db593c608314de8ec07700e79796eb?d=identicon)[luissobrinho](/maintainers/luissobrinho)

---

Top Contributors

[![milewski](https://avatars.githubusercontent.com/u/2874967?v=4)](https://github.com/milewski "milewski (51 commits)")[![marispro](https://avatars.githubusercontent.com/u/5610414?v=4)](https://github.com/marispro "marispro (31 commits)")[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (10 commits)")[![luissobrinho](https://avatars.githubusercontent.com/u/17295212?v=4)](https://github.com/luissobrinho "luissobrinho (9 commits)")[![cord](https://avatars.githubusercontent.com/u/158588?v=4)](https://github.com/cord "cord (3 commits)")[![gbespyatykh](https://avatars.githubusercontent.com/u/5813183?v=4)](https://github.com/gbespyatykh "gbespyatykh (1 commits)")[![xoco70](https://avatars.githubusercontent.com/u/5855577?v=4)](https://github.com/xoco70 "xoco70 (1 commits)")

---

Tags

laraveldashboardwidgetsFlexiblenova

### Embed Badge

![Health badge](/badges/mlsolutions-nova-dashboard/health.svg)

```
[![Health](https://phpackages.com/badges/mlsolutions-nova-dashboard/health.svg)](https://phpackages.com/packages/mlsolutions-nova-dashboard)
```

###  Alternatives

[digital-creative/nova-dashboard

The missing dashboard for nova.

7171.8k1](/packages/digital-creative-nova-dashboard)[whitecube/nova-page

Static pages content management for Laravel Nova

23997.1k1](/packages/whitecube-nova-page)[jubeki/nova-card-linkable

A Linkeable Card for the Laravel Nova Dashboard.

19277.1k](/packages/jubeki-nova-card-linkable)[markwalet/nova-modal-response

A Laravel Nova asset for Modal responses on an action.

17878.9k](/packages/markwalet-nova-modal-response)[optimistdigital/nova-table-field

Table field for Laravel Nova

40132.7k](/packages/optimistdigital-nova-table-field)[outl1ne/nova-table-field

Table field for Laravel Nova

4070.5k](/packages/outl1ne-nova-table-field)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
