$errors->has('password')])
diff --git a/routes/auth.php b/routes/auth.php
index 2a20318c9..ac3284d60 100644
--- a/routes/auth.php
+++ b/routes/auth.php
@@ -1,8 +1,17 @@
name('login');
Route::post('login', [LoginController::class, 'login']);
Route::post('logout', [LoginController::class, 'logout'])->name('logout');
+
+// Reset
+Route::get('/password/reset', [ForgotPasswordController::class, 'show'])->name('password.request');
+Route::post('/password/email', [ForgotPasswordController::class, 'send'])->name('password.email');
+Route::get('/password/reset/{token}/{email}', [ResetPasswordController::class, 'show'])->name('password.reset');
+Route::post('/password/reset', [ResetPasswordController::class, 'reset'])->name('password.update');
diff --git a/src/Fields/Relation.php b/src/Fields/Relation.php
index 33508b0a7..40f3c5057 100644
--- a/src/Fields/Relation.php
+++ b/src/Fields/Relation.php
@@ -634,7 +634,7 @@ public function toInput(Request $request, Model $model): array
}
/**
- * Get the sub resource representation of the
+ * Get the sub resource representation of the relation
*/
public function toSubResource(Request $request, Model $model): array
{
@@ -645,7 +645,17 @@ public function toSubResource(Request $request, Model $model): array
}
/**
- * Get the index representation of the
+ * Get the fragment representation of the relation.
+ */
+ public function toFragment(Request $request, Model $model): array
+ {
+ return array_merge($this->toSubResource($request, $model), [
+ //
+ ]);
+ }
+
+ /**
+ * Get the index representation of the relation.
*/
public function toIndex(Request $request, Model $model): array
{
diff --git a/src/Http/Controllers/Auth/ForgotPasswordController.php b/src/Http/Controllers/Auth/ForgotPasswordController.php
new file mode 100644
index 000000000..5bfcceb32
--- /dev/null
+++ b/src/Http/Controllers/Auth/ForgotPasswordController.php
@@ -0,0 +1,34 @@
+validate(['email' => ['required', 'string', 'email']]);
+
+ Password::broker()->sendResetLink($data);
+
+ return Redirect::back()->with('status', __(Password::RESET_LINK_SENT));
+ }
+}
diff --git a/src/Http/Controllers/Auth/ResetPasswordController.php b/src/Http/Controllers/Auth/ResetPasswordController.php
new file mode 100644
index 000000000..67c3e2937
--- /dev/null
+++ b/src/Http/Controllers/Auth/ResetPasswordController.php
@@ -0,0 +1,69 @@
+ $request->route()->parameter('email'),
+ 'token' => $request->route()->parameter('token'),
+ ]);
+ }
+
+ /**
+ * Reset the given user's password.
+ */
+ public function reset(ResetPasswordRequest $request): RedirectResponse
+ {
+ $response = Password::broker()->reset(
+ $request->only(['email', 'password', 'password_confirmation', 'token']),
+ function (User $user, string $password): void {
+ $this->resetPassword($user, $password);
+
+ if (! $user->hasVerifiedEmail()) {
+ $user->markEmailAsVerified();
+ }
+ }
+ );
+
+ return $response == Password::PASSWORD_RESET
+ ? Redirect::route('root.dashboard')->with('message', __($response))
+ : Redirect::back()->withInput($request->only(['email']))->withErrors(['email' => __($response)]);
+ }
+
+ /**
+ * Reset the given user's password.
+ */
+ protected function resetPassword(User $user, string $password): void
+ {
+ $user->setAttribute('password', Hash::make($password));
+
+ $user->setRememberToken(Str::random(60));
+
+ $user->save();
+
+ Event::dispatch(new PasswordReset($user));
+
+ Auth::guard()->login($user);
+ }
+}