:warning: We will maintain this repository up to Laravel 9, as we continue improving its successor, Savannabits/Acacia which is more manageable, modular and totally separate from your main application. Check it out, and please give a star if you like it. Thank you for your support!
Jetstream Inertia Generator a.k.a jig allows you to generate code for simple Admin CRUDs (Create, Read, UPdate, Delete) which are fully compatible with a Laravel Project powered by the Jetstream - Inertia - Vue.js Stack.
You are developing a NextGen project. The data model is complex. It requires Many CRUDS managed by the admin in order to power the main end-user functionality. You don't want to spend Days or even Months writing boilerplate code for all the CRUDs. If that is you, this package comes to your rescue. Just follow these simple steps:
php artisan migrate
(About 2 minutes)php artisan jig:generate articles
(About 3 seconds!!!)What more could you ask for? Cut a day's work down to less than 3 minutes.
No worries. If the steps below are too much, we have a starter template for near-zero setup which you can use to start your project without the initial config below. Checkout the JIG Template Here to get started. Simply click Use This Template.
If you have followed the Jetstream - Inertia - Vue.js Installation instructions, then the project will work with minimal configuration. Other Important dependencies that you MUST configure include:
app/Http/Kernel.php
as follows:
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
...
],
NB: This documentation is for v3.x of JIG. If you are using v2.x, Access v2.x Docs Here
laravel/jetstream
with inertia
.composer require savannabits/jetstream-inertia-generator
:warning: 1. Before proceeding, ensure you have installed
laravel/jetstream
withinertia
.:warning: 2. Step 1 will install spatie/laravel-permission. Ensure you have published migrations for this package to create roles and permissions tables before proceeding.
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
:bulb: NB: The
title
field will be automatically added to theroles
andpermissions
tables when the first CRUD is generated. :::
Install the necessary npm
dev dependencies by running the following command:
If you are using npm:
npm install --include=dev --legacy-peer-deps @headlessui/vue @inertiajs/inertia @inertiajs/inertia-vue3 @vitejs/plugin-vue popper.js @babel/plugin-syntax-dynamic-import dayjs dotenv numeral postcss postcss-import pusher-js laravel-echo laravel-vite sass sass-loader vite vue@^3.1 vue3-vt-notifications vue-flatpickr-component vue-numerals mitt vue-select@^4 dynamic-import-polyfill
Or if you are using yarn:
yarn add -D @headlessui/vue @vitejs/plugin-vue @inertiajs/inertia @inertiajs/inertia-vue3 popper.js @babel/plugin-syntax-dynamic-import dayjs dotenv numeral postcss postcss-import pusher-js laravel-echo laravel-vite sass sass-loader vite vue@^3.1 vue3-vt-notifications vue-flatpickr-component vue-numerals mitt vue-select@^4 dynamic-import-polyfill
Feel free to configure the color palette to your own preference, but for uniformity be sure to include primary
,secondary
, success
and danger
variants since they are used in the jig template.
Publish the Package's assets, configs, templates, components and layouts. This is necessary for you to get the admin layout and all the vue components used in the generated code:
Option 1 (Suitable for fresh installations)
php artisan vendor:publish --force --provider="Savannabits\JetstreamInertiaGenerator\JetstreamInertiaGeneratorServiceProvider"
Option 2 (Useful if you are upgrading the package or already have local changes you don't want to override.) NB: If you only want to update some published files, delete only the published files that you want to update, then run the appropriate command below:
php artisan vendor:publish --tag=jig-blade-templates #Publishes resources/views/app.blade.php. If it already exists, use --force to replace it
php artisan vendor:publish --tag=jig-config #Publishes the config file. If it exists use --force to replace it.
php artisan vendor:publish --tag=jig-routes #Publishes routes/jig.php to hold routes for generated modules.If you have already generated some routes, be sure to back them up as this file will be reset if you --force it.
php artisan vendor:publish --tag=jig-views #publishes Vue Components, app.js, bootstrap.js and Layout files. Use --force to force replace
php artisan vendor:publish --tag=jig-scripts #publishes main.ts and Layout files. Use --force to force replace
php artisan vendor:publish --tag=jig-css #publishes app.css. Use --force to force replace
php artisan vendor:publish --tag=jig-assets #publishes logos and other assets
php artisan vendor:publish --tag=jig-compiler-configs #publishes postcss.config.js,vite.config.js, tsconfig.json and tailwind.config.js
php artisan vendor:publish --tag=jig-seeders #Publish database Seeders
JigMiddleware
to the web
middleware group in app/Http/Kernel.php
:
protected $middlewareGroups = [
'web' => [
...,
\Savannabits\JetstreamInertiaGenerator\Middleware\JigMiddleware::class,
],
];
api
middleware group in app/Http/Kernel.php
protected $middlewareGroups = [
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
...
],
];
APP_BASE_DOMAIN=mydomain.test
# or https
APP_SCHEME=http
#optional mix_app_uri (The path under which the app will be served. It is recommended to run the app from the root of the domain.
MIX_APP_URI=
#If MIX_APP_URI is empty.
APP_URL=${APP_SCHEME}://${APP_BASE_DOMAIN}
#If MIX_APP_URI is not empty.
#APP_URL=${APP_SCHEME}://${APP_BASE_DOMAIN}/${MIX_APP_URI}
SANCTUM_STATEFUL_DOMAINS="${APP_BASE_DOMAIN}"
7. create the storage:link (See laravel documentation) to allow access to the public disk assets (e.g logos) via web:
```shell
php artisan storage:link
v3
only, set the scripts
in your package.json
as follows:
"scripts": {
"dev": "vite",
"build": "vite build",
"serve": "vite preview"
},
config/jetstream.php
under 'features'
:
Features::profilePhotos(),
php artisan migrate
php artisan db:seed --class SeedAdminRoleAndUser
vitejs
:
yarn dev #Start the vitejs development server
yarn build #build assets for production
:rocket: You are now ready to generate your CRUDs!:tada:
## Usage
### The initial seeded admin user and role
When you run `php artisan vendor:publish --tag=jig-migrations`, a migration is published that creates an initial default user called `Administrator` and a role with the name `administrator` to enable you gain access to the system with admin privileges. The credentials for the user account are:
* Email: **admin@savannabits.com**
* Password: **password**
Use these creds after migration to login and explore all parts of the application
### Create the Permissions, Roles and Users Modules first, in that order:
Run the following commands to generate the User Access Control Module before proceeding to generate your admin:
```shell
php artisan jig:generate:permission -f
php artisan jig:generate:role -f
php artisan jig:generate:user -f
You can now proceed to generate any other CRUD you want using the steps in the following section.
php artisan make:migration
command.php artisan migrate
commandphp artisan jig:generate
command-f
or --force
option to force replacement of files.
Assuming you want to generate a books
table:
php artisan make:migration create_books_table
Open your migration and modify it as necessary, adding your fields. After that, run the migration.
php artisan migrate
The Fun Part: Scaffold a whole admin module for books with jig using the following command:
php artisan jig:generate books #Format: php artisan generate [table_name] [-f]
NB: To get a full list of jig
commands called under the hood and the full description of the jig:generate
command, you can run the following:
php artisan jig --help
php artisan jig:generate --help
The command above will generate a number of files and add routes to both your api.php
and web.php
route files. It will also append menu entries to the published Menus.json
file.
The generated vue files are placed under the Pages/Books folder in the js folder.
Finally, run yarn dev or yarn build
to compile the assets. There you have your CRUD.
By Default, generation of a module generates the following permissions:
The naming convention for permissions is ${module-name}.${perm} e.g payments.index, users.create etc.
This package manages access control using policies. Each generated module generates a policy with the default laravel actions:
Special permissions MUST also be generated to control access to the sidebar menus. These permissions SHOULD NOT contain two parts separated with a dot, but only one part.
Menus are configured in a json file published at ./resources/js/Layouts/Jig/Menu.json
.
payments
module will generate a payments
permission.
Then the menu for payments must have payments
as the json key.master-data
you have to generate a permission with the same name.JIG is built on top of datatables.net and is fully server-side rendered using Yajra Datatables. Most of the logic resides inside App\Repositories
and in the respective Repository file, there is a method called dtColumns
which is used to fully control the columns shown in the Index page.
For example, in order to control the columns shown for the Users Datatable, the following is the dtColumns
method under App\Repositories\Users.php
:
public static function dtColumns(): array
{
return [
Column::make('id')->title('ID')->className('all text-right'),
Column::make("name")->className('all'),
Column::make("first_name")->className('none'),
Column::make("last_name")->className('none'),
Column::make("middle_name")->className('none'),
Column::make("username")->className('min-desktop-lg'),
Column::make("email")->className('min-desktop-lg'),
Column::make("gender")->className('min-desktop-lg'),
Column::make("dob")->className('none'),
//Column::make("email_verified_at")->className('min-desktop-lg'),
Column::make("activated")->className('min-desktop-lg'),
Column::make("created_at")->className('min-tv'),
Column::make("updated_at")->className('min-tv'),
Column::make('actions')->className('min-desktop text-right')->orderable(false)->searchable(false),
];
}
NOTE: In order to omit the email_verified_at
class from my Index columns all I had to do is comment it out (or better yet, just remove it from the list of columns!)
The datatables are also responsive by default (Checkout https://datatables.net/extensions/responsive/ for more details). For this purpose, you can use one of the following jig-provided responsive breakpoints to automatically collapse the column below a given screen size. For info on how to use the class logic, checkout the Class Logic Documentation. Most of the time I only use min-
, e.g min-desktop-l
breakpoints: [
{ name: "tv", width: Infinity },
{ name: "desktop-l", width: 1536 },
{ name: "desktop", width: 1280 },
{ name: "tablet-l", width: 1024 },
{ name: "tablet-p", width: 768 },
{ name: "mobile-l", width: 480 },
{ name: "mobile-p", width: 320 },
],
}
Checkout the first snippet on how I have used the responsive classes!
composer test
Please see CHANGELOG for more information what has changed recently.
Please see CONTRIBUTING for details.
If you discover any security related issues, please email maosa.sam@gmail.com instead of using the issue tracker.
The MIT License (MIT). Please see License File for more information.