Compare commits

..

2 Commits

Author SHA1 Message Date
soukainna 9641f8e700 add update profile 2022-12-15 17:11:41 +01:00
soukainna c46c03fc4f add update profile 2022-12-15 17:11:28 +01:00
5 changed files with 157 additions and 10 deletions

View File

@ -36,6 +36,9 @@ views:
display: display:
files: files:
- web/layouts/conseillers/display.html - web/layouts/conseillers/display.html
update:
files:
- web/layouts/conseillers/update.html
vehicles: vehicles:
search: search:
files: files:

View File

@ -11,7 +11,7 @@
<img class="h-10 w-10 rounded-co" src="/app/beneficiaries/{{.ID}}/picture" alt=""> <img class="h-10 w-10 rounded-co" src="/app/beneficiaries/{{.ID}}/picture" alt="">
</div> </div>
<div class="flex-1 min-w-0"> <div class="flex-1 min-w-0">
<a href="/app/conseillers/{{.ID}}" class="focus:outline-none"> <a href="/app/profile/{{.ID}}" class="focus:outline-none">
<span class="absolute inset-0" aria-hidden="true"></span> <span class="absolute inset-0" aria-hidden="true"></span>
<p class="text-sm font-medium text-gray-900">{{.Data.first_name}} {{.Data.last_name}}</p> <p class="text-sm font-medium text-gray-900">{{.Data.first_name}} {{.Data.last_name}}</p>
<p class="text-sm text-gray-500 truncate">{{.Data.email}}</p> <p class="text-sm text-gray-500 truncate">{{.Data.email}}</p>

View File

@ -14,6 +14,13 @@
{{.ViewState.admins.Data.last_name}}</h1> {{.ViewState.admins.Data.last_name}}</h1>
</div> </div>
</div> </div>
<div
class="mt-6 flex flex-col-reverse justify-stretch space-y-4 space-y-reverse sm:flex-row-reverse sm:justify-end sm:space-x-reverse sm:space-y-0 sm:space-x-3 md:mt-0 md:flex-row md:space-x-3">
<!-- <button type="button"
class="inline-flex items-center justify-center px-4 py-2 border border-gray-300 shadow-sm text-sm font-medium rounded-2xl text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-100 focus:ring-co-blue">Supprimer</button> -->
<a href="/app/profile/{{.ViewState.admins.ID}}/update" class="inline-flex"><button type="button"
class="w-full px-4 py-2 border border-transparent text-sm font-medium rounded-2xl shadow-sm text-white bg-co-blue hover:bg-co-blue focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-100 focus:ring-co-blue">Modifier</button></a>
</div>
</div> </div>
<div class="mt-8 max-w-3xl mx-auto grid grid-cols-1 gap-6 sm:px-6 lg:max-w-7xl lg:grid-flow-col-dense lg:grid-cols-3"> <div class="mt-8 max-w-3xl mx-auto grid grid-cols-1 gap-6 sm:px-6 lg:max-w-7xl lg:grid-flow-col-dense lg:grid-cols-3">
@ -34,7 +41,14 @@
<dd class="mt-1 text-sm text-gray-900">{{.ViewState.admins.Data.email}}</dd> <dd class="mt-1 text-sm text-gray-900">{{.ViewState.admins.Data.email}}</dd>
</div> </div>
{{end}} {{end}}
<br> {{if .ViewState.admins.Data.phone_number}}
<div class="sm:col-span-1">
<dt class="text-sm font-medium text-gray-500">Télephone</dt>
<dd class="mt-1 text-sm text-gray-900">{{.ViewState.admins.Data.phone_number}}
</dd>
</div>
{{end}}
<div class="sm:col-span-1"> <div class="sm:col-span-1">
<dt class="text-sm font-medium text-gray-500">Nom</dt> <dt class="text-sm font-medium text-gray-500">Nom</dt>
<dd class="mt-1 text-sm text-gray-900">{{.ViewState.admins.Data.first_name}}</dd> <dd class="mt-1 text-sm text-gray-900">{{.ViewState.admins.Data.first_name}}</dd>
@ -44,6 +58,7 @@
<dd class="mt-1 text-sm text-gray-900">{{.ViewState.admins.Data.last_name}} <dd class="mt-1 text-sm text-gray-900">{{.ViewState.admins.Data.last_name}}
</dd> </dd>
</div> </div>
</dl> </dl>
</div> </div>
</div> </div>

View File

