This Laravel Nova tool lets you run artisan and bash commands directly from Nova 4 or higher.

Overview

Laravel Nova tool for running Artisan & Shell commands.

This Nova tool lets you run artisan and bash commands directly from nova.

This is an extended version of the original package Nova Command Runner by guratr

New in version 4.0

  • Compatible with Nova 4.0
  • Drop compability with Nova 3
  • Dark mode compatibility
  • Responsive

Requirements

  • php: >=8.0
  • laravel/nova: ^4.0

Features

  • Run predefined artisan and shell commands
  • Run custom artisan and shell commands
  • Use variables while running commands
  • Prompt the user to specify optional flags while running commands
  • Use predefined values for variables using a select box or prompt the user to enter a value for the variable.
  • Keep track of command run history
  • No database changes required. Everything is managed from a single config file.
  • Queue long running commands

screenshot of the command runner tool

Installation

You can install the nova tool in to a Laravel app that uses Nova via composer:

composer require stepanenko3/nova-command-runner

Next up, you must register the tool with Nova. This is typically done in the tools method of the NovaServiceProvider.

// in app/Providers/NovaServiceProvder.php

// ...

public function tools()
{
    return [
        // ...
        new \Stepanenko3\NovaCommandRunner\CommandRunner,
    ];
}

Publish the config file:

php artisan vendor:publish --provider="Stepanenko3\NovaCommandRunner\ToolServiceProvider"

Add your commands to config/nova-command-runner.php

Usage

Click on the "Command Runner" menu item in your Nova app to see the tool.

Configuration

All the configuration is managed from a single configuration file located in config/nova-command-runner.php

Adding Commands

All the commands which needs to be easily accessible should be defined in the commands array in the configuration file.

Command Options

  • run : command to run (E.g. route:cache)
  • type : button class (primary, secondary, success, danger, warning, info, light, dark, link)
  • group: Group name (optional)
  • variables : Array of variables used in the command(optional)
  • command_type : Type of the command.(artisan or bash. Default artisan)
  • flags : Array of optional flags for the command(optional)

Examples

'commands' => [


    // Basic command
     'Clear Cache' => [
         'run' => 'cache:clear', 
         'type' => 'danger', 
         'group' => 'Cache',
     ],
     
     
     
     // Bash command
      'Disk Usage' => [
          'run' => 'df -h', 
          'type' => 'danger', 
          'group' => 'Statistics',
          'command_type' => 'bash'
      ],
     
     
     
     
     // Command with variable   
     'Clear Cache' => [
         'run' => 'cache:forget {cache key}', 
         'type' => 'danger', 
         'group' => 'Cache'
     ],
     
     
     
     
    // Command with advanced variable customization
    'Clear Cache' => [
        'run' => 'cache:forget {cache key}', 
        'type' => 'danger', 
        'group' => 'Cache',
        'variables' => [
            [
                'label' =>  'cache key' // This needs to match with variable defined in the command,
                'field' => 'select' // Allowed values (text,number,tel,select,date,email,password),
                'options' => [
                    'blog-cache' => 'Clear Blog Cache', 
                    'app-cache' => 'Clear Application Cache'
                ],
                'placeholder' => 'Select An Option'
            ]
        ]
    ],
    
    
    
    
    // Command with flags
    'Run Migrations' => [
        'run' => 'migrate --force', 
        'type' => 'danger', 
        'group' => 'Migration',
    ],
    
    
    
    
    // Command with optional flags
    'Run Migrations' => [
        'run' => 'migrate', 
        'type' => 'danger', 
        'group' => 'Migration',
        'flags' => [ 
        
            // These optional flags will be prompted as a checkbox for the user
            // And will be appended to the command if the user checks the checkbox
            
            '--force' => 'Force running in production' 
        ]
    ],
    
    
    
    
    // Command with help text
    'Run Migrations' => [
        'run' => 'migrate --force', 
        'type' => 'danger', 
        'group' => 'Migration',
        
        // You can also add html for help text.
        'help' => 'This is a destructive operation. Proceed only if you really know what you are doing.'
    ],
    
    
    
    // Queueing commands
    'Clear Cache' => [ 'run' => 'cache:clear --should-queue', 'type' => 'danger', 'group' => 'Cache' ],
    
        
        
    // Queueing commands on custom queue and connection
    'Clear Cache' => [ 'run' => 'cache:clear --should-queue --cr-queue=high --cr-connection=database', 'type' => 'danger', 'group' => 'Cache' ],
]

