├── LICENSE.md ├── README.md ├── composer.json └── src ├── Console └── InstallVilt.php ├── Publish ├── app │ ├── Http │ │ └── Middleware │ │ │ └── HandleInertiaRequests.php │ ├── Models │ │ └── User.php │ └── Providers │ │ └── RouteServiceProvider.php ├── config │ └── modules.php ├── modules_statuses.json ├── package.json ├── postcss.config.js ├── public │ └── placeholder.webp ├── resources │ ├── css │ │ └── app.css │ ├── js │ │ ├── app.js │ │ └── bootstrap.js │ └── views │ │ ├── app.blade.php │ │ └── vendor │ │ └── jetstream │ │ ├── components │ │ ├── action-message.blade.php │ │ ├── action-section.blade.php │ │ ├── application-logo.blade.php │ │ ├── application-mark.blade.php │ │ ├── authentication-card-logo.blade.php │ │ ├── authentication-card.blade.php │ │ ├── banner.blade.php │ │ ├── button.blade.php │ │ ├── checkbox.blade.php │ │ ├── confirmation-modal.blade.php │ │ ├── confirms-password.blade.php │ │ ├── danger-button.blade.php │ │ ├── dialog-modal.blade.php │ │ ├── dropdown-link.blade.php │ │ ├── dropdown.blade.php │ │ ├── form-section.blade.php │ │ ├── input-error.blade.php │ │ ├── input.blade.php │ │ ├── label.blade.php │ │ ├── modal.blade.php │ │ ├── nav-link.blade.php │ │ ├── responsive-nav-link.blade.php │ │ ├── secondary-button.blade.php │ │ ├── section-border.blade.php │ │ ├── section-title.blade.php │ │ ├── switchable-team.blade.php │ │ ├── validation-errors.blade.php │ │ └── welcome.blade.php │ │ └── mail │ │ └── team-invitation.blade.php ├── stubs │ └── nwidart-stubs │ │ ├── assets │ │ ├── js │ │ │ └── app.stub │ │ └── sass │ │ │ └── app.stub │ │ ├── command.stub │ │ ├── component-class.stub │ │ ├── component-view.stub │ │ ├── composer.stub │ │ ├── controller-api.stub │ │ ├── controller-plain.stub │ │ ├── controller.stub │ │ ├── event.stub │ │ ├── factory.stub │ │ ├── feature-test.stub │ │ ├── job-queued.stub │ │ ├── job.stub │ │ ├── json.stub │ │ ├── listener-duck.stub │ │ ├── listener-queued-duck.stub │ │ ├── listener-queued.stub │ │ ├── listener.stub │ │ ├── mail.stub │ │ ├── middleware.stub │ │ ├── migration │ │ ├── add.stub │ │ ├── create.stub │ │ ├── delete.stub │ │ ├── drop.stub │ │ └── plain.stub │ │ ├── model.stub │ │ ├── notification.stub │ │ ├── package.stub │ │ ├── policy.plain.stub │ │ ├── provider.stub │ │ ├── request.stub │ │ ├── resource-collection.stub │ │ ├── resource.stub │ │ ├── route-provider.stub │ │ ├── routes │ │ ├── api.stub │ │ └── web.stub │ │ ├── rule.stub │ │ ├── scaffold │ │ ├── config.stub │ │ └── provider.stub │ │ ├── seeder.stub │ │ ├── unit-test.stub │ │ ├── views │ │ ├── index.stub │ │ └── master.stub │ │ └── webpack.stub ├── tailwind.config.js └── vite.config.js └── ViltServiceProvider.php /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright 2022 info@3x1.io 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # README 2 | 3 | This package is used to generate an admin panel for you with a CRUD generator using VILT stack and Admin One Theme. 4 | 5 | ### Overview 6 | 7 | **Vilt** is built to make it easy to develop web apps and API by generating files of CRUD operations and support helpers of tonnes of functions to make it easy to manage and use framework services. 8 | 9 | ### Features 10 | 11 | * [x] CURD Generator Web / API 12 | * [x] HMVC Architecture 13 | * [x] Authentication & User Manager 14 | * [x] Responsive UI Using Admin One Template 15 | * [x] Support RTL Multi Languages 16 | * [x] Table Builder 17 | * [x] Form Builder 18 | * [x] Resource Builder 19 | * [x] Page Builder 20 | * [x] Actions Builder 21 | * [x] Modals Builder 22 | * [x] Widgets Builder 23 | * [x] Menu Builder 24 | 25 | ### Plugins 26 | 27 | 1. [**Settings Module**](https://github.com/queents/settings-module) GUI to save key and value on database and cache it 28 | 2. [**Translations Module**](https://github.com/queents/translations-module) Database Base Translations Keys with Google Translations API Integration 29 | 3. [**Auth Module**](https://github.com/queents/auth-module) convert any Model to Auth Model with full API 30 | 4. [**Artisan Module**](https://github.com/queents/artisan-module) run artisan commands using GUI 31 | 5. [**Browser Module**](https://github.com/queents/browser-module) browse the file inside your app 32 | 6. [**Menu Module**](https://github.com/queents/menus-module) Menu manager and generator for Database 33 | 7. [**Notifications Module**](https://github.com/queents/notifications-module) multi channels and vendors like FCM / Pusher 34 | 8. [**Locations Module**](https://github.com/queents/locations-module) Database seeds for Locations Module for VILT stack 35 | 9. [**FilamentUI Theme**](https://github.com/3x1io/filamentUI-module) a Filament PHP theme build for VILT Stack 36 | 10. [**Backup**](https://github.com/3x1io/backup-module) a Backup GUI to backup your project files and DB 37 | 11. [**Log**](https://github.com/3x1io/log-module) a Logs GUI to check your errors logs and track it 38 | 12. [**Payment**](https://github.com/queents/payment-module) a Tons of payment gateway ready to use 39 | 13. [**API**](https://github.com/queents/api-module) an API generator 40 | 14. [**Auth**](https://github.com/queents/auth-module) an auth generator for any selected table 41 | 42 | ### Docs 43 | 44 | you can review our docs [here](https://queents.gitbook.io/vilt/) 45 | 46 | ### Support 47 | 48 | you can join our discord server to get support [VILT Discord](https://discord.gg/HUNYbgKDdx) 49 | 50 | ### Changelog 51 | 52 | Please see [CHANGELOG](./) for more information on what has changed recently. 53 | 54 | ### Credits 55 | 56 | Vilt Admin use internally some open-source third-party libraries/packages, many thanks to the web community, it will be very good if you are review it before start using our framework: 57 | 58 | 1. Main Framework 59 | 2. [**InertiaJS**](https://inertiajs.com/) VueJs Framework 60 | 3. [**TailwindCSS**](https://tailwindcss.com/) Style Kit 61 | 4. [**VueJs**](https://vuejs.org/) Javascript framework 62 | 5. [**Filament**](https://filamentphp.com/) It's a very creative admin panel for TALL stack 63 | 6. [**Laravel Sanctum**](https://laravel.com/docs/8.x/sanctum) APIs Token Auth 64 | 7. [**Laravel Permission**](https://spatie.be/docs/laravel-permission/v4/introduction) User ACL 65 | 8. [**Laravel Module**](https://nwidart.com/laravel-modules/v6/introduction) MVC Modular Arch 66 | 9. [**Laravel Excel**](https://laravel-excel.com/) Import & Export Excel 67 | 10. [**Laravel Sitemap**](https://github.com/spatie/laravel-sitemap) Sitemap Generator 68 | 11. [**Laravel Translatable**](https://github.com/spatie/laravel-translatable) Translation UI 69 | 12. [**Laravel Media Library**](https://github.com/spatie/laravel-medialibrary) Media & Upload 70 | 13. [**Laravel Backup**](https://github.com/spatie/laravel-backup) Backup 71 | 72 | ### Contributors 73 | 74 | * [Fady Mondy](https://github.com/3x1io) 75 | * [Mohamed Ibrahem](https://github.com/marious) 76 | * [Khaled Abodaif](https://github.com/khaledAbodaif) 77 | * [Ahmed Elbanna](https://github.com/Ahmed-Elbanna-Git) 78 | 79 | ### License 80 | 81 | The MIT License (MIT). Please see [License File](LICENSE.md) for more information. 82 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "queents/vilt", 3 | "description": "VILT stack HMVC dashboard and resource generator with ready to use modules", 4 | "type": "library", 5 | "license": "MIT", 6 | "autoload": { 7 | "psr-4": { 8 | "Queents\\Vilt\\": "src/", 9 | "Modules\\": "../../../Modules/" 10 | } 11 | }, 12 | "extra": { 13 | "laravel": { 14 | "providers": [ 15 | "Queents\\Vilt\\ViltServiceProvider" 16 | ] 17 | } 18 | }, 19 | "authors": [ 20 | { 21 | "name": "Fady Mondy", 22 | "email": "info@3x1.io" 23 | } 24 | ], 25 | "minimum-stability": "beta", 26 | "require": { 27 | "nwidart/laravel-modules": "^9.0", 28 | "spatie/laravel-translatable": "^6.0", 29 | "queents/api-module": "^1.0", 30 | "queents/base-module": "^1.0", 31 | "queents/menu-module": "^1.0", 32 | "queents/roles-module": "^1.0", 33 | "queents/generator-module": "^1.0" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/Console/InstallVilt.php: -------------------------------------------------------------------------------- 1 | publish = base_path('vendor/queents/vilt/src/Publish'); 40 | parent::__construct(); 41 | } 42 | 43 | /** 44 | * Execute the console command. 45 | * 46 | * @return mixed 47 | */ 48 | public function handle() 49 | { 50 | $getMigrationFiles = File::files(database_path('migrations')); 51 | foreach ($getMigrationFiles as $file){ 52 | if(strpos($file->getFilename(), 'sessions')){ 53 | File::delete($file->getRealPath()); 54 | } 55 | } 56 | $this->handelFile('/app/Models/User.php', app_path('/Models/User.php')); 57 | $this->info('Copy modules_statuses.json'); 58 | $this->handelFile('/modules_statuses.json', base_path('/modules_statuses.json')); 59 | $this->runArtisanCommand(['migrate']); 60 | $this->runArtisanCommand(['roles:install']); 61 | $theme = $this->ask("Please select theme from this list \n [1] Admin UI \n [2] FilamentUI \n [3] Without UI \n"); 62 | if($theme === "1"){ 63 | $this->requireComposerPackages(['queents/ui-module']); 64 | } 65 | else if($theme === "2"){ 66 | $this->requireComposerPackages(['3x1io/filamentui-module']); 67 | } 68 | $plugins = $this->ask("Please select plugins from this list EX: 1,2,3,4 \n 69 | [1] Settings - VILT framework Settings module GUI to save key and value on database and cache it \n 70 | [2] Translations - Database Base Translations Keys with Google Translations API Integration \n 71 | [3] Notifications - VILT Notifications Module with multi channels and vendors like FCM / Pusher \n 72 | [4] Payment - Payment Services Integrations & Management Module for VILT Framework \n 73 | [5] Log - Log Viewer for VILT Stack using Laravel Log Reader \n 74 | [6] Backup - Backup module for VILT Stack build with spatie laravel-backup \n 75 | [7] Locations - Database seeds for Locations Module for VILT stack \n 76 | [8] Browser - VILT browser modules to browser the file inside your app \n 77 | [9] Artisan - VILT artisan modules to run artisan commands using GUI \n 78 | "); 79 | 80 | $plugins = explode(",", $plugins); 81 | foreach($plugins as $plugin){ 82 | switch ($plugin){ 83 | case "1": 84 | $this->requireComposerPackages(['queents/settings-module']); 85 | $this->activeModule('Settings'); 86 | $this->runArtisanCommand(['migrate']); 87 | break; 88 | case "2": 89 | $this->requireComposerPackages(['queents/translations-module']); 90 | $this->activeModule('Translations'); 91 | $this->runArtisanCommand(['migrate']); 92 | $this->runArtisanCommand(['translations:install']); 93 | break; 94 | case "3": 95 | $this->requireComposerPackages(['queents/notifications-module']); 96 | $this->activeModule('Notifications'); 97 | $this->runArtisanCommand(['migrate']); 98 | $this->runArtisanCommand(['notifications:install']); 99 | break; 100 | case "4": 101 | $this->requireComposerPackages(['queents/payment-module']); 102 | $this->activeModule('Payment'); 103 | $this->runArtisanCommand(['migrate']); 104 | $this->runArtisanCommand(['payment:install']); 105 | break; 106 | case "5": 107 | $this->requireComposerPackages(['3x1io/log-module']); 108 | $this->activeModule('Log'); 109 | $this->generatePermission('logs'); 110 | break; 111 | case "6": 112 | $this->requireComposerPackages(['3x1io/backup-module']); 113 | $this->activeModule('Backup'); 114 | $this->generatePermission('backups'); 115 | break; 116 | case "7": 117 | $this->requireComposerPackages(['queents/locations-module']); 118 | $this->activeModule('Locations'); 119 | $this->runArtisanCommand(['migrate']); 120 | $this->runArtisanCommand(['location:install']); 121 | break; 122 | case "8": 123 | $this->requireComposerPackages(['queents/browser-module']); 124 | $this->activeModule('Browser'); 125 | $this->generatePermission('browser'); 126 | break; 127 | case "9": 128 | $this->requireComposerPackages(['queents/artisan-module']); 129 | $this->activeModule('Artisan'); 130 | $this->generatePermission('artisan'); 131 | break; 132 | } 133 | } 134 | 135 | /* 136 | * Step 1 Copy And Publish Assets 137 | */ 138 | $this->info('Install JetStream'); 139 | $this->callSilent('jetstream:install', [ 140 | "stack"=>"inertia" 141 | ]); 142 | $this->info('Migrate JetStream Tables'); 143 | $this->info('Copy tailwind.config.js'); 144 | $this->handelFile('/tailwind.config.js', base_path('/tailwind.config.js')); 145 | $this->info('Copy vite.config.js'); 146 | $this->handelFile('/vite.config.js', base_path('/vite.config.js')); 147 | $this->info('Copy postcss.config.js'); 148 | $this->handelFile('/postcss.config.js', base_path('/postcss.config.js')); 149 | $this->info('Copy package.json'); 150 | $this->handelFile('/package.json', base_path('/package.json')); 151 | $this->info('Copy HandleInertiaRequests.php'); 152 | $this->handelFile('/app/Http/Middleware/HandleInertiaRequests.php', app_path('/Http/Middleware/HandleInertiaRequests.php')); 153 | $this->info('Copy RouteServiceProvider.php'); 154 | $this->handelFile('/app/Providers/RouteServiceProvider.php', app_path('/Providers/RouteServiceProvider.php')); 155 | $this->info('Copy modules.php'); 156 | $this->handelFile('/config/modules.php', config_path('/modules.php')); 157 | $this->info('Copy placeholder.webp'); 158 | $this->handelFile('/public/placeholder.webp', public_path('/placeholder.webp')); 159 | $this->info('Copy css'); 160 | $this->handelFile('/resources/css', resource_path('/css'), 'folder'); 161 | $this->info('Copy js'); 162 | $this->handelFile('/resources/js', resource_path('/js'), 'folder'); 163 | $this->info('Copy views'); 164 | $this->handelFile('/resources/views', resource_path('/views'), 'folder'); 165 | $this->info('Copy stubs'); 166 | $this->handelFile('/stubs/nwidart-stubs', base_path('/stubs/nwidart-stubs'), 'folder'); 167 | if(!$this->checkFile(base_path('Modules'))){ 168 | File::makeDirectory(base_path('Modules')); 169 | } 170 | $this->info('Copy User.php'); 171 | $this->handelFile('/app/Models/User.php', app_path('/Models/User.php')); 172 | $this->callSilent('optimize:clear'); 173 | $this->callSilent('migrate'); 174 | if($theme === "1"){ 175 | $this->info('Add THEME_MODULE=UI to .env'); 176 | $this->info('After Add To .env Please run yarn i & yarn build and run migration'); 177 | } 178 | else if($theme === "2"){ 179 | $this->info('Add THEME_MODULE=Filamentui to .env and add "Filamentui": true to modules_statuses.json and run migration'); 180 | $this->info('After Add To .env Please run yarn & yarn build'); 181 | } 182 | } 183 | 184 | public function runDirectCommandPHP(array $commands): void 185 | { 186 | (new Process(array_merge([$this->phpBinary()],$commands), base_path(), ['COMPOSER_MEMORY_LIMIT' => '-1'])) 187 | ->setTimeout(null) 188 | ->run(function ($type, $output) { 189 | $this->output->write($output); 190 | }); 191 | } 192 | 193 | public function generatePermission(string $path): void 194 | { 195 | $this->runArtisanCommand(['roles:generate', $path]); 196 | } 197 | 198 | public function runArtisanCommand(array $command):void 199 | { 200 | $this->runDirectCommandPHP(array_merge(['artisan'], $command)); 201 | } 202 | 203 | public function activeModule(string $module): void 204 | { 205 | $check = File::exists(base_path('/modules_statuses.json')); 206 | if($check){ 207 | $fileJson = json_decode(File::get(base_path('/modules_statuses.json'))); 208 | $fileJson->{$module} = true; 209 | File::put(base_path('/modules_statuses.json'), json_encode($fileJson)); 210 | } 211 | } 212 | 213 | public function handelFile(string $from, string $to, string $type = 'file'): void 214 | { 215 | $checkIfFileEx = $this->checkFile($to); 216 | if($checkIfFileEx){ 217 | $this->deleteFile($to); 218 | $this->copyFile($this->publish .$from, $to, $type); 219 | } 220 | else { 221 | $this->copyFile($this->publish .$from, $to, $type); 222 | } 223 | } 224 | 225 | public function checkFile(string $path): bool 226 | { 227 | return File::exists($path); 228 | } 229 | 230 | public function copyFile(string $from,string $to, string $type ='file'): bool 231 | { 232 | if($type === 'folder'){ 233 | $copy = File::copyDirectory($from , $to); 234 | } 235 | else { 236 | $copy = File::copy($from , $to); 237 | } 238 | 239 | return $copy; 240 | } 241 | public function deleteFile(string $path, string $type ='file'): bool 242 | { 243 | if($type === 'folder'){ 244 | $delete = File::deleteDirectory($path); 245 | } 246 | else { 247 | $delete = File::delete($path); 248 | } 249 | 250 | return $delete; 251 | } 252 | 253 | /** 254 | * Run the given commands. 255 | * 256 | * @param array $commands 257 | * @return void 258 | */ 259 | protected function runCommands(array $commands): void 260 | { 261 | $process = Process::fromShellCommandline(implode(' && ', $commands), null, null, null, null); 262 | 263 | if ('\\' !== DIRECTORY_SEPARATOR && file_exists('/dev/tty') && is_readable('/dev/tty')) { 264 | try { 265 | $process->setTty(true); 266 | } catch (RuntimeException $e) { 267 | $this->output->writeln(' WARN '.$e->getMessage().PHP_EOL); 268 | } 269 | } 270 | 271 | $process->run(function ($type, $line) { 272 | $this->output->write(' '.$line); 273 | }); 274 | } 275 | 276 | /** 277 | * Get the path to the appropriate PHP binary. 278 | * 279 | * @return string 280 | */ 281 | protected function phpBinary(): string 282 | { 283 | return (new PhpExecutableFinder())->find(false) ?: 'php'; 284 | } 285 | 286 | /** 287 | * Installs the given Composer Packages into the application. 288 | * 289 | * @param mixed $packages 290 | * @return void 291 | */ 292 | protected function requireComposerPackages(mixed $packages): void 293 | { 294 | $composer = $this->option('composer'); 295 | 296 | if ($composer !== 'global') { 297 | $command = [$this->phpBinary(), $composer, 'require']; 298 | } 299 | 300 | $command = array_merge( 301 | $command ?? ['composer', 'require'], 302 | is_array($packages) ? $packages : func_get_args() 303 | ); 304 | 305 | (new Process($command, base_path(), ['COMPOSER_MEMORY_LIMIT' => '-1'])) 306 | ->setTimeout(null) 307 | ->run(function ($type, $output) { 308 | $this->output->write($output); 309 | }); 310 | } 311 | 312 | /** 313 | * Install the given Composer Packages as "dev" dependencies. 314 | * 315 | * @param mixed $packages 316 | * @return void 317 | */ 318 | protected function requireComposerDevPackages(mixed $packages): void 319 | { 320 | $composer = $this->option('composer'); 321 | 322 | if ($composer !== 'global') { 323 | $command = [$this->phpBinary(), $composer, 'require', '--dev']; 324 | } 325 | 326 | $command = array_merge( 327 | $command ?? ['composer', 'require', '--dev'], 328 | is_array($packages) ? $packages : func_get_args() 329 | ); 330 | 331 | (new Process($command, base_path(), ['COMPOSER_MEMORY_LIMIT' => '-1'])) 332 | ->setTimeout(null) 333 | ->run(function ($type, $output) { 334 | $this->output->write($output); 335 | }); 336 | } 337 | } 338 | -------------------------------------------------------------------------------- /src/Publish/app/Http/Middleware/HandleInertiaRequests.php: -------------------------------------------------------------------------------- 1 | VILT::get() 42 | ]); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/Publish/app/Models/User.php: -------------------------------------------------------------------------------- 1 | 'datetime', 53 | ]; 54 | 55 | /** 56 | * The accessors to append to the model's array form. 57 | * 58 | * @var array 59 | */ 60 | protected $appends = [ 61 | 'profile_photo_url', 62 | ]; 63 | } 64 | -------------------------------------------------------------------------------- /src/Publish/app/Providers/RouteServiceProvider.php: -------------------------------------------------------------------------------- 1 | configureRateLimiting(); 30 | 31 | $this->routes(function () { 32 | Route::middleware('api') 33 | ->prefix('api') 34 | ->group(base_path('routes/api.php')); 35 | 36 | Route::middleware('web') 37 | ->group(base_path('routes/web.php')); 38 | }); 39 | } 40 | 41 | /** 42 | * Configure the rate limiters for the application. 43 | * 44 | * @return void 45 | */ 46 | protected function configureRateLimiting() 47 | { 48 | RateLimiter::for('api', function (Request $request) { 49 | return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip()); 50 | }); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/Publish/config/modules.php: -------------------------------------------------------------------------------- 1 | 'Modules', 18 | 19 | /* 20 | |-------------------------------------------------------------------------- 21 | | Module Stubs 22 | |-------------------------------------------------------------------------- 23 | | 24 | | Default module stubs. 25 | | 26 | */ 27 | 28 | 'stubs' => [ 29 | 'enabled' => false, 30 | 'path' => base_path('stubs/nwidart-stubs'), 31 | 'files' => [ 32 | 'routes/web' => 'Routes/web.php', 33 | 'routes/api' => 'Routes/api.php', 34 | 'views/index' => 'Resources/views/index.blade.php', 35 | 'views/master' => 'Resources/views/layouts/master.blade.php', 36 | 'scaffold/config' => 'Config/config.php', 37 | 'composer' => 'composer.json', 38 | 'assets/js/app' => 'Resources/assets/js/app.js', 39 | 'assets/sass/app' => 'Resources/assets/sass/app.scss', 40 | 'webpack' => 'webpack.mix.js', 41 | 'package' => 'package.json' 42 | ], 43 | 'replacements' => [ 44 | 'routes/web' => ['LOWER_NAME', 'STUDLY_NAME'], 45 | 'routes/api' => ['LOWER_NAME'], 46 | 'webpack' => ['LOWER_NAME'], 47 | 'json' => ['LOWER_NAME', 'STUDLY_NAME', 'MODULE_NAMESPACE', 'PROVIDER_NAMESPACE'], 48 | 'views/index' => ['LOWER_NAME'], 49 | 'views/master' => ['LOWER_NAME', 'STUDLY_NAME'], 50 | 'scaffold/config' => ['STUDLY_NAME'], 51 | 'composer' => [ 52 | 'LOWER_NAME', 53 | 'STUDLY_NAME', 54 | 'VENDOR', 55 | 'AUTHOR_NAME', 56 | 'AUTHOR_EMAIL', 57 | 'MODULE_NAMESPACE', 58 | 'PROVIDER_NAMESPACE', 59 | ], 60 | ], 61 | 'gitkeep' => true, 62 | ], 63 | 'paths' => [ 64 | /* 65 | |-------------------------------------------------------------------------- 66 | | Modules path 67 | |-------------------------------------------------------------------------- 68 | | 69 | | This path used for save the generated module. This path also will be added 70 | | automatically to list of scanned folders. 71 | | 72 | */ 73 | 74 | 'modules' => base_path('Modules'), 75 | /* 76 | |-------------------------------------------------------------------------- 77 | | Modules assets path 78 | |-------------------------------------------------------------------------- 79 | | 80 | | Here you may update the modules assets path. 81 | | 82 | */ 83 | 84 | 'assets' => public_path('modules'), 85 | /* 86 | |-------------------------------------------------------------------------- 87 | | The migrations path 88 | |-------------------------------------------------------------------------- 89 | | 90 | | Where you run 'module:publish-migration' command, where do you publish the 91 | | the migration files? 92 | | 93 | */ 94 | 95 | 'migration' => base_path('database/migrations'), 96 | /* 97 | |-------------------------------------------------------------------------- 98 | | Generator path 99 | |-------------------------------------------------------------------------- 100 | | Customise the paths where the folders will be generated. 101 | | Set the generate key to false to not generate that folder 102 | */ 103 | 'generator' => [ 104 | 'config' => ['path' => 'Config', 'generate' => true], 105 | 'command' => ['path' => 'Console', 'generate' => true], 106 | 'migration' => ['path' => 'Database/Migrations', 'generate' => true], 107 | 'seeder' => ['path' => 'Database/Seeders', 'generate' => true], 108 | 'factory' => ['path' => 'Database/factories', 'generate' => true], 109 | 'model' => ['path' => 'Entities', 'generate' => true], 110 | 'routes' => ['path' => 'Routes', 'generate' => true], 111 | 'controller' => ['path' => 'Http/Controllers', 'generate' => true], 112 | 'filter' => ['path' => 'Http/Middleware', 'generate' => true], 113 | 'request' => ['path' => 'Http/Requests', 'generate' => true], 114 | 'provider' => ['path' => 'Providers', 'generate' => true], 115 | 'assets' => ['path' => 'Resources/assets', 'generate' => true], 116 | 'lang' => ['path' => 'Resources/lang', 'generate' => true], 117 | 'views' => ['path' => 'Resources/views', 'generate' => true], 118 | 'test' => ['path' => 'Tests/Unit', 'generate' => true], 119 | 'test-feature' => ['path' => 'Tests/Feature', 'generate' => true], 120 | 'repository' => ['path' => 'Repositories', 'generate' => false], 121 | 'event' => ['path' => 'Events', 'generate' => false], 122 | 'listener' => ['path' => 'Listeners', 'generate' => false], 123 | 'policies' => ['path' => 'Policies', 'generate' => false], 124 | 'rules' => ['path' => 'Rules', 'generate' => false], 125 | 'jobs' => ['path' => 'Jobs', 'generate' => false], 126 | 'emails' => ['path' => 'Emails', 'generate' => false], 127 | 'notifications' => ['path' => 'Notifications', 'generate' => false], 128 | 'resource' => ['path' => 'Transformers', 'generate' => false], 129 | 'component-view' => ['path' => 'Resources/views/components', 'generate' => false], 130 | 'component-class' => ['path' => 'View/Components', 'generate' => false], 131 | ], 132 | ], 133 | 134 | /* 135 | |-------------------------------------------------------------------------- 136 | | Package commands 137 | |-------------------------------------------------------------------------- 138 | | 139 | | Here you can define which commands will be visible and used in your 140 | | application. If for example you don't use some of the commands provided 141 | | you can simply comment them out. 142 | | 143 | */ 144 | 'commands' => [ 145 | Commands\CommandMakeCommand::class, 146 | Commands\ComponentClassMakeCommand::class, 147 | Commands\ComponentViewMakeCommand::class, 148 | Commands\ControllerMakeCommand::class, 149 | Commands\DisableCommand::class, 150 | Commands\DumpCommand::class, 151 | Commands\EnableCommand::class, 152 | Commands\EventMakeCommand::class, 153 | Commands\JobMakeCommand::class, 154 | Commands\ListenerMakeCommand::class, 155 | Commands\MailMakeCommand::class, 156 | Commands\MiddlewareMakeCommand::class, 157 | Commands\NotificationMakeCommand::class, 158 | Commands\ProviderMakeCommand::class, 159 | Commands\RouteProviderMakeCommand::class, 160 | Commands\InstallCommand::class, 161 | Commands\ListCommand::class, 162 | Commands\ModuleDeleteCommand::class, 163 | Commands\ModuleMakeCommand::class, 164 | Commands\FactoryMakeCommand::class, 165 | Commands\PolicyMakeCommand::class, 166 | Commands\RequestMakeCommand::class, 167 | Commands\RuleMakeCommand::class, 168 | Commands\MigrateCommand::class, 169 | Commands\MigrateRefreshCommand::class, 170 | Commands\MigrateResetCommand::class, 171 | Commands\MigrateRollbackCommand::class, 172 | Commands\MigrateStatusCommand::class, 173 | Commands\MigrationMakeCommand::class, 174 | Commands\ModelMakeCommand::class, 175 | Commands\PublishCommand::class, 176 | Commands\PublishConfigurationCommand::class, 177 | Commands\PublishMigrationCommand::class, 178 | Commands\PublishTranslationCommand::class, 179 | Commands\SeedCommand::class, 180 | Commands\SeedMakeCommand::class, 181 | Commands\SetupCommand::class, 182 | Commands\UnUseCommand::class, 183 | Commands\UpdateCommand::class, 184 | Commands\UseCommand::class, 185 | Commands\ResourceMakeCommand::class, 186 | Commands\TestMakeCommand::class, 187 | Commands\LaravelModulesV6Migrator::class, 188 | ], 189 | 190 | /* 191 | |-------------------------------------------------------------------------- 192 | | Scan Path 193 | |-------------------------------------------------------------------------- 194 | | 195 | | Here you define which folder will be scanned. By default will scan vendor 196 | | directory. This is useful if you host the package in packagist website. 197 | | 198 | */ 199 | 200 | 'scan' => [ 201 | 'enabled' => true, 202 | 'paths' => [ 203 | base_path('vendor/*/*'), 204 | ], 205 | ], 206 | /* 207 | |-------------------------------------------------------------------------- 208 | | Composer File Template 209 | |-------------------------------------------------------------------------- 210 | | 211 | | Here is the config for composer.json file, generated by this package 212 | | 213 | */ 214 | 215 | 'composer' => [ 216 | 'vendor' => 'queents', 217 | 'author' => [ 218 | 'name' => 'Fady Mondy', 219 | 'email' => 'info@3x1.io', 220 | ], 221 | 'composer-output' => false, 222 | ], 223 | 224 | /* 225 | |-------------------------------------------------------------------------- 226 | | Caching 227 | |-------------------------------------------------------------------------- 228 | | 229 | | Here is the config for setting up caching feature. 230 | | 231 | */ 232 | 'cache' => [ 233 | 'enabled' => false, 234 | 'key' => 'laravel-modules', 235 | 'lifetime' => 60, 236 | ], 237 | /* 238 | |-------------------------------------------------------------------------- 239 | | Choose what laravel-modules will register as custom namespaces. 240 | | Setting one to false will require you to register that part 241 | | in your own Service Provider class. 242 | |-------------------------------------------------------------------------- 243 | */ 244 | 'register' => [ 245 | 'translations' => true, 246 | /** 247 | * load files on boot or register method 248 | * 249 | * Note: boot not compatible with asgardcms 250 | * 251 | * @example boot|register 252 | */ 253 | 'files' => 'register', 254 | ], 255 | 256 | /* 257 | |-------------------------------------------------------------------------- 258 | | Activators 259 | |-------------------------------------------------------------------------- 260 | | 261 | | You can define new types of activators here, file, database etc. The only 262 | | required parameter is 'class'. 263 | | The file activator will store the activation status in storage/installed_modules 264 | */ 265 | 'activators' => [ 266 | 'file' => [ 267 | 'class' => FileActivator::class, 268 | 'statuses-file' => base_path('modules_statuses.json'), 269 | 'cache-key' => 'activator.installed', 270 | 'cache-lifetime' => 604800, 271 | ], 272 | ], 273 | 274 | 'activator' => 'file', 275 | ]; 276 | -------------------------------------------------------------------------------- /src/Publish/modules_statuses.json: -------------------------------------------------------------------------------- 1 | { 2 | "Base": true, 3 | "Roles": true, 4 | "Generator": true, 5 | "API": true, 6 | "Menu": true 7 | } 8 | -------------------------------------------------------------------------------- /src/Publish/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "vite", 5 | "build": "vite build" 6 | }, 7 | "devDependencies": { 8 | "@inertiajs/inertia": "^0.11.0", 9 | "@inertiajs/inertia-vue3": "^0.6.0", 10 | "@inertiajs/progress": "^0.2.7", 11 | "@mdi/js": "^7.0.96", 12 | "@tailwindcss/forms": "^0.5.2", 13 | "@vitejs/plugin-vue": "^3.0.0", 14 | "autoprefixer": "^10.4.2", 15 | "axios": "^0.27.2", 16 | "chart.js": "^3.9.1", 17 | "laravel-vite-plugin": "^0.5.0", 18 | "lodash": "^4.17.19", 19 | "numeral": "^2.0.6", 20 | "pinia": "^2.0.20", 21 | "postcss": "^8.4.6", 22 | "prettier": "2.7.1", 23 | "tailwindcss": "^3.1.0", 24 | "vite": "^3.0.0", 25 | "vue": "^3.2.31" 26 | }, 27 | "dependencies": { 28 | "@meforma/vue-toaster": "^1.3.0", 29 | "@suadelabs/vue3-multiselect": "^1.0.2", 30 | "@tailwindcss/line-clamp": "^0.4.0", 31 | "@tailwindcss/typography": "^0.5.7", 32 | "@vueform/toggle": "^2.1.1", 33 | "boxicons": "^2.1.2", 34 | "codemirror-editor-vue3": "^2.1.7", 35 | "daisyui": "^2.25.0", 36 | "filepond": "^4.30.4", 37 | "filepond-plugin-file-validate-type": "^1.2.8", 38 | "filepond-plugin-image-preview": "^4.6.11", 39 | "firebase": "^9.10.0", 40 | "moment": "^2.29.4", 41 | "tailwindcss-rtl": "^0.9.0", 42 | "tippy.js": "^6.3.7", 43 | "vue-draggable-next": "^2.1.1", 44 | "vue-easy-lightbox": "^1.8.0", 45 | "vue-filepond": "^7.0.3", 46 | "vue-flatpickr-component": "^9.0.6", 47 | "vue-lazyload": "^3.0.0-rc.2", 48 | "vue-spinner": "^1.0.4", 49 | "vue-swatches": "^2.1.1", 50 | "vue3-cookies": "^1.0.6", 51 | "vue3-editor": "^0.1.1", 52 | "vue3-swatches": "^1.0.10", 53 | "vue3-tabs-component": "^1.1.0", 54 | "vue3-tel-input": "^1.0.4", 55 | "vuejs-title": "^1.0.16" 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/Publish/postcss.config.js: -------------------------------------------------------------------------------- 1 | /* eslint-env node */ 2 | module.exports = { 3 | plugins: [ 4 | require("postcss-import"), 5 | require("tailwindcss"), 6 | require("autoprefixer"), 7 | ], 8 | }; 9 | -------------------------------------------------------------------------------- /src/Publish/public/placeholder.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/queents/vilt/9c79ff01613cf492b4d4d2ea8f4085b1c37dda79/src/Publish/public/placeholder.webp -------------------------------------------------------------------------------- /src/Publish/resources/css/app.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /src/Publish/resources/js/app.js: -------------------------------------------------------------------------------- 1 | import './bootstrap'; 2 | import '@@/app.js'; 3 | -------------------------------------------------------------------------------- /src/Publish/resources/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | window._ = _; 3 | 4 | /** 5 | * We'll load the axios HTTP library which allows us to easily issue requests 6 | * to our Laravel back-end. This library automatically handles sending the 7 | * CSRF token as a header based on the value of the "XSRF" token cookie. 8 | */ 9 | 10 | import axios from 'axios'; 11 | window.axios = axios; 12 | 13 | window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; 14 | 15 | /** 16 | * Echo exposes an expressive API for subscribing to channels and listening 17 | * for events that are broadcast by Laravel. Echo and event broadcasting 18 | * allows your team to easily build robust real-time web applications. 19 | */ 20 | 21 | // import Echo from 'laravel-echo'; 22 | 23 | // import Pusher from 'pusher-js'; 24 | // window.Pusher = Pusher; 25 | 26 | // window.Echo = new Echo({ 27 | // broadcaster: 'pusher', 28 | // key: import.meta.env.VITE_PUSHER_APP_KEY, 29 | // wsHost: import.meta.env.VITE_PUSHER_HOST ?? `ws-${import.meta.env.VITE_PUSHER_APP_CLUSTER}.pusher.com`, 30 | // wsPort: import.meta.env.VITE_PUSHER_PORT ?? 80, 31 | // wssPort: import.meta.env.VITE_PUSHER_PORT ?? 443, 32 | // forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'https') === 'https', 33 | // enabledTransports: ['ws', 'wss'], 34 | // }); 35 | -------------------------------------------------------------------------------- /src/Publish/resources/views/app.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {{ config('app.name', 'Laravel') }} 8 | 9 | 10 | @inertiaHead 11 | 12 | 13 | @routes 14 | @inertia 15 | @vite(['resources/js/app.js']) 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/action-message.blade.php: -------------------------------------------------------------------------------- 1 | @props(['on']) 2 | 3 |
merge(['class' => 'text-sm text-gray-600']) }}> 9 | {{ $slot->isEmpty() ? 'Saved.' : $slot }} 10 |
11 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/action-section.blade.php: -------------------------------------------------------------------------------- 1 |
merge(['class' => 'md:grid md:grid-cols-3 md:gap-6']) }}> 2 | 3 | {{ $title }} 4 | {{ $description }} 5 | 6 | 7 |
8 |
9 | {{ $content }} 10 |
11 |
12 |
13 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/application-logo.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/application-mark.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/authentication-card-logo.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/authentication-card.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 | {{ $logo }} 4 |
5 | 6 |
7 | {{ $slot }} 8 |
9 |
10 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/banner.blade.php: -------------------------------------------------------------------------------- 1 | @props(['style' => session('flash.bannerStyle', 'success'), 'message' => session('flash.banner')]) 2 | 3 |
14 |
15 |
16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |

