]> _ Git - pmi.git/commitdiff
wip #5789 @6:00
authorsoufiane <soufiane@cubedesigners.com>
Thu, 23 Mar 2023 17:00:52 +0000 (18:00 +0100)
committersoufiane <soufiane@cubedesigners.com>
Thu, 23 Mar 2023 17:00:52 +0000 (18:00 +0100)
app/Http/Controllers/AjaxController.php
app/SubForms/Address.php
resources/js/app.js
resources/styles/components/signin.styl
resources/views/pages/my_account.blade.php
resources/views/pages/sign_in.blade.php
resources/views/partials/nav-account.blade.php

index 495786e27e30b43a40c05fcd63c6f4ee4e96868e..5fb925795f721318cfcc325d71c8dee63e8825b6 100644 (file)
@@ -288,9 +288,16 @@ class AjaxController extends CubistFrontController
 
     public function validation_form(Request $request, $validation){
         $messages = [
-            '*.required' => __('Ce champs est requis'),
+            '*.required' => __('Veuillez remplir les champs obligatoires'),
             'email.email' => __('Veuillez indiquer une adresse email valide'),
-            'email.unique' => __('Cette adresse existe déjà')
+            'email.unique' => __('Cette adresse existe déjà'),
+            'password.min' => __('Mot de passe trop court, minimum 8 caractères'),
+            'firstname.max' => __("Maximum 255 caractères"),
+            'phone.numeric' => __("Numéro de téléphone invalide"),
+            'vat.min' => __("Numéro de TVA intracommunautaire trop court"),
+            'vat.regex' => __("Numéro de TVA intracommunautaire invalide"),
+            'siren.min' => __("Numéro de SIREN invalide"),
+            "*zipcode.numeric" => __("Code postal invalide")
         ];
 
         $validator = Validator::make($request->all(), $validation, $messages);
@@ -298,6 +305,7 @@ class AjaxController extends CubistFrontController
             throw new ValidationException($validator);
         }
 
+
         $validator->validate();
         return $validator->validated();
     }
@@ -342,8 +350,8 @@ class AjaxController extends CubistFrontController
             'firstname' => 'required|string|max:255',
             'phone' => 'required|numeric',
             'company' => 'required|string',
-            'vat' => 'required|alpha_num|min:13',
-            'siren' => 'required|numeric',
+            'vat' => 'required|string|min:13|max:13|regex:/^[a-zA-Z]{2}\d{11}$/',
+            'siren' => 'required|string|min:9|max:9',
             'address.*.address' => 'required|string|max:255',
             'address.*.zipcode' => 'required|numeric',
             'address.*.city' => 'required|string|max:255',
@@ -356,6 +364,10 @@ class AjaxController extends CubistFrontController
         $data['status'] = 0;
         $data['password'] = Hash::make($data['password']);
 
+        if (!strstr($data['vat'], $data['siren']) || substr($data['vat'], '-9') !== $data['siren']) {
+            throw ValidationException::withMessages(['siren' => __('Le numero de siren est incorrect')]);
+        }
+
         $client = new Client($data);
         $client->save();
 
@@ -372,7 +384,7 @@ class AjaxController extends CubistFrontController
             }elseif(in_array($key,['phone'])){
                 $validation[$key] = 'required|numeric';
             }elseif ($key === "actually_password"){
-                $validation[$key] = 'required';
+                $validation[$key] = 'required|missing';
             }elseif ($key === "password"){
                 $validation[$key] = 'required|confirmed|min:8';
             }
index 495d3b145724d65b5f4a9af470873b80e097c123..38deba37f98d5c7025b929a90673325a50917de4 100644 (file)
@@ -15,9 +15,6 @@ class Address extends SubForm {
             'type' => 'Integer',
             'attributes' => [
                 'disabled' => 'disabled'
-            ],
-            'options' => [
-                'auto_increment' => true
             ]
         ]);
 
index ddde1fda0ab2faa95941e2e200c3ef85e308ce09..b067e2ca0ad82041f6b5c157431a22f9ef85fe55 100644 (file)
@@ -32,7 +32,9 @@ window.eventBus = new Vue();
 
 import PortalVue from 'portal-vue';
 import Ar from "../../public/vendor/adminlte/bower_components/moment/src/locale/ar";
+import VueTheMask from 'vue-the-mask'
 