Other Customizations

    
    // Limit the command run history to latest 10 runs
    'history'  => 10,
  
    
    
    // Tool name displayed in the navigation menu
    'navigation_label' => 'Command Runner',
    
    
    
    // Any additional info to display on the tool page. Can contain string and html.
    'help' => '',
   
    
    
    // Allow running of custom artisan and bash(shell) commands
    'custom_commands' => ['artisan','bash'],
  
  
  
    // Allow running of custom artisan commands only(disable custom bash(shell) commands)
    'custom_commands' => ['artisan'],
  
  
  
    // Allow running of custom bash(shell) commands only(disable custom artisan commands)
    'custom_commands' => ['bash'],
  
  
  
      // Disable running of custom commands.
    'custom_commands' => [],

Screenshots

screenshot of the command runner tool

screenshot of the command runner tool

screenshot of the command runner tool

screenshot of the command runner tool

screenshot of the command runner tool

screenshot of the command runner tool

screenshot of the command runner tool

Credits

Contributing

Thank you for considering contributing to this package! Please create a pull request with your contributions with detailed explanation of the changes you are proposing.

License

This package is open-sourced software licensed under the MIT license.

Comments
  • Support for command options

    Support for command options

    Hi,

    Thank you for this awesome package.

    I just wanted to ask if you are planning to add support for command options as well via variables soon. The variables work perfectly when used for command arguments but not for options.

    We have a scenario in which we are using command options to take start date and end date. Sample command:

    command:test-command {--startDate=default} {--endDate=default}
    

    Now in config, if we simply add following:

    'Test Command' => [
                'run' => 'command:test-command {--startDate=default} {--endDate=default}',
                'type' => 'primary',
                'group' => 'Test'
            ],
    

    It takes input value for --startDate and --endDate, but we also need to append prefix --startDate= and --endDate= with date values to make it work.

    image

    Also we can't use field => "date" in this scenario, which is usable if we would have been using arguments.

    opened by abdulwahid 9
  • Improvements for executing long-running commands

    Improvements for executing long-running commands

    This PR implements Progress Tracking of queued commands which can be useful for long-running commands. It's achieved by updating history every time the Artisan command's progress bar advances.

    It requires using createProgresBar method from Stepanenko3\NovaCommandRunner\Console\HasNovaProgressBar trait in the Artisan command.

    class Test extends Command
    {
        use HasNovaProgressBar;
    
        ...
    
        public function handle()
        {
            // instead of doing $this->output->createProgressBar($number)
            // we need to do $this->createProgressBar($number),
            // and all the methods on the bar instance remain available.
            $bar = $this->createProgressBar(10); 
    
            foreach (range(1, 10) as $i) {
                sleep(1);
    
                $bar->advance();
            }
    
            $bar->finish();
    
            return 0;
        }
    
    Screenshot 2022-10-01 at 14 47 50

    It also introduces the following configuration options that may be required for long-running commands with potentially big output:

    • commands.output_size - crops output of the given command to the specified number of lines
    • commands.timeout - updates the timeout limit for the given queued command
    • unique_command_groups - blocks running commands simultaneously under the given group or globally
    opened by arttemiuss43 1
  • Laravel Vapor Error

    Laravel Vapor Error

    Hello, this Nova plugin is great, but it seems to be getting tripped up on Vapor. I've tried several patches and override of the routes files but have been unsuccessful. Wanted to see if you had any insight. Thanks!

    Error

    Your serialized closure might have been modified or it's unsafe to be unserialized.

    Stack Trace

    #0 [internal function]: Laravel\SerializableClosure\Serializers\Signed->__unserialize(Array)
    #1 /var/task/vendor/laravel/framework/src/Illuminate/Routing/RouteSignatureParameters.php(23): unserialize('O:47:"Laravel\\S...')
    #2 /var/task/vendor/laravel/framework/src/Illuminate/Routing/Route.php(527): Illuminate\Routing\RouteSignatureParameters::fromAction(Array, Array)
    #3 /var/task/vendor/laravel/framework/src/Illuminate/Routing/ImplicitRouteBinding.php(78): Illuminate\Routing\Route->signatureParameters(Array)
    #4 /var/task/vendor/laravel/framework/src/Illuminate/Routing/ImplicitRouteBinding.php(28): Illuminate\Routing\ImplicitRouteBinding::resolveBackedEnumsForRoute(Object(Illuminate\Routing\Route), Array)
    #5 /var/task/vendor/laravel/framework/src/Illuminate/Routing/Router.php(874): Illuminate\Routing\ImplicitRouteBinding::resolveForRoute(Object(Illuminate\Foundation\Application), Object(Illuminate\Routing\Route))
    #6 /var/task/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(41): Illuminate\Routing\Router->substituteImplicitBindings(Object(Illuminate\Routing\Route))
    #7 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Routing\Middleware\SubstituteBindings->handle(Object(Illuminate\Http\Request), Object(Closure))
    #8 /var/task/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(78): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #9 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure))
    #10 /var/task/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #11 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))
    #12 /var/task/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #13 /var/task/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\Session\Middleware\StartSession->handleStatefulRequest(Object(Illuminate\Http\Request), Object(Illuminate\Session\Store), Object(Closure))
    #14 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure))
    #15 /var/task/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #16 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure))
    #17 /var/task/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #18 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure))
    #19 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #20 /var/task/vendor/laravel/framework/src/Illuminate/Routing/Router.php(726): Illuminate\Pipeline\Pipeline->then(Object(Closure))
    #21 /var/task/vendor/laravel/framework/src/Illuminate/Routing/Router.php(703): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request))
    #22 /var/task/vendor/laravel/framework/src/Illuminate/Routing/Router.php(667): Illuminate\Routing\Router->runRoute(Object(Illuminate\Http\Request), Object(Illuminate\Routing\Route))
    #23 /var/task/vendor/laravel/framework/src/Illuminate/Routing/Router.php(656): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))
    #24 /var/task/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))
    #25 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(141): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request))
    #26 /var/task/vendor/laravel/nova/src/Http/Middleware/ServeNova.php(23): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #27 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Laravel\Nova\Http\Middleware\ServeNova->handle(Object(Illuminate\Http\Request), Object(Closure))
    #28 /var/task/vendor/laravel/vapor-core/src/Http/Middleware/ServeStaticAssets.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #29 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Laravel\Vapor\Http\Middleware\ServeStaticAssets->handle(Object(Illuminate\Http\Request), Object(Closure))
    #30 /var/task/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #31 /var/task/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))
    #32 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle(Object(Illuminate\Http\Request), Object(Closure))
    #33 /var/task/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #34 /var/task/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))
    #35 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\TrimStrings->handle(Object(Illuminate\Http\Request), Object(Closure))
    #36 /var/task/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #37 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle(Object(Illuminate\Http\Request), Object(Closure))
    #38 /var/task/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #39 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle(Object(Illuminate\Http\Request), Object(Closure))
    #40 /var/task/vendor/fruitcake/laravel-cors/src/HandleCors.php(38): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #41 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Fruitcake\Cors\HandleCors->handle(Object(Illuminate\Http\Request), Object(Closure))
    #42 /var/task/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #43 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Http\Middleware\TrustProxies->handle(Object(Illuminate\Http\Request), Object(Closure))
    #44 /var/task/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustHosts.php(48): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #45 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Http\Middleware\TrustHosts->handle(Object(Illuminate\Http\Request), Object(Closure))
    #46 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #47 /var/task/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(142): Illuminate\Pipeline\Pipeline->then(Object(Closure))
    #48 /var/task/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(111): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
    #49 /var/task/vendor/laravel/octane/src/ApplicationGateway.php(36): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
    #50 /var/task/vendor/laravel/octane/src/Worker.php(92): Laravel\Octane\ApplicationGateway->handle(Object(Illuminate\Http\Request))
    #51 /var/task/vendor/laravel/vapor-core/src/Runtime/Octane/Octane.php(194): Laravel\Octane\Worker->handle(Object(Illuminate\Http\Request), Object(Laravel\Octane\RequestContext))
    #52 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(141): Laravel\Vapor\Runtime\Octane\Octane::Laravel\Vapor\Runtime\Octane\{closure}(Object(Illuminate\Http\Request))
    #53 /var/task/vendor/laravel/vapor-core/src/Runtime/Http/Middleware/EnsureBinaryEncoding.php(19): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #54 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Laravel\Vapor\Runtime\Http\Middleware\EnsureBinaryEncoding->handle(Object(Illuminate\Http\Request), Object(Closure))
    #55 /var/task/vendor/laravel/vapor-core/src/Runtime/Http/Middleware/EnsureVanityUrlIsNotIndexed.php(16): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #56 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Laravel\Vapor\Runtime\Http\Middleware\EnsureVanityUrlIsNotIndexed->handle(Object(Illuminate\Http\Request), Object(Closure))
    #57 /var/task/vendor/laravel/vapor-core/src/Runtime/Http/Middleware/RedirectStaticAssets.php(30): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #58 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Laravel\Vapor\Runtime\Http\Middleware\RedirectStaticAssets->handle(Object(Illuminate\Http\Request), Object(Closure))
    #59 /var/task/vendor/laravel/vapor-core/src/Runtime/Http/Middleware/EnsureOnNakedDomain.php(46): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #60 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Laravel\Vapor\Runtime\Http\Middleware\EnsureOnNakedDomain->handle(Object(Illuminate\Http\Request), Object(Closure))
    #61 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #62 /var/task/vendor/laravel/vapor-core/src/Runtime/Octane/Octane.php(197): Illuminate\Pipeline\Pipeline->then(Object(Closure))
    #63 /var/task/vendor/laravel/vapor-core/src/Runtime/Octane/Octane.php(162): Laravel\Vapor\Runtime\Octane\Octane::sendRequest(Object(Illuminate\Http\Request), Object(Laravel\Octane\RequestContext))
    #64 /var/task/vendor/laravel/vapor-core/src/Runtime/Handlers/OctaneHandler.php(26): Laravel\Vapor\Runtime\Octane\Octane::handle(Object(Illuminate\Http\Request))
    #65 /var/task/octaneRuntime.php(87): Laravel\Vapor\Runtime\Handlers\OctaneHandler->handle(Array)
    #66 /var/task/vendor/laravel/vapor-core/src/Runtime/LambdaRuntime.php(53): {closure}('ec96437a-69ad-4...', Array)
    #67 /var/task/octaneRuntime.php(89): Laravel\Vapor\Runtime\LambdaRuntime->nextInvocation(Object(Closure))
    #68 /var/task/runtime.php(33): require('/var/task/octan...')
    #69 /opt/bootstrap.php(6): require('/var/task/runti...')
    #70 {main}
    
    opened by c-fitzmaurice 1
  • Downgrade the PHP version requirement from 8.0 to 7.4

    Downgrade the PHP version requirement from 8.0 to 7.4

    Hey @stepanenko3, thanks for putting this repo together.

    Small edit: you have PHP 8.0 listed as the minimum version requirement, but I have confirmed that 7.4 works just fine with the code base.

    Please consider merging this PR, so us sad folks stuck on 7.4 for the time being can enjoy the fruits of your labor.

    Thanks πŸ‘

    opened by fakingfantastic 1
  • Class bit found

    Class bit found

    I have installed and configured this following the instructions and I get the following error when trying to log into Nova

    Error Class "Stepanenko3\NovaCommandRunner\CommandRunner" not found

    From the composer install process Lock file operations: 1 install, 0 updates, 0 removals

    • Locking stepanenko3/nova-command-runner (v4.1.0) Writing lock file Installing dependencies from lock file (including require-dev) Package operations: 1 install, 0 updates, 0 removals
    • Downloading stepanenko3/nova-command-runner (v4.1.0)
    • Installing stepanenko3/nova-command-runner (v4.1.0): Extracting archive Generating optimized autoload files

    Illuminate\Foundation\ComposerScripts::postAutoloadDump @php artisan package:discover --ansi

    php artisan vendor:publish --provider="Stepanenko3\NovaCommandRunner\ToolServiceProvider" Copied Directory [/vendor/stepanenko3/nova-command-runner/config] To [/config] Publishing complete.

    From NovaSerfviceProvider.php public function tools() { return [ new \Stepanenko3\NovaCommandRunner\CommandRunner, ]; }

    opened by borcherds-ralph 1
  • Can't access via leftnav menu

    Can't access via leftnav menu

    laravel/framework v9.5.1 laravel/nova 4.0.0
    stepanenko3/nova-command-runner v4.0.6

    After installing and configuring, the "Command Runner" menu heading appears in the left nav, but it doesn't toggle any menu options: https://gyazo.com/974f17eba212f8aa65562b2f70be839b.png

    I can see the command runner dashboard with our configured commands if I hit route directly: http://site.test/nova/command-runner/

    opened by nathan-io 1
  • Move Inertia route closure to controller

    Move Inertia route closure to controller

    This PR will prevent the throwing of Laravel\SerializableClosure\Exceptions\InvalidSignatureException when an application is running on Laravel Vapor. Solves #5.

    I tested this in our staging environment with a monkey patch and can confirm it works. ALso, in debugging this, I noticed the same error on a few of your other packages on nova packages.

    opened by c-fitzmaurice 0
Releases(v4.2.2)
Owner
Artem Stepanenko
25 y.o. Web Developer πŸ‘¨πŸ»β€πŸ’» instagram.com/stepanenko3
Artem Stepanenko
This Laravel Nova settings tool based on env, using nativ nova fields and resources

Nova Settings Description This Laravel Nova settings tool based on env, using nativ nova fields and resources Features Using native Nova resources Ful

Artem Stepanenko 21 Dec 28, 2022
Bash/Shell autocompletion for Composer

Bash/Shell Autocompletion for Composer composer-autocomplete provides Bash/Shell autocompletion for Composer. Built by Bram(us) Van Damme (https://www

Bramus! 92 Sep 19, 2022
This Laravel Nova package adds a Trumbowyg field to Nova's arsenal of fields.

Nova Trumbowyg Field This Laravel Nova package adds a Trumbowyg field to Nova's arsenal of fields. Requirements php: >=8.0 laravel/nova: ^4.0 Installa

outl1ne 3 Sep 25, 2022
Package for Laravel that gives artisan commands to setup and edit environment files.

Setup and work with .env files in Laravel from the command line NOTE: This doesn't work with Laravel 5 since .env files were changed. This is for Lara

Matt Brunt 6 Dec 17, 2022
Execute Laravel Artisan commands via REST APIs and HTTP requests safely.

Artisan Api There might be some times you wanted to execute an Artisan command, but you did not have access to shell or SSH. Here we brought REST API

Alireza 11 Sep 7, 2022
Laravel-OvalFi helps you Set up, test, and manage your OvalFi integration directly in your Laravel App.

OvalFi Laravel Package Laravel-OvalFi helps you Set up, test, and manage your OvalFi integration directly in your Laravel App. Installation You can in

Paul Adams 2 Sep 8, 2022
A bookmarkable, searchable cheatsheet for all of Laravel's default Artisan commands.

artisan.page A bookmarkable, searchable cheatsheet for all of Laravel's default Artisan commands. Generation The generation of the manifest files is d

James Brooks 284 Dec 25, 2022
Laravel API architecture builder based on artisan commands.

??‍?? API-Formula Laravel API architecture builder based on artisan commands. This package provides a nice and fluent way to generate combined control

KrΕ‘evan Lisica 1 Jan 16, 2022
πŸ“ Artisan Menu - Use Artisan via an elegant console GUI

?? Artisan Menu Use Artisan via an elegant console GUI Features Run built-in and custom Artisan commands from a console GUI Prompts to enter required

Jordan Hall 149 Dec 29, 2022
πŸ“ Artisan Menu - Use Artisan via an elegant console GUI

?? Artisan Menu Use Artisan via an elegant console GUI Features Run built-in and custom Artisan commands from a console GUI Prompts to enter required

Jordan Hall 148 Nov 29, 2022
A package that makes it easy to have the `artisan make:` commands open the newly created file in your editor of choice.

Open On Make A package that makes it easy to have the artisan make: commands open the newly created file in your editor of choice. Installation compos

Andrew Huggins 94 Nov 22, 2022
A wrapper package to run mysqldump from laravel console commands.

A wrapper package to run mysqldump from laravel console commands.

Yada Khov 24 Jun 24, 2022
Collection of the Laravel/Eloquent Model classes that allows you to get data directly from a Magento 2 database.

Laragento LAravel MAgento Micro services Magento 2 has legacy code based on abandoned Zend Framework 1 with really ugly ORM on top of outdated Zend_DB

Egor Shitikov 87 Nov 26, 2022
This tool gives you the ability to set the default collapse state for Nova 4.0 menu items.

Nova Menu Collapsed This tool gives you the ability to set the default collapse state for Nova 4.0 menu items. Requirements php: >=8.0 laravel/nova: ^

Artem Stepanenko 10 Nov 17, 2022
Stop duplicating your Eloquent query scopes and constraints in PHP. This package lets you re-use your query scopes and constraints by adding them as a subquery.

Laravel Eloquent Scope as Select Stop duplicating your Eloquent query scopes and constraints in PHP. This package lets you re-use your query scopes an

Protone Media 75 Dec 7, 2022
cybercog 996 Dec 28, 2022
Laravel Larex lets you translate your whole Laravel application from a single CSV file.

Laravel Larex Translate Laravel Apps from a CSV File Laravel Larex lets you translate your whole Laravel application from a single CSV file. You can i

Luca Patera 68 Dec 12, 2022
This package lets you add uuid as primary key in your laravel applications

laravel-model-uuid A Laravel package to add uuid to models Table of contents Installation Configuration Model Uuid Publishing files / configurations I

salman zafar 10 May 17, 2022
The package lets you generate TypeScript interfaces from your Laravel models.

Laravel TypeScript The package lets you generate TypeScript interfaces from your Laravel models. Introduction Say you have a model which has several p

Boris Lepikhin 296 Dec 24, 2022