namespace App\Http\Controllers;
+use App\Models\Client;
+use App\Models\User;
+use App\Notifications\ResahNotification;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Password;
+use Illuminate\Support\Facades\Validator;
+use Illuminate\Support\Facades\Hash;
trait ForgotPassword
{
protected function resetPassword($email, $token)
{
+ $clientExist = Client::where('email',$email)->first();
+ $tokenExist = Password::tokenExists($clientExist,$token);
+ if(!$email || !$token || !$clientExist || !$tokenExist) {
+ return abort(404);
+ }
+ return view('forgotpassword')->with(['reset'=> true, 'email'=> $email, 'token' => $token,'csrftoken' => csrf_token()]);
}
protected function changePassword()
{
+ $email = request('email');
+ $token = request('t');
+ $client = Client::where('email',$email)->first();
+ $tokenExist = false;
+ if($client) {
+ $tokenExist = Password::tokenExists($client, $token);
+ }
+ $validator = Validator::make(request()->all(), [
+ 'password' => 'required|confirmed|min:8',
+ ], [
+ '*.required' => 'Ce champ est obligatoire',
+ 'password.min' => 'Le mot de passe trop court',
+ 'password.confirmed' => 'Les mots de passes ne correspondent pas',
+ ]);
+
+
+ $validator->after(function ($validator) use($client, $tokenExist) {
+ if(!$client || !$tokenExist) {
+ $validator->errors()->add('password','Une erreur est survenue');
+ }
+ });
+
+
+ if ($validator->fails()) {
+ return response()->json(['errors' => $validator->errors()])->setStatusCode(422);
+ } else {
+ foreach ($validator->valid() as $k => $v) {
+ if ($k === 'password') {
+ $client->$k = Hash::make($v);
+ }
+ }
+ $client->save();
+
+ return response()->json(['success' => 'ok'])->setStatusCode(200);
+ }
}
protected function guard()
'paths' => [
resource_path('views'),
+ resource_path('webflow')
],
/*
flex-shrink: 0;
}
#Bastide_register_form input[type=checkbox]:checked::before {
- content: url('../images/valid.svg');
+ content: url('/images/valid.svg');
width: 10px;
height: 10px;
position: absolute;
--- /dev/null
+<!DOCTYPE html><!-- This site was created in Webflow. https://www.webflow.com -->
+<!-- Last Published: Tue Apr 23 2024 05:25:27 GMT+0000 (Coordinated Universal Time) -->
+<html data-wf-page="661004d856d8b276759afc4f" data-wf-site="661004d856d8b276759afc40">
+<head>
+ <meta charset="utf-8">
+ <title>Bastide</title>
+ <meta content="width=device-width, initial-scale=1" name="viewport">
+ <meta content="Webflow" name="generator">
+ <meta data-csrftoken="{{$csrftoken}}" />
+ <link href="/css/normalize.css" rel="stylesheet" type="text/css">
+ <link href="/css/webflow.css" rel="stylesheet" type="text/css">
+ <link href="/css/bastide-maquette.webflow.css" rel="stylesheet" type="text/css">
+ <link href="https://fonts.googleapis.com" rel="preconnect">
+ <link href="https://fonts.gstatic.com" rel="preconnect" crossorigin="anonymous">
+ <script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js" type="text/javascript"></script>
+ <script type="text/javascript">WebFont.load({ google: { families: ["Roboto Condensed:100,200,300,regular,500,600,700,800,900"] }});</script>
+ <script type="text/javascript">!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script>
+ <link href="/images/favicon.ico" rel="shortcut icon" type="image/x-icon">
+ <link href="/images/webclip.png" rel="apple-touch-icon">
+ <link rel="stylesheet" href="/css/custom.css">
+</head>
+<body>
+<div class="bg-login"></div>
+<div id="viewOverlay" aria-hidden="true"></div>
+<section class="main">
+ <div id="w-node-b9db0dc0-8a8b-917b-ce16-81efc12c6caf-759afc4f" class="graphics-contain"><img src="/images/carres.svg" loading="lazy" alt="" class="graphics"></div>
+ <div id="w-node-d100f643-e903-8c7d-af5b-f27e805256d0-759afc4f" class="content-wrap">
+ <a href="index.html" aria-current="page" class="logo-contain w-inline-block w--current"><img src="/images/logo-bastide.svg" loading="lazy" alt="Bastide" class="image-3"></a>
+ <div class="content-contain home">
+ <div class="div-block-8">
+ <div id="w-node-_6f9956a3-e864-4d2e-ed2a-708f54eeb981-759afc4f" class="div-block-6">
+ <h1 id="w-node-ecfbbec6-5d25-d8fb-0bfb-0e3780f4e730-759afc4f" class="heading-1">Bienvenue sur <span class="span-no-break">Bastide-resah.com</span></h1>
+ <h2 id="w-node-_2b36ab23-5dc7-0407-ff12-015028c2eea5-759afc4f" class="heading-2">Avec notre catalogue interactif, sélectionnez vos produits, déterminez votre budget en instantané, et recevez un devis par le Resah dans les 72h.</h2>
+ <div class="div-block-17"><img src="/images/compo-pages.png" loading="lazy" id="w-node-_32abe63d-96a1-8dcd-52e7-97d8c2ec03e0-759afc4f" alt="" class="image"></div>
+ <a href="/catalogue" class="button w-button">Consulter le catalogue</a>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div id="login" class="login-wrap w-node-_12259778-be95-d71b-a8f2-39430d62a8fc-759afc4f">
+ <div class="login-contain">
+ <p class="paragraph-2">Pour consulter le catalogue avec toutes ses fonctionnalités (affichage des prix, sélection de produits, demande de devis), veuillez vous identifier :</p>
+ <div class="form-block w-form">
+ <form id="wf-form-login" name="wf-form-Mot-de-passe" data-name="Mot de passe" redirect="/" data-redirect="/" action="/landing/login" method="post" class="form" data-wf-page-id="661004d856d8b276759afc4f" data-wf-element-id="99ae6f83-e84a-81db-916c-513b0ba9ed1a"><label for="email" class="field-label">Adresse Email</label><input class="text-field w-input" autofocus="true" maxlength="256" name="email" data-name="email" placeholder="" type="email" id="email" required=""><label for="password" class="field-label">Mot de passe</label><input class="text-field w-input" maxlength="256" name="password" data-name="password" placeholder="" type="password" id="password" required=""><input type="submit" data-wait="Please wait..." class="submit-button w-button" value="S'IDENTIFIER"></form>
+ <div class="w-form-done">
+ <div>Thank you! Your submission has been received!</div>
+ </div>
+ <div class="error-message w-form-fail">
+ <div>Ce compte n'existe pas !</div>
+ </div>
+ </div>
+ <a href="#" id="forgot-password" class="link" data-title="Mot de passe oublié" data-action="forgot_pass">Mot de passe oublié ?</a>
+ <div class="div-block-12">
+ <div class="div-block-14">
+ <div class="txt-line">ou</div>
+ </div>
+ <div class="div-block-13"></div>
+ </div>
+ <div class="div-block-15">
+ <p class="paragraph-2">Pas encore inscrit ?</p>
+ <a href="#" id="create-account" class="second-bt w-button" data-title="Créer un compte" data-action="register">créer un compte</a>
+ </div>
+ </div>
+ </div>
+ <div id="w-node-_04705bd0-5959-ba3d-44af-fbe28ee91ec7-759afc4f" class="login-link-contain">
+ <a href="#login" class="login-link">connexion</a>
+ </div>
+ @isset($reset)
+ <div id="reset" data-email="{{$email}}" data-token="{{$token}}"></div>
+ @endisset
+</section>
+<section class="section-footer fixed">
+ <div class="footer-wrap">
+ <div class="footer-contain">
+ <div class="footer-logos-contain">
+ <a href="#" class="w-inline-block"><img src="/images/logo-bastide.svg" loading="lazy" alt="Bastide logo" class="logo-footer"></a>
+ <a href="#" class="link-block w-inline-block"><img src="/images/resah-logo-footer-blue.svg" loading="lazy" alt="resah logo" class="logo-footer resah"></a>
+ </div>
+ <div class="footer-links-contain">
+ <a href="mentions-legales.html" class="footer-link">Mentions légales</a>
+ <a href="charte-de-protection-des-donnees-personnelles.html" class="footer-link">Charte de protection des données personnelles</a>
+ </div>
+ </div>
+ </div>
+</section>
+<script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=661004d856d8b276759afc40" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
+<script src="/js/webflow.js" type="text/javascript"></script>
+<script src="/js/custom.js"></script>
+</body>
+</html>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Calque_2" data-name="Calque 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11.25 8.61">
+ <g id="créer_un_compte" data-name="créer un compte">
+ <polygon points="3.6 6.7 .96 4.06 0 5.02 3.6 8.61 11.25 .96 10.3 0 3.6 6.7"/>
+ </g>
+</svg>
Cart.prototype = {
init: function() {
var $this = this
- var registerForm = `<div id="Bastide_cart" data-content="register"><div id="Bastide_auth_form"><form id="Bastide_register_form" class="" data-content="register" action="/fluidbook/signin">
- <div class="form-group">
- <div class="form-header">
- établissement hospitalier
- </div>
- <div class="form-controls">
- <label for="">Nom de l'établissement</label>
- <input type="text" name="hospital" />
- </div>
- <div class="form-controls">
- <label for="">Numéro de finess de l’établissement</label>
- <input type="text" name="finess" />
- </div>
- </div>
- <div class="form-group">
- <div class="form-header">
- Contact
- </div>
- <div class="form-controls">
- <label for="">Votre nom</label>
- <input type="text" name="name" />
- </div>
- <div class="form-controls">
- <label for="">Votre prénom</label>
- <input type="text" name="firstname" />
- </div>
- <div class="form-controls">
- <label for="">Votre fonction</label>
- <input type="text" name="function" />
- </div>
- <div class="form-controls">
- <label for="">votre Numéro de téléphone</label>
- <input type="text" name="phone" />
- </div>
- <div class="form-controls">
- <label for="">votre adresse email pro</label>
- <input type="email" name="email" />
- </div>
- <div class="form-controls">
- <label for="">confirmer votre adresse email PRO</label>
- <input type="text" name="email_confirmation" />
- </div>
- <div class="form-controls">
- <label for="">définir votre mot de passe</label>
- <input type="password" name="password" />
- </div>
- <div class="form-controls">
- <label for="">confirmer votre mot de passe</label>
- <input type="password" name="password_confirmation" />
- </div>
- </div>
- <div class="form-controls condition" data-valid="/images/valid.svg">
- <input id="condition_field" type="checkbox" name="accept" />
- <label for="condition_field">Je reconnais avoir été informé que les informations recueillies sur ce
- formulaire sont enregistrées dans un fichier informatisé traité par Bastide le Confort
- Médical. Pour plus d’informations je peux consulter la <a href="/charte-de-protection-des-donnees-personnelles.html">charte de protection des
- données personnelles</a>.
- </label>
- </div>
- <input type="hidden" name="_token" value="${$('meta[name="csrf-token"]').attr('content')}" />
- <button id="register" class="cta" type="submit">Valider</button>
- </form></div></div></div>`
-
$(document).on("click", '[data-action]', function () {
let title = $(this).data('title')
$this.forgotpass(formData)
})
- $(document).on("click", "#send_email_forgotpass", function(e) {
+ $(document).on("submit", "#Bastide_resetpass_form", function(e) {
e.preventDefault()
- $this.forgotpass()
+ let formData = $(this).serialize()
+ $this.resetpass(formData)
})
+ /**
+ *
+ * Reset
+ *
+ */
+ if($('#reset').length > 0) {
+ $this.openModal('Modifier votre mot de passe', $this.getCartContent('reset_pass'))
+ $this.updateDataContent()
+ }
+
+
/**
*
* Close view
},
getCaption: function(title) {
- return `<div class="caption "><a href="" id="closeview" role="button" aria-label="Fermer" aria-keyshortcuts="Escape" class="back"><svg viewBox="0 0 512 512" class="interface-close nav-icon svg-icon" aria-hidden="true"><use xlink:href="#interface-close"></use></svg></a><h2 id="mview-dialog-title">${title}</h2></div>`
+ return `<div class="caption "><a href="" id="closeview" role="button" aria-label="Fermer" aria-keyshortcuts="Escape" class="back"><svg viewBox="0 0 512 512" class="interface-close nav-icon svg-icon" aria-hidden="true"><path d="m512 63l-66-63-190 193-193-193-63 63 193 193-193 190 63 66 193-193 190 193 66-66-193-190z"></path></svg></a><h2 id="mview-dialog-title">${title}</h2></div>`
},
updateDataContent: function () {
form += `<div id="Bastide_notif_form" data-content="forgot_pass_notif"><p>Vous allez recevoir un email avec un lien vous permettant de redéfinir votre mot de passe.</p>
</div>`
break;
+ case 'reset_pass':
+ form += `<form id="Bastide_resetpass_form" data-content="resetpass">
+ <input type="hidden" value="${$('[data-csrftoken]').data('csrftoken')}" name="_token" />
+ <input type="hidden" value="${$('#reset').data('email')}" name="email" />
+ <input type="hidden" value="${$('#reset').data('token')}" name="t" />
+ <div class="form-controls">
+ <label for="">Nouveau mot de passe</label>
+ <input type="password" name="password" />
+ </div>
+ <div class="form-controls">
+ <label for="">Confirmer votre mot de passe</label>
+ <input type="password" name="password_confirmation" />
+ </div>
+ <button id="send_email_forgotpass" class="login cta" type="submit">Valider</button>
+ </form>`
+ break;
default:
form += ``
}
},
forgotpass: function(d) {
- //do action
- this.updateCart('forgot_pass_notif')
- this.updateDataContent()
+ let $this = this
+ $.ajax({
+ url: '/fluidbook/forgotpassword',
+ type: 'POST',
+ data: d,
+ success: function(data) {
+ $this.updateCart('forgot_pass_notif')
+ $this.updateDataContent()
+ },
+ error: function(xhr, status, error) {
+
+ let errorsMessage = JSON.parse(xhr.responseText);
+ $this.displayErrors(errorsMessage)
+ }
+ })
+ },
+
+ resetpass: function(d) {
+ let $this = this
+ $.ajax({
+ url: '/landing/changepassword',
+ type: 'POST',
+ data: d,
+ success: function(data) {
+ window.location.href = '/'
+ },
+ error: function(xhr, status, error) {
+ let errorsMessage = JSON.parse(xhr.responseText);
+ $this.displayErrors(errorsMessage)
+ }
+ })
},
displayErrors: function(errors) {