├── resources └── views │ ├── components │ ├── dropdown-link.blade.php │ ├── checkbox.blade.php │ ├── label.blade.php │ ├── button.blade.php │ ├── danger-button.blade.php │ ├── input.blade.php │ ├── secondary-button.blade.php │ ├── section-border.blade.php │ ├── input-error.blade.php │ ├── action-section.blade.php │ ├── nav-link.blade.php │ ├── section-title.blade.php │ ├── authentication-card.blade.php │ ├── dropdown.blade.php │ ├── validation-errors.blade.php │ ├── responsive-nav-link.blade.php │ ├── application-mark.blade.php │ ├── form-section.blade.php │ ├── dialog-modal.blade.php │ ├── confirmation-modal.blade.php │ ├── action-message.blade.php │ ├── switchable-team.blade.php │ ├── modal.blade.php │ ├── application-logo.blade.php │ ├── authentication-card-logo.blade.php │ ├── confirms-password.blade.php │ └── banner.blade.php │ └── emails │ └── team-invitation.blade.php ├── .gitignore ├── stubs ├── app.js ├── livewire │ └── resources │ │ └── views │ │ ├── teams │ │ ├── create.blade.php │ │ ├── show.blade.php │ │ ├── create-team-form.blade.php │ │ ├── delete-team-form.blade.php │ │ ├── update-team-name-form.blade.php │ │ └── team-member-manager.blade.php │ │ ├── api │ │ ├── index.blade.php │ │ └── api-token-manager.blade.php │ │ ├── policy.blade.php │ │ ├── terms.blade.php │ │ ├── profile │ │ ├── show.blade.php │ │ ├── update-password-form.blade.php │ │ ├── delete-user-form.blade.php │ │ ├── update-profile-information-form.blade.php │ │ ├── two-factor-authentication-form.blade.php │ │ └── logout-other-browser-sessions-form.blade.php │ │ └── auth │ │ ├── verify-email.blade.php │ │ ├── confirm-password.blade.php │ │ ├── forgot-password.blade.php │ │ ├── two-factor-challenge.blade.php │ │ ├── reset-password.blade.php │ │ ├── login.blade.php │ │ └── register.blade.php ├── vite.config.js └── package.json ├── phpunit.xml ├── src ├── Themeselection │ └── Jetstrap │ │ ├── Jetstrap.php │ │ ├── JetstrapServiceProvider.php │ │ └── Console │ │ └── InstallCommand.php └── Pixinvent │ └── Jetstrap │ └── Console │ └── InstallCommand.php ├── LICENSE ├── tests ├── InstallCommandTest.php └── TestCase.php ├── composer.json ├── README.md └── .gitattributes /resources/views/components/dropdown-link.blade.php: -------------------------------------------------------------------------------- 1 | merge(['class' => 'dropdown-item']) }}>{{ $slot }} 2 | -------------------------------------------------------------------------------- /resources/views/components/checkbox.blade.php: -------------------------------------------------------------------------------- 1 | merge(['class' => 'form-check-input']) !!}> 2 | -------------------------------------------------------------------------------- /resources/views/components/label.blade.php: -------------------------------------------------------------------------------- 1 | @props(['value']) 2 | 3 | 6 | -------------------------------------------------------------------------------- /resources/views/components/button.blade.php: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | /.idea 3 | /node_modules 4 | /vendor 5 | .phpunit.result.cache 6 | composer.lock 7 | mix-manifest.json 8 | npm-debug.log 9 | package-lock.json 10 | -------------------------------------------------------------------------------- /stubs/app.js: -------------------------------------------------------------------------------- 1 | /* 2 | Add custom scripts here 3 | */ 4 | 5 | import.meta.glob([ 6 | '../assets/img/**', 7 | // '../assets/json/**', 8 | '../assets/vendor/fonts/**' 9 | ]); -------------------------------------------------------------------------------- /resources/views/components/danger-button.blade.php: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /resources/views/components/input.blade.php: -------------------------------------------------------------------------------- 1 | @props(['disabled' => false]) 2 | 3 | merge(['class' => 'form-control']) !!}> 4 | -------------------------------------------------------------------------------- /resources/views/components/secondary-button.blade.php: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /resources/views/components/section-border.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
-------------------------------------------------------------------------------- /resources/views/components/input-error.blade.php: -------------------------------------------------------------------------------- 1 | @props(['for']) 2 | 3 | @error($for) 4 | merge(['class' => 'invalid-feedback']) }} role="alert"> 5 | {{ $message }} 6 | 7 | @enderror 8 | -------------------------------------------------------------------------------- /resources/views/components/action-section.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |
{{ $title }}
4 |

{{ $description }}

5 |
6 |
{{ $content }}
7 |
-------------------------------------------------------------------------------- /resources/views/components/nav-link.blade.php: -------------------------------------------------------------------------------- 1 | @props(['active']) 2 | 3 | @php 4 | $classes = $active ?? false ? 'nav-link active fw-medium' : 'nav-link'; 5 | @endphp 6 | 7 | 12 | -------------------------------------------------------------------------------- /resources/views/components/section-title.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |

{{ $title }}

4 | 5 |

{{ $description }}

6 |
7 | 8 |
{{ $aside ?? '' }}
9 |
-------------------------------------------------------------------------------- /stubs/livewire/resources/views/teams/create.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.layoutMaster') 2 | @php 3 | use Illuminate\Support\Facades\Gate; 4 | $breadcrumbs = [['link' => 'home', 'name' => 'Home'], ['name' => 'Create Team']]; 5 | @endphp 6 | @section('title', 'Create Team') 7 | 8 | @section('content') 9 | @livewire('teams.create-team-form') 10 | @endsection 11 | -------------------------------------------------------------------------------- /resources/views/components/authentication-card.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | {{ $logo }} 6 |
7 | 8 |
9 | {{ $slot }} 10 |
11 |
12 |
13 |
14 | -------------------------------------------------------------------------------- /resources/views/components/dropdown.blade.php: -------------------------------------------------------------------------------- 1 | @props(['id' => 'navbarDropdown']) 2 | 3 | 12 | -------------------------------------------------------------------------------- /resources/views/components/validation-errors.blade.php: -------------------------------------------------------------------------------- 1 | @if ($errors->any()) 2 |
merge(['class' => 'alert alert-danger']) !!} role="alert"> 3 |
4 |
{{ __('Whoops! Something went wrong.') }}
5 | 6 | 11 |
12 |
13 | @endif 14 | -------------------------------------------------------------------------------- /stubs/livewire/resources/views/api/index.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts/layoutMaster') 2 | 3 | @php 4 | $breadcrumbs = [['link' => 'home', 'name' => 'Home'], ['name' => 'API Tokens']]; 5 | @endphp 6 | 7 | @section('title', 'API Tokens') 8 | 9 | 10 | @section('page-style') 11 | @vite([ 12 | 'resources/assets/vendor/scss/pages/page-auth.scss' 13 | ]) 14 | @endsection 15 | 16 | @section('content') 17 | @livewire('api.api-token-manager') 18 | @endsection 19 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | ./tests 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /resources/views/components/responsive-nav-link.blade.php: -------------------------------------------------------------------------------- 1 | @props(['active']) 2 | 3 | @php 4 | $classes = ($active ?? false) 5 | ? 'd-block w-100 ps-1 pe-2 py-2 border-start border-primary text-left fw-medium text-primary bg-light-primary' 6 | : 'd-block w-100 ps-1 pe-2 py-2 border-start border-transparent text-left fw-medium text-body'; 7 | @endphp 8 | 9 | merge(['class' => $classes]) }}> 10 | {{ $slot }} 11 | 12 | -------------------------------------------------------------------------------- /resources/views/components/application-mark.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /resources/views/components/form-section.blade.php: -------------------------------------------------------------------------------- 1 | @props(['submit']) 2 | 3 |
4 |
5 |
{{ $title }}
6 |

{{ $description }}

