|
580 | 580 |
|
581 | 581 | function editClientByBtn(event) { |
582 | 582 | const row = event.target.closest('tr'); // фиксация всей строки |
583 | | - |
584 | 583 | if (!row || !event.target.classList.contains('table-row-btn-edit')) return; // не нашли, возврат |
585 | 584 |
|
586 | 585 | const clientServerId = row.getAttribute('data-server-id'); // фиксация серверного id (из атрибута) |
|
594 | 593 | return; |
595 | 594 | } |
596 | 595 |
|
597 | | - // ? |
598 | | - const originalClientData = JSON.parse(JSON.stringify(clientData)); // создание копии данных клиента (приходящих с сервера) |
599 | | - const modalWrap = createModalWindowByType('edit', clientData); |
| 596 | + const modalWrap = createModalWindowByType('edit', clientData); // создание "универсального" модального окна (согласно передаваемого типа) |
600 | 597 |
|
601 | 598 | // фиксация элементов формы |
602 | | - const inputSurname = modalWrap.querySelector( |
603 | | - '#modal-surname-floating-input' |
604 | | - ); |
605 | | - const inputName = modalWrap.querySelector('#modal-name-floating-input'); |
606 | | - const inputPatronymic = modalWrap.querySelector( |
607 | | - '#modal-patronymic-floating-input' |
608 | | - ); |
| 599 | + const inputSurname = modalWrap.querySelector('.modal-surname-input'); |
| 600 | + const inputName = modalWrap.querySelector('.modal-name-input'); |
| 601 | + const inputPatronymic = modalWrap.querySelector('.modal-patronymic-input'); |
609 | 602 | const addContactBtn = modalWrap.querySelector('.modal__body-add-btn'); |
610 | 603 |
|
611 | 604 | if (!addContactBtn) { |
|
657 | 650 | const bootstrapModal = new bootstrap.Modal(modalWrap); |
658 | 651 | bootstrapModal.show(); |
659 | 652 |
|
| 653 | + // добавление валидации для вводимых/корректируемых данных/в модальном окне (для "основных" инпутов, ФИО) |
| 654 | + const allModalBodyFormInputs = |
| 655 | + modalWrap.querySelectorAll('.modal__body-input'); |
| 656 | + mainInputsValidation(allModalBodyFormInputs, { |
| 657 | + allowOnlyRussian: true, |
| 658 | + singleHyphen: true, |
| 659 | + noExtraSpaces: true, |
| 660 | + }); |
| 661 | + |
660 | 662 | // принудительное удаление атрибута aria-hidden="true" с модального окна (исключение ошибки с ARIA) |
661 | 663 | deleteAriaHiddenTrue(modalWrap); |
662 | 664 | } |
|
2498 | 2500 | } |
2499 | 2501 | } |
2500 | 2502 |
|
| 2503 | + // ** [СЕРВЕР] корректировка данных/клиентов на сервере, получение обратно (проверка статуса) |
| 2504 | + async function editClientOnServer(clientId, clientData) { |
| 2505 | + try { |
| 2506 | + const response = await fetch( |
| 2507 | + `http://localhost:3000/api/clients/${clientId}`, |
| 2508 | + { |
| 2509 | + method: 'PATCH', |
| 2510 | + headers: { |
| 2511 | + 'Content-Type': 'application/json', |
| 2512 | + }, |
| 2513 | + body: JSON.stringify(clientData), |
| 2514 | + } |
| 2515 | + ); |
| 2516 | + |
| 2517 | + if (!response.ok) { |
| 2518 | + if (response.status === 422) { |
| 2519 | + const errorData = await response.json(); |
| 2520 | + throw new Error( |
| 2521 | + `Ошибка валидации: ${errorData.errors |
| 2522 | + .map((e) => e.message) |
| 2523 | + .join(', ')}` |
| 2524 | + ); |
| 2525 | + } else { |
| 2526 | + throw new Error(`Ошибка: ${response.status}`); |
| 2527 | + } |
| 2528 | + } |
| 2529 | + |
| 2530 | + await getClientsServerListData(); // Обновляем список клиентов (перерисовка таблицы) |
| 2531 | + } catch (error) { |
| 2532 | + console.error('Ошибка при обновлении клиента..', error); |
| 2533 | + alert('Ошибка при обновлении клиента на сервере!'); |
| 2534 | + } |
| 2535 | + } |
| 2536 | + |
2501 | 2537 | // ** универсальная обработка модальных форм их "submit" событий, т.е. при добавление/изменении данных клиента (после валидаций, после проверки по ФИО) |
2502 | 2538 | // корректировка регистра, для полей ФИО |
2503 | 2539 | function toUpFirstLetter(value) { |
|
2604 | 2640 | }) |
2605 | 2641 | .filter((contact) => contact !== null); // исключение некорректных/null контактов |
2606 | 2642 |
|
2607 | | - // проверка на совпадение по ФИО |
| 2643 | + // проверка на совпадение по ФИО в таблице (только/если, это добавление "нового" клиента) |
2608 | 2644 | if ( |
| 2645 | + type === 'add' && |
2609 | 2646 | checkClientFIO( |
2610 | 2647 | formInSurname, |
2611 | 2648 | formInName, |
|
2630 | 2667 | }; |
2631 | 2668 |
|
2632 | 2669 | try { |
2633 | | - await addClientToServer(client); // отправка клиента на сервер |
| 2670 | + if (type === 'add') { |
| 2671 | + await addClientToServer(client); // отправка клиента на сервер |
| 2672 | + alert('Клиент успешно добавлен!'); |
| 2673 | + } else if (type === 'edit' && clientData.id) { |
| 2674 | + await editClientOnServer(clientData.id, client); // изменение данных клиента на сервере |
| 2675 | + alert('Клиент успешно обновлён!'); |
| 2676 | + } else { |
| 2677 | + throw new Error( |
| 2678 | + 'Неизвестный тип модального окна или отсутствует ID клиента!' |
| 2679 | + ); |
| 2680 | + } |
2634 | 2681 |
|
2635 | 2682 | setTimeout(() => { |
2636 | | - alert('Клиент успешно добавлен!'); // вывод сообщения об успешном добавлении клиента |
2637 | | - |
2638 | 2683 | // очистка всех полей формы (удаление классов/сообщений ошибок) |
2639 | 2684 | allModalInputs.forEach((input) => { |
2640 | 2685 | input.value = ''; |
|
2650 | 2695 | bootstrapModal.hide(); |
2651 | 2696 | } |
2652 | 2697 |
|
2653 | | - // и напоследок.. выделение/показ только что добавленного клиента/строки |
2654 | | - setTimeout(() => { |
2655 | | - movingToLastNewTableRow(); // перемещение фокуса |
2656 | | - }, 300); // временная задержка, больше.. чтобы модальное окно успело закрыться |
| 2698 | + if (type === 'add') { |
| 2699 | + // и напоследок.. выделение/показ только что добавленного клиента/строки |
| 2700 | + setTimeout(() => { |
| 2701 | + movingToLastNewTableRow(); // перемещение фокуса |
| 2702 | + }, 300); // временная задержка, больше.. чтобы модальное окно успело закрыться |
| 2703 | + } |
2657 | 2704 | }, 200); |
2658 | 2705 | } catch (error) { |
2659 | | - console.error('Ошибка при добавлении клиента:', error); |
| 2706 | + console.error( |
| 2707 | + `Ошибка при ${ |
| 2708 | + type === 'add' ? 'добавлении' : 'обновлении' |
| 2709 | + } клиента:`, |
| 2710 | + error |
| 2711 | + ); |
2660 | 2712 | alert( |
2661 | | - 'Не удалось добавить клиента! Проверьте данные и попробуйте снова!?' |
| 2713 | + `Не удалось ${ |
| 2714 | + type === 'add' ? 'добавить' : 'обновить' |
| 2715 | + } клиента! Проверьте данные и попробуйте снова!?` |
2662 | 2716 | ); |
2663 | 2717 | } |
2664 | 2718 | }, |
|
0 commit comments