30 |
31 | 32 |
33 | 43 |
44 |
45 |
46 |
47 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/button.blade.php: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/checkbox.blade.php: -------------------------------------------------------------------------------- 1 | merge(['class' => 'rounded border-gray-300 text-indigo-600 shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50']) !!}> 2 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/confirmation-modal.blade.php: -------------------------------------------------------------------------------- 1 | @props(['id' => null, 'maxWidth' => null]) 2 | 3 | 4 |
5 |
6 |
7 | 8 | 9 | 10 |
11 | 12 |
13 |

14 | {{ $title }} 15 |

16 | 17 |
18 | {{ $content }} 19 |
20 |
21 |
22 |
23 | 24 |
25 | {{ $footer }} 26 |
27 |
28 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/confirms-password.blade.php: -------------------------------------------------------------------------------- 1 | @props(['title' => __('Confirm Password'), 'content' => __('For your security, please confirm your password to continue.'), 'button' => __('Confirm')]) 2 | 3 | @php 4 | $confirmableId = md5($attributes->wire('then')); 5 | @endphp 6 | 7 | wire('then') }} 9 | x-data 10 | x-ref="span" 11 | x-on:click="$wire.startConfirmingPassword('{{ $confirmableId }}')" 12 | x-on:password-confirmed.window="setTimeout(() => $event.detail.id === '{{ $confirmableId }}' && $refs.span.dispatchEvent(new CustomEvent('then', { bubbles: false })), 250);" 13 | > 14 | {{ $slot }} 15 | 16 | 17 | @once 18 | 19 | 20 | {{ $title }} 21 | 22 | 23 | 24 | {{ $content }} 25 | 26 |
27 | 31 | 32 | 33 |
34 |
35 | 36 | 37 | 38 | {{ __('Cancel') }} 39 | 40 | 41 | 42 | {{ $button }} 43 | 44 | 45 |
46 | @endonce 47 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/danger-button.blade.php: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/dialog-modal.blade.php: -------------------------------------------------------------------------------- 1 | @props(['id' => null, 'maxWidth' => null]) 2 | 3 | 4 |
5 |
6 | {{ $title }} 7 |
8 | 9 |
10 | {{ $content }} 11 |
12 |
13 | 14 |
15 | {{ $footer }} 16 |
17 |
18 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/dropdown-link.blade.php: -------------------------------------------------------------------------------- 1 | merge(['class' => 'block px-4 py-2 text-sm leading-5 text-gray-700 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 transition']) }}>{{ $slot }} 2 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/dropdown.blade.php: -------------------------------------------------------------------------------- 1 | @props(['align' => 'right', 'width' => '48', 'contentClasses' => 'py-1 bg-white', 'dropdownClasses' => '']) 2 | 3 | @php 4 | switch ($align) { 5 | case 'left': 6 | $alignmentClasses = 'origin-top-left left-0'; 7 | break; 8 | case 'top': 9 | $alignmentClasses = 'origin-top'; 10 | break; 11 | case 'none': 12 | case 'false': 13 | $alignmentClasses = ''; 14 | break; 15 | case 'right': 16 | default: 17 | $alignmentClasses = 'origin-top-right right-0'; 18 | break; 19 | } 20 | 21 | switch ($width) { 22 | case '48': 23 | $width = 'w-48'; 24 | break; 25 | } 26 | @endphp 27 | 28 |
29 |
30 | {{ $trigger }} 31 |
32 | 33 | 47 |
48 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/form-section.blade.php: -------------------------------------------------------------------------------- 1 | @props(['submit']) 2 | 3 |
merge(['class' => 'md:grid md:grid-cols-3 md:gap-6']) }}> 4 | 5 | {{ $title }} 6 | {{ $description }} 7 | 8 | 9 |
10 |
11 |
12 |
13 | {{ $form }} 14 |
15 |
16 | 17 | @if (isset($actions)) 18 |
19 | {{ $actions }} 20 |
21 | @endif 22 |
23 |
24 |
25 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/input-error.blade.php: -------------------------------------------------------------------------------- 1 | @props(['for']) 2 | 3 | @error($for) 4 |