7 |
8 |
9 |
10 | {{ $form }} 11 | @if (isset($actions)) 12 |
13 | {{ $actions }} 14 |
15 | @endif 16 |
17 |
18 |
19 | -------------------------------------------------------------------------------- /resources/views/components/dialog-modal.blade.php: -------------------------------------------------------------------------------- 1 | @props(['id' => null, 'maxWidth' => null]) 2 | 3 | 4 | 16 | 17 | -------------------------------------------------------------------------------- /resources/views/components/confirmation-modal.blade.php: -------------------------------------------------------------------------------- 1 | @props(['id' => null, 'maxWidth' => null]) 2 | 3 | 4 | 16 | 17 | -------------------------------------------------------------------------------- /resources/views/components/action-message.blade.php: -------------------------------------------------------------------------------- 1 | @props(['on']) 2 | 3 | 13 | -------------------------------------------------------------------------------- /stubs/livewire/resources/views/teams/show.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.layoutMaster') 2 | 3 | @php 4 | use Illuminate\Support\Facades\Gate; 5 | $breadcrumbs = [['link' => 'home', 'name' => 'Home'], ['name' => 'Team Settings']]; 6 | @endphp 7 | 8 | @section('title', 'Team Settings') 9 | 10 | @section('content') 11 |
12 | @livewire('teams.update-team-name-form', ['team' => $team]) 13 |
14 | 15 | @livewire('teams.team-member-manager', ['team' => $team]) 16 | 17 | 18 | @if (Gate::check('delete', $team) && !$team->personal_team) 19 | 20 |
21 | @livewire('teams.delete-team-form', ['team' => $team]) 22 |
23 | @endif 24 | @endsection 25 | -------------------------------------------------------------------------------- /src/Themeselection/Jetstrap/Jetstrap.php: -------------------------------------------------------------------------------- 1 | presets = Presets::CORE_UI_3; 20 | 21 | return $this; 22 | } 23 | 24 | /** 25 | * Use Core Ui presets 26 | * 27 | * @return $this 28 | */ 29 | public function useAdminLte3(): Jetstrap 30 | { 31 | $this->presets = Presets::ADMIN_LTE_3; 32 | 33 | return $this; 34 | } 35 | 36 | /** 37 | * Get preset name 38 | * 39 | * @return false|string 40 | */ 41 | public function getPreset() 42 | { 43 | return $this->presets === '' ? false : $this->presets; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /resources/views/components/switchable-team.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Illuminate\Support\Facades\Auth; 3 | @endphp 4 | 5 | @props(['team', 'component' => 'dropdown-link']) 6 | 7 |
8 | @method('PUT') 9 | @csrf 10 | 11 | 12 | 13 | 14 | 16 |
17 | @if (Auth::user()->isCurrentTeam($team)) 18 | 20 | 21 | 22 | @endif 23 | 24 |
{{ $team->name }}
25 |
26 |
27 |
28 | -------------------------------------------------------------------------------- /resources/views/emails/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 | -------------------------------------------------------------------------------- /stubs/livewire/resources/views/policy.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | $configData = Helper::appClasses(); 3 | $customizerHidden = 'customizer-hide'; 4 | @endphp 5 | 6 | @extends('layouts/blankLayout') 7 | 8 | @section('title', 'Login') 9 | 10 | @section('page-style') 11 | 12 | @vite('resources/assets/vendor/scss/pages/page-auth.scss') 13 | @endsection 14 | 15 | @section('content') 16 |
17 |
18 | 19 | 25 | 26 |
27 |
28 | {!! $policy !!} 29 |
30 |
31 |
32 |
33 | @endsection 34 | -------------------------------------------------------------------------------- /stubs/livewire/resources/views/terms.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | $configData = Helper::appClasses(); 3 | $customizerHidden = 'customizer-hide'; 4 | @endphp 5 | 6 | @extends('layouts/blankLayout') 7 | 8 | @section('title', 'Login') 9 | 10 | @section('page-style') 11 | 12 | @vite('resources/assets/vendor/scss/pages/page-auth.scss') 13 | @endsection 14 | 15 | @section('content') 16 |
17 |
18 | 19 | 25 | 26 |
27 |
28 | {!! $terms !!} 29 |
30 |
31 |
32 |
33 | @endsection 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Themeselection 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /stubs/livewire/resources/views/profile/show.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.layoutMaster') 2 | 3 | @php 4 | $breadcrumbs = [['link' => 'home', 'name' => 'Home'], ['link' => 'javascript:void(0)', 'name' => 'User'], ['name' => 'Profile']]; 5 | @endphp 6 | 7 | @section('title', 'Profile') 8 | 9 | 10 | @section('content') 11 | 12 | @if (Laravel\Fortify\Features::canUpdateProfileInformation()) 13 |
14 | @livewire('profile.update-profile-information-form') 15 |
16 | @endif 17 | 18 | @if (Laravel\Fortify\Features::enabled(Laravel\Fortify\Features::updatePasswords())) 19 |
20 | @livewire('profile.update-password-form') 21 |
22 | @endif 23 | 24 | @if (Laravel\Fortify\Features::canManageTwoFactorAuthentication()) 25 |
26 | @livewire('profile.two-factor-authentication-form') 27 |
28 | @endif 29 | 30 |
31 | @livewire('profile.logout-other-browser-sessions-form') 32 |
33 | 34 | @if (Laravel\Jetstream\Jetstream::hasAccountDeletionFeatures()) 35 | @livewire('profile.delete-user-form') 36 | @endif 37 | 38 | @endsection 39 | -------------------------------------------------------------------------------- /tests/InstallCommandTest.php: -------------------------------------------------------------------------------- 1 | artisan('jetstream_master:swap livewire') 14 | ->expectsOutput('Bootstrap scaffolding swapped for livewire successfully.') 15 | ->expectsOutput('Please execute the "npm install && npm run build" command to build your assets.') 16 | ->assertExitCode(0); 17 | 18 | $this->basicTests(); 19 | $this->basicLivewireTests(); 20 | } 21 | 22 | /** @test */ 23 | public function livewire_swapped_with_teams() 24 | { 25 | // Run the make command 26 | $this->artisan('jetstream_master:swap livewire --teams') 27 | ->expectsOutput('Bootstrap scaffolding swapped for livewire successfully.') 28 | ->expectsOutput('Please execute the "npm install && npm run build" command to build your assets.') 29 | ->assertExitCode(0); 30 | 31 | $this->basicTests(); 32 | $this->basicLivewireTests(); 33 | $this->livewireTeamTests(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /resources/views/components/modal.blade.php: -------------------------------------------------------------------------------- 1 | @props(['id', 'maxWidth', 'modal' => false]) 2 | 3 | @php 4 | $id = $id ?? md5($attributes->wire('model')); 5 | 6 | switch ($maxWidth ?? '') { 7 | case 'sm': 8 | $maxWidth = ' modal-sm'; 9 | break; 10 | case 'md': 11 | $maxWidth = ''; 12 | break; 13 | case 'lg': 14 | $maxWidth = ' modal-lg'; 15 | break; 16 | case 'xl': 17 | $maxWidth = ' modal-xl'; 18 | break; 19 | case '2xl': 20 | default: 21 | $maxWidth = ''; 22 | break; 23 | } 24 | @endphp 25 | 26 | 27 | 48 | -------------------------------------------------------------------------------- /resources/views/components/application-logo.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "themeselection/master-laravel-bootstrap-jetstream", 3 | "description": "A Laravel 11 package to easily switch TailwindCSS resources generated by Laravel Jetstream to Bootstrap 5.", 4 | "keywords": [ 5 | "laravel", 6 | "bootstrap", 7 | "jetstream" 8 | ], 9 | "license": "MIT", 10 | "authors": [ 11 | { 12 | "name": "Themeselection", 13 | "email": "hello@themeselection.com", 14 | "role": "Developer" 15 | } 16 | ], 17 | "require": { 18 | "php": "^8.2" 19 | }, 20 | "require-dev": { 21 | "laravel/jetstream": "^4.0", 22 | "orchestra/testbench": "^8.3.0", 23 | "phpunit/phpunit": "^10.1" 24 | }, 25 | "autoload": { 26 | "psr-4": { 27 | "Themeselection\\Jetstrap\\": "src/Themeselection/Jetstrap/" 28 | } 29 | }, 30 | "autoload-dev": { 31 | "psr-4": { 32 | "Themeselection\\Jetstrap\\Tests\\": "tests/" 33 | } 34 | }, 35 | "extra": { 36 | "laravel": { 37 | "providers": [ 38 | "Themeselection\\Jetstrap\\JetstrapServiceProvider" 39 | ], 40 | "aliases": { 41 | "Jetstrap": "Themeselection\\Jetstrap\\JetstrapFacade" 42 | } 43 | } 44 | }, 45 | "config": { 46 | "sort-packages": true 47 | }, 48 | "minimum-stability": "dev", 49 | "prefer-stable": true, 50 | "scripts": { 51 | "tests": "vendor/bin/phpunit", 52 | "testsVerbose": "@tests -vvv" 53 | } 54 | } -------------------------------------------------------------------------------- /src/Themeselection/Jetstrap/JetstrapServiceProvider.php: -------------------------------------------------------------------------------- 1 | app->bind('jetstrap', function ($app) { 17 | return new Jetstrap; 18 | }); 19 | } 20 | 21 | /** 22 | * Bootstrap any application services. 23 | * 24 | * @return void 25 | */ 26 | public function boot() 27 | { 28 | $this->configurePublishing(); 29 | $this->configureCommands(); 30 | } 31 | 32 | /** 33 | * Configure publishing for the package. 34 | * 35 | * @return void 36 | */ 37 | protected function configurePublishing() 38 | { 39 | if (!$this->app->runningInConsole()) { 40 | return; 41 | } 42 | 43 | $this->publishes([ 44 | __DIR__ . '/../../../resources/views' => resource_path('views'), 45 | ], 'jetstrap-views'); 46 | } 47 | 48 | /** 49 | * Configure the commands offered by the application. 50 | * 51 | * @return void 52 | */ 53 | protected function configureCommands() 54 | { 55 | if (!$this->app->runningInConsole()) { 56 | return; 57 | } 58 | 59 | $this->commands([ 60 | Console\InstallCommand::class, 61 | ]); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /stubs/livewire/resources/views/teams/create-team-form.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Illuminate\Support\Facades\Gate; 3 | @endphp 4 | 5 | 6 | {{ __('Team Details') }} 7 | 8 | 9 | 10 | {{ __('Create a new team to collaborate with others on projects.') }} 11 | 12 | 13 | 14 |
15 | 16 | 17 |
18 |
{{ $this->user->name }}
19 |
20 |
{{ $this->user->name }}
21 | {{ $this->user->email }} 22 |
23 |
24 |
25 | 26 |
27 | 28 | 30 | 31 |
32 |
33 | 34 | 35 | 36 | {{ __('Create') }} 37 | 38 | 39 |
40 | -------------------------------------------------------------------------------- /resources/views/components/authentication-card-logo.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | -------------------------------------------------------------------------------- /stubs/livewire/resources/views/teams/delete-team-form.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Illuminate\Support\Facades\Gate; 3 | @endphp 4 | 5 | 6 | {{ __('Delete Team') }} 7 | 8 | 9 | 10 | {{ __('Permanently delete this team.') }} 11 | 12 | 13 | 14 |

15 | {{ __('Once a team is deleted, all of its resources and data will be permanently deleted. Before deleting this team, please download any data or information regarding this team that you wish to retain.') }} 16 |

17 | 18 | 19 | {{ __('Delete Team') }} 20 | 21 | 22 | 23 | 24 | 25 | {{ __('Delete Team') }} 26 | 27 | 28 | 29 | {{ __('Are you sure you want to delete this team? Once a team is deleted, all of its resources and data will be permanently deleted.') }} 30 | 31 | 32 | 33 | 34 | {{ __('Cancel') }} 35 | 36 | 37 | 38 | {{ __('Delete Team') }} 39 | 40 | 41 | 42 |
43 |
44 | -------------------------------------------------------------------------------- /stubs/livewire/resources/views/profile/update-password-form.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{ __('Update Password') }} 4 | 5 | 6 | 7 | {{ __('Ensure your account is using a long, random password to stay secure.') }} 8 | 9 | 10 | 11 |
12 | 13 | 16 | 17 |
18 | 19 |
20 | 21 | 23 | 24 |
25 | 26 |
27 | 28 | 31 | 32 |
33 |
34 | 35 | 36 | 37 | 38 | {{ __('Save') }} 39 | 40 | 41 |
42 | -------------------------------------------------------------------------------- /stubs/livewire/resources/views/teams/update-team-name-form.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Illuminate\Support\Facades\Gate; 3 | @endphp 4 | 5 | 6 | {{ __('Team Name') }} 7 | 8 | 9 | 10 | {{ __('The team\'s name and owner information.') }} 11 | 12 | 13 | 14 | 15 | {{ __('Saved.') }} 16 | 17 | 18 | 19 |
20 | 21 | 22 |
23 |
{{ $team->owner->name }}
24 |
25 |
{{ $team->owner->name }}
26 | {{ $team->owner->email }} 27 |
28 |
29 |
30 | 31 | 32 |
33 | 34 | 35 | 36 | 37 | 38 |
39 |
40 | 41 | @if (Gate::check('update', $team)) 42 | 43 |
44 | 45 | {{ __('Save') }} 46 | 47 |
48 |
49 | @endif 50 |
-------------------------------------------------------------------------------- /resources/views/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') }} x-data x-ref="span" 8 | x-on:click="$wire.startConfirmingPassword('{{ $confirmableId }}')" 9 | x-on:password-confirmed.window="setTimeout(() => $event.detail.id === '{{ $confirmableId }}' && $refs.span.dispatchEvent(new CustomEvent('then', { bubbles: false })), 250);"> 10 | {{ $slot }} 11 | 12 | 13 | @once 14 | 15 | 16 | {{ $title }} 17 | 18 | 19 | 20 | {{ $content }} 21 | 22 |
24 | 27 | 28 | 29 |
30 |
31 | 32 | 33 | 34 | {{ __('Cancel') }} 35 | 36 | 37 | 38 | {{ $button }} 39 | 40 | 41 |
42 | @endonce 43 | -------------------------------------------------------------------------------- /stubs/livewire/resources/views/profile/delete-user-form.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{ __('Delete Account') }} 4 | 5 | 6 | 7 | {{ __('Permanently delete your account.') }} 8 | 9 | 10 | 11 |
12 | {{ __('Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.') }} 13 |
14 | 15 |
16 | 17 | {{ __('Delete Account') }} 18 | 19 |
20 | 21 | 22 | 23 | 24 | {{ __('Delete Account') }} 25 | 26 | 27 | 28 | {{ __('Are you sure you want to delete your account? Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.') }} 29 | 30 |
32 | 35 | 36 | 37 |
38 |
39 | 40 | 41 | 42 | {{ __('Cancel') }} 43 | 44 | 45 | 46 | {{ __('Delete Account') }} 47 | 48 | 49 |
50 |
51 | 52 |
53 | -------------------------------------------------------------------------------- /stubs/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import laravel from 'laravel-vite-plugin'; 3 | import html from '@rollup/plugin-html'; 4 | import { glob } from 'glob'; 5 | 6 | /** 7 | * Get Files from a directory 8 | * @param {string} query 9 | * @returns array 10 | */ 11 | function GetFilesArray(query) { 12 | return glob.sync(query); 13 | } 14 | /** 15 | * Js Files 16 | */ 17 | // Page JS Files 18 | const pageJsFiles = GetFilesArray('resources/assets/js/*.js'); 19 | 20 | // Processing Vendor JS Files 21 | const vendorJsFiles = GetFilesArray('resources/assets/vendor/js/*.js'); 22 | 23 | // Processing Libs JS Files 24 | const LibsJsFiles = GetFilesArray('resources/assets/vendor/libs/**/*.js'); 25 | 26 | /** 27 | * Scss Files 28 | */ 29 | // Processing Core, Themes & Pages Scss Files 30 | const CoreScssFiles = GetFilesArray('resources/assets/vendor/scss/**/!(_)*.scss'); 31 | 32 | // Processing Libs Scss & Css Files 33 | const LibsScssFiles = GetFilesArray('resources/assets/vendor/libs/**/!(_)*.scss'); 34 | const LibsCssFiles = GetFilesArray('resources/assets/vendor/libs/**/*.css'); 35 | 36 | // Processing Fonts Scss Files 37 | const FontsScssFiles = GetFilesArray('resources/assets/vendor/fonts/!(_)*.scss'); 38 | 39 | // Processing Window Assignment for Libs like jKanban, pdfMake 40 | function libsWindowAssignment() { 41 | return { 42 | name: 'libsWindowAssignment', 43 | 44 | transform(src, id) { 45 | if (id.includes('jkanban.js')) { 46 | return src.replace('this.jKanban', 'window.jKanban'); 47 | } else if (id.includes('vfs_fonts')) { 48 | return src.replaceAll('this.pdfMake', 'window.pdfMake'); 49 | } 50 | } 51 | }; 52 | } 53 | 54 | export default defineConfig({ 55 | plugins: [ 56 | laravel({ 57 | input: [ 58 | 'resources/css/app.css', 59 | 'resources/assets/css/demo.css', 60 | 'resources/js/app.js', 61 | ...pageJsFiles, 62 | ...vendorJsFiles, 63 | ...LibsJsFiles, 64 | 'resources/js/laravel-user-management.js', // Processing Laravel User Management CRUD JS File 65 | ...CoreScssFiles, 66 | ...LibsScssFiles, 67 | ...LibsCssFiles, 68 | ...FontsScssFiles 69 | ], 70 | refresh: true 71 | }), 72 | html(), 73 | libsWindowAssignment() 74 | ] 75 | }); 76 | -------------------------------------------------------------------------------- /stubs/livewire/resources/views/profile/update-profile-information-form.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{ __('Profile Information') }} 4 | 5 | 6 | 7 | {{ __('Update your account\'s profile information and email address.') }} 8 | 9 | 10 | 11 | 12 | 13 | {{ __('Saved.') }} 14 | 15 | 16 | 17 | @if (Laravel\Jetstream\Jetstream::managesProfilePhotos()) 18 |
19 | 20 | 22 | 23 | 24 |
25 | 26 |
27 | 28 | 29 |
30 | 31 |
32 | 33 | 34 | {{ __('Select A New Photo') }} 35 | 36 | 37 | @if ($this->user->profile_photo_path) 38 | 41 | @endif 42 | 43 | 44 |
45 | @endif 46 | 47 | 48 |
49 | 50 | 52 | 53 |
54 | 55 | 56 |
57 | 58 | 60 | 61 |
62 |
63 | 64 | 65 |
66 | 67 | {{ __('Save') }} 68 | 69 |
70 |
71 |
72 | -------------------------------------------------------------------------------- /resources/views/components/banner.blade.php: -------------------------------------------------------------------------------- 1 | @props(['style' => session('flash.bannerStyle', 'success'), 'message' => session('flash.banner')]) 2 | 3 | 44 | -------------------------------------------------------------------------------- /stubs/livewire/resources/views/auth/verify-email.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Illuminate\Support\Facades\Route; 3 | use Illuminate\Support\Facades\Auth; 4 | $configData = Helper::appClasses(); 5 | $customizerHidden = 'customizer-hide'; 6 | @endphp 7 | 8 | @extends('layouts/blankLayout') 9 | 10 | @section('title', 'Verify Email') 11 | 12 | @section('page-style') 13 | 14 | @vite('resources/assets/vendor/scss/pages/page-auth.scss') 15 | @endsection 16 | 17 | @section('content') 18 |
19 |
20 | 21 | 22 |
23 |
24 | Auth Cover Bg color 25 |
26 |

