Files
tgFlaskFormPolimed/webApp/templates/static/js/2.0.dashboard.js
T

502 lines
20 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
function show_error(message){
$('#error_alert').slideDown(500);
$('#error_alert').delay(2000).slideUp();
if (message)
$('#alert_error_text').text(message)
}
function show_success(message){
$('#success_alert').slideDown(500);
$('#success_alert').delay(2000).slideUp();
if (message)
$('#alert_success_text').text(message)
}
function validate_length(val, dest_len){
if(val.length < dest_len){
return false;
}
return true;
}
$(document).ready(function(){
const validateEmail = (email) => {
return email.match(
/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
);
};
const validate = () => {
const email = $('#email').val();
if(validateEmail(email)){
$('#email').parent().removeClass('errors-field').addClass('success-field');
} else{
$('#email').parent().removeClass('success-field').addClass('errors-field');
}
return false;
}
$('#email').on('input', validate);
$('body').append('<div id="error_alert" class="alert alert-danger" role="alert" style="position: fixed; top: 50px; left: 10%; right: 10%; z-index: 9999; display: none;">Ошибка<br><small id="alert_error_text"></small></div>');
$('body').append('<div id="success_alert" class="alert alert-success" role="alert" style="position: fixed; top: 50px; left: 10%; right: 10%; z-index: 9999; display: none;">Успех<br><small id="alert_success_text"></small></div>');
$('#fio').on('input', function () {
let input = $(this).val();
// Убираем все лишние символы, кроме букв и пробелов
input = input.replace(/[^a-zA-Zа-яА-ЯёЁ ]/g, '');
// Преобразуем каждое слово, чтобы оно начиналось с заглавной буквы
let formattedInput = input.split(' ').map(word => {
if (word.length > 0) {
return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
}
return ''; // Пустые слова не трогаем
}).join(' '); // Объединяем обратно с пробелами
// Обновляем поле ввода с отформатированным текстом
$(this).val(formattedInput);
// Проверяем количество слов
let words = formattedInput.trim().split(/\s+/); // Убираем лишние пробелы
if (words.length < 3 || words.some(word => word.length < 2)) {
$(this).parent().removeClass('success-field').addClass('errors-field'); // Подсветить поле
} else {
$(this).parent().removeClass('errors-field').addClass('success-field'); // Убрать подсветку
}
});
$('#email').on('input', function() {
let input = $(this).val();
// Разрешаем только буквы, цифры, точки, дефисы и подчеркивания
input = input.replace(/[^a-zA-Z0-9._@-]/g, '');
// Обновляем поле ввода
$(this).val(input);
});
$('#tel').on('change', function() {
if($(this).val().length != 16){
$(this).parent().removeClass('success-field').addClass('errors-field');
} else{
$(this).parent().removeClass('errors-field').addClass('success-field');
}
});
// Проверка на дату рождения (не старше 80 лет)
$('#dob').on('change', function() {
const dob = new Date($(this).val());
const currentDate = new Date();
const age = currentDate.getFullYear() - dob.getFullYear();
// Проверка на возраст (не старше 80 лет)
if (age > 80 || (age === 80 && (currentDate.getMonth() < dob.getMonth() || (currentDate.getMonth() === dob.getMonth() && currentDate.getDate() < dob.getDate())))) {
// Если возраст больше 80 лет, подсвечиваем ячейку как ошибку
$(this).parent().removeClass('success-field').addClass('errors-field');
} else {
// Если возраст нормален, подсвечиваем ячейку как успешную
$(this).parent().removeClass('errors-field').addClass('success-field');
}
});
$('#address').on('input', function () {
let input = $(this).val();
// Преобразуем все символы в верхний регистр
input = input.toUpperCase();
// Обновляем поле ввода
$(this).val(input);
// Проверяем формат: должно быть минимум 5 частей, разделённых запятыми
let parts = input.split(',');
if (parts.length < 4 || parts.some(part => part.trim().length === 0)) {
$(this).parent().removeClass('success-field').addClass('errors-field');
} else {
$(this).parent().removeClass('errors-field').addClass('success-field');
}
});
$('#residential_address').on('input', function () {
let input = $(this).val();
// Преобразуем все символы в верхний регистр
input = input.toUpperCase();
// Обновляем поле ввода
$(this).val(input);
// Проверяем формат: должно быть минимум 5 частей, разделённых запятыми
let parts = input.split(',');
if (parts.length < 4 || parts.some(part => part.trim().length === 0)) {
$(this).parent().removeClass('success-field').addClass('errors-field');
} else {
$(this).parent().removeClass('errors-field').addClass('success-field');
}
});
// Проверка на дату выдачи паспорта (выдан после 14, 20 или 45 лет)
$('#passport_date').on('change', function() {
const passportDate = new Date($(this).val());
const dob = new Date($('#dob').val());
// Проверка, что дата рождения введена и корректна
if (!dob || isNaN(dob)) {
// Если дата рождения не введена или неверна, показываем ошибку
$(this).parent().removeClass('success-field').addClass('errors-field');
return;
}
const ageAtPassportIssue = passportDate.getFullYear() - dob.getFullYear();
// Проверка на возраст, в котором может быть выдан паспорт
if (ageAtPassportIssue > 12) {
// Если возраст при выдаче паспорта соответствует требованиям, подсвечиваем ячейку как успешную
$(this).parent().removeClass('errors-field').addClass('success-field');
} else {
// Если возраст не соответствует, показываем ошибку
$(this).parent().removeClass('success-field').addClass('errors-field');
}
});
$("#passport").attr('maxlength','12');
$('#passport').on('input', function() {
let input = $(this).val();
// Удаляем все символы, кроме цифр и пробелов
input = input.replace(/\D/g, '');
// Форматируем ввод в "00 00 000000" с пробелами
if (input.length > 2 && input.length <= 4) {
input = input.replace(/(\d{2})(\d{0,2})/, '$1 $2');
} else if (input.length > 4 && input.length <= 10) {
input = input.replace(/(\d{2})(\d{2})(\d{0,6})/, '$1 $2 $3');
}
// Ограничиваем длину до "00 00 000000"
if (input.length > 12) {
input = input.slice(0, 12);
}
// Обновляем поле ввода
$(this).val(input);
// Проверка на минимальную длину (не менее 11 символов)
if (input.length < 12) {
// Если введено меньше цифр, показываем ошибку
$(this).parent().removeClass('success-field').addClass('errors-field');
} else {
// Если введено достаточно цифр, показываем успех
$(this).parent().removeClass('errors-field').addClass('success-field');
}
});
$('#postal_code').on('input', function() {
let input = $(this).val();
// Удаляем все символы, кроме цифр
input = input.replace(/\D/g, '');
// Форматируем ввод в "000-000" только при наличии 4 и более цифр
if (input.length > 3) {
input = input.replace(/(\d{3})(\d{0,3})/, '$1-$2');
}
// Ограничиваем длину до "000-000"
if (input.length > 7) {
input = input.slice(0, 7);
}
// Обновляем поле ввода
$(this).val(input);
// Проверка на минимальную длину (не менее 11 символов)
if (input.length < 7) {
// Если введено меньше цифр, показываем ошибку
$(this).parent().removeClass('success-field').addClass('errors-field');
} else {
// Если введено достаточно цифр, показываем успех
$(this).parent().removeClass('errors-field').addClass('success-field');
}
});
$('#passport_issued_by').select2({
theme: 'bootstrap-5'
});
$("#postal_code").change(function(){
$('#passport_issued_by').empty();
$('#passport_issued_by').append('<option disabled="" selected="">Кем выдан паспорт</option>')
for(i in UFMS_list[$(this).val()])
{
item = UFMS_list[$(this).val()][i];
$('#passport_issued_by').append('<option>'+item+'</option>');
}
// $('#passport_issued_by').select2("change");
});
$('#snils').on('input', function() {
let input = $(this).val();
// Удаляем все символы, кроме цифр
input = input.replace(/\D/g, '');
// Форматируем ввод в "000-000-000-00" только после 3, 6, 9 цифр
if (input.length > 3 && input.length <= 6) {
input = input.replace(/(\d{3})(\d{0,3})/, '$1-$2');
} else if (input.length > 6 && input.length <= 9) {
input = input.replace(/(\d{3})(\d{3})(\d{0,3})/, '$1-$2-$3');
} else if (input.length > 9) {
input = input.replace(/(\d{3})(\d{3})(\d{3})(\d{0,2})/, '$1-$2-$3-$4');
}
// Ограничиваем длину до "000-000-000-00"
if (input.length > 14) {
input = input.slice(0, 14);
}
// Обновляем поле ввода
$(this).val(input);
if (input.length < 14) {
// Если введено меньше цифр, показываем ошибку
$(this).parent().removeClass('success-field').addClass('errors-field');
} else {
// Если введено достаточно цифр, показываем успех
$(this).parent().removeClass('errors-field').addClass('success-field');
}
});
$("#inn").attr('maxlength','12');
$('#inn').on('input', function() {
let input = $(this).val();
// Убираем все символы, кроме цифр
input = input.replace(/\D/g, '');
// Ограничиваем длину до 12 символов
if (input.length > 12) {
input = input.slice(0, 12);
}
// Обновляем значение в поле ввода
$(this).val(input);
if (input.length < 12) {
// Если введено меньше цифр, показываем ошибку
$(this).parent().removeClass('success-field').addClass('errors-field');
} else {
// Если введено достаточно цифр, показываем успех
$(this).parent().removeClass('errors-field').addClass('success-field');
}
});
$("#form_submit").click(function(){
$(this).children(".spinner-border").removeClass('d-none');
$(this).attr("disabled", true);
message = {}
if(!(validate_length($('#fio').val(), 3)))
{
show_error('Введите ФИО', false);
$(this).children(".spinner-border").addClass('d-none');
$(this).removeAttr("disabled");
return;
}
if(!(validate_length($('#tel').val(), 16)))
{
show_error('Введите Телефон', false);
$(this).children(".spinner-border").addClass('d-none');
$(this).removeAttr("disabled");
return;
}
if ($('#dob').val().length !== 10 || new Date().getFullYear() - new Date($('#dob').val()).getFullYear() > 80) {
show_error('Дата рождения должна быть корректной и возраст не более 80 лет', false);
$(this).children(".spinner-border").addClass('d-none');
$(this).removeAttr("disabled");
return;
}
if(!(validateEmail($('#email').val()))){
show_error('Введите корректный Email', false);
$(this).children(".spinner-border").addClass('d-none');
$(this).removeAttr("disabled");
return;
}
if(!(validate_length($('#passport').val(), 12)))
{
show_error('Введите серию и номер паспорта', false);
$(this).children(".spinner-border").addClass('d-none');
$(this).removeAttr("disabled");
return;
}
if ($('#passport_date').val().length !== 10 || (new Date($('#passport_date').val()).getFullYear() - new Date($('#dob').val()).getFullYear()) < 13) {
show_error('Проверьте дату выдачи паспорта, паспорт РФ может быть выдан с 14 лет', false);
$(this).children(".spinner-border").addClass('d-none');
$(this).removeAttr("disabled");
return;
}
if(!(validate_length($('#postal_code').val(), 7)))
{
show_error('Введите код подразделения', false);
$(this).children(".spinner-border").addClass('d-none');
$(this).removeAttr("disabled");
return;
}
if($('#passport_issued_by').val() == null){
show_error("Выберите кем выдан паспорт");
$(this).children(".spinner-border").addClass('d-none');
$(this).removeAttr("disabled");
return;
}
if ($('#address').val().split(',').length < 4 || $('#address').val().split(',').some(part => part.trim().length === 0)) {
show_error('Пожалуйста, введите адрес регистрации в следующем формате, используя заглавные буквы и расставляя все запятые:\nРЕГИОН, НАСЕЛЕННЫЙ ПУНКТ, УЛИЦА, ДОМ, КВАРТИРА', false);
$(this).children(".spinner-border").addClass('d-none');
$(this).removeAttr("disabled");
return;
}
if ($('#residential_address').val().split(',').length < 4 || $('#residential_address').val().split(',').some(part => part.trim().length === 0)) {
show_error('Пожалуйста, введите адрес проживания в следующем формате, используя заглавные буквы и расставляя все запятые:\nРЕГИОН, НАСЕЛЕННЫЙ ПУНКТ, УЛИЦА, ДОМ, КВАРТИРА', false);
$(this).children(".spinner-border").addClass('d-none');
$(this).removeAttr("disabled");
return;
}
if(!(validate_length($('#snils').val(), 14)))
{
show_error('Введите СНИЛС', false);
$(this).children(".spinner-border").addClass('d-none');
$(this).removeAttr("disabled");
return;
}
if(!(validate_length($('#inn').val(), 12)))
{
show_error('Введите ИНН', false);
$(this).children(".spinner-border").addClass('d-none');
$(this).removeAttr("disabled");
return;
}
$.each($('.tg_input'), function(e) {
message[$(this).prop("id")] = $(this).val();
});
$.ajax({
type: "post",
url: "/form_submit",
processData: false, // tell jQuery not to process the data
contentType: false, // tell jQuery not to set contentType
async: true,
data: JSON.stringify(message),
success: (data) => {
if(data.success==true){
$(this).children(".spinner-border").addClass('d-none');
$(this).removeAttr("disabled");
console.log(data);
show_success("Данные сохранены!")
}
else{
show_error(data.error);
$(this).children(".spinner-border").addClass('d-none');
$(this).removeAttr("disabled");
}
},
error:function (jqXHR, exception) {
$(this).children(".spinner-border").addClass('d-none');
$(this).removeAttr("disabled");
show_error('Что-то пошло не так', false)
}
});
});
$('#clear_tel').click(function(){
phoneStr = '';
phoneInput.value = formatPhoneString();
})
// $('.alert-placeholder').mouseenter(function(){
// var popOverSettings = {
// placement: 'bottom',
// content: $(this).data('content'),
// trigger: 'hover',
// container: this,
// offset: '0'
// }
// $(this).popover(popOverSettings);
// $(this).popover('show');
// $('.popover').addClass('alert-popover');
// });
// $('.alert-placeholder').mouseleave(function(){
// $('.alert-popover').remove()
// });
let phoneStr = '';
let formattedStr = '';
let deleteMode = false;
const phoneInput = document.querySelector('#tel');
const defaultFormat = '+7({0}{1}{2}){3}{4}{5}-{6}{7}-{8}{9}';
phoneInput.value = formatPhoneString();
phoneInput.addEventListener('keydown', (e) => {
if (e.key === 'Backspace')
deleteMode = true;
else
deleteMode = false;
});
phoneInput.addEventListener('input', (e) => {
if (deleteMode) {
phoneInput.value = phoneInput.value;
phoneStr = parsePhoneString(phoneInput.value.replace("+7", "").replace("-", ""));
} else {
if (e.inputType == 'insertText' && !isNaN(parseInt(e.data))) {
if (phoneStr.length <= 9)
phoneStr += e.data;
}
phoneInput.value = formatPhoneString();
}
});
function formatPhoneString() {
let strArr = phoneStr.split('');
formattedStr = defaultFormat;
for (let i = 0; i < strArr.length; i++) {
formattedStr = formattedStr.replace(`{${i}}`, strArr[i]);
}
if (formattedStr.indexOf('{') === -1)
{
return formattedStr;
}
else
{
return formattedStr.substring(0, formattedStr.indexOf('{'));
}
}
function parsePhoneString(str) {
return str.replace(' ', '').replace('(', '').replace(')', '').replace('-', '');
}
});