Skip to content

Commit 05c5655

Browse files
committed
5.4.1
1 parent 7440725 commit 05c5655

13 files changed

+110
-59
lines changed

composer.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -169,5 +169,5 @@
169169
},
170170
"minimum-stability": "dev",
171171
"prefer-stable": true,
172-
"version": "5.4.0"
172+
"version": "5.4.1"
173173
}

database/migrations/2018_01_01_000000_create_action_events_table.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public function up()
1818
Schema::create('action_events', function (Blueprint $table) {
1919
$table->id();
2020
$table->char('batch_id', 36);
21-
$table->foreignIdFor(Util::userModel(), 'user_id')->index();
21+
$table->foreignIdFor(Util::userModelOrFallback(), 'user_id')->index();
2222
$table->string('name');
2323
$table->morphs('actionable');
2424
$table->morphs('target');

package-lock.json

+16-16
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/app.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/mix-manifest.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"/app.js": "/app.js?id=2c7db6aee86bcec654c10a02f3f81021",
2+
"/app.js": "/app.js?id=3ddbff62c536804bfe9fb3e0a0157759",
33
"/ui.js": "/ui.js?id=592866a715b1c20b43fff6ca7980b279",
44
"/manifest.js": "/manifest.js?id=3267e5c99fd7b729e2f38ec55b50397d",
55
"/app.css": "/app.css?id=4ac240e9b4c482451bf95d4161751414",

public/ui.js.LICENSE.txt

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*! #__NO_SIDE_EFFECTS__ */
2+
3+
/**
4+
* @vue/compiler-core v3.5.13
5+
* (c) 2018-present Yuxi (Evan) You and Vue contributors
6+
* @license MIT
7+
**/
8+
9+
/**
10+
* @vue/reactivity v3.5.13
11+
* (c) 2018-present Yuxi (Evan) You and Vue contributors
12+
* @license MIT
13+
**/
14+
15+
/**
16+
* @vue/runtime-core v3.5.13
17+
* (c) 2018-present Yuxi (Evan) You and Vue contributors
18+
* @license MIT
19+
**/
20+
21+
/**
22+
* @vue/runtime-dom v3.5.13
23+
* (c) 2018-present Yuxi (Evan) You and Vue contributors
24+
* @license MIT
25+
**/
26+
27+
/**
28+
* @vue/shared v3.5.13
29+
* (c) 2018-present Yuxi (Evan) You and Vue contributors
30+
* @license MIT
31+
**/

resources/js/mixins/PerformsSearches.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export default {
1414
* @param {object} resource
1515
*/
1616
selectResource(resource) {
17-
this.selectedResourceId = resource.value
17+
this.selectedResourceId = resource?.value ?? null
1818

1919
if (this.field) {
2020
if (typeof this['emitFieldValueChange'] == 'function') {

src/Actions/ActionEvent.php

+4-2
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class ActionEvent extends Model
5252
*/
5353
public function user()
5454
{
55-
return $this->belongsTo(Util::userModel(), 'user_id');
55+
return $this->belongsTo(Util::userModelOrFallback(), 'user_id');
5656
}
5757

5858
/**
@@ -62,7 +62,9 @@ public function user()
6262
*/
6363
public function target()
6464
{
65-
$queryWithTrashed = static fn ($query) => $query->withTrashed();
65+
$queryWithTrashed = static function ($query) {
66+
return $query->withTrashed();
67+
};
6668

6769
return $this->morphTo('target', 'target_type', 'target_id')
6870
->constrain(

src/Http/Controllers/ImpersonateController.php

+4-3
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,10 @@ public function startImpersonating(NovaRequest $request, ImpersonatesUsers $impe
2222
}
2323

2424
/** @var class-string<\Illuminate\Contracts\Auth\Authenticatable&\Illuminate\Database\Eloquent\Model> $userModel */
25-
$userModel = with(Nova::modelInstanceForKey($request->input('resource')), static function ($model) {
26-
return ! \is_null($model) ? $model::class : Util::userModel();
27-
});
25+
$userModel = with(
26+
Nova::modelInstanceForKey($request->input('resource')),
27+
static fn ($model) => ! \is_null($model) ? $model::class : Util::userModel()
28+
);
2829

2930
$authGuard = Util::sessionAuthGuardForModel($userModel);
3031

src/Nova.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -598,7 +598,7 @@ protected static function defaultCreateUserCommandCallback(): callable
598598
protected static function defaultCreateUserCallback(): Closure
599599
{
600600
return function ($name, $email, $password) {
601-
$model = Util::userModel();
601+
$model = Util::userModelOrFallback();
602602

603603
return tap((new $model)->forceFill([
604604
'name' => $name,

src/PendingFortifyConfiguration.php

+23-25
Original file line numberDiff line numberDiff line change
@@ -346,11 +346,7 @@ public function bootstrap(): void
346346
/** @var \Laravel\Nova\PendingRouteRegistration $routes */
347347
$routes = Nova::routes();
348348

349-
if ($this->withFrontendRoutes === true && $routes->withAuthentication === false && $routes->withPasswordReset === false) {
350-
return;
351-
}
352-
353-
Nova::serving(function (ServingNova $event) {
349+
Nova::serving(function (ServingNova $event) use ($routes) {
354350
$this->sync();
355351

356352
/** @var \Illuminate\Contracts\Foundation\Application $app */
@@ -359,13 +355,28 @@ public function bootstrap(): void
359355
$app->scoped(StatefulGuard::class, static fn () => Auth::guard(Util::userGuard()));
360356
$app->scoped(RedirectAsIntended::class, RedirectAsIntendedForNova::class);
361357

362-
$app->scoped(LoginViewResponseContract::class, LoginViewResponse::class);
363-
$app->scoped(LoginResponseContract::class, LoginResponse::class);
364-
$app->scoped(LogoutResponseContract::class, LogoutResponse::class);
365-
366-
$app->scoped(ResetPasswordViewResponseContract::class, ResetPasswordViewResponse::class);
367-
$app->scoped(RequestPasswordResetLinkViewResponseContract::class, RequestPasswordResetLinkViewResponse::class);
368-
$app->scoped(ResetsUserPasswordsContract::class, ResetUserPassword::class);
358+
if ($routes->withAuthentication === true) {
359+
$app->scoped(LoginViewResponseContract::class, LoginViewResponse::class);
360+
$app->scoped(LoginResponseContract::class, LoginResponse::class);
361+
$app->scoped(LogoutResponseContract::class, LogoutResponse::class);
362+
$app->scoped(TwoFactorChallengeViewResponseContract::class, TwoFactorChallengeViewResponse::class);
363+
$app->scoped(TwoFactorLoginResponseContract::class, TwoFactorLoginResponse::class);
364+
$app->scoped(FortifyRedirectIfTwoFactorAuthenticatable::class, RedirectIfTwoFactorAuthenticatable::class);
365+
}
366+
367+
if ($routes->withPasswordReset === true) {
368+
$app->scoped(ResetPasswordViewResponseContract::class, ResetPasswordViewResponse::class);
369+
$app->scoped(RequestPasswordResetLinkViewResponseContract::class, RequestPasswordResetLinkViewResponse::class);
370+
$app->scoped(ResetsUserPasswordsContract::class, ResetUserPassword::class);
371+
372+
ResetPassword::toMailUsing(static function ($notifiable, $token) {
373+
return (new MailMessage)
374+
->subject(Nova::__('Reset Password Notification'))
375+
->line(Nova::__('You are receiving this email because we received a password reset request for your account.'))
376+
->action(Nova::__('Reset Password'), route('nova.pages.password.reset', ['token' => $token]))
377+
->line(Nova::__('If you did not request a password reset, no further action is required.'));
378+
});
379+
}
369380

370381
$app->scoped(VerifyEmailViewResponseContract::class, VerifyEmailViewResponse::class);
371382

@@ -375,19 +386,6 @@ public function bootstrap(): void
375386
$app->scoped(ConfirmPasswordViewResponseContract::class, ConfirmPasswordViewResponse::class);
376387
$app->scoped(PasswordConfirmedResponseContract::class, PasswordConfirmedResponse::class);
377388
$app->scoped(FailedPasswordConfirmationResponseContract::class, FailedPasswordConfirmationResponse::class);
378-
379-
$app->scoped(TwoFactorChallengeViewResponseContract::class, TwoFactorChallengeViewResponse::class);
380-
$app->scoped(TwoFactorLoginResponseContract::class, TwoFactorLoginResponse::class);
381-
382-
$app->scoped(FortifyRedirectIfTwoFactorAuthenticatable::class, RedirectIfTwoFactorAuthenticatable::class);
383-
384-
ResetPassword::toMailUsing(static function ($notifiable, $token) {
385-
return (new MailMessage)
386-
->subject(Nova::__('Reset Password Notification'))
387-
->line(Nova::__('You are receiving this email because we received a password reset request for your account.'))
388-
->action(Nova::__('Reset Password'), route('nova.pages.password.reset', ['token' => $token]))
389-
->line(Nova::__('If you did not request a password reset, no further action is required.'));
390-
});
391389
});
392390
}
393391
}

src/PendingRouteRegistration.php

+15-7
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,12 @@ protected function bootstrapAuthenticationRoutes(Application $app): void
238238
{
239239
$limiter = config('fortify.limiters.login');
240240

241-
if ($this->withAuthentication === true) {
241+
if ($this->withAuthentication === false && ! empty($this->loginPath)) {
242+
Nova::router(middleware: $this->authenticationMiddlewares)
243+
->group(function (Router $router) {
244+
$router->redirect('/login', $this->loginPath)->name('nova.pages.login');
245+
});
246+
} else {
242247
if (
243248
$this->withDefaultAuthentication === true
244249
&& ! Route::has('login')
@@ -259,14 +264,17 @@ protected function bootstrapAuthenticationRoutes(Application $app): void
259264
->group(static function (Router $router) {
260265
$router->post('/logout', [AuthenticatedSessionController::class, 'destroy'])->name('nova.logout');
261266
});
262-
} elseif (! empty($this->loginPath)) {
263-
Nova::router(middleware: $this->authenticationMiddlewares)
264-
->group(function (Router $router) {
265-
$router->redirect('/login', $this->loginPath)->name('nova.pages.login');
266-
});
267267
}
268268

269-
if ($this->withPasswordReset === true || Nova::fortify()->enabled(Features::resetPasswords())) {
269+
if ($this->withPasswordReset === false && ! empty($this->forgotPasswordPath)) {
270+
Nova::router(middleware: $this->passwordResetMiddlewares)
271+
->group(function (Router $router) {
272+
$router->redirect('/password/reset', $this->forgotPasswordPath)->name('nova.pages.password.email');
273+
});
274+
} elseif (
275+
$this->withPasswordReset === true
276+
|| (Nova::fortify()->enabled(Features::resetPasswords()) && $this->withDefaultAuthentication === true)
277+
) {
270278
Nova::router(middleware: $this->passwordResetMiddlewares)
271279
->group(static function (Router $router) {
272280
$router->get('/password/reset', [PasswordResetLinkController::class, 'create'])->name('nova.pages.password.email');

src/Util.php

+11
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Illuminate\Database\Eloquent\Model;
88
use Illuminate\Database\Eloquent\Relations\Concerns\AsPivot;
99
use Illuminate\Database\Eloquent\Relations\Pivot;
10+
use Illuminate\Foundation\Auth\User;
1011
use Illuminate\Http\Request;
1112
use Illuminate\Support\Str;
1213
use RuntimeException;
@@ -147,6 +148,16 @@ public static function userModel(): ?string
147148
return static::userModelFromGuard(static::userGuard());
148149
}
149150

151+
/**
152+
* Get the user model for Laravel Nova, use default User model available from Framework as fallback.
153+
*
154+
* @return class-string<\Illuminate\Foundation\Auth\User|\Illuminate\Database\Eloquent\Model>
155+
*/
156+
public static function userModelOrFallback(): string
157+
{
158+
return static::userModel() ?? User::class;
159+
}
160+
150161
/**
151162
* Get the user model for Laravel Nova.
152163
*

0 commit comments

Comments
 (0)