Your frest starts here 👩🏻‍💻

27 |

28 | Connects to the mail server and checks
29 | whether the mailbox exists or not. 30 |

31 |
32 |
33 |
34 | 35 | 36 | 37 |
38 |
39 | 40 | 46 | 47 | 48 |

Verify your email ✉️

49 | 50 | @if (session('status') == 'verification-link-sent') 51 | 56 | @endif 57 |

58 | Account activation link sent to your email address: {{Auth::user()->email}} Please follow the link inside to continue. 59 |

60 |
61 |
62 | @csrf 63 | 64 |
65 | 66 |
67 | @csrf 68 | 69 |
70 |
71 |
72 |
73 | 74 |
75 |
76 | @endsection -------------------------------------------------------------------------------- /stubs/livewire/resources/views/auth/confirm-password.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Illuminate\Support\Facades\Route; 3 | $configData = Helper::appClasses(); 4 | $customizerHidden = 'customizer-hide'; 5 | @endphp 6 | 7 | @extends('layouts/blankLayout') 8 | 9 | @section('title', 'Confirm Password') 10 | 11 | @section('page-style') 12 | 13 | @vite('resources/assets/vendor/scss/pages/page-auth.scss') 14 | @endsection 15 | 16 | @section('content') 17 |
18 |
19 | 20 |
21 |
22 | Auth Cover Bg color 23 |
24 |

Confirm password 👩🏻‍💻

25 |

26 | Please confirm password for security reasons or
reset it by clicking on forgot password. 27 |

28 |
29 |
30 |
31 | 32 | 33 |
34 |
35 | 36 | 42 | 43 |

Confirm Password

44 |

Please confirm your password before continuing.

45 |

Enter your password

46 |
47 | @csrf 48 |
49 |
50 | 51 | 52 | 53 | 54 |
55 | @error('password') 56 | 57 | {{ $message }} 58 | 59 | @enderror 60 |
61 | 62 |
63 |
64 |
65 | 66 |
67 |
68 | @endsection -------------------------------------------------------------------------------- /stubs/livewire/resources/views/auth/forgot-password.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Illuminate\Support\Facades\Route; 3 | $configData = Helper::appClasses(); 4 | $customizerHidden = 'customizer-hide'; 5 | @endphp 6 | 7 | @extends('layouts/blankLayout') 8 | 9 | @section('title', 'Forgot Password') 10 | 11 | @section('page-style') 12 | 13 | @vite('resources/assets/vendor/scss/pages/page-auth.scss') 14 | @endsection 15 | 16 | @section('content') 17 |
18 |
19 | 20 |
21 |
22 | Auth Cover Bg color 23 |
24 |

No worries, we will send you instructions 👩🏻‍💻

25 |

26 | We can help you reset your password and security info. First, enter
your email address and click on send reset link. 27 |

28 |
29 |
30 |
31 | 32 | 33 |
34 |
35 | 36 | 42 | 43 |

Forgot Password? 🔒

44 |

Enter your email and we'll send you instructions to reset your password

45 | 46 | @if (session('status')) 47 |
48 | {{ session('status') }} 49 |
50 | @endif 51 | 52 |
53 | @csrf 54 |
55 | 56 | 57 | @error('email') 58 | 59 | {{ $message }} 60 | 61 | @enderror 62 |
63 | 64 |
65 |
66 | @if (Route::has('login')) 67 | 68 | 69 | Back to login 70 | 71 | @endif 72 |
73 |
74 |
75 | 76 |
77 |
78 | @endsection -------------------------------------------------------------------------------- /stubs/livewire/resources/views/auth/two-factor-challenge.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Illuminate\Support\Facades\Route; 3 | $configData = Helper::appClasses(); 4 | $customizerHidden = 'customizer-hide'; 5 | @endphp 6 | 7 | @extends('layouts/blankLayout') 8 | 9 | @section('title', '2 Factor Challenge') 10 | 11 | @section('page-style') 12 | 13 | @vite('resources/assets/vendor/scss/pages/page-auth.scss') 14 | @endsection 15 | 16 | @section('content') 17 |
18 |
19 | 20 | 21 |
22 |
23 | Auth Cover Bg color 24 |
25 |

Stronger security for your Account 👩🏻‍💻

26 |

27 | An extra layer of security. Most people only have one layer – their
password – to protect their account. With 2-Step Verification, 28 |

29 |
30 |
31 |
32 | 33 | 34 | 35 |
36 |
37 | 38 | 44 | 45 |

Two Step Verification 💬

46 |
47 |
48 | Please confirm access to your account by entering the authentication code provided by your authenticator application. 49 |
50 | 51 |
52 | Please confirm access to your account by entering one of your emergency recovery codes. 53 |
54 | 55 | 56 | 57 |
58 | @csrf 59 | 60 |
61 | 62 | 63 | 64 |
65 | 66 |
67 | 68 | 69 | 70 |
71 | 72 |
73 |
74 | 75 |
76 |
77 | 78 |
79 | Log in 80 |
81 |
82 |
83 |
84 |
85 | 86 |
87 |
88 | @endsection -------------------------------------------------------------------------------- /stubs/livewire/resources/views/profile/two-factor-authentication-form.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{ __('Two Factor Authentication') }} 4 | 5 | 6 | 7 | {{ __('Add additional security to your account using two factor authentication.') }} 8 | 9 | 10 | 11 |
12 | @if ($this->enabled) 13 | @if ($showingConfirmation) 14 | {{ __('You are enabling two factor authentication.') }} 15 | @else 16 | {{ __('You have enabled two factor authentication.') }} 17 | @endif 18 | @else 19 | {{ __('You have not enabled two factor authentication.') }} 20 | @endif 21 |
22 | 23 |

24 | {{ __('When two factor authentication is enabled, you will be prompted for a secure, random token during authentication. You may retrieve this token from your phone\'s Google Authenticator application.') }} 25 |

26 | 27 | @if ($this->enabled) 28 | @if ($showingQrCode) 29 |

30 | @if ($showingConfirmation) 31 | {{ __('Scan the following QR code using your phone\'s authenticator application and confirm it with the generated OTP code.') }} 32 | @else 33 | {{ __('Two factor authentication is now enabled. Scan the following QR code using your phone\'s authenticator application.') }} 34 | @endif 35 |

36 | 37 |
38 | {!! $this->user->twoFactorQrCodeSvg() !!} 39 |
40 | 41 |
42 |

43 | {{ __('Setup Key') }}: {{ decrypt($this->user->two_factor_secret) }} 44 |

45 |
46 | 47 | @if ($showingConfirmation) 48 |
49 | 50 | 53 | 54 |
55 | @endif 56 | @endif 57 | 58 | @if ($showingRecoveryCodes) 59 |

60 | {{ __('Store these recovery codes in a secure password manager. They can be used to recover access to your account if your two factor authentication device is lost.') }} 61 |