@ -0,0 +1,131 @@
{{define "content"}}
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8">
<h1 class="text-2xl font-semibold text-gray-900">Modifier vos informations</h1>
</div>
<div class="max-w-7xl mx-auto px-4 sm:px-6 md:px-8 mt-8"
x-data="{
fields: {
first_name: '{{ .ViewState.Data.first_name }}',
last_name: '{{ .ViewState.Data.last_name }}',
email: '{{ .ViewState.Data.email }}',
phone_number: '{{ .ViewState.Data.phone_number }}',
gender: {{.ViewState.Data.gender}}
},
rules: {
first_name: ['required'],
last_name: ['required'],
email: ['required', 'email'],
phone_number: ['required', 'regexMatch:^((\\+)33|0)[1-9](\\d{2}){4}$'],
},
formValidation: {
valid: false,
fields: {
first_name: {valid: null},
last_name: {valid: null},
email: {valid: null},
phone_number: {valid: null},
}
},
isFormValid: true,
validate() {
this.formValidation = Iodine.assert(this.fields, this.rules)
},
validateField(field) {
this.formValidation.fields[field] = Iodine.assert(this.fields[field], this.rules[field])
},
submit(event) {
this.validate()
if(!this.formValidation.valid) {
this.isFormValid = false
event.preventDefault()
}
return this.formValidation.valid
}
}">
<form class="space-y-6" method="POST" @submit="submit">
<div class="bg-white shadow px-4 py-5 sm:rounded-lg sm:p-6">
<div class="md:grid md:grid-cols-3 md:gap-6">
<div class="md:col-span-1">
<h3 class="text-lg font-medium leading-6 text-gray-900">Informations obligatoires</h3>
<p class="mt-1 text-sm text-gray-500">Informations personnelles sur le conseiller obligatoires
pour créer son profil dans PARCOURSMOB</p>
</div>
<div class="mt-5 md:mt-0 md:col-span-2">
<div class="grid grid-cols-6 gap-6">
<div class="col-span-6 sm:col-span-3">
<label for="first_name" class="block text-sm font-medium text-gray-700">Prénom</label>
<input type="text" name="first_name" id="first_name" autocomplete="given-name"
class="mt-1 focus:ring-co-blue focus:border-co-blue block w-full shadow-sm sm:text-sm rounded-2xl"
x-model="fields.first_name" @blur="validateField('first_name')"
:class="formValidation.fields.first_name.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
</div>
<div class="col-span-6 sm:col-span-3">
<label for="last_name" class="block text-sm font-medium text-gray-700">Nom</label>
<input type="text" name="last_name" id="last_name" autocomplete="family-name"
class="mt-1 focus:ring-co-blue focus:border-co-blue block w-full shadow-sm sm:text-sm rounded-2xl"
x-model="fields.last_name" @blur="validateField('last_name')"
:class="formValidation.fields.last_name.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
</div>
<div class="col-span-6 sm:col-span-3">
<label for="email" class="block text-sm font-medium text-gray-700">Email</label>
<input type="text" name="email" id="email" autocomplete="email"
class="mt-1 focus:ring-co-blue focus:border-co-blue block w-full shadow-sm sm:text-sm rounded-2xl"
x-model="fields.email" @blur="validateField('email')"
:class="formValidation.fields.email.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
</div>
<div class="col-span-6 sm:col-span-3">
<label for="phone_number" class="block text-sm font-medium text-gray-700">Numéro de
téléphone</label>
<input type="text" name="phone_number" id="phone_number" autocomplete="phone" placeholder="+33612345678"
class="mt-1 focus:ring-co-blue focus:border-co-blue block w-full shadow-sm sm:text-sm rounded-2xl"
x-model="fields.phone_number" @blur="validateField('phone_number')"
:class="formValidation.fields.phone_number.valid == false ? 'border-co-red border-2' : 'border-gray-300'">
</div>
</div>
</div>
</div>
</div>
<div class="bg-white shadow px-4 py-5 sm:rounded-lg sm:p-6">
<div class="md:grid md:grid-cols-3 md:gap-6">
<div class="md:col-span-1">
<h3 class="text-lg font-medium leading-6 text-gray-900">Informations optionnelles</h3>
<p class="mt-1 text-sm text-gray-500">Autres informations de profil optionnelles</p>
</div>
<div class="mt-5 space-y-6 md:mt-0 md:col-span-2">
<div class="grid grid-cols-6 gap-6">
<div class="col-span-6 sm:col-span-3">
<label for="gender" class="block text-sm font-medium text-gray-700">Genre</label>
<div class="sm:mt-0 sm:col-span-2">
<select id="gender" name="gender" autocomplete="gender" x-model="gender"
class="max-w-lg mt-1 block focus:ring-co-blue focus:border-co-blue w-full shadow-sm sm:max-w-xs sm:text-sm border-gray-300 rounded-2xl">
<option value="0">Inconnu</option>
<option value="1" :selected="fields.gender == '1'">Masculin</option>
<option value="2" :selected="fields.gender == '2'">Féminin</option>
<option value="9" :selected="fields.gender == '9'">Sans objet</option>
</select>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="flex justify-end">
<p x-show="! isFormValid" class="px-4 py-2 text-sm text-co-red">Certains champs de sont pas valides.</p>
<a href="/app/profile/{{.ViewState.ID}}">
<button type="button"
class="bg-white py-2 px-4 border border-gray-300 rounded-2xl shadow-sm text-sm font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-co-blue">Annuler</button>
</a>
<button type="submit"
class="ml-3 inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-2xl text-white bg-co-blue hover:bg-co-blue focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-co-blue">Modifier</button>
</div>
</form>
</div>
{{end}}

