PHPackages                             yaroslawww/nova-thinkit - 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. [Framework](/categories/framework)
4. /
5. yaroslawww/nova-thinkit

Abandoned → [think.studio/nova-thinkit](/?search=think.studio%2Fnova-thinkit)Library[Framework](/categories/framework)

yaroslawww/nova-thinkit
=======================

Laravel Nova small kit for quicker development.

1.7.1(2y ago)0137MITPHPPHP ^8.1

Since Oct 15Pushed 2y ago1 watchersCompare

[ Source](https://github.com/dev-think-one/nova-thinkit)[ Packagist](https://packagist.org/packages/yaroslawww/nova-thinkit)[ Docs](https://github.com/dev-think-one/nova-thinkit)[ RSS](/packages/yaroslawww-nova-thinkit/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (9)Versions (21)Used By (0)

Laravel Nova think kit.
=======================

[](#laravel-nova-think-kit)

[![Packagist License](https://camo.githubusercontent.com/16e6784af09fadeb93b04f9e60e9ed3ee7844230322391b6f54efa4310240e47/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f7468696e6b2e73747564696f2f6e6f76612d7468696e6b69743f636f6c6f723d253233346463373166)](https://camo.githubusercontent.com/16e6784af09fadeb93b04f9e60e9ed3ee7844230322391b6f54efa4310240e47/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f7468696e6b2e73747564696f2f6e6f76612d7468696e6b69743f636f6c6f723d253233346463373166)[![Packagist Version](https://camo.githubusercontent.com/1452a51afb9daaac2fa83549ae00597a02915c8b4d09cd2aeedeccbb4efaa208/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f7468696e6b2e73747564696f2f6e6f76612d7468696e6b6974)](https://packagist.org/packages/think.studio/nova-thinkit)[![Total Downloads](https://camo.githubusercontent.com/59775cbfc54794aab785d6e135f82696fc03c77a871ea6f35a8e2703d80675c4/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f7468696e6b2e73747564696f2f6e6f76612d7468696e6b6974)](https://packagist.org/packages/think.studio/nova-thinkit)[![Build Status](https://camo.githubusercontent.com/b7bdb579db61f760585417539bec4a4e1426e20157d725734094de6be92dd416/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6465762d7468696e6b2d6f6e652f6e6f76612d7468696e6b69742f6261646765732f6275696c642e706e673f623d6d61696e)](https://scrutinizer-ci.com/g/dev-think-one/nova-thinkit/build-status/main)[![Code Coverage](https://camo.githubusercontent.com/cb4bf28c5233eaab67af64ac6cd5684e0664d58311c0591ea01bb6633a964c68/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6465762d7468696e6b2d6f6e652f6e6f76612d7468696e6b69742f6261646765732f636f7665726167652e706e673f623d6d61696e)](https://scrutinizer-ci.com/g/dev-think-one/nova-thinkit/?branch=main)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/b27a7bd47a4fb91f13a6066e50f2b20a99d965f52fdfa9e3d6db59dc0de7c542/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6465762d7468696e6b2d6f6e652f6e6f76612d7468696e6b69742f6261646765732f7175616c6974792d73636f72652e706e673f623d6d61696e)](https://scrutinizer-ci.com/g/dev-think-one/nova-thinkit/?branch=main)

Laravel Nova small kit for quicker development.

Installation
------------

[](#installation)

You can install the package via composer:

```
composer require think.studio/nova-thinkit

# optional publish configs
php artisan vendor:publish --provider="NovaThinKit\ServiceProvider" --tag="config"
# optional publish translations
php artisan vendor:publish --provider="NovaThinKit\ServiceProvider" --tag="lang"
```

Usage
-----

[](#usage)

### Actions

[](#actions)

#### Login to different guard

[](#login-to-different-guard)

```
public function actions(NovaRequest $request)
{
    return [
        (new \NovaThinKit\Nova\Actions\LoginToDifferentGuard(
            route('dashboard.overview'),
            'owners_web',
            __('Login to owner dashboard'),
            __('Are you sure you want to continue?'),
        ))
            // optional callback how to find correct user
            ->findIdUsing(fn (Contact $model) => Owner::query()->where('contact_id', $model->getKey())->first()?->getKey())
            // other default method actions...
            ->canRun(fn ($request, Contact $model) => $model->role === "owner"),
    ];
}
```

#### Send reset password notification

[](#send-reset-password-notification)

```
use NovaThinKit\Nova\Actions\LoginToDifferentGuard;

public function actions(NovaRequest $request)
{
    return [
    ( \NovaThinKit\Nova\Actions\SendResetPasswordEmail::make('contacts', __('Send reset password'), __('Are you sure you want to continue?')))
            // optional callback how to find correct user
            ->findIdUsing(fn (Contact $model) => Owner::query()->where('contact_id', $model->getKey())->first()?->getKey())
            // other default method actions...
            ->canRun(fn ($request, Contact $model) => $model->role === "owner"),
    ];
}
```

### Filters

[](#filters)

#### Dynamic Boolean filter

[](#dynamic-boolean-filter)

```
\NovaThinKit\Nova\Filters\DynamicBooleanFilter::make([
    'Active' => 'active',
    'Paused' => 'paused',
]  /* options */, 'status' /* column to filter */, 'Status'  /* title */),

// Useful with HumanReadable enums:
\NovaThinKit\Nova\Filters\DynamicBooleanFilter::make(array_flip(CompanyStatus::options()), 'status', 'Status'),
```

Use filter for relation. For example add filter to Author to filter Posts:

```
\NovaThinKit\Nova\Filters\DynamicBooleanFilter::make(array_flip(CompanyStatus::options()), 'status', 'Posts Status')->forRelation('posts'),
```

#### Empty or null filed filter

[](#empty-or-null-filed-filter)

```
\NovaThinKit\Nova\Filters\EmptyFieldFilter::make('post_title' /* column to filter */, 'Title'  /* title */),
```

Use filter for relation. For example add filter to Author to filter Posts:

```
\NovaThinKit\Nova\Filters\EmptyFieldFilter::make('posts.post_title', 'Posts Title'),
```

#### BelongsTo filter

[](#belongsto-filter)

Filter by related belongsTo relation.

```
use NovaThinKit\Nova\Filters\BelongsToFilter;

public function filters(NovaRequest $request)
{
    return [
        // type - this is belongsTo() relation method name
        new BelongsToFilter('type'),
        // or
        (new BelongsToFilter('type'))->setTitleKeyName('title'),
        // or
        (new BelongsToFilter('type'))->setFilterName('Filter by type'),
    ];
}
```

#### BelongsToMany filter

[](#belongstomany-filter)

Filter by related belongsToMany relation.

```
public function filters(NovaRequest $request)
{
    return [
       \NovaThinKit\Nova\Filters\BelongsToManyFilter::make('tags')
                ->setTitleKeyName('name' /* label key name */)
                ->setFilterName('By tag'),
    ];
}
```

### Metadata table

[](#metadata-table)

#### MetaFieldUpdater

[](#metafieldupdater)

If you have standalone table what contains meta values. You can use `MetaFieldUpdater`to quicker update these values from main resource:

```
public function fields(NovaRequest $request)
{
    $metaFieldUpdater = new \NovaThinKit\Nova\Helpers\MetaFieldUpdater(
        'metaData' /* hasMany relation method name */,
        'key' /* key name in neta table */,
        'value' /* data name in neta table */
    );

    return [
        $metaFieldUpdater->field(
            Select::make('University', 'university')->options(University::options())
        ),
        // ALso works with flexible
        $metaFieldUpdater->field(
            Flexible::make('Ethos list', 'cf-numeric_list_with_team')
                ->limit(20)
                ->useLayout(EthosItemLayout::class),
        ),
    ];
}
```

### Feature image functionality

[](#feature-image-functionality)

Add interface and trait to model

```
class Page extends Model implements \NovaThinKit\FeatureImage\Models\WithFeatureImage
{
    use \NovaThinKit\FeatureImage\Models\HasFeatureImage;

    // Optionally you can change default storage directory
    public function featureImageManagerDirectory(): string
    {
        return 'page/' . $this->getKey();
    }

    // Optionally you can change default image-manager
    protected function createFeatureImageManager(?string $tag = null): ImageManager
    {
    if (!$this->featureImageManager) {
            $this->featureImageManager = FeatureImageManager::fromConfig([
                'disk'                 => 'feature-images',
                'immutableExtensions' => [ '.svg', '.gif' ],
                'original'             => [
                    'methods' => [
                        'fit'      => [ \Spatie\Image\Manipulations::FIT_CROP, 2800, 1800 ],
                        'optimize' => [],
                    ],
                    'srcset'  => '2800w',
                ],
                'deletedFormats'       => [],
                'formats'              => [
                    'thumb' => [
                        'methods' => [
                            'fit'      => [ \Spatie\Image\Manipulations::FIT_CONTAIN, 450, 300 ],
                            'optimize' => [],
                        ],
                        'srcset'  => '450w',
                    ],
                ],
            ]);
        }

        if($tag === 'fooBar') {
            $this->featureImageManager->disk = 'baz';
        }

        return $this->featureImageManager;
    }
}
```

Add trait to resource

```
class Page extends Resource
{
    use \NovaThinKit\FeatureImage\Nova\HasFeatureImage;

    // ... other methods

    public function fields(NovaRequest $request)
    {
        return [
            // other fields
            $this->fieldFeatureImage(),
        ];
    }
}
```

### Page templates (Dynamic fields based on template field)

[](#page-templates-dynamic-fields-based-on-template-field)

Create template fields wrapper

```
namespace App\Nova\ResourceTemplates\Pages;

use NovaThinKit\Nova\Helpers\MetaFieldUpdater;
use NovaThinKit\Nova\ResourceTemplates\ResourceTemplate;

class HomePageTemplate extends ResourceTemplate
{
    public function fields(NovaRequest $request): array
    {
        $metaUpdater = new MetaFieldUpdater('meta', 'key', 'value');

        return [
            Text::make('Some Custom text', 'some_custom_text')
                ->hideWhenCreating()
                ->hideFromIndex()
                ->showOnPreview(),
            $metaUpdater->field(
                Text::make('Custom text', 'custom_text')
                    ->hideWhenCreating()
                    ->hideFromIndex()
                    ->showOnPreview(),
            ),
        ];
    }
}
```

Add mapping

```
class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        \NovaThinKit\Nova\ResourceTemplates\TemplateFinder::templatesMap(Page::class, [
            'home'           => HomePageTemplate::class,
            'contact'        => ContactPageTemplate::class,
        ]);
    }
}
```

Finally, update resource

```
class Page extends Resource
{
    use \NovaThinKit\Nova\ResourceTemplates\HasTemplate;

    public function fields(NovaRequest $request)
    {
        return [
            ID::make()->sortable(),

            ...$this->templateFields($request),
        ];
    }
}
```

Credits
-------

[](#credits)

- [![Think Studio](https://camo.githubusercontent.com/8e541bece07d503c85a126b5294865faa00e27371048772f566a0cce8c01fd3a/68747470733a2f2f7961726f736c617777772e6769746875622e696f2f696d616765732f73706f6e736f72732f7061636b616765732f6c6f676f2d7468696e6b2d73747564696f2e706e67)](https://think.studio/)

###  Health Score

28

—

LowBetter than 54% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity10

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity64

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

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 ~22 days

Total

20

Last Release

878d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/66f778dcd7a390dcb08d29ee36d431684877ace6b0f7c3d68f4384409f2b0fac?d=identicon)[yaroslawww](/maintainers/yaroslawww)

---

Top Contributors

[![yaroslawww](https://avatars.githubusercontent.com/u/23663794?v=4)](https://github.com/yaroslawww "yaroslawww (41 commits)")

---

Tags

laravelnovathink

###  Code Quality

TestsPHPUnit

Static AnalysisPsalm

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/yaroslawww-nova-thinkit/health.svg)

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

###  Alternatives

[laravel-lang/publisher

Localization publisher for your Laravel application

2167.7M24](/packages/laravel-lang-publisher)[laravel/nova-log-viewer

A Laravel Nova tool for viewing your application logs.

136301.3k1](/packages/laravel-nova-log-viewer)[laravel-lang/common

Easily connect the necessary language packs to the application

1463.1M22](/packages/laravel-lang-common)[kirschbaum-development/nova-inline-relationship

A Laravel Nova field for displaying relationship properties inline.

195359.8k](/packages/kirschbaum-development-nova-inline-relationship)[lupennat/nova-nested-many

Laravel Nova - Nested Many

1557.2k](/packages/lupennat-nova-nested-many)[sbine/route-viewer

A Laravel Nova tool to view your registered routes.

57215.9k](/packages/sbine-route-viewer)

PHPackages © 2026

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