62 | 63 |
64 | @foreach (json_decode(decrypt($this->user->two_factor_recovery_codes), true) as $code) 65 |
{{ $code }}
66 | @endforeach 67 |
68 | @endif 69 | @endif 70 | 71 |
72 | @if (!$this->enabled) 73 | 74 | 75 | {{ __('Enable') }} 76 | 77 | 78 | @else 79 | @if ($showingRecoveryCodes) 80 | 81 | 82 | {{ __('Regenerate Recovery Codes') }} 83 | 84 | 85 | @elseif ($showingConfirmation) 86 | 87 | 88 | {{ __('Confirm') }} 89 | 90 | 91 | @else 92 | 93 | 94 | {{ __('Show Recovery Codes') }} 95 | 96 | 97 | @endif 98 | 99 | 100 | 101 | {{ __('Disable') }} 102 | 103 | 104 | @endif 105 |
106 |
107 |
108 | -------------------------------------------------------------------------------- /stubs/livewire/resources/views/profile/logout-other-browser-sessions-form.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{ __('Browser Sessions') }} 4 | 5 | 6 | 7 | {{ __('Manage and log out your active sessions on other browsers and devices.') }} 8 | 9 | 10 | 11 | 12 | {{ __('Done.') }} 13 | 14 | 15 |

16 | {{ __('If necessary, you may log out of all of your other browser sessions across all of your devices. Some of your recent sessions are listed below; however, this list may not be exhaustive. If you feel your account has been compromised, you should also update your password.') }} 17 |

18 | 19 | @if (count($this->sessions) > 0) 20 |
21 | 22 | @foreach ($this->sessions as $session) 23 |
24 |
25 | @if ($session->agent->isDesktop()) 26 | 28 | 30 | 31 | 32 | @else 33 | 36 | 37 | 38 | 39 | 40 | @endif 41 |
42 | 43 |
44 |
45 | {{ $session->agent->platform() ? $session->agent->platform() : 'Unknown' }} - 46 | {{ $session->agent->browser() ? $session->agent->browser() : 'Unknown' }} 47 |
48 | 49 |
50 |
51 | {{ $session->ip_address }}, 52 | 53 | @if ($session->is_current_device) 54 | {{ __('This device') }} 55 | @else 56 | {{ __('Last active') }} {{ $session->last_active }} 57 | @endif 58 |
59 |
60 |
61 |
62 | @endforeach 63 |
64 | @endif 65 | 66 |
67 | 68 | {{ __('Log Out Other Browser Sessions') }} 69 | 70 |
71 | 72 | 73 | 74 | 75 | {{ __('Log Out Other Browser Sessions') }} 76 | 77 | 78 | 79 | {{ __('Please enter your password to confirm you would like to log out of your other browser sessions across all of your devices.') }} 80 | 81 |
83 | 86 | 87 | 88 |
89 |
90 | 91 | 92 | 93 | {{ __('Cancel') }} 94 | 95 | 96 | 100 | 101 |
102 |
103 | 104 |
105 | -------------------------------------------------------------------------------- /stubs/livewire/resources/views/auth/reset-password.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Illuminate\Support\Facades\Route; 3 | $configData = Helper::appClasses(); 4 | $customizerHidden = 'customizer-hide'; 5 | @endphp 6 | 7 | @extends('layouts/blankLayout') 8 | 9 | @section('title', 'Reset Password') 10 | 11 | @section('page-style') 12 | 13 | @vite('resources/assets/vendor/scss/pages/page-auth.scss') 14 | @endsection 15 | 16 | @section('content') 17 |
18 |
19 | 20 |
21 |
22 | Auth Cover Bg color 23 |
24 |

Setup new password 👩🏻‍💻

25 |

26 | You can change your password for security
reasons or reset it if you forget it. 27 |

28 |
29 |
30 |
31 | 32 | 33 |
34 |
35 | 36 | 42 | 43 |

Reset Password 🔒

44 |
45 | @csrf 46 | 47 | 48 |
49 | 50 | 51 | @error('email') 52 | 53 | {{ $message }} 54 | 55 | @enderror 56 |
57 | 58 |
59 | 60 |
61 | 62 | 63 | 64 | 65 |
66 | @error('password') 67 | 68 | {{ $message }} 69 | 70 | @enderror 71 |
72 |
73 | 74 |
75 | 76 | 77 | 78 | 79 |
80 |
81 | 84 |
85 | @if (Route::has('login')) 86 | 87 | 88 | Back to login 89 | 90 | @endif 91 |
92 |
93 |
94 |
95 | 96 |
97 |
98 | @endsection -------------------------------------------------------------------------------- /stubs/livewire/resources/views/auth/login.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Illuminate\Support\Facades\Route; 3 | $configData = Helper::appClasses(); 4 | $customizerHidden = 'customizer-hide'; 5 | @endphp 6 | 7 | @extends('layouts/blankLayout') 8 | 9 | @section('title', 'Login') 10 | 11 | @section('page-style') 12 | 13 | @vite('resources/assets/vendor/scss/pages/page-auth.scss') 14 | @endsection 15 | 16 | @section('content') 17 |
18 |
19 | 20 |
21 |
22 | Auth Cover Bg color 23 |
24 |

Discover the powerful admin template 🥳

25 |

26 | Perfectly suited for all level of developers which helps you to
kick start your next big projects & Applications. 27 |

28 |
29 |
30 |
31 | 32 | 33 | 34 |
35 |
36 | 37 | 43 | 44 |

Welcome to {{config('variables.templateName')}}! 👋

45 |

Please sign-in to your account and start the adventure

46 | 47 | @if (session('status')) 48 | 53 | @endif 54 | 55 |
56 | @csrf 57 |
58 | 59 | 60 | @error('email') 61 | 62 | {{ $message }} 63 | 64 | @enderror 65 |
66 |
67 |
68 | 69 | @if (Route::has('password.request')) 70 | 71 | Forgot Password? 72 | 73 | @endif 74 |
75 |
76 | 77 | 78 |
79 | @error('password') 80 | 81 | {{ $message }} 82 | 83 | @enderror 84 |
85 |
86 |
87 | 88 | 91 |
92 |
93 | 94 |
95 | 96 |

97 | New on our platform? 98 | @if (Route::has('register')) 99 | 100 | Create an account 101 | 102 | @endif 103 |

