|
666 | 666 | } |
667 | 667 |
|
668 | 668 | // ** создание "пустой" строки для таблицы студентов (при/для фильтрации, пустом массиве) |
669 | | - function createEmptyTableMessageRow() { |
| 669 | + function createEmptyTableMessageRow( |
| 670 | + message = 'Пусто.. измените фильтрацию, добавьте студента!?' |
| 671 | + ) { |
670 | 672 | const emptyTableTrRow = document.createElement('tr'); |
671 | 673 | const emptyTableTdCell = document.createElement('td'); |
672 | 674 |
|
673 | 675 | emptyTableTdCell.colSpan = 5; // объединение всех колонок |
674 | | - emptyTableTdCell.textContent = |
675 | | - 'Пусто.. измените фильтрацию, добавьте студента!'; |
| 676 | + emptyTableTdCell.textContent = message; |
676 | 677 | emptyTableTdCell.style.color = '#e10c22'; |
677 | 678 | emptyTableTdCell.style.textAlign = 'center'; |
678 | 679 | emptyTableTrRow.append(emptyTableTdCell); |
679 | 680 |
|
680 | 681 | return emptyTableTrRow; |
681 | 682 | } |
682 | 683 |
|
| 684 | + // TODO: что бы перейти на "полностью" [СЕРВЕРНУЮ] логику/обратно.. нужно пошагово просмотреть весь файл и раскомментировать закомментированный код, при этом комментируя/удаляя код/строки помеченные, как [FOR DEMO - sessionStorage] в полном объёме (т.е. некоторые инициализации переменных, доп. функций проводились каждой логике свои) |
| 685 | + |
683 | 686 | // ** [СЕРВЕР] организация запроса, получение данных/списка студентов с сервера (корректировка входящих данных) |
| 687 | + // ?? следует раскомментировать (полностью) |
| 688 | + // let studentsDataArrWithIds; |
| 689 | + |
| 690 | + // async function getStudentsServerListData() { |
| 691 | + // try { |
| 692 | + // const response = await fetch('http://localhost:3000/api/students'); // запрос на сервер |
| 693 | + // |
| 694 | + // // проверка успешности/выполнения запроса |
| 695 | + // if (!response.ok) { |
| 696 | + // throw new Error(`Ошибка: ${response.status}!`); |
| 697 | + // } |
| 698 | + // |
| 699 | + // const data = await response.json(); // преобразование данных в JSON-формат |
| 700 | + // studentsDataArrWithIds = addLocalIdsToStudents(data); // добавление недостающего поля, как localId |
| 701 | + // |
| 702 | + // addStudentsToTable(studentsDataArrWithIds); // отрисовка данных, наполнение таблицы студентов |
| 703 | + // } catch (error) { |
| 704 | + // console.error('Не удалось загрузить список студентов..', error); |
| 705 | + // alert('Ошибка при загрузке данных с сервера!'); |
| 706 | + // tableBody.append( |
| 707 | + // createEmptyTableMessageRow( |
| 708 | + // 'Нет данных! Запустите/перезапустите сервер!' |
| 709 | + // ) |
| 710 | + // ); // если ошибка, вывод/добавление строки-сообщения |
| 711 | + // } |
| 712 | + // } |
| 713 | + // |
| 714 | + // // добавление недостающего поля в объекты студентов, т.е. поля localId (необходимого, для дальнейших отработок) |
| 715 | + // function addLocalIdsToStudents(studentsFromServer) { |
| 716 | + // return studentsFromServer.map((student, index) => ({ |
| 717 | + // ...student, // сохранение приходящих/серверных полей |
| 718 | + // localId: index + 1, // добавление localId |
| 719 | + // })); |
| 720 | + // } |
| 721 | + // |
| 722 | + // getStudentsServerListData(); // получение данных |
| 723 | + |
| 724 | + // !! [FOR DEMO - sessionStorage] фиксация исходных данных/серверных данных, для сохранения в sessionStorage |
684 | 725 | let studentsDataArrWithIds; |
| 726 | + let updateStudentsDataArr; |
| 727 | + let studentsServerDataArr = []; // потом/будет использоваться для генерации storage ID |
685 | 728 |
|
686 | | - async function getStudentsServerListData() { |
| 729 | + async function addStudentsDataToStorage() { |
687 | 730 | try { |
| 731 | + // ?? |
| 732 | + // const tableBody = document.querySelector('.dboard__table-body'); |
| 733 | + // const spinnerRow = createLoadingSpinnerRow(); // создание спиннера |
| 734 | + // tableBody.append(spinnerRow); // добавление в таблицу |
| 735 | + |
| 736 | + // ?? |
| 737 | + // console.log('Ждём ответ от Render-сервера..'); |
| 738 | + |
| 739 | + // ?? |
| 740 | + // await new Promise((resolve) => setTimeout(resolve, 5000)); // искусственная задержка.. имитация "просыпания" Render-сервера |
| 741 | + |
688 | 742 | const response = await fetch('http://localhost:3000/api/students'); // запрос на сервер |
689 | 743 |
|
| 744 | + // ?? |
| 745 | + // ! Запрос на RENDER-сервер (а не на локальный, согласно маршрута.. ВНИМАНИЕ) |
| 746 | + // const response = await fetch( |
| 747 | + // 'https://students-dashboard-crm.onrender.com/api/students' |
| 748 | + // ); |
| 749 | + |
| 750 | + // ?? |
| 751 | + // удаление спиннера после получения ответа/подгрузки студентов |
| 752 | + // spinnerRow.remove(); |
| 753 | + |
| 754 | + // ?? |
| 755 | + // console.log('Ответ получен! Данные должны быть отображены!'); |
| 756 | + |
690 | 757 | // проверка успешности/выполнения запроса |
691 | 758 | if (!response.ok) { |
692 | 759 | throw new Error(`Ошибка: ${response.status}!`); |
693 | 760 | } |
694 | 761 |
|
695 | 762 | const data = await response.json(); // преобразование данных в JSON-формат |
696 | | - studentsDataArrWithIds = addLocalIdsToStudents(data); // добавление недостающего поля, как localId |
| 763 | + sessionStorage.setItem('demoStudents', JSON.stringify(data)); // добавление/сохранение в Session storage |
| 764 | + |
| 765 | + studentsServerDataArr = data; // "дополнительно" фиксируем входящий серверный массив |
697 | 766 |
|
698 | | - addStudentsToTable(studentsDataArrWithIds); // отрисовка данных, наполнение таблицы студентов |
| 767 | + return data; // возврат массива данных |
699 | 768 | } catch (error) { |
700 | | - console.error('Не удалось загрузить список студентов..', error); |
701 | | - alert('Ошибка при загрузке данных с сервера!?'); |
| 769 | + console.error('Ошибка загрузки списка студентов с сервера!', error); |
| 770 | + |
| 771 | + // ?? |
| 772 | + // удаление спиннера, если запрос завершился ошибкой |
| 773 | + // document.querySelector('.dboard__table-body-loading-row')?.remove(); |
| 774 | + |
| 775 | + return []; // если ошибка, возврат "пустого" массива |
702 | 776 | } |
703 | 777 | } |
704 | 778 |
|
705 | | - // добавление недостающего поля в объекты студентов, т.е. поля localId (необходимого, для дальнейших отработок) |
| 779 | + // !! [FOR DEMO - sessionStorage] получение данных/списка из Session storage (корректировка входящих данных) |
| 780 | + async function getStudentsListDataFromStorage() { |
| 781 | + let savedStudents = await addStudentsDataToStorage(); // получение данных из Session storage |
| 782 | + |
| 783 | + // обновление Session storage |
| 784 | + sessionStorage.setItem('demoStudents', JSON.stringify(savedStudents)); |
| 785 | + |
| 786 | + // корректировка данных (добавление поля localId) |
| 787 | + studentsDataArrWithIds = savedStudents || []; |
| 788 | + updateStudentsDataArr = addLocalIdsToStudents(studentsDataArrWithIds); |
| 789 | + |
| 790 | + if (updateStudentsDataArr.length > 0) { |
| 791 | + addStudentsToTable(updateStudentsDataArr); // отрисовка данных, наполнение таблицы студентов |
| 792 | + } else { |
| 793 | + alert('Ошибка при загрузке данных с сервера!'); |
| 794 | + tableBody.append( |
| 795 | + createEmptyTableMessageRow( |
| 796 | + 'Нет данных! Запустите/перезапустите сервер!' |
| 797 | + ) |
| 798 | + ); // если ошибка, вывод/добавление строки-сообщения |
| 799 | + } |
| 800 | + } |
| 801 | + |
| 802 | + // !! [FOR DEMO - sessionStorage] добавление поля localId (необходимого/возможно, для дальнейших отработок) |
706 | 803 | function addLocalIdsToStudents(studentsFromServer) { |
707 | 804 | return studentsFromServer.map((student, index) => ({ |
708 | 805 | ...student, // сохранение приходящих/серверных полей |
709 | 806 | localId: index + 1, // добавление localId |
710 | 807 | })); |
711 | 808 | } |
712 | 809 |
|
713 | | - getStudentsServerListData(); // получение данных |
| 810 | + // !! [FOR DEMO - sessionStorage] |
| 811 | + getStudentsListDataFromStorage(); // получение данных о клиентах (из Session storage) |
714 | 812 |
|
715 | 813 | // ** наполнение таблицы данных о студентах (согласно откорректированного исходного, далее формирующегося массива) |
716 | | - let updateStudentsDataArr; |
| 814 | + // ?? следует раскомментировать |
| 815 | + // let updateStudentsDataArr; |
717 | 816 |
|
718 | 817 | function addStudentsToTable(studentsServerData = []) { |
719 | 818 | const selectedBodyRows = getSelectedBodyRows(); // сохранение выделенных body-строк (если такие есть) |
|
916 | 1015 | cancelBtn.addEventListener('click', deselectBodyRows); // отработка функции по нажатию |
917 | 1016 |
|
918 | 1017 | // ** [СЕРВЕР] организация удаления студентов с сервера (согласно серверных id) |
919 | | - async function deleteStudentFromServer(serverId) { |
920 | | - try { |
921 | | - const response = await fetch( |
922 | | - `http://localhost:3000/api/students/${serverId}`, |
923 | | - { |
924 | | - method: 'DELETE', |
925 | | - } |
926 | | - ); |
927 | | - |
928 | | - if (!response.ok) { |
929 | | - throw new Error(`Ошибка при удалении студента: ${response.status}`); |
930 | | - } |
931 | | - |
932 | | - await getStudentsServerListData(); // обновление списка студентов после удаления |
933 | | - } catch (error) { |
934 | | - console.error('Ошибка при удалении студента с сервера..', error); |
935 | | - alert('Не удалось удалить студента с сервера!'); |
936 | | - } |
937 | | - } |
| 1018 | + // ?? следует раскомментировать (полностью) |
| 1019 | + // async function deleteStudentFromServer(serverId) { |
| 1020 | + // try { |
| 1021 | + // const response = await fetch( |
| 1022 | + // `http://localhost:3000/api/students/${serverId}`, |
| 1023 | + // { |
| 1024 | + // method: 'DELETE', |
| 1025 | + // } |
| 1026 | + // ); |
| 1027 | + // |
| 1028 | + // if (!response.ok) { |
| 1029 | + // throw new Error(`Ошибка при удалении студента: ${response.status}`); |
| 1030 | + // } |
| 1031 | + // |
| 1032 | + // await getStudentsServerListData(); // обновление списка студентов после удаления |
| 1033 | + // } catch (error) { |
| 1034 | + // console.error('Ошибка при удалении студента с сервера..', error); |
| 1035 | + // alert('Не удалось удалить студента с сервера!'); |
| 1036 | + // } |
| 1037 | + // } |
938 | 1038 |
|
939 | 1039 | // ** удаление выделенных элементов/строк таблицы данных о студентах (через "X" кнопку, не через "внешнюю") |
940 | 1040 | function deleteBodyRowsByXBtn(event) { |
|
990 | 1090 | } |
991 | 1091 | } |
992 | 1092 |
|
993 | | - studentServerIdsToDelete.forEach(async (serverId) => { |
994 | | - await deleteStudentFromServer(serverId); // удаление студентов с сервера по серверным ID |
995 | | - }); |
| 1093 | + // ?? следует раскомментировать |
| 1094 | + // studentServerIdsToDelete.forEach(async (serverId) => { |
| 1095 | + // await deleteStudentFromServer(serverId); // удаление студентов с сервера по серверным ID |
| 1096 | + // }); |
996 | 1097 |
|
997 | 1098 | studentServerIdsToDelete.forEach((serverId) => { |
998 | 1099 | const studentIndex = updateStudentsDataArr.findIndex( |
|
1009 | 1110 | student.localId = index + 1; |
1010 | 1111 | }); |
1011 | 1112 |
|
| 1113 | + // !! [FOR DEMO - sessionStorage] ..одна строчка |
| 1114 | + sessionStorage.setItem( |
| 1115 | + 'demoStudents', |
| 1116 | + JSON.stringify(updateStudentsDataArr) |
| 1117 | + ); // обновление данных в Session storage |
| 1118 | + |
1012 | 1119 | addStudentsToTable(updateStudentsDataArr); // обновление таблицы студентов (пере-компоновка) после удаления |
1013 | 1120 | } |
1014 | 1121 |
|
|
1126 | 1233 | }); |
1127 | 1234 | } |
1128 | 1235 |
|
1129 | | - // ** [СЕРВЕР] отправка данных/добавление "новых" студентов на сервер, получение обратно (проверка статуса) |
1130 | | - async function addStudentsToServer(studentData) { |
1131 | | - try { |
1132 | | - const response = await fetch('http://localhost:3000/api/students', { |
1133 | | - method: 'POST', |
1134 | | - headers: { |
1135 | | - 'Content-Type': 'application/json', |
1136 | | - }, |
1137 | | - body: JSON.stringify(studentData), |
1138 | | - }); |
| 1236 | + // !! [FOR DEMO - sessionStorage] генерация custom ID номеров для "новых" студентов (продолжение порядка.. до 99 потом нужно/будет корректировать) |
| 1237 | + function generateStudentStorageId() { |
| 1238 | + const orderPrefix = studentsServerDataArr.length; // фиксация длинны серверного массива (ранее/выше приходящего) |
1139 | 1239 |
|
1140 | | - if (!response.ok) { |
1141 | | - if (response.status === 422) { |
1142 | | - const errorData = await response.json(); |
1143 | | - throw new Error( |
1144 | | - `Ошибка валидации: ${errorData.errors |
1145 | | - .map((e) => e.message) |
1146 | | - .join(', ')}` |
1147 | | - ); |
1148 | | - } else { |
1149 | | - throw new Error(`Ошибка: ${response.status}`); |
1150 | | - } |
1151 | | - } |
| 1240 | + // генерация случайных/дополнительных цифр для ID (т.е. генерация 5-ти цифр, если в массиве < 10 студентов, если больше.. то генерация 4-х цифр) |
| 1241 | + const randomDigits = |
| 1242 | + studentsServerDataArr.length < 10 |
| 1243 | + ? Math.floor(10000 + Math.random() * 90000) // 5 цифр |
| 1244 | + : Math.floor(1000 + Math.random() * 9000); // 4 цифры |
1152 | 1245 |
|
1153 | | - await getStudentsServerListData(); // обновление списка студентов (в контексте.. перерисовка таблицы) |
1154 | | - } catch (error) { |
1155 | | - console.error('Ошибка при добавлении студента..', error); |
1156 | | - alert('Ошибка при добавлении студента на сервер!'); |
| 1246 | + return `${orderPrefix}${randomDigits}`; // возврат сформированного ID |
| 1247 | + } |
| 1248 | + |
| 1249 | + // ** [СЕРВЕР] отправка данных/добавление "новых" студентов на сервер, получение обратно (проверка статуса) |
| 1250 | + // ?? следует раскомментировать (полностью) |
| 1251 | + // async function addStudentsToServer(studentData) { |
| 1252 | + // try { |
| 1253 | + // const response = await fetch('http://localhost:3000/api/students', { |
| 1254 | + // method: 'POST', |
| 1255 | + // headers: { |
| 1256 | + // 'Content-Type': 'application/json', |
| 1257 | + // }, |
| 1258 | + // body: JSON.stringify(studentData), |
| 1259 | + // }); |
| 1260 | + // |
| 1261 | + // if (!response.ok) { |
| 1262 | + // if (response.status === 422) { |
| 1263 | + // const errorData = await response.json(); |
| 1264 | + // throw new Error( |
| 1265 | + // `Ошибка валидации: ${errorData.errors |
| 1266 | + // .map((e) => e.message) |
| 1267 | + // .join(', ')}` |
| 1268 | + // ); |
| 1269 | + // } else { |
| 1270 | + // throw new Error(`Ошибка: ${response.status}`); |
| 1271 | + // } |
| 1272 | + // } |
| 1273 | + // |
| 1274 | + // await getStudentsServerListData(); // обновление списка студентов (в контексте.. перерисовка таблицы) |
| 1275 | + // } catch (error) { |
| 1276 | + // console.error('Ошибка при добавлении студента..', error); |
| 1277 | + // alert('Ошибка при добавлении студента на сервер!'); |
| 1278 | + // } |
| 1279 | + // } |
| 1280 | + |
| 1281 | + // !! [FOR DEMO - sessionStorage] добавление "новых" студентов/данных в Session storage (целая функция) |
| 1282 | + function addNewStudentToStorage(newStudent) { |
| 1283 | + if (!studentsDataArrWithIds) { |
| 1284 | + studentsDataArrWithIds = []; // если что-то не так с массивом — создаём пустой |
1157 | 1285 | } |
| 1286 | + |
| 1287 | + // Добавление в массив, следом в Session storage |
| 1288 | + studentsDataArrWithIds.push(newStudent); |
| 1289 | + sessionStorage.setItem( |
| 1290 | + 'demoStudents', |
| 1291 | + JSON.stringify(studentsDataArrWithIds) |
| 1292 | + ); |
| 1293 | + |
| 1294 | + addStudentsToTable(studentsDataArrWithIds); // перерисовка таблицы |
1158 | 1295 | } |
1159 | 1296 |
|
1160 | 1297 | // ** добавление "новых" студентов в массив/таблицу, через поля формы (после валидации, после проверки по ФИО) |
|
1222 | 1359 | } |
1223 | 1360 | } |
1224 | 1361 |
|
| 1362 | + // ?? следует раскомментировать |
| 1363 | + // const newStudent = { |
| 1364 | + // surname: formInSurname, |
| 1365 | + // name: formInName, |
| 1366 | + // patronymic: formInPatronymic, |
| 1367 | + // birthDate: formInBirthDate, |
| 1368 | + // startYear: formInStartYear, |
| 1369 | + // faculty: formInFaculty, |
| 1370 | + // }; |
| 1371 | + |
| 1372 | + // !! [FOR DEMO - sessionStorage] "расширенный" объект newStudent (т.к. нет серверных полей.. добавление самостоятельно) |
1225 | 1373 | const newStudent = { |
| 1374 | + id: generateStudentStorageId(), // генерация custom ID |
1226 | 1375 | surname: formInSurname, |
1227 | 1376 | name: formInName, |
1228 | 1377 | patronymic: formInPatronymic, |
|
1231 | 1380 | faculty: formInFaculty, |
1232 | 1381 | }; |
1233 | 1382 |
|
1234 | | - await addStudentsToServer(newStudent); // добавление студента на сервер |
| 1383 | + // ?? следует раскомментировать |
| 1384 | + // await addStudentsToServer(newStudent); // добавление студента на сервер |
| 1385 | + |
| 1386 | + // !! [FOR DEMO - sessionStorage] временные изменения в/для Session storage (обновление/перерисовка таблицы ..ОДНА строчка) |
| 1387 | + addNewStudentToStorage(newStudent); // добавление студента в Session storage |
1235 | 1388 |
|
1236 | 1389 | allFormInInputs.forEach((input) => (input.value = '')); // очистка полей формы (после добавления) |
1237 | 1390 | formInputData.classList.remove('was-validated'); // отмена красной обводки у "чистых" полей формы (после добавления) |
|
0 commit comments