mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-10-31 07:49:57 +01:00 
			
		
		
		
	Merge branch 'phone_input' into 'main'
Phone input See merge request bde/nk20!351
This commit is contained in:
		| @@ -10,6 +10,7 @@ from django.contrib.auth.forms import AuthenticationForm | ||||
| from django.contrib.auth.models import User | ||||
| from django.db import transaction | ||||
| from django.forms import CheckboxSelectMultiple | ||||
| from phonenumber_field.formfields import PhoneNumberField | ||||
| from django.utils import timezone | ||||
| from django.utils.translation import gettext_lazy as _ | ||||
| from note.models import NoteSpecial, Alias | ||||
| @@ -45,6 +46,11 @@ class ProfileForm(forms.ModelForm): | ||||
|     A form for the extras field provided by the :model:`member.Profile` model. | ||||
|     """ | ||||
|     # Remove widget=forms.HiddenInput() if you want to use report frequency. | ||||
|     phone_number = PhoneNumberField( | ||||
|         widget=forms.TextInput(attrs={"type": "tel", "class": "form-control"}), | ||||
|         required=False | ||||
|     ) | ||||
|  | ||||
|     report_frequency = forms.IntegerField(required=False, initial=0, label=_("Report frequency")) | ||||
|  | ||||
|     last_report = forms.DateTimeField(required=False, disabled=True, label=_("Last report date")) | ||||
| @@ -72,7 +78,12 @@ class ProfileForm(forms.ModelForm): | ||||
|         if not self.instance.section or (("department" in self.changed_data | ||||
|                                          or "promotion" in self.changed_data) and "section" not in self.changed_data): | ||||
|             self.instance.section = self.instance.section_generated | ||||
|         return super().save(commit) | ||||
|         instance = super().save(commit=False) | ||||
|         if instance.phone_number: | ||||
|             instance.phone_number = instance.phone_number.as_e164 | ||||
|         if commit: | ||||
|             instance.save() | ||||
|         return instance | ||||
|  | ||||
|     class Meta: | ||||
|         model = Profile | ||||
|   | ||||
| @@ -10,7 +10,7 @@ SPDX-License-Identifier: GPL-3.0-or-later | ||||
|         {{ title }} | ||||
|     </h3> | ||||
|     <div class="card-body"> | ||||
|         <form method="post"> | ||||
|         <form method="post" id="profile-form"> | ||||
|             {% csrf_token %} | ||||
|             {{ form | crispy }} | ||||
|             {{ profile_form | crispy }} | ||||
| @@ -20,4 +20,46 @@ SPDX-License-Identifier: GPL-3.0-or-later | ||||
|         </form> | ||||
|     </div> | ||||
| </div> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block extrajavascript %} | ||||
| <!-- intl-tel-input CSS/JS --> | ||||
| <script> | ||||
| (() => { | ||||
|     const input = document.querySelector("input[name='phone_number']"); | ||||
|     const form = document.querySelector("#profile-form"); | ||||
|  | ||||
|     if (!input || !form) { | ||||
|         console.error("Input phone_number ou form introuvable."); | ||||
|     } | ||||
|  | ||||
|     const iti = window.intlTelInput(input, { | ||||
|         initialCountry: "auto", | ||||
|         nationalMode: false, | ||||
|         autoPlaceholder: "off", | ||||
|         geoIpLookup: callback => { | ||||
|             fetch("https://ipapi.co/json") | ||||
|                 .then(res => res.json()) | ||||
|                 .then(data => callback(data.country_code)) | ||||
|                 .catch(() => callback("fr")); | ||||
|         }, | ||||
|         loadUtils: () => import("https://cdn.jsdelivr.net/npm/intl-tel-input@25.5.2/build/js/utils.js"), | ||||
|     }); | ||||
|  | ||||
|     form.addEventListener("submit", function(e){ | ||||
|         if (!input.value.trim()) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         const number = iti.getNumber(intlTelInput.utils.numberFormat.E164); | ||||
|         if (number) { | ||||
|             input.value = number; | ||||
|             form.submit(); | ||||
|         } else { | ||||
|             e.preventDefault(); | ||||
|             input.focus(); | ||||
|         } | ||||
|     }); | ||||
| })(); | ||||
| </script> | ||||
| {% endblock %} | ||||
| @@ -11,7 +11,7 @@ SPDX-License-Identifier: GPL-3.0-or-later | ||||
|         {{ title }} | ||||
|     </h3> | ||||
|     <div class="card-body"> | ||||
|         <form method="post"> | ||||
|         <form id="registration-form" method="post"> | ||||
|             {% csrf_token %} | ||||
|             {{ form|crispy }} | ||||
|             {{ membership_form|crispy }} | ||||
| @@ -22,6 +22,46 @@ SPDX-License-Identifier: GPL-3.0-or-later | ||||
| {% endblock %} | ||||
|  | ||||
| {% block extrajavascript %} | ||||
| <!-- intl-tel-input CSS/JS --> | ||||
| <script> | ||||
| (() => { | ||||
|     const input = document.querySelector("input[name='emergency_contact_phone']"); | ||||
|     const form = document.querySelector("#registration-form"); | ||||
|  | ||||
|     if (!input || !form) { | ||||
|         console.error("Input phone_number ou form introuvable."); | ||||
|     } | ||||
|  | ||||
|     const iti = window.intlTelInput(input, { | ||||
|         initialCountry: "auto", | ||||
|         nationalMode: false, | ||||
|         autoPlaceholder: "off", | ||||
|         geoIpLookup: callback => { | ||||
|             fetch("https://ipapi.co/json") | ||||
|                 .then(res => res.json()) | ||||
|                 .then(data => callback(data.country_code)) | ||||
|                 .catch(() => callback("fr")); | ||||
|         }, | ||||
|         loadUtils: () => import("https://cdn.jsdelivr.net/npm/intl-tel-input@25.5.2/build/js/utils.js"), | ||||
|     }); | ||||
|  | ||||
|     form.addEventListener("submit", function(e){ | ||||
|         if (!input.value.trim()) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         const number = iti.getNumber(intlTelInput.utils.numberFormat.E164); | ||||
|         if (number) { | ||||
|             input.value = number; | ||||
|             form.submit(); | ||||
|         } else { | ||||
|             e.preventDefault(); | ||||
|             input.focus(); | ||||
|         } | ||||
|     }); | ||||
| })(); | ||||
| </script> | ||||
|  | ||||
| {% if not object.membership %} | ||||
| <script> | ||||
|     $(document).ready(function () { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user