104 | 105 |
106 |
or
107 |
108 | 109 |
110 | 113 | 114 | 115 | 116 | 117 | 118 | 121 |
122 |
123 |
124 | 125 |
126 |
127 | @endsection -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # master-laravel-bootstrap-jetstream 2 | 3 | [![Latest Stable Version](https://poser.pugx.org/themeselection/master-laravel-bootstrap-jetstream/v)](//packagist.org/packages/themeselection/master-laravel-bootstrap-jetstream) 4 | [![License](https://poser.pugx.org/themeselection/master-laravel-bootstrap-jetstream/license)](//packagist.org/packages/themeselection/master-laravel-bootstrap-jetstream) 5 | 6 | ##### Specially customized Laravel jetstream's scaffolding for [Master html + laravel admin Template](https://1.envato.market/Master_admin). It'll not work with any other project. 7 | [Download from packagist](https://packagist.org/packages/themeselection/master-laravel-bootstrap-jetstream) 8 | 9 | ## Description 10 | 11 | Laravel Jetstream is designed using Tailwind CSS and offers your choice of Livewire or Inertia scaffolding. We have removed the Tailwind CSS dependency and modified the Livewire scaffolding as per our template. __Please note we have not provided Inertia scaffolding yet. This package only works with livewire scaffolding__. 12 | 13 | Master Laravel Jetstream is a lightweight laravel package that focuses on the `VIEW` side of [Jetstream](https://github.com/laravel/jetstream) package installed in your Laravel application, so when a swap is performed, the `Action`, `MODEL`, `CONTROLLER`, `Component` and `Action` classes of your project is still 100% handled by Laravel development team with no added layer of complexity. 14 | 15 | ## Table of Content 16 | 17 | - [master-laravel-bootstrap-jetstream](#master-laravel-bootstrap-jetstream) 18 | - [Specially customized Laravel jetstream's scaffolding for Master html + laravel admin Template. It'll not work with any other project.](#specially-customized-laravel-jetstreams-scaffolding-for-master-html--laravel-admin-template-itll-not-work-with-any-other-project) 19 | - [Description](#description) 20 | - [Table of Content](#table-of-content) 21 | - [Installation](#installation) 22 | - [Installing Jetstream](#installing-jetstream) 23 | - [Install Jetstream With Livewire](#install-jetstream-with-livewire) 24 | - [Install Master Laravel Bootstrap Jetstream](#install-master-laravel-bootstrap-jetstream) 25 | - [Finalizing The Installation](#finalizing-the-installation) 26 | - [Extras](#extras) 27 | - [Pagination](#pagination) 28 | - [Credits](#credits) 29 | - [License](#license) 30 | 31 | ## Installation 32 | 33 | ### Installing Jetstream 34 | 35 | You may use Composer to install Jetstream into your new Laravel project: 36 | 37 | ``` 38 | composer require laravel/jetstream 39 | ``` 40 | 41 | If you choose to install Jetstream through Composer, you should run the jetstream:install Artisan command. This command accepts the name of the stack you prefer (livewire). You are highly encouraged to read through the entire documentation of Livewire before beginning your Jetstream project. In addition, you may use the __--teams__ switch to enable team support: 42 | 43 | #### Install Jetstream With Livewire 44 | 45 | ```bash 46 | // without teams support 47 | 48 | php artisan jetstream:install livewire 49 | 50 | or 51 | 52 | // with teams support 53 | 54 | php artisan jetstream:install livewire --teams 55 | ``` 56 | 57 | ### Install Master Laravel Bootstrap Jetstream 58 | 59 | Use Composer to install Master Jetstream into your new Laravel project as dev dependency: 60 | 61 | ``` 62 | composer require themeselection/master-laravel-bootstrap-jetstream --dev 63 | ``` 64 | 65 | Regardless how you install Jetstream, Master Laravel Bootstrap Jetstream commands are very similar to that 66 | 67 | of Jetstream as it accepts the name of the stack you would like to swap (livewire). 68 | 69 | > It is important you install and configure [Laravel Jetstream](https://github.com/laravel/jetstream) before performing a swap. 70 | 71 | You are highly encouraged to read through the entire documentation of [Jetstream](https://jetstream.laravel.com/1.x/introduction.html) 72 | 73 | before beginning your Master Laravel Jetstream project. In addition, you may use the `--teams` switch to swap team assets just like you would in Jetstream: 74 | 75 | ```bash 76 | // without teams support 77 | 78 | php artisan jetstream_master:swap livewire 79 | 80 | or 81 | 82 | // with teams support 83 | 84 | php artisan jetstream_master:swap livewire --teams 85 | ``` 86 | 87 | This will publish overrides to enable Bootstrap like the good old days! 88 | 89 | ### Finalizing The Installation 90 | 91 | After installing Master jetstream and swapping Jetstream resources, remove tailwindCSS and its dependencies if any from your package.json and then install and build your NPM dependencies and migrate your database: 92 | 93 | ``` 94 | npm install && npm run build 95 | 96 | or 97 | 98 | yarn && yarn build 99 | 100 | 101 | php artisan migrate 102 | ``` 103 | 104 | ### Extras 105 | 106 | #### Pagination 107 | 108 | It is also important to point out that Laravel still includes pagination views built using Bootstrap CSS. To use these views instead of the default Tailwind views, you may call the paginator's useBootstrap method within your AppServiceProvider: 109 | 110 | ```php 111 | = 1%", 66 | "last 2 versions", 67 | "not dead", 68 | "Chrome >= 45", 69 | "Firefox >= 38", 70 | "Edge >= 12", 71 | "Explorer >= 10", 72 | "iOS >= 9", 73 | "Safari >= 9", 74 | "Android >= 4.4", 75 | "Opera >= 30" 76 | ], 77 | "babel": { 78 | "presets": [ 79 | [ 80 | "@babel/env", 81 | { 82 | "targets": { 83 | "browsers": [ 84 | ">= 1%", 85 | "last 2 versions", 86 | "not dead", 87 | "Chrome >= 45", 88 | "Firefox >= 38", 89 | "Edge >= 12", 90 | "Explorer >= 10", 91 | "iOS >= 9", 92 | "Safari >= 9", 93 | "Android >= 4.4", 94 | "Opera >= 30" 95 | ] 96 | } 97 | } 98 | ] 99 | ] 100 | }, 101 | "dependencies": { 102 | "@form-validation/bundle": "2.4.0", 103 | "@form-validation/core": "2.4.0", 104 | "@form-validation/plugin-alias": "2.4.0", 105 | "@form-validation/plugin-auto-focus": "2.4.0", 106 | "@form-validation/plugin-bootstrap5": "2.4.0", 107 | "@form-validation/plugin-excluded": "2.4.0", 108 | "@form-validation/plugin-field-status": "2.4.0", 109 | "@form-validation/plugin-framework": "2.4.0", 110 | "@form-validation/plugin-message": "2.4.0", 111 | "@fortawesome/fontawesome-free": "6.5.1", 112 | "@fullcalendar/core": "6.1.10", 113 | "@fullcalendar/daygrid": "6.1.10", 114 | "@fullcalendar/interaction": "6.1.10", 115 | "@fullcalendar/list": "6.1.10", 116 | "@fullcalendar/timegrid": "6.1.10", 117 | "@fullcalendar/timeline": "6.1.10", 118 | "@popperjs/core": "2.11.8", 119 | "@simonwep/pickr": "1.9.0", 120 | "@yaireo/tagify": "4.18.2", 121 | "animate.css": "4.1.1", 122 | "aos": "2.3.4", 123 | "apexcharts-clevision": "3.28.5", 124 | "autosize": "6.0.1", 125 | "block-ui": "2.70.1", 126 | "bloodhound-js": "1.2.3", 127 | "bootstrap": "5.3.3", 128 | "bootstrap-datepicker": "1.10.0", 129 | "bootstrap-daterangepicker": "3.1.0", 130 | "bootstrap-maxlength": "1.10.1", 131 | "bootstrap-select": "snapappointments/bootstrap-select#main", 132 | "boxicons": "2.1.4", 133 | "bs-stepper": "1.7.0", 134 | "chart.js": "4.4.1", 135 | "cleave.js": "1.6.0", 136 | "clipboard": "2.0.11", 137 | "datatables.net-bs5": "1.13.8", 138 | "datatables.net-buttons": "2.4.2", 139 | "datatables.net-buttons-bs5": "2.4.2", 140 | "datatables.net-fixedcolumns-bs5": "4.3.0", 141 | "datatables.net-fixedheader-bs5": "3.4.0", 142 | "datatables.net-responsive": "2.5.0", 143 | "datatables.net-responsive-bs5": "2.5.0", 144 | "datatables.net-rowgroup-bs5": "1.4.1", 145 | "datatables.net-select-bs5": "1.7.0", 146 | "dropzone": "5.9.3", 147 | "feather-icons": "4.29.1", 148 | "flag-icons": "7.1.0", 149 | "flatpickr": "4.6.13", 150 | "hammerjs": "2.0.8", 151 | "highlight.js": "11.9.0", 152 | "jkanban": "1.3.1", 153 | "jquery": "3.7.1", 154 | "jquery-datatables-checkboxes": "1.2.14", 155 | "jquery-sticky": "1.0.4", 156 | "jquery.repeater": "1.2.1", 157 | "jstree": "3.3.16", 158 | "jszip": "3.10.1", 159 | "katex": "0.16.9", 160 | "laravel-vite-plugin": "1.0.1", 161 | "leaflet": "1.9.4", 162 | "mapbox-gl": "3.0.1", 163 | "masonry-layout": "4.2.2", 164 | "moment": "2.30.1", 165 | "nouislider": "15.7.1", 166 | "numeral": "2.0.6", 167 | "pdfmake": "0.2.9", 168 | "perfect-scrollbar": "1.5.5", 169 | "plyr": "3.7.8", 170 | "quill": "1.3.7", 171 | "rateyo": "2.3.5", 172 | "select2": "4.0.13", 173 | "shepherd.js": "11.2.0", 174 | "sortablejs": "1.15.2", 175 | "spinkit": "2.0.1", 176 | "sweetalert2": "11.10.3", 177 | "swiper": "11.0.5", 178 | "timepicker": "1.14.1", 179 | "toastr": "2.1.4", 180 | "typeahead.js": "0.11.1" 181 | } 182 | } -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text eol=lf 2 | * text=auto 3 | 4 | *.blade.php diff=html 5 | *.css diff=css 6 | *.html diff=html 7 | *.md diff=markdown 8 | *.php diff=php 9 | 10 | /.github export-ignore 11 | CHANGELOG.md export-ignore 12 | 13 | 14 | ## GITATTRIBUTES FOR WEB PROJECTS 15 | # 16 | # These settings are for any web project. 17 | # 18 | # Details per file setting: 19 | # text These files should be normalized (i.e. convert CRLF to LF). 20 | # binary These files are binary and should be left untouched. 21 | # 22 | # Note that binary is a macro for -text -diff. 23 | ###################################################################### 24 | 25 | # Auto detect 26 | ## Handle line endings automatically for files detected as 27 | ## text and leave all files detected as binary untouched. 28 | ## This will handle all files NOT defined below. 29 | * text=auto 30 | 31 | # Source code 32 | *.bash text eol=lf 33 | *.bat text eol=crlf 34 | *.cmd text eol=crlf 35 | *.coffee text 36 | *.css text diff=css 37 | *.htm text diff=html 38 | *.html text diff=html 39 | *.inc text 40 | *.ini text 41 | *.js text 42 | *.json text 43 | *.jsx text 44 | *.less text 45 | *.ls text 46 | *.map text -diff 47 | *.od text 48 | *.onlydata text 49 | *.php text diff=php 50 | *.pl text 51 | *.ps1 text eol=crlf 52 | *.py text diff=python 53 | *.rb text diff=ruby 54 | *.sass text 55 | *.scm text 56 | *.scss text diff=css 57 | *.sh text eol=lf 58 | .husky/* text eol=lf 59 | *.sql text 60 | *.styl text 61 | *.tag text 62 | *.ts text 63 | *.tsx text 64 | *.xml text 65 | *.xhtml text diff=html 66 | 67 | # Docker 68 | Dockerfile text 69 | 70 | # Documentation 71 | *.ipynb text eol=lf 72 | *.markdown text diff=markdown 73 | *.md text diff=markdown 74 | *.mdwn text diff=markdown 75 | *.mdown text diff=markdown 76 | *.mkd text diff=markdown 77 | *.mkdn text diff=markdown 78 | *.mdtxt text 79 | *.mdtext text 80 | *.txt text 81 | AUTHORS text 82 | CHANGELOG text 83 | CHANGES text 84 | CONTRIBUTING text 85 | COPYING text 86 | copyright text 87 | *COPYRIGHT* text 88 | INSTALL text 89 | license text 90 | LICENSE text 91 | NEWS text 92 | readme text 93 | *README* text 94 | TODO text 95 | 96 | # Templates 97 | *.dot text 98 | *.ejs text 99 | *.erb text 100 | *.haml text 101 | *.handlebars text 102 | *.hbs text 103 | *.hbt text 104 | *.jade text 105 | *.latte text 106 | *.mustache text 107 | *.njk text 108 | *.phtml text 109 | *.svelte text 110 | *.tmpl text 111 | *.tpl text 112 | *.twig text 113 | *.vue text 114 | 115 | # Configs 116 | *.cnf text 117 | *.conf text 118 | *.config text 119 | .editorconfig text 120 | .env text 121 | .gitattributes text 122 | .gitconfig text 123 | .htaccess text 124 | *.lock text -diff 125 | package.json text eol=lf 126 | package-lock.json text eol=lf -diff 127 | pnpm-lock.yaml text eol=lf -diff 128 | .prettierrc text 129 | yarn.lock text -diff 130 | *.toml text 131 | *.yaml text 132 | *.yml text 133 | browserslist text 134 | Makefile text 135 | makefile text 136 | 137 | # Heroku 138 | Procfile text 139 | 140 | # Graphics 141 | *.ai binary 142 | *.bmp binary 143 | *.eps binary 144 | *.gif binary 145 | *.gifv binary 146 | *.ico binary 147 | *.jng binary 148 | *.jp2 binary 149 | *.jpg binary 150 | *.jpeg binary 151 | *.jpx binary 152 | *.jxr binary 153 | *.pdf binary 154 | *.png binary 155 | *.psb binary 156 | *.psd binary 157 | # SVG treated as an asset (binary) by default. 158 | # *.svg text 159 | # If you want to treat it as binary, 160 | # use the following line instead. 161 | *.svg binary 162 | *.svgz binary 163 | *.tif binary 164 | *.tiff binary 165 | *.wbmp binary 166 | *.webp binary 167 | 168 | # Audio 169 | *.kar binary 170 | *.m4a binary 171 | *.mid binary 172 | *.midi binary 173 | *.mp3 binary 174 | *.ogg binary 175 | *.ra binary 176 | 177 | # Video 178 | *.3gpp binary 179 | *.3gp binary 180 | *.as binary 181 | *.asf binary 182 | *.asx binary 183 | *.avi binary 184 | *.fla binary 185 | *.flv binary 186 | *.m4v binary 187 | *.mng binary 188 | *.mov binary 189 | *.mp4 binary 190 | *.mpeg binary 191 | *.mpg binary 192 | *.ogv binary 193 | *.swc binary 194 | *.swf binary 195 | *.webm binary 196 | 197 | # Archives 198 | *.7z binary 199 | *.gz binary 200 | *.jar binary 201 | *.rar binary 202 | *.tar binary 203 | *.zip binary 204 | 205 | # Fonts 206 | *.ttf binary 207 | *.eot binary 208 | *.otf binary 209 | *.woff binary 210 | *.woff2 binary 211 | 212 | # Executables 213 | *.exe binary 214 | *.pyc binary 215 | 216 | # RC files (like .babelrc or .eslintrc) 217 | *.*rc text 218 | 219 | # Ignore files (like .npmignore or .gitignore) 220 | *.*ignore text 221 | -------------------------------------------------------------------------------- /stubs/livewire/resources/views/auth/register.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Illuminate\Support\Facades\Route; 3 | $configData = Helper::appClasses(); 4 | $customizerHidden = 'customizer-hide'; 5 | @endphp 6 | 7 | @extends('layouts/blankLayout') 8 | 9 | @section('title', 'Register Page') 10 | 11 | @section('page-style') 12 | 13 | @vite('resources/assets/vendor/scss/pages/page-auth.scss') 14 | @endsection 15 | 16 | @section('content') 17 |
18 |
19 | 20 |
21 |
22 | Auth Cover Bg color 23 |
24 |

A few clicks to get started 🚀

25 |

26 | Let’s get started with your 14 days free trial and
start building your application today. 27 |

28 |
29 |
30 |
31 | 32 | 33 | 34 |
35 |
36 | 37 | 43 | 44 | 45 | 46 |

Adventure starts here 🚀

47 |

Make your app management easy and fun!

