import { Controller } from 'stimulus'; import { sendReserve } from "./../components/record"; import Inputmask from "inputmask"; const validator = require('./../components/validator.js'); const helper = require('./../components/helper.js'); const loader = require("./../components/loader.js"); const Cookies = require('js-cookie'); /* * This is an example Stimulus controller! * * Any element with a data-controller="signin" attribute will cause * this controller to be executed. The name "signin" comes from the filename: * signin_controller.js -> "signin" * * Delete this file or adapt it for your use! */ export default class extends Controller { connect() { loader.loadSDK('signin').then(function (webSDK) { webSDK.on('init', function() { if (location.hash == '#recovery') { const popup = document.getElementById('popup'); popup.dataset.controller = 'resetPassword'; popup.dataset.recovery = true; $(popup).modal('show'); } }) }) } esia() { const element = this.element element.addEventListener('click', function() { const currentUrl = window.location.href; const redirectUrl = helper.addUrlParam(currentUrl, 'esia', 'true'); window.webSDK.loadLoginView({ authType: "esia", redirectUrl: redirectUrl, newWindow: false }); }); } login() { function renderAuth(msg = false) { var popup = document.getElementById('popup'); // Сохраняем данные записи перед очисткой popup (если они есть) if (popup && popup.dataset.reserve === 'true') { const reserveData = { specialistid: popup.dataset.specialistid, filialid: popup.dataset.filialid, depnum: popup.dataset.depnum, schedident: popup.dataset.schedident, workDate: popup.dataset.workDate, time: popup.dataset.time, onlinemode: popup.dataset.onlinemode, comment: popup.dataset.comment, docname: popup.dataset.docname, address: popup.dataset.address, company: popup.dataset.company, rnum: popup.dataset.rnum }; // Сохраняем только если есть хотя бы одно поле if (reserveData.specialistid || sessionStorage.getItem('reserveData')) { sessionStorage.setItem('reserveData', JSON.stringify(reserveData)); sessionStorage.setItem('reserveFlag', 'true'); } } var popupBody = popup.querySelector('.modal-title'); popupBody.innerText = "Авторизация"; popupBody = popup.querySelector('#popup-body'); popupBody.innerHTML = ''; popupBody.dataset.controller = 'signin'; var validMessage = document.createElement('div'); validMessage.classList = "msg-valid valid-message alert alert-danger d-none"; if (msg) { validMessage.innerHTML = msg; validMessage.classList.remove('d-none'); } popupBody.append(validMessage); var username = document.createElement('input'); username.type = "text"; username.classList = "form-control border-radius"; username.required = "true"; username.autofocus = "off"; username.autocomplete = "off"; username.id = "username"; var groupPrepend = document.createElement('div'); groupPrepend.classList = 'input-group-prepend'; var select = document.createElement('select'); select.classList = "input-group-text"; var optionEmail = document.createElement('option'); optionEmail.value = "email"; optionEmail.innerText = "Email"; select.append(optionEmail); var optionPhone = document.createElement('option'); optionPhone.value = "phone"; optionPhone.innerText = "Телефон"; select.append(optionPhone); groupPrepend.append(select); select.addEventListener('change', function() { const selectedValue = this.value; if (selectedValue === 'email') { username?.inputmask.remove(); username.type = "email"; } else if (selectedValue === 'phone') { username.type = "text"; Inputmask({ mask: '79999999999' }).mask(username); } }); var inputGroup = document.createElement('div'); inputGroup.classList = "input-group"; inputGroup.append(groupPrepend); inputGroup.append(username); var formGroup = document.createElement('div'); formGroup.classList = "form-group"; var validUsername = document.createElement('div'); validUsername.classList = "msg-valid valid-username"; formGroup.append(inputGroup); formGroup.append(validUsername); popupBody.append(formGroup); var password = document.createElement('input'); password.placeholder = "Пароль"; password.type = "password"; password.classList = "form-control border-radius"; password.required = "true"; password.id = "password"; password.addEventListener('keydown', function(evn) { if (evn.code == 'Enter') { loader.btnLoader(btnSubmit, true); submit(window.webSDK, username, password, popupBody); } }); var formGroup = document.createElement('div'); formGroup.classList = "form-group"; formGroup.dataset.controller = 'passwordShow'; formGroup.append(password); var validPassword = document.createElement('div'); validPassword.classList = "msg-valid valid-password"; formGroup.append(validPassword); popupBody.append(formGroup); /* политика */ var div = document.createElement('div'); div.classList = 'form-group'; var formCheck = document.createElement('div'); formCheck.classList = 'form-check'; div.append(formCheck); var accept = document.createElement('input'); accept.classList = "form-check-input"; accept.id = "accept"; accept.checked = false; accept.type = "checkbox"; formCheck.append(accept); var license = helper.getLicenseLink(Cookies.get('region')); var label = document.createElement('label'); label.setAttribute('for' , 'accept'); label.innerHTML = `ознакомлен(а) с условиями политики в отношении обработки персональных данных`; formCheck.append(label); var validAccept = document.createElement('div'); validAccept.classList = 'msg-valid valid-accept'; div.append(validAccept); popupBody.append(div) /* согласие */ var formCheck = document.createElement('div'); formCheck.classList = 'form-check'; div.append(formCheck); var acceptPerson = document.createElement('input'); acceptPerson.classList = "form-check-input"; acceptPerson.id = "acceptPerson"; acceptPerson.checked = false; acceptPerson.type = "checkbox"; formCheck.append(acceptPerson); var licensePerson = helper.getLicensePersonLink(); var labelPerson = document.createElement('label'); labelPerson.setAttribute('for' , 'acceptPerson'); labelPerson.innerHTML = `даю согласие на обработку персональных данных`; formCheck.append(labelPerson); var validAcceptPerson = document.createElement('div'); validAcceptPerson.classList = 'msg-valid valid-acceptPerson'; div.append(validAcceptPerson); popupBody.append(div) var btnSubmit = document.createElement('button'); btnSubmit.type = "button"; btnSubmit.innerHTML = "Войти"; btnSubmit.classList = "btn btn-outline-secondary submit"; btnSubmit.addEventListener('click', function() { let invalid = false; if (validator.checkAccept(accept, validAccept)) { invalid = true; } if (validator.checkAccept(acceptPerson, validAcceptPerson)) { invalid = true; } if (invalid == false) { loader.btnLoader(btnSubmit, true); submit(window.webSDK, username, password, popupBody); } }); var helpLink = document.createElement('a'); helpLink.classList = 'btn my-0'; helpLink.dataset.controller = 'serviceDesk'; helpLink.style = 'font-size: 21px;'; helpLink.innerHTML = ``; var guLink = document.createElement('a'); guLink.classList = 'btn my-0'; guLink.dataset.action = 'signin#esia'; guLink.innerHTML = `EISA`; var forgetLink = document.createElement('button'); forgetLink.classList = 'btn'; forgetLink.dataset.controller = 'resetPassword'; forgetLink.innerHTML = 'Забыли пароль?'; var footer = document.createElement('div'); footer.classList = 'modal-footer px-0'; footer.append(helpLink); footer.append(guLink); footer.append(forgetLink); footer.append(btnSubmit); popupBody.append(footer); } renderAuth(); var popup = document.getElementById('popup'); if (popup && typeof $(popup).modal !== 'undefined') { $(popup).modal('show'); } function submit(webSDK, username, password, popupBody) { popupBody.querySelectorAll('.msg-valid').forEach(function (e) { e.classList.add('d-none'); e.innerHTML = ''; }); webSDK.loginClient({ login: username.value, pass: password.value }).then(function(user) { if (user.result && user.result.checkdata && typeof user.result.checkdata.pToken !== 'undefined') { changeTempPassword(user.result); return false; } let data = { user: user, uid: user.id } if (window.location.pathname !== '/login') { data = { user: user, uid: user.id, redirectFrom: window.location.href } } var popup = document.getElementById('popup'); if (popup.dataset.reserve === "true") { data.redirectFrom = helper.getHostname() + '/case-history#doctor-success'; } $.ajax({ method: "POST", crossDomain: true, url: "/api/authenticated", contentType: "application/x-www-form-urlencoded", dataType: "json", data: data, success(response) { if (response.data.success == true) { // Восстанавливаем данные записи из sessionStorage если они были сохранены const reserveFlag = popup.dataset.reserve === "true" || sessionStorage.getItem('reserveFlag') === 'true'; if (reserveFlag) { // Восстанавливаем данные из sessionStorage const reserveDataStr = sessionStorage.getItem('reserveData'); if (reserveDataStr) { try { const reserveData = JSON.parse(reserveDataStr); Object.keys(reserveData).forEach(key => { if (reserveData[key] !== undefined && reserveData[key] !== null) { popup.dataset[key] = reserveData[key]; } }); console.log('Данные записи восстановлены из sessionStorage:', reserveData); } catch (e) { console.error('Ошибка при восстановлении данных из sessionStorage:', e); } } // Устанавливаем флаг reserve если его нет popup.dataset.reserve = 'true'; // Проверяем наличие всех необходимых полей перед вызовом sendReserve const requiredFields = ['specialistid', 'filialid', 'depnum', 'schedident', 'workDate', 'time']; const missingFields = requiredFields.filter(field => !popup.dataset[field]); if (missingFields.length > 0) { console.error('Отсутствуют необходимые поля для записи:', missingFields); alert('Ошибка: не удалось восстановить данные для записи. Пожалуйста, попробуйте записаться снова.'); // Очищаем sessionStorage sessionStorage.removeItem('reserveData'); sessionStorage.removeItem('reserveFlag'); // Делаем обычный редирект var parser = document.createElement('a'); parser.href = response.data.redirect; window.location.replace(helper.getHostname() + parser.pathname + parser.search); return; } // Очищаем sessionStorage после успешного восстановления sessionStorage.removeItem('reserveData'); sessionStorage.removeItem('reserveFlag'); } if (window.bitrix === true) { if (reserveFlag) { // Для bitrix тоже нужно вызвать sendReserve для создания записи // Сообщение покажет сам sendReserve после успешной записи sendReserve(popup); } else { // Если не было флага reserve, показываем обычное сообщение popup.querySelector('.modal-title').innerHTML = 'Запись на прием'; var message = '

Спасибо, Вы успешно записались на прием.
'; message += popup.dataset.comment + ', '; message += popup.dataset.workDate + ' ' + popup.dataset.time + '

'; message += '

Вы всегда можете отменить или перенести запись в личном кабинете по ссылке: '; message += 'https://cabinet.sovamed.ru

'; popup.querySelector('#popup-body').innerHTML = message; } } else { if (reserveFlag) { // Если нужно создать запись, вызываем sendReserve, который сам сделает редирект sendReserve(popup); } else { // Иначе делаем обычный редирект var parser = document.createElement('a'); parser.href = response.data.redirect; window.location.replace(helper.getHostname() + parser.pathname + parser.search); } } } } }); }).catch(function(error) { helper.sendRequest({ data: {'error': error, login: username.value, method: 'loginClient'} }, helper.getHostname() + '/api/log', "POST", "json", true, "application/json"); var btnSubmit = popupBody.querySelector('button.submit'); loader.btnLoader(btnSubmit, false); for (var prop in error.data) { if (error.data[prop]) { var el = popupBody.querySelector('.valid-' + prop) el.classList.remove('d-none'); el.innerHTML = error.data[prop]; } } }); }; function changeTempPassword(response) { var popup = document.getElementById('popup'); var popupBody = popup.querySelector('.modal-title') .innerText = "Смена временного пароля"; var popupBody = popup.querySelector('#popup-body'); popupBody.innerHTML = ''; var validMessage = document.createElement('div'); validMessage.classList = "msg-valid valid-message alert alert-warning"; validMessage.innerHTML = response.checkdata.msg; popupBody.append(validMessage); var password = document.createElement('input'); password.placeholder = "Новый пароль"; password.type = "password"; password.classList = "form-control border-radius"; password.required = "true"; password.id = "password"; var formGroup = document.createElement('div'); formGroup.classList = "form-group"; formGroup.append(password); var validPassword = document.createElement('div'); validPassword.classList = "msg-valid valid-password"; formGroup.append(validPassword); popupBody.append(formGroup); var confirm = document.createElement('input'); confirm.placeholder = "Подтверждение"; confirm.type = "password"; confirm.classList = "form-control border-radius"; confirm.required = "true"; confirm.id = "confirm"; var formGroup = document.createElement('div'); formGroup.classList = "form-group"; formGroup.append(confirm); var validConfirm = document.createElement('div'); validConfirm.classList = "msg-valid valid-confirm"; formGroup.append(validConfirm); popupBody.append(formGroup); var btnSubmit = document.createElement('button'); btnSubmit.type = "button"; btnSubmit.innerHTML = "Сменить пароль"; btnSubmit.classList = "btn btn-outline-secondary submit"; btnSubmit.addEventListener('click', function() { if (/^[\u0400-\u04FF]+$/.test(password.value)) { popupBody.querySelector('.valid-password') .innerHTML = 'Поле не должно содержать кириллицы'; return false; } else { popupBody.querySelector('.valid-password').innerHTML = ''; } if (password.value !== confirm.value) { popupBody.querySelector('.valid-confirm') .innerHTML = 'Подтверждение не совпадает с паролем'; return false; } else { popupBody.querySelector('.valid-confirm').innerHTML = ''; } loader.btnLoader(btnSubmit, true); window.webSDK.changeTempPassword({ pwdToken: response.checkdata.pToken, password: password.value, confirm: confirm.value }).then(function(resolve) { renderAuth(resolve.data.success); }).catch(function(e) { helper.sendRequest({ data: {'error': e, method: 'changeTempPassword'} }, helper.getHostname() + '/api/log', "POST", "json", true, "application/json"); var btnSubmit = popupBody.querySelector('button.submit'); loader.btnLoader(btnSubmit, false); for (var prop in e.data.errors) { if (e.data.errors[prop]) { var el = popupBody.querySelector('.valid-' + prop.split('.')[1]) el.classList.remove('d-none'); el.innerHTML = e.data.errors[prop][0]; } } }) }); var footer = document.createElement('div'); footer.classList = 'modal-footer'; footer.append(btnSubmit); popupBody.append(footer); } } }