├── 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 |
4 | {{ $value ?? $slot }}
5 |
6 |
--------------------------------------------------------------------------------
/resources/views/components/button.blade.php:
--------------------------------------------------------------------------------
1 | merge(['type' => 'submit', 'class' => 'btn btn-primary']) }}>
2 | {{ $slot }}
3 |
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 | merge(['type' => 'button', 'class' => 'btn btn-danger text-white']) }}>
2 | {{ $slot }}
3 |
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 | merge(['type' => 'button', 'class' => 'btn btn-label-secondary']) }}>
2 | {{ $slot }}
3 |
4 |
--------------------------------------------------------------------------------
/resources/views/components/section-border.blade.php:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
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 |
8 | merge(['class' => $classes]) }}>
9 | {{ $slot }}
10 |
11 |
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 |
4 | merge(['class' => 'nav-link']) !!} role="button" data-toggle="dropdown" aria-expanded="false">
5 | {{ $trigger }}
6 |
7 |
8 |
11 |
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 |
7 | @foreach ($errors->all() as $error)
8 | {{ $error }}
9 | @endforeach
10 |
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 |
19 |
--------------------------------------------------------------------------------
/resources/views/components/dialog-modal.blade.php:
--------------------------------------------------------------------------------
1 | @props(['id' => null, 'maxWidth' => null])
2 |
3 |
4 |
5 |
9 |
10 | {{ $content }}
11 |
12 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/resources/views/components/confirmation-modal.blade.php:
--------------------------------------------------------------------------------
1 | @props(['id' => null, 'maxWidth' => null])
2 |
3 |
4 |
5 |
9 |
10 | {{ $content }}
11 |
12 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/resources/views/components/action-message.blade.php:
--------------------------------------------------------------------------------
1 | @props(['on'])
2 |
3 | merge(['class' => 'small']) }}>
9 |
10 | {{ $slot->isEmpty() ? 'Saved.' : $slot }}
11 |
12 |
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 |
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 |
44 |
45 | {{ $slot }}
46 |
47 |
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 |
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 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
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 |
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 |
39 | {{ __('Remove Photo') }}
40 |
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 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
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 |
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 |
52 |
53 | A new verification link has been sent to the email address you provided during registration.
54 |
55 |
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 |
65 |
66 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
98 | {{ __('Log out Other Browser Sessions') }}
99 |
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 |
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 |
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 |
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 |
49 |
50 | {{ session('status') }}
51 |
52 |
53 | @endif
54 |
55 |
95 |
96 |
97 | New on our platform?
98 | @if (Route::has('register'))
99 |
100 | Create an account
101 |
102 | @endif
103 |
104 |
105 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
121 |
122 |
123 |
124 |
125 |
126 |
127 | @endsection
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # master-laravel-bootstrap-jetstream
2 |
3 | [](//packagist.org/packages/themeselection/master-laravel-bootstrap-jetstream)
4 | [](//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 |
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 |
112 |
113 |
114 | Already have an account?
115 | @if (Route::has('login'))
116 |
117 | Sign in instead
118 |
119 | @endif
120 |
121 |
122 |
125 |
126 |
127 |
128 |
129 |
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 |
38 | {{ $permission }}
39 |
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 |
88 | {{ __('Permissions') }}
89 |
90 | @endif
91 |
92 |
94 | {{ __('Delete') }}
95 |
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 | $refs.plaintextToken.select(), 250)" />
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 |
145 | {{ $permission }}
146 |
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 |
102 | {{ __('Cancel') }}
103 |
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 |
133 |
134 |
{{ $user->name }}
135 |
136 |
137 |
138 |
139 | @if (Gate::check('addTeamMember', $team) && Laravel\Jetstream\Jetstream::hasRoles())
140 |
141 | {{ Laravel\Jetstream\Jetstream::findRole($user->membership->role)->name }}
142 |
143 | @elseif (Laravel\Jetstream\Jetstream::hasRoles())
144 |
145 | {{ Laravel\Jetstream\Jetstream::findRole($user->membership->role)->name }}
146 |
147 | @endif
148 |
149 |
150 | @if ($this->user->id === $user->id)
151 |
153 | {{ __('Leave') }}
154 |
155 |
156 |
157 | @elseif (Gate::check('removeTeamMember', $team))
158 |
160 | {{ __('Remove') }}
161 |
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 |
--------------------------------------------------------------------------------