+Vue.use(VueTheMask)
 Vue.use(PortalVue);
 
 /**
@@ -67,6 +69,7 @@ const app = new Vue({
         validateRegister: false,
         tab: 'infos',
         addresses: [{}],
+        errorsForm: {},
         user: '',
         default_billing_address: null,
         default_delivery_address: null
@@ -74,6 +77,7 @@ const app = new Vue({
 
     beforeMount() {
         this.items = JSON.parse(this.$el.dataset.cartItems);
+        this.tab = window.location.hash.replace('#','') || 'infos'
         this.getUser()
     },
 
@@ -97,7 +101,7 @@ const app = new Vue({
     },
 
     updated(){
-        console.log(this.selected)
+        //console.log(this.selected)
     },
 
     computed: {
@@ -112,6 +116,12 @@ const app = new Vue({
     },
 
     methods: {
+        resetUrlAccount() {
+            let hash = window.location.hash
+            let fullUrl = window.location.origin+window.location.pathname
+            if(hash)
+                history.pushState("", "", fullUrl);
+        },
         saveCart(data) {
             let root = this;
             axios.post('/ajax/cart', data)
@@ -155,10 +165,15 @@ const app = new Vue({
             this.type = this.type === "password" ? "text" : "password"
         },
         removeErrors() {
-            let errorMessage = document.querySelectorAll('.form-error')
+            let errorMessage = document.querySelectorAll('.form-error'),
+                errorInput = document.querySelectorAll('.error')
+
             for (var i = 0; i < errorMessage.length; i++) {
                 errorMessage[i].remove();
             }
+            for (var i = 0; i < errorInput.length; i++) {
+                errorInput[i].classList.remove('error');
+            }
         },
         checkEmailExist() {
             let root = this,
@@ -221,24 +236,36 @@ const app = new Vue({
                     })
                     root.validateRegister = true
                     root.email_signin = ''
+                    root.errorsForm = {}
                 })
                 .catch(function (error) {
                     if (error.response) {
                         let errors = error.response.data.errors
+                        root.errorsForm = errors
+                        console.log(errors)
                         root.removeErrors()
 
                         for (let k in errors) {
+                            if(k.indexOf('.')){
+                                let keys = k.split('.')
+                                for(let i = 0; i < keys.length; i++){
+                                    if(i !== 0){
+                                        k += '['+keys[i]+']'
+                                    }else{
+                                        k = keys[i]
+                                    }
+                                }
+                                console.log(k)
+                            }
                             let el = document.querySelector('[name=' + k + ']')
-                            let span = document.createElement("span")
-                            span.classList.add('form-error')
-                            span.innerText = errors[k]
-                            el.after(span)
+                            el.classList.add('error')
                         }
                     }
                 })
         },
         activeTab(tab){
             this.tab = tab
+            this.resetUrlAccount()
         },
         getUser(){
             let root = this
index 36afbc02896cd64a90df848ac7fe5c6a1fc08647..d5e55cd4c53ab60f056b3d900d4e69d5995f9f59 100644 (file)
@@ -11,6 +11,8 @@
     place-content: center
     padding: 0
     position: relative
+    &.error:before
+      border-color: theme('colors.red')
     &:before
       content: ""
       width: 16px
 
   .line-up
     border-top: 1px solid #D5D7DF
+
+[class*="-form-errors"]
+  padding: 20px
+  background: rgba(248,30,96,.21)
+  li
+    color: theme('colors.red')
+    &:not(:last-child)
+      padding-bottom: 3px
index 91b8abf22c09d559814ba58de704524ac6cb9994..e8cb493905c5783b7f79c461652172cfeee177fd 100644 (file)
                 </ul>
 
                 <div class="account-container-content bg-grey-200">
-                    <div id="account-infos" v-if="tab === 'infos'">
+                    <div id="account-infos" v-cloak v-if="tab === 'infos'">
                         <div class="pb-12 border-b border-b-light-b">
                             <h2 class="text-2xl m-0">{{ $client->company }}</h2>
                             <p>
                                 N° TVA : {{ $client->vat }}<br>
                                 SIREN : {{ $client->siren }}
                             </p>
-                            <a href="">{{ __('Signaler une modification') }}</a>
+                            <a href="/contact">{{ __('Signaler une modification') }}</a>
                         </div>
                         <div class="ajax-form flex flex-col pt-12">
                             <h2 class="text-2xl m-0">{{ __('Mes coordonnées') }}</h2>
@@ -71,7 +71,7 @@
                                 @svg('icon-white-add')
                             </button>
                         </div>
-                        <div class="ajax-form flex flex-col pt-12" v-for="(address, key) in addresses" :key="key">
+                        <div class="ajax-form flex flex-col pt-12" v-for="(address, key, index) in addresses" :key="key">
                             <address-form />
                         </div>
                     </div>
index df48aaa67e94719c35d6f717c88ff47fdc0d333a..9996223126abafac1871a24d8f7714463f72d694 100644 (file)
         <div class="signup-form" v-cloak v-if="!emailExist && validateEmail">
             <div class="ajax-form flex flex-col max-w-half">
                 <div class="form-info text-navy mb-10">
-                    <h1 class="text-4xl m-0">Créer un compte</h1>
+                    <h1 class="text-4xl m-0">{{ __("Créer un compte") }}</h1>
+                </div>
+                <div class="signup-form-errors mb-10" v-if="errorsForm.length > 0">
+                    <ul class="list-disc list-inside text-red">
+                        <li class="leading-5" v-for="(errorName,errorKey) in errorsForm">
+                            @{{ errorName[0] }}
+                        </li>
+                    </ul>
                 </div>
                 <form id="signup-form" class="form-portal" @submit.prevent="signup()">
                     @csrf
                     <div class="form-group mb-12">
                         <h2 class="text-2xl">{{ __('Profil') }}</h2>
                         <div class="fields grid">
-                            <label class="form-input half mb-6 text-navy">
-                                {{ __('Nom') }}<span>*</span>
-                                <input class="py-3 mt-3" type="text" required="required" name="lastname" />
-                            </label>
                             <label class="form-input half mb-6 text-navy">
                                 {{ __('Prénom') }}<span>*</span>
                                 <input class="py-3 mt-3" type="text" required="required" name="firstname" />
                             </label>
+                            <label class="form-input half mb-6 text-navy">
+                                {{ __('Nom') }}<span>*</span>
+                                <input class="py-3 mt-3" type="text" required="required" name="lastname" />
+                            </label>
                             <label class="form-input text-navy">
                                 {{ __('Téléphone') }}<span>*</span>
                                 <input class="py-3 mt-3" type="text" required="required" name="phone" />
                             <input class="py-3 mt-3" type="text" required="required" name="company" />
                         </label>
                         <label class="form-input mb-6 text-navy">
-                            {{ __('TVA') }}<span>*</span>
-                            <input class="py-3 mt-3" type="text" required="required" name="vat" />
+                            {{ __('Numéro de TVA intracommunautaire') }}<span>*</span>
+                            <input class="py-3 mt-3" type="text" v-mask="'SS###########'" required="required" name="vat" />
                         </label>
                         <label class="form-input text-navy">
                             {{ __('Siren') }}<span>*</span>
-                            <input class="py-3 mt-3" type="text" required="required" name="siren" />
+                            <input class="py-3 mt-3" type="text" v-mask="'#########'" required="required" name="siren" />
                         </label>
                     </div>
                     <div class="form-group">
                         <input type="hidden" value="1" name="address[billing][billing_address]" />
                         <input type="hidden" :value="address_choice ? '1' : '0'" name="address[billing][delivery_address]" />
                         <input type="hidden" value="0" name="address[billing][id]" />
-                        <input type="hidden" :value="address_choice ? '0' : '1'" name="address[delivery][id]" />
+
+                        <label class="flex mb-6">
+                            <input type="checkbox" v-model="address_choice" checked name="same-address" class="w-4 h-4" />
+                            <span class="ml-4">{{ __('Mon adresse de facturation est identique à mon adresse de livraison') }}</span>
+                        </label>
 
                         <div class="form-group line-up mt-12 pt-12" v-if="!address_choice">
                             <label class="form-input mb-6 text-navy">
                             </div>
                             <input type="hidden" value="0" name="address[delivery][billing_address]" />
                             <input type="hidden" value="1" name="address[delivery][delivery_address]" />
+                            <input type="hidden" :value="address_choice ? '0' : '1'" name="address[delivery][id]"/>
                         </div>
 
                     </div>
                     <div class="form-group">
-                        <label class="flex mb-6">
-                            <input type="checkbox" v-model="address_choice" checked name="same-address" class="w-4 h-4" />
-                            <span class="ml-4">{{ __('Mon adresse de facturation est identique à mon adresse de livraison') }}</span>
-                        </label>
                         <label class="flex mb-6">
                             <input type="checkbox" name="confirm_condition" class="w-4 h-4" />
                             <span class="ml-4">{{ __('J’accepte que PM Instrumentation utilise mes informations personnelles dans une démarche de relation clientèle') }}</span>
                         <div class="form-text mb-6">
                             En nous transmettant votre demande, vous acceptez que PM Instrumentation traite vos données
                             personnelles dans le but de vous offrir un service de qualité. Pour plus d’information sur
-                            la protection de vos données à caractère personnel, vous pouvez consulter la page Vie
-                            <a href="" target="_blank" rel="noopener">privée</a>
+                            la protection de vos données à caractère personnel, vous pouvez consulter la page
+                            <a href="/vie-privee" target="_blank" rel="noopener">Vie privée</a>
                         </div>
                     </div>
                     <div class="form-footer flex flex-wrap-reverse justify-between items-center">
index 22862709935488dd89998820c4122c098a304116..529185c904a470f1ff5c3b8afde2ac15ac837837 100644 (file)
@@ -4,6 +4,13 @@
             <a href="/mon-compte">
                 <span>{{ __('Mon compte') }}</span>
             </a>
+            <ul>
+                <li>
+                    <a href="/mon-compte#address" @click.stop="tab = 'address'">
+                        <span>{{ __('Mes adresses') }}</span>
+                    </a>
+                </li>
+            </ul>
         </li>
         <li>
             <a href="">