View File

@ -8,8 +8,6 @@
<!-- <script defer type="text/javascript" src="/public/js/main.js" defer></script> --> <!-- <script defer type="text/javascript" src="/public/js/main.js" defer></script> -->
<script src="https://cdn.jsdelivr.net/npm/@kingshott/iodine@8.1.0/dist/iodine.min.umd.js" defer></script> <script src="https://cdn.jsdelivr.net/npm/@kingshott/iodine@8.1.0/dist/iodine.min.umd.js" defer></script>
<script defer src="https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js" defer></script> <script defer src="https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js" defer></script>
<script src="https://unpkg.com/maplibre-gl@2.4.0/dist/maplibre-gl.js"></script>
<link href="https://unpkg.com/maplibre-gl@2.4.0/dist/maplibre-gl.css" rel="stylesheet" />
</head> </head>
<body class="h-full" x-data="{ offCanvasMenu: false }"> <body class="h-full" x-data="{ offCanvasMenu: false }">
@ -133,12 +131,12 @@
<div class="ml-3 relative" x-data="{ profileMenuOpen: false }"> <div class="ml-3 relative" x-data="{ profileMenuOpen: false }">
<div> <div>
<!-- <button @click="profileMenuOpen = ! profileMenuOpen" type="button" --> <!-- <button @click="profileMenuOpen = ! profileMenuOpen" type="button" -->
<button type="button" <button @click="profileMenuOpen = ! profileMenuOpen" type="button"
class="max-w-xs bg-white flex items-center text-sm rounded-co focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-co-blue" class="max-w-xs bg-white flex items-center text-sm rounded-co focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-co-blue"
id="user-menu-button" aria-expanded="false" aria-haspopup="true"> id="user-menu-button" aria-expanded="false" aria-haspopup="true">
<span class="sr-only">Open user menu</span> <span class="sr-only">Open user menu</span>
<img class="h-8 w-8 rounded-co" <img class="h-8 w-8 rounded-co"
src="http://localhost:9000/app/beneficiaries/e7616eac-4a87-4396-a505-23e0421b9c4c/picture" src="/app/beneficiaries/{{.UserID}}/picture"
alt="Menu utilisateur"> alt="Menu utilisateur">
</button> </button>
</div> </div>
@ -153,14 +151,14 @@
x-transition:leave-start="transform opacity-100 scale-100" x-transition:leave-start="transform opacity-100 scale-100"
x-transition:leave-end="transform opacity-0 scale-95"> x-transition:leave-end="transform opacity-0 scale-95">
<!-- Active: "bg-gray-100", Not Active: "" --> <!-- Active: "bg-gray-100", Not Active: "" -->
<a href="/app/profile" class="block px-4 py-2 text-sm text-gray-700" role="menuitem" tabindex="-1" <a href="/app/profile/{{.UserID}}" class="block px-4 py-2 text-sm text-gray-700" role="menuitem" tabindex="-1"
id="user-menu-item-0">Votre profil</a> id="user-menu-item-0">Votre profil</a>
<a href="/app/settings/" class="block px-4 py-2 text-sm text-gray-700" role="menuitem" tabindex="-1" <a href="/app/profile/{{.UserID}}/update" class="block px-4 py-2 text-sm text-gray-700" role="menuitem" tabindex="-1"
id="user-menu-item-1">Paramètres</a> id="user-menu-item-1">Paramètres</a>
<a href="/app/disconnect" class="block px-4 py-2 text-sm text-gray-700" role="menuitem" tabindex="-1" <!-- <a href="/app/disconnect" class="block px-4 py-2 text-sm text-gray-700" role="menuitem" tabindex="-1"
id="user-menu-item-2">Se déconnecter</a> id="user-menu-item-2">Se déconnecter</a> -->
</div> </div>
</div> </div>
</div> </div>