merge(['class' => 'text-sm text-red-600']) }}>{{ $message }}

5 | @enderror 6 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/input.blade.php: -------------------------------------------------------------------------------- 1 | @props(['disabled' => false]) 2 | 3 | merge(['class' => 'border-gray-300 focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50 rounded-md shadow-sm']) !!}> 4 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/label.blade.php: -------------------------------------------------------------------------------- 1 | @props(['value']) 2 | 3 | 6 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/modal.blade.php: -------------------------------------------------------------------------------- 1 | @props(['id', 'maxWidth']) 2 | 3 | @php 4 | $id = $id ?? md5($attributes->wire('model')); 5 | 6 | $maxWidth = [ 7 | 'sm' => 'sm:max-w-sm', 8 | 'md' => 'sm:max-w-md', 9 | 'lg' => 'sm:max-w-lg', 10 | 'xl' => 'sm:max-w-xl', 11 | '2xl' => 'sm:max-w-2xl', 12 | ][$maxWidth ?? '2xl']; 13 | @endphp 14 | 15 | 69 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/nav-link.blade.php: -------------------------------------------------------------------------------- 1 | @props(['active']) 2 | 3 | @php 4 | $classes = ($active ?? false) 5 | ? 'inline-flex items-center px-1 pt-1 border-b-2 border-indigo-400 text-sm font-medium leading-5 text-gray-900 focus:outline-none focus:border-indigo-700 transition' 6 | : 'inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium leading-5 text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:outline-none focus:text-gray-700 focus:border-gray-300 transition'; 7 | @endphp 8 | 9 | merge(['class' => $classes]) }}> 10 | {{ $slot }} 11 | 12 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/responsive-nav-link.blade.php: -------------------------------------------------------------------------------- 1 | @props(['active']) 2 | 3 | @php 4 | $classes = ($active ?? false) 5 | ? 'block pl-3 pr-4 py-2 border-l-4 border-indigo-400 text-base font-medium text-indigo-700 bg-indigo-50 focus:outline-none focus:text-indigo-800 focus:bg-indigo-100 focus:border-indigo-700 transition' 6 | : 'block pl-3 pr-4 py-2 border-l-4 border-transparent text-base font-medium text-gray-600 hover:text-gray-800 hover:bg-gray-50 hover:border-gray-300 focus:outline-none focus:text-gray-800 focus:bg-gray-50 focus:border-gray-300 transition'; 7 | @endphp 8 | 9 | merge(['class' => $classes]) }}> 10 | {{ $slot }} 11 | 12 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/secondary-button.blade.php: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/section-border.blade.php: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/section-title.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |

