]> _ Git - bastide-resah.git/commitdiff
wip #6882 @3:00
authorsoufiane <soufiane@cubedesigners.com>
Tue, 30 Apr 2024 16:19:25 +0000 (18:19 +0200)
committersoufiane <soufiane@cubedesigners.com>
Tue, 30 Apr 2024 16:19:25 +0000 (18:19 +0200)
app/Http/Controllers/ForgotPassword.php
config/view.php
resources/webflow/css/custom.css
resources/webflow/forgotpassword.blade.php [new file with mode: 0644]
resources/webflow/images/valid.svg [new file with mode: 0644]
resources/webflow/js/custom.js

index 8b7631e60fe37a9907776c92432e2a9ea470a6ea..0937d5935595a7cfad8d32738a03be6202848dda 100644 (file)
@@ -2,8 +2,13 @@
 
 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
 {
@@ -21,12 +26,53 @@ 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()
index 22b8a18d325814f221fb0481fa7ab320b612d601..1a52a7f4df6a3a8e2fa0ea242bfe8796e6ff3363 100644 (file)
@@ -15,6 +15,7 @@ return [
 
     'paths' => [
         resource_path('views'),
+        resource_path('webflow')
     ],
 
     /*
index 2f98175cf8a491ffc2116943bdbbae8a967abee5..b342b803d92627499c1a5fe725187cd61e4038d7 100644 (file)
@@ -193,7 +193,7 @@ input {
     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;
diff --git a/resources/webflow/forgotpassword.blade.php b/resources/webflow/forgotpassword.blade.php
new file mode 100644 (file)
index 0000000..9d536bb
--- /dev/null
@@ -0,0 +1,90 @@
+<!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&#x27;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&#x27;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>
diff --git a/resources/webflow/images/valid.svg b/resources/webflow/images/valid.svg
new file mode 100644 (file)
index 0000000..c6ad07e
--- /dev/null
@@ -0,0 +1,6 @@
+<?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>
index fd2fe2c4a08b90730fe65910911f731bc209888f..04dc657be86e4ec39373395f3af419c9dc979f00 100644 (file)
@@ -5,69 +5,6 @@ function Cart() {
 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')
@@ -109,12 +46,24 @@ Cart.prototype = {
             $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
@@ -137,7 +86,7 @@ Cart.prototype = {
     },
 
     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 () {
@@ -249,6 +198,22 @@ Cart.prototype = {
                 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 += ``
         }
@@ -286,9 +251,37 @@ Cart.prototype = {
     },
 
     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) {