48 | 49 |
50 | @csrf 51 |
52 | 53 | 54 | @error('name') 55 | 56 | {{ $message }} 57 | 58 | @enderror 59 |
60 |
61 | 62 | 63 | @error('email') 64 | 65 | {{ $message }} 66 | 67 | @enderror 68 |
69 |
70 | 71 |
72 | 73 | 74 | 75 | 76 |
77 | @error('password') 78 | 79 | {{ $message }} 80 | 81 | @enderror 82 |
83 | 84 |
85 | 86 |
87 | 88 | 89 | 90 | 91 |
92 |
93 | @if (Laravel\Jetstream\Jetstream::hasTermsAndPrivacyPolicyFeature()) 94 |
95 |
96 | 97 | 102 |
103 | @error('terms') 104 | 107 | @enderror 108 |
109 | @endif 110 | 111 |
112 | 113 |

114 | Already have an account? 115 | @if (Route::has('login')) 116 | 117 | Sign in instead 118 | 119 | @endif 120 |

121 | 122 |
123 |
or
124 |
125 | 126 |
127 | 130 | 131 | 132 | 133 | 134 | 135 | 138 |
139 |
140 |
141 | 142 |
143 |
144 | @endsection -------------------------------------------------------------------------------- /stubs/livewire/resources/views/api/api-token-manager.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | {{ __('Create API Token') }} 6 | 7 | 8 | 9 | {{ __('API tokens allow third-party services to authenticate with our application on your behalf.') }} 10 | 11 | 12 | 13 | 14 | {{ __('Created.') }} 15 | 16 | 17 | 18 |
19 | 20 | 22 | 23 |
24 | 25 | 26 | @if (Laravel\Jetstream\Jetstream::hasPermissions()) 27 |
28 | 29 | 30 |
31 | @foreach (Laravel\Jetstream\Jetstream::$permissions as $permission) 32 |
33 |
34 |
35 | 37 | 40 |
41 |
42 |
43 | @endforeach 44 |
45 |
46 | @endif 47 |
48 | 49 | 50 | 51 | {{ __('Create') }} 52 | 53 | 54 |
55 | 56 | @if ($this->user->tokens->isNotEmpty()) 57 | 58 | 59 |
60 | 61 | 62 | {{ __('Manage API Tokens') }} 63 | 64 | 65 | 66 | {{ __('You may delete any of your existing tokens if they are no longer needed.') }} 67 | 68 | 69 | 70 | 71 |
72 | @foreach ($this->user->tokens->sortBy('name') as $token) 73 |
74 |
75 | {{ $token->name }} 76 |
77 | 78 |
79 | @if ($token->last_used_at) 80 |
81 | {{ __('Last used') }} {{ $token->last_used_at->diffForHumans() }} 82 |
83 | @endif 84 | 85 | @if (Laravel\Jetstream\Jetstream::hasPermissions()) 86 | 90 | @endif 91 | 92 | 96 |
97 |
98 | @endforeach 99 |
100 |
101 |
102 |
103 | @endif 104 | 105 | 106 | 107 | 108 | {{ __('API Token') }} 109 | 110 | 111 | 112 |
113 | {{ __('Please copy your new API token. For your security, it won\'t be shown again.') }} 114 |
115 | 116 |
117 | 120 |
121 |
122 | 123 | 124 | 125 | {{ __('Close') }} 126 | 127 | 128 |
129 | 130 | 131 | 132 | 133 | {{ __('API Token Permissions') }} 134 | 135 | 136 | 137 |
138 | @foreach (Laravel\Jetstream\Jetstream::$permissions as $permission) 139 |
140 |
141 |
142 | 144 | 147 |
148 |
149 |
150 | @endforeach 151 |
152 |
153 | 154 | 155 | 156 | {{ __('Cancel') }} 157 | 158 | 159 | 160 | {{ __('Save') }} 161 | 162 | 163 |
164 | 165 | 166 | 167 | 168 | {{ __('Delete API Token') }} 169 | 170 | 171 | 172 | {{ __('Are you sure you would like to delete this API token?') }} 173 | 174 | 175 | 176 | 177 | {{ __('Cancel') }} 178 | 179 | 180 | 181 | {{ __('Delete') }} 182 | 183 | 184 | 185 |
186 | -------------------------------------------------------------------------------- /src/Pixinvent/Jetstrap/Console/InstallCommand.php: -------------------------------------------------------------------------------- 1 | info('Performing swap...'); 34 | 35 | // Remove Tailwind Configuration... 36 | if ((new Filesystem)->exists(base_path('tailwind.config.js'))) { 37 | (new Filesystem)->delete(base_path('tailwind.config.js')); 38 | } 39 | 40 | if ((new Filesystem)->exists(base_path('postcss.config.js'))) { 41 | (new Filesystem)->delete(base_path('postcss.config.js')); 42 | } 43 | 44 | if ((new Filesystem)->exists(resource_path('views/dashboard.blade.php'))) { 45 | (new Filesystem)->delete(resource_path('views/dashboard.blade.php')); 46 | } 47 | 48 | if ((new Filesystem)->exists(resource_path('views/navigation-menu.blade.php'))) { 49 | (new Filesystem)->delete(resource_path('views/navigation-menu.blade.php')); 50 | } 51 | 52 | if ((new Filesystem)->exists(resource_path('views/welcome.blade.php'))) { 53 | (new Filesystem)->delete(resource_path('views/welcome.blade.php')); 54 | } 55 | 56 | if ((new Filesystem)->exists(resource_path('views/layouts/app.blade.php'))) { 57 | (new Filesystem)->delete(resource_path('views/layouts/app.blade.php')); 58 | } 59 | 60 | if ((new Filesystem)->exists(resource_path('views/layouts/guest.blade.php'))) { 61 | (new Filesystem)->delete(resource_path('views/layouts/guest.blade.php')); 62 | } 63 | 64 | // "/" Route... 65 | $this->replaceInFile('/dashboard', '/', base_path('config/fortify.php')); 66 | 67 | // Update routes in web.php 68 | $originalRoute = <<<'EOD' 69 | Route::middleware([ 70 | 'auth:sanctum', 71 | config('jetstream.auth_session'), 72 | 'verified', 73 | ])->group(function () { 74 | Route::get('/dashboard', function () { 75 | return view('dashboard'); 76 | })->name('dashboard'); 77 | }); 78 | EOD; 79 | 80 | $newRoute = <<<'EOD' 81 | Route::middleware([ 82 | 'auth:sanctum', 83 | config('jetstream.auth_session'), 84 | 'verified', 85 | ])->group(function () { 86 | Route::get('/dashboard', function () { 87 | return view('/'); 88 | })->name('dashboard'); 89 | }); 90 | EOD; 91 | 92 | $this->replaceInFile($originalRoute, $newRoute, base_path('routes/web.php')); 93 | 94 | // add components in navbar 95 | $this->replaceInFile('{{-- --}}', '', resource_path('views/layouts/sections/navbar/navbar.blade.php')); 96 | $this->replaceInFile('{{-- --}}', '', resource_path('views/layouts/contentNavbarLayout.blade.php')); 97 | $this->replaceInFile('{{-- --}}', '', resource_path('views/layouts/horizontalLayout.blade.php')); 98 | 99 | // app/views 100 | (new Filesystem)->deleteDirectory(app_path('View')); 101 | // Assets... 102 | $cssFilePath = resource_path('css/app.css'); 103 | file_put_contents($cssFilePath, ''); 104 | (new Filesystem)->ensureDirectoryExists(resource_path('views')); 105 | 106 | 107 | // add livewire script file in template 108 | if (!Str::contains(file_get_contents(resource_path('views/layouts/sections/scripts.blade.php')), "'modals'")) { 109 | (new Filesystem)->append(resource_path('views/layouts/sections/scripts.blade.php'), $this->livewireScriptDefinition()); 110 | } 111 | 112 | // add livewire style file in template 113 | if (!Str::contains(file_get_contents(resource_path('views/layouts/sections/styles.blade.php')), "'@livewireStyles'")) { 114 | (new Filesystem)->append(resource_path('views/layouts/sections/styles.blade.php'), $this->livewireStyleDefinition()); 115 | } 116 | 117 | // Install Stack... 118 | if ($this->argument('stack') === 'livewire') { 119 | 120 | $this->swapJetstreamLivewireStack(); 121 | } 122 | } 123 | 124 | /** 125 | * Swap the Livewire stack into the application. 126 | * 127 | * @return void 128 | */ 129 | protected function swapJetstreamLivewireStack() 130 | { 131 | $this->line(''); 132 | $this->info('Installing livewire stack...'); 133 | 134 | copy(__DIR__ . '/../../../../stubs/package.json', base_path('package.json')); 135 | copy(__DIR__ . '/../../../../stubs/vite.config.js', base_path('vite.config.js')); 136 | 137 | // Directories... 138 | (new Filesystem)->ensureDirectoryExists(resource_path('views/api')); 139 | (new Filesystem)->ensureDirectoryExists(resource_path('views/auth')); 140 | (new Filesystem)->ensureDirectoryExists(resource_path('views/profile')); 141 | 142 | // Layouts 143 | (new Filesystem)->copyDirectory(__DIR__ . '/../../../../stubs/livewire/resources/views/api', resource_path('views/api')); 144 | (new Filesystem)->copyDirectory(__DIR__ . '/../../../../stubs/livewire/resources/views/profile', resource_path('views/profile')); 145 | (new Filesystem)->copyDirectory(__DIR__ . '/../../../../stubs/livewire/resources/views/auth', resource_path('views/auth')); 146 | 147 | // Single Blade Views... 148 | copy(__DIR__ . '/../../../../stubs/livewire/resources/views/terms.blade.php', resource_path('views/terms.blade.php')); 149 | copy(__DIR__ . '/../../../../stubs/livewire/resources/views/policy.blade.php', resource_path('views/policy.blade.php')); 150 | 151 | // Publish... 152 | $this->callSilent('vendor:publish', ['--tag' => 'jetstrap-views', '--force' => true]); 153 | 154 | // Teams... 155 | if ($this->option('teams')) { 156 | $this->swapJetstreamLivewireTeamStack(); 157 | } 158 | 159 | $this->line(''); 160 | $this->info('Rounding up...'); 161 | 162 | $this->line(''); 163 | $this->info('Bootstrap scaffolding swapped for livewire successfully.'); 164 | $this->comment('Please execute the "npm install && npm run build" OR "yarn && yarn build" command to build your assets.'); 165 | } 166 | 167 | /** 168 | * Swap the Livewire team stack into the application. 169 | * 170 | * @return void 171 | */ 172 | protected function swapJetstreamLivewireTeamStack() 173 | { 174 | // Directories... 175 | (new Filesystem)->ensureDirectoryExists(resource_path('views/teams')); 176 | 177 | (new Filesystem)->copyDirectory(__DIR__ . '/../../../../stubs/livewire/resources/views/teams', resource_path('views/teams')); 178 | } 179 | 180 | /** 181 | * Replace a given string within a given file. 182 | * 183 | * @param string $search 184 | * @param string $replace 185 | * @param string $path 186 | * @return void 187 | */ 188 | protected function replaceInFile($search, $replace, $path) 189 | { 190 | file_put_contents($path, str_replace($search, $replace, file_get_contents($path))); 191 | } 192 | 193 | /** 194 | * Get the livewire script definition(s) that should be installed for Livewire. 195 | * 196 | * @return string 197 | */ 198 | protected function livewireScriptDefinition() 199 | { 200 | return <<<'EOF' 201 | 202 | @stack('modals') 203 | @livewireScripts 204 | 205 | EOF; 206 | } 207 | 208 | /** 209 | * Get the livewire style definition(s) that should be installed for Livewire. 210 | * 211 | * @return string 212 | */ 213 | protected function livewireStyleDefinition() 214 | { 215 | return <<<'EOF' 216 | 217 | @livewireStyles 218 | 219 | EOF; 220 | } 221 | } -------------------------------------------------------------------------------- /src/Themeselection/Jetstrap/Console/InstallCommand.php: -------------------------------------------------------------------------------- 1 | info('Performing swap...'); 34 | 35 | // Remove Tailwind Configuration... 36 | if ((new Filesystem)->exists(base_path('tailwind.config.js'))) { 37 | (new Filesystem)->delete(base_path('tailwind.config.js')); 38 | } 39 | 40 | if ((new Filesystem)->exists(base_path('postcss.config.js'))) { 41 | (new Filesystem)->delete(base_path('postcss.config.js')); 42 | } 43 | 44 | if ((new Filesystem)->exists(resource_path('views/dashboard.blade.php'))) { 45 | (new Filesystem)->delete(resource_path('views/dashboard.blade.php')); 46 | } 47 | 48 | if ((new Filesystem)->exists(resource_path('views/navigation-menu.blade.php'))) { 49 | (new Filesystem)->delete(resource_path('views/navigation-menu.blade.php')); 50 | } 51 | 52 | if ((new Filesystem)->exists(resource_path('views/welcome.blade.php'))) { 53 | (new Filesystem)->delete(resource_path('views/welcome.blade.php')); 54 | } 55 | 56 | if ((new Filesystem)->exists(resource_path('views/layouts/app.blade.php'))) { 57 | (new Filesystem)->delete(resource_path('views/layouts/app.blade.php')); 58 | } 59 | 60 | if ((new Filesystem)->exists(resource_path('views/layouts/guest.blade.php'))) { 61 | (new Filesystem)->delete(resource_path('views/layouts/guest.blade.php')); 62 | } 63 | 64 | // "/" Route... 65 | $this->replaceInFile('/dashboard', '/', base_path('config/fortify.php')); 66 | 67 | // Update routes in web.php 68 | $originalRoute = <<<'EOD' 69 | Route::middleware([ 70 | 'auth:sanctum', 71 | config('jetstream.auth_session'), 72 | 'verified', 73 | ])->group(function () { 74 | Route::get('/dashboard', function () { 75 | return view('dashboard'); 76 | })->name('dashboard'); 77 | }); 78 | EOD; 79 | 80 | $newRoute = <<<'EOD' 81 | Route::middleware([ 82 | 'auth:sanctum', 83 | config('jetstream.auth_session'), 84 | 'verified', 85 | ])->group(function () { 86 | Route::get('/dashboard', function () { 87 | return view('/'); 88 | })->name('dashboard'); 89 | }); 90 | EOD; 91 | 92 | $this->replaceInFile($originalRoute, $newRoute, base_path('routes/web.php')); 93 | 94 | // add components in navbar 95 | $this->replaceInFile('{{-- --}}', '', resource_path('views/layouts/sections/navbar/navbar.blade.php')); 96 | $this->replaceInFile('{{-- --}}', '', resource_path('views/layouts/contentNavbarLayout.blade.php')); 97 | $this->replaceInFile('{{-- --}}', '', resource_path('views/layouts/horizontalLayout.blade.php')); 98 | 99 | // app/views 100 | (new Filesystem)->deleteDirectory(app_path('View')); 101 | // Assets... 102 | $cssFilePath = resource_path('css/app.css'); 103 | file_put_contents($cssFilePath, ''); 104 | 105 | (new Filesystem)->ensureDirectoryExists(resource_path('views')); 106 | 107 | 108 | // add livewire script file in template 109 | if (!Str::contains(file_get_contents(resource_path('views/layouts/sections/scripts.blade.php')), "'modals'")) { 110 | (new Filesystem)->append(resource_path('views/layouts/sections/scripts.blade.php'), $this->livewireScriptDefinition()); 111 | } 112 | 113 | // add livewire style file in template 114 | if (!Str::contains(file_get_contents(resource_path('views/layouts/sections/styles.blade.php')), "'@livewireStyles'")) { 115 | (new Filesystem)->append(resource_path('views/layouts/sections/styles.blade.php'), $this->livewireStyleDefinition()); 116 | } 117 | 118 | // Install Stack... 119 | if ($this->argument('stack') === 'livewire') { 120 | 121 | $this->swapJetstreamLivewireStack(); 122 | } 123 | } 124 | 125 | /** 126 | * Swap the Livewire stack into the application. 127 | * 128 | * @return void 129 | */ 130 | protected function swapJetstreamLivewireStack() 131 | { 132 | $this->line(''); 133 | $this->info('Installing livewire stack...'); 134 | 135 | copy(__DIR__ . '/../../../../stubs/package.json', base_path('package.json')); 136 | copy(__DIR__ . '/../../../../stubs/vite.config.js', base_path('vite.config.js')); 137 | 138 | // Directories... 139 | (new Filesystem)->ensureDirectoryExists(resource_path('views/api')); 140 | (new Filesystem)->ensureDirectoryExists(resource_path('views/auth')); 141 | (new Filesystem)->ensureDirectoryExists(resource_path('views/profile')); 142 | 143 | // Layouts 144 | (new Filesystem)->copyDirectory(__DIR__ . '/../../../../stubs/livewire/resources/views/api', resource_path('views/api')); 145 | (new Filesystem)->copyDirectory(__DIR__ . '/../../../../stubs/livewire/resources/views/profile', resource_path('views/profile')); 146 | (new Filesystem)->copyDirectory(__DIR__ . '/../../../../stubs/livewire/resources/views/auth', resource_path('views/auth')); 147 | 148 | // Single Blade Views... 149 | copy(__DIR__ . '/../../../../stubs/livewire/resources/views/terms.blade.php', resource_path('views/terms.blade.php')); 150 | copy(__DIR__ . '/../../../../stubs/livewire/resources/views/policy.blade.php', resource_path('views/policy.blade.php')); 151 | 152 | // Publish... 153 | $this->callSilent('vendor:publish', ['--tag' => 'jetstrap-views', '--force' => true]); 154 | 155 | // Teams... 156 | if ($this->option('teams')) { 157 | $this->swapJetstreamLivewireTeamStack(); 158 | } 159 | 160 | $this->line(''); 161 | $this->info('Rounding up...'); 162 | 163 | $this->line(''); 164 | $this->info('Bootstrap scaffolding swapped for livewire successfully.'); 165 | $this->comment('Please execute the "npm install && npm run build" OR "yarn && yarn build" command to build your assets.'); 166 | } 167 | 168 | /** 169 | * Swap the Livewire team stack into the application. 170 | * 171 | * @return void 172 | */ 173 | protected function swapJetstreamLivewireTeamStack() 174 | { 175 | // Directories... 176 | (new Filesystem)->ensureDirectoryExists(resource_path('views/teams')); 177 | 178 | (new Filesystem)->copyDirectory(__DIR__ . '/../../../../stubs/livewire/resources/views/teams', resource_path('views/teams')); 179 | } 180 | 181 | /** 182 | * Replace a given string within a given file. 183 | * 184 | * @param string $search 185 | * @param string $replace 186 | * @param string $path 187 | * @return void 188 | */ 189 | protected function replaceInFile($search, $replace, $path) 190 | { 191 | file_put_contents($path, str_replace($search, $replace, file_get_contents($path))); 192 | } 193 | 194 | /** 195 | * Get the livewire script definition(s) that should be installed for Livewire. 196 | * 197 | * @return string 198 | */ 199 | protected function livewireScriptDefinition() 200 | { 201 | return <<<'EOF' 202 | 203 | @stack('modals') 204 | @livewireScripts 205 | 206 | EOF; 207 | } 208 | 209 | /** 210 | * Get the livewire style definition(s) that should be installed for Livewire. 211 | * 212 | * @return string 213 | */ 214 | protected function livewireStyleDefinition() 215 | { 216 | return <<<'EOF' 217 | 218 | @livewireStyles 219 | 220 | EOF; 221 | } 222 | } -------------------------------------------------------------------------------- /stubs/livewire/resources/views/teams/team-member-manager.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Illuminate\Support\Facades\Gate; 3 | @endphp 4 |
5 | @if (Gate::check('addTeamMember', $team)) 6 | 7 | 8 | 9 | 10 | {{ __('Add Team Member') }} 11 | 12 | 13 | 14 | {{ __('Add a new team member to your team, allowing them to collaborate with you.') }} 15 | 16 | 17 | 18 | 19 | {{ __('Added.') }} 20 | 21 | 22 |
23 | {{ __('Please provide the email address of the person you would like to add to this team. The email address must be associated with an existing account.') }} 24 |
25 | 26 | 27 |
28 | 29 | 31 | 32 |
33 | 34 | 35 | @if (count($this->roles) > 0) 36 |
37 |
38 | 39 | 40 | 41 | 42 |
43 | 44 | 67 |
68 | @endif 69 |
70 | 71 | 72 | 73 | {{ __('Add') }} 74 | 75 | 76 |
77 | @endif 78 | 79 | @if ($team->teamInvitations->isNotEmpty() && Gate::check('addTeamMember', $team)) 80 | 81 | 82 |
83 | 84 | 85 | {{ __('Pending Team Invitations') }} 86 | 87 | 88 | 89 | {{ __('These people have been invited to your team and have been sent an invitation email. They may join the team by accepting the email invitation.') }} 90 | 91 | 92 | 93 | @foreach ($team->teamInvitations as $invitation) 94 |
95 |
{{ $invitation->email }}
96 | 97 |
98 | @if (Gate::check('removeTeamMember', $team)) 99 | 100 | 104 | @endif 105 |
106 |
107 | @endforeach 108 |
109 |
110 |
111 | @endif 112 | 113 | @if ($team->users->isNotEmpty()) 114 | 115 |
116 | 117 | 118 | 119 | {{ __('Team Members') }} 120 | 121 | 122 | 123 | {{ __('All of the people that are part of this team.') }} 124 | 125 | 126 | 127 | 128 | @foreach ($team->users->sortBy('name') as $user) 129 |
130 |
131 |
132 | {{ $user->name }} 133 |
134 | {{ $user->name }} 135 |
136 | 137 |
138 | 139 | @if (Gate::check('addTeamMember', $team) && Laravel\Jetstream\Jetstream::hasRoles()) 140 | 143 | @elseif (Laravel\Jetstream\Jetstream::hasRoles()) 144 | 147 | @endif 148 | 149 | 150 | @if ($this->user->id === $user->id) 151 | 155 | 156 | 157 | @elseif (Gate::check('removeTeamMember', $team)) 158 | 162 | @endif 163 |
164 |
165 | @endforeach 166 |
167 |
168 |
169 | @endif 170 | 171 | 172 | 173 | 174 | {{ __('Manage Role') }} 175 | 176 | 177 | 178 | 201 | 202 | 203 | 204 | 205 | {{ __('Cancel') }} 206 | 207 | 208 | 209 | {{ __('Save') }} 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | {{ __('Leave Team') }} 218 | 219 | 220 | 221 | {{ __('Are you sure you would like to leave this team?') }} 222 | 223 | 224 | 225 | 226 | {{ __('Cancel') }} 227 | 228 | 229 | 230 | {{ __('Leave') }} 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | {{ __('Remove Team Member') }} 239 | 240 | 241 | 242 | {{ __('Are you sure you would like to remove this person from the team?') }} 243 | 244 | 245 | 246 | 247 | {{ __('Cancel') }} 248 | 249 | 250 | 251 | {{ __('Remove') }} 252 | 253 | 254 | 255 |
256 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | filesystem = new Filesystem(); 24 | } 25 | 26 | /** 27 | * Clean up the testing environment before the next test. 28 | * 29 | * @return void 30 | */ 31 | protected function tearDown(): void 32 | { 33 | parent::tearDown(); 34 | $this->cleanResourceDirectory($this->filesystem); 35 | $this->cleanLivewireFiles($this->filesystem); 36 | $this->cleanInertiaFiles($this->filesystem); 37 | } 38 | 39 | /** 40 | * Get package providers. 41 | * 42 | * @param Application $app 43 | * 44 | * @return array 45 | */ 46 | protected function getPackageProviders($app) 47 | { 48 | return [ 49 | JetstrapServiceProvider::class, 50 | ]; 51 | } 52 | 53 | /** 54 | * Define environment setup. 55 | * 56 | * @param Application $app 57 | * 58 | * @return void 59 | */ 60 | protected function getEnvironmentSetUp($app) 61 | { 62 | // perform environment setup 63 | } 64 | 65 | /** 66 | * Remove files generated by Jetstrap 67 | * 68 | * @param Filesystem $filesystem 69 | * @return void 70 | */ 71 | protected function cleanResourceDirectory(Filesystem $filesystem) 72 | { 73 | if ($filesystem->exists(base_path('webpack.mix.js'))) { 74 | unlink(base_path('webpack.mix.js')); 75 | } 76 | if ($filesystem->isDirectory(resource_path('views/auth'))) { 77 | $filesystem->deleteDirectory(resource_path('views/auth')); 78 | } 79 | if ($filesystem->isDirectory(resource_path('views/layouts'))) { 80 | $filesystem->deleteDirectory(resource_path('views/layouts')); 81 | } 82 | if ($filesystem->isDirectory(resource_path('views/components'))) { 83 | $filesystem->deleteDirectory(resource_path('views/components')); 84 | } 85 | if ($filesystem->isDirectory(base_path('public/css'))) { 86 | $filesystem->deleteDirectory(base_path('public/css')); 87 | } 88 | if ($filesystem->isDirectory(resource_path('sass'))) { 89 | $filesystem->deleteDirectory(resource_path('sass')); 90 | } 91 | } 92 | 93 | /** 94 | * Remove files and directory generated for livewire stack 95 | * 96 | * @param Filesystem $filesystem 97 | * @return void 98 | */ 99 | protected function cleanLivewireFiles(Filesystem $filesystem) 100 | { 101 | // make sure we're starting from a clean state 102 | if ($filesystem->exists(resource_path('views/app.blade.php'))) { 103 | $filesystem->delete(resource_path('views/app.blade.php')); 104 | } 105 | if ($filesystem->exists(resource_path('views/dashboard.blade.php'))) { 106 | $filesystem->delete(resource_path('views/dashboard.blade.php')); 107 | } 108 | if ($filesystem->exists(resource_path('views/welcome.blade.php'))) { 109 | $filesystem->delete(resource_path('views/welcome.blade.php')); 110 | } 111 | if ($filesystem->isDirectory(resource_path('views/api'))) { 112 | $filesystem->deleteDirectory(resource_path('views/api')); 113 | } 114 | if ($filesystem->isDirectory(resource_path('views/profile'))) { 115 | $filesystem->deleteDirectory(resource_path('views/profile')); 116 | } 117 | if ($filesystem->isDirectory(resource_path('views/vendor'))) { 118 | $filesystem->deleteDirectory(resource_path('views/vendor')); 119 | } 120 | if ($filesystem->isDirectory(resource_path('views/teams'))) { 121 | $filesystem->deleteDirectory(resource_path('views/teams')); 122 | } 123 | } 124 | 125 | /** 126 | * Remove files and directory generated for inertia stack 127 | * 128 | * @param Filesystem $filesystem 129 | * @return void 130 | */ 131 | protected function cleanInertiaFiles(Filesystem $filesystem) 132 | { 133 | // make sure we're starting from a clean state 134 | if ($filesystem->isDirectory(resource_path('js'))) { 135 | $filesystem->cleanDirectory(resource_path('js')); 136 | } 137 | } 138 | 139 | /** 140 | * Basic tests shared across all methods 141 | * 142 | * @return void 143 | */ 144 | protected function basicTests() 145 | { 146 | $this->assertFalse($this->filesystem->exists(base_path('tailwind.config.js'))); 147 | $this->assertFalse($this->filesystem->exists(resource_path('css'))); 148 | $this->assertTrue($this->filesystem->exists(base_path('webpack.mix.js'))); 149 | } 150 | 151 | /** 152 | * Basic tests shared across all livewire test methods 153 | * 154 | * @return void 155 | */ 156 | protected function basicLivewireTests() 157 | { 158 | $this->assertTrue($this->filesystem->exists(resource_path('views/layouts/app.blade.php'))); 159 | $this->assertTrue($this->filesystem->exists(resource_path('views/layouts/guest.blade.php'))); 160 | $this->assertTrue($this->filesystem->exists(resource_path('views/dashboard.blade.php'))); 161 | $this->assertTrue($this->filesystem->exists(resource_path('views/terms.blade.php'))); 162 | $this->assertTrue($this->filesystem->exists(resource_path('views/policy.blade.php'))); 163 | $this->assertTrue($this->filesystem->exists(resource_path('views/navigation-menu.blade.php'))); 164 | $this->assertTrue($this->filesystem->exists(resource_path('views/api/api-token-manager.blade.php'))); 165 | $this->assertTrue($this->filesystem->exists(resource_path('views/api/index.blade.php'))); 166 | $this->assertTrue($this->filesystem->exists(resource_path('views/profile/delete-user-form.blade.php'))); 167 | $this->assertTrue($this->filesystem->exists(resource_path('views/profile/logout-other-browser-sessions-form.blade.php'))); 168 | $this->assertTrue($this->filesystem->exists(resource_path('views/profile/show.blade.php'))); 169 | $this->assertTrue($this->filesystem->exists(resource_path('views/profile/two-factor-authentication-form.blade.php'))); 170 | $this->assertTrue($this->filesystem->exists(resource_path('views/profile/update-password-form.blade.php'))); 171 | $this->assertTrue($this->filesystem->exists(resource_path('views/profile/update-profile-information-form.blade.php'))); 172 | 173 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/action-message.blade.php'))); 174 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/action-section.blade.php'))); 175 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/application-logo.blade.php'))); 176 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/application-mark.blade.php'))); 177 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/authentication-card.blade.php'))); 178 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/authentication-card-logo.blade.php'))); 179 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/button.blade.php'))); 180 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/banner.blade.php'))); 181 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/confirmation-modal.blade.php'))); 182 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/checkbox.blade.php'))); 183 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/danger-button.blade.php'))); 184 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/dialog-modal.blade.php'))); 185 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/dropdown.blade.php'))); 186 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/dropdown-link.blade.php'))); 187 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/form-section.blade.php'))); 188 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/input.blade.php'))); 189 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/input-error.blade.php'))); 190 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/label.blade.php'))); 191 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/modal.blade.php'))); 192 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/nav-link.blade.php'))); 193 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/secondary-button.blade.php'))); 194 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/section-border.blade.php'))); 195 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/section-title.blade.php'))); 196 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/switchable-team.blade.php'))); 197 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/validation-errors.blade.php'))); 198 | $this->assertTrue($this->filesystem->exists(resource_path('views/vendor/jetstream/components/welcome.blade.php'))); 199 | } 200 | 201 | /** 202 | * Basic tests shared across all inertia test methods 203 | * 204 | * @return void 205 | */ 206 | protected function basicInertiaTests() 207 | { 208 | $this->assertTrue($this->filesystem->exists(resource_path('views/app.blade.php'))); 209 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/ActionMessage.vue'))); 210 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/ActionSection.vue'))); 211 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/ApplicationLogo.vue'))); 212 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/ApplicationMark.vue'))); 213 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/Banner.vue'))); 214 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/Button.vue'))); 215 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/ConfirmationModal.vue'))); 216 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/Checkbox.vue'))); 217 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/DangerButton.vue'))); 218 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/DialogModal.vue'))); 219 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/Dropdown.vue'))); 220 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/DropdownLink.vue'))); 221 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/FormSection.vue'))); 222 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/Input.vue'))); 223 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/InputError.vue'))); 224 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/Label.vue'))); 225 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/Modal.vue'))); 226 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/NavLink.vue'))); 227 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/SecondaryButton.vue'))); 228 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/SectionBorder.vue'))); 229 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/SectionTitle.vue'))); 230 | $this->assertTrue($this->filesystem->exists(resource_path('js/Jetstream/Welcome.vue'))); 231 | $this->assertTrue($this->filesystem->exists(resource_path('js/Layouts/AppLayout.vue'))); 232 | $this->assertTrue($this->filesystem->exists(resource_path('js/Pages/Dashboard.vue'))); 233 | $this->assertTrue($this->filesystem->exists(resource_path('js/Pages/API/ApiTokenManager.vue'))); 234 | $this->assertTrue($this->filesystem->exists(resource_path('js/Pages/API/Index.vue'))); 235 | $this->assertTrue($this->filesystem->exists(resource_path('js/Pages/Profile/DeleteUserForm.vue'))); 236 | $this->assertTrue($this->filesystem->exists(resource_path('js/Pages/Profile/LogoutOtherBrowserSessionsForm.vue'))); 237 | $this->assertTrue($this->filesystem->exists(resource_path('js/Pages/Profile/Show.vue'))); 238 | $this->assertTrue($this->filesystem->exists(resource_path('js/Pages/Profile/TwoFactorAuthenticationForm.vue'))); 239 | $this->assertTrue($this->filesystem->exists(resource_path('js/Pages/Profile/UpdatePasswordForm.vue'))); 240 | $this->assertTrue($this->filesystem->exists(resource_path('js/Pages/Profile/UpdateProfileInformationForm.vue'))); 241 | } 242 | 243 | /** 244 | * Test for inertia team assets 245 | * 246 | * @return void 247 | */ 248 | protected function inertiaTeamTests() 249 | { 250 | $this->assertTrue($this->filesystem->exists(resource_path('js/Pages/Teams/Create.vue'))); 251 | $this->assertTrue($this->filesystem->exists(resource_path('js/Pages/Teams/CreateTeamForm.vue'))); 252 | $this->assertTrue($this->filesystem->exists(resource_path('js/Pages/Teams/DeleteTeamForm.vue'))); 253 | $this->assertTrue($this->filesystem->exists(resource_path('js/Pages/Teams/Show.vue'))); 254 | $this->assertTrue($this->filesystem->exists(resource_path('js/Pages/Teams/TeamMemberManager.vue'))); 255 | $this->assertTrue($this->filesystem->exists(resource_path('js/Pages/Teams/UpdateTeamNameForm.vue'))); 256 | } 257 | 258 | /** 259 | * Test for livewire team assets 260 | * 261 | * @return void 262 | */ 263 | protected function livewireTeamTests() 264 | { 265 | $this->assertTrue($this->filesystem->exists(resource_path('views/teams/create.blade.php'))); 266 | $this->assertTrue($this->filesystem->exists(resource_path('views/teams/create-team-form.blade.php'))); 267 | $this->assertTrue($this->filesystem->exists(resource_path('views/teams/delete-team-form.blade.php'))); 268 | $this->assertTrue($this->filesystem->exists(resource_path('views/teams/show.blade.php'))); 269 | $this->assertTrue($this->filesystem->exists(resource_path('views/teams/team-member-manager.blade.php'))); 270 | $this->assertTrue($this->filesystem->exists(resource_path('views/teams/update-team-name-form.blade.php'))); 271 | } 272 | } 273 | --------------------------------------------------------------------------------