{{ $title }}

4 | 5 |

6 | {{ $description }} 7 |

8 |
9 | 10 |
11 | {{ $aside ?? '' }} 12 |
13 |
14 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/switchable-team.blade.php: -------------------------------------------------------------------------------- 1 | @props(['team', 'component' => 'jet-dropdown-link']) 2 | 3 |
4 | @method('PUT') 5 | @csrf 6 | 7 | 8 | 9 | 10 | 11 |
12 | @if (Auth::user()->isCurrentTeam($team)) 13 | 14 | @endif 15 | 16 |
{{ $team->name }}
17 |
18 |
19 |
20 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/validation-errors.blade.php: -------------------------------------------------------------------------------- 1 | @if ($errors->any()) 2 |
3 |
{{ __('Whoops! Something went wrong.') }}
4 | 5 | 10 |
11 | @endif 12 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/components/welcome.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 | 6 |
7 | Welcome to your Jetstream application! 8 |
9 | 10 |
11 | Laravel Jetstream provides a beautiful, robust starting point for your next Laravel application. Laravel is designed 12 | to help you build your application using a development environment that is simple, powerful, and enjoyable. We believe 13 | you should love expressing your creativity through programming, so we have spent time carefully crafting the Laravel 14 | ecosystem to be a breath of fresh air. We hope you love it. 15 |
16 |
17 | 18 |
19 |
20 |
21 | 22 | 23 |
24 | 25 |
26 |
27 | Laravel has wonderful documentation covering every aspect of the framework. Whether you're new to the framework or have previous experience, we recommend reading all of the documentation from beginning to end. 28 |
29 | 30 | 31 |
32 |
Explore the documentation
33 | 34 |
35 | 36 |
37 |
38 |
39 |
40 |
41 | 42 |
43 |
44 | 45 | 46 |
47 | 48 |
49 |
50 | Laracasts offers thousands of video tutorials on Laravel, PHP, and JavaScript development. Check them out, see for yourself, and massively level up your development skills in the process. 51 |
52 | 53 | 54 |
55 |
Start watching Laracasts
56 | 57 |
58 | 59 |
60 |
61 |
62 |
63 |
64 | 65 |
66 |
67 | 68 | 69 |
70 | 71 |
72 |
73 | Laravel Jetstream is built with Tailwind, an amazing utility first CSS framework that doesn't get in your way. You'll be amazed how easily you can build and maintain fresh, modern designs with this wonderful framework at your fingertips. 74 |
75 |
76 |
77 | 78 |
79 |
80 | 81 |
Authentication
82 |
83 | 84 |
85 |
86 | Authentication and registration views are included with Laravel Jetstream, as well as support for user email verification and resetting forgotten passwords. So, you're free to get started what matters most: building your application. 87 |
88 |
89 |
90 |
91 | -------------------------------------------------------------------------------- /src/Publish/resources/views/vendor/jetstream/mail/team-invitation.blade.php: -------------------------------------------------------------------------------- 1 | @component('mail::message') 2 | {{ __('You have been invited to join the :team team!', ['team' => $invitation->team->name]) }} 3 | 4 | @if (Laravel\Fortify\Features::enabled(Laravel\Fortify\Features::registration())) 5 | {{ __('If you do not have an account, you may create one by clicking the button below. After creating an account, you may click the invitation acceptance button in this email to accept the team invitation:') }} 6 | 7 | @component('mail::button', ['url' => route('register')]) 8 | {{ __('Create Account') }} 9 | @endcomponent 10 | 11 | {{ __('If you already have an account, you may accept this invitation by clicking the button below:') }} 12 | 13 | @else 14 | {{ __('You may accept this invitation by clicking the button below:') }} 15 | @endif 16 | 17 | 18 | @component('mail::button', ['url' => $acceptUrl]) 19 | {{ __('Accept Invitation') }} 20 | @endcomponent 21 | 22 | {{ __('If you did not expect to receive an invitation to this team, you may discard this email.') }} 23 | @endcomponent 24 | -------------------------------------------------------------------------------- /src/Publish/stubs/nwidart-stubs/assets/js/app.stub: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/queents/vilt/9c79ff01613cf492b4d4d2ea8f4085b1c37dda79/src/Publish/stubs/nwidart-stubs/assets/js/app.stub -------------------------------------------------------------------------------- /src/Publish/stubs/nwidart-stubs/assets/sass/app.stub: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/queents/vilt/9c79ff01613cf492b4d4d2ea8f4085b1c37dda79/src/Publish/stubs/nwidart-stubs/assets/sass/app.stub -------------------------------------------------------------------------------- /src/Publish/stubs/nwidart-stubs/command.stub: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/Publish/stubs/nwidart-stubs/composer.stub: -------------------------------------------------------------------------------- 1 | { 2 | "name": "$VENDOR$/$LOWER_NAME$", 3 | "description": "", 4 | "authors": [ 5 | { 6 | "name": "$AUTHOR_NAME$", 7 | "email": "$AUTHOR_EMAIL$" 8 | } 9 | ], 10 | "extra": { 11 | "laravel": { 12 | "providers": [], 13 | "aliases": { 14 | 15 | } 16 | } 17 | }, 18 | "autoload": { 19 | "psr-4": { 20 | "$MODULE_NAMESPACE$\\$STUDLY_NAME$\\": "" 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/Publish/stubs/nwidart-stubs/controller-api.stub: -------------------------------------------------------------------------------- 1 | get('/'); 19 | 20 | $response->assertStatus(200); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/Publish/stubs/nwidart-stubs/job-queued.stub: -------------------------------------------------------------------------------- 1 | view('view.name'); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/Publish/stubs/nwidart-stubs/middleware.stub: -------------------------------------------------------------------------------- 1 | id(); 18 | $FIELDS$ 19 | $table->timestamps(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | * 26 | * @return void 27 | */ 28 | public function down() 29 | { 30 | Schema::dropIfExists('$TABLE$'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /src/Publish/stubs/nwidart-stubs/migration/delete.stub: -------------------------------------------------------------------------------- 1 | bigIncrements('id'); 28 | $FIELDS$ 29 | $table->timestamps(); 30 | }); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /src/Publish/stubs/nwidart-stubs/migration/plain.stub: -------------------------------------------------------------------------------- 1 | line('The introduction to the notification.') 45 | ->action('Notification Action', 'https://laravel.com') 46 | ->line('Thank you for using our application!'); 47 | } 48 | 49 | /** 50 | * Get the array representation of the notification. 51 | * 52 | * @param mixed $notifiable 53 | * @return array 54 | */ 55 | public function toArray($notifiable) 56 | { 57 | return [ 58 | // 59 | ]; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/Publish/stubs/nwidart-stubs/package.stub: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "npm run development", 5 | "development": "mix", 6 | "watch": "mix watch", 7 | "watch-poll": "mix watch -- --watch-options-poll=1000", 8 | "hot": "mix watch --hot", 9 | "prod": "npm run production", 10 | "production": "mix --production" 11 | }, 12 | "devDependencies": { 13 | "axios": "^0.21.4", 14 | "dotenv": "^10.0.0", 15 | "dotenv-expand": "^5.1.0", 16 | "laravel-mix": "^6.0.31", 17 | "laravel-mix-merge-manifest": "^2.0.0", 18 | "lodash": "^4.17.21", 19 | "postcss": "^8.3.7" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/Publish/stubs/nwidart-stubs/policy.plain.stub: -------------------------------------------------------------------------------- 1 | mapApiRoutes(); 37 | 38 | $this->mapWebRoutes(); 39 | } 40 | 41 | /** 42 | * Define the "web" routes for the application. 43 | * 44 | * These routes all receive session state, CSRF protection, etc. 45 | * 46 | * @return void 47 | */ 48 | protected function mapWebRoutes() 49 | { 50 | Route::middleware('web') 51 | ->namespace($this->moduleNamespace) 52 | ->group(module_path('$MODULE$', '$WEB_ROUTES_PATH$')); 53 | } 54 | 55 | /** 56 | * Define the "api" routes for the application. 57 | * 58 | * These routes are typically stateless. 59 | * 60 | * @return void 61 | */ 62 | protected function mapApiRoutes() 63 | { 64 | Route::prefix('api') 65 | ->middleware('api') 66 | ->namespace($this->moduleNamespace) 67 | ->group(module_path('$MODULE$', '$API_ROUTES_PATH$')); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/Publish/stubs/nwidart-stubs/routes/api.stub: -------------------------------------------------------------------------------- 1 | get('/$LOWER_NAME$', function (Request $request) { 17 | return $request->user(); 18 | }); -------------------------------------------------------------------------------- /src/Publish/stubs/nwidart-stubs/routes/web.stub: -------------------------------------------------------------------------------- 1 | group(function() { 15 | Route::get('/', '$STUDLY_NAME$Controller@index'); 16 | }); 17 | -------------------------------------------------------------------------------- /src/Publish/stubs/nwidart-stubs/rule.stub: -------------------------------------------------------------------------------- 1 | '$STUDLY_NAME$' 5 | ]; 6 | -------------------------------------------------------------------------------- /src/Publish/stubs/nwidart-stubs/scaffold/provider.stub: -------------------------------------------------------------------------------- 1 | registerTranslations(); 30 | $this->registerConfig(); 31 | $this->registerViews(); 32 | $this->loadMigrationsFrom(module_path($this->moduleName, '$MIGRATIONS_PATH$')); 33 | VILT::loadResources($this->moduleName); 34 | VILT::registerTranslation(Lang::make('$LOWER_NAME$.sidebar')->label(__('$MODULE$'))); 35 | } 36 | 37 | /** 38 | * Register the service provider. 39 | * 40 | * @return void 41 | */ 42 | public function register() 43 | { 44 | $this->app->register(RouteServiceProvider::class); 45 | } 46 | 47 | /** 48 | * Register config. 49 | * 50 | * @return void 51 | */ 52 | protected function registerConfig() 53 | { 54 | $this->publishes([ 55 | module_path($this->moduleName, '$PATH_CONFIG$/config.php') => config_path($this->moduleNameLower . '.php'), 56 | ], 'config'); 57 | $this->mergeConfigFrom( 58 | module_path($this->moduleName, '$PATH_CONFIG$/config.php'), $this->moduleNameLower 59 | ); 60 | } 61 | 62 | /** 63 | * Register views. 64 | * 65 | * @return void 66 | */ 67 | public function registerViews() 68 | { 69 | $viewPath = resource_path('views/modules/' . $this->moduleNameLower); 70 | 71 | $sourcePath = module_path($this->moduleName, '$PATH_VIEWS$'); 72 | 73 | $this->publishes([ 74 | $sourcePath => $viewPath 75 | ], ['views', $this->moduleNameLower . '-module-views']); 76 | 77 | $this->loadViewsFrom(array_merge($this->getPublishableViewPaths(), [$sourcePath]), $this->moduleNameLower); 78 | } 79 | 80 | /** 81 | * Register translations. 82 | * 83 | * @return void 84 | */ 85 | public function registerTranslations() 86 | { 87 | $langPath = resource_path('lang/modules/' . $this->moduleNameLower); 88 | 89 | if (is_dir($langPath)) { 90 | $this->loadTranslationsFrom($langPath, $this->moduleNameLower); 91 | $this->loadJsonTranslationsFrom($langPath, $this->moduleNameLower); 92 | } else { 93 | $this->loadTranslationsFrom(module_path($this->moduleName, '$PATH_LANG$'), $this->moduleNameLower); 94 | $this->loadJsonTranslationsFrom(module_path($this->moduleName, '$PATH_LANG$'), $this->moduleNameLower); 95 | } 96 | } 97 | 98 | /** 99 | * Get the services provided by the provider. 100 | * 101 | * @return array 102 | */ 103 | public function provides() 104 | { 105 | return []; 106 | } 107 | 108 | private function getPublishableViewPaths(): array 109 | { 110 | $paths = []; 111 | foreach (\Config::get('view.paths') as $path) { 112 | if (is_dir($path . '/modules/' . $this->moduleNameLower)) { 113 | $paths[] = $path . '/modules/' . $this->moduleNameLower; 114 | } 115 | } 116 | return $paths; 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /src/Publish/stubs/nwidart-stubs/seeder.stub: -------------------------------------------------------------------------------- 1 | call("OthersTableSeeder"); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/Publish/stubs/nwidart-stubs/unit-test.stub: -------------------------------------------------------------------------------- 1 | assertTrue(true); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/Publish/stubs/nwidart-stubs/views/index.stub: -------------------------------------------------------------------------------- 1 | @extends('$LOWER_NAME$::layouts.master') 2 | 3 | @section('content') 4 |

Hello World

5 | 6 |

7 | This view is loaded from module: {!! config('$LOWER_NAME$.name') !!} 8 |

9 | @endsection 10 | -------------------------------------------------------------------------------- /src/Publish/stubs/nwidart-stubs/views/master.stub: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Module $STUDLY_NAME$ 8 | 9 | {{-- Laravel Mix - CSS File --}} 10 | {{-- --}} 11 | 12 | 13 | 14 | @yield('content') 15 | 16 | {{-- Laravel Mix - JS File --}} 17 | {{-- --}} 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/Publish/stubs/nwidart-stubs/webpack.stub: -------------------------------------------------------------------------------- 1 | const dotenvExpand = require('dotenv-expand'); 2 | dotenvExpand(require('dotenv').config({ path: '../../.env'/*, debug: true*/})); 3 | 4 | const mix = require('laravel-mix'); 5 | require('laravel-mix-merge-manifest'); 6 | 7 | mix.setPublicPath('../../public').mergeManifest(); 8 | 9 | mix.js(__dirname + '/Resources/assets/js/app.js', 'js/$LOWER_NAME$.js') 10 | .sass( __dirname + '/Resources/assets/sass/app.scss', 'css/$LOWER_NAME$.css'); 11 | 12 | if (mix.inProduction()) { 13 | mix.version(); 14 | } 15 | -------------------------------------------------------------------------------- /src/Publish/tailwind.config.js: -------------------------------------------------------------------------------- 1 | const plugin = require("tailwindcss/plugin"); 2 | const colors = require("tailwindcss/colors"); 3 | 4 | module.exports = { 5 | content: [ 6 | "./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php", 7 | "./storage/framework/views/*.php", 8 | "./resources/views/**/*.blade.php", 9 | "./resources/js/**/*.vue", 10 | "./Modules/**/Resources/views/**/*.vue", 11 | "./Modules/**/Services/Rows/Render/**/*.vue", 12 | "./Modules/**/Services/Rows/Render/**/**/*.vue", 13 | "./Modules/**/Resources/views/**/*.js", 14 | './resources/js/**/*.js', 15 | ], 16 | darkMode: "class", // or 'media' or 'class' 17 | theme: { 18 | asideScrollbars: { 19 | light: "light", 20 | gray: "gray", 21 | }, 22 | extend: { 23 | colors: { 24 | danger: colors.rose, 25 | primary: colors.orange, 26 | success: colors.green, 27 | warning: colors.amber, 28 | black: colors.black, 29 | }, 30 | zIndex: { 31 | "-1": "-1", 32 | }, 33 | flexGrow: { 34 | 5: "5", 35 | }, 36 | maxHeight: { 37 | "screen-menu": "calc(100vh - 3.5rem)", 38 | modal: "calc(100vh - 160px)", 39 | }, 40 | transitionProperty: { 41 | position: "right, left, top, bottom, margin, padding", 42 | textColor: "color", 43 | }, 44 | keyframes: { 45 | "fade-out": { 46 | from: { opacity: 1 }, 47 | to: { opacity: 0 }, 48 | }, 49 | "fade-in": { 50 | from: { opacity: 0 }, 51 | to: { opacity: 1 }, 52 | }, 53 | }, 54 | animation: { 55 | "fade-out": "fade-out 250ms ease-in-out", 56 | "fade-in": "fade-in 250ms ease-in-out", 57 | }, 58 | }, 59 | }, 60 | plugins: [ 61 | require("@tailwindcss/forms"), 62 | require("@tailwindcss/typography"), 63 | plugin(function ({ matchUtilities, theme }) { 64 | matchUtilities( 65 | { 66 | "aside-scrollbars": (value) => { 67 | const track = value === "light" ? "100" : "900"; 68 | const thumb = value === "light" ? "300" : "600"; 69 | const color = value === "light" ? "gray" : value; 70 | 71 | return { 72 | scrollbarWidth: "thin", 73 | scrollbarColor: `${theme(`colors.${color}.${thumb}`)} ${theme( 74 | `colors.${color}.${track}` 75 | )}`, 76 | "&::-webkit-scrollbar": { 77 | width: "8px", 78 | height: "8px", 79 | }, 80 | "&::-webkit-scrollbar-track": { 81 | backgroundColor: theme(`colors.${color}.${track}`), 82 | }, 83 | "&::-webkit-scrollbar-thumb": { 84 | borderRadius: "0.25rem", 85 | backgroundColor: theme(`colors.${color}.${thumb}`), 86 | }, 87 | }; 88 | }, 89 | }, 90 | { values: theme("asideScrollbars") } 91 | ); 92 | }), 93 | require("@tailwindcss/line-clamp"), 94 | require("tailwindcss-rtl"), 95 | ], 96 | }; 97 | -------------------------------------------------------------------------------- /src/Publish/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig, loadEnv } from "vite"; 2 | import laravel from "laravel-vite-plugin"; 3 | import vue from "@vitejs/plugin-vue"; 4 | import { homedir } from "os"; 5 | import { resolve } from "path"; 6 | import fs from "fs"; 7 | 8 | export default ({ mode }) => { 9 | process.env = Object.assign(process.env, loadEnv(mode, process.cwd(), '')); 10 | 11 | function serverData(host){ 12 | /* 13 | Use only if using laravel-valet to manage server 14 | */ 15 | let keyPath = resolve(homedir(), `.config/valet/Certificates/${host}.key`); 16 | let certificatePath = resolve(homedir(), `.config/valet/Certificates/${host}.crt`); 17 | 18 | if (!fs.existsSync(keyPath)) { 19 | return {}; 20 | } 21 | 22 | if (!fs.existsSync(certificatePath)) { 23 | return {}; 24 | } 25 | 26 | return { 27 | hmr: { host }, 28 | host, 29 | https: { 30 | key: fs.readFileSync(keyPath), 31 | cert: fs.readFileSync(certificatePath), 32 | }, 33 | }; 34 | } 35 | 36 | return defineConfig({ 37 | resolve:{ 38 | alias:{ 39 | '$$' : resolve(__dirname, './Modules/'+process.env.THEME_MODULE+'/Resources/views/Rows'), 40 | '@@' : resolve(__dirname, './Modules/'+process.env.THEME_MODULE+'/Resources/views'), 41 | }, 42 | }, 43 | plugins: [ 44 | laravel([ 45 | "resources/js/app.js" 46 | ]), 47 | vue({ 48 | template: { 49 | transformAssetUrls: { 50 | base: null, 51 | includeAbsolute: false, 52 | }, 53 | }, 54 | }), 55 | ], 56 | css: { 57 | postCss: { 58 | plugins: { 59 | tailwindcss: {}, 60 | autoprefixer: {}, 61 | }, 62 | }, 63 | }, 64 | server: serverData(process.env.APP_URL.replace('https://','')) 65 | }); 66 | } 67 | -------------------------------------------------------------------------------- /src/ViltServiceProvider.php: -------------------------------------------------------------------------------- 1 | commands([ 18 | InstallVilt::class 19 | ]); 20 | } 21 | 22 | /** 23 | * Bootstrap any application services. 24 | * 25 | * @return void 26 | */ 27 | public function boot() 28 | { 29 | // 30 | } 31 | } 32 | --------------------------------------------------------------------------------