|
672 | 672 | const emptyTableTrRow = document.createElement('tr'); |
673 | 673 | const emptyTableTdCell = document.createElement('td'); |
674 | 674 |
|
| 675 | + emptyTableTrRow.classList.add('dboard__table-body-empty-row'); |
| 676 | + |
675 | 677 | emptyTableTdCell.colSpan = 5; // объединение всех колонок |
676 | 678 | emptyTableTdCell.textContent = message; |
677 | | - emptyTableTdCell.style.color = '#e10c22'; |
678 | | - emptyTableTdCell.style.textAlign = 'center'; |
679 | 679 | emptyTableTrRow.append(emptyTableTdCell); |
680 | 680 |
|
681 | 681 | return emptyTableTrRow; |
|
790 | 790 | if (updateStudentsDataArr.length > 0) { |
791 | 791 | addStudentsToTable(updateStudentsDataArr); // отрисовка данных, наполнение таблицы студентов |
792 | 792 | } else { |
793 | | - alert('Ошибка при загрузке данных с сервера!'); |
794 | 793 | tableBody.append( |
795 | 794 | createEmptyTableMessageRow( |
796 | 795 | 'Нет данных! Запустите/перезапустите сервер!' |
|
1445 | 1444 | function filterStudentsByFormInputs() { |
1446 | 1445 | updateStudentsDataArr = correctInitArr(studentsDataArrWithIds); // обновление исходного массива, перед фильтрацией |
1447 | 1446 |
|
| 1447 | + // фиксация вводимых данных |
| 1448 | + let searchFIO = formFilterFIOInput.value.trim().toLowerCase(); |
| 1449 | + let searchFaculty = formFilterFacultyInput.value.trim().toLowerCase(); |
| 1450 | + let searchStartYear = formFilterStartYearInput.value.trim(); |
| 1451 | + let searchEndYear = formFilterEndYearInput.value.trim(); |
| 1452 | + |
1448 | 1453 | if (formFilterFIOInput.value.trim() !== '') { |
1449 | 1454 | updateStudentsDataArr = updateStudentsDataArr.filter((student) => |
1450 | 1455 | student.fullName |
|
1478 | 1483 | } |
1479 | 1484 |
|
1480 | 1485 | addStudentsToTable(updateStudentsDataArr); // пере-рисовка (пере-компоновка) таблицы студентов согласно фильтраций |
| 1486 | + highlightStudentSearchMatches({ |
| 1487 | + searchFIO, |
| 1488 | + searchFaculty, |
| 1489 | + searchStartYear, |
| 1490 | + searchEndYear, |
| 1491 | + }); // выделение совпадений (передача контекста) |
1481 | 1492 | } |
1482 | 1493 |
|
| 1494 | + // отработка "дебаунс" задержки (если много данных, что бы снизить нагрузку) |
| 1495 | + let debounceTimer; |
| 1496 | + |
1483 | 1497 | allFormFilterInputs.forEach((input) => { |
1484 | 1498 | input.addEventListener('input', () => { |
1485 | | - filterStudentsByFormInputs(); |
| 1499 | + clearTimeout(debounceTimer); // очистка предыдущей задержки |
| 1500 | + debounceTimer = setTimeout(filterStudentsByFormInputs, 600); // применение фильтрации не сразу |
1486 | 1501 | }); |
1487 | 1502 | }); |
1488 | 1503 |
|
| 1504 | + // ** организация выделения/подсветки совпадений в таблице (согласно вводимых данных в фильтрационные поля) |
| 1505 | + function highlightStudentSearchMatches(searchValues) { |
| 1506 | + const { searchFIO, searchFaculty, searchStartYear, searchEndYear } = |
| 1507 | + searchValues; // получение необходимых элементов/значений (через деструктуризациию входящего/передаваемого объекта) |
| 1508 | + |
| 1509 | + const allRows = document.querySelectorAll('.dboard__table-body-row'); |
| 1510 | + |
| 1511 | + allRows.forEach((row) => { |
| 1512 | + // фиксация данных/ячеек с данными, для последующего сравнения (выделения в них совпадений) |
| 1513 | + let fioCell = row.children[1]; // ФИО |
| 1514 | + let facultyCell = row.children[2]; // факультет |
| 1515 | + let studyYearsCell = row.children[4]; // годы обучения (год начала и окончания) |
| 1516 | + |
| 1517 | + // очистка предыдущих выделений (если были) |
| 1518 | + fioCell.innerHTML = fioCell.textContent; |
| 1519 | + facultyCell.innerHTML = facultyCell.textContent; |
| 1520 | + studyYearsCell.innerHTML = studyYearsCell.textContent; |
| 1521 | + |
| 1522 | + // логика выделения/подсветки.. добавления background(a) |
| 1523 | + function highlightMatch(cell, searchValue) { |
| 1524 | + if (searchValue) { |
| 1525 | + const regex = new RegExp(`(${searchValue})`, 'gi'); |
| 1526 | + cell.innerHTML = cell.textContent.replace( |
| 1527 | + regex, |
| 1528 | + // `<span style="padding: 1px 2px; color: #fff; background: #0d6efd;">$1</span>` |
| 1529 | + `<span style="color: #fff; box-shadow: inset 2em 2em #0d6efd;">$1</span>` |
| 1530 | + ); |
| 1531 | + } |
| 1532 | + } |
| 1533 | + |
| 1534 | + // инициализация выделений |
| 1535 | + highlightMatch(fioCell, searchFIO); |
| 1536 | + highlightMatch(facultyCell, searchFaculty); |
| 1537 | + highlightMatch(studyYearsCell, searchStartYear); |
| 1538 | + highlightMatch(studyYearsCell, searchEndYear); |
| 1539 | + }); |
| 1540 | + } |
| 1541 | + |
1489 | 1542 | // ** очистка полей ввода, форм (через внутренние clear кнопки) |
1490 | 1543 | const allClearBtn = document.querySelectorAll('.btn-clear'); |
1491 | 1544 |
|
|
0 commit comments